|
@@ -4,17 +4,20 @@
|
|
|
|
|
|
<!-- 封面 -->
|
|
|
<div class="rd-info" :style="{ backgroundImage: `url(${getImageUrl('semester-bg')})`, backgroundColor: '#fff' }" >
|
|
|
- <div class="rd-info-cover" :style="{ backgroundImage: `url(${getImageUrl('cover')})`}"></div>
|
|
|
+ <div class="rd-info-cover" :style="{ backgroundImage: `url(${getImageUrl('empty-cover')})`}">
|
|
|
+ <div style="font-weight:600;font-size: 28px;color: rgb(35, 60, 213)" >智慧观察评价报告</div>
|
|
|
+ <div style="font-weight:600;font-size: 22px;color: rgb(240, 137, 49)">班级版</div>
|
|
|
+ </div>
|
|
|
<div class="rd-info-bg" :style="{ backgroundImage: `url(${getImageUrl('baby-cover')})`}">
|
|
|
<!-- 头像 -->
|
|
|
- <!-- <img class="rd-info-bg-headImg" /> -->
|
|
|
+ <img class="rd-info-bg-headImg" :src="baseData?.schoolImage" />
|
|
|
<div class="rd-info-bg-info">
|
|
|
- <div class="rd-info-bg-info-name">姓名:困困</div>
|
|
|
- <div class="rd-info-bg-info-class">班级:思维芯小一班</div>
|
|
|
- <div class="rd-info-bg-info-stage">成长阶段:2024.03.15-2024.07.10</div>
|
|
|
+ <div class="rd-info-bg-info-name">{{baseData?.schoolName}}</div>
|
|
|
+ <div class="rd-info-bg-info-class">班级:{{baseData?.className}}</div>
|
|
|
+ <div class="rd-info-bg-info-stage">成长阶段:{{dayjs(baseData?.startTime).format('YYYY.MM.DD')}}-{{dayjs(baseData?.endTime).format('YYYY.MM.DD')}}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </div>
|
|
|
|
|
|
<!-- 评估结果分析 -->
|
|
|
<div class="report-result" >
|
|
@@ -26,12 +29,21 @@
|
|
|
班级基本概况
|
|
|
</div>
|
|
|
<div class="base-content" >
|
|
|
- 思维芯小一班共有学生28名,在2024年02月12日— —2024年7月31日时间内,教师观察记录20篇,观察到学生28名,未观察到学生0名,分别统计为:
|
|
|
+ 思维芯小一班共有学生{{baseData?.totalStudent}}名,在{{baseData?.startTimeFormat}}—{{baseData?.endTimeFormat}}时间内,
|
|
|
+ 教师观察记录{{baseData?.records}}篇,观察到学生{{baseData?.done}}名,未观察到学生{{baseData?.notDone}}名,分别统计为:
|
|
|
</div>
|
|
|
- <div class="base-table" >
|
|
|
- <div class="base-table-item" v-for="item in clazzBase" :key="item.title">
|
|
|
+ <div class="base-table" id="capture" >
|
|
|
+ <div class="base-table-item">
|
|
|
<div class="title" >记录总数</div>
|
|
|
- <div class="value" >20</div>
|
|
|
+ <div class="value" >{{baseData?.records}}篇</div>
|
|
|
+ </div>
|
|
|
+ <div class="base-table-item">
|
|
|
+ <div class="title" >行为记录</div>
|
|
|
+ <div class="value" >{{baseData?.behavior}}次</div>
|
|
|
+ </div>
|
|
|
+ <div class="base-table-item">
|
|
|
+ <div class="title" >问题探究</div>
|
|
|
+ <div class="value" >{{baseData?.question}}次</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -45,14 +57,124 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="report-clazz-base" >
|
|
|
+ <div class="base-title" >
|
|
|
+ 观察领域分布
|
|
|
+ </div>
|
|
|
+ <div class="observe-scene" >
|
|
|
+ <div class="line">
|
|
|
+ <div ref="observeLine" style="width: 100%;height: 100%;" > </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="report-clazz-base" >
|
|
|
+ <div class="base-title" >
|
|
|
+ 学生各领域表现阶段汇总
|
|
|
+ </div>
|
|
|
+ <div class="total-scene" >
|
|
|
+ <!-- <div class="total-table" >
|
|
|
+ <div class="total-table-item" >
|
|
|
+ <div
|
|
|
+ :class="['total-table-item-cell', index === 0 ? 'total-table-item-title border-white' : '']"
|
|
|
+ v-for="(item, index) in tableData.name.data"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ {{item}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="total-table-item" >
|
|
|
+ <div
|
|
|
+ :class="['total-table-item-cell', index === 0 ? 'total-table-item-title border-white' : '']"
|
|
|
+ v-for="(item, index) in tableData.record.data"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ {{item}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="total-table-item" >
|
|
|
+ <div class="performances-title border-white">
|
|
|
+ 观察进阶
|
|
|
+ </div>
|
|
|
+ <div class="performances-item-content" >
|
|
|
+ <div class="performances-item-conten-card" v-for="(item, index) in tableData.performances.data" :key="index">
|
|
|
+ <div :class="['total-table-item-cell', index === 0 ? 'border-white performances-subtitle': '']" v-for="(_, index) in item" :key="index" >
|
|
|
+ {{_}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div> -->
|
|
|
+ <div class="total-table-small" id="htmlToPng" >
|
|
|
+ <div class="total-table-item" >
|
|
|
+ <div
|
|
|
+ :class="['total-table-item-cell', index === 0 ? 'total-table-item-title border-white' : '']"
|
|
|
+ v-for="(item, index) in tableData.name.data"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ {{item}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="total-table-item" >
|
|
|
+ <div
|
|
|
+ :class="['total-table-item-cell', index === 0 ? 'total-table-item-title border-white' : '']"
|
|
|
+ v-for="(item, index) in tableData.record.data"
|
|
|
+ :key="index"
|
|
|
+ style="padding: 8px;"
|
|
|
+ >
|
|
|
+ {{item}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="total-table-item" >
|
|
|
+ <div class="performances-title border-white">
|
|
|
+ 观察进阶
|
|
|
+ </div>
|
|
|
+ <div class="performances-item-content" >
|
|
|
+ <div class="performances-item-conten-card" v-for="(item, index) in tableData.performances.data" :key="index">
|
|
|
+ <div :style="{height: index === 0 ? '20px' : '40px'}" :class="['total-table-item-cell-small', index === 0 ? 'border-white performances-subtitle': '']" v-for="(_, index) in item" :key="index" >
|
|
|
+ {{_}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="report-clazz-base data-desc">
|
|
|
+ <div class="base-title" >
|
|
|
+ 数据说明:
|
|
|
+ </div>
|
|
|
+ <div class="base-content" >
|
|
|
+ {{dataDesc}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <!-- 导出 -->
|
|
|
+ <export-button @export="exportReport" />
|
|
|
</div>
|
|
|
</template>
|
|
|
<script lang='ts' setup >
|
|
|
+// @ts-nocheck
|
|
|
import HeaderPart from './components/HeaderPart.vue'
|
|
|
-import { getImageUrl } from "@/utils";
|
|
|
+import { getImageUrl, getTestTeachToken } from "@/utils";
|
|
|
import { ref, onMounted, nextTick } from 'vue'
|
|
|
import * as echarts from 'echarts'
|
|
|
+import exportButton from '@/components/exportButton.vue'
|
|
|
+import { useClazzStore } from '@/store/index'
|
|
|
+import { useRoute } from "vue-router";
|
|
|
+import { storeToRefs } from 'pinia'
|
|
|
+import dayjs from 'dayjs'
|
|
|
+import { exportClazzPDF } from '@/utils/exportPdf'
|
|
|
+import html2canvas from 'html2canvas'
|
|
|
+import { dataDesc } from '@/utils/text'
|
|
|
+
|
|
|
+const { p } = useRoute().query;
|
|
|
+
|
|
|
+ const clazzStore = useClazzStore()
|
|
|
+
|
|
|
+ const { baseData, clazzDomainData, clazzSceneData, studentDomainData } = storeToRefs(clazzStore)
|
|
|
+
|
|
|
+ const { getClazzBase, getClazzDomain, getClazzScene, getStudentDomain} = clazzStore
|
|
|
|
|
|
const clazzBase = [
|
|
|
{title: '记录总数', value: '20'},
|
|
@@ -60,7 +182,40 @@ import * as echarts from 'echarts'
|
|
|
{title: '问题探究', value: '20'},
|
|
|
]
|
|
|
|
|
|
- const recordLine = ref('')
|
|
|
+ const tableData = ref({
|
|
|
+ name: {
|
|
|
+ key: 'name',
|
|
|
+ title: '姓名',
|
|
|
+ data: ['姓名']
|
|
|
+ },
|
|
|
+ record: {
|
|
|
+ key: 'record',
|
|
|
+ title: '行为记录',
|
|
|
+ data: ['行为记录']
|
|
|
+ },
|
|
|
+ performances: {
|
|
|
+ key: 'performances',
|
|
|
+ title: '观察进阶',
|
|
|
+ data: {
|
|
|
+ 's1': ['s1'],
|
|
|
+ 's2': ['s2'],
|
|
|
+ 's3': ['s3'],
|
|
|
+ 's4': ['s4'],
|
|
|
+ 's5': ['s5'],
|
|
|
+ 's6': ['s6'],
|
|
|
+ 's7': ['s7'],
|
|
|
+ 's8': ['s8']
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ const recordLine = ref()
|
|
|
+
|
|
|
+ const observeLine = ref()
|
|
|
+
|
|
|
+ const recordChart = ref()
|
|
|
+
|
|
|
+ const observeChart = ref()
|
|
|
|
|
|
const echartsOption = {
|
|
|
tooltip: {
|
|
@@ -70,9 +225,10 @@ import * as echarts from 'echarts'
|
|
|
}
|
|
|
},
|
|
|
grid: {
|
|
|
- left: '3%',
|
|
|
- right: '4%',
|
|
|
- bottom: '3%',
|
|
|
+ top: '',
|
|
|
+ left: '1%',
|
|
|
+ right: '3%',
|
|
|
+ bottom: '1%',
|
|
|
containLabel: true
|
|
|
},
|
|
|
xAxis: {
|
|
@@ -81,7 +237,7 @@ import * as echarts from 'echarts'
|
|
|
},
|
|
|
yAxis: {
|
|
|
type: 'category',
|
|
|
- data: ['教师', '操场', '公共区', '走廊', '饲养区', '沙水池']
|
|
|
+ data: ['教师', '操场', '公共区', '走廊', '饲养区', '沙水池'],
|
|
|
},
|
|
|
series: [
|
|
|
{
|
|
@@ -93,18 +249,106 @@ import * as echarts from 'echarts'
|
|
|
]
|
|
|
};
|
|
|
|
|
|
+ const initRcordLineCharts = (options: any) => {
|
|
|
+ recordChart.value = echarts.init(recordLine.value);
|
|
|
+ recordChart.value.setOption(options);
|
|
|
+ }
|
|
|
+
|
|
|
+ const initObserveChartLineCharts = (options: any) => {
|
|
|
+ observeChart.value = echarts.init(observeLine.value);
|
|
|
+ observeChart.value.setOption(options);
|
|
|
+ }
|
|
|
+
|
|
|
+ const htmlToPng = () => {
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ html2canvas(document.querySelector("#capture")!).then(canvas => {
|
|
|
+ resolve(canvas.toDataURL(''))
|
|
|
+ });
|
|
|
+ })
|
|
|
+ }
|
|
|
|
|
|
- const initRcordLineCharts = () => {
|
|
|
+ const studentChartHtmlToPng = () => {
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ const style = document.createElement('style');
|
|
|
+ document.head.appendChild(style);
|
|
|
+ style.sheet?.insertRule('body > div:last-child img { display: inline-block; }');
|
|
|
|
|
|
+ html2canvas(document.querySelector("#htmlToPng")!).then(canvas => {
|
|
|
+ style.remove();
|
|
|
+ resolve(canvas.toDataURL(''))
|
|
|
+ });
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ const exportReport = () => {
|
|
|
+ nextTick(async () => {
|
|
|
+ console.log('recordChart:', recordChart);
|
|
|
+
|
|
|
|
|
|
- onMounted(() => {
|
|
|
- nextTick(() => {
|
|
|
- initRcordLineCharts()
|
|
|
+ const $par = {
|
|
|
+ baseData: baseData.value,
|
|
|
+ clazzDomainData: clazzDomainData.value,
|
|
|
+ clazzSceneData: clazzSceneData.value,
|
|
|
+ studentDomainData: studentDomainData.value,
|
|
|
+ clazzDomainChart: recordChart.value.getDataURL(),
|
|
|
+ clazzSceneChart: observeChart.value.getDataURL(),
|
|
|
+ basePng: await htmlToPng(),
|
|
|
+ studentPng: await studentChartHtmlToPng(),
|
|
|
+ }
|
|
|
+ exportClazzPDF($par)
|
|
|
})
|
|
|
- })
|
|
|
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ onMounted( async () => {
|
|
|
+ await getAppToken()
|
|
|
+ // await getTestTeachToken()
|
|
|
+ const $par = JSON.parse(decodeURIComponent(atob(p)))
|
|
|
+ // const $par = {"classIds":["1655822889577734146"],"gradeSemesterIds":["00","11","01","-10","-11","20","10","21"],"schoolId":"1304705665728421889","teacherIds":["1450638512771702786","1436187006844682241","1304705367924449281","1711187837184294914","1800414891962654721","1778693522847088641"]}
|
|
|
+ getClazzBase($par)
|
|
|
+ getClazzDomain($par).then(() => {
|
|
|
+
|
|
|
+ nextTick(() => {
|
|
|
+ console.log('clazzDomainData:', clazzDomainData?.value);
|
|
|
+
|
|
|
+ const $options = Object.assign({}, echartsOption)
|
|
|
+ //@ts-ignore
|
|
|
+ $options.yAxis.data = clazzDomainData.value[0]?.domains.map(item => item.name)
|
|
|
+ //@ts-ignore
|
|
|
+ $options.series[0].data = clazzDomainData.value[0]?.domains.map(item => item.count)
|
|
|
+ initRcordLineCharts($options)
|
|
|
+ })
|
|
|
+ })
|
|
|
+ getClazzScene($par).then(() => {
|
|
|
+ nextTick(() => {
|
|
|
+ const $options = Object.assign({}, echartsOption)
|
|
|
+ //@ts-ignore
|
|
|
+ $options.yAxis.data = clazzSceneData.value[0]?.scenes.map(item => item.name)
|
|
|
+ //@ts-ignore
|
|
|
+ $options.series[0].data = clazzSceneData.value[0]?.scenes.map(item => item.count)
|
|
|
+ initObserveChartLineCharts($options)
|
|
|
+ })
|
|
|
+ })
|
|
|
+ getStudentDomain($par).then(() => {
|
|
|
+ //@ts-ignore
|
|
|
+ tableData.value.name.data.push(...studentDomainData.value.map(item => item.babyName))
|
|
|
+ //@ts-ignore
|
|
|
+ tableData.value.record.data.push(...studentDomainData.value.map(item => item.behavior))
|
|
|
+ //@ts-ignore
|
|
|
+ studentDomainData.value.forEach( item => {
|
|
|
+ const keys = Object.keys(item).filter(key => key.includes('s'))
|
|
|
+ keys.forEach( key => {
|
|
|
+ //@ts-ignore
|
|
|
+ tableData.value.performances.data[key].push(item[key])
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ })
|
|
|
+ })
|
|
|
|
|
|
</script>
|
|
|
<style lang='scss' scoped >
|
|
@@ -125,6 +369,12 @@ import * as echarts from 'echarts'
|
|
|
width: 307px;
|
|
|
height: 192px;
|
|
|
background-size: 100% 100%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: flex-start;
|
|
|
+ justify-content: center;
|
|
|
+ padding-top: 40px;
|
|
|
+ padding-left: 20px;
|
|
|
}
|
|
|
.rd-info-bg {
|
|
|
width: 228px;
|
|
@@ -194,7 +444,8 @@ import * as echarts from 'echarts'
|
|
|
height: 40px;
|
|
|
display: flex;
|
|
|
background-color: rgb(113, 207, 224);
|
|
|
- font-size: 14px;
|
|
|
+ font-size: 12px;
|
|
|
+ color: #fff;
|
|
|
.title {
|
|
|
width: 50%;
|
|
|
display: flex;
|
|
@@ -212,9 +463,167 @@ import * as echarts from 'echarts'
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
.record-scene {
|
|
|
+ .line {
|
|
|
+ width: 100%;
|
|
|
+ height: 200px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .observe-scene {
|
|
|
+ .line {
|
|
|
+ width: 100%;
|
|
|
+ height: 200px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .total-scene {
|
|
|
+ display: flex;
|
|
|
+ .total-table {
|
|
|
+ width: 100%;
|
|
|
+ overflow: hidden;
|
|
|
+ overflow-x: scroll;
|
|
|
+ display: flex;
|
|
|
+ .total-table-item {
|
|
|
+ .performances-title {
|
|
|
+ width: 100%;
|
|
|
+ height: 20px;
|
|
|
+ background-color: rgb(51, 179, 92);
|
|
|
+ color: #fff;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ border-bottom: 1px solid #fff !important;
|
|
|
+ }
|
|
|
+ .performances-item-content {
|
|
|
+ display: flex;
|
|
|
+ border-top: 1px solid #fff !important;
|
|
|
+ .performances-item-conten-card:last-child {
|
|
|
+ .total-table-item-cell {
|
|
|
+ border-right: 1px solid #a19d9d;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .performances-subtitle {
|
|
|
+ width: 100%;
|
|
|
+ background-color: rgb(51, 179, 92);
|
|
|
+ height: 20px !important;
|
|
|
+ color: #fff;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+ .total-table-item-cell {
|
|
|
+ width: 100px;
|
|
|
+ height: 40px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ border-bottom: 1px solid #a19d9d;
|
|
|
+ border-left: 1px solid #a19d9d;
|
|
|
+ box-sizing: border-box;
|
|
|
+ margin-top: -1px;
|
|
|
+ }
|
|
|
+ .total-table-item-title {
|
|
|
+ width: 100px;
|
|
|
+ height: 40px;
|
|
|
+ background-color: rgb(51, 179, 92);
|
|
|
+ color: #fff;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+ .border-white {
|
|
|
+ border-left: 1px solid #fff;
|
|
|
+ border-bottom: 1px solid #fff;
|
|
|
+ border-top: none;
|
|
|
+ box-sizing: border-box;
|
|
|
+ margin-top: 0px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ .total-table-small {
|
|
|
+ width: 100%;
|
|
|
+ overflow: hidden;
|
|
|
+ overflow-x: scroll;
|
|
|
+ display: flex;
|
|
|
+ font-size: 10px;
|
|
|
+ .total-table-item {
|
|
|
+ .performances-title {
|
|
|
+ width: 100%;
|
|
|
+ height: 20px;
|
|
|
+ background-color: rgb(51, 179, 92);
|
|
|
+ color: #fff;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ }
|
|
|
+ .performances-item-content {
|
|
|
+ display: flex;
|
|
|
+ .performances-item-conten-card {
|
|
|
+ margin-top: 1px;
|
|
|
+ .total-table-item-cell-small {
|
|
|
+ width: 31px;
|
|
|
+ // height: 40px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ border-bottom: 1px solid #a19d9d;
|
|
|
+ border-left: 1px solid #a19d9d;
|
|
|
+ box-sizing: border-box;
|
|
|
+ margin-top: -1px;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ .performances-item-conten-card:last-child {
|
|
|
+ .total-table-item-cell-small {
|
|
|
+ border-right: 1px solid #a19d9d;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .performances-subtitle {
|
|
|
+ width: 100%;
|
|
|
+ background-color: rgb(51, 179, 92);
|
|
|
+ color: #fff;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+ .total-table-item-cell {
|
|
|
+ width: 38px;
|
|
|
+ height: 40px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ border-bottom: 1px solid #a19d9d;
|
|
|
+ border-left: 1px solid #a19d9d;
|
|
|
+ box-sizing: border-box;
|
|
|
+ margin-top: -1px;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
|
|
|
+ .total-table-item-title {
|
|
|
+ width: 38px;
|
|
|
+ height: 40px;
|
|
|
+ background-color: rgb(51, 179, 92);
|
|
|
+ color: #fff;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ box-sizing: border-box;
|
|
|
+ white-space: normal;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+ .border-white {
|
|
|
+ border-left: 1px solid #fff !important;
|
|
|
+ border-bottom: 1px solid #fff !important;
|
|
|
+ border-top: none;
|
|
|
+ box-sizing: border-box;
|
|
|
+ margin-top: 0px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|