PKj^Hߺ$django-cms-release-2.4.x/objects.inv# Sphinx inventory version 2 # Project: django cms # Version: 2.4.3-support # The remainder of this file is compressed using zlib. xڽMs(IrzSd9֬-y$,MPl%Mv䓢ZXMIWhc)[5xBAbE&.5Y:X.L-mbi֎qP9ʾdq9މmm<8p_aJ׋(Ca,nkAQYR͵fhfNY #Gm(,(E8Z/W% Uȋ +jY- v t'knlKU,0]8 _n] Wi^Wj謒@5wXn23RX'qK|VjמSpMcr,3g E(B6 @juczL`I vDGP^?5bJ/ټѐж5{H=©Oߘ2s'fiw D2@ޢ{H񍖰EҢ <_QӢ?4⺃ S[8f"_xر[VJ`KKƾ^nhbӴj8ְGZ[sv,rSә&3;#EIESipꗱ6V9 [>7FRdgƬk-پtZhVr7 N$8q< '+eyzݳL0k\Q/K,ջg)Iܣ/Ǥ愌8/#n$\PޡںpJ nQZgA*!I±y; =>˄eN}ݏNp ̲[5본uY|Ll)S?^PaâU7Қ?y|/Oßt>Ld8`.6p⻣ȔIJcZ8 -&Ǘ5uSwLIܴ{T&HKVHq8E4D͡"mxiHpso3ԿNJNj3z[ۼU^>'$RU/I7Zz'zd u d0AI:Jul0r/d*o ]\[-VxDkL"gn.j>i~@>VoUg's W)=-.ʵyơG˔лMPKj^Hm$!#django-cms-release-2.4.x/.buildinfo# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: tags: PKj^HSc{#django-cms-release-2.4.x/index.html django cms 2.4.3-support documentation — None

Welcome to django CMS’s documentation!

This document refers to version 2.4.3-support

Install

Warning

Version 2.4 introduces some significant changes that require action if you are upgrading from a previous version. Please refer to Upgrading from previous versions

Installation

This document assumes you are familiar with Python and Django. It should outline the steps necessary for you to follow the Introductory Tutorial.

Requirements

Note

When installing the django CMS using pip, Django, django-mptt django-classy-tags, django-sekizai, south and html5lib will be installed automatically.

Installing in a virtualenv using pip

Installing inside a virtualenv is the preferred way to install any Django installation. This should work on any platform where python in installed. The first step is to create the virtualenv:

#!/bin/sh
sudo pip install --upgrade virtualenv
virtualenv --distribute --no-site-packages env

You can switch to your virtualenv at the command line by typing:

source env/bin/activate

Next, you can install packages one at a time using pip, but we recommend using a requirements.txt file. The following is an example requirements.txt file that can be used with pip to install django-cms and its dependencies:

# Bare minimum
django-cms==2.4.1

#These dependencies are brought in by django-cms, but if you want to lock-in their version, specify them
Django==1.5.1
django-classy-tags==0.4
South==0.8.1
html5lib==1.0b1
django-mptt==0.5.2
django-sekizai==0.7
six==1.3.0

#Optional, recommended packages
Pillow==2.0.0
django-filer==0.9.4
cmsplugin-filer==0.9.5
django-reversion==1.7

for Postgresql you would also add:

psycopg2==2.5

and install libpq-dev (on Debian-based distro)

for MySQL you would also add:

mysql-python==1.2.4

and install libmysqlclient-dev (on Debian-based distro)

One example of a script to create a virtualenv Python environment is as follows:

#!/bin/sh
env/bin/pip install --download-cache=~/.pip-cache -r requirements.txt

Installing globally on Ubuntu

Warning

The instructions here install certain packages, such as Django, South, Pillow and django CMS globally, which is not recommended. We recommend you use virtualenv instead (see above).

If you’re using Ubuntu (tested with 10.10), the following should get you started:

sudo aptitude install python2.6 python-setuptools
sudo easy_install pip
sudo pip install Django==1.5 django-cms south Pillow

Additionally, you need the Python driver for your selected database:

sudo aptitude python-psycopg2

or

sudo aptitude install python-mysql

This will install Django, django CMS, South, Pillow, and your database’s driver globally.

You have now everything that is needed for you to follow the Introductory Tutorial.

Databases

We recommend using PostgreSQL or MySQL with django CMS. Installing and maintaining database systems is outside the scope of this documentation, but is very well documented on the systems’ respective websites.

To use django CMS efficiently, we recommend:

  • Creating a separate set of credentials for django CMS.
  • Creating a separate database for django CMS to use.

2.4.3 release notes

What’s new in 2.4.3

Fixture loading in Postgres

Placeholder rescan is skipped when loading fixtures.

Fix placeholder primary keys formatting

Fixed a bug when the Django setting USE_THOUSAND_SEPARATOR = True, which caused placeholders primary keys to be formatted according to locale, breaking frontend editing.

Fix show_placeholder in preview mode

show_placeholder no longer uses cached content in preview mode.

Other fixes
  • Test fixes
  • Fix issues in cookies handling
  • Fix minor unicode issues
  • Fix a missing argument in ModelAdmin
  • Fix a bug in WymEditor handling
  • Fix bugs in migrations
  • Fix bug in language fallback
  • Minor documentation fixes

2.4 release notes

What’s new in 2.4

Warning

Upgrading from previous versions

2.4 introduces some changes that require action if you are upgrading from a previous version.

You will need to read the sections Migrations overhaul and Added a check command below.

Introducing Django 1.5 support, dropped support for Django 1.3 and Python 2.5

Django CMS 2.4 introduces Django 1.5 support.

In django CMS 2.4 we dropped support for Django 1.3 and Python 2.5. Django 1.4 and Python 2.6 are now the minimum required versions.

Migrations overhaul

In version 2.4, migrations have been completely rewritten to address issues with newer South releases.

To ease the upgrading process, all the migrations for the cms application have been consolidated into a single migration file, 0001_initial.py.

  • migration 0001 is a real migration, that gets you to the same point migrations 0001-0036 used to
  • the migrations 0002 to 0036 inclusive still exist, but are now all dummy migrations
  • migrations 0037 and later are new migrations
How this affects you

If you’re starting with a new installation, you don’t need to worry about this. Don’t even bother reading this section; it’s for upgraders.

If you’re using version 2.3.2 or newer, you don’t need to worry about this either.

If you’re using version 2.3.1 or older, you will need to run a two-step process.

First, you’ll need to upgrade to 2.3.3, to bring your migration history up-to-date with the new scheme. Then you’ll need to perform the migrations for 2.4.

For the two-step upgrade process do the following in your project main directory:

pip install django-cms==2.3.3
python manage.py syncdb
python manage.py migrate
pip install django-cms==2.4
python manage.py migrate
Added delete orphaned plugins command

Added a management command for deleting orphaned plugins from the database.

The command can be run with:

manage.py cms delete_orphaned_plugins

Please read cms delete_orphaned_plugins before using.

Added a check command

Added a management command to check your configuration and environment.

To use this command, simply run:

manage.py cms check

This replaces the old at-runtime checks.

CMS_MODERATOR

Has been removed since it is no longer in use. From 2.4 onwards, all pages exist in a public and draft version. Users with the publish_page permission can publish changes to the public site.

Management command required

To bring a previous version of your site’s database up-to-date, you’ll need to run manage.py cms moderator on. Never run this command without first checking for orphaned plugins, using the cms list plugins command. If it reports problems, run manage.py cms delete_orphaned_plugins. Running cms moderator with orphaned plugins will fail and leave bad data in your database. See cms list and cms delete_orphaned_plugins.

Also, check if all your plugins define a copy_relations() method if required. You can do this by running manage.py cms check and read the Presence of “copy_relations” section. See Handling Relations for guidance on this topic.

Added Fix MPTTT Management command

Added a management command for fixing MPTT tree data.

The command can be run with:

manage.py cms fix-mptt
Removed the MultilingualMiddleware

We removed the MultilingualMiddleware. This removed the very ugly monkey patching of the reverse() function as well. As a benefit we now support localization of urls and Apphook urls with standard django helpers.

For django 1.4 more infos can be found here:

If you are still running django 1.3 you are able to archieve the same functionality with django-i18nurl. It is a backport of the new functionality in django 1.4 and can be found here:

What you need to do:

  • Remove cms.middleware.multilingual.MultilingualURLMiddleware from your settings.

  • Be sure django.middleware.locale.LocaleMiddleware is in your settings, and that it comes after the SessionMiddleware.

  • Be sure that the cms.urls is included in a i18n_patterns:

    from django.conf.urls.defaults import *
    from django.conf.urls.i18n import i18n_patterns
    from django.contrib import admin
    from django.conf import settings
    
    admin.autodiscover()
    
    urlpatterns = i18n_patterns('',
        url(r'^admin/', include(admin.site.urls)),
        url(r'^', include('cms.urls')),
    )
    
    if settings.DEBUG:
        urlpatterns = patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
        url(r'', include('django.contrib.staticfiles.urls')),
    ) + urlpatterns
    
  • Change your url and reverse calls to language namespaces. We now support the django way of calling other language urls either via {% language %} templatetag or via activate("de") function call in views.

    Before:

    {% url "de:myview" %}
    

    After:

    {% load i18n %}{% language "de" %}
    {% url "myview_name" %}
    {% endlanguage %}
    
  • reverse urls now return the language prefix as well. So maybe there is some code that adds language prefixes. Remove this code.

Added LanguageCookieMiddleware

To fix the behavior of django to determine the language every time from new, when you visit / on a page, this middleware saves the current language in a cookie with every response.

To enable this middleware add the following to your MIDDLEWARE_CLASSES setting:

cms.middleware.language.LanguageCookieMiddleware
CMS_LANGUAGES

CMS_LANGUAGES has be overhauled. It is no longer a list of tuples like the LANGUAGES settings.

An example explains more than thousand words:

CMS_LANGUAGES = {
        1: [
            {
                'code': 'en',
                'name': gettext('English'),
                'fallbacks': ['de', 'fr'],
                'public': True,
                'hide_untranslated': True,
                'redirect_on_fallback':False,
            },
            {
                'code': 'de',
                'name': gettext('Deutsch'),
                'fallbacks': ['en', 'fr'],
                'public': True,
            },
            {
                'code': 'fr',
                'name': gettext('French'),
                'public': False,
            },
        ],
        2: [
            {
                'code': 'nl',
                'name': gettext('Dutch'),
                'public': True,
                'fallbacks': ['en'],
            },
        ],
        'default': {
            'fallbacks': ['en', 'de', 'fr'],
            'redirect_on_fallback':True,
            'public': False,
            'hide_untranslated': False,
        }
    }

For more details on what all the parameters mean please refer to the CMS_LANGUAGES docs.

The following settings are not needed any more and have been removed:

  • CMS_HIDE_UNTRANSLATED
  • CMS_LANGUAGE_FALLBACK
  • CMS_LANGUAGE_CONF
  • CMS_SITE_LANGUAGES
  • CMS_FRONTEND_LANGUAGES

Please remove them from your settings.py.

CMS_FLAT_URLS

Was marked deprecated in 2.3 and has now been removed.

Plugins in Plugins

We added the ability to have plugins in plugins. Until now only the TextPlugin supported this. For demonstration purposes we created a MultiColumn Plugin. The possibilities for this are endless. Imagine: StylePlugin, TablePlugin, GalleryPlugin etc.

The column plugin can be found here:

At the moment the limitation is that plugins in plugins is only editable in the frontend.

Here is the MultiColumn Plugin as an example:

class MultiColumnPlugin(CMSPluginBase):
    model = MultiColumns
    name = _("Multi Columns")
    render_template = "cms/plugins/multi_column.html"
    allow_children = True
    child_classes = ["ColumnPlugin"]

There are 2 new properties for plugins:

allow_children

Boolean If set to True it allows adding Plugins.

child_classes

List A List of Plugin Classes that can be added to this plugin. If not provided you can add all plugins that are available in this placeholder.

How to render your child plugins in the template

We introduce a new templatetag in the cms_tags called {% render_plugin %} Here is an example of how the MultiColumn plugin uses it:

{% load cms_tags %}
<div class="multicolumn">
{% for plugin in instance.child_plugins %}
    {% render_plugin plugin %}
{% endfor %}
</div>

As you can see the children are accessible via the plugins children attribute.

New way to handle django CMS settings

If you have code that needs to access django CMS settings (settings prefixed with CMS_ or PLACEHOLDER_) you would have used for example from django.conf import settings; settings.CMS_TEMPLATES. This will no longer guarantee to return sane values, instead you should use cms.utils.conf.get_cms_setting which takes the name of the setting without the CMS_ prefix as argument and returns the setting.

Example of old, now deprecated style:

from django.conf import settings

settings.CMS_TEMPLATES
settings.PLACEHOLDER_FRONTEND_EDITING

Should be replaced with the new API:

from cms.utils.conf import get_cms_setting

get_cms_setting('TEMPLATES')
get_cms_setting('PLACEHOLDER_FRONTEND_EDITING')
Added cms.constants module

This release adds the cms.constants module which will hold generic django CMS constant values. Currently it only contains TEMPLATE_INHERITANCE_MAGIC which used to live in cms.conf.global_settings but was moved to the new cms.constants module in the settings overhaul mentioned above.

django-reversion integration changes

django-reversion integration has changed. Because of huge databases after some time we introduce some changes to the way revisions are handled for pages.

  1. Only publish revisions are saved. All other revisions are deleted when you publish a page.
  2. By default only the latest 25 publish revisions are kept. You can change this behavior with the new CMS_MAX_PAGE_PUBLISH_REVERSIONS setting.
Changes to the show_sub_menu templatetag

the show_sub_menu has received two new parameters. The first stays the same and is still: how many levels of menu should be displayed.

The second: root_level (default=None), specifies at what level, if any, the menu should root at. For example, if root_level is 0 the menu will start at that level regardless of what level the current page is on.

The third argument: nephews (default=100), specifies how many levels of nephews (children of siblings) are shown.

PlaceholderAdmin support i18n

If you use placeholders in other apps or models we now support more than one language out of the box. If you just use the PlaceholderAdmin it will display language tabs like the cms. If you use django-hvad it uses the hvad language tabs.

If you want to disable this behavior you can set render_placeholder_language_tabs = False on your Admin class that extends PlaceholderAdmin. If you use a custom change_form_template be sure to have a look at cms/templates/admin/placeholders/placeholder/change_form.html for how to incorporate language tabs.

Added CMS_RAW_ID_USERS

If you have a lot of users (500+) you can set this setting to a number after which admin User fields are displayed in a raw Id field. This improves performance a lot in the admin as it has not to load all the users into the html.

Backwards incompatible changes

New minimum requirements for dependencies
  • Django 1.3 and Python 2.5 are no longer supported.

Pending deprecations

  • simple_language_changer will be removed in version 3.0. A bugfix makes this redundant as every non managed url will behave like this.

2.3.8 release notes

What’s new in 2.3.8

Fixture loading in Postgres

Placeholder rescan is skipped when loading fixtures.

Fix placeholder primary keys formatting

Fixed a bug when the Django setting USE_THOUSAND_SEPARATOR = True, which caused placeholders primary keys to be formatted according to locale, breaking frontend editing.

2.3.7 release notes

Warning

Upgrading from previous versions

2.3.7 now requires django-sekizai>=0.7 (up from 0.6.1) due to a cache-related fix backported from 2.4. The correct django-sekizai version should be automatically installed (if not already present), but please do check when upgrading.

What’s new in 2.3.7

Permissions cache performance issue fix backported

When a page is saved and cache is enabled, an explicit cache clear used to be called, causing performance issues when you have thousand of users on your website. This is no longer the case: cache is now versioned and as a result massive cache invalidation is not needed anymore

Fix MPTT Management command backported

Backported from 2.4 a management command for fixing MPTT tree data.

The command can be run with:

manage.py cms fix-mptt

2.3.4 release notes

What’s new in 2.3.4

WymEditor fixed

2.3.4 fixes a critical issue with WymEditor that prevented it from load it’s JavaScript assets correctly.

Moved Norwegian translations

The Norwegian translations are now available as nb, which is the new (since 2003) official language code for Norwegian, replacing the older and deprecated no code.

If your site runs in Norwegian, you need to change your LANGUAGES settings!

Added support for timezones

On Django 1.4, and with USE_TZ=True the django CMS now uses timezone aware date and time objects.

Fixed slug clashing

In earlier versions, publishing a page that has the same slug (URL) as another (published) page could lead to errors. Now, when a page which would have the same URL as another (published) page is published, the user is shown an error and they’re prompted to change the slug for the page.

Two fixes to page change form

The change form for pages would throw errors if the user editing the page does not have the permission to publish this page. This issue was resolved.

Further the page change form would not correctly pre-popluate the slug field if DEBUG was set to False. Again, this issue is now resolved.

2.3.3 release notes

What’s new in 2.3.3

Restored Python 2.5 support

2.3.3 restores Python 2.5 suppport for the django CMS.

Pending deprecations

Python 2.5 support will be dropped in django CMS 2.4.

2.3.2 release notes

What’s new in 2.3.2

Google map plugin

Google map plugin now supports width and height fields so that plugin size can be modified in the page admin or frontend editor.

Zoom level is now set via a select field which ensure only legal values are used.

Warning

Due to the above change, level field is now marked as NOT NULL, and a datamigration has been introduced to modify existing googlemap plugin instance to set the default value if level if is NULL.

2.3 release notes

What’s new in 2.3

Introducing Django 1.4 support, dropped support for Django 1.2

In django CMS 2.3 we dropped support for Django 1.2. Django 1.3.1 is now the minimum required Django version. Django CMS 2.3 also introduces Django 1.4 support.

Lazy page tree loading in admin

Thanks to the work by Andrew Schoen the page tree in the admin now loads lazily, significantly improving the performance of that view for large sites.

Toolbar isolation

The toolbar JavaScript dependencies should now be properly isolated and no longer pollute the global JavaScript namespace.

Plugin cancel button fixed

The cancel button in plugin change forms no longer saves the changes, but actually cancels.

Tests refactor

Tests can now be run using setup.py test or runtests.py (the latter should be done in a virtualenv with the proper dependencies installed).

Check runtests.py -h for options.

Moving text plugins to different placeholders no longer loses inline plugins

A serious bug where a text plugin with inline plugins would lose all the inline plugins when moved to a different placeholder has been fixed.

Minor improvements
  • The or clause in the placeholder tag now works correctly on non-cms pages.
  • The icon source URL for inline plugins for text plugins no longer gets double escaped.
  • PageSelectWidget correctly orders pages again.
  • Fixed the file plugin which was sometimes causing invalid HTML (unclosed span tag).
  • Migration ordering for plugins improved.
  • Internationalized strings in JavaScript now get escaped.

Backwards incompatible changes

New minimum requirements for dependencies
  • django-reversion must now be at version 1.6
  • django-sekizai must be at least at version 0.6.1
  • django-mptt version 0.5.1 or 0.5.2 is required
Registering a list of plugins in the plugin pool

This feature was deprecated in version 2.2 and removed in 2.3. Code like this will not work anymore:

plugin_pool.register_plugin([FooPlugin, BarPlugin])

Instead, use multiple calls to register_plugin:

plugin_pool.register_plugin(FooPlugin)
plugin_pool.register_plugin(BarPlugin)

Pending deprecations

The CMS_FLAT_URLS setting is deprecated and will be removed in version 2.4. The moderation feature (CMS_MODERATOR = True) will be deprecated in 2.4 and replaced with a simpler way of handling unpublished changes.

2.2 release notes

What’s new in 2.2

django-mptt now a proper dependency

django-mptt is now used as a proper dependency and is no longer shipped with the django CMS. This solves the version conflict issues many people were experiencing when trying to use the django CMS together with other Django apps that require django-mptt. django CMS 2.2 requires django-mptt 0.5.1.

Warning

Please remove the old mptt package from your Python site-packages directory before upgrading. The setup.py file will install the django-mptt package as an external dependency!

Django 1.3 support

The django CMS 2.2 supports both Django 1.2.5 and Django 1.3.

View permissions

You can now give view permissions for django CMS pages to groups and users.

Backwards incompatible changes

django-sekizai instead of PluginMedia

Due to the sorry state of the old plugin media framework, it has been dropped in favor of the more stable and more flexible django-sekizai, which is a new dependency for the django CMS 2.2.

The following methods and properties of cms.plugins_base.CMSPluginBase are affected:

  • cms.plugins_base.CMSPluginBase.PluginMedia
  • cms.plugins_base.CMSPluginBase.pluginmedia
  • cms.plugins_base.CMSPluginBase.get_plugin_media()

Accessing those attributes or methods will raise a cms.exceptions.Deprecated error.

The cms.middleware.media.PlaceholderMediaMiddleware middleware was also removed in this process and is therefore no longer required. However you are now required to have the 'sekizai.context_processors.sekizai' context processor in your TEMPLATE_CONTEXT_PROCESSORS setting.

All templates in CMS_TEMPLATES must at least contain the js and css sekizai namespaces.

Please refer to the documentation on Handling media in custom CMS plugins and the django-sekizai documentation for more information.

Toolbar must be enabled explicitly in templates

The toolbar no longer hacks itself into responses in the middleware, but rather has to be enabled explicitly using the {% cms_toolbar %} template tag from the cms_tags template tag library in your templates. The template tag should be placed somewhere within the body of the HTML (within <body>...</body>).

This solves issues people were having with the toolbar showing up in places it shouldn’t have.

Static files moved to /static/

The static files (css/javascript/images) were moved from /media/ to /static/ to work with the new django.contrib.staticfiles app in Django 1.3. This means you will have to make sure you serve static files as well as media files on your server.

Warning

If you use Django 1.2.x you will not have a django.contrib.staticfiles app. Instead you need the django-staticfiles backport.

Features deprecated in 2.2

django-dbgettext support

The django-dbgettext support has been fully dropped in 2.2 in favor of the built-in mechanisms to achieve multilinguality.

Upgrading from 2.1.x and Django 1.2.x

Upgrading dependencies

Upgrade both your version of django CMS and Django by running the following commands.

pip install --upgrade django-cms==2.2 django==1.3.1

If you are using django-reversion make sure to have at least version 1.4 installed

pip install --upgrade django-reversion==1.4

Also, make sure that django-mptt stays at a version compatible with django CMS

pip install --upgrade django-mptt==0.5.1

Updates to settings.py

The following changes will need to be made in your settings.py file:

ADMIN_MEDIA_PREFIX = '/static/admin'
STATIC_ROOT = os.path.join(PROJECT_PATH, 'static')
STATIC_URL = "/static/"

Note

These are not django CMS settings. Refer to the Django documentation on staticfiles for more information.

Note

Please make sure the static subfolder exists in your project and is writable.

Note

PROJECT_PATH is the absolute path to your project. See Installing and configuring django CMS in your Django project for instructions on how to set PROJECT_PATH.

Remove the following from TEMPLATE_CONTEXT_PROCESSORS:

django.core.context_processors.auth

Add the following to TEMPLATE_CONTEXT_PROCESSORS:

django.contrib.auth.context_processors.auth
django.core.context_processors.static
sekizai.context_processors.sekizai

Remove the following from MIDDLEWARE_CLASSES:

cms.middleware.media.PlaceholderMediaMiddleware

Remove the following from INSTALLED_APPS:

publisher

Add the following to INSTALLED_APPS:

sekizai
django.contrib.staticfiles

Template Updates

Make sure to add sekizai tags and cms_toolbar to your CMS templates.

Note

cms_toolbar is only needed if you wish to use the front-end editing. See Backwards incompatible changes for more information

Here is a simple example for a base template called base.html:

{% load cms_tags sekizai_tags %}
<html>
  <head>
      {% render_block "css" %}
  </head>
  <body>
      {% cms_toolbar %}
      {% placeholder base_content %}
      {% block base_content%}{% endblock %}
      {% render_block "js" %}
  </body>
</html>

Database Updates

Run the following commands to upgrade your database

python manage.py syncdb
python manage.py migrate

Static Media

Add the following to urls.py to serve static media when developing:

if settings.DEBUG:
    urlpatterns = patterns('',
    url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
    url(r'', include('django.contrib.staticfiles.urls')),
) + urlpatterns

Also run this command to collect static files into your STATIC_ROOT:

python manage.py collectstatic

Getting Started

Introductory Tutorial

This guide assumes your machine meets the requirements outlined in the Installation section of this documentation.

Getting help

Should you run into trouble and can’t figure out how to solve it yourself, you can get help from either our mailinglist or IRC channel #django-cms on the irc.freenode.net network.

Configuration and setup

Preparing the environment

Gathering the requirements is a good start, but we now need to give the CMS a Django project to live in, and configure it.

Starting your Django project

The following assumes your project will be in ~/workspace/myproject/.

Set up your Django project:

cd ~/workspace
django-admin.py startproject myproject
cd myproject
python manage.py runserver

Open 127.0.0.1:8000 in your browser. You should see a nice “It Worked” message from Django.

it-worked

Installing and configuring django CMS in your Django project

Open the file ~/workspace/myproject/settings.py.

To make your life easier, add the following at the top of the file:

# -*- coding: utf-8 -*-
import os
gettext = lambda s: s
PROJECT_PATH = os.path.split(os.path.abspath(os.path.dirname(__file__)))[0]

Add the following apps to your INSTALLED_APPS. This includes django CMS itself as well as its dependenices and other highly recommended applications/libraries:

  • 'cms', django CMS itself
  • 'mptt', utilities for implementing a modified pre-order traversal tree
  • 'menus', helper for model independent hierarchical website navigation
  • 'south', intelligent schema and data migrations
  • 'sekizai', for javascript and css management

Also add any (or all) of the following plugins, depending on your needs:

  • 'cms.plugins.file'
  • 'cms.plugins.flash'
  • 'cms.plugins.googlemap'
  • 'cms.plugins.link'
  • 'cms.plugins.picture'
  • 'cms.plugins.snippet'
  • 'cms.plugins.teaser'
  • 'cms.plugins.text'
  • 'cms.plugins.video'
  • 'cms.plugins.twitter'

Warning

Adding the 'cms.plugins.snippet' plugin is a potential security hazard. For more information, refer to Snippet.

The plugins are described in more detail in chapter Plugins reference. There are even more plugins available on the django CMS extensions page.

In addition, make sure you uncomment (enable) 'django.contrib.admin'

you may also wish to use django-filer and its components with the django CMS plugin instead of the cms.plugins.file, cms.plugins.picture, cms.plugins.teaser and cms.plugins.video core plugins. In this case you should not add them to INSTALLED_APPS but add the following instead:

  • 'filer'
  • 'cmsplugin_filer_file'
  • 'cmsplugin_filer_folder'
  • 'cmsplugin_filer_image'
  • 'cmsplugin_filer_teaser'
  • 'cmsplugin_filer_video'

Note

See the django-filer documentation and django CMS plugin documentation for detailed installation information.

If you opt for the core plugins you should take care that directory to which the CMS_PAGE_MEDIA_PATH setting points (by default cms_page_media/ relative to MEDIA_ROOT) is writable by the user under which Django will be running. If you have opted for django-filer there is a similar requirement for its configuration.

If you want versioning of your content you should also install django-reversion and add it to INSTALLED_APPS:

  • 'reversion'

You need to add the django CMS middlewares to your MIDDLEWARE_CLASSES at the right position:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.doc.XViewMiddleware',
    'django.middleware.common.CommonMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware',
    'cms.middleware.language.LanguageCookieMiddleware',
)

You need at least the following TEMPLATE_CONTEXT_PROCESSORS:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.i18n',
    'django.core.context_processors.request',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'cms.context_processors.media',
    'sekizai.context_processors.sekizai',
)

Note

This setting will be missing from automatically generated Django settings files, so you will have to add it.

Point your STATIC_ROOT to where the static files should live (that is, your images, CSS files, Javascript files, etc.):

STATIC_ROOT = os.path.join(PROJECT_PATH, "static")
STATIC_URL = "/static/"

For uploaded files, you will need to set up the MEDIA_ROOT setting:

MEDIA_ROOT = os.path.join(PROJECT_PATH, "media")
MEDIA_URL = "/media/"

Note

Please make sure both the static and media subfolders exist in your project and are writable.

Now add a little magic to the TEMPLATE_DIRS section of the file:

TEMPLATE_DIRS = (
    # The docs say it should be absolute path: PROJECT_PATH is precisely one.
    # Life is wonderful!
    os.path.join(PROJECT_PATH, "templates"),
)

Add at least one template to CMS_TEMPLATES; for example:

CMS_TEMPLATES = (
    ('template_1.html', 'Template One'),
    ('template_2.html', 'Template Two'),
)

We will create the actual template files at a later step, don’t worry about it for now. Simply paste this code into your settings file.

Note

The templates you define in CMS_TEMPLATES have to exist at runtime and contain at least one {% placeholder <name> %} template tag to be useful for django CMS. For more details see Creating templates

The django CMS allows you to edit all languages for which Django has built in translations. Since these are numerous, we’ll limit it to English for now:

LANGUAGES = [
    ('en', 'English'),
]

Finally, set up the DATABASES part of the file to reflect your database deployment. If you just want to try out things locally, sqlite3 is the easiest database to set up, however it should not be used in production. If you still wish to use it for now, this is what your DATABASES setting should look like:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(PROJECT_PATH, 'database.sqlite'),
    }
}
URL configuration

You need to include the 'cms.urls' urlpatterns at the end of your urlpatterns. We suggest starting with the following urls.py:

from django.conf.urls.defaults import *
from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from django.conf import settings

admin.autodiscover()

urlpatterns = i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('cms.urls')),
)

if settings.DEBUG:
    urlpatterns = patterns('',
    url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
    url(r'', include('django.contrib.staticfiles.urls')),
) + urlpatterns

Creating templates

django CMS uses templates to define how a page should look and what parts of it are editable. Editable areas are called placeholders. These templates are standard Django templates and you may use them as described in the official documentation.

Templates you wish to use on your pages must be declared in the CMS_TEMPLATES setting:

CMS_TEMPLATES = (
    ('template_1.html', 'Template One'),
    ('template_2.html', 'Template Two'),
)

If you have followed this tutorial from the beginning, this code should already be in your settings file.

Now, on with the actual template files!

Fire up your favorite editor and create a file called base.html in a folder called templates in your myproject directory.

Here is a simple example for a base template called base.html:

{% load cms_tags sekizai_tags %}
<html>
  <head>
      {% render_block "css" %}
  </head>
  <body>
      {% cms_toolbar %}
      {% placeholder base_content %}
      {% block base_content %}{% endblock %}
      {% render_block "js" %}
  </body>
</html>

Now, create a file called template_1.html in the same directory. This will use your base template, and add extra content to it:

{% extends "base.html" %}
{% load cms_tags %}

{% block base_content %}
  {% placeholder template_1_content %}
{% endblock %}

When you set template_1.html as a template on a page you will get two placeholders to put plugins in. One is template_1_content from the page template template_1.html and another is base_content from the extended base.html.

When working with a lot of placeholders, make sure to give descriptive names to your placeholders so you can identify them more easily in the admin panel.

Now, feel free to experiment and make a template_2.html file! If you don’t feel creative, just copy template_1 and name the second placeholder something like “template_2_content”.

Static files handling with sekizai

The django CMS handles media files (css stylesheets and javascript files) required by CMS plugins using django-sekizai. This requires you to define at least two sekizai namespaces in your templates: js and css. You can do so using the render_block template tag from the sekizai_tags template tag libary. We highly recommended putting the {% render_block "css" %} tag as the last thing before the closing </head> HTML tag and the {% render_block "js" %} tag as the last thing before the closing </body> HTML tag.

Initial database setup

This command depends on whether you upgrade your installation or do a fresh install. We recommend that you get familiar with the way South works, as it is a very powerful, easy and convenient tool. django CMS uses it extensively.

Fresh install

Run:

python manage.py syncdb --all
python manage.py migrate --fake

The first command will prompt you to create a super user. Choose ‘yes’ and enter appropriate values.

Upgrade

Run:

python manage.py syncdb
python manage.py migrate
Check you did everything right

Now, use the following command to check if you did everything correctly:

python manage.py cms check
Up and running!

That should be it. Restart your development server using python manage.py runserver and point a web browser to 127.0.0.1:8000 :you should get the django CMS “It Worked” screen.

it-works-cms

Head over to the admin panel <http://127.0.0.1:8000/admin/> and log in with the user you created during the database setup.

To deploy your django CMS project on a production webserver, please refer to the Django documentation.

Creating your first CMS Page!

That’s it. Now the best part: you can start using the CMS! Run your server with python manage.py runserver, then point a web browser to 127.0.0.1:8000/admin/ , and log in using the super user credentials you defined when you ran syncdb earlier.

Once in the admin part of your site, you should see something like the following:

first-admin

Adding a page

Adding a page is as simple as clicking “Pages” in the admin view, then the “add page” button at the top right-hand corner of the screen.

This is where you select which template to use (remember, we created two), as well as pretty obvious things like which language the page is in (used for internationalisation), the page’s title, and the url slug it will use.

Hitting the “Save” button, unsurprisingly, saves the page. It will now display in the list of pages.

my-first-page

Congratulations! You now have a fully functional django CMS installation!

Publishing a page

The following is a list of parameters that can be changed for each of your pages:

Visibility

By default, pages are “invisible”. To let people access them you should mark them as “published”.

Adding content to a page

So far, our page doesn’t do much. Make sure it’s marked as “published”, then click on the page’s “edit” button.

Ignore most of the interface for now and click the “view on site” button at the top right-hand corner of the screen. As expected, your page is blank for the time being, since our template is a really minimal one.

Let’s get to it now then!

Press your browser’s back button, so as to see the page’s admin interface. If you followed the tutorial so far, your template (template_1.html) defines two placeholders. The admin interfaces shows you theses placeholders as sub menus:

first-placeholders

Scroll down the “Available plugins” drop-down list. This displays the plugins you added to your INSTALLED_APPS settings. Choose the “text” plugin in the drop-down, then press the “Add” button.

The right part of the plugin area displays a rich text editor (TinyMCE).

In the editor, type in some text and then press the “Save” button.

The new text is only visible on the draft copy so far, but you can see it by using the top button “Preview draft”. If you use the “View on site” button instead, you can see that the page is still blank to the normal users.

To publish the changes you have made, click on the “Publish draft” button. Go back to your website using the top right-hand “View on site” button. That’s it!

hello-cms-world

Where to go from here

Congratulations, you now have a fully functional CMS! Feel free to play around with the different plugins provided out of the box and to build great websites!

Using South with django CMS

South is an incredible piece of software that lets you handle database migrations. This document is by no means meant to replace the excellent documentation available online, but rather to give a quick primer on why you should use South and how to get started quickly.

Installation

As always using Django and Python is a joy. Installing South is as simple as typing:

pip install South

Then, simply add south to the list of INSTALLED_APPS in your settings.py file.

Basic usage

For a very short crash course:

  1. Instead of the initial manage.py syncdb command, simply run manage.py schemamigration --initial <app name>. This will create a new migrations package, along with a new migration file (in the form of a python script).
  2. Run the migration using manage.py migrate. Your tables will be created in the database and Django will work as usual.
  3. Whenever you make changes to your models.py file, run manage.py schemamigration --auto <app name> to create a new migration file. Next run manage.py migrate to apply the newly created migration.

More information about South

Obviously, South is a very powerful tool and this simple crash course is only the very tip of the iceberg. Readers are highly encouraged to have a quick glance at the excellent official South documentation.

Configuration

The django CMS has a lot of settings you can use to customize your installation so that it is exactly as you’d like it to be.

Required Settings

CMS_TEMPLATES

Default: () (Not a valid setting!)

A list of templates you can select for a page.

Example:

CMS_TEMPLATES = (
    ('base.html', gettext('default')),
    ('2col.html', gettext('2 Column')),
    ('3col.html', gettext('3 Column')),
    ('extra.html', gettext('Some extra fancy template')),
)

Note

All templates defined in CMS_TEMPLATES must contain at least the js and css sekizai namespaces, for more information, see Static files handling with sekizai.

Warning

django CMS internally relies on a number of templates to function correctly. These exist beneath cms within the templates directory. As such, it is highly recommended you avoid using the same directory name for your own project templates.

Basic Customization

CMS_TEMPLATE_INHERITANCE

Default: True

Optional Enables the inheritance of templates from parent pages.

If this is enabled, pages have the additional template option to inherit their template from the nearest ancestor. New pages default to this setting if the new page is not a root page.

CMS_PLACEHOLDER_CONF

Default: {} Optional

Used to configure placeholders. If not given, all plugins are available in all placeholders.

Example:

CMS_PLACEHOLDER_CONF = {
    'content': {
        'plugins': ['TextPlugin', 'PicturePlugin'],
        'text_only_plugins': ['LinkPlugin']
        'extra_context': {"width":640},
        'name':gettext("Content"),
    },
    'right-column': {
        "plugins": ['TeaserPlugin', 'LinkPlugin'],
        "extra_context": {"width":280},
        'name':gettext("Right Column"),
        'limits': {
            'global': 2,
            'TeaserPlugin': 1,
            'LinkPlugin': 1,
        },
    },
    'base.html content': {
        "plugins": ['TextPlugin', 'PicturePlugin', 'TeaserPlugin']
    },
}

You can combine template names and placeholder names to granularly define plugins, as shown above with ‘’base.html content’‘.

plugins

A list of plugins that can be added to this placeholder. If not supplied, all plugins can be selected.

text_only_plugins

A list of additional plugins available only in the TextPlugin, these plugins can’t be added directly to this placeholder.

extra_context

Extra context that plugins in this placeholder receive.

name

The name displayed in the Django admin. With the gettext stub, the name can be internationalized.

limits

Limit the number of plugins that can be placed inside this placeholder. Dictionary keys are plugin names and the values are their respective limits. Special case: “global” - Limit the absolute number of plugins in this placeholder regardless of type (takes precedence over the type-specific limits).

CMS_PLUGIN_CONTEXT_PROCESSORS

Default: []

A list of plugin context processors. Plugin context processors are callables that modify all plugins’ context before rendering. See Custom Plugins for more information.

CMS_PLUGIN_PROCESSORS

Default: []

A list of plugin processors. Plugin processors are callables that modify all plugin’s output after rendering. See Custom Plugins for more information.

CMS_APPHOOKS

Default: ()

A list of import paths for cms.app_base.CMSApp subclasses.

Defaults to an empty list which means CMS applications are auto-discovered in all INSTALLED_APPS by trying to import their cms_app module.

If this setting is set, the auto-discovery is disabled.

Example:

CMS_APPHOOKS = (
    'myapp.cms_app.MyApp',
    'otherapp.cms_app.MyFancyApp',
    'sampleapp.cms_app.SampleApp',
)
PLACEHOLDER_FRONTEND_EDITING

Default: True

If set to False, frontend editing is not available for models using cms.models.fields.PlaceholderField.

Editor configuration

The Wymeditor from cms.plugins.text plugin can take the same configuration as vanilla Wymeditor. Therefore you will need to learn how to configure that. The best thing to do is to head over to the Wymeditor examples page in order to understand how Wymeditor works.

The cms.plugins.text plugin exposes several variables named WYM_* that correspond to the wym configuration. The simplest way to get started with this is to go to cms/plugins/text/settings.py and copy over the WYM_* variables and you will realize they match one to one to Wymeditor’s.

Currently the following variables are available:

  • WYM_TOOLS
  • WYM_CONTAINERS
  • WYM_CLASSES
  • WYM_STYLES
  • WYM_STYLESHEET

I18N and L10N

CMS_LANGUAGES

Default: Value of LANGUAGES converted to this format

Defines the languages available in django CMS.

Example:

CMS_LANGUAGES = {
    1: [
        {
            'code': 'en',
            'name': gettext('English'),
            'fallbacks': ['de', 'fr'],
            'public': True,
            'hide_untranslated': True,
            'redirect_on_fallback':False,
        },
        {
            'code': 'de',
            'name': gettext('Deutsch'),
            'fallbacks': ['en', 'fr'],
            'public': True,
        },
        {
            'code': 'fr',
            'name': gettext('French'),
            'public': False,
        },
    ],
    2: [
        {
            'code': 'nl',
            'name': gettext('Dutch'),
            'public': True,
            'fallbacks': ['en'],
        },
    ],
    'default': {
        'fallbacks': ['en', 'de', 'fr'],
        'redirect_on_fallback':True,
        'public': False,
        'hide_untranslated': False,
    }
}

Note

Make sure you only define languages which are also in LANGUAGES.

CMS_LANGUAGES has different options where you can granular define how different languages behave.

On the first level you can define SITE_IDs and default values. In the example above we define two sites. The first site has 3 languages (English, German and French) and the second site has only Dutch. The default node defines default behavior for all languages. You can overwrite the default settings with language specific properties. For example we define hide_untranslated as False globally. The English language overwrites this behavior.

Every language node needs at least a code and a name property. code is the iso 2 code for the language. And name is the verbose name of the language.

Note

With a gettext() lambda function you can make language names translatable. To enable this add gettext = lambda s: s at the beginning of your settings file. But maybe you want to leave the language name as it is.

What are the properties a language node can have?

code

String. RFC5646 code of the language.

Example: "en".

Note

Is required for every language.

name

String. The verbose name of the language.

Note

Is required for every language.

public

Is this language accessible in the frontend? For example, if you decide you want to add a new language to your page but don’t want to show it to the world yet.

Type: Boolean Default: True

fallbacks

A list of languages that are used if a page is not translated yet. The ordering is relevant.

Example: ['de', 'fr'] Default: []

hide_untranslated

Should untranslated pages be hidden in the menu?

Type: Boolean Default: True

redirect_on_fallback

If a page is not available should there be a redirect to a language that is, or should the content be displayed in the other language in this page?

Type: Boolean Default:True

Unicode support for automated slugs

The django CMS supports automated slug generation from page titles that contain unicode characters via the unihandecode.js project. To enable support for unihandecode.js, at least CMS_UNIHANDECODE_HOST and CMS_UNIHANDECODE_VERSION must be set.

CMS_UNIHANDECODE_HOST

default: None

Must be set to the URL where you host your unihandecode.js files. For licensing reasons, the django CMS does not include unihandecode.js.

If set to None, the default, unihandecode.js is not used.

Note

Unihandecode.js is a rather large library, especially when loading support for Japanese. It is therefore very important that you serve it from a server that supports gzip compression. Further, make sure that those files can be cached by the browser for a very long period.

CMS_UNIHANDECODE_VERSION

default: None

Must be set to the version number (eg '1.0.0') you want to use. Together with CMS_UNIHANDECODE_HOST this setting is used to build the full URLs for the javascript files. URLs are built like this: <CMS_UNIHANDECODE_HOST>-<CMS_UNIHANDECODE_VERSION>.<DECODER>.min.js.

CMS_UNIHANDECODE_DECODERS

default: ['ja', 'zh', 'vn', 'kr', 'diacritic']

If you add additional decoders to your CMS_UNIHANDECODE_HOST`, you can add them to this setting.

CMS_UNIHANDECODE_DEFAULT_DECODER

default: 'diacritic'

The default decoder to use when unihandecode.js support is enabled, but the current language does not provide a specific decoder in CMS_UNIHANDECODE_DECODERS. If set to None, failing to find a specific decoder will disable unihandecode.js for this language.

Media Settings

CMS_MEDIA_PATH

default: cms/

The path from MEDIA_ROOT to the media files located in cms/media/

CMS_MEDIA_ROOT

Default: MEDIA_ROOT + CMS_MEDIA_PATH

The path to the media root of the cms media files.

CMS_MEDIA_URL

default: MEDIA_URL + CMS_MEDIA_PATH

The location of the media files that are located in cms/media/cms/

CMS_PAGE_MEDIA_PATH

Default: 'cms_page_media/'

By default, django CMS creates a folder called cms_page_media in your static files folder where all uploaded media files are stored. The media files are stored in subfolders numbered with the id of the page.

You should take care that the directory to which it points is writable by the user under which Django will be running.

URLs

CMS_URL_OVERWRITE

Default: True

This adds a new field “url overwrite” to the “advanced settings” tab of your page. With this field you can overwrite the whole relative url of the page.

CMS_MENU_TITLE_OVERWRITE

Default: False

This adds a new “menu title” field beside the title field.

With this field you can overwrite the title that is displayed in the menu.

To access the menu title in the template, use:

{{ page.get_menu_title }}
CMS_REDIRECTS

Default: False

This adds a new “redirect” field to the “advanced settings” tab of the page.

You can set a url here to which visitors will be redirected when the page is accessed.

Note: Don’t use this too much. django.contrib.redirects is much more flexible, handy, and is designed exactly for this purpose.

CMS_SOFTROOT

Default: False

This adds a new “softroot” field to the “advanced settings” tab of the page. If a page is marked as softroot the menu will only display items until it finds the softroot.

If you have a huge site you can easily partition the menu with this.

Advanced Settings

CMS_PERMISSION

Default: False

If this is enabled you get 3 new models in Admin:

  • Pages global permissions
  • User groups - page
  • Users - page

In the edit-view of the pages you can now assign users to pages and grant them permissions. In the global permissions you can set the permissions for users globally.

If a user has the right to create new users he can now do so in the “Users - page”. But he will only see the users he created. The users he created can also only inherit the rights he has. So if he only has been granted the right to edit a certain page all users he creates can, in turn, only edit this page. Naturally he can limit the rights of the users he creates even further, allowing them to see only a subset of the pages to which he is allowed access.

CMS_RAW_ID_USERS

Default: False

This setting only applies if CMS_PERMISSION is True

The “view restrictions” and “page permissions” inlines on the cms.models.Page admin change forms can cause performance problems where there are many thousands of users being put into simple select boxes. If set to a positive integer, this setting forces the inlines on that page to use standard Django admin raw ID widgets rather than select boxes if the number of users in the system is greater than that number, dramatically improving performance.

Note

Using raw ID fields in combination with limit_choices_to causes errors due to excessively long URLs if you have many thousands of users (the PKs are all included in the URL of the popup window). For this reason, we only apply this limit if the number of users is relatively small (fewer than 500). If the number of users we need to limit to is greater than that, we use the usual input field instead unless the user is a CMS superuser, in which case we bypass the limit. Unfortunately, this means that non-superusers won’t see any benefit from this setting.

CMS_PUBLIC_FOR

Default: all

Decides if pages without any view restrictions are public by default or staff only. Possible values are all and staff.

CMS_SHOW_START_DATE & CMS_SHOW_END_DATE

Default: False for both

This adds two new DateTimeField fields in the “advanced settings” tab of the page. With this option you can limit the time a page is published.

CMS_SEO_FIELDS

Default: False

This adds a new “SEO Fields” fieldset to the page admin. You can set the Page Title, Meta Keywords and Meta Description in there.

To access these fields in the template use:

{% load cms_tags %}
<head>
    <title>{% page_attribute page_title %}</title>
    <meta name="description" content="{% page_attribute meta_description %}"/>
    <meta name="keywords" content="{% page_attribute meta_keywords %}"/>
    ...
    ...
</head>
CMS_CACHE_DURATIONS

This dictionary carries the various cache duration settings.

'content'

Default: 60

Cache expiration (in seconds) for show_placeholder and page_url template tags.

Note

This settings was previously called CMS_CONTENT_CACHE_DURATION

'permissions'

Default: 3600

Cache expiration (in seconds) for view and other permissions.

CMS_CACHE_PREFIX

Default: cms-

The CMS will prepend the value associated with this key to every cache access (set and get). This is useful when you have several django CMS installations, and you don’t want them to share cache objects.

Example:

CMS_CACHE_PREFIX = 'mysite-live'

Note

Django 1.3 introduced a site-wide cache key prefix. See Django’s own docs on cache key prefixing

CMS_MAX_PAGE_PUBLISH_REVERSIONS

Default: 25

If django-reversion is installed everything you do with a page and all plugin changes will be saved in a revision. In the page admin there is a history button to revert to previous version of a page. In the past we had the problem with huge databases from the revision tables after some time. As a mitigation when you publish a page all revisions that are not publish revision will be deleted. This setting however declares how many publish revisions are saved in the database. By default the newest 25 publish revisions are kept and all other are deleted when you publish a page. If you set this to 0 all publish revisions are kept but you are responsible to keep the revision table small.

Plugins reference

File

Allows you to upload a file. A filetype icon will be assigned based on the file extension.

For installation be sure you have the following in the INSTALLED_APPS setting in your project’s settings.py file:

INSTALLED_APPS = (
    # ...
    'cms.plugins.file',
    # ...
)

You should take care that the directory defined by the configuration setting CMS_PAGE_MEDIA_PATH (by default cms_page_media/ relative to MEDIA_ROOT) is writable by the user under which django will be running.

You might consider using django-filer with django CMS plugin and its cmsplugin_filer_file component instead.

Warning

The builtin file plugin only works with local storages. If you need more advanced solutions, please look at alternative file plugins for the django CMS, such as django-filer.

Flash

Allows you to upload and display a Flash SWF file on your page.

For installation be sure you have the following in the INSTALLED_APPS setting in your project’s settings.py file:

INSTALLED_APPS = (
    # ...
    'cms.plugins.flash',
    # ...
)

GoogleMap

Displays a map of an address on your page.

Both address and coordinates are supported to center the map; zoom level and route planner can be set when adding/editing plugin in the admin.

New in version 2.3.2: width/height parameter has been added, so it’s no longer required to set plugin container size in CSS or template.

Changed in version 2.3.2: Zoom level is set via a select field which ensure only legal values are used.

Note

Due to the above change, level field is now marked as NOT NULL, and a datamigration has been introduced to modify existing googlemap plugin instance to set the default value if level if is NULL.

For installation be sure you have the following in the INSTALLED_APPS setting in your project’s settings.py file:

INSTALLED_APPS = (
    # ...
    'cms.plugins.googlemap',
    # ...
)

Picture

Displays a picture in a page.

For installation be sure you have the following in the INSTALLED_APPS setting in your project’s settings.py file:

INSTALLED_APPS = (
    # ...
    'cms.plugins.picture',
    # ...
)

There are several solutions for Python and Django out there to automatically resize your pictures, you can find some on Django Packages and compare them there.

In your project template directory create a folder called cms/plugins and in it create a file called picture.html. Here is an example picture.html template using easy-thumbnails:

{% load thumbnail %}

{% if link %}<a href="{{ link }}">{% endif %}
{% if placeholder == "content" %}
    <img src="{% thumbnail picture.image 300x600 %}"{% if picture.alt %} alt="{{ picture.alt }}"{% endif %} />
{% else %}
    {% if placeholder == "teaser" %}
        <img src="{% thumbnail picture.image 150x150 %}"{% if picture.alt %} alt="{{ picture.alt }}"{% endif %} />
    {% endif %}
{% endif %}
{% if link %}</a>{% endif %}

In this template the picture is scaled differently based on which placeholder it was placed in.

You should take care that the directory defined by the configuration setting CMS_PAGE_MEDIA_PATH (by default cms_page_media/ relative to MEDIA_ROOT) is writable by the user under which django will be running.

Note

In order to improve clarity, some Picture fields have been omitted in the example template code.

Note

For more advanced use cases where you would like to upload your media to a central location, consider using django-filer with django CMS plugin and its cmsplugin_filer_image component instead.

Snippet

Renders an HTML snippet from an HTML file in your templates directories or a snippet given via direct input.

For installation be sure you have the following in the INSTALLED_APPS setting in your project’s settings.py file:

INSTALLED_APPS = (
    # ...
    'cms.plugins.snippet',
    # ...
)

Note

This plugin should mainly be used during development to quickly test HTML snippets.

Warning

This plugin is a potential security hazard, since it allows admins to place custom JavaScript on pages. This may allow administrators with the right to add snippets to elevate their privileges to superusers. This plugin should only be used during the initial development phase for rapid prototyping and should be disabled on production sites.

Teaser

Displays a teaser box for another page or a URL. A picture and a description can be added.

For installation be sure you have the following in the INSTALLED_APPS settings in your project’s settings.py file:

INSTALLED_APPS = (
    # ...
    'cms.plugins.teaser',
    # ...
)

You should take care that the directory defined by the configuration setting CMS_PAGE_MEDIA_PATH (by default cms_page_media/ relative to MEDIA_ROOT) is writable by the user under which django will be running.

Note

For more advanced use cases where you would like to upload your media to a central location, consider using django-filer with django CMS plugin and its cmsplugin_filer_video component instead.

Text

Displays text. If plugins are text-enabled they can be placed inside the text-flow. At this moment the following core plugins are text-enabled:

  • cms.plugins.link
  • cms.plugins.picture
  • cms.plugins.file
  • cms.plugins.snippet

The current editor is Wymeditor. If you want to use TinyMce you need to install django-tinymce. If tinymce is in your INSTALLED_APPS it will be automatically enabled. If you have tinymce installed but don’t want to use it in the cms put the following in your settings.py:

CMS_USE_TINYMCE = False

Note

When using django-tinymce, you also need to configure it. See the django-tinymce docs for more information.

For installation be sure you have the following in your project’s INSTALLED_APPS setting:

INSTALLED_APPS = (
    # ...
    'cms.plugins.text',
    # ...
)

Video

Plays Video Files or Youtube / Vimeo Videos. Uses the OSFlashVideoPlayer. When uploading videos use either .flv files or h264 encoded video files.

For installation be sure you have the following in your project’s INSTALLED_APPS setting:

INSTALLED_APPS = (
    # ...
    'cms.plugins.video',
    # ...
)

There are some settings you can set in your settings.py to overwrite some default behavior:

  • VIDEO_AUTOPLAY ((default: False)
  • VIDEO_AUTOHIDE (default: False)
  • VIDEO_FULLSCREEN (default: True)
  • VIDEO_LOOP (default: False)
  • VIDEO_AUTOPLAY (default: False)
  • VIDEO_BG_COLOR (default: "000000")
  • VIDEO_TEXT_COLOR (default: "FFFFFF")
  • VIDEO_SEEKBAR_COLOR (default: "13ABEC")
  • VIDEO_SEEKBARBG_COLOR (default: "333333")
  • VIDEO_LOADINGBAR_COLOR (default: "828282")
  • VIDEO_BUTTON_OUT_COLOR (default: "333333")
  • VIDEO_BUTTON_OVER_COLOR (default: "000000")
  • VIDEO_BUTTON_HIGHLIGHT_COLOR (default: "FFFFFF")

You should take care that the directory defined by the configuration setting CMS_PAGE_MEDIA_PATH (by default cms_page_media/ relative to MEDIA_ROOT) is writable by the user under which django will be running.

Note

For more advanced use cases where you would like to upload your media to a central location, consider using django-filer with django CMS plugin and its cmsplugin_filer_video component instead.

Twitter

Display’s a number of a twitter user’s latest posts.

For installation be sure you have the following in your project’s INSTALLED_APPS setting:

INSTALLED_APPS = (
    # ...
    'cms.plugins.twitter',
    # ...
)

Note

Since avatars are not guaranteed to be available over SSL (HTTPS), by default the Twitter plugin does not use avatars on secure sites.

Inherit

Displays all plugins of another page or another language. Great if you always need the same plugins on a lot of pages.

For installation be sure you have the following in your project’s INSTALLED_APPS setting:

INSTALLED_APPS = (
    # ...
    'cms.plugins.inherit',
    # ...
)

Warning

The inherit plugin is currently the only core-plugin which cannot be used in non-cms placeholders.

Common issues

Caught MultipleObjectsReturned while rendering

After upgrading to a new version with an existing database, you encounter something like:

Caught MultipleObjectsReturned while rendering: get() returned more than one CacheKey – it returned 12! Lookup parameters were {‘key’: ‘cms-menu_nodes_en_1_1_user’, ‘language’: ‘en’, ‘site’: 1L}

What has happened is that your database contains some old cache data in the menus_cachekey table. Just delete all those entries.

Advanced

Internationalization

Multilingual URLs

If you use more than one language, django CMS urls need to be referenced via i18n_patterns(). For more information about this see the official django documentation.

Main urls.py example:

from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin
from django.conf.urls.i18n import i18n_patterns
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'),
)

urlpatterns += staticfiles_urlpatterns()

urlpatterns += i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('cms.urls')), # <--------- include the django cms urls via i18n_patterns
)

Language Chooser

The language_chooser template tag will display a language chooser for the current page. You can modify the template in menu/language_chooser.html or provide your own template if necessary.

Example:

{% load menu_tags %}
{% language_chooser "myapp/language_chooser.html" %}

page_language_url

This template tag returns the URL of the current page in another language.

Example:

{% page_language_url "de" %}

hide_unstranslated

If you add a default directive to your CMS_LANGUAGES with a hide_unstranslated to False all pages will be displayed in all languages even if they are not translated yet.

If hide_untranslated is True in your CMS_LANGUAGES and you are on a page that doesn’t yet have an English translation and you view the German version then the language chooser will redirect to /. The same goes for urls that are not handled by the cms and display a language chooser.

Automated slug generation unicode characters

If your site has languages which use non-ASCII character sets, you might want to enable CMS_UNIHANDECODE_HOST and CMS_UNIHANDECODE_VERSION to get automated slugs for those languages too.

Sitemap Guide

Sitemap

Sitemaps are XML files used by Google to index your website by using their Webmaster Tools and telling them the location of your sitemap.

The CMSSitemap will create a sitemap with all the published pages of your CMS

Configuration

  • Add django.contrib.sitemaps to your project’s INSTALLED_APPS setting.
  • Add from cms.sitemaps import CMSSitemap to the top of your main urls.py.
  • Add url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': {'cmspages': CMSSitemap}}), to your urlpatterns.

django.contrib.sitemaps

More information about django.contrib.sitemaps can be found in the official Django documentation.

Template Tags

CMS templatetags

To use any of the following templatetags you first need to load them at the top of your template:

{% load cms_tags %}
placeholder

Changed in version 2.1: The placeholder name became case sensitive.

The placeholder templatetag defines a placeholder on a page. All placeholders in a template will be auto-detected and can be filled with plugins when editing a page that is using said template. When rendering, the content of these plugins will appear where the placeholder tag was.

Example:

{% placeholder "content" %}

If you want additional content to be displayed in case the placeholder is empty, use the or argument and an additional {% endplaceholder %} closing tag. Everything between {% placeholder "..." or %} and {% endplaceholder %} is rendered in the event that the placeholder has no plugins or the plugins do not generate any output.

Example:

{% placeholder "content" or %}There is no content.{% endplaceholder %}

If you want to add extra variables to the context of the placeholder, you should use Django’s with tag. For instance, if you want to resize images from your templates according to a context variable called width, you can pass it as follows:

{% with 320 as width %}{% placeholder "content" %}{% endwith %}

If you want the placeholder to inherit the content of a placeholder with the same name on parent pages, simply pass the inherit argument:

{% placeholder "content" inherit %}

This will walk up the page tree up until the root page and will show the first placeholder it can find with content.

It’s also possible to combine this with the or argument to show an ultimate fallback if the placeholder and none of the placeholders on parent pages have plugins that generate content:

{% placeholder "content" inherit or %}There is no spoon.{% endplaceholder %}

See also the CMS_PLACEHOLDER_CONF setting where you can also add extra context variables and change some other placeholder behavior.

show_placeholder

Displays a specific placeholder from a given page. This is useful if you want to have some more or less static content that is shared among many pages, such as a footer.

Arguments:

  • placeholder_name
  • page_lookup (see page_lookup for more information)
  • language (optional)
  • site (optional)

Examples:

{% show_placeholder "footer" "footer_container_page" %}
{% show_placeholder "content" request.current_page.parent_id %}
{% show_placeholder "teaser" request.current_page.get_root %}
page_lookup

The page_lookup argument, passed to several templatetags to retrieve a page, can be of any of the following types:

  • str: interpreted as the reverse_id field of the desired page, which can be set in the “Advanced” section when editing a page.
  • int: interpreted as the primary key (pk field) of the desired page
  • dict: a dictionary containing keyword arguments to find the desired page (for instance: {'pk': 1})
  • Page: you can also pass a page object directly, in which case there will be no database lookup.

If you know the exact page you are referring to, it is a good idea to use a reverse_id (a string used to uniquely name a page) rather than a hard-coded numeric ID in your template. For example, you might have a help page that you want to link to or display parts of on all pages. To do this, you would first open the help page in the admin interface and enter an ID (such as help) under the ‘Advanced’ tab of the form. Then you could use that reverse_id with the appropriate templatetags:

{% show_placeholder "right-column" "help" %}
<a href="{% page_url "help" %}">Help page</a>

If you are referring to a page relative to the current page, you’ll probably have to use a numeric page ID or a page object. For instance, if you want the content of the parent page to display on the current page, you can use:

{% show_placeholder "content" request.current_page.parent_id %}

Or, suppose you have a placeholder called teaser on a page that, unless a content editor has filled it with content specific to the current page, should inherit the content of its root-level ancestor:

{% placeholder "teaser" or %}
    {% show_placeholder "teaser" request.current_page.get_root %}
{% endplaceholder %}
show_uncached_placeholder

The same as show_placeholder, but the placeholder contents will not be cached.

Arguments:

  • placeholder_name
  • page_lookup (see page_lookup for more information)
  • language (optional)
  • site (optional)

Example:

{% show_uncached_placeholder "footer" "footer_container_page" %}
page_url

Displays the URL of a page in the current language.

Arguments:

Example:

<a href="{% page_url "help" %}">Help page</a>
<a href="{% page_url request.current_page.parent %}">Parent page</a>

If a matching page isn’t found and DEBUG is True, an exception will be raised. However, if DEBUG is False, an exception will not be raised. Additionally, if SEND_BROKEN_LINK_EMAILS is True and you have specified some addresses in MANAGERS, an email will be sent to those addresses to inform them of the broken link.

page_attribute

This templatetag is used to display an attribute of the current page in the current language.

Arguments:

  • attribute_name
  • page_lookup (optional; see page_lookup for more information)

Possible values for attribute_name are: "title", "menu_title", "page_title", "slug", "meta_description", "meta_keywords" (note that you can also supply that argument without quotes, but this is deprecated because the argument might also be a template variable).

Example:

{% page_attribute "page_title" %}

If you supply the optional page_lookup argument, you will get the page attribute from the page found by that argument.

Example:

{% page_attribute "page_title" "my_page_reverse_id" %}
{% page_attribute "page_title" request.current_page.parent_id %}
{% page_attribute "slug" request.current_page.get_root %}

New in version 2.3.2: This template tag supports the as argument. With this you can assign the result of the template tag to a new variable that you can use elsewhere in the template.

Example:

{% page_attribute "page_title" as title %}
<title>{{ title }}</title>

It even can be used in combination with the page_lookup argument.

Example:

{% page_attribute "page_title" "my_page_reverse_id" as title %}
<a href="/mypage/">{{ title }}</a>

New in version 2.4.

render_plugin

This templatetag is used to render child plugins of the current plugin and should be used inside plugin templates.

Arguments:

  • plugin

Plugin needs to be an instance of a plugin model.

Example:

{% load cms_tags %}
<div class="multicolumn">
{% for plugin in instance.child_plugins %}
        <div style="width: {{ plugin.width }}00px;">
        {% render_plugin plugin %}
        </div>
{% endfor %}
</div>

Normally the children of plugins can be accessed via the child_plugins atrribute of plugins. Plugins need the allow_children attribute to set to True for this to be enabled.

Toolbar Templatetags

The cms_toolbar templatetag is included in the cms_tags library and will add the required css and javascript to the sekizai blocks in the base template. The templatetag has to be placed after the <body> tag and before any {% cms_placeholder %} occurrences within your HTML.

Example:

<body>
{% cms_toolbar %}
{% placeholder "home" %}
...

Command Line Interface

You can invoke the django CMS command line interface using the cms Django command:

python manage.py cms

Informational commands

cms list

The list command is used to display information about your installation.

It has two subcommands:

  • cms list plugins lists all plugins that are used in your project.
  • cms list apphooks lists all apphooks that are used in your project.

cms list plugins will issue warnings when it finds orphaned plugins (see cms delete_orphaned_plugins below).

cms check

Checks your configuration and environment.

Plugin and apphook management commands

cms delete_orphaned_plugins

Warning

The delete_orphaned_plugins command permanently deletes data from your database. You should make a backup of your database before using it!

Identifies and deletes orphaned plugins.

Orphaned plugins are ones that exist in the CMSPlugins table, but:

  • have a plugin_type that is no longer even installed
  • have no corresponding saved instance in that particular plugin type’s table

Such plugins will cause problems when trying to use operations that need to copy pages (and thefore plugins), which includes cms moderator on as well as page copy operations in the admin.

It is advised to run cms list plugins periodically, and cms delete_orphaned_plugins when required.

cms uninstall

The uninstall subcommand can be used to make uninstalling a CMS Plugin or an apphook easier.

It has two subcommands:

  • cms uninstall plugins <plugin name> [<plugin name 2> [...]] uninstalls one or several plugins by removing them from all pages where they are used. Note that the plugin name should be the name of the class that is registered in the django CMS. If you are unsure about the plugin name, use the cms list to see a list of installed plugins.
  • cms uninstall apphooks <apphook name> [<apphook name 2> [...]] uninstalls one or several apphooks by removing them from all pages where they are used. Note that the apphook name should be the name of the class that is registered in the django CMS. If you are unsure about the apphook name, use the cms list to see a list of installed apphooks.

Warning

The uninstall commands permanently delete data from your database. You should make a backup of your database before using them!

Moderation commands

cms moderator

If you migrate from an earlier version, you should use the cms moderator on command to ensure that your published pages are up to date, whether or not you used moderation in the past.

Warning

This command alters data in your database. You should make a backup of your database before using it! Never run this command without first checking for orphaned plugins, using the cms list plugins command, and if necessary delete_orphaned_plugins. Running cms moderator with orphaned plugins will fail and leave bad data in your database.

MPTT repair command

cms mptt-repair

Occasionally, the MPTT structure in which pages and plugins are held can accumulate small errors. These are typically the result of failed operations or large and complex restructurings of the tree (perhaps even cosmic rays, planetary alignment or other mysterious conditions).

Usually you won’t even notice them, and they won’t affect the operation of the system, but when you run into trouble it’s useful to be able to rebuild the tree - it’s also useful to rebuild it as part of preventative maintenance.

Warning

This command alters data in your database. You should make a backup of your database before using it!

Permissions

In django-cms you can set two types of permissions:

  1. View restrictions for restricting front-end view access to users
  2. Page permissions for allowing staff users to only have rights on certain sections of certain sites

To enable these features, settings.py requires:

CMS_PERMISSION = True

View restrictions

View restrictions can be set-up from the View restrictions formset on any cms page. Once a page has at least one view restriction installed, only users with granted access will be able to see that page. Mind that this restriction is for viewing the page as an end-user (front-end view), not viewing the page in the admin interface!

View restrictions are also controlled by the CMS_PUBLIC_FOR setting. Possible values are all and staff. This setting decides if pages without any view restrictions are:

  • viewable by everyone – including anonymous users (all)
  • viewable by staff users only (staff)

Page permissions

After setting CMS_PERMISSION = True you will have three new models in the admin index:

  1. Users (page)
  2. User groups (page)
  3. Pages global permissions

Using Users (page) you can easily add users with permissions over cms pages.

You would be able to create an user with the same set of permissions using the usual Auth.User model, but using Users (page) is more convenient.

A new user created using Users (page) with given page add/edit/delete rights will not be able to make any changes to pages straight away. The user must first be assigned to a set of pages over which he may exercise these rights. This is done using the Page permissions formset on any page or by using Pages global Permissions.

The Page permission formset has multiple checkboxes defining different permissions: can edit, can add, can delete, can change advanced settings, can publish, can move and can change permission. These define what kind of actions the user/group can do on the pages on which the permissions are being granted through the Grant on drop-down.

Can change permission refers to whether the user can change the permissions of his subordinate users. Bob is the subordinate of Alice if one of:

  • Bob was created by Alice
  • Bob has at least one page permission set on one of the pages on which Alice has the Can change permissions right

Note: Mind that even though a new user has permissions to change a page, that doesn’t give him permissions to add a plugin within that page. In order to be able to add/change/delete plugins on any page, you will need to go through the usual Auth.User model and give the new user permissions to each plugin you want him to have access to. Example: if you want the new user to be able to use the text plugin, you will need to give him the following rights: text | text | Can add text, text | text | Can change text, text | text | Can delete text.

Using the Pages global permissions model you can give a set of permissions to all pages in a set of sites.

Extending the CMS

Extending the CMS: Examples

From this point onwards, this tutorial assumes you have done the Django Tutorial and will show you how to integrate the tutorial’s poll app into the django CMS. Hereafter, if a poll app is mentioned, we are referring to the one you get after completing the Django Tutorial. Also, make sure the poll app is in your INSTALLED_APPS.

We assume your main urls.py looks something like this:

from django.conf.urls.defaults import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/', include(admin.site.urls)),
    (r'^polls/', include('polls.urls')),
    (r'^', include('cms.urls')),
)

My First Plugin

A Plugin is a small bit of content that you can place on your pages.

The Model

For our polling app we would like to have a small poll plugin which shows a poll and lets the user vote.

In your poll application’s models.py add the following:

from cms.models import CMSPlugin

class PollPlugin(CMSPlugin):
    poll = models.ForeignKey('polls.Poll', related_name='plugins')

    def __unicode__(self):
      return self.poll.question

Note

django CMS plugins must inherit from cms.models.CMSPlugin (or a subclass thereof) and not models.Model.

Run manage.py syncdb to create the database tables for this model or see Using South with django CMS to see how to do it using South.

The Plugin Class

Now create a file cms_plugins.py in the same folder your models.py is in. After having followed the Django Tutorial and adding this file your polls app folder should look like this:

polls/
    __init__.py
    cms_plugins.py
    models.py
    tests.py
    views.py

The plugin class is responsible for providing the django CMS with the necessary information to render your Plugin.

For our poll plugin, write the following plugin class:

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from polls.models import PollPlugin as PollPluginModel
from django.utils.translation import ugettext as _

class PollPlugin(CMSPluginBase):
    model = PollPluginModel # Model where data about this plugin is saved
    name = _("Poll Plugin") # Name of the plugin
    render_template = "polls/plugin.html" # template to render the plugin with

    def render(self, context, instance, placeholder):
        context.update({'instance':instance})
        return context

plugin_pool.register_plugin(PollPlugin) # register the plugin

Note

All plugin classes must inherit from cms.plugin_base.CMSPluginBase and must register themselves with the cms.plugin_pool.plugin_pool.

The Template

You probably noticed the render_template attribute in the above plugin class. In order for our plugin to work, that template must exist and is responsible for rendering the plugin.

The template should look something like this:

<h1>{{ instance.poll.question }}</h1>

<form action="{% url polls.views.vote instance.poll.id %}" method="post">
{% csrf_token %}
{% for choice in instance.poll.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

Note

We don’t show the errors here, because when submitting the form you’re taken off this page to the actual voting page.

My First App (apphook)

Right now, external apps are statically hooked into the main urls.py. This is not the preferred approach in the django CMS. Ideally you attach your apps to CMS pages.

For that purpose you write a CMSApp. That is just a small class telling the CMS how to include that app.

CMS Apps live in a file called cms_app.py, so go ahead and create it to make your polls app look like this:

polls/
    __init__.py
    cms_app.py
    cms_plugins.py
    models.py
    tests.py
    views.py

In this file, write:

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _

class PollsApp(CMSApp):
    name = _("Poll App") # give your app a name, this is required
    urls = ["polls.urls"] # link your app to url configuration(s)

apphook_pool.register(PollsApp) # register your app

Now remove the inclusion of the polls urls in your main urls.py so it looks like this:

from django.conf.urls.defaults import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/', include(admin.site.urls)),
    (r'^', include('cms.urls')),
)

Now open your admin in your browser and edit a CMS Page. Open the ‘Advanced Settings’ tab and choose ‘Polls App’ for your ‘Application’.

apphooks

Unfortunately, for these changes to take effect, you will have to restart your server. So do that and afterwards if you navigate to that CMS Page, you will see your polls application.

My First Menu

Now you might have noticed that the menu tree stops at the CMS Page you created in the last step. So let’s create a menu that shows a node for each poll you have active.

For this we need a file called menu.py. Create it and ensure your polls app looks like this:

polls/
    __init__.py
    cms_app.py
    cms_plugins.py
    menu.py
    models.py
    tests.py
    views.py

In your menu.py write:

from cms.menu_bases import CMSAttachMenu
from menus.base import Menu, NavigationNode
from menus.menu_pool import menu_pool
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from polls.models import Poll

class PollsMenu(CMSAttachMenu):
    name = _("Polls Menu") # give the menu a name, this is required.

    def get_nodes(self, request):
        """
        This method is used to build the menu tree.
        """
        nodes = []
        for poll in Poll.objects.all():
            # the menu tree consists of NavigationNode instances
            # Each NavigationNode takes a label as its first argument, a URL as
            # its second argument and a (for this tree) unique id as its third
            # argument.
            node = NavigationNode(
                poll.question,
                reverse('polls.views.detail', args=(poll.pk,)),
                poll.pk
            )
            nodes.append(node)
        return nodes
menu_pool.register_menu(PollsMenu) # register the menu.

At this point this menu alone doesn’t do a whole lot. We have to attach it to the Apphook first.

So open your cms_apps.py and write:

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from polls.menu import PollsMenu
from django.utils.translation import ugettext_lazy as _

class PollsApp(CMSApp):
    name = _("Poll App")
    urls = ["polls.urls"]
    menus = [PollsMenu] # attach a CMSAttachMenu to this apphook.

apphook_pool.register(PollsApp)

Custom Plugins

CMS Plugins are reusable content publishers that can be inserted into django CMS pages (or indeed into any content that uses django CMS placeholders). They enable the publishing of information automatically, without further intervention.

This means that your published web content, whatever it is, is kept up-to-date at all times.

It’s like magic, but quicker.

Unless you’re lucky enough to discover that your needs can be met by the built-in plugins, or by the many available 3rd-party plugins, you’ll have to write your own custom CMS Plugin. Don’t worry though - writing a CMS Plugin is rather simple.

Why would you need to write a plugin?

A plugin is the most convenient way to integrate content from another Django app into a django CMS page.

For example, suppose you’re developing a site for a record company in django CMS. You might like to have a “Latest releases” box on your site’s home page.

Of course, you could every so often edit that page and update the information. However, a sensible record company will manage its catalogue in Django too, which means Django already knows what this week’s new releases are.

This is an excellent opportunity to make use of that information to make your life easier - all you need to do is create a django CMS plugin that you can insert into your home page, and leave it to do the work of publishing information about the latest releases for you.

Plugins are reusable. Perhaps your record company is producing a series of reissues of seminal Swiss punk records; on your site’s page about the series, you could insert the same plugin, configured a little differently, that will publish information about recent new releases in that series.

Overview

A django CMS plugin is fundamentally composed of three things.

  • a plugin editor, to configure a plugin each time it is deployed
  • a plugin publisher, to do the automated work of deciding what to publish
  • a plugin template, to render the information into a web page

These correspond to the familiar Model-View-Template scheme:

  • the plugin model to store its configuration
  • the plugin view that works out what needs to be displayed
  • the plugin template to render the information

And so to build your plugin, you’ll make it from:

  • a subclass of cms.models.pluginmodel.CMSPlugin to store the configuration for your plugin instances
  • a subclass of cms.plugin_base.CMSPluginBase that defines the operating logic of your plugin
  • a template that renders your plugin
A note about cms.plugin_base.CMSPluginBase

cms.plugin_base.CMSPluginBase is actually a subclass of django.contrib.admin.options.ModelAdmin.

It is its render() method that is the plugin’s view function.

An aside on models and configuration

The plugin model, the subclass of cms.models.pluginmodel.CMSPlugin, is actually optional.

You could have a plugin that doesn’t need to be configured, because it only ever does one thing.

For example, you could have a plugin that only publishes information about the top-selling record of the past seven days. Obviously, this wouldn’t be very flexible - you wouldn’t be able to use the same plugin for the best-selling release of the last month instead.

Usually, you find that it is useful to be able to configure your plugin, and this will require a model.

The simplest plugin

You may use python manage.py startapp to set up the basic layout for you plugin app. Alternatively, just add a file called cms_plugins.py to an existing Django application.

In there, you place your plugins. For our example, include the following code:

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from cms.models.pluginmodel import CMSPlugin
from django.utils.translation import ugettext_lazy as _

class HelloPlugin(CMSPluginBase):
    model = CMSPlugin
    render_template = "hello_plugin.html"

plugin_pool.register_plugin(HelloPlugin)

Now we’re almost done. All that’s left is to add the template. Add the following into the root template directory in a file called hello_plugin.html:

<h1>Hello {% if request.user.is_authenticated %}{{ request.user.first_name }} {{ request.user.last_name}}{% else %}Guest{% endif %}</h1>

This plugin will now greet the users on your website either by their name if they’re logged in, or as Guest if they’re not.

Now let’s take a closer look at what we did there. The cms_plugins.py files are where you should define your subclasses of cms.plugin_base.CMSPluginBase, these classes define the different plugins.

There are three required attributes on those classes:

  • model: The model you wish to use for storing information about this plugin. If you do not require any special information, for example configuration, to be stored for your plugins, you can simply use cms.models.pluginmodel.CMSPlugin (we’ll look at that model more closely in a bit). In a normal admin class, you don’t need to supply this information because admin.site.register(Model, Admin) takes care of it, but a plugin is not registered in that way.
  • name: The name of your plugin as displayed in the admin. It is generally good practice to mark this string as translatable using django.utils.translation.ugettext_lazy(), however this is optional. By default the name is a nicer version of the class name.
  • render_template: The template to render this plugin with.

In addition to those three attributes, you can also define a render() method on your subclasses. It is specifically this render method that is the view for your plugin.

The render method takes three arguments:

  • context: The context with which the page is rendered.
  • instance: The instance of your plugin that is rendered.
  • placeholder: The name of the placeholder that is rendered.

This method must return a dictionary or an instance of django.template.Context, which will be used as context to render the plugin template.

New in version 2.4.

By default this method will add instance and placeholder to the context, which means for simple plugins, there is no need to overwrite this method.

Troubleshooting

Since plugin modules are found and loaded by django’s importlib, you might experience errors because the path environment is different at runtime. If your cms_plugins isn’t loaded or accessible, try the following:

$ python manage.py shell
>>> from django.utils.importlib import import_module
>>> m = import_module("myapp.cms_plugins")
>>> m.some_test_function()

Storing configuration

In many cases, you want to store configuration for your plugin instances. For example, if you have a plugin that shows the latest blog posts, you might want to be able to choose the amount of entries shown. Another example would be a gallery plugin where you want to choose the pictures to show for the plugin.

To do so, you create a Django model by subclassing cms.models.pluginmodel.CMSPlugin in the models.py of an installed application.

Let’s improve our HelloPlugin from above by making its fallback name for non-authenticated users configurable.

In our models.py we add the following:

from cms.models.pluginmodel import CMSPlugin

from django.db import models

class Hello(CMSPlugin):
    guest_name = models.CharField(max_length=50, default='Guest')

If you followed the Django tutorial, this shouldn’t look too new to you. The only difference to normal models is that you subclass cms.models.pluginmodel.CMSPlugin rather than django.db.models.base.Model.

Now we need to change our plugin definition to use this model, so our new cms_plugins.py looks like this:

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from django.utils.translation import ugettext_lazy as _

from models import Hello

class HelloPlugin(CMSPluginBase):
    model = Hello
    name = _("Hello Plugin")
    render_template = "hello_plugin.html"

    def render(self, context, instance, placeholder):
        context['instance'] = instance
        return context

plugin_pool.register_plugin(HelloPlugin)

We changed the model attribute to point to our newly created Hello model and pass the model instance to the context.

As a last step, we have to update our template to make use of this new configuration:

<h1>Hello {% if request.user.is_authenticated %}{{ request.user.first_name }} {{ request.user.last_name}}{% else %}{{ instance.guest_name }}{% endif %}</h1>

The only thing we changed there is that we use the template variable {{ instance.guest_name }} instead of the hardcoded Guest string in the else clause.

Warning

cms.models.pluginmodel.CMSPlugin subclasses cannot be further subclassed at the moment. In order to make your plugin models reusable, please use abstract base models.

Warning

You cannot name your model fields the same as any installed plugins lower-cased model name, due to the implicit one-to-one relation Django uses for subclassed models. If you use all core plugins, this includes: file, flash, googlemap, link, picture, snippetptr, teaser, twittersearch, twitterrecententries and video.

Additionally, it is recommended that you avoid using page as a model field, as it is declared as a property of cms.models.pluginmodel.CMSPlugin, and your plugin will not work as intended in the administration without further work.

Handling Relations

If your custom plugin has foreign key (to it, or from it) or many-to-many relations you are responsible for copying those related objects, if required, whenever the CMS copies the plugin - it won’t do it for you automatically.

Every plugin model inherits the empty cms.models.pluginmodel.CMSPlugin.copy_relations() method from the base class, and it’s called when your plugin is copied. So, it’s there for you to adapt to your purposes as required.

Typically, you will want it to copy related objects. To do this you should create a method called copy_relations on your plugin model, that receives the old instance of the plugin as an argument.

You may however decide that the related objects shouldn’t be copied - you may want to leave them alone, for example. Or, you might even want to choose some altogether different relations for it, or to create new ones when it’s copied... it depends on your plugin and the way you want it to work.

If you do want to copy related objects, you’ll need to do this in two slightly different ways, depending on whether your plugin has relations to or from other objects that need to be copied too:

For foreign key relations from other objects

Your plugin may have items with foreign keys to it, which will typically be the case if you set it up so that they are inlines in its admin. So you might have a two models, one for the plugin and one for those items:

class ArticlePluginModel(CMSPlugin):
    title = models.CharField(max_length=50)

class AssociatedItem(models.Model):
    plugin = models.ForeignKey(
        ArticlePluginModel,
        related_name="associated_item"
        )

You’ll then need the copy_relations() method on your plugin model to loop over the associated items and copy them, giving the copies foreign keys to the new plugin:

class ArticlePluginModel(CMSPlugin):
    title = models.CharField(max_length=50)

    def copy_relations(self, oldinstance):
        for associated_item in oldinstance.associated_item.all():
            # instance.pk = None; instance.pk.save() is the slightly odd but
            # standard Django way of copying a saved model instance
            associated_item.pk = None
            associated_item.plugin = self
            associated_item.save()
For many-to-many or foreign key relations to other objects

Let’s assume these are the relevant bits of your plugin:

class ArticlePluginModel(CMSPlugin):
    title = models.CharField(max_length=50)
    sections = models.ManyToManyField(Section)

Now when the plugin gets copied, you want to make sure the sections stay, so it becomes:

class ArticlePluginModel(CMSPlugin):
    title = models.CharField(max_length=50)
    sections = models.ManyToManyField(Section)

    def copy_relations(self, oldinstance):
        self.sections = oldinstance.sections.all()

If your plugins have relational fields of both kinds, you may of course need to use both the copying techniques described above.

Advanced

Plugin form

Since cms.plugin_base.CMSPluginBase extends django.contrib.admin.options.ModelAdmin, you can customize the form for your plugins just as you would customize your admin interfaces.

The template that the plugin editing mechanism uses is cms/templates/admin/cms/page/plugin_change_form.html. You might need to change this.

If you want to customise this the best way to do it is:

  • create a template of your own that extends cms/templates/admin/cms/page/plugin_change_form.html to provide the functionality you require
  • provide your cms.plugin_base.CMSPluginBase subclass with a change_form_template attribute pointing at your new template

Extending admin/cms/page/plugin_change_form.html ensures that you’ll keep a unified look and functionality across your plugins.

There are various reasons why you might want to do this. For example, you might have a snippet of JavaScript that needs to refer to a template variable), which you’d likely place in {% block extrahead %}, after a {{ block.super }} to inherit the existing items that were in the parent template.

Or: cms/templates/admin/cms/page/plugin_change_form.html extends Django’s own admin/base_site.html, which loads a rather elderly version of jQuery, and your plugin admin might require something newer. In this case, in your custom change_form_template you could do something like:

{% block jquery %}
    <script type="text/javascript" src="///ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
{% endblock jquery %}``

to override the {% block jquery %}.

Handling media

If your plugin depends on certain media files, javascript or stylesheets, you can include them from your plugin template using django-sekizai. Your CMS templates are always enforced to have the css and js sekizai namespaces, therefore those should be used to include the respective files. For more information about django-sekizai, please refer to the django-sekizai documentation.

Note that sekizai can’t help you with the admin-side plugin templates - what follows is for your plugins’ output templates.

Sekizai style

To fully harness the power of django-sekizai, it is helpful to have a consistent style on how to use it. Here is a set of conventions that should be followed (but don’t necessarily need to be):

  • One bit per addtoblock. Always include one external CSS or JS file per addtoblock or one snippet per addtoblock. This is needed so django-sekizai properly detects duplicate files.
  • External files should be on one line, with no spaces or newlines between the addtoblock tag and the HTML tags.
  • When using embedded javascript or CSS, the HTML tags should be on a newline.

A good example:

{% load sekizai_tags %}

{% addtoblock "js" %}<script type="text/javascript" src="{{ MEDIA_URL }}myplugin/js/myjsfile.js"></script>{% endaddtoblock %}
{% addtoblock "js" %}<script type="text/javascript" src="{{ MEDIA_URL }}myplugin/js/myotherfile.js"></script>{% endaddtoblock %}
{% addtoblock "css" %}<link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}myplugin/css/astylesheet.css"></script>{% endaddtoblock %}
{% addtoblock "js" %}
<script type="text/javascript">
    $(document).ready(function(){
        doSomething();
    });
</script>
{% endaddtoblock %}

A bad example:

{% load sekizai_tags %}

{% addtoblock "js" %}<script type="text/javascript" src="{{ MEDIA_URL }}myplugin/js/myjsfile.js"></script>
<script type="text/javascript" src="{{ MEDIA_URL }}myplugin/js/myotherfile.js"></script>{% endaddtoblock %}
{% addtoblock "css" %}
    <link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}myplugin/css/astylesheet.css"></script>
{% endaddtoblock %}
{% addtoblock "js" %}<script type="text/javascript">
    $(document).ready(function(){
        doSomething();
    });
</script>{% endaddtoblock %}
Plugin Context Processors

Plugin context processors are callables that modify all plugins’ context before rendering. They are enabled using the CMS_PLUGIN_CONTEXT_PROCESSORS setting.

A plugin context processor takes 2 arguments:

  • instance: The instance of the plugin model
  • placeholder: The instance of the placeholder this plugin appears in.

The return value should be a dictionary containing any variables to be added to the context.

Example:

def add_verbose_name(instance, placeholder):
    '''
    This plugin context processor adds the plugin model's verbose_name to context.
    '''
    return {'verbose_name': instance._meta.verbose_name}
Plugin Processors

Plugin processors are callables that modify all plugins’ output after rendering. They are enabled using the CMS_PLUGIN_PROCESSORS setting.

A plugin processor takes 4 arguments:

  • instance: The instance of the plugin model
  • placeholder: The instance of the placeholder this plugin appears in.
  • rendered_content: A string containing the rendered content of the plugin.
  • original_context: The original context for the template used to render the plugin.

Note

Plugin processors are also applied to plugins embedded in Text plugins (and any custom plugin allowing nested plugins). Depending on what your processor does, this might break the output. For example, if your processor wraps the output in a div tag, you might end up having div tags inside of p tags, which is invalid. You can prevent such cases by returning rendered_content unchanged if instance._render_meta.text_enabled is True, which is the case when rendering an embedded plugin.

Example

Suppose you want to wrap each plugin in the main placeholder in a colored box but it would be too complicated to edit each individual plugin’s template:

In your settings.py:

CMS_PLUGIN_PROCESSORS = (
    'yourapp.cms_plugin_processors.wrap_in_colored_box',
)

In your yourapp.cms_plugin_processors.py:

def wrap_in_colored_box(instance, placeholder, rendered_content, original_context):
    '''
    This plugin processor wraps each plugin's output in a colored box if it is in the "main" placeholder.
    '''
    # Plugins not in the main placeholder should remain unchanged
    # Plugins embedded in Text should remain unchanged in order not to break output
    if placeholder.slot != 'main' or (instance._render_meta.text_enabled and instance.parent):
        return rendered_content
    else:
        from django.template import Context, Template
        # For simplicity's sake, construct the template from a string:
        t = Template('<div style="border: 10px {{ border_color }} solid; background: {{ background_color }};">{{ content|safe }}</div>')
        # Prepare that template's context:
        c = Context({
            'content': rendered_content,
            # Some plugin models might allow you to customize the colors,
            # for others, use default colors:
            'background_color': instance.background_color if hasattr(instance, 'background_color') else 'lightyellow',
            'border_color': instance.border_color if hasattr(instance, 'border_color') else 'lightblue',
        })
        # Finally, render the content through that template, and return the output
        return t.render(c)
Plugin Attribute Reference

A list of all attributes a plugin has and that can be overwritten:

change_form_template

The template used to render the form when you edit the plugin.

Default:

admin/cms/page/plugin_change_form.html

Example:

class MyPlugin(CMSPluginBase):
    model = MyModel
    name = _("My Plugin")
    render_template = "cms/plugins/my_plugin.html"
        change_form_template = "admin/cms/page/plugin_change_form.html"
frontend_edit_template

The template used for wrapping the plugin in frontend editing.

Default:

cms/toolbar/placeholder_wrapper.html

admin_preview

Should the plugin be previewed in admin when you click on the plugin or save it?

Default: False

render_template

The path to the template used to render the template. Is required.

render_plugin

Should the plugin be rendered at all, or doesn’t it have any output?

Default: True

model

The Model of the Plugin. Required.

text_enabled

Default: False Can the plugin be inserted inside the text plugin?

If this is enabled the following function need to be overwritten as well:

icon_src()

Should return the path to an icon displayed in the text.

icon_alt()

Should return the alt text for the icon.

page_only

Default: False

Can this plugin only be attached to a placeholder that is attached to a page? Set this to true if you always need a page for this plugin.

allow_children

Default: False

Can this plugin have child plugins? Or can other plugins be placed inside this plugin?

child_classes

Default: None A List of Plugin Class Names. If this is set, only plugins listed here can be added to this plugin.

App Integration

It is pretty easy to integrate your own Django applications with django CMS. You have 5 ways of integrating your app:

  1. Menus

    Statically extend the menu entries

  2. Attach Menus

    Attach your menu to a page.

  3. App-Hooks

    Attach whole apps with optional menu to a page.

  4. Navigation Modifiers

    Modify the whole menu tree

  5. Custom Plugins

    Display your models / content in cms pages

Attach Menus

Classes that extend from menus.base.Menu always get attached to the root. But if you want the menu to be attached to a CMS Page you can do that as well.

Instead of extending from Menu you need to extend from cms.menu_bases.CMSAttachMenu and you need to define a name. We will do that with the example from above:

from menus.base import NavigationNode
from menus.menu_pool import menu_pool
from django.utils.translation import ugettext_lazy as _
from cms.menu_bases import CMSAttachMenu

class TestMenu(CMSAttachMenu):

    name = _("test menu")

    def get_nodes(self, request):
        nodes = []
        n = NavigationNode(_('sample root page'), "/", 1)
        n2 = NavigationNode(_('sample settings page'), "/bye/", 2)
        n3 = NavigationNode(_('sample account page'), "/hello/", 3)
        n4 = NavigationNode(_('sample my profile page'), "/hello/world/", 4, 3)
        nodes.append(n)
        nodes.append(n2)
        nodes.append(n3)
        nodes.append(n4)
        return nodes

menu_pool.register_menu(TestMenu)

Now you can link this Menu to a page in the ‘Advanced’ tab of the page settings under attached menu.

Each must have a get_menu_title() method, a get_absolute_url() method, and a childrens list with all of its children inside (the ‘s’ at the end of childrens is done on purpose because children is already taken by django-mptt).

Be sure that get_menu_title() and get_absolute_url() don’t trigger any queries when called in a template or you may have some serious performance and database problems with a lot of queries.

It may be wise to cache the output of get_nodes(). For this you may need to write a wrapper class because of dynamic content that the pickle module can’t handle.

If you want to display some static pages in the navigation (“login”, for example) you can write your own “dummy” class that adheres to the conventions described above.

A base class for this purpose can be found in cms/utils/navigation.py

App-Hooks

With App-Hooks you can attach whole Django applications to pages. For example you have a news app and you want it attached to your news page.

To create an apphook create a cms_app.py in your application. And in it write the following:

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _

class MyApphook(CMSApp):
    name = _("My Apphook")
    urls = ["myapp.urls"]

apphook_pool.register(MyApphook)

Replace myapp.urls with the path to your applications urls.py.

Now edit a page and open the advanced settings tab. Select your new apphook under “Application”. Save the page.

Warning

If you are on a multi-threaded server (mostly all webservers, except the dev-server): Restart the server because the URLs are cached by Django and in a multi-threaded environment we don’t know which caches are cleared yet.

Note

If at some point you want to remove this apphook after deleting the cms_app.py there is a cms management command called uninstall apphooks that removes the specified apphook(s) from all pages by name. eg. manage.py cms uninstall apphooks MyApphook. To find all names for uninstallable apphooks there is a command for this as well manage.py cms list apphooks.

If you attached the app to a page with the url /hello/world/ and the app has a urls.py that looks like this:

from django.conf.urls.defaults import *

urlpatterns = patterns('sampleapp.views',
    url(r'^$', 'main_view', name='app_main'),
    url(r'^sublevel/$', 'sample_view', name='app_sublevel'),
)

The main_view should now be available at /hello/world/ and the sample_view has the url /hello/world/sublevel/.

Note

All views that are attached like this must return a RequestContext instance instead of the default Context instance.

Apphook Menus

If you want to add a menu to that page as well that may represent some views in your app add it to your apphook like this:

from myapp.menu import MyAppMenu

class MyApphook(CMSApp):
    name = _("My Apphook")
    urls = ["myapp.urls"]
    menus = [MyAppMenu]

apphook_pool.register(MyApphook)

For an example if your app has a Category model and you want this category model to be displayed in the menu when you attach the app to a page. We assume the following model:

from django.db import models
from django.core.urlresolvers import reverse
import mptt

class Category(models.Model):
    parent = models.ForeignKey('self', blank=True, null=True)
    name = models.CharField(max_length=20)

    def __unicode__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('category_view', args=[self.pk])

try:
    mptt.register(Category)
except mptt.AlreadyRegistered:
    pass

We would now create a menu out of these categories:

from menus.base import NavigationNode
from menus.menu_pool import menu_pool
from django.utils.translation import ugettext_lazy as _
from cms.menu_bases import CMSAttachMenu
from myapp.models import Category

class CategoryMenu(CMSAttachMenu):

    name = _("test menu")

    def get_nodes(self, request):
        nodes = []
        for category in Category.objects.all().order_by("tree_id", "lft"):
            node = NavigationNode(
                category.name,
                category.get_absolute_url(),
                category.pk,
                category.parent_id
            )
            nodes.append(node)
        return nodes

menu_pool.register_menu(CategoryMenu)

If you add this menu now to your app-hook:

from myapp.menus import CategoryMenu

class MyApphook(CMSApp):
    name = _("My Apphook")
    urls = ["myapp.urls"]
    menus = [MyAppMenu, CategoryMenu]

You get the static entries of MyAppMenu and the dynamic entries of CategoryMenu both attached to the same page.

Application and instance namespaces

If you’d like to use application namespaces to reverse the URLs related to your app, you can assign a value to the app_name attribute of your app hook like this:

class MyNamespacedApphook(CMSApp):
    name = _("My Namespaced Apphook")
    urls = ["myapp.urls"]
    app_name = "myapp_namespace"

apphook_pool.register(MyNamespacedApphook)

As seen for Language Namespaces, you can reverse namespaced apps similarly:

{% url myapp_namespace:app_main %}

If you want to access the same url but in a different language use the language templatetag:

{% load i18n %}
{% language "de" %}
    {% url myapp_namespace:app_main %}
{% endlanguage %}

What makes namespaced app hooks really interesting is the fact that you can hook them up to more than one page and reverse their URLs by using their instance namespace. Django CMS takes the value of the reverse_id field assigned to a page and uses it as instance namespace for the app hook.

To reverse the URLs you now have two different ways: explicitly by defining the instance namespace, or implicitely by specifiyng the application namespace and letting the url templatetag resolving the correct application instance by looking at the currently set current_app value.

Note

The official Django documentation has more details about application and instance namespaces, the current_app scope and the reversing of such URLs. You can look it up at https://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces

When using the reverse function, the current_app has to be explicitly passed as an argument. You can do so by looking up the current_app attribute of the request instance:

def myviews(request):
    ...
    reversed_url = reverse('myapp_namespace:app_main',
            current_app=request.current_app)
    ...

Or, if you are rendering a plugin, of the context instance:

class MyPlugin(CMSPluginBase):
    def render(self, context, instance, placeholder):
        ...
        reversed_url = reverse('myapp_namespace:app_main',
                current_app=context.current_app)
        ...

Custom Plugins

If you want to display content of your apps on other pages custom plugins are a great way to accomplish that. For example, if you have a news app and you want to display the top 10 news entries on your homepage, a custom plugin is the way to go.

For a detailed explanation on how to write custom plugins please head over to the Custom Plugins section.

API References

cms.api

Python APIs for creating CMS contents. This is done in cms.api and not on the models and managers, because the direct API via models and managers is slightly counterintuitive for developers. Also the functions defined in this module do sanity checks on arguments.

Warning

None of the functions in this module does any security or permission checks. They verify their input values to be sane wherever possible, however permission checks should be implemented manually before calling any of these functions.

Functions and constants
cms.api.VISIBILITY_ALL

Used for the limit_menu_visibility keyword argument to create_page(). Does not limit menu visibility.

cms.api.VISIBILITY_USERS

Used for the limit_menu_visibility keyword argument to create_page(). Limits menu visibility to authenticated users.

cms.api.VISIBILITY_STAFF

Used for the limit_menu_visibility keyword argument to create_page(). Limits menu visibility to staff users.

cms.api.create_page(title, template, language, menu_title=None, slug=None, apphook=None, redirect=None, meta_description=None, meta_keywords=None, created_by='python-api', parent=None, publication_date=None, publication_end_date=None, in_navigation=False, soft_root=False, reverse_id=None, navigation_extenders=None, published=False, site=None, login_required=False, limit_visibility_in_menu=VISIBILITY_ALL, position="last-child")

Creates a cms.models.pagemodel.Page instance and returns it. Also creates a cms.models.titlemodel.Title instance for the specified language.

Parameters:
  • title (string) – Title of the page
  • template (string) – Template to use for this page. Must be in CMS_TEMPLATES
  • language (string) – Language code for this page. Must be in LANGUAGES
  • menu_title (string) – Menu title for this page
  • slug (string) – Slug for the page, by default uses a slugified version of title
  • apphook (string or cms.app_base.CMSApp subclass) – Application to hook on this page, must be a valid apphook
  • redirect (string) – URL redirect (only applicable if CMS_REDIRECTS is True)
  • meta_description (string) – Description of this page for SEO
  • meta_keywords (string) – Keywords for this page for SEO
  • created_by (string of django.contrib.auth.models.User instance) – User that is creating this page
  • parent (cms.models.pagemodel.Page instance) – Parent page of this page
  • publication_date (datetime) – Date to publish this page
  • publication_end_date (datetime) – Date to unpublish this page
  • in_navigation (boolean) – Whether this page should be in the navigation or not
  • soft_root (boolean) – Whether this page is a softroot or not
  • reverse_id (string) – Reverse ID of this page (for template tags)
  • navigation_extenders (string) – Menu to attach to this page. Must be a valid menu
  • published (boolean) – Whether this page should be published or not
  • site (django.contrib.sites.models.Site instance) – Site to put this page on
  • login_required (boolean) – Whether users must be logged in or not to view this page
  • limit_menu_visibility (VISIBILITY_ALL or VISIBILITY_USERS or VISIBILITY_STAFF) – Limits visibility of this page in the menu
  • position (string) – Where to insert this node if parent is given, must be 'first-child' or 'last-child'
  • overwrite_url (string) – Overwritten path for this page
cms.api.create_title(language, title, page, menu_title=None, slug=None, apphook=None, redirect=None, meta_description=None, meta_keywords=None, parent=None)

Creates a cms.models.titlemodel.Title instance and returns it.

Parameters:
  • language (string) – Language code for this page. Must be in LANGUAGES
  • title (string) – Title of the page
  • page (cms.models.pagemodel.Page instance) – The page for which to create this title
  • menu_title (string) – Menu title for this page
  • slug (string) – Slug for the page, by default uses a slugified version of title
  • apphook (string or cms.app_base.CMSApp subclass) – Application to hook on this page, must be a valid apphook
  • redirect (string) – URL redirect (only applicable if CMS_REDIRECTS is True)
  • meta_description (string) – Description of this page for SEO
  • meta_keywords (string) – Keywords for this page for SEO
  • parent (cms.models.pagemodel.Page instance) – Used for automated slug generation
  • overwrite_url (string) – Overwritten path for this page
cms.api.add_plugin(placeholder, plugin_type, language, position='last-child', target=None, **data)

Adds a plugin to a placeholder and returns it.

Parameters:
  • placeholder (cms.models.placeholdermodel.Placeholder instance) – Placeholder to add the plugin to
  • plugin_type (string or cms.plugin_base.CMSPluginBase subclass, must be a valid plugin) – What type of plugin to add
  • language (string) – Language code for this plugin, must be in LANGUAGES
  • position (string) – Position to add this plugin to the placeholder, must be a valid django-mptt position
  • target – Parent plugin. Must be plugin instance
  • data (kwargs) – Data for the plugin type instance
cms.api.create_page_user(created_by, user, can_add_page=True, can_change_page=True, can_delete_page=True, can_recover_page=True, can_add_pageuser=True, can_change_pageuser=True, can_delete_pageuser=True, can_add_pagepermission=True, can_change_pagepermission=True, can_delete_pagepermission=True, grant_all=False)

Creates a page user for the user provided and returns that page user.

Parameters:
cms.api.assign_user_to_page(page, user, grant_on=ACCESS_PAGE_AND_DESCENDANTS, can_add=False, can_change=False, can_delete=False, can_change_advanced_settings=False, can_publish=False, can_change_permissions=False, can_move_page=False, grant_all=False)

Assigns a user to a page and gives them some permissions. Returns the cms.models.permissionmodels.PagePermission object that gets created.

Parameters:
  • page (cms.models.pagemodel.Page instance) – The page to assign the user to
  • user (django.contrib.auth.models.User instance) – The user to assign to the page
  • grant_on (cms.models.permissionmodels.ACCESS_PAGE, cms.models.permissionmodels.ACCESS_CHILDREN, cms.models.permissionmodels.ACCESS_DESCENDANTS or cms.models.permissionmodels.ACCESS_PAGE_AND_DESCENDANTS) – Controls which pages are affected
  • can_* – Permissions to grant
  • grant_all (boolean) – Grant all permissions to the user
cms.api.publish_page(page, user, approve=False)

Publishes a page and optionally approves that publication.

Parameters:
  • page (cms.models.pagemodel.Page instance) – The page to publish
  • user (django.contrib.auth.models.User instance) – The user that performs this action
  • approve (boolean) – Whether to approve the publication or not
cms.api.approve_page(page, user)

Approves a page.

Parameters:
Example workflows

Create a page called 'My Page using the template 'my_template.html' and add a text plugin with the content 'hello world'. This is done in English:

from cms.api import create_page, add_plugin

page = create_page('My Page', 'my_template.html', 'en')
placeholder = page.placeholders.get(slot='body')
add_plugin(placeholder, 'TextPlugin', 'en', body='hello world')

cms.constants

cms.constants.TEMPLATE_INHERITANCE_MAGIC

The token used to identify when a user selects “inherit” as template for a page.

cms.plugin_base

class cms.plugin_base.CMSPluginBase

Inherits django.contrib.admin.options.ModelAdmin.

admin_preview

Defaults to False, if True there will be a preview in the admin.

change_form_template

Custom template to use to render the form to edit this plugin.

form

Custom form class to be used to edit this plugin.

model

Is the CMSPlugin model we created earlier. If you don’t need model because you just want to display some template logic, use CMSPlugin from cms.models as the model instead.

module

Will group the plugin in the plugin editor. If module is None, plugin is grouped “Generic” group.

name

Will be displayed in the plugin editor.

render_plugin

If set to False, this plugin will not be rendered at all.

render_template

Will be rendered with the context returned by the render function.

text_enabled

Whether this plugin can be used in text plugins or not.

icon_alt(instance)

Returns the alt text for the icon used in text plugins, see icon_src().

icon_src(instance)

Returns the url to the icon to be used for the given instance when that instance is used inside a text plugin.

render(context, instance, placeholder)

This method returns the context to be used to render the template specified in render_template.

Parameters:
  • context – Current template context.
  • instance – Plugin instance that is being rendered.
  • placeholder – Name of the placeholder the plugin is in.
Return type:

dict

menus.base

A navigation node in a menu tree.

Parameters:
  • title (string) – The title to display this menu item with.
  • url (string) – The URL associated with this menu item.
  • id – Unique (for the current tree) ID of this item.
  • parent_id – Optional, ID of the parent item.
  • parent_namespace – Optional, namespace of the parent.
  • attr (dict) – Optional, dictionary of additional information to store on this node.
  • visible (bool) – Optional, defaults to True, whether this item is visible or not.

Returns a list of all children beneath the current menu item.

Returns a list of all parent items, excluding the current menu item.

Utility method to return the URL associated with this menu item, primarily to follow naming convention asserted by Django.

Utility method to return the associated title, using the same naming convention used by cms.models.pagemodel.Page.

Placeholders outside the CMS

Placeholders are special model fields that django CMS uses to render user-editable content (plugins) in templates. That is, it’s the place where a user can add text, video or any other plugin to a webpage, using either the normal Django admin interface or the so called frontend editing.

Placeholders can be viewed as containers for CMSPlugin instances, and can be used outside the CMS in custom applications using the PlaceholderField.

By defining one (or several) PlaceholderField on a custom model you can take advantage of the full power of CMSPlugin, including frontend editing.

Quickstart

You need to define a PlaceholderField on the model you would like to use:

from django.db import models
from cms.models.fields import PlaceholderField

class MyModel(models.Model):
    # your fields
    my_placeholder = PlaceholderField('placeholder_name')
    # your methods

The PlaceholderField takes a string as its first argument which will be used to configure which plugins can be used in this placeholder. The configuration is the same as for placeholders in the CMS.

Warning

For security reasons the related_name for a PlaceholderField may not be surpressed using '+' to allow the cms to check permissions properly. Attempting to do so will raise a ValueError.

Admin Integration

If you install this model in the admin application, you have to use PlaceholderAdmin instead of ModelAdmin so the interface renders correctly:

from django.contrib import admin
from cms.admin.placeholderadmin import PlaceholderAdmin
from myapp.models import MyModel

admin.site.register(MyModel, PlaceholderAdmin)
I18N Placeholders

Out of the box PlaceholderAdmin supports multiple languages and will display language tabs. If you extend PlaceholderAdmin and overwrite change_form_template be sure to have a look at ‘admin/placeholders/placeholder/change_form.html’ on how to display the language tabs.

If you need other fields then the placeholders translated as well: django CMS has support for django-hvad. If you use a TranslatableModel model be sure to not include the placeholder fields in the translated fields:

class MultilingualExample1(TranslatableModel):
    translations = TranslatedFields(
        title=models.CharField('title', max_length=255),
        description=models.CharField('description', max_length=255),
    )
    placeholder_1 = PlaceholderField('placeholder_1')

    def __unicode__(self):
        return self.title

Be sure to combine both hvad’s TranslatableAdmin and PlaceholderAdmin when registering your model with the admin site:

from cms.admin.placeholderadmin import PlaceholderAdmin
from django.contrib import admin
from hvad.admin import TranslatableAdmin
from myapp.models import MultilingualExample1

class MultilingualModelAdmin(TranslatableAdmin, PlaceholderAdmin):
    pass

admin.site.register(MultilingualExample1, MultilingualModelAdmin)
Templates

Now to render the placeholder in a template you use the render_placeholder tag from the placeholder_tags template tag library:

{% load placeholder_tags %}

{% render_placeholder mymodel_instance.my_placeholder "640" %}

The render_placeholder tag takes a PlaceholderField instance as its first argument and optionally accepts a width parameter as its second argument for context sensitive plugins. The view in which you render your placeholder field must return the request object in the context. This is typically achieved in Django applications by using RequestContext:

from django.shortcuts import get_object_or_404, render_to_response
from django.template.context import RequestContext
from myapp.models import MyModel

def my_model_detail(request, id):
    object = get_object_or_404(MyModel, id=id)
    return render_to_response('my_model_detail.html', {
        'object': object,
    }, context_instance=RequestContext(request))

If you want to render plugins from a specific language, you can use the tag like this:

{% load placeholder_tags %}

{% render_placeholder mymodel_instance.my_placeholder language 'en' %}

Adding content to a placeholder

There are two ways to add or edit content to a placeholder, the front-end admin view and the back-end view.

Using the front-end editor

Probably the simplest way to add content to a placeholder, simply visit the page displaying your model (where you put the render_placeholder tag), then append ?edit to the page’s URL. This will make a top banner appear, and after switching the “Edit mode” button to “on”, the banner will prompt you for your username and password (the user should be allowed to edit the page, obviously).

You are now using the so-called front-end edit mode:

edit-banner

Once in Front-end editing mode, your placeholders should display a menu, allowing you to add plugins to them. The following screen shot shows a default selection of plugins in an empty placeholder.

frontend-placeholder-add-plugin

Plugins are rendered at once, so you can get an idea how it will look in fine. However, to view the final look of a plugin simply leave edit mode by clicking the “Edit mode” button in the banner again.

Fieldsets

There are some hard restrictions if you want to add custom fieldsets to an admin page with at least one PlaceholderField:

  1. Every PlaceholderField must be in its own fieldset, one PlaceholderField per fieldset.
  2. You must include the following two classes: 'plugin-holder' and 'plugin-holder-nopage'

Search and the django CMS

For powerful full-text search within the django CMS, we suggest using Haystack together with django-cms-search.

Form and model fields

Model fields

class cms.models.fields.PageField

This is a foreign key field to the cms.models.pagemodel.Page model that defaults to the cms.forms.fields.PageSelectFormField form field when rendered in forms. It has the same API as the django.db.models.fields.related.ForeignKey but does not require the othermodel argument.

Form fields

class cms.forms.fields.PageSelectFormField

Behaves like a django.forms.models.ModelChoiceField field for the cms.models.pagemodel.Page model, but displays itself as a split field with a select dropdown for the site and one for the page. It also indents the page names based on what level they’re on, so that the page select dropdown is easier to use. This takes the same arguments as django.forms.models.ModelChoiceField.

Testing Your Extenstions

Testing Apps

Resolving View Names

Your apps need testing, but in your live site they aren’t in urls.py as they are attached to a CMS page. So if you want to be able to use reverse() in your tests, or test templates that use the url template tag, you need to hook up your app to a special test version of urls.py and tell your tests to use that.

So you could create myapp/tests/test_urls.py with the following code:

from django.contrib import admin
from django.conf.urls import url, patterns, include

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^myapp/', include('myapp.urls')),
    url(r'', include('cms.urls')),
)

And then in your tests you can plug this in with the override_settings() decorator:

from django.test.utils import override_settings
from cms.test_utils.testcases import CMSTestCase

class MyappTests(CMSTestCase):

    @override_settings(ROOT_URLCONF='myapp.tests.test_urls')
    def test_myapp_page(self):
        test_url = reverse('myapp_view_name')
        # rest of test as normal

If you want to the test url conf throughout your test class, then you can use apply the decorator to the whole class:

from django.test.utils import override_settings
from cms.test_utils.testcases import CMSTestCase

@override_settings(ROOT_URLCONF='myapp.tests.test_urls')
class MyappTests(CMSTestCase):

    def test_myapp_page(self):
        test_url = reverse('myapp_view_name')
        # rest of test as normal
CMSTestCase

Django CMS includes CMSTestCase which has various utility methods that might be useful for testing your CMS app and manipulating CMS pages.

Testing Plugins

Plugins can just be created as objects and then have methods called on them. So you could do:

from django.test import TestCase
from myapp.cms_plugins import MyPlugin
from myapp.models import MyappPlugin as MyappPluginModel

class MypluginTests(TestCase):

    def setUp(self):
        self.plugin = MyPlugin()

    def test_plugin(self):
        context = {'info': 'value'}
        instance = MyappPluginModel(num_items=3)
        rendered_html = self.plugin.render(context, instance, None)
        self.assertIn('string', rendered_html)

Sometimes you might want to add a placeholder - say to check how the plugin renders when it is in different size placeholders. In that case you can create the placeholder directly and pass it in:

from django.test import TestCase
from cms.api import add_plugin
from myapp.cms_plugins import MyPlugin
from myapp.models import MyappPlugin as MyappPluginModel

class ImageSetTypePluginMixinContainerWidthTests(TestCase):
    def setUp(self):
        self.placeholder = Placeholder(slot=u"some_slot")
        self.placeholder.save()
        self.plugin = add_plugin(
            self.placeholder,
            u"MyPlugin",
            u"en",
            num_items=3,
        )

Concepts

Introduction

This section doesn’t explain how to do anything, but explains and analyses some key concepts in django CMS.

How the menu system works

Basic concepts

Registration

The menu system isn’t monolithic. Rather, it is composed of numerous active parts, many of which can operate independently of each other.

What they operate on is a list of menu nodes, that gets passed around the menu system, until it emerges at the other end.

The main active parts of the menu system are menu generators and modifiers.

Some of these parts are supplied with the menus application. Some come from other applications (from the cms application in django CMS, for example, or some other application entirely).

All these active parts need to be registered within the menu system.

Then, when the time comes to build a menu, the system will ask all the registered menu generators and modifiers to get to work on it.

Generators and Modifiers

Menu generators and modifiers are classes.

Generators

To add nodes to a menu a generator is required.

There is one in cms for example, which examines the Pages in the database and adds them as nodes.

These classses are subclasses of menus.base.Menu. The one in cms is cms.menu.CMSMenu.

In order to use a generator, its get_nodes() method must be called.

Modifiers

A modifier examines the nodes that have been assembled, and modifies them according to its requirements (adding or removing them, or manipulating their attributes, as it sees fit).

An important one in cms (cms.menu.SoftRootCutter) removes the nodes that are no longer required when a soft root is encountered.

These classes are subclasses of menus.base.Modifier. Examples are cms.menu.NavExtender and cms.menu.SoftRootCutter.

In order to use a modifier, its modify() method must be called.

Note that each Modifier’s modify() method can be called twice, before and after the menu has been trimmed.

For example when using the {% show_menu %} templatetag, it’s called:

  • first, by menus.menu_pool.MenuPool.get_nodes(), with the argument post_cut = False
  • later, by the templatetag, with the argument post_cut = True

This corresponds to the state of the nodes list before and after menus.templatetags.menu_tags.cut_levels(), which removes nodes from the menu according to the arguments provided by the templatetag.

This is because some modification might be required on all nodes, and some might only be required on the subset of nodes left after cutting.

Nodes

Nodes are assembled in a tree. Each node is an instance of the menus.base.NavigationNode class.

A NavigationNode has attributes such as URL, title, parent and children - as one would expect in a navigation tree.

Warning

You can’t assume that a menus.base.NavigationNode represents a django CMS Page. Firstly, some nodes may represent objects from other applications. Secondly, you can’t expect to be be able to access Page objects via NavigationNodes.

How does all this work?

Tracing the logic of the menu system

Let’s look at an example using the {% show_menu %} templatetag. It will be different for other templatetags, and your applications might have their own menu classes. But this should help explain what’s going on and what the menu system is doing.

One thing to understand is that the system passes around a list of nodes, doing various things to it.

Many of the methods below pass this list of nodes to the ones it calls, and return them to the ones that they were in turn called by.

Don’t forget that show_menu recurses - so it will do all of the below for each level in the menu.

  • {% show_menu %} - the templatetag in the template
    • menus.templatetags.menu_tags.ShowMenu.get_context()
      • menus.menu_pool.MenuPool.get_nodes()
        • menus.menu_pool.MenuPool.discover_menus() checks every application’s menu.py, and registers:
          • Menu classes, placing them in the self.menus dict
          • Modifier classes, placing them in the self.modifiers list
        • menus.menu_pool.MenuPool._build_nodes()
          • checks the cache to see if it should return cached nodes

          • loops over the Menus in self.menus (note: by default the only generator is cms.menu.CMSMenu); for each:
            • call its get_nodes() - the menu generator
            • menus.menu_pool._build_nodes_inner_for_one_menu()
            • adds all nodes into a big list
        • menus.menu_pool.MenuPool.apply_modifiers()
          • menus.menu_pool.MenuPool._mark_selected()

          • loops over each node, comparing its URL with the request.path, and marks the best match as selected

          • loops over the Modifiers in self.modifiers calling each one’s modify(post_cut=False)(). The default Modifiers are:
            • cms.menu.NavExtender

            • cms.menu.SoftRootCutter removes all nodes below the appropriate soft root

            • menus.modifiers.Marker loops over all nodes; finds selected, marks its ancestors, siblings and children

            • menus.modifiers.AuthVisibility removes nodes that require authorisation to see

            • menus.modifiers.Level loops over all nodes; for each one that is a root node (level = 0) passes it to:
              • menus.modifiers.Level.mark_levels() recurses over a node’s descendants marking their levels
      • we’re now back in menus.templatetags.menu_tags.ShowMenu.get_context() again

      • if we have been provided a root_id, get rid of any nodes other than its descendants

      • menus.templatetags.menu_tags.cut_levels() removes nodes from the menu according to the arguments provided by the templatetag

      • menu_pool.MenuPool.apply_modifiers(post_cut = True)() loops over all the Modifiers again
        • cms.menu.NavExtender

        • cms.menu.SoftRootCutter

        • menus.modifiers.Marker

        • menus.modifiers.AuthVisibility

        • menus.modifiers.Level:
          • menus.modifiers.Level.mark_levels()
      • return the nodes to the context in the variable children

Publishing

Each page in the CMS exists in two versions: public and draft. The staff users generally use the draft version to edit content and change settings for the pages. None of these changes are visible on the public site until the page is published.

When a page is published, the page must also have all parent pages published in order to become available on the web site. If a parent page is not published at the moment, the page goes into a “pending” state where it will become automatically published once the parent page is published. This enables you to edit an entire subsection of the website and publishing it once all the work is complete.

Serving content in multiple languages

Basic concepts

django CMS has a sophisticated multilingual capability. It is able to serve content in multiple languages, with fallbacks into other languages where translations have not been provided. It also has the facility for the user to set the preferred language and so on.

How django CMS determines the user’s preferred language

django CMS determines the user’s language the same way Django does it.

  • the language code prefix in the URL
  • the language set in the session
  • the language in the django_language cookie
  • the language that the browser says its user prefers

It uses the django built in capabilities for this.

By default no session and cookie are set. If you want to enable this use the cms.middleware.language.LanguageCookieMiddleware to set the cookie on every request.

How django CMS determines what language to serve

Once it has identified a user’s language, it will try to accommodate it using the languages set in CMS_LANGUAGES.

If fallbacks is set, and if the user’s preferred language is not available for that content, it will use the fallbacks specified for the language in CMS_LANGUAGES.

What django CMS shows in your menus

If hide_untranslated is True (the default) then pages that aren’t translated into the desired language will not appear in the menu.

Contributing to django CMS

Contributing to django CMS

Like every open-source project, django CMS is always looking for motivated individuals to contribute to its source code. However, to ensure the highest code quality and keep the repository nice and tidy, everybody has to follow a few rules (nothing major, I promise :) )

Attention

If you think you have discovered a security issue in our code, please report it privately, by emailing us at security@django-cms.org.

Please don’t raise it on:

  • IRC
  • GitHub
  • either of our email lists

or in any other public forum until we have had a chance to deal with it.

Community

People interested in developing for the django CMS should join the django-cms-developers mailing list as well as heading over to #django-cms on the freenode IRC network for help and to discuss the development.

You may also be interested in following @djangocmsstatus on twitter to get the GitHub commits as well as the hudson build reports. There is also a @djangocms account for less technical announcements.

In a nutshell

Here’s what the contribution process looks like, in a bullet-points fashion, and only for the stuff we host on GitHub:

  1. django CMS is hosted on GitHub, at https://github.com/divio/django-cms
  2. The best method to contribute back is to create an account there, then fork the project. You can use this fork as if it was your own project, and should push your changes to it.
  3. When you feel your code is good enough for inclusion, “send us a pull request”, by using the nice GitHub web interface.

Contributing Code

Getting the source code

If you’re interested in developing a new feature for the CMS, it is recommended that you first discuss it on the django-cms-developers mailing list so as not to do any work that will not get merged in anyway.

  • Code will be reviewed and tested by at least one core developer, preferably by several. Other community members are welcome to give feedback.
  • Code must be tested. Your pull request should include unit-tests (that cover the piece of code you’re submitting, obviously)
  • Documentation should reflect your changes if relevant. There is nothing worse than invalid documentation.
  • Usually, if unit tests are written, pass, and your change is relevant, then it’ll be merged.

Since we’re hosted on GitHub, django CMS uses git as a version control system.

The GitHub help is very well written and will get you started on using git and GitHub in a jiffy. It is an invaluable resource for newbies and old timers alike.

Syntax and conventions

We try to conform to PEP8 as much as possible. A few highlights:

  • Indentation should be exactly 4 spaces. Not 2, not 6, not 8. 4. Also, tabs are evil.
  • We try (loosely) to keep the line length at 79 characters. Generally the rule is “it should look good in a terminal-base editor” (eg vim), but we try not be [Godwin’s law] about it.
Process

This is how you fix a bug or add a feature:

  1. fork us on GitHub.
  2. Checkout your fork.
  3. Hack hack hack, test test test, commit commit commit, test again.
  4. Push to your fork.
  5. Open a pull request.

And at any point in that process, you can add: discuss discuss discuss, because it’s always useful for everyone to pass ideas around and look at thngs together.

Running and writing tests is really important.

We have an IRC channel, our django-cms-developers email list, and of course the code reviews mechanism on GitHub - do use them.

Contributing Documentation

Perhaps considered “boring” by hard-core coders, documentation is sometimes even more important than code! This is what brings fresh blood to a project, and serves as a reference for old timers. On top of this, documentation is the one area where less technical people can help most - you just need to write semi-decent English. People need to understand you. We don’t care about style or correctness.

Documentation should be:

  • We use Sphinx/restructuredText. So obviously this is the format you should use :) File extensions should be .rst.
  • Written in English. We could discuss how it would bring more people to the project by having a Klingon or some other translation, but that’s a problem we will confront once we already have good documentation in English.
  • Accessible. You should assume the reader to be moderately familiar with Python and Django, but not anything else. Link to documentation of libraries you use, for example, even if they are “obvious” to you (South is the first example that comes to mind - it’s obvious to any Django programmer, but not to any newbie at all). A brief description of what it does is also welcome.

Pulling of documentation is pretty fast and painless. Usually somebody goes over your text and merges it, since there are no “breaks” and that GitHub parses rst files automagically it’s really convenient to work with.

Also, contributing to the documentation will earn you great respect from the core developers. You get good karma just like a test contributor, but you get double cookie points. Seriously. You rock.

Section style

We use Python documentation conventions for section marking:

  • # with overline, for parts
  • * with overline, for chapters
  • =, for sections
  • -, for subsections
  • ^, for subsubsections
  • ", for paragraphs

Translations

For translators we have a Transifex account where you can translate the .po files and don’t need to install git or mercurial to be able to contribute. All changes there will be automatically sent to the project.

Top translations django-cms core:

Running and writing tests

Good code needs tests.

A project like django CMS simply can’t afford to incorporate new code that doesn’t come with its own tests.

Tests provide some necessary minimum confidence: they can show the code will behave as it expected, and help identify what’s going wrong if something breaks it.

Not insisting on good tests when code is committed is like letting a gang of teenagers without a driving licence borrow your car on a Friday night, even if you think they are very nice teenagers and they really promise to be careful.

We certainly do want your contributions and fixes, but we need your tests with them too. Otherwise, we’d be compromising our codebase.

So, you are going to have to include tests if you want to contribute. However, writing tests is not particularly difficult, and there are plenty of examples to crib from in the code to help you.

Running tests

There’s more than one way to do this, but here’s one to help you get started:

# create a virtual environment
virtualenv test-django-cms
# activate it
cd test-django-cms/
source bin/activate
# get django CMS from GitHub
git clone git@github.com:divio/django-cms.git
# install the dependencies for testing
# note that requirements files for other Django versions are also provided
pip install -r django-cms/test_requirements/django-1.4.txt
# run the test suite
django-cms/runtests.py

It can take a few minutes to run.

When you run tests against your own new code, don’t forget that it’s useful to repeat them for different versions of Python and Django.

Writing tests

Contributing tests is widely regarded as a very prestigious contribution (you’re making everybody’s future work much easier by doing so). Good karma for you. Cookie points. Maybe even a beer if we meet in person :)

What we need

We have a wide and comprehensive library of unit-tests and integration tests with good coverage.

Generally tests should be:

  • Unitary (as much as possible). i.e. should test as much as possible only one function/method/class. That’s the very definition of unit tests. Integration tests are interesting too obviously, but require more time to maintain since they have a higher probability of breaking.
  • Short running. No hard numbers here, but if your one test doubles the time it takes for everybody to run them, it’s probably an indication that you’re doing it wrong.
  • Easy to understand. If your test code isn’t obvious, please add comments on what it’s doing.

Indices and tables

Table Of Contents

PKX^HE5>>7django-cms-release-2.4.x/_images/first-placeholders.pngPNG  IHDRLsBITOtEXtSoftwaregnome-screenshot> IDATxw|̖d)C@H"-4A U)(U((((͂"ʥ^Bzlf7Y \nfw3>!B;B!]8 B *!BxzA!Re!B.Ł 010D \WR"E(B!oeLMM-GcΏ֪E(BP"".AhO3GszHP"EKq"Al$0Ⱦ-Z O\1l{q_f_Xᴁk9BPo\ zeFdB{AD`P/ ^ɭrfu;/L[Ei1Xn`E(Bmp@_Jpy'88va ` @= t@@YX29y&- >>V{AD`BHOT/`ըcfϊP)BP""ŁRɀ "ݨee.}h"*L [ ˏur((Z2[!XZ=+X^dމ2@iF[ S6Kt'/k >Y˅B4_J+E(B@1ටRdAj.#PғP'P)m*}ť"W*Q,*5>Q%eyVO(E罠+=Zn<|5+{xAg  ,\TH5p'uQ4rPDxq)߱Ҳ<많qٞ b=zsNقV0x, iƤ(BP"#"  LZ, ZSwL(<McTj92`12iE9f-;OAr]fJٌ" 3Yp^8] o˵V'u(8G/f#c# %[< ɱm{2[^p\D)['8Xh Q"00P"E_ts.خ@}k`C*+J(BP"q)NITa8 8"sYKP"EH$JrSU~G;E;T3v BP"En8rXl ʋ\E(BP"zڻ@{1Z@D@/P"E(B(Zh"1N7E(BP"Oĥ8xC= !t/!;B!]8 B *!₊B!B!.8 B *! Dd88ՈUYDDDÉT :> m-:v޽{w? ,'<:">H6`m?h"+V;Y2z:97͈1|SmɈ_ ūL{?pk&MO=tM6ιPV;~8G\: ~ [0sMf2 2w]b#Gg۲e˖mV۴ϏkU5z#zj!=x[͖%WKo*:u6^4ݒם :ۨOɃuܒ& &r~/:jrk_͔)_{ &^gɃc՞%d;Ys@D_o<hŽE&,+<"?u.h西o_׆EYyuMޘ=y1y05$0Q[?/r͏G>xqڠ^-T?+u/*Q~lqMMP͋nsfNdpyN?Au=M U/Nl'S.{%cSV8w¶&9 1fo93֩S43&wjfTg±\.iza헾X<Ƈpq{S^Q`s0.<6yڐDjV@["pA1ҳ)Sh-WONݣ kY,p>=]s5!k8 guߝZ6:NZڿgt$KvOx ?x:sb9/ ܵ{?%++=MnB.76~ ZvpXtأb Pfǝ4f<ɚ> [(W :Y%~rK{ pCwy]i7/ѵG^?fȦ;(Vf$+˻~ NUǵMZXR5-V}_,.yrK*Ys,zz 3c~8$ϫnABn/!C6݁yfPĹ.%F15?4R竍+}|ӂOF}>y^U?(ځIUÔ/Ujjk k%k%i*<%ra^I$ Z%Up%5J =T|B%rYp/4Wlm9dn':}̸+,VY.MMgnShI#aYꊽ^Q*XמV,my:[`#90y\J)0.qo^N3\VutOW~꠬ӾyUpʬ3zMx:[`9r`90snkt\;T&iPhIt$A { 1h}i=U#>n"=[Y#^}-ba}hWf_'ޖ`7tYrΒQT۷(L)g=:mx_Թً_RTptc\/ӾSKJWY8+\jSg_ta0zذ*;6js@:⦝1w4wݕځwT_5Rtq~lQ>=wZL  !#YHO?exԃ9^zV15hy+ t"19-EP\Pe"Û]sKoVl؋oN8OL{Oq@?D8uF"޸o YOeTmJVm wZDj3_.8^fɫٸaÆ 74m^hV~Lg?:ʐU8b*&V#Gm[*,ݎ&&}@m 14TSO|cạ2#oz繧DE7LѶMV楰Z{"s^+3={O-T1;O,F'HV)*ۨ؅=P4il0äy#gwK֖9#;{${9L<|а 4F>/q<(\{'ޟ;܏MN665>sΘ -P6_tۆPЌs 9ޘ7볃s_xA,2w `~)UiL{u8[pe_*UN wpHMMOޡ!.w9DKm?h%їg?Omrk6Rq :M\k|td2o]9 q*ݾC.w߮jZE!TQ2b5ΜU{?6Jշwjx9괝v_'*kwۖKDQ,fKW)~~1?imL<Ňށm|~Ŝ6p˻,lϸA#7,)*y7T[? BjfT\{kk훎K9疌5zvKUwzш[ԱC_)ȵhse!GgE^:)Vȹ%wAwҥcۇ?Z.:]䞉8rgz-9廞M*ߪ;pHˤV{ 5q`?\)}Db/yq&>]oͳ2׍{uNڵj\;vsoQ}ZK{HB_[Jnٷޅ.}RFkֺ Zttۑ!տu̵}[oK_mZJɣޝ9w{]/-^'[ShS ?1(3PgI%? kg-4'OZcΝz(5 wk YɟlY&/`B=S>w֭[wlhKf@[h޹M?`kF NM{mHNjU}4+ym,XjAؓ~ήcm_Rf[nԶm:HǨ}m۶Mm ntCl4l0^lDd&u]So/!k9VԟJlԟ[ma5+??_na׾ {scPxDu[{>бq jRhBH܊ XmS,X}^KД1%y nRHw'G34m)[|j r `C9Cߨ/ (ճ[Owqﺫcƌٳg"7־nl cl6;/cGhӷ^\] 0Bf' ]("^b}]0Ƙ'D}drw2!ڀBjfʈ<Eه ovv}pUǭ.^c/d8r[vgv2&1A4WvK B|{~r^32ە@.r^ -J@f/ z4|u߃Nݶes;,ur3ۦM6۷眷iTw҃ ˗]CEZ { '>'_pv),JvLݠ}Ă* kAPbVZ+> :.%҆WRzF]^ Rk7_X6/:|[3o6gup>+Ah˹ԆgV2GZmX~6Iw65mUq|G{rS`g`%VvXzgJ]n-*CB:QlM)ݷ@ a9Usj26NjMUep>ŁK{ oe`a=LJ U^)g߬[C/P_e ȣ{.r Єi4G^o@THu9]m rn)mҬo?l+:~uiOiPQSru.=ń57'MD(\P*#B79^gͨ#;n;Ӟ^$<9k'rwWڻgk ku>*9997W;*yh02q|ﺞ½|3.&&&^Bȿy7927z~fft]U8cnٝ !J`ʟ TB^9 BPq@!+5m }JKKt!3jB! jQ!rϩ/B!G!B\Pq@!TB!BqA!B\Pq@!TB!BqA!B\Pq@!.߭-w𒒒; Bq-T?!r`x@!B!.8 B *!₊B!|Bjj!B.oe,UFߩ~B!.RCpy#@`Pu%E(BP""sZ$)U 0P"E(r?E\B!'Оf"0"E(B7 E8Al``Xw3h3 0^ٗ#:V8mADjXgy\kOed!^x%Bbvݽ hZ,'OdX!0Ɯ# A!<=n/eW X ǂd^[m5|[W}ٹz-g~ޒIE(BPV/^dg,KNB桪/єYh6\Dd;pD11@ 0Mm"E!$'Zn*ӗp Ć#LPIDAT z (_9'Ϥ傏G\EghOO 0vჭq%7ˤJ㚑ZM2E(BP""J%2n*d GfL9wq:SKӵ NM}-4<&@F(M=oY=tHݡ՘E+Vs墓VGQ8!0K&n-.,?a-fM#`j~ѕ{?+AC+ y+LW.RcC/4jn7z4 k-Nk RccT1iG/y)b-STUuc/fbi,eǶCcP"EnEĵ8`_Q*'rF/f޶U>jfꏤ{ 1o2c2`ۡbn`A>m4\ң"L!P@t6/@2Pefb.F @:9rD@0^)gsOJ `+9ke0P DKi1H<=['8X!+ǂV s)BP"\RSSKO` pZ+^O6!JK1"E(B|mlD{ } BGD`"E(B܊}>9ucNPI3J͖]4*e=5|P"Enmĥ88VN[ڛ-@[=NP"E(B)R ZDN- " (BP"}q-O 9vоE(BP"".!θx{A!P+ !F!B\Pq@!TB!BqA!B\Pq@O %ɭFʲ ""N|oĦQn#Ohѱ[ݻw}sWY`=q)xE#_o1DDK_YΒhF+o81|SmɈ_ ūL{?pk&MO=tM6ιPV;~8G\: ~ [0sMf2 2w]b#Gg۲e˖mV۴ϏkU5z#zj!=x[͖%WKo*:u6^4ݒם :ۨOɃuܒ& &r~/:jrk_͔)_{ &^gɃc՞%d;Ys@D_o<hŽE&,+<"?u.h西o_׆EYyuMޘ=y1y05$0Q[?/r͏G>xqڠ^-T?+u/*Q~lqMMP͋nsfNdpyN?Au=M U/Nl'S.{%cSV8w¶&9 1fo93֩S43&wjfTg±\.iza헾X<Ƈpq{S^Q`s0.<6yڐDjV@["pA1ҳ)Sh-WONݣ kY,p>=]s5!k8 guߝZ6:NZڿgt$KvOx ?x:sb9/ ܵ{?%++=MnB.76~ ZvpXtأb Pfǝ4f<ɚ> [(W :Y%~rK{ pCwy]i7/ѵG^?fȦ;(Vf$+˻~ NUǵMZXR5-V}_,.yrK*Ys,zz 3c~8$ϫnABn/!C6݁yfPĹ.%F15?4R竍+}|ӂOF}>y^U?(ځIUÔ/Ujjk k%k%i*<%ra^I$ Z%Up%5J =T|B%rYp/4Wlm9dn':}̸+,VY.MMgnShI#aYꊽ^Q*XמV,my:[`#90y\J)0.qo^N3\VutOW~꠬ӾyUpʬ3zMx:[`9r`90snkt\;T&iPhIt$A { 1h}i=U#>n"=[Y#^}-ba}hWf_'ޖ`7tYrΒQT۷(L)g=:mx_Թً_RTptc\/ӾSKJWY8+\jSg_ta0zذ*;6js@:⦝1w4wݕځwT_5Rtq~lQ>=wZL  !#YHO?exԃ9^zV15hy+ t"19-EP\Pe"Û]sKoVl؋oN8OL{Oq@?D8uF"޸o YOeTmJVm wZDj3_.8^fɫٸaÆ 74m^hV~Lg?:ʐU8b*&V#Gm[*,ݎ&&}@m 14TSO|cạ2#oz繧DE7LѶMV楰Z{"s^+3={O-T1;O,F'HV)*ۨ؅=P4il0äy#gwK֖9#;{${9L<|а 4F>/q<(\{'ޟ;܏MN665>sΘ -P6_tۆPЌs 9ޘ7볃s_xA,2w `~)UiL{u8[pe_*UN wpHMMOޡ!.w9DKm?h%їg?Omrk6Rq :M\k|td2o]9 q*ݾC.w߮jZE!TQ2b5ΜU{?6Jշwjx9괝v_'*kwۖKDQ,fKW)~~1?imL<Ňށm|~Ŝ6p˻,lϸA#7,)*y7T[? BjfT\{kk훎K9疌5zvKUwzш[ԱC_)ȵhse!GgE^:)Vȹ%wAwҥcۇ?Z.:]䞉8rgz-9廞M*ߪ;pHˤV{ 5q`?\)}Db/yq&>]oͳ2׍{uNڵj\;vsoQ}ZK{HB_[Jnٷޅ.}RFkֺ Zttۑ!տu̵}[oK_mZJɣޝ9w{]/-^'[ShS ?1(3PgI%? kg-4'OZcΝz(5 wk YɟlY&/`B=S>w֭[wlhKf@[h޹M?`kF NM{mHNjU}4+ym,XjAؓ~ήcm_Rf[nԶm:HǨ}m۶Mm ntCl4l0^lDd&u]So/!k9VԟJlԟ[ma5+??_na׾ {scPxDu[{>бq jRhBH܊ XmS,X}^KД1%y nRHw'G34m)[|j r `C9Cߨ/ (ճ[Owqﺫcƌٳg"7־nl cl6;/cGhӷ^\] 0Bf' ]("^b}]0Ƙ'D}drw2!ڀBjfʈ<Eه ovv}pUǭ.^c/d8r[vgv2&1A4WvK B|{~r^32ە@.r^ -J@f/ z4|u߃Nݶes;,ur3ۦM6۷眷iTw҃ ˗]CEZ { '>'_pv),JvLݠ}Ă* kAPbVZ+> :.%҆WRzF]^ Rk7_X6/:|[3o6gup>+Ah˹ԆgV2GZmX~6Iw65mUq|G{rS`g`%VvXzgJ]n-*CB:QlM)ݷ@ a9Usj26NjMUep>ŁK{ oe`a=LJ U^)g߬[C/P_e ȣ{.r Єi4G^o@THu9]m rn)mҬo?l+:~uiOiPQSru.=ń57'MD(\P*#B79^gͨ#;n;Ӟ^$<9k'rwWڻgk ku>*9997W;*yh02q|ﺞ½|3.&&&^Bȿy7927z~fft]U8cnٝ !J`ʟ TB^9 BPq@!+5m }JKKt!3jB! jQ!rϩ/B!G!B\Pq@!TB!BqA!B\Pq@!TB!BqA!B\Pq@!.߭-w𒒒; Bq-T?!r`x@!B!.8 B67?> IENDB`PKX^H2ԔԔ.django-cms-release-2.4.x/_images/it-worked.pngPNG  IHDR**(sRGBbKGD pHYs  tIME 6<3rtEXtCommentCreated with GIMPW IDATxw|TUϝɤ=H b[е]]}\Og[tZ׆""MzB:e1!$@.߷ydf=ssFaabQȅdS\:~?n׋WKEE6m"33LSEDDDDDSڀ鱗O?`z"##1 C#""""" rn76mtBDDDDD䢢Ʌ.^[2j(U(xJPRP41~\&3 Q.|>?VkL*GI ; gO0M&boUW\.qHJ/x*kXu(x^lVlfR0JM?5@;lQvoF^o7^hXsr([%0xN76WWWzj6oLqqq###IOO'##y7YսtW3[w{Y?ͮYDDDD{),˥oPE' =xsWeGIMe5ߏ40-V7K^g̙kov;8`{u b{3ͷ9++>JF륲ݻիYz5ӧO'%%wݠzM?ե06{/sA9̥,^^ьBh]_a}5wsV84k XxNjK zr3; xx}X|^?#TWz}bc"~{حRؿLz{ _c^NoЊu:3 з3ؼl!hh=K7b1Lvٚ??0ktx[r /ȣ030jRRRLUUyoR=6Jʫx}~?!Fxr@~ts:߻2wE`[=^oۓdؑD!:Mpp0A ڍG;ٛ1{Jgz.o޼SR^~[ ~zx^z{_x8E?ڷ}pnzl+:/yK̃ }{ڷOew^d{5Igf@WڷoOtݓ|iۇtPn|W-,•}P[AcUYl!39T"/`zVϰTo']G<:#%EAI6|EO×kLPx) ^t[rۍf]qLL, e奸=n"[=OM ~IݠW;YnQ^.{`ۚ]wHlD]'a{.)ϣL7o&==`زO>lIyy9l޼fωO3)1M'B| &`xٳL]\=O%=°)Qp|9o.J%?[cpܝhGLv曟 ̲ N7 ho)dPuv_?10,aIr K)ʊMY/apb{ԓhK )rChBC[+-m^=XWzE<+JτǺa4g0U. YjDGǴj=Unv</~azگ&ĄjwM"!! /ЃZVZL^~6 $>"a޹999L0.lB`x$44A.]|w}r~0zO'oMܻs͈3ǁ:{N6,:5Nؓ~::Į2ּyױǟD Lpԩ/+q Đ J#&sY V~ 8 R n T.G/ p1iנ)DDDD"Ҡ[Sk@L*~Xb2K3gX,> Zaxu{TVywحLgJ,;3%1 @Pdgo/#Cʗ1 mu%99љkO?$\|kOup jnj_7w76.x}V$r *9MaP\w8a^=Ia2pD&y*?i }@M2m\t3LפTV,Vq·[(mim|.py gd{ppJw jrc akDDDDD. 0DR'R^ jn1o_lLz']RW LJ㣴̣f3g 5;rX { 8_q^ rb,+N06x: %8|z/(~hfQv7Jdm gMʣ)a !%kQS HCmm:x&e`[)ȷaرv5pD 'j8QTMIYyz=>~?>,1NxH0Lv-qbo9OOVlGwbQVn;Ѽ󻟦#^/QJRbTVUBpXnP $(mn͛>5  l0wqC uz96 V{CȘ؝`;1ȧ{)5GVğ<&fxF KzYz A-^YfսB0-^><_smo2b?xUQ J㞟N^kpwF)C0a|Stk4íTOeS뽧߹7ޭYe=wVst[/%>c^gܘf~?}t~|sЅJWgvwٶ>TdX;\I0 ӈ!_ܙ_qw {ײ2{^#""""r>vS]]cُm{\CUeA,N!°X, mM01VBCNnZ4"e"V<^m[ v؈u0y`I1vZ HH mmvl6&44_p5x)YIkjjXf Ç'<9,NzN֗W2^3O>Ǣ%k8I)ޮyط3ޟ19spiùkN,=~em0ux< QDDDOϲK=g<ZmX+8p`?OEÊKKKӟc=Frrgeeݻv@t8سgӧOot[6 'k0MON qCnOΓb3۞Cii)TVVRQYŦEΫƋIRa=c ur !<>sfiRt R.ˢӷGkӬٓ R = 2=y}T)qy?{ gfqCW⎈gdz|cOOi9Ævv\M?Ns':-B=M^'T>N2Q;QΤ{7,W⻗'#.={r~ݥ &>οq)cBV"^k}pϟWmr9zw;:[oYmX֚z3. 򤦦rӽB|Gv72l,Hz=䳷 p{[>Lye@ׇx?2:Z7o.?:[+  }+weeKSn<|6_o?wFٍV*q!C Q\IGpܚK`D"t "edaqo'XŢU ى5Ӎ \u;`^5ǽCC\?99?7#~{=߹ b5ϱxb=?t~?{1B'Uxec';t<;wA1v%?}dƯ/NX+aaCb+S= """""< ύqf"ת=ycƌ`n'1JYɺLXC|@?@.3 NnJFW9ʼWolH>¨FBeXq "G+!HTdE ^WLSxA[h 8psd/#9X !yһvWoQJ]/-M 92cC9 *jFBlpDlFĄ9""""" `Dd,^חú#/W[c,_sofA i(a-^팶Vi!bҜ;OwsɄ0_>GWwp s'+G[FKɮpv+@8W'f;RoK 9jaܓPê'spd?n2'#Sx=&^:^ZJ?) s3d?;EDDDDR v o믹`'7`R'_Ed]HĈľ~|3cHj/g+b_Bxn啥@ _禮mnsL=fIa z#p? IDATx)o~=]tN>yNuAq@^%މV:g#5olV[7Ǘ⫙ȥ< e씾DcP{:#N@ ;t)8N$5_X?V’0gk!<{('OlŵS::Nୟ=ؾɄX?L"m|D7ң7/9 &839ogYCiEDDDDdd囦ADDDDDD.aCDDDDDD9״_qs lXCB|[W?[C%{HdΡ6ާ-oA-Ǝou)'ظyh`uc ƪ]*""""r/v; dU71sӬ6GEGNIL(.Úާd|.'Ws%׏(aWk)8!w\ۍ <+rH.>0&Fb1+c|| ~_љɏM;?u]OaW5:Ai֍nx'HW{qz.\]UMQ F0QTFbkO]ֶe6.y/-0oX:mn'~/}H4V[W~Rw]Yo,nÁvVlg,2w3f6$]SyuiAElz&ۮY3'ڊ.U#.#G+dR:"(K [_ \y㳏=yztanwu<ɗezAR1JEhF29|Sܗxԓ#o^OG&<"k>Ms"f=ew::+FUv}El>K 2νS|",\CE\ͨ^uجSj~{Yv """%+ Ag91 &Szär ys1E-:Rb,ZˆL}Nz׋eŋ:ȤX 7b2#̀(K`{ͷS@QH .ƅz-p:lEvF?%^3ːvulx9HA&lyO?n.C`O+})ޅk_> 8t2  ;Vd[~1N*}Ԧemmi MO9jGv<_;Yz2$- Kk%NkgD짿M3f/&|w=W`J֟{Fj"f1L~l5; () xk#moE;oq$iz^Ţ1cOp#,>bH7;΁Swxh%鑁 쯀7o!mqt˘JFٴ=}.B-kr]wWSԉcǒTʑ64)5hm-77Oo95+P{ NZY,d1Et`C3<)(p2|<7}_~;qMӆhؼCZSGش!2XeF3I嚦 lX/}zܶK /~JMH>t9 ֩/ݻcz Z7!s="B,Guv֗^ _ ;v nT>=K-ei|#{:1Hr澱 69 nF>|ljr+Q^M;0j}!x,i~9g3En8t ""&Zua0f Nsײ 콦2Xm7Pg9՞ݣꝴ[NhOP]Z xװNOLe^M+˦H=hYA`œr-pd)c([t"@ %uf؝Kwr<7Epu/& }SS0c|_5]z d^25nfŞu8q-}]6fP`lY=Ef6ϙl~ }W(\M~hyncCUYzOgu9YvD83>cB9MZҮb3uk7U6hc/ ~D/a*xc;;!|@bl+=?uS_ PSm%lsv8cRew3C)nI{8zsӵ{7^]g Y.:9]'d4Vf5<j͖3q`pM8biB~ nׅDs! :3~{+e6X0um#ܗ6{6ww&bC];vW>ŭ;4lPej \ ž+̿JAIpԶVSKe{2*͇zzekv| ڝx7{f5|+d g`; B/w\[kX!@QEz^?8kU!1,,-X-dRv, g 6g6[ylhA{kz6qwʨќMp NĽYNc=n0=9s7}l-`:35%ir|TAq?|}U1_Mw2XZ!+cl2Wg}ݕյgڋ̘Zqw%IߦSܐ RGC湬,cem]=Yr^hϛ_v_αjؾQ~]_c۝qUq#C쨂Éw H߮|d):Ok}MkdGgb_yu)!3/Zk zGgl]}_4[ylV&"""w~sxW6yWEܽ1av'p`qjAsDlHačc _FJ#kY\;?!RJGGFL3//pd do]Ps;%h3gw{,}aᩬ!0sw앴-l|THc8FY==fiuraڑ<ְ`ӟyz<&slBC옫h Nd$|N&08!whQ[/4G/g~㮦Ys-X:A}VTq#%KKu k1߂}\EK_+HO jef㋼c:}l:IJuG&y> W7BH YGED0]aS8h =SPmIaaDX<-Xc W/˱Zɱ-ؙo]-C%-i-7sdowp 辞""" XqAu_n6\Q9.HMwbقپj&{` iG }9Z3z wر$8N+fجU1B3b.ۗBr ;ۙX8:OaLZKvemu.ѱvݧ,\]+`#r*.ԺӇz\%0Χp,ŚmKX30sIHbOO:6~+ YR"Ü9bÐAKd{v 47gm5p<]Mﵚ#~a:S>Cɉ߮cP|[\=}sw52ڹںh:z{:;%dҒ]eڹ87}tucl 6p{^͕WN$-Ѭlrj˙r#w>IJbCѩW2*e-k-7_Iy 7DDDZ7 j\XOK5{_om&{cRwz߾M^Gx果>Ph:7S>Bjq󦿘<ɗR'Mw9>`ծ%uDDD.~ c/)dqhn<U? 9BGt%HraktvׅEǼ=|k.- ̠4wc`dr,c*3:=s8ŹRǐD 7g{>6M^EǼ=(x~k.\߉ֲlr$(}{Xl[ٛ ݮ6THږ~ʣ~bʰ1/7@DD?KOx"""""")"""""" """"""" """""")"""""" """"""" """""")"""""" """"""" """""")"""""" """"""" """""")"""""")"""""" """""")"""""")"""""" """""")"""""")"""""" """""")"""""")"""""" """""""Wz@ """"""QYYiDDDDDDBP[QOOQOOQOOQOO3M4"[ź\QS]YWj]\b?Y/pĺ\\t>+bOF•0u"Вz \b^*0B:?x5ݶ+\w5M3z~Wb}{TmDnDV[FүN\"/.kXU<1+?-j/NQ窫Vo#"""r.î? ;ٽe>N_?+Rǧl_6Jv2حX,vf9yw+;>oI]]Ǜ>GDDD.i~O,$ 4Fu$ &5p߶MJ?:k~o=<.]'YT53n藀"L}TFwoLnrE![mr}`٢F꽆OnQ&2d}Tsڹu6{mO8&|4|U..{0^_%7vqt4vܺ7tuTi mUcg@ir%ql5Gl~$΃g~ޜƚnL }- 8Xq>x7ѮK,lQH;W_Ml$:4@"3_z;ho_Uxpj ;!%dlMY{XP\g}GQ} mI4RHC("*M HE ^)R_EQД&Ҥ ȦmE()Ë0{νsgרJTb,'~XvHzȝJ#" NВ7`Υ}~K8}v!S%I=4xu1"F'a_z;PyPws0>.bc;zT=Vs0eKڻrK[zv83$vj6G=aaGoLƥ0cN.!z7|D1ePfMX+Σ(deKO?ڮCz׿7v󺏂WA}7Poj_`_LeZr{~⳸c;1:X{{@҉9i@߫9ъm8W2.t~]ڛN y:ꕯ1)[_,1ޯlKg;,s,my)Hp,\iKs, 1xIt̬u1q f-J}9+A+BgTHsK1|u. SkqmnL̮p,2+qX0~:7L\yg?$[ {^.vl{΋76%Y#~%.7#Q| UBZ{|_ ? IDATN.'nz~Q8,܅tJ爥:?lO%/wm"nc0m`L/ qOS7z/͕_Xz, LuQJw_}uvW~\1BZةl_[o[X߇Rȍˉ4-Kgx+;'9'>HǭV˝yZq*4烵c;/烧!Eh>1)!lĞ߉< #j{Z|\oHNf/O`czzsƫ5J%GӻmI0pr5x vjs>P.˳+%P _9 +h}}(_=.Sg=yQcoSǸ_#α〖&ݺRWugNqBeHif>0]eg\Ea{{j; Shq/YJ*=W4^* ~yヶͰ6Fs1|S>5s@g*l.-֊ODNpB<bWu,1[V}^m^^&F7xw˔Dt1sm|KL?#I:ʪz{(TU>t^^s9ތBfAGpݷ[9ۍڞ +{] >qQg8fU/9y1qu8+Ĝ[88Jlwj[,V$Gd[g'yÂI \ӹfj4RVUؼr9X=#֨cUe jOfpXv2>m﷭'6|S# MAs@nʲ<9Kd͓!V 6h)W yB*7րSÚ|PZv\۠P>hi؃Q YޜFԯli:JFaL\q$s:f z˻EGYI* n94nEt@ꋛFKT=?O`2tv}jQLqؼm0[R nt(޽=ePm1vOB wcTVǤnȨ䶑C"ѯ~ -{X9OJ*"N6lWviخ<5+gYMo^< S^$ŔYkߺٸ{m0O-F@UZ*salΕ\ݩު,g}ˍZk3Uޕ7jg.y6FScL߽5s m,7ǘlُcm>8>/=|;B,E_Ʃq4{No]϶z!B`G8v ;ѲJYJWGx}^vx:E,7qtX%Wʏ˻kzs;glӐ">R3ޫb|>oqqp_/Ou'+۟U6)n#2SHڝ6ܴ^9Ts/ףJN/Zz2mŞr2Z\B;0+QǢHp(OPĪӯζs^vT kߚ[t%o{e]&}&yCl_~XҍI/V.u)]}k{m0-cƻnGijQoR{^b]XUEG)jη3Ҹk$efzVbcG!B OqJ[V'Y]zf6o5W__Jr!Bj+yV!B!$B!BH)B!B O!B!B O!B!Rx !B!S!B!S!B!B!B!B!B!B!B!B!B)<B!B)<B!BH)B!BH)B!B OAQEɕxß%/yl6c6B!-=R9c֢!~#s~~bcߦ(MF! B ϧf…,\1οܨ%_HfF4=MKm˖EgN ;YOlN#jTWEVMLqTziBߥ5jբJŗ:OL ʣ =/e=t\KQ .I=BR-޷1UJ]6pÐ퉔*:wc] 7Lw1+H4|3OX:ttk2grۧ?lLi7g4wMI򅧭uS-=C8u tK=,7aǔVTpwٹ$%}?Ch1x !!!L<)H019oKZ3H2`6I9F> Hzo0hrSthLV3{h#ެKBBB6q ]!l}ze!gjH'g9l$pmLeh`6X/-r}XEcY=K_!¼nlN%rvERQ MUw0gƨn3\8'aIzOʟ6L!hW-%ڐ#\4O~^֖qV8"oA!x ώ;2j(FIPPP7"wloO:?ǡO^& }zg83+"v8GUv"t#wr+178AK9M1c?981zW| l:D${0,ÌCmDπOq?F,̣)Yw-AϕiQN''ݭ#.K.%{i>k5i/ bER\O#bQiä9[G|AP oƟf{;Ǽ^,Ksۧ?rJ9g'$=\с#7n$]4q?-`u=5jtG:t9q1a8X̡$[$qh|811t}Nj5ճnsܸ1 hzOx9m춮JlcY}n2/}7R~q&\dyG$m\0T#))h)4X0:.`|z}]4[[Y;B-\;v ֭[ '88ϭV/Z~0,܅tJ8!+G0Bޚ; KC>[ ׌[i~ Gc0ů愛ܸ) &ӷbuyo"q;-Zᕷ:%5u/DgW}Wu i׆1|g˵|f3άDn\NDѬnYG 4`ݾlMvr]7P9a֔tTCALykz'le'QV~Ug䡁;Ҷ콝Lԑo KƔf;o꾆:,Gvu3$B}7Ԧ2) MrՈB#/>xBdapg8FMQ=rX/ֳx\=>gҌ|y;z^™Yݦjg:n\$eٗmxLh1+lAfICZaԊE*s .e7M:fqY=)J2V~G oQ#j_轚3|@=)\\/?KsqTx7zu=_ƜUP;aNNFWgCZp]= r刎RALDg%>- ?LF Ix"#R4Y/M b~f^h1g~Ŷ :j&l%jZs#j,Du;o2%_;$`ho4e_K@4_)Bm{4|uJ>¬C8x&+$?R0)Z\ !6J*IGRh;q5M,AЄ8b$j<EKj/Lo}ZOaqhpӑ|"Lr]1!EomkҩnN`8deW~ F؂ѼQ 0+Kw0^ϰ,k;4!' Y"G ^G[ m|a;ng|ا*Kqu\!RKzO*c}Dkn|\oXNfc !r;_hB;EPz0zM=Lc޵h?SgլPO\~e6m?^f/ U%-݌G^i\;  ZZ(/ ac6)^&c|1ϧj1bq/˃Ev>[ǹF^ws%qu\QLQ?2}{%> m0DZ76WNK#7ïtpG$rpBHi]^_ٺu+͛7GOq:klbo7B2Z=v &ȸOVD ]GeJ]USIF_B$7 8TnŹ/kQ\YLu6%Q]f3l'fZk%.3k0E?Ƕ7]Hb2cRRqLC1 e+y=G vxx8x#iCi=_Yr&}4 L$\JzzO*9c.de;>- [c/t/h,ҙD s܌'Hl>b \s Ӡq4uDP6'[hvD~x ^I[?G|o fE2KU~(cO!Ձ}oIz$3C EDv⛰?k xŤ='q _cLc,݁5 #SOj|^Gju2=ߩOLgc$DQ~q^C@!C$g צêQW`g#?|07X˙xƤS;D-q)oWS; #tURM8| = TFe2xlcjiĀ>+;9rm{! 5'rXo{~ᷨŵ?2_ {`0+DJ2ζs̭?Hs1ٌg;mf[r_sm@,Q{Gt[{|15Ä})Y^}ٷ*v+öXDhŔz:|!B°#5#Cq=5|qEkQlW=F^SԼ3ZH~ZەG+S,FKq.]3Q;EZ@~*th]}k.8޷njsIPq:Ϗat7{6_6N)۟U4)%Jh2S&+\p,d?oW/?,M/J6{֥=?e~Ve@[ oHNizzPzH?CQ qQlgc]]_~Xm!6@ v_&~_YNICgYjg`L1]å2hvףo#?L7˹#\4fL&}& myd +㫿`݉rdowҾTn/D}Z1r'H6_ʯ N(GuZW<ѸaXe̙4&}gXy{Q 7eh@=e"k\QSIVU3ro%v<svܖF[oKx/bOt2QNQەw7lU{~=c\9ԊagxL W ㅒ>6cOϦ~۴,SEїmiKmTgNEp#CB<[TmGwSZтZ;q`{/g:;=KE!L(/C-e>ϰK֏>?bEbhSc7ۥx)Q-Fռ'l^ N 퓙g|ٔ)c~})ozJqpP.= g,oE:W8lT*0Ez:*ND'9 !@dw34%rKT t~M܏ӁөU 7 IDAT=37{xIg>mt{zQTNT3kQY|y%KOZ&>ZW!B<' .d…HK<ˁM*)VLgAh{|oEjʢXwM+i]{_0zй\J5r|ʴb`28;v)̗9-]6W 1ȁv<!1tؑQF1rHʳ>Hf^.l9[_&@Ł߱t|-\%r9<IV$l:D${0,ÌCzoWp>V,˺Y7< ;9_ ñ=HDZ̹ g"2ףp[ēq蓗YY=L40fO]\J$)|2j^,%\dUrq bx\,<ϳ]5]DHThFsk+g%wg'쏸LQeє\e翢kߍu Y$OHJ![Nx;u,_ǢH9qsR'9mzץiT?"ygH&B<{׮ .dǎuV c ~>IT{{!3OP?J{aNɍ{:|`7}kSO"mޭV/Z~0,܅tJ8!+G0Bޚ; rA/77$nBeVCg䩯g2kP]RNA,q m~8v15^ӫoAkbˬ*G1'j^ƜUP;aNNFWgCsg3M&+rѐS kX RY~SI8ʲ/D9=&}*^o akQ+fN1\Yߴ7mnguRN/|q^ؘ/rǻ{ xμ iQ;-v- 3ʕ#:/K0{ ׷0/05`$ gH,g93FV1ObYӃƯxs-'wwf*?ne%Rya:do6Fz`Ɩ9|/'wӸw*s9X[k㥠c~x~_++k,eO#=b}|o˘8c&-m!ĮlzxkVbEk˰u-X*Y{sܵx7v!RxZ$c"Fcy,` 7:9qh@fߟ9_fܴ+F`2ZeW:5^K zv}4`A*∑8-+I{|0M)eB6>lC iX87?A]f|v%xFY͓͟ŽJ1Z[v2TB- +Tbu\!RKsK+=n aY80 f%r݆ 8"; (<x Cп=`&F5i00- _xgh0WM WaM:3wUP.۸Q3̙O_ (ɜ7[6m4ޫ,uas1r1:Ng` w4J"㮶Ml4,DCwSː` k,q̠O/ ! c+>K,}&!)w/Ow5*jV{4?|mE+ZքvvaO+c826&Q#h3 m i5&XZfh/CB0CVY-_uƘ,e+co;*8Z/x{mFTɈ}`˱[]Sy*)ɶ% 6^iیJ8v heS!|Bzů֭[h޼9=z=]F_Qϊo2hlkjSRVF,Iu6%QJ:ӯ2k*=:z1[9ۍΣ;iGoW @"b:*S:ܚN2fnkF:q\slۋOy%4+mɘ * gbq./?>ã]K¥/*빵7ZT&>Cƣ;i[dW5`]5ZSZEIocۼsN֕iyR)#j'\)H:FbN}pdt_%P^ZOJϱ 7Mx0a"o;M؟;!tq 6ziz;013: eܴpLwS8f-/K/!Y!kz5^uy33 wpG t8j̠ Xr *~Mڶ,>p7zWZ7슾Nrr[_1?=1oWd=GrbmZ5wc:Ҹmkˢ7*_dk\;̕ێV !Rx>1+V <<J3D*oӽ!JiW/+I4-$$RI1{S̟Tj,|RiXx ؍ΞMmZ=@cv߮|me-ͧS(XKgŔ;VM*WrB ϼg:Q{ɗ;26 ?ЕNґ""Zsߚ=ΎO-$/wGXie+ҡuN29O']ֶvO{kW36֢0ZU+> D/ۯ{⽪8x|~#_+aTwLy=zb䎾hKS4jyw %ZOhmW8kcVB=}y8$j8SvBHO+FeORmiՙj..uSEZ}h̘LvB :߹D?֯&iۖÜڄ-02L> W3=iװlU{~=cDjͰW=m_[iKMl;5@ɓ W"WpU9= C F9[ }iۗ9r'H6_ʯ N(GuZW<ѸY˰6?.ܔ͖ZϷ=bqqDmL%Y]W[++egi)붱S90A`4.o^ϙ:uzf} ZHzugytaojŰyz=_jJ>q:E %}noe:.峩_6-xBϵX >VboR*l6^ %YFJ[3@x'֖=I2OK \ ؽ,S0r6qdc1\g '|B 5skE jā(<~)( {ܳ/Z\Ul6z)9$SOMzќy 1cZ|￾ hgE* x&ۮa6I99q4g|94dzr3J{zY;3ͤDؖ%bI'ѿi~r]m?lE\~^v24?aL{l'^ej܃o~O4G>ޮC ۣs$ޔ>sg8,qjNQ= sdyv O4>1)o~=J>_Ӑ톪@WӠءQ-چP nԤNoB37gh]i?G{j_C؟`WEgy>盳Y~^sy4,߆y_%u9 2F糶+OId;¦ 98{ 7APN8s8Gci}1|Sq*ګ !AY8){Qq{5pFAQ҉JZ%3Th̠$$Nj;XzKĻXexzrXq\Q=0'v&3fd!';,+R ,V7>DT9fxzZj11&S`5O79îT˫Pkq*x>}5,ƶ-S$}JGw+79mΎo˰w1زh/5ɗ;^n ;%:.޾o^ȎL?~m,}g;g$k 4vl-pg/ʅYx4~z au4α✅YR[wӦPQl<!_S:g~~ٱ&2q2Ejsbi6oㆶ3d՞?&+*m2cO}[nvϪgV57IDATĜxgTg"&XZz?܊`~*͏rh8 'b}vh7=^ִsoOd1zK>8縨jm 0x:k ٽjoWUlU\GNq[LbOZ]:k-&qaZ 5WEm }a[smoud:=! w|Lo p1y:]0 JL,7)K&gm>n\y?ʔžwnobe0/l0<& KDZ`3֔aPvL[ƘQL)V;17;tѷZ5ām >rprcF{8Vvz೓؛1E8L`} ggV{}&vO NaSY{ښr{rOGӪ7=qsh$BMf"ZR+)C4!d!DK[|GI9_h-lEyA~)":_Kt0{hZ۱LŪM^t>]Ħ|j_3e(.J5*wj-oZ,2^u9/jsx3n6ù|5n; _pVov'^W*ұ2\Z@Aڒi@OSY.h[ lܛ>,ڱ|Z3~N;6\^Ĺo~1]es0^pMziӧgnYĽF^w<{?=Ï%oed|4MzG8}^ǜu}s{y=jZ~W $'ww~.ڶRc|gZg*?;MU/ƷsuFrvm󣇾ٕm]}gC'F5u1?+gzǧ^C L^9 TV':B_cZ;G>6g"*pvH߮Z=Z}-?rg{t$p{rRl/*" ^yՋIkr>t/GweCY0U%hPrJE?C&G+ނ7'$w_u80 Op#d9\; u+ afp"={ ==s6ΟgsYVdf|v9Rx`3)w+{lmlimsG%hN3YY}Sz`p4- y,:fCx:^ۙjM q8J j=Nr~<QcSA%gr'1 +.wT}*%I C|c_M-mPs' ?=n^OeGd'og&7qf++7WG?d?/ױ,GB#~&(znI??Z[)0j\bC۠8F켁[)n/C:KQc)ػ o3cmc}p,@!>=U%499-]JvF1؏8a^qW)?ֶ3(rALkLe8 "a 66Nra#4n%/Fxl5AϨ~)vUܥd1Cou}Vj-<Ă\NQ4a5OdzK;E{2G]<0afקg2-9CN!kvk)^cџ<_ I6efNl[4rצv/n4]qu܋u`KfuLAzX֓͘c[ d习"op0-Kt-\eUwţ tT[_~xWPyÄ"8YXW< ?Sv _Hf \]yܦ`'VEL4(9genyŸ…{8eoqMp1ON}Њ; 3&KSY:L"sLfc&LWݸ&L&0(>T$΃Ңdïunf芻_]ڱoI/DNNt$nx)}GofoF/[] 1g433?ef -fOwNUkVlԘXxj'/(p^CUkéL&=r /}^cx]3XpFԴq\_B,YUxq}}eY>EUc{<Q4,b\{M# fѶƣf xM~(X}_KB~n|WF- 2𾖄׬GCƒZ!X ПY<.|A3 ryx\EaDƅQjxSkI`-[By6~}4!u:f j_8#a'[fi./`e\1k+vq0\עw͍\k.SOi1ÿ4I6~SQ(;VG \84s^4n6V㈫L=%J;YOC2 z))(i$&"SY_0oeꥯ](/yQ솒oتzԂD$ ?ϣKwPX^BY$3]0~{tD}´77'om9Ƽ uGw|ԴPq;yˇ)D5`n syWT8Vq7l::J/@PT_bWQI5ݰ1ܸr9+g MnTrȨ*ĩSxV='8p{wm"&8j}]jW*g׶9JIiO33>3:66 ]a ftRKd1Gӭ,ִ`??pzs_{[es\T5œ_lB^1Ls?15z{ ̬N7G6T;[@z˾4uT9j4/Z8a((wF::\[O< SR,~[']IBjϴvMu̘)IN3[Y?|؅,V'Vnx[rO8;!qwR^LYX$55='63n۝8EO3bn^S`1z)1ufK%^"K΄Ͱoz[y8a n]7^'Z<%V^ܖʷ2z%>K(.7x8A:,x $_AB챗qs/08>]s~{y|jH߾1<6# }l-O ^_-Y MK/6ƭ(wodu5,8 &t `K*k77MGT6y~N vK=lXh1 ?6Ah<퀽c33=.3 8gy:~ʗ6En=Ndftdp앰N?h- Fi.9矞;'j+""""""nꈈ6""""""6""""""h)""""""h)""""""x!knnzADDDDDDvDDDDDD\ѫ""""""h)""""""h)""""""xh)""""""x6"""""""x6""""""6""""""6""""""h)""""""h)""""""xh)""""""x6"""""""x_ZIENDB`PKX^Hw55Ddjango-cms-release-2.4.x/_images/frontend-placeholder-add-plugin.pngPNG  IHDR VsRGBbKGD pHYs  tIME Bs]tEXtCommentCreated with GIMPW IDATxwxl)'@(AA:(U*" * ZA, bܫ ""\6A'"H!n Bhz333Yò, RbEDD,""ra_^ ""zꇃDDDNDDT)XDDTQQ""" )# zx_>Ԇ^D"Ir1*%pkԪHvuKӾv7>pv'3mEm$Tyw|#:nH#؊\W3wb\œb;]KCX'~ۚ<ޘ`8KAmGES8 $XNނ8,cݺuVŊuEDΠ}xo׮]T^\`Q~P(XJXDDΒP(T&/U,""XT  _aY)K""rv|>\|>v{AKa""gAXXnPȜ eY|>Z 9l6\.@sNnra[,""giQIKa""R""'fz:120 N'in,"ax\r~eYQκCHِ]nhB8e4, l8qVp_ȔMEmLר5"֤Mwѭq 2u}GiwZ$X^ 8 3Ux<K>U!tLt`zxՉlq~z|xqoqf3g2 lx;ys[ٿ #:NwʪN0M N0{]uX7*t 6rBi!nnsDmY~~|/eWl VZ$ًU-/d87?8&X6}>[Cn–Ѐn}{qYėoNXD]ww+Eԧ&ynɫX=Hc򍯡휑,e>q`\V~&|3 [g<='U2>`6~32g0 -/ϊ;ٱˠn49As5,rb]vʇ"gL@ Bvu$Dg2z ;S*64KjSoaNZ2pFZ_4q?ZA|}jCCGU.8~jKϘק9!8dkpWz&i!9ƱNy( X=%iYV^[DNK8mxrQф=(~mX"ξɏiNOw9oҙ^8}lh;3<̃ZE\u=4,VXrأ].:ۣ8CÀ2|%"gENHq\N,A\ dVr 'aPuՕU%tZ3r@#ڰ ?Ťe7AjDFJ**_ޝ^ޝ`?y<|>Y q75x{Ʊ ,N0/y{.1*]kNOY\ns6Ԍ8$Nc287lkE&fD<μZ`Ǣ/ cdߊN|&$e|͢>,,2qʢb\zc2) _[LE]{=ۊ/gX|fd!dw*}:13"cgFؖYc?E_S+Ĩ#[TiG,ݘĤ5c'ò\}7`4haգWSFR :7 ս{BlHY>ӷH]wR5 _[6SOL$`DѶ=ę̔+[Ԇ-'f\R{L^}OwnO ϋa؈֎o#*>ݳSieԂ 9v]q+51f$WqėKG\ K5),RRR4ej<8Z!,ÆC&f[^x*g=ztXD5/sU?$XN y(XDDb&4W0ǘGV޷6. EDdF;=NҠw*)~?`ӻOד~̤NiZ R`(XDDD"""`(XDDD,""`(XDDD,""rn_79C,˂%zu-#Oc›6~331΢[06lh oǗP#b@*8 n7 CZ,"g\X Bd`z<6MӉھҝ#'eA\D,"Y_PE-O֏1 -!J$Uby޾'6N繉$b~ zJ:*s *V_1n?ǼHLk"i 40wdetGR&I {6zuDY,M3s#|XQn_[ԝCh]فThގ9߲ݖeB`z2lhgV) UX̂͸ Y7@]Qa\X%apXSd[6CO@*m={w%a}6g4$v5E1L\1yAWmb]8kue&D:uP)}Y .ȉ9-ބY݇{\&NYk,+w72nSJT/̔+=7>iyqGT† ɶRWQV"i*BuE䘲HII9eYX,{mk>ɘ,6d}gDD书W^7i,F]纖Dibu;"8sE˳߆hݹ>" *R'z7{}:rli֛S4r-bZ ;ErQa Ћ*QEDD,""" QEDD92*::}U)XDDH4;6S \~JR*(XDDD""" (XDD,XD˲ o {uGoȓysEPat-3/7w?׋GnwыE, @Cl M346`SX!x !7daKh@,n7'\, "kv䮻;RFvsٝ$N/tQ\肻~`=<)E˻˻'o~UA 4rnXD9\$ ,z_㱌hn $*&CHbc2Ihz-~xO"6.;wn5ܞ*3ðU\^#EeY:),RRR4r^xJE_Æ +s]Ka""R,""`(XDDD,""`EDD,""`EDD,""`QEDD,""" 93òʹә26Nӛs-7ry%'`F׷i:#Y~ FQK䥿'<@S*$#KrzhnkuU=.nVM{V _x̼ 6oc49wlaagM^=Fg=߯Ԃcfb9,v: S&Ph+ewS87aD\YՉaXB}v̸J4lUT)TXcK[BCIՇV[nU. Dc`^ @{!| !7daKh@,ķ]G9ٶ9.|[bJ)+1hT> (2|(ƌy)[1绸146R~[̎`Q}d~Ÿ "f0}v"պ2߭ :Pq -kq0,w{hhƎ}{dx nҗACcx,:>=Ζ->oYrU,"/ ;3W)o14;؛ڑ1Fm4cVg_KcoswobP"gL@ Bvu$DLoC?}͸ܾ[+Ѫ{_l7[csV/{ 0E2= ވTR#S,RHbUӽ $(א{]D|Ny}AIr&70+Lxy -ztj*H9ζWykcHF.)WЧ{&o}0"h7;hy_--͛$4F 0Y&ץc7W߭S[_1bZ}p&!NMv!<< uS["r"YYYs:2BX -LaS)8+}*̴"Do7>x:viF~]rWгDFF`َy~6lXZ )+gҀr+?$XZo^כOiK""rU,@f͚'>_`*U @Vx1uR T *Mƻ?`OO9\t^DXib ^{-&L{!,<`:pQ\@R~8n&^?0-["?5[L""r(\fYnx^k/_Njj`"+۷ӻwoۇǎ}ǖDD0 ?~t).]*[rU߿?Ӈ\LIzi*UD͚5 +~,""m۶q]Dj+#%`Y8]q\%;b  -LZJ\{Up_xWɡ_~lٴ 6Oy?  DKjV*.C׿Ett4/ի,""r|ati+u7vUbo[*ӻDD8N:b3M쇮Ԫ]Vѭǵ\T&ǩoED3M"4~XK_Dz8vS"r>%w$wt|?g;̽'ߏgȓwLjCg_Q jy?.t=0 JbSDYwIDAT`L"7 N'Z a6t#C(e`g8ӏ{SVT9/TMAeY|gesٲL|6; G D&{oZAA| s pm%uq’K,ttܱ`93g]^v,"rf^բߠӟ0`^>Wy{XZ]9 Qǽa*T'+:#//˲o9W]J*q ȹ—SD^w xY&1iimU93YZ<ցv&$e|͢>,,2qʢ?]c1]q8qK>w_$7=N"LbU,"rf$4F 0Y&ץc7W߭Ɛ[ǥ֠ǘ\-)WЧ{&o}0"h⎚5 AғKvy}- l*ryȰN勍E.0YYY2l@o1dRJaFڰrYf|A19}X< Ysgѷ>> y<tnO/r9Æ +s]Ka"y4% g+ VEFu;"8sL˳߆hݹ>RF)XDcfBsn߾>47j:v*uw-ܧ3[,7k>Ζf:5Ly0 0"!Fv:6 'պf-z c*Z )~X"""c7iSگDDT)XDDD""" Q(XDDD""" (XDDD""" Ʋ,ܟya|8sP(wTƆ|mo|_69׍EU2x+\c! )ͳ9}oR F%Y~';v07;A[lX^0MahR9ʴZΎ{3`09 (tk?/&k*`8i^+ GbE":Tי-ވE""'dwv 1 (t]>{&x- 9UF(M7;K iHD""H|Rn[}-r3̿C`i(vtBD 9ƽZ 9PQ[DHeeeB^ݧI?nY=u-HREDD,""`QEDD,""" QEDD,""" QEDDD""" Q(XDDtkD ˲ o6soK 8i6'a;9SޟotF3ʹә26Nӛs-7ry%'`qsﰛI͜q}x0YW8&moM}BZfϘưKv ,+?"icⶔTH|DTe\F>Y?Oe $6U2x+LU^_U=W#3/_['q?MbJoP0Ř|*m:&;ys<)U$^ 3_4&JW~"/EL$ryT\6)MncPU7Xo7S)s#ȣY\VoFZ_Ȇmպ~]G9ٶ9.|/mY'RvАn}nyIp"_h;i_)b*Ӥm`l-&|ܐ-$s8ms=4H^}Mh_@FQ{yfz*uR1|kh;g$?opwJֽЉ.:B{Y:^u9779IcP-G?vlֹﺊjN/|7X;{L0tgo$<;CKbNv2az5nAFd Ze+Jd qq>ٶX=<3Q~9L>3w3 a;M2hs ]Sgwds̯7uzc^ O\ -'3ʇaQ )ь NpJ^61ҦE!yz7!儧f1&Ud(s4NGKኁcyC&~cL;b}b|(ƌy)[:k9;.̀A3_,dg@DG\->jӺ-Т"GOrhTŅa/_r: <)./{=A0 lL?pYYBh]فThގ9߲ݚyUXYNM߶=O56 ;iR~o"e64pT岋c1Hl|9 _,`m^Co?"i~M'%1_5Osž6&a7 ^+*QtT,ewſ(Ɏa$p'cȶ[i^!HlԖJ3>fuvt:p C^H""ũZ“Կ,_6~c]0؝Z2lCc8YlOm/fTi#2}cm8)c߽e[ci K]i?%k9[pvk<‰r>4uՕU4,ǭQpb| DLZV~FiO~io9n6㸴U +q4r刋f0(<#[/~ux1N@8Gӑw '?~ ;rG\I+Ip,A\]O<șU-,{W㫭Ԭ^rf} olHfyK\z2fv s8e`iLN{<܉'htgɼ 8 zT$e`ݼ^y}u)q~ӤQI3o;;o]ߙ8mLFyl@B7 7_?s0l!/@1ӄy,~v [pQYXDΠ!z{89<ʍ/Z$:2K]wP5 _5SOL$`DѶ=ęu}b#`,'ɵо*) }buع+wTcLgQbV3'\3ԿD^L=t]kz,$;4NGka;ޏ}v/==X QFf0~ݞr%ݔńiˆG?oO,˲r),RRRΝŵ|Ћ"z2.#2fRM±=  շ|=G.ox8XlșZwIlRƠn16|g-/ϊ;ٱˠnI0u Ԍ G9ٶ9.|/!]Q6?;MgK[BCqodw+ ]=H$Sk,"'THW&2燕lapF0k9;.̀A3_,dgL'I_ y˳tl6-nC/0z̋o M2m︎ʮG*rJuIp\痼3 eN6|/<0>2|ENZQ8+П^"i~~]ǺqYh]فA8#%c1ܖnT3jrJ_-HKxxxd_};˗ƥ0yX%RFAGnyԁDjUgFB1슐H/Ȃ&=6b.A;`}& M&mP:zLf6b FH2,/"ŮڸѦSXZ|tP0kM:!(-ήpDLJ~0 nt8P(l)ƣZfsnGD ] )EҤunaSȂ͕/}[OxEUs(HLp0 @U 4'&1`df@VpDnpwc6Y!D(6EB!4 ]iL`l?h6Mf]B0LA$"#qD$M0M!z~wvQv9?=qާM&Po)$#" 2 dYa @HPiLA4UAB\d (2%E7fضzávYL>D(ݮ5KOl}:n. a5:Gc LT\n*f0~UN7.xKKr/%,FF0d`K do W iƿ-xS2H< ه˼sv+ '>Oi&W 31[Z3um qߋcno|Axuƶnv~V"_Wn  m@RU2VyWC0B4ܺ~lp/Gj7/|?+\o.k!H@3:͹1 7Sڊjc4dmN/rոM߱B&-LƊMi LkvcZ%Xj:}Sy˺ߜ~B/O˾UcN*VT6zc-6#b(9 !0&iꯟZS.yg93+./mYj~}g}e@]sK D׍5&L::=ysMc;̩B"0JeA8hoF?"*k$闾f1Ĵ^H ,a @^%_x lJ$}@aHmr9 YQ9J(7[Y"N#h7URݎb2FbA3]RT.̀2V!)zS(g $hr 'K G0XE+D.wJXW" h.nZT_2ئ-ncP 'l@UYY? \ klmGRJ4PS`Oyy‚3;lBb љ1oxz˻Ucvs̶̜ʇ+/ ?).jHK>xUVH˛+'54Z$> 1&1tJ<).sԾ~/Ͽ}Əa ۜ9}z6H).v=Q::I i_^o=ebtt˺E[ak/{luU-o1y}?叽~QkcIỳ}hڸs;˽}Lv=ϿYߺ틪~ClW?6섖1%*]o~_F{(Eс)r[vl /"QVg̙Z)\1KnZ]zMcQ䉏J\g_mT5e:Α iCS4To) "@ whhQCs:4zTrFLʝ`F֌駍rK6 Ef=a7<!ISJWYu0+IvN)1i+dP?ʦ`gj#1j@=5_]5Y艍er$(oZ؇+R1,!_HaXʭ,XG40{.~- 'Oq[6?OiCr4(-o.. S&56&A=oP[StOkc}\l2{EQF_AxGjD[RR>h@ByY814 }*|zIa:w'eaB&u5DBBLa;Fm1_T#JBU 3bd`˶(?6y-*6s| lPTTRUc;7J qmy fm^]`r1 & [.sݻ1iK#+7$`mX\#M]&Bp3G1\0 05IRV.]=72:¯^+a=te LHj}~c\R~5>,_U~ӷ oX&DŽ=QP- oH pzuiчyoZZ-Oښ;)I¢k߁gf:R,xGD-m @jk3l@mEI׃&u] 7Z._~V?ր'Sid.|= Gd ڼA3J3ۀ8ɍF^ӟ}(橄^yUluIo.HMg~#jcȔS?v}FPv٧>ܳO:>C}3xw*TmW*?iӚJ7F^m@&\xڌ/n-xU`ɉU3:/{w`6V͵_0g֭X%COyq5euɬaߗo}f_/Y +V{i wβ4Gk[A|.lDI&T.mxK[# XƇ+/p78nVF" ʪ泏'Uy^$Ӏ)ߑsLdΞr^^['c T zZҫQ;SG/g2 #s'6 :{(r@cqKqu]\˜w_C{w'7+5yuLYX ^' cirݱ Y_^Мg?THwdOzaoSeĕDLߝg$% :=#s\Mjlv)rO5! o}D6~ sK>i 5g6~,E"~6IB K| c `tn0D*1 Yd.UT=9o:= 4UsC@ $fWI  jJ rPeEM !dE]@jW0B k $TeIp2߈!}'6!2ɮ LҮ{nJ]xȌ%YQuNL Dr0dn:HvE"]7 A$*3ٔpvapD4EB"K%U*%d0"IvE D{G KYVvF/?+ v80 DCfW7Glٳ#&Rb"EzE9@L,kdC_w7qdw |#Z%/&TicamsxU7!@&b]=9Cw S.c#F&dB["pD/P}vb<ܣʜ1*9]nJӖOj 0=Q ,2bDK k",<PsD%!X,qp:F>[5AU@ºf"-,DJp8;I~+aeJt h&9X?r].F_8Mqr`umP gqïy]x##wiD8L/8~K#;,!n,!bv 6-wp$ pc]^#};E$˼t[XXXXXߑJ V:?E_w=ŏe,,,,,,,gaaaaa CC]U% ]u?"k _֘e,,,,,,,gaaaaaa? YXXXXXX2~G퍻~>z:a<03햌G#DL _D<"aFΝ37-d&wD$!Dl[xsιmt""7o{{@ڳ̙{-2|iIFRz/}돿szOdmshaaaq9~~|TGbJJ^q@ +z/];锩%p4 ( U:3#,3~j\VN<V%{eמDtܓ4 ǴsLHfdːcJ[XXX|_:WM ڼqkA7=IH*+[Xo@$z 'd CmڅNL>H,3$.cZQT[r ퟚ`#@QaQU)ӯ(Iݮ#fkobsԛ=/AkwWZzݟSKo}7yd }Mř}ͽws oΏ.rSYP@\.;w"0" }Ӓyo-R% ɑ8d҉sΜbDb}\eB%x~e IW^97~Sϼ]X/r&ξwjC׿}37n]Ϯל;j6GGXͷ_-r6o|1ƥfz߿^ks6暋vѶy%8tebo:?{;K+ۂ&"d9935mG{eM O]|疛߮3{@V~ï6׶3yԓ9eJS2j=ûߴ+K>XYL.16~Y Ma'9CB2&˜?|Pʀ!Rzgg*ZROy`^3~qiЮhշ]21m@jQ3eyTU XtaJzbf'xzu^Mnx@R4U3T0YS5YQCOݫ+3F@?pIБ;qF5%E>>,m蘾ŕ5>dqCJ!vLQ5Mm_ίH6t`R %Mr҈dvnXrWl2IO]m!IT x[GbN6:x뺏_]Xu-%2QѪ#YSg9!A w4~4>W~QRlvp+:zLq3t%gQTi/+ɝ78 O?u,>^Ql?,XrWY7{BV= Vsx͔v?nՇݺ~10XZ2ww_7Q{硇mݦOiS.QYy%Րͭm$IIpicax! a\/zŏv1[W]h(3:o i/d dGߟZ- 褸?{UCϟ۰כmg84-Q+XgSmS/y@|=_Sdop5 x{ +}bmaaa]=?"!şp?'.\f͛ ZZk{wev'c(LR.3\dE^Z ;-Լ]_ )8G F8%*fn29$Қ N%kzG%\*iReI8=D~ =&앛Go['w8TeY _02AQ$Ҵ~S$2{y*6M%Hrd8ɲ(^sci!mĠ8Uר!jYZʏ\Rl*KLSA>*!b:NK;O[j=/T_q{CIQalfXTd՞Ag$b]!PϺ2Њ\V ":$Mg!JJ$o ŮF :LbStt˟lZQ߳v[—^JMid#hv @4j-߫rr17t^\Rۻ}e!˲:[ k9"a ^@WZէ  lY%@$d WWgmĬ)o5rPsM6݂>`jlj |R,Kq-aH^ܛ/}5 7dxOf75v\CF͜hL7MmH-E5J|r\3 u-кrGbWvHlO\#go䍟i܉}9۠jLH*?a5T+ۼRda3݅QGw5*6} ۓ F_v}^U_4[^ edupdLk:sC\̴ %bH('NeKٖP5bLA PgZ괋]Sϑů-zc> AdUUr{bZz~m[Yʿnyw<T\ׯm΄d&ⴁ4sǢy}HycU3w 'Oذ%kߺk@YQd\rR׶˵? g 6`f b3#rd"@;i  Ц^ud P]4/ܾ߬6$)9?so% :=%奤&;ByI_~w-GϘ꽍-̝:vV]a56LnP\:x-%!0%g1Ӓt5+Aӧ{Ж5~Pr<>fh^ 0m/rU "bSrFF"H>wU6@Hcđ0+(>?%vw-bN)xngϒ5>{eJq3gRl@|}FY5h3h؁H#ORZm&d~HLY% A"h"B4Og.v ]O]f<.t~?q|hθ5∍/kH YXXXXX9DAW#"ι5t-?񫪪,h V,Hc;J0E_ 18?f̘M6XkbA쌟k e:Qu˵vL4 /X_2o5Au|zГw]0fºd!{ԅHO؏\G{ mvsrr_d}IB@BQ%I`G@LhkG2Jѕ Wd uIa߇!&a [X+!dCG, P΢Drui( z:UG^ʥ8le! A}qBg3hi @t>Ȝ6%P?`60+#Yg+}5:+ȴ' gjֶ7,ED®9v,߂/I= 4da 0蚌wGAa NPO_݄u$;Pp)73Y{.+9"}_a#߽ CԶG-+6 N#OIGjm$ѰaN0p`)3ZKMuPѶqBXzá A>XDU|cE@ !8  Iu[_,$گ3$&3k[ITH{ M":AjOF#B5!:yOȄuOG";0b<,a8y=>JݧWu9]H|7a]w#=k_~(‘ԑXyCÞ2̟_?m0`)}KmH4B LVUEbH B,1"a&v"817!.Aݛ<="@I lWLW!>ʳcl*냑czs7 MSq$ PP )H@\L:ڣ ~{Hgj'&{T; zljekR G-rYm(eeЌ4UdFn∝MB5 &z/n<ۃKF=q< rtw!R~c)ŏ!眈#$'e?[gk^ڦ ysʗ<]A{̿plk~Sܬ:3N蒱M7>3J K\~ߡgZ|4dj]WcHo.h˜竆kd{?;:JɳG+^ݕ:he .|eeaZ- Gֽ_4;N1+g! !LFƒbf}J3<6Qf]pN @(*NW7o‘Nf%'>{gCQiJͻqd*,jm)l _FI)cއ_PĿW3FD@$=__s 2YWVbʾ(S\q8j7/yu^y)+_|ܛzhWMcO~9#kyƙA@D-*&8){yk g Ҩo^SOwƙ_5*UP۾ )Oߘ} LVdj3sSjVmǛJ*#~s9Gs=?B#Ս=n`XimpA ZZCͤ @3]sd 0ڣ: 뭅wkE隌;@BH;E uĝ0t:FOad!#Y0:=J j ,r; 롅?0olՑS9Zš:=DA_UcԤܴLIv~k!B5uLT8gJ.y夤u8g\ QUIQm8o$>YS? '2  7 91=3ބD@`9rIRo) #f[M_ȖvƙXWvŖF#;_Fš40!!+)ƥMHJ-B)!w( rn;7ݼIQG3p[HtOt`X밇d1X+N7Ԟ#`8D=uw#Y`x€HBXǩ,a]A"ɾb @롋 C ;u$l(ۅWB̈E38mo(-Y} gn\+DٯN5&_2^/\Qd"!8"fe7wmZ1,[!ػcUsߞ0P>҆I'dW|%d-L:~,)vw˴~OBzjz_SvS[ IpT`AR+7/Y 0џ΃mԹ@9&&|u&Ѭ +i1JN:K ]!gRh2C!h•I D $ڷ#o@D~Ѿ)7EME!"DT $QQ7a]AX80! +KQ]{= vaED WXOuTWGh8dQmԴYZA`|vNVZFV^lsU;q}զ+{a1ir2%em >= Us'28)HX3#ceeeGYa.inbx}l69վlu! h4蒬[G=VXva?/a.= nlE ,jO#l:!'#p]:QBn@TpXt=$:qAηvD~#Df":'>p"aTYI$D) C"~HaHGa {DW,*,<]oL8 EO; kOvđۿ(v롎tSXx~F?}. OuԿT~֓A3$0m]'>FYr^U.29!*YGc}cOfQKvݓ5a]:Q!yݒO ,눅E+l:&ZX(>Eԑ,84MHX/? )f=$  6W˕cݥ_0 ?I3Fn-Vgaaecnaaaaa? 9PCv&VׄaDйmFOtX9I oa3D>to 5kDZ(w}zgMKC>gbǶ/n|%{;.[Ch~_WWX3bl0_>O|U9$-g)_1ϟe/>9W' Wyz| o js1XW}lCiEױ>I}$ [G.],w^M}A%"%? 2 [p^d*?(۵1ɾv"W[{j_ڴsG96~VWA7m9]8k|nɎE%< Nݣy3GL>W˰O]3*Xx]|RʕI]j4Dm=w6UxN3!P^̻=@2Xu.AE|(jo¨D7:CƊ4]RҀj25.+>鸿 2~rSs(cc/Ŋ~͟=cmUF,~;F= <9!w}~ɽO3)Bmpj[Y\k}nm 9' O>{MHD-)0_.>j XWԜv";{f^ srFkDyy7O5(J8}ֈ<‡|X5mhybQm)0㭏FawN͆[{g_)o:m(̹zfWrB!#/AhO?[M(CN=ž"{*~_:ꘒ;KExWWzw sO>ٴJa#㶯xoOسWL9;!Uj?S-pa.8ٻ'3..ߔzg8@(6~;Xn[M\X3M{xE/^CudGSԸ8 .3as0dmܸ>[*}\h2F<"A_sӾwSPaGxeU-!t}QS\zR~"c *!#eؐ?yNz脘>!87e659)_&jΰ_/l%߮ϖ$Ye;UѤK/(jw9~٢'je5YvĘܼtۻkޠ-~K6$oqFh.S~7rȷEPك~QcVY%AR~ˢ$OvtSVN]ud^EwM!W^\ mlu>65NڼNY[:#"}f[e+zklDl*ur㞂:gul }_=]#3Ɔ2JpMB'XVZ-%́sT7۰(lyAQZk=dzQnܒ0NسWc/+]΁w$ϟ]=zqY|ﹽңD7l9~)CF~;of ,ٶZ𿮉l#2W}r TzKV IDAT9NzylXQқ!?aԶyϳ{]Yղ\$w5I($@ $R~ RiLjBǀml,-XOww{Iw%w^s;3ϴ:?kܥ'\+m}rڝ%5QX8,G2 S՗+KҠ^?’[y{e9›g-nGJ=6);׿Rwtn2"B@ PMM~M?+k8Xw~{T.v|e揦\tyeYlt֬~9+[w]pd\~Ye"5,>pYl}A*{:Yz- Μȷ].Wi|4}ya sh-)6[rM/gfLH}t[fͭϼ'DXyre $[FE)~qR2.Ѓbo>yٖg39o}õnKY梔q_ n }d"U~7R_}XpZ,Πy' 9{BZ=eKH~WkU(m͑grssX@ vThLeMUUUeeȅ161BGy5q@ԏ^FS b#wz1>h0 `u*g0̑U&XbzAOIz+͉Ef mSSʑ/1 $-Ʋ=2+ƻ1~nsN1 3Ȳv7dW JERGy/Etlf,!c+/F>hFL7~wA'uM,]aosH ov/8}9HqJZTywvv^ {\K]_[u>=yw .2!wW ~+Rg7{w$ Iu SNsxlu_Nu+k}qo_y?UFdYvo#;ߵV^ZtUPؑf/ɟo76l]).3]w nz&h@Ή?]6!Q2ZF,20LWa>Kwk (QZ$ZwBJ!MHUQZ:"Ks=`ow}NIw]2oAD4OZ@-j/]z>@ a7"5dwOy9$K@;00}q>LvaJFfv*,-}G\ZbﳷwUx-|%VW;s'/[vYݣ}S!Iгɛn{ho uƬR (=(@hXzRx+c&m;nB~{/_$zuAW\|T(e_݃ :9yʑa=tZހd7U]6% Hݲr\ۛ6:+ok[JsTkW4hOrioz4뉚/̠;EBdNy~_ڳo`+u5oJAȞ|k/\ܻ{y&Xf9y?xy\tjޘ;)87?쇳1;-}}]3.-ꨯsm=b/]z?ThЂt7ȦʠGk ( /|K/;F΋:?w?S~;o?Dy~w/33|ak3{`vHK}򒓖?ds,?lԟ]5%)$2r[I~A㫯Tk6}/׷-/?+.( W~tJ*JTULzqfו@`?Wf_9=m)SO5 PEEhNr8/~{I {V}9rRV4$.޽IYglhnHO?wu{wڃ>p 5kgJ_[ܧIw ̕g,yI^tMXW /^w_vY٧fJy.Y-7pJq~tӿrG*ܿ~wIjw@~w^xުoMIg_{WlX xֲ˯:߹ bV}MyO+HoжlևO›Wyd83*\y,.Y >apXy9yP hхIM[vP|iUjsഢq(;>wW3sR{eR9 ܳ7!+ TP'Ol[A?}G W,}"y'$wHEKCPy_?;h!"-c<*_6+ =]Z_꠬n ҏ~-NCצUW5b{p/ڇOl\~W<+~Q1;~Fsef}{BlߡL*\֙NwmzOWVj2/d[Ϯ{gsaLThT|^ysK9v}Z4/; +GmYu[J'8Ieoke֝I}mwZ>[wOrl_ٿlQ̾j.' "pذPWHux!|ȻIҶ}nw_8y_rM^41MA4$qo5t[Q-:1 ^'?mAkF/K`Oo$ʙ|~-h=Tp\py.񅂂@}jfr.cͯ?s|> k~k>myEI++< W(i3k}5kYuj'}G/dUIs5Ei+Sԁo bI)=Abn r*|E; -n+Iqco_Ч3r$w9Gzar#_lo=OHni/V1 B4VcH`ɋ/&'B^0x %Lr?P%,>eF7##QG I΄ "Oሙfe*",lIFFfH)D-p'F~##o$_A _AX IdB; gD^AhE h60cd9nFil „BM% %,Za.? ̎Q Ӄ8=1Br:I ?miNYʡ!$45b-=-*C74S!(*@pK2@$o5[.L aBG~̐x*?y}$qaG\E@>I T" ![l +&XCm>n/M HVvs:v h$P }/0fHZ?0;A|apL 3B#O ai7GfX({yNGs<>6-B">1iqQ`1~Bb`XaH"\00_O|T†>qĘƠ(ULP(X>"91@$;, ]A!iT!DOkS {y+s~ȵc_D $DYrӰ>yy !`Y\+EYP`YTfGa!#'Ǎ0M&,ly #E*,\ 92dBE IŮBW$HQAp\*t V We;JRJ|ԣ""0̠ DF%DugZHz"ihHh"_ @3walI"LjS/  eH!HY0"hk t3j(aFz%e'$Mؐ* 5 2XC0QC#F%l;aq}GWS~L{T mkGmޜ‚bRs~mf_(Ah3}^ GH!T^ On(n }DT#fd0~DOV3@<^7hDat aGta[fY!„aa2(sBDR/ øFx~!faB;Uk$ 6y|}$yU}Q"/m-{B$v%9+͖jP}ng]=l/Jjs_ΰeT*z}#DI9Yd8Mn{ВQ{%,252E f=HF( _a`(l'G6()KGF-l>^:y#eFp^A8?E.f,6׭<(RTرUgah~LQ%\IaObdhAxd)Npmi4Xܭu" 2Btzy8a*C6ja^9Eg,ףL,,R !̸K8(JGy̌[bPC׷=,Ls9VXk 40951R$hZ2=LfǑOI-,2YaHOf8FƢ(& OQBIޛ(S#2#⼊ʕ0/RrLS ÌUUU  SD m0 Oaa81 0qy#p7CL#W|D ^s̱%A;D$[X%@̛> +"oP0c"^[[V3;Q^☙awj{{[yr>Œ{ŕ'B_NՓ9qͽPJϙ!<}m~wjvgkwSHKZbGv e亂œ|_/,rm }}AHJ؋_;(Jhvi<{khdۇZPl^Jm#~uoα}^~w Pg[g/U 6t4kYY6v*˴4KW,6sB==U9ʋSWh#r-#|r,=ͯ6ؾ|NŬYj_;-ko~ZyfvM* Q>-AwsӷWNKqIEENaݩ_).+Ywhj4{UMefڷ9eZ{9|80e >:\1tv~%[ioƗ.V<΅)R2ȶwZyz[K$yw{όm3/3={}P)kMu8iQ Nmoii)**$uHU:߲g4{_=2j|KOyڧtv_ӿ˧|t]{>;JʧtDxeW^ZT )& tJ;VqFwN{eQվ*2 OB-^\@$Că;/ҙ*w5~5]{IžbZ~k}}Jz.mz&@=; 䴜E%9EE\-^XX T]ӼӢY|c6!J=tEKf߰$n/e8| >њ8D 2|ۻRV>eQyqӽׯ^<πaCdף!A[j <&CVUpTxI@EPݐaS7%H)pfv/wU  ިj+-x 1z(ɤxBdPEl(A7Z=c8\9%\v һc?65<;vCgc,d J]0OS7lh,X:޸#aۜ^`Z~K{5_teeOS/9b @G9Eo9NY9[\آ@ܞ"|BjVMܷ;gKf3DZz͚' eDyƼ6P"˯~tv;I0-0skv?)O=o4~Lх IDATH\á5 |x+p7 vޫL{ܾ_Uo wlX]P/9CAOƽ5~E?2Lt lYC\Ha6FB$i/[le""0Clsx]<+-$4}IHQdJHGhmdfȞ^gNoWUUUYYOIҞ!@O6EN<קOPfݻ8™WJg3c:<MQtwSl{CI@vF<?zNYSbNe7I2!Lh'3pټI6@@92n=$ yyt+$%)MgMLc\Ŀ9%XAJ3' IB I?JaQ&&J.}9V1.r&3 0E=xBa9z~ga Ì=,sIp89'@(0jO~ a &0 |"Fnq1 3=?&z~===<0̸-eee gKw;y'0C)'ID -ȴ]<?0ʌѸf]mC!)BF[ L˾Q ͐SлI(cM†~+Ybf쨄0 ;|$1a<$kCA m[ D"E$ A7%#zAۀM5v|if@`>L3i!a.i>@ 3qdఅAa1 aa3CHc3[0/, c ď!aG# #|d\Ww$kO KJ% O~H?k4~ `1:F Φ ͡DHJ]#$ ̸aF$ CH%0Ӫ(00m܅ # Iĉ># |L?H gZI=mAv M]Q(%1(EQTOߣV{ eBx!5b DG4Zm6Lm\hQau=ӱ,01E `f2Q`PaX@$Z'T؈EQ2Lr!EU@JMsރ~F5Ě&3K ~I"f8d+EKXaÙ0Xudx,l&@pc1i|B'=jEa酮>n Sh蟑صw.vڥ6Dgj~LkWAJ 4hZE2xɓy&$`n&b-ⲱ8<'MD'zCX8 Œ ՄEۉ {nF0Eq|dP$lgd % AU J?kAV -**H%!dIP!{_V%eQܸ9iΙSr3: D(BB@h3HH}A4" _7pڂY|aMKj (aE(a9fQO<"PH lSja6(Ċb aEf KG(aaCa0z#x[3&!@aMWr,}}9ABP3+s:fg2'ގuԡPGoP*4hE9 L LLxQ7`TCE[D˼&@X#a?X' n'*l;!WAh^w1jaQ ;8Za'#pHΫQ"{6m-(B ;(HA,DJ Bx!@N [/f4~%F4 m-^ $}-zh\ 3OE ! bbt1* 'GFp^pAF s]$YAUUJGjd_Uq/F9iv|wuF8aj"0܅0+5> ITG(,2'c{[$ģLR?m"Ĉ& \l6&7aa llJrayϣ(lIҞ**Q}c}ݘA}3Ӗ%`F2mY`ID9 m=2$,xŒi=p_(Jdk%dF)DŽ \ 3I +Ůl44m7lЦ4<53t Z>RF4KZaÎr^ 1<a1xh|7NQ2Ž$0}7qE$] *ܥsa񠪪3x?FEM 0qa0 7/3'tJ9zE7]nB@T{3:BFc@"/ٝ{~wo]6bM{6Jn ^3K4#)?,9wgd*I2"b?0_η{s91v-"<[o/Ks-%"Dh^n[枛qϧ)@$ѻ0β3VӜ[]?B*/ xkK/m+5ӊ-n/YVȮ(0!H-;ai4Eи=Թy[?eEEx>gX GkʣLqO,@uT6r_?e oc/;y_]?5WwT,81яbӧ;^jr2s'{VV j 3Qets~􌴎g߫~S ~oiAU.//(Pyշ> Bw<)xEN'vpg|kvg>YUUuكw~ʖ&ɫ? MbMi"Uyyޢk<&H|K"G2/á. !Еb$~U?PKN]zVqҬe |y3Ξo}6иo۝W;*?{?s|%=eS*_r pRaL;Fz䬙^k[{IƁ8 DHbiTEBxݵ}^1)`zk ;wB^!ZS̩i_&?~Ѳ_-bYPRB9p,׫Jך%SU%gN^!*MM8 wwnjB` /sl<97_{ڝZ}Nq`S- mțwei^RyȓaFݵy=;}ΚCjLwO_~Et@WPePUU-ku1L|y I{Ú|f:uZ7[$w"5qo_rYv"Y2!@@ ʲ>+Rl)Se;|q؛a&燀_?䩥VoGx>TԆNₜ`#;]Rm-?/9Цx? ݜbKKO{wgAzUy/,=-wiKwW}Y./ogdi;X?.8 \wmM j ,9Ҭ{~)pf]qt7P]Z_R+z79BErj_~';'ә&fξaRruy&99ϯ)77phE v/RIŴOT߹^uon~덦k]:Ym/Yiar hj{'2!O5 {ʗZ. F'qiw3Nu6q㜿ƃ3oT|9(=*++3I΢˝f$ޮ~(B9k.[x$񿧞Y0?5{rzޔ'y5S eɉLsc00Csc\Ŀ9?`,`j9J.}gdda8v(0 L$jrN1 3oC/g``ayyyL?~'a &z~ 0 C9084Y$ ÌW\,XL0^rjT(f )uwG{_՝Dga,lbD r^WL?"1cb|@`|"P͌s"b ~e]D厏@xŒ;F}pEgk<$gC !H PU Hij $mjGf@ iA" ;vuwð02y`ZJXfKnc !`E2@gdDOOՂQ'z}m!a[O¾e>ʙ.L:%/m+0-GTveW^4-G5Cƪz}CRz ICh+qG2ӫ"4d_cL( G4Wc+F-,Y$FHLLdF< ؤ2c3i|*Zy*O)r͟inm>$HeGC_ff%RU}T%!r S&HzIe!wSP+L)qa#E$|B{}jcѭJ$"GT=,|v J-l恠fj2DOBfsMf# 8|aFy]F u~R%xԓIΞ !T@ awNNwVH")H6i"BX&g9<^KzЮdWW {k:f e6{|BMFi$"2HᚰW!8 FE965Ơ'mr̼T0<0n@XP3f"0$ Ą8€LCמ + f<#G>q2HI(fQ=E1KG6jQ~L{*TDB($rҵB@ YIO ULI?#.֮ЀhJ+Z4h!ww_sFiַP0@aH4@%4HZPpa4c~1Ӧ" T1뢹֙EB{HŒwLa40m,  fqAla#=qS0 ģQ†flt˜OS6(( L>:BHLUyܓ9Jᥭ}!m9E!-VD"R(DE@U\/I烆~U$#=ҥ6?JYҒWd @%O!"EdZځۙ}xЌ1͢$sMI 6Q^+Lk9'( L"(1a #7{#aC ͝L8M 3{OXb& {~BvGF2" UdBH@gsM;HY@}M5JW,>"T@FUodxֈ5̈́i#C>&'6OyLfd 2nxaC0q0(aa4RƊ;Hƚf d!Pa= O1I@Bhj}KBlPuȍԀgϨ !z]DOSU7Љb-n8èt0 0myv'!a\%_KPEh GAb<|ļ3o1I ]ȫBNi)n&6ftG #47G-La0),, 7&F0 3=8&\*8\ MCFޟ+ODFC>͂ۘ᜗y+a&)"hX9s%I'͞iw888Gk+a.1 0 ?a9ņdUI hh`sW 535݆-b#wc"%-%})y[]9vmAS\v(^F W eKvAiR56)s\z}znM~[[o_VPqɷO_nJ D ookuso sڽzmDuUp˾6z&_[jZ;Z.=?@p77ltݷdaןdYӞ14M fNnjKfƷ<+lMo}Gj{7}cm=)ٗ]r21`upZ3OWB!i|ϞikZ޻[RU 詭ӛiILq#`oo{]v7RCJ׀b`}nsg}+ қ{)+?㗔}ۻ_҂Cz==;7[>Y<߹tVOdcG2W=3gj,JԸ];†v+! ظ//.h=$5U=/=m-[לwot>oF*f@oh?U7i0𶹧cuw 2\+\vw!")meOZ(o ;%ED|swUOG# *: ( ,* ŒԀrg`Hr\tޒ\8e{mOHu; Ek6S~t^^s_I?f嗲[9v{~$&M7u']t66#'-Ա' VKgLγUf;_>90M]尗vn7 Z@K'9))6Kf7cOb>ēars֬Y*'%%efLgQq=P-53J`vCE@!r} Z:Wt?+wimiv- %?dWɑ pY)uWyՏ(gexB Bgoiv+֏ܲ !h31CI:VuIZ=i'}Fr+~z^S\9_`^&/ #/ŶpѧgOYQ\nqYVdoeeNʵX8+e9jl99ϯ)77pE:XsfBRNaފJ_u@;:6n難x*q9/Zg:9ب<Ŵ rԸNy@CG|͹`~L/qȅ}v]/|b0Hn_}/}kNX#Iqwm>q#qiK n5SJScc$iKQo3~DB O+(||xus\UJDY,YΔTdYcs/ UT"٭+b}=~Q!a# Y)Aqp+9fͽ͑9>ԇ:ǑܱoJ#KOF Dw̿+0'1GqE7aE !sao}K>\@){#*g0Ư3Iag2 0a0 pca~ 0 aa81 0 ?a0 0a0 Ìi/o IENDB`PKX^Hztt/django-cms-release-2.4.x/_images/cmsapphook.pngPNG  IHDR4esRGBbKGD pHYs  tIME06H] IDATxe`׽6Y튙 [If!$vۤ)M4Mަ44xu81 2H%Y4Y2ЮVs󟑳Ϟ {t~F@Q@"$Rذa)܀8JD23W])IMN87i-DkmS/{T/O1o _r*Gl~^OZyN"YDC\$"vdwCpc]! K}uw L! SlտGwgs߽%F4ƥg+ '4ۯt np"55(?9d:>}k*]DDęӅJRsfaSZNv9K8pyhtpHqG%H)Hs.asAX12/ޙ`r"[Cƞxwn\5Vݥ /̏LiE3Xc-3¸!:~e3őF{,&"bJ׼1ZFĭݲ2v(U _)il#""G;7uztyg~r|uعs.%-i1{lax9't]djnU䕙|Q ZZ#>;L1o>;T;eaGLn5]\QyJ,{^dڤi+;~TuIE&6 BUSm5<=N!Jݬ jDtk(n7}CƂn|-f}3$*Y+J$I| dʂu9dž9/?~?eYZM 3} Qesʶg3 +?j믒]Gfde}~5s÷Xyl yOH;>:/ 0˸ԟruZtv}ܝÄ1'2.a?@Dgs=X׵vFwIxx7 o0N(;M֌8np͉ g6+z<5QqR٩{Zw!j°sv5h(:Ժ*uY*4}JѮM t#6[P@67LAQ W۝SMX`jOV$'w/rR} #f|ݲnI1%'i m{eiS3o["& 5j?n %9m9UT㖥NA-h@&ιϟ'>,S-eMM=~y]ъg߬8#.8Im:ɻ=FW_Kl9qgDLhCi:ɭ٪R!mEǍT SzM^Uwr:L7m/D*暲Ɛ W~1O)Q &?ѻD\緪5/lwkvz[a/Y"8$FOyFvϜN/yG/}j6އQY2?4>TN9MyA>6e3Ǩ-znԾջGbD'w!M^}ӳv"Mҟjߪ0G"";A3\z:ɕ̩KqYߚ!:͛ם3dT̪w΋}kuu,IGRG=+E.%rVɟm8p?EG4=UHmlc2px3-rɩ>)1}n-t8H jc>@'$wj?li2J/8FZ[wfFʶTNQޙ((N֖৮r*WOr}oKSUu}3oyKd2Ijs>hiPT+KHkV6}܆GSv+ݑ't7Z-4j]|:3k[:+?icoV[?k銋xpPa:l-ߓo"VD~zNٿ7.7ܱ:|Dž^" %)Hl?u Q^yhZj]͙,n޺go FD2d-BД|cZj~~TNѳ־p?U~[_}k$OcTm\"Q)3fI,{^}7~_IT(4ɃTQi%kp$Z}h!pӫw4iд?.%"ַ􃟼ovs. m{V7׆[zFE54]r>pktW¡aJ4!} ^8T9̹d~Ĭm|r>H$"LSm޵. &IrF$J1:zEW<J%fywŜBa;- wdDKg&N  J}S ŜDnh_e6;/V>KlfZqjWuA=2t=5w\n%#y8ol5[b*T'M"t?&'"b:ru蠸_U$"\]vڸYDyGOa"i9Hjj4:9DM&d@,:8ݠTuhC tahU>#]YO%y6ʂp!>uRݞ!?}|Pan}c 6"rHDRwK,6PN3DTwxq iS ~qz""AGp@#s.1KDdվpuN6Otham 'jL{U0C&J_+>'"(O)Կ֎KlDyg oϞsBhUlF$7msQՙ HL1<1:u'Egf߽ٱ3?CŀgYT WQ[=#MWy&ٽv{^sZ82&WC[ҼlHw^6̲̽pZt~5_yRqFVi励%T|^GIPbu}UF"?gBܝ@d {ÒQGճρ*]qϛ*;yF'?x!dn%+?"Ws[c[OiDRS0;jtDDRC}I  z=gn) #Z&( P2s]kmP`f5:L5-z8'1eN8 XZa(2rՌIZOh.no" ʌZhaԄdHIO vgs_7yV "&23kn +(T2K[dL9͘C'֋Db JO.K҈D𠀡/&(A)k;;Toz8'넡9Ju-X^m8֨`a`ݹ+6h`#1<}r288%SҵRW:[p6(}PwÖh@a)ٍM/N+8Ϩ\ֵFY;xvc0"_0{%$(hv =_?ˣ'[҅ttHXmw""!~RY=%ͰMLD&p_u}6g2# .q(9+Q軺|ppnNDJU6+%wGӯ7(*uR[޶gU=qOrGg7|t .^R;~A˯7:lBF𸶚/RgyBDdzz}ԷL{-ibD;S6|hdqv \/kgd6wvj=/ޣY-卵67hƖA-~bm4S ͝ĉI "2sW3n".kV8j%GiAoHM"Zs䣏-_pr!v=+߼{ufԃB$5]þ5:׾|J4`my U]˞#Mu{#Kɘ xq(UQݯ?b4/D Ip9տs۳ϼoIO\\&o-Uo)YUɖ$h-ސ$==_Տ{IǺfk4'Z( ʶ:UΞ ٵď?9TtaUNn峯zD2~$6*v|sL}D֤IL ta=ѕV&eoy=-I|@q0w Zs3**UkeR8gOMPoCa+l1MᘢINő*)9IWnCv%F>JG:Ԋ]<d]H"i>JɨKg5U^ߨ]׹FbK%oT-4L3?AdΟnܣfcdV_2ӊ)NVy <ɜg%H*"r _>o%"rw^\ۃ+D(?]%~6]dj[R\sc?Zݾljr&W*oo:xk|1헢Dï=U6szG_+?Ӈ*~Ǘ=Iif@7kWAIIrb8N.p 5l$BV!ƾyi9\dSkr{kBdHRTuxЬ}I] ))C?\tsz$T,f@䲈'}6S_x 1,%5|uV/cS{N+/[)  )) \9GZ۰aêUuww.p]1d( p `nD"3jA!)qo>c|wZro=AE%7?<\Nb˧OpȝL5iָ&۔Gh8ѮJR*IbӒÍkl>ji,ۻ\ܪq0`OH 0"&= 1&p])۞;{_H05vX]D*LT-gֺRSw Xn@"&߶&K/8NmHYĊq> y c=$R#"^;WWH$O(JWvw85sWDo+5vpߕ&/ Fe$LXVfwm͘ e5=2G׎J2Fuyӄ&)\g۽ܾ%Q@؃&h1>*eh_[e3'OsmJwv%#a Cd:X~Z+WϚ tιdo=wpI$0N> QJn΍ $#YED2M{`@֚{?.4):ä_,X O?^ތSXtͺ;HU.0WgK OEdNz)[c%isjm]:}z!_Gl3%r;]Ҡm;-:ToP%0rgk^;9s!'HD ϘP#,N /?d}3lkҪqj"*'AߵE̹'9{9I=+D!# ԚH;/G%<SΈ(D SlL55wZID-$ژ *2۽{$qEs&o(=s)#6pR!T$^YpQ3mŤ2; >>o29Lm*]K--Sr(b|TAMSt#1^@J7k^UQ훚dPDOng*F$z(":O8'2"8^=(GAs"ι<$ᇏDFElׅKJ>Қe؟~'jIѻ#"Ds{WȿȬqjf-?irΉbjvۡ߾.Ss̉R!8^Cc= k=ӆm [Ě 4|dw[HF}1;*BHP$7`??/q62%--N'ׂ"(掘o ^ai9ōGeڔ4mr+-|VDA˭U 셹FӆԜ O qi A٤](c:&ʂUTVd.ֻaeWF?:jh5)D/汾D 1]f;>%FX&RJZ_mLF]+)/ }qyQ=sLao/wH(*c%>h=:*q4>@A&""utJnR2FcLy]cf2,/Ta;d͕Wk$_}wN"RGLY4)PƸ (}J81`_2L$Ta<_orHB`$z6'H}ظqU(]k.r9AkP!Uc#V{bX$R@"dNB$Ҭ,TA]1HH 5 IDATHHH!C Rqۋ:;;iG&tz1v7ώ[\|J"5r=ZXXggggggҲe2M=kp\NĉSLYtHTj.-ر o;vp\̌.I}~hٰaðsg_+q2HEEEƍ3 ~/mFB{Δ|`d5ufw]mOzYLkO4I3f_x}[ϟ>}zԩ!!!W8KX#uw'~#8JD.SSٙ=퍜. +߉d*?uha0} > S&D7K4q)2""?1NGJrFu#*<%*yQ(r YNNΕ|F֒!㧥i\ni;6nq$]j+Qh$A^\펜dބP@lLZ6ŏow6|\`K9oZJV?x.\ʰZ{pS*ݣƺ{o䜑dWWW'I(>#BǔɁGB-7i'NNki/4+67=\ˬ->Ҕp׽ݟ6`kR'}+f?)4cs"ri!s3B6>_4VtW~w]WL_8R[>SwV73='[4Sӂ5,Iu@U |8ĞΈ)f`ݛvveVOH8M +h/-K'/uFRwyQؔ-xj=\a䪞'n-sGe/[{+STaaj"utocu;RYԡӬ#"Rp&rӲ&mt-{@|.U@:~t6~uٗj5kּ}+(<+3E`D"0lk>_ŪqgcU=8 Wp_>sg' xkmowq٫WVwdt;,dC-*{x@Y=l^qzɁwj3=^TQԒ=+&%ȒK+L$R>!TFq V0T9#..5X4b"Xq$aY$"wsAiKĚ,W"w_:BWW@1p<0?Ynrn67o|+:D-w5d=8sټ$yYzfZカEG?>z%uwmYj?72yw~O̓.X$MיÃ޹1w=1/b#.Jtcmd=}i?[|fn\ݯ/NT|篛Κ'6l`j-]qzޓ}7OX>-HvӬrΉ'w)(³WΏU zth)*uĤEssѶ]3$ci^K_8ݑ ׮fV'1sUaFpQTfZk-D};^rk>IHN˜z =\޾$X+GZf~>kJz(=S}Xd]+3폮!# sϽy9w8Ѵ`eEK ";q_eDd:{DhY$^qJrq c8#_`;w ׮OP]|cWiRT`NP 1}/w># >Zf@cP/]3QՖo߹61]EӢ9,[=^'H?+[&W ƒۘ xɄz&-&.\0 l3fHsN U0\2oZ(slf1caVyF$ M4lFB,5vn\5a$Šq}[ 4k2ea<~1j4Z9:hqbɼ5K&wە} ќwp^Ӝ$+]s#VA 1xqIt>J۾U{8p']ڢeY!*x>?<'_>}O=/c/JUv5|=Y &N%JrzAc5>9.0E/TS{ s-;nqz"ߑg~f>qAr%җ5M.ce˓$Mf9UWx% ժvW?ٙ5)笝oZOm>ju"iwt1rn=>hLw7XmYkޯn>c$EEqhgHTOMn3]35@3C{ɪRnMТ{fHrmKT^K6]{|S5nyxi`>;l_C+|׌!S=Pt۽+Y7ݞ}#_% eM> x>~j[q\S:Š$k )1pMWy+IElA 6 c~X$uzSDDd>#DDT{rǦ^j?=Q{сEW<aq:2+h####AyXKV;`I=UqdK񒳦gDƣ_9:`OGӔZ!"bzwߟupݨ ^$8ɏǎsMJJJTTT_%m"%yx]ۛ-?W'yn˅"GpGnPi<%$̟ ڒgʉڲ0ȇJލFȩQg^10Osա!:m/akP;t8%.zXMLS|z}r|)ZnjY!JF䟐-vkC53J#P2ΉO:]cٻf7I DLgPڻ/}|D"7vV;m)gD䶹Clf-MCi (Qo?+eȌ1RtcBœĸpKi;DOxLwyO"e Cxbh_C+duO8F9K/'"}B_5qkjinmj " L<qd;-n~Z;9;RI\q 2{>-hcl+[[ gGxqiȢ렟GƬ3Wl{ aJ/z~$sL3w͂l9-L- o< ﰣ8M1pkjj*NlɍXv@׀ 0h!xAj߃!aΚQ2[a(]cL^{&]?o1i$^/U_,gϞm0+y)1u}=5n"r5m*.EC-o_p9 ?>$"ۛ/_}I(۳l Y7Ioƃ_5; #M_?z`M YS2k9NAuי\dPSGsb)&$+nEef}B売7CZ; ErX4nJ!"qsmIK7ZݕSBJ =[+rGW]0Bp:N5]0dL)0# ܞ4=]#SCԭwȓ֫FRk +U Π`j/+RuXLQhwh :Y cjR?ꪻ #baQ3!}L$"n2+}ef r<88xԩQQQqCER###CCCrusFd&,,,99922rJ^DJD=?Ì9]X^iN0e,Ig>c{8Q-\٦7QL xO7ЅV)SfZU>o'"{}7{>s\Y}H IL4uVWFњzEw޻cQm<,%KGeڶG-W <6'm@*`;tsN{Ծ3hx NF\ԧ͏Tz{ʬƜdžkhu,#hesbFN# 2$0wYvO"%0yN[*BiZOm^1;bLzB'v8*t3܀|E]9¹mN5};DD)KW|ߨqzv?$nO~-s^ᐌ[>w`zU0 sΉEQ WG/,!Gwsw qz|lذaժUWY 3gg$EU{?x3#_q*B3-n~Y%rު@}ebS.S%̾-F4o 4g F"%"dE烞'Q[|=KL.&=(0s7dz17uf%vwҗc2Cƪ2 O:~<&2T2u[AEmED$hcR&ϺmIvq|iğ#ϑ ( HD Hך얟aYYY-Rn~&)==g-|iyyM4935֖-[H૕H¬Y^{(&N75$R$R$R@"$R$R$[$Iөp;>"YNi\֜.. &תarH"gΟQ|4I"%I|Xn>M/뵷YDDp^w$HWy]98)u&B$I(hH'M[4?`;hu F2xUsⵂnčeaNL?nњ)>"-k|63Ac.?p~eHPf\2OU'xV0 JfS? eLbf>2䪯(pz j$Jlf׾q;;B| $Mg-6OdQ`BrvvJk=_K.| kN/ڷ+$f]gSYЄ*|,a#o첱SJk.83.v^ǛOtN[~wĎCw ')o[NdZhjݒǛO2k) CJDDֶCuT`jt 0mMgYVsWc[P&ċW$LCn!W2G5Rϣ'8F\yEgZV'"lKL b>-y9M]7%L9m\]%ډĎO`NQDc'ZCCc'ӋA[R[ѕ,$a]f]bz^ԾJ5I*\uN ڬA[F$IHD: Ao=mD6qʰ`l8ew \v{UIQIm}WM$c.y=3$hcg~,q|/뢧,2pȻ =mIlH`y\grZO[=?0=LD3bL]vĴ~"`{L )i`v"6hcQe:*_DzZUNHrww5mGG}%nzS'R$T#2ƈO)Ò&u;3[c^111SM 扴ܤ%Ĉ8#i##✈f/wܳ-qNtCI/No TMB4ireƔH=d{]yǜ' :MzB4'R.IXPo7#{r=1"&h&h&h&h&hrK5Z x7nk!-]92ΉH 2MP+4AMG" Fx0G4A4A4A4A4A[ j&h2I5ODEN:u{PD!HHHHH!C $N:"(YYY(N{HxE8=|U\vwN2K-'f/>/h$)7ٲwۆ&;o4nB|#1Pι\-/^+͝5<ߟ񫧖ʈ-~{bx?ybȯUo?ۿ^|)v7:K+[HaL08DhmuwqU\z *(*͊(*AMLo~S5I~IvSlY;{Æ(_n9?@TQy;9s3sg\"s=%Z5p6TYr6QoƈȐ6㟥>}H8w""#fF y/BCfXWz}hZ%"c'/sµq$?\ԑ)њc; xg|t #>}{so}pc1f.p=hoˈW?=;s0م?NvX)}bz(ZR``Ϥd79NAgJD"sޡͧnx*;>P/l+v] nHym)߼cI3eh>w?IZK1kpT\--GdLj8jFTM}h{5'o~sN::Gꅋ?}=N vo%Ss?{Sy7|@|p/h'ouoo6 pw[^rrrDD:붪ɬ|AS:H'v1ڒ2{KlxJ~>GV uY 4:!#Gq6\9]g YOĺET?bܖ%q<2R #$''_bL{hk. #dH)2R@F 2t.lX!#""#^oTp$qPf5SΖ%G&*,3ƈrx.l̘HG\S7cFF:Jg >^Z3cd̯^Tl.f\_7Vpmayʪ~iI:zRv]zG)fMoK*N^w7VUyJ}3ǦQnF1nˇۍjl&O#-i|#g)% O?O*N%9T2<\Ս$gԓeN4M,Wsk#=JD*-h yݎǻXŹ6nV6@ڒ^-ʁVuj כN$u6%J<#m[qTPYm̺s)=\ăFIհzǦG{zGSH0̵}e8;qXYP[&L F/8"b5R޾OPܾۙtaXlNmXar^;i͌oo`m١]<:XqMn0HؔV)]͊*3̼O?'k\q׹GVf E92醧^U\)4ib4ɯsp+hߞܽ|,Snx,7#_INZopDzI]`fH\ν4l^WT6;:j"Nc4U6w՚#~cvҽ-9GƇjftC}d>]~.gv^nJ"dsl=t@KV*rsV5ub~k"lZRm#Gr h[9lU}݇vc ]Fkia"Nc9') #dH)2R@F  #dH\qq1: BFjYЊ. #dH)2R@F 4O.G$''t2REڊ;.+1%*22r܂ &Z)cUM95V!}v@}zTwl+<׶ܵS]E'e9hr"eΛ3Q~zGaY1f]DdddӫEtG1022rW'tĘzDFvY~Z1ʓ^3  #$xʉ>o.ݜ|Aon&8`7fc7cowI!WTBk~Óތ1S?[ztG9y?_<K))+=tH;۟> S0X_UퟞAQxnr'w{-I~Dݞf1byn1kHtLz5m!#e%+]F$IL[0w~=cQƘT}=]{T")<)L߾#i:|MDbI^IA.UV$ff]`Q^eXyb=sWZ#Bj+3-q3;dxq{v˗/l}»>eld| \<o9܋Z]ܷ?K%;>\ajjy uqVt2?}Χ_^;Ե؅LUrl2[?3oCrhvB[kh O{ x-g+ñJ" ;%f}?ئz޾gf>>=% 0ԚHy.՗r&XjA1~wϷW+0CeQOVӀ=ÅLsR?eq\O"F/ B?ޛv_Ǣ2 &:܃Z)q7fcy[j˽Jujy"2,r"ӡCmjpJؕM^6a^~\1v"PUJ9d5psQ#y,DfDw?1}[\^c 9xfdx֤"( aCBe4Wl Վ ,ߡ<<Յ .Kb: 7 j 3V\qVWzo!==U\K~nbprD B=fmaOS·:ޑ;6֞7d'%7_U 믑-~"ptSOS dٱ@F`"ɨĎQm(yb0č/:z^GRg({;E39tf̱^+6ҎILn#"κ㰱Ѯrup{pu,q{_v7otpÇ[.Spw qmp=R@F H2Rd) #@F H%kabt܅Tբ]@F H2Rd) #>m޻.`d2?2 >VԞe+ܦ3hJi)){S^QʣZnw#*ͧɱ똗T \$)Ȥp{򙄎6<ӟ&F#HGo/ЊcgJ˅v&?j2 XyًI sZF-GD >=Gd˫_4o9~ FRiwi9}3L?ËZ?'XI?XҐy,""޾NNq$IQQQk֬i&S2[㟿Ŏ3]̕5xVTz2'h`Ϗwe31:jY\ֺJO+o<횋޿_~0>:i+lʎ\?~94wהxxo_*coJ?O\ǜX/`;Zzec/k{;^qT"yJZo{ 8G 6:ȯv{#U5iŽGMPܘ0خ ܫZ?}2M~_|__&{1'MJVSh:ٶ&: Wt"p^rUDھf[L)JD"22LZkb^,2ZՔU:ZݙEt?Jkeu39A΋Fe.k%[R.U<'Up3#1,y=/Hp햸%꨷=DZ9(uy"Ɉ@'7SU-hJ]n8ݗ~V{_D~+c~wVW3j;9_ג<#""ZR]jj`yh!Av\C>mǿڼ:}^s?Xo?^9-.\8|p%|P(fdd[mŒ3e}lĺUv'Z6dAAAiii(멳 m8kL;՟%"Ƙ^)qRZ/C?]u=[jm, 9]H)2R@F  #d͒\qq1: BFjYЊ. #dH)2R@F 4O.hnFDD`GG,GGH>mǿڼ:}YLMEM񨿂㸛ل!Θ={uL4 Xߧ&! Gi){OU?sHF 7#8Gb1㷏^񨿂pC5ܭˈn6_&ϯzwTtv\(N["Ci4/2GND$_Yk若8gzG 72uOK雩dJ^WM r]O4~o!iѡ䕖 M~6K*4~޷ئ_RK?~+].oMFDTL|5&F#= #)L<ögEZ9}V ʆ Y+D?Y|DNJDұYo"E˶#;v?]9cUuϟiWi| vnFuvXQ֝4 |c d<ٹ%ڞYNǯ&Yř3>bTn5dڈx0:i+lʎܦܥcW-|mha0}Z[j\YR%9# [P8i)y6 'VoI%]ēn=<{=һowū+.g^ wG@bLDDN/2[ݻptŖ Qزߥ┭V/ۙ$!huUaDtrweW +Neup"ػ|݁sӏ%- SO_2b7ukxbH=uڭgd9XeTi 'PWrU]|ޤ vUk׋jzѸv&ټ~V"ڼmGҮ$h8Cך#f|&%\jjG{wfG,̹762x;Kcq~F[;!m!Kٲeao7a ͤrDOߡcC7c#0^ND$s58w_YO~5Pۏe*R{F~u|5gg5'v݆ 94EFb1O^*#2)}:]ybߢh̷bG.J&"Kp%>nsWi%"\'o%óUiRFr$"#UmO0EF!7M CDQT{Pl U/ڢ:(Gꅋ?}=N vo"Qwy>('M}DdTU%88H5M4_}ubx Gi|՘9OSzwT"JOOo .#88He1㷏^9\p@ۆk@F mErr2:GHYU֦ysW/ 111ƤI/ғ`FuUiwi9}3L7^eGV.XZdR8=9qX5g?nhw>nU9'! 2қH[56xz׳pSim5y̜>sb:i+lʎܦ*>mKUhw GG2^s\62O v! 6^62S{*d;UvA& vܝc/|B(6qi{be:N ""NjU2]ֶK\yNz/T$sy^.c5 8*#!#Ho*:ڠJr&"2e=gUgLOUp]+G[3 T^[=07###Ho»wg6w0;)wFLDUfZ E "Uv "W' ~(g`:r7J,Yp721jzI$I;n\M:ƌnA###!438#rw.29t]5~F՜شuа)SWTrbݢeێ];.yϜ*:zO(nW!KӽW5UGwWi| vnFuv wOKoG\Uë;JWl]gzwu2U#"I#h˗/w21qqq8#?*9>q;)L}'Ա/Nur I&͞=ShnWY 82R샺71w{^Џ@@F p{U_L4\@@F p'.&-e #p#H 8HN-<2Rd) #@F H1&_ǎ+&ӟ{/cp~2̥ǖ/9Phfn~ yOdWL[6>ˎhj*0I+/m}9Mebѡ~Obbk Oo_/̝3g+,2I>z8`ɡij7::1В?\:E3gy/s[@Nj6Q;KWgͅkV!:%}+͞=fv4ZwnC[#T}긡iy/6gmEjoqXVl ݝOR)IJf/]*x;[\lO=YK͡[<*ڈq2zL,:1lSA/<6ObQK`ipnrrB)S*IT9""N?t OAwa<'z((mɲmrdhb{..`w&@*8g%B۝ֻp@F w`h8V`jc+xN%@ O:bXBTEw%5-|@L[]Jt_eTq\ͩאp~a,sQשm`USV8rtzE@L|'y G2m"UԎ-/bKSٚZdE~~۶I1f@$yv]x|k?4ض`NP%MEeTx2N|(Ϣ򁑞*aJ*OIܠٍ\]?:B˓XwY:~dW&~%RZ "^Ș#Ñ$jAl4T]k}:y7&A sem>j+z7fpOhobڙ^gO`;ؔe 9[z!mwd+leSqNwdĎ I.;ցو9ۖ:ţsһGsaYfg7jhz EA<{lXzHUAJBzlyMv7M@?4l;O>*)I;eDzˑ>#yBm׉b{3%ߜLMOn>1TI7bv.{UStUMi#˿&MܼxSZ/cHޛ*"ڻh\b!QѬ`vv,X5i& ,"+꣹eL`4>֥qk3a{'FmmS% ̌+-4}XKNaFZ}.տ%sm433+vmyBC ۑ8L|,~Dv;`?v{u UvȍirjkFlꄴF{ҁ>Cq݃oyƩ6)V;4-4uiL/#Ds=MokM0R#hcԻ+aQS5CH'iq!ȢtnW5$"5F$h#BDBHi V[8iW%Ĉk+lZWnqJuf1)!"RDm HcMRRSDK&Y1j" I{VNo7Kj軾m;rRtCB޹CU2C']r5P~]%{~ٺiC}Zo19NPGfwE("J'40@\kH̦RSĺEJQUl?-,&!S0plH)]H]9wP!x4rVA]zZ0#XK|piffpM Æ/Z+Yc'{9.=- ʵ]:Ԓ y,\_ީbU@lzة{%%Q=t&˨a"lBj3=u%6+6O4$H Mb?Z(/(t*i_֓+~N)c\9g&f ,sꎮ[xoWىe.:}ZQ~;vlL&5&e\T)&6:Ǝ]T+$K2tնbDDn1iD=-pІ4.f^LvUWJnϹMm;6jF9'Q}"A~5'v75rӚW[sG_YX!|EtE}Z{r$OԜ_鍧 F}&[(Gv5h5(޽֨Ѐ#%ѝy&; WIJPY-ؚp2"6oo}`cu"wVpWIU%5N6ZW6;OgGDR#dRWګ-{u1Qr) #b:lƛھ6EݓtBqf/ٷcm~E[6=e8w;k8_L{l隞mJ$ +džk%wZ2Қi xIh~rrr222PKy߮eMNts"joG]'\Vw! pt`njk^_:N[#!{R=. p8ݥ 9R8]ȭBs0m83s>RZTdAz5)?J+R"""""PyUUU(cP,hiFF*gG XVX@Ԣ;RORNA^On+R9@8qo D $q|" " "m B""e)S"A ח5$x] DDADAq$GA!Z+R w 5kq"" " "m'gjP+Di9ROK;*sI=Ev; '"Y={"sܵ!F!9֚̿`bt=B5"RyiR1a ҺӻY˸U_a$pkI}ADADA䒉j">[VDD 墓 JK&w.ɵp5\U"FH1.Hbsdqx:(K̵ Qθkk> #N\MQkJ-՜(Ƈ(jIr+0\O{˛ " " "HBHHeN $pW)&GC\d{unP*kw":D\*K*6pJeJ! VAЅ{t x]EoǬ"F '2D >Y[%ykf Պ1)J"ԇKڶZ1&kHJv+S% c#2SB $Za̺q{y!cݑ?2 ĽƏ~fTLh8] DADA(Z!oֻjo^=9kq& Mm2STu9c)8']ؠ.FI'OT8P gˮwr3=8iwTTJ\ 94μ7%bP9&cX(?^SQ{Y*%U~kYU tڷ3UV[BB0GÜÍJөԨĹ0=UjP.aNlDADAD.j"VIwW}]9FDADA䢊OV ≴9Rqu["Z":JdeR,Z J(멢>UV[*LƨS(71\n1Gw9FPAU 80WN n*ۅ"CkJ1LpD1"R%dž0] a&GŽ_Θi̹,1se%5Lq4G{L C(TԺ;LI @ ثb&3g]OCDADA≸?BOW g8viHOUm>Eunͫv^E"b":SDa;v┃3}NS\.:̙'[+u#Bӣ"nXr;*ViqVN$-t'$ZVl:\hIOJIVt1Hsƙt GC;:)KNYjƹ$3 ;^~麿؂봮9 s?ADADA"V (gR0999k=Ey@s}WqF$&:YʌW;ˋ͵؉|ADADi28j%Z ]&xNY_Râֵa@*cXfZ-ҢҭGLuAhGDADA$HBHkkwi?;Y:׷p) .#" " E D|ϔ֊suGקz" " "m&Q+Dڊ}[Zי\𩤂zbp& EDADA"FZqE*{亴X?ɮ/y" " "m&B"DZmEz#''OnAD"H"H/xn㯜sX2ik{gS\yGNQw5stffffqWjA0{+k]gw7 E&wBYqm#"zlvޗeTJ ʘ9A'~yy]sw^;sg>A cq7ꟙ9ho-v0ƘTG 27>||szں zw'&n&1g_{s.s?5uhC'*ɽ]vUE٨Ԯe_egk?Rjfrc۶mkӘ໓ߵ:R+UQ,n=nusU8925eW(˲lɝ3u̷~-J֓gOu%ٴP˘{/[f_ys2򟭥vGW' e)'cnW\.e _W`i.ڷ<3Ks#3ܷΘp&,Y}ņvY=Q)lzw|(tc2 /;`.f#w ׈wܔ&fhFw]FJ7{tdѮS*4ჅN1$kרF-n"R%]~`ڟڈ} DCN4ڔwaӻ^, ߽(F21M+ Mn-`{- ofB=;[堔 ft<2x͎E6pZ5+L#tNT{u W4=jID}Ø$5&ypדmp` 5Funfd} QTaC)}ㆎvjʤ1ىo{nR ?H3.LU*6~D-3ܫ$uTGSڊ]ΘrgBG ClSJbekcm;_߼u^!cXo8Eh\XDjs~ ;R-l(8d.pJ* CAױjs{,ŶѮ! wzwuzۻ ֝279![VmqٍIEuab5-FeɈD]UMAVvɵb8ZИfW燞wБ fKU X>A֤w}'q{=rm;E9OʄQW&c,ݬZr6XxoX~k- ׿8MMhTP頎*"rTTD$PeeXBdTkKGװ|L1k69./z5S~wDڐ>yv~YP}[3,%Ru*TDV^dbEuOChOh\H]I&R’[J5hf7ڭ߲;nʬTx4j9o擭56h O +h\ $lrnǿ_M:69>Z1u&6c }>xv)ǵq<2>kjڼe1nj7p·M)+TgA#U&Oyh\OmM\ՒTk{kçtՉhDq#""]uo':ooU29 ޲y[rȑӂV.7"˘ٿb+I6&ITtڤ%JDU_af;>}7?a\>puӥ XhL:MS3i\琠#pWO- < M.OuX1~ܞ_m$?/Id1çvfxʵ ܋ k`X7][ǐ1k޽an{@*w62aB~e#M2eS7?q򴙷vkF2`g~]3|!SXti6pM3u ݀iGO[ү.|Mٶ*;czǮJ+|gM_ã%Ww?~omz/oIUyT\ XVկ㹕<)ګ#.YݫwV9^='{LM9`^1bhԜNϼ!/~]?7:/}~{7Xmb[}jH>mCN8iDBH|O#U=1y0p"= M%!!UY|l?wٚ1\OP}o )~QČw?{''>v|WcBֽx$#.:jV/|lj%lvNLynGʇo펣~>Tvc1p.D{rό#zEi=wH9d??.z-|36~?\sS]uU֭#-[`E\{B YeG+$u0ʐ"̴RuD6!y4HR:*-VRiZYK8\Ӱlq9'1~io09R9َ|uu Z-ۢ>w;ڣ>~c +R11 !ʿ?=} .gb\{5UV`\jI%{ ,b͏zƎ?]]?\tvÓ-|F>*4,eVsqEY x97u2ND1Vt.mn 5 2dĈׯ'Ç2+RWvvv+H_nصϖit ٹH70c[] ?a8jZ"su+pNw_>Ln=d;s/m/r>Vq!?50no]ď_-ߔѯ+i}Ca*^׿eCul%Y(ݳNO+Y޽fWE3/[f-}dX w9v?0ΝEIaF1Zꇽj֪w6[9i[v:ΉsƘ2qi_V6lϚ5 7صƝȬ>z!u?vX47r>&ϩJqK"nS ?]g|}n'fSҲ7?lH9*_psuLjTq MWVe):VeѪtĹ&u@7\>km\=jIDfb*sNn4ѧ5sA1ǼrGu7S-K|yɧFbtic74_t}Z H9'93\Y|}fܼQ.pN1e.bВ9999f5+fM_7 W8+[N1[h'zqTiu{:bLfVڵiϷߟ1ʫIp {Uf)SGk9wzWەn㵉n:ӪOc8D(2R?&ݱS3f[8Ѝ4it"HE$kM(%/޿!/vԌQᢽpMhE8f1e.hb{IH6Wʎ ?$ 2GǷkno9\atX^2:KXjF%Jvhg5IIH;n"V1k_֛HPEv?,VkgZ\ƀ_Ӫ-$w/yگ>w2"}7ml7w^[ "1-odGQDQcu\` W"{\ ę*e"}LɎS%vC qb\牽"ōBזXj8#QDU3D16>4Yi)ԸA#-o" " "m#BZ!oV2'\"}XqGc6O8g\0D/KDrmyqSg͸,x̜8Jkk{K{92ZqS jCV߈0ɖ_+&FU5ʞ=cD'm^f Պ aDlޱ=پdߒSVH/p<%߾DADA6AA7Bb]>mzOV@Q IDATQdMDs>lPP==nB{D TULV3'qT!Y]]#Inm{kRcW*jKkg86?&cX(pJ5jN!uΐо)/ yJIyeP_߾" " "m=Z!H}ϑu1qeO#g獯!\'TrJ9*2&>TxZ9wuWVkk]8#m֊BE9- S)ՂTZi5ERy@ƔH=ܫPBRRtq*ZJ+mPv_ꯠnw_DADAD`}BOΑʌ aY+>jb1v7Q-nK ZWp_kL " " Җ""xGZ^̽SOӼp1ҹ02)k˦K:dUtV" " "$Z!=SZ+Rι~k\yb3@rW7p " " "g=Q+Dڊ}g"י\[=Me2O\" " "m$Q+DTIOpz>FoK!" " Hj">V[^;yrhQ-("XV)V)V)E[>9e9?s6yC :těg/=laծ+Uռٸ{#K%Koz7Fs8?Yv 9玣^95Usc?5ko=7o)'W&dcSD$Bۘa_,uP;.-w/}cXo ׾-oфhm#ͬ&/ۏƈkfpZMquM~/NOU[,yOwTN4wgMkr`KiUey]1Oky񯅝I9abZS/?\wgK7<i=Mk[L%{~/$_ˎow#_[-X>vJHD$KYQJi,|уnsއwLV**~>=9Y=Y34 o)».wbwTix{!w6ʭ'f3{zƼ/f,pMn;}{WiRJSk{׶7d(o<Мh^$sιT~nY䙐':퇏S ˭G.ov--~)#/q>юODq}ۧfi)T۞\;:o_~WG]HE]׮xmr gG?L|˖9 g}?c;߼[^eIZ"4ח<g}}<JY¯}/IboG" Xe55ʴ/IEoAP׮{SFPL}emqJn=0GL}Kpd0'i>Nμod4ў/ezj|FDF>y:G-UbݨUK x(ڸgBƇ gMﲓ:}v{ `E pQtos]7""+wn(NmLR\G;+nw]=O! d V#nxA$RB]q=;+(s}k4ɽ?K1lHmWʨN)zH?48&u!t2cxgq.sw=""wfkyYNlRs_IPaWkNM>Y㑴˨ R]`;~htGoXY;8`X45UnmfxS5\Ie@swIpo䪝rە!&8tYߪ@{W eeoqh7~ψ>֤F]vR- i)@[OHtDĉPAp=Gz׼wzyg~.ɂJhɩA,Ɯ?dZ0ofr?* Juk{>0wBC|7{f5zqS&7Z7{"bVkieq ZR+K_?Ϛ3NƺwM]|߁p6Ƣ=`$sp^j\%Έf@׷*hZA[mt_Ӆ6w6K3} '"߬> rX#O36":Z)IG;H4 ;df7̇6촵>ybjdѡ nDR~ZUEdQ >*ۋwTlYiM-LYSP$"+>dE疧f79 /Zvڵk׮[Њ?9Dc׌55H=QdfDA:*(uF%3ܮpƢ"({;(T?WJ#b,阍9l:h o@?"΢D~F)\ruDpëzIs%R :Og[~w]W/ IMD.>7g';G'0ӞOdzvVI=9~㻯|q/ V]֋|q5sMʈ^zhUJDt=n[}yGyM*orz"YkkY^g_~."4,aH>z.jCW3?ǴApv"pL1 5WW%U^{', \n3o ҁ|t0zE˻?y%.[6@6¬%񕓓)'p,8ڽ{w9'.MΨU`Cqeg~nZ{.H7!pi\M('''##_`Avv#8G pɥvڔ*g(?ٞM^(!wD@<;blzVNNTSnDT !@B !Mly[H_t3;g39PJ`_@}0F p )\.1vcg\4v֮$IڵC^r9G?%\fddedd۷pE*0@E WPESv4?M(E+^8koz*Ϙx xCS_-)eQXJ޷>ֆʍ-;L֍L"piT#ד67S떜l?l7* = P0Ok*w{񟉡ޣW F- pׂx}?zLqi oEQ\ 1l^>:ee+,J#5wLqI I~`r,u[H30a)qsA,ױ+}7$\cqnMeJ#?\[Trퟤ^۫|c*xMmOG?*ȾR)57?;o \ p!]1R灯Uy~VѨIY-S荒JI*+Pk!HOd6s[=ĦiESiMa:V%jV.\%*]RХ\tɿgWoAg>}5oeԶC[q,ho',[Hxw$^Gn|uykvg9krDČm$|Pk|bGA̼=+IDغ_\޲ MY\q(}._Re,_rGҵ,r_XűoC}[<:9}~[S|,j|و8WZNo+"/dW"]?h h}Zל[fm'$0,;k_߽y-Mf;gv-θEl.4$Bk!"u҄ς%y_#Lq&BDI3o;½- H.hQ3" \iݓ? ~Izz0wK: ;fΒ4I9W%jPI.W"iBpٸRT'K*F˲fϽrn`gmBVMڈH^9(QShަZ[0d|oJBm-;Q.NCay~E.jcݛ.3c=h-L7գ':>r}޷@c欥jO ~DDJ3?c|o<)uß?^]هH}yy_""~\i=c9ӞOx4m=\=;<%}<,FB=[<6j{!QA\ 6E19w%i$4e3҆?Zcէ֚(H^?wCEB?w߯c؎=c&CUs|H)ߺ{ >9ov_O)sSj8 jYzf ;O,KǶar-sQCBpu-11-:nae〖6ËV !HI.8 O{p.$+yo+H0s<#LxF - " " Ҕ DDΕJ_;,e|7T]݉ADADArԚB䊏 )lzp±cvRV!޻-Uy5&DADAD"+D 4vwX}1_o9" " "\F"#U !\Ve޾xDADAD.@_!HHU =}I&J|\W"" " +DiƊTIsj1zVM|7" " "\6B_!HHU7lI'9q<}$t")P*R@E P"Tao}{ }kgH;ZzZE1ڻR!\n=G,Hc̿s7/>[$j7`t{S?@E p)K5_<3#v zgKM}a8U24p/t0V̽iNXf?fn]owNbq*wκYh^,֗h=l)x ~u{;wd-OŌk,֡&9Y5gפO㱟825KWڦFO{k'ǫH.\K{.!so:k$OxcC¾yzq_\B {=g>sÂ8DȡR=p&Y*và fQmƧ?5Y@/ y>S{'^3e\oH :RTGE`ݕ -w@ƅk[&`OhH.){[O}%""ż}ۇ%k(y䌷>^z[ZU:ͻU̘gk/Uumn96,T˪nRQLzsstI}O1:#['%")~t5 Jջ z𖷉6Ѻ\5^/N3[M&[Z{Ϫ!jWMhkONʶ}w8vUiC==˶}[gbx㇯~mZVspp^E$~/Xd"<_O.V7[.?^&".;kToYk0_o\Rh𼵻\QPXɉމ5e)}Zyå~8ONP =ucJ@ %UD1CNG޽>Gљ7Hzs{UﳟPmI{MڋyDzyϱm'֝?}בGYcƷc%O,}S^4!" ԝtmUq7ho& 7מmxhv~|}O,?hV'~46F*R%kg̸3m<% cܾn[mV8ul7.-r+sGKk&u|k看K 9jg= "`ScFG%!pgwԯG.zNzi]syu#wc,tGS'?~ê2sgYc:$w%[mխeߎKl?qW١׭=`SbҩSm:xvCR F߾}G ۷oyv_ڦLKHLv`yj蘖z)no5SDLu0@ p)W 5Zӕ|ĔN-wq-'ߖ2#,85Aթ7۰о{~:t󜹛ԏ ƫfsݍB*_ib͵dTʾʕX,D=/ qϵWDPY_.oD+~FU 94Z'ZOH!tm]aXvͿ{y3Vu[yv#5 2 HO5Q , 5;H'е൛﾿_t{0Mnk} R7u:A}s좿ԟ8Rxbm}߼_Z%UΐiƩa谦E9993:62⮜^Bp[ AEμOr;wM.9uTt'o̦Ͽp±cNg^\Pk4ƠP9g8({\o TpVfd2C/9eee+RιlF@VS+- ]H)*R@E P"TH)qw: oXpVGAg@sW)8p)"THԤ;䠧snSRMF_ɕKhjE* "bD$dDB1bDo"" " e!"L4OE=┈1B5Qx" " "G'9 D#U Ή1]`qSo쩛=/Lj" " "\>A_!Hu9H-&ڇ)C !1b,^۳sdoi)匘fB^Z?<|AFD6LN ᡝt]rIeiY1)p-BT1A&WU(Hg gJaQU 9Hg Qg-Bؐ$VSy,?mȂS%!|8ۢ imd63P6Q%CV6u N5RjH:rʕ\\&/ " "z}"kHA\4*Ch]jtHB0b»'\|ڮeD""[NT j/_Ǒ.*ըR%[dDZ )!BQ\yGJvYb)b$JrĂ":'c Ժ"3S|DfR6!'b$8 *:m NÿDF;;D'H׭kbW(rex+ZM$\T{[f$qeB6h}V+prsOYRJ)6/quLjӻ9Wʓ'()Ԧ#dTbcu*^|~}&]\})8|ADAD. DjFHjvJkZ )e#'q&SPd  ]G lΐ OD|U9t0"Krs)6CLxW}cDօ:-;:Z5[>mBI>Q`.rI!: v l?J!]+pO:CZdҲ#b'A!]MY[EHrR"Z_竂3Uu+$\)4ä,U5:myHI`F.GSp%u۷ָW(o.m9ao-D,{A,붝4FnRW>έ-r(̨f6fa}٪ܽ{l!" "\"#8Fu1 .Tz f7q唃BI=6 59Nwp)Z%:3*sZ9ۄGjܡým IDAT%.E$1#Qk^HF$۶xe$''b5j pC0Tɖ|⹸\pe{k}d 8 |}Ǯ%1&}T6.V.emȦ )6!%%]$",BRJJ*j Սgk+n)6(t*%-] л*. G3"&IAj*٩p?ȄZ+I^tHԩE*^:]P&sFl9[Km6U(!:DZq. eqzP.{f " "{W R#j#Ͻ8'ѷ (e,hSNsND8']y']mB zK+ "(!ke6;f)ZF>w NK4.FLp_Neoe/8OA6qAsy1Sieױ||"ofLVoRQ1y0bPl*psMPPx%o㹿B(\.8RL ]REfm_N"_MlB/1Ƌ+]$8)3l^ʤWj{Uޫ%sm0 7'΅^ό,y/(|7DADA7}"H*\xnˉA-" "SzXHTpXbRM4KY銒Ԩ`"ȉ*B^eթZoͽ_A)+4[(%6k)$.%j*KlɦIJ"fLTrʖ5FlK-!I}"H3VB0.y*dUb?YPg$$!!1U0̲ᰦoKcҢ*+iC=m,Qփ\᢬doxlkLen2jHpW !o`sZvSfːĔ$ŧqZ-B2c3Hnվ!WӷE6ppNLbąpڏY -L!mp*w.)r Qa^zh_˥(mɭ v[,Wk_Gyx[>28=M]tBPyhI7o<w?nO e8犨~^\[X 63ӫ#εw >(&Y-B *:UY& Ex~'}XE)" " eA_!Hȹ?V1999+}E̕fj+I1 NgL=vٜZ B1.S!T RƸl:ǮDDAD5}iRs…cǎcgrWxT]z \H.W|ӆHj..,|&H⼑x@YUům*=v~n Iaݵ{4f DADA D#y]]i?VwW:[/"{[;@!,'K?YmP\!+ADADꉠAD)mwK{@ae޾xDADAD.@_!HHU{y/o52Yϓk|g!#" " e+DiƊTIsj1zVM|7" " "\6B_!HHU\ێ|rrrq :H)"@E HP*RTpP .999$dff)hnΣ r͙֮𩧿s _ wQy@sVMw#5_ Hw91+օ#_3#*;egO[Kd=B 6TNf1?}GqoxjT]a*""bX#XHUA:{~mevfH};mks"5\ſ/[}pePב2CƔ{}ы. 1 1{Q,;~?^@Ez~PMėhl5F_}o~CP"T]pA'*Rhn]@E HP*RT)"?@x}K>qIo8*-_~}-νEtqQuVuB,޷;ߦι\ٻ(8ے7USk/|EJe=T>=뎪mEr+;=<:hʊΥB!=uWxSKܼCa闿~7?Gg{6}?p<肋0?dOў8T"ŝ=$gNQ0v7uzIY9  A&HgeAc? [Sl4yE !(]sۦo`n*ҋ =h;5J]˖6DHváN4w13fbYzB0I)ݴxaĘԣ+8W{΁zDݥ%߮28Qu4ߐȩpM\aښT|oreEeٜ_2#mW:0#FttѽF]Ufs._-U+M~+ODEW:Z0Z32I8whA4|TDd:#uxW(ͯ=z iʩmkeEQEw9IpoMZ9ᝂ+m޳Q!Pʶ-Q2jϲ%ǻM*\UZ8᭻މzp~+{'p !u%ʡm9k[{x*Y>T9>W<]y0<~Pfb.pCFMvh࠲W5'ʫޣ bkmH+^#U_yYcT!Zv5߬!JTN7:_=qB7هiClȄ ߂5  hD$\P㐖7f4 add޾bկ Hng9>HsVd^?IOgp#ksF&Lԏؘ}pTpkthJ"UZuT><2HEĂL:l50?:$$"NSVp]v[G8n0O TZT7royC,M NH V5Ƅ I⑱.斫* :Ok6f*)>9-%J:̿{gNMlGVGRLUy(3!HIU)ta2]hN"“][eoJUa>O$uz`Ip9 >< uƨ0-#e.^߆+R!olHELL&<%ek C?J~5U$opfC~> <)tqUO/ "rk{DULjB,Lj& v >d\QBnm%gF1"QnݱGUZل&ߤǎ(]NC w&契'=3o92hDDf+;kwT d}N~NUQr S ['MݭD$E0oBL*DpBԷ!ȑPwE2sل޸[_gWMc+:B7 g\ .aVL1[o[oY,BQ,DlqFwwPL|<-dK gSq9R4E$o!:}E&EYu7,6$JӤ#[7[79\v=*)G6?d_$ȚX#v6p\EV2n):dse_k^oP:G]S2%$ļqut5~^p".ð3|ʯ z`q)u/}b?}.ލ6556ai2W N'dJ h>߸^7Yg%Jn`6o13sWH:!-6gjGY*4)R:"ULpnֳ&n]̻r.:r c>3BMףW+lcIR&*gu|ݐqÛpP5!RHCGB+J u:Yip^夛>aqh?ڟ{nD5\Wuwz,:߮|9؝QF$p{.#.Ci}gћϿRHiYAncԷtW<~r6OM+[?Ջ?lΘxϟgժ :u a?SYљCS&ZLw"4WŮΎ6Y _X"u{aAN̉Y;>?`uöAR(xY兇F~'WF=Bj ˒~#z}g7; 2_L_}؝x_A'G(B=6]Mӄ1q;kUaNyf gfGGWFjs]hTf=>u'ҍotm8YC>t'h҄P,i3F$!$]h@ݩnxP@mXSKO6*wQoyNwy?8įۮ)z?H5sg\=RdrU;5alOlf/ іucGrؐ8pWؚ_}g4K1N_`s[T6D//:?te#ox kjb OwG]#j^*2L&}cd@5rҳ[2|r%22;jg,3B?GZ_prHNS-8[gW!yU5B^:iT-L{YI8pó΋+s5ڕϛW,?]t7W^vn7+TBSGƎ ! 9c*Єn8{^2€Na3ōoOs)`vDKwdxÕn¡5K?׆f'uyV6]MwŮ˶uqg\oEOӖ勗S8>?/r <yWfNMc?r_v!E ׇDwi4lkF$f~i=RS9nƐ=o/p]( ]oݶY3ҕkYy-lp϶dkn~9~#OB\kfw_X}@B|UZs7K=W?s4lY_{ Y4>5oyGGkt8Tby)DoonO1&$IQ:%g Qⓧkivp#gnF\yG>j`]k ;?iZșsWa\U6S֤ͪ=`4M.6X~"7775855y"f,_v}v9Gx.(sveE+-x]J[bV Wh3+mg;bfeX!IBg|ԌhCC8v_Ό&wM3i3y;_3a E%u13Y}g+vif|vsB*_wdŚ${j3$j>:JA IDATЅ Ιc_I?u S{f.=:~TMH:=#oL{R4&FwGw&7߸}RmG:.RwHrʂ5GΙm O%ˎ;OxӑaB(!sԊK$ߝҶëlBeM/nwُL%k~V:;=>jxWc 5>zlFdEEpESZz | G>-gDv eMM8z7_5onRkI68ǫ+kW;X?lN=ЋSuJg]Y-Y.,4g]M2)Yy!s!d$x7.S~{W&] +u[ewwnm;战$!:-}uƢ%W]fGݓyM#g SOmZ':r$S=ZmtWH/,N7J POV]P?]qT<0{*d 2Bx-B[]'jhyP"vn1 .:>1!R2:02_v,b˽P2YCͲ%, ht׶4av׹_lN8o΃Cìf/>Tn^ wJ.4M K:!~_htud0SL7fܚ7kjNv4&<).wk*_d\IEpgAMaMNUbWhͅoK $R\)snjC>Zos oY-MtDSbǣSRQ+/=uޏK&ߛg9jygF;iFH޶ 7`$Ut>,m#k4i%&F-[RBsՖQq !RJV&;4iP K{EY>:9uLvV{LeB)?ۨ mM^_ؽ3tdY}Wcp}yne0Dąeiu>e=_se4TZV7 *[b N!ܵ'7 -T]=^\m(=\*K;4}t۾4qPJ^ e IӪVY?p飶XݣIƈ;I O8)~`_?oOuNч cn.R%b>:`HkoU&4w٣%qõO֩BZw׏}58Ƽ*i8{t*l 2+m +vX5[1+WNGW.Z.dA/rS.ͳ+, Ƀ{nΘcҼ-z-L=]Cw^1 ?Fp:|g7)5E<ps[zѢEwy" )D @"ܜtƑOHE Hjxj@"H HH$RH/%qh&'>|kC0?e\Y!IR.roxo,\i}9Qz9+s$ E^zZ3͒~1i^fS&Aj,[4?+LBx.`qƼ!US$Y$8ꃒO_l $sO9^f[|c/> 4g呃q~W43UϲL7r$R\`jJgݪfՇ?ѓsRWM5)fj Z6$sfX W<PTR31 7vЖMͪG ;TYX> 棛6v{l2 jMOK۶6-^Ԅ>b)G🷌 :}}^)!9c,{1z%o޿]BgMərCϜSmݗ;"o74Xҧ(,YBk*W%I!=cCBn|Rov)ಣEN#< >H)D @"D @"H HH$RHjjj(:$RJWO%|1V\I"\iii]A"H$RH Isx94֙xqFt"\e˞v׫ZPB3UieefSUqw aqzdE˹q ^8cǎ1cX,jAA :}j7Os+vn~cZ85[ "(%'m}+g;/KK_> ٩ V+f?hnQcϽRHg6`[vBN{xf?~kA)s[;j3+R?S!z~^'Aa "hPNGs ^ 6-===8C̒$IUUV]2 !]\?>_oJ(]?7_ĺVe.WjIzôտwz2iZWmaY/}$R g鲗헞`^YR/ƩOej?͓Oezk_U:ޅ$In78ON?=9@QٷTCَr̲2}VǕJitBÇ*r8ǒ6slABrm8YC>t'-Qϝ,+ACf鳣fY zd [ODNG.{"OcÒ:4]`P7,eS2ӲrXRKW_YkWf)X m쳣nw jk<$ ^5kH?-btB|j1ZBMBs]hR/wm,U,ꑁƋt:jHKufѩ]VF܍j87![ߢs:ntwvs{4Ce7x< #&$e >p˩fS_"ו՘3֘ު MhG KuKَ^y#CXfZjV/qӃuvUnYWv\>$u|E7my{C{boɕyK1RPĉ#_wѕ /bи &_-'+N;oY2t5 K`BjA*7秧#G8YNqEQ,˖-[}eAj幏GSuW;?Ty^U{+F\.+*XhQ_{,xx<ŝQ[䠄QsO7~IЌ9sPo?%4c"k~5/=dhɵ{&L- !;w:'V'bZY9hu.A#~k5G# $R$+j0vBzߓw۹˕gkSowe:,zԆ}G+{47(/?"3%Lq}{ ÛGCѝQF$p{Wo+/" {nI8̋>_Wjm%JymqFI8Ky_ҷ_JL[7Βw^|E|#ﶺz=ǣwGcZ~WoDΎ6\*@""׶y0̶|)1{Z]//<4/=1,?0UsLҳ<gԓ^|U1κna[ IOn)F<(δfɓ'#$G뺫?_*~/m_a_{lBqSy*,Bef gfG.t\7"2[l.+ݺ4nl5"m8YC>t'h҄PFMB>tUqw(aLJ|NĖCQBU*ܒ1$!!c"LMWs?UޗrQb7Ux,1#; 1[/˭/̝;7˜9sp~ )Z+lMů.=RLS%E/{>іucGrؐ8m5$֜eÊJ:yWg N%<5*͎sM!ykm KY(`]z!x=[O~򓼼u'@"Hjz(D2`h@`czdFf/ zZTGSqN[8biLT(Y>܇'7KR~⥞JKml6)}84w{~vtuHI !&N8~xH4zֺ`Y֘3aOù{nZ0%[kU|P:W?#c|ƀ:U`c9 NVn8tGi?1^+ _,nl{YYwŮ7]VxDx͚?F6Jưc1izfǿz %"is/?”OL):o1\'7~ǟxiys:H1¶|':󒌗Hf |akG4HI?ثtIH.xn{H VR]]LЮ"D/_>},dJ HH$RHP IDAT)$R}iǶ/TOg}wΥ]{;S5zʭyP{TU]ϻ5UUU{.9kR^ԭWyS|鹘}]KDG n_X}@^&+ ⟳G%˫.b$R|k9s3ͅ˗3M13uMMȬY9+s6αzq)"k$?I!4S[l'w^FpNDk9*[|t:&Oy;<>j䜔ˏCfݮ7ifVIZӕGc3E֢]>\ș9Wiޑjǣ9-5X'IBMˎB&XO:$I謃om\Շ6osI15%Y#9e`EbݺuaǒMw[eṰcIyVumXڌ)euͰ 9~TMH:=#%Ijox.cߋiih+cw"yuYsfn|&Թ#dO[fHcH!658|iּJ%yGa;:ʖ=?+LxeLgOS5-i+k anwُL%k~VvxsID=,oS !4%9Sqg#bR,RCeM/옖ӴGjxFrɹI~jΥ ;=,&,߼tw97[`vYrPOގLdRYSצehUGLo5WUVwd)*7zje;(YPnMO:^N1;/M.C: Hq1zxGr!4ޔ_Vve$:vRحajO!'rOh{; 畗:sz%͍󹁨y<$7m*:3'PbCͣI4ԯ8`~u8!f̼D _C4t,Qߊٗ.:!^y_8޵{DUŠ]`ro0?SPH6%&F-[RBsՖq_f㛽V:&;+IWgqT!}ݦzS!CrX:v6 C7-%1*zͺ%KLFqB2Ɔ^Fd eyæD'_op㣌v<1"]Lͥ45O/7-cO/g1{9e;J~G7-d2=R|q|a~~~zz:Ukex}&_Mӄ8 w+7˹wn}-JKK>)nl}>:`d9|cp3b @"H HH$RH)$R)򼚚jR,US)D @"D @"|y,4M:_P)ϦD$%LowI% j97"W/7/_z 3ҩiY^mDZYYiTUtl6u΁7yw$;Xm?.(]2Q=Kiee;ƌcX.\HKK1kJ=NjBǧNB4Mh[ycŮӍ/v] :YXQi ;ş[gL'YFx5g֐G*Ԕo>HⅭg4NCۺkp'R͖}P$UU333WZ)0lXh#{~Lh_g'>_8ŇVkǿ Y<j ˒~#zMk.zKS%P}*kWUUNlB$|2?6P?>O.!ӓ% yQ}[O9{?Œ6slABrѵ_#u:>A!$cԨُ-4W W"|r@cÒ::]`PAln _M9| _}x4i@-?鼭5m盌VKsˌ|6e7Z"u:nt=]Ov;x+}5(L' F*{m84oXV Ý)`vh!~|צ}4Mnru=.IRׯQկW;$!̑&0EHA=17faͼ%5ȬCw^1 ?{q%dWRjpn>A~~~zzzo;re EQ,˖-[}Q7G-+Ww@,xx<ŝneW9&''}'ӏ~*&TYfNT$ɤ(|0pmiK4T3H)$R)D @"EiԆ_ouinw_prk|={?{\i zT[8Ϭ{e]罷ιKO k׫N::LKûwK/~x^ [xXsṯ ( Yy-lpߵ-54!vS|/hYux7Ha@"E1ztVuǪQ=FRMӄ8%+# !ɹI~jΥ B 9\5jBz`;7-w{WJGĤXڪm;:ֲ^j}pG~d(YȰ=̽kcuA k2Cem,gݷ (Y䠯: svR [.tWz_u?GHң O^sqj#7\htd?&tB2YC!$``/sM(۾UOWB.1̥ />Tnjo]m<{N7) ?t&d0YsYC-&&yUTRӨ)9q)Ã]fe$A_je;(YPcӕzOT-ƪMej8?YŠd;*($c`QB[׹S]9hPUg8>OkFSمRPJW%Et59:;JHl*ٶ:4{[6[]JkBuԜsi.5+*#iQCdZJcՙ#ziGG^dh"2޴i"f飶XݣIƈ##˶ϫ:E2xbŬ߻?oϙ~[ƍ%t֔ɱ'6Bm.vᐜ1?ƅ)BhUMW@]xؖqb&̙6wtҒ&_ J)ղ>2cuͪŇMfCWOm_be"O8i)mO8wSm`"&t*>ƺ,)vD|AzQD$Kw2vؽGe d%)p #[s!ónWƺkMsA|}@"zK$%pd!$w<8f.Ї` 7. )D @"o㣮3dF K¾#P).(ފZ+\kk-uh@e,! ! L2L!$H!{3=s HH$RH)$Re:z "$R`#VH)$R)D abWVWv֖\}DGqg7ZWRDHwdff.,,'][H4#U{ e.B)%:. }8/ y_~]ߡ>ΥSc'*y=T) aT9?_Qu@_іŽAڗmI2kdRs{[5O[1ݚ_=) ;H4q3;'F5Z5.sk3_nUސjju:v}iR~1ޜ,|*?1BU{a56Agڒٱ x1#0睍\G?ݑ2{L9:gr۞og-i1E\6ֽwgxsuWNh)0.-! bJd4iKTu?癸b 1h+&yo?cФK#L"~c66vX2 ^n5)44&>!.6a̢lx^5ߺVKuD)mMpߦG/5c_7ꗭJ[tczTi~7o-y{/pwk&"s`;ӄz-ڻ4xQ69ڃ?(o7DNΫR{ V?^c fD|UT3ϽsO- wSDuCkW]~i(,i7=}!)ׯr)m#~SO'js0D nom};ϸ%\Я{^[G?\1H"e-eTDh"z z2{۶σg[RN֝k=~L_9e:{~Dt[3v޿V^-l# ` `lkZ4{Υ}S;6Џ(IDAT>s j0Uv:F,?_\y`n~ӏ >u])[ݵ[z}GY)bӧO>}  c&`t]91;<'Ln[Qf:}3"ݿm]V5[N&P_OY[߻p)J\O\3V}O>>'XT@| 999 Wm55Ձ9`O˂nnfBm\t:r+66&xʃ6*[nĉ}K#B*VuroB/H g$!d, ^r~eZe/]6t3) HMSSShh9ߖW 7Z#O+YDm_Hx4~sGaHȾ3?}[Ke`$R)D @"r>xԈ#F]]BRૣMaRUO/:JLDD4M,)=ͮyWM 37sʹ1~1gu&Nط9R E]__T_s sM(0^}.S%Z\bwח["] =oּzF]89ުɀ5N:~G*[TX֥Kv|skü{?Vz\j4ͣ!k_W˜6wxCGoĥibhrUn*ǜF0˓ E۷syuF@"Pt5WWoyuqyΒ8-;m9cKqӸ 2PM=O<˾X7hֲ8_5,u57řfChg^ զ쵭ӯΉrFqWڮM_$WWE>*Zp͂Pbۆώ,Ir5)f?B[=[QSkHiдtm~Z@\J`ã='̡aَmHMLIZ]X "{yGY>Z8; nBOg3,~QyAp!ѻH.V# ~M-x+m-A%"i"gev/f֊Nn%.HpBSyJg֭G-cKDyfq/>o|Q[n13.ٶa,Qc&c3"lp G:TSDDa;Z|AN.>m>yo N2,bbu0}2G:Tyc/M+/_-c L 8*ceM68볹7}M\rw< uC)$5S~3Ci_nW}wErg ߐS?Mrl$wRdcx}sQ ٷSIY֯KQO4V^!/Ouo-""GK~L ЮUUKq6%)H)oR*Hwlq,p^rC0Dy)up5ȕdIg/s',rscDDlf-dZK\vb3G@"kV3oȋ.SؿZpL!ɴIѮ.yQJ""ajlIϕ| 1$*IO{ X$a(wn\#k GߖbThw}[~oWu}ߓ9XB>6˵,b\#K|[>v*7~ȉMm}ۖS[I^hR-7=-wEDD3x䡗ds9`!l8#Bn |?}$",_\$oV-f +H$Rjg{iss3\DH/#H$RHo(77%=ۧdee1dgHR 7<"HRJDwõec̚jpU~m}? yU͚&#rkZhشSCL"iڙ59;莊1F%ġrcÞ[&<YP텛6|SVYت(K@P1*ʠ5=H;PO '-[2&p/7)g T`|Fq4)lW\W瑝4s{oYuq-\L"lq{VrĦksiBЄ&4 Mhr^0V4ɅJVmJ: d I`ՒqaS_lv56D$81"5M.oxnmO;u<;\;VYF7*jRIc,{hٍ7RJ)߷oM_{ttjR =g;+:FMcvw45RJU@ͩzWJJ󮈘_\[Cz[s͉mjmmܡN=7ҌS3}6!JnGEw[HF(DyJD ݏ Dwor/:&<Ȭu^SHY빍T~Ǧ<7$hmUeu^1fdO[-.v谳""#iJcE;*ИHc`/Ȫ5:?Ⱦ<[_:ݍKPƶn[?% ] 4)OK%S&\1bԀ)tCPtH}U.ZlTE)1%HNg&G4UX"}q6;EaA&)aH}XÑJD#ƅti8RmJI 2j)曊;~qsptq6ujՂ3fMUD3*-iTLe^mm2Λg[ukt1-cW~MY3"56PtJw7-.)f I=6̨zU-.PISe;2(IIUu[DD.fsM w,W>I1&5yvu]B$1&kPhj*$)뺈ZKRM;}kJ;܄oؙ+DT:AFO[Ua~3yє8A"zhvhWhPn;-`G ࢪ9֭8qbߒsY JJG1XƎ1ѹ֬ &viwvz|[oW-1}brMc.}H{iKbd]1%g_\7|$ҾHC;@pqi}}=8l\PIENDB`PKX^HZZ1django-cms-release-2.4.x/_images/it-works-cms.pngPNG  IHDRѐ IDATx{\TqRݤ46mmiM/}nfbI{J1[^o(qxAu4bDa`. sQcy?803ry{ CDDDDDD' """"""eQC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz `1EDDDDDPC!XDDDDDDz/<;쎠l/0F+8/88nF;X x \m_mkuʼn?]@Kֶ5tg۶f࠱u:m#""""" |y`חv-O5*|̼BV19c$1̜F0y?fa#s7eH5kd~&dl&%e[H*=umbnFfgm`v72'g 7|3 m ijsWl66箶pMNDDDDDztG0Eꚰ6jO5QQ%n`v|Lbfen#>rs*[A\veΌL_nb &--fr ;yٻI\Y;I\$$yٻWƬ۶ fd抝ɌD6KH܌|XtS\دu㉈\JpCC; ܡpN 60sm`ʒML_VƬLFf6mdNN)e$V0/Dvf/+!1&do%1C)ss1'{+?('!;3Vl#>Y+M+#>˷2cfl&qo#PJҭ21wY9sr>afN%2f2/gA:\/<\{z+wl6чҵD#. JwxSLL5T25)KJ[l#ӲL*&2 &ʘYۘi(eYۘrMe]|̴L@܊ML."v:W[,fvw(%PTC c#.gqKMLZ­8\/4755I^^MMM2KxxykE3@~'LXeۙiY&feo#&or3.k㳶2)kS2ui)30%g1Y*x&.5Uδf0r⳷)K73)c#262k6| r~F 㖖+71)ĭ(fL[^ZV=,"""""U<˗U7l@nn}/]kE~Il;1L4d ӌ,fZn w*r7"kLHYKlZ%u'h'l`jfofF))뙵etm3%e=#R626c('emkY\P̴eLH_ϔ\#~̸`E4^|!p2tPq:މZ[Z\C-[26b&̌ ħdf*SlE:2s ZvhV.XƌūIH_lqԷBᶃZ YW3XZ"9y O)bb&.31)%|L5k3%` TWWgQUU"//z<΅ rvN8#Gػw/СC ٳ={'OrqmlZ8u޽jZX,:==={o>=̫7> n΄%Ħo`BjR {f6Xs4GN6qE? +=^rvū)K71wz7q3~opgG8FC/.gBZ1cbbFb7*.h~hK >s+ڵdƎ˻СC3g?<8lB||A܂JcLr KH\jbB)26M 5\K s;0aqqqTTTp)N:֭[dڵ9r, q8V+UUUTWWsi=z4Vf` FTT+WO?%K[o{oZ;v,1117` q0vX֮]bѣFYr%ު úr-ZǨEp#cWogGN;diVb>`Ԭ\eՌZ!cl"1Nh7Y VTnjMuXj(AV,guK0jq!co`B&VC372U""""""WB; R__z1{;]9pc;wh"&Ll6.]oMQQ܆fΜInn{.ضm#::uyرc <=辰kɉ'|NN *^ 73|:F%"); gNa>Ƅy3iD-Ș%L*`"foԅ&1l@em5򙷢@F/̴"~ra7erޞϤ3k51%L-d̢MĊ{@DDDDD16loeee&=h LО lW^a߾}|ʉ'8s 0qDK2l0<t>gl6l6&ÇsqV;3g$=={Jnn.Ç>̛x뭷裏悥&ȹkb 2GzC颸 Y` .dL6F\N.$ګ>!:55N> @ee%C֖Vo]z:qaqx}|&oLq mXHȥOȑ#9zc }:3gdҤITUUyco3o<B.1b999.ztoN7bW.Cu؁'#xetIhL1Җm)D_Jܼ5qM.Y߆/`[)l}Gx+n}Wţ#yuʚprçeҘż99|>܁M`K V; 6;4>jyy9C qOVrh6;;hwe~,99iӦyӔMF}}=cٴiw{^ZZJxxϘ]UU;Cyyy{\Cʊy=:I+0:7'fy.-q) 5y~RS{IH[OC3l3vf/LcQa?ٽZ[Su ELH7xG/fJR{pG$lˋKEܠ.;ɓ'5kcǎum #F`ʕޠ }vy"?ٳg]׳e˖1j(owkOvʔ);&8!!c&z;vxd ګӭ-9sI&1ox|>ܴwqgkͼ9Ԟm;sya|*gldyT>NI^Ŕ|Z&!Vl4}oiİo+yu\/g@tyFcHuɕ`>DƍGRR,_%K0x`ݛ]U}h42af͚EZZ,\ѣGs1w\bbbtUk]`:{l&Lɓ'l2eMFrr2+W˽Z;N'wfر˖-c̘1m۶W-4;!9{#c?LKHz>Ym2' i8]Xs̨y4d F^My{L#yp&g;+x{Z6NjCyaT/ IߢJQ EGRRX[mjj;wor1o2tTVVb0 6 {DII7@{0t8:u*G&!!3m4f̘ɓ9r$7o{/| YYY$$$Ċ+OߴN+hF.dL1y>j>OE<ޝ΂"o1cYMXάx=:kYjoM4Ld /,ᕑ<=r17r)όIg,[xfN%rRV$d0:F3%^2ϽyrX Wl-X0awpYw^yp9]Aohh<-}ygORRƹs8q'Ndʔ)~ݟ=kll: Uhy s2?b Fȅ.]9sϓܕ¬=`[[Z9}4F"''pW=)S1ώ]Q <2tF xv\OγcxD}:Ǐ;zywXzu{s죵f'g"fE ߛOȹ<14'"ܰ<^K<>*?Zk~CR~ ώ^.)<9t6O Isx:2g癨 N1<3#x<7z!OKas?:gOTs&1pT:]D٬-1j ݆""""""=e v:Aaspk.ݻfLeo'>׳OɶBTTT0aLRRwq;v,#8C{;PYsF.шd&?r.FX2 IȅCx.rF!x!* ~×Ļ?"-`d^x/XĻsyy;g/ \Co,9gG.s0r {kϥhNeUss3h4EZZyyylܸ.il v;Alb5?2?1}}5~Z xmq$O1isس{+ gDϚ؞e|r~""""rB} MMM~7q>xu8p^V> v\|vn.Y]Ԝup ק-ݓ炳ߥ'z_pq:5]N7 S """"rBku?s:ծ._꼀V8X[[qGk5:ZiI .pࠕVZʹ:Cw%nI_sP j­KwjlOuZm4-mfZ\vѴ]Iڵky'իs_W{ #,,~hvӧ]>_ nlowZT<]/gg k]vo--ః9M N+W[o'K 8H~swW~_3~xo]P!x`e˳dSG,8pK'':wy >C@ =x֭|[ߢW^<#]s9f3k֬!..G}}ƽˠAȠOMt37Vp!XX]9sq:rqͶnk{N{muixq{aÆѫW/S\\ wqnhhOSzw~3عs'ϟ9@~DDDDFq` {`O.k􅶭 m)hv9ik>&؆vqЂ&XkyKw\V~޽{?6}QPP+wǀ!x!XFΝ;MXXf… ~!y8755k.RRRxg۷/_Wμyl'{R ސBt "UbCXX ~'O$??HDFFg}P IDAT~}+|[DDDDP&ܽ?pQRR­JXX&L7"mlld޽̞=~z|k_3999>}ڻ٨=]IDDDDz,]Blݻzūޕ>y(btR|MN?d״QXDDDD#`'qow # """"rPA.yӧ?˗/>2Z,vELL 7`۶m<3Vk,) :]aVEBe[{9r$ ]ڽgg>}gTv}Ϝ9?|'K,i\# "݈1ݗ}:uŋӻwo~_d~Z[Z/\vgΜ!;;|[n_ߕCDDDD䋦,ݸ_ؿR[ZZJ~{yǩkE[We|+6}ǏO>vm<䓜;w~۞ """""ךBH7ᩨ677UHNN^`С /^LLL wu?яX`?o(IË/H>}7I\\<,""""`&"'kwwr-q߼+u]Ӈ?455q@}w9]~a>w=?(,,7*""""SN|"[.~mnf˘1cxǹ۸[馛ի@NNN;&gW&YMM *wqr (tV;NomEEw}7aaa̜9pWg͚/LXXz+aaa_s1kOg>ݤkkkyG d~I\k "݌x &}ǩS~O8IxGի{W^̙3_jv9]&ٳOO|}__rDfNʏcz}͛%S۷/v'O)"r}R]iTYIee%&ZKzK-&J*+M*؛ ɽJ sMpbs<ۏ\UU]'&LUX)u!&s kz݄JCJ2DGGK|B2yE&j-3e&GW,5>a!~i\RHFrmKBrE?'>', "݄b\OXXXV=9//G1`Fc艱î+:aXXv-? 㮻bժU={h_tihYD=09D+02k&>9ɦ˫ZwM+*Q!7؁\4dF5mr?`"6(w̜Eh~"As%:8j{lS[pI\yZ׶BHwuÇO>`޽@{H;a#<=#vl4 Uz'VbH':6Xb)0; FTb4XNXbDC@㊎ݕRbO >:*kxp^4>QSr% X jO"F"JBmԘR%|H1AHQcQE%UpPc*$9my/vI%6!cU=[%>seC}QqNl^/h8 .#KFJ BmIB`:,ҍvOW^!,,#GrرtbKKK8p 7y'Xhχ};;!fdeeOCrss۫>EDO!؎o $Vd>k-դNx[_hvԑzJt<]y]x,%wAuGt\Ac Ԡ73 WYkdYcԝz  @~7et9XD`IAs_Wlt=_~{\ٱCŶT c`uκj_'[laM^A90%w=]WCBabx70 dt@_$OXI5O!Xrjիyǹ;:t7.pPuڽcr+++y7'~ӟӧijjjc|1! 9sLJXX> -|I]EDdύEe` B( E&2*Mᡳjr<*f 3n{Y':9ٌ1/8Ķ|<7y:'PH!ľڗ|6ꈵ S/ b30UVRҶꕴǕLQC|p6Et0qRD<%T ]] s`( *klX$GuώBpW(N*1B Wp~W}0cIII! #:|8::duЭE_Z\M "DR>s gnܯr[ \taٰZ|%==?ܿu}x[ipA}}=| |ߧW^qx""_%DjA7yUuNGa9 &87>c%.螄[eT(Etkj ,k 's l0 ח~I~?WFTWWtP/',8(IyruAI`HnET*.Q`ۇ'Ϙl1zqua- 2~FwzsαcvڅhdqLK]!Km%)!k{'VW/{D!Xvw%{np2k,'.\vٿ?EEE\{Gdddm6>Sjjj8{Ӂ ĭ-|'L&;~ySC7吰vlevxT*fVEuuwAg!8RAPGLG%QTTHQI5'`ys@tgZ!Jb: *+l+9^] U'pˋ% JCU^tmpeKָ:^j+i *WWt+WԉH. x#hmWBY8Ղ``_~ѧ{w9x7r.T„!oN*&|.C-[{Pe[J2Si2H`ny1~G}!&r᷌.رcՔRQQAZZ79r$k֬={pQC;łlh4tM<|駚KD{KIߢMPE#x f!/ |\tvᄇ'`wPEJ@pw UN\vl0! e[ WF;Aw@emuuخ=ؗV{5VI(j l(xi:zV΢l x۾B6jDRx8 yd$N[zE`O->%DI!tqϟ`[LApR]JdLELjl >_M "Dк/M}<33~ۗs!8p=aÇ)--:u*6l2< BvkK+~)eee#pҫW/VZ,"׿a}[pwp"R+ \"c|fT,T\55p}'NcJJJ0Lc4yx`ݺu8pM6;8w߸^u}Bpmm-&[=z_*+o"m6DDꂗ }4FIJn |E5WBmZ ;bu3 ɗF vcNUyuZ˕.66bLh*ㆯu7-0eۿm K!._R+ȗOW^P[[t܌᤾ JJJ(++Laa!?[oEzz:g׮]'"vss_8>uwR|In&o~z}no\#Uy}CO`<.8b; VbmKթǂZkM$wgD,y%6`؀ezm Wv/PbAg)e5jrx%~Cݠ^IUE) ]|ۺ_Lj4g0`0QTRI *CWp7KN±yTZK8hn@.A=w”,Ooҵ^*!TyEnt8Zݟxf?9=YoP={,m6JJJرcL>Gy(6myΝ44BWoؿ?ܹqǑ#GjȍPOmM 555ave٬ PSSMuM-}:PSSK}õ]jafbZBjGW}%~ IDATF{YڡzKK[ QaKluF#&::ؔIPIpākj^/F TWU<^SKC?c5`)++__ bڵy]B]vQ^^]\\LEEck;Çenݻimiў`[[[˶mؾ};999׏^z?B ZIDDD{Aok8_ ֝gbak<{th!(`<wƌۿ}?!<yLjݻwsqo@uXV>6n֭[1LuVN:Ŋ+8p /)))gqaN8V9ԕɓl߾JoΈ#ӧw}7SN_l%~k:WO5y;ޢ&B S]z5_ӧƍرcdeey/ITTdffr1N> nٲ-[m6o޺u+;w/ /ٌ3q1sLÉgرY7ba߾}l۶ݻwCn&^|EN< W51Hzx̡Ʊ~ldt!f#B 2O>M cȐ!]pJKK>}:wᗿ%#F 66e˖qػw/{a֭Fpwзo_~_p]wq]wo}{DGGASSzt8q;v7RYYɪUxի?s{RK"%&jꮳ@頮D^F2DEEMl|#xzEn NpswSSS7aw)//gݺu &N0|/_͛ٳgwvMvv6ʭ]wѣ=z4,\Dv흜+poڴ]vQVVٳWmƐ!C*,""""_`HkK+ݛ':tqAkK+Νر2F#DGG3裏Î;(++c˖-Zo|waQ>暖VjXj-Zjnf3쫊+ 8lK&J*E%*JEaR ܿ?9̆};u 9gs#}} >KR_m%1k֨{7n@TrIJ%qqq+++^z%jkųHHHHHHHHHH$doǎXZZ2d Iur5._W_}EVV޵kL8 &OYYOfҤI\NnnQ>(ӧ9rNNNhтkǭ'εD Wo_ʴI%$%DoǎСC9~8n2N\ƍ\|Y{y+>Sr9*'O&""͛7Ӷm[֬YCVV?#jzvH&lښZΝ;Rٳ8qݻwcaaANغuu_^˗y\sҩ%$$$$$$$$tH,!/pAK.Zʠw1u:oHOO9s|Yd /"?8ٳ={Jo=НSoM2Z .,,$==]9r޽{өS'O.z5`ggǪUXhs%00PtoEr_ #$ QO?{XXX0p@GNꩬ#Ǐ';;[GDDoЦMꫯ8~8yyymlry8[< p}QZZRÃ~;ҿڷo tؑ#Fm6._l>*yI%$u|wkkk:v숣IfCPYYIAAYYY呞J"//{"[l!33 222-tQ ʊ6mڰyf^{5ѣGmۘ6m{Fzɂ WJHHHH4 uYJJJDUXJU*KQP(UEՍfeT**oͅR0f+HnF`  z~m>$&&4-ZOHudeeɓ'ŶHgΜ[n,_G7_RRR򇢬u:.]Dff&yyydggBO>Aݻ7vvv;v'OgƎ tBw}+sz"7X_YkZ'wm 㱻DCﬡVXh*J_/ϝ9$ {UUU2fZl%Æ b;#7Tux6ɓdeeqy|M^z%Q6ojPwVS]åKĪ;wxLVhݺ5ڵ'穧bȑIIIW_ʊ:wuH,!!!g)JWRRSYd$^o-&tHؽb 7V'?t_5K_;sH,!qkM^gΜv!XvIW\P\GDDOrJrss9<ǎ͛TVVa]$tdl;vl222ͥѣG#-[g___ ƍc 689vgϦcv |LMmW.ESWE_j5P ?W7|mzV:jk4l:~Өw~Dkkj5i1'5֯T$^S.!!G1`?.J6z|פw7%X'I4% =sgI%$6̹U?~<GjՊvѪU+/~~{#ݟ;233?doΆ  b̞=]v̍7TWoںHJ 8q999sƌEV֭[~=@?H9|eV6'9w+.K5~U[ih0ju uuZa~u 1V[դ U"׺NSgnݺ$$$$Yfk¦)6`9EM."78HN$ =sgI%$`O?1{l,--K.]xg:t(]v/͛Xut͛79uiii呙ɗ_~IQQtЁAChh(aaal޼}޽{aҥ7#Uk+;vuroګ bc0y<缍? ;СC>ߗP[U ꛀj5u5\S}]~ Zڦ۸`ME ɱ+xyɑ{y%UU 4RSHKM%55PYZ@Rh0rT1߆RSIKӾwzA (TBB\@.WJRf>,- U}T)/"5Ebd~%Pr9r BR)h 5iĆB.PlT(UZFTRSQ7y *Ub+4RSS]*-yk 2)?UCIA $fIpYr/r H݅Bh(V#W풦 ֡ ` sr|ZFMAZvL ??vd3箒ҒJĭ{$XB.8X_kkjٱc Э[7:DUU?#Cii)_|r'''Ə3<&mn޼O?D\\ ,{<̙3>˜'N 77 gӦMtؑ3fŇ~G}Ddd$6m?d߾}3j(VZZ'd6BK-OK߇=ҭ{źgO++:!i5e+Z[3L4 =qtVnj&'ͳuG'ĺƍ|(J)--mIYBBBw`&8;JpQj$ `m%=M2:ZmarQBRA⧣$Ua_ziaB(yiZ8?R8=I/5UM O"E{M* ymֈ`33Fť$\~)e$|MJ$^Q}\+.]D@@ `ccIII!99dÉbǎ$%%akk;G3h$= }޴l׉ң8EKs|K)i`jkyy&.]ѣx{{#9r$ƍc|g{I`  y{YRR 2ygܢdckj DUIWTBe x;~ӘDŢ`e6[NP;\l\B̈YԤ%32"}Oп%=̨,jփ LFpZcAEʓA]h %T3wO6߀$wa02l0ڴiÔ)S1(TU3(TXXȗ_~IPPgfd2nJii)O?MN ##C|_jM{%%%={BHKKСC|;tԉ7ӧ9u|'DDDsN"## bL6 p,ú:y+pZk70.>xp7حފ`.`*Oab$z EXXupw!,t/as4hp;wwޡW^k׎ݻӡC:vH޽8q"6-Œ3J$,$rP5 F3D3?|1WXH-,R]Iyi!FUQIF5z5fE&$ViRcSIK5#sUQ`,$JT(- (T(D#S7-<(UJ"H**4M]/Ҕ1s$9ڨ.I1^. RUғF0^!I( HK26ZWi*L+qL㨴'J ҉4X>RIle&5w$ c ]lqq1cƌAƍG}]}cj޾UUUTUU/7ߐٴi ر{{{Zj%;ߺu Z2_Z`sՍY'55呜,5vqqaرL4s=OFF'N999$''ۉݝYfQpVI=lB.=?Eld̛Ş۱' ˲-p۴נDo=2E+< eD-Ƥ+?݆OG'iѮ;w.!;si vhү.}-yݻ7 ХKfΜYɓ'ӲeK&L@nnX4K*%!!gk$XCrXè$HTE+4ҊJ45ju8~4%> 8/O/ROOB$f$JD/g.zt) ct!E_ҍDKW{^KQMZT6xT)ͷIo#s X.2mFF_qq;i{_'C<͎ISftQ\' ,>xДr)ņWNs6#y@w!I]Ash/#F2UꫯP*;v={n:\]]wwwT*?XB﷪]Ã#G2`:t@ڵ+=zCՋBN<)###ǏLDDlܸ˗jͯ\,qoMsGanAL3u2pCcp ؇w8|}@"27QK`.>2=wg:}e (mڴu<P[S+_~RI׮]i׮!!!"K5l&ҙ@BհL%Aټ~3o#MxD߹ $(MmRT[tF=KMRrkj*+)).Bdk sXÔ{ 㨮KkS*I2ba/I 6?k"ĺMhme|G?ektǛ> FYX {PEflz"ICeE-/I]ZOךJKK:P -j멮(#O>FnݰloMdAC"WѲSg @A)gdIĴlٳg}[lձ/Ae>6[]x9oڬeKK||q<Q87Ǎ8E#_6=(MVSJ3- S瞞t~F&CTRkb)i1Gq>롦ڴJW^{&ZB(b,NS\.cǎAhE^  ,Yú,cD,%`?KW*`ͰaO}"Jrr9~8|Gرٳf#P[M,_ v]ya5Ӗ.g/Z جR0zaw8>DD]bm\6Dz8<7ų*0gPJFpR*l<&2ԘH.ɲ3OxNe2S [Mzw6^` F.#$o\\јLS]QLј4.y"2mӒI%$"r9cǎkkkz}݇-rݻ# xbMkII dffre"##;w.AAAe-[B*,3`uOM|ׇc<c!V²mq?N%`vU;O \$#+ 233ATNNNdzk.7n@]-׳x fyM4ռ>9Szlk76^;Du"lƽl)P%蟈s`^DL.ު+SؗT\IF[ԪN =J|~͛ MFKKK *KHHH* 6 ~Pv1+uț'MӔ`hH'!XEwmG [Rcebm| 6d2F_mi0L&%2jNtWל5l]aR4M?25m2|<:yS&e2BUzsKHH!?C=رcټy3111lٲ 2bL޽iժ `mm%TVVjE4u\zJũSK.tޝ3|fΜĉIKKNSZ&##'в5>(g9"[EΊǖCo֊"Q3(\ { ߿%K/ӵkW1ܧOvIYYIQ:Mׯ_'??&LypttdΝR!CqX-&tp qxl="ϭO(C_!ͽK΄CnFY<&ʯ.%://J'|B\\wfٵs]ZÆ>K^0yf˸Y.ʤ+ 'p< 8nE؜m؇p\}pycnAQ8G9 x)"8\6ųjpUCm۹r j@/I8~8%%%cjATNSGaa!>(}k%Zi m& WYLrHSL-0:~Q;9o>}K RQ5AH23*ܴ`u6N6kۘ05"_ RҒD5e;RV$k,(LdC(C3sT( 6'. TPӊCMDţ70 %d3׳aN6 x Ԑbƾȷ;qfKH%d2uFVV]ƍ\|> OOO}Y:t@˖-ׯbۜކJу3fsNK]Z[ZdFcKlp۔@ mJnAqo7X݋w8YLA#X_ Cvv6JR>^lsA |o&{Mqb!6&n{ Xc6ظe[X|qЮ]˶$y?nAqK@ (Qekwc=`;;SNqxXZ'(Jrss9|0DDDꫯn:qGtӏ92Of1n &wnC 2`Fc ;.Y'lƊޑ8DaH}qc~u"lPez"W;}U -Z0vXrrrѣ\p&{  L2Etk| Zm)kjW!I]©Sx뭷ܹ3{ }U_Tt)jE~~>'g)&##lQHJJb„ ,X@L?{,/VzGޑə*h{8/ ;iOqσOqSc7ÑebX^dk`>{l7Dc~q5(wE+q Ų?u1qBz`)зo_ǹs8qDoGmM-ӦM///@+ύ7k7RTXBBBBBB߄$w ,_AXhΝ"uu:\B^^$%%鉽=={dذadddpu}Ŗ<:p$%AO Fhђ!#'x}k]Et Q{(\bN~8lw/v>,\!|yq-5%}9*\ERf6*)JG}YhfӾG.\Т5C_~iK|l7l3c?x*20xY L[c/FA2`C<YW(v^Dc<;H7x71AXİ㱴_D+'NG~~veeeKKK>3qM{^;r+$ صko߾Q[S+J.Uo,h\/^HZZ\rZjEBBΝo2Vw܌y~LLufNlF*;[qrFO_#/g^Scys2}wjS4,]Ek^=Эv bٶ<Y82$od*{iz)>Lvv6?~ .pEz?AW^\zd|Xr-~'***()) =ZBBBBBBB߄$wxzzҩS'^~e>Q4jH`Mu ?$.^ٳ5j| ϢDC8jS&aiقaѲmmڏ_<8mVGE@6%1Z[y~\`ݶt.:ə>>̟?|Cbb";G3cj&]w=B`6/X|#X}-S+3x# ~nNan{ c6{(Q8npӦ\PMgPNw2X[[3gJ%EEEdff? 1sxbAw5x@?z*~)6l`ժUL<9s`ccÜ9s 3>\BBBBBBBnF` &''3dAXsM.\@nn.G_~lܸӧO/VWUUGSˋւ@xm-p;c<&y˶$QO8}D Y~[!sc,t[EJɓ'ٷoaaa]9s搖&~JIIm E+dSl&s7[v ~v4{ `sYk9(HQuNuŲlWxl:G`<.vO>׏Ŵ诿Zlge={Ү];~hKX(++#11 jՊmҪU+ߏ\.^BBBBBBBF:MZ SESSP3ݹ].øRII ws 4{u Gtv/^$..Co>J%NٳTZ uPUYM=PS=ZZc[ p^,+;"-vA~Ѹ5 ׀\< ;nK=w3mos!ñֆS9dkuuk8y$޽Bo~״~^wd^La⵼.ClvcH18FcݖvN:C87ݬi}cpv]({ѶTr.1KU˞ؕV]c'H$9J呓umDƍI7P,--ҥ 7U=hk Nՙ=Т%Bvkkk,--6mڈ" W!I?ȯ*MFlu\ށP.\ݺucf*:xښZIHH`̘1( K͛GBBՕ7Tk]j5TVV21FLbxE\c10Qu/#(k0u73d+yiVmxW@T*E V*ߣ`L:XztlucW.^&-^LMn؃w8nYk@AYՊ#د avf9ǣѶ`&rc4n~axG;pm6h%/Za](![W-}\8{\JQv}-$O= 0k,K=qH,۶GhiEOAX[[ӢE Zl?-۷o'++SHSUUŮ]HHH@P͞={8|0W\2ޠ9qMuԿ_~T__`t߿q(CJ1c0h ~a222Ǻjk租~X[[sҽ{w&O/*oRsK+W ]8m2.ˣ'xGX8mX9E1!"qG v䍅a:"bAH;Nsb2.%:''lGdd$vbٳG|pP[S˃Uk+ޞk,Ly1n#o,\4 yaކp,n%gxt8ۭ30ϠD6>D`ﻷIH76º JJuk׮<$QVVOEpw q$$$$$$$$ HRYYɡC1b:tAh۶-e zׇy^gwhiO:z@I}NXX:m۶O>{<ݛ!CеkWڴi%'OFT)uXYY1i$lɓ'{Iա]^̙vt(nqln|j#A 8_l!6o9d+yiݮ#9 rssQ*bk$}V*$$$sN>CO͛qu:^Ok%XjOWg2i72u f`nشzuk7ųlV>eyǬ ޏ6;}d2e*\aN>_|"Dv)GDYȊ-ɬڜȘӬ?OW\|M[nQ֭[!հAloPQQ#tяg')K-ӲѻMה^HHHHHHH$槟~"99___~mwN˖--Z!Xu':wAh߱ J%AiTF_3l0A`lٲիWd&LرciӦ =zuִiӆӧs9@R}]=^^^XXXk.Ν;glp!QSw8{EqU{v/@ ytNyla/f-]Ljκ<9*JL}mi`޽Yf͵kaC@]'Vi!ìn_Y l?;=,Ya(\ %tGxcYxm=GeT[~Ȳ}FiE'Iv 90 7Vl;{@$ ^fEOYYׯ_>vaaaҥK+WjX`oBxy*m=`і7&NMc~W27"I?NZuQTxGBl`т#o tE<ȣ[޽R7QI8 <ܼyM~r2228rwLJI&c!/&::b ,,,زe ANoݺm4[ȓ`op)0ǀ(\i7}ƚDm7ܜ5l dL_צ`}}L|J#M^^)))ݻ}1|V^O?$^I^Uv |t Һ'ԈyYt W6^tGևjfF-%>8Dz*8wEq-IDGF?[YrxQmR|" ;n?W|f3uQUU%FwGF\o׮СZאqLƄَ79-۲sGk}Ҡ%$$$$$$H[k,Z"X²m{|ffFrÃhN:K/ƕ+W$}FW/ЦM8 ~V^RRիW9s &..[[[yƏyUU\%q&NY.Tpod]PSAPPbaV2EA$Q*˟(r M~}=Džs9Ͻ<5qD͛7|}$Pj: )ɣ("q_i3O;>Ƨ"܍OtZ@(rsAO|"N>qغD`d-N ܵ HHԩS-pRSSٷo...kI6w 8 gkHԻjܾ#0jRl=N `C ѻEeyF$<}Es}2o~gL> y~qkglwGs.VsYb3QiH!X$aic}! ̟?Ad¬@l]1܉=" Oj}m3$L2$L& PcK ˃qp 'N>گ0oqd5]GЮ&ʊ Yfn}3+yƆFEg{WUUQZZŋ$//~˗KdpSPM=;;!)3`*Ұdi楐g~>Ʀ03^g`za}zh$>:K.q rrr(++ѣ:uǏSXX֭[ٻw/s @SdXcFY1r,Z3t, g} >>`ix $GVډwxGAȆlw?fŦL\I8s;|VFF6g>׈]".~qGzut|b XZ+a;F^I:ÏjA]4>ڏБQ.5iso '0c%~=LI&dI&$C X'_b9c 1T T|鍶ɓr9{8@HH۷'00lH-~HFPPf7dܢq1)- '&K ="Xfs6ch#3k7-|}t={>gRPP@EEƁۛG$Onr o3y™kLѓ5Ui\h־!+ݸ%!Qd"n#<=Fz&+Эbcv.8n=1p)<"XpNgI\{Ȼ$&ǧ^V%هa#u<A^AN`\zUa4<N@S3ii>:e˖К];w7Hd[9pzzzkܿ۬tHUǺPyE'-VlLckcX+@zV O/.Ao1sictXB.=MEEgϞe`X`+Wlq_0=3Mg#/ G^5B. fXpβ;’K'.]'6ŧڛAVoLu g5q\NJDVle]Cߏw^DɈ"[սv^7yK3ANeuLLL 㣌TW]hbF^5kWaY^̘e1UQPUa,'QA&dI&dߑ .r[l|2kCVѫH&+6f L"0.%Qhj8Nx @|'Vn 8Hķ~ 7?sE+9Bii)̘1 R]]ͽ{Ry)74[79j :֋|ۅG.DloRHb`K=,ῆ`Nff]™- gJ2h())ɓ{n9z(6l`ҥ,]DV\ڵksf kE5 C&:lLݱZI kJGtixNi{x2{N+6ݸE'!Jo^C=ټ7Y˸) xuǛ2w ܐGT:KBSXzMq%L> 鬌ߎb_ƚLGC7A.1qH"Vζ`<ŰܹEX lQ Ӗ1aByUy& X&dI&d B)7"P/7#ˣw0L5|?6Y!XBPTGEAEϗք?Cl}47Ǐ'%%Ef6:}T˵k#77grQO.\-ݢiJ}_>SȭxE'xV֧|zE#<@_|Yj+xaocMӭ`r %%%cmmMDD6l`KPP+W$::q7n@w4c<]3t f: 0`C0Op]cA@ƘdQ`Ac|bRXj+vK.\ۍ^|bR\iDwU2XD6n0d z#$ψDI"ڍWnib.+7fP: tٽ޸2Ў\dAqZ-Cve dI&dI1 /TcCz[cC#55R qzwECg% *uq CLVn;ƛ٠ޑ3c >s@l-d#?O#44UUUD"!G7_rN^/fb2cM-zBGodSa%0^Oصz^[XE~̘Fc5j/^̙3}'--GRXX=z4UUU;w===ίAPD}wLmxu'1r)6[.ary2{/&:x7eL@S?:hi3` =W*~IxG$gT*ݸ$("d\%"CLgbHMw(}va.QuC(R슽hՎ&s*El3m=0U9 +&:xa2S'KlNvFH߾}Yz5},/Z]":b֭k׎ٳg njjj(..&;;K.FܹsTTTp~_5Tر'MaQD2q 86AKbn/"1VpS }ڎH̜}1_N!).]/$77[RQQAff&<_~jjj{=AACZ0đ!n60`rFۺ2bK?n{BP+8. mfX Cv# 7 zD#*=E5CSY1XtD{/k0\Gh÷$qpT*x'{xE#6鼶cWmF{T)b끱/Fj`ktA^nݺs E&dI&dD2~}yt_z{tFz;~qiM&W4g<}G1H_6T+?IK66n @7Ni\mԟd]}Ѻ>8U<­BBB۷/XW>r<^ʱc8s yyyoAee%ϟ礡5k :,[T\v*#y[Cw<pY]$GlT\"ۼmxyE^aLYHOt슒JS6=z?Rilɹz!8::Jw}]=ӦMCEՎ`% f``}k7/Gɝٸ1Vs A83b6G!hh"tTE{X2,5S\qLfYx%mܢ5r Kbx=ϸTDQXNGP&Lr`*VDdeL %a øDTDlg":vAAzLqޗsWc$i ``&4ATYt1W~l"/L2$L2/ _"5r1_oN3xr__WOii):::H7<x!W^~ì^%%%FɊ+(//޽{1AE+'WSuxai6iv߃`ť"L5}ir']lǑxD"JayNRY9uX y1h#(tf;;;|Օ+Wñc(..~l o_~ѣG)}ݻw_~xx3D5DvWEy0ڕq֮ظch煡+9btF7 Әt^ arR1鸆$ N+&טT6d]ܘkX|?z 2@F._O=tn!HȦ=,@`*SӤHSFMrc{pc7fA} Ek1[Ų(\Z(V3s+/|}$L2$L2AKjQ|'tI,76QnHc3~=?w ,g{NkxB,tHøq8wwUtBBB}0i$ߤܺuΝ;ܱ Ky-v^{qLBKvDQ)O~WndٚmxF$Wn<pJcIh"vMh!("&_˙xzsG"_~9׿BAA}K,СC|WIQW[Ƿ~>'NV7"K.pqؾ *}k0ÙLEyad/b]0]vk0 fc0.=:v@1 IDATcLG%f~of }vԣ+J\iOfΧ04zw:c 4KLml4 CKkzб_w<0stXy`乫4 3b0I.X{/1Gr曋/x$L2$L2AKzC?LY1Z];+IxE?>] ŢĤ*6E^џ䌚Fw:u`k\=RBj]_ bPZyoT -\{!?#%%%SRRѣG9{,? nnntKKKJKKy\vC1x`iŋٷoܼySY?Ahc~k&8.D{O#2}R~r<mN\CmΦb8vۅk[!J(vdA8:۱mV>:@Յ|7+8ӧ9u۶m={V~%z*555?… dQBǞ mhkLl}1u #;O&ظbh#'q3`7fx1 G/ ϦQ:!)ŠF̘l `cdnàazڛC3#aL7mDۈ`퉱7f4w%fsV0}q1[%+x]48eI&dI&^r %R#u460tAH-;O$`}|:^aG`|*s}k .[6mhfoq~ZYqX tJ܋44J۟P@1IXUVV@߾}@CC=zн{wڷo2;vstЁÇөS'Ak׮,Z|{BCCQQQёwR]]Ydu7EEE-b}t\%c:2@vLr`,ܡlgx8- cl0 'fvC–:PЮBu4i׷ }chsMd+qt vy(MuflWFY1`ڣ:`ѧ/3l 'g70EV`j狉F>bŜX[墵X,bYV.k о{?<,zdI&dIP2~O硪IRE=L\?>]'66f>DlkWt$))Ij5l_d>7nӓH믿ڵk-bJ(vvwwGSS'''VXA||<.o177gРAAPVVFC)))fn$SgDRӚ'HmN?> 4\ng34z #*:;w3"/cǎst 9's).-!;7'ST$=z'ORXXȭ[- >ZgΔÑ#_ri~7Qǡֵ?fD+c䅁'z^Lph;c2r2xal] F6c6Y>LZ\51kFCW|MwGM}Ի!vG}5uE5:h 0TBaMubT|2;;ofݞE8zcf㏱7FV^x3L (;#5/L2$L22J/^# =\DӥuKN.pIoCa{vѷ@k׮5bU2Z[v% h߾= .,Z7RTT$M\g>hm G]]ŋs))pmn޼ɽ{(**ÇsNpqqa񨪪" `eeEyy9/I͒RHDٲe Β7NgyX 1),ن(v;^ F(?pkv[$>Kxը-YYY\t8sSE=ɓ#',)XA._~%gϞ%//3gp)~}Zg@kSFAAG),,ŋ?~_8tMыsWa`ȘrG#з C[?a@&19s+3|17_F3#г= ^{Om0`4^7lm^)6^cG7a`#ŘX2aExc( tN 3b2?!LV(ݺjr,/vdT흫TTTPYYIeEog/T{G<|Gt\UwOO]! ]&G~ O]k џߝUTTT6]*>{jܠJ*q;K/ܱcPRRB^^mmmD!dkT"nIxE'bÇ(2T67n7; .ʂ2_KtX?|wٷj-XbQkmJM=RNmͧ!q+~krSlV'$j*`F9j(<?^P'c=Y-rF3n'LX2z*++9wgϞŋ9rBCC7n PVV/|uRw7F /@\n5}KGx4OL2ۼ'*\BSG@g:" tޝիWK] '''\ϧӧO9qTTTruܹCMMZ?j99AW޾}K.QPP@qq1gΜҥK>}(uFpp0.\~h{.$AC=GQRRBNEGJWE&=#wd^rid ѩ3oǎRN:EQQt>呛+mTTTpuye|w9si­+W];py1BNZt5X΁[`+ cDYݒw\"&:bD6C`C[L`퉾1/mf Xղ0{WQPi de}@} eEjNf˛ŨjN$n௼aV߭眞}/_Gdmi_Q@--!8ҟ 9-1 XŵInT _/;HW#*//gРA sb[ݸE$F`t:XߘIlHaxFx3!)Ҿg~׮]+,(m R__G]]-55:"aQsvi65 |Ǧ@7:DgΜ!..ٳg!uGh .Ws~pVeeez-ip=\[o߾ٳg9qǎ… \td틇?~mMjhg,gAAAqfSM;zO nޞnxFgCSoE~~>gΜɓ:uBrrr&77R;~nܸ7|#|Y 9~<ZG2 }˅LvIl`+bt7gVDRP6Jd'CӀIm7nxb6+LtyrI(}5XUMAI&a xdz \{5翐>O%h>o}~̾L[Apk/<ӹWk/INN`yAKw%UUU,}[\#*QL*D7v/ʼnK'$Ltqmmػ9pJ99zT CAQQnMmշm25ֵ(#s om_}%%%3v*:c4ҽf9az:7(CNRôiHKKݻ-h~$sseee|RRR9r$ӧO={_Uj5ZFrrPRP@M*ֳO=jW$(zz* 2[qPXXɓ'[PP'͛7[ٻ_q._9}҂\8WN^I$ˋACtS}7mh<,=1{I64i,ψ$|cSؔ(f's>az @IYey.۷/ƸrJ2228|0|#w'cvߵ Jɖw❭oΧ~ʑ#G(..WJ%%%|l)--ܽ{Wj}TKAA+V_~0]sg2AG(bo(qe dWWWss7).))atoooΝ;'}njvEEERɓ'qpp`ȑPTT˗[$oF,'OBNELsZ_\̑EI (6bt77PϩS[PPӧ%%%%\|Y0 HV&ڕ{q WRq,g˸t_EغL]*uF2dd&d97+1Z1~r\[6bm=V$kn%6o灑7f0wbʬLN+1dT @P @:ϮL2/ܨ$!23I$3=CG(ǫIY"3=#9eܪVU9ŔS\V|n57)+.bʫ$֥znTQ\,^\~ZQQġL2N/():P}bܑeeWp-A*9t0L233HN1W@,o@ 333I⋜bnV?zYUNLO'3>7RǷH#fQVnuێ+mw|Y!1۾j/#Uܪ'۞ Uy.x\>w-r38u]B8[B̖ٓͺ-GrOz%>%.U\~s/yHߖgˮەtB>?w6G}nVjYlZ67뻸wjAQ!2ӟv,+8`CŔSqnz\Ujr8IfZ:OSVE1d_&^h6kQUF$i YY"; \ !2IO~MY _25A{. .ƭv3ݍ_\v4d'QxFO}xGoL:{3|>i, m ہ2z2 Ubw~TUUԩݛCһwoV~ t՛>گֱ#]hkk3|p ,[{=233)))iH[jfbbbB1bzzz 0QFajj=dzqFJKK/`ԩ3`掮X8{2ȚCƣС<:Giii߻&55]]]FA\\/7{,qa~T+Gܺu2),,FEzz:?+d<=zh!wbj Lj tlб;Jp<yR vO8ɓ'˓Zʸzj['U%dQyà?;gH/!$$uuuA@]g ';2Xf5]g ܍_\FSG/n?>S ؘOd!g2, (_II"JjŦ;KJ^QQQSN5 [[[֮])((Ν;RKq]mS!ѯt|GK4IyY IDAT]Ҿ}{aʕܱ;'90c~gx0v C&LCSg>}OvvGz} 2w}WzNqsX~<ٱcVVVQQQAqq13L\t"]44yE{*j M)JEyb{Q".9ǹsgx69 ` S8wK֒K%=-oF}ăx߫ן~~9fճ;#)C{C3r)Fvɧ+kXmޞ7&Xd8kDOL]ПD #hz=Q eE迃;ynLV;τŖd>m,o!Sq乏p9c~V,zl \c>o_x!ce?.Xw:nk_Q*i{lqb?g֕kU?|\xcG'Fvg㖅4IAK6wy^zaNN^u6ߨT73& $DM=,Xؽn76LcRߋo^B6ƪMk&lz3~x뇜8[r3 N=إ7?1;Aуݻ&***SBnbʔ)DGGRUUÇ>b…L2mmm ZZZҾZM^^~I2ȩLl<1qXD\J#ط+rrrtܙ9sP\\ ] a̛7G!r(hLj#;OL|0s$;+q~^nm6qS'o'.4΍15l BbVSW~dO!46(.L/Y&1PUUj{)MRUO֚#ETVUs( 7!'?Q\^FvV[LϹLͭTTVpu**+)tr*,~Vi`t0'sY:$]\AUU9GXԞZq}NֹT?ןv'?6YYbT2qޔ;s4Xݒ'ٲq?[%Rv}潕sak]J*h TVSuZsRQWŕTWpɯIMm-շ8~=׵sYIv<=P蠊" (tC>#4|"b[ybd%b4w.dQЯB o9ݹq W1rb]ݺp qTck;TߨO|kUXXLM{n8#G;-Onws :BS;oWʥ{w /+wLXQ釩-7:G7]nןH.]n+~?پl1֟9^FSK -MMN9ȝOuٲ;^SҮeh˵NuV+wWt]R@&z.]*e+ }3đ䕯pu9Q$ Rsz7dfYGX,\U1;99qg$$ۈFc`bGQL^ȴK𚵜iKp J+y8b3){Pz3 *cn>~{ I #mOVXVwTT5`ck2ه0ڔA̙:鉌?C!PPVESo"p I`g>6јzMAIAWh{Yiiu?#555b D"űde̲~WH3:` z`ffF߾}˺/6ݾܐPuf8;&MGo$uy3)pԊBvً7 9Zbڵ>}*8'8r9A8pSN0-)E_8q?sgB!mH7]#z7p-Ƹa>?}c6DE0)l>Nb\CqW4 ?%is/'awcRH"V ?Q֓dHAcuT5QV̋CEEEumw +_? w.՝j'kvo4tVf}:VvJ!xGJ]݅{t˵m{'\!W+yRS+.\QwϟKOr._FS,>;j t>.:!B{ﯗ3OCD?;$>թ~?"]ApM}x=75xRwS\h!t ***O婫ρC ~ԡ @lݺuuu4{K[hΒ5lC]Fbn)qEsJI+'.QVIˤvѩwt׽ÂXXeĤ>3hfGzEG7t7X[g[@2Ai/)hp 7is8O8]gSVCleeŊ+8Khk};S[_9˛odJ* 5eLb4֎xDp5 wh4jz5-xHl0s1vIFaK>0$#}9V:OKJbcc---QSSCUU:o1w\N<_ҒA1j("##Y|9/"ǎmr5O3c b(,)!b뤬M-$3?aDFFRUU%c|YrǏw0M-\k}NҳљƦ01;#c+caDL=`1z2^op \Q=}m82MJ*F47pk(MͲ+_? 1*,Lӵڎ%WCpurM'~>a_N.nԻچ>n!i%O,f. 끶ĽVPA[Cٲ ^:/11R{=o~""@PFh`>9NSoo 9Uf>AI!cpˤ4CUP*bp1AMZl)Hc h{R%)x?uuutuu $$pILL$,, &0zhƎݻ3w\.\ q{v̀1b ڵ>HVk{/iiV8qsz1@_T4{h3_+)%.-D,dՆL(q|駜#GP]]-ٳ\~c3`M`Z$9HjhoO*>bm^._K#c;C51 .9ޔUcf/c4|$z1k^4) 0k2}$jj++ :o?#^!aj7[QqOr !=zǁhR&뻂w@J>]|ƣঝ.w֐B':'m~ O m_{ߑZ~} <R[ulyHυڎiO9wIOd.r׮]W^APV֤&6{{9I-1 L̪MgnALItBfXZ~֔!ZSFr!ێ(w'7IqnR־MںHFZV +6!#0|1fN:A7}1̉1D"?a%GxF75>:AY?tX]޼Kp̬<>腫I_+7&͈s&.12#(,|a'b`dah&cɔHK"8`l;A;cFr>aƽ{ Ay8pW\|7QUU޽{)**b͚53vXqrrW_ݻ;ÇkqEjkk9e:ɱc8--D'"(=i㱟6[ihhh܍X~@V%Z-#)s= G (u#/3gp<(^i>:_%X[6WR575KW,}~4zkE,\k̖|}gϜZmĉh@AĜahz#TPH!'\Nn2wT^A %tC|af"es'w?^ҥKe^*^uVG/\ۆ\K{C?0.p_?s<<z BUpUj׿^.3xR[j\r}R@SnH[[hnjz^wa"Xy JI[[Ng"b7j3qŲ8g K:Vo!im Ik>$.G/i#m>{XP˞{Ee60;e1^ 4Ac04 c3nA3qMWk-~8{Pg0t j (i (`ccE\pAYmknV)H޿qsCUU %%eX07$[L[_cL%JX@c{@S|b$Rˤ-Zk/ΟF#ɓ'KfL$!PjU__Omm-wy|F/hjj͏?ȷ~zn|]k~3ra B8zx136$l5+Yۏ AM$2}g"(k1i*'KR-UUUoxh&n5??QUyo9VsC:њj}y+|^CU8 WW2/"=]m%AA_֭Y/s{\+B n)bӹYM;]j}x]$Vg j~VE˛tZ? FOBjjkq3K^w:&߻rS.t.!AgϋzsSjSeZzr3(4Ri۠7n`>102;ƶio\B>9~+ ML|ِF9[eniH-#1wd䗑TPFҚr֔$o#>k+ I]5{H^-,}n/I5XLg0ȱXNK@3q M) {?ɰebr&\羬c@cu kb=cXFXO&nz2九Jb t5bT\"Tl8Xi8Eѻ(tz룧Ճ+VpN36oތ thUjݻwy&ϟ?~gr1Ξ=+^^^\$qo6ghſ>Ow;D8}.~X;OFEPbh5{V"-$,ujm`/mj -`Y`Y䚎iuLӃK<\Mm-MHM͒qKwmlr 8*WWQ} 'N#TT|JUU%Ǐ? < ASS 5nJD.|oRQ'.,Gb]Dmq-dS5ۋzwA0jܓuSz[ӝz*qo#J;҃ ͳ q{ wZV;44\Nӟ:J i_VT/~~]RÃ$.`}xo:>) iS[7mpM.]Hިi"81Q>O3jq$_8UHȖ@(-42]Jj$g$)c;rsrXYv "bK_2b"m~Yk"kRڃ$8/x\xdSp NgF !(/:yIm44mm޻k^bPCTA[pLtu>53~e1NugqXa}h- {I#qCIIIvZ\!mZlkN8SYi IDATg}Ç9v| : 6pm26C[ ] SK;TEpT19LxL-P;5 -N|s6b3AU Ν9ՇdFX(pee%_~eH]?S }ZhFғYp0KAC-ڀ{[exh_~:N:ɑ#TWO+ȑ8pÇk*>ڳ|IiŻ䍫$#oQ9DrWu9&{Y[й'sJ_@ 7v9b]_/eS4ɻο^̙? ^gz72aj~ S#3|Ù(U9Yw}Dd&fgFڭDef;qň3QKd&H2v'✭q^RRWoGSJBX[D,db2Ǝ2#3N]&$❌۴؇aULpfnA 3CAU}>#Skimis]~Wf̘oS&2%A‚Y=D>v2q&vL N;EX&4Fx;`$¸ql\L}~*Fܜߝ]A`kK+׮]ɓ$[%6ijk?7wP&1=.L\´[%>17%Ueg 9$d?|x)96D9I-#zQ.zSG{wR}*>jin\~'Oʌ8@edWWWsa=ʉ'x3f qqqm_}eOPHgE)~T4S4)޽1|RM,\WӵNѦGkmWYI`ęr<>Ym7: Ͽ~Dz @ỏ''ig};{ 9/W~q]M㆜SOv=zT9wIϐhĩZ\[AaJ(>1x/ #Pُ1̊\LH5e!FlF1$];I-!6}3qEg2DY[M,$ON+PW,)%uvR ]85;HJ737ACQO㰞{H~IL \mpvqXc+=8xL=t:J*hk kr_&IE~+[o }["&-nl 3– >ɫ$em)3W0̅C1fB`~'aWFsEW/J8;S^GMa̙ yyyܼy6M9z(>/2l۶4thgJL]N@dqD" |!#l:$e?pؒԑo"92ʈ(')IAݘ9;O9vT>r ʾKnܸFyFb>,{q-~.\ɓ'ewiÇ9y$.V[ 0i$N8ȵEk饐B 9!jRGDL#kSS]IEEյb?rSղHpΦTuvmT#]uՏZJo}|*vŝSk Z]u/e{sʙG Z *r|١l>uD8_8^T\{ۧaE-.>>{;iHp:/yIniɷ Z˵v*\KRsZY猊;ul?=) p۶2lmm?xCq <#SQeq8NΜ,nd~v2^ JHF\F+c^FR $ +)%1w+RtِpbI2I)&m,\&KJƨh ᘻDŽXDa럀8'_46Sg{HTz (0bP^XjCz[i۷PDPQexW\ ~qqcUI 5e|" 5 ɡ8[/Cp8յ1ӗmh'lݺKKK&N޽{illiX~Ϩ>ӓR_53CGY{0/1Y,?r9^+ M7TL>5xK$eo{i$?6}3pRv) ֢mH>YαY Ç/$ OZ۸{.7nիqQYTѣ?~" "7=h ֮]+{0$=/HVHO-w~zpQ7Mp7ee;رc;vSݭ7p'DSc#45= h[pgwO\`׮sL>?pW~p/݃忻_hllnHkOp-yo=]j5I['!I+WaAIp]`2Ұh;o[W >y=+YY[YH|V ٥DdHWiZ4+I\K (.-/a)HsJImD%g2|5J[q'a'T}S'bjxC-2A;x3JwmEnJ߰̐18x' 1fĠ3ap e o"̢5;XW L ;p&藄W"Bcs4uτSx}47p rss144LJǏ˜z;b{j_pAΞ=Kll,˖7eJq$MI_]ߜeGg%LqL-+Wr6!.'.H1.HWEHL=±jkk9pOw~[morI[knի;w*Y_P7|<4"SDR5Q+obSZZu}8*B ,?C냤V~;cX9|em!jFī%1g+^/4QfvBwx]ky%쟆_~ 8ʐ Dѣ'!!!|G2 pqBB FcDT\.q"ZCf3ĬI,&1c+/Gx=Q7PK7&"ql1Esr&G`b;!ftQﮇd6nO?̡C5kG&))'ONTر?w}K+Y?vU]0KJsS3W\ԩSPYYƍQUUEII  ƞ={:,B )ΥG=u5ʨxB wKϐZ$O?!<|6ںc^Q'6s>gb=n M0+S🻄٥$,aH+c]lp\FQ;~HIbsJ$zfWƼ\alF4{EL M7QL>0LX9eVU100@$@X޽^}2W$Jj4qkRShL00`Zx˞MZ[ZHJ6|"8ñ” XN}` q |B&vS;Ԝnҭ'#GxRٳg^^^hkk`Y{G^ 瓏9y81۶>c<A7N,,(bAf%%4a5~Qg"ī0s@PVF]KŤm%* Vr~lNR^'#(羦 5UR—A׈J)=ct1 9LaOmRp v!˰I/KA] /|G G2ў^ݻӫp&x&`#:,i!q2mbFJF1K6~'r_eڭL`GLl'X(CRaSc5@T000Y ݻ3e}]ݻtMܾqC*ͷe"jH^̢g&z3zlE.;2fD0)AY@Pflh+$d1,)%f&+tf,D*>|?9r#3ܻNu O޽{MӞ)u};K0=;w˗/cffFnPRRBCCuu@PH!RH!o1nի 2n=8gLxdCk{Ϲ:bd挆hXZO tv"1 rYUCRA{JLN9Ikv".EYLrn)"b sĤ\3W sroP3h' ;%b;;8|cLT{!F\Z[hkndf@U] ՞ paRX* L[z}F0i/׼Jb^9s"EZV !3g0޽ t18TSJ)cƹ2~bNjN7*0Ù=mڀt.],a8ELNFwz"(.SNڪruo2sY)yA: ??R]]Muu5ܾ}$áU xwx"ΝY*[-_Tt}޽˫Jettt8u,}B )B ) MZQ) 4p2r02z 〉1.j/1~Iy'H̠Bpk6&3#?^ 낓O$2YQBLz)2>0͒(QV1 [ )!1RJH*3`\*F3yb&x!hia0GY-s>NE`Hž@KwJ*=55pww9߻wvjkn6}-Ժ)#(ҽ&q J>(נ4]2ܚa,}2b!IJn^eRJhtD8lƸb6c{_L}1 q AO~j$0,jc4Ĉ+8qRi+7[pfϋfK=Lf~fWSFBd?$el,&<9غ´8⳷^BR^9E$l%:+6ʱqFP w!GX"h0p N>'c#)P;n mV^( wvLʢ|͒GPVF讇<\SO%0 ^qZLDP4 ~rĹe,X)s @`4_!b'a8PFZ0+0̜8!n0zj=U%A3s >jkk'Nit?Nka|e1cGu6PH!RH!/E9JUwos r 5 : 5eT[HX{bOvb8%6=i8xE0-tpKƻNfh+֔|[$&.{;1eNbV̭QJBF)DMYf;+ 0:Ug3#.Xz ( L78/uHA5559^C Ԉ4]1N>8xGc iy49( Zػ|Y¼D2 pAYM=]CL9`.޳⏉k8ݧc1ξqPstkj/TUUe\]]w҆ںhji3 Y,^WJroB6brʉI|v1El'~e!љ P3롮 0r% +_,R%gEr0S):A>}j1ב#|]KGFoݺ%;Y~=XYYajj&;p^z%>,ɧ$]_ywt/2gTTTdNyyy|OžSH!RH!%=WZF3-/+h1@PRESǀ!fLńx&(;$lc}P ^1<='p,0ihf'-Qz1 _&|kmAY"V IDATY$fU6DIʑD/\<~V0+) (uCsW/\D-;{8}1}`jDk4-hMaO`BX> L [oBE?Q V4'ɫˉ,&`Qw ъqr@M'1׀&-+Lc];! !:z3r":1Vb4 h wa8y_w^C[N](E-b*&)e&%,v9A(ހa(+$(:5Re!-'9s3JꚝĬLJnR2{һ~_=zJ8s:@)wܡ7x]vqAسg%%%Aʊk[oɟSR/--UUUA֖w}WB )B Iϐ:ً11wFIS>Fc5;}q9({Ƹ5SI*̟?+WtrmA nO@!Sq.Iw YK@c\ j158+7 [U[[ߠB5 pc;.M 53-K7L'2l掌gϨ2A.zC1)p2Yv3Iۈ^*!>GH/"6-e JO30QԴ0<APGބD!+evf 9夤o$&g %ogI^&VNJa3B9S{J>ɓ'O׃wݻM6ŋbL6H455erȑ#=uuϏv݃2z,YB߾}eeeb1_~?5]Rxuu?uu\v矞~ 'peO|͖/#ݛ=qpe|E_}sP}[~]!5r|us|up6?cwx ښa_#ŐA5T{k8fNo,Nq23DE'aԹ&(wJ[j0ƘM3\Dp e tb3"$!yH',u#06 V;w Q+ τL|2X @MGVnXz218;hqObKNAsh-ѣm'iJk 6K[+wAIAIFa듀o2v>8@SbD$lD_DLVWlDĭ,$\8 F١a05ݡ M0n#-]anOߡ&L_aG_Gg|-"!uۆ8y7q6J\Q8ۘ Kn%!336StπA詣 (ab2%*!"wY[Ixvb&6S#a-bCƎAXbb3={"{f޽ܾ}c_@}fϚAOmm{B`뗌câ6~@"ް fo4{X(UPc/fX b$ ^W4$Qb0EAq10 E{g?̜sgzֻq:7i  7b44:HGA|#?saVF|Nfzװ 43ˮ5oq6M6mqStLF4i C#Z[$Нl܇g^?,a8Fn:kH>sQXX>_5̿F+));wfٲe \~=]v델ױk׮! nڴ)ܻwO~y.~wۛfno9ׁ|v}"A<+d/~%p{cX #hx!6di^m?,2`gx;4aۡY!3cnI-o fM hkf.lQ|cX)Q${%Zox2\H';;'OT ),,sq5j$ 0}tcllt WMS@ݣG>}|r=z{YApA NKf9UVoc6`@Tbv ɀHj=?,..oo@(_\E``9>T;oUM1W4 >(b" |Q?2m4:vHƍ5Dt1mى]~S4~]n*=v"9l,MwGҥq߷Y&ӪRȽ{8< 66iv uqb=hѩ7HE,= tqd K7DZ|,|cY~#M`T5/,eABO>9XX"~F?;hͬl4{_'gx3>o~lއZ 4r7 +]/Ed???6lȤI DDDSٳ'G"Ľjb r3I9DB|.x2rPM%Aff&rr3S}]"#-Q"Iidfd_Bm!S.` ;Njw~ G>~ݧXSNΥHRƱݯ/˾)qU;y".Ap޵\N8q62~rKٛt ^ӕ{ཀྵD8E de SޑB[drMNɉ֣[yfbr2HJ'..yA~ 9YdddAFf.b0'OTrqdTIJN#%BbBUkŀϤ>G,)%'#x:'19/K%'HOb2yHEd)"{ sH9H|ջ/.>4947&'VNQmbU^?beee<}}2l0͛GPPgΜ!33SڂP*CUFZn_~G}v>cΝ;' UN+**n]QIK\-;++ݻwvZzISB-tcܒn3a}1#w z9yhvqkkfgҢR(w ,Z뼥}E9Kp\ˢ{=&-NOu^n_Nns0iA۔6݆i ]lf7^S<~. Jh5BKK<+/ɓΝOoaΝlٲ\\\000@KK LZ3tL&a3ޓaξ@_I4iC/[7ƲtAgA _bNfbRk|ApIE+uUs՛,7WBNjB-Mz(|$p2NZ'%%q2-άq5']cá5 cߺSKלWJ㛓J+ORBӰbk<>9315dVZ3N~ȫ(SrTu[_U4c'HLW |(#N7 92W0au/*IMME6l{fԨQGKM BOJ,pEEQQQZn̈́ ذa/_@~LJ6~JkDUd֭[ڵ;wAQQcٱEEEͪ :::h7hP&-hيAfb6S==~N0"& bк5 l'od lݽXIڇy!1xDzQqvZL{gW\l\H;ύ7)м &`E-s dffҭ[7<###A`ňߚp`ٻgb ][ իWrSVoo H(O^NZ\Dޥb2_ځbN! C% UŰn9R:/oz5S9}u}yNTKW 0(:ϟ7Gf'%)nzy#WO !%QX_ 8 $d'Kk(H,dR߬I52GT]K_H^TI>槟~ pEٺu+ ,gϞ1|pV^ͱc(,,Tb?tޝm2gZnL2uiU,x.~Γ'Ox1yyyUϡb.])888ʩSsO<@-!֏|C&NG6mFƍicՇ&h׽?C trvtEt7wyep90ۏa#'`٭?<%a # s}Q(n 3;k?SYjݰu;\?Qn@s3cLҠ t"@-Zwt ;;;O޽tiޱN waD_9՗VC0mG9|poH ٫#c%`}x[~BW `/‒H &pg/Y 4Ч} =hϐ ۋGA|6; ftk%0h`Τ|Czz:~-YY7(/-Y} `M_e  H7DGZM0E@.hiiѸqcL•+WA=\oo:1R.SZKRLMd No\Y$˸TtH!'+M#R+ƴđWDPNwqioVbgb~Wnܸ ꫯȑ#?~7n/?Sue?w?ceeڵk{qQo?|r|||ҥK<~s(ҥKtA2dG;;;,XC矕++_q)iٲ\m:vآچ4@N utU'Zu13Te:PkSxFYsڵI3굆>LתrJ 2# n -ƴڏNXN8v]mhե7Bi FFz466`?9sl2ٻw/⫯"66 ] y. w ŏ3ޝmƪ?+bx=DVV%V8|^E/,h|C^)+`tCYQY"aԴ36doc8,}?нxw!gvLFK͛yS?\\* ZYMs#XdS8@˖-WHKKS{SAɓ'KEʕ+5 [mVĜTf*/ N JRu>& xg 357+]1"773fиqc9644}Q o)_pe066 D^^^=\ooIFXLyi de,'&RIUa]OfQG֎ 6EǑx2̜<5{,4HrJ &5)N)~N/QX ; *=752RWz+S Īlh|Ƒmʀsu:O%L. X+\m/02y TvCMѣ^ ۼKQ%Q'&, }bS"Srsq^_&kKLZkDr㐓Gz&EzT˿]^^N0piBeLhHWWA@GG]]]6mJ&M߿?Ceڴi~>̵kרrUbߚTܹsر#TٌGqqV^͈#Օ0~_Vdxb>dggg燵5L8m۶QRRwſG@Ϟ=Y`iӦoߞѣG{n޽\Ƽ5è8Cmm"==|tӧOr O&55 ._W_}ŀ6Z iֶ=pt } \:-uEW<9kvߎ#ѕ21+h9&~ ?wBʛn"bg~g,>4F6e컁xܵneED4+hnA[`|L_.ߜzkM!WbcczzztԉXio}W5 HX۶mٺu+<z"2SIӔs!ĪNf\*jW4EPVu_z#d:xs .$91 JG1O(K-AXs:{}Y7oiP[V2XFR(u']q[YA ҊUϩwdRh\Jx?/+uPHU#d@eR^u~9WyyD2*ԯ1.QNZE+gO*kCKKw}aÆ1w\.\Yv-ǨQ6l‚-[baa!k֬}ٙpbccIOO޽{se7oNxxkZa:tsҺuk7o3"7om+̙3lі1?7nd4jԈnݺ`Xv,oڴ fΜ ?ruBBBĄvӧߕ  L4IC5W_1ydڷoO.]Xv-ϟCˀssk4iqqqrS9z([l['`PۼՌGakkkiae5r 6lK.72PX;>9s.LYL_C۠CӸIs--LMٿ7;vĉZ2+3}6/^ٳ={˗/sVY!⍓{ C&a%=.40|?$p~M+d/ EDJ̯j2;t' ~,<׺O p,n Qt;޶ut]Gk-C:s$ BO~]GfHZw퇠ݐrP,Νڵkܿ_{ 7xTJJJoؼy3k֬a޽r&UV ǎcĈ79{SPb]z7$%jj5`uW ƤRNJmJhU 3I?QiI a/rU٨AplC jwI+>8Ȝ>QW* XM v՘m 5l^w^i@pMes^U BPM5C(G(&:/ XEVekXu{ϔWo]kNue Ύs"P?&??rN>ŋٹsDMi߾=`ffF&MpttcݤO?@O ʡgbbcc111Y+&+--ڵk|8::bnnN۶mYbYYY-Tt9CjccŋΡ*3[TTıcE2p@oݻwj۷#GSVVƉ' Gk9n]x=z䤱>jYYIIIafffᅲ z1Д9"H^JJv2006C1q;, `܌% 5---5kƑ#G@ÇxNz탠cL8Z 0ܽBp JI6hר>>{~67?JJJs/^̙3\x ¼Ekn80dC\6e):f.&m7cԴڼE/ի+2Ve7\! 1'l_`BE,~4n z輀v{BC}tZ2s 6+8xNm iޮ?K"rrrx =~+grV\@bb"oV7L&&]CĔtr)*)$/UYwj?W^RHnVI K(/PQ\"Y9Q..q,T@&(+j( #crcJj5Ie+FPZU@ϋn8kŪyеVy%Vc 5S[CٜkN%/7\O~~UˣUI&XU@s2/MKUJվbSܼq'/Hg('5%tT+@ ħپ};PcXGVvPs999?C… 4h06m쌟׿8wѤ+\zUS/c  [߿?̘1}Cŋ 8ƍe5ƨLB;v,5blڴˏ<_b``@˖-9s]TTÇywiӦ DGGԲ2ݻɓ155EE%7n{hтSWfz2؏>Hy>P1cN<΂E ͛,ۆ̵룧GHH|(iYɠa ik59>!WFϜCρv>]{~*j甖*=w/$/(--姟~"554.]ipveYkkl'p/Oُw Aϼ5S$~H, /~+Ag ?Vo',Dİ$C&N{#&=)Kp8n#42Chݤ鬌ڋ{$(6|A@'`hyۦl۱[y=G*L'eF9rs3IKO'#=!Jޟ4՜WM?bTH(Uɯ1'Xcɢb2I ==Һg%䐗G^^.9ٹ p>\ lڴ ###ƌCBBkU+z[nqtWbɒ%X[[97f >;vZ ) -..f޽XYYfr$ѫ`3x 899abb۶m#==]999lܸA:th=ˊɓ':u 777166Օ$9ӲeK5jĮ]Ddx /^CCCLLLXp!YYHKKKYz5|j_6X[[v9oHAw-000 ((H Trn߹ʵ+hޮ MZwݏB177GKK wwwݻ'{YXͿ1f<:9`$]pzVC;qL gjc7̈́_t2:BKZFNӖ1p7]䄠eDCYAIJM-h{BV =W~<~{ ){NJpKFfFt5!0eC&bں3 {VmfYAb4A[P%pz& R[m rckVq~״Vm/®oպy E).P^i]A020"yUAL~jIځ`uf'E24O?L `N$b7:!CY.Po15V+""1-"K_)߿rAZ~:Z")_57JQUt^=vW")@sn]/@IrEV$4eVyU++;y6*.:'œY cfRQzF\")5HIUM+UY_h($Jrpj1.L903>T6aթNpJ.]Ę1cfƌUeeYhss5ǺB^mYY=zıcLjdٓݻ#[֖m۶qq9XYyy9tԉ!CT*D!Q>x'NxbZh>&M">>^)իi333^*Vc!WL̹s9s&hkkceeEHH=~cȑXXX|HJrssY~=ݻwYfq=^H^p)ZnӕMv>EP˞={۷/zzz 2SNɯF puu_$EY чX4ȸ5xѡCի׮]tC+r/?O BМs$Uo׏EEGW s*+6_\=EPC_ߧõNPwՏΞػ{2j'=mi`jI_{g[3B@6 p0VH#q9si[[ӥ0&b4NXHVFw[ "Vu>A0F[/a}^_T?W0|B_˪+̣ SHs>7oSNrlffƼytz{KMD$L&%9Is[LUA.UέpZ`IqccH:L&8!SڨAM$BR&1jQkLg!NVeXUTa_3{[ .cz]]_Tԛ@z0 ՔAj8OEU J=$ZL5?D @0԰5?MVCw2b\_9ɚSSS\jLĨY(A}Zp쯳:A/077]vp܁D7R`p>},bbbpuuehiiabbB~75>|Ț5k/YMNq~~>7oё ·~+waT/ڇG~,--6mKqq1k׎/B QdJKKo5j7ߟǏsmz聅y}1ftuuqvv&::)VVVWw(22)ѱhA;b:ՇA qe;qC롘{&, 3Sb QUc=~>a eF|¬~6f4I 9{  h7Dϼ-cg,gɦx'^ ɳiAhЫ3+ι-US>R ao)ohI?˱euЁu֑eQoZjW:rskKߥuk\Ti IDAT٩Uo(~GBpWb2xG*ίnC8׺">RVAR XݸX߯ܝJp:r U$. _@0kjl_j cs%u__kgI*D`dN˯f] Uv&}r!2J\[Y0JisJJ _|^^^899Kh߾=gϞ3/_o߾899q55'dakk!CeժUrg4iB&Mz*gbeVRaDzE%ӱcG4h@VX|9AAAt}}}yWѩSu'OLzz:s1j2(lRT*322Y(x=8}4o߾?(mr(Jg|7gӲuSLLLB[[3g.+I*%ɹƝI81h0';~}K %b^PTnG#}w3}ˢ?Z4EEW: pfFGI:}'z3ŗ<޳?Z6I 8\Ŝ; e#DŲ82VL_!Gfɦ8w'Lzk؀n0l,-fku#BCC LM>/I@Qv(|vF54΍)x5V)N x~=\7PyNޭK$e$'@)* XdduWPJvZ "I O+KHPڰj 547ټOՐ#[CgfQIrUE긾M\RHNf:))CJrNK0;MگZ jMhQ&{m&XsfBWW K߿Hxe=zĭ[HMMeڵp= lmm '''0ev5 J9Zю=<,{ҥQRR 4`ٲelpe&"K)3{.ڢC 6lv%/עTp֏?Ό3hժ&L`3k,¶J^\zÏ=ݻ|,\ݻ3h ܹ3 Kޚ7odm###A 44bt|F7CӦ5jYfXM?g짬}9c> PӖF ,|{[ 0ie9oS{L !رC"cr )((_PT\ZWRpOE%qy9SX¢bVX,rƣ>䧻ɻg>ϸ#~~}gUZDz݇RT_m. Nj)V8*?)Sx*Z]H(-.¢ZXqu jHZ\]_Lc#.."{&hP]E}>g2+--+6lkkkRSSS TIKUs$%dddi&ϟO=055777كH$ښ#G*If^e21>6m`ee˹~:k׮]vt҅/<90]=x͛73tP6l\!{Ѥըr]VVFrr2cǎm۶4nA022"--MQ I|QɃҥK$%%`,,,}}}|}}r9j T7nG.]YfIլ+QW짟~";;k׮0{lbbb в{P`Ix wXa&`ܪzM;q$˘˱ua/q .c1t0up~ܼV`>ay^vƳr>m[c^+2=Fϧ-{oځ&m{g8FL͠Od}1;aBra}μXcLn|CikySojz!| -[+FѫW/Ξ=KyyZظb?c}[[۫9'T՟7v V/N%jUKVASE(4Rk.yÇsy[!_~_XXȍ7a޼ytmmmvիV<~,͚PG(^LL slB^y摙N e+T\}888`hh(?lܸ1[QQQk|WL:mKN]Vdc/y.Q瓑͛79s mmmAs>|XM*)?̜9333ڷo*.Lݻwz*7nʕ+^}2qD LUz 1p9qS0l}teBFMc;K?n#eTz;ŲXƢk/ZH4qns.2m:bҶ#-,iҎV=f=}~?ca"V5`¶~}:RFrRoVoVo=ξ]c;AZqc j/k1'z#@곢%%%zj,--144dܸqIv|lEE׮]c˖-=]]]yYA1bNRR~]6?~'N`ooOVAh߾=۶mHVe98p'''y]]===-[TOXv"W󟸹abb6z")) xOr%Ξ=?LRRXZZsɟ;2VXm2+/rĕܻuմL45JӬJ[4ouMF&)66,2 08 1Ù{0<ϙ<ߍGqRl]-26"r ;v,M4󳬣n)oqD߄>MȥN΋=*oKu C!A7!m4eKu'Ax il".[cǎVH +Ѫ%qr OfʕxxxХK ,[TsܬLc">̳>?h-0aV֛H6T\\̹s爋㣏>bĈ[t>}ŅZ˳^''''|nݺ믿.fF,Onn.*ؿ?< ݻwGP0}tT*͸^R*NGff&~~~L4ѣGώ0>Fxx8h4f̘#xPbZj1aTjEWZ&*oʗ_iڲ;o0z L3_oS_ s91Ӗ1nRs)c{36_t~Lco|9F<,gb2&<2?f.c<8:cָwȈGhٰՏe3m:Nѳo}d- f,8X}~d,# dlݻ:ШQ#[eKٞGFFFF揣*4k8ΊOlTRMf>>J@^nE PWgŋyW4hxyyR [qu~5ؽ{7˗/ٙN:Z,nխVk.,,ŋj^z%z)lْ>4Xp_֮5rh4ر\tg^x1qqqд4/’%KpppgϞ}:6XӑHpp0111\pgy\]]ٰa:99+99Rɣ>СCٴiͽ*//'))p"""dK 1l4E,j&tťdeP?L,z܇Y{S\O_gWr< 3V3aj=ϼ1u js)]Ȉ/3Ux>O,gWydƋ=6pUоs}QڵkǢEwk]nf-֋*TkN˗9z(_|O>$ڵc̘1l߾l䐝YhhB1cVVQ\\LZZj>sFEFh߾= kL:S\\LAAb9s搙isu٤\j5aaa$&&®]>}:NNN?lY9ˬ y4i#G?;t}%4 DEEYt) ࣏>2g;71յ B^ k5pbIi8’3d8M[ؼ5eٌ~t>^Ӗ7}%c0| <-k*zE<-sR?G*#\fՌ~eFO[0kHqL׋,zc3+7ӟ_ɐQiչ'MhޒePsDm ϞpXyOBEMIE` FVP(4nܘy^6\vedddddddDn9&8UX,IիWٵkƍCP0i$~GQ"Xŕw_:NGjj*YYY:ts2fLIJJ fxY9x .>0\b:2U-\MfV%11x>cz!,Uh/ $));w2h uƖ-[$a ,**BF!;;pvMqvv7:Fٞ8tDEECxx8}dРAPVVfʕ+:u FC\\111dggqݻ7QQQTUU5}sl$&LZ5_(7B 9?s#f xM[”+2s%^Ӗ0/0qr z9zzNҦt1`ެxrL}v 6-hҡ9}fj1^Äc-Ɛ:Q_?1+1vc&˳Nc4o\ 5ԩAAAKFFFFFFXHݞ 8|0ϧe˖xyyߛKXk zJjTVVGJJ ѨT*7nÇgƌ޽2VY2*g-kE]FCDD6l`Ĉ( ?h>U'jmޕԩSs)>c<==Q(bС5 J%i{ ԫHMM%88pBBB',,/;ҧObccmR!+Mu5ѽ933֯_O޽`%ҵ:wLvpss'ۛpt[!nI&k |z=fbHfعsMYivlMee%Ge…hтxW^y 2(ŋu=uĖuqYYjoaÆ L63f'w Z$2.]Z&!!J͛߿? 'x+WbL,$Rl1rEBBBHNN&11Jg}qrr^6Zc-999éSؾ};%V&66VK``=o1Sps̙3DGGѣGyw޽; ,Y %Z *-5kЮ];^yJKKzt:UUUPUU^ڵk݃o*.]DZZM2{Bz{7N(Q(ڒ>Chu.mzںۢpn F.8MǞ8}CQ84EθB˶]dڵݻ,n)"Tٔ]y7*Xp KPkgLȞ2222222wUK-jҬ%%%8q9sУGz͛tɺԙVMk 5qBBDFFo3n8ƌ{ǥKKQ![譣PCeeh >{,!!!|www}],jiX%]zUtE3# >;7k].),, VKDD_vڱuV*o=~W^%220&>>dT*Ã;vP^^nq.Y*PqYZ-?3k׮k׮l޼Yto !##={pa9wʉ'xwܹ3!!!jxwy?>ӦMc˖-|l߾XM[IЦL p9ζ/gex {m{MqiBM6åIc]з}t܍c/{|{gnoݵei/S(xyyq b;*Řb\h)**KҡC7oμyطoެXEv,j 5b.33`>S^~eݙغm8ˆAVOLL Zݻw3ydzMxx8P~,W.))!""`BCC&::g2w\ʃ>ի={dĉ|dffFZZ< <1cƠP(ի;wfСL02~xf̘lj4&ނ 6TSmFCl|,gϰ_Y%{yL)̧Sym+GwnJKIMIF_Ya-$X= a2 dj_~%΢ҥ ;v0d;]FFFFFFFNරCߨLHHHVWWWFO?T\ l˄ժ,N>-Z8}4+V` 4*jcJ\c∈ 224N8ƍy=V IDATz4ϟXkJ}Bb,Z&66$ؾ};{fرj,bos )//HHH &&󩬬L\VVVZFVhDPbccoԩ<(&KKKz*EEEcdnsi  ZCn޽;}e˖( Zh#xسg$%%1k,iڴ)3gw!99SVVFdd$N$&&7[yFjjc401a}0Q^^F~%23Β&5!ܬ .lj:+d\#1YXCӧθڵk-E̝zla4Y^x ///7n7>s۲=VfoXS}+*ٹs'=Æ # k׮n>/k""" %$$׏~"jLﺗHii)DDDт5766M6ѳgONJbb{t^Oxx8O&66Vȑ#ٶmM\0fyyyDFFh"88D167>>5k͛ٹs'o/c(Jbccp@ffx_B_^~e }e޽|XHJMYlD߄TZ:XT*!!!E233Cҷo_6nHvv6RXXիW(kNdd$ĐHDDVbٳ|8EX Q5{HHHӼ+tԉ%K#ޫJNNFBbb"j(֯_O~qsx}9((h"##QTǣh?~<:tE8;;FƍE >}:{!00FCRRqqq$%%ѯ_?<</ʦoGe|wPRIPNy#yiUo^"8ƺsssٳh1ꫯ(,,pz+577,ͦ\QQٳg GR3f̠u( :t@>}ͫ3 `Ĉ⋼+.ɤj$:: cȑ4i҄RVV&KF{j* Bݝgy~cǎѫW/VX! m[]]MQQiii$$$Rˋ6m0m4l+DgL]dG۷={) =/sc#dW߳g \\\x͇ךn-ᜌ̝!_қR$("&QT޻B$G僷*Dl GENY,} w(]gǀJ$0GNPlm֭[ǠAP(iӆ9spѪ`͔NlT}lRRRaaa/c=&g>|9qwfڵL0;Ҹqc6mʌ3駟rDB\h8w`РAҽ{w:vH=x9}4/^jjEw3gpQ͛LJ~HVhڴ)ӧOO?رc?^C b`bcc9~8 ,}4jԈƍ\zĉyٳgǎ#));,, WWW͛gaŷsٳڵ+Ό17Ҿ}{,X@vv6#vū^'''X_~g_ֺ͕X%uGk.[lX |_̀5k&Cw}e@N%###sWR'J|C%bLROK,J͇IE@?>,' ?os 3D;7d*C~ 0# ?Qx B|o_4٥V)#ׇ+rBUQ fǟ|sGoawU_h~y(}vɅ#s$`h yQdYw#) v2BWa''d}z|,Pl-h%%%3sL5kFb֭DGG[X,xEXk\|8=JΝyLjY֖ vdM̝;oDKjTTb֬Yb-Z# VZ1zh֭['MOO… >}DZ-?hQU(䄛͚5o߾̙3/șN*hkƬYxWYv-6l`֬Y_dPIF!MgXRO@^NG(}56J%??,UWWT>#~a+j 5zUUUF߾}EN-WLUw݂1c={iӦ5 Rlj%22pVZBɉ{-[7߰qFf͚E=ǣFbٲeٳ(҈_~a⢳I&,^իWk鉛nnn3vX6mDJJ /_&==DN: ͛7Inn(O:Ŷm9r$]v X~=G%--2.\AAA&`:,yEVZmKaΤVRRBtt4AAADFFR^^ΥK(..-= Xˑ#Gؾ}8o nl pss77oNZZ<2222w;|TTg$"tFh09W" 4 :RHހ^o,'F@慚]Tv!]NF+ 4}׵ 0kP*Da1TToqN[/D&Pw ԵQ0YFJq>(}B79 ev:V3ؽve)fc0WT(~-C}-\s!&&b"KP*3-[ҦM{9 նFI%d oϵ+j$1Ԑ'...xxx0o|8M6EL2͛7$ݛj%9>>L0ESY4*< ?[Xk_~ӧ憋 ̙3DFFr}P(bnA)g^O\\[neҤIwȑ|gtRQݻ"ٗ׮]CR[o1rH:vHyꩧoٷo GJQsyQy6>HģDL ΑA 9S!J%AEpcub^Ep7خ #:hBCZv!VmEp_U:[kW_}ԩScƌ>#33,UN(g#YMQQ(]vJXVYpEzѢExxxкuk._\:PQQ]4iڵ~m̙#^^^ڢF'@~~>,^ݻӨQ# ܹsѣO<'\UUeaٳeNJv֭ GGGlbQƒHxx8۶m^`Μ9cj!Os7#g(8w֮]+n3{ܞ={~amڴ!55" ###s"`=@AuɡUAИŠ zslFQ0GG#Z̮9Q(Yg1 2=FCQJ b2 [-j}DKHE~+kC]/ḭ`I>PAF[3^,N[ww@9Z !X1+HS3 0-ɦpck{Z7J?٥zBT>հ6zDLgC X AH]J5F0cL5 k֬S>֬Y-ܐV I}fV1\7؈+׆8q/sδmۖ|B?ܠ Bk\r_5kֈ|nݺŋ[kN::t( 777JZzRrssj@JJ xxxФIڶmZ3k+=SHN:Ell,j .p)/^LYY%p ay#(//'11Q݌Zc-h" $~e+=dJ5՚HNNk׮br-ZlSNKFFFF.BC~?Jeu]]¨ fmS'XpRI:ٚ;7:.˲-+(5h-|msJndS]']FrX% x<+J|hS>B}QzY]f#iPo%gr [9NVmݻvF*(}Sa{|$X32[㫴ySERk%--/z WWWڶm9eu$e?"%õZ d˖-h2Ǽp6mĄ Ě/huٻw/sy޽ٰax0~RWc!Uxx(cccj|xzzrÒCM^^~ 'Z2ǂPl޼''',X`Q+^`g799Z޽{i޼9&Lܹs}`' :FA~~ܙ4uVzKm;wN Je yU":DGGpB Df0`/qjn]Xcʕ+$''sI^uCfO,‭BKJJ8<|w?^<#$&&Z3k1.=oUU999pA.]ߏBGqłDmYYgϞ%99Y,dn 77.~%Ve{? ٢ż!Zʞ9&K.oߞ_Ȇ;Κ"x yJMM%<<8wN&M\GqCiѢGyedddd}$'QX;x.K!DYU" 옘vŜ9shٲ%7ˋHQH޶EDk)..&>>H9’%Khڴ)Æ (K&JJJJ CVW_1i$5jB`͚5LqR띩ĕ+W8{XO>aذat҅{e%z$XV[oF+'g"~`b ~'۶m3"yF333 … <3jՊG}$m2w1V1g\Fxǩ?ӸDTB ;^'--ozz:v̙37̨l  ǏpK_n]{*lg*/_LDD!!!t:ϟO6m"$$%;vGGGؼye{/######sws׉`k,bj%sa,X@vĤ-'OfΝdee:bOpfD/'O&&&Ʀ4DGGRHNN̛7>}a WfG$W5̖:X䲲2rC&bXja{oֵtzz:;wd̘1( z{']t3:hBBBd4jԈ_ζ]`UUo( ٿE D&%އ^ɂ\ @ӦM0aHJJ}bcMQc"rr٫k-8 "11T.]DBB˗/"۴M|I-I7.ظ:KoOroZ݉sαn:ڷo/f>xhnhquZ&**\֬YCbϞ=`#ݽ~#N2222222w(w)cuu5:'O`:v숓M4棏>"<<*Q_SZŮױsmeXc**++)--%??sj'cb*&sssٿ?3gBYHJJUz jMTVVNXX$''s!^z%2e Z&HPN+ ڷooT4'99̝=+Qž}Xr%}APЦMƍPtZq+.Idɠ۪%VTTXdKņ,2,jZ R PjbUVf>诔GHדJ"::BBBfmۖ%Kgp`73̝i޼(===-J;2222222w":rÒ%K6ljՊ}l2oNffM[i|Zc˱:U6oֲk|xlذOOO\\\pppӓm۶ka-ˈ5RTTӧ CՒVe˖-t҅vCYYņ3zw`'00P̷U,CRygEpCX/ 9tk׮ehт-ZЦMϟ|F!99"t"',B,Fc"Pùs8r>(( z!^xt`q aSs/$ 886vXXϧE 2___E.:7EBয়~Γ$֓SEuFWTTp >#fΜIiժ7Ä,ޭΙu 1[b}*%E?dѽiӦ<ܹv֙oTR^Ao8xVKhh(gΜ!"" g֬Y8;;3zh<(6-//]DeeE2cNJq򮮮I$I{"؎P5%UڶxJ%-_~ݛF1|pƍǧ~?n.Aem[m(b׮]L6~HN6m=$))XG*lۗaÆ1l0?~<ǏgҤI_̼γ>/:Nuvc)Tkxsr!q Ǐ8i]aYI"bo,ƍygٳ'( 4iȑ#yY~=w&..WRcwC*ZRAz8[IelLV3acѹm~7I,KPsyy96|;oܹsر#m۶uִoߞٳgs1Z-IIIšh CVŋ ~K#JppkVh+h'"33|O>ĉiڴ)#<ɓ={6֭o_%&&L-~&>TFjѤқ)Rnk4 Ыz*ٜ9s_~7|#GҵkWQjՊÇ3|6mįʙ3g#1181ٕZphh(ZwkQi1ZHt:.\@VV/_im1ZC L8"BqxzzrJ/4tj 57'^]]Mdd$ohqnժ˗/' h;vƜJu)|Mٲ)^zYx|XŕYeddddddDd| 4(*I_AAj;w{`h۶-={qƢ۷/?ZbڴiZ_O?SNMHHIII撑Ayy9SjJJ*MH%kg.XtQQZ/^Dr6mĂ xGѣ;w ٓѣGK/'pQHOO'66hBBB!88QTGVV:mWTTpeJJJ4Xgmr 餦GEEnh?6m#4m777z!>Ct௬i 4d ~7gj5 ={RbEi,[;vp\]]' @j???BRワ/>>>xyyN@@111Y/U}S_rUx]+b2!!hpww'""(v]n޼W_}a]ؽ{79sBǛwAbb"O*kUdIvʞ={rljJ#YM?_<ÇYb8ݡu|U?0BAAAAAAAB.+dFz)))é^: H_}F2EB$xJJKbcc~:ӧ_9p[lΎEammرcb 2aÆѳgOZnMݩWڵe˖ԯ_.]аaCڷoOƍu5Ftԉ+ҵkWZn͐!C:u*~)9*UJK׏;vOTT$ " >>>Cj(ɓ'K-ccc%[nXkFsM{,oooϏ -ZDݺu5>~=Zí93#SDÇ9|0#F}}}J*EYt)1|sG2s#LMMٴi;u.lh&''δiӤߋ8::("-6D蔔\/ڱƺJ7ҙ9^xAll,ܼyO@TTW\gggprrbo]]] ///.^ș3gpssՕ'ODhh(r5\]]ٳgR# =|pVZٳg !,, OOOT*CJj%n>>DFF#{+ax_%^C eK㈎ְʚhM}JHHjb޽jV9p۷GWΚ5kꫯӣZj߿_#Yt5~bXKef4mTxRbEK퉌9V\_OIIaС̙3磫}+~ILL~3bB5YAAAAAACC x %p%+t+Z>|ŋoԩ]tsAjժEPPCSV-s(IJJ"=-Ǐcff&ŨѨQ#F+AYeH` 6>t=?T/ZJ.͛k .DY4E+?NG\]ΫLv.\`޽ۗnݺi(QArJ~g<==Fhz{{K^OOO);odd$7߲K IDAToޔr'5~O]ҹuxxxp19}A#˯-RQTTX3gJ\|]RhQ-͛sxyyq{ԩCiҤ $99SW6/iYoGOm6:wLɒ%%73w\5ܩS_5W~ܮ]hѢ1BArr2~./HC+((((((|H("0VܮomURs Q _xSRReqhvPo3-[jX*U$78wAAA@@@TWL+݋mnnnR=+W+k~[+QB??bX{-Օ'2k,"""\ "A3#>7KKK>?Nxx8I-[FPPdQOׯ_AhҤ 6lӧ+LݿϧOrY&L@F$i###>36mDTTTӧP?cAͦ#ܸq Jӆiӆh 't: KDR^h׾JIyB"axKKK>E)W&&&ݛ3go>.\+ׯ_'((Hb=_1hX=<x@rvss͍ (e~52Hj5kF֭ٵkV,,,z*` $((6o, w^R_jfց\|(oNrJ PF Fɞ={έ<6<%%ǏӪU+lmmhbb.WCb||<#GDJ( ԪU )A~\Av p:*# :c,(5 |}}%[]}}}} &:: m:gVlٿKHI5- ߿4`\]]111aܼySC?e/Xo߾ɓ^: 0h <<^z#z4iڂspQyzFxPTVL`%BOOOI777 !::GSt{cnB޽{Vw^]_2]'FV燯/ܿ &P~}vŭ[t?K_p/CCCȅ I^^^([iǵk8v;vDOO&M`ooF yٮwx]ccc9s k׎#eʔ[nX[[o>4ӕ?sΌ54>$ (?dȑ)R~mٲ%XfP 7a ED_%˗5&*sg1t$FFaRaIJDjض}7!GpUE#`Q`'鉯/Kٝ%kޥu",߽{9sЩS'&L!%犍%󪙜KӧOQR\7W^ԨQ^z믿3@J]RtyMNNfڵԪU2e0eΟ?ϵk @)S;w>gϞ/_2e`ff]ؐ?ӛ7ora&MD-(U$j֬ɸq8uH}*yx3gRV-֯_/ GlI )xeooNV#Z.񫠠𡢈k||</kӖJ*!-QhY7Lv_R&89}.e7BeT** Lfhذ!'O9mc֬YԮ];W mۤAPE +((((((|H("#B;PLL do`Lђe/RcXz Պ-|~u4GxԸzFZ'9`*<H"@r)R]3m3~!][ѾSwnMPp.= Tq̵k׸u˳o^41SmXƳgϸt666|'QT)zٳ9</^ܹs?2{l ?VJb(^8kצO>3 vɹs礬 <Lxx8ބHdd$[nUVTZdYuXS?Nƍc„ ˗%whU$cܘ8q"˗ؘ;rرJ`Z._#\޼y?KҵkWj֬Iɒ%ӣrԮ]}evIDD>>>RdIfΜ)|"##9|0fff볡aV0`nnnY;~y8zˆ"?"RB"hVTQA_@DqԩG#lQ6 4e_Υ]nXڵUzzJT8Wo\֭[ܿ8v#R-Chh(QQQܻwK.}v7n *~*QEnݺtЁnݺ1gٿ?ҥKCHH'ܼy[nl2*VȰaøsNn111lݺSB.]ђUT.%0suu%22RIIIxyy1uT/!;vΎgDL& G͎;4h[roؘ5jЯ_?/^*T\r\{i^@V\K5g>.r(kًAa1;ca6}53V1dNXĠK4q '.eДK"!39̼癔Dbb"ǏgѶm[Ν˙3gb]DObd???/F *TȈ&MpQ)ȑ#,]#GҥKڵkGj$QTV\2UTdɒk׎5kҰaC:wLJ022bذaR%`SNر'O΋/4&^]<.{UBBϞ=ÃgϲpBڶmKF$+^Z5ʞ={!%RPPPPPPP(Qɶm[  ѴMO_͈v!1xR+6Î6az?[~c|1d$LRSηEnJHHSZj :2ePJ֭[Dž ]M|||ҥKl޼cddDb:t(?qqq9wGۍXFTbccy< ,,Ν;ǖ-[ppp`͚5XXX`ffF^hݺ5uԡe˖/_͛ӤI2d7nx<\lRqpp@UƊ+ Ϗ`qww_rVDEEi˗/VZѥKx[O5]z븻s̙CV$bŊQfM֭K>}Xv-;nnn\vM"۞<븜WJ˗M@@GeL0zIɮD+ ּUPPPPPPQDDz.ȸ1{ fe 5[ȩ<)y4FZlVjAf9k~S{#Bd 2 B $Q\|űyf7o ߟSNNHH*@puu Jŕ+WsΌ3FM6eJɅA:5I$%%3AVsM<==+۶mTR+WݻwQ`Drr29R>y$InТ xyyq])5=-=efY:wLѢE֭\~@VP1rO)lg"nONN&11oҥ JhѢUVC1'}vnʑ#GpqqחH]F@@aaaDEEV… ۷-[rJ̙ðaիkX,z!FFFT\͛3w\j\w-;PPXyIiJ{˗z_~>b/&;XJSZmםc/>zW̘n1%KŐь4_K7q%̖0h L1z;3lb~l.9d蔕t3EiɐIhAkzC ,gBxx8-J*`nn˗521䄷7DDDcn޼7پRVlD(޹s)S```@޽ȕߢ_*>1+Hrr24hccc~AAAc===qss#"""\,޿~;RD +Ɣ)S8{,>,9y}^+6V;ӵ(1W\tڕFi$T+Z$MLLT 4>G|t҅:HY۶mKvhܸ1*TlٲK]5jSxqʕ+Ynׯ_ڵk|-IIIJLY ϟ?իWddd}gf)-Vc,5柙ɫWxz')[//6{Yǵݤ^\(Q_[םM}:E7CI̲W 6oRN_(˵-L۽X|>;|N|=zM}A?^ ?毿R[ꊟݻJΝ;[  *Ub,j׌ A m:q_QdI5d-nZg˓f?K% 憟jZÇ\RvZEG8::-$>|ZεǐgϞqFA-(_$X]}Zފ"V\/~7:jբVZ 8ɓ'JppoZ7:"Te~ǘ7%#n^7van_%Kx4{㴛t/;Wfs^,ŠONa=J.Oa:m1m;ia]Xa6r/3`3/ۋ,4oo72!Ҁ^^"WTMKM4mA޽;d$00 ֭[<}tn߾͢E(S СC~w޽[7 ČLFM*U(U^^^R<\ UyVᤤ$;j׮M"E5k...J枞%R_Q Y7nGԪUFo> 7t{$XOr?Yd #GC+WNRKw-vE7e/6S,}Y_fɮ>kE]<hv]^ot=ey׿y+%J`\m;dy[F$ ^U?Jm>,bis 0cDKZvewR!%'# IDAT>?  KիWYx1&&&1~x%$$\]]quu%$$k׮q=I,5QE+ٸqpqqRO?ȈSCl;v͛77o%JRJlݺׯBXXdÃWj Y9{,cƌtҔ*UCJcHJJ* ډ>|HXXϟg۶m,_ӧӧOZhAݺuUUV|4i҄*UP\9j֬IiԨ]ve̘1XXX`ggǮ]pwwⴟ>>\z???[Ju<]l׻l2:t@ݺu6lȎG*S>b.xvν{zΝ8::rq<޽{9r;w???޽+ノks.?Qp+UЖ׍u-+Ϗk{:K`pjr"zwZYDkݛ=^co2̿7$<Ν;'R' =S Xk`'InbQWbL]#c-=pցg/N ȑ#mҤ {!,, ___);;wѣG9Yֶ۷KcΝR\ɜ+R_j|prr_~̙3ոHŋٳ' йsg6oիWdd:yɡ4N>СC]6͛7___)QΒ=VVD*f֕y\;DHNN&99Y"Wlr|UPxc-ڲo+ⴷkQ_X&z;e.kٺuzgN/_ڢu+毈`@&/`\ʖ- q vJw>Iΰ/s5G1_uygYpg_p1= lO}"k}6˖-jժRG;*bbbxISϟ/MjՊ]vid.lE)]45kѣz]ķxVAfu^|ѣGiժӇCCHH^^^R fQ_~=WR\J}ԬYΝ;b 5)))CpYNKOKM˕]z h[emێ]_?"xwX/ZWڻ2oVxA0g_2hV5쓒ci+bz?aawy1%Ѩ4Z-"˸˗x{{3}t̄ prrBVseywZb,[055ٓgJI4]j /^d3 !.~,T믿?$,,Pdq}EmZj_~Ԕ:uШQ#f͚ŋ5ӵ\h=\.y쯝*OKOAY3`+((h ~W}=e"YHk틾w)k[vFrz| |cq\+毈`@:d#,-fRTEJV&aa1f,_1KڽX;oO2cqn<Œog4[:-31gϟkV\K'ܸqO %>99Y: ݻw|嗨T*=33IB*4vIҥOٹsf_x^;iǏٴiTZÇsInݺJJ;ބ{:D| qF ֭K>}رcnݒ`]{"LNׇ@*XE+(o+ (+lMgm۟9|wSM+毈`wNf+L'#%mER4ПecRڟn+~q^=0eO,17otdD;իǨQ8{lbiܿ˗SbEA\rݛ;wœ'O8U˼\:::ұcGG\x15B*ݩS9r,PcǨJ)166lٲ̘1___Pxyy'*k׮iKn$-5-{޽{̘1ӬY3Fɑ#GyYŒ..rWhm+ԩ"|RP(k4Wz۲<`۟R+kO]uW_ Q<|iӦQD ʔ))s~eXKvba~lb]̴9c?V~g޶,wVYL\牺zLY|*ظPF~Nf=^9 f-& /do R?KbFW_篈`wOfU--5sѧO+F֭4ٖN1kAϘ-o3mY#0k:82wf̍ǘ aj/OC4y:6nfEtЀRҴEΰQst?&MԹ?I23HM҈Դ .8СClffF@@fŽ 9̌L۷/ŋTm~eӧ4o ח@&000lmw]md ㇷ3vx Eү_?q8WHK$ՇAZAAp!DDۊ_Тm̿|y[,*yBJk{Vo".))~g'|gcQ,m2}OX9OL aox93037bіߙ f4oцzSdIAD|ֽ?CaLg [z D/ӣpm؊: 2I~DMn=}}}LMM ԘSaqw'em232III9B"E2Qǽi:::ҬY3\2֭#<<`t˗J "XnZ*#FR^S*hH  W}Yk7oJrVPPP7h`"u'+hQQ_ϯ7nd@Ǟb>77nߺIl#z}!; рf9!fTWe1n3#=hڶm _}>==y,/dYKƍf͚O??899Ndd䶝Kʬڈ19%0d4Lҭe*7D3F0gبq^L9]K\\[Y ZWS_E+{12GpuuI+F255`*sWeن_Yp˵0_5\s+(3w^,m2`,io`\O[_SX<;Ž32lF iϸۙx#4hܖJbXA_~O󓦒5.&Xk۷Z*e˖eԨQ#7aR/_ϖ={뮗|-geΧ"R_L\\@Ӧ `\:z}ՊLɬuXwv?cewy돱(+w3l: GU J`R]{fܴ4_ ;zmkuXÄp_bItR:t폠g`O pt,n]")Lg *U_N&`%:&&ѣGShQA`̘1xxxAhh(^^^sᮕ r\|OufkFXK`3f;0_cfobB>mF%J ߏcf)((( ^E^uHe-7a6>exlV/G~>:}~ηM{?+"Xᝣ֨˗Yw7;Sj5=cBn0֝X?a=L} -#E h3Fe>^c B]! 'NлwoAdɒ^ .?...: ) R mi=s-80uV,r>aʊt9 [!1R2XCPPC;ї6]sqeim6W~K*m{0/^{/0{^$|~`oVq7kdv3{S5wjNXRؙd 㛕kK\T[h6z#B\kkh5/~KwxWܭhk=?}\{WDB:tJ1&&&֔ѹH>iʖAVc?ӆ V0|=cnh#c3vfL|˘;;lc-5_Ec0)[A(JيU9lb&|xކcǎѢE J(իy)O,ZtW#^xT]v,_QܺuKۖJCInj4R^@+MNCs`S ;Ͷgo1_3lbz?j rիԔsiI*XAA!ޅr9O,^D'Azzzk,B߶O]f {/fߋ&dyB;)-OaGo~ꇥ)fڟ䭜.Nҹfciѵ\ﳯqz4jZV;<~_s7Y^g&M"s?|yΝK˖-)R11K#+Taİ"ER=akY}ÈkniϨyj3aF0+ۀ<;jBQo 9ELxɫ+Qll,#F@4h˗Mf̌L)URR{I&Ӽysvލ/pm '75=$!yV o&\Aju5e6#J"X쿶\DŽh |e3v?|Ǥ ;add ^:'1]RPPE71"[aam»"r,QdRJVEj{xߝ|=Dk8pk^v^;u޶vo;օ&aN aXGUPq].VZնQBe#myqrs9&o|]Gز˯7r)~Ueb;riUXj !}_YB9J/^ X󑄻VoR݌TZ=6Ro?c-cγoRݱ\! ~gS`_"_2b#onf-.T]5Gk.]|_B~(V+>r3f͍W_FMh֭Z1&y4 /Xs*A^~SzYMdzTgy;r~}U84iAdT#J i):VϜN0z FEnnyw`h F'Nf7ARӳJXWJǭgj >k9W֭Дz)9hg2F#G dtDmla087d?v%l #F;GUcr}UT-J]E 1ax޽xxx@Xh%گ\36믄Rѣ۷CqIk`[-e{yDMf !w>xO <ç6xgiܻ4mڔ{x4ߏw9}/L'kߐҲ_9 }%.|/qЏb4ٿ*URPh0`8wh,g ]n:+k7uo ]ë};((>iie,.=iͿ;/y>rTeZub -5 Kl^W/ :*/F3Bf,fQkd<&a ֘{WDe m2}b +renDۿwV~ÕOX:KX_- OX̼B0F_:a1ND%,a\ :=ƺmJ]Q{}s gukbsIPl/W~ ⚳yOlV%G;(8uN+t&.WWWThviێg_O>OG'o cz{P96F/`Ĩ^,uhT~3j(ZjEbbez3+g 8i޼9v۷gٲe۷#GXVWZ?a>ݎt7~5f?>G: )xE5$>A)歏ӨQ#x˚,CL-Ȧom;qkX<β(c*s~=X튰|EZW`3k핺}ygY5k"dٻromlv,湻PV^-φgc0h58Ⱦkk>{P^Cs3(*Wla49V]^ d4۶m_~888̶m, aCoذ={ҬY37oFaժU8qzL@@YI.llQt&hO>);)01rEow3wO8gT#FW`k`ϱ.&UpnivKaY,~UEMr[Bp;-Fk2=^Q^ΙgI:{+z>+0a t{[j3^տ^>_CpܢHmzn\%~cvu&Ok_DU[u;Wl z%Gwe;-m"]˴-:uAO#m3\ My*ڸ~-!~ĠLg)Bb363,d=i; Oʲ}9WV3Qn\g/7>Z"W*BӒDZ-, K ګ%L,T9º֯LUp,IH?>NZ6q4m՚foAՈ7^~VW0PY}yT4ld4QRRĉiԨs#G̬V/IuW}vyy dǎ>|DEy長;OMMV\=wpa6鸆gh\''n8::rEiu]˿i!?ϕ_Nȩo&x|kn:k33^]sYg[HaIkp:BUL_/5c؅=o u+Ρ|?Gյ kEbwbepF1nGwیOmh4kV4{k]XGY.'nu[[../`=v>\=5isSk.`\jYӒ;XyB5B]cs+.0%i%Gw3A (?6njX_K,vq0.[2#ElYbޱ5Cpsz`ijsH`6!Yѷ?Y{upj'oe|aKٹg?c0`~ؽW{ϓj?+=hpz/> eT<3v>3ZR6V},og?:T׳M}e-=Y>c%hR*3CR 9q\pNgy2Orr25'`ƌ~J؄`2_^VlWWyzuzE9 T뙬WXرc'M䮻!!%Hxt vt_P t?~Cpp᩸1ϰɸEwP/M6u,^ڵa{ }3uv߆6Uy^R]<]  AONU(5۫uJ[c6v+ ^K_F.4;Uoz?fv ݹ(vx z6ϾD^ԭ'9~؍aq +!^sQBpb;;v;yDRs9~㧋xkV=k.>x."%Gj`(?fڄ҂yD/f9E?1r1څ}ғ3*ޣ{QVm~+vm^ޱ˔]UdWNn9d-@W{9^x+D\voKKwt9/kx[̷/!X0.>UKhlQI}tM|6T3Eŀ N#>&J'`eϯ:W%<:~ FhuSk{YF3zRH ]|b+ g8ࠑxg" DItuy4oޜ~Ƙ !D]\ץ8Rfe5<;Xf[b;\WZB+; }sdi=Cs!xg!=O%z xr$!0N%g۶!a'14/ ^13߲UŎK^\̟ǜ߬!X -5͏Q(m6lG V+f>ss)%Gv3uOTۥomg|D?[c b摹GLW ఘyx%~^gE823nߪ3(1,E/K6$`,TRYYBPVj< r? ?+[d +A,PުS[nЁ^F*)ϣljBB" ?;O:CnӾO= ZގJ՘f-[pm70C?:O<G7MB Mmx*11A W>ё[o %穬ÁPg̯<\t|ƣ~S%'2v#ֳK[.e:ڮ9RYYis qm3˹k{}ۅ>)XkQU[JHo`_Y)B`یAŵe9ڌ zǧ(Tl{>je_,cx1^MRztO`lVZWj}{=J-s۹U5o-Gm F Oj*6zF#i5Ybˌ/\<k{Zniu8|<]#\uU!3zC2dUrz_5^F6?@"*񌞇_,cP}ˬ!a>{aڃif.4mLV}yC۾㛱k{ 6)Zs%_ec }bF:V+Ylwq7t5f4UFTj.6`LQ'\|㾶<<»ߥ?Ξ;vcw/^|c@ھ'~򋥣w58&M&/(u &f:C>O@ n@[T*/ulYKQGB˟Z*t+"tK--.!ΕX}.8wsEV\^h /wg.)+QZ쿾E =e:tѢӧ.pj GBp"Eͱleb[vR3چ&%ٶ`bBB0&c )mT׺d~6I܇UcursN9L_ib3s8k&f!4Xune?~ #-!f+8WUt߿V_c|k|W `8V[cvDS݁-//&M#pĉZ]rxd>ygYf=#"AG+w>ڎ;{gHDÓTMP\:c2s W=;/ckԫ?At3pzB1~ƢJDzkBqFVT*j`!D]jC~rǻW<x(vW!wE(RG]v:=rU玼DVm6b[BYRf\/reyW_Bh0g$)AeIIIiӆƍʅ /c* .))Sydd住:x9;b #3&7618n)}FLb@BZD%FkYT4ju+m_~Kw=cYo9T\;:r0cC C!)g\J}4Gζ-b6nm-]u{'oYw.yNjeٺE̪?~SvrAMk翚_N_,n &Ƶ]\]#o ա&#ou_47j:A /6LYb@lGe`<&cK4j F-a`O]·PInT9(wSS@]5 t?>Qt_,΁Z"p2ރM=4W5&44B c`Bث mW4i Y}m-%b%?ablas.cQ߭//!XqI3 .W^ARmꙌ&Uuu sӗ;}~n{ x=C6u 41hb2,a8 n%LYx54J[Mx|н?=mX:z_<]|bAwuL㓢p Ng(tcp2ӕF&vYc,+_B:T?+]o寞)?W]òp i.mLꭥ{_z?Ŷ_վ~Wr~e.?\% !.ӧOJ_fҥy+K5Yl 5)FMum(d8#)Z'/`p<\xOplv;*Us<Վ}5 g8F;R4$hkH:VTvR|SͱB{!]c__iE̪VPki ʹ~.X[0ŶA_ه?MKB\2i޼9GyrPC F~?ΰx^E'8!c&6IFM;"i2QGeڄڊ6Y HCp<&g`|4u"g/'_xU[qhq;m_xOq:܆;84t񎤻:$\F/p$GCЈZ5cU |UrWB(!X-W*BO뾡UBR}n^ Ulk;b[{{_~ BzfwnJ>}PTuVKS.| =ϋwp,)30 MK@\&nS_l&SdXfM&6&'#h\$;i F/!(qN^#x+Thuݼқ8_`,.~Q8y_&N8Sw4<;4iq *Cc4軬:.\oC:KmmEY (}3םa*__Iy,$Ng v7͛WD= IDAT{1G+ӯ;8 K7f&^3񎟍Wx: |"5zb3k\\]'z1h3" a&HI@L<o1S[}%Z3uc>N7p4tSk颎o`CxO{PT|{>PB\ϣ $z*wmϕ~^JCKU X:m{~(.vI,l|嗼888п,+l^y~ a騣4r1}C+lqsgT|3>S Rc>DOau 4 2-32 4'D=b,oupڠR7:g8k@cLhڤ/= m݌ =j_Z.BjgPuV׿2Pd,uC^uj;^t˶S{mun_ǫf\QT[[R֬YCL<¦]:z!Yc2:z&^a3 APS``Lf;yxgO<#z~IsQ'f%e 1~aSPGNбh0hL&f<܆wHE_AW7=z̓s-Rx駙6m% !ը/!]w{W~+ N^C[kLSl믯|f}Rk[kᅣ`!W/ХK6mʫ^s`4QQRZ3\oW§A`Lb3o4#3 M@L|͗KW$d #Ƣ1=yOՃ^Hۗ;[xͮݧiGNj;:R5BВ۾{]x{t4k҂FѥKVXAIIez" !ĕU(ҐWEE`ϤЩ =!tVںߺU+tٗ=b+x&+MBϺPie˖ѢE vݸ }иcv2i ,k3Ͱd?mH/:ψ OO]hfGiێ<ǿ~6Ox6OÏ#mٷx7xs< y_[׿Q5mʱ9&P5iJK{6mdJ}e+b !ĕ(**o QvhCYYEEEB8N*S)8InGS,ڊ|޾~}kϺ>q5q[MBU@z1~::񥬼?qfYa|F_lqYGL/.3簑|ӇӯoKi;w?EOtrk/5qՄw}|>OzGyμSk`TMQ5iёO>e˗pEK赟{TEE/^)zfZmkׁSɡXfRǠɖebkQkaaׁS?&!X=Fs]M6 F܄L+>|a:HNp ܇k}m7xx/vKw8c$ziqH׀$z Ic7'@^3v*GGTMȜ9kߕCa4YBQeee\xk4RQQaR#hLaWw PsPe|!(S޻I1 u_ BC(Ū4M* lݺ>JBМn xYo"0~&Zs]M J̀Yͮn<#opSoN8{ gLWt$EϧtQ/<+tR'I`y-0~1x po*6b[1`e ^g !qy)RRTTtE3v8E\!O?:=\4%+g.atu[@4GMoPk0\5aF_S1._#>4ivM77 TWyIB!WBB7oGոow J&|Qs B@\ޑPd=2u\<3񍚅Od&Aq3 ˠ&/toUatpziGwGKKOԃxWP5Rjb!t{%B!$Atxzrh?CWᄏZHPlQq KG7q_l&1 ˝xyī]}CqIEg0xG0${LNn4.T*}?D3:GҢe+4i^d* TW`!B', sh Eo~ǠzC:QFK/zp#^ LNtSkKp Cphq3*F{ ezB!D!!X< pbIm{M,硉Np\u᱗?c \O$ݽ#Ew(zjqVǙo<Sh;n>qBP5Qx NPЍ|csTy9rB!B $ q00Қ;~ǟB؜>Kpl%&0f4n~ u^zCp/8zSY[s+8m^Cphu*洺^zeE?Z B!o"!X J}%& L]=P5mAnkX&3PN>SRsaஞU3K/vVG㬉{`2o({nδy TFr%hpvѶB!B$ qt /yc|CCϵN^ KC˸:1UCG''0zqք/@-N^C೾}%ZhM#&*;3yT}Q+B! Bܠ#tJݏ7'/gu,hzGˀH\Dҥ_jxWqlvyWÈ!l޼KLFPiP)C !B`!nTJehc[Q5 j^m{>TG=C'Xձ7HKO0:Ѿows*&ThҤ):}_rɪ~M`2 ^i0ɬB!Ha4AN@qq1 N}ycs^|#zou샋_JMb1?@-ݼCx.-/MqThբ> u?&@oЛC^Jh B!B$ qԛXTAAf͚%| xzpgItOW ?& tOpN>W]{v{' v4ut Jų>Zfʕ[VVVB!, F_a `ܹo&4j֚! O(O?-.A tv$:}`c 7=w?FQӼy 4vwATT+VÖ n4X!B!u@B7J}% 閛phڜ{~W h:d\#[0tqgxՏxGP5oISr*F4oђwysQZZ X~-!X!B\O$ q0Y2VlAёh+ ow_ǟ?m_YR59M܄#Mon}ϫoNRHÙ3s*R(w !B뇄`!nʰ|(-+d i4%*GGTP5mi3T86jJՈMZ؈&кU+^~%^~9"&gG~ LFz&dF!?B! B܀j&Ξ=_1"l8*MZ@_>@۸x'Ǹqw#B #6 Ft:eeeˠMF !B놄`!n u]\RoR_Inn.999OfȰ M778x`r* ˭JFs_Y_ B!z"!XHЀ}&xުL0 SV^ U cμz-zAg9gˡB!DBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!BCBB!B\ZKii)%%%ZJ]uU)-/HwRJe+,%܂r JL!'wgqΟ3qSW! *F~:I5rc09sOkfa"xtA2~ ~:zMC B!Bq9|0)))=LMꫯtڵx(*2߇?̙3IOOg:t2IOOgL4tƎȑ#ٻwe͛73vXdر$''3qDNm!Z`( %uxB'[ j**\*( KQH^{]VVQ@Gbjf̙s5 {~r9X__gss|>o[>?6Y_7e~r9wY&~dsowX{H/r̋E.^XowظʓϾFË|u>ůgLނk|…+<[H H,!نm; c8iX7GibݦK8DHHK@/>;tǎ |Uxx|s!h8GE<#GZ-9K/ضͫ /^Vq!?jr_˗)<#b۶?4w,S [/8|)|ѿg3\2m> zȨ(sgƙ ݐY5Cmc5nt`kRb1ߨM`ߩ"٘@ ~(?pZ/;S13|Oq_ƻ㭏.`o]=Nq>?ϞqgOlXN?w{?,KH;tS"Bfޕa@*[r3'}l"Nl#iBgT5)t:|/5F]Z0XEZ&Z̝pZ7 btsri٘ LL DFOۉA:fbcչd> 6z>XLy$> _wCflBҭj2nd U%:z|6}6bѼe0HCv: /(H( hƱcǸx"mcY Gauu'tv4yii?\xU(O77~4zeeÇꫯuضi… UL_ |k(?9^{ʦ'#x)4~Ftߜ {9p޹JsoOEp=xh[|I)~<++r I%$M[\ 4ZUSC)%5MhԼVs w`RH{+B%QDԛoWIF w-)y P(n~T2Z(1vҦ%z~s{5vPJC"ɘ[MacUU(J/sQ/iDzcQ!&v@{3+$TXm۞PiWIFy_bۭ"~;Ӭ(A\u҂{ln47 ,-.07V & _Hl2*kIp>$ZB^֎zA-.u5h!6TsIb hg)۾T!;?Mġ<&g@uL!P$Hj=0ܟ?Pc)Qd~U)|α F;U~ z~Ow.\3y?{>j|TUV[6|yuM$U#v'\̤ !XmwFM^sQPiVwwES `zz/Z-Z/KKKlllj@^ʕ+<{=w`%J ۱:m*q31^uU-ڕNB@Z1"F&%IOc(f{Mo 4깕{ 7.λB P[Lnw= [,/2>:sSgbj}Mγ ƙ`:MJ Fp~i}SSL35;˾Q&./o|1:Q9}iɉI &G8r۸4;i$uk㓳ZAg!}s_h@"~n-ѰFh0(۶m/]ĕ+WpM666vxEQr势w}}Vv횿wwccb_~ѣGyt\tX,pkkk~:Z"Nk /jEyw;;;~_k8ܯ/qIr|g _{;*|({>ɝ{sk+?;~uo4?U9Ssʝ|?HA` >N,{'/]Qr('UG,xzA3m(vǁPJʀ?( Ao7i>Sܔ"4EGxOOui6v=wXzOB/m{Ѣ;7h$Ǯ')5llgijQE<7&vN=@lA;$ӣ*l{恿yP2XǂzzuiݼVvk%L'g mo ]v -Ϡ}'7;z ڪj1g&#@zWz@()F=}LՀ^[-݄=܁sE?ߡݖ~ nmsWNX:,H* L>X%'HBOLHj4;l0=<",m192F"x$E&G20n33a"4E$2D"=bZ9ٹIVl¾`vs;z_Cӷ }<`Wn#BËw vlwz5\8`TO~6XI?aP&YgX_adY]iZ-y7xgWbޫWZ[m[eY׮]ckk5y=m?ڶm?Mzcc r0a-|n;Q^;=ɞ{c̳']rIy<_I81~IvIs=`s|/q_{;rǽ'}syqv{c'YJ,!$3q-G\uh)kM >$-Sy+otO}a펻L5F&B!i}$uv̺NR 2m{U݉`!-}&dRq,zP=lI.Ҵ=>ZQVҕu# ٞIYNC4l@OX$KGURYMN ]tWSk~$x-tZD3P릅)nʮ<Ad֫bE()ɱ|O v"WbqmY̍ucccDsvj}>m1=2֕:;R+g0>1hљNڂ f Cq8lq=E=GDd Q/;Ȇ ;zџ{ ֝q ҞQ"2ѐ ~bӪStlTɥ}.^jYkkk,--X\\h}teYoM=w<Ǐgii_~cǎ#p9? `y}}kckkח3y0_qܫKw?W=eϟ?W]''sIܥg]Op]Og {~={{wl;~/=(v|Y;W>Η(?zi/ B` >GQ R"Jj+Ӏ]gf4t7++J^ŚmV}0^%cQo</5]t5]16ũ4,FFxә.)z.Nrp'BM3 'Ӵَ̪^$cQUvEp9=J$}U``}^MWF"J^c6 [7&}IBCk]BiդE{Wꃧajk)U5iyOzAc=0덍?YNDzM^d%NHޙ{M nѶ=opOIiHmӵ(&l?6F =vg>T=nQ|2"Z,u-۶{|m8[+gق38k1fε(͌1}v43V3D"Ӹu 'Y,-,fFo㵷D&Yn]]s¹QFӌDFthᄈ3]$8H͎1:=Ԉ iL˗sTہ~(\!lvnV=Ȇ ;z1, ޙ "Ѱmբo^I#!'t׿f+uǡZHxӦ%&a۶Oh~,ˢRJ'i+++>nl.pyc|c >>C|n3''=*߾OeiW7C$}|O AIJ'FSBNFŝ5 Ƣ zXvoTx:t쥿[S/i]Uy4eN&WMPvNBAJd@(BB_tF,&;dl@nU햙 We5 L]Ҭ44ϛ)٣$*cB03ck)tBzP4ƺ G%d.R-n4+]'úrߞݾ?7;zef`jn [dctۈ0j7mhD}H[vp=܉zS][:#Dy>*{_`inKDysaH$ m[=;Edl .OD_bn<^gqz-g4B$2yhc߈ێ(#s簖D!a\^GFxj@{}OpPf98@p6Fw{`ډNzH&N&M6F{abRHr_sgnVM>?ڲ,$w Ol6W/]D] sqF z/^fr؛WCtB` S)vl w?- +w{@J?V㽓n` xzmJݑl;frkEҙb`Қ7=FX&fLLxhǶ_mkK:ci}='7(۝`XYdL c=~²w!Ӑ蒛==Nagx9L=vBVe8Z-Z{\l[VV@Ϋ%CUz}IDATXIVVkoZôP3ㇺݼξΉb8KY[ۺ1)0!}(/I%$v 2n>ճp%7"HzmUO}Z^$/A‹e*(vKk} jIH $;CRX6vL$n 4oZ *"\^\6B\^'!i%5URתIHHB` / $ @` / $ @` / $ @` ö+y$$nebr>H,!qе(BD)7}kW mgiM2 Dss*Ţ `Ą@3sȨφ|0@o$n/HUnw3F5CY,,2B?_˞MDQo;#339uҪ@AT$*T*XP|auTE22%s mqd׀yǃ @$(1|7(LM湾6 gwt~";/8#2їK,!q3pj$@rDĩB,wT~$JAN._a\/l#iBY)z?o3*JƸlbH^4*o4nw3F5&l6z>|d)`"39,B(ݠ+p m  ,=PSLΜIpw_6Ft]I MFRìeT!q abY&r.Qdh\3џk'3*L-z{% IXb0I+u %-^Kh<\%g;$'~4Krh jVL\uW(~NA.VQm9b5mMYKmMdJ؀]{gy,-TTԽGh/9MTmKNDI]Ͳ9|[:Q!Pb ^}j%.F}qdq>5A\۪T۳Z]CKD+9z9?S,{Z&Hz5Av+PI-;,V@UTArZUS͡z:2.*I5 ,r(Ub;\o딭 JuebJOl Ix:|Zز,nSݻZ>I2Wu2 _]WuP%P΄ɮPTrU Lt˩N]KhrIn; &jXXq5Pb6QyES//5>6מV9%_G#F&E(dhµ +؆$ft,ay$x1fb~cBFA8~eJ2_h3,!v|ޛBtz0ȷoI A#a巓q1p|P%Ɠ$}.@G*@T7xPL ,7^O? IxΛ#Z*q/ZS#y{ksK (b5E!i.Q$kR BȤcRjuh*_F/zc 3 J66MאYGJsFhaOGBcMߨz1㶡b40IC5ClI&ai"chn[ZC/U3K$jBڽ71k^N#깲A%BAjg֪S*B(}&8BiFwlj%*Ѭd0IqzEtĩtjٛ ꃮ>b2*"NN?$(UʞS +DQfHOBDžFxI~ ;\olmOPV-R"QARbly<##D"&fq|zHdFFGDؗX4?I$addHd%,,&O-gygbľE0:o3܅ !m}6Caf%qj"NS\]N~tHAJtT)M. nC;NNBY*zLm_Om7R 5fEs!6뭋2阂)V8XK4M0%uGtwڞ@7sLSA!0<B$ }UGXZŽFXp(UVW(Y`Žl-3a44йgNODkӕEFg{aiN|JiFβft,XKͱ/obg9=qe&]:&&]zg1::4goOxr nĴM HWqZwz)Em|,,g2e ԡ@'/y[hzvdDrUt5wSڵ>q.veA,!\ dhWN՛(;x[zIciP;cS+iGh#Kh!$_ᶼ3&d(WxkX.A -2*!] #݋pU?1NP=vS3ݢcUQ3F3J' ԰v$ U mņZ6}_鱹Z](4zzdo6C` ];Ni.8?ωj!$8x_;%v -וXO}']Urw7{5tY{QSzԠ6{ ;N.ðz¾%Y(hXL蒟MVU~p=}6&%eˡ(}78 G==hR[yVH-`!2:#2>WiY-fG#L-0?3A$2xQޖ[j(g݃us{9mcֹyfW0:JL,>"KNbya#q!2e/ML;ƒ$xۗfHF̖7KIwgLN\Nlk{w,+ *dׄ8[Y㷻}Amq$uBڳMArُ߀ͨ3~jNn{kO + `xv{_~gh[n.еPzCo'^;e?Jz` &=ZC }x唛PňfJb^#$JDOp;S%u>$ ~( 7 /+pA%\ӝJMlDZKnoe֫ME758Qvpb:d8؎Y)UjC`wY H34ܞDkF p&B봷~; *+!\٥a* r1o-/0:2(sBSc{1-\7}Վl.xK̎F166(8JDPRf(.?5 ד^;]m+VA:gm%ֺUrQ%r3zpeOɄྋ]Muc͋g`o$x1f{L>U~D rVF#>e%BzޞmŻMîCo';{v^n } =nW2)!~ZR[y=A@{0FBd z.O 9_6ܲ ˢm]jojgvB` ]Bu]B4Hi6 ijMCwStn* $xGkNypv*9h-1-#彺VEkuuWv܏N3201t"1a"|YVzrwD1u<Ө =)0@Ow)A:ӱl7n sAd+uǡZHxpeOip$Kk1J& #Dոڞn˪ffjb[uq*3=)LlU {ER2hr?@PTl8ÞkR޽֥ ; + ;{dq~p: }W{ LƙgYScM7LlۢZn!G:=D=tjXSu헗xy%qnyϪs[L.H,!KBN){!?Q E7zkU^:Sz{jӬt"uNBAk9u2@[$t뱷-n^"NU$σPbh;'+\lkvBwnil:+쪎ǟSH,!!qhyHd[͍s݃E49%F{_,޶wXh*H|Va^^L.,Q7ZK?6mP ^D0Sl*9Ő[O Djуp]_$H,!! e be[VJH>w%CRX6BSS%$pL*$] CڸYM@nP*IHCon`wpj-w} IKHHHHHHHHHHHH|a IKHHHHHHHHHHHH|a IKHHHHHHHHHHHH|a IKHHHHHHHHHHHH|a I?*=IENDB`PKX^HSQ==4django-cms-release-2.4.x/_images/hello-cms-world.pngPNG  IHDRVosBITOtEXtSoftwaregnome-screenshot>IDATxy\T[faaW1*ZLԨ֟جfO_mڦ5MVmb1hXC;A@f`7E [ν;s}m[ Eo OpkX!pg  ְl6[,ql6m6[0Jh4,m?=!ԤP(Z-MrP__JƇ›CE"KŢP( E+SZSR4BHE]KMc+%*X,^^^]SOcnB ])B&Z:("@MQT>`BzNPV4MIE}j?Yh@oe$Џq 9s&77s !ш0&.vw~?1%!P`0jRSCB PVVV\\!c|N{!Qaͮ)fa( (#b"F*fF 0R1^` .Jb>izݺuTKHgz|<h.-(o7$$_S1 삚% vղ#U1chgԶ^0^ⶢß޸|1Ӱ}'dknFz}^X psN%>p6B6%]*>Nwy pyiTRXqU0H_~!` JdJ٘]PQHG8Xr~5&@y{x"W^tiEQ_K:;2qS/é{ᥖyef|?nЛPC>Sv;VZZ1D}1;;aaaӧOD!ooxoG,gffVUUCUWWDOOk׮͘1#00ԩS㘘ɓ':Waz{<6qF%\PsBQ^)B,6;HlBѳE,K'+b@[m\Pw|hxM1Ƅq@G-<]h&hV~?y|pk0˷w 0Traǖ<[RUE{r0-m:?遦.͘*pEBj~ hmb#|X''GW襖VG8crC wyݣCv5n;w\BQZZZYYېT*-((HMMe⒓Rivv={֮]UUU.]H$cǎ0a±c>ӧzJ$555m߾=66vڴi6;qDbbT*X,v,˞8qb׮]k׮UTnmsۛ!"Ll4[Jo7 U7@8jGBDŽz{om;j0¨'f"M& &kduN:BH=ņb3X%\AI2i7URNK쭖巟ze z3S)qXKSP+ǏǏiz͚5K.ȈV>UTTTRRmٲ%33sΜ92 cLQT'imcls-f04v!;˜` V9;KID[9! B,V.nס [X9/<ۃχ}YŏךsN;5h [Mjx L>sn^:]IQ]A{D'yW:_c#@L%s_rXwvpDğShgI蒶pQUWW8u)fkkkNն-Buz>Нٙf0e\NsiǧYÃ\B VX;$&0i`KE6)~CQ`d<2(V_^ńR ("1#g bpRȎ"S?hz_;]N} ot=t U ЪD/wv ߱wʹuQD(M|,P.`|ǯH% 2mßs"҆g =dRAs%JM7!Pdd=t^j瀘WTTT4p@:j5F-Bȕ+W/_UL۷ ::rrrE@g])HdyrJ[C}߾}_CBBbqkk^w2izԨQJvի)))lgL&n0p*jܸqfРAǏϢ)*)):thbbSq[XDSlp_1):^#\Y(d Z0&Dʥ"Mօ%Tuߜkn14C(W>m oh.]_ZZqFIII :GDIIIZ6//`0T+V;fޥp0L`` EQW^-//_lR8qb```^^!$===..c FO( ( rk>c Ӱ,SuS_Rh4[s) @kvǡgoz,SSRTP``~1t/k !Ht:NsG84סqhh(9DDɑ#GF NVMB0?җ٫*) lie* i["lˡl=(kjXQ@E [A¨Vvf]^78ʪqȑ#KwlC|V\\T*;L.ah!ons@S 1|XmwD圊!;x<@WB,J)S 2ՕC=zhccd*,,yfZZ *"NӮצMl=,/1&@<}xg@"9r= 55˫LR;V]o\*z}?>]XQw=`X\ȚFy(mSBHgW;%mjQF/J!u*nY9w@ӔLŠeSd(J*Yillͮ=ʽgSv:?ﱻ1SX !z^okS'hJew?% ׂX,6gV; 4MrJuܚ ""[#[#[#5wR![#@nܚ1BE_v_Cpq_?B~ΚqvVwi@WyթEid#Bjڼ~n$ sojB~Bqc/ j?~i~=|Men}nOIM6iL2c[?5;(*l3Q%Kz-g\CG0.ypxpO :73дb ^G˕")*` s-gv ;oNH\ls:%9Ef BZ^ᅭ;2Kw^3v Gf0sφhk_@Ÿl#Cթ -msǧC=!OQ݂Bҵ+o*?_f|4NLE~>6Dݮ.jq#uVn8~E)Gf}#PlFO>|'(և@BܵB-,0r19=Yo'ĕ7̔)&>i\o/O'l Qv! #}>@k,]bYf8*?\W0QxڒkWi)J;-gn A-%FLwV&y,Kf㮵@|}/Tؓx%-7fj v8(~V0UJK4jI@AOB @7ۊz-;֌kقPφ7f0Ȑ!{&u\1yT0zw.@m!s;\sPʱ?k8T[G%;hq3avCc-6ƀzf1N92c̕~4}߫8?mNѰ OgڴsNz. ydᖓK}|@ѝ@߯O y[ٷ/W`F9!"K7.mUx@)Pĥ;D &`U*FGJ:xz|#>&j;T ]/Ԗ_*= s}9'q;.pEܙӚp\7|;Ԃ|d11?z)Qv.uGIʵ5aJ!3fk[\7?1wΜ9s|Z&.ZShõ"\ ?[`)؍F#EM`j>Fk-kuҮB~c׾w('(mXGE|xDžkӉOPcւJouiܜwuWTAׄgw|2~!]F6(p(e)1uqVuWL6DLU2BYطBI |뀆+StE]vp1uO~4?ѼwW 9@.EШHC0V(Y-T\DX18VW>Ew} {왉l;g6똻6 ?tsfs4fz_-{R o#(|uM_IAs&T F"*WD,޳g~o OX]mWZ1,!G{ ҮOK"O華 5SܰuLgl8ɢ'v]bߔsS-*P? E[&-nzr;. Znyu~bT觯DB,UW+qj" ЇIpk8F0&◟|IENDB`PKX^Hi0django-cms-release-2.4.x/_images/edit-banner.pngPNG  IHDR(ֵsRGBbKGD pHYs  tIME  (!tEXtCommentCreated with GIMPW%IDATxyxU?{99IN$ aREZ8T}ާ}}n}޷:\[V[Zd"E IDL{$9dD!}g?}^{Z[Z[1 TAAAA H    A)   V4E AAAaHRAAARAAA9"04fu}kq\#v?UUq:\.TUA |! s\8N,h>}0LYC)L$Bee/kpY m>m=sHHH;WAatɦ&"##eBpDFt0hiiavv5\Ϫ*߂ )_|n|i#?:Nx4M*ڨil'OmJFRi#@[[e-]. C)0#r{gmPL$'6R#~miH C7 B 5-*AAqo?<}}o?<$\`|W]ٵkyyyaǴAIWy"L5pGQPhi[[-!bQpz]YwZEM746 NłnQNcĔD{AA~O9ڔV5xy(jfqmц%n]UU塇p  3IDZ Jj)h9dxihg2,jgpe~9yYnbRp-(*AivyKGGqߧ|}Z`M;H~ש<d۽U{%$wX:eƓv:SAa ma}@8/i[C3bS  D秒bq¨ }<(q^eskFq|Mj='z+aQ Nk/&ϋk)e_C 3'M4Q`_OJ]޾e(d0kZ2w\;OLKI{T `bv9i#7{)(y̜+/U@q5Fgk<ۨbKaO,26ϝ̖q+> N/gY0{Ia.cs=72UQ7;\fR4 ->:1L d%&=V-1P nӃ7K$wvFաB~}^ǘnm|v&yxoQJ;qeǓ簾#e VΣܴp*ǫIwrX3+폊clqFJKKu/^̙3Å_Bbb"v;wRUUEff&+W$11VSS{Guu56YfÇIKK۷SPPatRӠ i:i |uI1ybjfKj4;wuڭ̚ĦDZZU`fNNwp̔hTU2GXmy%^'fŠ X.g7~/ۯk:тi'r4/eUԆyt*>MYU )w{.%N P5^y3ZPQӸ޻Y2ɉbe4B=tԸ٬|k\h\΁:"VnY477NE]+Q;FuWH?*9ZN`L5mn~ ku1vx~fgae/On[U׷n>)<''XrIK/X|nKX>믿`0ȇ~֭[={6Nφ }XVnʆ Xv-QQQ=*+t{fMK&6Iym A;XTvLj2f$mo)3kZr||L&{ -5 `=~2VdX,!fWiTdum!"e`*V;lsnx"; ڲYUU()?GXq 򧦐?5z>Y̡uc 1ږ'gib5!A,..P_2cu^(XVrZX"tE%D[ 0h m~cS'h3 jx :,|~ f˧'x a 0Ƀ|w3n. t/a`鳱ivv֪݁W-,:PX%(oqej?.;5Y|~s&ן}׻;p\F+]Z@ a npvi,~h\kӽ0>$}r8ñ/?9>WTP7yܽs{5v-j#ʢ4ܖCڔbo34Mx7iii!::EQ ++Wڸ~e1 L$==M6qQL~@ @TTT|v{h麎mU󝐀*adOҪڈt8E}dJU4 &`H㯻x- '1f J1ܔ7౹lBC9Tzmw^L;;v zvʠqz3OyK D$>EC/<;GyC) \(D8'g_Oݧ/՜}NF0V O| RQ>xNh=wٗLxJ* espq)O{4 ݮ5GGѩM礹Z-{(n4}-aϖ=e儮sMm/Lm|wiE;$S fXPؖ\S ԧj!7wH>nc쬥$nٲUUYf {/w}7SN% ))S0w\֯_/s=Ν;[q\(zHTmdhn-J`QAӴtM70BYUU룠xO$.ͻ BC:htBձώn1%D>LQBtvpIw(F<\4 !NYPsIΞ &&e[J~>g>1'7𹥗fS⣾+Ąng{\P #9X=)2>0LoQ{Sooࣣ~4Ӡrg<ܽM5uO+A-H01QP i#.ɕ2H)J} D`PjuJݥMf˞^^w0;l{-{U5skOI%T;O阦N2*Ss+glK_ڀi(*l$;]$U:{i\wuŅ/Gkk+˖-#""4 竪*pkYy|2'7'qG80 s@QKfdPYBEuYiqIYf"vp:lhz14G:5Tßs:ac<6%^}QމN%Y$TkSQ6 >gۇTk5n]RQ/NA~7H7«[õ7&V1F== ֨8ćmԇ"X|k>-Ϙ<"񪋘bxzy ?gl~Yr5ep2p`-n=׿+yH|cw}ey~jANj Y1(eq-⹓HMpS]G9Rր`Nn2'[H8cc%`IƯ>ӣk.ZCyy-l4@Jί搮(%K|yXyQ7D@0MOܝ~K0@ pV_u?Κ5kHH8SO=]wE^^g֭[)((bϓÍ7fDEEj*֭[Gll,~{{G?of޼y޽[Z>z+(//gݺuXy+h x}'VkU b\>^ e`m<&+Č {y~3<ӘdU.(my};v=}|iSyYd[<7po?_xtttiYYY3<UW]aƌ\}eԩ(BYYcf:CMhhWodunpOHLMkͥ8֮|LS{/x ђ/&NUfWH'^˦IOz)++KGO;wN$UaJll%ijj"::Z4H4 k.8z( ,6c:CbO<^M0=`왰*n`Q mL|F:K4Nm8E0cQß5(uM{;hz(Q AW梍XeP4/5_H󌪪l:eϨ KA(~pPHOmGV_0  Bns.!!} JUUp9F>]ή#FO7#E 0! #GQa]:4'6R#ﰅ4Vu[qحLjn7ƠOkl=A0#mLa`wk2>V4 gM'6Rb- L mmmttt"l͆1raͪbq:+VA躎ih&C@QV+VuޅDFtRAAA8'mȫ   0ȶ         GP   x(AAAss =IENDB`PKX^HYmKK2django-cms-release-2.4.x/_images/my-first-page.pngPNG  IHDRcT-sRGBbKGD pHYs  tIME E < IDATxi\u&x}{d{v )$ʦ$[,ɫL{lw8z<1vtLݶڋ}DWbGj/TeUfUȍ(D~_0̗wy/=+>u"zxobo{/֬!{ HD[!ac>|25S"U? z_AkQT #ʦa `fI1#!A4O&J򨇈YMj6>hESGB!yED@Ҧpbͬ[&F; i@;pS‡{Ư{rc5ϻ_ԴcwM>F snftd7R!IL(LV- `nGIU^MDJxMΠX@!]Y@#W@W‘ .pA '$>!`:!#Gˍ>xGOTQlcc!6䗛*5I@7;y[v7n>QhB%tK.ϔ154 \4>mn5MH;yʿָXDFq rQˁw8 + HOȩmv?^%@(9B4;lTHf p0vof@B \xWprZN 6/^w >xqo3 [. ͔}kYn*5 {׶ 6Zy&Jdڀkj.ͳ-MRa8IDG"SHs?u29hYh2EA$@JF` pFN 1D]4 D )rms_Ru4Uh BFp\DF*5@2 xXׅ{lA8 MU@IÔ^L@²,JMrI%A6S}x$1@P′# BP%&.y@Pr9$)XGKCqI$D.H" D$0p8" Dt9 sl.%@g! O4r\"ڡs$!}H.IR+28dV~vI 7om"DrAFXcC$It'Sk7(w×=۫{gUv$L>~:j>8;Wdb8g;Ö]+ G#Q+d+?x5(Q}iKrZ>o<=vHNLJmu"A)"іShGJ ! wШm@tqi?Pe~lؙR[ 1FRli6Jy,l Rd IeB~ֳ{bH~`(\)Z;@wFJk,g숫W9$PQl4Ht>J~]Zhʮ^qcPaG[ 4J)k]#}evwGhGR*HFx|Kv+YGݿHDvkٲo jޡC}Q̔h_@O2AJ4-Z!Q-ے\uz=Hr#۩rj>Ua-ԖvvW2\T([\S[Z(jkPLݿsh%_,V;lO@A6,[]fW>7A2ȏ::W^H>x(T[ɖv؞j0GƇǒ:'Use|D@ćvJUx#Otu2I*`rb6_և:ՐAup#iW{zKd'W?CmK vek'ͦb偡ռ5mΟ/Uٺ+‰OwrW>z@+\`{oMvTۻm[Kk厞Q7]rzz{~w3ܡ}jn`ΰ2264r.i$ Yť)ǐQUd]˕S<;> '" .ߺKAz|}岅5DmQnGkw>tmN2"b!f"tZ4WYrE`pY2% 2w _ݧKWڬhb&/UB*+lj-ǜ#p}Ās@/&3(~l-- WbeA[xX$@rc bJjcP'PAJ<ǻ! dY-%JaKOp9U\.J#8=W.Qa9S儆̧*+e׶tT-FWe.U_:=S /^- Y331] %gYdrdؾeG2ޖkS+|b,/r\HtᅣSP|9_vԾm#xoW{)=?W~ʼnRcb͘L{D.%#, Jf2ŵ<'@#QL[ 3De@zS k0D E()EbyT5;ڰHv zD7|&I ģ\T M  M=#c#;- +2S'vXٚ)Ql5Kz¨Aif=8l=&@2T I"M%%MBC#Qo½pE-wbT)04a0|PBYwa@.V,Yy B)IR* >wUkrw6U:3SoNn(*kOIԂ6*ge˽_Z|T55䮶XRgo|j[$)^9?W +eҕT+KՈ}O_\>̮^neX,O.f*\_+g&'>{}`YϾɽ?vUrU7nթe4g2J0(tN$க++ىکկcׯktqqdx`%Pr8CJK׋(3&Dtz#?7G #f\Ȍ]}L˫=-!Ϥ^, @HpqJ0>ϟm`2%KoD^S;9Ide3Ռk RE2>ˏMh/N'G+^ěF ʩ{d39'.mmkͦ+y;fI:b[cttFf2 ؃QژHRР33K Wx%r!ZZΪj/(o67ER)fƇw =;pPF]Peg"`LFrE- %p80 BRD)2.I"dNCDqQ<$sJ$WP<n3J$]_*Pf( E" QV@pDV$!Xٔ@bh;\) u t$< c(Ad?S$$ p\dGw~}_"\D:J@ #"pxWB@$gq`qD @2DžHE2E L$@X28.J$E%prч c0p8 AH5?!Y9(]Mg8g㭺g߻1u^k#lmB!؞K0" j7l(PoFBo~4;zn1Ěg%le" G$P RϿlpUh26wPk*2Į6+}F74!!J' uUi֐@(+ @oiޛ %}Y *]z- $5{T]<"&Nl5ť4-׆tCw,@M\珦Qv^#W@ 1`L$䉉t`sL0ȀPm&T}G,˒9`-Ҙ곀M 7MmDUГPIoއ?z㖤n3ow o1٦\wȼ_v>|<>>|LpYϠvVڤx~>~,dÀg@T\dp3--! ˡ;~EQUulq|ǻ.epl؎SP\ALBZiN!z&qQ'ϥ'yx0pAP@72k"_|T}LkrV7!"qH_ǽ c.Y+yS.7z`O_\j2)\~xwoGX5MKӍ_-#r%'L/Q\.Td,T*N(db|| )=ײ8yhCKx9 M9H>|6ZV)ίFfOMZYI{hB] =ąL+ M/-TPCc +R;_xuO.ˤtY3WWtʼWM(iV<=u-ѡKX̭d+ROOGTr>|gl(IyպKO49VUmvE ZwkX!1)gUIM$ɊޚT*JF1HZ⁑D[@.bQ@+_Xp8WLK5V%-OkˮՇ 9'"Q5]P̲0tI2dX.;BGCs䴷DD YbkklM*WyȐ+ e%@$8qI, K4JNv1W2`\&C[Z|qǩY)Ӟ>7.-، ~:>|o2 +SL n7ow?*xgoѦ~OY>Fo9szXZi׋+Y)2dV+ fњ[("k9^ggKR@5ƹpҙrpG4_I*svIHJg^:}f[Z{Tͬk3uivj!n4|㻗SykH]ZtCK%vE VeWs8c'HOBb`UlAM%ga,TE&>7[ * h=]Y\AMֵŋ`{XgNQoWR\-R42|3 \\Mvʶ%)\Lgy(ʳKV$9%{z5*Y KU- JN=:=ruLj~za"%ۢBa*78c:>|܉ 2V9V[m{'|Lgb2musnWu*Ŋ%6ravn9_Ir`Nr>ǎ-UMϮ?}g7#؎ U1?HI1s"3mzv^L Ff ^{uhVNW_[PK8]IaL\pnɡǗv|o_Z:5K/.gWV֖W@貨'2H@ii IW\L%Y#zr"U0Y7?VSuwkKP#AC!UNY@ŌRLFŹQ,f\:TL;LLHO=֮eR5G#-UI .\YnyL &+mܺŅ"R wړ 'P0Kv 5Ue Ue.}íq9k;sD±cI'rUuv,^`c>Qg'_O_}sCK`jmUyu@l R:MkՖ²֪ tfWs+R=貤 liyVTdع+ߺx?멬DDUVR ۴h$KvjcR4;m ds{z!s|H@{_k$ MX2\ !ޑdv)UV}a\Hj45ERFBketnyP@2,!;&VgYr@$IgjoWJwu' 9.C<+n5U'ؚhN+3)0B]]u-h@[YήygGIvѯ<7܃uqlTxUfh#CIi>L=fYj,l(rDmܡ+ԫPiGw,6낟2ׇw Ɏ @B`D. K5#ɨtG>""}CO e*aLf&~{)f ^4Y>|Ƈ>50Çφ>|᳡> R;wTv7Q&pgN݈xÇ{ =7oއʍޛ2H5߆ͭ<in쪽-.` IDATi؍w}#Kݎnl6rz~Ӵq3n T}=BBJeO5zz"66X b-A-Q=d!"M&x wxs'/kgohÇp]V+.aH 7LHVep} M75~s\pX؍v`U\?cO<1!hh}Mj7KC$8eCD\YYy au" i[l)Vׅ[[׏Mg]jDq*d 'tF%ysjY.j$Lr@&ΐt9 4t DR!HH@ DZu8>|ΝVa4B[jyV9խ.uwm1VK W-[w'K-C!\_uk\CP(L}d*!<Ƕmx饗TUvٳgz衆xu&c]Y~wݖ_Y(gW9|yj1F$IQUYf _k\M<}{kf#^5>_ύ$^痨3L">'Ź,2i냏zxOiqLgxzW^J:?H2b /`9=֓|̕D{=2Ct3GPЇ~g+]i=܇<^\LgjهFڎ}kgJɈ[<-݉ū';G/\ڙ^+9{dC6S$SٚǻǶN-[n,WPb@#c3>< dJ4چzJٙy=zD"ܲ/| ׮]{衇ssh{͗R/|U E?W;Z0}bmXr|ǎX@" YvZ_1ΩϬgV'.幵7~s KfkW7/~ '"@o_wmxo|;GzTJ9w '6{& +pLßok˳/M豖+Ǿtbʩ?IvfWW>Wse՜// c~|4mB_RJ׳ Aye,j:S(Bj, 0Y*er2'Iv%V'._<~J^k&&&*ŋ'&&TUb#o[ѷ|Ss1̳k+Kz4_[;I*N.”nO]=;O=8Oā: AiFBc[zcggW'xϓcK\H-.ezwvg^rHXss BtPZ1_ܐHzh`W8<`5u=S UJe͞YI-Xr艧 1i{vte^]#+LYֺzī/gJim)g|%Y^ZJ*K\Na>|B5ymY1זМ$`5-;ˑB܅ɪ.,$x0iWxe9K *^";55600pEhoooLIfeyŋKd{4[dm ZM2-;`ΊC3}[{~O@חƉwG ͓BI./\{S\+^2 S O|*Q 6wlXDBޠ*y *:ȉo}. twѣ_ ˽mɡCQr,r|siڶmk.\8㺶loxRKe33Ԓfña /!]XXvZ\n؄Y>ZvTL]8MbLT rK=Ѓ8P*^xEQ8fٰ{Gw3'gj;h{Y'61S{wi3eKoGbp_yt:+zGvv';?dZ*㻷E 3J7k}aG_pvP׎Fw<9r4{+32#" ܇&/O_?cqdH,ŏ:G\<{.x6IևLG!c=:Ȇa<###i޵ 5$4M۷{qu5MD"7ؤ確/ ˲#2=ɱm˲ rŔdeirUUEǬU74ާ0 D@dfnoß8?\RUc6W5u\M'_YB^W}>EDmV-IiOHeY(c7llïqæ°Z050a[StUaVꂬˢjS0` 5ͱ*.Ύ|^>~W}HTU咬.LHp3wm=oHt6*~4mTƵٳ{#~)^}ngIB4zv 5{W^_Wzāʼ$MxN7܈cj77`"ë'^yԭؿ{hwdf>zWLsmާ0`A]y;ꮋ$ďv=@Vc>~`ѶW *~7; m6S%vvv56 ދp8>SJGGOr\RiH9(|tws.I-`YJMdY>-4sbI}gx)xUФ۽)wX{ܷ211ÞoJ65 y?mQ (  2 En )̲ld,vvv}xHdU% \v$1̪w="ڮdF\0D{ o#!3UO`bo>˷#εo~duݫW>ӽsg' y| eoIW4̧QF1᝗"flm|- ?zBm+ֳՊ< mhvE$*ǰӳkr{|q1ӵcUsZ\ClxWߘl]8NZfm3ZOUD|rGxە{^^DJU8tE҇h"5NTGT,zXe!1d* Gmr6DJ/_JܶC15[dJbtO/<3$ki"F۷>횦e˖W_}_2]pa֭O-1h6UD[7rEw3'5uZʁ|+Bp]WDBQrFo{̥߸RӢc([BShkNO/,oGTGJՌ$ [Ý!ƹ8wfC!뺁@ӟcc>gY֣>⯒,f嗏k?c_XOQ`b(!bzlwWWw{0ʹφ>'ӌ :hjL$ z%x`Gd@(WN.%1 df 'sV=Drq.{Z :BO>й73*{Nʛ=˲ -J?k3 Rkw]KոzÛ.5,G"wW7%|]wK\oifCD ~>oooo>G=[RWWצӆ`96$/DT*SSS5c]xqzz̙3Pvh"D,6 իW\) 붶zՎ&&&zk1ZZZnב7o<ǎ B6_R9|p{{B6xC(knyȑP( (2{ m_ܻw`C8/|!HONNvuuɲܨGDirΛ&k\j7{k+ׯzFْ_T_LwӍ3gT*-[LLL$ɡI0%s[ZZo޽[yA2nx\V?rH, 㯾eY۶msq4JnGGSO=+D"\.h>/bppP(J%˲8ɡL;N$ٶm/<22'O Pr\(:|p> J__\:CCCo8u˙zX?{'\R.?J!d4ݽ{g{Bꓓ'N4T*O:uJUrT2<{5M7@ı_]Q]v=z1644(L8nC=477'I 1~k_[[[۹s#G,Գ[8'{zz>y@hbhlˮ Jg'5s]{u'\t w֖H$FFFc|u۷jjY֎;[ZZquum%688('D~P HR\bx^#Tիwۻwo\"Rwqqqiiidd$-..{{9O$ ?|,Fwыʲ14_UUs._ğ>0~bz[,B }}8&뺮(bllljjpB4uӣ@ L"b,m[Ӵ@ lNuu] i')%R@@4hii)˭\nhhܹsnmm5 CeY\r5o`׮]ܻwo:e9{  UUF/] ÈF^,ˆa鍍1-z4DƘioa,uD"AD]]]'OpXuUU+W[<]v8q"yH$woxw;={6J=c;_{Q!B`09FJR*ڷoɓ'# [[[9;wyb1 c]cKr߈~@$I<4yYK \4۶=qV;7yN1˲dYVų`xz"2lPSSSdttD$I8$yuEmkeٶmoͳD,mvrI1֌*KIp?ԓPc. iCn%Id2KKK& W{Fޟzkǎys\`3Y(<fdsz2>xpK &UMln󖹝n,{;k3j6.lG7Oӿw¦r,- ٛj|u/PYe6lݍ>~t+%ߑS(^oO zR?C7M.E{Dٰ8ݖ HUU]u@U!mۚow}X( AnR;eLdيxɽͥ#&X2d'"K9;gRTU8~ٔ21iZϺ[g/-3S f!:w )'7M9Y533zR$Pbgvt`d;$И1`mmZ޺uZJ}}߲zNj-&{C !oYV0TZ"8gYa_nl+"NB~ٵc/~}6wg2^HP(e3MC+|{W:uv|.S)@,Ug3~j B !8BV7+%4F}1 T}οn *RG]UU>N~\_|3F,KVT.\PƱLoܘyM`,׃7jUꨥdz”ސ1&o KNa3F:NJzR٤dB < \׻eY뮮)UNyl!(<7Ę0a9c£(~4~E' ϹڦÉF)ex#z%G_l>j嬆0^_ڷ ( N#iY(lCuLAp95(v/_ g{pD`:EAU'd Dum۲uɶ'3R4]U5 z{ ]EQd̰P2֥F@7.-sWπ|eN²BV,f+QqW`jkRƲ%EfX(+nE)dF2s)ʹoږ{QZ CR*63#O$TJ{bא(dp5Xg4̰9k 5([蛿/1~3m;uU"st6nت(kFfQ.iZi&ylyL)4{dLsslo(@ ͦK=~01/J""@aa(0UTPEJ12Bi. gqO {_@Q㸊ZaBn"EQjHhԎØY~S+'}rӐ䄾{gBZNBx7 qyOv5 #Rx~tBMIN%q;Hvm9!XHaNia yM"iGՒ};#Ly)R8Ĕh7xҢ)R`WK"ŏH"E SH")RH9IENDB`PKX^H硟S S ,django-cms-release-2.4.x/_static/default.css/** * Sphinx stylesheet -- default theme * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: sans-serif; font-size: 100%; background-color: #11303d; color: #000; margin: 0; padding: 0; } div.document { background-color: #1c4e63; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } div.body { background-color: #ffffff; color: #000000; padding: 0 20px 30px 20px; } div.footer { color: #ffffff; width: 100%; padding: 9px 0 9px 0; text-align: center; font-size: 75%; } div.footer a { color: #ffffff; text-decoration: underline; } div.related { background-color: #133f52; line-height: 30px; color: #ffffff; } div.related a { color: #ffffff; } div.sphinxsidebar { } div.sphinxsidebar h3 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.4em; font-weight: normal; margin: 0; padding: 0; } div.sphinxsidebar h3 a { color: #ffffff; } div.sphinxsidebar h4 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { color: #ffffff; } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 10px; padding: 0; color: #ffffff; } div.sphinxsidebar a { color: #98dbcc; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } /* -- body styles ----------------------------------------------------------- */ a { color: #355f7c; text-decoration: none; } a:hover { text-decoration: underline; } div.body p, div.body dd, div.body li { text-align: justify; line-height: 130%; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Trebuchet MS', sans-serif; background-color: #f2f2f2; font-weight: normal; color: #20435c; border-bottom: 1px solid #ccc; margin: 20px -20px 10px -20px; padding: 3px 0 3px 10px; } div.body h1 { margin-top: 0; font-size: 200%; } div.body h2 { font-size: 160%; } div.body h3 { font-size: 140%; } div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #c60f0f; color: white; } div.body p, div.body dd, div.body li { text-align: justify; line-height: 130%; } div.admonition p.admonition-title + p { display: inline; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 5px; background-color: #eeffcc; color: #333333; line-height: 120%; border: 1px solid #ac9; border-left: none; border-right: none; } tt { background-color: #ecf0f3; padding: 0 1px 0 1px; font-size: 0.95em; }PKX^H^oA1A1/django-cms-release-2.4.x/_static/searchtools.js/** * helper function to return a node containing the * search summary for a given text. keywords is a list * of stemmed words, hlwords is the list of normal, unstemmed * words. the first one is used to find the occurance, the * latter for highlighting it. */ jQuery.makeSearchSummary = function(text, keywords, hlwords) { var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { var i = textLower.indexOf(this.toLowerCase()); if (i > -1) start = i; }); start = Math.max(start - 120, 0); var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); var rv = $('
').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlight'); }); return rv; } /** * Porter Stemmer */ var PorterStemmer = function() { var step2list = { ational: 'ate', tional: 'tion', enci: 'ence', anci: 'ance', izer: 'ize', bli: 'ble', alli: 'al', entli: 'ent', eli: 'e', ousli: 'ous', ization: 'ize', ation: 'ate', ator: 'ate', alism: 'al', iveness: 'ive', fulness: 'ful', ousness: 'ous', aliti: 'al', iviti: 'ive', biliti: 'ble', logi: 'log' }; var step3list = { icate: 'ic', ative: '', alize: 'al', iciti: 'ic', ical: 'ic', ful: '', ness: '' }; var c = "[^aeiou]"; // consonant var v = "[aeiouy]"; // vowel var C = c + "[^aeiouy]*"; // consonant sequence var V = v + "[aeiou]*"; // vowel sequence var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 var s_v = "^(" + C + ")?" + v; // vowel in stem this.stemWord = function (w) { var stem; var suffix; var firstch; var origword = w; if (w.length < 3) return w; var re; var re2; var re3; var re4; firstch = w.substr(0,1); if (firstch == "y") w = firstch.toUpperCase() + w.substr(1); // Step 1a re = /^(.+?)(ss|i)es$/; re2 = /^(.+?)([^s])s$/; if (re.test(w)) w = w.replace(re,"$1$2"); else if (re2.test(w)) w = w.replace(re2,"$1$2"); // Step 1b re = /^(.+?)eed$/; re2 = /^(.+?)(ed|ing)$/; if (re.test(w)) { var fp = re.exec(w); re = new RegExp(mgr0); if (re.test(fp[1])) { re = /.$/; w = w.replace(re,""); } } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1]; re2 = new RegExp(s_v); if (re2.test(stem)) { w = stem; re2 = /(at|bl|iz)$/; re3 = new RegExp("([^aeiouylsz])\\1$"); re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re2.test(w)) w = w + "e"; else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); } else if (re4.test(w)) w = w + "e"; } } // Step 1c re = /^(.+?)y$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(s_v); if (re.test(stem)) w = stem + "i"; } // Step 2 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step2list[suffix]; } // Step 3 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step3list[suffix]; } // Step 4 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; re2 = /^(.+?)(s|t)(ion)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); if (re.test(stem)) w = stem; } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1] + fp[2]; re2 = new RegExp(mgr1); if (re2.test(stem)) w = stem; } // Step 5 re = /^(.+?)e$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); re2 = new RegExp(meq1); re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) w = stem; } re = /ll$/; re2 = new RegExp(mgr1); if (re.test(w) && re2.test(w)) { re = /.$/; w = w.replace(re,""); } // and turn initial Y back to y if (firstch == "y") w = firstch.toLowerCase() + w.substr(1); return w; } } /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } }, /** * Sets the index */ setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); } }, hasIndex : function() { return this._index !== null; }, deferQuery : function(query) { this._queued_query = query; }, stopPulse : function() { this._pulse_status = 0; }, startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (var i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); }; pulse(); }, /** * perform a search for something */ performSearch : function(query) { // create the required interface elements this.out = $('#search-results'); this.title = $('

' + _('Searching') + '

').appendTo(this.out); this.dots = $('').appendTo(this.title); this.status = $('

').appendTo(this.out); this.output = $('