From 500cb26365d84c3b7c28ffdf28983075b1314c67 Mon Sep 17 00:00:00 2001
From: lishuang <573230334@qq.com>
Date: Thu, 1 Jun 2023 14:30:09 +0800
Subject: [PATCH] =?UTF-8?q?police=5Fid,event=5Ftype=E6=94=AF=E6=8C=81?=
=?UTF-8?q?=E6=A8=A1=E7=B3=8A=E6=9F=A5=E8=AF=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
TP_PROJECT/TP/settings.py | 1 +
TP_PROJECT/TP后台接口文档.md | 221 ++++++++++++++---------------
TP_PROJECT/app/serializers.py | 23 +++
TP_PROJECT/app/views.py | 7 +-
TP_PROJECT/db.sqlite3 | Bin 163840 -> 163840 bytes
5 files changed, 133 insertions(+), 119 deletions(-)
diff --git a/TP_PROJECT/TP/settings.py b/TP_PROJECT/TP/settings.py
index 0cd1162..4d10e52 100644
--- a/TP_PROJECT/TP/settings.py
+++ b/TP_PROJECT/TP/settings.py
@@ -157,4 +157,5 @@ DATETIME_FORMAT = 'Y-m-d H:M:S'
REST_FRAMEWORK = {
'DATETIME_FORMAT': "%Y-%m-%d %H:%M:%S",
'DATE_FORMAT': "%Y-%m-%d",
+ 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}
\ No newline at end of file
diff --git a/TP_PROJECT/TP后台接口文档.md b/TP_PROJECT/TP后台接口文档.md
index e92835f..86108be 100644
--- a/TP_PROJECT/TP后台接口文档.md
+++ b/TP_PROJECT/TP后台接口文档.md
@@ -29,28 +29,28 @@
- 返回值:
- | 参数名 | 参数值 | 参数类型 | 描述说明 |
- | ------------- | ------------------------------------------------- | -------- | ------------ |
- | uid | 1 | int | 自增 |
- | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
- | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
- | police_id | 00000001 | string | 警号 |
- | event_type | 1 | string | 事件类型 |
- | is_violation | true | bool | 是否违规 |
- | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
- | relative_time | 4.0 | float | 相对时间 |
- | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
- | car_number | 苏a045689 | string | 车牌号 |
- | ai_analysis | 违规 | string | 分析结果 |
- | add_time | 2023-05-31 18:42:15 | string | 记录添加时间 |
- | update_time | 2023-05-31 18:42:15 | string | 记录更新时间 |
- | is_display | true | bool | 是否展示 |
+ | 参数名 | 参数值 | 参数类型 | 描述说明 |
+ | ------------- | ------------------------------------------------- | -------- | ------------------------ |
+ | uid | 1 | int | 自增 |
+ | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
+ | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
+ | police_id | 00000001 | string | 警号 |
+ | event_type | 1 | string | 事件类型 |
+ | is_violation | true | bool | 是否违规 |
+ | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
+ | relative_time | 4.0 | float | 相对时间 |
+ | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
+ | car_number | 苏a045689 | string | 车牌号 |
+ | ai_analysis | 违规 | string | 分析结果 |
+ | add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
+ | update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
+ | is_display | true | bool | 是否展示(自动添加) |
-- 结果示例:
- 
-
+
+
+
查询所有
@@ -67,25 +67,26 @@
- 返回值
- | 参数名 | 参数值 | 参数类型 | 描述说明 |
- | ------------- | ------------------------------------------------- | -------- | ------------ |
- | uid | 1 | int | 自增 |
- | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
- | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
- | police_id | 00000001 | string | 警号 |
- | event_type | 1 | string | 事件类型 |
- | is_violation | true | bool | 是否违规 |
- | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
- | relative_time | 4.0 | float | 相对时间 |
- | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
- | car_number | 苏a045689 | string | 车牌号 |
- | ai_analysis | 违规 | string | 分析结果 |
- | add_time | 2023-05-31 18:42:15 | string | 记录添加时间 |
- | update_time | 2023-05-31 18:42:15 | string | 记录更新时间 |
- | is_display | true | bool | 是否展示 |
-
-- 结果示例:
-
+ | 参数名 | 参数值 | 参数类型 | 描述说明 |
+ | ------------- | ------------------------------------------------- | -------- | ------------------------ |
+ | uid | 1 | int | 自增 |
+ | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
+ | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
+ | police_id | 00000001 | string | 警号 |
+ | event_type | 1 | string | 事件类型 |
+ | is_violation | true | bool | 是否违规 |
+ | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
+ | relative_time | 4.0 | float | 相对时间 |
+ | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
+ | car_number | 苏a045689 | string | 车牌号 |
+ | ai_analysis | 违规 | string | 分析结果 |
+ | add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
+ | update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
+ | is_display | true | bool | 是否展示(自动添加) |
+
+
+
+
新增数据
@@ -106,16 +107,13 @@
"relative_time": 4,
"video_dir": "/d/test",
"car_number": "苏a045689",
- "ai_analysis": "违规",
- "add_time": "2023-05-26T13:09:03",
- "update_time": "2023-05-26T13:09:01",
- "is_display": true
+ "ai_analysis": "违规"
}
```
-
+
| 参数名 | 参数值 | 是否必填 | 参数类型 | 描述说明 |
| ------------- | ------------------- | -------- | -------- | ---------- |
- | video_hash | vbhdrbvcw | 是 | string | 视频哈希 |
+| video_hash | vbhdrbvcw | 是 | string | 视频哈希 |
| record_time | 2023-05-26T13:09:05 | 是 | datetime | 记录仪时间 |
| police_id | 00000002 | 是 | string | 警号 |
| event_type | 1 | 是 | int | 事件类型 |
@@ -125,31 +123,29 @@
| video_dir | /d/test | 是 | string | 视频路径 |
| car_number | 苏a045689 | 是 | string | 车牌号 |
| ai_analysis | 违规 | 是 | string | 分析结果 |
- | add_time | 2023-05-26T13:09:03 | 是 | datetime | 添加时间 |
- | update_time | 2023-05-26T13:09:03 | 是 | datetime | 更新时间 |
- | is_display | true | 是 | bool | 是否展示 |
-
+
- 返回值
- | 参数名 | 参数值 | 参数类型 | 描述说明 |
- | ------------- | ------------------------------------------------- | -------- | ------------ |
- | uid | 1 | int | 自增 |
- | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
- | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
- | police_id | 00000001 | string | 警号 |
- | event_type | 1 | string | 事件类型 |
- | is_violation | true | bool | 是否违规 |
- | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
- | relative_time | 4.0 | float | 相对时间 |
- | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
- | car_number | 苏a045689 | string | 车牌号 |
- | ai_analysis | 违规 | string | 分析结果 |
- | add_time | 2023-05-31 18:42:15 | string | 记录添加时间 |
- | update_time | 2023-05-31 18:42:15 | string | 记录更新时间 |
- | is_display | true | bool | 是否展示 |
-
-- 结果示例:
-
+ | 参数名 | 参数值 | 参数类型 | 描述说明 |
+ | ------------- | ------------------------------------------------- | -------- | ------------------------ |
+ | uid | 1 | int | 自增 |
+ | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
+ | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
+ | police_id | 00000001 | string | 警号 |
+ | event_type | 1 | string | 事件类型 |
+ | is_violation | true | bool | 是否违规 |
+ | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
+ | relative_time | 4.0 | float | 相对时间 |
+ | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
+ | car_number | 苏a045689 | string | 车牌号 |
+ | ai_analysis | 违规 | string | 分析结果 |
+ | add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
+ | update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
+ | is_display | true | bool | 是否展示(自动添加) |
+
+
+
+
修改数据
@@ -170,16 +166,13 @@
"relative_time": 4,
"video_dir": "/d/test",
"car_number": "苏a045689",
- "ai_analysis": "违规",
- "add_time": "2023-05-26T13:09:03",
- "update_time": "2023-05-26T13:09:01",
- "is_display": true
+ "ai_analysis": "违规"
}
```
-
+
| 参数名 | 参数值 | 是否必填 | 参数类型 | 描述说明 |
| ------------- | ------------------- | -------- | -------- | ---------- |
- | video_hash | vbhdrbvcw | 是 | string | 视频哈希 |
+| video_hash | vbhdrbvcw | 是 | string | 视频哈希 |
| record_time | 2023-05-26T13:09:05 | 是 | datetime | 记录仪时间 |
| police_id | 00000002 | 是 | string | 警号 |
| event_type | 1 | 是 | int | 事件类型 |
@@ -189,33 +182,31 @@
| video_dir | /d/test | 是 | string | 视频路径 |
| car_number | 苏a045689 | 是 | string | 车牌号 |
| ai_analysis | 违规 | 是 | string | 分析结果 |
- | add_time | 2023-05-26T13:09:03 | 是 | datetime | 添加时间 |
- | update_time | 2023-05-26T13:09:03 | 是 | datetime | 更新时间 |
- | is_display | true | 是 | bool | 是否展示 |
-
+
- 备注:操作会修改uid为20的数据
- 返回值:
- | 参数名 | 参数值 | 参数类型 | 描述说明 |
- | ------------- | ------------------------------------------------- | -------- | ------------ |
- | uid | 1 | int | 自增 |
- | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
- | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
- | police_id | 00000001 | string | 警号 |
- | event_type | 1 | string | 事件类型 |
- | is_violation | true | bool | 是否违规 |
- | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
- | relative_time | 4.0 | float | 相对时间 |
- | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
- | car_number | 苏a045689 | string | 车牌号 |
- | ai_analysis | 违规 | string | 分析结果 |
- | add_time | 2023-05-31 18:42:15 | string | 记录添加时间 |
- | update_time | 2023-05-31 18:42:15 | string | 记录更新时间 |
- | is_display | true | bool | 是否展示 |
-
-- 结果示例:
-
+ | 参数名 | 参数值 | 参数类型 | 描述说明 |
+ | ------------- | ------------------------------------------------- | -------- | ---------------------- |
+ | uid | 1 | int | 自增 |
+ | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
+ | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
+ | police_id | 00000001 | string | 警号 |
+ | event_type | 1 | string | 事件类型 |
+ | is_violation | true | bool | 是否违规 |
+ | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
+ | relative_time | 4.0 | float | 相对时间 |
+ | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
+ | car_number | 苏a045689 | string | 车牌号 |
+ | ai_analysis | 违规 | string | 分析结果 |
+ | add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
+ | update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
+ | is_display | true | bool | 是否展示(自动添加) |
+
+
+
+
删除数据
@@ -228,22 +219,22 @@
- 返回值:
- | 参数名 | 参数值 | 参数类型 | 描述说明 |
- | ------------- | ------------------------------------------------- | -------- | ------------ |
- | uid | 1 | int | 自增 |
- | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
- | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
- | police_id | 00000001 | string | 警号 |
- | event_type | 1 | string | 事件类型 |
- | is_violation | true | bool | 是否违规 |
- | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
- | relative_time | 4.0 | float | 相对时间 |
- | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
- | car_number | 苏a045689 | string | 车牌号 |
- | ai_analysis | 违规 | string | 分析结果 |
- | add_time | 2023-05-31 18:42:15 | string | 记录添加时间 |
- | update_time | 2023-05-31 18:42:15 | string | 记录更新时间 |
- | is_display | true | bool | 是否展示 |
-
-- 结果示例:
-
\ No newline at end of file
+ | 参数名 | 参数值 | 参数类型 | 描述说明 |
+ | ------------- | ------------------------------------------------- | -------- | ------------------------ |
+ | uid | 1 | int | 自增 |
+ | video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
+ | record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
+ | police_id | 00000001 | string | 警号 |
+ | event_type | 1 | string | 事件类型 |
+ | is_violation | true | bool | 是否违规 |
+ | small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
+ | relative_time | 4.0 | float | 相对时间 |
+ | video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
+ | car_number | 苏a045689 | string | 车牌号 |
+ | ai_analysis | 违规 | string | 分析结果 |
+ | add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
+ | update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
+ | is_display | true | bool | 是否展示(自动添加) |
+
+
+
diff --git a/TP_PROJECT/app/serializers.py b/TP_PROJECT/app/serializers.py
index 8132f92..e355336 100644
--- a/TP_PROJECT/app/serializers.py
+++ b/TP_PROJECT/app/serializers.py
@@ -1,4 +1,6 @@
from rest_framework import serializers
+from django_filters.rest_framework import FilterSet
+import django_filters
from app.models import TP
@@ -6,3 +8,24 @@ class SerialMyModel(serializers.ModelSerializer):
class Meta:
model = TP
fields = "__all__"
+
+
+class SerialFilter(FilterSet):
+ """
+ 过滤器,支持模糊查询
+ record_time,日期时间格式,如 2023-01-01 00:00:00
+ police_id,支持模糊匹配
+ event_type,支持模糊匹配
+ """
+ record_time = django_filters.DateTimeFilter(field_name='record_time', lookup_expr='icontains')
+ police_id = django_filters.CharFilter(field_name='police_id', lookup_expr='icontains')
+ event_type = django_filters.CharFilter(field_name='event_type', lookup_expr='icontains')
+ class Meta:
+ # 指定模型
+ models = TP
+ # 指定需要模糊查询的字段
+ fields = ("record_time", "police_id", "event_type",)
+
+
+
+
diff --git a/TP_PROJECT/app/views.py b/TP_PROJECT/app/views.py
index 70ac43f..f59f177 100644
--- a/TP_PROJECT/app/views.py
+++ b/TP_PROJECT/app/views.py
@@ -3,9 +3,8 @@ from django.shortcuts import render
# Create your views here.
from rest_framework import viewsets
from rest_framework.response import Response
-from django_filters.rest_framework import DjangoFilterBackend
from app.models import TP
-from app.serializers import SerialMyModel
+from app.serializers import SerialMyModel, SerialFilter
from app.pagination import MyPageNumberPagination
@@ -18,5 +17,5 @@ class ModelQuery(viewsets.ModelViewSet):
pagination_class = MyPageNumberPagination
# 条件筛选
- filter_backends = [DjangoFilterBackend]
- filterset_fields = ("record_time", "police_id", "event_type",)
+ filterset_class = SerialFilter
+
diff --git a/TP_PROJECT/db.sqlite3 b/TP_PROJECT/db.sqlite3
index 6622a0e07e8f7cf8f687b6513da6a931280fd7de..dd5cf4211f6d35ba5be1a08dbc4927dac193f69d 100644
GIT binary patch
delta 7077
zcmeHLU2Icj7(UXnQk+IKi@pxy=XI3SxV;e?NOuU
zX-mn4xc$0$vboB{I3A0qMn+hcjdiAuj16~&*)Yd8vZ2lp8wvCO39yX;HdGU0TOwQw
z8wy67qfOCBvs3YEqvF*l2d~DWG1XVOSQ8s*SqHB^4puMBRMwQ+%M6tWJm?%7iBy;j
z9Gd&0&@uO2gCA9$WItt5J!`07`sd>I_{G8f=p2F%Gd7dzG^#}|5>KN~NJ9^*A;t{4
zOB_9@iu{&AWkn2wt1CPn^v2|CrQ6BYZnPHA9o^_-6}0Q(t{!y0KWKuGVcR|UmvP(f
z+wK+IDX6mUwwy3u$p10lnYYVy%J`Y#j-eKJpwrA{@MyMlI_a=6)!cfUi2m
zIkXekk+VS@AlF)PKOjn%B4$gm8->X18eB`Rv|<|x*5W+k+JjT2(}@xhJ)GqOvdFB7GmThf5h=9#4%q2if1PSX`p;$s0v%j&6oI-c_vRX{17dK%moL&_%eJ=eJg&V
zbh_PSW1@Us96=euiR;^N0}9Q@F##8il4Y68gCJ%u93^ZU?t>3CNcLp!JcuJdWUzPM
z1tI&Z4fg;SR^h56B`;z>xw;PrMTZh-DV-cQR~a^wg`Snqm~cMH_fH_JMxa3ZYc|b1nu~LT@f26r`JVnjFVemY4IUv
zwJ&aokEi>(N7Lg%GmHkpjWr=?qRlN~Xt?w*luCDXXL=5f_YY=zMu&&Shx;coqsE5r
zhOx}yv7b)AonpCYIMS7#I08S6bPY~q(&If3HrFWE5)K8q7#oX(L+U^Azf31NDOKc@
za^q--oFB*YkaD4=IRXXY#*t?J_aOObg3q@Es{*Ry5dkuGlooM=iWw0xyaiINyq&hX
z;POP)W0WYcJkgC~e61(^%X2KgN;!Ng9Bv$<-O@{XkK+SC<5i`B?&Kv`w_*#~a)S3b
zxmksab|)|S`vgyv+@ykVL($S^Z!d>#axIDrvJt3X-s~g?W)~)LDhRWTaWI$oD(otH
zhq+XErQqiR4-BT)&7bGr&3EUuo8B^BG5l`u;(h20jHQ{T>1TxoQvzd2XfR?Pc1=i`
z7!xy*jf$BViLm6?GWg=JT;QhAgjUB}a&^3+m5#SZI=W)h4~;I>WRCD{RZ3>4Z<@>5
z(UzLukAJZ$u4&NO#L7*iXytBDsaz4^NYf@!r&6uZNy7Xs#!GIc@c=Xc&+;@Mc2Pra
z6$G9AJj=Oy=nhlev_ICW*b_a9XQ;6nRVsR|@{(YyCSv!(4ODE)
zE)}!xq^iwEcj
zty3WtVc!hUFjwY8n8@NF?_FZ8iaigX@%(A@9-v{aSW1<>1N+GVKR+FYs88ifVUT0u
z!TQNRLzJpa6+?py*R_K@Cb8xLm&`CcAXgD>&VKTB5Kd}gSey%t9fkwL)ITD*@&d?`
zv)>{I9Ik%V(k8v6DPEqFpqd&+;fj`&k)fK3M&UqiVIy;D4gdvIm&{T4kX!9^NYT;|
zJ+cS-w9h_?cm)zjKIRoDAy7PGLgf%drzDW3E_z;q>Y6coB)A@xBs=@i#F13Jk7OrG
zTdR20hFd+9;3i%+ZFKO}2!956_)SbbJRAPw4naQM)uPO1(`r!)dx_Pe6jn%5QHljW
zKZ0wDb?oani&WXm?CSu*i(uf@v#%4-x%YKhOs;)h7L#jVm&N4T*8wJbR|yc+eVxGK
zgo&SPIdD>Hq}n?Ix#?=G3KWA-$HqWT^+fK)fr2*o{y=W58fydvqvkeYuN)~IO9lC(
zG5GJ8VDrXh>Ysgx9cirEoG)4
O))HtkRG&`EdhsvnRFQ1}
delta 8709
zcmb_hTWlOx8J=@yFS9rAW|zd*#A~nPOKq=bcf5AiOdc&52;TPh_tgQH7JhgX)g#-OZ$jaTBCjW>n{K+BiZAE}^6m0P9x
zjlHS8FD)DaF90Qb;J*DBx`bM%KnLhXd#1n-(H*nkuc&PXY($&hy>rFLz5B+>&qa+(%t
zMVDU(xvt{L)%k_lx#h*h`L)^Qz@NVQ#8Gv)G_tEaJ+=18{L=Ko+Uy)ETmjw9Lo-7w
zv!_-JdAnagZGHi@`UTYD7f`cbKuvxDHTng#%`c#>egS>V1X5UMD`sbRF&`
zemRu(3uud9KqZb3baL9)0F)ua()w?OEsnx2>EgY-{!?$GXCsg*gSz+F-`IM8g4*okbt)2u$;vJ0x31+i9jqa1Yftdbd_A*}DKvn81MG5wp1lnaO6*
z(QIuUO0iJX@Rkuk9aq4Jl@u8;VY;HwLB9F!%0=;>lgr_+&MnW~1nRlTaF0wL;ZGO-
z?1(2~cSj$UKZtx!c~5By9}JzAdxJlPAHf4CpMvKg+jOElUxQoG-V_{58~5??`55ii
z1#@?5DIQ;0SsEJ}GWPQ*Pthpp@90ztHl_`|>c?qQnf#bVsXiEwsO7_j{DVu!Xg1K#
zFN1dUdLxXdgJ-1g(w(gaH;dMDFrkzV7j4Z}=1!q(=-gqZ=(Jg@=rC#MeC7x=vA0{z
zia8Z3yl9IwcBd&4URW*LE;?s5ENF$(D{V7jFD+-b!!6Myedeh&d0fjmQwI&aihYgx8-J)y~nQ$g46k!w(Joy
z14`)cy>LKLJ!`R&
z_?z)q@KEUfz!~{xv5&(KqHB>Cly~tA`V=ITwCd0JG+!XGpMeIEwTvH5JJk7R=O1{WJ~^*pDF
z0tK}UlOf0Sa_Ut$p>w628p3*>z02vFz#L9b0(YU8K~A#-28m`!+#BHz=}tl7n&`z~
z=$r+5_=CQ6C#)GvxEBU$FEWYM>0o+-*l^W6lbQ84M^b{4Bel*OdV75>
zMe`g4{QZQ$O|t}==%nGa@V5wpB;#JGy|8r7gar!th{Pkiie7D^bM7lpy)=#+tn8`D
z$*x$l*2@YfwKN@yd62uvAsGmbl1#|er`XUre-+puXFn`skKK3H5X+^F
zPdc7kLk#apm8$2?(S;kpqff&D=_j?vg$*UrH_B*r$C0ztf15U~QDQ5Zq4(C+tSzLz
zv#tW!;l#rw`guvCk+BnDPWuj=DAi6ZNnll?q7h9kdmNU^Kz&v8%~lwxZLIFwhTt_<
zyXx9Ygi4}AoyRk<&0W;hspB)tQ>)W!MMLKuC}?wB@F=>m4aRC>s1)jYVkS-K3~rX8
zy5UFB?q-p}{Ot{TWKAEeZ!m@n?7dLkQP*yQPLCR{Vd#Bzje6YGdHgb4%1AFu$&rTX
z#QFFyrI%y>jP-%1qlY6K%CEv7hKEA4!SjLN24r~@F5tK2=hDXgczY}1SJ97vS(6kd
z(SNRkAvAOYpiIG-WE^Dm!h(v9=HMV%gpOmW3C1=Soj^HICPEtog)u1?3h@U2K7bzRg7ZX(F_0>uQ7VM#
z2N9ZJgrmyR2o=I?!*rVQiz=iN75Z^EHOHugEo82-rbl1yp(2bk*dq4QnkR(8G{(4|
zTgck=SBcY%MYx>qLWkZ0gXk}PaE=7ec7Geitk)>5*H`*Ye-5xUf6-Y~x_KkK;h)S5
z8VTxl
zgste5tJ{pUAQ*3jKneTN5=qo=NrznBu5`%NZA^!pXK&is#~~z8-3Fz2oYek5J<766
zn6A~R)?nc?ql#+c*)oW3UIV*5yV~+EfmmZtSdHxgio3ht0%f$-J}Ty^q_h>N=-sPe
zz>>9&0|#~;2g}h-oC(}D)|ud7c2)S9$aBlWgJI`0PEN;R@~*9?8-MN0Jf*_FMI-K*
zXrjpeh3+lTiNy9GPr1gTDL27Z2G_B~W4nkh?7$QEy&|2HjEaiTFsUJ