From b38bcd51653dd2e9cb65ecf40ecfd439eb662d69 Mon Sep 17 00:00:00 2001
From: WangJiaLu <1252394418@qq.com>
Date: Thu, 4 Jul 2024 10:10:31 +0800
Subject: [PATCH] Fix bug 571
---
.gitignore | 12 ++-
Dockerfile | 9 ++-
Jenkinsfile | 4 +-
README.md | 30 ++++++-
app/Article.py | 34 ++++----
app/Login.py | 1 -
app/UseSqlite.py | 87 ---------------------
app/account_service.py | 1 +
app/admin_service.py | 46 ++++++-----
app/db/README.txt | 1 +
app/difficulty.py | 11 ++-
app/main.py | 11 ++-
app/model/__init__.py | 2 +-
app/model/article.py | 16 +++-
app/static/config.yml | 3 +-
app/static/css/highlighted.css | 5 ++
app/static/js/checkboxes.js | 5 ++
app/static/js/fillword.js | 22 +++++-
app/static/js/highlight.js | 79 ++++++++-----------
app/static/js/read.js | 4 +-
app/static/js/word_operation.js | 33 ++++----
app/static/wordfreqapp.db | Bin 0 -> 409600 bytes
app/templates/login.html | 9 ++-
app/templates/mainpage_get.html | 22 +++++-
app/templates/mainpage_post.html | 2 +-
app/templates/reset.html | 4 +
app/templates/signup.html | 6 +-
app/templates/userpage_get.html | 112 +++++++++++++++++++++++++--
app/templates/userpage_post.html | 83 ++++++++++----------
app/test/conftest.py | 28 ++++++-
app/test/helper.py | 33 ++++++++
app/test/test_add_word.py | 75 ++++--------------
app/test/test_bug528_tangjiao.py | 95 +++++++++++++++++++++++
app/test/test_bug544_tangxinyuan.py | 55 +++++++++++++
app/test/test_bug545_HuangHuiLing.py | 44 +++++++++++
app/test/test_bug546_lixiaofeng.py | 39 ++++++++++
app/test/test_bug551_DingZeYu.py | 37 +++++++++
app/test/test_bug553_LinShan.py | 58 ++++++++++++++
app/test/test_bug561_LiangZiyue.py | 27 +++++++
app/test/test_stress.py | 43 ++++++++++
app/user_service.py | 13 +++-
app/wordfreqCMD.py | 6 +-
build.sh | 7 +-
43 files changed, 873 insertions(+), 341 deletions(-)
delete mode 100644 app/UseSqlite.py
create mode 100644 app/db/README.txt
create mode 100644 app/static/css/highlighted.css
create mode 100644 app/static/js/checkboxes.js
create mode 100644 app/static/wordfreqapp.db
create mode 100644 app/test/helper.py
create mode 100644 app/test/test_bug528_tangjiao.py
create mode 100644 app/test/test_bug544_tangxinyuan.py
create mode 100644 app/test/test_bug545_HuangHuiLing.py
create mode 100644 app/test/test_bug546_lixiaofeng.py
create mode 100644 app/test/test_bug551_DingZeYu.py
create mode 100644 app/test/test_bug553_LinShan.py
create mode 100644 app/test/test_bug561_LiangZiyue.py
create mode 100755 app/test/test_stress.py
diff --git a/.gitignore b/.gitignore
index 3d901ba..33f789d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,12 +2,20 @@
venv/
app/__init__.py
app/__pycache__/
+.DS_Store
+app/.DS_Store
app/sqlite_commands.py
app/static/usr/*.jpg
app/static/img/
app/static/frequency/frequency_*.pickle
app/static/frequency/frequency.p
-app/static/wordfreqapp.db
+app/wordfreqapp.db
+app/db/wordfreqapp.db
app/static/donate-the-author.jpg
app/static/donate-the-author-hidden.jpg
-app/model/__pycache__/
\ No newline at end of file
+app/model/__pycache__/
+app/test/__pycache__/
+app/test/.pytest_cache/
+app/test/pytest_report.html
+app/test/assets
+app/log.txt
diff --git a/Dockerfile b/Dockerfile
index 284195a..55e5946 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,5 @@
-FROM tiangolo/uwsgi-nginx-flask:python3.6
-COPY requirements.txt /app
-RUN pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
-COPY ./app /app
+FROM tiangolo/uwsgi-nginx-flask:python3.8-alpine
+COPY requirements.txt /tmp
+COPY ./app/ /app/
+RUN pip3 install -U pip -i https://mirrors.aliyun.com/pypi/simple/
+RUN pip3 install -r /tmp/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
diff --git a/Jenkinsfile b/Jenkinsfile
index 2633859..c3772cc 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -10,8 +10,8 @@ pipeline {
stages {
stage('MakeDatabasefile') {
steps {
- sh 'touch ./app/static/wordfreqapp.db && rm -f ./app/static/wordfreqapp.db'
- sh 'cat ./app/static/wordfreqapp.sql | sqlite3 ./app/static/wordfreqapp.db'
+ sh 'touch ./app/wordfreqapp.db && rm -f ./app/wordfreqapp.db'
+ sh 'cat ./app/static/wordfreqapp.sql | sqlite3 ./app/wordfreqapp.db'
}
}
stage('BuildIt') {
diff --git a/README.md b/README.md
index 14cc9aa..15fc966 100644
--- a/README.md
+++ b/README.md
@@ -61,15 +61,15 @@ My steps for deploying English on a Ubuntu server.
All articles are stored in the `article` table in a SQLite file called
-`app/static/wordfreqapp.db`.
+`app/db/wordfreqapp.db`.
### Adding new articles
-To add articles, open and edit `app/static/wordfreqapp.db` using DB Browser for SQLite (https://sqlitebrowser.org).
+To add articles, open and edit `app/db/wordfreqapp.db` using DB Browser for SQLite (https://sqlitebrowser.org).
### Extending an account's expiry date
-By default, an account's expiry is 30 days after first sign-up. To extend account's expiry date, open and edit `user` table in `app/static/wordfreqapp.db`. Simply update field `expiry_date`.
+By default, an account's expiry is 30 days after first sign-up. To extend account's expiry date, open and edit `user` table in `app/db/wordfreqapp.db`. Simply update field `expiry_date`.
### Exporting the database
@@ -95,7 +95,7 @@ sqlite3 wordfreqapp.db`. Delete wordfreqapp.db first if it exists.
### Uploading wordfreqapp.db to the server
-`pscp wordfreqapp.db lanhui@118.*.*.118:/home/lanhui/englishpal2/EnglishPal/app/static`
+`pscp wordfreqapp.db lanhui@118.*.*.118:/home/lanhui/englishpal2/EnglishPal/app/db/`
@@ -129,6 +129,28 @@ We welcome feedback on EnglishPal. Feedback examples:
EnglishPal's bugs and improvement suggestions are recorded in [Bugzilla](http://118.25.96.118/bugzilla/buglist.cgi?bug_status=__all__&list_id=1302&order=Importance&product=EnglishPal&query_format=specific). Send (lanhui at zjnu.edu.cn) an email message for opening a Bugzilla account or reporting a bug.
+## End-to-end testing
+
+We use the Selenium test framework to test our app.
+
+In order to run the test, first we need to download a webdriver executable.
+
+Microsoft Edge's webdriver can be downloaded from [microsoft-edge-tools-webdriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/). Make sure the version we download matches the version of the web browser installed on our laptop.
+
+After extracting the downloaded zip file (e.g., edgedriver_win64.zip), rename msedgedriver.exe to MicrosoftWebDriver.exe.
+
+Add MicrosoftWebDriver.exe's path to system's PATH variable.
+
+Install the following dependencies too:
+
+- pip install -U selenium==3.141.0
+- pip install -U urllib3==1.26.2
+
+Run English Pal first, then run the test using pytest as follows: pytest --html=pytest_report.html test_add_word.py
+
+The above command will generate a HTML report file pytest_report.html after finishing executing test_add_word.py. Note: you need to install pytest-html package first: pip install pytest-html.
+
+You may also want to use [webdriver-manager](https://pypi.org/project/webdriver-manager/) from PyPI, so that you can avoid tediously installing a web driver executable manually. However, my experience shows that webdriver-manager is too slow. For example, it took me 16 minutes to run 9 tests, while with the pre-installed web driver executable, it took less than 2 minutes.
## TODO
diff --git a/app/Article.py b/app/Article.py
index df9ac3a..566ceb6 100644
--- a/app/Article.py
+++ b/app/Article.py
@@ -1,6 +1,5 @@
from WordFreq import WordFreq
from wordfreqCMD import youdao_link, sort_in_descending_order
-from UseSqlite import InsertQuery, RecordQuery
import pickle_idea, pickle_idea2
import os
import random, glob
@@ -8,18 +7,15 @@ import hashlib
from datetime import datetime
from flask import Flask, request, redirect, render_template, url_for, session, abort, flash, get_flashed_messages
from difficulty import get_difficulty_level_for_user, text_difficulty_level, user_difficulty_level
+from model.article import get_all_articles, get_article_by_id, get_number_of_articles
+import logging
-
-path_prefix = '/var/www/wordfreq/wordfreq/'
-path_prefix = './' # comment this line in deployment
+path_prefix = './'
+db_path_prefix = './db/' # comment this line in deployment
def total_number_of_essays():
- rq = RecordQuery(path_prefix + 'static/wordfreqapp.db')
- rq.instructions("SELECT * FROM article")
- rq.do()
- result = rq.get_results()
- return len(result)
+ return get_number_of_articles()
def get_article_title(s):
@@ -33,32 +29,36 @@ def get_article_body(s):
def get_today_article(user_word_list, visited_articles):
- rq = RecordQuery(path_prefix + 'static/wordfreqapp.db')
if visited_articles is None:
visited_articles = {
"index" : 0, # 为 article_ids 的索引
"article_ids": [] # 之前显示文章的id列表,越后越新
}
if visited_articles["index"] > len(visited_articles["article_ids"])-1: # 生成新的文章,因此查找所有的文章
- rq.instructions("SELECT * FROM article")
+ result = get_all_articles()
else: # 生成阅读过的文章,因此查询指定 article_id 的文章
if visited_articles["article_ids"][visited_articles["index"]] == 'null': # 可能因为直接刷新页面导致直接去查询了'null',因此当刷新的页面的时候,需要直接进行“上一篇”操作
visited_articles["index"] -= 1
visited_articles["article_ids"].pop()
- rq.instructions('SELECT * FROM article WHERE article_id=%d' % (visited_articles["article_ids"][visited_articles["index"]]))
- rq.do()
- result = rq.get_results()
+ article_id = visited_articles["article_ids"][visited_articles["index"]]
+ result = get_article_by_id(article_id)
random.shuffle(result)
# Choose article according to reader's level
- d1 = load_freq_history(path_prefix + 'static/frequency/frequency.p')
+ logging.debug('* get_today_article(): start d1 = ... ')
+ d1 = load_freq_history(user_word_list)
d2 = load_freq_history(path_prefix + 'static/words_and_tests.p')
+ logging.debug(' ... get_today_article(): get_difficulty_level_for_user() start')
d3 = get_difficulty_level_for_user(d1, d2)
+ logging.debug(' ... get_today_article(): done')
d = None
result_of_generate_article = "not found"
+
d_user = load_freq_history(user_word_list)
+ logging.debug('* get_today_article(): user_difficulty_level() start')
user_level = user_difficulty_level(d_user, d3) # more consideration as user's behaviour is dynamic. Time factor should be considered.
+ logging.debug('* get_today_article(): done')
text_level = 0
if visited_articles["index"] > len(visited_articles["article_ids"])-1: # 生成新的文章
amount_of_visited_articles = len(visited_articles["article_ids"])
@@ -87,8 +87,8 @@ def get_today_article(user_word_list, visited_articles):
today_article = None
if d:
today_article = {
- "user_level": '%4.2f' % user_level,
- "text_level": '%4.2f' % text_level,
+ "user_level": '%4.1f' % user_level,
+ "text_level": '%4.1f' % text_level,
"date": d['date'],
"article_title": get_article_title(d['text']),
"article_body": get_article_body(d['text']),
diff --git a/app/Login.py b/app/Login.py
index cd750d1..17d92fa 100644
--- a/app/Login.py
+++ b/app/Login.py
@@ -1,7 +1,6 @@
import hashlib
import string
from datetime import datetime, timedelta
-from UseSqlite import InsertQuery, RecordQuery
def md5(s):
'''
diff --git a/app/UseSqlite.py b/app/UseSqlite.py
deleted file mode 100644
index ea4baeb..0000000
--- a/app/UseSqlite.py
+++ /dev/null
@@ -1,87 +0,0 @@
-###########################################################################
-# Copyright 2019 (C) Hui Lan
'.join(text.split("\n")[1:])
+
+
+ def _update_context():
+ article_len = get_number_of_articles()
+ context["article_number"] = article_len
+ context["text_list"] = get_page_articles(_cur_page, _page_size)
+ _articles = get_page_articles(_cur_page, _page_size)
+ _make_title_and_content(_articles)
+ context["text_list"] = _articles
+
global _cur_page, _page_size
is_admin = check_is_admin()
@@ -44,20 +61,15 @@ def article():
return is_admin
_article_number = get_number_of_articles()
+
try:
- _page_size = min(
- max(1, int(request.args.get("size", 5))), _article_number
- ) # 最小的size是1
- _cur_page = min(
- max(1, int(request.args.get("page", 1))), _article_number // _page_size + (_article_number % _page_size > 0)
- ) # 最小的page是1
+ _page_size = min(max(1, int(request.args.get("size", 5))), _article_number) # 最小的size是1
+ _cur_page = min(max(1, int(request.args.get("page", 1))), _article_number // _page_size + (_article_number % _page_size > 0)) # 最小的page是1
except ValueError:
- return "page parmas must be int!"
-
+ return "page parameters must be integer!"
+
_articles = get_page_articles(_cur_page, _page_size)
- for article in _articles: # 获取每篇文章的title
- article.title = article.text.split("\n")[0]
- article.content = '
'.join(article.text.split("\n")[1:])
+ _make_title_and_content(_articles)
context = {
"article_number": _article_number,
@@ -67,23 +79,16 @@ def article():
"username": session.get("username"),
}
- def _update_context():
- article_len = get_number_of_articles()
- context["article_number"] = article_len
- context["text_list"] = get_page_articles(_cur_page, _page_size)
- _articles = get_page_articles(_cur_page, _page_size)
- for article in _articles: # 获取每篇文章的title
- article.title = article.text.split("\n")[0]
- context["text_list"] = _articles
if request.method == "GET":
try:
delete_id = int(request.args.get("delete_id", 0))
except:
- return "Delete article ID must be int!"
+ return "Delete article ID must be integer!"
if delete_id: # delete article
delete_article_by_id(delete_id)
_update_context()
+
elif request.method == "POST":
data = request.form
content = data.get("content", "")
@@ -97,6 +102,7 @@ def article():
_update_context()
title = content.split('\n')[0]
flash(f'Article added. Title: {title}')
+
return render_template("admin_manage_article.html", **context)
diff --git a/app/db/README.txt b/app/db/README.txt
new file mode 100644
index 0000000..bb826a6
--- /dev/null
+++ b/app/db/README.txt
@@ -0,0 +1 @@
+Put wordfreqapp.db here
diff --git a/app/difficulty.py b/app/difficulty.py
index cb93768..1bd8d68 100644
--- a/app/difficulty.py
+++ b/app/difficulty.py
@@ -18,6 +18,7 @@ def load_record(pickle_fname):
return d
+ENGLISH_WORD_DIFFICULTY_DICT = {}
def convert_test_type_to_difficulty_level(d):
"""
对原本的单词库中的单词进行难度评级
@@ -39,8 +40,10 @@ def convert_test_type_to_difficulty_level(d):
elif 'BBC' in d[k]:
result[k] = 8
- return result # {'apple': 4, ...}
+ global ENGLISH_WORD_DIFFICULTY_DICT
+ ENGLISH_WORD_DIFFICULTY_DICT = result
+ return result # {'apple': 4, ...}
def get_difficulty_level_for_user(d1, d2):
"""
@@ -49,7 +52,11 @@ def get_difficulty_level_for_user(d1, d2):
在d2的后面添加单词,没有新建一个新的字典
"""
# TODO: convert_test_type_to_difficulty_level() should not be called every time. Each word's difficulty level should be pre-computed.
- d2 = convert_test_type_to_difficulty_level(d2) # 根据d2的标记评级{'apple': 4, 'abandon': 4, ...}
+ if ENGLISH_WORD_DIFFICULTY_DICT == {}:
+ d2 = convert_test_type_to_difficulty_level(d2) # 根据d2的标记评级{'apple': 4, 'abandon': 4, ...}
+ else:
+ d2 = ENGLISH_WORD_DIFFICULTY_DICT
+
stemmer = snowballstemmer.stemmer('english')
for k in d1: # 用户的词
diff --git a/app/main.py b/app/main.py
index 4e3f829..19bd889 100644
--- a/app/main.py
+++ b/app/main.py
@@ -1,19 +1,19 @@
-#! /usr/bin/python3
-# -*- coding: utf-8 -*-
-
###########################################################################
# Copyright 2019 (C) Hui Lan
标签去除,导致处理后的文章内容失去了原来的格式
+ let word = (getWord() + "").trim();
+ let articleContent = document.getElementById("article").innerHTML; // innerHTML保留HTML标签来保持部分格式,且适配不同的浏览器
let pickedWords = document.getElementById("selected-words"); // words picked to the text area
let dictionaryWords = document.getElementById("selected-words2"); // words appearing in the user's new words list
- let allWords = ""; //初始化allWords的值,避免进入判断后编译器认为allWords未初始化的问题
- if(dictionaryWords != null){//增加一个判断,检查生词本里面是否为空,如果为空,allWords只添加选中的单词
- allWords = pickedWords.value + " " + dictionaryWords.value;
+ let allWords = dictionaryWords === null ? pickedWords.value + " " : pickedWords.value + " " + dictionaryWords.value;
+ highlightWords = document.getElementById("selected-words3");
+ allWords = highlightWords == null ? allWords : allWords + " " + highlightWords.value;
+ const list = allWords.split(" "); // 将所有的生词放入一个list中
+ if(word !== null && word !== "" && word !== " "){
+ let articleContent_fb2 = articleContent;
+ if(localStorage.getItem("nowWords").indexOf(word) !== -1 || localStorage.getItem("nowWords").indexOf(word.toLowerCase()) !== -1){
+ articleContent = articleContent.replace(new RegExp('' + word + '', "gi"), word);
+ pickedWords.value = localStorage.getItem("nowWords").replace(word,"");
+ document.getElementById("article").innerHTML = articleContent;
+ return;
+ }
}
- else{
- allWords = pickedWords.value + " ";
- }
- const list = allWords.split(" ");//将所有的生词放入一个list中,用于后续处理
+ let totalSet = new Set();
for (let i = 0; i < list.length; ++i) {
- list[i] = list[i].replace(/(^\s*)|(\s*$)/g, ""); //消除单词两边的空字符
+ list[i] = list[i].replace(/(^\W*)|(\W*$)/g, ""); // 消除单词两边的非单词字符
list[i] = list[i].replace('|', "");
list[i] = list[i].replace('?', "");
- if (list[i] !== "" && "".indexOf(list[i]) === -1 && "".indexOf(list[i]) === -1) {
- //将文章中所有出现该单词word的地方改为:"" + word + ""。 正则表达式RegExp()中,"\\b"代表单词边界匹配。
-
- //修改代码
- let articleContent_fb = articleContent; //文章副本
- while(articleContent_fb.toLowerCase().indexOf(list[i].toLowerCase()) !== -1 && list[i]!=""){
- //找到副本中和list[i]匹配的第一个单词(第一种匹配情况),并赋值给list[i]。
- const index = articleContent_fb.toLowerCase().indexOf(list[i].toLowerCase());
- list[i] = articleContent_fb.substring(index, index + list[i].length);
-
- articleContent_fb = articleContent_fb.substring(index + list[i].length); // 使用副本中list[i]之后的子串替换掉副本
- articleContent = articleContent.replace(new RegExp("\\b"+list[i]+"\\b","g"),"" + list[i] + "");
- }
+ if (list[i] != "" && !totalSet.has(list[i])) {
+ // 返回所有匹配单词的集合, 正则表达式RegExp()中, "\b"匹配一个单词的边界, g 表示全局匹配, i 表示对大小写不敏感。
+ let matches = new Set(articleContent.match(new RegExp("\\b" + list[i] + "\\b", "gi")));
+ totalSet = new Set([...totalSet, ...matches]);
}
}
+ // 删除所有的""标签,防止标签发生嵌套
+ articleContent = articleContent.replace(new RegExp('',"gi"), "")
+ articleContent = articleContent.replace(new RegExp("","gi"), "");
+ // 将文章中所有出现该单词word的地方改为:"" + word + ""。
+ for (let word of totalSet) {
+ articleContent = articleContent.replace(new RegExp("\\b" + word + "\\b", "g"), "" + word + "");
+ }
document.getElementById("article").innerHTML = articleContent;
}
function cancelHighlighting() {
- let articleContent = document.getElementById("article").innerText;//将原来的.innerText改为.innerHtml,原因同上
- let pickedWords = document.getElementById("selected-words");
- const dictionaryWords = document.getElementById("selected-words2");
- const list = pickedWords.value.split(" ");
- if (pickedWords != null) {
- for (let i = 0; i < list.length; ++i) {
- list[i] = list[i].replace(/(^\s*)|(\s*$)/g, "");
- if (list[i] !== "") { //原来判断的代码中,替换的内容为“list[i]”这个字符串,这明显是错误的,我们需要替换的是list[i]里的内容
- articleContent = articleContent.replace(new RegExp(""+list[i]+"", "g"), list[i]);
- }
- }
- }
- if (dictionaryWords != null) {
- let list2 = pickedWords.value.split(" ");
- for (let i = 0; i < list2.length; ++i) {
- list2 = dictionaryWords.value.split(" ");
- list2[i] = list2[i].replace(/(^\s*)|(\s*$)/g, "");
- if (list2[i] !== "") { //原来代码中,替换的内容为“list[i]”这个字符串,这明显是错误的,我们需要替换的是list[i]里的内容
- articleContent = articleContent.replace(new RegExp(""+list2[i]+"", "g"), list2[i]);
- }
- }
- }
+ let articleContent = document.getElementById("article").innerHTML;
+ articleContent = articleContent.replace(new RegExp('',"gi"), "")
+ articleContent = articleContent.replace(new RegExp("","gi"), "");
document.getElementById("article").innerHTML = articleContent;
}
@@ -97,6 +83,7 @@ function toggleHighlighting() {
isHighlight = true;
highLight();
}
+ localStorage.setItem('highlightChecked', isHighlight);
}
-showBtnHandler();
+showBtnHandler();
\ No newline at end of file
diff --git a/app/static/js/read.js b/app/static/js/read.js
index 814f627..c28fd26 100644
--- a/app/static/js/read.js
+++ b/app/static/js/read.js
@@ -9,7 +9,7 @@ var Reader = (function() {
msg.rate = rate;
msg.lang = "en-US";
msg.onboundary = ev => {
- if (ev.name == "word") {
+ if (ev.name === "word") {
current_position = ev.charIndex;
}
}
@@ -32,4 +32,4 @@ var Reader = (function() {
read: read,
stopRead: stopRead
};
-})();
+}) ();
diff --git a/app/static/js/word_operation.js b/app/static/js/word_operation.js
index f043cce..8b3ac6c 100644
--- a/app/static/js/word_operation.js
+++ b/app/static/js/word_operation.js
@@ -5,15 +5,14 @@ function familiar(theWord) {
$.ajax({
type:"GET",
url:"/" + username + "/" + word + "/familiar",
- success:function(response){
+ success:function(response) {
let new_freq = freq - 1;
const allow_move = document.getElementById("move_dynamiclly").checked;
if (allow_move) {
-
if (new_freq <= 0) {
removeWord(theWord);
} else {
- renderWord({ word: theWord, freq: new_freq });
+ renderWord({word: theWord, freq: new_freq});
}
} else {
if(new_freq <1) {
@@ -33,11 +32,11 @@ function unfamiliar(theWord) {
$.ajax({
type:"GET",
url:"/" + username + "/" + word + "/unfamiliar",
- success:function(response){
+ success:function(response) {
let new_freq = parseInt(freq) + 1;
const allow_move = document.getElementById("move_dynamiclly").checked;
if (allow_move) {
- renderWord({ word: theWord, freq: new_freq });
+ renderWord({word: theWord, freq: new_freq});
} else {
$("#freq_" + theWord).text(new_freq);
}
@@ -51,7 +50,7 @@ function delete_word(theWord) {
$.ajax({
type:"GET",
url:"/" + username + "/" + word + "/del",
- success:function(response){
+ success:function(response) {
const allow_move = document.getElementById("move_dynamiclly").checked;
if (allow_move) {
removeWord(theWord);
@@ -103,6 +102,8 @@ function wordTemplate(word) {
不熟悉
删除
朗读
+ 笔记
+
s$p<^?!Ts?UjxHYgK3>|_ zP9A;n2%fX#iM{-(qc0yR`&;L=kVpNfbI%@~I`R>3>80aGpF3h-=Ed=&XO5KIpBFUA z(9LMtcTs$@WWp?_D!(V33KVSM~_6unPxo7F~ zr7vfGwDe2uxzaDwKQjEKHveqtm$}dBm+Q%s^V!lb7e7;a?EI%ozs!EB^vle+Hk&*u zC-v`idMAeezVuA#h1%1lU#2U=r>2h&|2_ZI@ZWP!4*z}eiQ&I592@@o{3k0%Kc8kk zI{bL{6P2USACCpi9D~MxWc=4e=~u`9ukrtV{C^q$AIJau@$ZfQH{<_c{O^tb-SPi; z{68B1+t~2`-uT}b|98f}JN{S3e`owR-&)(L zx9?>Kok4cL(LKm^2OB$+S$4OP?bPo#vU;{yUvIV>{cN|<=o8xTcf^%it^9$l#(tJ3 ztn{+_R=?5Bw!8I>29GYZHz%^@mWSW(3|jnlrO}?q_F9d4uaRwbvi=S;b=sY7Z?aNZ zdvl4Lnx)m{tK`sJ=5=Q2Hn(^B6Fire=@A&3b@#LVIx{j`gMYu@S=Wqvd)>xHQ@Jh8 zzJ_G{#s(AY9%RiPGqQ(_kVL;uhRsI3)jG)b8?6>^F8A41FWYYPwa txUvMJ_XQ$I*1&z&Sy`3>NaT`_PWDS8WJ80CqJywz3 z>Na}K%|^SQT^aOtIFo+X)z)4jRK{+ueZMzW*6X|V(kt_qE(p-=O;6O{7j!lOM2mC& z=zMG4!R{W>$nWT=4+3eJeY3OQ&N#jN^?G>#JzcEu!o>9S^hCx1Xn(E2rcURj8GRZH zs6S}*SkP)Ge`g|VHR3RP^@EA*rAvA?J<)#bj1wFf;O2k^d+GU!3|Q{fyNykq|4X%4 z#mHv?I{^ahj0qnFy&zLM3L|8Cw4SvGyX)YTUe4Yp=9X=c*p?9>p2*e*{o$aaPd Uy zAZE}XigGFym_@q*oHU65K&l%g)+K`2oA56X$Y86!(I0gE5zkCyTU`jc#qkW WJ!)GIy|hVlU{L+NgMB);cFdHZI) zy>XD;YCzCU{SI)1E`z-otH);fs2885p wkY-}-8uS#kk37XJ(Z>rnat#|MBs_?@g{c2yNSltMQUQG (84cHX6J70bo!mk+0w0r>e98PS1Xn4 zD>tvM+ypOw-7o#Xh4t#%>&~Ft+pNQ?;NeY _vLQb*Nyc zxv^6M90#kJ&GZ4))yBqTR-55DEwo>Ui1%8EUUAmW-X6H_MYZbtyL^Wz*cF?pw|bCM zeS_0vqFuHSf|5PLMo0!_FTwV-2 =*DJXAsJG&l#Y0&NL!F#ehVh9 au-ENGuYpYqWSeojvmz zF^ZSh0cJ>poo+*WYWH{G0hP+|1%SIL#s_HD8;v&T#s^!d0i3O26 w0}%3=~xBAMhQxvEOLi6E+$>`P-UQR^QlY>~WY`Z^t;+*w|@Hqsch-{$8i;lbFa( zBLg*O?Sf>%>~wY$$V%=^oYu!^KnRc_g78su7xm1?$YCtq0k`@)o83B83!js!R6h3N zIC&9mC-x`3YJ@7bI+~_8oaZbw{eB`DK%iZMxFA|5Bl&xWeRmDGSb@)4bMrZ}vO7Rt z@MM``?$x)!IN)qS%IjbO=mid}N$uE2;{z)=rM?&wFZVXO1K3XU1IfJxhqK-6wSoaj z6!C;eCNs*zf;Kx0FCBz)gXHzfW=FDa4^-mey1?FRl6y~ndZ!9~w@w$t9t>@3U^MY& z+Kp|Po~Pq{0kB5|*xsP2nO*W*fT0aWTDh9c7Ct(D2!4);+Uum#?jU~4#1a~?jt+2S zd*;rhj0Ja=77d@;NCW_%lN1N^BXlsNB$oLI)`!+Ve4@lBB{>-w^ha|AP-6PR6mMAP z#DR)Md}Lejq+DQ#X1fiT18fOu1wA*nW3foRdMiJ}t!5YQh8Wp~bJnvy8b)G(Iu2Bk ztrAGIiROLn8dlivb8hPgIZ+GBJy{K#F y`ARX z$dQVFcHuoF-ZwTt1;|<$76wI+
Q&Me$qy}NYVae`}M|9@lbsek*(H;$}~$vyA_f8 Z-|r-EDzpXQIe4CDOKaG&Lmd<{?Y=Slu(yyy9Iia$y>DEAQL*Z&{=_vAOm{*7-v z{PfxJhj?dx_06f{{CaSP-)`W^J=n987q<}pG2&`a2Un;SUV xuC>~uLoP;$LZIQ=stJ5JQwX7hu;-GR;Z7HrNXD4q@ zW^XFqt%%J!e*ON=LAOJ^M33z@ uA-1g`MWCC??nOuxQQ#6o_@4$Vji3M#yb zQ eK0 zQZQM$bou;+1kyKvlA>9y&bFM9L>xNVH#!6}RyTIYshWhUHtGr@ILSc4SNzxexc^vu zSKe--8TIaZQ&A@TzwC3fPOLy7f+7NjTU`F?$;#Yt-n-2$g`99r3QRh};yqTNXkVIt zS&@N#hSS43Q+%yt5a^`wAQF0-zdW5o<_hj_0(1H}yUS07qyXkUoZEmM&nR)?2EOQC z4u8W$Ct24?v+MkWKnLfFu=wy_=U5 )VgXAKlLH4SHU|XH?#nUS>k}2i>#n2M zIo6qzhiCS7@t)$6?{pQL1_klt_i(){W}XgD=+V|_iYsVk91MSHJw!sAEl%Et3V<5j z`x;z$ZO?VP!<&MOBLrKW4e}~B@o_hB u?+qXBH1C>3gO(PeB5Do1@DJX7jfo6Z(uB87~w$!7kn(XKutxHvv)g#wZXcw z9j;SCJ^?6+gMwInZF}HQn*v5TeK|b7uZRi3bm9#uoK5_^a^Z6A!d|e3>kepWpLjut z%#t9{kei$M*q*~I0@J-FP;U6e+3ED+5(ATr(H4dUmGhh7suo0n)%T#d6oT1nG+K82 z?>09HKG$0!&FOrwyPlbuHapwoZzwQfCQv8eqqEL#P08o;$3=V^+xW*mgAEN4e4XGr zL{n_?ZXM=APQ*?F=sa$8@*Y_HE-|itbMt^*h&+m|UT-uV2r@Ae{v^!MR)S5>Nfprb zPDj`WCR}aylpz$m-y$xr7`|}O1b-jo?qu6Ukb%nLpi59&;m4H8P-hJf#N$?oefs46 z=Axo$e0p`zKe(LTt#>~##}rOEBBhZ9_R`=5ViiLQG(5x+D?+b-Ty0;S0GYK~y}h6$ zf$VGQJVc}f7Ln7{Dzr!f03pbnPwm5jCM&g>A^W(^=p=IVn=Np1%hA7H3-XyJUOT#p*1yKo7z37Cc##PM@-Gkk;m1wNGqu%-mv3vCfotBRWi*$1SlWo zCAup~M-mfq1tsL*WaU@CK8YwD|M1l_ !G&LeaxasjFh$dG3RFE!bJa z`Qaji7BZG-YIe!ecN#H#`TSgV>qbTfMWs^t-nV~;%oqW~NnHCo2L$pP*%jqsi9;yR zDaeC0fUKt+17e7h$RRRKTEW2duJ-3VFAdpLcwN!Vu8$tph+Y; AF?1eb zE*QsHU_pA2bOB%@y?{)ry?S#StY8`UiLnKPP?Q%MR(2r&gxEJoTWdAiiXA)hnnI}! zq%iy-;=G)5ymG&}!PH2wHi<;-cJH8dpHwMQ d |H6T(>B)`W36dZ-k`t-dyVMo%LVEJCKGBVJaNTPsR(W-P*MTSpg z$?238Ck$*sQ3nw%-_4vOcO#ZrK*^dtKt$hSK7}bQeFKu9B;>_{B9n#82xU7Is6kve zaFMNWdV{^422>-Kr-e9uQ=24 Xl?X+3{exysJUFze# z!FsE?VNB8%g`ZoZVIs%CMKH=?0cuFgLfc?%C|?^^t-W3i6qH{8ovbGG44-?Q6xJj$ zO?T@kjvE{W36D*Kg}sP^CGWhw*cC8BtALr9ejI_+q)(XJ zI6+346OP<-JXS6vQBEIkcUnrxlWHVRO5*CeK=@9xi>BSIe?&4Wt#6M!zfO01O4Li@ zP fdgVHkt<{YDdmI*g```W|+TP?J?#iP}QjGr^m>; zQr?`srkv0DN43j-S3S8V2lq@t@xuUZLpugI{;VOus{q_<4S rUITv?II=qct02-y@mX`JBXuiSsN@|(?vKP%k$*_8+D zB!z9%4WvCh2MvTHV3Z-cB}2cj9KQ~BEg8r9rl(v X(WwNG!~g^w6zHPVc>jYS-HHdsxL*Mx9ZmR-^1i?uG(|(2fMzwo_yg zz->8F?$^6{5?vBDJ!~uX-XAy@%K}FLkvP&qs@S<`C( ~cg+^xCd!X>6&XqR>hg zfJ>bNu}Cbma|0bn8uUi4(S9jGsEYkUnG>9^5)hVxk3P2w$)p9}0w~ z6yi1pW>2obe&aH&a5K4gJ1R7osX0}8zLMz1UnUF^_5zK?`YxD7c3ow4uuJ~ MNABpNC~$}bl)WzPFe_`p3OH~ z?8^gNFS0t;L&Xp#Q;vbN3?_g(;DK~ssS&8l WkT%L}`B5ZXm&HdC zG%A|Wx7GaC0HW18Q6hCd;DW@Q%=8}OSI)_i-22`JMm@QbxRfF@kHkNzPrV`|&yCq? z{5LmqadM}>J9DYU@H_=XO5Y5^^e70Zf& v$4$65 z*lw1~;v#zx`~;tRm7COHsoJ1}6)r`N2YUSh&c5`(S!lF_17{aP#CDRUC)RCPdj=h) zv?!`CsO5Sb^3-hQ*1kXTw3?VgXg66E5!ItcXdBq{MsdmWRb6nBRtG}(q>uwJ=MYYu zTd+2#a-tBW4W*@r^#DTcnugg`XK&{KrI`(ezh$`LFpvN+TV$Mus87nfcQ2mu7zjY~ zl|Sl2?<`&?ebnIpm$lk3;60^uPg^X;BMbTlwQ&OwyM=4oxGThR{(5bWjh@C!VfEOl z)7^U07zA9P==G5E^5@IwlCh2t|6YMuHrP_}Py%GoBXI3Dz+0+2R3HQDZo|Bz;0Zo6 zI!Ib&apI>V)qSH=MH0x%v$W~7Vf>%szy>gj+d@m?ONJXBHgkzHY;=04?>WM=$u;(4 z%B4I-)}ic6SkMA`2hS5kxY{|8^ UCl5{xPKkxw!K8!x1(F)dLf z#8?OT2V|PF(ai?DM~Unz1{}Vv3375kSlJoJN3t&ALbzUf2k_6`$ylcq4Ha={w;I|q zlp!HEDNfe71Y_Jb;>N5L@4ft`z^e> QcH8zOFfe7e@_5JLiico#3#WCkU6i3H$l{4T`#tIw%N*Q& zN@Q|GGx3LP#>Md90A J^kGJNXj*;VLVwAn-+F70{BaPV6K&p4=RL z=mD2mms0{U 2lx^qSZ{L=|O!nwV*7Eh|;(4=3vT?Iq4o{8Sn~? zmvas=j==naW$?XqK+N3dW&a;N^2M=A?daT*FE&xvaxlu-ijs~hh(ZScNvA)uQ0Y8r zm8Vw nVb*nOp9jYr95jhXQ% zC;p!^YE(<1;|66*k3l&cYw$2oxhVF!J9%R=d%J=2DwZEEY7Xj6Fh%zNm>dAuc!%~s z6}yM_Kc%VmDcJrWlLG+UIJEy2{SuKL+W)fu;h7SU1p5%9*emB2mS4498txWJC={8; zJ6V#(yYLPSZ>x_A$J0$p0@v~TqopR(PYk}~XDYdu>{fRHq@F39Fz{A7gLk^5*Q0|kdk$yo8qEqh3`_ss40jxkd9XpbQQDB&LN~kWL$Vt_0~4EZ2g^G zaKQztdi|qV@yO;FnkvC?g;;onGiU>NNoek=UUMIR4ANHOtiCDNnYes=6T2GsX-KW! zVBNl1VPdg!jcwt)5gremEeXaYs3D_J${Ckt18gVcqf%5*jOA5gvTg?-2)?;Ct}rbE zN83gV)idkirrOxS*_P`<^3!%=CFdHG+mk4eeWFCKN)ob7d8QCkN*&6ZljM)B51K8- zM_zS2O0&apF~toNYdum|I7_~ _VeEo=4tS5kPRCC-Bvb8M!da~V zNK5HxPAwq~$)Pe7GBkw)s=LWBDm;o(C>wPmry=13;psACR0!3q)J_4cBx_6vT5Z)K z2($wL&>b`s62XJPk||bK>V`aO(qp;}Su1#1okPSt!h{GqL8MA%OD@pH=4%m=b9)ml z%V-bsZQ`Ji_JiSxMlRfW)OoD{P$zkSog9J3Od9G`{voX#3ZF23?C=R!hv-)gpRhV; z2-k3S=7i?-&t|(C GKiuz&z9*qT;`$)9EGGpC}3&YaO{o625IA}BbpExAxzSsN)j`> z1JQL{>q>>Q0Sab 1XoTz? zVUv0-=>_F)ZIf@q{C2 |nx+a~BNI zD{{Iz;w^@TCy8!S*lB8mp~qp{t*yYH4Vl2^ZHC5H9j7dCa!(XEf4|e2bT1{rI~lHm zK^n)08+ I#j&U5f7c6$|Q1P$+7bIq04vUNiTc(iM z2k|>HhS;{PqTM|pt0nnR$PVQQGnU>X0HaeNeL&x`G6VqUp1%}_20r8%t{fxwi{)M4 zlcp915bqjq1G^Okk*rI{A?_~0DwE6~LlGb?Bg*OP1(}dd(*fjRXi-2hGl@Wn{8U2h z#C{}VF#AEej*kh#NABeZ#SVw`7%Sq$9eUsl37hCOu>B)}cx=AOR+D&1|6q&UQwQXo zkkXq{dIC~{sJZA`5%pGeuBy~bK2*PoKJh~#q#amQI)y}Jsfr({zcWxkE4^vVY1X^d zXbRH1Sg_<$Y;ldC7;MxL(3~^Mr8*>v5U?=~6j0AWU>}t5Ke%J=GD!HUW=(Ku{4zT6 zQGDl9y=N}0_C!CBn_pAv+NA9NPk!RLu@f`Lsz<-_iRXIJhXVznSBd5jSLxvc?_i%| z0CJz*pgmEx1ev+58iyj58N59=tSfnYkt({VXdM3MT&eX&kfI1fEYs(a6H(GcDmYv2 zD;?c}3Z{c#u@7^N4c0e^`=ss=`Ji&0b9~B1W-Xv4ngZF8Qs&HmDiR39XBGC0tS5*k z(t)i$Mo=Oj&E0$$M~hH4*7`w3kbPre#YDFV)!40ktwCEF ~ z?7Y-cDno&qI_Ee8m9gA+Cm106k^sUZxd3sv9}9c7Goym?XeE2A-c<6k2){vQoV?uf zm!oXpBz8Kg*`QXT_!n_)M@P^0Vg8Qm*EA%7;Ez^O}raNA&JtVxfo_jDrX2cf|08mU4fWg zsnr%zZnM;ZV>jOhi4w7Xv@4~yRX5=r^=@r?y{g1?ot~J1*FRMX0hV;Gl%V>DpF36= zd-!v2KO`}AsyO++1oseV+LM8k?;u7_4Hun;qcCBsj?Dz10$vgKD2C+oggX`jrO}oC zk>1fE0yIU*D*0T}^8_tt&PyxaBPobnD_Ah1*&Lm ^eb)L;0-C)F_R?3wWo-+oh8-wxIHkSS!Y39g{gDq9YPI8-)1ZQ|#CS2CKU zd?`nX(BxQ0wxY~g2%~@Wch;3xY$;f=DjPWgIz2xlV@ro7N4Zk{(7cj*1g}$uCcpW? z#zAAE!oQ@6zzGz*&>*x6(_fs5)=I&EdS|W WQ@y^LO-Or^;7Og4#tChO}YEBeKvcVJ|ouvKN#(Hl{;RLa|5AE3lr zJBxOLQq$GHO7(Y1doh@#=GQA|A1E~>Bw(F^+y+(-WDHaq6+vLkz|QKGy z49e`>>dFetYp0s6F0R~$c{Qqooi@$`Y2|tTIJy(%VG%X02qL j&JU8hNx%VfY=;QF1a2A!S0FCR=aSb15sd{4% DnZ15-QCF<(5rpWGLPA?E@F0$r*CA2S?28s^TB$ffjw(*_Q2V*v4th)^ZZUPX zDmvEW#bzriKl66LX_Ru62DoXlpdr>KI7%~i@?D7{6@F?RRP1>ZG;HKE@@`-O{|dJV zmcFb)@e;8mdqq?-^pPFPhhj}VVv<5Ih7In7VcEj`M!P~(AtE1x9|dVj D@wP6d6)u$piVAIJUL7RuCi~;N!(wO;Hokubg+2kD#UmZ$WpxI zmq63GU$<99&zQJkPTaz%p2h-BzR_Y>fQsr1xf*{g>^OV23Il`ri<8P26k+S6fQleP zUullBSWd;u5rA-+vT&s(^8Sn0X?$GAmQY^zK}pRjGOb*ooJ?fp&<8&G@akDMO1mO6 zwe@355s;2FcQINWC7gPODp=@AKplM*1s`+@_?lLH4&v>pO!}rAx=FF3IPK@(K6-rY zmu5dab!L2VLF@&`F@R(LYP;91yDUp)67(#F7P0_k|Gt8Y 3+2Blpbmvlb5vB zk&e}Yj`eYxG#`{{lr_jvd(nOjB#Me9tg`4p8WzKS;>;Ql)CHHxH`&9LcUjI~(1w!8 zFjCzpT#%wd5xfddOz126)Hnvcqp-WQAwUH7;S(edp^RwJw}3F>7otUBc(nWt`7$y} zl2R1S{p@wfR?zD;z#?#mRP12UE0?D6Xe>Lq)6hWETW}f$mb#0za~&6c6chnR>STA( zHW`joSBmi_7y0ts0tTjBOp~vUm>|;COb9=?+b=arjZ&ciE9Q6QN>>$2a(1I?2dZot zl_o7vc8Zm7Wj*RdgS3aileHj>&2aT&&$oSH1t(w}0n`lE9@5?UIDvZD3(D3U)$I z#2RvY+sTyxZ38)hO65>JzlwkHSK*p~n1&gyui3|*^SeYt2tdq+utLb+Y}*w{=f=$l z=5Pr4hr%JxGwjspgiRxV`fPoGE-f=eomlDTO8QD(V`utN)`-*{jYU=;kEo+4r-(Wo zsxUE`L72)WhV_O}MGj~C3naIJjy|Kh*w^ct<2L&Ske323iAyUMfu3)cAlrppY2(Xa zPg!Yz3IZdJB#R6NjFV%Nx-?IsvLS??RY2CcO+7!5i;W>b-jy;BqZK==w@6`;dW)pW z0s2vJzHV=(Gq#`y>9zj19K-xu`ivDkg+ip$z#FALX?*+os3ny8(`w=bRCG_83>;03 za)X~GUnF1@y78*j>Vov*Ou>x^L1?KYyka4~Ug#8ByzP5zojQc1c@M;Cd+<34{!qDs z=;P%fUdXO2HjOPJ4>TVoHsE0y-jvbUgd<8bP#yIat{Vjr*QsxivLGdek}IAVuAg~} zp@%b~#Y>v=Zm0%qc=#Ac^Z6DRhJ=EcuNa|A^gM`i)D3|7Vrg@;^u z;Wc=P0qPqh?2pUN36L7CR*Y7>s|V$4PRAE($HphkouM=i#zF%l efp(@_wgAnzY2Dgn uR;#|JcWj^Q0<2HDaPnl{A|mGm6_qYF1Q z^J^9!^(=5!Sp^5La~nwbam6xn{vM^uo$P%|LUCs1-F?M$z*HRvPIDQq!6(3Lh6fCJ z*jr0Vy`)hFxG+L&0Jh1GZg#N*36TP@Wf;s9`FV22j>W)!L#f%r%ZEh-!Vq$7wcyOT z%0mbi;1E9>%Av$$cSU{X B9wA94tt!yDPhPxded5&00E)K-owpP|{ycn`XmcN?k z8>~sLyGkiSOt)dS0)2pEPRG#Gptr@J|q@JSFcq0)*?P=VI#S98#dxdz(@MQ*^t zWky*WH#vsV$UbD3feX&|-^Obwd`d)|+jig++#r5aMnr)ZdQd4Cs 68VZY1Cy#*}0D1J#*!@u+FD`DW<3v-x&JSVU>vrLx0xSH)tP%k_MroVu(ln+J zv(`|J&L=umf!#K&!r( l zmg2mv14^sca@mYm)Y(dM*Z3UOR5(ETDvOp7qh<{(lqMO5XCY65sN^Alj6_^RRLn_3 z2Pr4XGQi*g=3~E)43knoQCv7M*TvcAWDi4ICBab0V_p;cN4~jm+AGnXosOjAk2TQ- zfFrTg Fx09_q0L92-v(e(kh~dKl)Y%64?|120JRa*jRzZqVQ~&sDmU~D|P@PNpeKsbMlt;LaH9X%j+C-{g0kW$)~BP!hY0nVpXK=IL7 zn1GS)q2Ph5XzK*QK^#_|l3g@dZpA!qYWqK|r&7gEdy5YY4XawAM5UQrJgICe@a&$H zZW~dy+_7MoBusc!7!Q-IasP$Qc&>*pSbK_61uYK%swV|I;3=r8ks^!Ihlbjzs=sn` zXw=S=*(hep)Pe$5m+#i#Oup}S#dgK1U?|EcENvMdtLD}rGpsCb<>K%WOo58hM{~cZ zYHcYZ14r0KfbTipC|y|9(^FbQHNl&5+M!upg(paj+eU_V8VBqc~S}g&Vbqy6EH4 zg8m!H1l1-Vdw?L01WS%Ola*!RGM^5k&ocB%ZY{_EE3W?^TOa%69e(@^`R^C^D#you zW&gD^;}5@lW##r&bskLl3|B}h8pvMnQueyKd~ f=*ce{*a`T;1l`A}^@=cn}Ws8Km zf0AFWu@5q+q@%JW4QJF8rXnB|@3V)Wk~BgYT%tomqwLDkwUygT6?!whb?2tb?<;dN z+#FS#yL{my(F+&BsxU{^Yo1foLa~8=SwybKG4%vd<_FJkc`d0m8 WtUcO zPgaz-`Ph|LzIhG3O})#0GW+Hlm-zGn{mlU#?h;2>9zuQU&fBkWBMJX09R@pKJO6hA zN2U5l{I9Y^P |zo}%ojybuUE3dNsenVoeVhp zo9B)nANya={LaGlceosKVe##ys~L!xUE`j}H*YSjLcD8BoJ(a&|3SiQ3)hzy zZdUv~6uxrj=GAO*<=VBSrAp=Y!tzaFG3dN-U5_m;RTh_SuPt9&Ub =P11%5=WmPyP>OE%tRLToBmQTlUeI}q?&DAA~`+-=5K zp;}3o;o+? 2;Eq(o#FmrXu-@biw5@$*371Z zY;ghM2D;z&3e381tsnyRbkM;np#Jgc+3DGA_WX41CqSD8+p4z_GZF_J=mOD4=e;F5 zh&;y2kx%q}o@;FW)Y=Us2>Q-8t!Yu=mBwnN6=5v_9an+j_Y^A9_sUheFe4PClu@0Y z2aVDA@dtQCxSQP>r#DgQAr-^BKo&J!UbkS(pe@7{K6kslIq+RM@yTzNFO>bMu~jx) zdgbw3#8i|^);-SBLS&9B0B7CYxeWWVOC}&k`w*aM9NW?z5!I=Z#0)`(5|Ro`E;2#= zIeG;b!(nuiYWDFEjlNs(nLIKf9>WYhbz=3X`bABvD(g*H3mydW8L^yrEY^>@0T~vJ zE-+!6bf!hZ$!Dm`u>dVv;C4lFQ>{IQM<9=73WyAkrMv)O4Lr!M#0?An&}|h)D8kPz zS+dD#f+jZ6wTI<#%u#Gn2^O$Ljy30XiM^40s%yJs62mPcL_f*^m3K5$%m`3#Vcx(y zz?H40dU;@itFf;>*zMfID5f!-;lrXZ>>WsD`6R00Xbf9rn{FV$iFYcB^Ky1Y6_gZs zA>>FSVn_lRnkK$n`Q}Qr_e0WO8(G50S2xmPc=<~i&$TQZ$>t|6gj|ihP{~VSaM;XS zY)j1%brGLzecV~@elp1j%R+ ZB1lg|Q*H*lr1ecDmMT{h7B!f{Qn(W+Whh8xD zD1k+Oi3g_;6eJ 3x}5B4K8mHax^o+Zmral7 _w%LWsN1az^Am{ecEQcfb`@U( zyy)y!;=!HpN;M%G4TM4=1sl!+TJo&&=?>&hC5#b*7{8QCriRc@7PMZI-dirVa}tY{ z5b>he91b%5Vl>7-3^TwU0h8pi)*4o{J_UVM1H~62I8Ekd!6v%ov}%9?2S{(zUiHj+ zJ>|;iRy!7~K#@MjRMOBT+lVO}AIOc127<7cR{^}>e;G|-FX@dtaG+%4%wW|t=w888 zDI^V@mO{HFgGDrS3vh5ck+dycMv_C3=3#j~?_XVBMG`Jt$Dmnwqk3cc>(coakiW}( zb`!IgeWZ@O#Ayz&y*IHTXD-naN=(8nmb4=KROP<*k-3RrmtsaOB9 Xvenyk9}|K z#KN)f9U1%!aR3|+`X~f``K4DXf9b-*uc>+5SKuaU2&c%6Lb(V(@!mHF_5DT@(z%uW z3@zfeL6&G%JdsV)1APA04Ye@dpGXgac&Wpjk{>XQC*@Y?4OILoHURsOt4?SL%PJ*- zD4I;#Gf`J@vZBQ)d`B7SW(#p$Dw4d=ilo`8M{jrmLo&-r2_sA`Y?NrKY9mCorr#oO zHTcYxM)Q4r;<$+&!_gK`Tra<66M`x36xQbv01Q(C-HQTGsZsK$q8%z=7r-Krf~N!< zbx(P9cP3XSVJNUm@i>`N&QvfkQvDOuj@OYsTv8NKGV@_zD9R~s!WEoVZM_s9q>@oc z^gyzwyHQbWRa&}AV440#=G;mIV!Gh`5kkkW-tEWg$z) An-0n~O z$+v8Wb45=tf+BP)RxCPtn$ipfdBI4?A==kd9;iISpZ@8z13o6dR)fX~rDQPtj{s)m zx>?*O_87$sXX#F-o3s! j1I(h`Ok2Uh>;zxE8x(_iP3_YaTVY7y1z zP|gZuh-lz|OkwT4sE-6WQ#4Y9L>huUUK-p<9CDVX%3-A|NzcynlSM)}m*1iX&Skun z@f1)J?WOp)sIiZo6aC7SV@j?B-(&okNjQ!~R86%3+{h4Q!Z~9e{NZ2CzNwA*+{=3Q zvO)$b)A~vE*^Z koHC0M-fU2Yv+u50m4_$8g3{gQ*PE1TwHo{&{Lk-K zWZ?Ptd!)($4uzKkgH)qSbrz1T$!tk?r>6(?qSuN0lyQ(mVzaY&all_C3jlSfrsJyV z?|u8b3a6S=b9#)yMHP8%D@qm?k9mcTKTHE>s+YI!1PYDIpz_5f?%>F&nFS_XDzG*R z7$qWABHgJTy$Cn~U{Av?DyHefL4otToItEW*K!xpdJ^*1^&Bn5#2jhIp>?|sU!ZZ) zg+5V`h~HD-JYos{yp4Uu=_0IQ8Z0gXTe>VpUURk0(%Cy7N#|6a$V-Krrwkf~S2`Qc z3vC_blFUQ{7ULl%A=YP)>m+tZO4}ou%q 9a#i{VnV)&go4iSQAA3v z&+-8fs|VlSU=59^6o`(0>}rz-8BjiaXfgjd71WCqi0KOz lniEqjfgD%zbF9_RYQJdiMEB<9hCvs4K`#yd)yZx zL1K|mbs0&FB4)%1s5os69=Sg7tJtd$r>X-?#brtF*o&t3s+W>!pOSBKCXg78@I gvu~0$y}i@>NgO%osrZtWWC>r{b@evqAaPYS`w*9> zSvo!tZc1P8eXK!*b4d?z&&9e*aX|FbqV{#GLj}E`mX0Pcqv5D6v!sj2sT3f^xN;V) z@c~hYa`2er{P`b$nsR_~DnLK{3Y6y@BcG}n`@K+xz$ST0)xpy9Dn8)GE_8q)iy^cW zWySayX!b9}N4v!^M?v9<5J|#IS9VC0Kr1|>V{>{+3aRQS*?pd47vIt5Ln**f>Mq}H z!#U1*5tbbQZo?9^$ud&6M@C0Ojyu32OilpGu|^@Fgu8rC>aU{`xM2=0>8Egn-TEH& zkT_Q5$1~Sdl29yqR}QFN;{oY2QH9fl(3u#wmXoEpnP+4GDH>!wk!7HmJP sBHXwwSpSe+J{ zD&l72sd9xf?jY*Qq85?b1y`<4axV}lLmKEV_93XWL7=@<4X{wL{eR@Gu}^+@ 86I+ppRLT4CjDGWA2at)cAT7b1$MdK8+PQo`Q )q}a;ON-eokq2Sm!NSg0S-Fo2sfXfm=coiYe8+IvONM4Lciy>FBik z$tck)z$uJwhnDoTxKk`nrjrsF!7@b}I76U;88cAZiWuts!S=S-Ry=}e^c{GX-NBlL z?NE*rPdzu1OTAHGnC1e|2LF_m1WLQ(zBLiJo2)ZZdmZvHd~k*+%!^<^Rm|N%YSlvA zs3ixfaYL=-sIySkx-;6v&Xt1;F# Z9GlDlQY#r4s zu@b+CHW_^=ycW1KwJ_)oQb!@Q)B_aMawRIWkb?ESZ{rvn|GnOc%Gf`tJ^V8e&McV~ zasUg6T*#(kAM6rHooii`ghKEF@0F0_ZX 0=Ejhg48J*iy$@-3Qkpsr)X`nVE3#$rJL&34}G_Z4)g| z7@B+~c8=w0hT79n{X@S$ma3WAlSx{u<^lxHBGt>-OXSl`$SzK@*KW`tN4?{rHeV)b zluNPF;6%#t@@7dFQozgCU8>o?h~3VY9xTom-O0>R7=t(3V9s}B%z-u0Gi-KRWiYUC zw?&ROwaVnmkEJP=3ZJ+;kfZ+`OabZ{ZY7KWYrj_0QjHRuc8^9WuP$t5#?^L*e~QQ! zAuUGbvy$r+qgw{b@C0iYRP`ddNOyDe4(Q<2Q7=R=g21_qXm@k56U+P7e4A=MfTyuE z(tIdP^zVarV-P9^gGJ;h4;+JkL98IUqrrJj4&91c2l&cFHAs6_%M11`WaqlK*Q&P` zZ?i`^FNT-^@YI^6fX@i{lf`6UVOOUMq$K3EAz7^vxX(M(SoODC4q~C0i3Z8$6s%;4 z_2T`RFaU|9XaLk%m6`EvQ{8=Sb0l9DCs$t=J9C%|- F1elzSm5C== ziu;^ty5$ELD|HXc_Yyb i(Iv|4H zACPjKZUo6K5Pj#`=+Izv`$|h0BRGp_4C930kc}3XoG4rnyh4z;h9fTNq&5SW)I#cn zC9dH4aJ@ kDjL@>j&Ch0Zq`3A&&R19w| zBd;{-iK5Vd#Ld4H4x7h4dt-@bo!){c z)1^{^(fcCv#3d~+l$qp1P{`1MTs56TZqgA%`3VUM1y%*L@;vjz%{g4Jp5q9B2Rj6~ zGO1KZCDg`y#6={kj(Uq5fMoe@ru50T3FpuWYK`XMiHPW`A|w;DW$;y=zJ|Su$8rPR z;QH`_5Dy~3`>u3_ML4fad=+%cWWd J zd$Ue35#+P`lcjQZZh3VJ${wW;cp{t)`Zq~zh`(S#>553WL9D^6iELC$z|wjmLV%>i zr;aF$3GJuck_RNeYDlUTEVEp=5P_z+Y7iVGZXx })Y1*gYy=v?D^pz4 n+rr= >D`NXdu`P`9ly-e &Af2t+0F*BOEit93aA+BDX{$UHdQv zu+$V-a<|@&qqC?+c)0`FdBAH(0t@ghi&KyKLE?n~ArKGQYn~=&S-xceV4?T=qo|Fa zE;+cAcn?K@8ic-~exUKx*oQy!9Bth;9`^9*ouabxtkUh#2e@Gek%oH|L&vTUp#&MX zs9SshyL8%Ys;w?ZsSwj~Gm2h-Dfvn$;}HBUH7sVMS2~Ryns(yNxjUJiqY`44GU`>S zD+DA)?iICYEE e~;Bz$u(=0c7&YYj*ZoEh? zn3*o6l`N8N$fmf*ft-7Q4?hFSb{E360jnx36GJO+hdtnxx(45g8Y?-bu97z7Vs*Ku z?iBuJ-j;jnZE#Kh9D1b|Cx312M=E1~<&B3&0sp(V;v&taFUna&KfqGMAQ|!`; %uT?VJ+#^VzwtH`_ad`m4IrWerU8 zv-M5FBpfta0GLc%wp70ph}Xa@_~?54a&UO9gD#UYi|t562gwsBk~bfyLaFu&5s1Yy z;?(G-!Q<%y(V`M-YnY14;Zo* yws9ns366<< %T bj*rly-I)baR(D|GbHpb&Ymlz8}UrTr&ucz{dA$}^b zFrpbp5^1zEtDZkFQHMTTACG6&y_hKbIQ1t9voBM!`nUi_ U3mbea#0W0=+TpN*TE0q~sRT32c-TKyrg2V= zCD?!xI5>ErTbbg-S!mBE*nnM%yn!ugKcfem 2E-wHm2V=;-xElV`6Qc8Ah015={7xF1PFZpqk8 zXdTfGJ}i?_!O`$NN*ps*0N5Kd8-|mTJb?>uGiB{snbn$2^@-tq93YSpvS`&qPeC|! zsJkb`&Jo4UG?e!Pp5 KNM!#<*=1n2Kq^@=PLW z+vVMA;DUVBSg#}hjzoc2Ka!kgx5}f!@&FK2?^9X|j^rm_X7V>lh#TrwqfL Ri;B8@>=E#$O{*%P1Q8^n!y zDbWrq5RxWr3k4&BJYI3`>j8b$!CekGEtj%BcA94| DxgsPfe-X=z&!Lf;|pgpizlsQH(n?U7enrs-2(Oc&|1)KQljlsaDg~ zpe4nr6x(|Y)x_!^;etk3MI8&C`9l=!Dw{Ahva-@y);1p*Uog0{Iy%8GefHVP*e}2S zkO0+(XP4y=Bf(ezLqn67ZiROI(sP!E+9a$m>?QW4Y-A(|)Da(n<4#cKI72BAOG)WB zXv({8$l-G%15ULWd<%|;SiG&wbFo%C>$obdgH>g5LB!Z1M>mn3Rvno$hB!!hp^Ii9 zI18}(NjQltX}~D*K^d0 kUR>wSStVYg#&;paO1i(UQgP}``9LGuFK!>B>A*h iq>Qp3h z!gxrAp_z2Z!aP?AixkQS+}f|}YZMTQc~h%Dm%$52X|Fu!K$0v$q_(r*aG^%V1;!y* zke*Z@L+_U;8_48j{rsw*+}TmOW4zE>1PsAZTwv(%^Ewg~!({c?c%>1 $M-OX)4H|DVL*9iw5D;>$pB80U9XPptVc{{KV9|CQ}W9%0C_B9Q>^6KJV4Do!<+ zl<6JEq==G}DUw>CqX+P`U rIEXV1l8ApLQY&LI49;9F ^quFpEcMo0LnHr#HkBbx{UDv}%`*SeG zaZxiFK95an#Aq}R(V(|k|Ib?hDJvM5I4-FCzsMm%aEmpRo_A82uJSIHm=X&MmZYo> zZ8z@W(me{Pb%T28L_?gu%A6q{a)?HoBsqmNR*MOO?&=h99ZRqWs3$Th-85K=h_~qR zWZNPtkl-@k0L{z=$P$GMfS~lKHIuW96&UC4^FgoFB|Kj|d6EUVQopYVvK7lLtq|Qs zG7|9yh?L- lRRmO*F^ zX~9-62D4i^9+f{`bApE|9$gO9G`q1Uope=2yGlMSGMbf7E^7tw)8L8#gCL7ignBEr zP%R=frtCspZf-jfUuBzDqXS~@LWH9>y4^w1eE>05@ QThg!QmosCZ+)HWf_2Em`?jt`yWEyQW#^FQ^)CH1$SN%x=QtU397Y+F z;6yTGu_+w OKEoIAQF$ ztCZ=^IT>rp(6m24oKY!ZgI9G1N@x+5r`9M!c3LT+8sL7Qqp$?A{8@O}&_9OTKreFF zE$8EFc33c@J?3LgB5H=&nhj`}q#S@pPKIG}Ux2_VMv6XFs@u?u-jH@;&~aQU4^)m? zl=FxHfRqRauE;NPDgh)>GDTI&qfy%>F5PJnY$0dJ_$ZZ*@Bow5Rv2baVLq&jZ@yN4>{7yB|%{5<;1eZd<{Sg z)je2xYAKMiE(9#u?ZH%tV+pV!3Wxod?ek7)3dSGl`;urf>bP-A?N{USI1x{o_k+N| zg>Ho$#5~OiqbQwFyULg`ZRF07`YSr;Xna;WX5$#vO;0Vxd0Y`|j>B34P3Dx(hux9q zr&_87yEXhgI$ iBdES zLJ*!O)1)NNwCrKJUr4C1h;k{B(+2`JT!8+%kW6j>39p2B*4g{rgw&zzsKaLBx2yn& zv1FnX1X>d~wPX`c@Tw)?8Mm3mtyyB{Ngjaw7U;ZSp{H|Hyc{kD4=0=z$f}G615#k1 zQLX%By7eUFR<5h&+762rvWo|T1?ne0*j?9}gi8Gbf~W*G6ZZ>#p*8|N91Mt6c(-{M zv;dDRS&TaFsLt1cc)jq{&_fTbAeT_j+#we?rXzT|5Q>HA{KE!Tje8Yw!FRdH5B{?z zdb5nyI|*uv5?c^~F}EeZ^G>B4Le6#KfDj%zEPy5^9AHp>Vr1Nk^sR9Ti8a)=uYHZt z@>GyGmU`s*plA+JALJzE3SHg_zl l0)VQ#VrcB7?(ntKZ?x~?Vt?MT_9MG zG6kc{;|3(bN~H`T%WM%yOL7DHOUr}y0Q@K= lQcA}V)rDjX3DpQ3;VK5eX|0_TeY*VWAWaR%JyD)bADSo{CF%E#S zv16b4&MCPHl%jn%sqA-wSC71LrF$z~pq;H9h-J~-0I@?|ZFZ~K#y4SG6)aQMfklq} zOr`P%1-C<;6da%^um_!YV1P4O$$Gihpdd()F}a|mC~4g)c5X Gk7+x;)Ck zL0lz7`A)M-*c^xS6 nq?0l=<7-p`F2)}klDC;nt z*mk0@0e`vb`I-6EfRJBx5fpL`svptOxv@2%`I>eEonR=yqty^a5?oPQUt>K? 9>S7c%VuF+U3P-kKt=tTf8v|G0Vivc@WKM`KaWuYW)Xf4U zY%FD`!)F6P910gxp-ZB+CDxyx741@GKh){v4-fJgFre~=$iQ9ir0OXMj62IWRPU+Q zGzq#!B!fvcXl@na!%YqJ#ot+2b&q!x!2 6?+FB}l= z!=$u+-rxX>Is$1eY1^Uma$3O@1rXsB>P|FbpbnB_Po**ma9#lU96EvqE(xPUsQZB4 z+)ZbsNohX7^l1eNKVj(J2ge>Oix8BiR_-8CU)?$HY6(=jWS!*eU^ Ki_vS>jXpLV_vZz zHwy#reZ_=vGkPf1K}El2`2m*CO3Nevz#Ji8CJO<-C$q;vSgt1)q@@KO2?cZ2VwtfV z+1BwYz=gj@M!X-f67HMDRavPr35zwgg>h*nzN#=GMzB}09pYDffzYIgvEWOD4u z(SRQa+PoqTiAWF!2a5J8T3fgKnZ+^!Qfvq;0WfLy-lM&k%D^GsA9-*f&0tS$$>pcw zVWBPrscdq 6SzEOk zI#sr;^OSA|yX$VK>M>?{l_UAEgwhG-$&{qKZz@@0!A8+i8040SY_jqzgYn~Izg^vb zdHmtR0{(iqJer{N;7SEZztK=qTlR+T=%P{F4xKLO)16(K#3xaD97^pRxKVVL-QbvR zK(@}D7RD$W91Q`>0i=YlG&b(-)G?5BRQd*#mi3Qmk1tzD535!v2cM(@JGeNg OGIKNd}{kGfXwmC$-XLuP} zGNDPemm3-OpZpVXjgyeAiC7>9*}GwR_&5}LC|D*-jZ4SPSd+3rV*&hH_tYc8{Fz8D zr0mq8bZxYkrp_~$)%5}uBJ$0wSc)^-i^Y IIhgebqGC<&HzHo90km(zGGwVaQ3}#|CS #{^sULQU>gH6m^5| %(fj-=fa@@w@_1da_a1m z8SG(mQ!C~X`>Nm=!C+z7ejRQLikkO$S?=HoTLnFFLotOO)7NrVG18iOG_1cKY0Rtx z=bu$ziu+}Nlh=nJ*rT8h#NuGWt;yZ4@^OY R;8ZC40$G`7%>;;FWXEj zusX*nfMc)0`O51PZ8Y4`mLb4IR<7~}vBM$Y?x|7{Zb#lSK^8* UKz6A$X4Ihu}j68db}lmYs2!>DZY zk(Fq~f*G*hRgR!c8*d`& T`Z6q@9ZPavhDQ5sdIFMhwD1i-N-$7jnp` zixjg&XIQaDrAIm-0)GNJ#T8}vDM1ecoj^q{O_m_J3AAI~E#+=|VJ%eL_>AC`YMlxO z?dsOJ^Bo00s$_tvZ+ijbBc{8I4TT+5#&dkqU`k*#&x>OPC38#KUJ{Ba&1jo4iZ-`1 zY`eb&%`mwopf){o(Lbs?=`ST1&0Iw8g{@y1G4|yMimgO>7%p*X0`l5;zOt!LQMVgA z3C8ex{fH++c|#p?{r}PW*zy18X#ME3GV#Cve@8F;+2
k>l!S3RzBg23^V_I#z;{-CfzZXwP9v$}0>xZ@}1 zL9Qa(kf-tuHE?KykSO)K?ObxRhi4liOtNCc0oX+vrYr0~j N~sf zhkqa_;k{3H2Emc)Nb4<}YY~V7d~k5^Ald2O6(fTDwfT#4`kQsQIk*Uk-xRoW1TUXV zFbJcWojnpRWILGM+y#bZCp}IM6Sx`?bae4p9NSRB9CL~kl@4W&yRH7Rm$*tx`BAWs zlo`Vj047WanV*HfG%41Jtv2cM$54Rx_8 zVF~0TMFof7o6 1J<*hv07R1 Mh`pYvjO4*~|_{I08FHKMLJNn~e zGH>pNzNN(%>&thu*ZH}{FI0Zv*@rKyKjRy3s^*b2QTQR%HdMjjy-*j8a#a_s7A;&Z z2-%mIsN~V%Cea(e@`cYFAN$Siw;AeZ7a2%XE-RExt|1~(YC xPR-4$FmAB!kEoJN9&}HhZ#)=1J zdcEuw++O eF3#v;?s?$dTqQgL+Grfvcy)N+o3SzMB|P;&dP)=@y8A9F`6&lusSBzfD#)1TMN_ z7SSiXFn7@BEULf~4(qp2PjOG-*g#D|{Bi=?SXvDiu;U?=mjeh%XM$Tg&cKp_Q=kkh zfb3#QP)w!Q@`bOJMzwB07Ho4JU{F!TyV8m IY(vFDLDv)0XK8Mt >03Q<^sAtWKXbjUG5BG5KLG5Y}_ioP7iwI%puctYRn} z#xw%WqG@Ra4T}3d$zm`j;VH%lRa&>4e+osw&B@IVlu>&CX<7DmCnl*hNNpIN(yDJ` z_pn%s`H)*e%(U2?qcRN11uSR*h^cfF#*&vvx|_SSNuVoDDr#Nvyjb_rXlX`z{_m;n zKa)mgW>K&n)`BkF+Uq=sLOlXV_|W9-kg>|8gz4xZRT(A)ka ZOWo2fGyn#%W4tG!l*d6rD1{wE zYYLAD_e`!r3Qh`Vh q(n_9YdFrfL!}k)!4~BXL$~lV*_NW~VlB36 z^(n^bP_&WIWo556Jz1Ncotrv;zINf#`Hk9a;nx^Z?@% )Wdml!p|JWb{eTw2XH=& z?HtB-K!d~Bj--QJ$Wqe&G{km>K5W^3JGvSmnwiOEjq9Z9@M7HC7d|9}TkD{@eo#$e zytp8j-yI^XUbr+nH$6XF@?)3y{VmDLxc@@RU=aYbC>aLE(1$U9EV7CaDYaJ8kV^4x z`KTm1kRMoLKUDgE*#DnAHulV~e)1S?0R9C2JNk=Jlr)CEYt>H@?dqRoO_J*WRsN6p zcUb=~S5xRD|1#_URsJvVAJ+fdj*~`St{*L`Wfd@YQ&Xvif8_fAzxc%GDr0~7Wp!M5 z_@2#9c|qypj;T@4PE+ITJn{RD(^h&hRQp8g$a<40xlPp*Ds{@f#w+I@HRNK`+7@R? zrSito&82r1@^%X|BkdMq1{hZ4KBMNMwqovtuIs{RTR@Ll1MWC+ibtl;O_|X(VtL9p zvr5Z7rplL=sfbx&C$#m`QjE14 Ydz6eNgF76O859#o3LzmXj}Pj-nzDBa5*4v*8SIcQ<#$e_kaE8EEA zUYv^ximeICgNW}MRe%nP9FqJyvVsEssZRxai%l7 ID{%07 z93!fb&;}jx0FDIF1w8v(L}Z`?0pN1_ed&G&_OLH)NxRd-j@$8}{*8Q>Ckq#@? x*qiTmahfZP(@WD(0N!PkADS1D*1+(wrM*__TVCYG6-)}O z?sJ`#UCuf~;{|DvnBff^i#0rrkDyBF4V-~_y&H}g &GtBXV%aZ!1veOiYinC9yWG=)tmnb9eN5s=5nKYFEi#$aGfbn wNKh?*9k##&-KIUd zl97r2sAJH@yu0pUaPlxXDH8oxH8}Z^pgNc?BK%0q90r`oqC{qoM7t|8_=zkiT8NH| zoKgQg2?rMtBRXJ}4DQ4_WqhDi!py|!C3!5-q~sFP2==D1u)=hCN()?xFjHPfqY?hp z^b%CF(*maC2|n6#5Rpo8oU(DKsZ`~sk1=`~Dg+S0H lYd`sn`lh@SR;4yyD(noSMADJb;sUv0y-rM8wA4oAZ^;CaGDL~3 zf_6#=a9A$aJ#;l*pm2G@d ZXqay?pzzH0~c65d#X-KH6 zn%x`@Uj_=@>~0R5WV2iBrU+&*uufN 53tasxw~A@UD0#V!Mcp1&3Es*8562X{`S) zd58rSfh9GG?F4CTh*5AVvqW_qasqda)h<)MGN6xRILJQ(T|soQ5(a#|im{4cb;eMr z$pI=0Vt~{@@w^`ctw`G}^e7YO7)S^2TN#ts^DgnU?8#Y>3>sQvoNs-`xf*3|OHmkF z%27OS=(@TXP&6yT5Q{eEYXMvYG3bKfVfj2B46{z ?>lY5|rNio=x$|gi?fS>Cj>sIdqM<;?3^vMsO(=ZNHIk!Pumu01g zyR@2Q3Y>`q021ebrOD7Yvk$SLlO@q{7+|WV?3h%-YN|CSqzPq#{)sbgP2rzQbUYw{ z9b;LcPBF0O{Fxj_?d}1P9H1GFfMGp&q7aIV7}OTTiOw6Yy!O=5LPOX~6oCAFO_gS4 zcxx$6kG%||0OeZ45M)(Ax^CtzY!XiE0xBFBAoRp5!fcH2&8fSiVR$==(hfS3@c$7+ zNsipskMTRSW=ex=qZ$4_-@sEY7%wCER0V80VAWLk+#QloX!0zu*Pn$Akn=*C =1N|KgQLxNXT;L>&bs3SCwUrbH$gr%&I} zO$I4u1jPe!Q+uKKheheC0r}bm_*O2RP) S;`;kNfd+I(tJ`l}L+lvw7#W60V {hYd |Jq*|J>9yowsI90RVMyfSXdZLcJ)c!o`I{ z!jN7y)k>xnjIP)$XdcR^OQHilun~IuvFLv`?y19Gc>6qw0RyjTcKz+UA3vBsc=y)) z`o|C6z5CIN_g|VlfB+Wrj7`ENz5YRF4Tf~?4%3Y0=0Tn}E |M=_w;h#eS!1T!p0)LSp@Xbr+|6j5I;5+~J`Ty{T zR175bmBdtpTp1~4<7qoUuJ4)}8`-W3tphE?U$2Kb-Rrdk!&<5oKP1eEh8g iK 3yJDK==~x z-%k*C(T%Qe+{-46mt`|IHr{Df5Mj-ngbrZXOC-`##0dM9=UG;Ugu)_A9bR&%q6JV^ zNv8{0dfJt5JyC1>bg{pnZQkYigB4}BsI^STc;j`ZW0 !$#)~f&bul@De zr9ZeHEV^;i`C>Q%N@2ZEM |tssIUwZMn(Zb zP=Vc({Xmm0T$U({CT|~G)XZ(B*%Nvfm&a*Jl^j+XI`-406z68@Evc&}v}u8dMOZ3j zC?+I!Fz$rCSir8MVKoZ;(`|k?K0EN@Zn?h4O)EaWKa5cbJb?yaNYjV~k` fWg_cmbVqbQz@s zH;wzz={Av1bM;uVj#+#n`SWyMA EA(5sc7J1)ih3gH)mlrvAcG*M6&;|Bh&L zr0m@8K}VEWkb_f%M-3=$T8hY*4)<#`CxzSFLgg6<^8tMG XMdLj zv%h}x)(5v9+?s!S_v4S|_uu{YgE!}&y!)v?^3&aqKe#!6@X_`A@6PYsz5if-_nms~ z-n(}n+`aF*D8uw7s3`vTP0@ev9>bpxp5P*$eV|`37GgK!=-mw3txU3UKr#sY#v8xh z3|O0UFeAO7kGVzLsAlVEddJd S<(>4k5u14hz6l9^c6va+TUG9Z!#Ig@ zfqKg!RhDI;{P5IlCQ)dq;(MPK1k#ggWoywBgx<;gVjjb y^#DafYV1Q~iYhh1Zm}VUR zfB3NX6AB$-IzrUpIVqxJDSA5y!hoYHhqC=lm SAnKtP zM|$2eY@=8Bb9%eLu_;r)Mz9^0ph!M>3>S7_O@9>;^6vMX+W{l0-ohB1)h0`JWx>v9 zt$;w0*1&)5jW;@(L1FYM@((0 +D0G zff!vRQ}diiA>4aGm!2Xo~_fC_!3!Uo>;?LPP0H$WkK#^4BSof*=R z(|a?gP%q%Cei1(a30CXV3n&goKaiXYG{~Mb>O%>-7qTfFER@B?Z1v|hts^%NC8dWo z-vV+tZPHRBNZK6=xmC2&K+-ik{`NmKgaApar)Bk~SuYev<<$|)_*i$$!?2N)_0 |rXd;ko3Eq`?% zYGR;Chjz0(WeTNio|6GS9Q!R33Qu==ck06ge!klNUkgJW0IC1~rISm)^2fh)@=FJQ zk<74ZFB1eN2uu+83kU)G|NSBD|LhMj_5aheZ&({w(=XQl@4tHCZ_Y0L)3^SC_SZMk zz1AkVEBr@4L_x-F-}QrAZ4?zI9L@IDHYb)yO*}1gCxI_VjYQo=Oh#*Ju9jpj4aTa$ z_)^)sTAs)R>T<#q70>EVZ}iWUX@kP c}gK*|y zT%nXYhl |9dE)dxn8@N^5~x85bSfR57xKXzb8NN@dW?F1tXs^<>ac>j zMGSDA$L+rpQ7jX~9rxhek{)w7P4*7YhKH)6^O1er)W}*BI?NVrxB<3V57%Pl`uQAD zt7mqSTyFP`Cxee~pFDmOOGGnO%MH9x#Ut>c;YX=T>_kQm9PgsKl>%G9Sbz7$G}X`n zG^@BtppFLia7mNR?U&v%ycG2v{Vpj}Ttu3%k@c*PuN{lK+OgFqW_hAr)^Yf!SKnxX zb(?9}4{kuF4Az`qeTDsgPRWG^CI`7=vjLIfGMA9pQC4|{zx|A3BnZ~cNMSH~I_e}Q z7!jxPgYxGfB)); HuwU8XIG)c#= Hv(*4|Xrl?=i?>^YZ+C8mlwd_dWjk8}tAC@hKzZ zalw+Y{c2pWfXLBDY_7L2>;&9b!y}t|h*#s8y>k7=o%t)TQ9u$u?QJvmdnHe%Z9-KV zcx?L_R^T>Y{2e Fw>koB9&JCm_VV*obkhdTx7}K`K3_izw*}}$ l6X*cdHfm-k1bMhwWfHQ^PNHZks!qHD(i+i$k= zu)mjRB6AHl$U?hz?aixK-@N)g9(woshd+Gx`t4q+_uBbNy o9aVoOGfFIzwe$OgP&OLbEmlxIf2$IVr4G?Q{ngmjP3*%jLv zM&;tJH_yog6f!!;_~-Xubtng8y*bj^DbbV{OAx*C{o&V{(Mky ;Ba;GHGDJc4*-b^r$y}GdKyl~%IuXNgDXMUgjvRb7u@=) ze2FwyJUxhSdmshdsXcr5lw2-CNM@#P;X|!}1wIZ%RBtRqx84Cr0ZePob %JL&!2v2AG2RIbtP^1SvONd;$fjv4t^96((K)MT8HQKt(y2rNud3 !-@P=< zmHcZX4{0_BiU(zD$+hr{K*tr2>*| QP;z$C*tMUsAH@AQjP zh8+=VJA >%BOUPi3D1y!tfx6;8+wapsvx2abHw>ifn^ z^1`}HRbFB(rmWf;E}DkXg8GtQ@%H#85!@Zf2sI%$$WBoXqZ4Msbl8Qj@nYJZ+5Z|& z#(Ivrg0h4^6i7mjsxfCoWIp%3`QhS8H7M*aGai$+c&q;13i7cpwIJ$D`B#e5vm_73 z;|-`rs{<5VkZofy0a|jEX1)e F6>?$8_WfMC?0_}6} zqTOOYn4n~a7{~Vm-Ni@$-r#?xO^$Xh{j5JyzE)oa&I(EGjP)Yx1oQ1fnh7c?tBQU2 zQnnT%s6;rakmryLDx$!I jy4IBh)D&n@zwBNah`#fYhM z;QqGE;yz0}I`a)xGCX!S8V 3(zj!a42Xf28Gi((G257zNEamLGWO6{=!Ejb0TL|y~q{Y70pRQV7!QIXwY2| z8d2VvMSP>@B)s?`ODAQS){R$Dqpz(e#EwFrv5tEmQ1qQOZYNmdnFUb+bF5C@2 $7!mI0>f#kLj%QM^p%Om>; zl#NYfU*t-WfH$ahXP3UjA3Dj9nvgQxFx442Mf}{Nq9a>hudRDcMRWqcO!_Bd@C^Ju zSwb?-Yg2Qz#Q~TzOW-ysKiv}%Gn*(>Y+bBBwF?j*-Ln8=1IDnZR{lOKuz>7;lwbGM zckXrc7hu+jwP5xpqYZ{`z#W|2RORIi1%CAlg@YI0@XPzCWK;s)D6i@Ed3Z3R&n~w? zS3ClHYNQ=m4Ezo4GD7Y~y!O`wOO#$uk0XmE(Df1e;hx#PIGB|HO+VOI?SA$P?H=?T z@4i}KS0wb|a>jf?u1 ^oqa6lbA?DsXX?}x27=40nQ8V$#g*8OSqsrsGJR6; z{hNn2F;MP{&KV4=**GF-eSd~7+4RF!^U*|gnZmU@_G4an)2P}Vb}|Bu&9+doj ->N`Zn*C0E`4$c$Q4=P86mOGuF$#m+5OPL9xoreniCVoyuHdqCtzYi)cc5qPT zVrFYj(V5+!o>R;`;h%=joj;f?Yj-t^Or$sMHg*`AIY}%!>H=FmZ(d9++ij;O`BPF< z`lw8ilyLdXJ_tH`QJ3MPh#FZq$OVG++&`4MygE>v*x=InEqdvaya5HbFJ%IU|L7?^ z#n4LNhBtwGe7j~VbEEePOJ;XU5Fo{b&f9(P+;!~nGsH7}sNoYW&BtyT>K%MVLp#}K zYU+nfy~g=!!s75=Vc+ww?U|<|+|P0P{>ZE?SUS+3^#W%lsOIzTD5N3%9=uys$MG0P z$>V=|WDj lZc*M_Zm$!jRpagS 0G!1nYC%m!1I?beeE9{ zeS3E4r@#8s-$VU>-vq5eglukZ@{Kl3JLBDGUw?{2V>5$5U_vI}<`2EBZwCOoWyoab zu?aHsjkSq$lU?r}9z|SscRCgmznovg8EJm-F|mUOv@~A*|1Yq>ERLQse$F=2R~3vb zRCzQwfglL VE6XA27>m=Q^3dO9U1-3f@OI zdO+eKef@9;+(I#&{}B0w-@M%**W_da@@%8mwB|Y2UblA~qV7yU*iPr_Yt>I@e)Za$ zFH_;YKfibLK@wn3_jczu97M+`g8Di am6gDn5`
Bml-JYKhV z^)DLxEP(#C yR~s93k@EQl#0$5OUH-fa=sy42x}dHZf{f)uEw@Pv0XjXe z=4aPK)lJYQgf|$4 %VJk N`q?wAo&yta zr6%Q+EhFLK{{2@P!2sne$!n~`jli3ga^B59Jo(kxrT_NtetG(xZ+*EU=+ql$?qPA` zhMQeCsk){Icki(ZIqs%C!k{{>sQ@KCR|Eu{rZY1y*OBOC1f#hT3!qJ#wdd# KTo}XUR&;CsRjSNxDIl-7jnwP?Jgg1U!|^yqV9j zUoIng+ZqZQ){TCW=%3sI`9LBPdUjx%oq<8Y;0qqZxQ5RvbK87wT)M~usH0-=B-F&+ z9;T (8{2;qVB4fZCP2B>? z%aRX& C!1!F2-*6{H^P;TDMEV6Q{9h2$!MW8#5j!M?cw#*3W(INH~c7g zp;C05YMm+){$SU{KB2Url1FUUiMA6f6<)WM@Yjp^ran?Zu4_O6%J5###^v+nyplw0 zf@+!&{=SB)0k8woy7GitWqfK4ja`qtq*O!k&lLTj2(2h}cM>3gE+xxPtjz|%10`6q z)v#w+mS0mD@;SZ;L?M3_X;zF7VJ)1Ibx(39PYV`;|GFZ2_ET)yhPsay<_YlHf@c-U zGB_}d(O>?~MaD=T9CzC5`g(}$FeuO~S)KNlmcVt4>6|;OLl({+=FX|+;0(T$;LSGL zQV%=3TDGCfHrpHPk)5Q=U(R>HndBctlMf&yJ2W(kz{r(|p|#$yf{uG*;U16S;qng& zW7Q%`ACQ9;n9O@yG-R{s3ZhwpC~@d=J!L>Ro;WYXI&+p_(9G4K;4)6yhp3J1xFS=0MI#1YGl}t_Ua{>$>(gAF#Ji(uSYk zSXPR2mHz)8;zOumPTmn&CS3iCI9(}6c$1iqB8~i_%XDxcgmd*8v1AlT0y;@jdc8Rd z?;a?)<{#`bgd3*K^8Ay4$l2yd;*12&K$b{Pk35totcQ$)4b}SlSvJT=Z?{XsdKe7? z7>l7QQceE Whp)g zWs2f-sjzIRdae-3-o |4=g8}HxdUP*PsLK*sYvP)s^>I%uOPcTGj@T1Fa zwL#9o#_JoZt^BfXI%8k!rZ |7o*{v65m;U>21cA>61b+D!Mc}tFONbN^q!!BE2d*_l`ptofHb5F* z_+X=QEm5t@rs!8zN6H+$LX=888EoFzT9s RVT-YMTroFsFHCDF XD(s}HHAF;6iCAihq%!P{oGl27MGk9T1Qu~g|TP^7u9ua=eggZ(7r4#3V? z?7L+lVVyAX0@GT}J!|KO-WinPA}75bm;IxvH_J{|V#e7zd_psQH^EcPTgQNnnuM*5 zdqE>rZ$X{YFA>nCg&dq9raB*{`-E)=YX#UB;Nd=4t+)}8BbbosnCqL#>(P!)g-=+g zBJ{D6CFxT<7WxHpgl^TI;1@aYcA5#I<)(pM$dpQvM2WC29_o5n&`p!ax$;M+txsl| za&7b7a3?NjMsWiIpwgJ)Mf7jL&uI?IW{2^049Mv%|L;6cj|Rmo%|11O1N_0H!M@SB zqQ40Cb &+*!_bW!S i=!t}M~uVisDr9}Tc-!&m0R$Bs6iuvJyMR}z~7&{KItDjv?6ko z`9itTz(B{!>I*;wZU3P1F)GcS=8g7Oz|e=7*$)%KAA5K{jORB%@UDx<=s;*F9^|m~ zA#~j-wsxq$Dfmgt#5kaM5Z0kzafBG%vX0Yl`G}3_ou(^}4vcIg$-Ctc3jc%EN%O20 zKqTk5=Itt`!0ohL03aZyPast56hHd@8$WKoiH6WsvhuKn^2MJ-BtaW;-@-P^=+B*3 z=O4cjX5=~QeVi6}Ul*2cbj#n@I4bv4`>05+!EY|K(L!n-`W41kqvKH>DCd?W&bwY% zioe)fO1O+XnYqexOB7$? )l=?}(1`R6RX*O~nz>3t7=VEnByZ=g1yQ1e=FlAp!5 z|CILs*S~gpY4-MC`Ilci{o2uAz-rrn-?sG4OMm!lzk#p+)r>j$EofHcw{}AQ3?6&Q z@18E6E_ZSJ-<$uvrr}k<_454XSKqw)#=Sd?gSVAPJve_b%pu3K_Q45iFvP5OQaOx} zo$g~bS-94yC$!=Ywi0(8o^86qEXYU-gW5|oE8?7{x}uP*<5g^M=~Lw!DX*WA5EOFp zmX8@wYI)XL43CzlL`-C+Z!dR0^Ebwak&JD4Isz%ImAVEb7LJi&K$E|32_JUYQI)`V zX`EEgBSj;6jT;PhI3h+$&DTneksK KGA!SkKhrkK3apW?HII=qIiF==NOjR@YnqW>O18nI-I@MjRY*Bi6uzS3JJOg}W zT28xG Gj3q7tkHMQDDfdDf-@Ezn>o1K^I29CE<>0PS~w zx1E4rQ)A(x&3jeZ+GIo%^xvj492%y1DoB;nla*Fdec`*`tq3|?9=#E5fSfS1zeq|r z-6JP#dmBmqyTAJ&LL`b(#VIh%oDvtcm2XE4*5u#=LyA6){3}oBoZq}!wQPR(yF)b_ z0T{8=_*LY$Df2{EP%dveV7$s4BVJ9GR5r9W-N&awOGCCg>;tzu =dNygmPv%G*R&%TacGS~(Sdh81dG zZXx-^!8r4INM mMTSWqc5EYRQz!JbG!W+#Xi_Ze=>e67J(}Kho;mjp5!u#wA=*; zI9*)^7yHi1*w~!EZq5~#HsGc=Um0Y5YTWIEM~9RRyu3NoyN;v8I}3_{PFAF5CQR%V z+irJt1!RH&Z|odyGzPrE7B(J-8C+>;l;+J|dF{3Dzxus5UiseU*8b|1tApJ=8t3~7 zN%tJ7kzu1jdEq%aJV$h6mwa$<1+1i`)#g9?&adMndgV);L_hs2Rv;TAl~)C90B=aK z=We4*4iAv5odVd(A@J8*H1SfePka+i(cGCB9_vydkS-ZYB%q}Xp+6O@FvLTyb3&lf zp>qo%D7W*-STpgh{?DR0@i % Pt+^4X2UM{ywm)a~UJT8l#$srEgGfMz8ODGn=%vEqeU0()l!rO{*1 z+;fjI#?HIXeRcB>e(-CvOMmp6UtY(R`HkzCjH)n^Cxjv&3iGrxB@ktQ+f*3cBq&Eq zad Y|?I*LJ0%OZON|7Kz>H0wCn`2yB+-$AoP+_0|MDDRz`YmKe|b3!~MDdWX= z@87xc5}-Hl4orA>O0t9xEatyPO@A*KCTufWst_V_3-Oge-_3mU@oD&wt$HilzFeb} z jm_U27()?Zadou zP=ASS%1z 7W46dgt^r+6Bzt+dY7h=X}1yE}k5p9-Zh7dPE7x0w%MV zf4De^K6@TT2W{K}9x2k|=P^dUG9aX9GK4LDsIB009`psEB$(jJrN3H47AYP8ky;#W zVUXhGt_idi`0J!MRnMq6bf;e&Y-BV{^Q_`+nt$*c@3(ZsG8SsfL28Ik@s-{J5`z8_ zE7^kVXdzB1Fl|sbRU}i#aX>_}*5ZucQ=F;tqtveo9I_GlwQ}BE8nio{>X3_P=L$}n z`?G)nj|9hxo!l{B5nQ^5QyjwwYAFyrUhLXR)2DC*P&>+hZ=CItulUdX3Suq(llcSb zOLV<|=k|^KHD~0rUXRdQjN1~jH91SZf#U;=w#5*LoEjERb2EI-Px?L`FLkEPKl+WE zqNg7loC{{D;Q`&Eq=jZcWWz6?P>{q2u0#Xrn%)(N94H)T1i)eg)UXk!>~o{B&keKN z=-hGT`F{UTf-Gnt!ctZhf@V_!Ys||#mrMTt*Z%S=m-x@ae>aBqKR%lM@_+sG2lmSP z&A0D D!N`d>gKfG~ke)WylX+?7F3o<4@xPJdW_w>=N8@KP> zqTB9`yC2-V_2K;P^#}7Ge)RF3w?FWgue?n9v&I8Xr|q<@q=7G2aWW^xeRjXQuSK@s zS)%`0yKu0YRZ=n7Ee0Nv?X!&v3Tr{D2#2)EX(*=BY_OzB;K0<}oKd|hF%oq<0z)0Z zLjEVe81#@M;{5YNDjno7l|&^==38D0_}e#%`xc%Mh0)XjZSZL6WCQq~s)G#RM{h%R zH)urgV}5vtb0n?2&8%V61PGpMHku#-Va;*ja$aQZt@{t=Z{K?7?nk$fvh(*o{t$)X z>Kn7yuU)%J!pfVket$N*r<0ETTf0F+0}`uL7mdTkwacF#)-|n!DBlN1aWLIVHAhU; zzfFgClD>w=whlK>pZMfcta(;WD&0_$M~yHl`0Q=UV`C=V-#R>jr-%KS>_n<^8sU$T zV{!84?CnzH+OOl}pt2zBLFY35@sBWxFV8=~Xtnb}{V)B0j&YgZzj61$2iHHmd3k>4 zgR58PuigJ>b0$$fcjvPoy#pdVq{REj^B+BcSWf``ho|& 2k!;P0z zp+eO%{CDqtcXsK2{?f#%4Ax~F}CPbMJ8 >d&bnVzAapEvUA?7 e&LDBlEEhzjBQ8<=sl}vM#%JoLOH#EFjcfC6SR0s41dfJvo0YG#t&(&&+NQk z5Fb({hBb?BLwvAsTjjqptoeivCg{b=C+<7sP#G7MSv dx&SR#EY k-d~0x!ze0LtF8)UvznVr>>M;ShrOM! z;L45+h!y$@!fL|=2-~k}$I;L)qypIB0&c-_BB(lz3@)7A$GJ{}sKxR{z`@)~jz60M zbCPC5f_%I@d3MO_eH64!F7pq_18D5B(Q@a#(0pgNAqLKBQ;w8DumMY%@oPX^xyVjh zk`YK$ 2i%GA??YhPdPLYlyjeiW(&Si(G01DLtzNU|I53!@6%nn*W z+lnp6Qu2%V%^`GF<2TwC-`uPu$MyzaUTe^qF<%L#XMzo|Rx`qRYZ&vKp0eLq(V zLf{`QZY&1DG_ax)W18#=HwH3f3 sa3guzz(Sk@o795*{5?pG`PK&wtrg3dN!ZJJgUU(jV&4G*J6y*7_ zs@=m304T{fz>{4RWewZGgPn_^&P2f$HXAg_8rrm_At+<|KtU4`qSNq<;n&J%c#-|o zZHFp3ShBU^nUaj#WCpfOqr23QoD#kc3DowvcV@*LGsrbi(eY10(E7p|vja{woaB{# zo$}l{ntG=dUnFqEbYE_ztP?`&k%1k}c@gU-=^sUr8ZeZkJS|?#SSqZB{ujH2Y%IR0 z@H1gaa+qk*(P)PIcQITDy|_nU`z!Wo=bEVRwf}A6`k?~1r91>T;bZ6kMDd`S^~9<8 zB{V` mQQO Z84?WD)4!eIm{Ja}YrbSFdM8lF@jKqMfqE7mxr9;c$ ^9DYF=BKHZuP)EhXqP9v>LGz*^_2dM#BlIVkq 88Ng`}$fwdO4dd7hhFH#||8ar@djqEc({zOn zt@WJ~tu~23Qy#1m5yt41m61DK2@(sfFbU8;RA=;HE2-?GEHjYHEdqbo#CMR^LB8eQ zY8j>7565{kqSE-uR=eaYL%4;E2+rYtkWE9 ff1x?HAo99z#!HK z4KUAL=qK*}-vO{jH(YE7XP_t=?X@u!w$`aqdn`dXoAn7&yyGTEL|3l;d;1Vke?!;U z2wQOaJ>WGk9$Nx%0qgjwvsTAaxh36Fxt{nfNn#1p1b8Sny+pjEg^X6xS)8!hBXt^y zN|hWg)VaMyk*-;I1ICn^(O%_7h`6B(y>Pur`&?skL<+~$!(v_M$nAL-bk{+f(g5}_ zRgmsnEc(BZ3lPxohrI3l0SEiSUmNvVN^9qC`~iPicU?lsh!RVlMnXg!sOu&GeDJ!i zn>5I*>4H$Y$@8~U-({~}*?@d-N+8sRD>smdzBH`LAqL<`LLXxcS+__!%Q*>xUqB_; zvU=`E21}qB4#UHc6o LR{@5Z zPSD>h_q9r0@eF!Y;CxTOpIwmwq+FHVJ%j( zB@p?1w| &xeIOZ-Q02SF*uSzsVYtLz4S2sHt_@~(b!*f|E6PR=vCgFL7N zIebvC5(t4a=*JAw ;l^IgqyOA4 zH~jnjk=@UT3>#M}%qto!FFrB?CkK4bm}{LfM^nHRzaxDT&RY2m5?!vcXI|FfF(cIA zQQf*a2bZp1ly0msca4p{D8E8blN&}!cV`pB--xO3MfM|-M?-e@0AV|WPb}h^`EXYO zyt$|7cae7Kj2k`*B|iZ~W1-}ViXyJ*{?=oZ@W-*o#;R&z9q^`kg2NSgC5A26R^qAW z8YNwky>P)!qQ@1lAIdK@9UMPMg$dyr3ZJoQ6|9rP5<8B{4M&VjY5AP2%b|jj!~@Qn zXqUzhccL+_1#~=kbgAq~o5DF$t?{WHH%5$P<3NQIjTg)G($)%*L%^2r!8%@e0Bper zIxhes{w-uK&tH&5)^^Igl+&F@IC#m3M8`)TAA56t#~x}IcNX^RSZU+8(NQ2V{@t7p zVOVR5ZtVKp^W}Y{tV{91Ze@s2-(W(E^X+U)wY`V{%Lmnq=*4{f{`Jjs&2GY#(3;Q_ zDubZ))K8DXH?CZL`O4KduF|dW>i4d`{OUEw2V8q?2=t9I#jbyN{}V#-+W#;B)iC0P zEeR|9M5`ypXIyNOGFk+89@$&UTJjZdAPH43Z1xqiM@-||=I`Kr%LIkpW25{P9S{kW zg4Uh#;C=*CT2`f@Yki9gzl&<9IV<{ 3cKOBQ_4CZX@;pR^O(T?V6Ueod ziNRd*WRHo+bOp)1^b?IdzA(5M((VLbt1K#scr2vh8Z!V2B^#?U>|8=)jqbBiQs_op zZ*17&n(j%|y{bIDeJ3VJdJ|LQWfpL&Zw#2Z6i7W|9$c}1A!ZT3n7w!FW+wl3cthtd znKDe0mF)I7zfQANI+l{dTGEW8zXunJu$`%ao6#kW^+x3VR>#TXTm;kD&BG4oQIX?* zXL2D1Pw0cdQ;7`)b~XxtVJGP#(Y(+lilNY>@A~OBUBN}soil0q9!v_3kCFa>a$$VE zt${NOureuVMBXb_i(BX+jGhC6c;5Ex`u^f495Oj 8r zqS`>k9=JhPCXg*z;f^YApGEeGUoifN+h_0v{sW-P{kysW^16xv3urVI+hI(~awD^1 zg8;)}KR5Trv9quN`j&U!e^>z{6SSV|d&;i?sRxjB>K(XAP%Xc$TfS@q&7eqOGB+e9 zla#YbW?DLRHjXjl;L73*lWXU0_k*A$X+UAzcOxWgJ2G4}CVpWz^d8k|C?>88qESi3 znkvc#+(re{3B5HB6xM>a`zw(TQ4BJBK=D@2NzI$E&Z_*N;XfxOJ>-EmGQ#-onJXB$ zp`dyz }o~mHsl;O&PrXpE4TIcXRIBE>G z(_=~9J&iE&a0V_xUzs|08Wgz)FuTg4m$JN}QH8 z{| (F>I`@~{9X9;cm&SJAhT=7T9_$%Rt zDSZ&5yr4bHTJOoKKeC4aD}A(io26{?`&1PO5O>R@ftuZop$4G3hSY%H#UA|{@Ymaj z%FWJiDPBDr^rh+JD)ws6ZN!$ek7b$7-d*rjib+YazQU@jLt-ieOnN#!o_(||a>u28 z9)TLReI)|1Z*4R$_dHD4?G|E 33u{3Fa^wm0y;!a&(4e=76?Jh#t}aVn<$Tx469>5+wSY)CG0f7aSb zNQ+szGrdR@OVU0&e8?XF5#N xtfBfkJz%TmF=U^fh_h{pdF}>lbM_urW?pBiOD0$ zB)gwRb5x~TbDQ@?OcZYWRKyHGeQ=GvC5*Pou^}~3W`XW-ic!^048Q6;rK)@Ae?q Q}o{ueIn+UN8P|k13k1QVstEZx_xLa`K#~3f`Tn>)R zjyuLQ1HrJ!wsfuQfMevAgwC_y>?zgow=P(s(+cI8&`v{RD4!%N)Gnc}S`n6a&O~qA z@^GEtZ<4L1`L$QCplQau+#pI>Q)M?|MQm`Z`$rouzxw*iufH-f*+&Th&1AQTfSb^Z zY15$S#T#m{?0SRbN$}y|> Oa<|67>TS2G#KfNLQe^l}!K`@`#ZLvP*RvG#9Z zcI>Y(S4FD}=*LzZ8r51bzC%YUl$`@B30NzY%I8q61=!#oqyZ(D^O!L;(f_S}+D%(6 z1n<(Bm?29sJKRJbIv_W$EoVpPbl+Xo4u-c3H0YCnmo4ZM>Od#y+1&@