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 | 是否展示(自动添加) | -- 结果示例: - ![](.images/查询单个.png) - + + +
查询所有 @@ -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 | 是否展示 | - -- 结果示例:![](.images/查询所有.png) -
+ | 参数名 | 参数值 | 参数类型 | 描述说明 | + | ------------- | ------------------------------------------------- | -------- | ------------------------ | + | 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 | 是否展示 | - -- 结果示例:![](.images/新增数据.png) -
+ | 参数名 | 参数值 | 参数类型 | 描述说明 | + | ------------- | ------------------------------------------------- | -------- | ------------------------ | + | 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 | 是否展示 | - -- 结果示例:![](.images/修改数据.png) -
+ | 参数名 | 参数值 | 参数类型 | 描述说明 | + | ------------- | ------------------------------------------------- | -------- | ---------------------- | + | 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 | 是否展示 | - -- 结果示例:![](.images/删除数据.png) -
\ 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