From 6ad12d0098fa1a9e7142c6b1f3477fed814161ba Mon Sep 17 00:00:00 2001 From: Tobias Johansson Date: Wed, 3 Oct 2018 18:30:40 +0200 Subject: [PATCH] Video Duration: The duration of a video is now shown on thumbnails and bellow the video player Asset nodes now have a new field called "properties.duration_seconds". This holds a copy of the duration stored on the referenced video file and stays in sync using eve hooks. To migrate existing duration times from files to nodes you need to run the following: ./manage.py maintenance reconcile_node_video_duration -ag There are 2 more maintenance commands to be used to determine if there are any missing durations in either files or nodes: find_video_files_without_duration find_video_nodes_without_duration FFProbe is now used to detect what duration a video file has. Reviewed by Sybren. --- pillar/api/file_storage/__init__.py | 68 ++++- pillar/api/latest.py | 1 + pillar/api/node_types/asset.py | 5 + pillar/api/nodes/__init__.py | 20 +- pillar/api/nodes/eve_hooks.py | 16 +- pillar/api/utils/__init__.py | 19 +- pillar/cli/maintenance.py | 153 +++++++++++ pillar/web/jinja.py | 6 + pillar/web/projects/routes.py | 1 + src/templates/_macros/_asset_list_item.pug | 3 + src/templates/nodes/view_base.pug | 4 + tests/test_api/test_file_storage.py | 20 ++ tests/test_api/test_latest.py | 303 +++++++++++++++++++++ tests/test_api/test_nodes.py | 3 +- tests/test_api/test_utils.py | 14 + tests/test_api/video-tiny.mp4 | Bin 0 -> 150133 bytes tests/test_cli/test_maintenance.py | 149 ++++++++++ tests/test_web/test_jstree.py | 32 +++ 18 files changed, 789 insertions(+), 28 deletions(-) create mode 100644 tests/test_api/test_latest.py create mode 100644 tests/test_api/video-tiny.mp4 diff --git a/pillar/api/file_storage/__init__.py b/pillar/api/file_storage/__init__.py index 4c48d55f..af31b763 100644 --- a/pillar/api/file_storage/__init__.py +++ b/pillar/api/file_storage/__init__.py @@ -130,6 +130,67 @@ def _process_image(bucket: Bucket, src_file['status'] = 'complete' +def _video_duration_seconds(filename: pathlib.Path) -> typing.Optional[int]: + """Get the duration of a video file using ffprobe + https://superuser.com/questions/650291/how-to-get-video-duration-in-seconds + + :param filename: file path to video + :return: video duration in seconds + """ + import subprocess + + def run(cli_args): + if log.isEnabledFor(logging.INFO): + import shlex + cmd = ' '.join(shlex.quote(s) for s in cli_args) + log.info('Calling %s', cmd) + + ffprobe = subprocess.run( + cli_args, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + timeout=10, # seconds + ) + + if ffprobe.returncode: + import shlex + cmd = ' '.join(shlex.quote(s) for s in cli_args) + log.error('Error running %s: stopped with return code %i', + cmd, ffprobe.returncode) + log.error('Output was: %s', ffprobe.stdout) + return None + + try: + return int(float(ffprobe.stdout)) + except ValueError as e: + log.exception('ffprobe produced invalid number: %s', ffprobe.stdout) + return None + + ffprobe_from_container_args = [ + current_app.config['BIN_FFPROBE'], + '-v', 'error', + '-show_entries', 'format=duration', + '-of', 'default=noprint_wrappers=1:nokey=1', + str(filename), + ] + + ffprobe_from_stream_args = [ + current_app.config['BIN_FFPROBE'], + '-v', 'error', + '-hide_banner', + '-select_streams', 'v:0', # we only care about the first video stream + '-show_entries', 'stream=duration', + '-of', 'default=noprint_wrappers=1:nokey=1', + str(filename), + ] + + duration = run(ffprobe_from_stream_args) or\ + run(ffprobe_from_container_args) or\ + None + return duration + + def _video_size_pixels(filename: pathlib.Path) -> typing.Tuple[int, int]: """Figures out the size (in pixels) of the video file. @@ -220,8 +281,10 @@ def _process_video(gcs, # by determining the video size here we already have this information in the file # document before Zencoder calls our notification URL. It also opens up possibilities # for other encoding backends that don't support this functionality. - video_width, video_height = _video_size_pixels(pathlib.Path(local_file.name)) + video_path = pathlib.Path(local_file.name) + video_width, video_height = _video_size_pixels(video_path) capped_video_width, capped_video_height = _video_cap_at_1080(video_width, video_height) + video_duration = _video_duration_seconds(video_path) # Create variations root, _ = os.path.splitext(src_file['file_path']) @@ -234,12 +297,13 @@ def _process_video(gcs, content_type='video/{}'.format(v), file_path='{}-{}.{}'.format(root, v, v), size='', - duration=0, width=capped_video_width, height=capped_video_height, length=0, md5='', ) + if video_duration: + file_variation['duration'] = video_duration # Append file variation. Originally mp4 and webm were the available options, # that's why we build a list. src_file['variations'].append(file_variation) diff --git a/pillar/api/latest.py b/pillar/api/latest.py index 3a0879d0..33076929 100644 --- a/pillar/api/latest.py +++ b/pillar/api/latest.py @@ -70,6 +70,7 @@ def latest_assets(): {'name': 1, 'node_type': 1, 'parent': 1, 'picture': 1, 'properties.status': 1, 'properties.content_type': 1, + 'properties.duration_seconds': 1, 'permissions.world': 1}, 12) diff --git a/pillar/api/node_types/asset.py b/pillar/api/node_types/asset.py index 407ab05e..8eba132c 100644 --- a/pillar/api/node_types/asset.py +++ b/pillar/api/node_types/asset.py @@ -24,6 +24,10 @@ node_type_asset = { 'content_type': { 'type': 'string' }, + # The duration of a video asset in seconds. + 'duration_seconds': { + 'type': 'integer' + }, # We point to the original file (and use it to extract any relevant # variation useful for our scope). 'file': _file_embedded_schema, @@ -58,6 +62,7 @@ node_type_asset = { }, 'form_schema': { 'content_type': {'visible': False}, + 'duration_seconds': {'visible': False}, 'order': {'visible': False}, 'tags': {'visible': False}, 'categories': {'visible': False}, diff --git a/pillar/api/nodes/__init__.py b/pillar/api/nodes/__init__.py index 06ced783..240d1f7f 100644 --- a/pillar/api/nodes/__init__.py +++ b/pillar/api/nodes/__init__.py @@ -66,8 +66,8 @@ def tagged(tag=''): agg_list = _tagged(tag) for node in agg_list: - if node.get('video_duration_seconds'): - node['video_duration'] = datetime.timedelta(seconds=node['video_duration_seconds']) + if node['properties'].get('duration_seconds'): + node['properties']['duration'] = datetime.timedelta(seconds=node['properties']['duration_seconds']) if node.get('_created') is not None: node['pretty_created'] = pretty_date(node['_created']) @@ -108,26 +108,16 @@ def _tagged(tag: str): 'foreignField': '_id', 'as': '_project', }}, - {'$lookup': { - 'from': 'files', - 'localField': 'properties.file', - 'foreignField': '_id', - 'as': '_file', - }}, - {'$unwind': '$_file'}, {'$unwind': '$_project'}, {'$match': {'_project.is_private': False}}, {'$addFields': { 'project._id': '$_project._id', 'project.name': '$_project.name', 'project.url': '$_project.url', - 'video_duration_seconds': {'$arrayElemAt': ['$_file.variations.duration', 0]}, }}, # Don't return the entire project/file for each node. - {'$project': {'_project': False, - '_file': False} - }, + {'$project': {'_project': False}}, {'$sort': {'_created': -1}} ]) @@ -224,13 +214,13 @@ def setup_app(app, url_prefix): app.on_replace_nodes += eve_hooks.before_replacing_node app.on_replace_nodes += eve_hooks.parse_markdown app.on_replace_nodes += eve_hooks.texture_sort_files - app.on_replace_nodes += eve_hooks.deduct_content_type + app.on_replace_nodes += eve_hooks.deduct_content_type_and_duration app.on_replace_nodes += eve_hooks.node_set_default_picture app.on_replaced_nodes += eve_hooks.after_replacing_node app.on_insert_nodes += eve_hooks.before_inserting_nodes app.on_insert_nodes += eve_hooks.parse_markdowns - app.on_insert_nodes += eve_hooks.nodes_deduct_content_type + app.on_insert_nodes += eve_hooks.nodes_deduct_content_type_and_duration app.on_insert_nodes += eve_hooks.nodes_set_default_picture app.on_insert_nodes += eve_hooks.textures_sort_files app.on_inserted_nodes += eve_hooks.after_inserting_nodes diff --git a/pillar/api/nodes/eve_hooks.py b/pillar/api/nodes/eve_hooks.py index a11f434a..ba131f87 100644 --- a/pillar/api/nodes/eve_hooks.py +++ b/pillar/api/nodes/eve_hooks.py @@ -165,7 +165,7 @@ def after_inserting_nodes(items): ) -def deduct_content_type(node_doc, original=None): +def deduct_content_type_and_duration(node_doc, original=None): """Deduct the content type from the attached file, if any.""" if node_doc['node_type'] != 'asset': @@ -184,7 +184,8 @@ def deduct_content_type(node_doc, original=None): files = current_app.data.driver.db['files'] file_doc = files.find_one({'_id': file_id}, - {'content_type': 1}) + {'content_type': 1, + 'variations': 1}) if not file_doc: log.warning('deduct_content_type: Node %s refers to non-existing file %s, rejecting.', node_id, file_id) @@ -201,10 +202,17 @@ def deduct_content_type(node_doc, original=None): node_doc['properties']['content_type'] = content_type + if content_type == 'video': + duration = file_doc['variations'][0].get('duration') + if duration: + node_doc['properties']['duration_seconds'] = duration + else: + log.warning('Video file %s has no duration', file_id) -def nodes_deduct_content_type(nodes): + +def nodes_deduct_content_type_and_duration(nodes): for node in nodes: - deduct_content_type(node) + deduct_content_type_and_duration(node) def node_set_default_picture(node, original=None): diff --git a/pillar/api/utils/__init__.py b/pillar/api/utils/__init__.py index 91bbe47c..df279287 100644 --- a/pillar/api/utils/__init__.py +++ b/pillar/api/utils/__init__.py @@ -57,6 +57,18 @@ def remove_private_keys(document): return doc_copy +def pretty_duration(seconds): + if seconds is None: + return '' + seconds = round(seconds) + hours, seconds = divmod(seconds, 3600) + minutes, seconds = divmod(seconds, 60) + if hours > 0: + return f'{hours:02}:{minutes:02}:{seconds:02}' + else: + return f'{minutes:02}:{seconds:02}' + + class PillarJSONEncoder(json.JSONEncoder): """JSON encoder with support for Pillar resources.""" @@ -65,12 +77,7 @@ class PillarJSONEncoder(json.JSONEncoder): return obj.strftime(RFC1123_DATE_FORMAT) if isinstance(obj, datetime.timedelta): - hours, seconds = divmod(obj.seconds, 3600) - minutes, seconds = divmod(seconds, 60) - if hours > 0: - return f'{hours:02}:{minutes:02}:{seconds:02}' - else: - return f'{minutes:02}:{seconds:02}' + return pretty_duration(obj.total_seconds()) if isinstance(obj, bson.ObjectId): return str(obj) diff --git a/pillar/cli/maintenance.py b/pillar/cli/maintenance.py index a88a489e..c31a3490 100644 --- a/pillar/cli/maintenance.py +++ b/pillar/cli/maintenance.py @@ -1022,3 +1022,156 @@ def delete_orphan_files(): log.warning('Soft-deletion modified %d of %d files', res.modified_count, file_count) log.info('%d files have been soft-deleted', res.modified_count) + + +@manager_maintenance.command +def find_video_files_without_duration(): + """Finds video files without any duration + + This is a heavy operation. Use with care. + """ + from pathlib import Path + + output_fpath = Path(current_app.config['STORAGE_DIR']) / 'video_files_without_duration.txt' + if output_fpath.exists(): + log.error('Output filename %s already exists, remove it first.', output_fpath) + return 1 + + start_timestamp = datetime.datetime.now() + files_coll = current_app.db('files') + starts_with_video = re.compile("^video", re.IGNORECASE) + aggr = files_coll.aggregate([ + {'$match': {'content_type': starts_with_video, + '_deleted': {'$ne': True}}}, + {'$unwind': '$variations'}, + {'$match': { + 'variations.duration': {'$not': {'$gt': 0}} + }}, + {'$project': {'_id': 1}} + ]) + + file_ids = [str(f['_id']) for f in aggr] + nbr_files = len(file_ids) + log.info('Total nbr video files without duration: %d', nbr_files) + + end_timestamp = datetime.datetime.now() + duration = end_timestamp - start_timestamp + log.info('Finding files took %s', duration) + + log.info('Writing Object IDs to %s', output_fpath) + with output_fpath.open('w', encoding='ascii') as outfile: + outfile.write('\n'.join(sorted(file_ids))) + +@manager_maintenance.command +def find_video_nodes_without_duration(): + """Finds video nodes without any duration + + This is a heavy operation. Use with care. + """ + from pathlib import Path + + output_fpath = Path(current_app.config['STORAGE_DIR']) / 'video_nodes_without_duration.txt' + if output_fpath.exists(): + log.error('Output filename %s already exists, remove it first.', output_fpath) + return 1 + + start_timestamp = datetime.datetime.now() + nodes_coll = current_app.db('nodes') + + aggr = nodes_coll.aggregate([ + {'$match': {'node_type': 'asset', + 'properties.content_type': 'video', + '_deleted': {'$ne': True}, + 'properties.duration_seconds': {'$not': {'$gt': 0}}}}, + {'$project': {'_id': 1}} + ]) + + file_ids = [str(f['_id']) for f in aggr] + nbr_files = len(file_ids) + log.info('Total nbr video nodes without duration: %d', nbr_files) + + end_timestamp = datetime.datetime.now() + duration = end_timestamp - start_timestamp + log.info('Finding nodes took %s', duration) + + log.info('Writing Object IDs to %s', output_fpath) + with output_fpath.open('w', encoding='ascii') as outfile: + outfile.write('\n'.join(sorted(file_ids))) + + +@manager_maintenance.option('-n', '--nodes', dest='nodes_to_update', nargs='*', + help='List of nodes to update') +@manager_maintenance.option('-a', '--all', dest='all_nodes', action='store_true', default=False, + help='Update on all video nodes.') +@manager_maintenance.option('-g', '--go', dest='go', action='store_true', default=False, + help='Actually perform the changes (otherwise just show as dry-run).') +def reconcile_node_video_duration(nodes_to_update=None, all_nodes=False, go=False): + """Copy video duration from file.variations.duration to node.properties.duraion_seconds + + This is a heavy operation. Use with care. + """ + from pillar.api.utils import random_etag, utcnow + + if bool(nodes_to_update) == all_nodes: + log.error('Use either --nodes or --all.') + return 1 + + start_timestamp = datetime.datetime.now() + + nodes_coll = current_app.db('nodes') + node_subset = [] + if nodes_to_update: + node_subset = [{'$match': {'_id': {'$in': [ObjectId(nid) for nid in nodes_to_update]}}}] + files = nodes_coll.aggregate( + [ + *node_subset, + {'$match': { + 'node_type': 'asset', + 'properties.content_type': 'video', + '_deleted': {'$ne': True}} + }, + {'$lookup': { + 'from': 'files', + 'localField': 'properties.file', + 'foreignField': '_id', + 'as': '_files', + }}, + {'$unwind': '$_files'}, + {'$unwind': '$_files.variations'}, + {'$match': {'_files.variations.duration': {'$gt': 0}}}, + {'$addFields': { + 'need_update': {'$ne': ['$_files.variations.duration', '$properties.duration_seconds']} + }}, + {'$match': {'need_update': True}}, + {'$project': { + '_id': 1, + 'duration': '$_files.variations.duration', + }}] + ) + + if not go: + log.info('Would try to update %d nodes', len(list(files))) + return 0 + + modified_count = 0 + for f in files: + log.debug('Updating node %s with duration %d', f['_id'], f['duration']) + new_etag = random_etag() + now = utcnow() + resp = nodes_coll.update_one( + {'_id': f['_id']}, + {'$set': { + 'properties.duration_seconds': f['duration'], + '_etag': new_etag, + '_updated': now, + }} + ) + if resp.modified_count == 0: + log.debug('Node %s was already up to date', f['_id']) + modified_count += resp.modified_count + + log.info('Updated %d nodes', modified_count) + end_timestamp = datetime.datetime.now() + duration = end_timestamp - start_timestamp + log.info('Operation took %s', duration) + return 0 diff --git a/pillar/web/jinja.py b/pillar/web/jinja.py index 171f4dee..bbb6ef3e 100644 --- a/pillar/web/jinja.py +++ b/pillar/web/jinja.py @@ -13,6 +13,7 @@ import werkzeug.exceptions as wz_exceptions import pillarsdk import pillar.api.utils +from pillar.api.utils import pretty_duration from pillar.web.utils import pretty_date from pillar.web.nodes.routes import url_for_node import pillar.markdown @@ -28,6 +29,10 @@ def format_pretty_date_time(d): return pretty_date(d, detail=True) +def format_pretty_duration(s): + return pretty_duration(s) + + def format_undertitle(s): """Underscore-replacing title filter. @@ -203,6 +208,7 @@ def do_yesno(value, arg=None): def setup_jinja_env(jinja_env, app_config: dict): jinja_env.filters['pretty_date'] = format_pretty_date jinja_env.filters['pretty_date_time'] = format_pretty_date_time + jinja_env.filters['pretty_duration'] = format_pretty_duration jinja_env.filters['undertitle'] = format_undertitle jinja_env.filters['hide_none'] = do_hide_none jinja_env.filters['pluralize'] = do_pluralize diff --git a/pillar/web/projects/routes.py b/pillar/web/projects/routes.py index 53e98852..589611f1 100644 --- a/pillar/web/projects/routes.py +++ b/pillar/web/projects/routes.py @@ -361,6 +361,7 @@ def render_project(project, api, extra_context=None, template_name=None): # Construct query parameters outside the loop. projection = {'name': 1, 'user': 1, 'node_type': 1, 'project': 1, 'properties.url': 1, 'properties.content_type': 1, + 'properties.duration_seconds': 1, 'picture': 1} params = {'projection': projection, 'embedded': {'user': 1}} diff --git a/src/templates/_macros/_asset_list_item.pug b/src/templates/_macros/_asset_list_item.pug index d8f09fc8..a03a3c8f 100644 --- a/src/templates/_macros/_asset_list_item.pug +++ b/src/templates/_macros/_asset_list_item.pug @@ -37,6 +37,9 @@ a.card.asset.card-image-fade.pr-0.mx-0.mb-2( .card-label WATCHED | {% endif %} | {% endif %} {# endif progress #} + | {% if asset.properties.duration_seconds %} + .card-label.right {{ asset.properties.duration_seconds | pretty_duration }} + | {% endif %} | {% endif %} {# endif video #} diff --git a/src/templates/nodes/view_base.pug b/src/templates/nodes/view_base.pug index 8d9c85c1..f93991a6 100644 --- a/src/templates/nodes/view_base.pug +++ b/src/templates/nodes/view_base.pug @@ -62,6 +62,10 @@ section.node-details-meta.pl-4.pr-2.py-2.border-bottom li.ml-auto + | {% if node.properties.duration_seconds %} + li.px-2(title="Duration") + | {{ node.properties.duration_seconds | pretty_duration }} + | {% endif %} | {% if node.file %} li.px-2(title="File size") | {{ node.file.length | filesizeformat }} diff --git a/tests/test_api/test_file_storage.py b/tests/test_api/test_file_storage.py index bcc87515..9d3a8e09 100644 --- a/tests/test_api/test_file_storage.py +++ b/tests/test_api/test_file_storage.py @@ -280,3 +280,23 @@ class VideoSizeTest(AbstractPillarTest): size = file_storage._video_cap_at_1080(2048, 2000) self.assertIsInstance(size[0], int) self.assertIsInstance(size[1], int) + + +class VideoDurationTest(AbstractPillarTest): + def test_video_duration_from_container(self): + from pillar.api import file_storage + from pathlib import Path + + with self.app.test_request_context(): + fname = Path(__file__).with_name('video-tiny.mkv') + + self.assertEqual(1, file_storage._video_duration_seconds(fname)) + + def test_video_duration_from_stream(self): + from pillar.api import file_storage + from pathlib import Path + + with self.app.test_request_context(): + fname = Path(__file__).with_name('video-tiny.mp4') + + self.assertEqual(2, file_storage._video_duration_seconds(fname)) diff --git a/tests/test_api/test_latest.py b/tests/test_api/test_latest.py new file mode 100644 index 00000000..2619ea12 --- /dev/null +++ b/tests/test_api/test_latest.py @@ -0,0 +1,303 @@ +from datetime import timedelta + +import flask + +from pillar.tests import AbstractPillarTest + + +class LatestAssetsTest(AbstractPillarTest): + def setUp(self, **kwargs): + super().setUp(**kwargs) + + self.pid, _ = self.ensure_project_exists() + self.private_pid, _ = self.ensure_project_exists(project_overrides={ + '_id': '5672beecc0261b2005ed1a34', + 'is_private': True, + }) + self.file_id, _ = self.ensure_file_exists(file_overrides={ + 'variations': [ + {'format': 'mp4', + 'duration': 3661 # 01:01:01 + }, + ], + }) + self.uid = self.create_user() + + from pillar.api.utils import utcnow + self.fake_now = utcnow() + + def test_latest_assets_returns_12_newest_assets(self): + base_node = { + 'name': 'Just a node name', + 'project': self.pid, + 'description': '', + 'node_type': 'asset', + 'user': self.uid, + } + base_props = { + 'status': 'published', + 'file': self.file_id, + 'content_type': 'video', + 'order': 0 + } + + def create_asset(weeks): + return self.create_node({ + **base_node, + '_created': self.fake_now - timedelta(weeks=weeks), + 'properties': base_props, + }) + + all_asset_ids = [str(create_asset(i)) for i in range(20)] + expected_ids = all_asset_ids[:12] # The 12 newest assets are expected + + + with self.app.app_context(): + url = flask.url_for('latest.latest_assets') + latest_assets = self.get(url).json['_items'] + + actual_ids = [asset['_id'] for asset in latest_assets] + self.assertListEqual( + expected_ids, actual_ids) + + def test_latest_assets_ignore(self): + base_node = { + 'name': 'Just a node name', + 'project': self.pid, + 'description': '', + 'node_type': 'asset', + 'user': self.uid, + } + base_props = { + 'status': 'published', + 'file': self.file_id, + 'content_type': 'video', + 'order': 0 + } + + ok_id = self.create_node({ + **base_node, + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + }) + + # Private should be ignored + self.create_node({ + **base_node, + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + 'project': self.private_pid, + }) + + # Deleted should be ignored + self.create_node({ + **base_node, + '_deleted': True, + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + }) + + # Node type comment should be ignored + self.create_node({ + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + 'name': 'Just a node name', + 'project': self.pid, + 'description': '', + 'node_type': 'comment', + 'user': self.uid, + }) + + with self.app.app_context(): + url = flask.url_for('latest.latest_assets') + latest_assets = self.get(url).json['_items'] + + expected_ids = [str(ok_id)] + actual_ids = [asset['_id'] for asset in latest_assets] + self.assertListEqual( + expected_ids, actual_ids) + + def test_latest_assets_data(self): + base_node = { + 'name': 'Just a node name', + 'project': self.pid, + 'description': '', + 'node_type': 'asset', + 'user': self.uid, + } + base_props = { + 'status': 'published', + 'file': self.file_id, + 'content_type': 'video', + 'order': 0 + } + + ok_id = self.create_node({ + **base_node, + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + }) + + with self.app.app_context(): + url = flask.url_for('latest.latest_assets') + latest_assets = self.get(url).json['_items'] + + asset = latest_assets[0] + self.assertEquals(str(ok_id), asset['_id']) + self.assertEquals('Just a node name', asset['name']) + + +class LatestCommentsTest(AbstractPillarTest): + def setUp(self, **kwargs): + super().setUp(**kwargs) + + self.pid, _ = self.ensure_project_exists() + self.private_pid, _ = self.ensure_project_exists(project_overrides={ + '_id': '5672beecc0261b2005ed1a34', + 'is_private': True, + }) + self.file_id, _ = self.ensure_file_exists(file_overrides={ + 'variations': [ + {'format': 'mp4', + 'duration': 3661 # 01:01:01 + }, + ], + }) + self.uid = self.create_user() + + from pillar.api.utils import utcnow + self.fake_now = utcnow() + + base_props = { + 'status': 'published', + 'file': self.file_id, + 'content_type': 'video', + 'order': 0 + } + + self.asset_node_id = self.create_node({ + 'name': 'Just a node name', + 'project': self.pid, + 'description': '', + 'node_type': 'asset', + 'user': self.uid, + '_created': self.fake_now - timedelta(weeks=52), + 'properties': base_props, + }) + + def test_latest_comments_returns_10_newest_comments(self): + base_node = { + 'name': 'Comment', + 'project': self.pid, + 'description': '', + 'node_type': 'comment', + 'user': self.uid, + 'parent': self.asset_node_id, + } + base_props = { + 'status': 'published', + 'content': 'एनिमेशन is animation in Hindi', + } + + def create_comment(weeks): + return self.create_node({ + **base_node, + '_created': self.fake_now - timedelta(weeks=weeks), + 'properties': base_props, + }) + + all_comment_ids = [str(create_comment(i)) for i in range(20)] + expected_ids = all_comment_ids[:10] # The 10 newest comments are expected + + with self.app.app_context(): + url = flask.url_for('latest.latest_comments') + latest_assets = self.get(url).json['_items'] + + actual_ids = [asset['_id'] for asset in latest_assets] + self.assertListEqual( + expected_ids, actual_ids) + + def test_latest_comments_ignore(self): + base_node = { + 'name': 'Comment', + 'project': self.pid, + 'description': '', + 'node_type': 'comment', + 'user': self.uid, + 'parent': self.asset_node_id, + } + base_props = { + 'status': 'published', + 'content': 'एनिमेशन is animation in Hindi', + } + + ok_id = self.create_node({ + **base_node, + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + }) + + # Private should be ignored + self.create_node({ + **base_node, + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + 'project': self.private_pid, + }) + + # Deleted should be ignored + self.create_node({ + **base_node, + '_deleted': True, + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + }) + + # Node type asset should be ignored + self.create_node({ + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + 'name': 'Just a node name', + 'project': self.pid, + 'description': '', + 'node_type': 'asset', + 'user': self.uid, + }) + + with self.app.app_context(): + url = flask.url_for('latest.latest_comments') + latest_comments = self.get(url).json['_items'] + + expected_ids = [str(ok_id)] + actual_ids = [comment['_id'] for comment in latest_comments] + self.assertListEqual( + expected_ids, actual_ids) + + def test_latest_comments_data(self): + base_node = { + 'name': 'Comment', + 'project': self.pid, + 'description': '', + 'node_type': 'comment', + 'user': self.uid, + 'parent': self.asset_node_id, + } + base_props = { + 'status': 'published', + 'content': 'एनिमेशन is animation in Hindi', + } + + ok_id = self.create_node({ + **base_node, + '_created': self.fake_now - timedelta(seconds=1), + 'properties': base_props, + }) + + with self.app.app_context(): + url = flask.url_for('latest.latest_comments') + latest_comments = self.get(url).json['_items'] + + comment = latest_comments[0] + self.assertEquals(str(ok_id), comment['_id']) + self.assertEquals('Comment', comment['name']) + self.assertEquals('एनिमेशन is animation in Hindi', comment['properties']['content']) diff --git a/tests/test_api/test_nodes.py b/tests/test_api/test_nodes.py index dbcf876a..d495b1f4 100644 --- a/tests/test_api/test_nodes.py +++ b/tests/test_api/test_nodes.py @@ -654,6 +654,7 @@ class TaggedNodesTest(AbstractPillarTest): base_props = {'status': 'published', 'file': self.file_id, 'content_type': 'video', + 'duration_seconds': 3661, # 01:01:01 'order': 0} self.create_node({ @@ -668,7 +669,7 @@ class TaggedNodesTest(AbstractPillarTest): mock_utcnow.return_value = self.fake_now url = flask.url_for('nodes_api.tagged', tag='एनिमेशन') resp = self.get(url).json[0] - self.assertEquals('01:01:01', resp['video_duration']) + self.assertEquals('01:01:01', resp['properties']['duration']) self.assertEquals('Unittest project', resp['project']['name']) self.assertEquals('default-project', resp['project']['url']) self.assertEquals('5m ago', resp['pretty_created']) diff --git a/tests/test_api/test_utils.py b/tests/test_api/test_utils.py index 46340830..7631435b 100644 --- a/tests/test_api/test_utils.py +++ b/tests/test_api/test_utils.py @@ -212,3 +212,17 @@ class TestRating(unittest.TestCase): sorted_by_hot = sorted(cases, key=lambda tup: tup[0]) for idx, t in enumerate(sorted_by_hot): self.assertEqual(cases[idx][0], t[0]) + + +class TestPrettyDuration(unittest.TestCase): + def test_formatting(self): + from pillar.api.utils import pretty_duration + pretty_duration(500) + self.assertEquals('00:00', pretty_duration(0)) + self.assertEquals('00:15', pretty_duration(15)) + self.assertEquals('01:05', pretty_duration(65)) + self.assertEquals('42:53', pretty_duration(2573)) + self.assertEquals('01:11:22', pretty_duration(4282)) + self.assertEquals('01:41', pretty_duration(100.85)) + self.assertEquals('25:00:00', pretty_duration(90000)) # More than a day + self.assertEquals('', pretty_duration(None)) diff --git a/tests/test_api/video-tiny.mp4 b/tests/test_api/video-tiny.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3fcb3252ff49c67733166534aa5dc17213197161 GIT binary patch literal 150133 zcmeFYS5OpD*T35nfFTb#!;q8Ys2~{x$r2?e$si&id4`;GMlvWlBPwwKB`Y8xh)7g& z&Up@R)pssV)v5Zwb?RJxUAwERt1r5G@6~Jl*0a_I003d{<>%q_`lTBHfPw#9?@wWC zA6p?e4^bfi0ATi>FJ1s(6?Zo~Yp?rzENpDh7Zd;}MaV~w0g7L2P(XR02LLZf1i+M@ z|KAVq8T0=g|2qT!I|Khe%)nRg-IIOHU{O1O|9Ad7*xIoE1fVPV$>ij@c=zgTuCxb$ z#XHJD4VzIks4+)9qD40}uHcp{{7`DQ{?OyeBg774?9=o;K}k{Y4eDEsqn%v-f4RpK8vR8(h>%Hku>kbx>r0=ex-2ZIap z7mc<>p|A%9ZQFJK)i}r8Q27GvtA47YD`m!Si_)_VX8^wO=ECHD5Ab19LwZI|@Se6B zb=nfi_HGe2Rr*CB6#Y;icTz;|e?Y_Q>$Cm?{MO?Yk;OWB2xBHx>W{ya|p62tb{gmnX7h<@fYEhUp&D#((VnEvaYvrO3rN z^X)o)RpVZ2|5n+gaJc)UAc=?!iju;*PQ6B|77R!ZCoCKR@{l(H*RXnY_gDc>v+*SZ zt)mh2b-ZF05h#!`SF{ywRhB*|@jb;;FnaQHcAEta_{|N@gPzR;1vhP7|K{IkT|~-c zRrRY&zex(>Q4Xr=-JYOmmxb=G9`V2us>_gFugRXd7tKrk4xD=t15-M3P6#>C796#5 zu+gPYNG~(g_@U)O9U`x zX!G=%Sz>+9dc6C(H@ATSvOYoYK=7!Mlt+DgIZ7#(>0g^C%*DT2qVWR(ibMmjf{=pZ z_qoj;I))wqP>_xx=rI0#e6PWu5s>h%z^jo9@Ve#^^@Yp@bNQ8j!uq&pl9rY^ z-K002!=58uU3L(%J?GIJbK%X_XVY()cfi}eCgm)Hb8LVZM;?V0hOlHfAOzu>1Fc?m zqvm<5!|W-W_)sPfW}DWhWMkYNSaU~=3Z;!RsZM;3hV(p`q5sm+t+bt;eEZla{%u$r z1!n#nZj`Fs&`+u^dH;=ao@h?k2agOYQ<3yV3~&PNs*9CbzsG$6oVdo6sajq1-1pmINrLxoDTceud4r!_$}mSh)$asWbp zE|*2P(IONs3ZhpiB-CklWH$~|xya!4}PKNnZl48+F6 zNSoB{d0$=U1=68Fy+a+waS8;8HRnCTfM2t<^cBqa#)n!G^4-jV)DJM0jg-ow5xP*^ zf(>g+*qGQ!sVtly0E2No^I+UrdD4jx6c{K1D6z$}3Md~d24TU1@3rZ@3T4#9an`s1 z59q3Vsv9Mor?88us;*j(ddlQI8fuRUc1A_f$pLU&xE_z*Hx>aFwzz=5-))zmC;$Z` z_R)x0`$$ty8(b(3e1qtvOR;Z)LB9CAh{O@H|FpaBAtdC!-ES(XA-=dC_vx;kGhG7uOW z587`);D%_z0AhJL*QuDEIuZXTe4qU4fc>encuYC=^ub_f3J&yNq%(4d556-l2t zD5A>IL+%ilOqe`G0VUp{i3t>y0grnX$A=W+MYNWZ7YY4l&yb5@kg(i`fs{R-(enSS zS8g}?WV;67cz8NJ{uC1Z<{Aw>n+n6>>$D}cz>vErx4y+Bsg$+mv8dyBJfvk43)mqr zIIp;d;2z_(t`Q)BhX-;f;I0Hkc*4z98O~*bMw2%5D!G#sL9MjTci57pZQ_XWS>&)D zNI{kBq}j$1IQiMfhC;5vL$8DT+#04z>wv zisssq^CXR`oP|XB0x;}Q(+e-rkT}p^ARQIgq$X>0aUn)D4N$|Bihiate@8h+%T3i2 z$Ceb<--O$vdFrS)J-*eVV5gmq%}~Nw z4v^t}PYw1vMEQhRhg*MFgz3pByX0&>V9*p`c;?##e1&SCM@I4g#cjNOa}{IPA@ipG zl?MKAm}e$05`z%qf4D0ZfQZur1RpgwWGsy*n~DkwJxbdOh)M{HSDcgNi2&X#*@FOZ=YLxi+$xG-_r;O zw)NzPj?dD+x@RWI3n>0NPK;7~-E>h`I&h;PiRIkhhxBsLCnu1}2Ot1}-6#S%>4{dW zbq7(-uSGgu-@+0zaSy2eIg=S8E#DZEH?VBc$I5foKsB(1-+$&d5va>n{3fRL9I}VF z9Orzp>45DT5F6hROr8ag4aNM8zSPKBfK`5$12HBjVl**QH;Q%>#ukX_eLQKM!Ay<)3itV7^t{6-=3b;f8axLcX zb1p-p$IXUNfrO)QTjj?Fl4DQQkvFtR5!hk?i$sH1?a2}nr>Xr5~Tf_m6S;u9Jh0j+F7Q-i{@I|T{5qomw09@YQ|v6c-7D4>WgfaATw zKDp-$dH~;#pkg|df)h6Y6ZswEg)YCzc^V$FLlX7QP2oMZY*5nOJjGLk#qO{RDyaApcat0$U zyVau~i(EmMZv`C5zMOyj%uOO^lReaMC-#s94F;t|dkc6Nlccl{bfZqWSUknG8i`Uc z9$<$2+&pk7OsGE^v+F7xiCrZ$nuxGEe^DNaE5bq2b1WvdzWvGeclR_$ zj0BTv2Mh>h1%vRf323aITZ@0rC7}FwxkPpNIP|a8=fG)c?sQYOLEIuSa#i2R8R1Yu z{hb3c-BfhG+|MQTyKGP=w1g1n4ugKM7YYZybvAM5h%D{g%SGU6d}jA*8iAc(U6K>u z$MA21y1~{}e1+{qH+ac(TKq0aAlnb|M?A@Ozb)hgMje!yyT&bZBu>Lw4r{D;o82!2 z!C;&|04~WwNCA-aKNA-}%x>;s?xv&-q=;wHk7L6201LLwPltrNaETdJ;|~kZU0IG_ zU5kSZJD3IY1?}rk;c6`Xi;(Op;nDq@e>!)&FFtAUPY|%zbODY-C=|UWuS8_5pZ9Jv zb}?V;R5pd7c#Bx3h0Ma7(g7n6y+8g2ImRx6HN8AP*s4TraBh(!M8BtSGKps4ditI<>XP9z|A91;#R9-j%8v} z3y7k&5{$Ca%*DcQ_#zDx*b^&A1aY{AV_&9<_luAY*B#bM(qWKQ(}_6Rhda<;)q^>W zp@X~QFNYoT65y(Am*4C3k$OC*#WaP%tZnR5C~K_{%N~6WqidP5@L% zVlT^}Z1}0RWDWXEs*L=I?#KQM>PQaBXZd?}Q|PgkOqtEAiW{-Ed3kY$XQjZdkhk)+ zX&Yg}$KaB!6I7Etpx({w1&WQ3`F!Z#Y-#TCy5{P6;d18gdJnzA5b|0YzypUh)sgfG zJp#{rdMJkI$%p%KaFDWAxx+9w8$a-Ho4no_kccNK+rOGl#v`8p`da{n4l;0bL{zVT zCGYe$j&yrF3QpJ63+I-;97@<+`bwhY#5GLy6SD^Zaxh^9H!EA(ebw5m6@hsx>@}b# z^Y5zn2tzsMfW7g-7>~04EfVEx^OTvHpdrF(Ul0Aw1@*_b!tPtFdHcRE2;e4toODF7 z>iyi`Mk7H4Z4;qg%j=clsrhGY{yrp%dJSeu`}O}K8+wAd!zSsn=Hb&z{ep|Rmg}Qm z@)uE(LaA~8G{uC{3TlW_2$ty0{`4}S7rzX8;mBB*lOqd+q8_S!XPY7EPrUH{R2vb; zuD<61EXe_)-^D`|L(g5WwD+k4!R$_K^g6oAcfv~4L4we*Y)kAHxT|H|+kHjy#_S_g zN3W%;P&k1QIW9{fgBV(~Ez`dVGoreUW5b5dwFges0Rz`#f^J3(IWa%lkhe4zQ$|5da(vZH%z`^{FI1q#@c#k$;q(`zCXI81zu9 z>U83)m0mm_6Xb@YJoh2BdyX=EK7$8vIpN_ID={IdWtn$ zyJzu+;>|3sQD1G$@)ceS*CQ`v4WETG%O8BnnUqbr&xw-sT#L9}LVo1IF#BOk01u-q zc!brog5`(y%)U*{Ua%|hB};ms&5~7Jc5fV9@sRkdP?B#Ia_ciNPVkGOUb~y|r4<-E zx~jY2UN1l>A)x>S@eu8d!mIF{Y*I36WLuIw-j*F_!Jw`3k^1@&oNUx&GDw|+;29{L z;Jc{@-Q{U)Oqh5$P)rwGm=pq5)e9KebBK?}j#6y;_2MZJncLxYN+DspbCPi2U56Xc65U?H* z4*ZAFv7@7a9~mwHhtNQb=blbVfBm+?sklCT~~s!DCyi;kTCY zz{qx&DaN9eA-(07?wSBA(=6v)hanx!W=zPx6f^8sq3=ZVi#;ECtW*~$eaqDn?z>xu zL*&Q>-bs4zqsTGqE)U{4_0LjK7?Ed451HK-p7BTbSdm%5{C7yOV{L9uP<#2(H^lS6 zso{%gFIk;T^r`kCd6ZzvOyWIezNPLa+01&@D(QYfEQ zs|)#|iYG$wE>{5?*CIo%)Nl2+nDB1{{!TH;Uk~fWrrx%%Ee3Ye(PfkZ?Br^M?-g|o zcA$a#dM=PHqd-O zQ^a(2wydnzO6z<(e{b}}mf0&F2wU|GgRq409VlcI@?dPXp`A9{?d!r+&FKCRUa2G> zsKL`IoeZOyiQR*rMOI?}x?yDmm$~t@_il=+);5`J`rSw*y!62#bB=Su{ zDzdLZyYW(XdD#`Tu1^pGp;*(){a@V^6&U8=(#E(M%hXcQocm4fmi1WO8-VL3Wob7` z5=WBSBy7*`_zQg(;O=TyarY)aR1o3{`?9^BHjdtww_0zm#M^qT_UoxHHk7TQx0dGY z@AZg@Rpysx!A!W;l2jBO@#;_YBi`{peJ{Y*f*t2)f=%1?L!D#cr{(#Q?>XMk{+~px z_bL@Wmd(D%3jE?|C8uXIki>SZCtr9Hx)9Hg)@Z{ta9%aCGEW)o9uZyu*q}b(y|eAR zocQ7Q@x}u^&>Hz@yjMJ`jvM8UtT8E|a-Jnku+}vOX9xBVisUoOjNuZ9zL!^4fc1sL zX~i>7{~Daq0-HOF#Ft42#KF-=2NLs?CT{{sFi79~T#x((7yuW^zbW?ynaUZw^nAEp zWT-5F^*O$_k;c%2iyR1ie?w%2Yw7tV7l1cEW{s|c2zqM$Q`!MDTY?c|0dn8x>CC~}J{ z*o_?XAh!C09xi>R^Lh|bgOZRK{%5g54Z_fuQ=&m*Vd77z{23(dbIQPN?{O*=Eoo7WZ#yO0l45j%p!vTK*;BN_ovne z_JDfguZMly!&bHS^uD2`P=dJ%R4hiy(dRsmj8uPCVx?Tp{3bZI$K)MVKr+q4w?_df z9s+^zc-)&!<==8NN+YyMZ{w&CvaZmcJig8*Sv(HMButPF1QL3U_YQ!6pSzGFLw!q- zbHt?O+--lNt~w&Sxl;Dt$6yF3sG>b#M^HlNC_)n{Sg_5N6Kh@L|0|;MO%0kE<(?fC z@a(tz6l1k0-axGtnq-2HX}iowm;P0#{CrlKXq!j|mE>=D_iG=8VkOW_bU^L1$J+Cc z#%Kn!h8n|3RW6)l)*8YR!i!8d{#v3eQ!s|2~Y&e`sWe#tp{s^xG|Kg?GMj4-_6K#(QN`=&t56xi<=ttk|!>#I`YrI zAUf>C<}8%38HL{5Jk7ZNleEY}FT=Vg^V1pqA^S45DsgmLwD|b3IOVeE^%w}%^D2HM zo_`moNSvg|y3xrsR@~nq+hNYqYzCAcIcO7CHXzC@`ZHKhTDyAU?JvgeOY9wgo%0>NDk1L}*fVI|mRsF9 z=>$I^TYW)e*9N0g+KbhHjqDP)zqV3xec^tw)>4dE_@S9LN$o0kCvbq&NDf6V+`1lN zP-^Yi|AcF&(j@}kKO!KVP39Xpt~(gET?0>+M-q%_*1>hK^ahrC=%&?(=ho6D(gen7 zo2%yb)@>E5&AlD{Jp_~diP0!PHIxqTm%M}na)F9GmTZRkSNWi+q?DMkAKYkb2|#hj z(?)C)(CM!2VnRVcNE!hQ3#)^XGrK!^iTN+1Smrc}HDq`nRJr^Pmdlt*COgaJ<|odL z(u@^PKaeiZ$e$~Ic90yVejQ_qR0Hsg|epF4(8N*lV|bI0RRS=zdNS>;?(sO ztsj+L>IFeU%E17_iuw^@56duvt8U@l(NKfAH!h1|&^r_jg!hq3{USCIb{l%wWMpyS zc?JChzZQrV1=CWJHL|{|v*X4-_6PIxOB@ zy6@J*FK9^EL;Y7{`L*SHerV7!X@Knn2LbkKpEk zsye1;6+7PZZGrZGk@M`^aGd=KN8mPAPLt@ne#*E2pdRt~yG~pho;xA|C~Bw!&(DBm z@$YVe2_74zWB&ACI2{h`o8;w#T5QdY;uh3|>gezHG zfZo1LiMM+k5+q7jrDzl(TLi%$K1KvJNduiHe-V@c9T6jS*b*pHDQR#8pV}dOnR7!o zkLs89HgUcbzD4NLTD(8!9>IO^*k@Xuyep+0cwI4Pff{BIV1CrS@ZI=ITKoK)wtqu1 zhQ;uLgq8;yfV83OJdVPG#bbS$hqNUGhuwTfFF%}zp>bZPx zy-b-b-H)b^6`?adVluTVLiQN&Xu3AIoJWYD?s&@dBd#6iH+Tq!j1s7Rnfep6Nkp%w zK;8C)&#f=s#OhXN_xb$n^_vrPCl$`EW+o2ky}(PYCW^BC8s+La7NbUwvNLm&#rg5% zCQ;raLVN0OeBe#ki(^E`b!B^5pmrY%afxSQ{fx4Rt}eOp<*!kb>`+>OL#W*Y{gM0) zFWAe1XIh2Id12dUfu&r#S|;y1-N1Ikn+S0;7InPHNmj#5(Q2dGoFz1@;}0=@Km-9c zd4NBk_&cA9(t7!-$(eRmxo;5)AG2Z%XSkio1SlwUA#uc>!#{Q!vCiU8xN*MSyx=BY z4`&RMoerja3y`c?D*cgg%J8odoHfSanDkZzH7U+;J-j+3${BuV;FlXMomEPl4EjPe zP40K|hxeX_gfLWq-@fPA*4D*b3h(q-FK2Y_2}8FV;J%*PQqkR z|F^gJ;ELa7xkd;AdBj@jpy*cwPQa5-oMs+W$Y8oQdxBEIPcHk4=`JaM)nU4^(~g*2 z2-OkC>wQK0RJI-(10DuyC5$OY%!(jZHjCAj-Ovc-4yfq7m3hm|5?JRoQ+=7YxOFen zUs%cL(}($?1`+Kjc$N+!r|`htULY0`C3BVVmSf?*Ck|R@N#l@N>HB0IKtUNRv;K_k zyh7G<_V=W==(kVLR5YP6yDpLUE${1SF6D&G&0w)y7-T{4fZjM)K~N1{81A;ZG6E60Q~x0-wya2-CSu#q~gI z_nwZKz-&yz#W$><7Y!_S+%NPG)JWGTC_bOMiR+}n#Suw*_b+4E3QGQ-pDb{&=Oso* z4nSFl6$4O65@RON+YD4_^YlH0H7sR4%0tOo0P#t`3}<<5{>frsxUowt2HV!rikyOv zO$}yE27y}bodx;fKb5yaf*%@R_M>A#rV;GYP(tvnw{FPJNUqLClLK?gdHtC0e9lpLOhDkp252-pSgt z+i{F~C6A3lQkokvdNolo7VHF2EAg`v6X{Z*ze>{GKRX}_z z_$$fPmq7U2)kj99QIo%WkGg_q;BCWLx^`*NtOYpce~zB=NV*cfN?aMD`D6*UUPDLiW&fDd z-nFXD_A-6drqJa=&YrrFVeC|2#Ht~x2yRxTTcwfJ`SMWEtc&?*lv)Mya-|xerY4IT zNin~w4>Q$bdXF0Ijj?|0;_4Zb!Nu3BvjyNk`fYILKzg_yKsV+2>*X&A zgNP}WYb=d~yYjFxAtLHqqM|p;2R*|$;~Hqc&DtGtuFv0oe9(FccIk=*?Yz4UGNrJ#!HisCK@!O1}Q>URM4~J^Wj6%sF-v z01)H2tpLS43q>QtX(p4|$G>D>1a2s;V{l(mLo0ns-NQuY{T8qf8|dz~5%jXHKeog+0b)qOY!vix*G2&It>~q} zL&mH0k0*L>ymcl9`QQ6vLe!c9+i!Sj?HE*-(+$Uqy}&$eSr9N;3yJWFUI!J(e>Nz9 z!ru1zK=>(eVj)h_KL2-gY<6u_*3A9!a(aExP7%P&(~O|(>{!I;#!zTtyr$|f&lAs0 zSov+o<_RO_6NZdFS{7pbG%RkCeuDITlghdH{~}+%Y@-Hf{`8(d_5p(}J+yugxS~Jl zI^Lq#8DH~(C?_zndb(+)&(v?|2GU zje1Tc5=hDcI&eLC0HmYq_Px7vI-qaNB)zJ0`Ty(}&ApdGK^(zDUo-=%oCGDB(Uc+k zdw%P+*Cg-JX>_b635jJ=fsdZq(F9#Nbq65d=KW#TsK*?}nE1CSGZF4VD3?J zDdHYs`I^(?70)SOkpsUUSqY!zXHEy22=q!~)tD%h1j~UI!Kf)C;fb;>ww$ua*Kc0! z_feyTiLA~9Y!iD*EKxyTQp)^f*(C%s&6A~x)eDP?WW3wq7>Kb0I;ABN6! z(w!zl?SsDyhcB~6eb+_31enZRE!^$ps4{h2-5*O|gGK&DqSH2fHpNlcE0XT&3J=;4 z3bImv2bWh^=A}3ol73EZ_S@Awm6-l!rG!O+`%pGJWfRCq;7+Lq7&{(6;nyKQwc?C? z%|6%JG=c5!e)+a^AWerPC*)Am&1fg^Z_2M|V>3E?;z<`l2ge6`{g+xaQ{K8c%0k-k1L39XW$)vimL-U>X z`D0y&%S&aHe1ZD+5U zuvCtxvkYzJ#e{4g@XHxF5;EaOsaX`tp*3{9H0@gI`8#)Vx!yf0 z)qwzx+k=`3lm+uHyqcDLPN4qHQWu{rQ{dB(UcB7vT{+CPloy46qoI%4b(eq*4#fzu znj)1Xal%YqJL%vS`|Dm|;z*T5ys_VG*tg@znq2-$7U8K@rI#sX5Yo+9%Ep9Wo{!J` zVpC-L!g{X?A{%Md#D8FTs{5eZpmYd>!JALc{G0j8c3Q!({UR@uahzLLW5HA>&)TkV z;TQW;^nPcy=1I?$qh74Wm`fJ&(cO_C`kUWr-i7UT%^e6oh=u}Km78zm0F5cX=?^z7 zByrSD+agTd4G+G}Gt}M544~4bXv!~&t7R$1F2}+D_{4_3ARnihlscV7Z3Q(W%pb@36+Ot8r5y|rw8AXJ zi7O>YfXQV~6MCb@gd~)*a#mXVEJ$fQnQ&Q6M{P#SF?R%ZFYT#Li&q~shIV){8iJZK z7I@!#=ZN3{P*F)(a2?Ge{Ks~8h4b=wcn;$6J23VrL%Np$8`L=T^~itI);$kI-^PUJ zLF2L*6QYBu8<&D?gX#ltXJ&pCZvzb;-Lh>B0;_V0cTq%E_9q^@bDq2J^*vVy&QSG4saVgm^5tVqH=2uWHC2|6Z%Q z$15LRwvCJQd|XI6TawxnQ9R9zLTZ_*Q0XtCL{49e12F;S#kyd3_jn)B-@^sy~u zLZYYHu$z=gid|QNICL@aAEln3PSS18<3qw|+njfNs1AB^752~^xZ4H^8f!tnEn5bY zy)fSk{X-JYFCBL^!Xy^8_&4>~tOjd(WMu%n(noAWt#M44K4m)Npt9ijtTpwSVv@Ur z5dLQq%icK8)1uwT4%Q@Q=$$8`r5?N{S=X6gjh6h&^QfnGdv5Xa=+Vn&t7DYC!Rwj3 z_?fftKI)T%519s&k(VLD|D*?U5UbsR-_t-pnCM1l@ntj~@-g757N!A6QCr{CT78==H)Up7OOIS8*=6 zW&b-)=6v6CK})K^$2-fcW3A8NMr(e=zQu9l{o(|B;)_rCMGWYwrGH*~lhUmD9$_9g zgouj@k|#);UJ#?4^FR4pdYoNZe!iH*`>Mp?U#256Qj5ICZQXi$SM1Vf!T$QA29A@$ zcXZi6!7L368x4!-!i#ft%1X>9PKJ|-NwRpY4?46FQ`!lhxBccfB1Xkj+n+xyjX&kR zOCQOGZb*Hq;9V~-!X=}hQuM)n^7+lirr!fkdFO7-LwT|~bVowj7i;VVFa_}gwyzl0 zuDtCpE`t|Lt51;bDkU>F&T(EIR;r|A?!GQ+DbdV?jU^{xcX@60sEC6Mogc==reX3m z6@w|n-9z1q`q^sDWEE+KiGTdGUV)lN6!Zda9@sMz6$xmXI=&n)XL1>YbT-+Ob^9iR zGSN3NNW?0U@x+1Mi#e5mpasTj>f-u~b?Kt47DF7PJY-lj8+Pe?9}D>-_K}w`q zk{)v^K~lmtVN_leq7#XRN5fBq_T{h?h0hK=Um1<m-7IqI zB#yW?9(VJ4|E)7C(i_{l3%g#Eb15gzThX7UC!<>pW482pQE6V)cA@QJn2>%@D>II0;%5XRU>;)kaUWsX-#NY4FM7<|e5vmY2gtoOWzXQ>pORHX9>*56QsKTR>4I@j$q8 zDJY`+%ncvsZ1n;lx$Ini-Z+|4;)3PgE*-_!N?&XLBi^9jSMG}UCAk3$e@qc`RB=B2S50FXL z{O;CG_%m&!uzBYC=k#&?{E4W3V-p;S&4)-lg6=dL#pdHhC%F~E^&opTqBz~2n zV(4Ir?qP>mCg&CZNsq0`E_JgA=E}2R!Unj>qXOK3;Jz~%m1lmmgT#q z7oW%i6X!x_6x*h43+;={j#(_aKHjN6NyRitaAZo4HY~(@uF`S8@O!8|8H+B_`HRb5 zqCWhsFnZSvA#*sPxaTT?zq9$5iqgSQ9)sElX>2xi=i@P=*MzszjM_GrLySF9Ei__I zy$eE&qJbK9oFY7k;`RHG2quT^MiUo=R~Nhc=@mV%#pH)g3F4SK8KKq2vk zd-vJF+tHWd!E=_^U3+2gPfe(iF@l1fukIjVsG__m^6kqCKu-tp_ghaGUddm^up^?= z?zKP~y#s{&rvp^TGgfdKb@~lG844?674{_rYbua}-3mZ}OK!U3Itr7S(b$S_V`!=m zXrsMaxq1n2KHLtl5KwYjh0OF=UgHABr0-Lfn|RP;L|p1*MMk_^7`~-uE82boE+;ylqlhY z9zTn44EsTTjwufZ6hxCzAgoupI$@3$fE`5|D^BYYwhmL;4MC--bcHO3|Nr~;1vJ;n z-{n~R_9;CL;n0g@TVLu=%Gz;*zRju*w_C4bu{#q3y9Q^|SZjVvz6RXHwTdypPjN6( z4Wxs##|=5yRv#MYA@E3pB8Xp+Dvt&D0+hJ$ z#m6gxFP$Aak^%gP9K(PWz=6s*-93Cd>Aon9b6Bs*GUs=4LwM|lokV`+nVJq?7AjU=v&60+$qF)eimj`R-Nv!>&_XL4%9j+n+Dg4TKSKc(W zSJl&NxiaYq*BmJ-WE>8$n$b?e>xRm?&*_astVk}Ui7nZziKil-_dmuEZIj#Qn8Y#@ z!~FFcKR3w+s5el&(HHvTzO!mAQ7KvIwJPvr(NbAPHEy2@alGgDF!S)ytH&d_Uhhhp zB==re3Q3!lU#toyQ-vVW#gjnYXC!Ug@v)F71;qXsVadsds_d;==m^ z4_z#>TE5+`?hQ3#-r;`7f2We4cy@>S;Bdg9tWD7~XBs$?HNc^CmS&`E_q!%(bKD#j1tZs}T87BIp>X1_eL=OgQNR9alp z^tuKh>@)G*sOJIB*MD`dcZ+D!)_gW02!o>+KRx)n&k4M7x?k|rla-;7l61|?jF_!D z$5#yJ26o523hS)zWQ5tAAxX36x;b3Hlb30cy?JjghtJMn<)6>_H%MGr^)cMS)XG=pZMPFl^WZ)q#<9U!6FA$`44~}(#CS{k?wov82P$Z zK!Du4fd%XR#5G&Hco8{n-`ns31La)I_3!h=&dxg=0tBZ6460P&*WjoxNBd@b8OW)B za*88wY7y$lh#B_fl>~6UQx`z7Xu$%;$d@oM%wVy@{Erysmdcmq>%2Ol<@?$6*l$IhNP<1Yfp4pc*V;7|;56cxR8c$?8$h5KG ztW`X|@s<@El{^M9xJ=gVW0p6*+;)7Z92K~NsK&NE-7!o0Nq|%SI`?E;as0)m!e2}I zRzu(6gRpHVAVn{=!!NA9c?bNki-r(E5`rLdJKBpA0A=&?qfZF^|9d6=pUQf3R`V%s z=M1~d}Cx69(#bq4=ois2mlsu|n6AmkzFXfE=;n0p?q3~Ryn=oSvZc}%4X$NHv z_7NY=tg(sFz%O>;WdZ(F9{q%BGC8Mw9dz6Y+kk+YS8BDalKLjuQHo7`8oPRvu1 z)(Nq;c?+Yg`h~v^m5Zo?G3L@UbgA-q!6vQ-32Z6oKvzfG$b9Qa8?6}ro%M$8g9+QJ+t~iqDJ&w?7g3V0e;9GQ9*C$%w{0Oq0MR; zuA#P4d2uSxC;tc$+BUec)b_zYKL=Y0d=DLmAzjR@E@rVxpV-1ruGAzzX@qs-rM4Duks(VsB*yRF_b(qLo%m2zOhHg>= zs}AXSt?E^t^lRqy!vP=}vGS=tabb7!&^|hH(dWx+g5A2wtL*QXoc%|S*4@V%Z5G|m z)V(R$$Ss*7!?49uM~EYIEmZ1D_6s1^YFpEmhKf-%t&a+yC$2vi{0=*hqhjc{9?ttKSYsl$F&Ry}Y$aXu9I@fVP`F*?xb@R=txzu(7R3v+S zF?f*3;Hi@~PAp1l?9!w8dsOD5AhHveefrNK3?ZTJX(AO``EjNL&MG#Jr%&SccH$Ni zcD|DA6&|_`6FvyJU|*)``V*8zUmEv*+5GDVc#rJ=V5bfMpmULbYaW=Rq{+p+yhm#V zULu3TmZ1;&MjxJDD8_XhfE5bIdU`Nm)mLa1@-Cu*FCt=NBp8JQHIJ@9k|tWQB{c#o zqUs%d*BwV5c^k(YEO^?I<5?*RB$%e!kOnf+Py%3ciGSk_1gp!tGO~6<4cgb-Iem`= zM5X@#?Db&YA1&4_VCQFb=qZjP4)CsuVF+ z;r#LfUNx|{;;|sJPWtiKG8xzU?;t=?Xcl?C>{}?nwM z8N~yn(C42R%m zwOzqz0VI91pDTS{-t^#qXVCbW`3nidHNW}}0|=b1^1VM0PG1s*?1SP>or_U@*+-6$ zBw#~>Iya7$N&VFraim@c1}cjMVIWRQQYQ4e`8BL#bhy8(klWx#JByMpFPc1s3KFrA zn=U)g`s5u(!1Az6{AbNKzDw_-`U-N(7gucW#jh$^jacJ`ZI93c%^fBX-3hu##xdoBdkXsW3K(8;jgL)e1^^ z?c6WE5LKkI7hBT}jv?RmaR3@6-px^92q}~99o=5xYm8+8cqG;;MuKnjsa*I<1-`}) zI1$?iWc_Dm27kRBd^GiC?VE1$ApL&RcF6dM$XEBs^^;*7n^S*%da z)wI_5?W&3|BP96?;kOJyOAG=9=TQ=W6JugC_m&vnGKrgcj4i&5qxj(}Cos|@s?st7 zBK2o>b$laN$e)(fiv}0EaM%$)d=Yr}k##N4%TJe3Ccuh>}pXW7}nxY^;^c_WG~MVf!p%?aC|8z=2>ZR6>QHjw_XdY zk*Xn)o7RMP?yqO{#69+Z^BZ-Gd$d&nReDALE>~hx!#S~cz$@a7Dy@`l>D*E!7&e;v zmGjGz-?yPh(`a9!!QWTc23ck}s`7LluYbo<;0<%|;ycxBD}6Xs^7FBnhKVQd8a3EU zzbM(A>8N|D3EeGuheW`l<3bL8iA)h|?>tFhI)c;!_w0-)D-yOw?oXGWCmQ<`LO-<9 z#{Bq^Iwe9~9_IZlBd-#~j1t<(k9^ihEnl2&JeB`%nC@s|BrQ#dmh@~?y6Z2>CaH$~ z@RPokTiq#gSonJAMc@ZiOwg{MVZxMr^zR=v+hU>yu6Z9AEnor5r2$T*qrQmxzSF&1GcE5eJ=u!A01+LF(ta4 z+CF~0zb)2!(%0sRK*eZPD{CYV<(YLy(>Qr-Z*B&4&Q1@N_jQ^Mj0k*yttdPKBej8m z=@+ji#vKFs@lYKv^b-n;I@ScBoNq1W?s0qWp#dlG?9s(gQl+N6S*aqEDsM`lD=4)` zRhDYb7gsQe`8_{JWljcK$?jj6N~4F=);^<_N`-=+x3slkeR3yysy1X=AE@A9v>5Uli_SxT-p=CbWyKkq+@}_kF!aJ)_bz3^#ll z?)q_QsO6aqF9}`~&4P;gX2S1J-pgxYgtBfvlWo7LYHlWzWHqu&>I)B-DL+5GC-x50y z*Ct83&`44;Wy^FrcpSsX%3&v6*r;BCWi;=Ubv%BS@+Zs9n8Yd*x^knFmvkkXb1eVC z!D+{2_ekwv*h~d%2Gj;h@Lfi_r>@~R1dTpxB?TT;6WCYU7MPks3j6eesc_Y|c;E_f+E^;hJ*-0O?q zru_g|Ey{V-^dw6Rt=SF>$F;0J!XeQT^VaEW>Z8V8z2kKw*?%3OtacnHct>uBV`e(( z;7?;2uKKp>=lqa|{wVBV`_T){g36mGCCP~=WG$XIAm%V$CLu{l6{62A;KJLuMHM1O z!GBj4c9@nqE8Odo{{=)~Xzt<<9XF-E%#uVb{)>C#XDaxa#=(sZmS@rjneX=$3PV zlRhOdd!;dWNrSZIzqFJ6;Q!(F1t-*o-L{(5@irs>mQZ20bY=%d@*XTHH%&IzioBPe zD>sVeN}aEB+9@+$n87cL_;DI11zfIj`#H(PVf9|$8m31zL z*{z{$Waju!bVKy@7t_a*4DG7I&YRIv2-C4R?rQGws1$mS=I6M zAc(E{kyC8@Bi)ahW9{(m61Ji=c2?&h_r)Nz?eIa39i@}8Xb$X)mH+%7_~~*Fw${Ch znEmV%1&{aoISz6kUzNK0r*68JdptQ4mVS zoDO|$oGpHKW+v1WiY64B36Q5HzC5peJ<$)G`Bhhe-4U2`{||ewb=(UX3YLkDhz6>2 zz<(sHI(MR0Yzv=TN;usw*rL&NCh<@JBgCkJ!`gqsT+AI07Zn697on<;op~udBTGF& z2E2bhvvu-d+oL`Moz|ft#j>uLO}k1vNl&cPz%EE?1Oq$ws$_1K?UtUZ;>*@a{uS2! zxcBXW7$NCw>ApgBnS*8p9~dWRt~lT6eW%mt$8^Q{EBWPlHzaK0Mg@z)k)BeuSeK2yud~; z>KrIfIV7~WtFas#Edb=!N;r_Xs6{nWUqj%;lq$rvxw_|K-_t&*%12R3<@+xLE#LMb z$N{{}?U~BYXlpH6*w`0gI;}>fzyjfG^>ExI`Js~G;SW7oP%Y8*{hv%&Y>`S4)m*q4 zwc3kKoZoDQq!2;Y%AmeD+;gVeRNW#mEMb5Nwyg3OEb7;6e$8zAmhpyo@#oK05WMJ& zi&~0^c@Fc86^@^PymKjjU5foSeu;9F#y$xR|5i}mHTJ(p2SV*jCKC*sU$)VRbs3!4KH~Y!NR#_FsPDhs-o286W6Wij zEgsy<+`&p7m-zR`L zPoY|Z4R!*(BiKMOZBY#3)bBvV7auud!ss8h1DXRtnJ*VRK9Bp9lC4&Bb+!IrzjG2+ z`JWte9ByEoI1@8BSd5mw%0M6%H%jtf50-+9z@}?b?0*ZwU|FW8#rmCD^TUEJkRo>u zxe|`JxzX|CmmGM?{uQqHLjKzW&knc?><`x4Bs+h?UTUsp_WaTn6iriiA3H&!t_kUW zS2#w(T%BGll@4)g5O^9cJ8a3i38zRonB5T@ejf`d?k^>u0jEjznb}~1oeuCKSh`3@ z-2@@@_gw=Tt?S+x(vd}T0^>9pzAzA+`W(1Et9S0`Rf;Na{~Fzasju8+oEV(t&nRI- z0{ts1?=`}vZfq|(n8Q>>0}keSjS(#t{?C%!Att{;PB67LK6 zJ_N5N9BGNsR83uG!Y&&wXwdXEJ%wy7DyW?VeEVg|%jJv#aZk z45ZziBX45}wFVWm-brZ**n=>YmA7N5zzX|vN99OW>a6RzZNZC`pA&_?kK3X5X!krK zMR98=HHY0S_e``a70Hr6&d&Y!5K&qDUx$+eavqzfwxf4^8aV19cV%eFpxjF(Czs$p zNKNz2n#juKScoFruxWLC{ouI$Y?VBKQMI5|IY!Fu&k0A=#vuf#KNk{$Ssl!ba&DN@R)6L^sleVko&;0*GPf72g51$ z)@+$p)~{)LV>3asoSDz7g4vAH>)I!dl6m=ydg9Oo%F`JXt{>dOJ`$h#&;BnEjNAwP zD);|8ON?h#XhUiPj8C5Mk#zT`2^!-azXI@AXu1FRCPc&(*q)7v*eak$KTr^Sk0uk) zblP95)lssPHxIQRvJfgt#go=&GooX8Of zO>i{$9CMaW_~t1n|3Jt&i1}2;MRWKc)mT{;an7_RCElqczYm_KDNYnXRm&M zIgdyc*y2;`K-3wvZLj%j8D$VLSSvTBe|TX6&k4D--spap31VWY$%k#8x`3ySa7ziQ zJKi0YC4*gEDFM2%tHt07GExuu(*$Z!VR~B6N+R1C;+tsZ4{6ngL?5>HZ!0Oa%+>OK zw9R~a>e3JR&c7!0PaQT{0dca(CL^FImwYT-IYXT>73{uSf}=uQ61cr?yh#VadG+`v zp)GSpQ^tBe>&Ug^%5Gcm=nnnIjhA-eNA4bb?W?@!yFRj1Y0`o7oT%U3IG58UsppS~ z7=C@fdg)2Fix@u#@Fg9)OGT0Gn>WltlYg9)euJn7#Q#;*_eUjGKrJoaPMCEc3Z!a~ zUTjXdr(L!BK~~!4s@D@_*3COTm>@5=>Yk_+tO0S0!8?e<1Jx)l|LUUb@Ce4c0Jw@Uo4$a@5OX|9UpbX#Q7B@|3=_fC3e@H_%rP) zG1gCfUv~LG%pZ4X%@scoe%#9zsqy`MoW(Td%f$CD0&b2`nI2aaPXAHML^sEcC27j-=1!B(V^2aZm*f$7BP z`v={8Fx2c|mBTFF%G-eblC2gnceA?T)GO>?UW_v;g!W0Q)Rju=(nZY9qOO%gEn& znqS1XMFOxO3a$FwB31VOg@=kejVQyLP?00NBH=AVes{)~CYyf^g!etK0z-%TZKHjZ z(ydlYezk;R_c>S}(7G#5BSC>*Wy?`!xT%|Mp3py^N$PEyFD7j?3NT|BXaC)mqreV( z6vW?A*64D5FA)5=E2KpF8rdydc#Z+V@~uS0Z4m6aN%3tA_8+(!vFRDpHWOK zd+I2@4)@mAp8Eybti?RmIP?xfEqri-TqT zGSt)SLsgTT0!j7W;(WywsQkDuc1rQW3r1`?<RYS#R@Jqm=sCTOJ^XzjC# z2_A|L$!MVQsyG{>RhoaQ3Is+xFz#c$aoJ&ZjF#6)2WI^eAhq^r#wv#|LY=A+E-!Vc zJoNb~6De+FdA-3=9C8~U2t5)RGhGDIEoT9bK`OCqS#SCBj$%J!I|97Bax zsa*Bm#?*%JzTnTkO_&<(3nuKxSg>cSpuoAy>lq}r>-%VHa5%9v`${`2H$&I@N|siy zEEVB%r3b(Rsq4V5u$$h7uU$@Nmp+};?r|B^scLj6rE>iLCPj~T{bvp(8RQqQ^zg|z z-%;c5qcwc{)!V%Oyd?iQA{`}3m7!JZ*1LH|K&Qc;9`uGQ=AWu*aW=m}av!8_nPDo1 zfgGXwUD0tRjQj^jUjo_RO^JnQ1`U}%^#W7M>p3(E)C|vhbQzu|PhiP<<)zl(ZvCGC zFC$74b*8GGY}d5IK|cs}otr8>%Z2EZFP}cm|M64ROj1|6*Is8Ho4h5@WoJA!m82%+ z(i*~VDLBCBm#oHEn*fv&`lWUB@ZEZklfP{rR(j`C4VJv;JYo&chS1IG1`NSuJdW>I zQ0wV;1W~g}GOp=hVb8o z?*7NicF}g3n=*KMDQ|!O?1Q*x%yQh1H6^2U9b>V?AMp+u;-uAKh39$237k@V#~9rc zNJ?9PTh8Fi#u=m)nHrLmG8|B;5#~+#Y&IU9*mr=&L2(2jt&F-YMf5uOP&;PV;5Vh| z2++6TG}@M^&X^Q4J@YqNa=bf}Z@JGlHZr8)45ktXf=4uaOKv2eqH6~s79w4+NXjIq zpUPCZi)4#<%We`BgO9JBN8G$U*|Q^NWX8e8$X|##^xk-33?-vZYXL2_xy4CIIJhZ8 zOqF2w-IBK1uSIJSzvnUYU$lnFS6#0;d#Lgg7ap^C^h2&esk7YyT}$gk{mnBsiYN8n zWk2jRL+rCJNyKB;i6bp`M-|ix{qi?Cp1}pCIDP3M^G9AGgi3i#%4)_84n%E^-E2lpc<4CJBcKG&N<;{zpu0u@c=?}_)nUbxU}RA zbGi!aYi(49FwX!xu|zY87fq70k|%PaJCAIH!0za-@P2Dh^$1$I(@6-Q=97k9;VUk8 zNXx;Vxp&P*9e}sOMSw6UyetXbg}WHAo5Q# z>0DEEsQ(c&xoBP<5kOiYvEIe(Xs9AC`HGXGAApK;k*vkKSOmfuj1_~!z_{^qK}9&} zyD*{tR|40HXqtIqk6dj#mekMGbk_fc3*Mv_}?(sW5x;>12dyqZK|u?4VqBYs|%>0B{hoY_}1M|J~rR z;Pz$^x);N>jKZdAN(?@UyC!M*g^hvil7CS5B%$G<6zx}%P*=SpA0x6VE>sJ7PbiRg z8^nOD;pqlR3ykJJf=1kF5_e7RaRBcLJ@0|kLYZi|W9H2~lR^{Zczjri*MN5wCzCno zXPV?CJ5K~dR-jFqHhf9I9X}bKrFz;&&u|*u;olohopTTjlhQ zGv&ka+GBxMND*O&TFx~fjejz!b6+hTp4VSyGtP838$Kc<-) zKwId>M>_+8AtEmac#9yzk%y%qv8D_DgMZAOY~)lAF7$Xu>AKX4UO5$=kZ$jDA)IU* zV*$b*`^04yXC`6jGt$qdS9PxdfO%7`Aj0!x~ z<$EX%rC7AKRXPsvd7IM64SBh2As63mJp;@+J1WBr4s$CWhR#Pd$Q{ z-V`R-kn|9XOz`k28*J|8m2tj~V}6 zdemG&im*md@eX^xev#n8P2m^PZiTh8ae%$5@;x}aq(d!7-H>tf>xD&*-NQa)^nF7a zPMAr$%@Eq*dtK-=y4f9VY+Ol<3>EB@13xpA+W&R#T!Q1b(%h5prq#`T!acnBf zfZV3A>9qCb+Oq)WFLEQcOl0|vD!dvIDBR|Ae3mBEHf|B}$U3~{Ao`>|@58;WgWd2} z#z^zvjER;f7%I%2iwirMu|AgE4_p~d5l88nc%GAKr!5_Om?7LQljsdSZJD2bteZ%T zMFhbCf$S!uMy!F{oNNuJbn`0?KJU||XFuZ-X5B$lqOzFL@vM4$e~%{~xSQu2aF52! zx$<&?2r9>-`SlmlX!%opUz!BdgL|i}mMP#(ZcoI>78{tn`A z2K*D{y)$Wh!xXhi@aVskAZq1kvCX4Af*qT@apAcz&mI!yXenFY-}N6pabB$fYVjh2 z2A^SFt_ntQ=sZJ1=B_jUE`$nB`0U-|hpbg8dsiDgYF?UYOZu2$Jb;OY>AFdc<%)7b z8N05$;($c*~##` z@!TdGGm%vK-i>QCa<&<@R347Ttm}L1?0`dm|H52Y8MNec}5VM&TQ_ zka$ut=!8rN2AAMaE-ZJ3v6gAS?^eOPKCq*wZ|pmxKw~ZCT+ZI{7-LIzHpvR(9=dI} zcp*{IFNg?I=!cspwi&<52iR%UxjU@rQPbd(H~KTFv6^fm}I%Px=1w_brI38SY1?{D84)i}sj5kZFO$NMPGn@p~DAi-Zk ztPpupFh&VwsAA_Lm2^*WI$ixJ=E-JKU0El+%oMqPrT_)-M-#?M6sV1biP0`P2FAZ; z{9m{wut5MoZFFZqjB(bNFSZ_;IkeK;9$qxR#%S@8h#d#9{npFq^9!2Fo9}W;zi3Q4n`h=g3#(uT7YQry1!YlE z%m?c%ZS2*aHDpJx*l;KR7J$-yzRiQW*qn4xHOYj5pQ^=c$F{-VpoqaCA8grVP)R4r zQXrEYq4yXy-lw_5esi6LuX}g~*5rzHSFvs1K^1}5J0uk~N5V$Q=VF%z3f4#DYf`BQ zfg_e^VM>cmB`)6OX7~ZCntaz14JssvE(a&+%NB6p?gO}Vzr84>{C!Av^%>bt)pB(t zr2t8&{grJ}Xz7DgP3`gd$r)7yHjCa6pXVzmLRIH<{&(-2{wnS8?K8gpOGHC4O3hg{ z!wZTo8N+N9X)xGypUE8+8eCWI2dc%b$U4{Pj2>0~ibzq*@J!f=D1%x#QU6~0V|++? zTgxK8H&3?9CWu`VQ@Zzg^IXbq^BQ(7H%I>MX(Yf0un=(nNU%D<@*D;LwPLJLxkb}P zaU|><%+duhYM;O#H7IGWqv(H4Loyi8+#|VC#rUXZztJ6@=cR*%wv)Y-6NGoLvrB~q zAh?9ugCSEjy~AF2?Ee|a{z=wsB6@XAapyRZvwWc91Hg65{5ma8<-{Me@NYn%A9nrc zRtA?OTtr0b$L5Cg(-K_jtDh{%eGRAP1MnRj-|tJdxm1nW(nHy83Y1YQKWe~5!dUrz zev%oBN8mr?LHjNit2?-+a_xKz+%49W`8N_DqTC;I3l$UK{6-@rI~=AGKFk_r_fNo@ z(f$P?GmL&l@b^7uFeI+`9^1yN^?ZZ)R%o(>_#bxFCmQ}6we&RdKeB_Y$RD>1q&1Lh z&qUf>SDyYV2=0CDxJKTN{e9U(g`7#jti;DWM}3X{4RXx<+Y1-IA;ft0l_~1He*j>cHjhMLWdy`aM zwH6K8AK+74zovW^(JU;$2vb?-q&kY0A)ON>GqF-RT*ZsVl>R7OAB62NN8%lS_Vl>M z5mSgH8CO?Dyz`Z3Xycrpc2wAacebCDlvlcuZ5kYD{$6>;>(>D7$VlLnDWU@%cWlo` zX{h5C-hl@p34s4w7U!VsZtDlgd)XSR$Ais&|BTcQf4g8pHa6R~DMQ3F!D90Li`?MJ zK>m0KZ$Wdj%w}Tt1dsh^zt1eTZ{YgT`?c2XR!||XC2EsbZ=Miki?pKxhp6qM4uhj; zg)`GgUPIIHmNXiS^zOe>Lx|pa3IjD}V$5l9mbP*4izbA*c{MW*F^E?E%XQ3{U1!2t z&<7Q2ocqYgwmeSN%|Yb(j7(FWK8R@qSXwC9b+RrFz|m8|VHbyv*LVsa5!bY0x)u)` z^=-guR!;t3dH6an|9t%es?wh;H=W-2{?m>?Qmy$}AF(c>@IOEN6j8}7oINDIKK&*g z8|Mu>ihA_AgzrPn)*72Q$Nk@LrNMpkpyAnYTT~Q4+FIct-V)Y=Lrg}q`LR6wDA4(~ zxQoJ$I1`TFwrSHr{hfKY8uPT886anK`r-`bbdG;}tJzBuCpM=n-Dj3y{eGX11BBik zFqazP_5QGi$0lL8kyFOuTk%c%9pfCysntO4bNM(7hXrWG>yfG->{ntFenKNwuInpS+*aL8s}x>|Z& z*ll8~G$8$1u^aDS@#0EIOsG@_Xq3*0I-XbxmJ0LUd`9oFthNfX%&!$;;{1u1XF5~# z=g}3gfLF0Gt6701gch^X)HYW>EmtAZnD12=3}^jAKmJx~`n%o1%-zk{cztm5K39RZ zu{c9Y#;!!2h@0CyR)3cJb+T2|oK~%_2>XLiZbZE{H~nu3eG1cmdyY5ie~d!y0m?`d z*6>hT926`+=7;W*A+sxs#9dxS)oO!@FyF{JT@vIvW{Cn92N}s&g^BFfNcD^ghe!mn%u|zbS5bK)+g(}pa5}d}k z`iWJvWT>Ejr{r>UZ62B^*4$i&Q#tkLJKe{Nqg3m;Ayu?jMyLxf%DV zU{nj6~0y}V&y#F8bxiXq!!-@J)$$x_OAR?Oklk~3Wfb~FhG*RbX5B4g7 z_;ZAU+W-hImRx%Oxn2-LVj8KVY9C?c6e%3N7wE+YmLF7HaliK14!$~tk~3u*3iJ>> zs+W5Bcn9>NNjUdZLA_8@RkYl3zXVT;(VXSQO3dd{T2f~SmQU$1Kv#{GYXcmxqs}G} zXx9l!{+A2h89%-drW1TrUIK2@r#2cD{<>3#LFPst!EjzmMtYWHThW74ljrh;fMs+8kX@KqR;tL807Q887}9G*&UarT!~hJtfOE0f7VQ&J1!LO zb<7^IcNZq|&PrB8qmTnc$hDuNK6)rm*f%2v%ht&^TA00INcNjk7D|PiQxPlst4^lK zNCfs4X(McHjk?dxRCxKu?QhM8Be`d59ZG%W4I~HTC_7Px4)Fxefa})V2X5W(+@#3S zc>I%5mHr*%jTc10A$>&K<**Qyu&ARi=j}U|9_#gOw){oH%ghqypq(JwHvxn$kvteT z5?)LDVY(pRCWI1e-9)v+ra+Eak+?Q?W?0KL6NUJD_rLy0VN}mSpX7P@2U69UtVUhF z3TWcT-*V2C$ zR=PQT+g#*xPw1-;VvRWOJ~N5w+19B?wz?n8sN&r#)}0CLfydQWh$kNk z#tsST?FvT93JPRnxb`iG&9(zwRjMYMs- z$@>nbmzeq6%vOWdX-}T$IQgJF^73Jio;e{GAs*!mzF^$hS2exNCt-F}3nhQb3&Dc` z*cg6v4E*%YeDQq&EzP?D_`+ptvx5DFznhgoyqM1J>WJs6zGq3I2SVeQ?Q+*H^7#Yr zsPD@PHIB_SUDXpPM<#-}^~7+gJtPxaxE5zou8obtV|F^MEED=!*|lv60}1$r~AGsgvBcaE8*N*6-7s%FDN!`j7hV#XVE_4)EHZ_$AU4Bv#AcFsIECd37V zhO()%{lx6cILeNyxEulTIE1n-igl_PhO=f$=tu-Fmkpzc#(CnNh*e0@KX4f5^v{Wd z2u_nIE&y*hJuWZGZ)#M&*meSBCejbs1l#2^4~y)-U=?89V4NOX(y4+fKQLshd$XA( z4Q?dbn7CVv-c8i4CMv7g3PI^4X4w<> zW$X$evHSV)AnafCOu*Vp)r)1FJ;oSNbP z32FBh4^E+~&F?{iQ8D#CXIStG(L*$XfT`466Lgbx)G>dG44a36$49CoD<2FGs6Y@& zc*Y;f>8N{Mn>s;bxumLpY{f(jRZXpS=?JlNI#Fv2yMckPNSW(W`c99%w5h<$0vR9i z-zMiFBShLwdWcR=cpig6>T2p$B@Q8~1rHxoNC|qp`qK;>4JD_;Mlic8*E$v+@m`J; z1C4fosPby}NA!AUf) z?GO_)i6$=TWjoY&3TjK{Vr<5x>}DkYP~hR+j*j{s@jTX>&YX!#^*{5oCiIS_2ep83 zu}sgx=;~_EC{FLb2aJhJB?wI9#5FO6tny{jT|E|iF_p;PF0yIxxT=~8Cqzt+Hz+*k zdQeQWOp-DXU$vuk##E42%k6^~d5QMA?~{+&z@GgL@@b^r9b|gi!9L0j3N7V1=iIeU zYgmdQ8j(W#b;VAReXVo6j9eptyzP*>gn?@WY5H$4EB_RB`?#zRUp@yBiFL;{vO!PR z(i&~Qul3k?sC+vD8PSYnCZ#w;NKYEG-c%_o0?N_u`5cC5#}*%Q_XM|B;ej|L5xm0o z@*Rxb)9$=RR%M3eUS&Zjn(GkNlv4m=qSun?v@3EsLE`>-sZgv>A@0Dw%?!y`iv@!K zAmN+4>J@5`=ovnOmgUS<*)5zej-e(TtY7Z;{@{n%u?GTktVLcUUdmZ~!GozxGkxeZ zGByTRwG4k$f(|O|i-D!gfB)2|&CNZlj27Iw#WQJXL`!nT^jkM=D^vQ{ zVIEDF0H;wa&BVAzpJa{D=l~KHp_rV9`0%HiNuo9cQL<^fzT_3< zjgh-7L|Z(6wDH$#(#&HiPNnRKc8$G{+0Dw16o-kS6ObphHx9%%&`)=hesZlFWu^GL zQ?GKI_7JnjeB5qReGcWIW`9M(4Uy9=s_ndE;^?lL2`MX3Sny#JG?vn(ceW8_3Y#&( zKvhEo?Os9L+1}qgoQ(h$9aHO(`N3Y_VFTy+R+gIGZuBB4UfYyu*Qs#MKtNlnYnDuxjtb z@C(9WRE|DVswXV5T@>e*eY;u`wlYwynq>~|T?cy@Z@BQV*A%x3dUah===bex&TM-FvQk-3=c&8bh;n~aYZ$aE9BO&zoFrKs2bx_|1 zyD3rDO9@?jJ4lMoAnS}Z&=~d1Hs<#}&OcS3h}NETtRjMZ=^Sk2W;+0i-xlZbwDRkG@KK#+CZ>K> z_)kxn z42N-!-vVe8*NZ?L=fqw7RSMu2JA_R@zJN9ZLn1{JsI+w4QLffH5bw=IdYa}e?kjv; zRFh`(;mzM?cfo;DvuQDT8!{Z*Y92nu%oaUrs)@{C{K_OedG@fb=2vKo9lRbrJ0e#3 z2Hvoj3757HEuwd)O!nLIxBt;_bOIABZKc%^pbNWX3$=|RfHfQVDI4q+-dOi|WdVe{ z{hjfnLHC#>fm`P|+lH%3;rM!M5uhVP{K_tW@x0dg$N8^Q9PoR}ODPA^L-WWkd>VlJ zn8i$ry^aDtX7%C|611%Y#G|)NC)Im*Js@K|bXtIb^pUF^i``R}iat5o3gVZv%L@%t zw}JA|+Xi~SN58jHtVA<*@MGQILN@$Yy+mPavP-OCUPWrV^KU*&s6qhwmE7eh!RbtjSTHrAmN0k^L z?S4BD$d2j(>jc1T3=i3l6O;L57$w{%*<-{8`9m?gk&O>f{zsCh=Wwe65k>jIA@1)< z3DFNHXdK4UasgJF`!Nv9QPvphF(MuZHX!)lM*I;3D3-WWfUkD8-0UPV61 z_QU0zI(y~zn_K|EzNc1D_a8GLjg2Dn1tfT|0eK79=cqK2##o#@ee1M~A>H*lvc z1b~wAR{;Q*AnH(qOnH!Ei~QR|)90Dolfw$eEgLWt#D?NDhN3$xWMdm~sS0f35#uDY z!Q@w6(X{yV#cwWH(!h%})DG3}Jh9^XHrqm1Y3lG+xusq=@fb+rI$%7Z*C(|Ky&G1l zYK2r+a03zanGd3Upbt(7_6xJ%V0B!o4v4tJfkllOCL){{#Lv74f$W=T!t6ZWLGUvh78BYLd5zWPW z@oQ=0*Fck9gWq*#q`@N)O%mAS1Lm6+1bis|xXbj{a-?(TeNgJVJF3e_p-P2cu5JyT z^fy7OudH{zKr^3l%0ZvyJElj!@+X~D2SxGkeZ3iin9y;qN*POWt8&cQ!RomiVc0cp z%C#vP7kxPGQHI2Y0*tq&$Ib5HAKbZBI45}EMl54ST`{V;48sgg0Crg{rHjU>=ps0= z&cM_H`0!v_{<~qtceujmof*Evv_+*Q(?}_tCvvYy6ibLFuAUcl!d*%dZ z6bWk&EU%Wm`U}zJv205Qd$t$H?BXOp7(LY@y--tFtqQl$dmDU%R|AJ*L>cVNDj%Gm zt;u+tqJFNGZZ@m7euVZuD04H+J%v7p#BK=ZxoOk+U{?X+?=S0yIp5>B1KCpy4Yh4A zUX$nuhI=#Cq|B1P!xguzXPyH~ZOVHQ&z4dp9bcuQEAy#1lO z;&-iqKO}_gT=-U%zrX}~0}3xa-tO8MfFNkgDUeExEkp-)NcP0=2{< zpRaL54ZEWxPIreS-j69G7kpV>AfJtT9IW}xOi2H@)cX{j)W6LOG|@B`oZ7e$DtLMX z)gZt9N~(+eZyXbwPY@M~X^y!E?~JWe!7YV}5kB2?DF7R{ATb>xcM6clZ4V_W|Jl5< z6TAAkTWk(IAji9FmHyNCo1hi!h=k}H)g^X~x-ZNAeCDfbWfOz?%u#!?_kpQ(!A(iz# zIg@J+t|tJ=8}SNp>QYnQ7`zFY`VaB;A{P&D*lu7j*VRJbuG{HLB-3%^a~$VJ_L?`* zT$IqV)n+!=_w}$<6*as*IDw~2N{cNR;vrhyo>S>_H|J=0u#ktzR?iH?c5Qq0{j0#Z zK$DK)&=)nQb}SLB~F{^uGncH$wo z{V>y#ru>8GQZ|qGFib0{B%DrIeOV>-Uv23jta%<1?eb^tP!(=21Pugk^qMw^cS_VoW6n!EPMo{;^<))yn4<9@skjk-1TXT3)k zKE1IMG&avGL>FM)w~2Gc|6&%2T+=05!B4d)r5>J=QH`@m@XX#)SJni+NwCsVTt$S- zXC9UE=`(BSXTxj$mxEB+O%kom{t$6uvxD3gq4T{iHDH~?ad65-ym?u$#fYx1?*K!1 zFB}9uGQQP~?Ii4dyJ5ffkayv%7`MjP;a=?%Tr9GvcKQm=?){#Hhv$B(C$d3^q=EPz zI{X_a_Eni@1#P!o=2ta~+k%zq904Z2ZJZyRmbW|0YN=YIgfeb$20pe)58l5IQ6eGt z{>&>Ag+ufI+T%|!ri{ItA68SD=G_?n{hd_GftG3^#N(j+xF#B!nodps zQ?Tw6e#9QR>{E8c;q3h^Gvte$BANMf9wyw!b`L{L6HB?O8*C)SzzRJ3&-v#}WtJ#z zd-@Q@$dG09R+Z1Q;c_bd8^02I?v--N2Wsc^!6$VC2-HuhzK@osk*nC(+OE_;hZ}#gMLC{{NT;p`<_C)Qe-c8F4h-k876CDaL1Kp;m={9x_F87Gu`_D(9 z^N0lB`OBJP<7a zdPos>!nvh?1$n9GZ@BP9`&y83*=B8ev0BR+!3X0*;>HH{f)RiexHJd48HDw)-o7W+6B@}h&xgJ2T-``GavF6WG zdrFU!N9xu2>wlk~cOp;AkX(~=Ljl`!2A8~(hCeEfiTcN%8;WdQW2W!gQPIloI$3LI z$^|vmpH<&}PIaUkst_u{kBBQ|BEku&nVpW2-GgFHMd24h5V6DO!K=Ruug_$^i{-vq z(b{`=e6U;@Ncqi{zhe~2sWH3KRVXl+cln!%-<7iy$+FMn=A5AB)Z#Olzr_ps_S8Pk z!kiL&eWA?7a5c$d2nYfSUUt%YzO;7%4`=C3g{`p;H$lNK65UFGl`>g4$Prda-8DnMwZ-ohCPMnefyD| zeJ2>)T1RSeVVy2ju6YZZ*}F6EL!|DhrnAk?%i|8LWR6&R>;FIw1jM-G#`XDxm z`BSdto0BfgdS6r>tsOUDmi+ygO(^?JON(u;4-#jj@K+q=hC@^y+_T07(5y#*x8GF_wTws-_Li?_(}G&380rg+t`ek7jZkV63$kR zg`Tjw!^M{`+kFZT-|=SqdA>!%EZEGcao~FISIn~h+u*}li=(VL=nj@xb(>J``^ z(FIcAe4upSC4sz2{w+*{TtiTNvZSK_$Of^BTmt$XQNy1=-C=NW7~6wUdUq_Ey`m7hnl@Z(`C zR#LXMZ|`Mo;z$qMnmqZ%y>Hg6LFQOcE(0=hpv_v#c4lOwM&AD~NdaD3ER!=&jLc=4 z-8uGsvDk6cbHr%o@J{KYUHaQvOye$ILXYq>CDFPrM+oQA+nC#+kK^dUQWc%K;m-e< z{^dYC*o8@5&D6X-uV+IDIri}WNL%B6HI#6OGf9q#zAupZxES__0+SYsNUb)^XDD~M zj5OW5yLON0!7zpTc+2zt#o*raIE^$4#C=hFA+-IY1Aqr+Nuss{ZnDgN{P7Ga^6Odpq|q+h_Th@pA9Ovo~QeE4BOT z#QOD~vYl${WX?w_laD$}9#i-vzA0LMscH0+8>3Eiwu3k7cTU104h4~*9!7zW(6lFAItTWOeG4JdfYq#Ns(% zHAM7eR8}0-^vYM0){c5L(>wA$FzrVllWv}yP-piqP+h&byrFzsqJ6S9lp@)9`vEys zb@g>6OP+tm8zM*INBC=%kfQx{D81*M@R?J;$i_|}Q0=-bSL_X0x_)_@x`ge~{sw%edR&2fe69=}ldt_<_)zo;|hgoKD z0}Ks$w{tM?^Y&hF)PD5P%X1FfQ#3_N2H;a80O?W6req^|dIvI^C!p)l7{;LQGWV}6 z_d=Qp526A+%C=Ylv}a#gpgxmTWZ{$Dqg+p?&Xu<+7u;{}3ypt2t4pxX+!J$SNm-Dw z+l%|^LEP)EkbVbwFor@s=|Ez?UC0p7y!)>YeT%308BKi zUds!cO%Gax4NBy}0i~6b2p#<*sW&^A?i<4wKmnYdle8;N5n($%{qo-xNck;|c4=^3 zZ{&M&zkSUndf*yjt1?i0AaPwl_SrKOn*ZQmoxFUcbwHlp=7v|J1VbwGHMsG&4YuEL zGFJK)W4Iwn7qc1HE~7!vZvR%N>2Fufb)UDd(Eq*;9$M9bmL+(oa^_6|;Kq8mBYi<< z1s$BxfrO*fB}4zM=WkYn83jMgf>*OyL(nXk^k^axifS*|Z>LgAZ%IyAYdjGiTh{=^YdJzVtNz99R^t#(Ju8&ghOffdl;G*mwosUY!ZqvH(IqYiFNh1in3i$g z6;8gWq~hB3_*|3twpK1q%24nz?YY|1{LmDQc^Gw&`ZC|S1k^~&{B7tbBI`-5&tuQS zJ1wiUm7PDsk*5+jJe`@uEJ@$j_<^;@tZcXld^UTdVUDX~g73;|i&Y1}HvQ!SY_!#9 zk~Y>kMQ0XsH#hU+ejKKND_okP6MO2wH%FsJoFenBYU~1NBcANin_B}N{)#}b7`K9q?T!V*WTb#`_>Kz#l;RGNM&rf#Oj7!J~8bvMat3(y%} zmUk+#^7Lf0!gQ^JVV~9_oi{XCZo-DT@Lp0K)&Td_X5QHEURlE707*d%t_W$jv0?w! zud~rn+M3{&dg3`-9M*q z#{nWqQK5G!hFDB5LelZM#Fcbc$v-)nQPS z+EFXMZ5kMVt)a`r1Px)fUdmT?t^(+Wf_5|o3r1U*RX>g4@+qC@m5nT}uiZlXI(|Y6 zPp)G`y@wYbQ^YE_mf!BM^Nkg<;H5?;l7ipRHL(|l4SN2qJT;zYa%Lr_RU_*<)<>AK zc6b!5VDiM)^93de+=iSoW_?4=ja~vMyDrK6$Rw8!TnEDSm+s&872n#K&`L>S(XwFH z)+Ud>G6aRVyZ$SdaOuR6Jbjd~c6rU9MyW8yF|?*}pj~%zY_4)hS;>?!$sO>6LIBD6DWdZi{ezy>9CP400!#k)m44oZ z+lwn}uA3)c;lNQ&?aw;uTV2UiBEgGbK>-b zkm1m`@)*c5*QsyX&(421;FOevjP_;3B=~vQnc93Ofb5B6cbR>iJ{#8?uC`ifkL*N% zoY*aWE;|naOazuD*QkB}m}G@ltYDVWG*Yf+|GD&4Rr_0k+ebQ>>tim6?{rTw`9ZjUM_bu-3@ZAsNB@`xd#LDSncgUs`=F(MMsh7nQk`;tb${7b zp7#mm!Qx2LDx1nEYeiQ0=06$Y25CuDZXIp^>MoY4`@YWC@b$=L(HT$8dVDe2$xr=8 z-FM$S&Tny7qWT4qHdA_hgaqLN(nq3Loq|i(1B?`9v=U#k>ZdFQ;hBiToek6L_ns;D zV7kn?EcU4VRAi_;U72;X5-4+v_pf9ME0rCt-VPS2S;&$Z-7p{T(ioO{a|Tlyjdbdk zB;z$5?G9~~X(MsD7**ufWj{dKX3G!oth6MN5%b60GJ+wV zdTHcPY$CQII~eqx>Jd&EeRpoe+e(2fu7aWPE_f$wIMGf)WvZsw`)yjv`wt3L)?t~W zyzzq~zusS?|E!@@bpcGrn=Lajjv1r36~N9xWRa|VDKiPMrtr(G={7tAxfCU_tgYFu z9{vC@<@VcntfvRB#(khrr{~0=3i5_pAzN6mZMIZ?8bS8G5%I`*{|8%kFY}sg9s@Y zh4g%}1UY?nVKi}Ansv9)lpS02SR)}`IJk6XkvzyJz>>cIWdIg;;FmY;U2jDV7L=N( zOodLLTrqKHl(Pge%`ev~qiXuMyWfBakGsq;qCs&DtcYK#zL$g)j(}{5V{C6lVKZ*I zHCwgq>^hvJc9DMsDItcfK^n(j=eZL@Ap7ePez-*=uthoODAyK7ZXY9m3#qL{#Vj!3 z;8T%~+)gvbwhp3f6LG_+{nx|lBOObzDD~~fYn9ym>}P{`#}~rJ)}|;s zkFcoH{ay_1r_-y#AMOr(T63RW?GpNLg=)ob+?1S_n3GK~%YiRGSFlQLK4WEj^;BPy@NdaU zQv58m?K!6sZ^NI#DEWpYe2O%tS46~Sw2wKgCG>2)X}T@h`iZe+2-Te`)|bTuxE-kD zghN0?gVp!jVr3kqz6r_O{09tTUdiy{}Gpkj8iW@g!ws#I7`IQ>+oZH!L$Sso%i3h`=FNP?7H ze3wPSLh96f;`MT>`48;-buTNoVot&Tt$SlYnT+08?>rMF0RY#|*8cIrYh-3+t@`W< z|Azd`IR($u`+He0h!F}a<&nBC7hV@q6$-+Vp38z*8&XFj(m*zpEW@<%2##u(PxrAF zkY^C+BM1v-bnkW&L6A=>%ggkJ4s*2t*HVOSq=L`2H8lrVNMF<|s4`JiXw*JR2y9me z;a7JFvyy(A7Wn{?ifh_6#GjW=&d2OnlN>1oxJ!>7D-qPHF!~UJ7Pu@#XL6jNL}D&l z>w5^=$fD4^s%0q#V0T&)^*1)QEEvL2`_uLK@gluL|6>0pf;y%$Lr>;uE65s;_fxy7 z20JtGN$3eamAt`-4H{GD|@=B_qCxAX}=%8|(;ZxCW#}wD9N7|T6wwKCeX|E6980(7!wv3$S%Nk+? z3E}TWvZq6j)T8tD6~0rU1imU@L3UhU(g%hvU+*G(uU6m!`Be{p5$<$)HM{ubzz)FDtpT_g^2Cda|ecQKCu zNfJo{#q$q_O{*)|=3w+*2Q0$41~m5~|FiM|z>g!(;)olbRuH*Bi%rizWql2lW4A6p zDhCa-6uHjVDKSI811r-^FScDf@o{eX zJhl!mN%dRRNH**u_FEUrc+-u0Q+Gib`$=_&GlAFMyNfWED4vJa9*Km>G3d^FvfY zIFiT2ki(I=JnqPDHQ+OBwd*RQq5L4q2Mm<0OhtV`&0mwa`3I8MZ0P}Qq)(1%P0??* z-uY9z?W`-z!55PwnLMQe4VIY|vTGgU<)A~WfqT#L`Qa8Pee;}wiJbMkU$VKrEm~Yb0TlzaC%Gj~}ho6|7$lzw02*Bjo{%!;HI-5Us-H13DeOb^2%VAorL?`Z$137r;TUIzTAz3d0IwNNUN7gFojR1>sh%VZZs6RG>teq-*latE-$w!<-^@MRc^ zEP#Ai@%uQUIW(%p5bkXGstz>F8q*W`TpAh&qe`U2 z5vujv);%+$_lrpq7-HDLG-fu!duu-btWtU81T5pr$tS>4Krk}p1f}L4=QFq#3!!YJ z0+@R;T{A*icvu0K;UN4vC@A|*NI~m6*-bL;C&=oHJB4e|yodzsptn#q61m$)E6I97 zWAQdje#bSkR7r7qJlFFDfWm+vx|B34#eFJG$@l7x1(0YYJ_ zFl`?dBgAlnncFUy^=beY1?otI*n7e9p6~bG3|wEo4`EPml1mQJna0xNciP>mdi<0r zNF-KdO@A?WMM`>Uh^+*4q$KB=Z?wW6YLVhs@zZ2FvsrfMpiH{=8mYtojGB(egkBVx zB|}L7G9DB@mZtEIF>wt9pmD@?3<611e_k{b@24dt>hgj8$pi_8X)|zLASNx&f4wNuf|NF@TBVxN1XBphN&OF(- z&a@oWiY59RsI*qGdL5d@kW}rgP*{|ljQHl{FMp)xSJ&ad%UVhGLrbTbRP-kg_yJ|A z#vRID825XvNTSd3e9<+gYbsP@`rezY8t0Fffcahix0hSVF5dFYfY*f}!Q2$HAN+xTHZ;U>b)mf9?|0m=C^m)r z`n^^y{D~E=E|2M`N8C}% zH=KNBcQ-N^?@7a|Z}N*{ZNDQDYIY<|IFR z^n~ej>)rFU>wA)2-WX{ZdQappEkyv!cN`R%wvyoygdHmZziUD4#O8el!e)o`h+6wf z?XYqA-|rk3+qxLYVT>o>1!4&`pDOx{o)iUyJa7xAs0mTLKzxdK> zt9L(<;30*Cfx1BDW-u&*iV_PM!6iO=4+IvmU`F*NMsm!Q!UpW0ql>KvWI*C7pp}SPs zrK!XoU{)fgM`klEAsxU*L2QQY-lf1T@TMIS3CLp?)s$$!(VYr(*syW#lrkDL=HY-r zxx8avexP+k+Zk2J-o>0Q! z2Z8>2@(`Wl#s5ShlF^ZG_gQEllC=&TKWs>KJ~Nd9OES#v=N8Y4H}O2F zGypUFbR)%EjtRx9UtYcs9SJXq-jp;Pxc$Xga^2erU>0)WVn#tMNI{gJHp1`vK634! ztw2ljpq91M^K%hT?hg9KEjr)}W229CL9W_%@>mV(s@UXvsqxr0ePpYFr+B;TVMo20 z$qcDIMl(PW&y2C+2MG`wC`A<4DniF%HMkr?(C`7@YEIkiTGGVR@FOwWr~ILXg8AP> ztdnTq67lx&qw;m;7FXjc!Hf2)*!fkq?=1Aox|FrEE&1~WE!!5*p8y?j#`@Sa3t*b@8M&o8DS|Uz0B3*8a#mh{<;@4o z#3Ct!*Z5^SCfT2xD4%5!^D+Q0=~+doo^j3tSJ&9I#f!qPc-VfW7rVrdxj(=qeEvey z$w5i*dY|2l;BJg)9P<15zG#f7K5I5}Hjx zcGMwOiZ5((zP#yl#=5Xih}_?VuWECyz9I}5<&th5O1O=aPIaQ^LIa4$M7;VMQ}hSI zuU=v$q3qj_Am9PUm~YatPhC92)pSoeTis=;cJAzyzmSqC8o#j~8=_+X&~=d;*vYSi zbL|Iyh2He3Mv_Hael@QLP_*7+<{bYBxT6|To$cN6{@RX#Ed4qxt3 z&t~^wda6w`rUBcVrZTwj;2tIV17ddP<&*lda1HEnHEp+89QgQZk63=$y<9Nzy*sfT zeteud|HVZSEucO@P;ubKdf|NC>1W6H$bhuy_Zqt3zT1Xw85E3q9i83;)H{dZXIQ%M zK7e1O(!Dc$os&-iHuK5KB)p*FW*Im-sb$akeeP6#uJk=!G*i~eR4IqlJRuX<(ZM^q z4~$L*>l!?gB>}7+wRjVfXXM~3r7eAicMto>t@`}DpGpdcHKyP7s5RM>O9tMyVzj0Q zWEtwufFI8`zZ0{BO+tT(cu3~69{v zS~6B<8$527mPZc?JQM%h*e1jlc0L|-Zbid92^;j-IX{oMY9>o!50&5wuLFQD35U0D zCGJ|pCHGjEEoI3UT$vmnlTQM0iqiueZDDfJ1sgHm+M|MkHHvTbA@9y{$WVKk_@q~^}O!YJ1Z0vTqQXw&2 zjiXSR#t2!aY(XG>TeDSV$h_+Yi>hn(0z!rN+3)I~>Tb05MSU=pbto=7J0{G2&hWYJ z%%^9VF)-$*ikX`(Che+ZsFrGHRq^LC(N0AT_bipx(>KPO<%zPzbL8S`)#TJE19$!3 zT$Td{$nE>O z1HFJoitI!K;QD|V()p75kGwp(A|<-9;L(lU%b!h7A?F7dn1MrlsI5WFlWSLHYgUKm zU(dZ3w-gS5b#caRcBwbIh1lC+^CcyW<^gc0BO?E@tr#{Ce z2AQx8C@B`0>tFj3wnQ|l&20JYx1~(&7k!bWZm;r6vpV4neYo9;72~tKJS&Ga zAZu8z^Vh-;g|HserWk`I)GLa^wDpOvr^CFD&%Bk~L6Ssd7jxkkemYWM8X@f;8hp=B ztMO7~qeh*A0J^!}>xCJs>%!t7(1Nn|L$?0Z)>)q;Z)yMCQs%D|l>oY1h=*4q(XX8O z?)n~NyWP?nZw471pO`h@xEcdeod1Ft4vO>s7GKGLo15^8&h~`AEMrr4CTV(+ewKto zADqqS!8MMR4z!s^mm{rS9DNSRYdqlE_6V?&%4pAPsW3Csi0R~wMxJ|!b34E8yu(B# z3;`|V_wi8|_7U;axwZo^U;Hz!a>0?q_VYizpp+tx_#W97yQcXP-?w9EgN$zZpV#Kz zHm#-~KjBg3sF`s6d;pyHcijMyDrWGu-Cv}?8`2n;TjKwEuW@6&{WaR=h-vXb7xFp$ z3*Fbp`^SexlT&iJqSo->6PLpnU<~nW8$}NPZNi+em9hVXzHr%9&cJYESH~?7hx_$5 zHT`{d=15V+7HjDAw4@_pft{E{7s@6q7n|;eL3KI2R>3Ga6J=~&lF|t4Z<`N%If4pm z5D@7xfLqybi`|nh1X*B zk7t&Ro-U8xQ^)DffEy7Hh~_pH^}?#Q01O*Ry)`p4GN{EZ#eQQ2EV-_(TlHStqv6Cp z7FH2Cbi8ewTfzB&%liuJH5?pVmgM_liS^%R|1KYOy9V#Ll84yU={{(pO^C=b!yHr> z=CdvRI2s57nUzVfTTQ1W|YtH7kuLwerH)#4(|W zg7~xuk^OLd0lNZ7fq6+m``!EktS!Nj+{5K-C;Cu=kNWm*$f~hA{UZpW`M8>AY;1R< z_2r~o56l*7B4e+W3<34kQZL=NUzKH(LfJu*d$`h)$UyqF>(|KZ~*aF;;Rl0x-}??yo8V+)o^5R)t)TVVd7(B{Vj8p@mrpd&DkNXf9* zDra*6Kt=jD)vT!zh%pVcAI@t|1K0EPb%~iJx8xDiCK^9pRak^O6ZvLlgTdrwNI$*_~1M@vqiOzqqMQrEN?06kW zDRXxkSrmS)RcCU31v-v5SC7%8Sf_8>C$!N{*oJWLeQcuncmN%Lf}m#0gx6r;SFFPn z^m+XU_7gxKyOd5a-)Y6m!j9&#;=fC3)xgOPL1L!~|E=W>j45E`g*&kIDWE2K$S9f^E>*@=u?{SsD}5+-Sy}is&QT7T zJ?%syb#O=AtOO7If7rEDPKoxi@NXnu6V@an8R zU6?CU43oKZ=D*&>1{w;V)bee zFJ(757(?KSKMT;}4T@zW%D(+w*?~SORBDVT82jV@71RdCp)yV`j3+E@5W)OHxy7;64$Q+kS7Q-IRdu7Zh2sZo)UuW zXN98QI`1;Oy2v?Jk_&nr-<`YOFNa|gv6KyoR9A-zGxmQ}Etjj{S26lR>e&W*WZp&y zzlLZHF5Yr4cwocGv(zD?AQjMBESI4E^cDKS98YEA^<<9DN9?!Kt(7u8j*V@TqgNt; z)0QMl09v^S#JK0ul>ZX|7M!`md+&=m*RCE${#O6&p8&^HK_g>_;v30x;Q*SpKX`s^ z;%6Ds27q@?^_vWR)R70=aLvCx;M;@WUAs9sIdqS6^05fWIgOnP^Ui;{Zlo1n&)Gb~ zrg!G|kn(qvx1;)*`9>Js zbG5z}$OSp||FZS&mfTNvMV-wH)PAdn-Sdo7dtr_DTikKgv}Ikrg3qLal{B=7wEXF3 z-aUoZJ=BMTI2&T808#R3_w^VyZ*h^&?$V@9T`zn|r*xAxXtl}+8OJ~%i^s$RO?DEs zT{WPFiUdg*G5t}+OwS)CHndb^s;AhFsKhY>&$>$x~$1ZtlUsZ~pY)8trI(9lAxlV$A+&hID@;c|jdT@Jsod^BA0& zF@}51qO0V~TR*YiIgtM!Xaxk zTUJqwmmf)WNi3Hmtg(+eTLX_)naeBKwcJ$T{->YAXZ9I6_>)`@UiY3H{72K8VsIn#G%4rUNBxY^td+pzcV z^;10g{JEERmv9O~(%cVizdm+huqGcS!7 zdqc9w?Z|&l2}RlU5gg&B{bQv+E}h&O!D&iFxe~%S9;Y=m?y@rbKGTd%xzl|=S*$8| z*#2Sr%D5T}FU-2072iT^cjyKf(w0D`)M*Sh**B2^2e^y+=kJf7{6ajeF%lEj zN139{U^Ff{kdVB7;GN@Pm?N3V&>Mg7Ie2|=pW%`@2*gWjjz?r!pX6gcv0II^>{|aQ zW#1`oPylSlTxUa!(`=z@sLyB=iS61=*`J|QOkUjT4Iz&VbCNwd>0oROne&N(En)9l zy#I29=iNxiP=r&;CR9s?-|MLB%p=^3tu1+yJ>MQ}5s$S_xD>Vcf(=&RajxIweX;v| z%==;0U?)}wduztTc3V(B?H}%~%d^Lk52T!FaZ~W=avm-yK+F>ZsKmW@Q^{A%63i5y z(j}^qWU))W8}r`e9&JfU;O&QnQ`r>8_TUau>G6JIP$Q(3)pr6_ru1@)hZ`5&&kQ5P zGe3Z1E9;I|aJ`V-VIb^Dp73WXEPlGY#!)a8>bJ^i)A5|FcDd!yBagu0U5+!0{1mUk z!UxJkMcB$e#w6usge0bBkA>$AK-SRw1Lgx=tTsZJ<3@*2zxs*-AHo`jxW)1<@2`ry zIs%CiRba^wp9WVYKnif^)gIC)*n>o#OMpmKpw24^A`uV`Ej#ml+GbWla95%-jO34$ zVhRlUc@&HF<^f1b4l1mQ%?`oxrh=yFDeh6uM1oe7er}d8tyZC20{k6b4l`rb zKX%tr8OO0L(OU43fGa3#Qgv~8Mbk`S*!qQSamOTvn^Ze6)~G)p^;CKFpqoUM3I+qv znJy?L=`#+lsC>0)`I98Jl;ziYo~Z5dzt^~dxXRodc5me~25^+wF-O(UT8J~` zh6=&y$p|Etvz|4Q_Np>cd9nAJ%(!l~gc9(S5YvK5gP)e8F=z;`2lzGV`c%Y2ogPs1 zxeLgDayP)>FfL!02NwSOa+0iHc3*K>EQ6t0Kwwn|mrF=2!*mHBb6-tv?>0xR1)4k>OAR)_XXh0K^If^XBk? zBCw9t;lH|0j3soT>yBdhmyL2Z3O|b|)87TA83I9+G1R5XWF5Uo85>8}9~7PcZRHO1 zHd2DwX}m!;=0Oo+HTV=_(X~qY-lcXUrE8$pDTH!_`-!D7lF0sxHK~^OE$3_2EhSda zIyf@hx6=I&H+3oriuW7y&*7XeUDQ>T3a@@IeZh1W-lm7A=L4CqL2)}-`f3lDV&U-h zV-BO@+yQZ+{{x(&mDQPhUTcHpEaQv^V z({QXAI0{-2o2#-ZgMJJg)xI_OTr9&Vn6I1l(H~j=yDX++F}vviZySR@7|_t^N}?R4 z0{;>pcuPzmj>QnDD`&n9VKr34o#4nD6TUmXM6-OJ=#O&>7ynl?X-{*GQjwrQxN(AG z=^hVO#hN>dV^p2J_HpHRH#QIuQt~vHVUGr5Bq*!x6#(Z+l8O%s(j=mTcsSSrzLXD= z6;&=xec@gD%+??UnhIXg!#Ix{XNYjDycL)T!T1yl)SY7;B`4pAzWaLxEOD^jAEtw6 z@bhTlYv4K=iY?JEbXV70Mr$e4ZD{{mRn%HuFZ({$dSYyy+v1d!;(FY820w9+3A*i` zNx1P41YUn|j`Bz4pTpgO=o(Z4?)IL?kgiSlTKCTXfAug0@W3|WrPGLCyW@;Fzzl&GedoXVd^lt=*MI5T}ftM8)T`* zyA9j4{UqUHU21;n$M!YPHOfXg0e0oK7Eg7|g2b`9Q$-V{2YmPb_6t(edv^MGa;|QK zL9dY7MigB38lk!Y&QG~_XLU$6Q!6m&27NN!^#?Gcpg4EG=VgI5$W<%`HecZz{Kw{~ zT!)jI$%sONXAA^k@eQ?J0_gJY5Knsh>nEVc9;g057egJvu&MNrP!lF1%R{2^4t*n# zj08ZmcFtKA1eU4apAV>k6HCcY^u8Fa!H*VWaMj|M7VytqwRtn)-ErV2Kzy*5vKa^z z2qVCURW@$Dh&gb0dr||vk*cWml<$Jy&h>)FZsFm=<-0-b;xBj=EC?F(rw0iwbLFe| z6Pu37%&OtQejlX-3OoKKxaOnb=Fwv$x-1NS7IDAI=8f6{KRbJ&m4DFqfRFwH@&dC; zjKWleUW2q{Qs3F5yHRG;ZCu)J?PcVPV=o6af2#;jOJN_|+;qJco|FPvs*h0}T7`GP z@UP1QXcS~1_<9|LD0+z9Qj!0quv?5?{xzXLnB z&mYp+@zVN6ZG~xt?)r!j*p9Y&6!pf*B+9Q!=^fJ#Vu8aRwyX}a`J%C_&Nr{F&~3J~ zSg)rIo8&_glZDB~7bG+!0H7^n`BK`z@a6z}k`yGj~$& zecftC0gh0xD;|U25Vh6^W#G)k5`Hi50*#A=**<>p<0;@wL#9=- z8NRN{-&O4ttD8II&)OeW_lA zM3G9e0^9r+$G*Fc4@nv%NV6|}J{?n>k*rh;y+os0*l(-IwF#^sumG5R&qESFh?+WS zFM|dh68QTD3N3#vEB)#UXPVMq-6#Smr(Ykd=%p{Sdb9z3(S$O=*pk29Kw!}&b$=|L zA7U*j9<@RR!M;{ck>&ASo^xT{|4a1Ue`K=ckb}tYZGY<|1V@Sf+D`wOG-VZua>TVq z=*{5WS$F047)T2Uv<$H>F^o58cP6Ksk?qD^OSdOOBEYm7jE3yU?}suGNfTY7R0)c1 zp@AX0q}0nYq#${sZ;5;D4S+k24b)uo?$O#^w+rkKO|?ZRra*!EhvyqmfzZ*Ftm|#{ z{u^LtLEaLCMc}KYBKw%-1uF`yz)BL;sO;#x+3E{y-;raF{;8#rC(-k+I*BEKps*Il z+Vd?h|LjBpfuTO1<${CphP(c?el&vG{4o~NISERzSceESc*@Evx)IgZ92PU@!U{-Y zZbIRhV)8uviq7@taPiqTX9Rd6DZEY<1!3;|tQ2zJ5b4eGWWK5f4jjDGqg*{Zrg`OR zN4<7oLR9FnXNrVJB;Mx1Paz@T#6&gjcVuK&K#A$TulXuT7G4HzK5MArIXrqaip8r0KtV&h%?0K!(u$6V%{Fjzf3jr$aVPrX5`(Soypl%)C51+ec|$@wro zSSkHZ+A?>J1Wml10?f)KeV3C+?hKl_`|Vx&@f%6&4bJZQXoUaW0dt4kd-&z;xWIPO?g+z^4{ z4dNr~SZ`u~tW>2@)5ct8EOFHrvCI<62b{FuMJq*ro3>b&`-?@MPxl1)1fkAwexKpy zXbd38))TGV)1tMbARJvMloo>`kdes=;DfZvD<>4J8;l|VQOf3v{br)w3g>Lusy#$R5k{7>Y6!O?pU8Hx1Zq1_}j?l%%6yHaeTJyRMw;kVE@Btm~YKe;P(#hI}Onx=DMJNI6N_~ z6X;;;hk{1oo=Q4q*LxrESZ=T1yXck7iM%Hxnmd-cdZ~1ssuDt_)%Q|-XN6RpwO&5p+)&P;xDTT1sC?szMbeq>chqeC%N8g5S`5kwSwP%Ui*C{MV) zC?b%8)Ixted*4v=F2)Pt(bBwe2CN-^3DCGR_i9b9Q6~R{RU$CPwT%)dY+maO8KwpV z+II|az`1Dc;2!X|Os$GZ?0{Qi+5dE())p!ATR*RUVjl`zL8IZ|%g1ilJbE15AN=?7 zPY$VZa1Y+J(I!$F-F?F=HOAnMz0e;f*O(-*b*<3<)&Y;R&hx>&U#c`dbqlVLG5QVE zRHSY-G;2c+iVoqclAzb4qbfRb@aeGvt;NfB^A^?{v0?x%;9Rd->qEl;-|LgY+f{z_ zZBpV?uSHhY`|#xMlfHIv$0dn~>9Wyp#e$sL3B%Xp??Ch4Dz_8s^2HiBp8cRQ>m5-B z^To*)M(PT#vWl5S!lqvyfw023-U?(O*S4@UmUBLEnNctN`8QOvDo&>$7ruU9^f;;z z)D|!H^40+Ticcl!ZLW-vGg0#8fZAclHM7&B4otZNXIN*%7{cyfxcbC0ldYjqO>z|+ zlbQb;U$QmOQQZOQFotXj_P%3)805xxHVXgX|K?OdVhK_cd+4Fr*(4=*ME;vNjJViH zOg4>O%!5=BY(ApBlJQazeqk+=rE`&%Is^auFb)GHhiJ)YQonRQ^a2_xpN)&8d|eo; zU!F2V;NI`ZMXAo4fZQ%>9MPa6AKoHzG*p-p4T|!!^;xLUJ_HUSSmMv7R4xci4Uj`{ zf@=^KNP%BuA!{JiWz8baTcAgNO0B?|0sB{;!SP}UOXsyNE0Jkk)sA}MMRR`?(}M@o z54CtDkXN)ZSW!@4@CQ2ua!!VLJt5m#P+S=fDlK$fkjvg00>bFld(?2c_TU}sEv~&2jzq= zaaVkHB_F2BuopRQk7qx<4h;!_URg!KlYf!Ow1LwAZh53Rp+QFkd3($AwQe0L-k|)u zoE-FP&4@c|ZpQQRj}uqGrJCXQv3}&f&CMsuuA!u22koBly9krS$AoD9(OY)Sy7o=( zH%&{8;_FMAV^s9B`Cr5%1e9i}oB)?|90!HRGj(GzmCK4Zqie?u8`e11*sNS5zy4Ky zaRRQU`GJX{&4+Jf(^b$y0*VAO4=`71qpl?%pZZ>*S@DOEXxsq{WsSUOdgV_FWgWAJ zuG`4s&-3-Ymcl6uzM`+}NJP2k>UDIL6E!*dJ-bfYTzfQgF1EJs( z0T9S1OA~IUs zKq28c_s=sPx|jCj{Qtw)S4Ktkh5b&D(jna_pdcYBH6Yyx2r7S4Qb0hZV+K&VMJbU+ z8brEgXhbBWK^VGWKw^Ml=3L%)-S79F^ZBg(VXyP-XFtDc%b+Jn++;=*a&i5IbcYbJ zR&{d`;5@OekI&`#N=HYI$@k}&;_}b$TY9zd|7hSq)X2|=`6HU;t=4aCx)=|uci~&B zMS7woO27F^iu$kAM9vbbFFDK(6ERE)fAo%$E@UCskSEk_CKzk zbW3w84QU5GGIg=|38;_~im{qEq#l;w$A<;He$fqkv>_3%AYZJ%hE|Q(1FouMCe;gG zxu2nRvdeWwD`tMWDN66Pt}x1?a(4`O<7=+oJNxA6HEM)f-c&NEqk&?NGN%^>2-+*b z!)#*`CyUIT{3T^S?t{w(tf{Fmoz)m0g+iz085aH2Ag!)?8SNhvB3gl1mpf$i-0GVwRo)TgX(z0do9X;4gfd^ ze?cQ|9u5$I_jgu)39C?8Ov~Xd_71Iry1WY{UlrU}kPnkQOkKDEm#VMf*Bm_dT7A>* zy-46cFGSlO<{33kUd|$drfL*$UritAq;z;b?@t9Vc`mH7YF*H4#*v}5V}Ygrg&XCp zxRU=lvXRa?YIp*m9V!NHK7ZNgF3<%F9}5?jgt8b<$G;)KvNo5qM&Aq!m^ra)t?_xP zkTcl`6^q4Uo)+oWGpX1eH%MRSi}@_>E%=W=QbZ`fqc3dYKdCgLtoUoocd6mK@v6C9 zP*aI#-#BLA9J!D^zT2!bU3UMDx*-WG#qP*azgeRVi?3?KyRNv%GNUq1g&iV%=_HpR z`i=)$rePN2mdcD-Mr6ZGU}%!)7nW+6owe~-HA;98z1#E_^|dIV$K=p|06nGnnyIC^ z9a@l``)RC|v1tRoByQ~2U`$(gh*n9g&KRJ%P_A5YnG9!o!*IsX6ID$^+{nB!UZ7w} zp;^TAfvuZls`(D?waG*S%iW^iDX|!%nPxj?ox~<9+X|*(ZpQ577iw+qymG z^%LiBpNCx8s#b`)q4f)mnw=2#n$~>{%b-g8gcyj0ePX^CX)-Q3L3A=I^JR-<^Y!Lc_ymLg6;fzAPX7hL1~x91}BmcnE` zG*B_M$5H5kGo?=_3Nv3l-w_|Gh;V2B(C|f87$d}=Jf-RZFc|wg=;E-(i?3Jb(Edyb zzZl^tdm*Mu6}4B3zJ0Lq6n#D3%b7&*g*E*><6Qpqv>iW9DLy!I*5SNQwAFXd zeK85GR8%!55%A0*!qKN=lSxN^%^4V{stymX?2UH8VG20gXqr8%Y6p(k5ktr4fUqng=qf zP_Hd%XJnLv7l8IO%FVN{cLCI!+m-Cz?VCD4739G)qVljzFY10;v=Ed zh=DGKs8yoGzVGYb-CBk3T^0CNlM(%1SVOo>d6LN)Zph!BV{PzcgHW%8Ee?b^MYY>M zA19txFYP^%e-ZvquAOQL zs(CzNB_FP=TVDaAc~^7xx#r~8yN;>74$9<#`cGA5oJLIFn(B0k56Pvf3Cd>W=2ra zWF#O%WgP2Pc_uXlwK62`{Bblb<=@@e(nj>M7+0KQEHB6;VB4ZXks%C*qh+&??UXrPaF9`E!T z`1XwNQHg%pcK{hDPU1;^cEwF-OA;rU-N#@;7j^q2?#$hMr({88QK(1=xA7qbFbPhN zU{9Z?Fa!9L9>3OHLYn}0ZD>UWeCswvfuH_xwS~q)#i(YI2Wcb5k`uA~)VevbD-3%zF`%cG}&HN{>4H{-J7(zV_Nb zOS?U#tT~5A6-aqO1TH9OoSjvEViS46diaA7)bBT%G}7}&<%oQq%vpnvF-JyhtK}ZOK`H6>n&hUhhXL{&x1&_xnXlbNIdTC3?WJg#1x&^-_e@Z9RzHWw=h6_ z!p~=htU6_Z=0|I7bC>|~vkce;`tKof!rbO+EGTzxOrPP#136Jb85G#;^p|CF80E%& zIm=B)W-j^utJv|9T_JI_Ng@;_N}^03s&JcxBWC4eVqmgLMEsr?KG8dAK=2MzINe#Z zT9rijNe=jj7bV*=oV5L=SrJ1wPMhyASylGe8gdc4@JY?glO;BLH_fCrbP7@%RQN1G zcn|6d zGSaxe_A3xK)b`^jT(lHMhS+o2d77M2#TpWlcPIYwph_aWiIjhYHXn^aebDVr!jpIr zIWAVSKYfxWsZLX)UP}RPP1}&HJnW5?xlMu{KlLciNX3zoL}eHZo|&zKsZ6JLdubr% zBYf$?LyvYT^CUismLx%{WHCo2@N<#KNM7nZ!;3f=6G~sWtI{Zgg>BtyJd&2~yB|cZ z|2Ub}-S@YNp)nn0*o9rEc=(&-$NM5z*7_kYH0$9K0_TvW?5R0b0N zel`7dUz5Mjku&Cb!zup#G*>NnLWt8z4rv-)-}M_y#PsGp#SdFrMCo`XJFraRFF+xu zPkrnK0&zH~X0QHVI89NoyBVbE*?NdP0-tlnYmIc)z$2=Of5?GkHSeyA+64$LUp`hr zXoG`1#5zv7Ko8@K8d%$}K-4!kN!!P1bH!EB9YHXcK|$Sr{#SsR&XQbZ(sd<@=lA;u zfhiQgVLjsIN^RR?ij_flM*)PC^NX&$;aL(Ay-K?qEfve+^u*AJ5J7`2Od@QUaWCoP+&8f|J;Xa!xA zcDC(l?-awO&B944?V|_3tG!_Ri?}6H;`5ejyQ`vfOlW}Z76(rfD`insL|~k<9-N%L2wyE+-<%K_H+fEOneLNxwZ1MrF&cx7Eos;;Bf!jDKeLEIyA<4y9Vpw z;r?ZV0DRKL48RdxAkuz&kD;==aNHJ%Ou&#=mad2(yhP)k9h+>$BdFTZiE zQxpYm1VBV)8YVEdIhGg`k9y>>aTzpSAp>Pccc`4|=>tcraFD)8wu!+~U49HrDq0E8 zomLo;M!gS{(4x2e{45{X`*FI}9?2d8<};x+hdl`C&AeW5c?~*wE3p&>zvd1nZ=C-$ z;^1KcT&eec%1KY3j!Lv|lTTI1H*Lt{lUONgNqeXo@q)XZ99HTjg|WezaO_xhhhRPNnCw?IE@K|B6KA9zjA_zY?icl3(qska_jk z4*NZ6IgybJAmqdZ=D}p$5E*Fh;7x%x7*NSD6O4L@_kja>-_|Z@L%X1#L3EQBFdzy= z=D6z?hevUqt{tBLiej5z;6^TSSzb&Krryni-T%|Gf0gx_so)Da>3Z;~=#|qLU57J` zd7C?qhfcF@Wmd`z`Wq3b!Z&1?_D^BCd47dY+MjBdr=!IPXn#{(`CslwO&ZU3X3x;O z&7*!cw?O#U3tgiMHRjMnt6^{c|6s4AS9}K=h7vnSHXBRO1dy~%SlT;*934^|+V1a` z$F;R+bSoD%IXCpbFiQ;O&qy58TV7s0S$VPapo3&AbXTebO}9>I4Jkw?rjjq9Nn9x9aHDiOwxRv zzauZ3oo8WxQQB;Z^V@RTU@_r9`8@F*jk`!czj%HzRz*dSX~)MFky;)o>4wC6>JiuH zGdX_BQ2als$HL0lpW6h_MdEKSjqVfqG`i1yIoHkqJ%#mSzxFGxrW3oM>%pLWg3d{E zF{8H7zWY`_DcDiB&#tf<5MAu^5w#^c`5&R1i@0@?MLu@%l(zHbC&%AT@G-PPwjh;3 z7VICBCp4yU=cMamL45eu^R60eZtGA1uWRzh)L;^XRAOiO62jI zqX&!!VtY5+;?I|BNpmMQ2{=R9;lHKoYnkl*K%|s~Y1@_Fw|^4aRV5KY0;%mzh^)Co zSHDGmGvSs5|Jg+CJUx?u175UXN@-^jJHDXBl3YB&^k?tEf0P>_3RhaOuYq&HsX-`^ zAVS3Z-siY$@8QcEvI!V6V^996Ujkqtt~tKVsZ(<_~(y#`jfu7B`2&q#buaLLf3o81?ChNZj*>)~`uS7(cwZojF(r zT(iCfZJU>mwHTUYUv~u49MUycWH6d~g+E(=yvJ<=7{Mk&ckf;u^SUcOKHT^Eu?20a>N@B{y`575dldkO$J^O*ES_p3ETWbkk&=FYL&yzcPXEi z`@IphCiqi`vzQq^P5=J7i9K3s$Pb2ZRq=dg_752%AGg~E$J_65OWbH`y<^|}v~Sf@ zk&`hyujNbzDejZashyRc{oBKmDQB0QJ50F5>R%8Zc1>13N^i0+1}X8ti-7zxc`a@k zRuv7kR4E-Fq7t85X1@y~)b)Q>(IFEUAbtp+kG?!+`H&;cMq`OKo$V-)l{W}_N2iPX zQFD+sIN7b#@&Ou{1hI*Z{$&Aut!&!wD*o=@tn@VMe21)|iBN*VD?nI{y%zY(`UP(U zx;bEgiMXt&%&vJn!QBB(IdUigB2`mqE&4R!eJ2I~xZl6!=CDWyfx^q1K+fbR=xwB!nP+hdD&n!NphD?9LpiM#T% z$QNNWY?lLZXV5XIbB~?!KEaJop7Xp5MEe*zs|gZL0}J*z6$x%QS1fTfL!`e%WU7mS z-r5q4KK98BbiiYZq;*2|D{2STYc3yXS~6=GJ zYqVI&Ul0^xkRdqIaj!hJ^Rm5Cn+>F5bFcXwu_frZw}7Rs4Fhy&KAxxj#C#j1sJg58 zQMpLi=t!C7J}cb-H#K5R!U!G;#xuyN6$d(sXN8+ukRJQ48JV~5tnPc%4Ng`$Z=Sq%t%wPV6bvnY$gQY$c-sL1f3O9dV8u!Lax;mwLTm3BGaPn^U&v~yO*X7t&vTsAGz&B~Sza!& z@ShbGx&XNLa9ghfiAUX?q*P0?R9YO{*s)KwP(lZ=tGWGphjDt%nURZ~I%D86Ixz~P z;@C}&Gi{9R6MU-NHQ}dWTnWyne;@s+tSOr=p||>N4r37Tg<&|1BD8N(;HIo+kWks1 zo9cWcl|TZbjk#)B z`ulGk&7=5sm5zI4p~HKFs13vsPxms|l@^5SiBR}*ipSMag_7AF{CX5Iu6A7@&c+!k z&JL2`p0aD{q`bc*QR%gJ$H3G|vMZh!A?n_BXZ5$FkryHswEJ)9Zuoas;hPj#g|7d2 zoOX)?ZeFaXTIULKmIgYx5{@N=x6M$oM;< z#kbXqN02|hJ3UCaik-!2MGQYWDNbd%h{?SsaGhD!~Q#yD; zs(xP9oA$ie9!VGj5rK}Z>r%_t1<`n1B+a-(*@a$;5Kx~UD_X8^gWh1M__~>2cmlw! zoV{t_p78k|JqMT6Z@^V4qmxAa3qSltoI^s_!gcR`@8rvEgP^4=E}f4NS9=KXGvUpl zAp!H=mEwI0svv`(xmrN}hY+`Ki>#z&g4Tz|UQC+@fv+x#dMnUDZ-eE>NlW3E+-#A2 z4Fm*trvS7fa#%Q3@XFkGvtR)|UolW+xCDG*detyCHOPrx<)awZXB+6}(|gpTia#X= zQEqs(v0f;%$HFeNUHnO(vHT&D`Ok9(bslJ4J!jJv)*bw##z1Xm;pA)5H+9w%%IBF= z{cVmggHEPD%F_8^DAv7y)Jv^(%MC9Io(7Cpod~C36`TQhuY+11`OaQfyc&Ql_{QVr zBygWWN`t}TMKSDouUN#R?cLQWl$2xH+n;J@b9MKLXTH_JZF5VfcD965hNentn_dXy zR|;b{S~C35Tz(`PBPE2YSNSh>;cMZ+pKW@W_(IN z@_{A=kp5Jv+|ilWDo)`kK@k2zoqnh;sR2cqSc_uiUdx#j2!_sThZ56Em8V5 za9bxwwwJFbXG4*>Ve?B166^e-c=jx*4 z5WjHb?GQio_cy;(w7*o&+tue2rU_cR=SL{xm!<$V}Y?4d@b&P;5L zZ(S1!_Rgq#Y{Aj2r5L_psz2~RGg)8;LI0r{JzJI$iu594Be@F69d3H(#|^AhX8!6? zOJBR@B)i*ouy3<)d6u5(>*C~N`CKh>67kb#VXK0geM0S#lb5QzP{;*TK(i#XB%2z+ z@YQv{$eKXEH_IK(w1{WNHIn4NUd75f06;}J)U0vG=iAlgp`0M*VlPlz!MFSC*JlDZ z6=M5A9Y;gS-h6;peFX4zM_d_-@Jif#;spCnK$bKm(1=C1{$wWrq^2KP4}L(GdRwxi z9>&C;?N~sHC^5x5!EX0T^5SfOmcfjlAGLlggSY*ebt94Zb48POm}tP%JoFCmo+8oA z)i|6mPv8D``zyx+;XdLrM4Z5w8b$7x9WeGDKrrA2w z!tW+mk6zSTMAV8+vonQ9J0pB#lIEh|b)hYfvlzi6MkU}O^%uSCH;OOGhCUR_Qsw5! zudYd?*UKPh#pQec&6plTZC1u+re=oCbU5nCAIYP?Qg~lT3yk5sY^wORLWXBSe^z>C zjnm)nafV?x|9C?YtPD4|u#jZlLwZ=_i&$q@D%Bn8;HoOv^!uffLdJ{C(In1|340t2 zI-67(=V)JM3woO;xG!3s3El(ue?vB!gU2z*SM&>U~o1FeI8L`=)Ei$$eHC(lDQmG z=P$Or7{*Jnh(4!Ip~2#JanNyvQf{K;|6{C>dq!?O>;btfYXY5o{r=;30K)Nb+* zob+G#qQ777z@HuV9^iY}ddQa+hK!L}x}I$|?a&u9>>R=b+~}bZ!j_b^;$%<9__GTS zjGOpd8I88!-}AfINequTWN+~iWKY5xVT4hkk_qJ%$18YEf{!hgLzeHn5pJ23o=)u|X zctGP!HAp>6zcI^`%GHZC8DJ5(KvFb|KyLN5RFur; zY=OX)PN{D(>~bhpHu)GPXWBk^n8VE3xj@k6vOi{x6dTIa)I%7f(`ppg_x|xQ`l}N5 zh)jQXN^Ax~BeWOKde5TMrfi;<8@N5+Gn>j9I!a1<*B9lKGk1ntc;*9SWV z;p?%{k2zKCm<#QB_kXJP2^=S`J<}tjYXa9G5#k}UWS5?~ok{gpmwFLz=v}%_B^gnk zkz*?hRjc@nx(v@C*ZGpg9mzXx8+@hw18I8xDP0oTY}xcgDGAsAtq`gJV*Y2j7@r7% z{CH#*k-J+~Dw+oU7kUg=YMb&KC@yW6_1grNsK@()*#EqUqiJ*w``4M)l03;`6gce( z@HZ?2!e%B+8s{g===lY67E=T*O-9r1mtP}WWERQH?fthD?AQ->C}#b28ON;W>uh&& z=ZXZm*Pbm!UCY^O#^x_Q^$Q$j*C#DUly|`VH3f)Fj~!#*O}XLE!GdW^-`|SvBt;7Z ztMl@^c`!&Y0M}a7Z<<-JpGR?*kdz4gwkL=HH+~EjBxkzXA0-4YW_ond;g{D}SVf|+ zY+mkHGo4tR(AeiC0U#09j-CKj`EF_=fuFD8E?MBR1qu2p*_p_dzu>=f*YCcO#FzOz z$}Hh;cMb0w?T-nw(5?_mg#kD$!f?Vb+X_v%qJShx|9A$VolX!`HEHdOu&$J3>1^}H zBrJ+1JI133)81%&SL}Q73!*Ti`0q8kXu$Uv+*9ba)OX(XkhF#F>p8sbf^mCzq2e77 zj56-{ePF~vcDDyfDG0th5{eYSl!Z`Yd&vOO?9k{2j!Jp z8noR>zyBp=jJ8+jc=)kLJ(oh>eF+>i|A`&*l0hX-OR0jim1g&lryvlrOtG)(I4c`cbt8z zh$;FtqWpWCq{b`nU?7IE9nU38eOwMfeA3vhnmk*+!DdG4%TZ%4s-@#N9h3D_!|aIk zS?(3lh4XlBA_ed}H?6|R`My$z0%(U!v9lJdO{K|{Of3-| zh*tbhrrwKt^itkb)(;tZ1@CV5_!@gTc0>CpCsMI8UAPYw;3T>s@#mEXn!gVEZ~9Fd zl}GY765OK~k&!tkGhOA&{>IyBBA>A23S$Cv1+m2jh({S_TLqS z|A3q`;*1P(1*Y-hhA&xn^H`+af*i5GnLJPw^F6Lwdm}eY;p^x%<@fbfY4|18HPP!| zSi8^SQUcnCe4WOEo@W-({drK9oSMUdN`1jinKhyiq%G;vO zH}27JF21D0^VivPc|nL?xlDP){Pik8hha{!kEy$q5eD! z6e{KX720i7NKgKW?D}laZ5@9Y;N7w$fh=rnw44MnpD*m}VlW~CA!_6mpy#|dc9M4==adZI|S>`FJ2drD|v`zgjrmDFO{R_14-cS=JU#8HJ!gj+XE5A*8_( zFT+{N#RbSQvY;)^6^k1vgIMiZd{e@7G(`-rx5@1+2~@oXf`tE#z6xT5B`0GsD~2Y3 zXtGyf{@If#Gcfs&dtLF&Ejair9f_E&fSZ$n#_0g1-hz>S*s?Nvke6<}^nNkaH(C47 z*Q3Cp-{GYGPvp7;w8PYcnOM(?`U;>X*gkO(o$VYgVvqm6$|UFl!r|(E;}oU>eg5y> zVLzFrKnPRQka|Sz=9&ucv;&9(+)R53r8A8T2Rq5!>!$h!vAr!DM(fg~it-fZ=f~NC zbpEW+KFQC9IPm?=1M0?DWV8<`73GHC+k#g5t``Z6K>;MJ+S-s4TU@A$++!lcX0NqTl?5XTF9CX@u^$M^B#To# z=3>RYZ^I9vwdwK4)#m6{eggRnRqh#U(2=7dMHI6Q0;a8u%#El56DbN3*`!>6N$yu` z*Kcy(ipVEwcrO11y971qEqW?#E*3&Sa%6qe4=|L{23hj7RZm!MU5Ah9My2Jv!XB}= zu#1eRh91#>FXl}&mqcP}L5cKE_l&EXJr}}lZA$ezuVBg`{p>Q-s-158<^8f?5E)TR zov$3Osy(ClJ)UVc@``svwV~1v7j|#T278Z!=&1x_f_xJ0ES*ZXTh{y~H_AUT1KL^Q zmjP;;mK;TREK|#z`ei_w3L^vdTKty0s|!|$Cr(nUH#$Rcg-r;O&z!2SrLgBKK_Lql z6=6RM&Gjz<;OvTZn2z|hgfKI=CqDcXTv0e-1S~}`kUJ3I=I481EQi#Ae_E#IO#y%X z==ezYF4|2Y#alO>z_h-ACwllHbIp?d(leh!XOoS*(MbI~n*aAvxKR9mzS@M)TcL`8y^2b>miM1=MjV99Zn_>Enk{J%_I0qe z?u9x$Q4?#WA|DNhFWy>_0e;T&;H5$?zdO zWncgcmKA<$t#Da<-)<3MdVB>Tvs%`j@Q->}wSs*C((q?9Y=<%5h}~8ws1H{d+QgoO zF>*&070>dBvvJg*m}t$$N$5k5xy5cQ=>DC?5v4uYgJW!o?nG$tWt)PY_%kh(dZ(I+ zpSpDYH_(0fEdy-w`|$(5bvQlKXC7COSb+P}PnerIoZZ9??DMk{63IM3>}__QLsL?& z-uHAcl4AD5#F1F0+ir6Ux4!!W=^VOTu8ej&P~D4#r49JW`-j1eU}P>;R89WcM+|-+ zS=CPqjefYK_Mz{OHZb2`$DUkDC)R09iST{la2qWnv^1-^VtC-N_-b&Nk<6u|TK|M`}T?rm%FGJhDV83Gq(I)@?1)^F99kNtb3v#OSaB%qrWSO}mO=KWd60Dk$ED&nN>G3zru zAT$ca^Yyf^!y)xz4p{c5cd7T-mmU)M2sDG}W!?|@ZEN}&fEYE5E#^cj)d8$nVj}m; zL>_(=cs)9XUgaZw2n~XSx`51{JmPgn37jzXO+VKcxE5C#3HUXk9yz0;!V(GQx}w3I zhTS3BJ)rO8-60Sr-F~?SVtXW+GLuSK;1Ezx3E$`E%Hj8sgv<8`kbmG;%Euw=ZKEW_ zsbp6DC3N?7jc_4E@^0?);~hA2vb_7>JLLXc;FZ2Zpeu40koXN0NEr3tl|wD>|#^@3|M7n27xX!&H>cjpL(bV!p zau6k1{(HU{A3Mu*lUDsXPpQx9OIDny!h>?}GVjyA=;4-?nDIJ%Tj}jqEt}tQ2cT{{ z0)B3gX6g|rst0RGaoaIMtMCQT>8WO259$fE@LalU)$@&;7HUQt)uC-rA)Y}opDH^# zN04ZX%?&(rsPcGbd%JG5P8L@-3t|Hu-KBJ(!Jp;vc}ae8)NTlxN8=)Hi+PZL;g$8g zjlO|6hMk359Z1fogv7wG0Y(mqi*&vY?{=mhQpK@2|8yeimyae>zQX*P2d+M$(FaHzLIb4VD%2Te^AmZ^om^A&`b=-p zOgtE{*B}pt4uJK)V!2d5-wo$~SPGSsuXc@{?gYF*o7xRNIAhvW&3l1}Z8j=0kQ^hG?!1rL$&D5g!fRZa8>9dL01B0SV}4KkCGud#)PfWG;Zk5* zGHCzIw+;B`7*z@L~@nuJRhysNC)+km`Co9klG@~MZ0 zTh-%Vs)N|&#rlxfkk|DJ_78spC+xb%TtGtyb`+B=Z3G(Ey%h&sBeVqUIqNh0+e4xV zxx;aP+#bE~(1j7^bF%ui-@-zEQ$5dQMSRe>0y^v7Ry%m(I`{@Y8tUz2a_Xyj)#(%f zG}QUQiI*Wvs)eL0E6z2J-SE+>so$dnV;<#V{V%>Bx=o+k(aFrL@u$hCAN~7=8k*0v z`$i~m6=AjEgmfeGQGQqegOqi%{cQp~Pvq*}(JB_V?NKWY5KDJHw>kLJOY8;Vd{`m8 zqWcflO(&r;@RDSM*pqOKI1If-TvK`$KAbZ1A zA%(tv*WV5*^-9;ZP@fxAXFA+bJZmtd0hF zsaiAL4)0Ml2B%Wdx6y|h+V*^XHULh^nQ1~1Ro%`k+5+%LeDNTOkKM-SlV838V>}Hb z9i(6~59XPH($^>XE{beq1gm7VlYZXDR0l7Dx99-m075zn63u;Mnip&oef(*Jw^6>g1KaEWEv5rZz7Yi`r2Kz(&;5Q0c~2 zenR*KpodTJ`aaZxY(%0fG7A_0iRvpjT?bEiB?Y3Re4Kgd7MAha=Qn^El1c=>wVc3wN=kcKC>D0&Yt_Ik zw7ihYm6b8qbCOrN(sZwrIoDV<>kG6m_pN*3EZAs@i7>dYo)tMsm1&T@9zAF(B{#l} zD#<7)&Ag9vWq7#xe!~3Mng8&llofV~L1M!|ciqlF_M-E9{MJUWHXG(F>f$3Z^j~Ls zNJ6mtEP3ITjVEx{@&t53jDn3e>q~q=sei(_nd#mLVCzGxt0bEcYyw0)z#-Bs zJn!dr@8qi)gWnsh=L$-3m?~&{5y<_0A7z>iuuXC2e)%KU5ZyOVRX3!f4Na=PdC0aI z601hE`+QfR^t@|h0VJSuVRibgc)VI^_mW%Zy4Tw^nzOU;prrty#b#4Xqw-mC9{o_T z?aZAZ;EeM5(pLhS!Z%U<#HhpmqsWN^@KQ82D<><;XLA{)?^HPH{*=()IN(AarjTMr zJ@GHavoYOcS%s7%W=$|1O~6vjg(V2JKaYXOX0e<|hezQP)GZz*UBs7#cUZ$ZMT=%x z=#9tSIJp*Y@a;%~bA~&r-=PljIj^HLUnw`N}H%WU)IdlT>1N z@m!%`yfu9vrFx6coO}{e*Y#Tn!?9W|8yFt}{y`oWI!V%U$obknMHs3$OFWmdzoh^jS*!Y9M5rK{C14pS3V8Fln z4BhUGte{c+K`qBk=LVVtU4~IiVnWluOScMzK<**HG4%maOzLLoJo<km?YoC`N?XXvCQdJ)11H|h#b7I^R+ClB6vO5jOTeDnMt zpJ`h=>EB1i{Q5!A?JyB?q29Lbasu8Kx~?T!l}UqX*8R!<+z9b7wll(%7BP%YjYb2&$HZX0V*`wmRqjBAJ- zd0IQnUFPXvhVf}ud7G)4XA*34`s;HDU?%-TcGjbi?ey-A)0**T>!`nNqvzr*)M1fl z$o?QvuQ)8RNO(`~L*JXo2TX$G6E6je+hMEqz&d;LyRl1a)qE{<2|-DCO2u{eXJ7Jd zx=yddh+1_f*)KULw(1d#_m0mX88S@&JzJRwxC=XlZauRNGO!X}{ zo0$JYZ-d2mf9w~}T_D9gyj<7PSDu0zZ~K`>q<{aF*tfk?ve|y|rQ;sWrP6<=EVD-~ zz^-%`lQ!GE5!t(h^PaxXKc-5NXf8VvgIhYiynXP(yDxZDQm&M-hNq)7NCN-1dciJz z0vzM`jpmNNR>tmUWa-=BQCjZ3`YyQ{c)yhKTF76x+FxHb1cW^^qhEyi;JjF+d%xvO zaUl?*pm}3__gz-Tf&coD{K45muL}lngn&Ox?$Q8(@n+!*eOdmn^M}zkmRcAzbvqbb zXL+P)|Kj)am)JHOpa0bTmOXRAhxGu;jJ z|F{be^?RrZa1~WHaW=?2e~*Zn-z7qQ;>qV<1`!^=;^UJp4@h*s^=a-frUN~Q5_2;f zk&iw=*QLlu)DIqNYyGc0>1t>WaC}SKP)_DewobFGqa$ud)&^kiridUr>uirJ1kP^b z-kxpxxAv_*&gHfnI;M?eg+uOXQPV|bn~qwvGX&dw7drj8+7YqrvTf$uc%hnQ?P)1yA1?l@q5B@Ng+hdqi4XTMWG1D}Ksuw>at`Oo6ydd{X}tBRsTY{eAXY%4!hq1MIiVn;1Img8a)}5(2JPdwr!pt=Du;Kk1`Hbo>xqfnO zX3BV#wh=a@x%hvM%+SB=KtClW*|h0uWm&3PcYw7b8j4HbTR z5i#h}kRINLliN}ngNVjoF{jyPDe4>7VL-Are&!f9`cWvU+1>k@04lD_}H|4m>4ji76 z{WFMbzscRWbny55kzWuD^LY%10R6(fnx|n(i6)tzq(e+tQPJNpV`9sIkQ;-U5>SJF zqxyI2vrSzhhrL_rR)_ldZ!WJUBPsw}&tnzHz(t&e{hz3cP@8kovA9xDe#PyK+pxc% ze|J=W%22{UggKkSa;)E-3O~SHcBZY+@^8OXdr5ZD-#wiC(Abs7%yw^y&Y<(g zEg{*0LQX9HY7*|FcnV22^%B%`iXGEd%AHAHihXB~h3bB=6gLN09a z2!#DrUU<6dz7y4ttbr|UU4Tq@@BEQSxjBM0h33@I;t|RII;O@ia?erB#%D~DjGxv4 zKYMVDw|{EIDuCg%u7M7Bd@q9`9sQFhkDa>mQxlsWz-};x6*^Qm^HNxQ5wq7D`IO1_ zTO=Nb_TSqZ5wViCbhVr=zf%i{+XZA4?!Ae3y-y8^JG$YSMZ8{S?zfXiO`42OQ^$JK z^+b?{=W`I%(#_LS7~d6a zVx2IQ5Oh*_PJ1-AEYNj}aNA(MD@OF;{5#%M(U$R{{__CdA;c0bNx5CxKis5}NU)1{ z8{gY4z1U83NujR4bbLFXPAMt5+aK2pk+m3sAOA}@7^aH5E2C(6FL~j}EI_M0CFvH! z(e1||uvUY$q2eLkVTQxduIcxWiiWb|k+I>Bh6Z@-Tq*2ijxvT48F+0^3|d zGrzAn1fb2Fe#K)$WZNc7uuY-T|y%OWelJok^F&>IN zzTJGNjhr~+u6Ukpr0Qg5`Quf1FfQz*(==1x{u~%;@LB8bhiAlM0 zwv$A>V=Hjtd$itGK-iIK*#rDjrN861EylHY?lesNJ z%?o*&K~=%`<-e$pr9AX9qx&_*9|GTelvFC9yA!V3V4<2Lt61sepK;pkOlzAKf%=0; zArmE;iq~e@aTp7NP-I;ER`{8^_%+#rIP%Kh1LWH3)bn_pWEIOmDP5h1ko&Ml)T;Ju z7)}DQU>*0 zscVze{|G((9QYOL18(I4r*UI&x1NDro;Q$3J?{?1KJa5Y%>EB!XBigN7qFR*v)h{X<=XILk%^&Z$Ds*r7e%n_nbV?lc_Mpe33f><6p`{filTNyGQ!bF&(Aw8S+v=wxhn5}R zToLZIORF6)@NjuZpoHc?%GeF*JjxUv`FI4{xBKTW!4sz$pf}8bf7u)wap!bQJ(*8; zN~6xr_VD$Ge{HTCWdD|E`a&%TiOUuXvh&OHXw={+uOvN&i8+IaFOX(VUw%Z!wq! zLO6wdR!0N}#5sC}RUpcDBdp3k7W^c!KcXq(uZ9TFhN@&-(@2=)^|@p`V|L-zvRnH< zpVL1LIXmx-fiW+sqsm11kV(d5ehUapUgAbH0R?eK+@nTqt~1J@YEc64l(reWsOrZi zK#IP!Stj)iZ{%rYsZ-{DFU3lP&5UlMQ8SjZYF+RU`VJ=|-M_g5549A%VcB~(yo*Ag znw&?}iHE#4yu6JR?%Z{+oSDHDNlX}Te+_cvX8kFBuKaEwRbEOUaoIG$0(=oAmE=~wM5Zj^V z9+(DLZ`KT}V+OlJ1@7<@02FYhnFx+;;rso7xJHI=Qse{t-aRF;889PlgNi`KhTU~f z*p2zA)N@iY2rMf>TK-XjFu2r13rF-!#u23Xt|EJ@=K_%u+YK&zq-M!exd0E9=6fua zRR?3%YbB8`)f#Q?`$%MpSwoYx`8Pf*3mMYuR_mr!k?$Y6FNepJVlKIrSt^)%T9hr) zW~M+r=Nn-Udwem8fX0s>R-k`GiGJso6Y`#OZ_zt*i5FKMY^iN=Yj^dP_Ca)=+(!EM z7bmBU6dxuGFj+S;a>E#V#IJr?UU8D^s~(PUJG;WsznRK@EZK59%MqNqt*pm2HFn#= zGhA-`3b|FdsM)l2W1QHBDpnA6bTs~I!m5LoMWz=?ct?ckun9^N;Etvyl6jzyx&`ht zLi=x|nZE27LhP;6Rwn#oP8c`_!pMH{Vayc#=sObd5^NR)U2kXvw`^LeNR|SAk{VX} zUB3clx8Eg}JI;M;Mwq4-noj8jNAn?EDU8(E?KkZ2cg{Ffg z9@u;feROpbjFFqXBtSyOJf{11FkABkk#ZbTG%pvW(BdKiygvSSAFP-dVZj9rwz@|e z-Lht;IeUw6ww|Z!OGa(~>@2;@;sMXHTH+u(&{E6HB1)d24M?7#W{_(HG1 zBr+k-1P!nx`{lTd_7n;U=wF(4LfAQY*DR9wqEHd;ELIg!KaeXKchV%PZDGi5T zQY{$qtsKZ=8u8eUqNPPN8+$Z`?>p0ve?De5ohKu3bk7We8RLu#xRmtBs^+2l! z<@A*bn+$R%m2$t8Hy%wzK9BYlUdUg*ARHD)ayW!^2joKLNBDkuou%A8CK)`0X6N<$ zkU>U%`z~IlqFQVpa7G5Hlj(6e4eVy5$%AqC7#%N=VMi7gmn7RV`yYSR?dFF;!qMap zY$2f~YO8`-bBpPja~qja*^dFi`ErF@3YUcbJUA$UoUiTje0mWK8^yiMjixd9)zxZ_ zK;{yN_Tmd>H7>=g#xvCMU)8{iYOb+Ol3p@yofQK!Z4ft1Bqum!QDO1ahx||I!c>R8 z#f;98_}cYsimN1|s^t1;>^p#rt+h|#ZOz)_S*D~@;P*tLEr95v*isQ8O9x= zKAE%8x644-PO4V-#*)N|D|r2;6Re86s+FK(3R_mvLCnp8fX#9z+(1(Gxji{+B#48JLr(xy{Q6%fI?ZvdfU@QL*_%Mu?2HfjON#4EIVfuy z_1~>?t8GpF97V92j}+?ich7VFKv|xbAG%LK{wkq@`?AsIS$6PisNHEfF`I1cO9PkZ zfkKXzd)knZ>4l(fe3Ih-_F0Tuv-yBF2}Y6sdi%O!2;$CMApH1k%ze)Yu1rNnU+oLO zU+T1TRUKZtrLkIm`e#Vo%JCuB<-UA&zUa`UwJ?3%t;f~vm@d-v8ww*v2PsRZS9}Z9 z4YRGJ!Sdd5__@8=AG2-8!QgPi%5Mcv%UckcS;hP?`b=VH&gPtQLcu#_ls|vK2Dl6o z446p={ptQZGrgF*auPRC*Q&iZI_E=|W`7J?5~W-F*L0)-g)_CwD{bjM266c$cFYlG zrdge^od|YQp$YAJlwV1*x~l4{$MA)e4en(J<8Qdt3b?5opROS{m;*zp?Rl`U-~BV% z`R@I|Rn*&%>ez3&5F3x1J)S|oTR&K#1y}`IMz3e2B%H748z&+UxUqv;MxYWU`Z<`t zK>n1yJMC+*i5}K^pKW8nZTmW}$hS}vIr*o>pLPvFMzok=5K!0p?d)VBeTmmI?-Osj z8dzH=gmm9FnH%V;n&|HHpmW{{*Af3i&dd}TWi+uLCO{u^tH^T#2A-2Ytf2O;6h3q5 z*tkcBtEH@n$6`9gWe96T4G|!%9yM8xPBjz68V$h3(OT|~>UXf*_asxZ%*9EvfsWHt zgC$fCC_==0cweKG+u|>>G{IB-X~w1}>ZFS6L8po<$8W02jlw77x+SJ~{JQO-GH(i; z4{}a6uM2~P3bwlEvjqQg zT}n8`P5;E>9>2=3Q$=mr-!*0v$5-IDQC1gG7s-s{0UdwDFB|Cv9l7RNiQ9|Ioxh6H z(7yHKyKU5Qe#(L0R=hos>HOCFCHvN?SUpfR)mUqYyE2C>GZ)EjcK2{E?|WB6lJ0)S zbl8N+*}F!SpYy<(G5r)wtVEES_czF10<6$B&x3ge z%jk~m{Xd2p<-Ja+#MYn0Yl}TjRC+51(Fql9&rDII@8H)|Qb=&^=y3fq#aBin*l_WW zs*o687yR8C^8HsSwJr>|t0byH`)MKf^ZRoT9HE!~^fy}t>}eAHae6pDS$Ln@~DM~b=38+qlQ z`dI`2s{EW8ylu4y3od~5W&lImg$Y_T+^Dmoah?f`!2||GC=MXaJjaFD-OVviBR9$UG~et<5hT`47-9L-Rr+fPM2w+Z$*Z_t2vbB zVC&2w1#-gm+PJ+ldzv<~wIY2epJPMdKA{B8>NlK(>3P$eNmXB?Rn*?KH`@vuenaoy z2K3?hQ>^T1XylM!fvx;+1ZozlOe-59*;%UiR5=~L52c(JH64_<4*T-fG-ieRn6#fS z+vy_W+B`Cmew=$P?jwRW?hg=(&d4BIQt3!cr*jG3eQKaV7^Ub?N~Z{nuw;F#`wfCK zyj)|UR$rz@%`9xzy?i!^OA`~UoIi`pETxz@{|Lr%djB@ezE=Nd=E1RgB>LagPq${n z*_3}q$y!(=aK5UoChm10uAly?y~dn*B);5#?4Gp6;8mB9ejfMtF_JzBMYVVR__Ahf zrL@C`B*jOT^B2LfU2(je^;v^npZcN$ex)y*|3ObSkvD{vSqEOVYvHy@1-_?Xz;fy8 z%P#XM>})HoHCm68R6D3G;O8z1jEcyea_)(J_GY>Iv(96mi)l5w%|@>Qo%Bj*7jf}y z2+ia9^6xR;ixbz*JtiFX)VbDIA9X|ToOYc;cT{+L{v__1e3{hVl%fNt<@4RqhBnFR1_~0>R=C(&=-pW|HohFk3+vZtwz4-XnP1ZoT>ly!fjDcu-Lkcok`5T5N>4xFqQX#9_-tTm9w33K zX(UR7q&S{B9C~X_f@s_6Uu}0Z+OyUtK@@>d!&9O`iTBC8Nvo*8?OW}>{BAV9W{jUd zxpctWXBv41Mb(C}faJp4yL$0Y%H6<)>lZePb4o<>HPKp1mN|GKy3fUfeD^W`Q1>Qg zzI~D6o^UDcG4fB}@TVT3sTN#J4ekQ^apVQh&w@+ddud(?rYU*lRX9 z6Pr7ez1lvEPilI;=>^%KelhyztO+Y7)A(|f7MH&NR4Kt;7Pprq!UjJvd%_(oFV=Ne z0q&6_B{4#u`}>&jnel)ONI|X97Z8v+A>{S>J7_NSOj_X{7^s5jxiG2BK`dA9<>VlT z#DgEd8Yl!~2lT8df4@v18wkm{Ty;JjgYCvoGKsH73Ghj~<9fF}C_)>Dw(RHw; zG!+)T+7C5`1~Vl<;7*NlG<0O4f6oW3pOw=dR{Q0wk8KlQbRghw9f1Ny zWT?sHUXdP%4LyHpYKOTy#fZAMFfP&UJNO#SoUp^6`V2L<3pGq6U1XxJdp419OV13+ zx7Xz9FGD=Jqf4fa6k_LS(@M6 zgr$06;)gpsSO%EdFIV?=7(Pu_t{8PnLt1{ds74e7oVT#4gpbgv>5? zPTOC3xUF+=cPo4@NXYt>Q;1qJl=BT{aT0rt91j z@Ku&U2vbC*N%wF;3!FEwC8r~|IeHM+x&9zQtbXUNBOlC7}S0Pk6GO51cC3_@?821_W6d;dt z@O7W&Ze|5?d4jmU$c}nzqg-=e8X#M6ke)ChHCzb_oRy@k>|gR)tOh+41HZD4H+7#- z!|cRwZEe`JPu2~Ci;hy-+~3a)CGW(*T$6IP>8M_ri@hxg z&S{aagt`ilL+r(JViKzV4Vz=Ia9XSIN zSNbD&3GoP7KTmOwFhxm$aFJ6Z<}C73Q|J|Ixtm@fgr>g^cto%>fjSp9j6grQSB(#- z8d2)4V!ZLCc2OJ2+_0fs33g4mn+`Up>u8$_U!Ct)nwm_8@%VhcDkVGBvDTeD6~9SE zx~vU384lKJ$#XiSB7xX(y5wECW{P`DKkep~{HEdK&~-Ko#b$1typUs%&JiVj>Hf^m zpI|d&ZVXXaNFC5!!wv36wyI;y&Z>Sqejx!~^agHY+euW2T}Rk{(q4wS$8AFy?orVq zDf?HTDt8m48wgyyDk0yvKkssj;2r+lmH~r4V%%A}6Mo zeO;TTBTsJ!hUF1(u0Y8sfL!lTHbBq<0MwjlN;4M3_3P}??9P=9k3Al}3|c>^r-G5Z zpne;VAbY34yqFVB@UXHoVL>o=B4woGYMzXk{(Y!Tx&6ojZT0eX%(_3EPt9Lj(N)bn zQuN#=+Q|6f>-?fkAhc_gRxJ|YL=Gn=p{-vayZvZJN&t0!+g?*G1D+8|WCmPkH3LUtfJla08$!k*UZvfLMk#s>ZL@BNFD^QoHrZ(;zz zdZnE8=zpi9M5R~YTLLFnBt@odGNlC(5=~#iNbmr#4{*LtA%z*$?KI8 zwX2WvvI@H=9LNF;>V`0#3g@qGAb~%j%o_@QvTJP?2L7t|m|8WpkhdaNdITwya$kB? zQw6(e7s0rx_Z8uHN&RgXiv^W2&kye!>4Dc$Z?dPuU()p|L!7E~oPBjjeqiv{>POop z3g&&_KWcHJiq=E&9OkBP=0Vncu=z{7u-d1)TtVu=011@eUKh!_Z=h6rU*g1Uo1KEn z8!<~BL#lg^tmj@m0-QBVE8sL$rZXPz8vXMTu^u&$)sjs(KvFJX<2V%|xe)mg{O%}! zLkL8xnqFUU8+`eQg`?e5a0aH{O}VLw!SkbxmsioY6et%Ao@_(EHf0Vn%t$JHrRoHy zbQ_I58?8JexxL0o)5KFI0D=RdQ%jYl*<2Pbl~8ILYLPDOo~v7w6+wOIm$Bn2?DK#2 zO?Vn>9kuH{Ud;25d_OEcLSEfqjv91b6!Hc7X(Inl3~C*L!;)X~E%v7(V&V`Ru86g8 zrfAl*ewna=zi7Y2q4MWrr+`G-oHGf>WFGINC4KLYIb8 z`>lQiX_TV4IcGxuxPNe12N5B}Nulb&;tB8l&WU+|t$E@*zJ3^*Uf7O09dor?rG+k{ zofi33rsWJ=_kQ5Jc160sbHDvucBppkV&pcqI|2`tq_8Q7l#Qfm)K3k?{YUjthc0YM z-013-aecSuibE;&2fYT47XF{#BICvRt@C9(oF{YET?u|IZYIc~a6W@oCZpNMs&jx5 zl9_Ct=p&?s=z^%*{V~MhQh+OdA#_1~5Vkr$zj4~Az~PXt^ofYjgZotxwd;fmihd!b; z`NCXF%{U{3GW%moTiWM=F;D*{eROH0dl_CpH|d9z+Lx}d%LO~}w>$C{)kGvPKcl(tTw3zoeS9TE{n0a5qwq4-)+%pwI5CX# z6=!5Gk#U|^<`h#tzF7_4&nt&N1Cd32@!B~`DoLs!K;ZvbXmd~@gJR2R%l=b z&%-afr^f-ek!8>RwzZ`{YOq@;Sy<)L`Rl7d4Fi>uT=w_|CFL&coIAfnrz5qFu0c*Q}<^5J>}3K`R?)DE*)I7ki_JR)nW$nikjN>-i3r zlq|ECASV`!lt9A6|X3R728uWU{;h-+XI)=D(<~nG-&Bz*kS0G$}@8TEEMMgkr z*$B8#`s<$&=M+HoSM%P|vw6CNf+N~_$J8R9oH+w25Z4z*uueu$pj+}tL+j8W4z$_& zFt_Iu+IVX-US>d`TSJAo=B(X1gL)8=H5HM7m&od~qJ^>!mha zi(86ZAUc7iN)kv5I@tE`mF6sl8+VtK2c_B0eyHrurO+l;{y8=Wb|YYzOPm})#K%|@ zdapvaMt(mC3hK2~7@UC}(dL~-qd;`Qp>G9N*vz9`0+cP-973iJSBvj2U_C-T|D z0+sm5!JiLfQcWS&4>uYut;Wkh^wr`*497i5K(6J9_A~M#@f?H)qqj~qT`}6OkjrL)>v)@Q zw4Hl^cy50hOAP8bY?SQNQq2zSUOW0dp9*}`%>XNYW!ohYTt#`3KnL8~R^9vemK7|2 z)lXFN`1aA26Euf)l%Cxrr+u8DH73&mhd=;LDUSih%Aqv`zDxMt!Hm@48-`|K#QGAh zfpaOrW0bYPZF25iWzXKl-m7y`KBz=y1)}{+wCWquW&aw9%Wp>9gu}Fg657zg))@`E zA-aBnQXe|+cNL2VHKj&^Au*htI;%jtsc>UzGrtMtPGMY6)*17$L82<8K)C6n6=t+` zfOej}LB+0M=EE3Tz00di3wo=o=*!$-MSJ^QIUlj6-e;cPt3T3zpOopodb)Qkxa~Lmt$nG`>+jO!>@k!l^;x2{uF}1rs2Ay~3uB)H zMUb_NU|&2zKC>k8Tg?xW(T~!kLISE`tNTnv;9&a5-jhABH6>bO-U*fnMzG3FnJ>wj zM*ERonm?3$8liQ1|2w4Zf*r&|2J01tz}iqMXRgjwKK9zGu{+F-5YHTy`_@WpmbiG<6>+pDK;tV@QS6RGQ zx>P*GkAQ@Zh=xtN-NGD16?Q_|7+ncP65ZckFUB-l7bRFCPeXn$dBW#ksVgHT34Y<#%^BW+3 znJKO}H>+x0@erY7(oW#WP)}HrRs9g@XjeO=2!s9XGxb|LXbnq@-ESeDJJ=AmXl6@? zpCp2n4yN00SVO<{n;(rAg`E8~K3GySbUY+)lO51pk(oZI41K}sZ1dycDxWNxvAHva zJRxEQamw;I_m{2enU4E8!tXj%buNwOb{5H&Ls$0F&{7CvJ}P+O`ceimW+P=_w+meE z=n^r0TS-hk3!ssD`gvw~eERs7&?)Mef+68<-}7Y$&y=kp^Ey@`wP>aLqy}9yPxTm4 z*5L${!O`=&M#xa!NYsswgDyyK1Q`=HL zY(F%w>)J8Yd%{&!whVB@;f;m(?zKTIzYVpM&rD5OerWQmFlcfRhuBL>CVEtA{H567 z{XgdHcJ~KXfis;iH=NtHTn5DUoTleaN%qhYOz(6*Yt8RdkH?ojVYa>OaZNaXi(0Lt zo0z~n+?2`PyV(v`ZO3eeQx!6-$sUb;_qFGX&Mq|Zboz)qiL$f*+U6i3Rv!1~J9sa| z8sSZ`p5EXkJj`f0gIgmmFVd@cg73Yz>G62tW+++mzr8iG&MG3X>>VIS(8r&B7MI+x znL&UOsVV+-rtVCeZ`OiHH}|O_7pz(j9~673hYG$yX#a2J<<`uye*H|gdrL_9Q#q37 zt`?*CijF1DuBgH%&z+xJffG{d1c;09_n$@%8VzlYgYU;uP9bzCPtj2i_R`oIM|h&l zxR=E9PV7h^zKlh?{qKH-ED>3M*~G{+t+zU0ha`SD8pk#tP&nG3glq-;AuJlZ^$(F>hG@+@3%$9(&hA8RL9_f8JiTskNOYmv`B9a}s~y3E!!usH6I^bUu8?Sh)lJOnDZzreWc&v9-gUppMJ;6(wHB7Wbj@0mwl`~0OYWb; zEl#Zcvzcm#Po=vfw7?V0Mul&d$<_9?H`0<7PGGvxVz1`?@TZ>?(O~=v(k~mqlZdDG ztuzXw^EzU+ss{1SG+V-dCUJ)i*BY40cYJOsZ(R;MWz$giy$fCy&ZLY4($tV9d+|N6 zx*Qu4tTAC+6;9&+@Hrog%_d9p;#--&4K81rqLp$b0+>bALc(uAKg)4>9lr?mQZRhj zbLmlOh~BH&N$bdw;yt^#TWCD)Q59i@Xw&3I+%sMbjj+eeTyEc={+fS2F2(jC(PTlW zP>@gk+b?o++Ylz=Wo|_7)ASs_lDT ztiG6x$#!~f#{P!yHQM%uQ+8;wZz4ED85q&oXoG0=JR{uQ!&O%r({Y^3_-6{{#JmjQ zJWr+IEOUHv8?1l-Gu8}s0!~Ll(IbOJ3Xs@;{Z{QnI5SdT(o6qYfT~FMks}rNrAnq1 zzSNgqOFDU{0UJ*DOk{|3!sxHRhIP#RspJ>%3}Efx;5I%yG^{Rtxf9F9;<`5To&06i ztNcr>Zjk)VG=u5SBDvg^ZW5yj**AYg$hM=9&*WI-ZDhRs@QTG{6hf;~5~nrptWEhf zPYL`USGmG0Ll-CX#*6|sADA;~T@t9>s6i)S&L@UH698-j5wUuuB&+q1C)n4R_S}&- z*+!pV9+LpESsgz^o_l45jTwi(V`qA`qc{XE&U@EJAg$>w8YErtz_p=zB-g1 zb9X~&C%vwU!Uy{ZugG{0kmu#^g*LdaDQIMHpz^W|(~=k8l@Jmr>hUegVzp}Z=LJ1r^BmJL$wc`IQ=;F`K?(X zdDjqG1K)qYKx1H^1fDa~bQW_4dO$ug-;QgEoK^yVg-4j2Va5^|k)tmQZ;Zcw!T;|l zSzyvh;K9UH5q68?;lFRs`?WqH-wU&Zm(bJLeH)8NM_r^!T=oqR@fG9ENX7|vTKQCU z=N&OEp;|u$kQTM$w>4mkQCm1_SIN#>H7}omWsQC9ov*Uy0|6!$JLKe1usTGUJI!o> z5LXsddS-2jO(hy>G_f%9{0w}91k@iu+AMy!ONIf*xV(4aJGYd)lGe3$$N^F@a$i&k zVI)T>lmDsG=%)bd2p?H?N1jH?S>`{Z%eZd##Q6*!qH!sh*pb2EEN$^#e*Ke;-|H7s z|3s+N)0tf#G6P;0sUwFLaLK$sC+1iQ)TQL$2l4w zimwSJq$ay{dD+J**6IJ|Z8+HYD^}N)eL*K&PTcY|yv%6i_KfgL3a~B8x<#NG4{t|c zwHqGBogs$bB}oLUVLBOX(T?L(_#y_VJ`Y|2)d+Driq|q zM9WOP;6Dze#>DF6Z(s5$a-k?gt&bojFET=71}1D6_wZ-+pE=hL{)}7j$$wu`_@#gu z4D#>xnMqdhJ|ZGS$&^ss5VkxYl}l=VXXB+& zHEOR2`rw;sFkPzOwhKw_5jVy68=vwzWLGynq@RG*gdL&om-~?LuTctLm`#PzG><7}w|Pq9TM%n zNw1|jxVs?mWPPYUTBw-DPy$PpSC(dzbIy<3j|O@mNY1R9E!rK}W#= z&P%rWtBy!iB?4cy;8$jGKGf25DvS^-HL4Qc;s}cfTm1;WC236Y%i&GBQOogd`j!-G zo5v|__W_^$nOSn`%TliPaSPJ%uOSr+mQF|xr^Vu66s@ET@z)v@nD|{!au42q_KX46 zUOznPgZ~zOe*;-OgvLD)+sScm{`pAu@2?F;1HPML9fX@PC3)yIdrS_|P5?DIzJkDzdd>!EwU)(|BA4T?tJef%MR zNgEO~_QI0{+VzPWT`1xfDRU723K&{+(E^U$RlCWTL@mpAyF!pmkaLI7FzP54}5lnw5yUXY7A-(C8WM#U5(x_ z9N#TRRq;^0&?A3HJ<%>SEc=O&@(myGp0di08_FgHGi$ zRFluV%gy@44hIxSA}q3tyM}--p6UKs5?)^ghHAYz41G5Py*9@H58u0@Wy7ifdAJmo zzEUoUKUx(@|1)zv-qRSOf@VB#a#SK8+tE z5#IinggB52xZ^0%Gxbox(GIL2pf*xzVS8LzYK2;GKJYDNUcOYcJ+|+Vc=9tFXP7%n zItWocpwSlj)Uk9E7$=O-m9UxNc;6+8+K+!MaOV(dB-JYB#!5!fe7w!sQ?7JjqR24W^I3>oPnw!i*7c!s$U~f_qoW%UXJ85(U0Fz z7i*6fZ2gKdciXT#4_>kRd<|7V)%|?R^Nq+(;%$S6k}23Ui_iq|P2;{#bK1Zq;r}F! z#+0Ldgm&DZKg8}IAfL-?lB+i8k=b8(vwh<5N7iBp<%^EiKR;K4zH)ADpDo0hRW}_~ zL%s1)q^kRn8kK|W#RsB$>;M%YXztxt=`uY$%dT=;rg$XH`&I?E!Mo{KLZUS+2^Ou= z`l)QD*Nj+#HaA_<5Fw`}>Gg-P&O`lfx`jHxq56P@YbmcdZ>{E3)+CHc>}YoEf(^ntMwbA-~@{cIV&4f)C|N zK8PO`_x>(AHu$Kh78DTkj1 zD$_4}zsk`ro`x%CU@!#d@`6w7_IA-e?S<)T3z-bB&X+Hm8lWAcEdP>J$o7$5lxcc{D&tQF^8vy?@x{((D6XF=DTb%tDtuZSAgT4!{Uk% zc{w>^QDI?YwVz6s(9EG*H)BsL$nbn!j196mF&c^{RjZ{La+4X?Np@-nm2>a8-nodi z0a5mJ`AoC>jdAg;*Z5nAhjzjIoy;t*=L0b>cy6c<^na}MNU*W3_b+v|6X_Byla
~Z8zaZiPZ!OZn?LdR#-79SoSdV1nh)*@E>@Vsi3G}e!sp2=nzq+2 z@GbfU!d>H(Dn#na*?cuC-c9I^5KY8u`no^&>E*CJ;!JkvOG@zmo=rEQLK;QjaG%IY_E|1DkU4iiVtqx%{e+bjU z=*0g>yw6APctD&aV+ztOSKeSRTM6W1WdpQdO;hVf^N?*^mOSljo0Ve>rTk6%$aU5T zhlB`?l4~?b-P+}0Gvb-SylBfrWumlCDoL+cSj+Ml^;F_%j7XHe{ALQ9w96SOxb_YpRaTbhPMbfX zl1|(WqVFb~eN_(2keN||1K~2Rtm~VpTa^>af|YfQ7rMyq`&{blcLR^%ipocbCwp(p}>Be(*log?-_Zwg5V|P@OzPX zBxEwd0h%74JVj)MW91Ewnd+?cXA1*|oR&>RgPR;Z;1AwVx1i$BC*O>u>U-5nZDtIgs zAbN%&n132L?1DiN z8o#+cRzl5DQ+jTskNh@4mqj97U#ZaAyv#vzVYfqD!cxdlK>qHV2Z!!y>M{Du zM{u+_%?ThPK|e!)8T2tP?I3er`D~=~ko0~3{z2>{S-cLCRD7q?{u8SACh>AO8O0kn zUk9GzonVN_ad%Cg)cPJGZ|BCP;`JZr0Tjj1KN+J5`ZiFQ@=5tGsjHev?&o6W_Noy3 z2VULWKhMYF83_rAFHfzK+csW+mmci%{%^^iKSF`668D&bi;j$je@*b@P$vzj4dRJS zPlyd{5hu&}_MR|ldKyMkRu{*uKE!1{nySOyO3y8DBevWdV;{VysC>ygZ8ZBUaywOy zQdVPo@5T15uQdhW1(YTY^SnO6AS4&K1b7pqAJwWqmrXwh1Z`c-zu&U}u}_J-~--N9ydxT2)5wg7vBHSr9Vb_S=h;12Pyu* zD~Y?x75W;JkoCa*hlw#5UY;2;;8E*W`N4rf<-A0{o|f^#sgpIs4}N@yfz{V?kNB+! z(NSLYxeuH2mC~1^?EeYZnd0Eh@wgDrsHtc;rh&OSPs$}8t#jXw7Ryq62y73*BJ;iUSJ z@jL^uF3n0r>f8_ftdL)<#3%FvaMy%KB1Wywd}c3;u-gIZ-OPRDfcNHJ<-99-|A-Gk zn@OGBS?E-N{)@EoyJQ&HS{)tlOZ)Wj?PXOoODd)B=Zr*f$%9};NX`luSX^0%8&#b? zZb47yO4{5Te{1Fk0wgpp)`l_a8kuWqq}BkLNZ@S_>&}+vQV4_xAi|_J@ayB>hB_Gj z!cHf~t@Q%UQ^WFEbSqh7Y6W#F9ok+#nri|cesXcpr!sr{JbQAi_l<9j0)CcdL*Hx8 zceXFxC6ss_d%FPe4*8lZZSg!rBoP~P z@a*$5zD~qtJWb7b|B@2M6ygyxe<2!C=?A(2wnmUM`@8JirjG`5dNeg{)TIzfN>vY7 z0q)q(wNq-rZX+fQTXW64`&9DC?@zRU3}AjSOS_<{AWx0G+s+mV7@2f2Hvphf3{B@x zw+72TXlbXz3Az(=vyPY>XPuDdvH-*-6$9BB?(P8X_Z^L!E?8=)9SYlntsPp zRZ42-^nu{oV~&UA{B-Kq0Ph;}N%=_}l9F$x;epd|PwuaWFuRL7L|OF15Gi%~x1Rin z-H_}zB!1c}@FaIP6c%!UA=EfYfY*7k(JDgVO25B9#~AhpY@)16E}WCkzG^ckvzl0} zD2Da9cq*8bFZX^oiHZ9SX3e$TJRYL+IAKebvk%v+Tx0e$z!`Cs93mzk{pmZ)i9rlv zJ`VH8+}idDMBJPW_B1i8Nvn^iE%l2?NO_-Ovf^6G@H|Gj>GeyD_T<^a&NdxBST$ z$E!~%aRU0cf+Dk33KJd^e0IyGbW(PNH2x3Y()c)t z_jaGQfZ+Snx=J5H*d3$6#_=*XZb9lcF;BGV#!!$^@R6Km; zoHqSDeD98$!`^_T5CA92a%!;^pG7}hVma~t=P-z{v+NxGLQ%Wm&c1y|A!YopB}jO* zGCGw&p<(w6ob0!_>&xG;iMpcYnSr)(DEUVJEbb}}5ru+Hagp>P4kn#G3Bl|EZ$`=H zQ(uB>dasxT`&n879d}Wm6ZAP^BYzY93kM3GGBcVu(H#2kyQ-2t-Jr*SYtw95EZ#xh zer@gMgM(J4%Q=J;r0ql-MOUm|hoCgEAc-#i=-U(g-Ul3I54gy!uG8(9?A1CE}AyE`*p|@I9YFaPku$+#leMP~Z5~ z;~dlgAOW}J& z2nmmFR{Ezqnx;`8NMbjT8FK&I73SIQ>tei0`Bb#}y`FmSr8uHnk>8Vcj&+3zn#NyYch7ZDvv{&r}5u&l`)ex_!X1qWjVY;SC`J3 zl6)MAE9Za0MzO6;Tx(FMZgox}E@*Znw?R5+>KM!5NT&GXUilfwr}#9v0*5>i z`f-I!c8qxa*S;J4tBw34BG>%&8}E>+xO9^-Ny-T1TO{o5t}4`Xi`6;=Cyd+!;# z8|eWAL6njP>26TzmX;Q!VFr+HQ9?vYkx=3xrDkZ54gqOFq&tR~nSJ=Lb>7eCUHkKV zoW1Y+ir;0##nMm9qcj}8@pIk&N$5J4z1>SnMH}+>Pg&k(k@y1C_>C%O9vu`+0BOrK z>@iD{E>(hfQyv2@`d#NA4 zIVmN^*{tuZCPIbvD|ZSC$w);K{@(d>ha7TI9+C!s3=nj}Xy^|v;44f5?>fbgM7B~} zN}-ZfaEIRsh$#7Tc3cFLu2$WU_6F=a_@{eIPLTZ@VUlv4A?!CG17N7rX?+t>4*zL= zc<7Zg6%A~PW?X!Fkf*5(rDLqO_EPxkXhg%|VOy>LLP|x^y@_S)@;bed%_!JNxw`Dt ztLJ5exLG{2{-d=}X`P~kFK`s9$$3w*bx7$r63N2C`i5xBadvs0{TW7jo4!y1r})=4 zPM&FI$_Icp-{#C8;bxGzUtyf4@yhENfXv;RPQ zN1^G%y$$^Mcqh?}1jG+a{yg}DH8ezO(FLz%SL#6OIjJsm?*=jvps#BygfH24fa=op zIe+BRv~EE;`6~)~g1HSs>yXc4Vz75Sq?N;p1vA}F^a-y4rpv0l++@RU>_966^$)i^ zG7zVlniZ~R{yvbL$X_T*cw$-La`q^>XjISg7dQtMlj*z?Z`aijmET82(S5d2TXGEn zL3?JcZyl!Uf#70W5XDtZl)#(o4-J+u5a(FhXR9R1Sce8j=6n?5Erh@@km_~p|uuDrkHU>m_-S5r&jR@?D>=^a5zY@?no8jkPX zs@Urn1+fD6$50(&%(Mi)j}p$?3rxnS&dyCJI*|36{Oezk9_g1^^sjYPzq6!XU~wfQ z4?e(3)ojs{jM_GkpQ9VBXBa*OiZ^|+yKj~_-i!f0A<-jwr{eb@K0V`F|aYEKL)<^=E1c)H>WYX0+2^s0n|#K)m?n zK?UCa8^Rx>=2j*-_D?}O_?a7EpZ%I4qg86_vFp`S{N~7P~{!*FIwda{huCGJMrZ*8wwlxMHQf`*@7Y zV~%ni_fa3@Ub^1fXX%&C@vUDhe#erGY~2-FGA>?Z^>{rki+BWl8`;wW7toyjQF?P< zt`5CaEzoLo>l<^60N(^&7+euNwb}Izjq!_f4 zxK#7CxwXwGY(4&zbel`w38-}QBFix*hj4OHQLI7=o!V-B&Qr z)CTok`IJ8XpvC7(l;*ucTO#-{%cvTB4uyZJ`0nr&9lrI5o7uLi?jJa z%Q3T>M9Rapu2=SidB#0Qw;vpHb`4=KfI0?=hrPgN$I+o=KCMMjLB7$X#J!>7l@ul%#VoKNp=y>TS{U z4OJxZ8tPr2TMN3cnQ%*1_+Jq-)e8Uka8HB73i5ckrQvb`4{Jy@R^!G+K<8EGt+9`t zi?!Ddk(0WRv>Sx$4q)H;oI%#(%p$V|s0xi|w8=wP~omeFF9uvX{}Ed@&2Dq**c)JW4^=VRkH z;o8sT+DhGt2moNBQvMM4f9)f}g#Xn?wER$z;S=Y76C>APv<{Nb_jM8xk1wFr)2}Yl zoE7 z<(hI}xSK%bXrd&!OI*OGZAf(Wu{sNapg;0q@ucFY7kD7LPui^KPx}`9+wioofV&wC z*Tyqo&>OtjCAZo-KmySUyanl*x;WhU;(ew972;1^1)hvh|Ma4)k00$$QIKC&FpZzh ze{KyR1cA+svY+w(YL*AJ;U}3LGQQLOS1b?9%)8KJkvyWSnkA=|-qE|Qnj7k|AYfa+G#?;)IFAb5H zne9Mc5%b&^ye>d4QS3dLHe1KQQGC&pZ)oN2>=A`4tOQ>}s)Z~NeM>&Lwco&ngdiIp z=sgHh=CP!l`<8Hlx~sK$MB|k#DY!P(3o?LTs#4l6GL$1Kz{oqZ8O@Sq2mt8$fqLtz?Rwrob-OZDs-Rk=YwGdFFpQk zQxk0#bLWA&_K+b}{@Rhpu)U0^EAN@JeWpeP&1d-Z;;tva_g^NP-gg@!szMaxR+%RE z6?@1VdUiKeGT01fB=guv5xcKJ8M;T1dG|`{D;#9yOiNGx$UHMi3PV#8CB6Hx0m7#uWm322W)P0?V>Q_o!ZQ8rsO2Gy#^zAKSF|7oXnwac9ZpQtqj0df909 zf?vF7EVL1!L<~OtFqLE6@ENl8Ag4eRzRX4{NlXEBL#6Q{N2)Ku|)8WlqH<2a3 z-~@vclgLv4@s~2fL>v#wJQ8D?>QwP$Isrc|VzGPoX!+zpW4EkA0A;s`1>U^2LB`7b zNyIL!H%Jtsnym*a`G@on zdip6Tw@tb!xV;Id;E;fAH;sITq(Ec{JnSpAJ2{W-0ki`vYEUH zB=WgOLOFXiJoAM7o|Ctr1bF`84&zqx%&!w1en>wqHUGRGOXf@V!0E5kK%_l@ATM>` zPwQ=bEwGv$J>SAD%wr24KDP#l5s(au`1V24*fU7miA<}shG5-vmcG$R}QlU5dGT8 zxYw0rW866S%|5jtzhRcs7QU1iH!Q?%&7zm2G5iSVE z?WLUnZ{9FkDuq#cc-l^MQ7&fa`T?@t7%o&|KG1O~d>StJTZ!#J_ z#T<&CaR9D%c;4xyMBIgu_vIP-&0s}d3Dv%OvJSX!zz#>HF*Y|%RGeK?@@L~b1c0=h zuU$;w9rAZLY*WYQf584$$Dho$J4^%x_7+F7$)U&aD@Y0`rgh)kXzl)^0jd^dGbg!1ppr zwAec4KcwLvMxu?UXajLzD;b#Sg6M|w6v*mzw)$tT+$hs(zZG+uLSw|Yr`i83bO%&+ z`pD7M!p*X26`!d7$>mSZDZjSC`0-~*gi zUjANd6MOc)kvmrdSl4?b3bGfta936q{5g(KKgOMghisQ^i)6bvz+Wf2#DN+q%Kl^9Bu5>y=Lv%#2+De{JoMGu1B%_BBDgU9_{O z^>R5_X^to+wcDgi#Y$5@NUy;xW8Vmpz-P2kQg;iw@{crSjhh!0Y~j0Sf2^Dp&tJ8A zd^k80=A0XG3ruB>U3U{j zkHifMq7YApw=a+!E{T^Ktc2Io)g+LU?Pl?yG|goR1ig^qzu6OlT?imIT~qEni>cit zhW_eF%(lBeTDE#WOXw79`Y~(v(9D9`SFKi1$~|PF!F;*AI!vxWKeWi@iQu0ChnNK7 z*p-v5qZr~_KgYX#7bdis{oLi_d`0s9sxD~f~25XO9Hc7>Z1>Q#%#xN4HbK( z);&wj$|sfAC-h#%+8O)$mt=jGW8l#S5hMt)F~TGE_iV?X>}gda=F##H%Y@vVX=MCo z1~-ImNB1VEl=_4f-DqJOdc-T9{R)X(CF6Gg`NL+V=^v0&^Ix0#amQuU1k+?Wyp<&` zO=6yE`}MuS`)@;!dl%o>Ea(;jX>rD-@=TD2Y(0) zgRkQTa}af7)2!fY85(0ac5GTfjN6QPsN)h}NN#2W1XqgnG8>ju#a1ZoImy+MNPm~I zmEEK7)ca=lUt?S*!9S`5z=S*&8XEm*(oxjlxWrd^Tc0~#%Mv{E18ea5N|q(F4dQS} zd~yh6T%|s_n}0x*(k_vrqE-(!-TdOwo>cC$(y^5h`(pZgF>koXkgr<0$vgO*TlPh6 zhi*74I#`Wq5@L*L>oHrzDo26Yd;){nv*?q3;|nwb=uFM-)}hqXR+JImP5R}`%MDIw zbWk5ro>%-V--spc75-1fQdyExS?dsBJ9B8Szv!802MY_o&9!_gc!CUrnTL_a6Ptd> zj5EIAZhT0KKd7#*(Fr0g?IFL`;(nb6h7EEU>2MwaLM){(s`=GN_c)ZlEsyoXaKJcV zS}C~U_8zQWjAhP8$`@#oKuG0z3Ik}{_!n0E_jiHeIv_KG3mcEYid%j{2zl$uMCepljnQ)3Az;- zE1y_lJk+J9rOCnmH{EYV93lkJ3-q=1;&=NatO^$~E8 zFyu3L2VeRtG-ygSka<%oZ)YH{pO)eZbX$3|4XA9$^}f$zIvu@1fa-01rnrVICyJ0- zwTWuEW7;|Q29HN1f^#!XH^{~NOYT>tz+Ijv-YoHst>j{P3nbiH%$cbOe_-upw#i_})vaxlV^O>DTgM~oP}al0o(q#>2g zcb(t;;tuQcaqWBwCzHZOiYAAIbs5qe-xu~p79=93BtYCW|Lv}z4tzgb+Wr+jLJ^E6M`he$e89kN+f0KP)5c;i#I8WE{+!)bFx%gw?`)vD zW)O8an2ViyYm)?xGNW{&xfwqt75#y z#qyCPVRYvzQrBnBD%9sYkqKL-;X8045Ac3R1)58G%@u|S%n{_LmV4!5#xqt{y=V-Y zYK2U&XO@K&O@8~4%iEiEys=B^9wPgwNW8oso0ZCPNTQ89tD{x<b?~(+HHNc*~V-uNqCVMcNc8+-g{2`na@}sc|8uP()E2m zj$8U#ERN#9I2(dKk9?C@H@w#WzySXM-k8u?UKOz3<90qk3Q&10B;pgi6PPHFCx<() z{%;gq=CCe(J|C%g{nHC#r=BPUiWTzYnIZS$jrXa1w9nz>@jdvJBdgvg1nnc= zPT?ol6yFKHPJbW0Ntfx<+K>|VtSx)+MekS){Lk!%Y#nCxJ}<|%f_=IlmF4K%&>Tr+ zHm&O=MXH!g##0~K6Q z7+=UdiJ&{}oi>=l-_3`ly{<)$!IR)S>73$)iIuZ6{P-u$@6(%b%ktJdE#7SXNBYNs zQIG|s7CiDjYfjONFd*3Kzt+WA%;)fL&zy<*d#Tb{@I%=I8;PD08VupN1l2z#LFrH? z7(fo0I!I#Ltkm!k^VMFX(Q2cCgwh28g(f-li7ho7$ude_%#cca_D>Msi{pd@%0_vW zS6E+JdSzWm(tM$jp0M&jQ4Njd434EwRs4~C;j$?Cqv(sDeO8E-LTAmlA8gxrz7JI4 z^A6+$m(xzf6A*PVaVraRUL1cb{b!cB*O6FVcuD6Q{_nj&$`d0A>1}+|Zd&#-a(tyl zCE>yIrc{HwD5X_{N1h6haxXl?&hH?qIOc1I5P~Wc{Nsrh+*N|i1*cMY|Q|hYBE6m%JD_z`E=zN(*4g@ zdyKMEa1gCL7e?A$P?MIj8%ng12&6^Qb(=kJ2J3?gTnE?oFYU*Hk4UkPx+;@%Oe_dM zi4Brf6hXlk^^m@iUQhaU>vz!2B4_>dh}3#_7p%ISIIKNf_PrZL1dx%yK258t-G>KW z0_KEbatCG%*@IZb@ZC>61H?hIinr_lXVLDGb6=UHFK>c6XN{khFSPuHA2~v>M`Qx%Q!Wk6AP4&HcYvnHc_CWG+5p?bQZBzW{d(3#TVbT?(*_!6j ze@Oy;?23Dk9M*@P%g#FTr?^!bA^Ljtr$45oMIe}esu`6yPmj1mlRgI3G$?2Y+FVYRqo9USD-A`nFjNsgP z^A-8&yz7{f&U$pt#K7?VS(Ex|q}n{g=xzO0bu}%i6UoQK_xljL%D@17wSWzoW%!d^ z;EEM}AnML|7e$P3veb2_iR>IaTEP&~8O;nl^C5Klk}uD>1eqt?vJZG8=~eESVmACT zyx`#IaPk1j-9!O?eQv)iE}JnAbW)s^3945Q%OOD}h(17Bj1ps9{CF#oNr}dLET&S1 zPWAAN=Sn)rkZy0$5@a!=diou~!Q4u}7M*fnb3s@wK zmL0Oo!%I*tP$9%Y82NQ zU&BPzrW#{c$*5&`woX(ZSDloZTJ(=oH9u7$0>2Ue5d1Q3@l^>(-TUJgkK*jPp+Fla zNhabqN_MyA)np4^$R$nFOIa}9yFIuck+;-8`zS8^lry21<$462a$xH9>*=$=55MwgMRiE|j*5A4i*Y+t4-w$L$egfgj0on$f z=RpiOFmFuppK8y;cuRa@Xcx(mj~kTa8vf{ZrN`whiulu6Yn312e-|E)zJiBTp2T-G zf!9&>!-*GTEBW~KPjkkmd=pB*WuXysoE}*m3|BWbvcfEa+sN4p?yw8%mm@QE&Kpq zB`-rQepwEw<7T6{>FYV}G2B~8OA@>D?w}EjnBa??B|qhMuH?E98_+AM2>2h&iLyIc za)%SYbhfat)s7j{CLaOTLH@dZ1b$l4k(C7oM{`kKM$>sJB4!@UP`9CKRK0<)gyJnDIj}l5EFLo8kL;q;+!VZ%pNr>4D;&dIwlsGH? z`+~#d1@(`**C1FGaR1g06;b7 z_61^C$!v>lP3RHz;oj_0KV-i zjp9r+`I(*&U%kSHDtlMQQx!hq6@9`!JQHa6ROXG8-V4YofvCCa53lLqb-W7~C}D`} zd1B1b-Ak2UB8|s~GgO46zo&VA+F^mDx6qb~YPEfUJlsLGz5JIhsBp$DGb16K;T8aW zT%w?hM4oV7FPWV*fa{S=Z__7rs5sD&I#%(v{caan;8olP(t;^5H*mV^UencnU)Z=O9}FBYa20tO0h< zRmm}DlJ7-5fdAjBrg{GlHa4|{G+ZaXdB;D#G0lV3C#)|QKPT@Q)jv|INFf{wjE`@~+uzkQa7 zslf;Zm9g8(T(zGfpe1FtvP4|z>1Z)@wH)rJI|%!Mp${{QS)#6(T8vBE{Qt3v7WpaAErAxCt_!#J=|J%@)*OadHTW-mGko|J6TFAR|wWg_?D zWb~?*CMrZHa05}RZ0Ow;7KFbNgd^dgeE}^}%1QcYD%Rn_5O^N*Z;$g;-t7SkP{#@U zE0TN%RWRuix@is(^@_Sli7T-CdDCFxm(IWGPPM7l+E?uO*uRoS{R$qRxU#_Nq4UAs z_OBq5#OJx!sxP}--#%rJXexjB=mer3XsX*E8cA`qMSIrO@OPsc>{DFljH;Ra96+XGTxf_}JHS!E8c?>`sB0=~x;KlPKty81pcfP5un8&bB3?=15oxSZtck~cI2aHM z&9Vveg(O@4G?Z$*wNb#p7ImV{Zj0US2HBX$8b7^i3cGpM?V|v<<qUhs_CCz4at<_)>5V&Ae z-4#PYL;zwu#_Z2`jxa`@L@WsFI0ehJkA!URI6Ov_qNs0d!JAG3)p_IMZ@DCuL`IE7 z)0A41{+@YNZh+F`HNw;T=^9co^?VZU%Ta>(VlkfYM zufy4~`I3=avr5POLw38ecd<8sRC3|F9`qjgjewbDEB79J**{gEn?2pfO278R5pRqs zd~uS(Lf>({8RhNl^^`{oL@pt&GUyLAS{Qqr{Y81f)z|t6!K8fu>RqpEP3(KR?jhmu zL(6XeH=md1Epox@UDq{xD1-5NxFWkSI7aruDI?^qy`+n5C@YdaK!~+;qWUwf4{Vzb z7_D`>qz_)1QDGf{=hc3@Y9}KJj3&EZ!-u;_Npkreq0lA0{K-ILr=a?GzQ3AnQY~ADziluFOgW7Donylxcdh;N3BsdSopON$;1AMDSOfOfNlfvRQqf5irvD1*8A@h z4kfI~ZZ*^wyq;O>E(+04^3r6DXx^}k-4z_glSS{$HX40ne49hLe!q18tnV8JsQpd) zD{Y>JOUduSjL5r^KwMw^9Xyjt;|HPFcj9AG)KiP7c-gYN;OK=9^fvk13gEC@a3Ave z{7l6O`D85kjBWrum;rx6`!H$vZ4xUOCQWn2_S!QLj%QonYx4(hX$6eC?04JcqIkNs z%tSi4^ghKtL20DVOO#kZIa3<-XvX~;`4`RCh&L)5@^un?V1aE*W8Vdxy-u2BR!u9q z_Z=6#@W=Hv;~Vl zcMCyoq0g({`epheZmA$8!EKIfN8Av22s}z%O8;XD*MC;)28>@%ceo#74*-$F=(F>9 z)vZ}`%p+nb(JC`{2+kRfJIgRYfmb`qR#mxSR`aZ}xw%!plM2qY%`HfB?~H|o1rI2K z2wYy8wRX@ss19qAS)FTWTOSF^&&|{ID}p?wtJ?Y}b+Aaxg}(kv05dVvGF5qBJ?~N* zdN0=uiwBFUB%F2@V4h0E<~2;`7T~hKQsO_n36pOjVERR`RaBH#iL{U>f+7C;mpwVA@*wwQGfWw!w*OdncLUF zgu^ykg#QM&>*%@=gkP@GaiRiLqMi`u((nB5tU<457LF<3j65QnSbC`<);>4E69Lyj z4_jz?@Gc*Xl@W9_A(my${+M8RQI%wECBxR5UOB(|wIdPapGdv>P>k<#rY6p(A z|GRJ*Dct%**kD4DhxA359y9y@!pX%fl$l?mw5WRhduN^(hG-`q8w6Z>-r_2)Ow&!!g~sijIU-md#P z7&2tauzAd`8tlpvT{GnZg0FWZ&}NAH_`9QC(^Yg5_2NnPJ^Z{y6+!41HidM#YS04I zx!-vtd7ZzvC|MxL5sQadJO7YWO0+QiUf?mAX=$5c#AfP8xvFJNH-6Uu`6IUPEy+w5 zdAe>vtzVYxKy4FD&N_HwTDyL?&r`XD;-6dt|+UQ!9H zm<>>cRcwCcTp9=po)e+|IsAPL?jDKQ;r#gWtdI;HB0fI5bfm|L_+8zO>!?M?Et;6% z7SK&xr-YG4rq=hODt`hLaVL>AY1jC}lsG)sXc2)|f#^TErqi3hmMU(yVFyRSj~=gg zO;&H$^6v2NB26MO%ej;U1p$vp>qco0(+4QXUL~LIk771GaEK*r8?pK45VvsU#P?qp zd?e$jFbH3c45he8Lj^+#2ZSNK-H?W`>5#uOoUrykce=IPnDY0LCKVksUhAymXi<*jI@ zB?d2lvwFP!N7Xnvm>O^n>P+S~QrS1luk;1XseEPM4B#I{SoxK?kazoW^XEZ-Op25Z z*n9U0ces(@uL2SM)&G-MC6xjYz|ozR6jl#Pd%V?Qzld_DZp`N>d>3!|F!yoKgD*<+ z?$77czBmjbQt!9@Q6HB5c*ggnaP94{yZdnl-JcyE_-$A4x*)ZIi}bvG zjV7Z#6Ox3h-1B!rAL=Oro1=X#R?Wofm7=P%@r?j#61xDSTMQ&D%k3B9RFtqr=(#x% zx$ckxV{347yh!h16RlH6Yx`@@vGzr_agzZ81k80;fj{5;=c!*~|MP3y6Pmt$+UR0uK)DhKf9(}1o4?ty@HH&pjy7TSe5;b{MVm@Jx*J-HT=R4jBmjx=pk1* z%W`cw;Ov=EZtp>eh@Yk2NKPvg?QkUd8}3$`{7_1syXwL-iXg5eDbg2qDp!LN*FijN zsI~l%;&upP1ry-B4*H~|imOU>Ho;o23@-U`#Oker=7PXS>2ZrYvm!a9Q@f_9l{S;IPL6~T)}orgJuvtPT|55rk%HZ`&K<7f9fvI)U$XQxCl_q+f(bM zPu{f??KsbfjCb?giR1>J9DOr=cM+|~@jOg(tk6W`MbINM3+jx11Fs_|XLMwYs+tQ& zl?E_d@Hda5%QB4=fwfK@(lgVPaSfwEE2Y&Elq(|opTm|T~k~3Ebf|{TH&8R+-2Cc3||8lCiDnqd@B-&{**ZZb+(o98dt2|9TA>C!8oO zrcyZXA!Tub5RO9|_jBHNyd;Q%*t0%7l~26F9RLhb{5R?%S^wQYrr5f}l^w%2z?XP0 z>_Ped90^L?Iv(xYX5BaG*~@Tq!aL!)eeIN-E1-xy7NJEP=nBfs@XTy4Gmp%|QBZc9 z{+qyem+#!YuadKN%|K0QYK;znF*eK#9@L|F)wB4fdY8r&en5@Cr}j&R04xC8ZVMMs zJkl@U+qhj4N`M&&FAza&khSc!k)_@Jy_;N9G@{q3_!j15(Mlk|ptXJxHz7@~^UTp8 zJ^NCcTKpU2zYd2(bDL)CoECsToy)a z`VLZiaxTlP=);hsSNLInP5ohGKcX2D5`S{uuar$YCncGVo-*&U7$<?{v!3d|B(v+NMOa_h?vTS)s}792$RA%)<3&A8tt_clzGiaj zM<~O3Dl_S*-fGwxcT;w3!iioJixkL+o3?d4hpGG~Dd!3fiGgAX7 zaXmiGFaA5Pt%!?0vW%z5f4pb8CAg|G^ZLiD#h=mvP0u@m@{VWzvab*o{J$UKPkf35 zc5LuD8S=-{nLYi06T?}*Vnt5p)-3Dl@+vB56OyK#e0oONO)NNOOdK*Gr5mB$dLRXG z4Bb>Le3+wuW->L+O@1Ha1cI--ZOn#6-0dF!LqA*{AKLHl3^}5eQu34-i3n%s#20+= z0e#7**&qJPkqFLbPY>rR$e|T$IX!Zl27Vc5|6{V;_rP9uVex9q@Tlwz1CN}RI_EHB zbo~rh%i;TNe9V_1^Q#bc5AP1GKwEb8jmV1LT;up0H6)L?#z0WG5Q<8Ctgo#({!SSy zP`O@3MBOT34?Q0IyzoO0L=ed8%J*U~-Bwwd$c2reSk_;0ST;&(YMT3R!r(7%x3H$) z-0YLM?wo&$B_N`nktSE9^o8j0J!crOfQNUXie$f3e6WOesd?=zL_>pRjS1Sf zEL$e;sxBe5;kV9UIsy5|Uq8sz36IjSMCk(b>%N&ZYMR_k@~x11D1&VLT=&%PI$2co z`sa@$Q|Y@gw9Ht+(JLJB%aPpD_cu$c_=Mq~WWI#Psp8RmXm5& zro+`o9|VIVX=i@u%Bg_3BP;>oG0Cv0YQk<{xyMN8kAN~q`Nj5ofq`uh;yT+CBZ28( zb;z@nJG+100dPhofRkFV+O%RDK8`;#xxQ<^{hGcc>qK$Io}c)Y!rN;Pv+?3^o-Mae zyDJWel1QrzF_=sP9B24jN1W#X2=aUj`F(0l@%<+ehUhE2;H+900u(9tHC;uH{1OGt zot!w{Reytz*^I<~_{G(S&awIgJN>x!0e#RjGGJ?d{`(cr6+A%9xf=0bYs)O+>slIy zJ(dmM&~ge=8O;^?Y8h-L+ zrsUWqhS#QXDxRZoP-0SZpKok`z+rN8BIotgQ-DJRFy;Ppuy1|Db+yMYLPJ~t7L(RE zu{+ugS*C{|?%a2aGR`sa?=CF=I|y-k#?=3Z@V4?WG?RGJ)GxPCj=J5g{Ovb5Ak6i6 z5ean-V4;gE;n)vNL!T2R)HwWCa;J6ph_?SL)D|2INmi3u5@p8+D zhjBjyMB3iB3$C#~Gk>W2<#j8e5^;f8`Le1thvvW&_LTAt)_Sc1MQ|8+o48^3eExI8 z$BcBPh$VcD@vi5l@1@`e?v=$s0)EUhG(J<4gb@P?&KL5`LL-plea3=>5z@jOruw5z`SN7j0XF&)zS7&-s$)4=< z#drAe%)f*JT_Hdl9)E+IV?)l{d*$JQ>&RiR*9}dwM9w6DtL;K{;I(_db&c_{HCxOa z;PJLy0a?akH>+VP=P!msRKWh+zsU{w23{=v5&7%g9$Vd8Gf90v+r#00|NDmPz7`P% zS^W6=>SD$3OawEkJR(z1=i`Y#E#lA}AxZZVwcF3JG&N9KKG$vd^(ZH6)?~RI=5^H^ zN5tD?S4hlYe`)oEmH}9Hpr&{M7jEoz5plNW14DX!?q=eDZ6C_Wllr<^yy?URPs|iL z@a?hVzcfF%!RH!>qffvR%-e+=J&6dx9Qd#{$ z++K5J)@-E-5Ka9Sou?du7woGxhs!e}_eSKRUe`XX$F;emepJ7n#6_6NP8J?=G8oWb z@3oNxR3rluiSq5hQI*S-g%4Jv8JO?-Ka8DaR1|-}?`P@m?i5j45Rh(^ZiGMGAlwC|cH!QNwa`>}HNb zX!tn8(^shnpe5L%ge7e0WI69XiUc@B?*4vP9$EgmgB7D)7gnEsCoeC%cu+8>TpRLa zc+jIf%@)6D@AG!$eL)6LBjXsO_^(JfutGyK#^%w7sOQk@r!Z62xzHdz{i4(Uc5RZ7 zn+EzT#oblFUQmBrKviPZ*)x}5a`cV9-xP>EZaB=MC2fvpE!rfv#9ssAg!T#CCli|p zIIp5b(7B`L81nS^B%S(}%=!H1cGXFk(o6;Jv8=)D8*INL85p z5XBV)4-6isC|IJJO@3iledDOrjxv%&c2f{Y6S_-n<++Wg^5QYq@>-d6qT`fjOw_Zw zLCo$S+?j9H7;GX1?@v2jaY+Yn-=gqmNiEePucjJ=iuPD-kn7(JCHC9(q|}-HKL^K? zx;Hxb-}QB8h5oYGKD)F%QWz(SK$g^q;QfB>Bd%g#^lTAp{OGjiaw1c6-!(26jOGsg z{7{XTMdK1&T|r?D#U5P5?#e&u*&oXS&C*ZqcsuBjR*CnCiexUbJ&q^4^dwE{k-Zp) zA7j+16Gafy$9oS2)h24fIc;S9vzTx0+1_N;r>yKYR^ku%WUa{D7avhJ~N*vU?>=tz^MzkX@T>Lcklu0DY_7Yj;ZooMmV zc7g9xJ-50bzU9-(R5vBAD&Un=9;7O%vYb5Z;ScO-tGMnBN~>&@>&fvEKJfzu)Zpj4 zR(8$?)r;JGCC57lE6%_}HBnVd%2yYEr&b|2y1RL| zS}*D^80&@Iv{YX&%Om%4S%%I?a!OWr07V^?i&1zs+ajqwZvd;7{oG0LcYs$vTFBaQ zI_j8#5ut!QhEW*edDF&JlK-f@RHSaDKdr}Q@;T9|&sAZ>~Yb5J0dgp1?JHTBK# z%%20Bj$1;5(h44~*YW+15ONQoUFWPTRSVr?32W)iL$;-q%5oI7sc>9B>U{q#Ol`sZ zH&Y;;%iSe&^;Y@0@7l8F0gnmdMoHs|snYf8-_e6(YPK_(izO;i7_r!JU%7)O9 z!<8Q;yK==|{1}M-(vd`R|uZQc& zR5Bu1iVNrZlhYioFflN!^%O6hNrG8j<);huz)jD+@u~6m%J7vUr0Bs^``eA9x~Q=A ze}CsjpF_X09S#}%9s z=EabK*Mh8}p(W_kf7X_A-FXkuybJi}>_4A;gC(VE{aEFjt03)!70)i&vFl4D691FY zDP;OrsQSPN^0M$P)~{%eZ?}%2lgy4yM-L<(Hoq&=m3na6O@a5fU`n9CAGxo_Q8v#F zMNFls3AZfVrV56lSVI#&8?_H|M~Jnj?2=;|q`-vm?qizaJdJ;a zI4gdTwXe?^m!sNyQD+W2P{{C1!Sa0wJ2B;OL2}Koo!CZn_8kRO6RYODsi?sMo&QN4 z{zB)@#jp;#vv$k*l7oFuS`t#@Llil>c|v8{a!RV*wzsZ7fm+2rN3n0Shvzbh{jiaUI-kG2aM6kdPXR0zyf0~y~vxJCC6-ZJfSDm zJW7Ko6(=dkIew<$+=+Ec=rN-6eZ3h!S$?jMZ7=4XRoJ-%6nwuoS9i~00^}# z+a0kQ5lC9Ni{rSTho!}_=_LlQG^5^Nw0FdQ?dr?AM4Wq%?9&)QFKa!XrCMgz`#}JL z|FLZY#ICH*ZBDRM_6(Ok06G~Yb=i#QK_$qcefk20?|%`h4<~;1jV2NY(tcnLk%c6c zRhDaa-OVh+`5NEVt#0BDaQCm${4BA+3un<_I84IEV!vq}wSOY$J<)dDv=IQd zE;!+r``~%Fl}WoqV3T{*m{njSeqF2)PI#566?LFr#|6Xw4pcXW4~1?Yx_q{3eXlmZ z-4x|oO5Rj^xJ6D7PU)-2|3iKn3N_mdZDss0uDI6w%*gkh(&wfp4OC#)hH_K`Lw1@^ zWh7dr@7m4jhLl?d6eV1r3+eD@G$-8HJAt3UdKJT6WX!|gF6&pFR*tgv2P&Zi{p8xs zD$@N)T(VX`5}qJ(I0YJhIt@+lB8UGkvK85Hr2cH3VX0ViA~pWzURNK9BNb1L0b z;95O$v(ft~OL#qkR060H7-eXf~RP5WHcfTvaL3ta73{g0e)m)*Sn3%yA}#jaQXH_txg*I2p`4dX&KoT zAwnOrP3b;XvHu{qp@@`yNRv^3M#7^gD~I!hUn=TLC__qjf8Z_r@&|pSmL4-^@tL5% z#L(rG{eJA4P&mo-gAproNy4q$Py3$qdvFd=0M@)JOc#D%Xecp>?|e>8|_Vw z%)c}GUo%m`1GW=CV$&n?>^l6ABx4?cg`kBs-roI@F9@1r5say1&b@a5Z+x_emvkyI z;I&8u6TYGG_hAr&9L~mGFCMrA!Br+j3P1#~UHPGn_ikv<#JiXYj|EH72KJ;Qv}Fql z$A6S#AiUB=h9Q^#e_yf~=r_oi$STuw+Z)INltTd_8OC4*^xmuzH66WnFzS0TB#siN8jq`hsG%kMk2*>3-lgBeZJPs8`gMFpn~S7nj{GsEK$||rfu-ddbnNAjcdx9VYUOY9>?~GeP2vzx?-Ag z%~^G^j|5;+`xp5yhjsYrC5KjxS2aph5Z5GDZ4bZ}S(0WF>((zis=(8kj@P0Y(0fD6 z7DRRe149=4*Q7GXHNZ&NvzmvKAC~7dw@J6U%nCLOuumwY8BC|TpJ~}Hg9A}Ri#Mr`|K7ZblW%q3? z5(vCJKzt~Y`EknMCWFi*Zp*nY>d_nW@uFuS64s}6c`Qk(E}^Q=obc^G)11uKll@mD zYeX^Q6kmnCL9`g|x{gHxItca&kJ{CsThA#G77a2>UljY|TszX|KNsw+An$jj*G`d7uj0tnhm z%)gy=M%_KpdrHyyvfBRpToj4hfIEl|Hs}&436x&=$sEYF<5Oqrh zEBo6(`7t!HY!6YybgF<625^E2!hsrC+ajtYK&9x%9ulfx{E4}I{vOu< zp@;O#dEjq(KSkUpRPL2!15of}7zhBA_UEmYaSACaK{U{JILBlmN(NRy%=?~u+w~Xe zcE1Th0xCb!O-tl{e76DNbo4;5obrkRa}BZj?>UU$mjw(G8*g6iC6H^0dd?Vs)coGo zt|$e?#NogpdRocD*%5X55(prB_MH-hjBr2yMkg3JpAKe26sfVkga<#$+pFWqJ2skrG674&GZ1Sh=r=%8Nz^R zht?eASeI5G`P+&i-4lE2H@8_09!MMXIM(p2Yb=PoW)3`so=jb8q6l1a^T{BOe-AJ| z#kKe@BkI{LgeQTO66%8}ao~&iB0T%5+@Y2chMgL5y8IQt$i&0FRptEj>7IDGX5?bn zi??JBXSW$D5y5IZ2Qg9snF*Cs2v7Fz?hA?l*#t5>+-(VE{(!x{x0KJH_Ke^QL_5nn zHzf$@U39TA53)8szzOfXn+I~x!Ga)oJ@}ji5cT94GJ>KWQup|3`Nf&(??#@NykM!p zGwz@otM7ZAE<@I3eM^2fap)G28W1v4 zx*d`hv1Rx}v~xRN3L+y~Bm6g?G*viQ^l7=(F(NQM*boj8JdR{L)kO;-19JciZ#ZiYsArZ4~Kf5>VNdW%`X^$vdl3qZu-AwJG_0tm8mvqa)+q>4~xdn`3Y(G%$d~GH* zU&4;TY4jwCeoK)h`D85=xeES4ZX7ml-4CgP0q9g_oIrx(426>!EOpyB>dRDeer9iQ z_1@^mwI%;x7f)OIZ}eIoubk6-_GcqMc()RcjVgeU{(U&C7=LiRFqlrlAeO|RXs@z% z>;dk_6*r+i*2sUR*p z?RpSiygYNZB!5#U<}ASwnc*1Fc5~8B^^HZ6%PN}v)5UlGouV?T=qG;Xb%UMZSK)Gb zp{@$k8KR=hasYM#bCW(ou9C4+@QV!+adJ!4A&=8G_}>R=1#n|#f8yrng&T)BMm%~b z`+@rFaKxe5hu7Sy0{^MM?%x};$)1X?omx8)t66!pBU#sj<=+Tv7`DZ!soM6Qf`ViN zY5kIS?^C*(>4ZoqM%d%5AbsVLEeY=3V(8#?;PX?>`IH`ls1m{OE&^(zWPxXd5*k7| zVrdMDMS#-QZ|4s)b)`lZIpZLPiJhTt@$aqU`v}85Wf@(Dj@y&LIuSr86B8cypZYNs z4-1W|^+phQ3RT*fs0E|UOa84+RTrH{a^@EE)=L(!zA^H7C2bMJrMEuz%H}bd$b+Jz zp!aAJW#?td8%YX^j(dyk1aS}}9Lxc>LX3w~+6nKdYAXnS4-qj)ScM~2M(b?4!1{w? zM_lVLI=z_)MWQz!>UqLwQ~kf#l^WaJ%f0qoRgYTy2s{6BQfMpT_`NnDF%yd|E6DMP zK|)bPq^WqWre=kdU|BZ=I^Rzi@Ufk~5X{pzyO72$yp-$);YWU$y<$B3t4$kZE-98k+qP!;-eo^4YtevjVWARG}wXk^$y4ewGAZ#IGm)~gL-|_I z5TXuV6ivbM*X49$yiq<|5L$Q(wH22dF&ofU8T z&Y@@Z3-w*##SN*v*&n+zswA!@E4H~!>*#~&wbi|-YC8yUx-*LVx0a^*sN#)zQDlxnX*# z6iH_v^hmg9*#wxwt&dkvNFcNpX?0th=QN0(q-C|8ai^MO(AA?0>1_Z-1q7njLiAXt z$5;zyrAakrj0`M&BtuEm?p#ZRgbpbLOHqO)doWYJS*a^zHpgm>xanafslWs{Sd0(V zs620FFyIUigZdE2sh%sR@7xvnML|fhpxp*mw$SRdHpzd=UR5WUh?ffIoA}UT4v+7Q z?TZ5%*9#75bj8?9=Kf_>$JgxF^i~i%>Wjz*TU+ig!p>>b*YxZ?&Zn}szNz|+_y{Gd zM>(u3@oae*i4s8U!f)F9-jQ_w@*EneTI*c~?(pHgci6a57>-l#&ir6?y90FpD;rrL zDZek&Xx0U8yU`~aGaHAcjI-|Gu(n~_&CY~%*kxzvYn1Ztzy`( zpVmjFe2ci|%dhqeEQNokUA)E>n!`yu2H&z27JPZ}!gvR!Ni-%VKdT~>xY0c*AFY1w z93R#COH#?19*v!G%R)UK*ryKtmBD$!@?rnW%_-JpGkp06vCu1F^_Xp3L%OZ9=T`W* ziIHG{f9F|o0>ibyknmsOM~$q>p*CS_lDhW`F0|{u9T4tKOKC6ApOKSkEsBBGKmjn< z-jYtx;6diwmGfe7V#j>uCX0nH2BC?|98q2$YWWdr7gX5Kx;sNKW?m9Lx1&rYn1fh~ zpEbMciD#t#38*EKr$tfuRn)VF30-s-9n6yQCZOm@(&W_JdCZNj|V^q zHHrZqY&CofZATzx^a;^p@+R(ue%vO$5`2?|fG%-u&N3^n@1MX+clzwWZ+Z&Ii^Apt zEn9(qVDl$p_C_mb$_o{FW;CBtgtZ4b}?x-fK$0B~+l2C&rCU$U0qTRdTzB3`7u2 zJ9X(QK!2duU}kbe91BSRo4Dw7&JlBkN@t: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 literal 0 HcmV?d00001 diff --git a/tests/test_cli/test_maintenance.py b/tests/test_cli/test_maintenance.py index 70fd6ed3..ac5e7b67 100644 --- a/tests/test_cli/test_maintenance.py +++ b/tests/test_cli/test_maintenance.py @@ -1,5 +1,8 @@ +from unittest import mock + from bson import ObjectId +from pillar.api.utils import random_etag, utcnow from pillar.tests import AbstractPillarTest from pillar.tests import common_test_data as ctd @@ -250,3 +253,149 @@ class UpgradeAttachmentUsageTest(AbstractPillarTest): }, node['properties']['attachments'], 'The link should have been removed from the attachment') + + +class ReconcileNodeDurationTest(AbstractPillarTest): + def setUp(self, **kwargs): + super().setUp(**kwargs) + self.pid, _ = self.ensure_project_exists() + self.fake_now = utcnow() + + # Already correct. Should not be touched. + self.node_id0 = self._create_video_node(file_duration=123, node_duration=123) + # Out of sync, should be updated + self.node_id1 = self._create_video_node(file_duration=3661, node_duration=15) + self.node_id2 = self._create_video_node(file_duration=432, node_duration=5) + self.node_id3 = self._create_video_node(file_duration=222) + # No file duration. Should not be touched + self.node_id4 = self._create_video_node() + # No file. Should not be touched + self.node_id5 = self._create_video_node(include_file=False) + # Wrong node type. Should not be touched + self.image_node_id = self._create_image_node() + + def id_to_original_dict(*nids): + with self.app.app_context(): + nodes_coll = self.app.db('nodes') + return dict(((nid, nodes_coll.find_one({'_id': nid})) for nid in nids)) + + self.orig_nodes = id_to_original_dict( + self.node_id0, + self.node_id1, + self.node_id2, + self.node_id3, + self.node_id4, + self.node_id5, + self.image_node_id, + ) + + def test_reconcile_all(self): + from pillar.cli.maintenance import reconcile_node_video_duration + + with self.app.app_context(): + with mock.patch('pillar.api.utils.utcnow') as mock_utcnow: + mock_utcnow.return_value = self.fake_now + + reconcile_node_video_duration(all_nodes=True, go=False) # Dry run + self.assertAllUnchanged() + + reconcile_node_video_duration(all_nodes=True, go=True) + self.assertUnChanged( + self.node_id0, + self.node_id4, + self.image_node_id, + ) + self.assertUpdated(self.node_id1, duration_seconds=3661) + self.assertUpdated(self.node_id2, duration_seconds=432) + self.assertUpdated(self.node_id3, duration_seconds=222) + + def test_reconcile_some(self): + from pillar.cli.maintenance import reconcile_node_video_duration + + with self.app.app_context(): + with mock.patch('pillar.api.utils.utcnow') as mock_utcnow: + mock_utcnow.return_value = self.fake_now + + to_reconcile = [str(self.node_id0), str(self.node_id1), str(self.node_id2), str(self.node_id5)] + reconcile_node_video_duration(nodes_to_update=to_reconcile, go=False) # Dry run + self.assertAllUnchanged() + + reconcile_node_video_duration(nodes_to_update=to_reconcile, go=True) + self.assertUnChanged( + self.node_id0, + self.node_id3, + self.node_id4, + self.image_node_id, + ) + self.assertUpdated(self.node_id1, duration_seconds=3661) + self.assertUpdated(self.node_id2, duration_seconds=432) + + def assertUpdated(self, nid, duration_seconds): + nodes_coll = self.app.db('nodes') + new_node = nodes_coll.find_one({'_id': nid}) + orig_node = self.orig_nodes[nid] + self.assertNotEqual(orig_node['_etag'], new_node['_etag']) + self.assertEquals(self.fake_now, new_node['_updated']) + self.assertEquals(duration_seconds, new_node['properties']['duration_seconds']) + + def assertAllUnchanged(self): + self.assertUnChanged(*self.orig_nodes.keys()) + + def assertUnChanged(self, *node_ids): + nodes_coll = self.app.db('nodes') + for nid in node_ids: + new_node = nodes_coll.find_one({'_id': nid}) + orig_node = self.orig_nodes[nid] + self.assertEquals(orig_node, new_node) + + def _create_video_node(self, file_duration=None, node_duration=None, include_file=True): + file_id, _ = self.ensure_file_exists(file_overrides={ + '_id': ObjectId(), + 'content_type': 'video/mp4', + 'variations': [ + {'format': 'mp4', + 'duration': file_duration + }, + ], + }) + + node = { + 'name': 'Just a node name', + 'project': self.pid, + 'description': '', + 'node_type': 'asset', + '_etag': random_etag(), + } + props = {'status': 'published', + 'content_type': 'video', + 'order': 0} + if node_duration is not None: + props['duration_seconds'] = node_duration + if include_file: + props['file'] = file_id + return self.create_node({ + 'properties': props, + **node}) + + def _create_image_node(self): + file_id, _ = self.ensure_file_exists(file_overrides={ + '_id': ObjectId(), + 'variations': [ + {'format': 'jpeg'}, + ], + }) + + node = { + 'name': 'Just a node name', + 'project': self.pid, + 'description': '', + 'node_type': 'asset', + '_etag': random_etag(), + } + props = {'status': 'published', + 'file': file_id, + 'content_type': 'image', + 'order': 0} + return self.create_node({ + 'properties': props, + **node}) diff --git a/tests/test_web/test_jstree.py b/tests/test_web/test_jstree.py index c0ebb35a..6925bfa7 100644 --- a/tests/test_web/test_jstree.py +++ b/tests/test_web/test_jstree.py @@ -44,6 +44,38 @@ class JSTreeTest(AbstractPillarTest): 'custom_view': False, }) + def test_jstree_parse_video_node(self): + from pillar.web.utils.jstree import jstree_parse_node + + node_doc = {'_id': ObjectId('55f338f92beb3300c4ff99fe'), + '_created': parse('2015-09-11T22:26:33.000+0200'), + '_updated': parse('2015-10-30T22:44:27.000+0100'), + '_etag': '5248485b4ea7e55e858ff84b1bd4aae88917a37c', + 'picture': ObjectId('55f338f92beb3300c4ff99de'), + 'description': 'Play the full movie and see how it was cobbled together.', + 'parent': ObjectId('55f338f92beb3300c4ff99f9'), + 'project': self.project_id, + 'node_type': 'asset', + 'user': ObjectId('552b066b41acdf5dec4436f2'), + 'properties': {'status': 'published', + 'file': ObjectId('55f338f92beb3300c4ff99c2'), + 'content_type': 'video', + }, + 'name': 'Live Edit'} + + with self.app.test_request_context(): + parsed = jstree_parse_node(Node(node_doc)) + + self.assertEqual(parsed, { + 'id': 'n_55f338f92beb3300c4ff99fe', + 'a_attr': {'href': f"/p/{self.project['url']}/55f338f92beb3300c4ff99fe"}, + 'li_attr': {'data-node-type': 'asset'}, + 'text': Markup('Live <strong>Edit</strong>'), + 'type': 'video', + 'children': False, + 'custom_view': False, + }) + def test_jstree_parse_blog_node(self): from pillar.web.utils.jstree import jstree_parse_node