From 10ad3acf9c88fffd723e39a81d9a6b401b1e7a34 Mon Sep 17 00:00:00 2001
From: juzi <819872918@qq.com>
Date: Mon, 8 Jan 2024 16:59:42 +0800
Subject: [PATCH 01/24] =?UTF-8?q?=E9=A9=BE=E9=A9=B6=E8=88=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env.dev | 10 +-
src/store/modules/websocket.js | 77 ++++-
src/styles/index.scss | 8 +
.../databoard/components/DefectChart.vue | 83 ++---
src/views/databoard/components/FlueGas.vue | 8 +-
src/views/databoard/components/GasChart.vue | 11 +
.../databoard/components/ScrollBoard.vue | 18 +-
src/views/databoard/components/Switcher.vue | 23 +-
.../databoard/components/YieldRateChart.vue | 317 ++++++++++++++++++
.../databoard/deepProcessing/DefectSum.vue | 38 ++-
.../databoard/deepProcessing/EqAlarm.vue | 28 +-
.../deepProcessing/WorkOrderMonitoring.vue | 50 ++-
src/views/databoard/kiln/EnergeCost.vue | 3 +-
src/views/databoard/kiln/FanSequence.vue | 4 +-
src/views/databoard/kiln/GasHandle.vue | 11 +-
src/views/databoard/kiln/RightTwo.vue | 3 +-
.../databoard/wholePlant/OrderStatus.vue | 24 +-
src/views/databoard/wholePlant/YieldRate.vue | 118 +++++--
src/websocket/wsInterface.js | 107 +++++-
19 files changed, 776 insertions(+), 165 deletions(-)
create mode 100644 src/views/databoard/components/YieldRateChart.vue
diff --git a/.env.dev b/.env.dev
index 4fa61a97..67ff42df 100644
--- a/.env.dev
+++ b/.env.dev
@@ -25,12 +25,14 @@ VUE_APP_BASE_API = 'http://192.168.0.33:48082'
# VUE_APP_BASE_API = 'http://192.168.4.159:48080'
# VUE_APP_BASE_API = 'http://192.168.1.104:48082'
# VUE_APP_BASE_API = 'http://192.168.1.62:48082'
-VUE_APP_BASE_API = 'http://192.168.1.78:48082'
+# VUE_APP_BASE_API = 'http://192.168.1.78:48082'
+
+# dcs地址
+VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081'
# socket地址
-VUE_APP_Socket_API = 'ws://192.168.0.33:48082'
+VUE_APP_Socket_API = 'ws://10.70.2.2:8080'
+# VUE_APP_Socket_API = 'ws://192.168.0.33:48082'
-
-# VUE_APP_BASE_API = 'http://100.64.0.23:48082'
# 积木报表指向地址
VUE_APP_JIMU_API = 'http://10.70.2.22:8080'
diff --git a/src/store/modules/websocket.js b/src/store/modules/websocket.js
index 9964e201..7b69b33e 100644
--- a/src/store/modules/websocket.js
+++ b/src/store/modules/websocket.js
@@ -20,6 +20,7 @@ const state = {
gasChartWeekTrend:{}, // 烟气
gasChartMonthTrend:{}, // 烟气
gasChartYearTrend:{}, // 烟气
+ israCheckType: [],
israDayStatistic: [],//缺陷统计
israWeekStatistic: [],//缺陷统计
israMonthStatistic: [],//缺陷统计
@@ -73,8 +74,17 @@ const state = {
"productionLineId": 1737312466842456065,
"sumInputNum": 27
}], // SJG产线产量及良品率
- sjgEquipment:[],// SJG设备报警
-
+ sjgEquipment:[
+ {name: 'sadd', error:false,code: 'EQ202312121624540000072',status: "正常"}
+ ],// SJG设备报警
+ workOrder: [], // 工单监控
+ defectSum: [], // 缺陷汇总
+ order: [],// 订单完成情况
+ yieldRateTable: [],// 本日生产良率table
+ cutChartDay:[],
+ cutChartWeek:[],
+ cutChartMonth:[],
+ cutChartYear:[]
};
const mutations = {
SET_FANFREQUENCYINFO: (state, fanFrequencyInfo) => {
@@ -123,12 +133,13 @@ const mutations = {
state.exhaustGasInfo = exhaustGasInfo
},
SET_EXHAUSTGASCHART: (state, exhaustGasChart) => {
- state.gasChartDayTrend = exhaustGasChart.gasChartDayTrend
- state.gasChartWeekTrend = exhaustGasChart.gasChartWeekTrend
- state.gasChartMonthTrend = exhaustGasChart.gasChartMonthTrend
- state.gasChartYearTrend = exhaustGasChart.gasChartYearTrend
+ state.gasChartDayTrend = exhaustGasChart.dayTrend
+ state.gasChartWeekTrend = exhaustGasChart.weekTrend
+ state.gasChartMonthTrend = exhaustGasChart.monthTrend
+ state.gasChartYearTrend = exhaustGasChart.yearTrend
},
SET_DEFECTCHART: (state, israStatistic) => {
+ state.israCheckType = israStatistic.checkType
state.israDayStatistic = israStatistic.dayStatistic
state.israWeekStatistic = israStatistic.weekStatistic
state.israMonthStatistic = israStatistic.monthStatistic
@@ -136,6 +147,33 @@ const mutations = {
},
SET_PRODUCTLINE: (state, productline) => {
state.productline = productline
+ },
+ SET_SJGEQ: (state, equipment) => {
+ state.sjgEquipment = equipment
+ },
+ SET_WORKORDER: (state, workOrder) => {
+ state.workOrder = workOrder
+ },
+ SET_DEFECTSUM: (state, defectSum) => {
+ state.defectSum = defectSum
+ },
+ SET_ORDER: (state, order) => {
+ state.order = order
+ },
+ SET_YIELDRATETABLE: (state, yieldRateTable) => {
+ state.yieldRateTable = yieldRateTable
+ },
+ SET_CUTCHARDAY: (state, cutChartDay) => {
+ state.cutChartDay = cutChartDay
+ },
+ SET_CUTCHARWEEK: (state, cutChartWeek) => {
+ state.cutChartWeek = cutChartWeek
+ },
+ SET_CUTCHARMONTH: (state, cutChartMonth) => {
+ state.cutChartMonth = cutChartMonth
+ },
+ SET_CUTCHARYEAR: (state, cutChartYear) => {
+ state.cutChartYear = cutChartYear
}
};
const actions = {
@@ -180,6 +218,33 @@ const actions = {
setProductline({ commit }, productline) {
commit('SET_PRODUCTLINE', productline.payload)
},
+ setSJGEq({ commit }, equipment) {
+ commit('SET_SJGEQ', equipment.payload)
+ },
+ setWorkOrder({ commit }, workOrder) {
+ commit('SET_WORKORDER', workOrder.payload)
+ },
+ setDefectSum({ commit }, defectSum) {
+ commit('SET_DEFECTSUM', defectSum.payload)
+ },
+ setOrder({ commit }, order) {
+ commit('SET_ORDER', order.payload)
+ },
+ setYieldRateTable({ commit }, yieldRateTable) {
+ commit('SET_YIELDRATETABLE', yieldRateTable.payload)
+ },
+ setCutChartDay({ commit }, cutChartDay) {
+ commit('SET_CUTCHARDAY', cutChartDay.payload)
+ },
+ setCutChartWeek({ commit }, cutChartWeek) {
+ commit('SET_CUTCHARWEEK', cutChartWeek.payload)
+ },
+ setCutChartMonth({ commit }, cutChartMonth) {
+ commit('SET_CUTCHARMONTH', cutChartMonth.payload)
+ },
+ setCutChartYear({ commit }, cutChartYear) {
+ commit('SET_CUTCHARYEAR', cutChartYear.payload)
+ }
};
export default {
namespaced: true,
diff --git a/src/styles/index.scss b/src/styles/index.scss
index d162abed..7c145d7e 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -200,4 +200,12 @@ input, textarea{
// 弹出框,上下分布,去掉label的padding-bottom
.el-form--label-top .el-form-item__label {
padding: 0;
+}
+
+// 大屏滚动表格
+.dv-scroll-board .rows .ceil, .dv-scroll-board .header .header-item {
+ border-right: 1px solid rgba(13, 23, 40, 1);
+}
+.dv-scroll-board .rows .ceil:last-child, .dv-scroll-board .header .header-item:last-child {
+ border-right: none;
}
\ No newline at end of file
diff --git a/src/views/databoard/components/DefectChart.vue b/src/views/databoard/components/DefectChart.vue
index f10647b4..deb892ec 100644
--- a/src/views/databoard/components/DefectChart.vue
+++ b/src/views/databoard/components/DefectChart.vue
@@ -17,6 +17,9 @@ export default {
}
},
computed: {
+ israCheckType() {
+ return this.$store.state.websocket.israCheckType
+ },
israDayStatistic() {
return this.$store.state.websocket.israDayStatistic
},
@@ -34,7 +37,7 @@ export default {
israDayStatistic: {
handler(newVal, oldVal) {
if (this.chartTime === '日') {
- this.tempData = israDayStatistic
+ this.tempData = this.israDayStatistic
this.updateChart()
}
}
@@ -42,7 +45,7 @@ export default {
israWeekStatistic: {
handler(newVal, oldVal) {
if (this.chartTime === '周') {
- this.tempData = israWeekStatistic
+ this.tempData = this.israWeekStatistic
this.updateChart()
}
}
@@ -50,7 +53,7 @@ export default {
israMonthStatistic: {
handler(newVal, oldVal) {
if (this.chartTime === '月') {
- this.tempData = israMonthStatistic
+ this.tempData = this.israMonthStatistic
this.updateChart()
}
}
@@ -58,7 +61,7 @@ export default {
israYearStatistic: {
handler(newVal, oldVal) {
if (this.chartTime === '年') {
- this.tempData = israYearStatistic
+ this.tempData = this.israYearStatistic
this.updateChart()
}
}
@@ -80,56 +83,34 @@ export default {
this.chart.dispose()
}
this.chart = echarts.init(this.$el);
- let legendData = []
let xData = []
- let yData = []
+ let seriesData = []
+ for (let i = 0;i < this.israCheckType.length; i++) {
+ let obj = {}
+ obj.type = 'bar'
+ obj.stack = 'all'
+ obj.emphasis = {
+ focus:"series"
+ }
+ obj.name = this.israCheckType[i]
+ obj.barWidth = 12
+ obj.data = []
+ for (let j = 0;j < this.tempData.length; j++) {
+ for (let k = 0; k < this.tempData[j].data.length; k++) {
+ if (this.israCheckType[i] === this.tempData[j].data[k].checkType) {
+ obj.data.push(this.tempData[j].data[k].checkNum)
+ }
+ }
+ }
+ seriesData.push(obj)
+ }
+
this.tempData && this.tempData.length > 0 && this.tempData.map(item => {
xData.push(item.name)
})
- var series = [
- {
- data: [120, 200, 150, 80, 70, 110, 130],
- type: 'bar',
- stack: 'all',
- name: 'a',
- barWidth: 12,
- },
- {
- data: [10, 46, 64, '-', 0, '-', 0],
- type: 'bar',
- stack: 'all',
- name: 'b',
- barWidth: 12,
- },
- {
- data: [30, '-', 0, 20, 10, '-', 0],
- type: 'bar',
- stack: 'all',
- barWidth: 12,
- name: 'c'
- },
- {
- data: [30, '-', 0, 20, 10, '-', 0],
- type: 'bar',
- stack: 'all',
- barWidth: 12,
- name: 'd'
- },
- {
- data: [10, 20, 150, 0, '-', 50, 10],
- type: 'bar',
- stack: 'all',
- name: 'e',
- barWidth: 12,
- label: {
- show: true,
- position: 'top'
- }
- }
- ];
var option = {
- color: ['#2760FF','#5B9BFF','#FFD160','#8167F6', '#99D66C', '#FF8A40'],
- grid: { top: 40, right: 12, bottom: 20, left: 48 },
+ color: ["#2760FF", "#8167F6", "#5B9BFF", "#99D66C", "#FFD160", "#FF8A40"],
+ grid: { top: 80, right: 12, bottom: 20, left: 48 },
legend: {
top: 10,
left: 80,
@@ -142,7 +123,7 @@ export default {
color: "#DFF1FE",
fontSize: 12,
},
- data:['a','b','c','d','e'],
+ data:this.israCheckType,
},
xAxis: {
type: "category",
@@ -191,7 +172,7 @@ export default {
},
className: "defect-chart-tooltip"
},
- series: series
+ series: seriesData
};
option && this.chart.setOption(option)
}
diff --git a/src/views/databoard/components/FlueGas.vue b/src/views/databoard/components/FlueGas.vue
index aaecbcf9..dfd286e9 100644
--- a/src/views/databoard/components/FlueGas.vue
+++ b/src/views/databoard/components/FlueGas.vue
@@ -119,19 +119,19 @@ export default {
}
switch (this.chartType) {
case '氧气含量':{
- temp2 = temp1.O2_float || []
+ temp2 = temp1?.O2_float || []
break;
}
case '二氧化硫':{
- temp2 = temp1.SO2_float || []
+ temp2 = temp1?.SO2_float || []
break;
}
case '一氧化氮':{
- temp2 = temp1.NOX_float || []
+ temp2 = temp1?.NOX_float || []
break;
}
case '颗粒物':{
- temp2 = temp1.dust_float || []
+ temp2 = temp1?.dust_float || []
break;
}
default:
diff --git a/src/views/databoard/components/GasChart.vue b/src/views/databoard/components/GasChart.vue
index 87445833..4971e1be 100644
--- a/src/views/databoard/components/GasChart.vue
+++ b/src/views/databoard/components/GasChart.vue
@@ -221,6 +221,7 @@ export default {
series: seriesData,
tooltip: {
trigger: 'axis',
+ className: "gas-tooltip"
},
}
option && this.chart.setOption(option)
@@ -269,3 +270,13 @@ export default {
height: 100%;
}
+
diff --git a/src/views/databoard/components/ScrollBoard.vue b/src/views/databoard/components/ScrollBoard.vue
index 033c602f..bc4524ad 100644
--- a/src/views/databoard/components/ScrollBoard.vue
+++ b/src/views/databoard/components/ScrollBoard.vue
@@ -1,6 +1,6 @@
`IxQVDb}7^Lm=3hwbW# z(tqK={3p@-8+T$p7jN&F0N>-DRZA<^JS_@MulB)|qWY3YZQa6}+`~Dh8@)HCCWe-} zds8;mLq4nuKEY`|Tcha@rcEM^l*Tj)AA?Ha6^J{rT1Q%&GE=%Jjb;k}&ot*X!?-AU zHZIMDc6%#O6*ST=geIxWcf_>JTu}-;Bjl}YtRxdcYV=M&D~b245ySLiu?xaU2mZH( zKwAB~4H`-E3y0lG#D_487D=q^53e+qSf!UM?QqwHPFr)qAZ9! zx+*XWxZ=2>40YW#u|>xm&z2RH {Rb>T#^@#%s<3#ktB9) ze;$!e+Nl)20Q??-tuJ@Giuco=S8aPGxRtNjrk)#~{KUOe7pp9ELw`dyN96Fh26<=7 zJbY#M?t4GfNe$f?kB)k_(!sfbm;-UywJp{FF}D|XmIevG#={`!{JCf}DLG^#f1#%N zw5OXW8CyBJEANTW5)qk8J)An@6ay-fM5pcgtE8nALAN)iw{)KfBnXZSjKqetAeX2! zk2q@b!rQ>JLjY0u^(=_Dq#gcmXupau3M>Lx9a-oq-f(*y=ixdo;lEi(J?}2@lLJDu z7~Ehjw!}*rX>zFaJiD7D?|E*O_bYMpB|m2>Kt)Po#GPdEZef0HkIL#>QD!e(+p4}< zNVwInm 3Y%k`Wj3KZ+dGfG05nzV%m zM`G8Jjn4qg!ouBi%T<*yZ?hDoBMwePQFV3k{KS#rQguzeC9y^5B@Safx7J!7A=ud0 z+u?m8zeJ}onf$u|r|BfOfY%2P@5-*O*LN)*g?G;e2U>*Y^gey>oV>rQw6kxap}T&J zQLO0ZaU*@>X&Gm7#?j5iDg~BcWDr)ke2 ix!H;<84IOCU0V1@r{r@*)`XtK01bof9WAXkJjR zQAWdHJEd(N1AO-|A;xahr7F4myic6d>}ly*L1w^nG^bk$Lpx _uc?2~IvST1~4 zJwd8@s_yiwb0U_<-*+HQEKc8O`NyC|Dlz`bGKua*bbsULc@Jm;YAX3G8%PKV$WGy4 zlNK=|L6QAZY?Y0;O+d>vk6k@XfZln7_&_%fOr(9n-Zh~a(W8l0q4PEf;gb@LeT&$! zm}?dmp_2vQ47HLQ%^X(?=U})8apg%oVN2mt8|4uVHiX_=EkRp%98Nw+Hf+nEj?1t( z+Xjn~>qahzeSTAFBx9huhEPpavEo4?TyXXfzpK>jK|EDLWz2f2K!LuL-e>euczgeL zv>`7Fq`CAPi+eaVJ)tqcmFFijT%L!+4HuIY@bWfO4++A0hkm7XFNSe)yA7v5otjf$ zzN_lhag+P5@0pn)cdn^HQ224wjA<}l&8vBevEau4BCXR%hXX})-EtN=cA+)bZw3C` zTiSV8ni=R?|3%IJrzaR;iX!ON&9h11hus)83-o(@obHm`+!j7rHlNn@hvG(~T%w3` zQ;1H6;`SZ=+z9Y&tYP`h!@lZ{60;8$sg$K^`xbAH(TM(Or^8PVFDd-UxP4@80+y&h zSU*GyVVu}q6o@@e+ARkIEB%+0h^x7m%&~^~lsJP|nBsiLh(fO`ct)2L@&{yoAPY zzyhgzqz#=KNd^4YT^<0?J;5yxTsH73CJQwFY5V#g0x(oV*)GN*cTQwRETEVLQ<@zR z`0!{lxN|SACFC=#ICWA6^`7W7pV+_aTEDT@%iV(Mj{0JdCgBi+QQkf-4Fv9dS@qSL zPmF&$zQ?p&A}v)Xo#3nLA<}=VHZj8>aC2~1zRhbc`KNQ4lIvqJs0$}iIW0*tKF9r+ ztYo%UofJ*BF9u {b*wm=Hs}#uMNRt_m4V?G44{ z?vj> VaiIMQ+vF*Fat zW(PLLS3b(5fs4)Oy{VDgaZ&kEq~hQ1q=TRztODyF 5S(e>-EqlzD3l2gG`zXq}oQ^v(h zPNv3{aC0kuohjYInlBO1-D}GLtg}v0woUI*(x84K;jpDt9$h8f9j^*rj*bFvZNh zIC!lO>Q>0?Af)3Q*eIB+g qo_gaA9p23?BJ+6MykeN ztKUhAa3mEgr9^5k2Sys&V2ko+Gi6IcZhjOWr36)nSc*>@k&$Ell||}DkA>ynsLa~o z=p_xU yQCZJ7;_!D}IMet4p} QL1N z`$A&Vg}#0kMuUUqnGHM+y@^H$%V3Otu@j<(8p~s69Z5DM6ddZpSg_v`U<^$)+i-Ne z3PQlf#&CyclrH-F$V_4K9k12B(x8)jPD5Em>2x?Bsu54vbPCU${7uXgkgO`TG1t<# z7VzDR YPsC-T-AMJJ{(b^Apry<4;jI74POgF$>Qy2eIx?mmN zt@b;jV*trMNM;@Sorgn)PcjU`@!7vPA%v@fF~{fETb *&SB)0l` z{;aOVjbLm$z1VZevkh^}Qv1Awi=|^(TllGRxA&No>Uq+zKvFY*L{GDfAq|rcM`~?0 zc(|KZ JAfM&Gh%}wv> z$9li91%qpPHpj$Wxzp=wK6dPyk58UKw=*~vdNy%J?tLTsKuPKFxqS{!*5an6wHf+I zqq_8mMQz|OzpKvW@pzYiT`Z8oL!84$y+fr~x&x0nqKoe1s3Z|>yVJc#^2?{WSB3c` z*nC0ns$&%c?7MsrR@gqb9m|Zo*|E$y#a c1wnZLh+MOezDxY)0oA!8*GC5JZk^8s(F5<;S9eG>Lu@r#Z0 ztib%cO0jpR0ou>OdmGvBY{;PT81!B+R@{;mSddho<%JGChs|!U^Eyu^H8&!%&K=2s zO?&|dev-lwVDQ{^7kpys_isC5Mq@v;x7!&w-_S{JonLzY0w}amRn2fY!=WKMm901> zup_9n3{Uy8>owH+;h@wsB<**%nsxkv`%703EyCdRYNQ{_r;?Rk=>`x^&AlA2&ZW$G zn?sN8AT?9pwO`GBm>kgECi{MRp21AN@liiZPV}8xxI|em_`o5sJ(a84JoIF?e3dh* zR32615ldZA`*aFPZdk=;?|jC$@wC}7+V)Pt_9D@iW|%pi{uBF$0va$uXQPpNQ@eI( zjGTA&;Q`1`RCWc%Cfb|wwSgoQ4mjM8%%A~a6syJp$KVCAfET^h^z@ICGkE>BRS-Az z+F`RyCT)Z_R3-s)e3^2do1Y$%R<7BYfkBs4zo?j0`ItQe_z<*mS67f}4l5Kek%=O{ z;`Rp14MZ$}%d+a?1b^w++BdAx=`v39B@4!*4HOQ28cUft!Zbu1um9MD?T VS6Qqr%3S9@ z8Qxiz)%jg49G%eCgz5)=2Z>$KwSjF`%g0 QWd z``2k0*BJ|eV0+-#-}g^>g}!Pz!X(o2t-?OM<7SM^&ewxT7az@=Y3Yz2uj!OD26SmA z=_k96F8d$*X_?-<*_6StBF#-hSShoiy7^8`M9>~#wAtNlIs=}`Xjx-Zp~u7Y(JL0x z`{^(kfX(=Yeymf 7(B4^m$S8$zECO>`EV@?^3y^;7hF1;K$CC;Pt%hOhTVO zaC$s|)3C=isY+5yrBFsHrYNA~ijpk_Oa{o{YP@TSrn{rH*?r#3^o@{?@y^ q8^b~iFaR2q+i`#}LD|Bm&|&`yOAehSzDqJ+!bF1mhN-?2WU zqOCu|sOPBqUPxgFbRv4jQpxoB7`UztER)T`^ tha{12r zuAqI7k7~5l8F*y)bJMu4e>!m;A9GIh8E@e>a8d9cXRIqBrBTIDl0p8&aPbR+i-g6X z>_ebT??QP&1UxUKA?0~h0$~*0-Gg%AIT=?kGT6S+q*;_(47dZ&`JIqiq9%6LtdDtn zDk;f`t-rr sk7aW d}pMFL8_Cf~nsFMj*J ?*eIcfcW7= zz2&x 60O&W z>o)x5bW|q9=P+r$iNZJ?8F TwsQcE`$RXgfqS#ELtz2|)qtH7ey^ zowN;sMWmDnI{T%jzTFspru}ebB%x;3(*ciTNREQQ_aKw mxtzqx GU8_B_AKbbAMQ!j6M z=4jgFBHnw3Zo17>;tjfOA`Ase>_Pr(IRHDQ$P$elN)tUbTV$YyP1 ^JzQDXF#q3R8hEt$fN@DTX zz+MG13w@mq%)Xdy{5;{A@ndRTV8t`8zq;WI%ahG^y(9pcBMbBa?l~A1#a?yw+wzEe zyQAQ=kWyyrV2T;v(7YfZM^Sijx{&QX$XJC|XMH#M6?BC>p18kQ9#J6w!Y62l{33ZS zdD473c#3T3Q&~{h-JCT<9bueccJ`T5{eGz(Hyd^fk+jekZTshA#kUR?k7S4?sJ921 z2dw8eL$R-#a>aihDJEaB*qGN09YhfGFM~FW=AoK{S!@HRW}&;zQNVjuQuiBYE8W`` z6jMSMy4&tMn)PVcG{~9N=L+BR2<)s&qA#{`d=B0ux7Iuxg(j0swI=)b9QG`n(JYMv zdn994sm}c*ERVwMPP-eAlg`zK7T1!A#RsXPy+?VUO3meZaO!3LGP#ziH$1 ;g1rVzdes<&mRkZdXiwn z|F`{I6=1~V+^HEtQkv=sT8`sI1o|M{3e^FJTRK|YcYXHbH}BZ`eXf#RiO3kT5KcbH z_!(MGt9#TyG&&;3)j=`-XA51Bi IEOiQM`$c{J*n{|x>bx>R9C!Ic z%nG8+FoW2&JCL@PIPQX;xHVt?d>GG3Je|EfKE1Wsl{?^+U~*sQd44FjPbE12p~#NT zLr#rMOWrNqjfJWwd-Z(Sl-$YZup26(b|#+7c5Io>3_ObcK(NeFRvW|ALhF$NA~sQn zRhC_W)p}zOI3}Z1nWr%4WwCM3g`H0U;ah#L*w|yH5kEqfh~3G%5Z#w7Tf9BAB{?@H zf9e}e{bv_IVVFrersGjSaJ^ji-k+d0348+P2dtV3l0_Z%IEu>D zT@q+GJ~mZVHQrwB6mbh$&GlAkKKnR1p*?Pf`?jdNOq~BQe1)%5 zEEPTZmRmiaTGl(JaP!#Dckkg5s!Q<_>zlW8`7Y_O7_|NiCj!CS>wgWH5J)d>gW( zhi#2%jjNgfU!ljRt?U9AeHA~-k^+E=q_fBvBLAe->WR4>Xjwiu9$l9)I)Br=pnqn1 zVx&IX=HX0_9hzeyz|SI}V|qY_2w)*IeV9CRUU%?yp&kXto4O)PdP+NT9kP}4c=;WS zW;Xf@nGrUlV^kg(?v$%X7#A_+LIl(N*4U30`Bol*!BDUj;+e_a^e+<$N?d$OJq2_8 zY(7b%R+bLq(Ig$d?TsFv{F&K%Dl*zVPL8;jUAJoH7Jl=H<~@LOGxTX(WfF&Zqz{dU z9GOAPJFRZ9|0Vc&l*^XVn*>$bDj;pem#^X?`ie7|l`m64*~+4U@ y);wZr#|z<&E)*6fyRa z6x@*JUaN}Q#&UKeLmms#+va@wK86 @RP{@T>kgca{nT7~G}CC{Q&clx F4|xK*o=FJK SAo~)L`G}b ;lzA#cUUm6Op{D{d zPtJ*DX8rn3p=by) %rr!Vs?xIuGXpGfLZwHg1&p)a*G zgUS#Tg$_W9U8>$*aAgF_V-NI>w#j%A3$hv?i*XlYPLzC@&(%9Oat~Ce-QzM}?>N=y zA6r>!f#ASuh1b!(OjA4Wm2_+D&K0_n 3PJ(%;*-A=>K%X)*?y
1APJF$5WM;Aa26RH1^KlYzzX#y@JU?l-XxQ-EY{7S7 zH4-!*$)z{RQv;j}C?n^wVuz}2!sVw(%X5@!Pa`9ZnVWq_=E=4JA m(0yiN`q=$dt4k%nzoKk-oGKcIUwQOl6@*8 zJx&_|3TPo-tm z!k`&sYz!8K_XH)P7+&9eW0+6Y-QtcRfgil)K-!-Y@K0=H_zbhvXv3N7@x4C{dZvFh zB&FGmPs9wEXI|i}o(E3pket0S1QuHOnh?0jC(f@-_vxE`bGfD>oA~|T+`ZJ~ekd_l zJ*M#khb5BJ2Mi=zmukv_)**t*w13sgyX%aooIABmg}IeLu4M4@eQaKbD5*B*jcLG% zbemz>!Kbmp5+PIyncQY!DVHfhkwA8V!hJ-))Y-rt-<3Cpkt%QySyFo{v11h_d+rC8 zo`<7Al r1^&hu<|y*p-@1 zW^UZ4(0FT9oZ7f6B>XL^GS1QM`PfoI$joBB-NEkGWlK8_-)^){l-8u>dRd#w5_r @I&>&N)X=6ysu2WFL;B>)BP*9tM;V41X>9X2L6FAp`FXt|R-0=ht3?h%bZ zWC1DV=0ZaV;#bnm%VeJ5`1AW=O# ?O5-O8|9gos`^?1t*o1iVl-kN5a? z F)7E`l6g8dqbOuZbApFTK_fY}@gCsZN-z*0&*Y zJ0$SvW`day_=)E#*tOs?_H&y`bc3!tSldBaaL7;gEbzl`N%BhhN?0vh^hq_lKp!1_ z`3HiXB;I66eX5tX;&es$zKRI;YcFkePTHl!-@S~EHi8OF46q3U3#f=R^~3Rf@L@w6 zG#iwCw&1A6ml;W>Wf--+fZWMOV 7w+45n8U39@QrK1IT3|>Wxnml zbxQ1FBm>V^J_AbN@gG0u>k=6y%n8+P(VX9(3~JQ%7o!d5{deOO*ew%ee|M)3+F2wY zifc@N>xv##j=41JG}%)bH?v6;b4wf6(|cH)b&k(y%=Eh_4euiTBZh+4Pxaa%@Kyk` zB8&gl?S(PP5SezB0`in(7J3m@&Frgnxp7B`^(jjVGt~GUi{F(*lBx