diff --git a/src/App.vue b/src/App.vue
index 93d7575..ab297ac 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,4 +1,10 @@
-
diff --git a/src/components/qiun-data-charts/qiun-data-charts.vue b/src/components/qiun-data-charts/qiun-data-charts.vue
new file mode 100644
index 0000000..c27c445
--- /dev/null
+++ b/src/components/qiun-data-charts/qiun-data-charts.vue
@@ -0,0 +1,1584 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/qiun-error/qiun-error.vue b/src/components/qiun-error/qiun-error.vue
new file mode 100644
index 0000000..b15b19f
--- /dev/null
+++ b/src/components/qiun-error/qiun-error.vue
@@ -0,0 +1,46 @@
+
+
+
+ {{errorMessage==null?'请点击重试':errorMessage}}
+
+
+
+
+
+
diff --git a/src/components/qiun-loading/loading1.vue b/src/components/qiun-loading/loading1.vue
new file mode 100644
index 0000000..b701394
--- /dev/null
+++ b/src/components/qiun-loading/loading1.vue
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/qiun-loading/loading2.vue b/src/components/qiun-loading/loading2.vue
new file mode 100644
index 0000000..7541b31
--- /dev/null
+++ b/src/components/qiun-loading/loading2.vue
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/qiun-loading/loading3.vue b/src/components/qiun-loading/loading3.vue
new file mode 100644
index 0000000..8e14db3
--- /dev/null
+++ b/src/components/qiun-loading/loading3.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/qiun-loading/loading4.vue b/src/components/qiun-loading/loading4.vue
new file mode 100644
index 0000000..77c55b7
--- /dev/null
+++ b/src/components/qiun-loading/loading4.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/qiun-loading/loading5.vue b/src/components/qiun-loading/loading5.vue
new file mode 100644
index 0000000..cb93a55
--- /dev/null
+++ b/src/components/qiun-loading/loading5.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/qiun-loading/qiun-loading.vue b/src/components/qiun-loading/qiun-loading.vue
new file mode 100644
index 0000000..7789060
--- /dev/null
+++ b/src/components/qiun-loading/qiun-loading.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/qiun-title-bar/qiun-title-bar.vue b/src/components/qiun-title-bar/qiun-title-bar.vue
new file mode 100644
index 0000000..f235f17
--- /dev/null
+++ b/src/components/qiun-title-bar/qiun-title-bar.vue
@@ -0,0 +1,51 @@
+
+
+
+ {{title}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/tongtong-plate/plate-keyboard.vue b/src/components/tongtong-plate/plate-keyboard.vue
new file mode 100644
index 0000000..e0c4ebb
--- /dev/null
+++ b/src/components/tongtong-plate/plate-keyboard.vue
@@ -0,0 +1,277 @@
+
+
+
+
+ 请点击选择车牌号
+
+
+
+
+
+
+
+ ABC
+
+ {{ it }}
+
+
+
+
+
+
+
+
+ 省
+ 字
+ {{ it }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/tongtong-plate/plate-number.vue b/src/components/tongtong-plate/plate-number.vue
new file mode 100644
index 0000000..d9891f2
--- /dev/null
+++ b/src/components/tongtong-plate/plate-number.vue
@@ -0,0 +1,312 @@
+
+
+
+
+ ·
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/u-charts/config-echarts.js b/src/components/u-charts/config-echarts.js
new file mode 100644
index 0000000..7b8168f
--- /dev/null
+++ b/src/components/u-charts/config-echarts.js
@@ -0,0 +1,422 @@
+/*
+ * uCharts®
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台
+ * Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ *
+ * uCharts®官方网站
+ * https://www.uCharts.cn
+ *
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ *
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ *
+ */
+
+// 通用配置项
+
+// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
+const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'];
+
+const cfe = {
+ //demotype为自定义图表类型
+ "type": ["pie", "ring", "rose", "funnel", "line", "column", "area", "radar", "gauge","candle","demotype"],
+ //增加自定义图表类型,如果需要categories,请在这里加入您的图表类型例如最后的"demotype"
+ "categories": ["line", "column", "area", "radar", "gauge", "candle","demotype"],
+ //instance为实例变量承载属性,option为eopts承载属性,不要删除
+ "instance": {},
+ "option": {},
+ //下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
+ "formatter":{
+ "tooltipDemo1":function(res){
+ let result = ''
+ for (let i in res) {
+ if (i == 0) {
+ result += res[i].axisValueLabel + '年销售额'
+ }
+ let value = '--'
+ if (res[i].data !== null) {
+ value = res[i].data
+ }
+ // #ifdef H5
+ result += '\n' + res[i].seriesName + ':' + value + ' 万元'
+ // #endif
+
+ // #ifdef APP-PLUS
+ result += '
' + res[i].marker + res[i].seriesName + ':' + value + ' 万元'
+ // #endif
+ }
+ return result;
+ },
+ legendFormat:function(name){
+ return "自定义图例+"+name;
+ },
+ yAxisFormatDemo:function (value, index) {
+ return value + '元';
+ },
+ seriesFormatDemo:function(res){
+ return res.name + '年' + res.value + '元';
+ }
+ },
+ //这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在eopts参数,会将demotype与eopts中option合并后渲染图表。
+ "demotype":{
+ "color": color,
+ //在这里填写echarts的option即可
+
+ },
+ //下面是自定义配置,请添加项目所需的通用配置
+ "column": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'axis'
+ },
+ "grid": {
+ "top": 30,
+ "bottom": 50,
+ "right": 15,
+ "left": 40
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "toolbox": {
+ "show": false,
+ },
+ "xAxis": {
+ "type": 'category',
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ "boundaryGap": true,
+ "data": []
+ },
+ "yAxis": {
+ "type": 'value',
+ "axisTick": {
+ "show": false,
+ },
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'bar',
+ "data": [],
+ "barwidth": 20,
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ },
+ },
+ "line": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'axis'
+ },
+ "grid": {
+ "top": 30,
+ "bottom": 50,
+ "right": 15,
+ "left": 40
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "toolbox": {
+ "show": false,
+ },
+ "xAxis": {
+ "type": 'category',
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ "boundaryGap": true,
+ "data": []
+ },
+ "yAxis": {
+ "type": 'value',
+ "axisTick": {
+ "show": false,
+ },
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'line',
+ "data": [],
+ "barwidth": 20,
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ },
+ },
+ "area": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'axis'
+ },
+ "grid": {
+ "top": 30,
+ "bottom": 50,
+ "right": 15,
+ "left": 40
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "toolbox": {
+ "show": false,
+ },
+ "xAxis": {
+ "type": 'category',
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ "boundaryGap": true,
+ "data": []
+ },
+ "yAxis": {
+ "type": 'value',
+ "axisTick": {
+ "show": false,
+ },
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'line',
+ "data": [],
+ "areaStyle": {},
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ },
+ },
+ "pie": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'item'
+ },
+ "grid": {
+ "top": 40,
+ "bottom": 30,
+ "right": 15,
+ "left": 15
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'pie',
+ "data": [],
+ "radius": '50%',
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ },
+ },
+ "ring": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'item'
+ },
+ "grid": {
+ "top": 40,
+ "bottom": 30,
+ "right": 15,
+ "left": 15
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'pie',
+ "data": [],
+ "radius": ['40%', '70%'],
+ "avoidLabelOverlap": false,
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ "labelLine": {
+ "show": true
+ },
+ },
+ },
+ "rose": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'item'
+ },
+ "legend": {
+ "top": 'bottom'
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'pie',
+ "data": [],
+ "radius": "55%",
+ "center": ['50%', '50%'],
+ "roseType": 'area',
+ },
+ },
+ "funnel": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'item',
+ "formatter": "{b} : {c}%"
+ },
+ "legend": {
+ "top": 'bottom'
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'funnel',
+ "left": '10%',
+ "top": 60,
+ "bottom": 60,
+ "width": '80%',
+ "min": 0,
+ "max": 100,
+ "minSize": '0%',
+ "maxSize": '100%',
+ "sort": 'descending',
+ "gap": 2,
+ "label": {
+ "show": true,
+ "position": 'inside'
+ },
+ "labelLine": {
+ "length": 10,
+ "lineStyle": {
+ "width": 1,
+ "type": 'solid'
+ }
+ },
+ "itemStyle": {
+ "bordercolor": '#fff',
+ "borderwidth": 1
+ },
+ "emphasis": {
+ "label": {
+ "fontSize": 20
+ }
+ },
+ "data": [],
+ },
+ },
+ "gauge": {
+ "color": color,
+ "tooltip": {
+ "formatter": '{a}
{b} : {c}%'
+ },
+ "seriesTemplate": {
+ "name": '业务指标',
+ "type": 'gauge',
+ "detail": {"formatter": '{value}%'},
+ "data": [{"value": 50, "name": '完成率'}]
+ },
+ },
+ "candle": {
+ "xAxis": {
+ "data": []
+ },
+ "yAxis": {},
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "dataZoom": [{
+ "type": 'inside',
+ "xAxisIndex": [0, 1],
+ "start": 10,
+ "end": 100
+ },
+ {
+ "show": true,
+ "xAxisIndex": [0, 1],
+ "type": 'slider',
+ "bottom": 10,
+ "start": 10,
+ "end": 100
+ }
+ ],
+ "seriesTemplate": {
+ "name": '',
+ "type": 'k',
+ "data": [],
+ },
+ }
+}
+
+export default cfe;
\ No newline at end of file
diff --git a/src/components/u-charts/config-ucharts.js b/src/components/u-charts/config-ucharts.js
new file mode 100644
index 0000000..80bb368
--- /dev/null
+++ b/src/components/u-charts/config-ucharts.js
@@ -0,0 +1,663 @@
+/*
+ * uCharts®
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台
+ * Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ *
+ * uCharts®官方网站
+ * https://www.uCharts.cn
+ *
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ *
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ *
+ */
+
+// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
+const color = ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", "#ea7ccc"]
+
+//事件转换函数,主要用作格式化x轴为时间轴,根据需求自行修改
+const formatDateTime = (timeStamp, returnType) => {
+ var date = new Date()
+ date.setTime(timeStamp * 1000)
+ var y = date.getFullYear()
+ var m = date.getMonth() + 1
+ m = m < 10 ? "0" + m : m
+ var d = date.getDate()
+ d = d < 10 ? "0" + d : d
+ var h = date.getHours()
+ h = h < 10 ? "0" + h : h
+ var minute = date.getMinutes()
+ var second = date.getSeconds()
+ minute = minute < 10 ? "0" + minute : minute
+ second = second < 10 ? "0" + second : second
+ if (returnType == "full") {
+ return y + "-" + m + "-" + d + " " + h + ":" + minute + ":" + second
+ }
+ if (returnType == "y-m-d") {
+ return y + "-" + m + "-" + d
+ }
+ if (returnType == "h:m") {
+ return h + ":" + minute
+ }
+ if (returnType == "h:m:s") {
+ return h + ":" + minute + ":" + second
+ }
+ return [y, m, d, h, minute, second]
+}
+
+const cfu = {
+ //demotype为自定义图表类型,一般不需要自定义图表类型,只需要改根节点上对应的类型即可
+ type: [
+ "pie",
+ "ring",
+ "rose",
+ "word",
+ "funnel",
+ "map",
+ "arcbar",
+ "line",
+ "column",
+ "mount",
+ "bar",
+ "area",
+ "radar",
+ "gauge",
+ "candle",
+ "mix",
+ "tline",
+ "tarea",
+ "scatter",
+ "bubble",
+ "demotype",
+ ],
+ range: [
+ "饼状图",
+ "圆环图",
+ "玫瑰图",
+ "词云图",
+ "漏斗图",
+ "地图",
+ "圆弧进度条",
+ "折线图",
+ "柱状图",
+ "山峰图",
+ "条状图",
+ "区域图",
+ "雷达图",
+ "仪表盘",
+ "K线图",
+ "混合图",
+ "时间轴折线",
+ "时间轴区域",
+ "散点图",
+ "气泡图",
+ "自定义类型",
+ ],
+ //增加自定义图表类型,如果需要categories,请在这里加入您的图表类型,例如最后的"demotype"
+ //自定义类型时需要注意"tline","tarea","scatter","bubble"等时间轴(矢量x轴)类图表,没有categories,不需要加入categories
+ categories: ["line", "column", "mount", "bar", "area", "radar", "gauge", "candle", "mix", "demotype"],
+ //instance为实例变量承载属性,不要删除
+ instance: {},
+ //option为opts及eopts承载属性,不要删除
+ option: {},
+ //下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
+ formatter: {
+ yAxisDemo1: function (val, index, opts) {
+ return val + "元"
+ },
+ yAxisDemo2: function (val, index, opts) {
+ return val.toFixed(2)
+ },
+ xAxisDemo1: function (val, index, opts) {
+ return val + "年"
+ },
+ xAxisDemo2: function (val, index, opts) {
+ return formatDateTime(val, "h:m")
+ },
+ seriesDemo1: function (val, index, series, opts) {
+ return val + "元"
+ },
+ tooltipDemo1: function (item, category, index, opts) {
+ if (index == 0) {
+ return "随便用" + item.data + "年"
+ } else {
+ return "其他我没改" + item.data + "天"
+ }
+ },
+ pieDemo: function (val, index, series, opts) {
+ if (index !== undefined) {
+ return series[index].name + ":" + series[index].data + "元"
+ }
+ },
+ // 食堂喜好分析饼图提示格式化
+ canteenPieTooltip: function (item, category, index, opts) {
+ return `分类:${item.classifyName || ""}/br/购买总数量:${item.payCount}/br/购买总金额:${Number(item.totalPrice) / 100.0}元`
+ },
+ // 食堂喜好分析折现图提示格式化
+ canteenAreaTooltip: function (item, category, index, opts) {
+ console.log(item, category, index, opts)
+ },
+ },
+ //这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在opts参数,会将demotype与opts中option合并后渲染图表。
+ demotype: {
+ //我这里把曲线图当做了自定义图表类型,您可以根据需要随意指定类型或配置
+ type: "line",
+ color: color,
+ padding: [15, 10, 0, 15],
+ xAxis: {
+ disableGrid: true,
+ },
+ yAxis: {
+ gridType: "dash",
+ dashLength: 2,
+ },
+ legend: {},
+ extra: {
+ line: {
+ type: "curve",
+ width: 2,
+ },
+ },
+ },
+ //下面是自定义配置,请添加项目所需的通用配置
+ pie: {
+ type: "pie",
+ color: color,
+ padding: [5, 5, 5, 5],
+ extra: {
+ pie: {
+ activeOpacity: 0.5,
+ activeRadius: 10,
+ offsetAngle: 0,
+ labelWidth: 15,
+ border: true,
+ borderWidth: 3,
+ borderColor: "#FFFFFF",
+ },
+ },
+ },
+ ring: {
+ type: "ring",
+ color: color,
+ padding: [5, 5, 5, 5],
+ rotate: false,
+ dataLabel: true,
+ legend: {
+ show: true,
+ position: "right",
+ lineHeight: 25,
+ },
+ title: {
+ name: "收益率",
+ fontSize: 15,
+ color: "#666666",
+ },
+ subtitle: {
+ name: "70%",
+ fontSize: 25,
+ color: "#7cb5ec",
+ },
+ extra: {
+ ring: {
+ ringWidth: 30,
+ activeOpacity: 0.5,
+ activeRadius: 10,
+ offsetAngle: 0,
+ labelWidth: 15,
+ border: true,
+ borderWidth: 3,
+ borderColor: "#FFFFFF",
+ },
+ },
+ },
+ rose: {
+ type: "rose",
+ color: color,
+ padding: [5, 5, 5, 5],
+ legend: {
+ show: true,
+ position: "left",
+ lineHeight: 25,
+ },
+ extra: {
+ rose: {
+ type: "area",
+ minRadius: 50,
+ activeOpacity: 0.5,
+ activeRadius: 10,
+ offsetAngle: 0,
+ labelWidth: 15,
+ border: false,
+ borderWidth: 2,
+ borderColor: "#FFFFFF",
+ },
+ },
+ },
+ word: {
+ type: "word",
+ color: color,
+ extra: {
+ word: {
+ type: "normal",
+ autoColors: false,
+ },
+ },
+ },
+ funnel: {
+ type: "funnel",
+ color: color,
+ padding: [15, 15, 0, 15],
+ extra: {
+ funnel: {
+ activeOpacity: 0.3,
+ activeWidth: 10,
+ border: true,
+ borderWidth: 2,
+ borderColor: "#FFFFFF",
+ fillOpacity: 1,
+ labelAlign: "right",
+ },
+ },
+ },
+ map: {
+ type: "map",
+ color: color,
+ padding: [0, 0, 0, 0],
+ dataLabel: true,
+ extra: {
+ map: {
+ border: true,
+ borderWidth: 1,
+ borderColor: "#666666",
+ fillOpacity: 0.6,
+ activeBorderColor: "#F04864",
+ activeFillColor: "#FACC14",
+ activeFillOpacity: 1,
+ },
+ },
+ },
+ arcbar: {
+ type: "arcbar",
+ color: color,
+ title: {
+ name: "百分比",
+ fontSize: 25,
+ color: "#00FF00",
+ },
+ subtitle: {
+ name: "默认标题",
+ fontSize: 15,
+ color: "#666666",
+ },
+ extra: {
+ arcbar: {
+ type: "default",
+ width: 12,
+ backgroundColor: "#E9E9E9",
+ startAngle: 0.75,
+ endAngle: 0.25,
+ gap: 2,
+ },
+ },
+ },
+ line: {
+ type: "line",
+ color: color,
+ padding: [15, 10, 0, 15],
+ xAxis: {
+ disableGrid: true,
+ },
+ yAxis: {
+ gridType: "dash",
+ dashLength: 2,
+ },
+ legend: {},
+ extra: {
+ line: {
+ type: "straight",
+ width: 2,
+ activeType: "hollow",
+ },
+ },
+ },
+ tline: {
+ type: "line",
+ color: color,
+ padding: [15, 10, 0, 15],
+ xAxis: {
+ disableGrid: false,
+ boundaryGap: "justify",
+ },
+ yAxis: {
+ gridType: "dash",
+ dashLength: 2,
+ data: [
+ {
+ min: 0,
+ max: 80,
+ },
+ ],
+ },
+ legend: {},
+ extra: {
+ line: {
+ type: "curve",
+ width: 2,
+ activeType: "hollow",
+ },
+ },
+ },
+ tarea: {
+ type: "area",
+ color: color,
+ padding: [15, 10, 0, 15],
+ xAxis: {
+ disableGrid: true,
+ boundaryGap: "justify",
+ },
+ yAxis: {
+ gridType: "dash",
+ dashLength: 2,
+ data: [
+ {
+ min: 0,
+ max: 80,
+ },
+ ],
+ },
+ legend: {},
+ extra: {
+ area: {
+ type: "curve",
+ opacity: 0.2,
+ addLine: true,
+ width: 2,
+ gradient: true,
+ activeType: "hollow",
+ },
+ },
+ },
+ column: {
+ type: "column",
+ color: color,
+ padding: [15, 15, 0, 5],
+ xAxis: {
+ disableGrid: true,
+ },
+ yAxis: {
+ data: [{ min: 0 }],
+ },
+ legend: {},
+ extra: {
+ column: {
+ type: "group",
+ width: 30,
+ activeBgColor: "#000000",
+ activeBgOpacity: 0.08,
+ },
+ },
+ },
+ mount: {
+ type: "mount",
+ color: color,
+ padding: [15, 15, 0, 5],
+ xAxis: {
+ disableGrid: true,
+ },
+ yAxis: {
+ data: [{ min: 0 }],
+ },
+ legend: {},
+ extra: {
+ mount: {
+ type: "mount",
+ widthRatio: 1.5,
+ },
+ },
+ },
+ bar: {
+ type: "bar",
+ color: color,
+ padding: [15, 30, 0, 5],
+ xAxis: {
+ boundaryGap: "justify",
+ disableGrid: false,
+ min: 0,
+ axisLine: false,
+ },
+ yAxis: {},
+ legend: {},
+ extra: {
+ bar: {
+ type: "group",
+ width: 30,
+ meterBorde: 1,
+ meterFillColor: "#FFFFFF",
+ activeBgColor: "#000000",
+ activeBgOpacity: 0.08,
+ },
+ },
+ },
+ area: {
+ type: "area",
+ color: color,
+ padding: [15, 15, 0, 15],
+ xAxis: {
+ disableGrid: true,
+ },
+ yAxis: {
+ gridType: "dash",
+ dashLength: 2,
+ },
+ legend: {},
+ extra: {
+ area: {
+ type: "straight",
+ opacity: 0.2,
+ addLine: true,
+ width: 2,
+ gradient: false,
+ activeType: "hollow",
+ },
+ },
+ },
+ radar: {
+ type: "radar",
+ color: color,
+ padding: [5, 5, 5, 5],
+ dataLabel: false,
+ legend: {
+ show: true,
+ position: "right",
+ lineHeight: 25,
+ },
+ extra: {
+ radar: {
+ gridType: "radar",
+ gridColor: "#CCCCCC",
+ gridCount: 3,
+ opacity: 0.2,
+ max: 200,
+ labelShow: true,
+ },
+ },
+ },
+ gauge: {
+ type: "gauge",
+ color: color,
+ title: {
+ name: "66Km/H",
+ fontSize: 25,
+ color: "#2fc25b",
+ offsetY: 50,
+ },
+ subtitle: {
+ name: "实时速度",
+ fontSize: 15,
+ color: "#1890ff",
+ offsetY: -50,
+ },
+ extra: {
+ gauge: {
+ type: "default",
+ width: 30,
+ labelColor: "#666666",
+ startAngle: 0.75,
+ endAngle: 0.25,
+ startNumber: 0,
+ endNumber: 100,
+ labelFormat: "",
+ splitLine: {
+ fixRadius: 0,
+ splitNumber: 10,
+ width: 30,
+ color: "#FFFFFF",
+ childNumber: 5,
+ childWidth: 12,
+ },
+ pointer: {
+ width: 24,
+ color: "auto",
+ },
+ },
+ },
+ },
+ candle: {
+ type: "candle",
+ color: color,
+ padding: [15, 15, 0, 15],
+ enableScroll: true,
+ enableMarkLine: true,
+ dataLabel: false,
+ xAxis: {
+ labelCount: 4,
+ itemCount: 40,
+ disableGrid: true,
+ gridColor: "#CCCCCC",
+ gridType: "solid",
+ dashLength: 4,
+ scrollShow: true,
+ scrollAlign: "left",
+ scrollColor: "#A6A6A6",
+ scrollBackgroundColor: "#EFEBEF",
+ },
+ yAxis: {},
+ legend: {},
+ extra: {
+ candle: {
+ color: {
+ upLine: "#f04864",
+ upFill: "#f04864",
+ downLine: "#2fc25b",
+ downFill: "#2fc25b",
+ },
+ average: {
+ show: true,
+ name: ["MA5", "MA10", "MA30"],
+ day: [5, 10, 20],
+ color: ["#1890ff", "#2fc25b", "#facc14"],
+ },
+ },
+ markLine: {
+ type: "dash",
+ dashLength: 5,
+ data: [
+ {
+ value: 2150,
+ lineColor: "#f04864",
+ showLabel: true,
+ },
+ {
+ value: 2350,
+ lineColor: "#f04864",
+ showLabel: true,
+ },
+ ],
+ },
+ },
+ },
+ mix: {
+ type: "mix",
+ color: color,
+ padding: [15, 15, 0, 15],
+ xAxis: {
+ disableGrid: true,
+ },
+ yAxis: {
+ disabled: false,
+ disableGrid: false,
+ splitNumber: 5,
+ gridType: "dash",
+ dashLength: 4,
+ gridColor: "#CCCCCC",
+ padding: 10,
+ showTitle: true,
+ data: [],
+ },
+ legend: {},
+ extra: {
+ mix: {
+ column: {
+ width: 20,
+ },
+ },
+ },
+ },
+ scatter: {
+ type: "scatter",
+ color: color,
+ padding: [15, 15, 0, 15],
+ dataLabel: false,
+ xAxis: {
+ disableGrid: false,
+ gridType: "dash",
+ splitNumber: 5,
+ boundaryGap: "justify",
+ min: 0,
+ },
+ yAxis: {
+ disableGrid: false,
+ gridType: "dash",
+ },
+ legend: {},
+ extra: {
+ scatter: {},
+ },
+ },
+ bubble: {
+ type: "bubble",
+ color: color,
+ padding: [15, 15, 0, 15],
+ xAxis: {
+ disableGrid: false,
+ gridType: "dash",
+ splitNumber: 5,
+ boundaryGap: "justify",
+ min: 0,
+ max: 250,
+ },
+ yAxis: {
+ disableGrid: false,
+ gridType: "dash",
+ data: [
+ {
+ min: 0,
+ max: 150,
+ },
+ ],
+ },
+ legend: {},
+ extra: {
+ bubble: {
+ border: 2,
+ opacity: 0.5,
+ },
+ },
+ },
+}
+
+export default cfu
diff --git a/src/components/u-charts/u-charts.js b/src/components/u-charts/u-charts.js
new file mode 100644
index 0000000..2b28105
--- /dev/null
+++ b/src/components/u-charts/u-charts.js
@@ -0,0 +1,8185 @@
+/*
+ * uCharts (R)
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360/快手)、Vue、Taro等支持canvas的框架平台
+ * Copyright (C) 2018-2022 QIUN (R) 秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ *
+ * uCharts (R) 官方网站
+ * https://www.uCharts.cn
+ *
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ *
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ *
+ */
+
+"use strict"
+
+var config = {
+ version: "v2.5.0-20230101",
+ yAxisWidth: 15,
+ xAxisHeight: 22,
+ padding: [10, 10, 10, 10],
+ rotate: false,
+ fontSize: 13,
+ fontColor: "#666666",
+ dataPointShape: ["circle", "circle", "circle", "circle"],
+ color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", "#ea7ccc"],
+ linearColor: ["#0EE2F8", "#2BDCA8", "#FA7D8D", "#EB88E2", "#2AE3A0", "#0EE2F8", "#EB88E2", "#6773E3", "#F78A85"],
+ pieChartLinePadding: 15,
+ pieChartTextPadding: 5,
+ titleFontSize: 20,
+ subtitleFontSize: 15,
+ radarLabelTextMargin: 13,
+}
+
+var assign = function (target, ...varArgs) {
+ if (target == null) {
+ throw new TypeError("[uCharts] Cannot convert undefined or null to object")
+ }
+ if (!varArgs || varArgs.length <= 0) {
+ return target
+ }
+ // 深度合并对象
+ function deepAssign(obj1, obj2) {
+ for (let key in obj2) {
+ obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" ? deepAssign(obj1[key], obj2[key]) : (obj1[key] = obj2[key])
+ }
+ return obj1
+ }
+ varArgs.forEach((val) => {
+ target = deepAssign(target, val)
+ })
+ return target
+}
+
+var util = {
+ toFixed: function toFixed(num, limit) {
+ limit = limit || 2
+ if (this.isFloat(num)) {
+ num = num.toFixed(limit)
+ }
+ return num
+ },
+ isFloat: function isFloat(num) {
+ return num % 1 !== 0
+ },
+ approximatelyEqual: function approximatelyEqual(num1, num2) {
+ return Math.abs(num1 - num2) < 1e-10
+ },
+ isSameSign: function isSameSign(num1, num2) {
+ return (Math.abs(num1) === num1 && Math.abs(num2) === num2) || (Math.abs(num1) !== num1 && Math.abs(num2) !== num2)
+ },
+ isSameXCoordinateArea: function isSameXCoordinateArea(p1, p2) {
+ return this.isSameSign(p1.x, p2.x)
+ },
+ isCollision: function isCollision(obj1, obj2) {
+ obj1.end = {}
+ obj1.end.x = obj1.start.x + obj1.width
+ obj1.end.y = obj1.start.y - obj1.height
+ obj2.end = {}
+ obj2.end.x = obj2.start.x + obj2.width
+ obj2.end.y = obj2.start.y - obj2.height
+ var flag = obj2.start.x > obj1.end.x || obj2.end.x < obj1.start.x || obj2.end.y > obj1.start.y || obj2.start.y < obj1.end.y
+ return !flag
+ },
+}
+
+//兼容H5点击事件
+function getH5Offset(e) {
+ e.mp = {
+ changedTouches: [],
+ }
+ e.mp.changedTouches.push({
+ x: e.offsetX,
+ y: e.offsetY,
+ })
+ return e
+}
+
+// hex 转 rgba
+function hexToRgb(hexValue, opc) {
+ var rgx = /^#?([a-f\d])([a-f\d])([a-f\d])$/i
+ var hex = hexValue.replace(rgx, function (m, r, g, b) {
+ return r + r + g + g + b + b
+ })
+ var rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
+ var r = parseInt(rgb[1], 16)
+ var g = parseInt(rgb[2], 16)
+ var b = parseInt(rgb[3], 16)
+ return "rgba(" + r + "," + g + "," + b + "," + opc + ")"
+}
+
+function findRange(num, type, limit) {
+ if (isNaN(num)) {
+ throw new Error("[uCharts] series数据需为Number格式")
+ }
+ limit = limit || 10
+ type = type ? type : "upper"
+ var multiple = 1
+ while (limit < 1) {
+ limit *= 10
+ multiple *= 10
+ }
+ if (type === "upper") {
+ num = Math.ceil(num * multiple)
+ } else {
+ num = Math.floor(num * multiple)
+ }
+ while (num % limit !== 0) {
+ if (type === "upper") {
+ if (num == num + 1) {
+ //修复数据值过大num++无效的bug by 向日葵 @xrk_jy
+ break
+ }
+ num++
+ } else {
+ num--
+ }
+ }
+ return num / multiple
+}
+
+function calCandleMA(dayArr, nameArr, colorArr, kdata) {
+ let seriesTemp = []
+ for (let k = 0; k < dayArr.length; k++) {
+ let seriesItem = {
+ data: [],
+ name: nameArr[k],
+ color: colorArr[k],
+ }
+ for (let i = 0, len = kdata.length; i < len; i++) {
+ if (i < dayArr[k]) {
+ seriesItem.data.push(null)
+ continue
+ }
+ let sum = 0
+ for (let j = 0; j < dayArr[k]; j++) {
+ sum += kdata[i - j][1]
+ }
+ seriesItem.data.push(+(sum / dayArr[k]).toFixed(3))
+ }
+ seriesTemp.push(seriesItem)
+ }
+ return seriesTemp
+}
+
+function calValidDistance(self, distance, chartData, config, opts) {
+ var dataChartAreaWidth = opts.width - opts.area[1] - opts.area[3]
+ var dataChartWidth = chartData.eachSpacing * (opts.chartData.xAxisData.xAxisPoints.length - 1)
+ if (opts.type == "mount" && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1) {
+ if (opts.extra.mount.widthRatio > 2) opts.extra.mount.widthRatio = 2
+ dataChartWidth += (opts.extra.mount.widthRatio - 1) * chartData.eachSpacing
+ }
+ var validDistance = distance
+ if (distance >= 0) {
+ validDistance = 0
+ self.uevent.trigger("scrollLeft")
+ self.scrollOption.position = "left"
+ opts.xAxis.scrollPosition = "left"
+ } else if (Math.abs(distance) >= dataChartWidth - dataChartAreaWidth) {
+ validDistance = dataChartAreaWidth - dataChartWidth
+ self.uevent.trigger("scrollRight")
+ self.scrollOption.position = "right"
+ opts.xAxis.scrollPosition = "right"
+ } else {
+ self.scrollOption.position = distance
+ opts.xAxis.scrollPosition = distance
+ }
+ return validDistance
+}
+
+function isInAngleRange(angle, startAngle, endAngle) {
+ function adjust(angle) {
+ while (angle < 0) {
+ angle += 2 * Math.PI
+ }
+ while (angle > 2 * Math.PI) {
+ angle -= 2 * Math.PI
+ }
+ return angle
+ }
+ angle = adjust(angle)
+ startAngle = adjust(startAngle)
+ endAngle = adjust(endAngle)
+ if (startAngle > endAngle) {
+ endAngle += 2 * Math.PI
+ if (angle < startAngle) {
+ angle += 2 * Math.PI
+ }
+ }
+ return angle >= startAngle && angle <= endAngle
+}
+
+function createCurveControlPoints(points, i) {
+ function isNotMiddlePoint(points, i) {
+ if (points[i - 1] && points[i + 1]) {
+ return points[i].y >= Math.max(points[i - 1].y, points[i + 1].y) || points[i].y <= Math.min(points[i - 1].y, points[i + 1].y)
+ } else {
+ return false
+ }
+ }
+ function isNotMiddlePointX(points, i) {
+ if (points[i - 1] && points[i + 1]) {
+ return points[i].x >= Math.max(points[i - 1].x, points[i + 1].x) || points[i].x <= Math.min(points[i - 1].x, points[i + 1].x)
+ } else {
+ return false
+ }
+ }
+ var a = 0.2
+ var b = 0.2
+ var pAx = null
+ var pAy = null
+ var pBx = null
+ var pBy = null
+ if (i < 1) {
+ pAx = points[0].x + (points[1].x - points[0].x) * a
+ pAy = points[0].y + (points[1].y - points[0].y) * a
+ } else {
+ pAx = points[i].x + (points[i + 1].x - points[i - 1].x) * a
+ pAy = points[i].y + (points[i + 1].y - points[i - 1].y) * a
+ }
+
+ if (i > points.length - 3) {
+ var last = points.length - 1
+ pBx = points[last].x - (points[last].x - points[last - 1].x) * b
+ pBy = points[last].y - (points[last].y - points[last - 1].y) * b
+ } else {
+ pBx = points[i + 1].x - (points[i + 2].x - points[i].x) * b
+ pBy = points[i + 1].y - (points[i + 2].y - points[i].y) * b
+ }
+ if (isNotMiddlePoint(points, i + 1)) {
+ pBy = points[i + 1].y
+ }
+ if (isNotMiddlePoint(points, i)) {
+ pAy = points[i].y
+ }
+ if (isNotMiddlePointX(points, i + 1)) {
+ pBx = points[i + 1].x
+ }
+ if (isNotMiddlePointX(points, i)) {
+ pAx = points[i].x
+ }
+ if (pAy >= Math.max(points[i].y, points[i + 1].y) || pAy <= Math.min(points[i].y, points[i + 1].y)) {
+ pAy = points[i].y
+ }
+ if (pBy >= Math.max(points[i].y, points[i + 1].y) || pBy <= Math.min(points[i].y, points[i + 1].y)) {
+ pBy = points[i + 1].y
+ }
+ if (pAx >= Math.max(points[i].x, points[i + 1].x) || pAx <= Math.min(points[i].x, points[i + 1].x)) {
+ pAx = points[i].x
+ }
+ if (pBx >= Math.max(points[i].x, points[i + 1].x) || pBx <= Math.min(points[i].x, points[i + 1].x)) {
+ pBx = points[i + 1].x
+ }
+ return {
+ ctrA: {
+ x: pAx,
+ y: pAy,
+ },
+ ctrB: {
+ x: pBx,
+ y: pBy,
+ },
+ }
+}
+
+function convertCoordinateOrigin(x, y, center) {
+ return {
+ x: center.x + x,
+ y: center.y - y,
+ }
+}
+
+function avoidCollision(obj, target) {
+ if (target) {
+ // is collision test
+ while (util.isCollision(obj, target)) {
+ if (obj.start.x > 0) {
+ obj.start.y--
+ } else if (obj.start.x < 0) {
+ obj.start.y++
+ } else {
+ if (obj.start.y > 0) {
+ obj.start.y++
+ } else {
+ obj.start.y--
+ }
+ }
+ }
+ }
+ return obj
+}
+
+function fixPieSeries(series, opts, config) {
+ let pieSeriesArr = []
+ if (series.length > 0 && series[0].data.constructor.toString().indexOf("Array") > -1) {
+ opts._pieSeries_ = series
+ let oldseries = series[0].data
+ for (var i = 0; i < oldseries.length; i++) {
+ oldseries[i].formatter = series[0].formatter
+ oldseries[i].data = oldseries[i].value
+ pieSeriesArr.push(oldseries[i])
+ }
+ opts.series = pieSeriesArr
+ } else {
+ pieSeriesArr = series
+ }
+ return pieSeriesArr
+}
+
+function fillSeries(series, opts, config) {
+ var index = 0
+ for (var i = 0; i < series.length; i++) {
+ let item = series[i]
+ if (!item.color) {
+ item.color = config.color[index]
+ index = (index + 1) % config.color.length
+ }
+ if (!item.linearIndex) {
+ item.linearIndex = i
+ }
+ if (!item.index) {
+ item.index = 0
+ }
+ if (!item.type) {
+ item.type = opts.type
+ }
+ if (typeof item.show == "undefined") {
+ item.show = true
+ }
+ if (!item.type) {
+ item.type = opts.type
+ }
+ if (!item.pointShape) {
+ item.pointShape = "circle"
+ }
+ if (!item.legendShape) {
+ switch (item.type) {
+ case "line":
+ item.legendShape = "line"
+ break
+ case "column":
+ case "bar":
+ item.legendShape = "rect"
+ break
+ case "area":
+ case "mount":
+ item.legendShape = "triangle"
+ break
+ default:
+ item.legendShape = "circle"
+ }
+ }
+ }
+ return series
+}
+
+function fillCustomColor(linearType, customColor, series, config) {
+ var newcolor = customColor || []
+ if (linearType == "custom" && newcolor.length == 0) {
+ newcolor = config.linearColor
+ }
+ if (linearType == "custom" && newcolor.length < series.length) {
+ let chazhi = series.length - newcolor.length
+ for (var i = 0; i < chazhi; i++) {
+ newcolor.push(config.linearColor[(i + 1) % config.linearColor.length])
+ }
+ }
+ return newcolor
+}
+
+function getDataRange(minData, maxData) {
+ var limit = 0
+ var range = maxData - minData
+ if (range >= 10000) {
+ limit = 1000
+ } else if (range >= 1000) {
+ limit = 100
+ } else if (range >= 100) {
+ limit = 10
+ } else if (range >= 10) {
+ limit = 5
+ } else if (range >= 1) {
+ limit = 1
+ } else if (range >= 0.1) {
+ limit = 0.1
+ } else if (range >= 0.01) {
+ limit = 0.01
+ } else if (range >= 0.001) {
+ limit = 0.001
+ } else if (range >= 0.0001) {
+ limit = 0.0001
+ } else if (range >= 0.00001) {
+ limit = 0.00001
+ } else {
+ limit = 0.000001
+ }
+ return {
+ minRange: findRange(minData, "lower", limit),
+ maxRange: findRange(maxData, "upper", limit),
+ }
+}
+
+function measureText(text, fontSize, context) {
+ var width = 0
+ text = String(text)
+ // #ifdef MP-ALIPAY || MP-BAIDU || APP-NVUE
+ context = false
+ // #endif
+ if (context !== false && context !== undefined && context.setFontSize && context.measureText) {
+ context.setFontSize(fontSize)
+ return context.measureText(text).width
+ } else {
+ var text = text.split("")
+ for (let i = 0; i < text.length; i++) {
+ let item = text[i]
+ if (/[a-zA-Z]/.test(item)) {
+ width += 7
+ } else if (/[0-9]/.test(item)) {
+ width += 5.5
+ } else if (/\./.test(item)) {
+ width += 2.7
+ } else if (/-/.test(item)) {
+ width += 3.25
+ } else if (/:/.test(item)) {
+ width += 2.5
+ } else if (/[\u4e00-\u9fa5]/.test(item)) {
+ width += 10
+ } else if (/\(|\)/.test(item)) {
+ width += 3.73
+ } else if (/\s/.test(item)) {
+ width += 2.5
+ } else if (/%/.test(item)) {
+ width += 8
+ } else {
+ width += 10
+ }
+ }
+ return (width * fontSize) / 10
+ }
+}
+
+function dataCombine(series) {
+ return series.reduce(function (a, b) {
+ return (a.data ? a.data : a).concat(b.data)
+ }, [])
+}
+
+function dataCombineStack(series, len) {
+ var sum = new Array(len)
+ for (var j = 0; j < sum.length; j++) {
+ sum[j] = 0
+ }
+ for (var i = 0; i < series.length; i++) {
+ for (var j = 0; j < sum.length; j++) {
+ sum[j] += series[i].data[j]
+ }
+ }
+ return series.reduce(function (a, b) {
+ return (a.data ? a.data : a).concat(b.data).concat(sum)
+ }, [])
+}
+
+function getTouches(touches, opts, e) {
+ let x, y
+ if (touches.clientX) {
+ if (opts.rotate) {
+ y = opts.height - touches.clientX * opts.pix
+ x = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pix / 2) * (opts.pix - 1)) * opts.pix
+ } else {
+ x = touches.clientX * opts.pix
+ y = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pix / 2) * (opts.pix - 1)) * opts.pix
+ }
+ } else {
+ if (opts.rotate) {
+ y = opts.height - touches.x * opts.pix
+ x = touches.y * opts.pix
+ } else {
+ x = touches.x * opts.pix
+ y = touches.y * opts.pix
+ }
+ }
+ return {
+ x: x,
+ y: y,
+ }
+}
+
+function getSeriesDataItem(series, index, group) {
+ var data = []
+ var newSeries = []
+ var indexIsArr = index.constructor.toString().indexOf("Array") > -1
+ if (indexIsArr) {
+ let tempSeries = filterSeries(series)
+ for (var i = 0; i < group.length; i++) {
+ newSeries.push(tempSeries[group[i]])
+ }
+ } else {
+ newSeries = series
+ }
+ for (let i = 0; i < newSeries.length; i++) {
+ let item = newSeries[i]
+ let tmpindex = -1
+ if (indexIsArr) {
+ tmpindex = index[i]
+ } else {
+ tmpindex = index
+ }
+ if (item.data[tmpindex] !== null && typeof item.data[tmpindex] !== "undefined" && item.show) {
+ let seriesItem = {}
+ seriesItem.color = item.color
+ seriesItem.type = item.type
+ seriesItem.style = item.style
+ seriesItem.pointShape = item.pointShape
+ seriesItem.disableLegend = item.disableLegend
+ seriesItem.legendShape = item.legendShape
+ seriesItem.name = item.name
+ seriesItem.show = item.show
+ seriesItem.data = item.formatter ? item.formatter(item.data[tmpindex]) : item.data[tmpindex]
+ data.push(seriesItem)
+ }
+ }
+ return data
+}
+
+function getMaxTextListLength(list, fontSize, context) {
+ var lengthList = list.map(function (item) {
+ return measureText(item, fontSize, context)
+ })
+ return Math.max.apply(null, lengthList)
+}
+
+function getRadarCoordinateSeries(length) {
+ var eachAngle = (2 * Math.PI) / length
+ var CoordinateSeries = []
+ for (var i = 0; i < length; i++) {
+ CoordinateSeries.push(eachAngle * i)
+ }
+ return CoordinateSeries.map(function (item) {
+ return -1 * item + Math.PI / 2
+ })
+}
+
+function getToolTipData(seriesData, opts, index, group, categories) {
+ var option = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}
+ var calPoints = opts.chartData.calPoints ? opts.chartData.calPoints : []
+ let points = {}
+ if (group.length > 0) {
+ let filterPoints = []
+ for (let i = 0; i < group.length; i++) {
+ filterPoints.push(calPoints[group[i]])
+ }
+ points = filterPoints[0][index[0]]
+ } else {
+ for (let i = 0; i < calPoints.length; i++) {
+ if (calPoints[i][index]) {
+ points = calPoints[i][index]
+ break
+ }
+ }
+ }
+ var textList = seriesData.map(function (item) {
+ let titleText = null
+ if (opts.categories && opts.categories.length > 0) {
+ titleText = categories[index]
+ }
+ return {
+ text: option.formatter ? option.formatter(item, titleText, index, opts) : item.name + ": " + item.data,
+ color: item.color,
+ legendShape: opts.extra.tooltip.legendShape == "auto" ? item.legendShape : opts.extra.tooltip.legendShape,
+ }
+ })
+ var offset = {
+ x: Math.round(points.x),
+ y: Math.round(points.y),
+ }
+ return {
+ textList: textList,
+ offset: offset,
+ }
+}
+
+function getMixToolTipData(seriesData, opts, index, categories) {
+ var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}
+ var points = opts.chartData.xAxisPoints[index] + opts.chartData.eachSpacing / 2
+ var textList = seriesData.map(function (item) {
+ return {
+ text: option.formatter ? option.formatter(item, categories[index], index, opts) : item.name + ": " + item.data,
+ color: item.color,
+ disableLegend: item.disableLegend ? true : false,
+ legendShape: opts.extra.tooltip.legendShape == "auto" ? item.legendShape : opts.extra.tooltip.legendShape,
+ }
+ })
+ textList = textList.filter(function (item) {
+ if (item.disableLegend !== true) {
+ return item
+ }
+ })
+ var offset = {
+ x: Math.round(points),
+ y: 0,
+ }
+ return {
+ textList: textList,
+ offset: offset,
+ }
+}
+
+function getCandleToolTipData(series, seriesData, opts, index, categories, extra) {
+ var option = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {}
+ var calPoints = opts.chartData.calPoints
+ let upColor = extra.color.upFill
+ let downColor = extra.color.downFill
+ //颜色顺序为开盘,收盘,最低,最高
+ let color = [upColor, upColor, downColor, upColor]
+ var textList = []
+ seriesData.map(function (item) {
+ if (index == 0) {
+ if (item.data[1] - item.data[0] < 0) {
+ color[1] = downColor
+ } else {
+ color[1] = upColor
+ }
+ } else {
+ if (item.data[0] < series[index - 1][1]) {
+ color[0] = downColor
+ }
+ if (item.data[1] < item.data[0]) {
+ color[1] = downColor
+ }
+ if (item.data[2] > series[index - 1][1]) {
+ color[2] = upColor
+ }
+ if (item.data[3] < series[index - 1][1]) {
+ color[3] = downColor
+ }
+ }
+ let text1 = {
+ text: "开盘:" + item.data[0],
+ color: color[0],
+ legendShape: opts.extra.tooltip.legendShape == "auto" ? item.legendShape : opts.extra.tooltip.legendShape,
+ }
+ let text2 = {
+ text: "收盘:" + item.data[1],
+ color: color[1],
+ legendShape: opts.extra.tooltip.legendShape == "auto" ? item.legendShape : opts.extra.tooltip.legendShape,
+ }
+ let text3 = {
+ text: "最低:" + item.data[2],
+ color: color[2],
+ legendShape: opts.extra.tooltip.legendShape == "auto" ? item.legendShape : opts.extra.tooltip.legendShape,
+ }
+ let text4 = {
+ text: "最高:" + item.data[3],
+ color: color[3],
+ legendShape: opts.extra.tooltip.legendShape == "auto" ? item.legendShape : opts.extra.tooltip.legendShape,
+ }
+ textList.push(text1, text2, text3, text4)
+ })
+ var validCalPoints = []
+ var offset = {
+ x: 0,
+ y: 0,
+ }
+ for (let i = 0; i < calPoints.length; i++) {
+ let points = calPoints[i]
+ if (typeof points[index] !== "undefined" && points[index] !== null) {
+ validCalPoints.push(points[index])
+ }
+ }
+ offset.x = Math.round(validCalPoints[0][0].x)
+ return {
+ textList: textList,
+ offset: offset,
+ }
+}
+
+function filterSeries(series) {
+ let tempSeries = []
+ for (let i = 0; i < series.length; i++) {
+ if (series[i].show == true) {
+ tempSeries.push(series[i])
+ }
+ }
+ return tempSeries
+}
+
+function findCurrentIndex(currentPoints, calPoints, opts, config) {
+ var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0
+ var current = { index: -1, group: [] }
+ var spacing = opts.chartData.eachSpacing / 2
+ let xAxisPoints = []
+ if (calPoints && calPoints.length > 0) {
+ if (!opts.categories) {
+ spacing = 0
+ } else {
+ for (let i = 1; i < opts.chartData.xAxisPoints.length; i++) {
+ xAxisPoints.push(opts.chartData.xAxisPoints[i] - spacing)
+ }
+ if ((opts.type == "line" || opts.type == "area") && opts.xAxis.boundaryGap == "justify") {
+ xAxisPoints = opts.chartData.xAxisPoints
+ }
+ }
+ if (isInExactChartArea(currentPoints, opts, config)) {
+ if (!opts.categories) {
+ let timePoints = Array(calPoints.length)
+ for (let i = 0; i < calPoints.length; i++) {
+ timePoints[i] = Array(calPoints[i].length)
+ for (let j = 0; j < calPoints[i].length; j++) {
+ timePoints[i][j] = Math.abs(calPoints[i][j].x - currentPoints.x)
+ }
+ }
+ let pointValue = Array(timePoints.length)
+ let pointIndex = Array(timePoints.length)
+ for (let i = 0; i < timePoints.length; i++) {
+ pointValue[i] = Math.min.apply(null, timePoints[i])
+ pointIndex[i] = timePoints[i].indexOf(pointValue[i])
+ }
+ let minValue = Math.min.apply(null, pointValue)
+ current.index = []
+ for (let i = 0; i < pointValue.length; i++) {
+ if (pointValue[i] == minValue) {
+ current.group.push(i)
+ current.index.push(pointIndex[i])
+ }
+ }
+ } else {
+ xAxisPoints.forEach(function (item, index) {
+ if (currentPoints.x + offset + spacing > item) {
+ current.index = index
+ }
+ })
+ }
+ }
+ }
+ return current
+}
+
+function findBarChartCurrentIndex(currentPoints, calPoints, opts, config) {
+ var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0
+ var current = { index: -1, group: [] }
+ var spacing = opts.chartData.eachSpacing / 2
+ let yAxisPoints = opts.chartData.yAxisPoints
+ if (calPoints && calPoints.length > 0) {
+ if (isInExactChartArea(currentPoints, opts, config)) {
+ yAxisPoints.forEach(function (item, index) {
+ if (currentPoints.y + offset + spacing > item) {
+ current.index = index
+ }
+ })
+ }
+ }
+ return current
+}
+
+function findLegendIndex(currentPoints, legendData, opts) {
+ let currentIndex = -1
+ let gap = 0
+ if (isInExactLegendArea(currentPoints, legendData.area)) {
+ let points = legendData.points
+ let index = -1
+ for (let i = 0, len = points.length; i < len; i++) {
+ let item = points[i]
+ for (let j = 0; j < item.length; j++) {
+ index += 1
+ let area = item[j]["area"]
+ if (
+ area &&
+ currentPoints.x > area[0] - gap &&
+ currentPoints.x < area[2] + gap &&
+ currentPoints.y > area[1] - gap &&
+ currentPoints.y < area[3] + gap
+ ) {
+ currentIndex = index
+ break
+ }
+ }
+ }
+ return currentIndex
+ }
+ return currentIndex
+}
+
+function isInExactLegendArea(currentPoints, area) {
+ return currentPoints.x > area.start.x && currentPoints.x < area.end.x && currentPoints.y > area.start.y && currentPoints.y < area.end.y
+}
+
+function isInExactChartArea(currentPoints, opts, config) {
+ return (
+ currentPoints.x <= opts.width - opts.area[1] + 10 &&
+ currentPoints.x >= opts.area[3] - 10 &&
+ currentPoints.y >= opts.area[0] &&
+ currentPoints.y <= opts.height - opts.area[2]
+ )
+}
+
+function findRadarChartCurrentIndex(currentPoints, radarData, count) {
+ var eachAngleArea = (2 * Math.PI) / count
+ var currentIndex = -1
+ if (isInExactPieChartArea(currentPoints, radarData.center, radarData.radius)) {
+ var fixAngle = function fixAngle(angle) {
+ if (angle < 0) {
+ angle += 2 * Math.PI
+ }
+ if (angle > 2 * Math.PI) {
+ angle -= 2 * Math.PI
+ }
+ return angle
+ }
+ var angle = Math.atan2(radarData.center.y - currentPoints.y, currentPoints.x - radarData.center.x)
+ angle = -1 * angle
+ if (angle < 0) {
+ angle += 2 * Math.PI
+ }
+ var angleList = radarData.angleList.map(function (item) {
+ item = fixAngle(-1 * item)
+ return item
+ })
+ angleList.forEach(function (item, index) {
+ var rangeStart = fixAngle(item - eachAngleArea / 2)
+ var rangeEnd = fixAngle(item + eachAngleArea / 2)
+ if (rangeEnd < rangeStart) {
+ rangeEnd += 2 * Math.PI
+ }
+ if ((angle >= rangeStart && angle <= rangeEnd) || (angle + 2 * Math.PI >= rangeStart && angle + 2 * Math.PI <= rangeEnd)) {
+ currentIndex = index
+ }
+ })
+ }
+ return currentIndex
+}
+
+function findFunnelChartCurrentIndex(currentPoints, funnelData) {
+ var currentIndex = -1
+ for (var i = 0, len = funnelData.series.length; i < len; i++) {
+ var item = funnelData.series[i]
+ if (
+ currentPoints.x > item.funnelArea[0] &&
+ currentPoints.x < item.funnelArea[2] &&
+ currentPoints.y > item.funnelArea[1] &&
+ currentPoints.y < item.funnelArea[3]
+ ) {
+ currentIndex = i
+ break
+ }
+ }
+ return currentIndex
+}
+
+function findWordChartCurrentIndex(currentPoints, wordData) {
+ var currentIndex = -1
+ for (var i = 0, len = wordData.length; i < len; i++) {
+ var item = wordData[i]
+ if (
+ currentPoints.x > item.area[0] &&
+ currentPoints.x < item.area[2] &&
+ currentPoints.y > item.area[1] &&
+ currentPoints.y < item.area[3]
+ ) {
+ currentIndex = i
+ break
+ }
+ }
+ return currentIndex
+}
+
+function findMapChartCurrentIndex(currentPoints, opts) {
+ var currentIndex = -1
+ var cData = opts.chartData.mapData
+ var data = opts.series
+ var tmp = pointToCoordinate(currentPoints.y, currentPoints.x, cData.bounds, cData.scale, cData.xoffset, cData.yoffset)
+ var poi = [tmp.x, tmp.y]
+ for (var i = 0, len = data.length; i < len; i++) {
+ var item = data[i].geometry.coordinates
+ if (isPoiWithinPoly(poi, item, opts.chartData.mapData.mercator)) {
+ currentIndex = i
+ break
+ }
+ }
+ return currentIndex
+}
+
+function findRoseChartCurrentIndex(currentPoints, pieData, opts) {
+ var currentIndex = -1
+ var series = getRoseDataPoints(opts._series_, opts.extra.rose.type, pieData.radius, pieData.radius)
+ if (pieData && pieData.center && isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) {
+ var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x)
+ angle = -angle
+ if (opts.extra.rose && opts.extra.rose.offsetAngle) {
+ angle = angle - (opts.extra.rose.offsetAngle * Math.PI) / 180
+ }
+ for (var i = 0, len = series.length; i < len; i++) {
+ if (isInAngleRange(angle, series[i]._start_, series[i]._start_ + series[i]._rose_proportion_ * 2 * Math.PI)) {
+ currentIndex = i
+ break
+ }
+ }
+ }
+ return currentIndex
+}
+
+function findPieChartCurrentIndex(currentPoints, pieData, opts) {
+ var currentIndex = -1
+ var series = getPieDataPoints(pieData.series)
+ if (pieData && pieData.center && isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) {
+ var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x)
+ angle = -angle
+ if (opts.extra.pie && opts.extra.pie.offsetAngle) {
+ angle = angle - (opts.extra.pie.offsetAngle * Math.PI) / 180
+ }
+ if (opts.extra.ring && opts.extra.ring.offsetAngle) {
+ angle = angle - (opts.extra.ring.offsetAngle * Math.PI) / 180
+ }
+ for (var i = 0, len = series.length; i < len; i++) {
+ if (isInAngleRange(angle, series[i]._start_, series[i]._start_ + series[i]._proportion_ * 2 * Math.PI)) {
+ currentIndex = i
+ break
+ }
+ }
+ }
+ return currentIndex
+}
+
+function isInExactPieChartArea(currentPoints, center, radius) {
+ return Math.pow(currentPoints.x - center.x, 2) + Math.pow(currentPoints.y - center.y, 2) <= Math.pow(radius, 2)
+}
+
+function splitPoints(points, eachSeries) {
+ var newPoints = []
+ var items = []
+ points.forEach(function (item, index) {
+ if (eachSeries.connectNulls) {
+ if (item !== null) {
+ items.push(item)
+ }
+ } else {
+ if (item !== null) {
+ items.push(item)
+ } else {
+ if (items.length) {
+ newPoints.push(items)
+ }
+ items = []
+ }
+ }
+ })
+ if (items.length) {
+ newPoints.push(items)
+ }
+ return newPoints
+}
+
+function calLegendData(series, opts, config, chartData, context) {
+ let legendData = {
+ area: {
+ start: {
+ x: 0,
+ y: 0,
+ },
+ end: {
+ x: 0,
+ y: 0,
+ },
+ width: 0,
+ height: 0,
+ wholeWidth: 0,
+ wholeHeight: 0,
+ },
+ points: [],
+ widthArr: [],
+ heightArr: [],
+ }
+ if (opts.legend.show === false) {
+ chartData.legendData = legendData
+ return legendData
+ }
+ let padding = opts.legend.padding * opts.pix
+ let margin = opts.legend.margin * opts.pix
+ let fontSize = opts.legend.fontSize ? opts.legend.fontSize * opts.pix : config.fontSize
+ let shapeWidth = 15 * opts.pix
+ let shapeRight = 5 * opts.pix
+ let lineHeight = Math.max(opts.legend.lineHeight * opts.pix, fontSize)
+ if (opts.legend.position == "top" || opts.legend.position == "bottom") {
+ let legendList = []
+ let widthCount = 0
+ let widthCountArr = []
+ let currentRow = []
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ const legendText = item.legendText ? item.legendText : item.name
+ let itemWidth = shapeWidth + shapeRight + measureText(legendText || "undefined", fontSize, context) + opts.legend.itemGap * opts.pix
+ if (widthCount + itemWidth > opts.width - opts.area[1] - opts.area[3]) {
+ legendList.push(currentRow)
+ widthCountArr.push(widthCount - opts.legend.itemGap * opts.pix)
+ widthCount = itemWidth
+ currentRow = [item]
+ } else {
+ widthCount += itemWidth
+ currentRow.push(item)
+ }
+ }
+ if (currentRow.length) {
+ legendList.push(currentRow)
+ widthCountArr.push(widthCount - opts.legend.itemGap * opts.pix)
+ legendData.widthArr = widthCountArr
+ let legendWidth = Math.max.apply(null, widthCountArr)
+ switch (opts.legend.float) {
+ case "left":
+ legendData.area.start.x = opts.area[3]
+ legendData.area.end.x = opts.area[3] + legendWidth + 2 * padding
+ break
+ case "right":
+ legendData.area.start.x = opts.width - opts.area[1] - legendWidth - 2 * padding
+ legendData.area.end.x = opts.width - opts.area[1]
+ break
+ default:
+ legendData.area.start.x = (opts.width - legendWidth) / 2 - padding
+ legendData.area.end.x = (opts.width + legendWidth) / 2 + padding
+ }
+ legendData.area.width = legendWidth + 2 * padding
+ legendData.area.wholeWidth = legendWidth + 2 * padding
+ legendData.area.height = legendList.length * lineHeight + 2 * padding
+ legendData.area.wholeHeight = legendList.length * lineHeight + 2 * padding + 2 * margin
+ legendData.points = legendList
+ }
+ } else {
+ let len = series.length
+ let maxHeight = opts.height - opts.area[0] - opts.area[2] - 2 * margin - 2 * padding
+ let maxLength = Math.min(Math.floor(maxHeight / lineHeight), len)
+ legendData.area.height = maxLength * lineHeight + padding * 2
+ legendData.area.wholeHeight = maxLength * lineHeight + padding * 2
+ switch (opts.legend.float) {
+ case "top":
+ legendData.area.start.y = opts.area[0] + margin
+ legendData.area.end.y = opts.area[0] + margin + legendData.area.height
+ break
+ case "bottom":
+ legendData.area.start.y = opts.height - opts.area[2] - margin - legendData.area.height
+ legendData.area.end.y = opts.height - opts.area[2] - margin
+ break
+ default:
+ legendData.area.start.y = (opts.height - legendData.area.height) / 2
+ legendData.area.end.y = (opts.height + legendData.area.height) / 2
+ }
+ let lineNum = len % maxLength === 0 ? len / maxLength : Math.floor(len / maxLength + 1)
+ let currentRow = []
+ for (let i = 0; i < lineNum; i++) {
+ let temp = series.slice(i * maxLength, i * maxLength + maxLength)
+ currentRow.push(temp)
+ }
+ legendData.points = currentRow
+ if (currentRow.length) {
+ for (let i = 0; i < currentRow.length; i++) {
+ let item = currentRow[i]
+ let maxWidth = 0
+ for (let j = 0; j < item.length; j++) {
+ let itemWidth =
+ shapeWidth + shapeRight + measureText(item[j].name || "undefined", fontSize, context) + opts.legend.itemGap * opts.pix
+ if (itemWidth > maxWidth) {
+ maxWidth = itemWidth
+ }
+ }
+ legendData.widthArr.push(maxWidth)
+ legendData.heightArr.push(item.length * lineHeight + padding * 2)
+ }
+ let legendWidth = 0
+ for (let i = 0; i < legendData.widthArr.length; i++) {
+ legendWidth += legendData.widthArr[i]
+ }
+ legendData.area.width = legendWidth - opts.legend.itemGap * opts.pix + 2 * padding
+ legendData.area.wholeWidth = legendData.area.width + padding
+ }
+ }
+ switch (opts.legend.position) {
+ case "top":
+ legendData.area.start.y = opts.area[0] + margin
+ legendData.area.end.y = opts.area[0] + margin + legendData.area.height
+ break
+ case "bottom":
+ legendData.area.start.y = opts.height - opts.area[2] - legendData.area.height - margin
+ legendData.area.end.y = opts.height - opts.area[2] - margin
+ break
+ case "left":
+ legendData.area.start.x = opts.area[3]
+ legendData.area.end.x = opts.area[3] + legendData.area.width
+ break
+ case "right":
+ legendData.area.start.x = opts.width - opts.area[1] - legendData.area.width
+ legendData.area.end.x = opts.width - opts.area[1]
+ break
+ }
+ chartData.legendData = legendData
+ return legendData
+}
+
+function calCategoriesData(categories, opts, config, eachSpacing, context) {
+ var result = {
+ angle: 0,
+ xAxisHeight: opts.xAxis.lineHeight * opts.pix + opts.xAxis.marginTop * opts.pix,
+ }
+ var fontSize = opts.xAxis.fontSize * opts.pix
+ var categoriesTextLenth = categories.map(function (item, index) {
+ var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item, index, opts) : item
+ return measureText(String(xitem), fontSize, context)
+ })
+ var maxTextLength = Math.max.apply(this, categoriesTextLenth)
+ if (opts.xAxis.rotateLabel == true) {
+ result.angle = (opts.xAxis.rotateAngle * Math.PI) / 180
+ let tempHeight = opts.xAxis.marginTop * opts.pix * 2 + Math.abs(maxTextLength * Math.sin(result.angle))
+ tempHeight = tempHeight < fontSize + opts.xAxis.marginTop * opts.pix * 2 ? tempHeight + opts.xAxis.marginTop * opts.pix * 2 : tempHeight
+ result.xAxisHeight = tempHeight
+ }
+ if (opts.enableScroll && opts.xAxis.scrollShow) {
+ result.xAxisHeight += 6 * opts.pix
+ }
+ if (opts.xAxis.disabled) {
+ result.xAxisHeight = 0
+ }
+ return result
+}
+
+function getXAxisTextList(series, opts, config, stack) {
+ var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1
+ var data
+ if (stack == "stack") {
+ data = dataCombineStack(series, opts.categories.length)
+ } else {
+ data = dataCombine(series)
+ }
+ var sorted = []
+ // remove null from data
+ data = data.filter(function (item) {
+ //return item !== null;
+ if (typeof item === "object" && item !== null) {
+ if (item.constructor.toString().indexOf("Array") > -1) {
+ return item !== null
+ } else {
+ return item.value !== null
+ }
+ } else {
+ return item !== null
+ }
+ })
+ data.map(function (item) {
+ if (typeof item === "object") {
+ if (item.constructor.toString().indexOf("Array") > -1) {
+ if (opts.type == "candle") {
+ item.map(function (subitem) {
+ sorted.push(subitem)
+ })
+ } else {
+ sorted.push(item[0])
+ }
+ } else {
+ sorted.push(item.value)
+ }
+ } else {
+ sorted.push(item)
+ }
+ })
+
+ var minData = 0
+ var maxData = 0
+ if (sorted.length > 0) {
+ minData = Math.min.apply(this, sorted)
+ maxData = Math.max.apply(this, sorted)
+ }
+ //为了兼容v1.9.0之前的项目
+ if (index > -1) {
+ if (typeof opts.xAxis.data[index].min === "number") {
+ minData = Math.min(opts.xAxis.data[index].min, minData)
+ }
+ if (typeof opts.xAxis.data[index].max === "number") {
+ maxData = Math.max(opts.xAxis.data[index].max, maxData)
+ }
+ } else {
+ if (typeof opts.xAxis.min === "number") {
+ minData = Math.min(opts.xAxis.min, minData)
+ }
+ if (typeof opts.xAxis.max === "number") {
+ maxData = Math.max(opts.xAxis.max, maxData)
+ }
+ }
+ if (minData === maxData) {
+ var rangeSpan = maxData || 10
+ maxData += rangeSpan
+ }
+ //var dataRange = getDataRange(minData, maxData);
+ var minRange = minData
+ var maxRange = maxData
+ var range = []
+ var eachRange = (maxRange - minRange) / opts.xAxis.splitNumber
+ for (var i = 0; i <= opts.xAxis.splitNumber; i++) {
+ range.push(minRange + eachRange * i)
+ }
+ return range
+}
+
+function calXAxisData(series, opts, config, context) {
+ //堆叠图重算Y轴
+ var columnstyle = assign(
+ {},
+ {
+ type: "",
+ },
+ opts.extra.bar,
+ )
+ var result = {
+ angle: 0,
+ xAxisHeight: opts.xAxis.lineHeight * opts.pix + opts.xAxis.marginTop * opts.pix,
+ }
+ result.ranges = getXAxisTextList(series, opts, config, columnstyle.type)
+ result.rangesFormat = result.ranges.map(function (item) {
+ //item = opts.xAxis.formatter ? opts.xAxis.formatter(item) : util.toFixed(item, 2);
+ item = util.toFixed(item, 2)
+ return item
+ })
+ var xAxisScaleValues = result.ranges.map(function (item) {
+ // 如果刻度值是浮点数,则保留两位小数
+ item = util.toFixed(item, 2)
+ // 若有自定义格式则调用自定义的格式化函数
+ //item = opts.xAxis.formatter ? opts.xAxis.formatter(Number(item)) : item;
+ return item
+ })
+ result = Object.assign(result, getXAxisPoints(xAxisScaleValues, opts, config))
+ // 计算X轴刻度的属性譬如每个刻度的间隔,刻度的起始点\结束点以及总长
+ var eachSpacing = result.eachSpacing
+ var textLength = xAxisScaleValues.map(function (item) {
+ return measureText(item, opts.xAxis.fontSize * opts.pix, context)
+ })
+ if (opts.xAxis.disabled === true) {
+ result.xAxisHeight = 0
+ }
+ return result
+}
+
+function getRadarDataPoints(angleList, center, radius, series, opts) {
+ var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1
+ var radarOption = opts.extra.radar || {}
+ radarOption.max = radarOption.max || 0
+ var maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series)))
+ var data = []
+ for (let i = 0; i < series.length; i++) {
+ let each = series[i]
+ let listItem = {}
+ listItem.color = each.color
+ listItem.legendShape = each.legendShape
+ listItem.pointShape = each.pointShape
+ listItem.data = []
+ each.data.forEach(function (item, index) {
+ let tmp = {}
+ tmp.angle = angleList[index]
+ tmp.proportion = item / maxData
+ tmp.value = item
+ tmp.position = convertCoordinateOrigin(
+ radius * tmp.proportion * process * Math.cos(tmp.angle),
+ radius * tmp.proportion * process * Math.sin(tmp.angle),
+ center,
+ )
+ listItem.data.push(tmp)
+ })
+ data.push(listItem)
+ }
+ return data
+}
+
+function getPieDataPoints(series, radius) {
+ var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1
+ var count = 0
+ var _start_ = 0
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item.data = item.data === null ? 0 : item.data
+ count += item.data
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item.data = item.data === null ? 0 : item.data
+ if (count === 0) {
+ item._proportion_ = (1 / series.length) * process
+ } else {
+ item._proportion_ = (item.data / count) * process
+ }
+ item._radius_ = radius
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item._start_ = _start_
+ _start_ += 2 * item._proportion_ * Math.PI
+ }
+ return series
+}
+
+function getFunnelDataPoints(series, radius, option, eachSpacing) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ for (let i = 0; i < series.length; i++) {
+ if (option.type == "funnel") {
+ series[i].radius = (series[i].data / series[0].data) * radius * process
+ } else {
+ series[i].radius = ((eachSpacing * (series.length - i)) / (eachSpacing * series.length)) * radius * process
+ }
+ series[i]._proportion_ = series[i].data / series[0].data
+ }
+ // if(option.type !== 'pyramid'){
+ // series.reverse();
+ // }
+ return series
+}
+
+function getRoseDataPoints(series, type, minRadius, radius) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var count = 0
+ var _start_ = 0
+ var dataArr = []
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item.data = item.data === null ? 0 : item.data
+ count += item.data
+ dataArr.push(item.data)
+ }
+ var minData = Math.min.apply(null, dataArr)
+ var maxData = Math.max.apply(null, dataArr)
+ var radiusLength = radius - minRadius
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item.data = item.data === null ? 0 : item.data
+ if (count === 0) {
+ item._proportion_ = (1 / series.length) * process
+ item._rose_proportion_ = (1 / series.length) * process
+ } else {
+ item._proportion_ = (item.data / count) * process
+ if (type == "area") {
+ item._rose_proportion_ = (1 / series.length) * process
+ } else {
+ item._rose_proportion_ = (item.data / count) * process
+ }
+ }
+ item._radius_ = minRadius + radiusLength * ((item.data - minData) / (maxData - minData)) || radius
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item._start_ = _start_
+ _start_ += 2 * item._rose_proportion_ * Math.PI
+ }
+ return series
+}
+
+function getArcbarDataPoints(series, arcbarOption) {
+ var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1
+ if (process == 1) {
+ process = 0.999999
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item.data = item.data === null ? 0 : item.data
+ let totalAngle
+ if (arcbarOption.type == "circle") {
+ totalAngle = 2
+ } else {
+ if (arcbarOption.direction == "ccw") {
+ if (arcbarOption.startAngle < arcbarOption.endAngle) {
+ totalAngle = 2 + arcbarOption.startAngle - arcbarOption.endAngle
+ } else {
+ totalAngle = arcbarOption.startAngle - arcbarOption.endAngle
+ }
+ } else {
+ if (arcbarOption.endAngle < arcbarOption.startAngle) {
+ totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle
+ } else {
+ totalAngle = arcbarOption.startAngle - arcbarOption.endAngle
+ }
+ }
+ }
+ item._proportion_ = totalAngle * item.data * process + arcbarOption.startAngle
+ if (arcbarOption.direction == "ccw") {
+ item._proportion_ = arcbarOption.startAngle - totalAngle * item.data * process
+ }
+ if (item._proportion_ >= 2) {
+ item._proportion_ = item._proportion_ % 2
+ }
+ }
+ return series
+}
+
+function getGaugeArcbarDataPoints(series, arcbarOption) {
+ var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1
+ if (process == 1) {
+ process = 0.999999
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item.data = item.data === null ? 0 : item.data
+ let totalAngle
+ if (arcbarOption.type == "circle") {
+ totalAngle = 2
+ } else {
+ if (arcbarOption.endAngle < arcbarOption.startAngle) {
+ totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle
+ } else {
+ totalAngle = arcbarOption.startAngle - arcbarOption.endAngle
+ }
+ }
+ item._proportion_ = totalAngle * item.data * process + arcbarOption.startAngle
+ if (item._proportion_ >= 2) {
+ item._proportion_ = item._proportion_ % 2
+ }
+ }
+ return series
+}
+
+function getGaugeAxisPoints(categories, startAngle, endAngle) {
+ let totalAngle
+ if (endAngle < startAngle) {
+ totalAngle = 2 + endAngle - startAngle
+ } else {
+ totalAngle = startAngle - endAngle
+ }
+ let tempStartAngle = startAngle
+ for (let i = 0; i < categories.length; i++) {
+ categories[i].value = categories[i].value === null ? 0 : categories[i].value
+ categories[i]._startAngle_ = tempStartAngle
+ categories[i]._endAngle_ = totalAngle * categories[i].value + startAngle
+ if (categories[i]._endAngle_ >= 2) {
+ categories[i]._endAngle_ = categories[i]._endAngle_ % 2
+ }
+ tempStartAngle = categories[i]._endAngle_
+ }
+ return categories
+}
+
+function getGaugeDataPoints(series, categories, gaugeOption) {
+ let process = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ item.data = item.data === null ? 0 : item.data
+ if (gaugeOption.pointer.color == "auto") {
+ for (let i = 0; i < categories.length; i++) {
+ if (item.data <= categories[i].value) {
+ item.color = categories[i].color
+ break
+ }
+ }
+ } else {
+ item.color = gaugeOption.pointer.color
+ }
+ let totalAngle
+ if (gaugeOption.endAngle < gaugeOption.startAngle) {
+ totalAngle = 2 + gaugeOption.endAngle - gaugeOption.startAngle
+ } else {
+ totalAngle = gaugeOption.startAngle - gaugeOption.endAngle
+ }
+ item._endAngle_ = totalAngle * item.data + gaugeOption.startAngle
+ item._oldAngle_ = gaugeOption.oldAngle
+ if (gaugeOption.oldAngle < gaugeOption.endAngle) {
+ item._oldAngle_ += 2
+ }
+ if (item.data >= gaugeOption.oldData) {
+ item._proportion_ = (item._endAngle_ - item._oldAngle_) * process + gaugeOption.oldAngle
+ } else {
+ item._proportion_ = item._oldAngle_ - (item._oldAngle_ - item._endAngle_) * process
+ }
+ if (item._proportion_ >= 2) {
+ item._proportion_ = item._proportion_ % 2
+ }
+ }
+ return series
+}
+
+function getPieTextMaxLength(series, config, context, opts) {
+ series = getPieDataPoints(series)
+ let maxLength = 0
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ let text = item.formatter ? item.formatter(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_ * 100) + "%"
+ maxLength = Math.max(maxLength, measureText(text, item.textSize * opts.pix || config.fontSize, context))
+ }
+ return maxLength
+}
+
+function fixColumeData(points, eachSpacing, columnLen, index, config, opts) {
+ return points.map(function (item) {
+ if (item === null) {
+ return null
+ }
+ var seriesGap = 0
+ var categoryGap = 0
+ if (opts.type == "mix") {
+ seriesGap = opts.extra.mix.column.seriesGap * opts.pix || 0
+ categoryGap = opts.extra.mix.column.categoryGap * opts.pix || 0
+ } else {
+ seriesGap = opts.extra.column.seriesGap * opts.pix || 0
+ categoryGap = opts.extra.column.categoryGap * opts.pix || 0
+ }
+ seriesGap = Math.min(seriesGap, eachSpacing / columnLen)
+ categoryGap = Math.min(categoryGap, eachSpacing / columnLen)
+ item.width = Math.ceil((eachSpacing - 2 * categoryGap - seriesGap * (columnLen - 1)) / columnLen)
+ if (opts.extra.mix && opts.extra.mix.column.width && +opts.extra.mix.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.mix.column.width * opts.pix)
+ }
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width * opts.pix)
+ }
+ if (item.width <= 0) {
+ item.width = 1
+ }
+ item.x += (index + 0.5 - columnLen / 2) * (item.width + seriesGap)
+ return item
+ })
+}
+
+function fixBarData(points, eachSpacing, columnLen, index, config, opts) {
+ return points.map(function (item) {
+ if (item === null) {
+ return null
+ }
+ var seriesGap = 0
+ var categoryGap = 0
+ seriesGap = opts.extra.bar.seriesGap * opts.pix || 0
+ categoryGap = opts.extra.bar.categoryGap * opts.pix || 0
+ seriesGap = Math.min(seriesGap, eachSpacing / columnLen)
+ categoryGap = Math.min(categoryGap, eachSpacing / columnLen)
+ item.width = Math.ceil((eachSpacing - 2 * categoryGap - seriesGap * (columnLen - 1)) / columnLen)
+ if (opts.extra.bar && opts.extra.bar.width && +opts.extra.bar.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.bar.width * opts.pix)
+ }
+ if (item.width <= 0) {
+ item.width = 1
+ }
+ item.y += (index + 0.5 - columnLen / 2) * (item.width + seriesGap)
+ return item
+ })
+}
+
+function fixColumeMeterData(points, eachSpacing, columnLen, index, config, opts, border) {
+ var categoryGap = opts.extra.column.categoryGap * opts.pix || 0
+ return points.map(function (item) {
+ if (item === null) {
+ return null
+ }
+ item.width = eachSpacing - 2 * categoryGap
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width * opts.pix)
+ }
+ if (index > 0) {
+ item.width -= border
+ }
+ return item
+ })
+}
+
+function fixColumeStackData(points, eachSpacing, columnLen, index, config, opts, series) {
+ var categoryGap = opts.extra.column.categoryGap * opts.pix || 0
+ return points.map(function (item, indexn) {
+ if (item === null) {
+ return null
+ }
+ item.width = Math.ceil(eachSpacing - 2 * categoryGap)
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width * opts.pix)
+ }
+ if (item.width <= 0) {
+ item.width = 1
+ }
+ return item
+ })
+}
+
+function fixBarStackData(points, eachSpacing, columnLen, index, config, opts, series) {
+ var categoryGap = opts.extra.bar.categoryGap * opts.pix || 0
+ return points.map(function (item, indexn) {
+ if (item === null) {
+ return null
+ }
+ item.width = Math.ceil(eachSpacing - 2 * categoryGap)
+ if (opts.extra.bar && opts.extra.bar.width && +opts.extra.bar.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.bar.width * opts.pix)
+ }
+ if (item.width <= 0) {
+ item.width = 1
+ }
+ return item
+ })
+}
+
+function getXAxisPoints(categories, opts, config) {
+ var spacingValid = opts.width - opts.area[1] - opts.area[3]
+ var dataCount = opts.enableScroll ? Math.min(opts.xAxis.itemCount, categories.length) : categories.length
+ if (
+ (opts.type == "line" || opts.type == "area" || opts.type == "scatter" || opts.type == "bubble" || opts.type == "bar") &&
+ dataCount > 1 &&
+ opts.xAxis.boundaryGap == "justify"
+ ) {
+ dataCount -= 1
+ }
+ var widthRatio = 0
+ if (opts.type == "mount" && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1) {
+ if (opts.extra.mount.widthRatio > 2) opts.extra.mount.widthRatio = 2
+ widthRatio = opts.extra.mount.widthRatio - 1
+ dataCount += widthRatio
+ }
+ var eachSpacing = spacingValid / dataCount
+ var xAxisPoints = []
+ var startX = opts.area[3]
+ var endX = opts.width - opts.area[1]
+ categories.forEach(function (item, index) {
+ xAxisPoints.push(startX + (widthRatio / 2) * eachSpacing + index * eachSpacing)
+ })
+ if (opts.xAxis.boundaryGap !== "justify") {
+ if (opts.enableScroll === true) {
+ xAxisPoints.push(startX + widthRatio * eachSpacing + categories.length * eachSpacing)
+ } else {
+ xAxisPoints.push(endX)
+ }
+ }
+ return {
+ xAxisPoints: xAxisPoints,
+ startX: startX,
+ endX: endX,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) {
+ var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1
+ var points = []
+ var validHeight = opts.height - opts.area[0] - opts.area[2]
+ data.forEach(function (item, index) {
+ if (item === null) {
+ points.push(null)
+ } else {
+ var cPoints = []
+ item.forEach(function (items, indexs) {
+ var point = {}
+ point.x = xAxisPoints[index] + Math.round(eachSpacing / 2)
+ var value = items.value || items
+ var height = (validHeight * (value - minRange)) / (maxRange - minRange)
+ height *= process
+ point.y = opts.height - Math.round(height) - opts.area[2]
+ cPoints.push(point)
+ })
+ points.push(cPoints)
+ }
+ })
+ return points
+}
+
+function getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) {
+ var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1
+ var boundaryGap = "center"
+ if (opts.type == "line" || opts.type == "area" || opts.type == "scatter" || opts.type == "bubble") {
+ boundaryGap = opts.xAxis.boundaryGap
+ }
+ var points = []
+ var validHeight = opts.height - opts.area[0] - opts.area[2]
+ var validWidth = opts.width - opts.area[1] - opts.area[3]
+ data.forEach(function (item, index) {
+ if (item === null) {
+ points.push(null)
+ } else {
+ var point = {}
+ point.color = item.color
+ point.x = xAxisPoints[index]
+ var value = item
+ if (typeof item === "object" && item !== null) {
+ if (item.constructor.toString().indexOf("Array") > -1) {
+ let xranges, xminRange, xmaxRange
+ xranges = [].concat(opts.chartData.xAxisData.ranges)
+ xminRange = xranges.shift()
+ xmaxRange = xranges.pop()
+ value = item[1]
+ point.x = opts.area[3] + (validWidth * (item[0] - xminRange)) / (xmaxRange - xminRange)
+ if (opts.type == "bubble") {
+ point.r = item[2]
+ point.t = item[3]
+ }
+ } else {
+ value = item.value
+ }
+ }
+ if (boundaryGap == "center") {
+ point.x += eachSpacing / 2
+ }
+ var height = (validHeight * (value - minRange)) / (maxRange - minRange)
+ height *= process
+ point.y = opts.height - height - opts.area[2]
+ points.push(point)
+ }
+ })
+ return points
+}
+
+function getLineDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, lineOption, process) {
+ var process = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 1
+ var boundaryGap = opts.xAxis.boundaryGap
+ var points = []
+ var validHeight = opts.height - opts.area[0] - opts.area[2]
+ var validWidth = opts.width - opts.area[1] - opts.area[3]
+ data.forEach(function (item, index) {
+ if (item === null) {
+ points.push(null)
+ } else {
+ var point = {}
+ point.color = item.color
+ if (lineOption.animation == "vertical") {
+ point.x = xAxisPoints[index]
+ var value = item
+ if (typeof item === "object" && item !== null) {
+ if (item.constructor.toString().indexOf("Array") > -1) {
+ let xranges, xminRange, xmaxRange
+ xranges = [].concat(opts.chartData.xAxisData.ranges)
+ xminRange = xranges.shift()
+ xmaxRange = xranges.pop()
+ value = item[1]
+ point.x = opts.area[3] + (validWidth * (item[0] - xminRange)) / (xmaxRange - xminRange)
+ } else {
+ value = item.value
+ }
+ }
+ if (boundaryGap == "center") {
+ point.x += eachSpacing / 2
+ }
+ var height = (validHeight * (value - minRange)) / (maxRange - minRange)
+ height *= process
+ point.y = opts.height - height - opts.area[2]
+ points.push(point)
+ } else {
+ point.x = xAxisPoints[0] + eachSpacing * index * process
+ var value = item
+ if (boundaryGap == "center") {
+ point.x += eachSpacing / 2
+ }
+ var height = (validHeight * (value - minRange)) / (maxRange - minRange)
+ point.y = opts.height - height - opts.area[2]
+ points.push(point)
+ }
+ }
+ })
+ return points
+}
+
+function getColumnDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, zeroPoints, process) {
+ var process = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 1
+ var points = []
+ var validHeight = opts.height - opts.area[0] - opts.area[2]
+ var validWidth = opts.width - opts.area[1] - opts.area[3]
+ data.forEach(function (item, index) {
+ if (item === null) {
+ points.push(null)
+ } else {
+ var point = {}
+ point.color = item.color
+ point.x = xAxisPoints[index]
+ var value = item
+ if (typeof item === "object" && item !== null) {
+ if (item.constructor.toString().indexOf("Array") > -1) {
+ let xranges, xminRange, xmaxRange
+ xranges = [].concat(opts.chartData.xAxisData.ranges)
+ xminRange = xranges.shift()
+ xmaxRange = xranges.pop()
+ value = item[1]
+ point.x = opts.area[3] + (validWidth * (item[0] - xminRange)) / (xmaxRange - xminRange)
+ } else {
+ value = item.value
+ }
+ }
+ point.x += eachSpacing / 2
+ var height = (validHeight * (value * process - minRange)) / (maxRange - minRange)
+ point.y = opts.height - height - opts.area[2]
+ points.push(point)
+ }
+ })
+ return points
+}
+
+function getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption, zeroPoints) {
+ var process = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 1
+ var points = []
+ var validHeight = opts.height - opts.area[0] - opts.area[2]
+ var validWidth = opts.width - opts.area[1] - opts.area[3]
+ var mountWidth = eachSpacing * mountOption.widthRatio
+ series.forEach(function (item, index) {
+ if (item === null) {
+ points.push(null)
+ } else {
+ var point = {}
+ point.color = item.color
+ point.x = xAxisPoints[index]
+ point.x += eachSpacing / 2
+ var value = item.data
+ var height = (validHeight * (value * process - minRange)) / (maxRange - minRange)
+ point.y = opts.height - height - opts.area[2]
+ point.value = value
+ point.width = mountWidth
+ points.push(point)
+ }
+ })
+ return points
+}
+
+function getBarDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config) {
+ var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1
+ var points = []
+ var validHeight = opts.height - opts.area[0] - opts.area[2]
+ var validWidth = opts.width - opts.area[1] - opts.area[3]
+ data.forEach(function (item, index) {
+ if (item === null) {
+ points.push(null)
+ } else {
+ var point = {}
+ point.color = item.color
+ point.y = yAxisPoints[index]
+ var value = item
+ if (typeof item === "object" && item !== null) {
+ value = item.value
+ }
+ var height = (validWidth * (value - minRange)) / (maxRange - minRange)
+ height *= process
+ point.height = height
+ point.value = value
+ point.x = height + opts.area[3]
+ points.push(point)
+ }
+ })
+ return points
+}
+
+function getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, stackSeries) {
+ var process = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 1
+ var points = []
+ var validHeight = opts.height - opts.area[0] - opts.area[2]
+ data.forEach(function (item, index) {
+ if (item === null) {
+ points.push(null)
+ } else {
+ var point = {}
+ point.color = item.color
+ point.x = xAxisPoints[index] + Math.round(eachSpacing / 2)
+
+ if (seriesIndex > 0) {
+ var value = 0
+ for (let i = 0; i <= seriesIndex; i++) {
+ value += stackSeries[i].data[index]
+ }
+ var value0 = value - item
+ var height = (validHeight * (value - minRange)) / (maxRange - minRange)
+ var height0 = (validHeight * (value0 - minRange)) / (maxRange - minRange)
+ } else {
+ var value = item
+ if (typeof item === "object" && item !== null) {
+ value = item.value
+ }
+ var height = (validHeight * (value - minRange)) / (maxRange - minRange)
+ var height0 = 0
+ }
+ var heightc = height0
+ height *= process
+ heightc *= process
+ point.y = opts.height - Math.round(height) - opts.area[2]
+ point.y0 = opts.height - Math.round(heightc) - opts.area[2]
+ points.push(point)
+ }
+ })
+ return points
+}
+
+function getBarStackDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, seriesIndex, stackSeries) {
+ var process = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 1
+ var points = []
+ var validHeight = opts.width - opts.area[1] - opts.area[3]
+ data.forEach(function (item, index) {
+ if (item === null) {
+ points.push(null)
+ } else {
+ var point = {}
+ point.color = item.color
+ point.y = yAxisPoints[index]
+ if (seriesIndex > 0) {
+ var value = 0
+ for (let i = 0; i <= seriesIndex; i++) {
+ value += stackSeries[i].data[index]
+ }
+ var value0 = value - item
+ var height = (validHeight * (value - minRange)) / (maxRange - minRange)
+ var height0 = (validHeight * (value0 - minRange)) / (maxRange - minRange)
+ } else {
+ var value = item
+ if (typeof item === "object" && item !== null) {
+ value = item.value
+ }
+ var height = (validHeight * (value - minRange)) / (maxRange - minRange)
+ var height0 = 0
+ }
+ var heightc = height0
+ height *= process
+ heightc *= process
+ point.height = height - heightc
+ point.x = opts.area[3] + height
+ point.x0 = opts.area[3] + heightc
+ points.push(point)
+ }
+ })
+ return points
+}
+
+function getYAxisTextList(series, opts, config, stack, yData) {
+ var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : -1
+ var data
+ if (stack == "stack") {
+ data = dataCombineStack(series, opts.categories.length)
+ } else {
+ data = dataCombine(series)
+ }
+ var sorted = []
+ // remove null from data
+ data = data.filter(function (item) {
+ //return item !== null;
+ if (typeof item === "object" && item !== null) {
+ if (item.constructor.toString().indexOf("Array") > -1) {
+ return item !== null
+ } else {
+ return item.value !== null
+ }
+ } else {
+ return item !== null
+ }
+ })
+ data.map(function (item) {
+ if (typeof item === "object") {
+ if (item.constructor.toString().indexOf("Array") > -1) {
+ if (opts.type == "candle") {
+ item.map(function (subitem) {
+ sorted.push(subitem)
+ })
+ } else {
+ sorted.push(item[1])
+ }
+ } else {
+ sorted.push(item.value)
+ }
+ } else {
+ sorted.push(item)
+ }
+ })
+ var minData = yData.min || 0
+ var maxData = yData.max || 0
+ if (sorted.length > 0) {
+ minData = Math.min.apply(this, sorted)
+ maxData = Math.max.apply(this, sorted)
+ }
+ if (minData === maxData) {
+ if (maxData == 0) {
+ maxData = 10
+ } else {
+ minData = 0
+ }
+ }
+ var dataRange = getDataRange(minData, maxData)
+ var minRange = yData.min === undefined || yData.min === null ? dataRange.minRange : yData.min
+ var maxRange = yData.max === undefined || yData.max === null ? dataRange.maxRange : yData.max
+ var eachRange = (maxRange - minRange) / opts.yAxis.splitNumber
+ var range = []
+ for (var i = 0; i <= opts.yAxis.splitNumber; i++) {
+ range.push(minRange + eachRange * i)
+ }
+ return range.reverse()
+}
+
+function calYAxisData(series, opts, config, context) {
+ //堆叠图重算Y轴
+ var columnstyle = assign(
+ {},
+ {
+ type: "",
+ },
+ opts.extra.column,
+ )
+ //如果是多Y轴,重新计算
+ var YLength = opts.yAxis.data.length
+ var newSeries = new Array(YLength)
+ if (YLength > 0) {
+ for (let i = 0; i < YLength; i++) {
+ newSeries[i] = []
+ for (let j = 0; j < series.length; j++) {
+ if (series[j].index == i) {
+ newSeries[i].push(series[j])
+ }
+ }
+ }
+ var rangesArr = new Array(YLength)
+ var rangesFormatArr = new Array(YLength)
+ var yAxisWidthArr = new Array(YLength)
+
+ for (let i = 0; i < YLength; i++) {
+ let yData = opts.yAxis.data[i]
+ //如果总开关不显示,强制每个Y轴为不显示
+ if (opts.yAxis.disabled == true) {
+ yData.disabled = true
+ }
+ if (yData.type === "categories") {
+ if (!yData.formatter) {
+ yData.formatter = (val, index, opts) => {
+ return val + (yData.unit || "")
+ }
+ }
+ yData.categories = yData.categories || opts.categories
+ rangesArr[i] = yData.categories
+ } else {
+ if (!yData.formatter) {
+ yData.formatter = (val, index, opts) => {
+ return util.toFixed(val, yData.tofix || 0) + (yData.unit || "")
+ }
+ }
+ rangesArr[i] = getYAxisTextList(newSeries[i], opts, config, columnstyle.type, yData, i)
+ }
+ let yAxisFontSizes = yData.fontSize * opts.pix || config.fontSize
+ yAxisWidthArr[i] = {
+ position: yData.position ? yData.position : "left",
+ width: 0,
+ }
+ rangesFormatArr[i] = rangesArr[i].map(function (items, index) {
+ items = yData.formatter(items, index, opts)
+ yAxisWidthArr[i].width = Math.max(yAxisWidthArr[i].width, measureText(items, yAxisFontSizes, context) + 5)
+ return items
+ })
+ let calibration = yData.calibration ? 4 * opts.pix : 0
+ yAxisWidthArr[i].width += calibration + 3 * opts.pix
+ if (yData.disabled === true) {
+ yAxisWidthArr[i].width = 0
+ }
+ }
+ } else {
+ var rangesArr = new Array(1)
+ var rangesFormatArr = new Array(1)
+ var yAxisWidthArr = new Array(1)
+ if (opts.type === "bar") {
+ rangesArr[0] = opts.categories
+ if (!opts.yAxis.formatter) {
+ opts.yAxis.formatter = (val, index, opts) => {
+ return val + (opts.yAxis.unit || "")
+ }
+ }
+ } else {
+ if (!opts.yAxis.formatter) {
+ opts.yAxis.formatter = (val, index, opts) => {
+ return val.toFixed(opts.yAxis.tofix) + (opts.yAxis.unit || "")
+ }
+ }
+ rangesArr[0] = getYAxisTextList(series, opts, config, columnstyle.type, {})
+ }
+ yAxisWidthArr[0] = {
+ position: "left",
+ width: 0,
+ }
+ var yAxisFontSize = opts.yAxis.fontSize * opts.pix || config.fontSize
+ rangesFormatArr[0] = rangesArr[0].map(function (item, index) {
+ item = opts.yAxis.formatter(item, index, opts)
+ yAxisWidthArr[0].width = Math.max(yAxisWidthArr[0].width, measureText(item, yAxisFontSize, context) + 5)
+ return item
+ })
+ yAxisWidthArr[0].width += 3 * opts.pix
+ if (opts.yAxis.disabled === true) {
+ yAxisWidthArr[0] = {
+ position: "left",
+ width: 0,
+ }
+ opts.yAxis.data[0] = {
+ disabled: true,
+ }
+ } else {
+ opts.yAxis.data[0] = {
+ disabled: false,
+ position: "left",
+ max: opts.yAxis.max,
+ min: opts.yAxis.min,
+ formatter: opts.yAxis.formatter,
+ }
+ if (opts.type === "bar") {
+ opts.yAxis.data[0].categories = opts.categories
+ opts.yAxis.data[0].type = "categories"
+ }
+ }
+ }
+ return {
+ rangesFormat: rangesFormatArr,
+ ranges: rangesArr,
+ yAxisWidth: yAxisWidthArr,
+ }
+}
+
+function calTooltipYAxisData(point, series, opts, config, eachSpacing) {
+ let ranges = [].concat(opts.chartData.yAxisData.ranges)
+ let spacingValid = opts.height - opts.area[0] - opts.area[2]
+ let minAxis = opts.area[0]
+ let items = []
+ for (let i = 0; i < ranges.length; i++) {
+ let maxVal = Math.max.apply(this, ranges[i])
+ let minVal = Math.min.apply(this, ranges[i])
+ let item = maxVal - ((maxVal - minVal) * (point - minAxis)) / spacingValid
+ item = opts.yAxis.data && opts.yAxis.data[i].formatter ? opts.yAxis.data[i].formatter(item, i, opts) : item.toFixed(0)
+ items.push(String(item))
+ }
+ return items
+}
+
+function calMarkLineData(points, opts) {
+ let minRange, maxRange
+ let spacingValid = opts.height - opts.area[0] - opts.area[2]
+ for (let i = 0; i < points.length; i++) {
+ points[i].yAxisIndex = points[i].yAxisIndex ? points[i].yAxisIndex : 0
+ let range = [].concat(opts.chartData.yAxisData.ranges[points[i].yAxisIndex])
+ minRange = range.pop()
+ maxRange = range.shift()
+ let height = (spacingValid * (points[i].value - minRange)) / (maxRange - minRange)
+ points[i].y = opts.height - Math.round(height) - opts.area[2]
+ }
+ return points
+}
+
+function contextRotate(context, opts) {
+ if (opts.rotateLock !== true) {
+ context.translate(opts.height, 0)
+ context.rotate((90 * Math.PI) / 180)
+ } else if (opts._rotate_ !== true) {
+ context.translate(opts.height, 0)
+ context.rotate((90 * Math.PI) / 180)
+ opts._rotate_ = true
+ }
+}
+
+function drawPointShape(points, color, shape, context, opts) {
+ context.beginPath()
+ if (opts.dataPointShapeType == "hollow") {
+ context.setStrokeStyle(color)
+ context.setFillStyle(opts.background)
+ context.setLineWidth(2 * opts.pix)
+ } else {
+ context.setStrokeStyle("#ffffff")
+ context.setFillStyle(color)
+ context.setLineWidth(1 * opts.pix)
+ }
+ if (shape === "diamond") {
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.moveTo(item.x, item.y - 4.5)
+ context.lineTo(item.x - 4.5, item.y)
+ context.lineTo(item.x, item.y + 4.5)
+ context.lineTo(item.x + 4.5, item.y)
+ context.lineTo(item.x, item.y - 4.5)
+ }
+ })
+ } else if (shape === "circle") {
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.moveTo(item.x + 2.5 * opts.pix, item.y)
+ context.arc(item.x, item.y, 3 * opts.pix, 0, 2 * Math.PI, false)
+ }
+ })
+ } else if (shape === "square") {
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.moveTo(item.x - 3.5, item.y - 3.5)
+ context.rect(item.x - 3.5, item.y - 3.5, 7, 7)
+ }
+ })
+ } else if (shape === "triangle") {
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.moveTo(item.x, item.y - 4.5)
+ context.lineTo(item.x - 4.5, item.y + 4.5)
+ context.lineTo(item.x + 4.5, item.y + 4.5)
+ context.lineTo(item.x, item.y - 4.5)
+ }
+ })
+ } else if (shape === "none") {
+ return
+ }
+ context.closePath()
+ context.fill()
+ context.stroke()
+}
+
+function drawActivePoint(points, color, shape, context, opts, option, seriesIndex) {
+ if (!opts.tooltip) {
+ return
+ }
+ if (opts.tooltip.group.length > 0 && opts.tooltip.group.includes(seriesIndex) == false) {
+ return
+ }
+ var pointIndex = typeof opts.tooltip.index === "number" ? opts.tooltip.index : opts.tooltip.index[opts.tooltip.group.indexOf(seriesIndex)]
+ context.beginPath()
+ if (option.activeType == "hollow") {
+ context.setStrokeStyle(color)
+ context.setFillStyle(opts.background)
+ context.setLineWidth(2 * opts.pix)
+ } else {
+ context.setStrokeStyle("#ffffff")
+ context.setFillStyle(color)
+ context.setLineWidth(1 * opts.pix)
+ }
+ if (shape === "diamond") {
+ points.forEach(function (item, index) {
+ if (item !== null && pointIndex == index) {
+ context.moveTo(item.x, item.y - 4.5)
+ context.lineTo(item.x - 4.5, item.y)
+ context.lineTo(item.x, item.y + 4.5)
+ context.lineTo(item.x + 4.5, item.y)
+ context.lineTo(item.x, item.y - 4.5)
+ }
+ })
+ } else if (shape === "circle") {
+ points.forEach(function (item, index) {
+ if (item !== null && pointIndex == index) {
+ context.moveTo(item.x + 2.5 * opts.pix, item.y)
+ context.arc(item.x, item.y, 3 * opts.pix, 0, 2 * Math.PI, false)
+ }
+ })
+ } else if (shape === "square") {
+ points.forEach(function (item, index) {
+ if (item !== null && pointIndex == index) {
+ context.moveTo(item.x - 3.5, item.y - 3.5)
+ context.rect(item.x - 3.5, item.y - 3.5, 7, 7)
+ }
+ })
+ } else if (shape === "triangle") {
+ points.forEach(function (item, index) {
+ if (item !== null && pointIndex == index) {
+ context.moveTo(item.x, item.y - 4.5)
+ context.lineTo(item.x - 4.5, item.y + 4.5)
+ context.lineTo(item.x + 4.5, item.y + 4.5)
+ context.lineTo(item.x, item.y - 4.5)
+ }
+ })
+ } else if (shape === "none") {
+ return
+ }
+ context.closePath()
+ context.fill()
+ context.stroke()
+}
+
+function drawRingTitle(opts, config, context, center) {
+ var titlefontSize = opts.title.fontSize || config.titleFontSize
+ var subtitlefontSize = opts.subtitle.fontSize || config.subtitleFontSize
+ var title = opts.title.name || ""
+ var subtitle = opts.subtitle.name || ""
+ var titleFontColor = opts.title.color || opts.fontColor
+ var subtitleFontColor = opts.subtitle.color || opts.fontColor
+ var titleHeight = title ? titlefontSize : 0
+ var subtitleHeight = subtitle ? subtitlefontSize : 0
+ var margin = 5
+ if (subtitle) {
+ var textWidth = measureText(subtitle, subtitlefontSize * opts.pix, context)
+ var startX = center.x - textWidth / 2 + (opts.subtitle.offsetX || 0) * opts.pix
+ var startY = center.y + (subtitlefontSize * opts.pix) / 2 + (opts.subtitle.offsetY || 0) * opts.pix
+ if (title) {
+ startY += (titleHeight * opts.pix + margin) / 2
+ }
+ context.beginPath()
+ context.setFontSize(subtitlefontSize * opts.pix)
+ context.setFillStyle(subtitleFontColor)
+ context.fillText(subtitle, startX, startY)
+ context.closePath()
+ context.stroke()
+ }
+ if (title) {
+ var _textWidth = measureText(title, titlefontSize * opts.pix, context)
+ var _startX = center.x - _textWidth / 2 + (opts.title.offsetX || 0)
+ var _startY = center.y + (titlefontSize * opts.pix) / 2 + (opts.title.offsetY || 0) * opts.pix
+ if (subtitle) {
+ _startY -= (subtitleHeight * opts.pix + margin) / 2
+ }
+ context.beginPath()
+ context.setFontSize(titlefontSize * opts.pix)
+ context.setFillStyle(titleFontColor)
+ context.fillText(title, _startX, _startY)
+ context.closePath()
+ context.stroke()
+ }
+}
+
+function drawPointText(points, series, config, context, opts) {
+ // 绘制数据文案
+ var data = series.data
+ var textOffset = series.textOffset ? series.textOffset : 0
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.beginPath()
+ var fontSize = series.textSize ? series.textSize * opts.pix : config.fontSize
+ context.setFontSize(fontSize)
+ context.setFillStyle(series.textColor || opts.fontColor)
+ var value = data[index]
+ if (typeof data[index] === "object" && data[index] !== null) {
+ if (data[index].constructor.toString().indexOf("Array") > -1) {
+ value = data[index][1]
+ } else {
+ value = data[index].value
+ }
+ }
+ var formatVal = series.formatter ? series.formatter(value, index, series, opts) : value
+ context.setTextAlign("center")
+ context.fillText(String(formatVal), item.x, item.y - 4 + textOffset * opts.pix)
+ context.closePath()
+ context.stroke()
+ context.setTextAlign("left")
+ }
+ })
+}
+
+function drawColumePointText(points, series, config, context, opts) {
+ // 绘制数据文案
+ var data = series.data
+ var textOffset = series.textOffset ? series.textOffset : 0
+ var Position = opts.extra.column.labelPosition
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.beginPath()
+ var fontSize = series.textSize ? series.textSize * opts.pix : config.fontSize
+ context.setFontSize(fontSize)
+ context.setFillStyle(series.textColor || opts.fontColor)
+ var value = data[index]
+ if (typeof data[index] === "object" && data[index] !== null) {
+ if (data[index].constructor.toString().indexOf("Array") > -1) {
+ value = data[index][1]
+ } else {
+ value = data[index].value
+ }
+ }
+ var formatVal = series.formatter ? series.formatter(value, index, series, opts) : value
+ context.setTextAlign("center")
+ var startY = item.y - 4 * opts.pix + textOffset * opts.pix
+ if (item.y > series.zeroPoints) {
+ startY = item.y + textOffset * opts.pix + fontSize
+ }
+ if (Position == "insideTop") {
+ startY = item.y + fontSize + textOffset * opts.pix
+ if (item.y > series.zeroPoints) {
+ startY = item.y - textOffset * opts.pix - 4 * opts.pix
+ }
+ }
+ if (Position == "center") {
+ startY = item.y + textOffset * opts.pix + (opts.height - opts.area[2] - item.y + fontSize) / 2
+ if (series.zeroPoints < opts.height - opts.area[2]) {
+ startY = item.y + textOffset * opts.pix + (series.zeroPoints - item.y + fontSize) / 2
+ }
+ if (item.y > series.zeroPoints) {
+ startY = item.y - textOffset * opts.pix - (item.y - series.zeroPoints - fontSize) / 2
+ }
+ if (opts.extra.column.type == "stack") {
+ startY = item.y + textOffset * opts.pix + (item.y0 - item.y + fontSize) / 2
+ }
+ }
+ if (Position == "bottom") {
+ startY = opts.height - opts.area[2] + textOffset * opts.pix - 4 * opts.pix
+ if (series.zeroPoints < opts.height - opts.area[2]) {
+ startY = series.zeroPoints + textOffset * opts.pix - 4 * opts.pix
+ }
+ if (item.y > series.zeroPoints) {
+ startY = series.zeroPoints - textOffset * opts.pix + fontSize + 2 * opts.pix
+ }
+ if (opts.extra.column.type == "stack") {
+ startY = item.y0 + textOffset * opts.pix - 4 * opts.pix
+ }
+ }
+ context.fillText(String(formatVal), item.x, startY)
+ context.closePath()
+ context.stroke()
+ context.setTextAlign("left")
+ }
+ })
+}
+
+function drawMountPointText(points, series, config, context, opts, zeroPoints) {
+ // 绘制数据文案
+ var data = series.data
+ var textOffset = series.textOffset ? series.textOffset : 0
+ var Position = opts.extra.mount.labelPosition
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.beginPath()
+ var fontSize = series[index].textSize ? series[index].textSize * opts.pix : config.fontSize
+ context.setFontSize(fontSize)
+ context.setFillStyle(series[index].textColor || opts.fontColor)
+ var value = item.value
+ var formatVal = series[index].formatter ? series[index].formatter(value, index, series, opts) : value
+ context.setTextAlign("center")
+ var startY = item.y - 4 * opts.pix + textOffset * opts.pix
+ if (item.y > zeroPoints) {
+ startY = item.y + textOffset * opts.pix + fontSize
+ }
+ context.fillText(String(formatVal), item.x, startY)
+ context.closePath()
+ context.stroke()
+ context.setTextAlign("left")
+ }
+ })
+}
+
+function drawBarPointText(points, series, config, context, opts) {
+ // 绘制数据文案
+ var data = series.data
+ var textOffset = series.textOffset ? series.textOffset : 0
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.beginPath()
+ var fontSize = series.textSize ? series.textSize * opts.pix : config.fontSize
+ context.setFontSize(fontSize)
+ context.setFillStyle(series.textColor || opts.fontColor)
+ var value = data[index]
+ if (typeof data[index] === "object" && data[index] !== null) {
+ value = data[index].value
+ }
+ var formatVal = series.formatter ? series.formatter(value, index, series, opts) : value
+ context.setTextAlign("left")
+ context.fillText(String(formatVal), item.x + 4 * opts.pix, item.y + fontSize / 2 - 3)
+ context.closePath()
+ context.stroke()
+ }
+ })
+}
+
+function drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context) {
+ radius -= gaugeOption.width / 2 + gaugeOption.labelOffset * opts.pix
+ radius = radius < 10 ? 10 : radius
+ let totalAngle
+ if (gaugeOption.endAngle < gaugeOption.startAngle) {
+ totalAngle = 2 + gaugeOption.endAngle - gaugeOption.startAngle
+ } else {
+ totalAngle = gaugeOption.startAngle - gaugeOption.endAngle
+ }
+ let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber
+ let totalNumber = gaugeOption.endNumber - gaugeOption.startNumber
+ let splitNumber = totalNumber / gaugeOption.splitLine.splitNumber
+ let nowAngle = gaugeOption.startAngle
+ let nowNumber = gaugeOption.startNumber
+ for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) {
+ var pos = {
+ x: radius * Math.cos(nowAngle * Math.PI),
+ y: radius * Math.sin(nowAngle * Math.PI),
+ }
+ var labelText = gaugeOption.formatter ? gaugeOption.formatter(nowNumber, i, opts) : nowNumber
+ pos.x += centerPosition.x - measureText(labelText, config.fontSize, context) / 2
+ pos.y += centerPosition.y
+ var startX = pos.x
+ var startY = pos.y
+ context.beginPath()
+ context.setFontSize(config.fontSize)
+ context.setFillStyle(gaugeOption.labelColor || opts.fontColor)
+ context.fillText(labelText, startX, startY + config.fontSize / 2)
+ context.closePath()
+ context.stroke()
+ nowAngle += splitAngle
+ if (nowAngle >= 2) {
+ nowAngle = nowAngle % 2
+ }
+ nowNumber += splitNumber
+ }
+}
+
+function drawRadarLabel(angleList, radius, centerPosition, opts, config, context) {
+ var radarOption = opts.extra.radar || {}
+ angleList.forEach(function (angle, index) {
+ if (radarOption.labelPointShow === true && opts.categories[index] !== "") {
+ var posPoint = {
+ x: radius * Math.cos(angle),
+ y: radius * Math.sin(angle),
+ }
+ var posPointAxis = convertCoordinateOrigin(posPoint.x, posPoint.y, centerPosition)
+ context.setFillStyle(radarOption.labelPointColor)
+ context.beginPath()
+ context.arc(posPointAxis.x, posPointAxis.y, radarOption.labelPointRadius * opts.pix, 0, 2 * Math.PI, false)
+ context.closePath()
+ context.fill()
+ }
+ if (radarOption.labelShow === true) {
+ var pos = {
+ x: (radius + config.radarLabelTextMargin * opts.pix) * Math.cos(angle),
+ y: (radius + config.radarLabelTextMargin * opts.pix) * Math.sin(angle),
+ }
+ var posRelativeCanvas = convertCoordinateOrigin(pos.x, pos.y, centerPosition)
+ var startX = posRelativeCanvas.x
+ var startY = posRelativeCanvas.y
+ if (util.approximatelyEqual(pos.x, 0)) {
+ startX -= measureText(opts.categories[index] || "", config.fontSize, context) / 2
+ } else if (pos.x < 0) {
+ startX -= measureText(opts.categories[index] || "", config.fontSize, context)
+ }
+ context.beginPath()
+ context.setFontSize(config.fontSize)
+ context.setFillStyle(radarOption.labelColor || opts.fontColor)
+ context.fillText(opts.categories[index] || "", startX, startY + config.fontSize / 2)
+ context.closePath()
+ context.stroke()
+ }
+ })
+}
+
+function drawPieText(series, opts, config, context, radius, center) {
+ var lineRadius = config.pieChartLinePadding
+ var textObjectCollection = []
+ var lastTextObject = null
+ var seriesConvert = series.map(function (item, index) {
+ var text = item.formatter ? item.formatter(item, index, series, opts) : util.toFixed(item._proportion_.toFixed(4) * 100) + "%"
+ text = item.labelText ? item.labelText : text
+ var arc = 2 * Math.PI - (item._start_ + (2 * Math.PI * item._proportion_) / 2)
+ if (item._rose_proportion_) {
+ arc = 2 * Math.PI - (item._start_ + (2 * Math.PI * item._rose_proportion_) / 2)
+ }
+ var color = item.color
+ var radius = item._radius_
+ return {
+ arc: arc,
+ text: text,
+ color: color,
+ radius: radius,
+ textColor: item.textColor,
+ textSize: item.textSize,
+ labelShow: item.labelShow,
+ }
+ })
+ for (let i = 0; i < seriesConvert.length; i++) {
+ let item = seriesConvert[i]
+ // line end
+ let orginX1 = Math.cos(item.arc) * (item.radius + lineRadius)
+ let orginY1 = Math.sin(item.arc) * (item.radius + lineRadius)
+ // line start
+ let orginX2 = Math.cos(item.arc) * item.radius
+ let orginY2 = Math.sin(item.arc) * item.radius
+ // text start
+ let orginX3 = orginX1 >= 0 ? orginX1 + config.pieChartTextPadding : orginX1 - config.pieChartTextPadding
+ let orginY3 = orginY1
+ let textWidth = measureText(item.text, item.textSize * opts.pix || config.fontSize, context)
+ let startY = orginY3
+ if (
+ lastTextObject &&
+ util.isSameXCoordinateArea(lastTextObject.start, {
+ x: orginX3,
+ })
+ ) {
+ if (orginX3 > 0) {
+ startY = Math.min(orginY3, lastTextObject.start.y)
+ } else if (orginX1 < 0) {
+ startY = Math.max(orginY3, lastTextObject.start.y)
+ } else {
+ if (orginY3 > 0) {
+ startY = Math.max(orginY3, lastTextObject.start.y)
+ } else {
+ startY = Math.min(orginY3, lastTextObject.start.y)
+ }
+ }
+ }
+ if (orginX3 < 0) {
+ orginX3 -= textWidth
+ }
+ let textObject = {
+ lineStart: {
+ x: orginX2,
+ y: orginY2,
+ },
+ lineEnd: {
+ x: orginX1,
+ y: orginY1,
+ },
+ start: {
+ x: orginX3,
+ y: startY,
+ },
+ width: textWidth,
+ height: config.fontSize,
+ text: item.text,
+ color: item.color,
+ textColor: item.textColor,
+ textSize: item.textSize,
+ }
+ lastTextObject = avoidCollision(textObject, lastTextObject)
+ textObjectCollection.push(lastTextObject)
+ }
+ for (let i = 0; i < textObjectCollection.length; i++) {
+ if (seriesConvert[i].labelShow === false) {
+ continue
+ }
+ let item = textObjectCollection[i]
+ let lineStartPoistion = convertCoordinateOrigin(item.lineStart.x, item.lineStart.y, center)
+ let lineEndPoistion = convertCoordinateOrigin(item.lineEnd.x, item.lineEnd.y, center)
+ let textPosition = convertCoordinateOrigin(item.start.x, item.start.y, center)
+ context.setLineWidth(1 * opts.pix)
+ context.setFontSize(item.textSize * opts.pix || config.fontSize)
+ context.beginPath()
+ context.setStrokeStyle(item.color)
+ context.setFillStyle(item.color)
+ context.moveTo(lineStartPoistion.x, lineStartPoistion.y)
+ let curveStartX = item.start.x < 0 ? textPosition.x + item.width : textPosition.x
+ let textStartX = item.start.x < 0 ? textPosition.x - 5 : textPosition.x + 5
+ context.quadraticCurveTo(lineEndPoistion.x, lineEndPoistion.y, curveStartX, textPosition.y)
+ context.moveTo(lineStartPoistion.x, lineStartPoistion.y)
+ context.stroke()
+ context.closePath()
+ context.beginPath()
+ context.moveTo(textPosition.x + item.width, textPosition.y)
+ context.arc(curveStartX, textPosition.y, 2 * opts.pix, 0, 2 * Math.PI)
+ context.closePath()
+ context.fill()
+ context.beginPath()
+ context.setFontSize(item.textSize * opts.pix || config.fontSize)
+ context.setFillStyle(item.textColor || opts.fontColor)
+ context.fillText(item.text, textStartX, textPosition.y + 3)
+ context.closePath()
+ context.stroke()
+ context.closePath()
+ }
+}
+
+function drawToolTipSplitLine(offsetX, opts, config, context) {
+ var toolTipOption = opts.extra.tooltip || {}
+ toolTipOption.gridType = toolTipOption.gridType == undefined ? "solid" : toolTipOption.gridType
+ toolTipOption.dashLength = toolTipOption.dashLength == undefined ? 4 : toolTipOption.dashLength
+ var startY = opts.area[0]
+ var endY = opts.height - opts.area[2]
+ if (toolTipOption.gridType == "dash") {
+ context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength])
+ }
+ context.setStrokeStyle(toolTipOption.gridColor || "#cccccc")
+ context.setLineWidth(1 * opts.pix)
+ context.beginPath()
+ context.moveTo(offsetX, startY)
+ context.lineTo(offsetX, endY)
+ context.stroke()
+ context.setLineDash([])
+ if (toolTipOption.xAxisLabel) {
+ let labelText = opts.categories[opts.tooltip.index]
+ context.setFontSize(config.fontSize)
+ let textWidth = measureText(labelText, config.fontSize, context)
+ let textX = offsetX - 0.5 * textWidth
+ let textY = endY + 2 * opts.pix
+ context.beginPath()
+ context.setFillStyle(
+ hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity),
+ )
+ context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground)
+ context.setLineWidth(1 * opts.pix)
+ context.rect(
+ textX - toolTipOption.boxPadding * opts.pix,
+ textY,
+ textWidth + 2 * toolTipOption.boxPadding * opts.pix,
+ config.fontSize + 2 * toolTipOption.boxPadding * opts.pix,
+ )
+ context.closePath()
+ context.stroke()
+ context.fill()
+ context.beginPath()
+ context.setFontSize(config.fontSize)
+ context.setFillStyle(toolTipOption.labelFontColor || opts.fontColor)
+ context.fillText(String(labelText), textX, textY + toolTipOption.boxPadding * opts.pix + config.fontSize)
+ context.closePath()
+ context.stroke()
+ }
+}
+
+function drawMarkLine(opts, config, context) {
+ let markLineOption = assign(
+ {},
+ {
+ type: "solid",
+ dashLength: 4,
+ data: [],
+ },
+ opts.extra.markLine,
+ )
+ let startX = opts.area[3]
+ let endX = opts.width - opts.area[1]
+ let points = calMarkLineData(markLineOption.data, opts)
+ for (let i = 0; i < points.length; i++) {
+ let item = assign(
+ {},
+ {
+ lineColor: "#DE4A42",
+ showLabel: false,
+ labelFontSize: 13,
+ labelPadding: 6,
+ labelFontColor: "#666666",
+ labelBgColor: "#DFE8FF",
+ labelBgOpacity: 0.8,
+ labelAlign: "left",
+ labelOffsetX: 0,
+ labelOffsetY: 0,
+ },
+ points[i],
+ )
+ if (markLineOption.type == "dash") {
+ context.setLineDash([markLineOption.dashLength, markLineOption.dashLength])
+ }
+ context.setStrokeStyle(item.lineColor)
+ context.setLineWidth(1 * opts.pix)
+ context.beginPath()
+ context.moveTo(startX, item.y)
+ context.lineTo(endX, item.y)
+ context.stroke()
+ context.setLineDash([])
+ if (item.showLabel) {
+ let fontSize = item.labelFontSize * opts.pix
+ let labelText = item.labelText ? item.labelText : item.value
+ context.setFontSize(fontSize)
+ let textWidth = measureText(labelText, fontSize, context)
+ let bgWidth = textWidth + item.labelPadding * opts.pix * 2
+ let bgStartX = item.labelAlign == "left" ? opts.area[3] - bgWidth : opts.width - opts.area[1]
+ bgStartX += item.labelOffsetX
+ let bgStartY = item.y - 0.5 * fontSize - item.labelPadding * opts.pix
+ bgStartY += item.labelOffsetY
+ let textX = bgStartX + item.labelPadding * opts.pix
+ let textY = item.y
+ context.setFillStyle(hexToRgb(item.labelBgColor, item.labelBgOpacity))
+ context.setStrokeStyle(item.labelBgColor)
+ context.setLineWidth(1 * opts.pix)
+ context.beginPath()
+ context.rect(bgStartX, bgStartY, bgWidth, fontSize + 2 * item.labelPadding * opts.pix)
+ context.closePath()
+ context.stroke()
+ context.fill()
+ context.setFontSize(fontSize)
+ context.setTextAlign("left")
+ context.setFillStyle(item.labelFontColor)
+ context.fillText(String(labelText), textX, bgStartY + fontSize + (item.labelPadding * opts.pix) / 2)
+ context.stroke()
+ context.setTextAlign("left")
+ }
+ }
+}
+
+function drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) {
+ var toolTipOption = assign(
+ {},
+ {
+ gridType: "solid",
+ dashLength: 4,
+ },
+ opts.extra.tooltip,
+ )
+ var startX = opts.area[3]
+ var endX = opts.width - opts.area[1]
+ if (toolTipOption.gridType == "dash") {
+ context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength])
+ }
+ context.setStrokeStyle(toolTipOption.gridColor || "#cccccc")
+ context.setLineWidth(1 * opts.pix)
+ context.beginPath()
+ context.moveTo(startX, opts.tooltip.offset.y)
+ context.lineTo(endX, opts.tooltip.offset.y)
+ context.stroke()
+ context.setLineDash([])
+ if (toolTipOption.yAxisLabel) {
+ let boxPadding = toolTipOption.boxPadding * opts.pix
+ let labelText = calTooltipYAxisData(opts.tooltip.offset.y, opts.series, opts, config, eachSpacing)
+ let widthArr = opts.chartData.yAxisData.yAxisWidth
+ let tStartLeft = opts.area[3]
+ let tStartRight = opts.width - opts.area[1]
+ for (let i = 0; i < labelText.length; i++) {
+ context.setFontSize(toolTipOption.fontSize * opts.pix)
+ let textWidth = measureText(labelText[i], toolTipOption.fontSize * opts.pix, context)
+ let bgStartX, bgEndX, bgWidth
+ if (widthArr[i].position == "left") {
+ bgStartX = tStartLeft - (textWidth + boxPadding * 2) - 2 * opts.pix
+ bgEndX = Math.max(bgStartX, bgStartX + textWidth + boxPadding * 2)
+ } else {
+ bgStartX = tStartRight + 2 * opts.pix
+ bgEndX = Math.max(bgStartX + widthArr[i].width, bgStartX + textWidth + boxPadding * 2)
+ }
+ bgWidth = bgEndX - bgStartX
+ let textX = bgStartX + (bgWidth - textWidth) / 2
+ let textY = opts.tooltip.offset.y
+ context.beginPath()
+ context.setFillStyle(
+ hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity),
+ )
+ context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground)
+ context.setLineWidth(1 * opts.pix)
+ context.rect(bgStartX, textY - 0.5 * config.fontSize - boxPadding, bgWidth, config.fontSize + 2 * boxPadding)
+ context.closePath()
+ context.stroke()
+ context.fill()
+ context.beginPath()
+ context.setFontSize(config.fontSize)
+ context.setFillStyle(toolTipOption.labelFontColor || opts.fontColor)
+ context.fillText(labelText[i], textX, textY + 0.5 * config.fontSize)
+ context.closePath()
+ context.stroke()
+ if (widthArr[i].position == "left") {
+ tStartLeft -= widthArr[i].width + opts.yAxis.padding * opts.pix
+ } else {
+ tStartRight += widthArr[i].width + opts.yAxis.padding * opts.pix
+ }
+ }
+ }
+}
+
+function drawToolTipSplitArea(offsetX, opts, config, context, eachSpacing) {
+ var toolTipOption = assign(
+ {},
+ {
+ activeBgColor: "#000000",
+ activeBgOpacity: 0.08,
+ activeWidth: eachSpacing,
+ },
+ opts.extra.column,
+ )
+ toolTipOption.activeWidth = toolTipOption.activeWidth > eachSpacing ? eachSpacing : toolTipOption.activeWidth
+ var startY = opts.area[0]
+ var endY = opts.height - opts.area[2]
+ context.beginPath()
+ context.setFillStyle(hexToRgb(toolTipOption.activeBgColor, toolTipOption.activeBgOpacity))
+ context.rect(offsetX - toolTipOption.activeWidth / 2, startY, toolTipOption.activeWidth, endY - startY)
+ context.closePath()
+ context.fill()
+ context.setFillStyle("#FFFFFF")
+}
+
+function drawBarToolTipSplitArea(offsetX, opts, config, context, eachSpacing) {
+ var toolTipOption = assign(
+ {},
+ {
+ activeBgColor: "#000000",
+ activeBgOpacity: 0.08,
+ },
+ opts.extra.bar,
+ )
+ var startX = opts.area[3]
+ var endX = opts.width - opts.area[1]
+ context.beginPath()
+ context.setFillStyle(hexToRgb(toolTipOption.activeBgColor, toolTipOption.activeBgOpacity))
+ context.rect(startX, offsetX - eachSpacing / 2, endX - startX, eachSpacing)
+ context.closePath()
+ context.fill()
+ context.setFillStyle("#FFFFFF")
+}
+
+function drawToolTip(textList, offset, opts, config, context, eachSpacing, xAxisPoints) {
+ const newTextList = textList[0].text.split("/br/")
+
+ const newTextListObj = []
+ for (let index = 1; index < newTextList.length; index++) {
+ newTextListObj.push({
+ text: newTextList[index],
+ // color: "#eee",
+ })
+ }
+
+ textList[0].text = newTextList[0]
+ textList.push(...newTextListObj)
+
+ var toolTipOption = assign(
+ {},
+ {
+ showBox: true,
+ showArrow: true,
+ showCategory: false,
+ bgColor: "#000000",
+ bgOpacity: 0.7,
+ borderColor: "#000000",
+ borderWidth: 0,
+ borderRadius: 0,
+ borderOpacity: 0.7,
+ boxPadding: 3,
+ fontColor: "#FFFFFF",
+ fontSize: 13,
+ lineHeight: 20,
+ legendShow: true,
+ legendShape: "auto",
+ splitLine: true,
+ shadowOffsetX: 0, // 阴影相对于形状水平方向的偏移。
+ shadowOffsetY: 0, // 阴影相对于形状竖直方向的偏移。
+ shadowBlur: 0, // 阴影的模糊级别,值越大越模糊,范围 0~100。
+ shadowColor: "#000000", // 阴影颜色。
+ },
+ opts.extra.tooltip,
+ )
+ if (toolTipOption.showCategory == true && opts.categories) {
+ textList.unshift({ text: opts.categories[opts.tooltip.index], color: null })
+ }
+ var fontSize = toolTipOption.fontSize * opts.pix
+ var lineHeight = toolTipOption.lineHeight * opts.pix
+ var boxPadding = toolTipOption.boxPadding * opts.pix
+ var legendWidth = fontSize
+ var legendMarginRight = 5 * opts.pix
+ if (toolTipOption.legendShow == false) {
+ legendWidth = 0
+ legendMarginRight = 0
+ }
+ var arrowWidth = toolTipOption.showArrow ? 8 * opts.pix : 0
+ var isOverRightBorder = false
+ if (opts.type == "line" || opts.type == "mount" || opts.type == "area" || opts.type == "candle" || opts.type == "mix") {
+ if (toolTipOption.splitLine == true) {
+ drawToolTipSplitLine(opts.tooltip.offset.x, opts, config, context)
+ }
+ }
+ offset = assign(
+ {
+ x: 0,
+ y: 0,
+ },
+ offset,
+ )
+ offset.y -= 8 * opts.pix
+ var textWidth = textList.map(function (item) {
+ return measureText(item.text, fontSize, context)
+ })
+ var toolTipWidth = legendWidth + legendMarginRight + 4 * boxPadding + Math.max.apply(null, textWidth)
+ var toolTipHeight = 2 * boxPadding + textList.length * lineHeight
+ if (toolTipOption.showBox == false) {
+ return
+ }
+ // if beyond the right border
+ if (offset.x - Math.abs(opts._scrollDistance_ || 0) + arrowWidth + toolTipWidth > opts.width) {
+ isOverRightBorder = true
+ }
+ if (toolTipHeight + offset.y > opts.height) {
+ offset.y = opts.height - toolTipHeight
+ }
+ // draw background rect
+ context.beginPath()
+ context.setFillStyle(hexToRgb(toolTipOption.bgColor, toolTipOption.bgOpacity))
+ context.save()
+ context.setLineWidth(toolTipOption.borderWidth * opts.pix)
+ context.setStrokeStyle(hexToRgb(toolTipOption.borderColor, toolTipOption.borderOpacity))
+ var radius = toolTipOption.borderRadius
+ if (isOverRightBorder) {
+ // 增加左侧仍然超出的判断
+ if (toolTipWidth + arrowWidth > opts.width) {
+ offset.x = opts.width + Math.abs(opts._scrollDistance_ || 0) + arrowWidth + (toolTipWidth - opts.width)
+ }
+ if (toolTipWidth > offset.x) {
+ offset.x = opts.width + Math.abs(opts._scrollDistance_ || 0) + arrowWidth + (toolTipWidth - opts.width)
+ }
+ if (toolTipOption.showArrow) {
+ context.moveTo(offset.x, offset.y + 10 * opts.pix)
+ context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pix + 5 * opts.pix)
+ }
+ context.arc(offset.x - arrowWidth - radius, offset.y + toolTipHeight - radius, radius, 0, Math.PI / 2, false)
+ context.arc(
+ offset.x - arrowWidth - Math.round(toolTipWidth) + radius,
+ offset.y + toolTipHeight - radius,
+ radius,
+ Math.PI / 2,
+ Math.PI,
+ false,
+ )
+ context.arc(offset.x - arrowWidth - Math.round(toolTipWidth) + radius, offset.y + radius, radius, -Math.PI, -Math.PI / 2, false)
+ context.arc(offset.x - arrowWidth - radius, offset.y + radius, radius, -Math.PI / 2, 0, false)
+ if (toolTipOption.showArrow) {
+ context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pix - 5 * opts.pix)
+ context.lineTo(offset.x, offset.y + 10 * opts.pix)
+ }
+ } else {
+ if (toolTipOption.showArrow) {
+ context.moveTo(offset.x, offset.y + 10 * opts.pix)
+ context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pix - 5 * opts.pix)
+ }
+ context.arc(offset.x + arrowWidth + radius, offset.y + radius, radius, -Math.PI, -Math.PI / 2, false)
+ context.arc(offset.x + arrowWidth + Math.round(toolTipWidth) - radius, offset.y + radius, radius, -Math.PI / 2, 0, false)
+ context.arc(offset.x + arrowWidth + Math.round(toolTipWidth) - radius, offset.y + toolTipHeight - radius, radius, 0, Math.PI / 2, false)
+ context.arc(offset.x + arrowWidth + radius, offset.y + toolTipHeight - radius, radius, Math.PI / 2, Math.PI, false)
+ if (toolTipOption.showArrow) {
+ context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pix + 5 * opts.pix)
+ context.lineTo(offset.x, offset.y + 10 * opts.pix)
+ }
+ }
+ context.closePath()
+ context.setShadow(toolTipOption.shadowOffsetX, toolTipOption.shadowOffsetY, toolTipOption.shadowBlur, toolTipOption.shadowColor)
+ context.fill()
+ if (toolTipOption.borderWidth > 0) {
+ context.stroke()
+ }
+ context.restore()
+ // draw legend
+ if (toolTipOption.legendShow) {
+ textList.forEach(function (item, index) {
+ if (item.color !== null) {
+ context.beginPath()
+ context.setFillStyle(item.color)
+ var startX = offset.x + arrowWidth + 2 * boxPadding
+ var startY = offset.y + (lineHeight - fontSize) / 2 + lineHeight * index + boxPadding + 1
+ if (isOverRightBorder) {
+ startX = offset.x - toolTipWidth - arrowWidth + 2 * boxPadding
+ }
+ switch (item.legendShape) {
+ case "line":
+ context.moveTo(startX, startY + 0.5 * legendWidth - 2 * opts.pix)
+ context.fillRect(startX, startY + 0.5 * legendWidth - 2 * opts.pix, legendWidth, 4 * opts.pix)
+ break
+ case "triangle":
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix)
+ context.lineTo(startX + 2.5 * opts.pix, startY + 0.5 * legendWidth + 5 * opts.pix)
+ context.lineTo(startX + 12.5 * opts.pix, startY + 0.5 * legendWidth + 5 * opts.pix)
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix)
+ break
+ case "diamond":
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix)
+ context.lineTo(startX + 2.5 * opts.pix, startY + 0.5 * legendWidth)
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth + 5 * opts.pix)
+ context.lineTo(startX + 12.5 * opts.pix, startY + 0.5 * legendWidth)
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix)
+ break
+ case "circle":
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth)
+ context.arc(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth, 5 * opts.pix, 0, 2 * Math.PI)
+ break
+ case "rect":
+ context.moveTo(startX, startY + 0.5 * legendWidth - 5 * opts.pix)
+ context.fillRect(startX, startY + 0.5 * legendWidth - 5 * opts.pix, 15 * opts.pix, 10 * opts.pix)
+ break
+ case "square":
+ context.moveTo(startX + 2 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix)
+ context.fillRect(startX + 2 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix, 10 * opts.pix, 10 * opts.pix)
+ break
+ default:
+ context.moveTo(startX, startY + 0.5 * legendWidth - 5 * opts.pix)
+ context.fillRect(startX, startY + 0.5 * legendWidth - 5 * opts.pix, 15 * opts.pix, 10 * opts.pix)
+ }
+ context.closePath()
+ context.fill()
+ }
+ })
+ }
+
+ // draw text list
+ textList.forEach(function (item, index) {
+ var startX = offset.x + arrowWidth + 2 * boxPadding + legendWidth + legendMarginRight
+ if (isOverRightBorder) {
+ startX = offset.x - toolTipWidth - arrowWidth + 2 * boxPadding + legendWidth + legendMarginRight
+ }
+ var startY = offset.y + lineHeight * index + (lineHeight - fontSize) / 2 - 1 + boxPadding + fontSize
+ context.beginPath()
+ context.setFontSize(fontSize)
+ context.setTextBaseline("normal")
+ context.setFillStyle(toolTipOption.fontColor)
+ context.fillText(item.text, startX, startY)
+ context.closePath()
+ context.stroke()
+ })
+}
+
+function drawColumnDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing
+ let columnOption = assign(
+ {},
+ {
+ type: "group",
+ width: eachSpacing / 2,
+ meterBorder: 4,
+ meterFillColor: "#FFFFFF",
+ barBorderCircle: false,
+ barBorderRadius: [],
+ seriesGap: 2,
+ linearType: "none",
+ linearOpacity: 1,
+ customColor: [],
+ colorStop: 0,
+ labelPosition: "outside",
+ },
+ opts.extra.column,
+ )
+ let calPoints = []
+ context.save()
+ let leftNum = -2
+ let rightNum = xAxisPoints.length + 2
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ leftNum = Math.floor(-opts._scrollDistance_ / eachSpacing) - 2
+ rightNum = leftNum + opts.xAxis.itemCount + 4
+ }
+ if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) {
+ drawToolTipSplitArea(opts.tooltip.offset.x, opts, config, context, eachSpacing)
+ }
+ columnOption.customColor = fillCustomColor(columnOption.linearType, columnOption.customColor, series, config)
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+
+ // 计算0轴坐标
+ let spacingValid = opts.height - opts.area[0] - opts.area[2]
+ let zeroHeight = (spacingValid * (0 - minRange)) / (maxRange - minRange)
+ let zeroPoints = opts.height - Math.round(zeroHeight) - opts.area[2]
+ eachSeries.zeroPoints = zeroPoints
+ var data = eachSeries.data
+ switch (columnOption.type) {
+ case "group":
+ var points = getColumnDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, zeroPoints, process)
+ var tooltipPoints = getStackDataPoints(
+ data,
+ minRange,
+ maxRange,
+ xAxisPoints,
+ eachSpacing,
+ opts,
+ config,
+ seriesIndex,
+ series,
+ process,
+ )
+ calPoints.push(tooltipPoints)
+ points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts)
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ //fix issues/I27B1N yyoinge & Joeshu
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - item.width / 2
+ var height = opts.height - item.y - opts.area[2]
+ context.beginPath()
+ var fillColor = item.color || eachSeries.color
+ var strokeColor = item.color || eachSeries.color
+ if (columnOption.linearType !== "none") {
+ var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints)
+ //透明渐变
+ if (columnOption.linearType == "opacity") {
+ grd.addColorStop(0, hexToRgb(fillColor, columnOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ } else {
+ grd.addColorStop(0, hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity))
+ grd.addColorStop(
+ columnOption.colorStop,
+ hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity),
+ )
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ }
+ fillColor = grd
+ }
+ // 圆角边框
+ if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle === true) {
+ const left = startX
+ const top = item.y > zeroPoints ? zeroPoints : item.y
+ const width = item.width
+ const height = Math.abs(zeroPoints - item.y)
+ if (columnOption.barBorderCircle) {
+ columnOption.barBorderRadius = [width / 2, width / 2, 0, 0]
+ }
+ if (item.y > zeroPoints) {
+ columnOption.barBorderRadius = [0, 0, width / 2, width / 2]
+ }
+ let [r0, r1, r2, r3] = columnOption.barBorderRadius
+ let minRadius = Math.min(width / 2, height / 2)
+ r0 = r0 > minRadius ? minRadius : r0
+ r1 = r1 > minRadius ? minRadius : r1
+ r2 = r2 > minRadius ? minRadius : r2
+ r3 = r3 > minRadius ? minRadius : r3
+ r0 = r0 < 0 ? 0 : r0
+ r1 = r1 < 0 ? 0 : r1
+ r2 = r2 < 0 ? 0 : r2
+ r3 = r3 < 0 ? 0 : r3
+ context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2)
+ context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0)
+ context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2)
+ context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI)
+ } else {
+ context.moveTo(startX, item.y)
+ context.lineTo(startX + item.width, item.y)
+ context.lineTo(startX + item.width, zeroPoints)
+ context.lineTo(startX, zeroPoints)
+ context.lineTo(startX, item.y)
+ context.setLineWidth(1)
+ context.setStrokeStyle(strokeColor)
+ }
+ context.setFillStyle(fillColor)
+ context.closePath()
+ //context.stroke();
+ context.fill()
+ }
+ }
+ break
+ case "stack":
+ // 绘制堆叠数据图
+ var points = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process)
+ calPoints.push(points)
+ points = fixColumeStackData(points, eachSpacing, series.length, seriesIndex, config, opts, series)
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ if (item !== null && i > leftNum && i < rightNum) {
+ context.beginPath()
+ var fillColor = item.color || eachSeries.color
+ var startX = item.x - item.width / 2 + 1
+ var height = opts.height - item.y - opts.area[2]
+ var height0 = opts.height - item.y0 - opts.area[2]
+ if (seriesIndex > 0) {
+ height -= height0
+ }
+ context.setFillStyle(fillColor)
+ context.moveTo(startX, item.y)
+ context.fillRect(startX, item.y, item.width, height)
+ context.closePath()
+ context.fill()
+ }
+ }
+ break
+ case "meter":
+ // 绘制温度计数据图
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ calPoints.push(points)
+ points = fixColumeMeterData(points, eachSpacing, series.length, seriesIndex, config, opts, columnOption.meterBorder)
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ if (item !== null && i > leftNum && i < rightNum) {
+ //画背景颜色
+ context.beginPath()
+ if (seriesIndex == 0 && columnOption.meterBorder > 0) {
+ context.setStrokeStyle(eachSeries.color)
+ context.setLineWidth(columnOption.meterBorder * opts.pix)
+ }
+ if (seriesIndex == 0) {
+ context.setFillStyle(columnOption.meterFillColor)
+ } else {
+ context.setFillStyle(item.color || eachSeries.color)
+ }
+ var startX = item.x - item.width / 2
+ var height = opts.height - item.y - opts.area[2]
+ if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle === true) {
+ const left = startX
+ const top = item.y
+ const width = item.width
+ const height = zeroPoints - item.y
+ if (columnOption.barBorderCircle) {
+ columnOption.barBorderRadius = [width / 2, width / 2, 0, 0]
+ }
+ let [r0, r1, r2, r3] = columnOption.barBorderRadius
+ let minRadius = Math.min(width / 2, height / 2)
+ r0 = r0 > minRadius ? minRadius : r0
+ r1 = r1 > minRadius ? minRadius : r1
+ r2 = r2 > minRadius ? minRadius : r2
+ r3 = r3 > minRadius ? minRadius : r3
+ r0 = r0 < 0 ? 0 : r0
+ r1 = r1 < 0 ? 0 : r1
+ r2 = r2 < 0 ? 0 : r2
+ r3 = r3 < 0 ? 0 : r3
+ context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2)
+ context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0)
+ context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2)
+ context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI)
+ context.fill()
+ } else {
+ context.moveTo(startX, item.y)
+ context.lineTo(startX + item.width, item.y)
+ context.lineTo(startX + item.width, zeroPoints)
+ context.lineTo(startX, zeroPoints)
+ context.lineTo(startX, item.y)
+ context.fill()
+ }
+ if (seriesIndex == 0 && columnOption.meterBorder > 0) {
+ context.closePath()
+ context.stroke()
+ }
+ }
+ }
+ break
+ }
+ })
+
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ switch (columnOption.type) {
+ case "group":
+ var points = getColumnDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts)
+ drawColumePointText(points, eachSeries, config, context, opts)
+ break
+ case "stack":
+ var points = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process)
+ drawColumePointText(points, eachSeries, config, context, opts)
+ break
+ case "meter":
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ drawColumePointText(points, eachSeries, config, context, opts)
+ break
+ }
+ })
+ }
+ context.restore()
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawMountDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing
+ let mountOption = assign(
+ {},
+ {
+ type: "mount",
+ widthRatio: 1,
+ borderWidth: 1,
+ barBorderCircle: false,
+ barBorderRadius: [],
+ linearType: "none",
+ linearOpacity: 1,
+ customColor: [],
+ colorStop: 0,
+ },
+ opts.extra.mount,
+ )
+ mountOption.widthRatio = mountOption.widthRatio <= 0 ? 0 : mountOption.widthRatio
+ mountOption.widthRatio = mountOption.widthRatio >= 2 ? 2 : mountOption.widthRatio
+ let calPoints = []
+ context.save()
+ let leftNum = -2
+ let rightNum = xAxisPoints.length + 2
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ leftNum = Math.floor(-opts._scrollDistance_ / eachSpacing) - 2
+ rightNum = leftNum + opts.xAxis.itemCount + 4
+ }
+ mountOption.customColor = fillCustomColor(mountOption.linearType, mountOption.customColor, series, config)
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[0])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+
+ // 计算0轴坐标
+ let spacingValid = opts.height - opts.area[0] - opts.area[2]
+ let zeroHeight = (spacingValid * (0 - minRange)) / (maxRange - minRange)
+ let zeroPoints = opts.height - Math.round(zeroHeight) - opts.area[2]
+
+ var points = getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption, zeroPoints, process)
+ switch (mountOption.type) {
+ case "bar":
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - (eachSpacing * mountOption.widthRatio) / 2
+ var height = opts.height - item.y - opts.area[2]
+ context.beginPath()
+ var fillColor = item.color || series[i].color
+ var strokeColor = item.color || series[i].color
+ if (mountOption.linearType !== "none") {
+ var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints)
+ //透明渐变
+ if (mountOption.linearType == "opacity") {
+ grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ } else {
+ grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity))
+ grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ }
+ fillColor = grd
+ }
+ // 圆角边框
+ if ((mountOption.barBorderRadius && mountOption.barBorderRadius.length === 4) || mountOption.barBorderCircle === true) {
+ const left = startX
+ const top = item.y > zeroPoints ? zeroPoints : item.y
+ const width = item.width
+ const height = Math.abs(zeroPoints - item.y)
+ if (mountOption.barBorderCircle) {
+ mountOption.barBorderRadius = [width / 2, width / 2, 0, 0]
+ }
+ if (item.y > zeroPoints) {
+ mountOption.barBorderRadius = [0, 0, width / 2, width / 2]
+ }
+ let [r0, r1, r2, r3] = mountOption.barBorderRadius
+ let minRadius = Math.min(width / 2, height / 2)
+ r0 = r0 > minRadius ? minRadius : r0
+ r1 = r1 > minRadius ? minRadius : r1
+ r2 = r2 > minRadius ? minRadius : r2
+ r3 = r3 > minRadius ? minRadius : r3
+ r0 = r0 < 0 ? 0 : r0
+ r1 = r1 < 0 ? 0 : r1
+ r2 = r2 < 0 ? 0 : r2
+ r3 = r3 < 0 ? 0 : r3
+ context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2)
+ context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0)
+ context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2)
+ context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI)
+ } else {
+ context.moveTo(startX, item.y)
+ context.lineTo(startX + item.width, item.y)
+ context.lineTo(startX + item.width, zeroPoints)
+ context.lineTo(startX, zeroPoints)
+ context.lineTo(startX, item.y)
+ }
+ context.setStrokeStyle(strokeColor)
+ context.setFillStyle(fillColor)
+ if (mountOption.borderWidth > 0) {
+ context.setLineWidth(mountOption.borderWidth * opts.pix)
+ context.closePath()
+ context.stroke()
+ }
+ context.fill()
+ }
+ }
+ break
+ case "triangle":
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - (eachSpacing * mountOption.widthRatio) / 2
+ var height = opts.height - item.y - opts.area[2]
+ context.beginPath()
+ var fillColor = item.color || series[i].color
+ var strokeColor = item.color || series[i].color
+ if (mountOption.linearType !== "none") {
+ var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints)
+ //透明渐变
+ if (mountOption.linearType == "opacity") {
+ grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ } else {
+ grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity))
+ grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ }
+ fillColor = grd
+ }
+ context.moveTo(startX, zeroPoints)
+ context.lineTo(item.x, item.y)
+ context.lineTo(startX + item.width, zeroPoints)
+ context.setStrokeStyle(strokeColor)
+ context.setFillStyle(fillColor)
+ if (mountOption.borderWidth > 0) {
+ context.setLineWidth(mountOption.borderWidth * opts.pix)
+ context.stroke()
+ }
+ context.fill()
+ }
+ }
+ break
+ case "mount":
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - (eachSpacing * mountOption.widthRatio) / 2
+ var height = opts.height - item.y - opts.area[2]
+ context.beginPath()
+ var fillColor = item.color || series[i].color
+ var strokeColor = item.color || series[i].color
+ if (mountOption.linearType !== "none") {
+ var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints)
+ //透明渐变
+ if (mountOption.linearType == "opacity") {
+ grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ } else {
+ grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity))
+ grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ }
+ fillColor = grd
+ }
+ context.moveTo(startX, zeroPoints)
+ context.bezierCurveTo(item.x - item.width / 4, zeroPoints, item.x - item.width / 4, item.y, item.x, item.y)
+ context.bezierCurveTo(item.x + item.width / 4, item.y, item.x + item.width / 4, zeroPoints, startX + item.width, zeroPoints)
+ context.setStrokeStyle(strokeColor)
+ context.setFillStyle(fillColor)
+ if (mountOption.borderWidth > 0) {
+ context.setLineWidth(mountOption.borderWidth * opts.pix)
+ context.stroke()
+ }
+ context.fill()
+ }
+ }
+ break
+ case "sharp":
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - (eachSpacing * mountOption.widthRatio) / 2
+ var height = opts.height - item.y - opts.area[2]
+ context.beginPath()
+ var fillColor = item.color || series[i].color
+ var strokeColor = item.color || series[i].color
+ if (mountOption.linearType !== "none") {
+ var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints)
+ //透明渐变
+ if (mountOption.linearType == "opacity") {
+ grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ } else {
+ grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity))
+ grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ }
+ fillColor = grd
+ }
+ context.moveTo(startX, zeroPoints)
+ context.quadraticCurveTo(item.x - 0, zeroPoints - height / 4, item.x, item.y)
+ context.quadraticCurveTo(item.x + 0, zeroPoints - height / 4, startX + item.width, zeroPoints)
+ context.setStrokeStyle(strokeColor)
+ context.setFillStyle(fillColor)
+ if (mountOption.borderWidth > 0) {
+ context.setLineWidth(mountOption.borderWidth * opts.pix)
+ context.stroke()
+ }
+ context.fill()
+ }
+ }
+ break
+ }
+
+ if (opts.dataLabel !== false && process === 1) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[0])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var points = getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption, zeroPoints, process)
+ drawMountPointText(points, series, config, context, opts, zeroPoints)
+ }
+ context.restore()
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: points,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawBarDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ let yAxisPoints = []
+ let eachSpacing = (opts.height - opts.area[0] - opts.area[2]) / opts.categories.length
+ for (let i = 0; i < opts.categories.length; i++) {
+ yAxisPoints.push(opts.area[0] + eachSpacing / 2 + eachSpacing * i)
+ }
+ let columnOption = assign(
+ {},
+ {
+ type: "group",
+ width: eachSpacing / 2,
+ meterBorder: 4,
+ meterFillColor: "#FFFFFF",
+ barBorderCircle: false,
+ barBorderRadius: [],
+ seriesGap: 2,
+ linearType: "none",
+ linearOpacity: 1,
+ customColor: [],
+ colorStop: 0,
+ },
+ opts.extra.bar,
+ )
+ let calPoints = []
+ context.save()
+ let leftNum = -2
+ let rightNum = yAxisPoints.length + 2
+ if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) {
+ drawBarToolTipSplitArea(opts.tooltip.offset.y, opts, config, context, eachSpacing)
+ }
+ columnOption.customColor = fillCustomColor(columnOption.linearType, columnOption.customColor, series, config)
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.xAxisData.ranges)
+ maxRange = ranges.pop()
+ minRange = ranges.shift()
+ var data = eachSeries.data
+ switch (columnOption.type) {
+ case "group":
+ var points = getBarDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, process)
+ var tooltipPoints = getBarStackDataPoints(
+ data,
+ minRange,
+ maxRange,
+ yAxisPoints,
+ eachSpacing,
+ opts,
+ config,
+ seriesIndex,
+ series,
+ process,
+ )
+ calPoints.push(tooltipPoints)
+ points = fixBarData(points, eachSpacing, series.length, seriesIndex, config, opts)
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ //fix issues/I27B1N yyoinge & Joeshu
+ if (item !== null && i > leftNum && i < rightNum) {
+ //var startX = item.x - item.width / 2;
+ var startX = opts.area[3]
+ var startY = item.y - item.width / 2
+ var height = item.height
+ context.beginPath()
+ var fillColor = item.color || eachSeries.color
+ var strokeColor = item.color || eachSeries.color
+ if (columnOption.linearType !== "none") {
+ var grd = context.createLinearGradient(startX, item.y, item.x, item.y)
+ //透明渐变
+ if (columnOption.linearType == "opacity") {
+ grd.addColorStop(0, hexToRgb(fillColor, columnOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ } else {
+ grd.addColorStop(0, hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity))
+ grd.addColorStop(
+ columnOption.colorStop,
+ hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity),
+ )
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ }
+ fillColor = grd
+ }
+ // 圆角边框
+ if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle === true) {
+ const left = startX
+ const width = item.width
+ const top = item.y - item.width / 2
+ const height = item.height
+ if (columnOption.barBorderCircle) {
+ columnOption.barBorderRadius = [width / 2, width / 2, 0, 0]
+ }
+ let [r0, r1, r2, r3] = columnOption.barBorderRadius
+ let minRadius = Math.min(width / 2, height / 2)
+ r0 = r0 > minRadius ? minRadius : r0
+ r1 = r1 > minRadius ? minRadius : r1
+ r2 = r2 > minRadius ? minRadius : r2
+ r3 = r3 > minRadius ? minRadius : r3
+ r0 = r0 < 0 ? 0 : r0
+ r1 = r1 < 0 ? 0 : r1
+ r2 = r2 < 0 ? 0 : r2
+ r3 = r3 < 0 ? 0 : r3
+
+ context.arc(left + r3, top + r3, r3, -Math.PI, -Math.PI / 2)
+ context.arc(item.x - r0, top + r0, r0, -Math.PI / 2, 0)
+ context.arc(item.x - r1, top + width - r1, r1, 0, Math.PI / 2)
+ context.arc(left + r2, top + width - r2, r2, Math.PI / 2, Math.PI)
+ } else {
+ context.moveTo(startX, startY)
+ context.lineTo(item.x, startY)
+ context.lineTo(item.x, startY + item.width)
+ context.lineTo(startX, startY + item.width)
+ context.lineTo(startX, startY)
+ context.setLineWidth(1)
+ context.setStrokeStyle(strokeColor)
+ }
+ context.setFillStyle(fillColor)
+ context.closePath()
+ //context.stroke();
+ context.fill()
+ }
+ }
+ break
+ case "stack":
+ // 绘制堆叠数据图
+ var points = getBarStackDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, seriesIndex, series, process)
+ calPoints.push(points)
+ points = fixBarStackData(points, eachSpacing, series.length, seriesIndex, config, opts, series)
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ if (item !== null && i > leftNum && i < rightNum) {
+ context.beginPath()
+ var fillColor = item.color || eachSeries.color
+ var startX = item.x0
+ context.setFillStyle(fillColor)
+ context.moveTo(startX, item.y - item.width / 2)
+ context.fillRect(startX, item.y - item.width / 2, item.height, item.width)
+ context.closePath()
+ context.fill()
+ }
+ }
+ break
+ }
+ })
+
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.xAxisData.ranges)
+ maxRange = ranges.pop()
+ minRange = ranges.shift()
+ var data = eachSeries.data
+ switch (columnOption.type) {
+ case "group":
+ var points = getBarDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, process)
+ points = fixBarData(points, eachSpacing, series.length, seriesIndex, config, opts)
+ drawBarPointText(points, eachSeries, config, context, opts)
+ break
+ case "stack":
+ var points = getBarStackDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, seriesIndex, series, process)
+ drawBarPointText(points, eachSeries, config, context, opts)
+ break
+ }
+ })
+ }
+ return {
+ yAxisPoints: yAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawCandleDataPoints(series, seriesMA, opts, config, context) {
+ var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1
+ var candleOption = assign(
+ {},
+ {
+ color: {},
+ average: {},
+ },
+ opts.extra.candle,
+ )
+ candleOption.color = assign(
+ {},
+ {
+ upLine: "#f04864",
+ upFill: "#f04864",
+ downLine: "#2fc25b",
+ downFill: "#2fc25b",
+ },
+ candleOption.color,
+ )
+ candleOption.average = assign(
+ {},
+ {
+ show: false,
+ name: [],
+ day: [],
+ color: config.color,
+ },
+ candleOption.average,
+ )
+ opts.extra.candle = candleOption
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing
+ let calPoints = []
+ context.save()
+ let leftNum = -2
+ let rightNum = xAxisPoints.length + 2
+ let leftSpace = 0
+ let rightSpace = opts.width + eachSpacing
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ leftNum = Math.floor(-opts._scrollDistance_ / eachSpacing) - 2
+ rightNum = leftNum + opts.xAxis.itemCount + 4
+ leftSpace = -opts._scrollDistance_ - eachSpacing * 2 + opts.area[3]
+ rightSpace = leftSpace + (opts.xAxis.itemCount + 4) * eachSpacing
+ }
+ //画均线
+ if (candleOption.average.show || seriesMA) {
+ //Merge pull request !12 from 邱贵翔
+ seriesMA.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ var splitPointList = splitPoints(points, eachSeries)
+ for (let i = 0; i < splitPointList.length; i++) {
+ let points = splitPointList[i]
+ context.beginPath()
+ context.setStrokeStyle(eachSeries.color)
+ context.setLineWidth(1)
+ if (points.length === 1) {
+ context.moveTo(points[0].x, points[0].y)
+ context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI)
+ } else {
+ context.moveTo(points[0].x, points[0].y)
+ let startPoint = 0
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ var ctrlPoint = createCurveControlPoints(points, j - 1)
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y)
+ }
+ }
+ context.moveTo(points[0].x, points[0].y)
+ }
+ context.closePath()
+ context.stroke()
+ }
+ })
+ }
+ //画K线
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ calPoints.push(points)
+ var splitPointList = splitPoints(points, eachSeries)
+ for (let i = 0; i < splitPointList[0].length; i++) {
+ if (i > leftNum && i < rightNum) {
+ let item = splitPointList[0][i]
+ context.beginPath()
+ //如果上涨
+ if (data[i][1] - data[i][0] > 0) {
+ context.setStrokeStyle(candleOption.color.upLine)
+ context.setFillStyle(candleOption.color.upFill)
+ context.setLineWidth(1 * opts.pix)
+ context.moveTo(item[3].x, item[3].y) //顶点
+ context.lineTo(item[1].x, item[1].y) //收盘中间点
+ context.lineTo(item[1].x - eachSpacing / 4, item[1].y) //收盘左侧点
+ context.lineTo(item[0].x - eachSpacing / 4, item[0].y) //开盘左侧点
+ context.lineTo(item[0].x, item[0].y) //开盘中间点
+ context.lineTo(item[2].x, item[2].y) //底点
+ context.lineTo(item[0].x, item[0].y) //开盘中间点
+ context.lineTo(item[0].x + eachSpacing / 4, item[0].y) //开盘右侧点
+ context.lineTo(item[1].x + eachSpacing / 4, item[1].y) //收盘右侧点
+ context.lineTo(item[1].x, item[1].y) //收盘中间点
+ context.moveTo(item[3].x, item[3].y) //顶点
+ } else {
+ context.setStrokeStyle(candleOption.color.downLine)
+ context.setFillStyle(candleOption.color.downFill)
+ context.setLineWidth(1 * opts.pix)
+ context.moveTo(item[3].x, item[3].y) //顶点
+ context.lineTo(item[0].x, item[0].y) //开盘中间点
+ context.lineTo(item[0].x - eachSpacing / 4, item[0].y) //开盘左侧点
+ context.lineTo(item[1].x - eachSpacing / 4, item[1].y) //收盘左侧点
+ context.lineTo(item[1].x, item[1].y) //收盘中间点
+ context.lineTo(item[2].x, item[2].y) //底点
+ context.lineTo(item[1].x, item[1].y) //收盘中间点
+ context.lineTo(item[1].x + eachSpacing / 4, item[1].y) //收盘右侧点
+ context.lineTo(item[0].x + eachSpacing / 4, item[0].y) //开盘右侧点
+ context.lineTo(item[0].x, item[0].y) //开盘中间点
+ context.moveTo(item[3].x, item[3].y) //顶点
+ }
+ context.closePath()
+ context.fill()
+ context.stroke()
+ }
+ }
+ })
+ context.restore()
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawAreaDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var areaOption = assign(
+ {},
+ {
+ type: "straight",
+ opacity: 0.2,
+ addLine: false,
+ width: 2,
+ gradient: false,
+ activeType: "none",
+ },
+ opts.extra.area,
+ )
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing
+ let endY = opts.height - opts.area[2]
+ let calPoints = []
+ context.save()
+ let leftSpace = 0
+ let rightSpace = opts.width + eachSpacing
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ leftSpace = -opts._scrollDistance_ - eachSpacing * 2 + opts.area[3]
+ rightSpace = leftSpace + (opts.xAxis.itemCount + 4) * eachSpacing
+ }
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ let data = eachSeries.data
+ let points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ calPoints.push(points)
+ let splitPointList = splitPoints(points, eachSeries)
+ for (let i = 0; i < splitPointList.length; i++) {
+ let points = splitPointList[i]
+ // 绘制区域数
+ context.beginPath()
+ context.setStrokeStyle(hexToRgb(eachSeries.color, areaOption.opacity))
+ if (areaOption.gradient) {
+ let gradient = context.createLinearGradient(0, opts.area[0], 0, opts.height - opts.area[2])
+ gradient.addColorStop("0", hexToRgb(eachSeries.color, areaOption.opacity))
+ gradient.addColorStop("1.0", hexToRgb("#FFFFFF", 0.1))
+ context.setFillStyle(gradient)
+ } else {
+ context.setFillStyle(hexToRgb(eachSeries.color, areaOption.opacity))
+ }
+ context.setLineWidth(areaOption.width * opts.pix)
+ if (points.length > 1) {
+ let firstPoint = points[0]
+ let lastPoint = points[points.length - 1]
+ context.moveTo(firstPoint.x, firstPoint.y)
+ let startPoint = 0
+ if (areaOption.type === "curve") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ let ctrlPoint = createCurveControlPoints(points, j - 1)
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y)
+ }
+ }
+ }
+ if (areaOption.type === "straight") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ context.lineTo(item.x, item.y)
+ }
+ }
+ }
+ if (areaOption.type === "step") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ context.lineTo(item.x, points[j - 1].y)
+ context.lineTo(item.x, item.y)
+ }
+ }
+ }
+ context.lineTo(lastPoint.x, endY)
+ context.lineTo(firstPoint.x, endY)
+ context.lineTo(firstPoint.x, firstPoint.y)
+ } else {
+ let item = points[0]
+ context.moveTo(item.x - eachSpacing / 2, item.y)
+ // context.lineTo(item.x + eachSpacing / 2, item.y);
+ // context.lineTo(item.x + eachSpacing / 2, endY);
+ // context.lineTo(item.x - eachSpacing / 2, endY);
+ // context.moveTo(item.x - eachSpacing / 2, item.y);
+ }
+ context.closePath()
+ context.fill()
+ //画连线
+ if (areaOption.addLine) {
+ if (eachSeries.lineType == "dash") {
+ let dashLength = eachSeries.dashLength ? eachSeries.dashLength : 8
+ dashLength *= opts.pix
+ context.setLineDash([dashLength, dashLength])
+ }
+ context.beginPath()
+ context.setStrokeStyle(eachSeries.color)
+ context.setLineWidth(areaOption.width * opts.pix)
+ if (points.length === 1) {
+ context.moveTo(points[0].x, points[0].y)
+ // context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+ } else {
+ context.moveTo(points[0].x, points[0].y)
+ let startPoint = 0
+ if (areaOption.type === "curve") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ let ctrlPoint = createCurveControlPoints(points, j - 1)
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y)
+ }
+ }
+ }
+ if (areaOption.type === "straight") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ context.lineTo(item.x, item.y)
+ }
+ }
+ }
+ if (areaOption.type === "step") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ context.lineTo(item.x, points[j - 1].y)
+ context.lineTo(item.x, item.y)
+ }
+ }
+ }
+ context.moveTo(points[0].x, points[0].y)
+ }
+ context.stroke()
+ context.setLineDash([])
+ }
+ }
+ //画点
+ if (opts.dataPointShape !== false) {
+ drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts)
+ }
+ drawActivePoint(points, eachSeries.color, eachSeries.pointShape, context, opts, areaOption, seriesIndex)
+ })
+
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ drawPointText(points, eachSeries, config, context, opts)
+ })
+ }
+ context.restore()
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawScatterDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var scatterOption = assign(
+ {},
+ {
+ type: "circle",
+ },
+ opts.extra.scatter,
+ )
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing
+ var calPoints = []
+ context.save()
+ let leftSpace = 0
+ let rightSpace = opts.width + eachSpacing
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ leftSpace = -opts._scrollDistance_ - eachSpacing * 2 + opts.area[3]
+ rightSpace = leftSpace + (opts.xAxis.itemCount + 4) * eachSpacing
+ }
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ context.beginPath()
+ context.setStrokeStyle(eachSeries.color)
+ context.setFillStyle(eachSeries.color)
+ context.setLineWidth(1 * opts.pix)
+ var shape = eachSeries.pointShape
+ if (shape === "diamond") {
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.moveTo(item.x, item.y - 4.5)
+ context.lineTo(item.x - 4.5, item.y)
+ context.lineTo(item.x, item.y + 4.5)
+ context.lineTo(item.x + 4.5, item.y)
+ context.lineTo(item.x, item.y - 4.5)
+ }
+ })
+ } else if (shape === "circle") {
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.moveTo(item.x + 2.5 * opts.pix, item.y)
+ context.arc(item.x, item.y, 3 * opts.pix, 0, 2 * Math.PI, false)
+ }
+ })
+ } else if (shape === "square") {
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.moveTo(item.x - 3.5, item.y - 3.5)
+ context.rect(item.x - 3.5, item.y - 3.5, 7, 7)
+ }
+ })
+ } else if (shape === "triangle") {
+ points.forEach(function (item, index) {
+ if (item !== null) {
+ context.moveTo(item.x, item.y - 4.5)
+ context.lineTo(item.x - 4.5, item.y + 4.5)
+ context.lineTo(item.x + 4.5, item.y + 4.5)
+ context.lineTo(item.x, item.y - 4.5)
+ }
+ })
+ } else if (shape === "triangle") {
+ return
+ }
+ context.closePath()
+ context.fill()
+ context.stroke()
+ })
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ drawPointText(points, eachSeries, config, context, opts)
+ })
+ }
+ context.restore()
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawBubbleDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var bubbleOption = assign(
+ {},
+ {
+ opacity: 1,
+ border: 2,
+ },
+ opts.extra.bubble,
+ )
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing
+ var calPoints = []
+ context.save()
+ let leftSpace = 0
+ let rightSpace = opts.width + eachSpacing
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ leftSpace = -opts._scrollDistance_ - eachSpacing * 2 + opts.area[3]
+ rightSpace = leftSpace + (opts.xAxis.itemCount + 4) * eachSpacing
+ }
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ context.beginPath()
+ context.setStrokeStyle(eachSeries.color)
+ context.setLineWidth(bubbleOption.border * opts.pix)
+ context.setFillStyle(hexToRgb(eachSeries.color, bubbleOption.opacity))
+ points.forEach(function (item, index) {
+ context.moveTo(item.x + item.r, item.y)
+ context.arc(item.x, item.y, item.r * opts.pix, 0, 2 * Math.PI, false)
+ })
+ context.closePath()
+ context.fill()
+ context.stroke()
+
+ if (opts.dataLabel !== false && process === 1) {
+ points.forEach(function (item, index) {
+ context.beginPath()
+ var fontSize = eachSeries.textSize * opts.pix || config.fontSize
+ context.setFontSize(fontSize)
+ context.setFillStyle(eachSeries.textColor || "#FFFFFF")
+ context.setTextAlign("center")
+ context.fillText(String(item.t), item.x, item.y + fontSize / 2)
+ context.closePath()
+ context.stroke()
+ context.setTextAlign("left")
+ })
+ }
+ })
+ context.restore()
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawLineDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var lineOption = assign(
+ {},
+ {
+ type: "straight",
+ width: 2,
+ activeType: "none",
+ linearType: "none",
+ onShadow: false,
+ animation: "vertical",
+ },
+ opts.extra.line,
+ )
+ lineOption.width *= opts.pix
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing
+ var calPoints = []
+ context.save()
+ let leftSpace = 0
+ let rightSpace = opts.width + eachSpacing
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ leftSpace = -opts._scrollDistance_ - eachSpacing * 2 + opts.area[3]
+ rightSpace = leftSpace + (opts.xAxis.itemCount + 4) * eachSpacing
+ }
+ series.forEach(function (eachSeries, seriesIndex) {
+ // 这段很神奇的代码用于解决ios16的setStrokeStyle失效的bug
+ context.beginPath()
+ context.setStrokeStyle(eachSeries.color)
+ context.moveTo(-10000, -10000)
+ context.lineTo(-10001, -10001)
+ context.stroke()
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getLineDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, lineOption, process)
+ calPoints.push(points)
+ var splitPointList = splitPoints(points, eachSeries)
+ if (eachSeries.lineType == "dash") {
+ let dashLength = eachSeries.dashLength ? eachSeries.dashLength : 8
+ dashLength *= opts.pix
+ context.setLineDash([dashLength, dashLength])
+ }
+ context.beginPath()
+ var strokeColor = eachSeries.color
+ if (lineOption.linearType !== "none" && eachSeries.linearColor && eachSeries.linearColor.length > 0) {
+ var grd = context.createLinearGradient(
+ opts.chartData.xAxisData.startX,
+ opts.height / 2,
+ opts.chartData.xAxisData.endX,
+ opts.height / 2,
+ )
+ for (var i = 0; i < eachSeries.linearColor.length; i++) {
+ grd.addColorStop(eachSeries.linearColor[i][0], hexToRgb(eachSeries.linearColor[i][1], 1))
+ }
+ strokeColor = grd
+ }
+ context.setStrokeStyle(strokeColor)
+ if (lineOption.onShadow == true && eachSeries.setShadow && eachSeries.setShadow.length > 0) {
+ context.setShadow(eachSeries.setShadow[0], eachSeries.setShadow[1], eachSeries.setShadow[2], eachSeries.setShadow[3])
+ } else {
+ context.setShadow(0, 0, 0, "rgba(0,0,0,0)")
+ }
+ context.setLineWidth(lineOption.width)
+ splitPointList.forEach(function (points, index) {
+ if (points.length === 1) {
+ context.moveTo(points[0].x, points[0].y)
+ // context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+ } else {
+ context.moveTo(points[0].x, points[0].y)
+ let startPoint = 0
+ if (lineOption.type === "curve") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ var ctrlPoint = createCurveControlPoints(points, j - 1)
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y)
+ }
+ }
+ }
+ if (lineOption.type === "straight") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ context.lineTo(item.x, item.y)
+ }
+ }
+ }
+ if (lineOption.type === "step") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ context.lineTo(item.x, points[j - 1].y)
+ context.lineTo(item.x, item.y)
+ }
+ }
+ }
+ context.moveTo(points[0].x, points[0].y)
+ }
+ })
+ context.stroke()
+ context.setLineDash([])
+ if (opts.dataPointShape !== false) {
+ drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts)
+ }
+ drawActivePoint(points, eachSeries.color, eachSeries.pointShape, context, opts, lineOption)
+ })
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ drawPointText(points, eachSeries, config, context, opts)
+ })
+ }
+ context.restore()
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawMixDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing
+ let columnOption = assign(
+ {},
+ {
+ width: eachSpacing / 2,
+ barBorderCircle: false,
+ barBorderRadius: [],
+ seriesGap: 2,
+ linearType: "none",
+ linearOpacity: 1,
+ customColor: [],
+ colorStop: 0,
+ },
+ opts.extra.mix.column,
+ )
+ let areaOption = assign(
+ {},
+ {
+ opacity: 0.2,
+ gradient: false,
+ },
+ opts.extra.mix.area,
+ )
+ let lineOption = assign(
+ {},
+ {
+ width: 2,
+ },
+ opts.extra.mix.line,
+ )
+ let endY = opts.height - opts.area[2]
+ let calPoints = []
+ var columnIndex = 0
+ var columnLength = 0
+ series.forEach(function (eachSeries, seriesIndex) {
+ if (eachSeries.type == "column") {
+ columnLength += 1
+ }
+ })
+ context.save()
+ let leftNum = -2
+ let rightNum = xAxisPoints.length + 2
+ let leftSpace = 0
+ let rightSpace = opts.width + eachSpacing
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ leftNum = Math.floor(-opts._scrollDistance_ / eachSpacing) - 2
+ rightNum = leftNum + opts.xAxis.itemCount + 4
+ leftSpace = -opts._scrollDistance_ - eachSpacing * 2 + opts.area[3]
+ rightSpace = leftSpace + (opts.xAxis.itemCount + 4) * eachSpacing
+ }
+ columnOption.customColor = fillCustomColor(columnOption.linearType, columnOption.customColor, series, config)
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ calPoints.push(points)
+ // 绘制柱状数据图
+ if (eachSeries.type == "column") {
+ points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts)
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i]
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - item.width / 2
+ var height = opts.height - item.y - opts.area[2]
+ context.beginPath()
+ var fillColor = item.color || eachSeries.color
+ var strokeColor = item.color || eachSeries.color
+ if (columnOption.linearType !== "none") {
+ var grd = context.createLinearGradient(startX, item.y, startX, opts.height - opts.area[2])
+ //透明渐变
+ if (columnOption.linearType == "opacity") {
+ grd.addColorStop(0, hexToRgb(fillColor, columnOption.linearOpacity))
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ } else {
+ grd.addColorStop(0, hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity))
+ grd.addColorStop(
+ columnOption.colorStop,
+ hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity),
+ )
+ grd.addColorStop(1, hexToRgb(fillColor, 1))
+ }
+ fillColor = grd
+ }
+ // 圆角边框
+ if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle) {
+ const left = startX
+ const top = item.y
+ const width = item.width
+ const height = opts.height - opts.area[2] - item.y
+ if (columnOption.barBorderCircle) {
+ columnOption.barBorderRadius = [width / 2, width / 2, 0, 0]
+ }
+ let [r0, r1, r2, r3] = columnOption.barBorderRadius
+ let minRadius = Math.min(width / 2, height / 2)
+ r0 = r0 > minRadius ? minRadius : r0
+ r1 = r1 > minRadius ? minRadius : r1
+ r2 = r2 > minRadius ? minRadius : r2
+ r3 = r3 > minRadius ? minRadius : r3
+ r0 = r0 < 0 ? 0 : r0
+ r1 = r1 < 0 ? 0 : r1
+ r2 = r2 < 0 ? 0 : r2
+ r3 = r3 < 0 ? 0 : r3
+ context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2)
+ context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0)
+ context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2)
+ context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI)
+ } else {
+ context.moveTo(startX, item.y)
+ context.lineTo(startX + item.width, item.y)
+ context.lineTo(startX + item.width, opts.height - opts.area[2])
+ context.lineTo(startX, opts.height - opts.area[2])
+ context.lineTo(startX, item.y)
+ context.setLineWidth(1)
+ context.setStrokeStyle(strokeColor)
+ }
+ context.setFillStyle(fillColor)
+ context.closePath()
+ context.fill()
+ }
+ }
+ columnIndex += 1
+ }
+ //绘制区域图数据
+ if (eachSeries.type == "area") {
+ let splitPointList = splitPoints(points, eachSeries)
+ for (let i = 0; i < splitPointList.length; i++) {
+ let points = splitPointList[i]
+ // 绘制区域数据
+ context.beginPath()
+ context.setStrokeStyle(eachSeries.color)
+ context.setStrokeStyle(hexToRgb(eachSeries.color, areaOption.opacity))
+ if (areaOption.gradient) {
+ let gradient = context.createLinearGradient(0, opts.area[0], 0, opts.height - opts.area[2])
+ gradient.addColorStop("0", hexToRgb(eachSeries.color, areaOption.opacity))
+ gradient.addColorStop("1.0", hexToRgb("#FFFFFF", 0.1))
+ context.setFillStyle(gradient)
+ } else {
+ context.setFillStyle(hexToRgb(eachSeries.color, areaOption.opacity))
+ }
+ context.setLineWidth(2 * opts.pix)
+ if (points.length > 1) {
+ var firstPoint = points[0]
+ let lastPoint = points[points.length - 1]
+ context.moveTo(firstPoint.x, firstPoint.y)
+ let startPoint = 0
+ if (eachSeries.style === "curve") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ var ctrlPoint = createCurveControlPoints(points, j - 1)
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y)
+ }
+ }
+ } else {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ context.lineTo(item.x, item.y)
+ }
+ }
+ }
+ context.lineTo(lastPoint.x, endY)
+ context.lineTo(firstPoint.x, endY)
+ context.lineTo(firstPoint.x, firstPoint.y)
+ } else {
+ let item = points[0]
+ context.moveTo(item.x - eachSpacing / 2, item.y)
+ // context.lineTo(item.x + eachSpacing / 2, item.y);
+ // context.lineTo(item.x + eachSpacing / 2, endY);
+ // context.lineTo(item.x - eachSpacing / 2, endY);
+ // context.moveTo(item.x - eachSpacing / 2, item.y);
+ }
+ context.closePath()
+ context.fill()
+ }
+ }
+ // 绘制折线数据图
+ if (eachSeries.type == "line") {
+ var splitPointList = splitPoints(points, eachSeries)
+ splitPointList.forEach(function (points, index) {
+ if (eachSeries.lineType == "dash") {
+ let dashLength = eachSeries.dashLength ? eachSeries.dashLength : 8
+ dashLength *= opts.pix
+ context.setLineDash([dashLength, dashLength])
+ }
+ context.beginPath()
+ context.setStrokeStyle(eachSeries.color)
+ context.setLineWidth(lineOption.width * opts.pix)
+ if (points.length === 1) {
+ context.moveTo(points[0].x, points[0].y)
+ // context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+ } else {
+ context.moveTo(points[0].x, points[0].y)
+ let startPoint = 0
+ if (eachSeries.style == "curve") {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ var ctrlPoint = createCurveControlPoints(points, j - 1)
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y)
+ }
+ }
+ } else {
+ for (let j = 0; j < points.length; j++) {
+ let item = points[j]
+ if (startPoint == 0 && item.x > leftSpace) {
+ context.moveTo(item.x, item.y)
+ startPoint = 1
+ }
+ if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+ context.lineTo(item.x, item.y)
+ }
+ }
+ }
+ context.moveTo(points[0].x, points[0].y)
+ }
+ context.stroke()
+ context.setLineDash([])
+ })
+ }
+ // 绘制点数据图
+ if (eachSeries.type == "point") {
+ eachSeries.addPoint = true
+ }
+ if (eachSeries.addPoint == true && eachSeries.type !== "column") {
+ drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts)
+ }
+ })
+ if (opts.dataLabel !== false && process === 1) {
+ var columnIndex = 0
+ series.forEach(function (eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange
+ ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index])
+ minRange = ranges.pop()
+ maxRange = ranges.shift()
+ var data = eachSeries.data
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process)
+ if (eachSeries.type !== "column") {
+ drawPointText(points, eachSeries, config, context, opts)
+ } else {
+ points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts)
+ drawPointText(points, eachSeries, config, context, opts)
+ columnIndex += 1
+ }
+ })
+ }
+ context.restore()
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ }
+}
+
+function drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints) {
+ var toolTipOption = opts.extra.tooltip || {}
+ if (
+ toolTipOption.horizentalLine &&
+ opts.tooltip &&
+ process === 1 &&
+ (opts.type == "line" ||
+ opts.type == "area" ||
+ opts.type == "column" ||
+ opts.type == "mount" ||
+ opts.type == "candle" ||
+ opts.type == "mix")
+ ) {
+ drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints)
+ }
+ context.save()
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0)
+ }
+ if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) {
+ drawToolTip(opts.tooltip.textList, opts.tooltip.offset, opts, config, context, eachSpacing, xAxisPoints)
+ }
+ context.restore()
+}
+
+function drawXAxis(categories, opts, config, context) {
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ startX = xAxisData.startX,
+ endX = xAxisData.endX,
+ eachSpacing = xAxisData.eachSpacing
+ var boundaryGap = "center"
+ if (opts.type == "bar" || opts.type == "line" || opts.type == "area" || opts.type == "scatter" || opts.type == "bubble") {
+ boundaryGap = opts.xAxis.boundaryGap
+ }
+ var startY = opts.height - opts.area[2]
+ var endY = opts.area[0]
+
+ //绘制滚动条
+ if (opts.enableScroll && opts.xAxis.scrollShow) {
+ var scrollY = opts.height - opts.area[2] + config.xAxisHeight
+ var scrollScreenWidth = endX - startX
+ var scrollTotalWidth = eachSpacing * (xAxisPoints.length - 1)
+ if (opts.type == "mount" && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1) {
+ if (opts.extra.mount.widthRatio > 2) opts.extra.mount.widthRatio = 2
+ scrollTotalWidth += (opts.extra.mount.widthRatio - 1) * eachSpacing
+ }
+ var scrollWidth = (scrollScreenWidth * scrollScreenWidth) / scrollTotalWidth
+ var scrollLeft = 0
+ if (opts._scrollDistance_) {
+ scrollLeft = (-opts._scrollDistance_ * scrollScreenWidth) / scrollTotalWidth
+ }
+ context.beginPath()
+ context.setLineCap("round")
+ context.setLineWidth(6 * opts.pix)
+ context.setStrokeStyle(opts.xAxis.scrollBackgroundColor || "#EFEBEF")
+ context.moveTo(startX, scrollY)
+ context.lineTo(endX, scrollY)
+ context.stroke()
+ context.closePath()
+ context.beginPath()
+ context.setLineCap("round")
+ context.setLineWidth(6 * opts.pix)
+ context.setStrokeStyle(opts.xAxis.scrollColor || "#A6A6A6")
+ context.moveTo(startX + scrollLeft, scrollY)
+ context.lineTo(startX + scrollLeft + scrollWidth, scrollY)
+ context.stroke()
+ context.closePath()
+ context.setLineCap("butt")
+ }
+ context.save()
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) {
+ context.translate(opts._scrollDistance_, 0)
+ }
+ //绘制X轴刻度线
+ if (opts.xAxis.calibration === true) {
+ context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc")
+ context.setLineCap("butt")
+ context.setLineWidth(1 * opts.pix)
+ xAxisPoints.forEach(function (item, index) {
+ if (index > 0) {
+ context.beginPath()
+ context.moveTo(item - eachSpacing / 2, startY)
+ context.lineTo(item - eachSpacing / 2, startY + 3 * opts.pix)
+ context.closePath()
+ context.stroke()
+ }
+ })
+ }
+ //绘制X轴网格
+ if (opts.xAxis.disableGrid !== true) {
+ context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc")
+ context.setLineCap("butt")
+ context.setLineWidth(1 * opts.pix)
+ if (opts.xAxis.gridType == "dash") {
+ context.setLineDash([opts.xAxis.dashLength * opts.pix, opts.xAxis.dashLength * opts.pix])
+ }
+ opts.xAxis.gridEval = opts.xAxis.gridEval || 1
+ xAxisPoints.forEach(function (item, index) {
+ if (index % opts.xAxis.gridEval == 0) {
+ context.beginPath()
+ context.moveTo(item, startY)
+ context.lineTo(item, endY)
+ context.stroke()
+ }
+ })
+ context.setLineDash([])
+ }
+ //绘制X轴文案
+ if (opts.xAxis.disabled !== true) {
+ // 对X轴列表做抽稀处理
+ //默认全部显示X轴标签
+ let maxXAxisListLength = categories.length
+ //如果设置了X轴单屏数量
+ if (opts.xAxis.labelCount) {
+ //如果设置X轴密度
+ if (opts.xAxis.itemCount) {
+ maxXAxisListLength = Math.ceil((categories.length / opts.xAxis.itemCount) * opts.xAxis.labelCount)
+ } else {
+ maxXAxisListLength = opts.xAxis.labelCount
+ }
+ maxXAxisListLength -= 1
+ }
+
+ let ratio = Math.ceil(categories.length / maxXAxisListLength)
+
+ let newCategories = []
+ let cgLength = categories.length
+ for (let i = 0; i < cgLength; i++) {
+ if (i % ratio !== 0) {
+ newCategories.push("")
+ } else {
+ newCategories.push(categories[i])
+ }
+ }
+ newCategories[cgLength - 1] = categories[cgLength - 1]
+ var xAxisFontSize = opts.xAxis.fontSize * opts.pix || config.fontSize
+ if (config._xAxisTextAngle_ === 0) {
+ newCategories.forEach(function (item, index) {
+ var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item, index, opts) : item
+ var offset = -measureText(String(xitem), xAxisFontSize, context) / 2
+ if (boundaryGap == "center") {
+ offset += eachSpacing / 2
+ }
+ var scrollHeight = 0
+ if (opts.xAxis.scrollShow) {
+ scrollHeight = 6 * opts.pix
+ }
+ // 如果在主视图区域内
+ var _scrollDistance_ = opts._scrollDistance_ || 0
+ var truePoints = boundaryGap == "center" ? xAxisPoints[index] + eachSpacing / 2 : xAxisPoints[index]
+ if (
+ truePoints - Math.abs(_scrollDistance_) >= opts.area[3] - 1 &&
+ truePoints - Math.abs(_scrollDistance_) <= opts.width - opts.area[1] + 1
+ ) {
+ context.beginPath()
+ context.setFontSize(xAxisFontSize)
+ context.setFillStyle(opts.xAxis.fontColor || opts.fontColor)
+ context.fillText(
+ String(xitem),
+ xAxisPoints[index] + offset,
+ startY +
+ opts.xAxis.marginTop * opts.pix +
+ ((opts.xAxis.lineHeight - opts.xAxis.fontSize) * opts.pix) / 2 +
+ opts.xAxis.fontSize * opts.pix,
+ )
+ context.closePath()
+ context.stroke()
+ }
+ })
+ } else {
+ newCategories.forEach(function (item, index) {
+ var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item) : item
+ // 如果在主视图区域内
+ var _scrollDistance_ = opts._scrollDistance_ || 0
+ var truePoints = boundaryGap == "center" ? xAxisPoints[index] + eachSpacing / 2 : xAxisPoints[index]
+ if (
+ truePoints - Math.abs(_scrollDistance_) >= opts.area[3] - 1 &&
+ truePoints - Math.abs(_scrollDistance_) <= opts.width - opts.area[1] + 1
+ ) {
+ context.save()
+ context.beginPath()
+ context.setFontSize(xAxisFontSize)
+ context.setFillStyle(opts.xAxis.fontColor || opts.fontColor)
+ var textWidth = measureText(String(xitem), xAxisFontSize, context)
+ var offsetX = xAxisPoints[index]
+ if (boundaryGap == "center") {
+ offsetX = xAxisPoints[index] + eachSpacing / 2
+ }
+ var scrollHeight = 0
+ if (opts.xAxis.scrollShow) {
+ scrollHeight = 6 * opts.pix
+ }
+ var offsetY =
+ startY + opts.xAxis.marginTop * opts.pix + xAxisFontSize - xAxisFontSize * Math.abs(Math.sin(config._xAxisTextAngle_))
+ if (opts.xAxis.rotateAngle < 0) {
+ offsetX -= xAxisFontSize / 2
+ textWidth = 0
+ } else {
+ offsetX += xAxisFontSize / 2
+ textWidth = -textWidth
+ }
+ context.translate(offsetX, offsetY)
+ context.rotate(-1 * config._xAxisTextAngle_)
+ context.fillText(String(xitem), textWidth, 0)
+ context.closePath()
+ context.stroke()
+ context.restore()
+ }
+ })
+ }
+ }
+ context.restore()
+
+ //画X轴标题
+ if (opts.xAxis.title) {
+ context.beginPath()
+ context.setFontSize(opts.xAxis.titleFontSize * opts.pix)
+ context.setFillStyle(opts.xAxis.titleFontColor)
+ context.fillText(
+ String(opts.xAxis.title),
+ opts.width - opts.area[1] + opts.xAxis.titleOffsetX * opts.pix,
+ opts.height -
+ opts.area[2] +
+ opts.xAxis.marginTop * opts.pix +
+ ((opts.xAxis.lineHeight - opts.xAxis.titleFontSize) * opts.pix) / 2 +
+ (opts.xAxis.titleFontSize + opts.xAxis.titleOffsetY) * opts.pix,
+ )
+ context.closePath()
+ context.stroke()
+ }
+
+ //绘制X轴轴线
+ if (opts.xAxis.axisLine) {
+ context.beginPath()
+ context.setStrokeStyle(opts.xAxis.axisLineColor)
+ context.setLineWidth(1 * opts.pix)
+ context.moveTo(startX, opts.height - opts.area[2])
+ context.lineTo(endX, opts.height - opts.area[2])
+ context.stroke()
+ }
+}
+
+function drawYAxisGrid(categories, opts, config, context) {
+ if (opts.yAxis.disableGrid === true) {
+ return
+ }
+ let spacingValid = opts.height - opts.area[0] - opts.area[2]
+ let eachSpacing = spacingValid / opts.yAxis.splitNumber
+ let startX = opts.area[3]
+ let xAxisPoints = opts.chartData.xAxisData.xAxisPoints,
+ xAxiseachSpacing = opts.chartData.xAxisData.eachSpacing
+ let TotalWidth = xAxiseachSpacing * (xAxisPoints.length - 1)
+ if (opts.type == "mount" && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1) {
+ if (opts.extra.mount.widthRatio > 2) opts.extra.mount.widthRatio = 2
+ TotalWidth += (opts.extra.mount.widthRatio - 1) * xAxiseachSpacing
+ }
+ let endX = startX + TotalWidth
+ let points = []
+ let startY = 1
+ if (opts.xAxis.axisLine === false) {
+ startY = 0
+ }
+ for (let i = startY; i < opts.yAxis.splitNumber + 1; i++) {
+ points.push(opts.height - opts.area[2] - eachSpacing * i)
+ }
+ context.save()
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) {
+ context.translate(opts._scrollDistance_, 0)
+ }
+ if (opts.yAxis.gridType == "dash") {
+ context.setLineDash([opts.yAxis.dashLength * opts.pix, opts.yAxis.dashLength * opts.pix])
+ }
+ context.setStrokeStyle(opts.yAxis.gridColor)
+ context.setLineWidth(1 * opts.pix)
+ points.forEach(function (item, index) {
+ context.beginPath()
+ context.moveTo(startX, item)
+ context.lineTo(endX, item)
+ context.stroke()
+ })
+ context.setLineDash([])
+ context.restore()
+}
+
+function drawYAxis(series, opts, config, context) {
+ if (opts.yAxis.disabled === true) {
+ return
+ }
+ var spacingValid = opts.height - opts.area[0] - opts.area[2]
+ var eachSpacing = spacingValid / opts.yAxis.splitNumber
+ var startX = opts.area[3]
+ var endX = opts.width - opts.area[1]
+ var endY = opts.height - opts.area[2]
+ // set YAxis background
+ context.beginPath()
+ context.setFillStyle(opts.background)
+ if (opts.enableScroll == true && opts.xAxis.scrollPosition && opts.xAxis.scrollPosition !== "left") {
+ context.fillRect(0, 0, startX, endY + 2 * opts.pix)
+ }
+ if (opts.enableScroll == true && opts.xAxis.scrollPosition && opts.xAxis.scrollPosition !== "right") {
+ context.fillRect(endX, 0, opts.width, endY + 2 * opts.pix)
+ }
+ context.closePath()
+ context.stroke()
+
+ let tStartLeft = opts.area[3]
+ let tStartRight = opts.width - opts.area[1]
+ let tStartCenter = opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2
+ if (opts.yAxis.data) {
+ for (let i = 0; i < opts.yAxis.data.length; i++) {
+ let yData = opts.yAxis.data[i]
+ var points = []
+ if (yData.type === "categories") {
+ for (let i = 0; i <= yData.categories.length; i++) {
+ points.push(opts.area[0] + spacingValid / yData.categories.length / 2 + (spacingValid / yData.categories.length) * i)
+ }
+ } else {
+ for (let i = 0; i <= opts.yAxis.splitNumber; i++) {
+ points.push(opts.area[0] + eachSpacing * i)
+ }
+ }
+ if (yData.disabled !== true) {
+ let rangesFormat = opts.chartData.yAxisData.rangesFormat[i]
+ let yAxisFontSize = yData.fontSize ? yData.fontSize * opts.pix : config.fontSize
+ let yAxisWidth = opts.chartData.yAxisData.yAxisWidth[i]
+ let textAlign = yData.textAlign || "right"
+ //画Y轴刻度及文案
+ rangesFormat.forEach(function (item, index) {
+ var pos = points[index]
+ context.beginPath()
+ context.setFontSize(yAxisFontSize)
+ context.setLineWidth(1 * opts.pix)
+ context.setStrokeStyle(yData.axisLineColor || "#cccccc")
+ context.setFillStyle(yData.fontColor || opts.fontColor)
+ let tmpstrat = 0
+ let gapwidth = 4 * opts.pix
+ if (yAxisWidth.position == "left") {
+ //画刻度线
+ if (yData.calibration == true) {
+ context.moveTo(tStartLeft, pos)
+ context.lineTo(tStartLeft - 3 * opts.pix, pos)
+ gapwidth += 3 * opts.pix
+ }
+ //画文字
+ switch (textAlign) {
+ case "left":
+ context.setTextAlign("left")
+ tmpstrat = tStartLeft - yAxisWidth.width
+ break
+ case "right":
+ context.setTextAlign("right")
+ tmpstrat = tStartLeft - gapwidth
+ break
+ default:
+ context.setTextAlign("center")
+ tmpstrat = tStartLeft - yAxisWidth.width / 2
+ }
+ context.fillText(String(item), tmpstrat, pos + yAxisFontSize / 2 - 3 * opts.pix)
+ } else if (yAxisWidth.position == "right") {
+ //画刻度线
+ if (yData.calibration == true) {
+ context.moveTo(tStartRight, pos)
+ context.lineTo(tStartRight + 3 * opts.pix, pos)
+ gapwidth += 3 * opts.pix
+ }
+ switch (textAlign) {
+ case "left":
+ context.setTextAlign("left")
+ tmpstrat = tStartRight + gapwidth
+ break
+ case "right":
+ context.setTextAlign("right")
+ tmpstrat = tStartRight + yAxisWidth.width
+ break
+ default:
+ context.setTextAlign("center")
+ tmpstrat = tStartRight + yAxisWidth.width / 2
+ }
+ context.fillText(String(item), tmpstrat, pos + yAxisFontSize / 2 - 3 * opts.pix)
+ } else if (yAxisWidth.position == "center") {
+ //画刻度线
+ if (yData.calibration == true) {
+ context.moveTo(tStartCenter, pos)
+ context.lineTo(tStartCenter - 3 * opts.pix, pos)
+ gapwidth += 3 * opts.pix
+ }
+ //画文字
+ switch (textAlign) {
+ case "left":
+ context.setTextAlign("left")
+ tmpstrat = tStartCenter - yAxisWidth.width
+ break
+ case "right":
+ context.setTextAlign("right")
+ tmpstrat = tStartCenter - gapwidth
+ break
+ default:
+ context.setTextAlign("center")
+ tmpstrat = tStartCenter - yAxisWidth.width / 2
+ }
+ context.fillText(String(item), tmpstrat, pos + yAxisFontSize / 2 - 3 * opts.pix)
+ }
+ context.closePath()
+ context.stroke()
+ context.setTextAlign("left")
+ })
+ //画Y轴轴线
+ if (yData.axisLine !== false) {
+ context.beginPath()
+ context.setStrokeStyle(yData.axisLineColor || "#cccccc")
+ context.setLineWidth(1 * opts.pix)
+ if (yAxisWidth.position == "left") {
+ context.moveTo(tStartLeft, opts.height - opts.area[2])
+ context.lineTo(tStartLeft, opts.area[0])
+ } else if (yAxisWidth.position == "right") {
+ context.moveTo(tStartRight, opts.height - opts.area[2])
+ context.lineTo(tStartRight, opts.area[0])
+ } else if (yAxisWidth.position == "center") {
+ context.moveTo(tStartCenter, opts.height - opts.area[2])
+ context.lineTo(tStartCenter, opts.area[0])
+ }
+ context.stroke()
+ }
+ //画Y轴标题
+ if (opts.yAxis.showTitle) {
+ let titleFontSize = yData.titleFontSize * opts.pix || config.fontSize
+ let title = yData.title
+ context.beginPath()
+ context.setFontSize(titleFontSize)
+ context.setFillStyle(yData.titleFontColor || opts.fontColor)
+ if (yAxisWidth.position == "left") {
+ context.fillText(
+ title,
+ tStartLeft - measureText(title, titleFontSize, context) / 2 + (yData.titleOffsetX || 0),
+ opts.area[0] - (10 - (yData.titleOffsetY || 0)) * opts.pix,
+ )
+ } else if (yAxisWidth.position == "right") {
+ context.fillText(
+ title,
+ tStartRight - measureText(title, titleFontSize, context) / 2 + (yData.titleOffsetX || 0),
+ opts.area[0] - (10 - (yData.titleOffsetY || 0)) * opts.pix,
+ )
+ } else if (yAxisWidth.position == "center") {
+ context.fillText(
+ title,
+ tStartCenter - measureText(title, titleFontSize, context) / 2 + (yData.titleOffsetX || 0),
+ opts.area[0] - (10 - (yData.titleOffsetY || 0)) * opts.pix,
+ )
+ }
+ context.closePath()
+ context.stroke()
+ }
+ if (yAxisWidth.position == "left") {
+ tStartLeft -= yAxisWidth.width + opts.yAxis.padding * opts.pix
+ } else {
+ tStartRight += yAxisWidth.width + opts.yAxis.padding * opts.pix
+ }
+ }
+ }
+ }
+}
+
+function drawLegend(series, opts, config, context, chartData) {
+ if (opts.legend.show === false) {
+ return
+ }
+ let legendData = chartData.legendData
+ let legendList = legendData.points
+ let legendArea = legendData.area
+ let padding = opts.legend.padding * opts.pix
+ let fontSize = opts.legend.fontSize * opts.pix
+ let shapeWidth = 15 * opts.pix
+ let shapeRight = 5 * opts.pix
+ let itemGap = opts.legend.itemGap * opts.pix
+ let lineHeight = Math.max(opts.legend.lineHeight * opts.pix, fontSize)
+ //画背景及边框
+ context.beginPath()
+ context.setLineWidth(opts.legend.borderWidth * opts.pix)
+ context.setStrokeStyle(opts.legend.borderColor)
+ context.setFillStyle(opts.legend.backgroundColor)
+ context.moveTo(legendArea.start.x, legendArea.start.y)
+ context.rect(legendArea.start.x, legendArea.start.y, legendArea.width, legendArea.height)
+ context.closePath()
+ context.fill()
+ context.stroke()
+ legendList.forEach(function (itemList, listIndex) {
+ let width = 0
+ let height = 0
+ width = legendData.widthArr[listIndex]
+ height = legendData.heightArr[listIndex]
+ let startX = 0
+ let startY = 0
+ if (opts.legend.position == "top" || opts.legend.position == "bottom") {
+ switch (opts.legend.float) {
+ case "left":
+ startX = legendArea.start.x + padding
+ break
+ case "right":
+ startX = legendArea.start.x + legendArea.width - width
+ break
+ default:
+ startX = legendArea.start.x + (legendArea.width - width) / 2
+ }
+ startY = legendArea.start.y + padding + listIndex * lineHeight
+ } else {
+ if (listIndex == 0) {
+ width = 0
+ } else {
+ width = legendData.widthArr[listIndex - 1]
+ }
+ startX = legendArea.start.x + padding + width
+ startY = legendArea.start.y + padding + (legendArea.height - height) / 2
+ }
+ context.setFontSize(config.fontSize)
+ for (let i = 0; i < itemList.length; i++) {
+ let item = itemList[i]
+ item.area = [0, 0, 0, 0]
+ item.area[0] = startX
+ item.area[1] = startY
+ item.area[3] = startY + lineHeight
+ context.beginPath()
+ context.setLineWidth(1 * opts.pix)
+ context.setStrokeStyle(item.show ? item.color : opts.legend.hiddenColor)
+ context.setFillStyle(item.show ? item.color : opts.legend.hiddenColor)
+ switch (item.legendShape) {
+ case "line":
+ context.moveTo(startX, startY + 0.5 * lineHeight - 2 * opts.pix)
+ context.fillRect(startX, startY + 0.5 * lineHeight - 2 * opts.pix, 15 * opts.pix, 4 * opts.pix)
+ break
+ case "triangle":
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix)
+ context.lineTo(startX + 2.5 * opts.pix, startY + 0.5 * lineHeight + 5 * opts.pix)
+ context.lineTo(startX + 12.5 * opts.pix, startY + 0.5 * lineHeight + 5 * opts.pix)
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix)
+ break
+ case "diamond":
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix)
+ context.lineTo(startX + 2.5 * opts.pix, startY + 0.5 * lineHeight)
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight + 5 * opts.pix)
+ context.lineTo(startX + 12.5 * opts.pix, startY + 0.5 * lineHeight)
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix)
+ break
+ case "circle":
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight)
+ context.arc(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight, 5 * opts.pix, 0, 2 * Math.PI)
+ break
+ case "rect":
+ context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pix)
+ context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pix, 15 * opts.pix, 10 * opts.pix)
+ break
+ case "square":
+ context.moveTo(startX + 5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix)
+ context.fillRect(startX + 5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix, 10 * opts.pix, 10 * opts.pix)
+ break
+ case "none":
+ break
+ default:
+ context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pix)
+ context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pix, 15 * opts.pix, 10 * opts.pix)
+ }
+ context.closePath()
+ context.fill()
+ context.stroke()
+ startX += shapeWidth + shapeRight
+ let fontTrans = 0.5 * lineHeight + 0.5 * fontSize - 2
+ const legendText = item.legendText ? item.legendText : item.name
+ context.beginPath()
+ context.setFontSize(fontSize)
+ context.setFillStyle(item.show ? opts.legend.fontColor : opts.legend.hiddenColor)
+ context.fillText(legendText, startX, startY + fontTrans)
+ context.closePath()
+ context.stroke()
+ if (opts.legend.position == "top" || opts.legend.position == "bottom") {
+ startX += measureText(legendText, fontSize, context) + itemGap
+ item.area[2] = startX
+ } else {
+ item.area[2] = startX + measureText(legendText, fontSize, context) + itemGap
+ startX -= shapeWidth + shapeRight
+ startY += lineHeight
+ }
+ }
+ })
+}
+
+function drawPieDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var pieOption = assign(
+ {},
+ {
+ activeOpacity: 0.5,
+ activeRadius: 10,
+ offsetAngle: 0,
+ labelWidth: 15,
+ ringWidth: 30,
+ customRadius: 0,
+ border: false,
+ borderWidth: 2,
+ borderColor: "#FFFFFF",
+ centerColor: "#FFFFFF",
+ linearType: "none",
+ customColor: [],
+ },
+ opts.type == "pie" ? opts.extra.pie : opts.extra.ring,
+ )
+ var centerPosition = {
+ x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+ y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2,
+ }
+ if (config.pieChartLinePadding == 0) {
+ config.pieChartLinePadding = pieOption.activeRadius * opts.pix
+ }
+
+ var radius = Math.min(
+ (opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_,
+ (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding,
+ )
+ radius = radius < 10 ? 10 : radius
+ if (pieOption.customRadius > 0) {
+ radius = pieOption.customRadius * opts.pix
+ }
+ series = getPieDataPoints(series, radius, process)
+ var activeRadius = pieOption.activeRadius * opts.pix
+ pieOption.customColor = fillCustomColor(pieOption.linearType, pieOption.customColor, series, config)
+ series = series.map(function (eachSeries) {
+ eachSeries._start_ += (pieOption.offsetAngle * Math.PI) / 180
+ return eachSeries
+ })
+ series.forEach(function (eachSeries, seriesIndex) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == seriesIndex) {
+ context.beginPath()
+ context.setFillStyle(hexToRgb(eachSeries.color, pieOption.activeOpacity || 0.5))
+ context.moveTo(centerPosition.x, centerPosition.y)
+ context.arc(
+ centerPosition.x,
+ centerPosition.y,
+ eachSeries._radius_ + activeRadius,
+ eachSeries._start_,
+ eachSeries._start_ + 2 * eachSeries._proportion_ * Math.PI,
+ )
+ context.closePath()
+ context.fill()
+ }
+ }
+ context.beginPath()
+ context.setLineWidth(pieOption.borderWidth * opts.pix)
+ context.lineJoin = "round"
+ context.setStrokeStyle(pieOption.borderColor)
+ var fillcolor = eachSeries.color
+ if (pieOption.linearType == "custom") {
+ var grd
+ if (context.createCircularGradient) {
+ grd = context.createCircularGradient(centerPosition.x, centerPosition.y, eachSeries._radius_)
+ } else {
+ grd = context.createRadialGradient(centerPosition.x, centerPosition.y, 0, centerPosition.x, centerPosition.y, eachSeries._radius_)
+ }
+ grd.addColorStop(0, hexToRgb(pieOption.customColor[eachSeries.linearIndex], 1))
+ grd.addColorStop(1, hexToRgb(eachSeries.color, 1))
+ fillcolor = grd
+ }
+ context.setFillStyle(fillcolor)
+ context.moveTo(centerPosition.x, centerPosition.y)
+ context.arc(
+ centerPosition.x,
+ centerPosition.y,
+ eachSeries._radius_,
+ eachSeries._start_,
+ eachSeries._start_ + 2 * eachSeries._proportion_ * Math.PI,
+ )
+ context.closePath()
+ context.fill()
+ if (pieOption.border == true) {
+ context.stroke()
+ }
+ })
+ if (opts.type === "ring") {
+ var innerPieWidth = radius * 0.6
+ if (typeof pieOption.ringWidth === "number" && pieOption.ringWidth > 0) {
+ innerPieWidth = Math.max(0, radius - pieOption.ringWidth * opts.pix)
+ }
+ context.beginPath()
+ context.setFillStyle(pieOption.centerColor)
+ context.moveTo(centerPosition.x, centerPosition.y)
+ context.arc(centerPosition.x, centerPosition.y, innerPieWidth, 0, 2 * Math.PI)
+ context.closePath()
+ context.fill()
+ }
+ if (opts.dataLabel !== false && process === 1) {
+ drawPieText(series, opts, config, context, radius, centerPosition)
+ }
+ if (process === 1 && opts.type === "ring") {
+ drawRingTitle(opts, config, context, centerPosition)
+ }
+ return {
+ center: centerPosition,
+ radius: radius,
+ series: series,
+ }
+}
+
+function drawRoseDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var roseOption = assign(
+ {},
+ {
+ type: "area",
+ activeOpacity: 0.5,
+ activeRadius: 10,
+ offsetAngle: 0,
+ labelWidth: 15,
+ border: false,
+ borderWidth: 2,
+ borderColor: "#FFFFFF",
+ linearType: "none",
+ customColor: [],
+ },
+ opts.extra.rose,
+ )
+ if (config.pieChartLinePadding == 0) {
+ config.pieChartLinePadding = roseOption.activeRadius * opts.pix
+ }
+ var centerPosition = {
+ x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+ y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2,
+ }
+ var radius = Math.min(
+ (opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_,
+ (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding,
+ )
+ radius = radius < 10 ? 10 : radius
+ var minRadius = roseOption.minRadius || radius * 0.5
+ if (radius < minRadius) {
+ radius = minRadius + 10
+ }
+ series = getRoseDataPoints(series, roseOption.type, minRadius, radius, process)
+ var activeRadius = roseOption.activeRadius * opts.pix
+ roseOption.customColor = fillCustomColor(roseOption.linearType, roseOption.customColor, series, config)
+ series = series.map(function (eachSeries) {
+ eachSeries._start_ += ((roseOption.offsetAngle || 0) * Math.PI) / 180
+ return eachSeries
+ })
+ series.forEach(function (eachSeries, seriesIndex) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == seriesIndex) {
+ context.beginPath()
+ context.setFillStyle(hexToRgb(eachSeries.color, roseOption.activeOpacity || 0.5))
+ context.moveTo(centerPosition.x, centerPosition.y)
+ context.arc(
+ centerPosition.x,
+ centerPosition.y,
+ activeRadius + eachSeries._radius_,
+ eachSeries._start_,
+ eachSeries._start_ + 2 * eachSeries._rose_proportion_ * Math.PI,
+ )
+ context.closePath()
+ context.fill()
+ }
+ }
+ context.beginPath()
+ context.setLineWidth(roseOption.borderWidth * opts.pix)
+ context.lineJoin = "round"
+ context.setStrokeStyle(roseOption.borderColor)
+ var fillcolor = eachSeries.color
+ if (roseOption.linearType == "custom") {
+ var grd
+ if (context.createCircularGradient) {
+ grd = context.createCircularGradient(centerPosition.x, centerPosition.y, eachSeries._radius_)
+ } else {
+ grd = context.createRadialGradient(centerPosition.x, centerPosition.y, 0, centerPosition.x, centerPosition.y, eachSeries._radius_)
+ }
+ grd.addColorStop(0, hexToRgb(roseOption.customColor[eachSeries.linearIndex], 1))
+ grd.addColorStop(1, hexToRgb(eachSeries.color, 1))
+ fillcolor = grd
+ }
+ context.setFillStyle(fillcolor)
+ context.moveTo(centerPosition.x, centerPosition.y)
+ context.arc(
+ centerPosition.x,
+ centerPosition.y,
+ eachSeries._radius_,
+ eachSeries._start_,
+ eachSeries._start_ + 2 * eachSeries._rose_proportion_ * Math.PI,
+ )
+ context.closePath()
+ context.fill()
+ if (roseOption.border == true) {
+ context.stroke()
+ }
+ })
+
+ if (opts.dataLabel !== false && process === 1) {
+ drawPieText(series, opts, config, context, radius, centerPosition)
+ }
+ return {
+ center: centerPosition,
+ radius: radius,
+ series: series,
+ }
+}
+
+function drawArcbarDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var arcbarOption = assign(
+ {},
+ {
+ startAngle: 0.75,
+ endAngle: 0.25,
+ type: "default",
+ direction: "cw",
+ lineCap: "round",
+ width: 12,
+ gap: 2,
+ linearType: "none",
+ customColor: [],
+ },
+ opts.extra.arcbar,
+ )
+ series = getArcbarDataPoints(series, arcbarOption, process)
+ var centerPosition
+ if (arcbarOption.centerX || arcbarOption.centerY) {
+ centerPosition = {
+ x: arcbarOption.centerX ? arcbarOption.centerX : opts.width / 2,
+ y: arcbarOption.centerY ? arcbarOption.centerY : opts.height / 2,
+ }
+ } else {
+ centerPosition = {
+ x: opts.width / 2,
+ y: opts.height / 2,
+ }
+ }
+ var radius
+ if (arcbarOption.radius) {
+ radius = arcbarOption.radius
+ } else {
+ radius = Math.min(centerPosition.x, centerPosition.y)
+ radius -= 5 * opts.pix
+ radius -= arcbarOption.width / 2
+ }
+ radius = radius < 10 ? 10 : radius
+ arcbarOption.customColor = fillCustomColor(arcbarOption.linearType, arcbarOption.customColor, series, config)
+
+ for (let i = 0; i < series.length; i++) {
+ let eachSeries = series[i]
+ //背景颜色
+ context.setLineWidth(arcbarOption.width * opts.pix)
+ context.setStrokeStyle(arcbarOption.backgroundColor || "#E9E9E9")
+ context.setLineCap(arcbarOption.lineCap)
+ context.beginPath()
+ if (arcbarOption.type == "default") {
+ context.arc(
+ centerPosition.x,
+ centerPosition.y,
+ radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i,
+ arcbarOption.startAngle * Math.PI,
+ arcbarOption.endAngle * Math.PI,
+ arcbarOption.direction == "ccw",
+ )
+ } else {
+ context.arc(
+ centerPosition.x,
+ centerPosition.y,
+ radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i,
+ 0,
+ 2 * Math.PI,
+ arcbarOption.direction == "ccw",
+ )
+ }
+ context.stroke()
+ //进度条
+ var fillColor = eachSeries.color
+ if (arcbarOption.linearType == "custom") {
+ var grd = context.createLinearGradient(centerPosition.x - radius, centerPosition.y, centerPosition.x + radius, centerPosition.y)
+ grd.addColorStop(1, hexToRgb(arcbarOption.customColor[eachSeries.linearIndex], 1))
+ grd.addColorStop(0, hexToRgb(eachSeries.color, 1))
+ fillColor = grd
+ }
+ context.setLineWidth(arcbarOption.width * opts.pix)
+ context.setStrokeStyle(fillColor)
+ context.setLineCap(arcbarOption.lineCap)
+ context.beginPath()
+ context.arc(
+ centerPosition.x,
+ centerPosition.y,
+ radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i,
+ arcbarOption.startAngle * Math.PI,
+ eachSeries._proportion_ * Math.PI,
+ arcbarOption.direction == "ccw",
+ )
+ context.stroke()
+ }
+ drawRingTitle(opts, config, context, centerPosition)
+ return {
+ center: centerPosition,
+ radius: radius,
+ series: series,
+ }
+}
+
+function drawGaugeDataPoints(categories, series, opts, config, context) {
+ var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1
+ var gaugeOption = assign(
+ {},
+ {
+ type: "default",
+ startAngle: 0.75,
+ endAngle: 0.25,
+ width: 15,
+ labelOffset: 13,
+ splitLine: {
+ fixRadius: 0,
+ splitNumber: 10,
+ width: 15,
+ color: "#FFFFFF",
+ childNumber: 5,
+ childWidth: 5,
+ },
+ pointer: {
+ width: 15,
+ color: "auto",
+ },
+ },
+ opts.extra.gauge,
+ )
+ if (gaugeOption.oldAngle == undefined) {
+ gaugeOption.oldAngle = gaugeOption.startAngle
+ }
+ if (gaugeOption.oldData == undefined) {
+ gaugeOption.oldData = 0
+ }
+ categories = getGaugeAxisPoints(categories, gaugeOption.startAngle, gaugeOption.endAngle)
+ var centerPosition = {
+ x: opts.width / 2,
+ y: opts.height / 2,
+ }
+ var radius = Math.min(centerPosition.x, centerPosition.y)
+ radius -= 5 * opts.pix
+ radius -= gaugeOption.width / 2
+ radius = radius < 10 ? 10 : radius
+ var innerRadius = radius - gaugeOption.width
+ var totalAngle = 0
+ //判断仪表盘的样式:default百度样式,progress新样式
+ if (gaugeOption.type == "progress") {
+ //## 第一步画中心圆形背景和进度条背景
+ //中心圆形背景
+ var pieRadius = radius - gaugeOption.width * 3
+ context.beginPath()
+ let gradient = context.createLinearGradient(
+ centerPosition.x,
+ centerPosition.y - pieRadius,
+ centerPosition.x,
+ centerPosition.y + pieRadius,
+ )
+ //配置渐变填充(起点:中心点向上减半径;结束点中心点向下加半径)
+ gradient.addColorStop("0", hexToRgb(series[0].color, 0.3))
+ gradient.addColorStop("1.0", hexToRgb("#FFFFFF", 0.1))
+ context.setFillStyle(gradient)
+ context.arc(centerPosition.x, centerPosition.y, pieRadius, 0, 2 * Math.PI, false)
+ context.fill()
+ //画进度条背景
+ context.setLineWidth(gaugeOption.width)
+ context.setStrokeStyle(hexToRgb(series[0].color, 0.3))
+ context.setLineCap("round")
+ context.beginPath()
+ context.arc(centerPosition.x, centerPosition.y, innerRadius, gaugeOption.startAngle * Math.PI, gaugeOption.endAngle * Math.PI, false)
+ context.stroke()
+ //## 第二步画刻度线
+ if (gaugeOption.endAngle < gaugeOption.startAngle) {
+ totalAngle = 2 + gaugeOption.endAngle - gaugeOption.startAngle
+ } else {
+ totalAngle = gaugeOption.startAngle - gaugeOption.endAngle
+ }
+ let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber
+ let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber
+ let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius
+ let endX = -radius - gaugeOption.width - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width
+ context.save()
+ context.translate(centerPosition.x, centerPosition.y)
+ context.rotate((gaugeOption.startAngle - 1) * Math.PI)
+ let len = gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1
+ let proc = series[0].data * process
+ for (let i = 0; i < len; i++) {
+ context.beginPath()
+ //刻度线随进度变色
+ if (proc > i / len) {
+ context.setStrokeStyle(hexToRgb(series[0].color, 1))
+ } else {
+ context.setStrokeStyle(hexToRgb(series[0].color, 0.3))
+ }
+ context.setLineWidth(3 * opts.pix)
+ context.moveTo(startX, 0)
+ context.lineTo(endX, 0)
+ context.stroke()
+ context.rotate(childAngle * Math.PI)
+ }
+ context.restore()
+ //## 第三步画进度条
+ series = getGaugeArcbarDataPoints(series, gaugeOption, process)
+ context.setLineWidth(gaugeOption.width)
+ context.setStrokeStyle(series[0].color)
+ context.setLineCap("round")
+ context.beginPath()
+ context.arc(centerPosition.x, centerPosition.y, innerRadius, gaugeOption.startAngle * Math.PI, series[0]._proportion_ * Math.PI, false)
+ context.stroke()
+ //## 第四步画指针
+ let pointerRadius = radius - gaugeOption.width * 2.5
+ context.save()
+ context.translate(centerPosition.x, centerPosition.y)
+ context.rotate((series[0]._proportion_ - 1) * Math.PI)
+ context.beginPath()
+ context.setLineWidth(gaugeOption.width / 3)
+ let gradient3 = context.createLinearGradient(0, -pointerRadius * 0.6, 0, pointerRadius * 0.6)
+ gradient3.addColorStop("0", hexToRgb("#FFFFFF", 0))
+ gradient3.addColorStop("0.5", hexToRgb(series[0].color, 1))
+ gradient3.addColorStop("1.0", hexToRgb("#FFFFFF", 0))
+ context.setStrokeStyle(gradient3)
+ context.arc(0, 0, pointerRadius, 0.85 * Math.PI, 1.15 * Math.PI, false)
+ context.stroke()
+ context.beginPath()
+ context.setLineWidth(1)
+ context.setStrokeStyle(series[0].color)
+ context.setFillStyle(series[0].color)
+ context.moveTo(-pointerRadius - gaugeOption.width / 3 / 2, -4)
+ context.lineTo(-pointerRadius - gaugeOption.width / 3 / 2 - 4, 0)
+ context.lineTo(-pointerRadius - gaugeOption.width / 3 / 2, 4)
+ context.lineTo(-pointerRadius - gaugeOption.width / 3 / 2, -4)
+ context.stroke()
+ context.fill()
+ context.restore()
+ //default百度样式
+ } else {
+ //画背景
+ context.setLineWidth(gaugeOption.width)
+ context.setLineCap("butt")
+ for (let i = 0; i < categories.length; i++) {
+ let eachCategories = categories[i]
+ context.beginPath()
+ context.setStrokeStyle(eachCategories.color)
+ context.arc(
+ centerPosition.x,
+ centerPosition.y,
+ radius,
+ eachCategories._startAngle_ * Math.PI,
+ eachCategories._endAngle_ * Math.PI,
+ false,
+ )
+ context.stroke()
+ }
+ context.save()
+ //画刻度线
+ if (gaugeOption.endAngle < gaugeOption.startAngle) {
+ totalAngle = 2 + gaugeOption.endAngle - gaugeOption.startAngle
+ } else {
+ totalAngle = gaugeOption.startAngle - gaugeOption.endAngle
+ }
+ let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber
+ let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber
+ let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius
+ let endX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width
+ let childendX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.childWidth
+ context.translate(centerPosition.x, centerPosition.y)
+ context.rotate((gaugeOption.startAngle - 1) * Math.PI)
+ for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) {
+ context.beginPath()
+ context.setStrokeStyle(gaugeOption.splitLine.color)
+ context.setLineWidth(2 * opts.pix)
+ context.moveTo(startX, 0)
+ context.lineTo(endX, 0)
+ context.stroke()
+ context.rotate(splitAngle * Math.PI)
+ }
+ context.restore()
+ context.save()
+ context.translate(centerPosition.x, centerPosition.y)
+ context.rotate((gaugeOption.startAngle - 1) * Math.PI)
+ for (let i = 0; i < gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; i++) {
+ context.beginPath()
+ context.setStrokeStyle(gaugeOption.splitLine.color)
+ context.setLineWidth(1 * opts.pix)
+ context.moveTo(startX, 0)
+ context.lineTo(childendX, 0)
+ context.stroke()
+ context.rotate(childAngle * Math.PI)
+ }
+ context.restore()
+ //画指针
+ series = getGaugeDataPoints(series, categories, gaugeOption, process)
+ for (let i = 0; i < series.length; i++) {
+ let eachSeries = series[i]
+ context.save()
+ context.translate(centerPosition.x, centerPosition.y)
+ context.rotate((eachSeries._proportion_ - 1) * Math.PI)
+ context.beginPath()
+ context.setFillStyle(eachSeries.color)
+ context.moveTo(gaugeOption.pointer.width, 0)
+ context.lineTo(0, -gaugeOption.pointer.width / 2)
+ context.lineTo(-innerRadius, 0)
+ context.lineTo(0, gaugeOption.pointer.width / 2)
+ context.lineTo(gaugeOption.pointer.width, 0)
+ context.closePath()
+ context.fill()
+ context.beginPath()
+ context.setFillStyle("#FFFFFF")
+ context.arc(0, 0, gaugeOption.pointer.width / 6, 0, 2 * Math.PI, false)
+ context.fill()
+ context.restore()
+ }
+ if (opts.dataLabel !== false) {
+ drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context)
+ }
+ }
+ //画仪表盘标题,副标题
+ drawRingTitle(opts, config, context, centerPosition)
+ if (process === 1 && opts.type === "gauge") {
+ opts.extra.gauge.oldAngle = series[0]._proportion_
+ opts.extra.gauge.oldData = series[0].data
+ }
+ return {
+ center: centerPosition,
+ radius: radius,
+ innerRadius: innerRadius,
+ categories: categories,
+ totalAngle: totalAngle,
+ }
+}
+
+function drawRadarDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ var radarOption = assign(
+ {},
+ {
+ gridColor: "#cccccc",
+ gridType: "radar",
+ gridEval: 1,
+ axisLabel: false,
+ axisLabelTofix: 0,
+ labelShow: true,
+ labelColor: "#666666",
+ labelPointShow: false,
+ labelPointRadius: 3,
+ labelPointColor: "#cccccc",
+ opacity: 0.2,
+ gridCount: 3,
+ border: false,
+ borderWidth: 2,
+ linearType: "none",
+ customColor: [],
+ },
+ opts.extra.radar,
+ )
+ var coordinateAngle = getRadarCoordinateSeries(opts.categories.length)
+ var centerPosition = {
+ x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+ y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2,
+ }
+ var xr = (opts.width - opts.area[1] - opts.area[3]) / 2
+ var yr = (opts.height - opts.area[0] - opts.area[2]) / 2
+ var radius = Math.min(
+ xr - (getMaxTextListLength(opts.categories, config.fontSize, context) + config.radarLabelTextMargin),
+ yr - config.radarLabelTextMargin,
+ )
+ radius -= config.radarLabelTextMargin * opts.pix
+ radius = radius < 10 ? 10 : radius
+ radius = radarOption.radius ? radarOption.radius : radius
+ // 画分割线
+ context.beginPath()
+ context.setLineWidth(1 * opts.pix)
+ context.setStrokeStyle(radarOption.gridColor)
+ coordinateAngle.forEach(function (angle, index) {
+ var pos = convertCoordinateOrigin(radius * Math.cos(angle), radius * Math.sin(angle), centerPosition)
+ context.moveTo(centerPosition.x, centerPosition.y)
+ if (index % radarOption.gridEval == 0) {
+ context.lineTo(pos.x, pos.y)
+ }
+ })
+ context.stroke()
+ context.closePath()
+
+ // 画背景网格
+ var _loop = function _loop(i) {
+ var startPos = {}
+ context.beginPath()
+ context.setLineWidth(1 * opts.pix)
+ context.setStrokeStyle(radarOption.gridColor)
+ if (radarOption.gridType == "radar") {
+ coordinateAngle.forEach(function (angle, index) {
+ var pos = convertCoordinateOrigin(
+ (radius / radarOption.gridCount) * i * Math.cos(angle),
+ (radius / radarOption.gridCount) * i * Math.sin(angle),
+ centerPosition,
+ )
+ if (index === 0) {
+ startPos = pos
+ context.moveTo(pos.x, pos.y)
+ } else {
+ context.lineTo(pos.x, pos.y)
+ }
+ })
+ context.lineTo(startPos.x, startPos.y)
+ } else {
+ var pos = convertCoordinateOrigin(
+ (radius / radarOption.gridCount) * i * Math.cos(1.5),
+ (radius / radarOption.gridCount) * i * Math.sin(1.5),
+ centerPosition,
+ )
+ context.arc(centerPosition.x, centerPosition.y, centerPosition.y - pos.y, 0, 2 * Math.PI, false)
+ }
+ context.stroke()
+ context.closePath()
+ }
+ for (var i = 1; i <= radarOption.gridCount; i++) {
+ _loop(i)
+ }
+ radarOption.customColor = fillCustomColor(radarOption.linearType, radarOption.customColor, series, config)
+ var radarDataPoints = getRadarDataPoints(coordinateAngle, centerPosition, radius, series, opts, process)
+ radarDataPoints.forEach(function (eachSeries, seriesIndex) {
+ // 绘制区域数据
+ context.beginPath()
+ context.setLineWidth(radarOption.borderWidth * opts.pix)
+ context.setStrokeStyle(eachSeries.color)
+
+ var fillcolor = hexToRgb(eachSeries.color, radarOption.opacity)
+ if (radarOption.linearType == "custom") {
+ var grd
+ if (context.createCircularGradient) {
+ grd = context.createCircularGradient(centerPosition.x, centerPosition.y, radius)
+ } else {
+ grd = context.createRadialGradient(centerPosition.x, centerPosition.y, 0, centerPosition.x, centerPosition.y, radius)
+ }
+ grd.addColorStop(0, hexToRgb(radarOption.customColor[series[seriesIndex].linearIndex], radarOption.opacity))
+ grd.addColorStop(1, hexToRgb(eachSeries.color, radarOption.opacity))
+ fillcolor = grd
+ }
+
+ context.setFillStyle(fillcolor)
+ eachSeries.data.forEach(function (item, index) {
+ if (index === 0) {
+ context.moveTo(item.position.x, item.position.y)
+ } else {
+ context.lineTo(item.position.x, item.position.y)
+ }
+ })
+ context.closePath()
+ context.fill()
+ if (radarOption.border === true) {
+ context.stroke()
+ }
+ context.closePath()
+ if (opts.dataPointShape !== false) {
+ var points = eachSeries.data.map(function (item) {
+ return item.position
+ })
+ drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts)
+ }
+ })
+ // 画刻度值
+ if (radarOption.axisLabel === true) {
+ const maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series)))
+ const stepLength = radius / radarOption.gridCount
+ const fontSize = opts.fontSize * opts.pix
+ context.setFontSize(fontSize)
+ context.setFillStyle(opts.fontColor)
+ context.setTextAlign("left")
+ for (var i = 0; i < radarOption.gridCount + 1; i++) {
+ let label = (i * maxData) / radarOption.gridCount
+ label = label.toFixed(radarOption.axisLabelTofix)
+ context.fillText(String(label), centerPosition.x + 3 * opts.pix, centerPosition.y - i * stepLength + fontSize / 2)
+ }
+ }
+
+ // draw label text
+ drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context)
+
+ // draw dataLabel
+ if (opts.dataLabel !== false && process === 1) {
+ radarDataPoints.forEach(function (eachSeries, seriesIndex) {
+ context.beginPath()
+ var fontSize = eachSeries.textSize * opts.pix || config.fontSize
+ context.setFontSize(fontSize)
+ context.setFillStyle(eachSeries.textColor || opts.fontColor)
+ eachSeries.data.forEach(function (item, index) {
+ //如果是中心点垂直的上下点位
+ if (Math.abs(item.position.x - centerPosition.x) < 2) {
+ //如果在上面
+ if (item.position.y < centerPosition.y) {
+ context.setTextAlign("center")
+ context.fillText(item.value, item.position.x, item.position.y - 4)
+ } else {
+ context.setTextAlign("center")
+ context.fillText(item.value, item.position.x, item.position.y + fontSize + 2)
+ }
+ } else {
+ //如果在左侧
+ if (item.position.x < centerPosition.x) {
+ context.setTextAlign("right")
+ context.fillText(item.value, item.position.x - 4, item.position.y + fontSize / 2 - 2)
+ } else {
+ context.setTextAlign("left")
+ context.fillText(item.value, item.position.x + 4, item.position.y + fontSize / 2 - 2)
+ }
+ }
+ })
+ context.closePath()
+ context.stroke()
+ })
+ context.setTextAlign("left")
+ }
+
+ return {
+ center: centerPosition,
+ radius: radius,
+ angleList: coordinateAngle,
+ }
+}
+
+// 经纬度转墨卡托
+function lonlat2mercator(longitude, latitude) {
+ var mercator = Array(2)
+ var x = (longitude * 20037508.34) / 180
+ var y = Math.log(Math.tan(((90 + latitude) * Math.PI) / 360)) / (Math.PI / 180)
+ y = (y * 20037508.34) / 180
+ mercator[0] = x
+ mercator[1] = y
+ return mercator
+}
+
+// 墨卡托转经纬度
+function mercator2lonlat(longitude, latitude) {
+ var lonlat = Array(2)
+ var x = (longitude / 20037508.34) * 180
+ var y = (latitude / 20037508.34) * 180
+ y = (180 / Math.PI) * (2 * Math.atan(Math.exp((y * Math.PI) / 180)) - Math.PI / 2)
+ lonlat[0] = x
+ lonlat[1] = y
+ return lonlat
+}
+
+function getBoundingBox(data) {
+ var bounds = {},
+ coords
+ bounds.xMin = 180
+ bounds.xMax = 0
+ bounds.yMin = 90
+ bounds.yMax = 0
+ for (var i = 0; i < data.length; i++) {
+ var coorda = data[i].geometry.coordinates
+ for (var k = 0; k < coorda.length; k++) {
+ coords = coorda[k]
+ if (coords.length == 1) {
+ coords = coords[0]
+ }
+ for (var j = 0; j < coords.length; j++) {
+ var longitude = coords[j][0]
+ var latitude = coords[j][1]
+ var point = {
+ x: longitude,
+ y: latitude,
+ }
+ bounds.xMin = bounds.xMin < point.x ? bounds.xMin : point.x
+ bounds.xMax = bounds.xMax > point.x ? bounds.xMax : point.x
+ bounds.yMin = bounds.yMin < point.y ? bounds.yMin : point.y
+ bounds.yMax = bounds.yMax > point.y ? bounds.yMax : point.y
+ }
+ }
+ }
+ return bounds
+}
+
+function coordinateToPoint(latitude, longitude, bounds, scale, xoffset, yoffset) {
+ return {
+ x: (longitude - bounds.xMin) * scale + xoffset,
+ y: (bounds.yMax - latitude) * scale + yoffset,
+ }
+}
+
+function pointToCoordinate(pointY, pointX, bounds, scale, xoffset, yoffset) {
+ return {
+ x: (pointX - xoffset) / scale + bounds.xMin,
+ y: bounds.yMax - (pointY - yoffset) / scale,
+ }
+}
+
+function isRayIntersectsSegment(poi, s_poi, e_poi) {
+ if (s_poi[1] == e_poi[1]) {
+ return false
+ }
+ if (s_poi[1] > poi[1] && e_poi[1] > poi[1]) {
+ return false
+ }
+ if (s_poi[1] < poi[1] && e_poi[1] < poi[1]) {
+ return false
+ }
+ if (s_poi[1] == poi[1] && e_poi[1] > poi[1]) {
+ return false
+ }
+ if (e_poi[1] == poi[1] && s_poi[1] > poi[1]) {
+ return false
+ }
+ if (s_poi[0] < poi[0] && e_poi[1] < poi[1]) {
+ return false
+ }
+ let xseg = e_poi[0] - ((e_poi[0] - s_poi[0]) * (e_poi[1] - poi[1])) / (e_poi[1] - s_poi[1])
+ if (xseg < poi[0]) {
+ return false
+ } else {
+ return true
+ }
+}
+
+function isPoiWithinPoly(poi, poly, mercator) {
+ let sinsc = 0
+ for (let i = 0; i < poly.length; i++) {
+ let epoly = poly[i][0]
+ if (poly.length == 1) {
+ epoly = poly[i][0]
+ }
+ for (let j = 0; j < epoly.length - 1; j++) {
+ let s_poi = epoly[j]
+ let e_poi = epoly[j + 1]
+ if (mercator) {
+ s_poi = lonlat2mercator(epoly[j][0], epoly[j][1])
+ e_poi = lonlat2mercator(epoly[j + 1][0], epoly[j + 1][1])
+ }
+ if (isRayIntersectsSegment(poi, s_poi, e_poi)) {
+ sinsc += 1
+ }
+ }
+ }
+ if (sinsc % 2 == 1) {
+ return true
+ } else {
+ return false
+ }
+}
+
+function drawMapDataPoints(series, opts, config, context) {
+ var mapOption = assign(
+ {},
+ {
+ border: true,
+ mercator: false,
+ borderWidth: 1,
+ active: true,
+ borderColor: "#666666",
+ fillOpacity: 0.6,
+ activeBorderColor: "#f04864",
+ activeFillColor: "#facc14",
+ activeFillOpacity: 1,
+ },
+ opts.extra.map,
+ )
+ var coords, point
+ var data = series
+ var bounds = getBoundingBox(data)
+ if (mapOption.mercator) {
+ var max = lonlat2mercator(bounds.xMax, bounds.yMax)
+ var min = lonlat2mercator(bounds.xMin, bounds.yMin)
+ bounds.xMax = max[0]
+ bounds.yMax = max[1]
+ bounds.xMin = min[0]
+ bounds.yMin = min[1]
+ }
+ var xScale = opts.width / Math.abs(bounds.xMax - bounds.xMin)
+ var yScale = opts.height / Math.abs(bounds.yMax - bounds.yMin)
+ var scale = xScale < yScale ? xScale : yScale
+ var xoffset = opts.width / 2 - (Math.abs(bounds.xMax - bounds.xMin) / 2) * scale
+ var yoffset = opts.height / 2 - (Math.abs(bounds.yMax - bounds.yMin) / 2) * scale
+ for (var i = 0; i < data.length; i++) {
+ context.beginPath()
+ context.setLineWidth(mapOption.borderWidth * opts.pix)
+ context.setStrokeStyle(mapOption.borderColor)
+ context.setFillStyle(hexToRgb(series[i].color, series[i].fillOpacity || mapOption.fillOpacity))
+ if (mapOption.active == true && opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.setStrokeStyle(mapOption.activeBorderColor)
+ context.setFillStyle(hexToRgb(mapOption.activeFillColor, mapOption.activeFillOpacity))
+ }
+ }
+ var coorda = data[i].geometry.coordinates
+ for (var k = 0; k < coorda.length; k++) {
+ coords = coorda[k]
+ if (coords.length == 1) {
+ coords = coords[0]
+ }
+ for (var j = 0; j < coords.length; j++) {
+ var gaosi = Array(2)
+ if (mapOption.mercator) {
+ gaosi = lonlat2mercator(coords[j][0], coords[j][1])
+ } else {
+ gaosi = coords[j]
+ }
+ point = coordinateToPoint(gaosi[1], gaosi[0], bounds, scale, xoffset, yoffset)
+ if (j === 0) {
+ context.beginPath()
+ context.moveTo(point.x, point.y)
+ } else {
+ context.lineTo(point.x, point.y)
+ }
+ }
+ context.fill()
+ if (mapOption.border == true) {
+ context.stroke()
+ }
+ }
+ }
+ if (opts.dataLabel == true) {
+ for (var i = 0; i < data.length; i++) {
+ var centerPoint = data[i].properties.centroid
+ if (centerPoint) {
+ if (mapOption.mercator) {
+ centerPoint = lonlat2mercator(data[i].properties.centroid[0], data[i].properties.centroid[1])
+ }
+ point = coordinateToPoint(centerPoint[1], centerPoint[0], bounds, scale, xoffset, yoffset)
+ let fontSize = data[i].textSize * opts.pix || config.fontSize
+ let fontColor = data[i].textColor || opts.fontColor
+ if (mapOption.active && mapOption.activeTextColor && opts.tooltip && opts.tooltip.index == i) {
+ fontColor = mapOption.activeTextColor
+ }
+ let text = data[i].properties.name
+ context.beginPath()
+ context.setFontSize(fontSize)
+ context.setFillStyle(fontColor)
+ context.fillText(text, point.x - measureText(text, fontSize, context) / 2, point.y + fontSize / 2)
+ context.closePath()
+ context.stroke()
+ }
+ }
+ }
+ opts.chartData.mapData = {
+ bounds: bounds,
+ scale: scale,
+ xoffset: xoffset,
+ yoffset: yoffset,
+ mercator: mapOption.mercator,
+ }
+ drawToolTipBridge(opts, config, context, 1)
+ context.draw()
+}
+
+function normalInt(min, max, iter) {
+ iter = iter == 0 ? 1 : iter
+ var arr = []
+ for (var i = 0; i < iter; i++) {
+ arr[i] = Math.random()
+ }
+ return (
+ Math.floor(
+ (arr.reduce(function (i, j) {
+ return i + j
+ }) /
+ iter) *
+ (max - min),
+ ) + min
+ )
+}
+
+function collisionNew(area, points, width, height) {
+ var isIn = false
+ for (let i = 0; i < points.length; i++) {
+ if (points[i].area) {
+ if (area[3] < points[i].area[1] || area[0] > points[i].area[2] || area[1] > points[i].area[3] || area[2] < points[i].area[0]) {
+ if (area[0] < 0 || area[1] < 0 || area[2] > width || area[3] > height) {
+ isIn = true
+ break
+ } else {
+ isIn = false
+ }
+ } else {
+ isIn = true
+ break
+ }
+ }
+ }
+ return isIn
+}
+
+function getWordCloudPoint(opts, type, context) {
+ let points = opts.series
+ switch (type) {
+ case "normal":
+ for (let i = 0; i < points.length; i++) {
+ let text = points[i].name
+ let tHeight = points[i].textSize * opts.pix
+ let tWidth = measureText(text, tHeight, context)
+ let x, y
+ let area
+ let breaknum = 0
+ while (true) {
+ breaknum++
+ x = normalInt(-opts.width / 2, opts.width / 2, 5) - tWidth / 2
+ y = normalInt(-opts.height / 2, opts.height / 2, 5) + tHeight / 2
+ area = [x - 5 + opts.width / 2, y - 5 - tHeight + opts.height / 2, x + tWidth + 5 + opts.width / 2, y + 5 + opts.height / 2]
+ let isCollision = collisionNew(area, points, opts.width, opts.height)
+ if (!isCollision) break
+ if (breaknum == 1000) {
+ area = [-100, -100, -100, -100]
+ break
+ }
+ }
+ points[i].area = area
+ }
+ break
+ case "vertical":
+ function Spin() {
+ //获取均匀随机值,是否旋转,旋转的概率为(1-0.5)
+ if (Math.random() > 0.7) {
+ return true
+ } else {
+ return false
+ }
+ }
+ for (let i = 0; i < points.length; i++) {
+ let text = points[i].name
+ let tHeight = points[i].textSize * opts.pix
+ let tWidth = measureText(text, tHeight, context)
+ let isSpin = Spin()
+ let x, y, area, areav
+ let breaknum = 0
+ while (true) {
+ breaknum++
+ let isCollision
+ if (isSpin) {
+ x = normalInt(-opts.width / 2, opts.width / 2, 5) - tWidth / 2
+ y = normalInt(-opts.height / 2, opts.height / 2, 5) + tHeight / 2
+ area = [y - 5 - tWidth + opts.width / 2, -x - 5 + opts.height / 2, y + 5 + opts.width / 2, -x + tHeight + 5 + opts.height / 2]
+ areav = [
+ opts.width - (opts.width / 2 - opts.height / 2) - (-x + tHeight + 5 + opts.height / 2) - 5,
+ opts.height / 2 - opts.width / 2 + (y - 5 - tWidth + opts.width / 2) - 5,
+ opts.width - (opts.width / 2 - opts.height / 2) - (-x + tHeight + 5 + opts.height / 2) + tHeight,
+ opts.height / 2 - opts.width / 2 + (y - 5 - tWidth + opts.width / 2) + tWidth + 5,
+ ]
+ isCollision = collisionNew(areav, points, opts.height, opts.width)
+ } else {
+ x = normalInt(-opts.width / 2, opts.width / 2, 5) - tWidth / 2
+ y = normalInt(-opts.height / 2, opts.height / 2, 5) + tHeight / 2
+ area = [x - 5 + opts.width / 2, y - 5 - tHeight + opts.height / 2, x + tWidth + 5 + opts.width / 2, y + 5 + opts.height / 2]
+ isCollision = collisionNew(area, points, opts.width, opts.height)
+ }
+ if (!isCollision) break
+ if (breaknum == 1000) {
+ area = [-1000, -1000, -1000, -1000]
+ break
+ }
+ }
+ if (isSpin) {
+ points[i].area = areav
+ points[i].areav = area
+ } else {
+ points[i].area = area
+ }
+ points[i].rotate = isSpin
+ }
+ break
+ }
+ return points
+}
+
+function drawWordCloudDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ let wordOption = assign(
+ {},
+ {
+ type: "normal",
+ autoColors: true,
+ },
+ opts.extra.word,
+ )
+ if (!opts.chartData.wordCloudData) {
+ opts.chartData.wordCloudData = getWordCloudPoint(opts, wordOption.type, context)
+ }
+ context.beginPath()
+ context.setFillStyle(opts.background)
+ context.rect(0, 0, opts.width, opts.height)
+ context.fill()
+ context.save()
+ let points = opts.chartData.wordCloudData
+ context.translate(opts.width / 2, opts.height / 2)
+ for (let i = 0; i < points.length; i++) {
+ context.save()
+ if (points[i].rotate) {
+ context.rotate((90 * Math.PI) / 180)
+ }
+ let text = points[i].name
+ let tHeight = points[i].textSize * opts.pix
+ let tWidth = measureText(text, tHeight, context)
+ context.beginPath()
+ context.setStrokeStyle(points[i].color)
+ context.setFillStyle(points[i].color)
+ context.setFontSize(tHeight)
+ if (points[i].rotate) {
+ if (points[i].areav[0] > 0) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.strokeText(
+ text,
+ (points[i].areav[0] + 5 - opts.width / 2) * process - (tWidth * (1 - process)) / 2,
+ (points[i].areav[1] + 5 + tHeight - opts.height / 2) * process,
+ )
+ } else {
+ context.fillText(
+ text,
+ (points[i].areav[0] + 5 - opts.width / 2) * process - (tWidth * (1 - process)) / 2,
+ (points[i].areav[1] + 5 + tHeight - opts.height / 2) * process,
+ )
+ }
+ } else {
+ context.fillText(
+ text,
+ (points[i].areav[0] + 5 - opts.width / 2) * process - (tWidth * (1 - process)) / 2,
+ (points[i].areav[1] + 5 + tHeight - opts.height / 2) * process,
+ )
+ }
+ }
+ } else {
+ if (points[i].area[0] > 0) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.strokeText(
+ text,
+ (points[i].area[0] + 5 - opts.width / 2) * process - (tWidth * (1 - process)) / 2,
+ (points[i].area[1] + 5 + tHeight - opts.height / 2) * process,
+ )
+ } else {
+ context.fillText(
+ text,
+ (points[i].area[0] + 5 - opts.width / 2) * process - (tWidth * (1 - process)) / 2,
+ (points[i].area[1] + 5 + tHeight - opts.height / 2) * process,
+ )
+ }
+ } else {
+ context.fillText(
+ text,
+ (points[i].area[0] + 5 - opts.width / 2) * process - (tWidth * (1 - process)) / 2,
+ (points[i].area[1] + 5 + tHeight - opts.height / 2) * process,
+ )
+ }
+ }
+ }
+ context.stroke()
+ context.restore()
+ }
+ context.restore()
+}
+
+function drawFunnelDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1
+ let funnelOption = assign(
+ {},
+ {
+ type: "funnel",
+ activeWidth: 10,
+ activeOpacity: 0.3,
+ border: false,
+ borderWidth: 2,
+ borderColor: "#FFFFFF",
+ fillOpacity: 1,
+ minSize: 0,
+ labelAlign: "right",
+ linearType: "none",
+ customColor: [],
+ },
+ opts.extra.funnel,
+ )
+ let eachSpacing = (opts.height - opts.area[0] - opts.area[2]) / series.length
+ let centerPosition = {
+ x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+ y: opts.height - opts.area[2],
+ }
+ let activeWidth = funnelOption.activeWidth * opts.pix
+ let radius = Math.min(
+ (opts.width - opts.area[1] - opts.area[3]) / 2 - activeWidth,
+ (opts.height - opts.area[0] - opts.area[2]) / 2 - activeWidth,
+ )
+ let seriesNew = getFunnelDataPoints(series, radius, funnelOption, eachSpacing, process)
+ context.save()
+ context.translate(centerPosition.x, centerPosition.y)
+ funnelOption.customColor = fillCustomColor(funnelOption.linearType, funnelOption.customColor, series, config)
+ if (funnelOption.type == "pyramid") {
+ for (let i = 0; i < seriesNew.length; i++) {
+ if (i == seriesNew.length - 1) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.beginPath()
+ context.setFillStyle(hexToRgb(seriesNew[i].color, funnelOption.activeOpacity))
+ context.moveTo(-activeWidth, -eachSpacing)
+ context.lineTo(-seriesNew[i].radius - activeWidth, 0)
+ context.lineTo(seriesNew[i].radius + activeWidth, 0)
+ context.lineTo(activeWidth, -eachSpacing)
+ context.lineTo(-activeWidth, -eachSpacing)
+ context.closePath()
+ context.fill()
+ }
+ }
+ seriesNew[i].funnelArea = [
+ centerPosition.x - seriesNew[i].radius,
+ centerPosition.y - eachSpacing * (i + 1),
+ centerPosition.x + seriesNew[i].radius,
+ centerPosition.y - eachSpacing * i,
+ ]
+ context.beginPath()
+ context.setLineWidth(funnelOption.borderWidth * opts.pix)
+ context.setStrokeStyle(funnelOption.borderColor)
+ var fillColor = hexToRgb(seriesNew[i].color, funnelOption.fillOpacity)
+ if (funnelOption.linearType == "custom") {
+ var grd = context.createLinearGradient(seriesNew[i].radius, -eachSpacing, -seriesNew[i].radius, -eachSpacing)
+ grd.addColorStop(0, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity))
+ grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[seriesNew[i].linearIndex], funnelOption.fillOpacity))
+ grd.addColorStop(1, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity))
+ fillColor = grd
+ }
+ context.setFillStyle(fillColor)
+ context.moveTo(0, -eachSpacing)
+ context.lineTo(-seriesNew[i].radius, 0)
+ context.lineTo(seriesNew[i].radius, 0)
+ context.lineTo(0, -eachSpacing)
+ context.closePath()
+ context.fill()
+ if (funnelOption.border == true) {
+ context.stroke()
+ }
+ } else {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.beginPath()
+ context.setFillStyle(hexToRgb(seriesNew[i].color, funnelOption.activeOpacity))
+ context.moveTo(0, 0)
+ context.lineTo(-seriesNew[i].radius - activeWidth, 0)
+ context.lineTo(-seriesNew[i + 1].radius - activeWidth, -eachSpacing)
+ context.lineTo(seriesNew[i + 1].radius + activeWidth, -eachSpacing)
+ context.lineTo(seriesNew[i].radius + activeWidth, 0)
+ context.lineTo(0, 0)
+ context.closePath()
+ context.fill()
+ }
+ }
+ seriesNew[i].funnelArea = [
+ centerPosition.x - seriesNew[i].radius,
+ centerPosition.y - eachSpacing * (i + 1),
+ centerPosition.x + seriesNew[i].radius,
+ centerPosition.y - eachSpacing * i,
+ ]
+ context.beginPath()
+ context.setLineWidth(funnelOption.borderWidth * opts.pix)
+ context.setStrokeStyle(funnelOption.borderColor)
+ var fillColor = hexToRgb(seriesNew[i].color, funnelOption.fillOpacity)
+ if (funnelOption.linearType == "custom") {
+ var grd = context.createLinearGradient(seriesNew[i].radius, -eachSpacing, -seriesNew[i].radius, -eachSpacing)
+ grd.addColorStop(0, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity))
+ grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[seriesNew[i].linearIndex], funnelOption.fillOpacity))
+ grd.addColorStop(1, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity))
+ fillColor = grd
+ }
+ context.setFillStyle(fillColor)
+ context.moveTo(0, 0)
+ context.lineTo(-seriesNew[i].radius, 0)
+ context.lineTo(-seriesNew[i + 1].radius, -eachSpacing)
+ context.lineTo(seriesNew[i + 1].radius, -eachSpacing)
+ context.lineTo(seriesNew[i].radius, 0)
+ context.lineTo(0, 0)
+ context.closePath()
+ context.fill()
+ if (funnelOption.border == true) {
+ context.stroke()
+ }
+ }
+ context.translate(0, -eachSpacing)
+ }
+ } else {
+ context.translate(0, -(seriesNew.length - 1) * eachSpacing)
+ for (let i = 0; i < seriesNew.length; i++) {
+ if (i == seriesNew.length - 1) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.beginPath()
+ context.setFillStyle(hexToRgb(seriesNew[i].color, funnelOption.activeOpacity))
+ context.moveTo(-activeWidth - funnelOption.minSize / 2, 0)
+ context.lineTo(-seriesNew[i].radius - activeWidth, -eachSpacing)
+ context.lineTo(seriesNew[i].radius + activeWidth, -eachSpacing)
+ context.lineTo(activeWidth + funnelOption.minSize / 2, 0)
+ context.lineTo(-activeWidth - funnelOption.minSize / 2, 0)
+ context.closePath()
+ context.fill()
+ }
+ }
+ seriesNew[i].funnelArea = [
+ centerPosition.x - seriesNew[i].radius,
+ centerPosition.y - eachSpacing,
+ centerPosition.x + seriesNew[i].radius,
+ centerPosition.y,
+ ]
+ context.beginPath()
+ context.setLineWidth(funnelOption.borderWidth * opts.pix)
+ context.setStrokeStyle(funnelOption.borderColor)
+ var fillColor = hexToRgb(seriesNew[i].color, funnelOption.fillOpacity)
+ if (funnelOption.linearType == "custom") {
+ var grd = context.createLinearGradient(seriesNew[i].radius, -eachSpacing, -seriesNew[i].radius, -eachSpacing)
+ grd.addColorStop(0, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity))
+ grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[seriesNew[i].linearIndex], funnelOption.fillOpacity))
+ grd.addColorStop(1, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity))
+ fillColor = grd
+ }
+ context.setFillStyle(fillColor)
+ context.moveTo(0, 0)
+ context.lineTo(-funnelOption.minSize / 2, 0)
+ context.lineTo(-seriesNew[i].radius, -eachSpacing)
+ context.lineTo(seriesNew[i].radius, -eachSpacing)
+ context.lineTo(funnelOption.minSize / 2, 0)
+ context.lineTo(0, 0)
+ context.closePath()
+ context.fill()
+ if (funnelOption.border == true) {
+ context.stroke()
+ }
+ } else {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.beginPath()
+ context.setFillStyle(hexToRgb(seriesNew[i].color, funnelOption.activeOpacity))
+ context.moveTo(0, 0)
+ context.lineTo(-seriesNew[i + 1].radius - activeWidth, 0)
+ context.lineTo(-seriesNew[i].radius - activeWidth, -eachSpacing)
+ context.lineTo(seriesNew[i].radius + activeWidth, -eachSpacing)
+ context.lineTo(seriesNew[i + 1].radius + activeWidth, 0)
+ context.lineTo(0, 0)
+ context.closePath()
+ context.fill()
+ }
+ }
+ seriesNew[i].funnelArea = [
+ centerPosition.x - seriesNew[i].radius,
+ centerPosition.y - eachSpacing * (seriesNew.length - i),
+ centerPosition.x + seriesNew[i].radius,
+ centerPosition.y - eachSpacing * (seriesNew.length - i - 1),
+ ]
+ context.beginPath()
+ context.setLineWidth(funnelOption.borderWidth * opts.pix)
+ context.setStrokeStyle(funnelOption.borderColor)
+ var fillColor = hexToRgb(seriesNew[i].color, funnelOption.fillOpacity)
+ if (funnelOption.linearType == "custom") {
+ var grd = context.createLinearGradient(seriesNew[i].radius, -eachSpacing, -seriesNew[i].radius, -eachSpacing)
+ grd.addColorStop(0, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity))
+ grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[seriesNew[i].linearIndex], funnelOption.fillOpacity))
+ grd.addColorStop(1, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity))
+ fillColor = grd
+ }
+ context.setFillStyle(fillColor)
+ context.moveTo(0, 0)
+ context.lineTo(-seriesNew[i + 1].radius, 0)
+ context.lineTo(-seriesNew[i].radius, -eachSpacing)
+ context.lineTo(seriesNew[i].radius, -eachSpacing)
+ context.lineTo(seriesNew[i + 1].radius, 0)
+ context.lineTo(0, 0)
+ context.closePath()
+ context.fill()
+ if (funnelOption.border == true) {
+ context.stroke()
+ }
+ }
+ context.translate(0, eachSpacing)
+ }
+ }
+
+ context.restore()
+ if (opts.dataLabel !== false && process === 1) {
+ drawFunnelText(seriesNew, opts, context, eachSpacing, funnelOption.labelAlign, activeWidth, centerPosition)
+ }
+ if (process === 1) {
+ drawFunnelCenterText(seriesNew, opts, context, eachSpacing, funnelOption.labelAlign, activeWidth, centerPosition)
+ }
+ return {
+ center: centerPosition,
+ radius: radius,
+ series: seriesNew,
+ }
+}
+
+function drawFunnelText(series, opts, context, eachSpacing, labelAlign, activeWidth, centerPosition) {
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ if (item.labelShow === false) {
+ continue
+ }
+ let startX, endX, startY, fontSize
+ let text = item.formatter ? item.formatter(item, i, series, opts) : util.toFixed(item._proportion_ * 100) + "%"
+ text = item.labelText ? item.labelText : text
+ if (labelAlign == "right") {
+ if (i == series.length - 1) {
+ startX = (item.funnelArea[2] + centerPosition.x) / 2
+ } else {
+ startX = (item.funnelArea[2] + series[i + 1].funnelArea[2]) / 2
+ }
+ endX = startX + activeWidth * 2
+ startY = item.funnelArea[1] + eachSpacing / 2
+ fontSize = item.textSize * opts.pix || opts.fontSize * opts.pix
+ context.setLineWidth(1 * opts.pix)
+ context.setStrokeStyle(item.color)
+ context.setFillStyle(item.color)
+ context.beginPath()
+ context.moveTo(startX, startY)
+ context.lineTo(endX, startY)
+ context.stroke()
+ context.closePath()
+ context.beginPath()
+ context.moveTo(endX, startY)
+ context.arc(endX, startY, 2 * opts.pix, 0, 2 * Math.PI)
+ context.closePath()
+ context.fill()
+ context.beginPath()
+ context.setFontSize(fontSize)
+ context.setFillStyle(item.textColor || opts.fontColor)
+ context.fillText(text, endX + 5, startY + fontSize / 2 - 2)
+ context.closePath()
+ context.stroke()
+ context.closePath()
+ }
+ if (labelAlign == "left") {
+ if (i == series.length - 1) {
+ startX = (item.funnelArea[0] + centerPosition.x) / 2
+ } else {
+ startX = (item.funnelArea[0] + series[i + 1].funnelArea[0]) / 2
+ }
+ endX = startX - activeWidth * 2
+ startY = item.funnelArea[1] + eachSpacing / 2
+ fontSize = item.textSize * opts.pix || opts.fontSize * opts.pix
+ context.setLineWidth(1 * opts.pix)
+ context.setStrokeStyle(item.color)
+ context.setFillStyle(item.color)
+ context.beginPath()
+ context.moveTo(startX, startY)
+ context.lineTo(endX, startY)
+ context.stroke()
+ context.closePath()
+ context.beginPath()
+ context.moveTo(endX, startY)
+ context.arc(endX, startY, 2, 0, 2 * Math.PI)
+ context.closePath()
+ context.fill()
+ context.beginPath()
+ context.setFontSize(fontSize)
+ context.setFillStyle(item.textColor || opts.fontColor)
+ context.fillText(text, endX - 5 - measureText(text, fontSize, context), startY + fontSize / 2 - 2)
+ context.closePath()
+ context.stroke()
+ context.closePath()
+ }
+ }
+}
+
+function drawFunnelCenterText(series, opts, context, eachSpacing, labelAlign, activeWidth, centerPosition) {
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i]
+ let startY, fontSize
+ if (item.centerText) {
+ startY = item.funnelArea[1] + eachSpacing / 2
+ fontSize = item.centerTextSize * opts.pix || opts.fontSize * opts.pix
+ context.beginPath()
+ context.setFontSize(fontSize)
+ context.setFillStyle(item.centerTextColor || "#FFFFFF")
+ context.fillText(item.centerText, centerPosition.x - measureText(item.centerText, fontSize, context) / 2, startY + fontSize / 2 - 2)
+ context.closePath()
+ context.stroke()
+ context.closePath()
+ }
+ }
+}
+
+function drawCanvas(opts, context) {
+ context.save()
+ context.translate(0, 0.5)
+ context.restore()
+ context.draw()
+}
+
+var Timing = {
+ easeIn: function easeIn(pos) {
+ return Math.pow(pos, 3)
+ },
+ easeOut: function easeOut(pos) {
+ return Math.pow(pos - 1, 3) + 1
+ },
+ easeInOut: function easeInOut(pos) {
+ if ((pos /= 0.5) < 1) {
+ return 0.5 * Math.pow(pos, 3)
+ } else {
+ return 0.5 * (Math.pow(pos - 2, 3) + 2)
+ }
+ },
+ linear: function linear(pos) {
+ return pos
+ },
+}
+
+function Animation(opts) {
+ this.isStop = false
+ opts.duration = typeof opts.duration === "undefined" ? 1000 : opts.duration
+ opts.timing = opts.timing || "easeInOut"
+ var delay = 17
+ function createAnimationFrame() {
+ if (typeof setTimeout !== "undefined") {
+ return function (step, delay) {
+ setTimeout(function () {
+ var timeStamp = +new Date()
+ step(timeStamp)
+ }, delay)
+ }
+ } else if (typeof requestAnimationFrame !== "undefined") {
+ return requestAnimationFrame
+ } else {
+ return function (step) {
+ step(null)
+ }
+ }
+ }
+ var animationFrame = createAnimationFrame()
+ var startTimeStamp = null
+ var _step = function step(timestamp) {
+ if (timestamp === null || this.isStop === true) {
+ opts.onProcess && opts.onProcess(1)
+ opts.onAnimationFinish && opts.onAnimationFinish()
+ return
+ }
+ if (startTimeStamp === null) {
+ startTimeStamp = timestamp
+ }
+ if (timestamp - startTimeStamp < opts.duration) {
+ var process = (timestamp - startTimeStamp) / opts.duration
+ var timingFunction = Timing[opts.timing]
+ process = timingFunction(process)
+ opts.onProcess && opts.onProcess(process)
+ animationFrame(_step, delay)
+ } else {
+ opts.onProcess && opts.onProcess(1)
+ opts.onAnimationFinish && opts.onAnimationFinish()
+ }
+ }
+ _step = _step.bind(this)
+ animationFrame(_step, delay)
+}
+
+Animation.prototype.stop = function () {
+ this.isStop = true
+}
+
+function drawCharts(type, opts, config, context) {
+ var _this = this
+ var series = opts.series
+ //兼容ECharts饼图类数据格式
+ if (type === "pie" || type === "ring" || type === "mount" || type === "rose" || type === "funnel") {
+ series = fixPieSeries(series, opts, config)
+ }
+ var categories = opts.categories
+ if (type === "mount") {
+ categories = []
+ for (let j = 0; j < series.length; j++) {
+ if (series[j].show !== false) categories.push(series[j].name)
+ }
+ opts.categories = categories
+ }
+ series = fillSeries(series, opts, config)
+ var duration = opts.animation ? opts.duration : 0
+ _this.animationInstance && _this.animationInstance.stop()
+ var seriesMA = null
+ if (type == "candle") {
+ let average = assign({}, opts.extra.candle.average)
+ if (average.show) {
+ seriesMA = calCandleMA(average.day, average.name, average.color, series[0].data)
+ seriesMA = fillSeries(seriesMA, opts, config)
+ opts.seriesMA = seriesMA
+ } else if (opts.seriesMA) {
+ seriesMA = opts.seriesMA = fillSeries(opts.seriesMA, opts, config)
+ } else {
+ seriesMA = series
+ }
+ } else {
+ seriesMA = series
+ }
+ /* 过滤掉show=false的series */
+ opts._series_ = series = filterSeries(series)
+ //重新计算图表区域
+ opts.area = new Array(4)
+ //复位绘图区域
+ for (let j = 0; j < 4; j++) {
+ opts.area[j] = opts.padding[j] * opts.pix
+ }
+ //通过计算三大区域:图例、X轴、Y轴的大小,确定绘图区域
+ var _calLegendData = calLegendData(seriesMA, opts, config, opts.chartData, context),
+ legendHeight = _calLegendData.area.wholeHeight,
+ legendWidth = _calLegendData.area.wholeWidth
+
+ switch (opts.legend.position) {
+ case "top":
+ opts.area[0] += legendHeight
+ break
+ case "bottom":
+ opts.area[2] += legendHeight
+ break
+ case "left":
+ opts.area[3] += legendWidth
+ break
+ case "right":
+ opts.area[1] += legendWidth
+ break
+ }
+
+ let _calYAxisData = {},
+ yAxisWidth = 0
+ if (
+ opts.type === "line" ||
+ opts.type === "column" ||
+ opts.type === "mount" ||
+ opts.type === "area" ||
+ opts.type === "mix" ||
+ opts.type === "candle" ||
+ opts.type === "scatter" ||
+ opts.type === "bubble" ||
+ opts.type === "bar"
+ ) {
+ _calYAxisData = calYAxisData(series, opts, config, context)
+ yAxisWidth = _calYAxisData.yAxisWidth
+ //如果显示Y轴标题
+ if (opts.yAxis.showTitle) {
+ let maxTitleHeight = 0
+ for (let i = 0; i < opts.yAxis.data.length; i++) {
+ maxTitleHeight = Math.max(
+ maxTitleHeight,
+ opts.yAxis.data[i].titleFontSize ? opts.yAxis.data[i].titleFontSize * opts.pix : config.fontSize,
+ )
+ }
+ opts.area[0] += maxTitleHeight
+ }
+ let rightIndex = 0,
+ leftIndex = 0
+ //计算主绘图区域左右位置
+ for (let i = 0; i < yAxisWidth.length; i++) {
+ if (yAxisWidth[i].position == "left") {
+ if (leftIndex > 0) {
+ opts.area[3] += yAxisWidth[i].width + opts.yAxis.padding * opts.pix
+ } else {
+ opts.area[3] += yAxisWidth[i].width
+ }
+ leftIndex += 1
+ } else if (yAxisWidth[i].position == "right") {
+ if (rightIndex > 0) {
+ opts.area[1] += yAxisWidth[i].width + opts.yAxis.padding * opts.pix
+ } else {
+ opts.area[1] += yAxisWidth[i].width
+ }
+ rightIndex += 1
+ }
+ }
+ } else {
+ config.yAxisWidth = yAxisWidth
+ }
+ opts.chartData.yAxisData = _calYAxisData
+
+ if (opts.categories && opts.categories.length && opts.type !== "radar" && opts.type !== "gauge" && opts.type !== "bar") {
+ opts.chartData.xAxisData = getXAxisPoints(opts.categories, opts, config)
+ let _calCategoriesData = calCategoriesData(opts.categories, opts, config, opts.chartData.xAxisData.eachSpacing, context),
+ xAxisHeight = _calCategoriesData.xAxisHeight,
+ angle = _calCategoriesData.angle
+ config.xAxisHeight = xAxisHeight
+ config._xAxisTextAngle_ = angle
+ opts.area[2] += xAxisHeight
+ opts.chartData.categoriesData = _calCategoriesData
+ } else {
+ if (opts.type === "line" || opts.type === "area" || opts.type === "scatter" || opts.type === "bubble" || opts.type === "bar") {
+ opts.chartData.xAxisData = calXAxisData(series, opts, config, context)
+ categories = opts.chartData.xAxisData.rangesFormat
+ let _calCategoriesData = calCategoriesData(categories, opts, config, opts.chartData.xAxisData.eachSpacing, context),
+ xAxisHeight = _calCategoriesData.xAxisHeight,
+ angle = _calCategoriesData.angle
+ config.xAxisHeight = xAxisHeight
+ config._xAxisTextAngle_ = angle
+ opts.area[2] += xAxisHeight
+ opts.chartData.categoriesData = _calCategoriesData
+ } else {
+ opts.chartData.xAxisData = {
+ xAxisPoints: [],
+ }
+ }
+ }
+
+ //计算右对齐偏移距离
+ if (opts.enableScroll && opts.xAxis.scrollAlign == "right" && opts._scrollDistance_ === undefined) {
+ let offsetLeft = 0,
+ xAxisPoints = opts.chartData.xAxisData.xAxisPoints,
+ startX = opts.chartData.xAxisData.startX,
+ endX = opts.chartData.xAxisData.endX,
+ eachSpacing = opts.chartData.xAxisData.eachSpacing
+ let totalWidth = eachSpacing * (xAxisPoints.length - 1)
+ let screenWidth = endX - startX
+ offsetLeft = screenWidth - totalWidth
+ _this.scrollOption.currentOffset = offsetLeft
+ _this.scrollOption.startTouchX = offsetLeft
+ _this.scrollOption.distance = 0
+ _this.scrollOption.lastMoveTime = 0
+ opts._scrollDistance_ = offsetLeft
+ }
+
+ if (type === "pie" || type === "ring" || type === "rose") {
+ config._pieTextMaxLength_ = opts.dataLabel === false ? 0 : getPieTextMaxLength(seriesMA, config, context, opts)
+ }
+
+ switch (type) {
+ case "word":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function (process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawWordCloudDataPoints(series, opts, config, context, process)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "map":
+ context.clearRect(0, 0, opts.width, opts.height)
+ drawMapDataPoints(series, opts, config, context)
+ setTimeout(() => {
+ this.uevent.trigger("renderComplete")
+ }, 50)
+ break
+ case "funnel":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function (process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ opts.chartData.funnelData = drawFunnelDataPoints(series, opts, config, context, process)
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "line":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawYAxisGrid(categories, opts, config, context)
+ drawXAxis(categories, opts, config, context)
+ var _drawLineDataPoints = drawLineDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawLineDataPoints.xAxisPoints,
+ calPoints = _drawLineDataPoints.calPoints,
+ eachSpacing = _drawLineDataPoints.eachSpacing
+ opts.chartData.xAxisPoints = xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "scatter":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawYAxisGrid(categories, opts, config, context)
+ drawXAxis(categories, opts, config, context)
+ var _drawScatterDataPoints = drawScatterDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawScatterDataPoints.xAxisPoints,
+ calPoints = _drawScatterDataPoints.calPoints,
+ eachSpacing = _drawScatterDataPoints.eachSpacing
+ opts.chartData.xAxisPoints = xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "bubble":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawYAxisGrid(categories, opts, config, context)
+ drawXAxis(categories, opts, config, context)
+ var _drawBubbleDataPoints = drawBubbleDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawBubbleDataPoints.xAxisPoints,
+ calPoints = _drawBubbleDataPoints.calPoints,
+ eachSpacing = _drawBubbleDataPoints.eachSpacing
+ opts.chartData.xAxisPoints = xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "mix":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawYAxisGrid(categories, opts, config, context)
+ drawXAxis(categories, opts, config, context)
+ var _drawMixDataPoints = drawMixDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawMixDataPoints.xAxisPoints,
+ calPoints = _drawMixDataPoints.calPoints,
+ eachSpacing = _drawMixDataPoints.eachSpacing
+ opts.chartData.xAxisPoints = xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "column":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawYAxisGrid(categories, opts, config, context)
+ drawXAxis(categories, opts, config, context)
+ var _drawColumnDataPoints = drawColumnDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawColumnDataPoints.xAxisPoints,
+ calPoints = _drawColumnDataPoints.calPoints,
+ eachSpacing = _drawColumnDataPoints.eachSpacing
+ opts.chartData.xAxisPoints = xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "mount":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawYAxisGrid(categories, opts, config, context)
+ drawXAxis(categories, opts, config, context)
+ var _drawMountDataPoints = drawMountDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawMountDataPoints.xAxisPoints,
+ calPoints = _drawMountDataPoints.calPoints,
+ eachSpacing = _drawMountDataPoints.eachSpacing
+ opts.chartData.xAxisPoints = xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "bar":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawXAxis(categories, opts, config, context)
+ var _drawBarDataPoints = drawBarDataPoints(series, opts, config, context, process),
+ yAxisPoints = _drawBarDataPoints.yAxisPoints,
+ calPoints = _drawBarDataPoints.calPoints,
+ eachSpacing = _drawBarDataPoints.eachSpacing
+ opts.chartData.yAxisPoints = yAxisPoints
+ opts.chartData.xAxisPoints = opts.chartData.xAxisData.xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process, eachSpacing, yAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "area":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawYAxisGrid(categories, opts, config, context)
+ drawXAxis(categories, opts, config, context)
+ var _drawAreaDataPoints = drawAreaDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawAreaDataPoints.xAxisPoints,
+ calPoints = _drawAreaDataPoints.calPoints,
+ eachSpacing = _drawAreaDataPoints.eachSpacing
+ opts.chartData.xAxisPoints = xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "ring":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ opts.chartData.pieData = drawPieDataPoints(series, opts, config, context, process)
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "pie":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ opts.chartData.pieData = drawPieDataPoints(series, opts, config, context, process)
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "rose":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ opts.chartData.pieData = drawRoseDataPoints(series, opts, config, context, process)
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "radar":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ opts.chartData.radarData = drawRadarDataPoints(series, opts, config, context, process)
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ drawToolTipBridge(opts, config, context, process)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "arcbar":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ opts.chartData.arcbarData = drawArcbarDataPoints(series, opts, config, context, process)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "gauge":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ opts.chartData.gaugeData = drawGaugeDataPoints(categories, series, opts, config, context, process)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ case "candle":
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height)
+ if (opts.rotate) {
+ contextRotate(context, opts)
+ }
+ drawYAxisGrid(categories, opts, config, context)
+ drawXAxis(categories, opts, config, context)
+ var _drawCandleDataPoints = drawCandleDataPoints(series, seriesMA, opts, config, context, process),
+ xAxisPoints = _drawCandleDataPoints.xAxisPoints,
+ calPoints = _drawCandleDataPoints.calPoints,
+ eachSpacing = _drawCandleDataPoints.eachSpacing
+ opts.chartData.xAxisPoints = xAxisPoints
+ opts.chartData.calPoints = calPoints
+ opts.chartData.eachSpacing = eachSpacing
+ drawYAxis(series, opts, config, context)
+ if (opts.enableMarkLine !== false && process === 1) {
+ drawMarkLine(opts, config, context)
+ }
+ if (seriesMA) {
+ drawLegend(seriesMA, opts, config, context, opts.chartData)
+ } else {
+ drawLegend(opts.series, opts, config, context, opts.chartData)
+ }
+ drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints)
+ drawCanvas(opts, context)
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger("renderComplete")
+ },
+ })
+ break
+ }
+}
+
+function uChartsEvent() {
+ this.events = {}
+}
+
+uChartsEvent.prototype.addEventListener = function (type, listener) {
+ this.events[type] = this.events[type] || []
+ this.events[type].push(listener)
+}
+
+uChartsEvent.prototype.delEventListener = function (type) {
+ this.events[type] = []
+}
+
+uChartsEvent.prototype.trigger = function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key]
+ }
+ var type = args[0]
+ var params = args.slice(1)
+ if (!!this.events[type]) {
+ this.events[type].forEach(function (listener) {
+ try {
+ listener.apply(null, params)
+ } catch (e) {
+ //console.log('[uCharts] '+e);
+ }
+ })
+ }
+}
+
+var uCharts = function uCharts(opts) {
+ opts.pix = opts.pixelRatio ? opts.pixelRatio : 1
+ opts.fontSize = opts.fontSize ? opts.fontSize : 13
+ opts.fontColor = opts.fontColor ? opts.fontColor : config.fontColor
+ if (opts.background == "" || opts.background == "none") {
+ opts.background = "#FFFFFF"
+ }
+ opts.title = assign({}, opts.title)
+ opts.subtitle = assign({}, opts.subtitle)
+ opts.duration = opts.duration ? opts.duration : 1000
+ opts.yAxis = assign(
+ {},
+ {
+ data: [],
+ showTitle: false,
+ disabled: false,
+ disableGrid: false,
+ gridSet: "number",
+ splitNumber: 5,
+ gridType: "solid",
+ dashLength: 4 * opts.pix,
+ gridColor: "#cccccc",
+ padding: 10,
+ fontColor: "#666666",
+ },
+ opts.yAxis,
+ )
+ opts.xAxis = assign(
+ {},
+ {
+ rotateLabel: false,
+ rotateAngle: 45,
+ disabled: false,
+ disableGrid: false,
+ splitNumber: 5,
+ calibration: false,
+ fontColor: "#666666",
+ fontSize: 13,
+ lineHeight: 20,
+ marginTop: 0,
+ gridType: "solid",
+ dashLength: 4,
+ scrollAlign: "left",
+ boundaryGap: "center",
+ axisLine: true,
+ axisLineColor: "#cccccc",
+ titleFontSize: 13,
+ titleOffsetY: 0,
+ titleOffsetX: 0,
+ titleFontColor: "#666666",
+ },
+ opts.xAxis,
+ )
+ opts.xAxis.scrollPosition = opts.xAxis.scrollAlign
+ opts.legend = assign(
+ {},
+ {
+ show: true,
+ position: "bottom",
+ float: "center",
+ backgroundColor: "rgba(0,0,0,0)",
+ borderColor: "rgba(0,0,0,0)",
+ borderWidth: 0,
+ padding: 5,
+ margin: 5,
+ itemGap: 10,
+ fontSize: opts.fontSize,
+ lineHeight: opts.fontSize,
+ fontColor: opts.fontColor,
+ formatter: {},
+ hiddenColor: "#CECECE",
+ },
+ opts.legend,
+ )
+ opts.extra = assign(
+ {
+ tooltip: {
+ legendShape: "auto",
+ },
+ },
+ opts.extra,
+ )
+ opts.rotate = opts.rotate ? true : false
+ opts.animation = opts.animation ? true : false
+ opts.rotate = opts.rotate ? true : false
+ opts.canvas2d = opts.canvas2d ? true : false
+
+ let config$$1 = assign({}, config)
+ config$$1.color = opts.color ? opts.color : config$$1.color
+ if (opts.type == "pie") {
+ config$$1.pieChartLinePadding =
+ opts.dataLabel === false ? 0 : opts.extra.pie.labelWidth * opts.pix || config$$1.pieChartLinePadding * opts.pix
+ }
+ if (opts.type == "ring") {
+ config$$1.pieChartLinePadding =
+ opts.dataLabel === false ? 0 : opts.extra.ring.labelWidth * opts.pix || config$$1.pieChartLinePadding * opts.pix
+ }
+ if (opts.type == "rose") {
+ config$$1.pieChartLinePadding =
+ opts.dataLabel === false ? 0 : opts.extra.rose.labelWidth * opts.pix || config$$1.pieChartLinePadding * opts.pix
+ }
+ config$$1.pieChartTextPadding = opts.dataLabel === false ? 0 : config$$1.pieChartTextPadding * opts.pix
+
+ //屏幕旋转
+ config$$1.rotate = opts.rotate
+ if (opts.rotate) {
+ let tempWidth = opts.width
+ let tempHeight = opts.height
+ opts.width = tempHeight
+ opts.height = tempWidth
+ }
+
+ //适配高分屏
+ opts.padding = opts.padding ? opts.padding : config$$1.padding
+ config$$1.yAxisWidth = config.yAxisWidth * opts.pix
+ config$$1.fontSize = opts.fontSize * opts.pix
+ config$$1.titleFontSize = config.titleFontSize * opts.pix
+ config$$1.subtitleFontSize = config.subtitleFontSize * opts.pix
+ if (!opts.context) {
+ throw new Error("[uCharts] 未获取到context!注意:v2.0版本后,需要自行获取canvas的绘图上下文并传入opts.context!")
+ }
+ this.context = opts.context
+ if (!this.context.setTextAlign) {
+ this.context.setStrokeStyle = function (e) {
+ return (this.strokeStyle = e)
+ }
+ this.context.setLineWidth = function (e) {
+ return (this.lineWidth = e)
+ }
+ this.context.setLineCap = function (e) {
+ return (this.lineCap = e)
+ }
+ this.context.setFontSize = function (e) {
+ return (this.font = e + "px sans-serif")
+ }
+ this.context.setFillStyle = function (e) {
+ return (this.fillStyle = e)
+ }
+ this.context.setTextAlign = function (e) {
+ return (this.textAlign = e)
+ }
+ this.context.setTextBaseline = function (e) {
+ return (this.textBaseline = e)
+ }
+ this.context.setShadow = function (offsetX, offsetY, blur, color) {
+ this.shadowColor = color
+ this.shadowOffsetX = offsetX
+ this.shadowOffsetY = offsetY
+ this.shadowBlur = blur
+ }
+ this.context.draw = function () {}
+ }
+ //兼容NVUEsetLineDash
+ if (!this.context.setLineDash) {
+ this.context.setLineDash = function (e) {}
+ }
+ opts.chartData = {}
+ this.uevent = new uChartsEvent()
+ this.scrollOption = {
+ currentOffset: 0,
+ startTouchX: 0,
+ distance: 0,
+ lastMoveTime: 0,
+ }
+ this.opts = opts
+ this.config = config$$1
+ drawCharts.call(this, opts.type, opts, config$$1, this.context)
+}
+
+uCharts.prototype.updateData = function () {
+ let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}
+ this.opts = assign({}, this.opts, data)
+ this.opts.updateData = true
+ let scrollPosition = data.scrollPosition || "current"
+ switch (scrollPosition) {
+ case "current":
+ this.opts._scrollDistance_ = this.scrollOption.currentOffset
+ break
+ case "left":
+ this.opts._scrollDistance_ = 0
+ this.scrollOption = {
+ currentOffset: 0,
+ startTouchX: 0,
+ distance: 0,
+ lastMoveTime: 0,
+ }
+ break
+ case "right":
+ let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config, this.context),
+ yAxisWidth = _calYAxisData.yAxisWidth
+ this.config.yAxisWidth = yAxisWidth
+ let offsetLeft = 0
+ let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
+ xAxisPoints = _getXAxisPoints0.xAxisPoints,
+ startX = _getXAxisPoints0.startX,
+ endX = _getXAxisPoints0.endX,
+ eachSpacing = _getXAxisPoints0.eachSpacing
+ let totalWidth = eachSpacing * (xAxisPoints.length - 1)
+ let screenWidth = endX - startX
+ offsetLeft = screenWidth - totalWidth
+ this.scrollOption = {
+ currentOffset: offsetLeft,
+ startTouchX: offsetLeft,
+ distance: 0,
+ lastMoveTime: 0,
+ }
+ this.opts._scrollDistance_ = offsetLeft
+ break
+ }
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context)
+}
+
+uCharts.prototype.zoom = function () {
+ var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.opts.xAxis.itemCount
+ if (this.opts.enableScroll !== true) {
+ console.log("[uCharts] 请启用滚动条后使用")
+ return
+ }
+ //当前屏幕中间点
+ let centerPoint =
+ Math.round(Math.abs(this.scrollOption.currentOffset) / this.opts.chartData.eachSpacing) + Math.round(this.opts.xAxis.itemCount / 2)
+ this.opts.animation = false
+ this.opts.xAxis.itemCount = val.itemCount
+ //重新计算x轴偏移距离
+ let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config, this.context),
+ yAxisWidth = _calYAxisData.yAxisWidth
+ this.config.yAxisWidth = yAxisWidth
+ let offsetLeft = 0
+ let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
+ xAxisPoints = _getXAxisPoints0.xAxisPoints,
+ startX = _getXAxisPoints0.startX,
+ endX = _getXAxisPoints0.endX,
+ eachSpacing = _getXAxisPoints0.eachSpacing
+ let centerLeft = eachSpacing * centerPoint
+ let screenWidth = endX - startX
+ let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1)
+ offsetLeft = screenWidth / 2 - centerLeft
+ if (offsetLeft > 0) {
+ offsetLeft = 0
+ }
+ if (offsetLeft < MaxLeft) {
+ offsetLeft = MaxLeft
+ }
+ this.scrollOption = {
+ currentOffset: offsetLeft,
+ startTouchX: 0,
+ distance: 0,
+ lastMoveTime: 0,
+ }
+ calValidDistance(this, offsetLeft, this.opts.chartData, this.config, this.opts)
+ this.opts._scrollDistance_ = offsetLeft
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context)
+}
+
+uCharts.prototype.dobuleZoom = function (e) {
+ if (this.opts.enableScroll !== true) {
+ console.log("[uCharts] 请启用滚动条后使用")
+ return
+ }
+ const tcs = e.changedTouches
+ if (tcs.length < 2) {
+ return
+ }
+ for (var i = 0; i < tcs.length; i++) {
+ tcs[i].x = tcs[i].x ? tcs[i].x : tcs[i].clientX
+ tcs[i].y = tcs[i].y ? tcs[i].y : tcs[i].clientY
+ }
+ const ntcs = [getTouches(tcs[0], this.opts, e), getTouches(tcs[1], this.opts, e)]
+ const xlength = Math.abs(ntcs[0].x - ntcs[1].x)
+ // 记录初始的两指之间的数据
+ if (!this.scrollOption.moveCount) {
+ let cts0 = { changedTouches: [{ x: tcs[0].x, y: this.opts.area[0] / this.opts.pix + 2 }] }
+ let cts1 = { changedTouches: [{ x: tcs[1].x, y: this.opts.area[0] / this.opts.pix + 2 }] }
+ if (this.opts.rotate) {
+ cts0 = { changedTouches: [{ x: this.opts.height / this.opts.pix - this.opts.area[0] / this.opts.pix - 2, y: tcs[0].y }] }
+ cts1 = { changedTouches: [{ x: this.opts.height / this.opts.pix - this.opts.area[0] / this.opts.pix - 2, y: tcs[1].y }] }
+ }
+ const moveCurrent1 = this.getCurrentDataIndex(cts0).index
+ const moveCurrent2 = this.getCurrentDataIndex(cts1).index
+ const moveCount = Math.abs(moveCurrent1 - moveCurrent2)
+ this.scrollOption.moveCount = moveCount
+ this.scrollOption.moveCurrent1 = Math.min(moveCurrent1, moveCurrent2)
+ this.scrollOption.moveCurrent2 = Math.max(moveCurrent1, moveCurrent2)
+ return
+ }
+
+ let currentEachSpacing = xlength / this.scrollOption.moveCount
+ let itemCount = (this.opts.width - this.opts.area[1] - this.opts.area[3]) / currentEachSpacing
+ itemCount = itemCount <= 2 ? 2 : itemCount
+ itemCount = itemCount >= this.opts.categories.length ? this.opts.categories.length : itemCount
+ this.opts.animation = false
+ this.opts.xAxis.itemCount = itemCount
+ // 重新计算滚动条偏移距离
+ let offsetLeft = 0
+ let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
+ xAxisPoints = _getXAxisPoints0.xAxisPoints,
+ startX = _getXAxisPoints0.startX,
+ endX = _getXAxisPoints0.endX,
+ eachSpacing = _getXAxisPoints0.eachSpacing
+ let currentLeft = eachSpacing * this.scrollOption.moveCurrent1
+ let screenWidth = endX - startX
+ let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1)
+ offsetLeft = -currentLeft + Math.min(ntcs[0].x, ntcs[1].x) - this.opts.area[3] - eachSpacing
+ if (offsetLeft > 0) {
+ offsetLeft = 0
+ }
+ if (offsetLeft < MaxLeft) {
+ offsetLeft = MaxLeft
+ }
+ this.scrollOption.currentOffset = offsetLeft
+ this.scrollOption.startTouchX = 0
+ this.scrollOption.distance = 0
+ calValidDistance(this, offsetLeft, this.opts.chartData, this.config, this.opts)
+ this.opts._scrollDistance_ = offsetLeft
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context)
+}
+
+uCharts.prototype.stopAnimation = function () {
+ this.animationInstance && this.animationInstance.stop()
+}
+
+uCharts.prototype.addEventListener = function (type, listener) {
+ this.uevent.addEventListener(type, listener)
+}
+
+uCharts.prototype.delEventListener = function (type) {
+ this.uevent.delEventListener(type)
+}
+
+uCharts.prototype.getCurrentDataIndex = function (e) {
+ var touches = null
+ if (e.changedTouches) {
+ touches = e.changedTouches[0]
+ } else {
+ touches = e.mp.changedTouches[0]
+ }
+ if (touches) {
+ let _touches$ = getTouches(touches, this.opts, e)
+ if (this.opts.type === "pie" || this.opts.type === "ring") {
+ return findPieChartCurrentIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts.chartData.pieData,
+ this.opts,
+ )
+ } else if (this.opts.type === "rose") {
+ return findRoseChartCurrentIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts.chartData.pieData,
+ this.opts,
+ )
+ } else if (this.opts.type === "radar") {
+ return findRadarChartCurrentIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts.chartData.radarData,
+ this.opts.categories.length,
+ )
+ } else if (this.opts.type === "funnel") {
+ return findFunnelChartCurrentIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts.chartData.funnelData,
+ )
+ } else if (this.opts.type === "map") {
+ return findMapChartCurrentIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts,
+ )
+ } else if (this.opts.type === "word") {
+ return findWordChartCurrentIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts.chartData.wordCloudData,
+ )
+ } else if (this.opts.type === "bar") {
+ return findBarChartCurrentIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts.chartData.calPoints,
+ this.opts,
+ this.config,
+ Math.abs(this.scrollOption.currentOffset),
+ )
+ } else {
+ return findCurrentIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts.chartData.calPoints,
+ this.opts,
+ this.config,
+ Math.abs(this.scrollOption.currentOffset),
+ )
+ }
+ }
+ return -1
+}
+
+uCharts.prototype.getLegendDataIndex = function (e) {
+ var touches = null
+ if (e.changedTouches) {
+ touches = e.changedTouches[0]
+ } else {
+ touches = e.mp.changedTouches[0]
+ }
+ if (touches) {
+ let _touches$ = getTouches(touches, this.opts, e)
+ return findLegendIndex(
+ {
+ x: _touches$.x,
+ y: _touches$.y,
+ },
+ this.opts.chartData.legendData,
+ )
+ }
+ return -1
+}
+
+uCharts.prototype.touchLegend = function (e) {
+ var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}
+ var touches = null
+ if (e.changedTouches) {
+ touches = e.changedTouches[0]
+ } else {
+ touches = e.mp.changedTouches[0]
+ }
+ if (touches) {
+ var _touches$ = getTouches(touches, this.opts, e)
+ var index = this.getLegendDataIndex(e)
+ if (index >= 0) {
+ if (this.opts.type == "candle") {
+ this.opts.seriesMA[index].show = !this.opts.seriesMA[index].show
+ } else {
+ this.opts.series[index].show = !this.opts.series[index].show
+ }
+ this.opts.animation = option.animation ? true : false
+ this.opts._scrollDistance_ = this.scrollOption.currentOffset
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context)
+ }
+ }
+}
+
+uCharts.prototype.showToolTip = function (e) {
+ var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}
+ var touches = null
+ if (e.changedTouches) {
+ touches = e.changedTouches[0]
+ } else {
+ touches = e.mp.changedTouches[0]
+ }
+ if (!touches) {
+ console.log("[uCharts] 未获取到event坐标信息")
+ }
+ var _touches$ = getTouches(touches, this.opts, e)
+ var currentOffset = this.scrollOption.currentOffset
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false,
+ })
+ if (
+ this.opts.type === "line" ||
+ this.opts.type === "area" ||
+ this.opts.type === "column" ||
+ this.opts.type === "scatter" ||
+ this.opts.type === "bubble"
+ ) {
+ var current = this.getCurrentDataIndex(e)
+ var index = option.index == undefined ? current.index : option.index
+ if (index > -1 || index.length > 0) {
+ var seriesData = getSeriesDataItem(this.opts.series, index, current.group)
+ if (seriesData.length !== 0) {
+ var _getToolTipData = getToolTipData(seriesData, this.opts, index, current.group, this.opts.categories, option),
+ textList = _getToolTipData.textList,
+ offset = _getToolTipData.offset
+ offset.y = _touches$.y
+ opts.tooltip = {
+ textList: option.textList !== undefined ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ group: current.group,
+ }
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+ if (this.opts.type === "mount") {
+ var index = option.index == undefined ? this.getCurrentDataIndex(e).index : option.index
+ if (index > -1) {
+ var opts = assign({}, this.opts, { animation: false })
+ var seriesData = assign({}, opts._series_[index])
+ var textList = [
+ {
+ text: option.formatter ? option.formatter(seriesData, undefined, index, opts) : seriesData.name + ": " + seriesData.data,
+ color: seriesData.color,
+ legendShape: this.opts.extra.tooltip.legendShape == "auto" ? seriesData.legendShape : this.opts.extra.tooltip.legendShape,
+ },
+ ]
+ var offset = {
+ x: opts.chartData.calPoints[index].x,
+ y: _touches$.y,
+ }
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ }
+ }
+
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+ if (this.opts.type === "bar") {
+ var current = this.getCurrentDataIndex(e)
+ var index = option.index == undefined ? current.index : option.index
+ if (index > -1 || index.length > 0) {
+ var seriesData = getSeriesDataItem(this.opts.series, index, current.group)
+ if (seriesData.length !== 0) {
+ var _getToolTipData = getToolTipData(seriesData, this.opts, index, current.group, this.opts.categories, option),
+ textList = _getToolTipData.textList,
+ offset = _getToolTipData.offset
+ offset.x = _touches$.x
+ opts.tooltip = {
+ textList: option.textList !== undefined ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ }
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+ if (this.opts.type === "mix") {
+ var current = this.getCurrentDataIndex(e)
+ var index = option.index == undefined ? current.index : option.index
+ if (index > -1) {
+ var currentOffset = this.scrollOption.currentOffset
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false,
+ })
+ var seriesData = getSeriesDataItem(this.opts.series, index)
+ if (seriesData.length !== 0) {
+ var _getMixToolTipData = getMixToolTipData(seriesData, this.opts, index, this.opts.categories, option),
+ textList = _getMixToolTipData.textList,
+ offset = _getMixToolTipData.offset
+ offset.y = _touches$.y
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ }
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+ if (this.opts.type === "candle") {
+ var current = this.getCurrentDataIndex(e)
+ var index = option.index == undefined ? current.index : option.index
+ if (index > -1) {
+ var currentOffset = this.scrollOption.currentOffset
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false,
+ })
+ var seriesData = getSeriesDataItem(this.opts.series, index)
+ if (seriesData.length !== 0) {
+ var _getToolTipData = getCandleToolTipData(
+ this.opts.series[0].data,
+ seriesData,
+ this.opts,
+ index,
+ this.opts.categories,
+ this.opts.extra.candle,
+ option,
+ ),
+ textList = _getToolTipData.textList,
+ offset = _getToolTipData.offset
+ offset.y = _touches$.y
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ }
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+ if (this.opts.type === "pie" || this.opts.type === "ring" || this.opts.type === "rose" || this.opts.type === "funnel") {
+ var index = option.index == undefined ? this.getCurrentDataIndex(e) : option.index
+ if (index > -1) {
+ var opts = assign({}, this.opts, { animation: false })
+ var seriesData = assign({}, opts._series_[index])
+ var textList = [
+ {
+ text: option.formatter ? option.formatter(seriesData, undefined, index, opts) : seriesData.name + ": " + seriesData.data,
+ color: seriesData.color,
+ legendShape: this.opts.extra.tooltip.legendShape == "auto" ? seriesData.legendShape : this.opts.extra.tooltip.legendShape,
+ },
+ ]
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y,
+ }
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+ if (this.opts.type === "map") {
+ var index = option.index == undefined ? this.getCurrentDataIndex(e) : option.index
+ if (index > -1) {
+ var opts = assign({}, this.opts, { animation: false })
+ var seriesData = assign({}, this.opts.series[index])
+ seriesData.name = seriesData.properties.name
+ var textList = [
+ {
+ text: option.formatter ? option.formatter(seriesData, undefined, index, this.opts) : seriesData.name,
+ color: seriesData.color,
+ legendShape: this.opts.extra.tooltip.legendShape == "auto" ? seriesData.legendShape : this.opts.extra.tooltip.legendShape,
+ },
+ ]
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y,
+ }
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ }
+ }
+ opts.updateData = false
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+ if (this.opts.type === "word") {
+ var index = option.index == undefined ? this.getCurrentDataIndex(e) : option.index
+ if (index > -1) {
+ var opts = assign({}, this.opts, { animation: false })
+ var seriesData = assign({}, this.opts.series[index])
+ var textList = [
+ {
+ text: option.formatter ? option.formatter(seriesData, undefined, index, this.opts) : seriesData.name,
+ color: seriesData.color,
+ legendShape: this.opts.extra.tooltip.legendShape == "auto" ? seriesData.legendShape : this.opts.extra.tooltip.legendShape,
+ },
+ ]
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y,
+ }
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ }
+ }
+ opts.updateData = false
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+ if (this.opts.type === "radar") {
+ var index = option.index == undefined ? this.getCurrentDataIndex(e) : option.index
+ if (index > -1) {
+ var opts = assign({}, this.opts, { animation: false })
+ var seriesData = getSeriesDataItem(this.opts.series, index)
+ if (seriesData.length !== 0) {
+ var textList = seriesData.map((item) => {
+ return {
+ text: option.formatter ? option.formatter(item, this.opts.categories[index], index, this.opts) : item.name + ": " + item.data,
+ color: item.color,
+ legendShape: this.opts.extra.tooltip.legendShape == "auto" ? item.legendShape : this.opts.extra.tooltip.legendShape,
+ }
+ })
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y,
+ }
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index,
+ }
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ }
+}
+
+uCharts.prototype.translate = function (distance) {
+ this.scrollOption = {
+ currentOffset: distance,
+ startTouchX: distance,
+ distance: 0,
+ lastMoveTime: 0,
+ }
+ let opts = assign({}, this.opts, {
+ _scrollDistance_: distance,
+ animation: false,
+ })
+ drawCharts.call(this, this.opts.type, opts, this.config, this.context)
+}
+
+uCharts.prototype.scrollStart = function (e) {
+ var touches = null
+ if (e.changedTouches) {
+ touches = e.changedTouches[0]
+ } else {
+ touches = e.mp.changedTouches[0]
+ }
+ var _touches$ = getTouches(touches, this.opts, e)
+ if (touches && this.opts.enableScroll === true) {
+ this.scrollOption.startTouchX = _touches$.x
+ }
+}
+
+uCharts.prototype.scroll = function (e) {
+ if (this.scrollOption.lastMoveTime === 0) {
+ this.scrollOption.lastMoveTime = Date.now()
+ }
+ let Limit = this.opts.touchMoveLimit || 60
+ let currMoveTime = Date.now()
+ let duration = currMoveTime - this.scrollOption.lastMoveTime
+ if (duration < Math.floor(1000 / Limit)) return
+ if (this.scrollOption.startTouchX == 0) return
+ this.scrollOption.lastMoveTime = currMoveTime
+ var touches = null
+ if (e.changedTouches) {
+ touches = e.changedTouches[0]
+ } else {
+ touches = e.mp.changedTouches[0]
+ }
+ if (touches && this.opts.enableScroll === true) {
+ var _touches$ = getTouches(touches, this.opts, e)
+ var _distance
+ _distance = _touches$.x - this.scrollOption.startTouchX
+ var currentOffset = this.scrollOption.currentOffset
+ var validDistance = calValidDistance(this, currentOffset + _distance, this.opts.chartData, this.config, this.opts)
+ this.scrollOption.distance = _distance = validDistance - currentOffset
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset + _distance,
+ animation: false,
+ })
+ this.opts = opts
+ drawCharts.call(this, opts.type, opts, this.config, this.context)
+ return currentOffset + _distance
+ }
+}
+
+uCharts.prototype.scrollEnd = function (e) {
+ if (this.opts.enableScroll === true) {
+ var _scrollOption = this.scrollOption,
+ currentOffset = _scrollOption.currentOffset,
+ distance = _scrollOption.distance
+ this.scrollOption.currentOffset = currentOffset + distance
+ this.scrollOption.distance = 0
+ this.scrollOption.moveCount = 0
+ }
+}
+
+export default uCharts
diff --git a/src/components/u-charts/u-charts.min.js b/src/components/u-charts/u-charts.min.js
new file mode 100644
index 0000000..0902ecd
--- /dev/null
+++ b/src/components/u-charts/u-charts.min.js
@@ -0,0 +1,18 @@
+/*
+ * uCharts (R)
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360/快手)、Vue、Taro等支持canvas的框架平台
+ * Copyright (C) 2021 QIUN (R) 秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ *
+ * uCharts (R) 官方网站
+ * https://www.uCharts.cn
+ *
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ *
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ *
+ */
+"use strict";var config={version:"v2.5.0-20230101",yAxisWidth:15,xAxisHeight:22,padding:[10,10,10,10],rotate:false,fontSize:13,fontColor:"#666666",dataPointShape:["circle","circle","circle","circle"],color:["#1890FF","#91CB74","#FAC858","#EE6666","#73C0DE","#3CA272","#FC8452","#9A60B4","#ea7ccc"],linearColor:["#0EE2F8","#2BDCA8","#FA7D8D","#EB88E2","#2AE3A0","#0EE2F8","#EB88E2","#6773E3","#F78A85"],pieChartLinePadding:15,pieChartTextPadding:5,titleFontSize:20,subtitleFontSize:15,radarLabelTextMargin:13};var assign=function(e,...t){if(e==null){throw new TypeError("[uCharts] Cannot convert undefined or null to object")}if(!t||t.length<=0){return e}function i(e,a){for(let t in a){e[t]=e[t]&&e[t].toString()==="[object Object]"?i(e[t],a[t]):e[t]=a[t]}return e}t.forEach(t=>{e=i(e,t)});return e};var util={toFixed:function t(e,a){a=a||2;if(this.isFloat(e)){e=e.toFixed(a)}return e},isFloat:function t(e){return e%1!==0},approximatelyEqual:function t(e,a){return Math.abs(e-a)<1e-10},isSameSign:function t(e,a){return Math.abs(e)===e&&Math.abs(a)===a||Math.abs(e)!==e&&Math.abs(a)!==a},isSameXCoordinateArea:function t(e,a){return this.isSameSign(e.x,a.x)},isCollision:function t(e,a){e.end={};e.end.x=e.start.x+e.width;e.end.y=e.start.y-e.height;a.end={};a.end.x=a.start.x+a.width;a.end.y=a.start.y-a.height;var i=a.start.x>e.end.x||a.end.xe.start.y||a.start.y1){if(r.extra.mount.widthRatio>2)r.extra.mount.widthRatio=2;n+=(r.extra.mount.widthRatio-1)*a.eachSpacing}var l=e;if(e>=0){l=0;t.uevent.trigger("scrollLeft");t.scrollOption.position="left";r.xAxis.scrollPosition="left"}else if(Math.abs(e)>=n-o){l=o-n;t.uevent.trigger("scrollRight");t.scrollOption.position="right";r.xAxis.scrollPosition="right"}else{t.scrollOption.position=e;r.xAxis.scrollPosition=e}return l}function isInAngleRange(t,e,a){function i(t){while(t<0){t+=2*Math.PI}while(t>2*Math.PI){t-=2*Math.PI}return t}t=i(t);e=i(e);a=i(a);if(e>a){a+=2*Math.PI;if(t=e&&t<=a}function createCurveControlPoints(t,e){function a(t,e){if(t[e-1]&&t[e+1]){return t[e].y>=Math.max(t[e-1].y,t[e+1].y)||t[e].y<=Math.min(t[e-1].y,t[e+1].y)}else{return false}}function c(t,e){if(t[e-1]&&t[e+1]){return t[e].x>=Math.max(t[e-1].x,t[e+1].x)||t[e].x<=Math.min(t[e-1].x,t[e+1].x)}else{return false}}var i=.2;var r=.2;var o=null;var n=null;var l=null;var s=null;if(e<1){o=t[0].x+(t[1].x-t[0].x)*i;n=t[0].y+(t[1].y-t[0].y)*i}else{o=t[e].x+(t[e+1].x-t[e-1].x)*i;n=t[e].y+(t[e+1].y-t[e-1].y)*i}if(e>t.length-3){var h=t.length-1;l=t[h].x-(t[h].x-t[h-1].x)*r;s=t[h].y-(t[h].y-t[h-1].y)*r}else{l=t[e+1].x-(t[e+2].x-t[e].x)*r;s=t[e+1].y-(t[e+2].y-t[e].y)*r}if(a(t,e+1)){s=t[e+1].y}if(a(t,e)){n=t[e].y}if(c(t,e+1)){l=t[e+1].x}if(c(t,e)){o=t[e].x}if(n>=Math.max(t[e].y,t[e+1].y)||n<=Math.min(t[e].y,t[e+1].y)){n=t[e].y}if(s>=Math.max(t[e].y,t[e+1].y)||s<=Math.min(t[e].y,t[e+1].y)){s=t[e+1].y}if(o>=Math.max(t[e].x,t[e+1].x)||o<=Math.min(t[e].x,t[e+1].x)){o=t[e].x}if(l>=Math.max(t[e].x,t[e+1].x)||l<=Math.min(t[e].x,t[e+1].x)){l=t[e+1].x}return{ctrA:{x:o,y:n},ctrB:{x:l,y:s}}}function convertCoordinateOrigin(t,e,a){return{x:a.x+t,y:a.y-e}}function avoidCollision(t,e){if(e){while(util.isCollision(t,e)){if(t.start.x>0){t.start.y--}else if(t.start.x<0){t.start.y++}else{if(t.start.y>0){t.start.y++}else{t.start.y--}}}}return t}function fixPieSeries(e,a,t){let i=[];if(e.length>0&&e[0].data.constructor.toString().indexOf("Array")>-1){a._pieSeries_=e;let t=e[0].data;for(var r=0;r=1e4){a=1e3}else if(i>=1e3){a=100}else if(i>=100){a=10}else if(i>=10){a=5}else if(i>=1){a=1}else if(i>=.1){a=.1}else if(i>=.01){a=.01}else if(i>=.001){a=.001}else if(i>=1e-4){a=1e-4}else if(i>=1e-5){a=1e-5}else{a=1e-6}return{minRange:findRange(t,"lower",a),maxRange:findRange(e,"upper",a)}}function measureText(a,t,e){var i=0;a=String(a);e=false;if(e!==false&&e!==undefined&&e.setFontSize&&e.measureText){e.setFontSize(t);return e.measureText(a).width}else{var a=a.split("");for(let e=0;e-1;if(n){let t=filterSeries(e);for(var l=0;l5&&arguments[5]!==undefined?arguments[5]:{};var l=a.chartData.calPoints?a.chartData.calPoints:[];let s={};if(r.length>0){let e=[];for(let t=0;t0){e=o[i]}return{text:n.formatter?n.formatter(t,e,i,a):t.name+": "+t.data,color:t.color,legendShape:a.extra.tooltip.legendShape=="auto"?t.legendShape:a.extra.tooltip.legendShape}});var h={x:Math.round(s.x),y:Math.round(s.y)};return{textList:e,offset:h}}function getMixToolTipData(t,e,a,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:{};var o=e.chartData.xAxisPoints[a]+e.chartData.eachSpacing/2;var n=t.map(function(t){return{text:r.formatter?r.formatter(t,i[a],a,e):t.name+": "+t.data,color:t.color,disableLegend:t.disableLegend?true:false,legendShape:e.extra.tooltip.legendShape=="auto"?t.legendShape:e.extra.tooltip.legendShape}});n=n.filter(function(t){if(t.disableLegend!==true){return t}});var l={x:Math.round(o),y:0};return{textList:n,offset:l}}function getCandleToolTipData(o,e,n,l,i,t){var r=arguments.length>6&&arguments[6]!==undefined?arguments[6]:{};var a=n.chartData.calPoints;let s=t.color.upFill;let h=t.color.downFill;let c=[s,s,h,s];var d=[];e.map(function(t){if(l==0){if(t.data[1]-t.data[0]<0){c[1]=h}else{c[1]=s}}else{if(t.data[0]o[l-1][1]){c[2]=s}if(t.data[3]4&&arguments[4]!==undefined?arguments[4]:0;var l={index:-1,group:[]};var i=e.chartData.eachSpacing/2;let r=[];if(n&&n.length>0){if(!e.categories){i=0}else{for(let t=1;tt){l.index=e}})}}}return l}function findBarChartCurrentIndex(a,t,e,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:0;var o={index:-1,group:[]};var n=e.chartData.eachSpacing/2;let l=e.chartData.yAxisPoints;if(t&&t.length>0){if(isInExactChartArea(a,e,i)){l.forEach(function(t,e){if(a.y+r+n>t){o.index=e}})}}return o}function findLegendIndex(o,t,e){let n=-1;let l=0;if(isInExactLegendArea(o,t.area)){let i=t.points;let r=-1;for(let t=0,e=i.length;tt[0]-l&&o.xt[1]-l&&o.ye.start.x&&t.xe.start.y&&t.y=e.area[3]-10&&t.y>=e.area[0]&&t.y<=e.height-e.area[2]}function findRadarChartCurrentIndex(t,e,a){var r=2*Math.PI/a;var o=-1;if(isInExactPieChartArea(t,e.center,e.radius)){var n=function t(e){if(e<0){e+=2*Math.PI}if(e>2*Math.PI){e-=2*Math.PI}return e};var l=Math.atan2(e.center.y-t.y,t.x-e.center.x);l=-1*l;if(l<0){l+=2*Math.PI}var i=e.angleList.map(function(t){t=n(-1*t);return t});i.forEach(function(t,e){var a=n(t-r/2);var i=n(t+r/2);if(i=a&&l<=i||l+2*Math.PI>=a&&l+2*Math.PI<=i){o=e}})}return o}function findFunnelChartCurrentIndex(t,e){var a=-1;for(var i=0,r=e.series.length;io.funnelArea[0]&&t.xo.funnelArea[1]&&t.yo.area[0]&&t.xo.area[1]&&t.ys.width-s.area[1]-s.area[3]){i.push(n);o.push(r-s.legend.itemGap*s.pix);r=e;n=[t]}else{r+=e;n.push(t)}}if(n.length){i.push(n);o.push(r-s.legend.itemGap*s.pix);c.widthArr=o;let t=Math.max.apply(null,o);switch(s.legend.float){case"left":c.area.start.x=s.area[3];c.area.end.x=s.area[3]+t+2*d;break;case"right":c.area.start.x=s.width-s.area[1]-t-2*d;c.area.end.x=s.width-s.area[1];break;default:c.area.start.x=(s.width-t)/2-d;c.area.end.x=(s.width+t)/2+d}c.area.width=t+2*d;c.area.wholeWidth=t+2*d;c.area.height=i.length*u+2*d;c.area.wholeHeight=i.length*u+2*d+2*x;c.points=i}}else{let t=l.length;let e=s.height-s.area[0]-s.area[2]-2*x-2*d;let a=Math.min(Math.floor(e/u),t);c.area.height=a*u+d*2;c.area.wholeHeight=a*u+d*2;switch(s.legend.float){case"top":c.area.start.y=s.area[0]+x;c.area.end.y=s.area[0]+x+c.area.height;break;case"bottom":c.area.start.y=s.height-s.area[2]-x-c.area.height;c.area.end.y=s.height-s.area[2]-x;break;default:c.area.start.y=(s.height-c.area.height)/2;c.area.end.y=(s.height+c.area.height)/2}let i=t%a===0?t/a:Math.floor(t/a+1);let r=[];for(let e=0;ei){i=t}}c.widthArr.push(i);c.heightArr.push(a.length*u+d*2)}let e=0;for(let t=0;t4&&arguments[4]!==undefined?arguments[4]:-1;var i;if(c=="stack"){i=dataCombineStack(t,e.categories.length)}else{i=dataCombine(t)}var r=[];i=i.filter(function(t){if(typeof t==="object"&&t!==null){if(t.constructor.toString().indexOf("Array")>-1){return t!==null}else{return t.value!==null}}else{return t!==null}});i.map(function(t){if(typeof t==="object"){if(t.constructor.toString().indexOf("Array")>-1){if(e.type=="candle"){t.map(function(t){r.push(t)})}else{r.push(t[0])}}else{r.push(t.value)}}else{r.push(t)}});var o=0;var n=0;if(r.length>0){o=Math.min.apply(this,r);n=Math.max.apply(this,r)}if(a>-1){if(typeof e.xAxis.data[a].min==="number"){o=Math.min(e.xAxis.data[a].min,o)}if(typeof e.xAxis.data[a].max==="number"){n=Math.max(e.xAxis.data[a].max,n)}}else{if(typeof e.xAxis.min==="number"){o=Math.min(e.xAxis.min,o)}if(typeof e.xAxis.max==="number"){n=Math.max(e.xAxis.max,n)}}if(o===n){var d=n||10;n+=d}var l=o;var x=n;var f=[];var p=(x-l)/e.xAxis.splitNumber;for(var s=0;s<=e.xAxis.splitNumber;s++){f.push(l+p*s)}return f}function calXAxisData(t,e,a,i){var r=assign({},{type:""},e.extra.bar);var o={angle:0,xAxisHeight:e.xAxis.lineHeight*e.pix+e.xAxis.marginTop*e.pix};o.ranges=getXAxisTextList(t,e,a,r.type);o.rangesFormat=o.ranges.map(function(t){t=util.toFixed(t,2);return t});var n=o.ranges.map(function(t){t=util.toFixed(t,2);return t});o=Object.assign(o,getXAxisPoints(n,e,a));var l=o.eachSpacing;var s=n.map(function(t){return measureText(t,e.xAxis.fontSize*e.pix,i)});if(e.xAxis.disabled===true){o.xAxisHeight=0}return o}function getRadarDataPoints(r,o,n,a,t){var l=arguments.length>5&&arguments[5]!==undefined?arguments[5]:1;var e=t.extra.radar||{};e.max=e.max||0;var s=Math.max(e.max,Math.max.apply(null,dataCombine(a)));var h=[];for(let e=0;e2&&arguments[2]!==undefined?arguments[2]:1;var o=0;var n=0;for(let e=0;e4&&arguments[4]!==undefined?arguments[4]:1;for(let t=0;t4&&arguments[4]!==undefined?arguments[4]:1;var l=0;var s=0;var h=[];for(let e=0;e2&&arguments[2]!==undefined?arguments[2]:1;if(o==1){o=.999999}for(let a=0;a=2){t._proportion_=t._proportion_%2}}return i}function getGaugeArcbarDataPoints(i,r){var o=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;if(o==1){o=.999999}for(let a=0;a=2){t._proportion_=t._proportion_%2}}return i}function getGaugeAxisPoints(e,a,t){let i;if(t=2){e[t]._endAngle_=e[t]._endAngle_%2}r=e[t]._endAngle_}return e}function getGaugeDataPoints(i,r,o){let n=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;for(let a=0;a=o.oldData){e._proportion_=(e._endAngle_-e._oldAngle_)*n+o.oldAngle}else{e._proportion_=e._oldAngle_-(e._oldAngle_-e._endAngle_)*n}if(e._proportion_>=2){e._proportion_=e._proportion_%2}}return i}function getPieTextMaxLength(i,r,o,n){i=getPieDataPoints(i);let l=0;for(let a=0;a0){t.width=Math.min(t.width,+n.extra.mix.column.width*n.pix)}if(n.extra.column&&n.extra.column.width&&+n.extra.column.width>0){t.width=Math.min(t.width,+n.extra.column.width*n.pix)}if(t.width<=0){t.width=1}t.x+=(o+.5-r/2)*(t.width+e);return t})}function fixBarData(t,i,r,o,e,n){return t.map(function(t){if(t===null){return null}var e=0;var a=0;e=n.extra.bar.seriesGap*n.pix||0;a=n.extra.bar.categoryGap*n.pix||0;e=Math.min(e,i/r);a=Math.min(a,i/r);t.width=Math.ceil((i-2*a-e*(r-1))/r);if(n.extra.bar&&n.extra.bar.width&&+n.extra.bar.width>0){t.width=Math.min(t.width,+n.extra.bar.width*n.pix)}if(t.width<=0){t.width=1}t.y+=(o+.5-r/2)*(t.width+e);return t})}function fixColumeMeterData(t,e,a,i,r,o,n){var l=o.extra.column.categoryGap*o.pix||0;return t.map(function(t){if(t===null){return null}t.width=e-2*l;if(o.extra.column&&o.extra.column.width&&+o.extra.column.width>0){t.width=Math.min(t.width,+o.extra.column.width*o.pix)}if(i>0){t.width-=n}return t})}function fixColumeStackData(t,a,e,i,r,o,n){var l=o.extra.column.categoryGap*o.pix||0;return t.map(function(t,e){if(t===null){return null}t.width=Math.ceil(a-2*l);if(o.extra.column&&o.extra.column.width&&+o.extra.column.width>0){t.width=Math.min(t.width,+o.extra.column.width*o.pix)}if(t.width<=0){t.width=1}return t})}function fixBarStackData(t,a,e,i,r,o,n){var l=o.extra.bar.categoryGap*o.pix||0;return t.map(function(t,e){if(t===null){return null}t.width=Math.ceil(a-2*l);if(o.extra.bar&&o.extra.bar.width&&+o.extra.bar.width>0){t.width=Math.min(t.width,+o.extra.bar.width*o.pix)}if(t.width<=0){t.width=1}return t})}function getXAxisPoints(t,e,h){var a=e.width-e.area[1]-e.area[3];var i=e.enableScroll?Math.min(e.xAxis.itemCount,t.length):t.length;if((e.type=="line"||e.type=="area"||e.type=="scatter"||e.type=="bubble"||e.type=="bar")&&i>1&&e.xAxis.boundaryGap=="justify"){i-=1}var r=0;if(e.type=="mount"&&e.extra&&e.extra.mount&&e.extra.mount.widthRatio&&e.extra.mount.widthRatio>1){if(e.extra.mount.widthRatio>2)e.extra.mount.widthRatio=2;r=e.extra.mount.widthRatio-1;i+=r}var o=a/i;var n=[];var l=e.area[3];var s=e.width-e.area[1];t.forEach(function(t,e){n.push(l+r/2*o+e*o)});if(e.xAxis.boundaryGap!=="justify"){if(e.enableScroll===true){n.push(l+r*o+t.length*o)}else{n.push(s)}}return{xAxisPoints:n,startX:l,endX:s,eachSpacing:o}}function getCandleDataPoints(t,l,s,h,c,d,a){var x=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var e=[];var f=d.height-d.area[0]-d.area[2];t.forEach(function(t,o){if(t===null){e.push(null)}else{var n=[];t.forEach(function(t,e){var a={};a.x=h[o]+Math.round(c/2);var i=t.value||t;var r=f*(i-l)/(s-l);r*=x;a.y=d.height-Math.round(r)-d.area[2];n.push(a)});e.push(n)}});return e}function getDataPoints(t,a,n,l,s,h,e){var c=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var d="center";if(h.type=="line"||h.type=="area"||h.type=="scatter"||h.type=="bubble"){d=h.xAxis.boundaryGap}var x=[];var f=h.height-h.area[0]-h.area[2];var p=h.width-h.area[1]-h.area[3];t.forEach(function(i,t){if(i===null){x.push(null)}else{var r={};r.color=i.color;r.x=l[t];var o=i;if(typeof i==="object"&&i!==null){if(i.constructor.toString().indexOf("Array")>-1){let t,e,a;t=[].concat(h.chartData.xAxisData.ranges);e=t.shift();a=t.pop();o=i[1];r.x=h.area[3]+p*(i[0]-e)/(a-e);if(h.type=="bubble"){r.r=i[2];r.t=i[3]}}else{o=i.value}}if(d=="center"){r.x+=s/2}var e=f*(o-a)/(n-a);e*=c;r.y=h.height-e-h.area[2];x.push(r)}});return x}function getLineDataPoints(t,a,n,l,s,h,e,p,c){var c=arguments.length>8&&arguments[8]!==undefined?arguments[8]:1;var d=h.xAxis.boundaryGap;var x=[];var f=h.height-h.area[0]-h.area[2];var u=h.width-h.area[1]-h.area[3];t.forEach(function(i,t){if(i===null){x.push(null)}else{var r={};r.color=i.color;if(p.animation=="vertical"){r.x=l[t];var o=i;if(typeof i==="object"&&i!==null){if(i.constructor.toString().indexOf("Array")>-1){let t,e,a;t=[].concat(h.chartData.xAxisData.ranges);e=t.shift();a=t.pop();o=i[1];r.x=h.area[3]+u*(i[0]-e)/(a-e)}else{o=i.value}}if(d=="center"){r.x+=s/2}var e=f*(o-a)/(n-a);e*=c;r.y=h.height-e-h.area[2];x.push(r)}else{r.x=l[0]+s*t*c;var o=i;if(d=="center"){r.x+=s/2}var e=f*(o-a)/(n-a);r.y=h.height-e-h.area[2];x.push(r)}}});return x}function getColumnDataPoints(t,a,n,l,s,h,e,i,c){var c=arguments.length>8&&arguments[8]!==undefined?arguments[8]:1;var d=[];var x=h.height-h.area[0]-h.area[2];var f=h.width-h.area[1]-h.area[3];t.forEach(function(i,t){if(i===null){d.push(null)}else{var r={};r.color=i.color;r.x=l[t];var o=i;if(typeof i==="object"&&i!==null){if(i.constructor.toString().indexOf("Array")>-1){let t,e,a;t=[].concat(h.chartData.xAxisData.ranges);e=t.shift();a=t.pop();o=i[1];r.x=h.area[3]+f*(i[0]-e)/(a-e)}else{o=i.value}}r.x+=s/2;var e=x*(o*c-a)/(n-a);r.y=h.height-e-h.area[2];d.push(r)}});return d}function getMountDataPoints(t,o,n,l,s,h,e,a){var c=arguments.length>8&&arguments[8]!==undefined?arguments[8]:1;var d=[];var x=h.height-h.area[0]-h.area[2];var i=h.width-h.area[1]-h.area[3];var f=s*e.widthRatio;t.forEach(function(t,e){if(t===null){d.push(null)}else{var a={};a.color=t.color;a.x=l[e];a.x+=s/2;var i=t.data;var r=x*(i*c-o)/(n-o);a.y=h.height-r-h.area[2];a.value=i;a.width=f;d.push(a)}});return d}function getBarDataPoints(t,o,n,l,e,s,a){var h=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var c=[];var i=s.height-s.area[0]-s.area[2];var d=s.width-s.area[1]-s.area[3];t.forEach(function(t,e){if(t===null){c.push(null)}else{var a={};a.color=t.color;a.y=l[e];var i=t;if(typeof t==="object"&&t!==null){i=t.value}var r=d*(i-o)/(n-o);r*=h;a.height=r;a.value=i;a.x=r+s.area[3];c.push(a)}});return c}function getStackDataPoints(t,s,h,c,g,d,e,x,y){var f=arguments.length>9&&arguments[9]!==undefined?arguments[9]:1;var p=[];var u=d.height-d.area[0]-d.area[2];t.forEach(function(t,e){if(t===null){p.push(null)}else{var a={};a.color=t.color;a.x=c[e]+Math.round(g/2);if(x>0){var i=0;for(let t=0;t<=x;t++){i+=y[t].data[e]}var r=i-t;var o=u*(i-s)/(h-s);var n=u*(r-s)/(h-s)}else{var i=t;if(typeof t==="object"&&t!==null){i=t.value}var o=u*(i-s)/(h-s);var n=0}var l=n;o*=f;l*=f;a.y=d.height-Math.round(o)-d.area[2];a.y0=d.height-Math.round(l)-d.area[2];p.push(a)}});return p}function getBarStackDataPoints(t,s,h,c,e,d,a,x,g){var f=arguments.length>9&&arguments[9]!==undefined?arguments[9]:1;var p=[];var u=d.width-d.area[1]-d.area[3];t.forEach(function(t,e){if(t===null){p.push(null)}else{var a={};a.color=t.color;a.y=c[e];if(x>0){var i=0;for(let t=0;t<=x;t++){i+=g[t].data[e]}var r=i-t;var o=u*(i-s)/(h-s);var n=u*(r-s)/(h-s)}else{var i=t;if(typeof t==="object"&&t!==null){i=t.value}var o=u*(i-s)/(h-s);var n=0}var l=n;o*=f;l*=f;a.height=o-l;a.x=d.area[3]+o;a.x0=d.area[3]+l;p.push(a)}});return p}function getYAxisTextList(t,e,h,c,a){var d=arguments.length>5&&arguments[5]!==undefined?arguments[5]:-1;var i;if(c=="stack"){i=dataCombineStack(t,e.categories.length)}else{i=dataCombine(t)}var r=[];i=i.filter(function(t){if(typeof t==="object"&&t!==null){if(t.constructor.toString().indexOf("Array")>-1){return t!==null}else{return t.value!==null}}else{return t!==null}});i.map(function(t){if(typeof t==="object"){if(t.constructor.toString().indexOf("Array")>-1){if(e.type=="candle"){t.map(function(t){r.push(t)})}else{r.push(t[1])}}else{r.push(t.value)}}else{r.push(t)}});var o=a.min||0;var n=a.max||0;if(r.length>0){o=Math.min.apply(this,r);n=Math.max.apply(this,r)}if(o===n){if(n==0){n=10}else{o=0}}var l=getDataRange(o,n);var x=a.min===undefined||a.min===null?l.minRange:a.min;var f=a.max===undefined||a.max===null?l.maxRange:a.max;var p=(f-x)/e.yAxis.splitNumber;var u=[];for(var s=0;s<=e.yAxis.splitNumber;s++){u.push(x+p*s)}return u.reverse()}function calYAxisData(a,o,e,n){var l=assign({},{type:""},o.extra.column);var t=o.yAxis.data.length;var s=new Array(t);if(t>0){for(let e=0;e{return t+(i.unit||"")}}i.categories=i.categories||o.categories;h[r]=i.categories}else{if(!i.formatter){i.formatter=(t,e,a)=>{return util.toFixed(t,i.tofix||0)+(i.unit||"")}}h[r]=getYAxisTextList(s[r],o,e,l.type,i,r)}let a=i.fontSize*o.pix||e.fontSize;d[r]={position:i.position?i.position:"left",width:0};c[r]=h[r].map(function(t,e){t=i.formatter(t,e,o);d[r].width=Math.max(d[r].width,measureText(t,a,n)+5);return t});let t=i.calibration?4*o.pix:0;d[r].width+=t+3*o.pix;if(i.disabled===true){d[r].width=0}}}else{var h=new Array(1);var c=new Array(1);var d=new Array(1);if(o.type==="bar"){h[0]=o.categories;if(!o.yAxis.formatter){o.yAxis.formatter=(t,e,a)=>{return t+(a.yAxis.unit||"")}}}else{if(!o.yAxis.formatter){o.yAxis.formatter=(t,e,a)=>{return t.toFixed(a.yAxis.tofix)+(a.yAxis.unit||"")}}h[0]=getYAxisTextList(a,o,e,l.type,{})}d[0]={position:"left",width:0};var i=o.yAxis.fontSize*o.pix||e.fontSize;c[0]=h[0].map(function(t,e){t=o.yAxis.formatter(t,e,o);d[0].width=Math.max(d[0].width,measureText(t,i,n)+5);return t});d[0].width+=3*o.pix;if(o.yAxis.disabled===true){d[0]={position:"left",width:0};o.yAxis.data[0]={disabled:true}}else{o.yAxis.data[0]={disabled:false,position:"left",max:o.yAxis.max,min:o.yAxis.min,formatter:o.yAxis.formatter};if(o.type==="bar"){o.yAxis.data[0].categories=o.categories;o.yAxis.data[0].type="categories"}}}return{rangesFormat:c,ranges:h,yAxisWidth:d}}function calTooltipYAxisData(r,t,o,e,a){let n=[].concat(o.chartData.yAxisData.ranges);let l=o.height-o.area[0]-o.area[2];let s=o.area[0];let h=[];for(let i=0;i0&&r.tooltip.group.includes(n)==false){return}var l=typeof r.tooltip.index==="number"?r.tooltip.index:r.tooltip.index[r.tooltip.group.indexOf(n)];i.beginPath();if(o.activeType=="hollow"){i.setStrokeStyle(e);i.setFillStyle(r.background);i.setLineWidth(2*r.pix)}else{i.setStrokeStyle("#ffffff");i.setFillStyle(e);i.setLineWidth(1*r.pix)}if(a==="diamond"){t.forEach(function(t,e){if(t!==null&&l==e){i.moveTo(t.x,t.y-4.5);i.lineTo(t.x-4.5,t.y);i.lineTo(t.x,t.y+4.5);i.lineTo(t.x+4.5,t.y);i.lineTo(t.x,t.y-4.5)}})}else if(a==="circle"){t.forEach(function(t,e){if(t!==null&&l==e){i.moveTo(t.x+2.5*r.pix,t.y);i.arc(t.x,t.y,3*r.pix,0,2*Math.PI,false)}})}else if(a==="square"){t.forEach(function(t,e){if(t!==null&&l==e){i.moveTo(t.x-3.5,t.y-3.5);i.rect(t.x-3.5,t.y-3.5,7,7)}})}else if(a==="triangle"){t.forEach(function(t,e){if(t!==null&&l==e){i.moveTo(t.x,t.y-4.5);i.lineTo(t.x-4.5,t.y+4.5);i.lineTo(t.x+4.5,t.y+4.5);i.lineTo(t.x,t.y-4.5)}})}else if(a==="none"){return}i.closePath();i.fill();i.stroke()}function drawRingTitle(t,e,a,i){var r=t.title.fontSize||e.titleFontSize;var o=t.subtitle.fontSize||e.subtitleFontSize;var n=t.title.name||"";var l=t.subtitle.name||"";var c=t.title.color||t.fontColor;var d=t.subtitle.color||t.fontColor;var x=n?r:0;var f=l?o:0;var s=5;if(l){var p=measureText(l,o*t.pix,a);var u=i.x-p/2+(t.subtitle.offsetX||0)*t.pix;var h=i.y+o*t.pix/2+(t.subtitle.offsetY||0)*t.pix;if(n){h+=(x*t.pix+s)/2}a.beginPath();a.setFontSize(o*t.pix);a.setFillStyle(d);a.fillText(l,u,h);a.closePath();a.stroke()}if(n){var g=measureText(n,r*t.pix,a);var y=i.x-g/2+(t.title.offsetX||0);var v=i.y+r*t.pix/2+(t.title.offsetY||0)*t.pix;if(l){v-=(f*t.pix+s)/2}a.beginPath();a.setFontSize(r*t.pix);a.setFillStyle(c);a.fillText(n,y,v);a.closePath();a.stroke()}}function drawPointText(t,o,n,l,s){var h=o.data;var c=o.textOffset?o.textOffset:0;t.forEach(function(t,e){if(t!==null){l.beginPath();var a=o.textSize?o.textSize*s.pix:n.fontSize;l.setFontSize(a);l.setFillStyle(o.textColor||s.fontColor);var i=h[e];if(typeof h[e]==="object"&&h[e]!==null){if(h[e].constructor.toString().indexOf("Array")>-1){i=h[e][1]}else{i=h[e].value}}var r=o.formatter?o.formatter(i,e,o,s):i;l.setTextAlign("center");l.fillText(String(r),t.x,t.y-4+c*s.pix);l.closePath();l.stroke();l.setTextAlign("left")}})}function drawColumePointText(t,n,l,s,h){var c=n.data;var d=n.textOffset?n.textOffset:0;var x=h.extra.column.labelPosition;t.forEach(function(t,e){if(t!==null){s.beginPath();var a=n.textSize?n.textSize*h.pix:l.fontSize;s.setFontSize(a);s.setFillStyle(n.textColor||h.fontColor);var i=c[e];if(typeof c[e]==="object"&&c[e]!==null){if(c[e].constructor.toString().indexOf("Array")>-1){i=c[e][1]}else{i=c[e].value}}var r=n.formatter?n.formatter(i,e,n,h):i;s.setTextAlign("center");var o=t.y-4*h.pix+d*h.pix;if(t.y>n.zeroPoints){o=t.y+d*h.pix+a}if(x=="insideTop"){o=t.y+a+d*h.pix;if(t.y>n.zeroPoints){o=t.y-d*h.pix-4*h.pix}}if(x=="center"){o=t.y+d*h.pix+(h.height-h.area[2]-t.y+a)/2;if(n.zeroPointsn.zeroPoints){o=t.y-d*h.pix-(t.y-n.zeroPoints-a)/2}if(h.extra.column.type=="stack"){o=t.y+d*h.pix+(t.y0-t.y+a)/2}}if(x=="bottom"){o=h.height-h.area[2]+d*h.pix-4*h.pix;if(n.zeroPointsn.zeroPoints){o=n.zeroPoints-d*h.pix+a+2*h.pix}if(h.extra.column.type=="stack"){o=t.y0+d*h.pix-4*h.pix}}s.fillText(String(r),t.x,o);s.closePath();s.stroke();s.setTextAlign("left")}})}function drawMountPointText(t,n,l,s,h,c){var e=n.data;var d=n.textOffset?n.textOffset:0;var a=h.extra.mount.labelPosition;t.forEach(function(t,e){if(t!==null){s.beginPath();var a=n[e].textSize?n[e].textSize*h.pix:l.fontSize;s.setFontSize(a);s.setFillStyle(n[e].textColor||h.fontColor);var i=t.value;var r=n[e].formatter?n[e].formatter(i,e,n,h):i;s.setTextAlign("center");var o=t.y-4*h.pix+d*h.pix;if(t.y>c){o=t.y+d*h.pix+a}s.fillText(String(r),t.x,o);s.closePath();s.stroke();s.setTextAlign("left")}})}function drawBarPointText(t,o,n,l,s){var h=o.data;var e=o.textOffset?o.textOffset:0;t.forEach(function(t,e){if(t!==null){l.beginPath();var a=o.textSize?o.textSize*s.pix:n.fontSize;l.setFontSize(a);l.setFillStyle(o.textColor||s.fontColor);var i=h[e];if(typeof h[e]==="object"&&h[e]!==null){i=h[e].value}var r=o.formatter?o.formatter(i,e,o,s):i;l.setTextAlign("left");l.fillText(String(r),t.x+4*s.pix,t.y+a/2-3);l.closePath();l.stroke()}})}function drawGaugeLabel(e,a,i,r,o,n){a-=e.width/2+e.labelOffset*r.pix;a=a<10?10:a;let t;if(e.endAngle=2){l=l%2}s+=x}}function drawRadarLabel(t,s,h,c,d,x){var f=c.extra.radar||{};t.forEach(function(t,e){if(f.labelPointShow===true&&c.categories[e]!==""){var a={x:s*Math.cos(t),y:s*Math.sin(t)};var i=convertCoordinateOrigin(a.x,a.y,h);x.setFillStyle(f.labelPointColor);x.beginPath();x.arc(i.x,i.y,f.labelPointRadius*c.pix,0,2*Math.PI,false);x.closePath();x.fill()}if(f.labelShow===true){var r={x:(s+d.radarLabelTextMargin*c.pix)*Math.cos(t),y:(s+d.radarLabelTextMargin*c.pix)*Math.sin(t)};var o=convertCoordinateOrigin(r.x,r.y,h);var n=o.x;var l=o.y;if(util.approximatelyEqual(r.x,0)){n-=measureText(c.categories[e]||"",d.fontSize,x)/2}else if(r.x<0){n-=measureText(c.categories[e]||"",d.fontSize,x)}x.beginPath();x.setFontSize(d.fontSize);x.setFillStyle(f.labelColor||c.fontColor);x.fillText(c.categories[e]||"",n,l+d.fontSize/2);x.closePath();x.stroke()}})}function drawPieText(n,d,x,f,t,l){var p=x.pieChartLinePadding;var u=[];var g=null;var y=n.map(function(t,e){var a=t.formatter?t.formatter(t,e,n,d):util.toFixed(t._proportion_.toFixed(4)*100)+"%";a=t.labelText?t.labelText:a;var i=2*Math.PI-(t._start_+2*Math.PI*t._proportion_/2);if(t._rose_proportion_){i=2*Math.PI-(t._start_+2*Math.PI*t._rose_proportion_/2)}var r=t.color;var o=t._radius_;return{arc:i,text:a,color:r,radius:o,textColor:t.textColor,textSize:t.textSize,labelShow:t.labelShow}});for(let c=0;c=0?e+x.pieChartTextPadding:e-x.pieChartTextPadding;let n=a;let l=measureText(t.text,t.textSize*d.pix||x.fontSize,f);let s=n;if(g&&util.isSameXCoordinateArea(g.start,{x:o})){if(o>0){s=Math.min(n,g.start.y)}else if(e<0){s=Math.max(n,g.start.y)}else{if(n>0){s=Math.max(n,g.start.y)}else{s=Math.min(n,g.start.y)}}}if(o<0){o-=l}let h={lineStart:{x:i,y:r},lineEnd:{x:e,y:a},start:{x:o,y:s},width:l,height:x.fontSize,text:t.text,color:t.color,textColor:t.textColor,textSize:t.textSize};g=avoidCollision(h,g);u.push(g)}for(let n=0;nr?r:o.activeWidth;var n=e.area[0];var l=e.height-e.area[2];i.beginPath();i.setFillStyle(hexToRgb(o.activeBgColor,o.activeBgOpacity));i.rect(t-o.activeWidth/2,n,o.activeWidth,l-n);i.closePath();i.fill();i.setFillStyle("#FFFFFF")}function drawBarToolTipSplitArea(t,e,a,i,r){var o=assign({},{activeBgColor:"#000000",activeBgOpacity:.08},e.extra.bar);var n=e.area[3];var l=e.width-e.area[1];i.beginPath();i.setFillStyle(hexToRgb(o.activeBgColor,o.activeBgOpacity));i.rect(n,t-r/2,l-n,r);i.closePath();i.fill();i.setFillStyle("#FFFFFF")}function drawToolTip(e,r,o,a,n,i,f){var l=assign({},{showBox:true,showArrow:true,showCategory:false,bgColor:"#000000",bgOpacity:.7,borderColor:"#000000",borderWidth:0,borderRadius:0,borderOpacity:.7,boxPadding:3,fontColor:"#FFFFFF",fontSize:13,lineHeight:20,legendShow:true,legendShape:"auto",splitLine:true},o.extra.tooltip);if(l.showCategory==true&&o.categories){e.unshift({text:o.categories[o.tooltip.index],color:null})}var s=l.fontSize*o.pix;var p=l.lineHeight*o.pix;var h=l.boxPadding*o.pix;var c=s;var u=5*o.pix;if(l.legendShow==false){c=0;u=0}var d=l.showArrow?8*o.pix:0;var g=false;if(o.type=="line"||o.type=="mount"||o.type=="area"||o.type=="candle"||o.type=="mix"){if(l.splitLine==true){drawToolTipSplitLine(o.tooltip.offset.x,o,a,n)}}r=assign({x:0,y:0},r);r.y-=8*o.pix;var y=e.map(function(t){return measureText(t.text,s,n)});var x=c+u+4*h+Math.max.apply(null,y);var v=2*h+e.length*p;if(l.showBox==false){return}if(r.x-Math.abs(o._scrollDistance_||0)+d+x>o.width){g=true}if(v+r.y>o.height){r.y=o.height-v}n.beginPath();n.setFillStyle(hexToRgb(l.bgColor,l.bgOpacity));n.setLineWidth(l.borderWidth*o.pix);n.setStrokeStyle(hexToRgb(l.borderColor,l.borderOpacity));var t=l.borderRadius;if(g){if(x+d>o.width){r.x=o.width+Math.abs(o._scrollDistance_||0)+d+(x-o.width)}if(x>r.x){r.x=o.width+Math.abs(o._scrollDistance_||0)+d+(x-o.width)}if(l.showArrow){n.moveTo(r.x,r.y+10*o.pix);n.lineTo(r.x-d,r.y+10*o.pix+5*o.pix)}n.arc(r.x-d-t,r.y+v-t,t,0,Math.PI/2,false);n.arc(r.x-d-Math.round(x)+t,r.y+v-t,t,Math.PI/2,Math.PI,false);n.arc(r.x-d-Math.round(x)+t,r.y+t,t,-Math.PI,-Math.PI/2,false);n.arc(r.x-d-t,r.y+t,t,-Math.PI/2,0,false);if(l.showArrow){n.lineTo(r.x-d,r.y+10*o.pix-5*o.pix);n.lineTo(r.x,r.y+10*o.pix)}}else{if(l.showArrow){n.moveTo(r.x,r.y+10*o.pix);n.lineTo(r.x+d,r.y+10*o.pix-5*o.pix)}n.arc(r.x+d+t,r.y+t,t,-Math.PI,-Math.PI/2,false);n.arc(r.x+d+Math.round(x)-t,r.y+t,t,-Math.PI/2,0,false);n.arc(r.x+d+Math.round(x)-t,r.y+v-t,t,0,Math.PI/2,false);n.arc(r.x+d+t,r.y+v-t,t,Math.PI/2,Math.PI,false);if(l.showArrow){n.lineTo(r.x+d,r.y+10*o.pix+5*o.pix);n.lineTo(r.x,r.y+10*o.pix)}}n.closePath();n.fill();if(l.borderWidth>0){n.stroke()}if(l.legendShow){e.forEach(function(t,e){if(t.color!==null){n.beginPath();n.setFillStyle(t.color);var a=r.x+d+2*h;var i=r.y+(p-s)/2+p*e+h+1;if(g){a=r.x-x-d+2*h}switch(t.legendShape){case"line":n.moveTo(a,i+.5*c-2*o.pix);n.fillRect(a,i+.5*c-2*o.pix,c,4*o.pix);break;case"triangle":n.moveTo(a+7.5*o.pix,i+.5*c-5*o.pix);n.lineTo(a+2.5*o.pix,i+.5*c+5*o.pix);n.lineTo(a+12.5*o.pix,i+.5*c+5*o.pix);n.lineTo(a+7.5*o.pix,i+.5*c-5*o.pix);break;case"diamond":n.moveTo(a+7.5*o.pix,i+.5*c-5*o.pix);n.lineTo(a+2.5*o.pix,i+.5*c);n.lineTo(a+7.5*o.pix,i+.5*c+5*o.pix);n.lineTo(a+12.5*o.pix,i+.5*c);n.lineTo(a+7.5*o.pix,i+.5*c-5*o.pix);break;case"circle":n.moveTo(a+7.5*o.pix,i+.5*c);n.arc(a+7.5*o.pix,i+.5*c,5*o.pix,0,2*Math.PI);break;case"rect":n.moveTo(a,i+.5*c-5*o.pix);n.fillRect(a,i+.5*c-5*o.pix,15*o.pix,10*o.pix);break;case"square":n.moveTo(a+2*o.pix,i+.5*c-5*o.pix);n.fillRect(a+2*o.pix,i+.5*c-5*o.pix,10*o.pix,10*o.pix);break;default:n.moveTo(a,i+.5*c-5*o.pix);n.fillRect(a,i+.5*c-5*o.pix,15*o.pix,10*o.pix)}n.closePath();n.fill()}})}e.forEach(function(t,e){var a=r.x+d+2*h+c+u;if(g){a=r.x-x-d+2*h+c+u}var i=r.y+p*e+(p-s)/2-1+h+s;n.beginPath();n.setFontSize(s);n.setTextBaseline("normal");n.setFillStyle(l.fontColor);n.fillText(t.text,a,i);n.closePath();n.stroke()})}function drawColumnDataPoints(T,b,S,w){let A=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let t=b.chartData.xAxisData,P=t.xAxisPoints,C=t.eachSpacing;let D=assign({},{type:"group",width:C/2,meterBorder:4,meterFillColor:"#FFFFFF",barBorderCircle:false,barBorderRadius:[],seriesGap:2,linearType:"none",linearOpacity:1,customColor:[],colorStop:0,labelPosition:"outside"},b.extra.column);let M=[];w.save();let L=-2;let F=P.length+2;if(b._scrollDistance_&&b._scrollDistance_!==0&&b.enableScroll===true){w.translate(b._scrollDistance_,0);L=Math.floor(-b._scrollDistance_/C)-2;F=L+b.xAxis.itemCount+4}if(b.tooltip&&b.tooltip.textList&&b.tooltip.textList.length&&A===1){drawToolTipSplitArea(b.tooltip.offset.x,b,S,w,C)}D.customColor=fillCustomColor(D.linearType,D.customColor,T,S);T.forEach(function(a,i){let e,t,o;e=[].concat(b.chartData.yAxisData.ranges[a.index]);t=e.pop();o=e.shift();let x=b.height-b.area[0]-b.area[2];let f=x*(0-t)/(o-t);let n=b.height-Math.round(f)-b.area[2];a.zeroPoints=n;var p=a.data;switch(D.type){case"group":var r=getColumnDataPoints(p,t,o,P,C,b,S,n,A);var u=getStackDataPoints(p,t,o,P,C,b,S,i,T,A);M.push(u);r=fixColumeData(r,C,T.length,i,S,b);for(let t=0;tL&&tn?n:o.y;const d=o.width;const s=Math.abs(n-o.y);if(D.barBorderCircle){D.barBorderRadius=[d/2,d/2,0,0]}if(o.y>n){D.barBorderRadius=[0,0,d/2,d/2]}let[t,e,a,i]=D.barBorderRadius;let r=Math.min(d/2,s/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;w.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);w.arc(h+d-e,c+e,e,-Math.PI/2,0);w.arc(h+d-a,c+s-a,a,0,Math.PI/2);w.arc(h+i,c+s-i,i,Math.PI/2,Math.PI)}else{w.moveTo(l,o.y);w.lineTo(l+o.width,o.y);w.lineTo(l+o.width,n);w.lineTo(l,n);w.lineTo(l,o.y);w.setLineWidth(1);w.setStrokeStyle(y)}w.setFillStyle(g);w.closePath();w.fill()}};break;case"stack":var r=getStackDataPoints(p,t,o,P,C,b,S,i,T,A);M.push(r);r=fixColumeStackData(r,C,T.length,i,S,b,T);for(let e=0;eL&&e0){s-=m}w.setFillStyle(g);w.moveTo(l,t.y);w.fillRect(l,t.y,t.width,s);w.closePath();w.fill()}};break;case"meter":var r=getDataPoints(p,t,o,P,C,b,S,A);M.push(r);r=fixColumeMeterData(r,C,T.length,i,S,b,D.meterBorder);for(let t=0;tL&&t0){w.setStrokeStyle(a.color);w.setLineWidth(D.meterBorder*b.pix)}if(i==0){w.setFillStyle(D.meterFillColor)}else{w.setFillStyle(o.color||a.color)}var l=o.x-o.width/2;var s=b.height-o.y-b.area[2];if(D.barBorderRadius&&D.barBorderRadius.length===4||D.barBorderCircle===true){const h=l;const c=o.y;const d=o.width;const s=n-o.y;if(D.barBorderCircle){D.barBorderRadius=[d/2,d/2,0,0]}let[t,e,a,i]=D.barBorderRadius;let r=Math.min(d/2,s/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;w.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);w.arc(h+d-e,c+e,e,-Math.PI/2,0);w.arc(h+d-a,c+s-a,a,0,Math.PI/2);w.arc(h+i,c+s-i,i,Math.PI/2,Math.PI);w.fill()}else{w.moveTo(l,o.y);w.lineTo(l+o.width,o.y);w.lineTo(l+o.width,n);w.lineTo(l,n);w.lineTo(l,o.y);w.fill()}if(i==0&&D.meterBorder>0){w.closePath();w.stroke()}}}break}});if(b.dataLabel!==false&&A===1){T.forEach(function(t,e){let a,i,r;a=[].concat(b.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;switch(D.type){case"group":var n=getColumnDataPoints(o,i,r,P,C,b,S,A);n=fixColumeData(n,C,T.length,e,S,b);drawColumePointText(n,t,S,w,b);break;case"stack":var n=getStackDataPoints(o,i,r,P,C,b,S,e,T,A);drawColumePointText(n,t,S,w,b);break;case"meter":var n=getDataPoints(o,i,r,P,C,b,S,A);drawColumePointText(n,t,S,w,b);break}})}w.restore();return{xAxisPoints:P,calPoints:M,eachSpacing:C}}function drawMountDataPoints(i,r,o,n){let f=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let t=r.chartData.xAxisData,p=t.xAxisPoints,l=t.eachSpacing;let s=assign({},{type:"mount",widthRatio:1,borderWidth:1,barBorderCircle:false,barBorderRadius:[],linearType:"none",linearOpacity:1,customColor:[],colorStop:0},r.extra.mount);s.widthRatio=s.widthRatio<=0?0:s.widthRatio;s.widthRatio=s.widthRatio>=2?2:s.widthRatio;let e=[];n.save();let u=-2;let g=p.length+2;if(r._scrollDistance_&&r._scrollDistance_!==0&&r.enableScroll===true){n.translate(r._scrollDistance_,0);u=Math.floor(-r._scrollDistance_/l)-2;g=u+r.xAxis.itemCount+4}s.customColor=fillCustomColor(s.linearType,s.customColor,i,o);let y,v,m;y=[].concat(r.chartData.yAxisData.ranges[0]);v=y.pop();m=y.shift();let T=r.height-r.area[0]-r.area[2];let b=T*(0-v)/(m-v);let h=r.height-Math.round(b)-r.area[2];var c=getMountDataPoints(i,v,m,p,l,r,s,h,f);switch(s.type){case"bar":for(let t=0;tu&&th?h:o.y;const C=o.width;const S=Math.abs(h-o.y);if(s.barBorderCircle){s.barBorderRadius=[C/2,C/2,0,0]}if(o.y>h){s.barBorderRadius=[0,0,C/2,C/2]}let[t,e,a,i]=s.barBorderRadius;let r=Math.min(C/2,S/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;n.arc(A+t,P+t,t,-Math.PI,-Math.PI/2);n.arc(A+C-e,P+e,e,-Math.PI/2,0);n.arc(A+C-a,P+S-a,a,0,Math.PI/2);n.arc(A+i,P+S-i,i,Math.PI/2,Math.PI)}else{n.moveTo(d,o.y);n.lineTo(d+o.width,o.y);n.lineTo(d+o.width,h);n.lineTo(d,h);n.lineTo(d,o.y)}n.setStrokeStyle(w);n.setFillStyle(a);if(s.borderWidth>0){n.setLineWidth(s.borderWidth*r.pix);n.closePath();n.stroke()}n.fill()}};break;case"triangle":for(let e=0;eu&&e0){n.setLineWidth(s.borderWidth*r.pix);n.stroke()}n.fill()}};break;case"mount":for(let e=0;eu&&e0){n.setLineWidth(s.borderWidth*r.pix);n.stroke()}n.fill()}};break;case"sharp":for(let e=0;eu&&e0){n.setLineWidth(s.borderWidth*r.pix);n.stroke()}n.fill()}};break}if(r.dataLabel!==false&&f===1){let t,e,a;t=[].concat(r.chartData.yAxisData.ranges[0]);e=t.pop();a=t.shift();var c=getMountDataPoints(i,e,a,p,l,r,s,h,f);drawMountPointText(c,i,o,n,r,h)}n.restore();return{xAxisPoints:p,calPoints:c,eachSpacing:l}}function drawBarDataPoints(y,v,m,T){let b=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let S=[];let w=(v.height-v.area[0]-v.area[2])/v.categories.length;for(let t=0;tC&&tr?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;T.arc(g+i,c+i,i,-Math.PI,-Math.PI/2);T.arc(o.x-t,c+t,t,-Math.PI/2,0);T.arc(o.x-e,c+h-e,e,0,Math.PI/2);T.arc(g+a,c+h-a,a,Math.PI/2,Math.PI)}else{T.moveTo(n,r);T.lineTo(o.x,r);T.lineTo(o.x,r+o.width);T.lineTo(n,r+o.width);T.lineTo(n,r);T.setLineWidth(1);T.setStrokeStyle(u)}T.setFillStyle(l);T.closePath();T.fill()}};break;case"stack":var i=getBarStackDataPoints(x,e,d,S,w,v,m,t,y,b);P.push(i);i=fixBarStackData(i,w,y.length,t,m,v,y);for(let e=0;eC&&e5&&arguments[5]!==undefined?arguments[5]:1;var s=assign({},{color:{},average:{}},h.extra.candle);s.color=assign({},{upLine:"#f04864",upFill:"#f04864",downLine:"#2fc25b",downFill:"#2fc25b"},s.color);s.average=assign({},{show:false,name:[],day:[],color:c.color},s.average);h.extra.candle=s;let a=h.chartData.xAxisData,x=a.xAxisPoints,f=a.eachSpacing;let y=[];d.save();let p=-2;let v=x.length+2;let u=0;let m=h.width+f;if(h._scrollDistance_&&h._scrollDistance_!==0&&h.enableScroll===true){d.translate(h._scrollDistance_,0);p=Math.floor(-h._scrollDistance_/f)-2;v=p+h.xAxis.itemCount+4;u=-h._scrollDistance_-f*2+h.area[3];m=u+(h.xAxis.itemCount+4)*f}if(s.average.show||t){t.forEach(function(e,t){let a,i,r;a=[].concat(h.chartData.yAxisData.ranges[e.index]);i=a.pop();r=a.shift();var o=e.data;var n=getDataPoints(o,i,r,x,f,h,c,g);var l=splitPoints(n,e);for(let t=0;tu){d.moveTo(t.x,t.y);a=1}if(e>0&&t.x>u&&t.xp&&e0){d.setStrokeStyle(s.color.upLine);d.setFillStyle(s.color.upFill);d.setLineWidth(1*h.pix);d.moveTo(t[3].x,t[3].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[1].x-f/4,t[1].y);d.lineTo(t[0].x-f/4,t[0].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[2].x,t[2].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[0].x+f/4,t[0].y);d.lineTo(t[1].x+f/4,t[1].y);d.lineTo(t[1].x,t[1].y);d.moveTo(t[3].x,t[3].y)}else{d.setStrokeStyle(s.color.downLine);d.setFillStyle(s.color.downFill);d.setLineWidth(1*h.pix);d.moveTo(t[3].x,t[3].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[0].x-f/4,t[0].y);d.lineTo(t[1].x-f/4,t[1].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[2].x,t[2].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[1].x+f/4,t[1].y);d.lineTo(t[0].x+f/4,t[0].y);d.lineTo(t[0].x,t[0].y);d.moveTo(t[3].x,t[3].y)}d.closePath();d.fill();d.stroke()}}});d.restore();return{xAxisPoints:x,calPoints:y,eachSpacing:f}}function drawAreaDataPoints(t,s,h,c){var d=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var x=assign({},{type:"straight",opacity:.2,addLine:false,width:2,gradient:false,activeType:"none"},s.extra.area);let e=s.chartData.xAxisData,f=e.xAxisPoints,p=e.eachSpacing;let y=s.height-s.area[2];let v=[];c.save();let u=0;let g=s.width+p;if(s._scrollDistance_&&s._scrollDistance_!==0&&s.enableScroll===true){c.translate(s._scrollDistance_,0);u=-s._scrollDistance_-p*2+s.area[3];g=u+(s.xAxis.itemCount+4)*p}t.forEach(function(e,t){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[e.index]);i=a.pop();r=a.shift();let o=e.data;let n=getDataPoints(o,i,r,f,p,s,h,d);v.push(n);let l=splitPoints(n,e);for(let t=0;t1){let t=r[0];let e=r[r.length-1];c.moveTo(t.x,t.y);let i=0;if(x.type==="curve"){for(let a=0;au){c.moveTo(e.x,e.y);i=1}if(a>0&&e.x>u&&e.xu){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>u&&t.xu){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>u&&t.xu){c.moveTo(e.x,e.y);i=1}if(a>0&&e.x>u&&e.xu){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>u&&t.xu){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>u&&t.x4&&arguments[4]!==undefined?arguments[4]:1;var i=assign({},{type:"circle"},s.extra.scatter);let e=s.chartData.xAxisData,x=e.xAxisPoints,f=e.eachSpacing;var r=[];c.save();let a=0;let o=s.width+f;if(s._scrollDistance_&&s._scrollDistance_!==0&&s.enableScroll===true){c.translate(s._scrollDistance_,0);a=-s._scrollDistance_-f*2+s.area[3];o=a+(s.xAxis.itemCount+4)*f}t.forEach(function(t,e){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,x,f,s,h,d);c.beginPath();c.setStrokeStyle(t.color);c.setFillStyle(t.color);c.setLineWidth(1*s.pix);var l=t.pointShape;if(l==="diamond"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x,t.y-4.5);c.lineTo(t.x-4.5,t.y);c.lineTo(t.x,t.y+4.5);c.lineTo(t.x+4.5,t.y);c.lineTo(t.x,t.y-4.5)}})}else if(l==="circle"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x+2.5*s.pix,t.y);c.arc(t.x,t.y,3*s.pix,0,2*Math.PI,false)}})}else if(l==="square"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x-3.5,t.y-3.5);c.rect(t.x-3.5,t.y-3.5,7,7)}})}else if(l==="triangle"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x,t.y-4.5);c.lineTo(t.x-4.5,t.y+4.5);c.lineTo(t.x+4.5,t.y+4.5);c.lineTo(t.x,t.y-4.5)}})}else if(l==="triangle"){return}c.closePath();c.fill();c.stroke()});if(s.dataLabel!==false&&d===1){t.forEach(function(t,e){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,x,f,s,h,d);drawPointText(n,t,h,c,s)})}c.restore();return{xAxisPoints:x,calPoints:r,eachSpacing:f}}function drawBubbleDataPoints(a,l,s,h){var c=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var d=assign({},{opacity:1,border:2},l.extra.bubble);let t=l.chartData.xAxisData,x=t.xAxisPoints,f=t.eachSpacing;var i=[];h.save();let e=0;let r=l.width+f;if(l._scrollDistance_&&l._scrollDistance_!==0&&l.enableScroll===true){h.translate(l._scrollDistance_,0);e=-l._scrollDistance_-f*2+l.area[3];r=e+(l.xAxis.itemCount+4)*f}a.forEach(function(i,t){let e,a,r;e=[].concat(l.chartData.yAxisData.ranges[i.index]);a=e.pop();r=e.shift();var o=i.data;var n=getDataPoints(o,a,r,x,f,l,s,c);h.beginPath();h.setStrokeStyle(i.color);h.setLineWidth(d.border*l.pix);h.setFillStyle(hexToRgb(i.color,d.opacity));n.forEach(function(t,e){h.moveTo(t.x+t.r,t.y);h.arc(t.x,t.y,t.r*l.pix,0,2*Math.PI,false)});h.closePath();h.fill();h.stroke();if(l.dataLabel!==false&&c===1){n.forEach(function(t,e){h.beginPath();var a=i.textSize*l.pix||s.fontSize;h.setFontSize(a);h.setFillStyle(i.textColor||"#FFFFFF");h.setTextAlign("center");h.fillText(String(t.t),t.x,t.y+a/2);h.closePath();h.stroke();h.setTextAlign("left")})}});h.restore();return{xAxisPoints:x,calPoints:i,eachSpacing:f}}function drawLineDataPoints(t,d,x,f){var p=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var u=assign({},{type:"straight",width:2,activeType:"none",linearType:"none",onShadow:false,animation:"vertical"},d.extra.line);u.width*=d.pix;let e=d.chartData.xAxisData,g=e.xAxisPoints,y=e.eachSpacing;var T=[];f.save();let v=0;let m=d.width+y;if(d._scrollDistance_&&d._scrollDistance_!==0&&d.enableScroll===true){f.translate(d._scrollDistance_,0);v=-d._scrollDistance_-y*2+d.area[3];m=v+(d.xAxis.itemCount+4)*y}t.forEach(function(e,c){f.beginPath();f.setStrokeStyle(e.color);f.moveTo(-1e4,-1e4);f.lineTo(-10001,-10001);f.stroke();let t,a,i;t=[].concat(d.chartData.yAxisData.ranges[e.index]);a=t.pop();i=t.shift();var r=e.data;var o=getLineDataPoints(r,a,i,g,y,d,x,u,p);T.push(o);var n=splitPoints(o,e);if(e.lineType=="dash"){let t=e.dashLength?e.dashLength:8;t*=d.pix;f.setLineDash([t,t])}f.beginPath();var l=e.color;if(u.linearType!=="none"&&e.linearColor&&e.linearColor.length>0){var s=f.createLinearGradient(d.chartData.xAxisData.startX,d.height/2,d.chartData.xAxisData.endX,d.height/2);for(var h=0;h0){f.setShadow(e.setShadow[0],e.setShadow[1],e.setShadow[2],e.setShadow[3])}else{f.setShadow(0,0,0,"rgba(0,0,0,0)")}f.setLineWidth(u.width);n.forEach(function(i,t){if(i.length===1){f.moveTo(i[0].x,i[0].y)}else{f.moveTo(i[0].x,i[0].y);let a=0;if(u.type==="curve"){for(let e=0;ev){f.moveTo(t.x,t.y);a=1}if(e>0&&t.x>v&&t.xv){f.moveTo(t.x,t.y);a=1}if(e>0&&t.x>v&&t.xv){f.moveTo(t.x,t.y);a=1}if(e>0&&t.x>v&&t.x4&&arguments[4]!==undefined?arguments[4]:1;let e=v.chartData.xAxisData,b=e.xAxisPoints,S=e.eachSpacing;let w=assign({},{width:S/2,barBorderCircle:false,barBorderRadius:[],seriesGap:2,linearType:"none",linearOpacity:1,customColor:[],colorStop:0},v.extra.mix.column);let A=assign({},{opacity:.2,gradient:false},v.extra.mix.area);let M=assign({},{width:2},v.extra.mix.line);let L=v.height-v.area[2];let F=[];var _=0;var k=0;t.forEach(function(t,e){if(t.type=="column"){k+=1}});T.save();let R=-2;let I=b.length+2;let P=0;let C=v.width+S;if(v._scrollDistance_&&v._scrollDistance_!==0&&v.enableScroll===true){T.translate(v._scrollDistance_,0);R=Math.floor(-v._scrollDistance_/S)-2;I=R+v.xAxis.itemCount+4;P=-v._scrollDistance_-S*2+v.area[3];C=P+(v.xAxis.itemCount+4)*S}w.customColor=fillCustomColor(w.linearType,w.customColor,t,m);t.forEach(function(n,t){let o,x,f;o=[].concat(v.chartData.yAxisData.ranges[n.index]);x=o.pop();f=o.shift();var p=n.data;var a=getDataPoints(p,x,f,b,S,v,m,D);F.push(a);if(n.type=="column"){a=fixColumeData(a,S,k,_,m,v);for(let t=0;tR&&tr?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;T.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);T.arc(h+d-e,c+e,e,-Math.PI/2,0);T.arc(h+d-a,c+s-a,a,0,Math.PI/2);T.arc(h+i,c+s-i,i,Math.PI/2,Math.PI)}else{T.moveTo(l,o.y);T.lineTo(l+o.width,o.y);T.lineTo(l+o.width,v.height-v.area[2]);T.lineTo(l,v.height-v.area[2]);T.lineTo(l,o.y);T.setLineWidth(1);T.setStrokeStyle(u)}T.setFillStyle(e);T.closePath();T.fill()}}_+=1}if(n.type=="area"){let e=splitPoints(a,n);for(let t=0;t1){var r=i[0];let t=i[i.length-1];T.moveTo(r.x,r.y);let a=0;if(n.style==="curve"){for(let e=0;eP){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>P&&t.xP){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>P&&t.xP){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>P&&t.xP){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>P&&t.x1){if(h.extra.mount.widthRatio>2)h.extra.mount.widthRatio=2;l+=(h.extra.mount.widthRatio-1)*f}var s=n*n/l;var y=0;if(h._scrollDistance_){y=-h._scrollDistance_*n/l}d.beginPath();d.setLineCap("round");d.setLineWidth(6*h.pix);d.setStrokeStyle(h.xAxis.scrollBackgroundColor||"#EFEBEF");d.moveTo(t,o);d.lineTo(a,o);d.stroke();d.closePath();d.beginPath();d.setLineCap("round");d.setLineWidth(6*h.pix);d.setStrokeStyle(h.xAxis.scrollColor||"#A6A6A6");d.moveTo(t+y,o);d.lineTo(t+y+s,o);d.stroke();d.closePath();d.setLineCap("butt")}d.save();if(h._scrollDistance_&&h._scrollDistance_!==0){d.translate(h._scrollDistance_,0)}if(h.xAxis.calibration===true){d.setStrokeStyle(h.xAxis.gridColor||"#cccccc");d.setLineCap("butt");d.setLineWidth(1*h.pix);x.forEach(function(t,e){if(e>0){d.beginPath();d.moveTo(t-f/2,u);d.lineTo(t-f/2,u+3*h.pix);d.closePath();d.stroke()}})}if(h.xAxis.disableGrid!==true){d.setStrokeStyle(h.xAxis.gridColor||"#cccccc");d.setLineCap("butt");d.setLineWidth(1*h.pix);if(h.xAxis.gridType=="dash"){d.setLineDash([h.xAxis.dashLength*h.pix,h.xAxis.dashLength*h.pix])}h.xAxis.gridEval=h.xAxis.gridEval||1;x.forEach(function(t,e){if(e%h.xAxis.gridEval==0){d.beginPath();d.moveTo(t,u);d.lineTo(t,i);d.stroke()}});d.setLineDash([])}if(h.xAxis.disabled!==true){let t=r.length;if(h.xAxis.labelCount){if(h.xAxis.itemCount){t=Math.ceil(r.length/h.xAxis.itemCount*h.xAxis.labelCount)}else{t=h.xAxis.labelCount}t-=1}let e=Math.ceil(r.length/t);let a=[];let i=r.length;for(let t=0;t=h.area[3]-1&&n-Math.abs(o)<=h.width-h.area[1]+1){d.beginPath();d.setFontSize(g);d.setFillStyle(h.xAxis.fontColor||h.fontColor);d.fillText(String(a),x[e]+i,u+h.xAxis.marginTop*h.pix+(h.xAxis.lineHeight-h.xAxis.fontSize)*h.pix/2+h.xAxis.fontSize*h.pix);d.closePath();d.stroke()}})}else{a.forEach(function(t,e){var a=h.xAxis.formatter?h.xAxis.formatter(t):t;var i=h._scrollDistance_||0;var r=p=="center"?x[e]+f/2:x[e];if(r-Math.abs(i)>=h.area[3]-1&&r-Math.abs(i)<=h.width-h.area[1]+1){d.save();d.beginPath();d.setFontSize(g);d.setFillStyle(h.xAxis.fontColor||h.fontColor);var o=measureText(String(a),g,d);var n=x[e];if(p=="center"){n=x[e]+f/2}var l=0;if(h.xAxis.scrollShow){l=6*h.pix}var s=u+h.xAxis.marginTop*h.pix+g-g*Math.abs(Math.sin(c._xAxisTextAngle_));if(h.xAxis.rotateAngle<0){n-=g/2;o=0}else{n+=g/2;o=-o}d.translate(n,s);d.rotate(-1*c._xAxisTextAngle_);d.fillText(String(a),o,0);d.closePath();d.stroke();d.restore()}})}}d.restore();if(h.xAxis.title){d.beginPath();d.setFontSize(h.xAxis.titleFontSize*h.pix);d.setFillStyle(h.xAxis.titleFontColor);d.fillText(String(h.xAxis.title),h.width-h.area[1]+h.xAxis.titleOffsetX*h.pix,h.height-h.area[2]+h.xAxis.marginTop*h.pix+(h.xAxis.lineHeight-h.xAxis.titleFontSize)*h.pix/2+(h.xAxis.titleFontSize+h.xAxis.titleOffsetY)*h.pix);d.closePath();d.stroke()}if(h.xAxis.axisLine){d.beginPath();d.setStrokeStyle(h.xAxis.axisLineColor);d.setLineWidth(1*h.pix);d.moveTo(t,h.height-h.area[2]);d.lineTo(a,h.height-h.area[2]);d.stroke()}}function drawYAxisGrid(c,e,d,a){if(e.yAxis.disableGrid===true){return}let t=e.height-e.area[0]-e.area[2];let i=t/e.yAxis.splitNumber;let r=e.area[3];let o=e.chartData.xAxisData.xAxisPoints,n=e.chartData.xAxisData.eachSpacing;let l=n*(o.length-1);if(e.type=="mount"&&e.extra&&e.extra.mount&&e.extra.mount.widthRatio&&e.extra.mount.widthRatio>1){if(e.extra.mount.widthRatio>2)e.extra.mount.widthRatio=2;l+=(e.extra.mount.widthRatio-1)*n}let x=r+l;let s=[];let h=1;if(e.xAxis.axisLine===false){h=0}for(let t=h;t4&&arguments[4]!==undefined?arguments[4]:1;var n=assign({},{activeOpacity:.5,activeRadius:10,offsetAngle:0,labelWidth:15,ringWidth:30,customRadius:0,border:false,borderWidth:2,borderColor:"#FFFFFF",centerColor:"#FFFFFF",linearType:"none",customColor:[]},r.type=="pie"?r.extra.pie:r.extra.ring);var l={x:r.area[3]+(r.width-r.area[1]-r.area[3])/2,y:r.area[0]+(r.height-r.area[0]-r.area[2])/2};if(e.pieChartLinePadding==0){e.pieChartLinePadding=n.activeRadius*r.pix}var i=Math.min((r.width-r.area[1]-r.area[3])/2-e.pieChartLinePadding-e.pieChartTextPadding-e._pieTextMaxLength_,(r.height-r.area[0]-r.area[2])/2-e.pieChartLinePadding-e.pieChartTextPadding);i=i<10?10:i;if(n.customRadius>0){i=n.customRadius*r.pix}t=getPieDataPoints(t,i,a);var h=n.activeRadius*r.pix;n.customColor=fillCustomColor(n.linearType,n.customColor,t,e);t=t.map(function(t){t._start_+=n.offsetAngle*Math.PI/180;return t});t.forEach(function(t,e){if(r.tooltip){if(r.tooltip.index==e){o.beginPath();o.setFillStyle(hexToRgb(t.color,n.activeOpacity||.5));o.moveTo(l.x,l.y);o.arc(l.x,l.y,t._radius_+h,t._start_,t._start_+2*t._proportion_*Math.PI);o.closePath();o.fill()}}o.beginPath();o.setLineWidth(n.borderWidth*r.pix);o.lineJoin="round";o.setStrokeStyle(n.borderColor);var a=t.color;if(n.linearType=="custom"){var i;if(o.createCircularGradient){i=o.createCircularGradient(l.x,l.y,t._radius_)}else{i=o.createRadialGradient(l.x,l.y,0,l.x,l.y,t._radius_)}i.addColorStop(0,hexToRgb(n.customColor[t.linearIndex],1));i.addColorStop(1,hexToRgb(t.color,1));a=i}o.setFillStyle(a);o.moveTo(l.x,l.y);o.arc(l.x,l.y,t._radius_,t._start_,t._start_+2*t._proportion_*Math.PI);o.closePath();o.fill();if(n.border==true){o.stroke()}});if(r.type==="ring"){var s=i*.6;if(typeof n.ringWidth==="number"&&n.ringWidth>0){s=Math.max(0,i-n.ringWidth*r.pix)}o.beginPath();o.setFillStyle(n.centerColor);o.moveTo(l.x,l.y);o.arc(l.x,l.y,s,0,2*Math.PI);o.closePath();o.fill()}if(r.dataLabel!==false&&a===1){drawPieText(t,r,e,o,i,l)}if(a===1&&r.type==="ring"){drawRingTitle(r,e,o,l)}return{center:l,radius:i,series:t}}function drawRoseDataPoints(t,r,e,o){var a=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var n=assign({},{type:"area",activeOpacity:.5,activeRadius:10,offsetAngle:0,labelWidth:15,border:false,borderWidth:2,borderColor:"#FFFFFF",linearType:"none",customColor:[]},r.extra.rose);if(e.pieChartLinePadding==0){e.pieChartLinePadding=n.activeRadius*r.pix}var l={x:r.area[3]+(r.width-r.area[1]-r.area[3])/2,y:r.area[0]+(r.height-r.area[0]-r.area[2])/2};var i=Math.min((r.width-r.area[1]-r.area[3])/2-e.pieChartLinePadding-e.pieChartTextPadding-e._pieTextMaxLength_,(r.height-r.area[0]-r.area[2])/2-e.pieChartLinePadding-e.pieChartTextPadding);i=i<10?10:i;var s=n.minRadius||i*.5;if(i4&&arguments[4]!==undefined?arguments[4]:1;var o=assign({},{startAngle:.75,endAngle:.25,type:"default",direction:"cw",lineCap:"round",width:12,gap:2,linearType:"none",customColor:[]},i.extra.arcbar);a=getArcbarDataPoints(a,o,e);var n;if(o.centerX||o.centerY){n={x:o.centerX?o.centerX:i.width/2,y:o.centerY?o.centerY:i.height/2}}else{n={x:i.width/2,y:i.height/2}}var l;if(o.radius){l=o.radius}else{l=Math.min(n.x,n.y);l-=5*i.pix;l-=o.width/2}l=l<10?10:l;o.customColor=fillCustomColor(o.linearType,o.customColor,a,t);for(let e=0;e5&&arguments[5]!==undefined?arguments[5]:1;var f=assign({},{type:"default",startAngle:.75,endAngle:.25,width:15,labelOffset:13,splitLine:{fixRadius:0,splitNumber:10,width:15,color:"#FFFFFF",childNumber:5,childWidth:5},pointer:{width:15,color:"auto"}},c.extra.gauge);if(f.oldAngle==undefined){f.oldAngle=f.startAngle}if(f.oldData==undefined){f.oldData=0}n=getGaugeAxisPoints(n,f.startAngle,f.endAngle);var p={x:c.width/2,y:c.height/2};var u=Math.min(p.x,p.y);u-=5*c.pix;u-=f.width/2;u=u<10?10:u;var g=u-f.width;var y=0;if(f.type=="progress"){var v=u-f.width*3;d.beginPath();let t=d.createLinearGradient(p.x,p.y-v,p.x,p.y+v);t.addColorStop("0",hexToRgb(h[0].color,.3));t.addColorStop("1.0",hexToRgb("#FFFFFF",.1));d.setFillStyle(t);d.arc(p.x,p.y,v,0,2*Math.PI,false);d.fill();d.setLineWidth(f.width);d.setStrokeStyle(hexToRgb(h[0].color,.3));d.setLineCap("round");d.beginPath();d.arc(p.x,p.y,g,f.startAngle*Math.PI,f.endAngle*Math.PI,false);d.stroke();if(f.endAnglet/o){d.setStrokeStyle(hexToRgb(h[0].color,1))}else{d.setStrokeStyle(hexToRgb(h[0].color,.3))}d.setLineWidth(3*c.pix);d.moveTo(i,0);d.lineTo(r,0);d.stroke();d.rotate(a*Math.PI)}d.restore();h=getGaugeArcbarDataPoints(h,f,x);d.setLineWidth(f.width);d.setStrokeStyle(h[0].color);d.setLineCap("round");d.beginPath();d.arc(p.x,p.y,g,f.startAngle*Math.PI,h[0]._proportion_*Math.PI,false);d.stroke();let l=u-f.width*2.5;d.save();d.translate(p.x,p.y);d.rotate((h[0]._proportion_-1)*Math.PI);d.beginPath();d.setLineWidth(f.width/3);let s=d.createLinearGradient(0,-l*.6,0,l*.6);s.addColorStop("0",hexToRgb("#FFFFFF",0));s.addColorStop("0.5",hexToRgb(h[0].color,1));s.addColorStop("1.0",hexToRgb("#FFFFFF",0));d.setStrokeStyle(s);d.arc(0,0,l,.85*Math.PI,1.15*Math.PI,false);d.stroke();d.beginPath();d.setLineWidth(1);d.setStrokeStyle(h[0].color);d.setFillStyle(h[0].color);d.moveTo(-l-f.width/3/2,-4);d.lineTo(-l-f.width/3/2-4,0);d.lineTo(-l-f.width/3/2,4);d.lineTo(-l-f.width/3/2,-4);d.stroke();d.fill();d.restore()}else{d.setLineWidth(f.width);d.setLineCap("butt");for(let e=0;e4&&arguments[4]!==undefined?arguments[4]:1;var s=assign({},{gridColor:"#cccccc",gridType:"radar",gridEval:1,axisLabel:false,axisLabelTofix:0,labelShow:true,labelColor:"#666666",labelPointShow:false,labelPointRadius:3,labelPointColor:"#cccccc",opacity:.2,gridCount:3,border:false,borderWidth:2,linearType:"none",customColor:[]},n.extra.radar);var a=getRadarCoordinateSeries(n.categories.length);var h={x:n.area[3]+(n.width-n.area[1]-n.area[3])/2,y:n.area[0]+(n.height-n.area[0]-n.area[2])/2};var r=(n.width-n.area[1]-n.area[3])/2;var d=(n.height-n.area[0]-n.area[2])/2;var c=Math.min(r-(getMaxTextListLength(n.categories,i.fontSize,l)+i.radarLabelTextMargin),d-i.radarLabelTextMargin);c-=i.radarLabelTextMargin*n.pix;c=c<10?10:c;c=s.radius?s.radius:c;l.beginPath();l.setLineWidth(1*n.pix);l.setStrokeStyle(s.gridColor);a.forEach(function(t,e){var a=convertCoordinateOrigin(c*Math.cos(t),c*Math.sin(t),h);l.moveTo(h.x,h.y);if(e%s.gridEval==0){l.lineTo(a.x,a.y)}});l.stroke();l.closePath();var x=function t(i){var r={};l.beginPath();l.setLineWidth(1*n.pix);l.setStrokeStyle(s.gridColor);if(s.gridType=="radar"){a.forEach(function(t,e){var a=convertCoordinateOrigin(c/s.gridCount*i*Math.cos(t),c/s.gridCount*i*Math.sin(t),h);if(e===0){r=a;l.moveTo(a.x,a.y)}else{l.lineTo(a.x,a.y)}});l.lineTo(r.x,r.y)}else{var e=convertCoordinateOrigin(c/s.gridCount*i*Math.cos(1.5),c/s.gridCount*i*Math.sin(1.5),h);l.arc(h.x,h.y,h.y-e.y,0,2*Math.PI,false)}l.stroke();l.closePath()};for(var e=1;e<=s.gridCount;e++){x(e)}s.customColor=fillCustomColor(s.linearType,s.customColor,o,i);var f=getRadarDataPoints(a,h,c,o,n,t);f.forEach(function(t,e){l.beginPath();l.setLineWidth(s.borderWidth*n.pix);l.setStrokeStyle(t.color);var a=hexToRgb(t.color,s.opacity);if(s.linearType=="custom"){var i;if(l.createCircularGradient){i=l.createCircularGradient(h.x,h.y,c)}else{i=l.createRadialGradient(h.x,h.y,0,h.x,h.y,c)}i.addColorStop(0,hexToRgb(s.customColor[o[e].linearIndex],s.opacity));i.addColorStop(1,hexToRgb(t.color,s.opacity));a=i}l.setFillStyle(a);t.data.forEach(function(t,e){if(e===0){l.moveTo(t.position.x,t.position.y)}else{l.lineTo(t.position.x,t.position.y)}});l.closePath();l.fill();if(s.border===true){l.stroke()}l.closePath();if(n.dataPointShape!==false){var r=t.data.map(function(t){return t.position});drawPointShape(r,t.color,t.pointShape,l,n)}});if(s.axisLabel===true){const p=Math.max(s.max,Math.max.apply(null,dataCombine(o)));const u=c/s.gridCount;const g=n.fontSize*n.pix;l.setFontSize(g);l.setFillStyle(n.fontColor);l.setTextAlign("left");for(var e=0;eh.x?e.xMax:h.x;e.yMin=e.yMinh.y?e.yMax:h.y}}}return e}function coordinateToPoint(t,e,a,i,r,o){return{x:(e-a.xMin)*i+r,y:(a.yMax-t)*i+o}}function pointToCoordinate(t,e,a,i,r,o){return{x:(e-r)/i+a.xMin,y:a.yMax-(t-o)/i}}function isRayIntersectsSegment(t,e,a){if(e[1]==a[1]){return false}if(e[1]>t[1]&&a[1]>t[1]){return false}if(e[1]t[1]){return false}if(a[1]==t[1]&&e[1]>t[1]){return false}if(e[0]a[t].area[2]||e[1]>a[t].area[3]||e[2]i||e[3]>r){o=true;break}else{o=false}}else{o=true;break}}}return o}function getWordCloudPoint(c,t,d){let x=c.series;switch(t){case"normal":for(let l=0;l.7){return true}else{return false}};for(let h=0;h4&&arguments[4]!==undefined?arguments[4]:1;let a=assign({},{type:"normal",autoColors:true},r.extra.word);if(!r.chartData.wordCloudData){r.chartData.wordCloudData=getWordCloudPoint(r,a.type,o)}o.beginPath();o.setFillStyle(r.background);o.rect(0,0,r.width,r.height);o.fill();o.save();let l=r.chartData.wordCloudData;o.translate(r.width/2,r.height/2);for(let i=0;i0){if(r.tooltip){if(r.tooltip.index==i){o.strokeText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}else{o.fillText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}}else{o.fillText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}}}else{if(l[i].area[0]>0){if(r.tooltip){if(r.tooltip.index==i){o.strokeText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}else{o.fillText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}}else{o.fillText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}}}o.stroke();o.restore()}o.restore()}function drawFunnelDataPoints(t,e,c,a){let d=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let i=assign({},{type:"funnel",activeWidth:10,activeOpacity:.3,border:false,borderWidth:2,borderColor:"#FFFFFF",fillOpacity:1,minSize:0,labelAlign:"right",linearType:"none",customColor:[]},e.extra.funnel);let r=(e.height-e.area[0]-e.area[2])/t.length;let o={x:e.area[3]+(e.width-e.area[1]-e.area[3])/2,y:e.height-e.area[2]};let n=i.activeWidth*e.pix;let x=Math.min((e.width-e.area[1]-e.area[3])/2-n,(e.height-e.area[0]-e.area[2])/2-n);let l=getFunnelDataPoints(t,x,i,r,d);a.save();a.translate(o.x,o.y);i.customColor=fillCustomColor(i.linearType,i.customColor,t,c);if(i.type=="pyramid"){for(let t=0;t0){l.area[3]+=i[t].width+l.yAxis.padding*l.pix}else{l.area[3]+=i[t].width}a+=1}else if(i[t].position=="right"){if(e>0){l.area[1]+=i[t].width+l.yAxis.padding*l.pix}else{l.area[1]+=i[t].width}e+=1}}}else{n.yAxisWidth=i}l.chartData.yAxisData=f;if(l.categories&&l.categories.length&&l.type!=="radar"&&l.type!=="gauge"&&l.type!=="bar"){l.chartData.xAxisData=getXAxisPoints(l.categories,l,n);let t=calCategoriesData(l.categories,l,n,l.chartData.xAxisData.eachSpacing,s),e=t.xAxisHeight,a=t.angle;n.xAxisHeight=e;n._xAxisTextAngle_=a;l.area[2]+=e;l.chartData.categoriesData=t}else{if(l.type==="line"||l.type==="area"||l.type==="scatter"||l.type==="bubble"||l.type==="bar"){l.chartData.xAxisData=calXAxisData(c,l,n,s);d=l.chartData.xAxisData.rangesFormat;let t=calCategoriesData(d,l,n,l.chartData.xAxisData.eachSpacing,s),e=t.xAxisHeight,a=t.angle;n.xAxisHeight=e;n._xAxisTextAngle_=a;l.area[2]+=e;l.chartData.categoriesData=t}else{l.chartData.xAxisData={xAxisPoints:[]}}}if(l.enableScroll&&l.xAxis.scrollAlign=="right"&&l._scrollDistance_===undefined){let t=0,e=l.chartData.xAxisData.xAxisPoints,a=l.chartData.xAxisData.startX,i=l.chartData.xAxisData.endX,r=l.chartData.xAxisData.eachSpacing;let o=r*(e.length-1);let n=i-a;t=n-o;h.scrollOption.currentOffset=t;h.scrollOption.startTouchX=t;h.scrollOption.distance=0;h.scrollOption.lastMoveTime=0;l._scrollDistance_=t}if(t==="pie"||t==="ring"||t==="rose"){n._pieTextMaxLength_=l.dataLabel===false?0:getPieTextMaxLength(x,n,s,l)}switch(t){case"word":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function(t){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawWordCloudDataPoints(c,l,n,s,t);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"map":s.clearRect(0,0,l.width,l.height);drawMapDataPoints(c,l,n,s);setTimeout(()=>{this.uevent.trigger("renderComplete")},50);break;case"funnel":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function(t){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.funnelData=drawFunnelDataPoints(c,l,n,s,t);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,t);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"line":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawLineDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"scatter":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawScatterDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"bubble":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawBubbleDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"mix":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawMixDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"column":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawColumnDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"mount":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawMountDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"bar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawXAxis(d,l,n,s);var a=drawBarDataPoints(c,l,n,s,e),i=a.yAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.yAxisPoints=i;l.chartData.xAxisPoints=l.chartData.xAxisData.xAxisPoints;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"area":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawAreaDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"ring":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawPieDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"pie":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawPieDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"rose":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawRoseDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"radar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.radarData=drawRadarDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"arcbar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.arcbarData=drawArcbarDataPoints(c,l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"gauge":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.gaugeData=drawGaugeDataPoints(d,c,l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"candle":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawCandleDataPoints(c,x,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}if(x){drawLegend(x,l,n,s,l.chartData)}else{drawLegend(l.series,l,n,s,l.chartData)}drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break}}function uChartsEvent(){this.events={}}uChartsEvent.prototype.addEventListener=function(t,e){this.events[t]=this.events[t]||[];this.events[t].push(e)};uChartsEvent.prototype.delEventListener=function(t){this.events[t]=[]};uChartsEvent.prototype.trigger=function(){for(var t=arguments.length,e=Array(t),a=0;a0&&arguments[0]!==undefined?arguments[0]:{};this.opts=assign({},this.opts,t);this.opts.updateData=true;let c=t.scrollPosition||"current";switch(c){case"current":this.opts._scrollDistance_=this.scrollOption.currentOffset;break;case"left":this.opts._scrollDistance_=0;this.scrollOption={currentOffset:0,startTouchX:0,distance:0,lastMoveTime:0};break;case"right":let t=calYAxisData(this.opts.series,this.opts,this.config,this.context),e=t.yAxisWidth;this.config.yAxisWidth=e;let a=0;let i=getXAxisPoints(this.opts.categories,this.opts,this.config),r=i.xAxisPoints,o=i.startX,n=i.endX,l=i.eachSpacing;let s=l*(r.length-1);let h=n-o;a=h-s;this.scrollOption={currentOffset:a,startTouchX:a,distance:0,lastMoveTime:0};this.opts._scrollDistance_=a;break}drawCharts.call(this,this.opts.type,this.opts,this.config,this.context)};uCharts.prototype.zoom=function(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.opts.xAxis.itemCount;if(this.opts.enableScroll!==true){console.log("[uCharts] 请启用滚动条后使用");return}let e=Math.round(Math.abs(this.scrollOption.currentOffset)/this.opts.chartData.eachSpacing)+Math.round(this.opts.xAxis.itemCount/2);this.opts.animation=false;this.opts.xAxis.itemCount=t.itemCount;let a=calYAxisData(this.opts.series,this.opts,this.config,this.context),i=a.yAxisWidth;this.config.yAxisWidth=i;let r=0;let o=getXAxisPoints(this.opts.categories,this.opts,this.config),h=o.xAxisPoints,c=o.startX,d=o.endX,n=o.eachSpacing;let x=n*e;let l=d-c;let s=l-n*(h.length-1);r=l/2-x;if(r>0){r=0}if(r=this.opts.categories.length?this.opts.categories.length:r;this.opts.animation=false;this.opts.xAxis.itemCount=r;let o=0;let n=getXAxisPoints(this.opts.categories,this.opts,this.config),x=n.xAxisPoints,f=n.startX,p=n.endX,l=n.eachSpacing;let u=l*this.scrollOption.moveCurrent1;let g=p-f;let y=g-l*(x.length-1);o=-u+Math.min(i[0].x,i[1].x)-this.opts.area[3]-l;if(o>0){o=0}if(o1&&arguments[1]!==undefined?arguments[1]:{};var a=null;if(t.changedTouches){a=t.changedTouches[0]}else{a=t.mp.changedTouches[0]}if(a){var i=getTouches(a,this.opts,t);var r=this.getLegendDataIndex(t);if(r>=0){if(this.opts.type=="candle"){this.opts.seriesMA[r].show=!this.opts.seriesMA[r].show}else{this.opts.series[r].show=!this.opts.series[r].show}this.opts.animation=e.animation?true:false;this.opts._scrollDistance_=this.scrollOption.currentOffset;drawCharts.call(this,this.opts.type,this.opts,this.config,this.context)}}};uCharts.prototype.showToolTip=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var c=null;if(t.changedTouches){c=t.changedTouches[0]}else{c=t.mp.changedTouches[0]}if(!c){console.log("[uCharts] 未获取到event坐标信息")}var a=getTouches(c,this.opts,t);var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});if(this.opts.type==="line"||this.opts.type==="area"||this.opts.type==="column"||this.opts.type==="scatter"||this.opts.type==="bubble"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1||o.length>0){var n=getSeriesDataItem(this.opts.series,o,r.group);if(n.length!==0){var l=getToolTipData(n,this.opts,o,r.group,this.opts.categories,e),s=l.textList,h=l.offset;h.y=a.y;i.tooltip={textList:e.textList!==undefined?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o,group:r.group}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="mount"){var o=e.index==undefined?this.getCurrentDataIndex(t).index:e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},i._series_[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,i):n.name+": "+n.data,color:n.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?n.legendShape:this.opts.extra.tooltip.legendShape}];var h={x:i.chartData.calPoints[o].x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="bar"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1||o.length>0){var n=getSeriesDataItem(this.opts.series,o,r.group);if(n.length!==0){var l=getToolTipData(n,this.opts,o,r.group,this.opts.categories,e),s=l.textList,h=l.offset;h.x=a.x;i.tooltip={textList:e.textList!==undefined?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="mix"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1){var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var x=getMixToolTipData(n,this.opts,o,this.opts.categories,e),s=x.textList,h=x.offset;h.y=a.y;i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="candle"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1){var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var l=getCandleToolTipData(this.opts.series[0].data,n,this.opts,o,this.opts.categories,this.opts.extra.candle,e),s=l.textList,h=l.offset;h.y=a.y;i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="pie"||this.opts.type==="ring"||this.opts.type==="rose"||this.opts.type==="funnel"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},i._series_[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,i):n.name+": "+n.data,color:n.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?n.legendShape:this.opts.extra.tooltip.legendShape}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="map"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},this.opts.series[o]);n.name=n.properties.name;var s=[{text:e.formatter?e.formatter(n,undefined,o,this.opts):n.name,color:n.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?n.legendShape:this.opts.extra.tooltip.legendShape}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}i.updateData=false;drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="word"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},this.opts.series[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,this.opts):n.name,color:n.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?n.legendShape:this.opts.extra.tooltip.legendShape}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}i.updateData=false;drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="radar"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var s=n.map(t=>{return{text:e.formatter?e.formatter(t,this.opts.categories[o],o,this.opts):t.name+": "+t.data,color:t.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?t.legendShape:this.opts.extra.tooltip.legendShape}});var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}};uCharts.prototype.translate=function(t){this.scrollOption={currentOffset:t,startTouchX:t,distance:0,lastMoveTime:0};let e=assign({},this.opts,{_scrollDistance_:t,animation:false});drawCharts.call(this,this.opts.type,e,this.config,this.context)};uCharts.prototype.scrollStart=function(t){var e=null;if(t.changedTouches){e=t.changedTouches[0]}else{e=t.mp.changedTouches[0]}var a=getTouches(e,this.opts,t);if(e&&this.opts.enableScroll===true){this.scrollOption.startTouchX=a.x}};uCharts.prototype.scroll=function(t){if(this.scrollOption.lastMoveTime===0){this.scrollOption.lastMoveTime=Date.now()}let e=this.opts.touchMoveLimit||60;let a=Date.now();let i=a-this.scrollOption.lastMoveTime;if(i({
swiperList: [
{
@@ -44,6 +47,12 @@ onShow(() => {
onHide(() => {
})
+const doMenu = async (v: any) => {
+ console.log("tabbarStore:", tabbarStore);
+ await tabbarStore.componetTabbarList(v.page)
+ tabbarStore.jumpFirstTabbar()
+}
+
// 获取通知公告列表
const getNoticeList = async () => {
try {
@@ -128,8 +137,8 @@ const getAppMenuList = async () => {
-
+
{{ v.title }}
diff --git a/src/pages/tabbar/cabinet.vue b/src/pages/tabbar/cabinet.vue
new file mode 100644
index 0000000..7a9dee7
--- /dev/null
+++ b/src/pages/tabbar/cabinet.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+ {{ item.hardName }} {{ item.deviceCode }}
+
+
+
+ 货柜详情
+
+
+
+ 货柜补货
+
+
+
+ 商品上架
+
+
+
+
+
+
+
+
diff --git a/src/pages/tabbar/canteen.vue b/src/pages/tabbar/canteen.vue
index d310986..07251be 100644
--- a/src/pages/tabbar/canteen.vue
+++ b/src/pages/tabbar/canteen.vue
@@ -15,16 +15,12 @@ const state = reactive({
})
onLoad(() => {
- const app = getApp({ allowDefault: true })
- if (app._initTabbar) {
- app._initTabbar()
- }
})
-onShow(() => {
- const app = getApp({ allowDefault: true })
- if (app._initTabbar) {
- app._initTabbar()
+onShow(async () => {
+ const app: any = getApp({ allowDefault: true })
+ if (app?.globalData?._initTabbar) {
+ await app.globalData._initTabbar()
}
if (pageRef.value) {
pageRef.value.reload(false)
diff --git a/src/pages/tabbar/canteenAnalyse.vue b/src/pages/tabbar/canteenAnalyse.vue
new file mode 100644
index 0000000..73d42e3
--- /dev/null
+++ b/src/pages/tabbar/canteenAnalyse.vue
@@ -0,0 +1,218 @@
+
+
+
+
+ 菜品分类购买数量占比图
+
+
+
+
+
+
+ 近一周各食堂购买数量趋势图
+
+
+
+
+
+
+
+ 个人菜品喜好排行
+
+
+ 排名
+ 菜品名称
+ 分类
+ 购买数量
+
+
+
+
+
+ {{ index + 1 }}
+
+ {{ index + 1 }}
+
+
+
+ {{ item.productName || "未知菜品" }}
+
+
+
+
+ {{ item.classifyName || "未分类" }}
+
+
+
+
+ {{ item.payCount }}次
+
+
+
+
+
+ 暂无菜品喜好数据
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/tabbar/coopMerchant.vue b/src/pages/tabbar/coopMerchant.vue
new file mode 100644
index 0000000..e50daae
--- /dev/null
+++ b/src/pages/tabbar/coopMerchant.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+ 搜 索
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ v.name }}
+
+
+
+
+
+
+
+ {{ v.phone }}
+
+
+ {{ v.deptName.length > 5 ? v.deptName.substring(0, 5)
+ + "..." :
+ v.deptName }}
+
+
+ 营业时间:
+ {{ v.jobTime?.split(",")[0] ? "早:" + v.jobTime?.split(",")[0] : "" }}
+ {{ v.jobTime?.split(",")[1] ? "中:" + v.jobTime?.split(",")[1] : "" }}
+ {{ v.jobTime?.split(",")[2] ? "晚:" + v.jobTime?.split(",")[2] : "" }}
+
+
+
+ 地址:
+ {{ v.addressDes }}
+
+
+
+
+
+
+
diff --git a/src/pages/tabbar/selfMerchant.vue b/src/pages/tabbar/selfMerchant.vue
new file mode 100644
index 0000000..4e8599f
--- /dev/null
+++ b/src/pages/tabbar/selfMerchant.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+ {{ v.name }}
+ {{ v.deptName }}
+
+
+
+
+ {{ v.phone }}
+
+
+ {{ v.jobTime == ",," ? "" : "营业时间:" }}
+ {{ v.jobTime?.split(",")[0] ? "早:" + v.jobTime?.split(",")[0] : "" }}
+ {{ v.jobTime?.split(",")[1] ? "中:" + v.jobTime?.split(",")[1] : "" }}
+ {{ v.jobTime?.split(",")[2] ? "晚:" + v.jobTime?.split(",")[2] : "" }}
+
+
+
+ 地址:
+ {{ v.addressDes }}
+
+
+
+
+
+
+
diff --git a/src/sheep/api/door.ts b/src/sheep/api/door.ts
new file mode 100644
index 0000000..b6c69f7
--- /dev/null
+++ b/src/sheep/api/door.ts
@@ -0,0 +1,151 @@
+import request from "@/sheep/utils/request"
+
+export default {
+ /**
+ * app获取智能柜授权信息
+ * @param doorHardId 智能柜设备id
+ * @param cabinetNo 货柜编号
+ */
+ appGetAuthHardDoor: (data: { doorHardId: any; cabinetNo: any }) =>
+ request({
+ url: "hard/hard-auth/app/get-auth-hard-door",
+ method: "POST",
+ data,
+ }),
+ /**
+ * app获取智能柜授权信息
+ * @param authId 授权id
+ * @param authStatus 是否授权
+ */
+ appAuthHardDoor: (data: { authId: any; authStatus: any }) =>
+ request({
+ url: "hard/hard-auth/app/get-auth-hard-door",
+ method: "POST",
+ data,
+ }),
+ /**
+ * app查询智能柜列表(有分页)
+ */
+ hardDoorPage: (params: any) =>
+ request({
+ url: "hard/hard-door-manager/app/page",
+ method: "GET",
+ params,
+ }),
+
+ /**
+ * app查询智能柜详情
+ * @param hardDoorId 智能柜id
+ */
+ hardDoorDetail: (params: { hardDoorId: any }): Promise =>
+ request({
+ url: "hard/hard-door-manager/app/detail",
+ method: "GET",
+ params,
+ }),
+
+ /**
+ * 上架
+ * @param id 绑定id
+ * @param hardSpuId 商品id
+ */
+ putaway: (data: { id: any; hardSpuId: any }): Promise =>
+ request({
+ url: "hard/hard-spu/app/putaway",
+ method: "POST",
+ data,
+ }),
+
+ /**
+ * 下架
+ * @param id 绑定id
+ * @param hardSpuId 商品id
+ */
+ unPutaway: (data: { id: any; hardSpuId: any }) =>
+ request({
+ url: "hard/hard-spu/app/un-putaway",
+ method: "POST",
+ data,
+ }),
+ /**
+ * app查询货柜补货商品列表
+ * @param hardDoorId 智能柜编号
+ * @param cabinetNo 货柜编号
+ */
+ cabinetPutawayList: (params: { hardDoorId: any; cabinetNo: any }): Promise =>
+ request({
+ url: "hard/hard-spu/app/cabinet-putaway-list",
+ method: "GET",
+ params,
+ }),
+
+ /**
+ * app查询货柜商品列表
+ * @param hardId 智能柜编号
+ * @param cabinetNo 货柜编号
+ */
+ cabinetList: (params: { hardId: any; cabinetNo: any }): Promise =>
+ request({
+ url: "hard/hard-spu/app/cabinet-list",
+ method: "GET",
+ params,
+ }),
+
+ /**
+ * 补货完成
+ * @param flowId
+ * @param list
+ */
+ repertoryDone: (data: { flowId: any; list: Array<{ hardSpuId: any; plusCount: any }> }): Promise =>
+ request({
+ url: "hard/hard-spu-repertory/app/repertory-done",
+ method: "POST",
+ data,
+ }),
+
+ /**
+ * 补货开门
+ * @param hardDoorId 智能柜编号
+ * @param cabinetNo 货柜编号
+ */
+ openRepertory: (data: { hardDoorId: string; cabinetNo: string }): Promise =>
+ request({
+ url: "hard/hard-door-flow/app/open-repertory",
+ method: "POST",
+ data,
+ }),
+
+ /**
+ * app商品列表
+ * @param name
+ * @param skuType
+ */
+ hardDoorSpuPage: (params: { name: any; skuType: any }): Promise =>
+ request({
+ url: "hard/hard-spu/app/page",
+ method: "GET",
+ params,
+ }),
+ /**
+ * app检修开门
+ * @param hardDoorId 智能柜id
+ * @param cabinetNo 货柜编号
+ */
+ openAccess: (data: { hardDoorId: string; cabinetNo: string }): Promise =>
+ request({
+ url: "hard/hard-door-flow/app/open-access",
+ method: "POST",
+ data,
+ }),
+ /**
+ * app检修关门
+ * @param hardDoorId 智能柜id
+ * @param cabinetNo 货柜编号
+ */
+ closeAccess: (data: { hardDoorId: string; cabinetNo: string }): Promise =>
+ request({
+ url: "hard/hard-door-flow/app/close-access",
+ method: "POST",
+ data,
+ }),
+}
diff --git a/src/sheep/api/index.ts b/src/sheep/api/index.ts
index f3d36fb..7ab9c26 100644
--- a/src/sheep/api/index.ts
+++ b/src/sheep/api/index.ts
@@ -7,6 +7,7 @@ export { default as applyApi } from "./apply"
export { default as adApi } from "./ad"
export { default as appApi } from "./app"
export { default as boxesApi } from "./boxes"
+export { default as doorApi } from "./door"
export { default as faceApi } from "./face"
export { default as feedbackApi } from "./feedback"
export { default as foodApi } from "./food"
diff --git a/src/sheep/components/base/base-just-flot-nav/base-just-flot-nav.vue b/src/sheep/components/base/base-just-flot-nav/base-just-flot-nav.vue
index a6746e4..ff93608 100644
--- a/src/sheep/components/base/base-just-flot-nav/base-just-flot-nav.vue
+++ b/src/sheep/components/base/base-just-flot-nav/base-just-flot-nav.vue
@@ -1,6 +1,9 @@
-
-
-
+
+
+
+
@@ -58,19 +70,25 @@ function getNavTop() {
align-items: center;
&_center {
+ display: flex;
+ align-items: center;
+ height: 56rpx;
+ border-radius: 28rpx;
background: #fff;
box-shadow: 0px 0px 4rpx rgba(51, 51, 51, 0.08), 0px 4rpx 6rpx 2rpx rgba(102, 102, 102, 0.12);
- border-radius: 28rpx;
- width: 56rpx;
- height: 56rpx;
- display: flex;
- justify-content: center;
- align-items: center;
z-index: 100;
+ &_line {
+ width: 1rpx;
+ height: 25rpx;
+ background: #999;
+ }
+
&>.icon {
- font-size: 32rpx;
- color: #333;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 56rpx;
}
}
}
diff --git a/src/sheep/components/base/base-nav/base-nav.vue b/src/sheep/components/base/base-nav/base-nav.vue
index 6705753..c014c6c 100644
--- a/src/sheep/components/base/base-nav/base-nav.vue
+++ b/src/sheep/components/base/base-nav/base-nav.vue
@@ -1,7 +1,9 @@
@@ -102,6 +111,11 @@ function initBackStyle() {
+
+
diff --git a/src/sheep/stores/tabbar.ts b/src/sheep/stores/tabbar.ts
new file mode 100644
index 0000000..e550a77
--- /dev/null
+++ b/src/sheep/stores/tabbar.ts
@@ -0,0 +1,185 @@
+import { defineStore } from "pinia"
+
+import { getLaunchParam, getAppInfo } from "../utils/app"
+import { jump } from "../router/index"
+
+type TabbarItem = {
+ pagePath: string
+ text: string
+ iconPath: string
+ selectedIconPath: string
+ launchParam: string[]
+ auth: string[]
+}
+
+type StoreState = {
+ tabbarList: Array
+ launchParam: string | null
+ currentRoute: string
+}
+
+const TABBAR_CONSTANT: Array = [
+ {
+ pagePath: "/pages/tabbar/canteen",
+ text: "食堂",
+ iconPath: "/static/tabbar/canteen.png",
+ selectedIconPath: "/static/tabbar/canteen-select.png",
+ launchParam: ["canteen"],
+ auth: [],
+ },
+ {
+ pagePath: "/pages/tabbar/canteenAnalyse",
+ text: "喜好分析",
+ iconPath: "/static/tabbar/canteen-analyse.png",
+ selectedIconPath: "/static/tabbar/canteen-analyse-select.png",
+ launchParam: ["canteen"],
+ auth: [],
+ },
+ {
+ pagePath: "/pages/tabbar/selfMerchant",
+ text: "自营商家",
+ iconPath: "/static/tabbar/self-merchant.png",
+ selectedIconPath: "/static/tabbar/self-merchant-select.png",
+ launchParam: ["selfMerchant"],
+ auth: ["user"],
+ },
+ {
+ pagePath: "/pages/tabbar/coopMerchant",
+ text: "合作商家",
+ iconPath: "/static/tabbar/coop-merchant.png",
+ selectedIconPath: "/static/tabbar/coop-merchant-select.png",
+ launchParam: ["coopMerchant"],
+ auth: ["user"],
+ },
+ // 在线商城(商品展示)
+ {
+ pagePath: "/pages/tabbar/onlineShop",
+ text: "在线商城",
+ iconPath: "/static/tabbar/online-shop.png",
+ selectedIconPath: "/static/tabbar/online-shop-select.png",
+ launchParam: ["onlineShop"],
+ auth: ["user"],
+ },
+ {
+ pagePath: "/pages/tabbar/prosperityShop",
+ text: "共富商城",
+ iconPath: "/static/tabbar/prosperity-shop.png",
+ selectedIconPath: "/static/tabbar/prosperity-shop-select.png",
+ launchParam: ["prosperityShop"],
+ auth: ["user"],
+ },
+ {
+ pagePath: "/pages/tabbar/prosperityShopMchList",
+ text: "共富商城",
+ iconPath: "/static/tabbar/prosperity-shop.png",
+ selectedIconPath: "/static/tabbar/prosperity-shop-select.png",
+ launchParam: ["prosperityShopMchList"],
+ auth: ["user"],
+ },
+ {
+ pagePath: "/pages/tabbar/cabinet",
+ text: "智能柜",
+ iconPath: "/static/tabbar/cabinet.png",
+ selectedIconPath: "/static/tabbar/cabinet-select.png",
+ launchParam: [],
+ auth: ["doorAdmin"],
+ },
+ {
+ pagePath: "/pages/tabbar/order",
+ text: "订单",
+ iconPath: "/static/tabbar/order.png",
+ selectedIconPath: "/static/tabbar/order-select.png",
+ launchParam: ["canteen", "selfMerchant", "coopMerchant", "onlineShop", "prosperityShop"],
+ auth: ["user"],
+ },
+ {
+ pagePath: "/pages/tabbar/flowStatistics",
+ text: "流水统计",
+ iconPath: "/static/tabbar/order.png",
+ selectedIconPath: "/static/tabbar/order-select.png",
+ launchParam: [],
+ auth: ["merchant"],
+ },
+ {
+ pagePath: "/pages/tabbar/individualOrder",
+ text: "订单",
+ iconPath: "/static/tabbar/order.png",
+ selectedIconPath: "/static/tabbar/order-select.png",
+ launchParam: [],
+ auth: ["merchant"],
+ },
+ {
+ pagePath: "/pages/tabbar/integrated",
+ text: "综合服务",
+ iconPath: "/static/tabbar/integrated.png",
+ selectedIconPath: "/static/tabbar/integrated-select.png",
+ launchParam: ["integrated"],
+ auth: ["user"],
+ },
+ {
+ pagePath: "/pages/tabbar/my",
+ text: "我的",
+ iconPath: "/static/tabbar/my.png",
+ selectedIconPath: "/static/tabbar/my-select.png",
+ launchParam: ["canteen", "selfMerchant", "onlineShop", "coopMerchant", "integrated", "prosperityShop", "prosperityShopMchList"],
+ auth: ["user", "merchant", "doorAdmin"],
+ },
+]
+
+// tabbar
+export const useTabbarStore = defineStore("tabbarStore", {
+ state: (): StoreState => ({
+ tabbarList: [],
+ launchParam: null,
+ currentRoute: "/pages/root/dashboard",
+ }),
+ getters: {
+ isTabbar(state) {
+ return state.tabbarList.some((item) => item.pagePath === `/${state.currentRoute}`)
+ },
+ activeIndex(state) {
+ return state.tabbarList.findIndex((item) => item.pagePath === `/${state.currentRoute}`)
+ },
+ pageTabbarList(state) {
+ return state.tabbarList.map((item) => {
+ return {
+ title: item.text,
+ icon: item.iconPath,
+ selectedIcon: item.selectedIconPath,
+ }
+ })
+ },
+ },
+ actions: {
+ async componetTabbarList(launchParam?: string) {
+ let _launchParam = ""
+ if (launchParam) {
+ _launchParam = getLaunchParam(launchParam)
+ } else {
+ _launchParam = getLaunchParam()
+ }
+ if (this.launchParam === _launchParam) return
+ const appInfo = await getAppInfo()
+ if (!_launchParam || !appInfo) return
+ const tabbarList: Array = []
+ TABBAR_CONSTANT.forEach((item, index) => {
+ const visible = item.launchParam.includes(_launchParam)
+ if (visible) {
+ tabbarList.push(item)
+ }
+ })
+ this.tabbarList = tabbarList
+ },
+ jumpFirstTabbar() {
+ const firstTabbar = this.tabbarList[0]
+ if (!firstTabbar) {
+ return
+ }
+ jump(firstTabbar.pagePath, {}, 3)
+ },
+ setCurrentRoute(route: string) {
+ console.log("设置route:", route)
+ this.currentRoute = route
+ },
+ },
+})
diff --git a/src/sheep/utils/app.ts b/src/sheep/utils/app.ts
index ec1cebb..268e679 100644
--- a/src/sheep/utils/app.ts
+++ b/src/sheep/utils/app.ts
@@ -18,6 +18,23 @@ export const getAppInfo = async (): Promise => {
return APPENV.WECHAT
}
-export const getLaunchParam = () => {
- return "canteen"
+// 获取url的params参数对象
+export function getUrlParams(url: string) {
+ const reg = /([^?&=]+)=([^?&=]+)/g
+ const params: any = {}
+ url.replace(reg, (_, k, v) => {
+ params[k] = decodeURIComponent(v)
+ return _
+ })
+ return params
+}
+
+export const getLaunchParam = (url?: string) => {
+ if (!url) {
+ const pages = getCurrentPages()
+ const currentPage = pages[pages.length - 1]
+ url = currentPage?.route ?? ""
+ }
+ const params = getUrlParams(url)
+ return params?.launchParam
}
diff --git a/src/static/page/door-info.svg b/src/static/page/door-info.svg
new file mode 100644
index 0000000..c071f4f
--- /dev/null
+++ b/src/static/page/door-info.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/static/page/door-putaway.svg b/src/static/page/door-putaway.svg
new file mode 100644
index 0000000..dfa53eb
--- /dev/null
+++ b/src/static/page/door-putaway.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/static/page/open-door.svg b/src/static/page/open-door.svg
new file mode 100644
index 0000000..eb3f874
--- /dev/null
+++ b/src/static/page/open-door.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/static/tabbar/cabinet-select.png b/src/static/tabbar/cabinet-select.png
new file mode 100644
index 0000000..77c0106
Binary files /dev/null and b/src/static/tabbar/cabinet-select.png differ
diff --git a/src/static/tabbar/cabinet.png b/src/static/tabbar/cabinet.png
new file mode 100644
index 0000000..382c66f
Binary files /dev/null and b/src/static/tabbar/cabinet.png differ
diff --git a/src/static/tabbar/canteen-analyse-select.png b/src/static/tabbar/canteen-analyse-select.png
new file mode 100644
index 0000000..c039e07
Binary files /dev/null and b/src/static/tabbar/canteen-analyse-select.png differ
diff --git a/src/static/tabbar/canteen-analyse.png b/src/static/tabbar/canteen-analyse.png
new file mode 100644
index 0000000..ae2c284
Binary files /dev/null and b/src/static/tabbar/canteen-analyse.png differ
diff --git a/src/static/tabbar/coop-merchant-select.png b/src/static/tabbar/coop-merchant-select.png
new file mode 100644
index 0000000..aa72a06
Binary files /dev/null and b/src/static/tabbar/coop-merchant-select.png differ
diff --git a/src/static/tabbar/coop-merchant.png b/src/static/tabbar/coop-merchant.png
new file mode 100644
index 0000000..ffb65d1
Binary files /dev/null and b/src/static/tabbar/coop-merchant.png differ
diff --git a/src/static/tabbar/integrated-select.png b/src/static/tabbar/integrated-select.png
new file mode 100644
index 0000000..208c915
Binary files /dev/null and b/src/static/tabbar/integrated-select.png differ
diff --git a/src/static/tabbar/integrated.png b/src/static/tabbar/integrated.png
new file mode 100644
index 0000000..f3042ff
Binary files /dev/null and b/src/static/tabbar/integrated.png differ
diff --git a/src/static/tabbar/online-shop-select.png b/src/static/tabbar/online-shop-select.png
new file mode 100644
index 0000000..3ab5fcb
Binary files /dev/null and b/src/static/tabbar/online-shop-select.png differ
diff --git a/src/static/tabbar/online-shop.png b/src/static/tabbar/online-shop.png
new file mode 100644
index 0000000..9f7389d
Binary files /dev/null and b/src/static/tabbar/online-shop.png differ
diff --git a/src/static/tabbar/prosperity-shop-mch-list.png b/src/static/tabbar/prosperity-shop-mch-list.png
new file mode 100644
index 0000000..e142f04
Binary files /dev/null and b/src/static/tabbar/prosperity-shop-mch-list.png differ
diff --git a/src/static/tabbar/prosperity-shop-select.png b/src/static/tabbar/prosperity-shop-select.png
new file mode 100644
index 0000000..5708601
Binary files /dev/null and b/src/static/tabbar/prosperity-shop-select.png differ
diff --git a/src/static/tabbar/prosperity-shop.png b/src/static/tabbar/prosperity-shop.png
new file mode 100644
index 0000000..cc9efa3
Binary files /dev/null and b/src/static/tabbar/prosperity-shop.png differ
diff --git a/src/static/tabbar/self-merchant-select.png b/src/static/tabbar/self-merchant-select.png
new file mode 100644
index 0000000..4ff3263
Binary files /dev/null and b/src/static/tabbar/self-merchant-select.png differ
diff --git a/src/static/tabbar/self-merchant.png b/src/static/tabbar/self-merchant.png
new file mode 100644
index 0000000..84fa27d
Binary files /dev/null and b/src/static/tabbar/self-merchant.png differ
diff --git a/src/uni_modules/tm-ui/changelog.md b/src/uni_modules/tm-ui/changelog.md
index a8f3000..e916df9 100644
--- a/src/uni_modules/tm-ui/changelog.md
+++ b/src/uni_modules/tm-ui/changelog.md
@@ -1,3 +1,99 @@
+## 3.2.13(2026-03-07)
+tmui3.2重新上线了模板库;
+请访问:https://store.tmui.design/
+主要特性:
+1、可视化调整和编辑,拖拽组件,针对TMUI3.2特别优化针对
+2、源码导出精准自动SFC-VUE linit检查,css检查,容错修复
+3、解放双手,插入自己的ai可以无限生成组件模板页面,可以让你不需要拖动拖组件搭页面,后台为ai提供了精准知识库:实测使用qwenplus35b,glm-5,minimax2.5等对话生成页面模板基本命中率99%,高效的容错机制应对ai的回复提取。
+4、模板资源,目前可以用ai无限限制的生成模板存储在你的个人模板库内,可以可视货调整,然后作为 你的模板库,后面所有的项目可直接插入复用,让你的效率提升1000%
+5、平台提供预览模式,对于设计完页面后可以分享给客户直接演示应用。
+6、平台提供单个页面导致源码(会自动创建子组件)。也提供按项目整体导出所有页面。还提供了导出所有页面的设计稿图片(供领导,客户审阅(如果需要设计图时非常有用))这会让你的项目非常专业。提供各种可能。
+## 3.2.12(2026-02-26)
+* 优化 slider-menu 增加点击选中项后,如果右侧滚动但还在本节点范围内时再次点击不再触发事件(防止重复触发),并且位置重新定义到节点顶部。并美化了组件。
+* 修复switch组件类型警告。
+## 3.2.11(2026-02-26)
+* 【重磅】首次发布tmui3.2的移动端 vue版本,不依赖uniapp,
+* 更新了文档,增加搜索功能,文档表格文字断行(防止超长影响阅读文档),其它文档优化。
+* 但可以像uniapp那样写rpx,view单位和标签,不会改变你的习惯,
+* 但可以不依赖uniapp。配合tmui4x实现高效的app混合开发。
+* **********
+* tm-image可能值处理触发sdk的lazy在小程序。
+* switch开发,增加回弹动画
+* signboard 增加对pc的支持。
+* 通过ts-check检查消除爆红。
+* 修复modal组件的beforeClose属性不生效。
+* 增加组件tm-float-drawer 浮动面板组件
+* 增加组件tm-pull-refresh 下拉刷新组件
+* 增加组件tm-dropdown-menu下拉菜单组件
+* 增加组件tm-slider-double 双向滑块组件
+* 增加组件tm-slider 单向向滑块组件
+* 优化upload-video,upload-photo默认同步及回显。
+* 优化between-time的start和end,由于很多人在提供起始和结束时,不提供时分秒,导致比较时以默认的时分秒来判断,现在检测如果用户不提供到秒的结束时间时
+* 自动把起始时秒分设置为0,结束的时秒分为59,这样避免时区问题。
+## 3.2.10(2025-12-31)
+* 兼容了鸿蒙APP,cli用户请重新更新cli底座package.json(可在代码仓库下载替换,新用户可直接cli安装新项目),删除旧的,重新安装依赖(旧的依赖也要先删除)
+* 类型,注释等优化在编译器中清除报红的类型。
+* image组件加了上事件error,load
+* 增加日历组件
+* 增加汽泡菜单组件
+* 增加步骤条组件
+* 增加进度条组件
+* 增加圆环进度条 TmCircleProgress组件
+* 增加签名版 TmSignBoard组件
+* 增加查看更多 TmMore组件
+#
+## 3.2.09(2025-09-01)
+* 修改maring,padding计算规则。
+* [新增] tm-more更多展开和收缩组件
+* [优化] tm-picker新增了插槽数据label,如果使用插槽展示标签时不显示(这是hbx bug需要高版本4.8x才会显示),此时要写全标准格式才会在小程序上显示
+```ts
+
+///这里放标签用于触发展示
+// {{label}} 是选中的标签字符串
+
+```
+## 3.2.08(2025-08-30)
+* 优化大部分组件性能和显示效果,动效等。
+* tmForm允许嵌套对象进行表单校验。
+* upload相关组件优化相关问题。
+* 新增国际化语言插件,可以直接在任意位置```import {$i18n} from "@/uni_modules/tm-ui"```来使用,具体见文档。组件一些文字也使用了多语言配置。(本语言插件是自写的非vueI18n因此不会与你已有的冲突),相比直接使用vuI18n在app端是使用不了插值的,自定的话更灵活,可以直接插值。
+* 修复表单对null的校验。
+* 修复了upload相关组件可能的问题(不一定会触发)
+* 新增了请求类,可未授权时队列等候自动请求。(针对小程序中wxocde静默登录自动授权处理),可以对接口自动缓存,请直接调用uni.tmRq调用。并且在示例中为你新增了路由示例。
+* modal 添加了beforeClose属性,用于控制在关闭前执行的一些校验(比如嵌套的表单,输入框等的校验操作)
+* tm-between-time 修复,当start和end不在可快捷列表之间时,会选择快捷时间,但实际快捷时间不在起始之间
+* 【新增】tm-tabbar底部导航组件。
+## 3.2.07(2025-07-16)
+* tm-stepperx组件修复可能在深层嵌套时,可能默认值时可能会有错误。
+* 表单校验,兼容更广泛的可能类型不兼容时的处理情况。并增加了些属性,更新了校验时机的处理(已在非常复杂的表单嵌套及主/子表单动态渲染结构中得到验证)
+* tmDate及picker-date,date-view,picker-between修复了某些问题。【请务必升级】
+* tm-stepper增加autoHideBtn属性及示例,自动隐藏减号,同时增加input-style属性
+* 完善组件针对style属性的ts提示,这样可在写对象css时有css全局字典提示,并解决爆红问题,比如tmText属性:_style="{fontSize:16}",时会有css提示。
+* 修复tm-html和navbar组件,如果页面被分享到朋友圈,当用户在朋友圈浏览时会出现错误(注意不是打开仅是朋友圈的内嵌浏览)
+* 修复tm-upload-photo,tm-upload-videou状态不变化,成功后,数据不同步。
+## 3.2.06(2025-04-15)
+* picker-date复制错了
+## 3.2.05(2025-04-14)
+* 修复了一些问题
+* tmNavbar属性删除了scrollTop属性,改为内部实现。
+* 修复弹层类modal,drawer类可能在不同平台上的显示的问题。
+* 修改了input组件样式
+* 增加了tmAvatarGroup头像组件
+* 增加了tmSkeleton加载动画组件
+* 修复tm-tabs如果值为空与0时可能无法判断
+* 修复uploadphoto,uploadvideo可能外部无法清空,可能外部造成内部多次上传,可能内外数据污染.
+* 给各个弹层添加了禁用disabled属性
+* tm-echart添加了点击事件,兼容了pc操作
+* tmDate,tmPickerData,tm-between-time现支持非正常格式了如:YYYY,YYYY-MM,YYYY-MM-DD,YYYY-MM-DD HH,YYYY-MM-DD HH:mm,YYYY-MM-DD HH:mm:ss
+同时提供了属性:formatSyncValue用于格式化同步到vmodel中,默认是不同步的,默认它是返回一个标准的时间戳字符串,这样就不需要vmodel:modal-str来绑定,可以直接提交为你需要的字段格式值。
+## 3.2.04(2024-12-24)
+* 更新优化,修复bug和新增部分组件,
+## 3.2.03(2024-11-21)
+* 更新和新增部分组件,
+## 3.2.02(2024-11-12)
+* 更新部分组件,将会提供设计专用的可视化超级编辑器,适用于有设计经验,远程案例预览,模板保存,多面板设计,多选项同时修改样式,类似即时,xd,sketch等设计软件,敬请期待
+## 3.2.01(2024-10-28)
+* 更新部分组件
## 3.2.0(2024-10-11)
* [注意]本版本不向下兼容,可以直接通过市场导入或者在插件目录右键升级到项目中
* [3.2.x文档链接](https://tmui.design/)
diff --git a/src/uni_modules/tm-ui/components/tm-alert/tm-alert.vue b/src/uni_modules/tm-ui/components/tm-alert/tm-alert.vue
index b698fd6..17d4c5f 100644
--- a/src/uni_modules/tm-ui/components/tm-alert/tm-alert.vue
+++ b/src/uni_modules/tm-ui/components/tm-alert/tm-alert.vue
@@ -1,346 +1,352 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-avatar-group/tm-avatar-group.vue b/src/uni_modules/tm-ui/components/tm-avatar-group/tm-avatar-group.vue
new file mode 100644
index 0000000..b14d7ca
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-avatar-group/tm-avatar-group.vue
@@ -0,0 +1,400 @@
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+ {{_count==0?(_list.length>99?99:_list.length)+'+':(_count>99?99:_count)+'+'}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-badge/tm-badge.vue b/src/uni_modules/tm-ui/components/tm-badge/tm-badge.vue
index 9187cb7..f366839 100644
--- a/src/uni_modules/tm-ui/components/tm-badge/tm-badge.vue
+++ b/src/uni_modules/tm-ui/components/tm-badge/tm-badge.vue
@@ -1,223 +1,222 @@
-
-
-
-
-
-
-
- {{ _label }}
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ {{ _label}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-between-time/tm-between-time.vue b/src/uni_modules/tm-ui/components/tm-between-time/tm-between-time.vue
index 05feffd..905da4f 100644
--- a/src/uni_modules/tm-ui/components/tm-between-time/tm-between-time.vue
+++ b/src/uni_modules/tm-ui/components/tm-between-time/tm-between-time.vue
@@ -1,583 +1,605 @@
-
-
-
-
-
-
-
-
-
- {{ title }}
- 清空
-
-
-
-
- {{ item.str }}
-
-
-
-
-
-
- 至
-
-
-
-
-
-
-
-
-
-
- 取消
-
- 确认
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ {{ title }}
+ {{ $i18n.t('tmui32x.tmBetweenTime.clearText') }}
+
+
+
+
+ {{
+ item.str }}
+
+
+
+
+
+
+ {{ $i18n.t('tmui32x.tmBetweenTime.betweenText') }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-button/tm-button.vue b/src/uni_modules/tm-ui/components/tm-button/tm-button.vue
index 037ef1f..c9dc688 100644
--- a/src/uni_modules/tm-ui/components/tm-button/tm-button.vue
+++ b/src/uni_modules/tm-ui/components/tm-button/tm-button.vue
@@ -1,5 +1,5 @@
-
-import { type ComputedRef, type PropType, computed, ref, getCurrentInstance } from "vue";
-import { arrayNumberValid, arrayNumberValidByStyleMP, covetUniNumber, linearValid } from "../../libs/tool";
-import { useTmConfig } from "../../libs/config";
-import { getDefaultColor, getDefaultColorObj, getOutlineColorObj, getTextColorObj, getThinColorObj } from "../../libs/colors";
-import TmForm from "../tm-form/tm-form.vue";
+import { computed, getCurrentInstance, PropType, ref } from 'vue'
+import { arrayNumberValid, arrayNumberValidByStyleMP, covetUniNumber, linearValid } from '../../libs/tool'
+import { useTmConfig } from '../../libs/config'
+import {
+ getDefaultColor,
+ getDefaultColorObj,
+ getOutlineColorObj,
+ getTextColorObj,
+ getThinColorObj
+} from '../../libs/colors'
+import TmForm from '../tm-form/tm-form.vue'
/**
* @displayName 按钮
@@ -234,11 +240,23 @@ const attrs = defineProps({
default: ""
},
/**
- * 跳转的地址链接,出现时点击click会跳转以/pages开头。navigator模式跳转
+ * 禁止hover效果,点按没有hover效果,有时可能不需要。
+ */
+ disableHover:{
+ type:Boolean,
+ default:false
+ },
+ /**
+ * 跳转的地址链接,出现时点击click会跳转以/pages开头。
*/
url: {
type: String,
default: ""
+ },
+ /** url跳转模式 */
+ navigatorMode: {
+ type: String as PropType<"navigateTo"|"reLaunch"|"redirectTo"|"switchTab"|"navigateBack">,
+ default: "navigateTo"
},
appParameter: {
type: String,
@@ -314,10 +332,10 @@ const covetButtonSize = (ops: PropsKeyType, s: TM.BUTTON_SIZE, size?: string | n
])
const heights = new Map([
['xs', '44'],
- ['s', '60'],
- ['m', '72'],
- ['n', '90'],
- ['g', '100']
+ ['s', '56'],
+ ['m', '68'],
+ ['n', '88'],
+ ['g', '98']
])
const fontSizes = new Map([
@@ -367,6 +385,9 @@ const touchEnd = () => {
isHover.value = false;
}
const buttonStyle = computed(() => {
+ if(attrs.disableHover){
+ isHover.value = false;
+ }
let style = {
borderColor: ``,
borderWidth: ``,
@@ -441,11 +462,13 @@ const buttonStyle = computed(() => {
});
const onClick = (evt: any) => {
- emits('click', evt);
- if (_attrs.value.disabled || _attrs.value.loading) return;
+ if(_attrs.value.disabled||_attrs.value.loading) return;
+ emits('click', evt)
if (_attrs.value.url) {
- uni.navigateTo({
+ // @ts-expect-error
+ uni[_attrs.value.navigatorMode]({
url: _attrs.value.url,
+ // @ts-expect-error
fail(error) {
console.error(error)
}
@@ -508,8 +531,14 @@ export default {
flex-direction: row;
justify-content: center;
align-items: center;
+ box-sizing: border-box;
gap: 8px;
-
+ &[disabled = true]{
+ cursor: no-drop;
+ }
+ &[disabled = false]{
+ cursor: pointer;
+ }
&.tmButtonLoading {
opacity: 0.5;
diff --git a/src/uni_modules/tm-ui/components/tm-calendar-multiple/calendar-multiple.vue b/src/uni_modules/tm-ui/components/tm-calendar-multiple/calendar-multiple.vue
new file mode 100644
index 0000000..3bfd371
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-calendar-multiple/calendar-multiple.vue
@@ -0,0 +1,341 @@
+
+
+
+
+
+
+
+ {{item.style.dot.dotLabel}}
+
+
+ {{item.date.day}}
+
+ {{showLabel(item)||item.style.dstyle.label}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-calendar-multiple/interface.ts b/src/uni_modules/tm-ui/components/tm-calendar-multiple/interface.ts
new file mode 100644
index 0000000..56ef6dc
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-calendar-multiple/interface.ts
@@ -0,0 +1,98 @@
+import { tmDate } from "../../libs/tmDate"
+export type xDateArrayItem = {
+ date : TM.tmDateDayInfoType,
+ //是否禁用
+ isDisabled : boolean,
+ //是否在当前月份
+ isInCureentMonth : boolean,
+ //是否已经选中
+ isSelected : boolean,
+ //样式
+ style : dateStyleType
+}
+
+export type xDateArrayItemType = {
+ date : TM.tmDateDayInfoType,
+ //是否禁用
+ disabled : boolean,
+ //是否在当前月份
+ inCurrentMonth : boolean,
+ //是否已经选中
+ inRange : boolean,
+ isInstart : boolean,
+ isInEnd : boolean,
+ //样式
+ style : dateStyleType
+}
+
+/**
+ * 日历单个日期的样式对象
+ */
+export type xCalendarDateStyle_real_type = {
+ /** 是否显示右角标 */
+ dot : boolean,
+ /** 右角标背景颜色 */
+ dotColor : string,
+ /** 右角标文字颜色 */
+ dotLabelColor : string,
+ /** 注意如果dot为true,此内容为空就会显示小圆点。如果有内容优先显示本文本 */
+ dotLabel : string,
+ /** 底部文本 */
+ label : string,
+ /** 背景颜色 */
+ color : string,
+ /** 日期文字颜色 */
+ fontColor : string,
+ date : string
+}
+export type dateStyleDot = {
+ /** 是否显示右角标 */
+ dot : boolean,
+ /** 右角标背景颜色 */
+ dotColor : string,
+ /** 右角标文字颜色 */
+ dotLabelColor : string,
+ /** 注意如果dot为true,此内容为空就会显示小圆点。如果有内容优先显示本文本 */
+ dotLabel : string,
+}
+export type dateStyleBg = {
+ /** 底部文本 */
+ label : string,
+ /** 日期文字颜色 */
+ fontColor : string,
+ backgroundColor : string,
+ opacity : number
+}
+export type dateStyleType = {
+ dot : dateStyleDot,
+ dstyle : dateStyleBg
+}
+export type xCalendarMode = "day" | "range" | "week" | "quarter" | "year"
+
+export type BODY_SIZE_TYPE = {
+ width : number,
+ height : number
+}
+export type xCalendarArgs = {
+ color:string,
+ fontColor:string,
+ activeFontColor:string,
+ rangColor:string
+ rangFontColor:string,
+}
+
+export type xCalendarViewUpdateType = {
+ ar : xDateArrayItem[],
+ disabledDays : string[],
+ selectedDate : tmDate | null,
+ nowDate : tmDate,
+ start : tmDate,
+ end : tmDate,
+ color : string,
+ dateStyle : xCalendarDateStyle_real_type[]
+}
+
+export type GRID_SIZE = {
+ width : 0,
+ height : 0
+}
diff --git a/src/uni_modules/tm-ui/components/tm-calendar-multiple/tm-calendar-multiple.vue b/src/uni_modules/tm-ui/components/tm-calendar-multiple/tm-calendar-multiple.vue
new file mode 100644
index 0000000..b8a1d69
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-calendar-multiple/tm-calendar-multiple.vue
@@ -0,0 +1,788 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getmonth(item) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $i18n.t('tmui32x.tmCalendar.monthCountSelected', item) }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-calendar-multiple/tmCalendar.ts b/src/uni_modules/tm-ui/components/tm-calendar-multiple/tmCalendar.ts
new file mode 100644
index 0000000..095fe28
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-calendar-multiple/tmCalendar.ts
@@ -0,0 +1,243 @@
+import { tmDate } from "../../libs/tmDate"
+
+import { xDateArrayItemType,xCalendarArgs,dateStyleDot,dateStyleBg,dateStyleType,xCalendarMode } from "./interface"
+export class xCalendar {
+ date : tmDate;
+ calendar:xDateArrayItemType[] = [];
+ constructor(currentDate : string | number | Date | null = null) {
+ this.date = new tmDate(currentDate)
+ }
+ isInCurrentMonth(current:Date,target:Date):boolean{
+ let y1 = current.getFullYear()
+ let m1 = current.getMonth()
+ // let d1 = current.getDate()
+ let y2 = target.getFullYear()
+ let m2 = target.getMonth()
+ // let d2 = target.getDate()
+ return y1 == y2 && m1 == m2
+ }
+ isInRangeDate(current:Date,targets:Date[],mode:xCalendarMode):boolean{
+ let y1 = current.getFullYear()
+ let m1 = current.getMonth()
+ let d1 = current.getDate()
+ if(mode == 'day'){
+ for(let i=0;istart.getTime()&¤t.getTime()start.getTime()&¤t.getTime() current.getTime() || end.getTime() < current.getTime())
+ }
+ // 如果start > end,则忽略范围限制,只应用disabledDays
+ } else {
+ // 只有一个边界时,正常应用
+ if(start!=null){
+ disabled = disabled || start.getTime() > current.getTime()
+ }
+ if(end!=null){
+ disabled = disabled || end.getTime() < current.getTime()
+ }
+ }
+
+ return disabled
+ }
+ isInStart(current:Date,targets:Date[]):boolean{
+ if(targets.length==0) return false;
+ return targets[0].getTime() == current.getTime()
+ }
+ isInEnd(current:Date,targets:Date[]):boolean{
+ if(targets.length<2) return false;
+ return targets[targets.length-1].getTime() == current.getTime()
+ }
+ diffDays(start:Date,end:Date):number{
+ return end.getTime()-start.getTime()
+ }
+ getDateStyle(current:Date,defaultStyle:xCalendarArgs,disabled:boolean,inMonth:boolean,inRange:boolean,isInStart:boolean,isInEnd:boolean,dateStyle:TM.tmCalendarDateStyle_type[],mode:xCalendarMode):dateStyleType{
+ let nowdatestyleIndex = dateStyle.findIndex((d:TM.tmCalendarDateStyle_type):boolean => {
+ return new Date(d.date.replace(/-/g,'/')).getTime() == current.getTime()
+ })
+ let item:TM.tmCalendarDateStyle_type|null = nowdatestyleIndex==-1?null:dateStyle[nowdatestyleIndex]
+ const label = (item?.label??'') as string;
+ let fontColor = (item?.fontColor??defaultStyle.fontColor) as string;
+ fontColor = isInStart||isInEnd||(mode!='range'&&inRange) ? defaultStyle.activeFontColor:(inRange?defaultStyle.rangFontColor:fontColor)
+ let bgColor = (item?.color??'transparent') as string;
+ bgColor = isInStart||isInEnd||(mode!='range'&&inRange) ? defaultStyle.color : (inRange?defaultStyle.rangColor:bgColor)
+ const bgstyle = {
+ /** 底部文本 */
+ label : label,
+ /** 日期文字颜色 */
+ fontColor : fontColor,
+ backgroundColor : bgColor,
+ opacity : disabled||!inMonth?0.5:1
+ } as dateStyleBg
+
+ const dotstyle = {
+ /** 是否显示右角标 */
+ dot : item?.dot??false,
+ /** 右角标背景颜色 */
+ dotColor : item?.dotColor??defaultStyle.color,
+ /** 右角标文字颜色 */
+ dotLabelColor : item?.dotLabelColor??'#ffffff',
+ /** 注意如果dot为true,此内容为空就会显示小圆点。如果有内容优先显示本文本 */
+ dotLabel : item?.dotLabel??'',
+ } as dateStyleDot
+
+ return {
+ dot : dotstyle,
+ dstyle : bgstyle
+ } as dateStyleType
+ }
+ getCalendar(
+ seekDay:number,
+ mode:xCalendarMode,
+ currentDate : string | number | Date | null = null,
+ selectedDate:string[],
+ start:Date|null,
+ end:Date|null,
+ defaultStyle:xCalendarArgs,
+ dateStyle:TM.tmCalendarDateStyle_type[] = [],
+ disabledDays:string[] = [],
+ isPadding:boolean = true):xDateArrayItemType[]{
+
+ const nowCutime = Date.now()
+ let nowdate = (currentDate == null?this.date:new tmDate(currentDate)) as tmDate;
+ const dateAr = nowdate.getDaysOf('m')
+
+ let dates = [] as TM.tmDateDayInfoType[]
+ if(isPadding){
+ // 使用 seekDay 参数控制月份第一天的周偏移量
+ // seekDay: 0=周一, 1=周二, 2=周三, 3=周四, 4=周五, 5=周六, 6=周日
+ // 注意:week 值实际是 0=周日, 1=周一, 2=周二, 3=周三, 4=周四, 5=周五, 6=周六
+ // 需要转换为 0=周一, 1=周二, 2=周三, 3=周四, 4=周五, 5=周六, 6=周日的映射
+ let firstDayOfMonth = dateAr[0]
+ let firstDayWeek = firstDayOfMonth.week
+
+ // 将 week 值转换为 0=周一, 1=周二, ..., 6=周日的映射
+ // 原始:0=周日, 1=周一, 2=周二, 3=周三, 4=周四, 5=周五, 6=周六
+ // 目标:0=周一, 1=周二, 2=周三, 3=周四, 4=周五, 5=周六, 6=周日
+ let mappedWeek = (firstDayWeek + 6) % 7 // 将周日(0)映射为6,周一(1)映射为0
+
+ // 计算需要向前填充的天数
+ let beforeNum = 0
+ if (seekDay === 0) {
+ // 周一开始:mappedWeek 为 0 时不需要填充
+ beforeNum = mappedWeek
+ } else {
+ // 其他日期开始:计算到目标起始日的偏移量
+ beforeNum = (mappedWeek - seekDay + 7) % 7
+ }
+
+ // 如果 beforeNum 为 0,说明第一天正好是目标起始日,不需要填充
+ if (beforeNum > 0) {
+ const beforeDates = new tmDate(firstDayOfMonth.date).getDaysOfNum(beforeNum,'before')
+ dates = [...beforeDates,...dateAr]
+ } else {
+ dates = [...dateAr]
+ }
+
+ if(dates.length<42){
+ //补齐最后一周的内容
+ const lastDate = new tmDate(dates[dates.length-1].date);
+ let lastWeek = lastDate.getDaysOfNum(42-dates.length,'after')
+ dates = [...dates,...lastWeek]
+ }
+ }else{
+ dates = dateAr
+ }
+
+ let selectedTargets = selectedDate.map((d:string):Date =>{
+
+ return new Date(d.replace(/-/g,'/'))
+ })
+ let disabledDaysAs = disabledDays.map((d:string):Date =>{
+ return new Date(d.replace(/-/g,'/'))
+ })
+
+ const current = nowdate.date
+ const list = [] as xDateArrayItemType[]
+
+ for(let i=0;i
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ _allAttr.title }}
-
-
-
- {{ _allAttr.desc }}
-
-
-
-
-
- {{
- _allAttr.label
- }}
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ _allAttr.title
+ }}
+
+
+
+ {{
+ _allAttr.desc }}
+
+
+
+
+
+ {{ _allAttr.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-checkbox-group/tm-checkbox-group.vue b/src/uni_modules/tm-ui/components/tm-checkbox-group/tm-checkbox-group.vue
index bbaeedb..452efe2 100644
--- a/src/uni_modules/tm-ui/components/tm-checkbox-group/tm-checkbox-group.vue
+++ b/src/uni_modules/tm-ui/components/tm-checkbox-group/tm-checkbox-group.vue
@@ -1,125 +1,125 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-checkbox/tm-checkbox.vue b/src/uni_modules/tm-ui/components/tm-checkbox/tm-checkbox.vue
index 3e1fc6e..8f80f8a 100644
--- a/src/uni_modules/tm-ui/components/tm-checkbox/tm-checkbox.vue
+++ b/src/uni_modules/tm-ui/components/tm-checkbox/tm-checkbox.vue
@@ -1,377 +1,392 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ _label }}
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-circle-progress/propsType.ts b/src/uni_modules/tm-ui/components/tm-circle-progress/propsType.ts
new file mode 100644
index 0000000..19426ab
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-circle-progress/propsType.ts
@@ -0,0 +1,82 @@
+/**
+ * @description 进度条组件属性类型定义
+ */
+export interface PropsType {
+ /**
+ * 当前进度值
+ */
+ modelValue?: number;
+
+ /**
+ * 最小值
+ */
+ min?: number;
+
+ /**
+ * 起始角度,默认是0,正上方顺时针
+ */
+ startAngle?: number;
+
+ /**
+ * 最大值
+ */
+ max?: number;
+
+ /**
+ * 进度条颜色
+ */
+ color?: string;
+
+ /**
+ * 线性渐变颜色
+ */
+ linearColor?: string;
+
+ /**
+ * 背景颜色
+ */
+ bgColor?: string;
+
+ /**
+ * 暗黑模式背景颜色
+ */
+ darkBgColor?: string;
+
+ /**
+ * 是否显示进度标签
+ */
+ showLabel?: boolean | string;
+
+ /**
+ * 标签文字颜色
+ */
+ labelColor?: string;
+ /**
+ * 暗黑标签文字颜色
+ */
+ darkLabelColor?: string;
+ /**
+ * 暗黑标签文字颜色
+ */
+ labelUnit?: string;
+
+ /**
+ * 标签字体大小
+ */
+ labelFontSize?: string | number;
+
+ /**
+ * 线宽
+ */
+ lineWidth?: string | number;
+
+ /**
+ * 圆角环直径大小(宽高相等)
+ */
+ size?: string | number;
+
+ /**
+ * 动画持续时间(毫秒)
+ */
+ duration?: number
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-circle-progress/tm-circle-progress.vue b/src/uni_modules/tm-ui/components/tm-circle-progress/tm-circle-progress.vue
new file mode 100644
index 0000000..5fa3681
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-circle-progress/tm-circle-progress.vue
@@ -0,0 +1,336 @@
+
+
+
+
+
+
+
+
+
+ {{ percent.toFixed(0) }}{{ _labelUnit }}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-code-input/tm-code-input.vue b/src/uni_modules/tm-ui/components/tm-code-input/tm-code-input.vue
new file mode 100644
index 0000000..9d20136
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-code-input/tm-code-input.vue
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+ {{ getValue(index) }}
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-col/tm-col.vue b/src/uni_modules/tm-ui/components/tm-col/tm-col.vue
index 6ec2a8a..8133e39 100644
--- a/src/uni_modules/tm-ui/components/tm-col/tm-col.vue
+++ b/src/uni_modules/tm-ui/components/tm-col/tm-col.vue
@@ -1,76 +1,76 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-collapse-item/tm-collapse-item.vue b/src/uni_modules/tm-ui/components/tm-collapse-item/tm-collapse-item.vue
index c740aca..6ce21b2 100644
--- a/src/uni_modules/tm-ui/components/tm-collapse-item/tm-collapse-item.vue
+++ b/src/uni_modules/tm-ui/components/tm-collapse-item/tm-collapse-item.vue
@@ -1,332 +1,327 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ _title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-collapse/tm-collapse.vue b/src/uni_modules/tm-ui/components/tm-collapse/tm-collapse.vue
index 59777c3..c3ddf09 100644
--- a/src/uni_modules/tm-ui/components/tm-collapse/tm-collapse.vue
+++ b/src/uni_modules/tm-ui/components/tm-collapse/tm-collapse.vue
@@ -1,116 +1,113 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-countdown/tm-countdown.vue b/src/uni_modules/tm-ui/components/tm-countdown/tm-countdown.vue
new file mode 100644
index 0000000..525c239
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-countdown/tm-countdown.vue
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+ {{_label.format}}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-date-view/tm-date-view.vue b/src/uni_modules/tm-ui/components/tm-date-view/tm-date-view.vue
index 6d12009..f54e5b3 100644
--- a/src/uni_modules/tm-ui/components/tm-date-view/tm-date-view.vue
+++ b/src/uni_modules/tm-ui/components/tm-date-view/tm-date-view.vue
@@ -1,470 +1,491 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-drawer/tm-drawer.vue b/src/uni_modules/tm-ui/components/tm-drawer/tm-drawer.vue
index b99c0f7..bc8fc08 100644
--- a/src/uni_modules/tm-ui/components/tm-drawer/tm-drawer.vue
+++ b/src/uni_modules/tm-ui/components/tm-drawer/tm-drawer.vue
@@ -1,773 +1,857 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ _title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ _title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-dropdown-item/propsType.ts b/src/uni_modules/tm-ui/components/tm-dropdown-item/propsType.ts
new file mode 100644
index 0000000..ee5485d
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-dropdown-item/propsType.ts
@@ -0,0 +1,45 @@
+export type TmDropdownItemProps = {
+ /**
+ * 菜单标题
+ */
+ title?: string;
+ /**
+ * 标识,变换或者点击时,会通过事件传回。不要与其它选项相同,必须是唯一
+ */
+ keyName?: string|number;
+ /**
+ * 未选中时的图标
+ */
+ icon?: string;
+ /**
+ * 激活时的图标
+ */
+ activeIcon?: string;
+ /**
+ * 默认的文字及图标颜色
+ */
+ fontColor?: string;
+ /**
+ * 暗黑时的默认的文字及图标颜色,
+ * 空取时白色
+ */
+ darkFontColor?: string;
+ /**
+ * 文字及图标大小
+ */
+ fontSize?: string;
+ /**
+ * 激活的文字及图标颜色
+ * 空值时取全局统一的主题色。
+ */
+ activeFontColor?: string;
+ /**
+ * 是否是按钮选项。
+ */
+ isBtn?: boolean;
+
+
+}
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-dropdown-item/tm-dropdown-item.vue b/src/uni_modules/tm-ui/components/tm-dropdown-item/tm-dropdown-item.vue
new file mode 100644
index 0000000..685282e
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-dropdown-item/tm-dropdown-item.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-dropdown-menu/propsType.ts b/src/uni_modules/tm-ui/components/tm-dropdown-menu/propsType.ts
new file mode 100644
index 0000000..b7b336b
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-dropdown-menu/propsType.ts
@@ -0,0 +1,109 @@
+export type TmDropdownMenuPropsPositions = "static" | "fixed";
+export type TmDropdownMenuProps = {
+ /**
+ * 展现方式。
+ * static静态
+ * fixed展开后悬浮在顶部。
+ */
+ position?: TmDropdownMenuPropsPositions;
+ /**
+ * 顶部的偏移量,如果你要让出顶部距离可以设置此值。
+ * 数字字符,prx,px等单位
+ * 如果position=static此属性失效。
+ */
+ offsetTop?: string;
+ /**
+ * 当前激活的索引标识,就是你子项上的keyName值
+ * 匹配不到时关闭。所以要关闭,只要填充一个不存在的keyName值即可。
+ */
+ modelValue?: number|string;
+ /**
+ * 菜单栏的高度
+ */
+ height?: string;
+ /**
+ * 宽度
+ */
+ width?: string;
+ /**
+ * 背景颜色
+ */
+ color?: string;
+ /**
+ * 暗黑时的背景颜色
+ */
+ darkColor?: string;
+ /**
+ * 层级
+ */
+ zIndex?: number;
+ /**
+ * 对于要把此组件嵌套在布局组件时,应该要隐藏遮罩,否则不好看。
+ */
+ hidnMask?: boolean;
+ /**
+ * 内容背景颜色
+ */
+ contentColor?: string;
+ /**
+ * 暗黑时的内容背景颜色,空值取sheetDarkColor
+ */
+ contentDarkColor?: string;
+ /**
+ * 圆角值,要注意:开启后:菜单也会有圆角,但有区别:默认未展开时四周圆角。
+ * 当展开时,内容底部圆角,菜单顶部圆角,这样形成上下一体的外观。
+ */
+ round?: string;
+ /**
+ * 内容样式padding,请使用css规则
+ */
+ contentPadding?: string;
+}
+export type tmDropDownMenuItemType={
+ /**
+ * 菜单标题
+ */
+ title: string;
+ /**
+ * 标识,变换或者点击时,会通过事件传回。
+ */
+ keyName: string|number;
+ /**
+ * 未选中时的图标
+ */
+ icon?: string;
+ /**
+ * 激活时的图标
+ */
+ activeIcon?: string;
+ /**
+ * 默认的文字及图标颜色
+ */
+ fontColor: string;
+ /**
+ * 暗黑时的默认的文字及图标颜色,
+ * 空取时白色
+ */
+ darkFontColor: string;
+ /**
+ * 文字及图标大小
+ */
+ fontSize: string;
+ /**
+ * 激活的文字及图标颜色
+ * 空值时取全局统一的主题色。
+ */
+ activeFontColor: string;
+ /**
+ * 是否是按钮选项。
+ */
+ isBtn: boolean;
+
+}
+
+
+export type tmDropdownMenuTypeProide = {
+ activeName: number|string;
+ getNodes():Promise;
+ zIndex:number;
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-dropdown-menu/tm-dropdown-menu.vue b/src/uni_modules/tm-ui/components/tm-dropdown-menu/tm-dropdown-menu.vue
new file mode 100644
index 0000000..5b44f54
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-dropdown-menu/tm-dropdown-menu.vue
@@ -0,0 +1,355 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-echart/canvasinit.ts b/src/uni_modules/tm-ui/components/tm-echart/canvasinit.ts
index 9dfa139..b194df9 100644
--- a/src/uni_modules/tm-ui/components/tm-echart/canvasinit.ts
+++ b/src/uni_modules/tm-ui/components/tm-echart/canvasinit.ts
@@ -1,109 +1,109 @@
-// @ts-nocheck
-export default class WxCanvas {
- constructor(ctx, canvasId, isNew, canvasNode) {
- this.ctx = ctx;
- this.canvasId = canvasId;
- this.chart = null;
- this.isNew = isNew
- if (isNew) {
- this.canvasNode = canvasNode;
- }
- else {
- this._initStyle(ctx);
- }
-
- // this._initCanvas(zrender, ctx);
-
- this._initEvent();
- }
-
- getContext(contextType) {
- if (contextType === '2d') {
- return this.ctx;
- }
- }
-
- // canvasToTempFilePath(opt) {
- // if (!opt.canvasId) {
- // opt.canvasId = this.canvasId;
- // }
- // return wx.canvasToTempFilePath(opt, this);
- // }
-
- setChart(chart) {
- this.chart = chart;
- }
-
- attachEvent() {
- // noop
- }
-
- detachEvent() {
- // noop
- }
-
- _initCanvas(zrender, ctx) {
- zrender.util.getContext = function () {
- return ctx;
- };
-
- zrender.util.$override('measureText', function (text, font) {
- ctx.font = font || '12px sans-serif';
- return ctx.measureText(text);
- });
- }
-
- _initStyle(ctx) {
- // @ts-ignore
- ctx.createRadialGradient = () => {
- return ctx.createCircularGradient(arguments);
- };
- }
-
- _initEvent() {
- this.event = {};
- const eventNames = [{
- wxName: 'touchStart',
- ecName: 'mousedown'
- }, {
- wxName: 'touchMove',
- ecName: 'mousemove'
- }, {
- wxName: 'touchEnd',
- ecName: 'mouseup'
- }, {
- wxName: 'touchEnd',
- ecName: 'click'
- }];
-
- eventNames.forEach(name => {
- this.event[name.wxName] = e => {
- const touch = e.touches[0];
- this.chart.getZr().handler.dispatch(name.ecName, {
- zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
- zrY: name.wxName === 'tap' ? touch.clientY : touch.y
- });
- };
- });
- }
- addEventListener(el, name, handler, opt) {
- // el?.addEventListener(name, handler, opt);
- }
- set width(w) {
- if (this.canvasNode) this.canvasNode.width = w
- }
- set height(h) {
- if (this.canvasNode) this.canvasNode.height = h
- }
-
- get width() {
- if (this.canvasNode)
- return this.canvasNode.width
- return 0
- }
- get height() {
- if (this.canvasNode)
- return this.canvasNode.height
- return 0
- }
+// @ts-nocheck
+export default class WxCanvas {
+ constructor(ctx, canvasId, isNew, canvasNode) {
+ this.ctx = ctx;
+ this.canvasId = canvasId;
+ this.chart = null;
+ this.isNew = isNew
+ if (isNew) {
+ this.canvasNode = canvasNode;
+ }
+ else {
+ this._initStyle(ctx);
+ }
+
+ // this._initCanvas(zrender, ctx);
+
+ this._initEvent();
+ }
+
+ getContext(contextType) {
+ if (contextType === '2d') {
+ return this.ctx;
+ }
+ }
+
+ // canvasToTempFilePath(opt) {
+ // if (!opt.canvasId) {
+ // opt.canvasId = this.canvasId;
+ // }
+ // return wx.canvasToTempFilePath(opt, this);
+ // }
+
+ setChart(chart) {
+ this.chart = chart;
+ }
+
+ attachEvent() {
+ // noop
+ }
+
+ detachEvent() {
+ // noop
+ }
+
+ _initCanvas(zrender, ctx) {
+ zrender.util.getContext = function () {
+ return ctx;
+ };
+
+ zrender.util.$override('measureText', function (text, font) {
+ ctx.font = font || '12px sans-serif';
+ return ctx.measureText(text);
+ });
+ }
+
+ _initStyle(ctx) {
+ // @ts-ignore
+ ctx.createRadialGradient = () => {
+ return ctx.createCircularGradient(arguments);
+ };
+ }
+
+ _initEvent() {
+ this.event = {};
+ const eventNames = [{
+ wxName: 'touchStart',
+ ecName: 'mousedown'
+ }, {
+ wxName: 'touchMove',
+ ecName: 'mousemove'
+ }, {
+ wxName: 'touchEnd',
+ ecName: 'mouseup'
+ }, {
+ wxName: 'touchEnd',
+ ecName: 'click'
+ }];
+
+ eventNames.forEach(name => {
+ this.event[name.wxName] = e => {
+ const touch = e.touches[0];
+ this.chart.getZr().handler.dispatch(name.ecName, {
+ zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
+ zrY: name.wxName === 'tap' ? touch.clientY : touch.y
+ });
+ };
+ });
+ }
+ addEventListener(el, name, handler, opt) {
+ // el?.addEventListener(name, handler, opt);
+ }
+ set width(w) {
+ if (this.canvasNode) this.canvasNode.width = w
+ }
+ set height(h) {
+ if (this.canvasNode) this.canvasNode.height = h
+ }
+
+ get width() {
+ if (this.canvasNode)
+ return this.canvasNode.width
+ return 0
+ }
+ get height() {
+ if (this.canvasNode)
+ return this.canvasNode.height
+ return 0
+ }
}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-echart/simple.js b/src/uni_modules/tm-ui/components/tm-echart/simple.js
index 7e77e4d..2b2b916 100644
--- a/src/uni_modules/tm-ui/components/tm-echart/simple.js
+++ b/src/uni_modules/tm-ui/components/tm-echart/simple.js
@@ -1,12 +1,14 @@
-import { use } from 'echarts/lib/extension.js';
-export * from 'echarts/lib/export/core.js';
-import { install as CanvasRenderer } from 'echarts/lib/renderer/installCanvasRenderer.js';
-import { install as LineChart } from 'echarts/lib/chart/line/install.js';
-import { install as BarChart } from 'echarts/lib/chart/bar/install.js';
-import { install as PieChart } from 'echarts/lib/chart/pie/install.js';
-import { install as GridSimpleComponent } from 'echarts/lib/component/grid/installSimple.js';
-import { install as AriaComponent } from 'echarts/lib/component/aria/install.js';
-import { install as DatasetComponent } from 'echarts/lib/component/dataset/install.js';
-use([CanvasRenderer]);
-use([LineChart, BarChart, PieChart]);
-use([GridSimpleComponent, AriaComponent, DatasetComponent]);
\ No newline at end of file
+import { use } from 'echarts/lib/extension.js';
+export * from 'echarts/lib/export/core.js';
+import { install as CanvasRenderer } from 'echarts/lib/renderer/installCanvasRenderer.js';
+import { install as LineChart } from 'echarts/lib/chart/line/install.js';
+import { install as BarChart } from 'echarts/lib/chart/bar/install.js';
+import { install as PieChart } from 'echarts/lib/chart/pie/install.js';
+import { install as GridSimpleComponent } from 'echarts/lib/component/grid/installSimple.js';
+import { install as AriaComponent } from 'echarts/lib/component/aria/install.js';
+import { install as DatasetComponent } from 'echarts/lib/component/dataset/install.js';
+import { install as Tooltip } from 'echarts/lib/component/tooltip/install.js';
+
+use([CanvasRenderer]);
+use([LineChart, BarChart, PieChart]);
+use([GridSimpleComponent, AriaComponent, DatasetComponent,Tooltip]);
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-echart/tm-echart.vue b/src/uni_modules/tm-ui/components/tm-echart/tm-echart.vue
index 6e0f548..e9dc19c 100644
--- a/src/uni_modules/tm-ui/components/tm-echart/tm-echart.vue
+++ b/src/uni_modules/tm-ui/components/tm-echart/tm-echart.vue
@@ -1,397 +1,441 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-float-drawer/tm-float-drawer.vue b/src/uni_modules/tm-ui/components/tm-float-drawer/tm-float-drawer.vue
new file mode 100644
index 0000000..f2af75f
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-float-drawer/tm-float-drawer.vue
@@ -0,0 +1,684 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-form-item/tm-form-item.vue b/src/uni_modules/tm-ui/components/tm-form-item/tm-form-item.vue
index 1fb12c9..42f3151 100644
--- a/src/uni_modules/tm-ui/components/tm-form-item/tm-form-item.vue
+++ b/src/uni_modules/tm-ui/components/tm-form-item/tm-form-item.vue
@@ -1,262 +1,280 @@
-
-
-
-
-
-
-
- {{ _required }}
-
- {{ _label }}
-
-
-
-
-
-
-
-
- {{ errorMessage }}
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-form/tm-form.vue b/src/uni_modules/tm-ui/components/tm-form/tm-form.vue
index bd9832c..fb4b7f6 100644
--- a/src/uni_modules/tm-ui/components/tm-form/tm-form.vue
+++ b/src/uni_modules/tm-ui/components/tm-form/tm-form.vue
@@ -1,212 +1,248 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-form/validator.ts b/src/uni_modules/tm-ui/components/tm-form/validator.ts
index 815e710..d50289e 100644
--- a/src/uni_modules/tm-ui/components/tm-form/validator.ts
+++ b/src/uni_modules/tm-ui/components/tm-form/validator.ts
@@ -1,82 +1,82 @@
-//指定了类型校验
-const defaultValidatorByType = (value: any, rule: TM.FORM_RULE_TYPE) => {
-
- //但也有可能是string
- if (rule.type == 'number') {
- let val = typeof value == 'string' ? parseFloat(value) : value
- if (isNaN(value)) return false;
- if (rule.max == -1) return value >= rule.min
- return value >= rule.min && value <= rule.max
- }
- if (typeof value == 'undefined' || typeof value == null) {
- return false
- }
- if (rule.type == 'string') {
- let val = value.trim()
- if (val === '') return false;
- let len = value.split('').length
- if (rule.max == -1) return len >= rule.min
- return len >= rule.min && len <= rule.max
- }
- if (Array.isArray(value) && rule.type == 'array') {
- if (value.length == 0) return false;
- if (rule.max == -1) return value.length >= rule.min
- return value.length >= rule.min && value.length <= rule.max
- }
-
- if (rule.type == 'date') {
- if (typeof value == 'string') {
- let date = new Date(value.replace(/-/g, '/')).getTime()
- return !isNaN(date)
- } else if (typeof value == 'number') {
- let date = new Date(value).getTime()
- return !isNaN(date)
- }
- }
- if (rule.type == 'phone') {
- let val = typeof value == 'string' ? value : value.toString()
- let reg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
- return val.match(reg);
- }
- if (rule.type == 'email' && typeof value == 'string') {
- let reg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
- return reg.test(value)
- }
-
- return true
-}
-export const defaultValidator = (value: any, rule: TM.FORM_RULE_TYPE) => {
- if (!rule.required) return true;
- if(rule.validator) return rule.validator(value);
- if(rule.rule) {
- return rule.rule.test(value);
- }
- if (rule.type != 'auto') return defaultValidatorByType(value, rule)
- if (typeof value == 'number') {
- if (isNaN(value)) return false;
- if (rule.max == -1) return value >= rule.min
- return value >= rule.min && value <= rule.max
- }
- if (typeof value == 'undefined' || typeof value == null) {
- return false
- }
- if (typeof value == 'string') {
- let val = value.trim()
- if (val === '') return false;
- let len = value.split('').length
- if (rule.max == -1) return len >= rule.min
- return len >= rule.min && len <= rule.max
- }
- if (Array.isArray(value)) {
- if (value.length == 0) return false;
- if (rule.max == -1) return value.length >= rule.min
- return value.length >= rule.min && value.length <= rule.max
- }
-
- if (typeof value == 'object') {
- let keys = Object.keys(value)
- return keys.length > 0
- }
-
- return true
-}
+//指定了类型校验
+const defaultValidatorByType = (value: any, rule: TM.FORM_RULE_TYPE) => {
+
+ //但也有可能是string
+ if (rule.type == 'number') {
+ let val = typeof value == 'string' ? parseFloat(value) : value
+ if (isNaN(val)) return false;
+ if (rule.max == -1) return val >= rule.min
+ return val >= rule.min && val <= rule.max
+ }
+ if (typeof value == 'undefined' || value == null) {
+ return false
+ }
+ if (rule.type == 'string') {
+ let val = value.trim()
+ if (val === '') return false;
+ let len = value.split('').length
+ if (rule.max == -1) return len >= rule.min
+ return len >= rule.min && len <= rule.max
+ }
+ if (Array.isArray(value) && rule.type == 'array') {
+ if (value.length == 0) return false;
+ if (rule.max == -1) return value.length >= rule.min
+ return value.length >= rule.min && value.length <= rule.max
+ }
+
+ if (rule.type == 'date') {
+ if (typeof value == 'string') {
+ let date = new Date(value.replace(/-/g, '/')).getTime()
+ return !isNaN(date)
+ } else if (typeof value == 'number') {
+ let date = new Date(value).getTime()
+ return !isNaN(date)
+ }
+ }
+ if (rule.type == 'phone') {
+ let val = typeof value == 'string' ? value : value.toString()
+ let reg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
+ return val.match(reg);
+ }
+ if (rule.type == 'email' && typeof value == 'string') {
+ let reg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
+ return reg.test(value)
+ }
+
+ return true
+}
+export const defaultValidator = (value: any, rule: TM.FORM_RULE_TYPE) => {
+ if (!rule.required) return true;
+ if(rule.validator) return rule.validator(value);
+ if(rule.rule) {
+ return rule.rule.test(value);
+ }
+ if (rule.type != 'auto') return defaultValidatorByType(value, rule)
+ if (typeof value == 'number') {
+ if (isNaN(value)) return false;
+ if (rule.max == -1) return value >= rule.min
+ return value >= rule.min && value <= rule.max
+ }
+ if (typeof value == 'undefined' || value == null) {
+ return false
+ }
+ if (typeof value == 'string') {
+ let val = value.trim()
+ if (val === '') return false;
+ let len = value.split('').length
+ if (rule.max == -1) return len >= rule.min
+ return len >= rule.min && len <= rule.max
+ }
+ if (Array.isArray(value)) {
+ if (value.length == 0) return false;
+ if (rule.max == -1) return value.length >= rule.min
+ return value.length >= rule.min && value.length <= rule.max
+ }
+
+ if (typeof value == 'object'&&value!=null) {
+ let keys = Object.keys(value)
+ return keys.length > 0
+ }
+
+ return true
+}
diff --git a/src/uni_modules/tm-ui/components/tm-html/mp-node.vue b/src/uni_modules/tm-ui/components/tm-html/mp-node.vue
index f6d298c..cf5e9f1 100644
--- a/src/uni_modules/tm-ui/components/tm-html/mp-node.vue
+++ b/src/uni_modules/tm-ui/components/tm-html/mp-node.vue
@@ -1,623 +1,649 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{n.text}}
-
-
- {{n.text}}
-
- \n
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-html/pare.ts b/src/uni_modules/tm-ui/components/tm-html/pare.ts
index d668227..c1fdd18 100644
--- a/src/uni_modules/tm-ui/components/tm-html/pare.ts
+++ b/src/uni_modules/tm-ui/components/tm-html/pare.ts
@@ -1,1395 +1,1396 @@
-/**
- * @fileoverview html 解析器
- */
-
-// 配置
-const config = {
- // 信任的标签(保持标签名不变)
- trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),
-
- // 块级标签(转为 div,其他的非信任标签转为 span)
- blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
-
- // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
- // 行内标签
- inlineTags: makeMap('abbr,b,big,code,del,em,i,ins,label,q,small,span,strong,sub,sup'),
- // #endif
-
- // 要移除的标签
- ignoreTags: makeMap('area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'),
-
- // 自闭合的标签
- voidTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
-
- // html 实体
- entities: {
- lt: '<',
- gt: '>',
- quot: '"',
- apos: "'",
- ensp: '\u2002',
- emsp: '\u2003',
- nbsp: '\xA0',
- semi: ';',
- ndash: '–',
- mdash: '—',
- middot: '·',
- lsquo: '‘',
- rsquo: '’',
- ldquo: '“',
- rdquo: '”',
- bull: '•',
- hellip: '…',
- larr: '←',
- uarr: '↑',
- rarr: '→',
- darr: '↓'
- },
-
- // 默认的标签样式
- tagStyle: {
- // #ifndef APP-PLUS-NVUE
- address: 'font-style:italic',
- big: 'display:inline;font-size:1.2em',
- caption: 'display:table-caption;text-align:center',
- center: 'text-align:center',
- cite: 'font-style:italic',
- dd: 'margin-left:40px',
- mark: 'background-color:yellow',
- pre: 'font-family:monospace;white-space:pre',
- s: 'text-decoration:line-through',
- small: 'display:inline;font-size:0.8em',
- strike: 'text-decoration:line-through',
- u: 'text-decoration:underline'
- // #endif
- },
-
- // svg 大小写对照表
- svgDict: {
- animatetransform: 'animateTransform',
- lineargradient: 'linearGradient',
- viewbox: 'viewBox',
- attributename: 'attributeName',
- repeatcount: 'repeatCount',
- repeatdur: 'repeatDur',
- foreignobject: 'foreignObject'
- }
-}
-const tagSelector = {}
-const {
- windowWidth,
- // #ifdef MP-WEIXIN
- system
- // #endif
-} = uni.getSystemInfoSync()
-const blankChar = makeMap(' ,\r,\n,\t,\f')
-let idIndex = 0
-
-// #ifdef H5 || APP-PLUS
-config.ignoreTags.iframe = undefined
-config.trustTags.iframe = true
-config.ignoreTags.embed = undefined
-config.trustTags.embed = true
-// #endif
-// #ifdef APP-PLUS-NVUE
-config.ignoreTags.source = undefined
-config.ignoreTags.style = undefined
-// #endif
-
-/**
- * @description 创建 map
- * @param {String} str 逗号分隔
- */
-function makeMap(str) {
- const map = Object.create(null)
- const list = str.split(',')
- for (let i = list.length; i--;) {
- map[list[i]] = true
- }
- return map
-}
-
-/**
- * @description 解码 html 实体
- * @param {String} str 要解码的字符串
- * @param {Boolean} amp 要不要解码 &
- * @returns {String} 解码后的字符串
- */
-function decodeEntity(str, amp) {
- let i = str.indexOf('&')
- while (i !== -1) {
- const j = str.indexOf(';', i + 3)
- let code
- if (j === -1) break
- if (str[i + 1] === '#') {
- // { 形式的实体
- code = parseInt((str[i + 2] === 'x' ? '0' : '') + str.substring(i + 2, j))
- if (!isNaN(code)) {
- str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1)
- }
- } else {
- // 形式的实体
- code = str.substring(i + 1, j)
- if (config.entities[code] || (code === 'amp' && amp)) {
- str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1)
- }
- }
- i = str.indexOf('&', i + 1)
- }
- return str
-}
-
-/**
- * @description 合并多个块级标签,加快长内容渲染
- * @param {Array} nodes 要合并的标签数组
- */
-function mergeNodes(nodes) {
- let i = nodes.length - 1
- for (let j = i; j >= -1; j--) {
- if (j === -1 || nodes[j].c || !nodes[j].name || (nodes[j].name !== 'div' && nodes[j].name !== 'p' && nodes[j].name[0] !== 'h') || (nodes[j].attrs.style || '').includes('inline')) {
- if (i - j >= 5) {
- nodes.splice(j + 1, i - j, {
- name: 'div',
- attrs: {},
- children: nodes.slice(j + 1, i + 1)
- })
- }
- i = j - 1
- }
- }
-}
-
-/**
- * @description html 解析器
- * @param {Object} vm 组件实例
- */
-function Parser(vm) {
-
- this.options = vm || {}
-
- this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle)
- this.imgList = vm.imgList || []
- this.imgList._unloadimgs = 0
- this.plugins = vm.plugins || []
- this.attrs = Object.create(null)
- this.stack = []
- this.nodes = []
- this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes('pre') ? 2 : 0
-}
-
-/**
- * @description 执行解析
- * @param {String} content 要解析的文本
- */
-Parser.prototype.parse = function (content) {
- // 插件处理
- for (let i = this.plugins.length; i--;) {
- if (this.plugins[i].onUpdate) {
- content = this.plugins[i].onUpdate(content, config) || content
- }
- }
-
- new Lexer(this).parse(content)
- // 出栈未闭合的标签
- while (this.stack.length) {
- this.popNode()
- }
- if (this.nodes.length > 50) {
- mergeNodes(this.nodes)
- }
- return this.nodes
-}
-
-/**
- * @description 将标签暴露出来(不被 rich-text 包含)
- */
-Parser.prototype.expose = function () {
- // #ifndef APP-PLUS-NVUE
- for (let i = this.stack.length; i--;) {
- const item = this.stack[i]
- if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') return
- item.c = 1
- }
- // #endif
-}
-
-/**
- * @description 处理插件
- * @param {Object} node 要处理的标签
- * @returns {Boolean} 是否要移除此标签
- */
-Parser.prototype.hook = function (node) {
- for (let i = this.plugins.length; i--;) {
- if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {
- return false
- }
- }
- return true
-}
-
-/**
- * @description 将链接拼接上主域名
- * @param {String} url 需要拼接的链接
- * @returns {String} 拼接后的链接
- */
-Parser.prototype.getUrl = function (url) {
- const domain = this.options.domain
- if (url[0] === '/') {
- if (url[1] === '/') {
- // // 开头的补充协议名
- url = (domain ? domain.split('://')[0] : 'http') + ':' + url
- } else if (domain) {
- // 否则补充整个域名
- url = domain + url
- } /* #ifdef APP-PLUS */ else {
- url = plus.io.convertLocalFileSystemURL(url)
- } /* #endif */
- } else if (!url.includes('data:') && !url.includes('://')) {
- if (domain) {
- url = domain + '/' + url
- } /* #ifdef APP-PLUS */ else {
- url = plus.io.convertLocalFileSystemURL(url)
- } /* #endif */
- }
- return url
-}
-
-/**
- * @description 解析样式表
- * @param {Object} node 标签
- * @returns {Object}
- */
-Parser.prototype.parseStyle = function (node) {
- const attrs = node.attrs
- const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'))
- const styleObj = {}
- let tmp = ''
-
- if (attrs.id && !this.xml) {
- // 暴露锚点
- if (this.options.useAnchor) {
- this.expose()
- } else if (node.name !== 'img' && node.name !== 'a' && node.name !== 'video' && node.name !== 'audio') {
- attrs.id = undefined
- }
- }
-
- // 转换 width 和 height 属性
- if (attrs.width) {
- styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')
- attrs.width = undefined
- }
- if (attrs.height) {
- styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')
- attrs.height = undefined
- }
-
- for (let i = 0, len = list.length; i < len; i++) {
- const info = list[i].split(':')
- if (info.length < 2) continue
- const key = info.shift().trim().toLowerCase()
- let value = info.join(':').trim()
- if ((value[0] === '-' && value.lastIndexOf('-') > 0) || value.includes('safe')) {
- // 兼容性的 css 不压缩
- tmp += `;${key}:${value}`
- } else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {
- // 重复的样式进行覆盖
- if (value.includes('url')) {
- // 填充链接
- let j = value.indexOf('(') + 1
- if (j) {
- while (value[j] === '"' || value[j] === "'" || blankChar[value[j]]) {
- j++
- }
- value = value.substr(0, j) + this.getUrl(value.substr(j))
- }
- } else if (value.includes('rpx')) {
- // 转换 rpx(rich-text 内部不支持 rpx)
- value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px')
- }
- styleObj[key] = value
- }
- }
-
- node.attrs.style = tmp
- return styleObj
-}
-
-/**
- * @description 解析到标签名
- * @param {String} name 标签名
- * @private
- */
-Parser.prototype.onTagName = function (name) {
- this.tagName = this.xml ? name : name.toLowerCase()
- if (this.tagName === 'svg') {
- this.xml = (this.xml || 0) + 1 // svg 标签内大小写敏感
- config.ignoreTags.style = undefined // svg 标签内 style 可用
- }
-}
-
-/**
- * @description 解析到属性名
- * @param {String} name 属性名
- * @private
- */
-Parser.prototype.onAttrName = function (name) {
- name = this.xml ? name : name.toLowerCase()
- // #ifdef (VUE3 && (H5 || APP-PLUS)) || APP-PLUS-NVUE
- if (name.includes('?') || name.includes(';')) {
- this.attrName = undefined
- return
- }
- // #endif
- if (name.substr(0, 5) === 'data-') {
- if (name === 'data-src' && !this.attrs.src) {
- // data-src 自动转为 src
- this.attrName = 'src'
- } else if (this.tagName === 'img' || this.tagName === 'a') {
- // a 和 img 标签保留 data- 的属性,可以在 imgtap 和 linktap 事件中使用
- this.attrName = name
- } else {
- // 剩余的移除以减小大小
- this.attrName = undefined
- }
- } else {
- this.attrName = name
- this.attrs[name] = 'T' // boolean 型属性缺省设置
- }
-}
-
-/**
- * @description 解析到属性值
- * @param {String} val 属性值
- * @private
- */
-Parser.prototype.onAttrVal = function (val) {
- const name = this.attrName || ''
- if (name === 'style' || name === 'href') {
- // 部分属性进行实体解码
- this.attrs[name] = decodeEntity(val, true)
- } else if (name.includes('src')) {
- // 拼接主域名
- this.attrs[name] = this.getUrl(decodeEntity(val, true))
- } else if (name) {
- this.attrs[name] = val
- }
-}
-
-/**
- * @description 解析到标签开始
- * @param {Boolean} selfClose 是否有自闭合标识 />
- * @private
- */
-Parser.prototype.onOpenTag = function (selfClose) {
- // 拼装 node
- const node = Object.create(null)
- node.name = this.tagName
- node.attrs = this.attrs
- // 避免因为自动 diff 使得 type 被设置为 null 导致部分内容不显示
- if (this.options.nodes.length) {
- node.type = 'node'
- }
- this.attrs = Object.create(null)
-
- const attrs = node.attrs
- const parent = this.stack[this.stack.length - 1]
- const siblings = parent ? parent.children : this.nodes
- const close = this.xml ? selfClose : config.voidTags[node.name]
-
- // 替换标签名选择器
- if (tagSelector[node.name]) {
- attrs.class = tagSelector[node.name] + (attrs.class ? ' ' + attrs.class : '')
- }
-
- // 转换 embed 标签
- if (node.name === 'embed') {
- // #ifndef H5 || APP-PLUS
- const src = attrs.src || ''
- // 按照后缀名和 type 将 embed 转为 video 或 audio
- if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes('video')) {
- node.name = 'video'
- } else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (attrs.type || '').includes('audio')) {
- node.name = 'audio'
- }
- if (attrs.autostart) {
- attrs.autoplay = 'T'
- }
- attrs.controls = 'T'
- // #endif
- // #ifdef H5 || APP-PLUS
- this.expose()
- // #endif
- }
-
- // #ifndef APP-PLUS-NVUE
- // 处理音视频
- if (node.name === 'video' || node.name === 'audio') {
- // 设置 id 以便获取 context
- if (node.name === 'video' && !attrs.id) {
- attrs.id = 'v' + idIndex++
- }
- // 没有设置 controls 也没有设置 autoplay 的自动设置 controls
- if (!attrs.controls && !attrs.autoplay) {
- attrs.controls = 'T'
- }
- // 用数组存储所有可用的 source
- node.src = []
- if (attrs.src) {
- node.src.push(attrs.src)
- attrs.src = undefined
- }
- this.expose()
- }
- // #endif
-
- // 处理自闭合标签
- if (close) {
- if (!this.hook(node) || config.ignoreTags[node.name]) {
- // 通过 base 标签设置主域名
- if (node.name === 'base' && !this.options.domain) {
- this.options.domain = attrs.href
- } /* #ifndef APP-PLUS-NVUE */ else if (node.name === 'source' && parent && (parent.name === 'video' || parent.name === 'audio') && attrs.src) {
- // 设置 source 标签(仅父节点为 video 或 audio 时有效)
- parent.src.push(attrs.src)
- } /* #endif */
- return
- }
-
- // 解析 style
- const styleObj = this.parseStyle(node)
-
- // 处理图片
- if (node.name === 'img') {
- if (attrs.src) {
- // 标记 webp
- if (attrs.src.includes('webp')) {
- node.webp = 'T'
- }
- // data url 图片如果没有设置 original-src 默认为不可预览的小图片
- if (attrs.src.includes('data:') && this.options.previewImg !== 'all' && !attrs['original-src']) {
- attrs.ignore = 'T'
- }
- if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) {
- for (let i = this.stack.length; i--;) {
- const item = this.stack[i]
- if (item.name === 'a') {
- node.a = item.attrs
- }
- if (item.name === 'table' && !node.webp && !attrs.src.includes('cloud://')) {
- if (!styleObj.display || styleObj.display.includes('inline')) {
- node.t = 'inline-block'
- } else {
- node.t = styleObj.display
- }
- styleObj.display = undefined
- }
- // #ifndef H5 || APP-PLUS
- const style = item.attrs.style || ''
- if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || parseInt(styleObj.width) > 100)) {
- styleObj.width = '100% !important'
- styleObj.height = ''
- for (let j = i + 1; j < this.stack.length; j++) {
- this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '')
- }
- } else if (style.includes('flex') && styleObj.width === '100%') {
- for (let j = i + 1; j < this.stack.length; j++) {
- const style = this.stack[j].attrs.style || ''
- if (!style.includes(';width') && !style.includes(' width') && style.indexOf('width') !== 0) {
- styleObj.width = ''
- break
- }
- }
- } else if (style.includes('inline-block')) {
- if (styleObj.width && styleObj.width[styleObj.width.length - 1] === '%') {
- item.attrs.style += ';max-width:' + styleObj.width
- styleObj.width = ''
- } else {
- item.attrs.style += ';max-width:100%'
- }
- }
- // #endif
- item.c = 1
- }
- attrs.i = this.imgList.length.toString()
- let src = attrs['original-src'] || attrs.src
- // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360
- if (this.imgList.includes(src)) {
- // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位
- let i = src.indexOf('://')
- if (i !== -1) {
- i += 3
- let newSrc = src.substr(0, i)
- for (; i < src.length; i++) {
- if (src[i] === '/') break
- newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i]
- }
- newSrc += src.substr(i)
- src = newSrc
- }
- }
- // #endif
- this.imgList.push(src)
- if (!node.t) {
- this.imgList._unloadimgs += 1
- }
- // #ifdef H5 || APP-PLUS
- if (this.options.lazyLoad) {
- attrs['data-src'] = attrs.src
- attrs.src = undefined
- }
- // #endif
- }
- }
- if (styleObj.display === 'inline') {
- styleObj.display = ''
- }
- // #ifndef APP-PLUS-NVUE
- if (attrs.ignore) {
- styleObj['max-width'] = styleObj['max-width'] || '100%'
- attrs.style += ';-webkit-touch-callout:none'
- }
- // #endif
- // 设置的宽度超出屏幕,为避免变形,高度转为自动
- if (parseInt(styleObj.width) > windowWidth) {
- styleObj.height = undefined
- }
- // 记录是否设置了宽高
- if (!isNaN(parseInt(styleObj.width))) {
- node.w = 'T'
- }
- if (!isNaN(parseInt(styleObj.height)) && (!styleObj.height.includes('%') || (parent && (parent.attrs.style || '').includes('height')))) {
- node.h = 'T'
- }
- if (node.w && node.h && styleObj['object-fit']) {
- if (styleObj['object-fit'] === 'contain') {
- node.m = 'aspectFit'
- } else if (styleObj['object-fit'] === 'cover') {
- node.m = 'aspectFill'
- }
- }
- } else if (node.name === 'svg') {
- siblings.push(node)
- this.stack.push(node)
- this.popNode()
- return
- }
- for (const key in styleObj) {
- if (styleObj[key]) {
- attrs.style += `;${key}:${styleObj[key].replace(' !important', '')}`
- }
- }
- attrs.style = attrs.style.substr(1) || undefined
- // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
- if (!attrs.style) {
- delete attrs.style
- }
- // #endif
- } else {
- if ((node.name === 'pre' || ((attrs.style || '').includes('white-space') && attrs.style.includes('pre'))) && this.pre !== 2) {
- this.pre = node.pre = 1
- }
- node.children = []
- this.stack.push(node)
- }
-
- // 加入节点树
- siblings.push(node)
-}
-
-/**
- * @description 解析到标签结束
- * @param {String} name 标签名
- * @private
- */
-Parser.prototype.onCloseTag = function (name) {
- // 依次出栈到匹配为止
- name = this.xml ? name : name.toLowerCase()
- let i
- for (i = this.stack.length; i--;) {
- if (this.stack[i].name === name) break
- }
- if (i !== -1) {
- while (this.stack.length > i) {
- this.popNode()
- }
- } else if (name === 'p' || name === 'br') {
- const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
- siblings.push({
- name,
- attrs: {
- class: tagSelector[name] || '',
- style: this.tagStyle[name] || ''
- }
- })
- }
-}
-
-/**
- * @description 处理标签出栈
- * @private
- */
-Parser.prototype.popNode = function () {
- const node = this.stack.pop()
- let attrs = node.attrs
- const children = node.children
- const parent = this.stack[this.stack.length - 1]
- const siblings = parent ? parent.children : this.nodes
-
- if (!this.hook(node) || config.ignoreTags[node.name]) {
- // 获取标题
- if (node.name === 'title' && children.length && children[0].type === 'text' && this.options.setTitle) {
- uni.setNavigationBarTitle({
- title: children[0].text
- })
- }
- siblings.pop()
- return
- }
-
- if (node.pre && this.pre !== 2) {
- // 是否合并空白符标识
- this.pre = node.pre = undefined
- for (let i = this.stack.length; i--;) {
- if (this.stack[i].pre) {
- this.pre = 1
- }
- }
- }
-
- const styleObj = {}
-
- // 转换 svg
- if (node.name === 'svg') {
- if (this.xml > 1) {
- // 多层 svg 嵌套
- this.xml--
- return
- }
- // #ifdef APP-PLUS-NVUE
- (function traversal(node) {
- if (node.name) {
- // 调整 svg 的大小写
- node.name = config.svgDict[node.name] || node.name
- for (const item in node.attrs) {
- if (config.svgDict[item]) {
- node.attrs[config.svgDict[item]] = node.attrs[item]
- node.attrs[item] = undefined
- }
- }
- for (let i = 0; i < (node.children || []).length; i++) {
- traversal(node.children[i])
- }
- }
- })(node)
- // #endif
- // #ifndef APP-PLUS-NVUE
- let src = ''
- const style = attrs.style
- attrs.style = ''
- attrs.xmlns = 'http://www.w3.org/2000/svg';
- (function traversal(node) {
- if (node.type === 'text') {
- src += node.text
- return
- }
- const name = config.svgDict[node.name] || node.name
- if (name === 'foreignObject') {
- for (const child of (node.children || [])) {
- if (child.attrs && !child.attrs.xmlns) {
- child.attrs.xmlns = 'http://www.w3.org/1999/xhtml'
- break
- }
- }
- }
- src += '<' + name
- for (const item in node.attrs) {
- const val = node.attrs[item]
- if (val) {
- src += ` ${config.svgDict[item] || item}="${val.replace(/"/g, '')}"`
- }
- }
- if (!node.children) {
- src += '/>'
- } else {
- src += '>'
- for (let i = 0; i < node.children.length; i++) {
- traversal(node.children[i])
- }
- src += '' + name + '>'
- }
- })(node)
- node.name = 'img'
- node.attrs = {
- src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
- style,
- ignore: 'T'
- }
- node.children = undefined
- // #endif
- this.xml = false
- config.ignoreTags.style = true
- return
- }
-
- // #ifndef APP-PLUS-NVUE
- // 转换 align 属性
- if (attrs.align) {
- if (node.name === 'table') {
- if (attrs.align === 'center') {
- styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto'
- } else {
- styleObj.float = attrs.align
- }
- } else {
- styleObj['text-align'] = attrs.align
- }
- attrs.align = undefined
- }
-
- // 转换 dir 属性
- if (attrs.dir) {
- styleObj.direction = attrs.dir
- attrs.dir = undefined
- }
-
- // 转换 font 标签的属性
- if (node.name === 'font') {
- if (attrs.color) {
- styleObj.color = attrs.color
- attrs.color = undefined
- }
- if (attrs.face) {
- styleObj['font-family'] = attrs.face
- attrs.face = undefined
- }
- if (attrs.size) {
- let size = parseInt(attrs.size)
- if (!isNaN(size)) {
- if (size < 1) {
- size = 1
- } else if (size > 7) {
- size = 7
- }
- styleObj['font-size'] = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', 'xxx-large'][size - 1]
- }
- attrs.size = undefined
- }
- }
- // #endif
-
- // 一些编辑器的自带 class
- if ((attrs.class || '').includes('align-center')) {
- styleObj['text-align'] = 'center'
- }
-
- Object.assign(styleObj, this.parseStyle(node))
-
- if (node.name !== 'table' && parseInt(styleObj.width) > windowWidth) {
- styleObj['max-width'] = '100%'
- styleObj['box-sizing'] = 'border-box'
- }
-
- // #ifndef APP-PLUS-NVUE
- if (config.blockTags[node.name]) {
- node.name = 'div'
- } else if (!config.trustTags[node.name] && !this.xml) {
- // 未知标签转为 span,避免无法显示
- node.name = 'span'
- }
-
- if (node.name === 'a' || node.name === 'ad'
- // #ifdef H5 || APP-PLUS
- || node.name === 'iframe' // eslint-disable-line
- // #endif
- ) {
- this.expose()
- } else if (node.name === 'video') {
- if ((styleObj.height || '').includes('auto')) {
- styleObj.height = undefined
- }
- /* #ifdef APP-PLUS */
- let str = ''
- node.html = str
- /* #endif */
- } else if ((node.name === 'ul' || node.name === 'ol') && node.c) {
- // 列表处理
- const types = {
- a: 'lower-alpha',
- A: 'upper-alpha',
- i: 'lower-roman',
- I: 'upper-roman'
- }
- if (types[attrs.type]) {
- attrs.style += ';list-style-type:' + types[attrs.type]
- attrs.type = undefined
- }
- for (let i = children.length; i--;) {
- if (children[i].name === 'li') {
- children[i].c = 1
- }
- }
- } else if (node.name === 'table') {
- // 表格处理
- // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现
- let padding = parseFloat(attrs.cellpadding)
- let spacing = parseFloat(attrs.cellspacing)
- const border = parseFloat(attrs.border)
- const bordercolor = styleObj['border-color']
- const borderstyle = styleObj['border-style']
- if (node.c) {
- // padding 和 spacing 默认 2
- if (isNaN(padding)) {
- padding = 2
- }
- if (isNaN(spacing)) {
- spacing = 2
- }
- }
- if (border) {
- attrs.style += `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}`
- }
- if (node.flag && node.c) {
- // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现
- styleObj.display = 'grid'
- if (styleObj['border-collapse'] === 'collapse') {
- styleObj['border-collapse'] = undefined
- spacing = 0
- }
- if (spacing) {
- styleObj['grid-gap'] = spacing + 'px'
- styleObj.padding = spacing + 'px'
- } else if (border) {
- // 无间隔的情况下避免边框重叠
- attrs.style += ';border-left:0;border-top:0'
- }
-
- const width = [] // 表格的列宽
- const trList = [] // tr 列表
- const cells = [] // 保存新的单元格
- const map = {}; // 被合并单元格占用的格子
-
- (function traversal(nodes) {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].name === 'tr') {
- trList.push(nodes[i])
- } else if (nodes[i].name === 'colgroup') {
- let colI = 1
- for (const col of (nodes[i].children || [])) {
- if (col.name === 'col') {
- const style = col.attrs.style || ''
- const start = style.indexOf('width') ? style.indexOf(';width') : 0
- // 提取出宽度
- if (start !== -1) {
- let end = style.indexOf(';', start + 6)
- if (end === -1) {
- end = style.length
- }
- width[colI] = style.substring(start ? start + 7 : 6, end)
- }
- colI += 1
- }
- }
- } else {
- traversal(nodes[i].children || [])
- }
- }
- })(children)
-
- for (let row = 1; row <= trList.length; row++) {
- let col = 1
- for (let j = 0; j < trList[row - 1].children.length; j++) {
- const td = trList[row - 1].children[j]
- if (td.name === 'td' || td.name === 'th') {
- // 这个格子被上面的单元格占用,则列号++
- while (map[row + '.' + col]) {
- col++
- }
- let style = td.attrs.style || ''
- let start = style.indexOf('width') ? style.indexOf(';width') : 0
- // 提取出 td 的宽度
- if (start !== -1) {
- let end = style.indexOf(';', start + 6)
- if (end === -1) {
- end = style.length
- }
- if (!td.attrs.colspan) {
- width[col] = style.substring(start ? start + 7 : 6, end)
- }
- style = style.substr(0, start) + style.substr(end)
- }
- // 设置竖直对齐
- style += ';display:flex'
- start = style.indexOf('vertical-align')
- if (start !== -1) {
- const val = style.substr(start + 15, 10)
- if (val.includes('middle')) {
- style += ';align-items:center'
- } else if (val.includes('bottom')) {
- style += ';align-items:flex-end'
- }
- } else {
- style += ';align-items:center'
- }
- // 设置水平对齐
- start = style.indexOf('text-align')
- if (start !== -1) {
- const val = style.substr(start + 11, 10)
- if (val.includes('center')) {
- style += ';justify-content: center'
- } else if (val.includes('right')) {
- style += ';justify-content: right'
- }
- }
- style = (border ? `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}` + (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? `;padding:${padding}px` : '') + ';' + style
- // 处理列合并
- if (td.attrs.colspan) {
- style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}`
- if (!td.attrs.rowspan) {
- style += `;grid-row-start:${row};grid-row-end:${row + 1}`
- }
- col += parseInt(td.attrs.colspan) - 1
- }
- // 处理行合并
- if (td.attrs.rowspan) {
- style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}`
- if (!td.attrs.colspan) {
- style += `;grid-column-start:${col};grid-column-end:${col + 1}`
- }
- // 记录下方单元格被占用
- for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {
- for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {
- map[(row + rowspan) + '.' + (col - colspan)] = 1
- }
- }
- }
- if (style) {
- td.attrs.style = style
- }
- cells.push(td)
- col++
- }
- }
- if (row === 1) {
- let temp = ''
- for (let i = 1; i < col; i++) {
- temp += (width[i] ? width[i] : 'auto') + ' '
- }
- styleObj['grid-template-columns'] = temp
- }
- }
- node.children = cells
- } else {
- // 没有使用合并单元格的表格通过 table 布局实现
- if (node.c) {
- styleObj.display = 'table'
- }
- if (!isNaN(spacing)) {
- styleObj['border-spacing'] = spacing + 'px'
- }
- if (border || padding) {
- // 遍历
- (function traversal(nodes) {
- for (let i = 0; i < nodes.length; i++) {
- const td = nodes[i]
- if (td.name === 'th' || td.name === 'td') {
- if (border) {
- td.attrs.style = `border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'};${td.attrs.style || ''}`
- }
- if (padding) {
- td.attrs.style = `padding:${padding}px;${td.attrs.style || ''}`
- }
- } else if (td.children) {
- traversal(td.children)
- }
- }
- })(children)
- }
- }
- // 给表格添加一个单独的横向滚动层
- if (this.options.scrollTable && !(attrs.style || '').includes('inline')) {
- const table = Object.assign({}, node)
- node.name = 'div'
- node.attrs = {
- style: 'overflow:auto'
- }
- node.children = [table]
- attrs = table.attrs
- }
- } else if ((node.name === 'tbody' || node.name === 'tr') && node.flag && node.c) {
- node.flag = undefined;
- (function traversal(nodes) {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].name === 'td') {
- // 颜色样式设置给单元格避免丢失
- for (const style of ['color', 'background', 'background-color']) {
- if (styleObj[style]) {
- nodes[i].attrs.style = style + ':' + styleObj[style] + ';' + (nodes[i].attrs.style || '')
- }
- }
- } else {
- traversal(nodes[i].children || [])
- }
- }
- })(children)
- } else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) {
- for (let i = this.stack.length; i--;) {
- if (this.stack[i].name === 'table' || this.stack[i].name === 'tbody' || this.stack[i].name === 'tr') {
- this.stack[i].flag = 1 // 指示含有合并单元格
- }
- }
- } else if (node.name === 'ruby') {
- // 转换 ruby
- node.name = 'span'
- for (let i = 0; i < children.length - 1; i++) {
- if (children[i].type === 'text' && children[i + 1].name === 'rt') {
- children[i] = {
- name: 'div',
- attrs: {
- style: 'display:inline-block;text-align:center'
- },
- children: [{
- name: 'div',
- attrs: {
- style: 'font-size:50%;' + (children[i + 1].attrs.style || '')
- },
- children: children[i + 1].children
- }, children[i]]
- }
- children.splice(i + 1, 1)
- }
- }
- } else if (node.c) {
- (function traversal(node) {
- node.c = 2
- for (let i = node.children.length; i--;) {
- const child = node.children[i]
- // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
- if (child.name && (config.inlineTags[child.name] || ((child.attrs.style || '').includes('inline') && child.children)) && !child.c) {
- traversal(child)
- }
- // #endif
- if (!child.c || child.name === 'table') {
- node.c = 1
- }
- }
- })(node)
- }
-
- if ((styleObj.display || '').includes('flex') && !node.c) {
- for (let i = children.length; i--;) {
- const item = children[i]
- if (item.f) {
- item.attrs.style = (item.attrs.style || '') + item.f
- item.f = undefined
- }
- }
- }
- // flex 布局时部分样式需要提取到 rich-text 外层
- const flex = parent && ((parent.attrs.style || '').includes('flex') || (parent.attrs.style || '').includes('grid'))
- // #ifdef MP-WEIXIN
- // 检查基础库版本 virtualHost 是否可用
- && !(node.c && wx.getNFCAdapter) // eslint-disable-line
- // #endif
- // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO
- && !node.c // eslint-disable-line
- // #endif
- if (flex) {
- node.f = ';max-width:100%'
- }
-
- if (children.length >= 50 && node.c && !(styleObj.display || '').includes('flex')) {
- mergeNodes(children)
- }
- // #endif
-
- for (const key in styleObj) {
- if (styleObj[key]) {
- const val = `;${key}:${styleObj[key].replace(' !important', '')}`
- /* #ifndef APP-PLUS-NVUE */
- if (flex && ((key.includes('flex') && key !== 'flex-direction') || key === 'align-self' || key.includes('grid') || styleObj[key][0] === '-' || (key.includes('width') && val.includes('%')))) {
- node.f += val
- if (key === 'width') {
- attrs.style += ';width:100%'
- }
- } else /* #endif */ {
- attrs.style += val
- }
- }
- }
- attrs.style = attrs.style.substr(1) || undefined
- // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
- for (const key in attrs) {
- if (!attrs[key]) {
- delete attrs[key]
- }
- }
- // #endif
-}
-
-/**
- * @description 解析到文本
- * @param {String} text 文本内容
- */
-Parser.prototype.onText = function (text) {
- if (!this.pre) {
- // 合并空白符
- let trim = ''
- let flag
- for (let i = 0, len = text.length; i < len; i++) {
- if (!blankChar[text[i]]) {
- trim += text[i]
- } else {
- if (trim[trim.length - 1] !== ' ') {
- trim += ' '
- }
- if (text[i] === '\n' && !flag) {
- flag = true
- }
- }
- }
- // 去除含有换行符的空串
- if (trim === ' ') {
- if (flag) return
- // #ifdef VUE3
- else {
- const parent = this.stack[this.stack.length - 1]
- if (parent && parent.name[0] === 't') return
- }
- // #endif
- }
- text = trim
- }
- const node = Object.create(null)
- node.type = 'text'
- // #ifdef (MP-BAIDU || MP-ALIPAY || MP-TOUTIAO) && VUE3
- node.attrs = {}
- // #endif
- node.text = decodeEntity(text)
- if (this.hook(node)) {
- // #ifdef MP-WEIXIN
- if (this.options.selectable === 'force' && system.includes('iOS') && !uni.canIUse('rich-text.user-select')) {
- this.expose()
- }
- // #endif
- const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
- siblings.push(node)
- }
-}
-
-/**
- * @description html 词法分析器
- * @param {Object} handler 高层处理器
- */
-function Lexer(handler) {
- this.handler = handler
-}
-
-/**
- * @description 执行解析
- * @param {String} content 要解析的文本
- */
-Lexer.prototype.parse = function (content) {
- this.content = content || ''
- this.i = 0 // 标记解析位置
- this.start = 0 // 标记一个单词的开始位置
- this.state = this.text // 当前状态
- for (let len = this.content.length; this.i !== -1 && this.i < len;) {
- this.state()
- }
-}
-
-/**
- * @description 检查标签是否闭合
- * @param {String} method 如果闭合要进行的操作
- * @returns {Boolean} 是否闭合
- * @private
- */
-Lexer.prototype.checkClose = function (method) {
- const selfClose = this.content[this.i] === '/'
- if (this.content[this.i] === '>' || (selfClose && this.content[this.i + 1] === '>')) {
- if (method) {
- this.handler[method](this.content.substring(this.start, this.i))
- }
- this.i += selfClose ? 2 : 1
- this.start = this.i
- this.handler.onOpenTag(selfClose)
- if (this.handler.tagName === 'script') {
- this.i = this.content.indexOf('', this.i)
- if (this.i !== -1) {
- this.i += 2
- this.start = this.i
- }
- this.state = this.endTag
- } else {
- this.state = this.text
- }
- return true
- }
- return false
-}
-
-/**
- * @description 文本状态
- * @private
- */
-Lexer.prototype.text = function () {
- this.i = this.content.indexOf('<', this.i) // 查找最近的标签
- if (this.i === -1) {
- // 没有标签了
- if (this.start < this.content.length) {
- this.handler.onText(this.content.substring(this.start, this.content.length))
- }
- return
- }
- const c = this.content[this.i + 1]
- if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
- // 标签开头
- if (this.start !== this.i) {
- this.handler.onText(this.content.substring(this.start, this.i))
- }
- this.start = ++this.i
- this.state = this.tagName
- } else if (c === '/' || c === '!' || c === '?') {
- if (this.start !== this.i) {
- this.handler.onText(this.content.substring(this.start, this.i))
- }
- const next = this.content[this.i + 2]
- if (c === '/' && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) {
- // 标签结尾
- this.i += 2
- this.start = this.i
- this.state = this.endTag
- return
- }
- // 处理注释
- let end = '-->'
- if (c !== '!' || this.content[this.i + 2] !== '-' || this.content[this.i + 3] !== '-') {
- end = '>'
- }
- this.i = this.content.indexOf(end, this.i)
- if (this.i !== -1) {
- this.i += end.length
- this.start = this.i
- }
- } else {
- this.i++
- }
-}
-
-/**
- * @description 标签名状态
- * @private
- */
-Lexer.prototype.tagName = function () {
- if (blankChar[this.content[this.i]]) {
- // 解析到标签名
- this.handler.onTagName(this.content.substring(this.start, this.i))
- while (blankChar[this.content[++this.i]]);
- if (this.i < this.content.length && !this.checkClose()) {
- this.start = this.i
- this.state = this.attrName
- }
- } else if (!this.checkClose('onTagName')) {
- this.i++
- }
-}
-
-/**
- * @description 属性名状态
- * @private
- */
-Lexer.prototype.attrName = function () {
- let c = this.content[this.i]
- if (blankChar[c] || c === '=') {
- // 解析到属性名
- this.handler.onAttrName(this.content.substring(this.start, this.i))
- let needVal = c === '='
- const len = this.content.length
- while (++this.i < len) {
- c = this.content[this.i]
- if (!blankChar[c]) {
- if (this.checkClose()) return
- if (needVal) {
- // 等号后遇到第一个非空字符
- this.start = this.i
- this.state = this.attrVal
- return
- }
- if (this.content[this.i] === '=') {
- needVal = true
- } else {
- this.start = this.i
- this.state = this.attrName
- return
- }
- }
- }
- } else if (!this.checkClose('onAttrName')) {
- this.i++
- }
-}
-
-/**
- * @description 属性值状态
- * @private
- */
-Lexer.prototype.attrVal = function () {
- const c = this.content[this.i]
- const len = this.content.length
- if (c === '"' || c === "'") {
- // 有冒号的属性
- this.start = ++this.i
- this.i = this.content.indexOf(c, this.i)
- if (this.i === -1) return
- this.handler.onAttrVal(this.content.substring(this.start, this.i))
- } else {
- // 没有冒号的属性
- for (; this.i < len; this.i++) {
- if (blankChar[this.content[this.i]]) {
- this.handler.onAttrVal(this.content.substring(this.start, this.i))
- break
- } else if (this.checkClose('onAttrVal')) return
- }
- }
- while (blankChar[this.content[++this.i]]);
- if (this.i < len && !this.checkClose()) {
- this.start = this.i
- this.state = this.attrName
- }
-}
-
-/**
- * @description 结束标签状态
- * @returns {String} 结束的标签名
- * @private
- */
-Lexer.prototype.endTag = function () {
- const c = this.content[this.i]
- if (blankChar[c] || c === '>' || c === '/') {
- this.handler.onCloseTag(this.content.substring(this.start, this.i))
- if (c !== '>') {
- this.i = this.content.indexOf('>', this.i)
- if (this.i === -1) return
- }
- this.start = ++this.i
- this.state = this.text
- } else {
- this.i++
- }
-}
-
+// @ts-nocheck
+/**
+ * @fileoverview html 解析器
+ */
+
+// 配置
+const config = {
+ // 信任的标签(保持标签名不变)
+ trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),
+
+ // 块级标签(转为 div,其他的非信任标签转为 span)
+ blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
+
+ // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
+ // 行内标签
+ inlineTags: makeMap('abbr,b,big,code,del,em,i,ins,label,q,small,span,strong,sub,sup'),
+ // #endif
+
+ // 要移除的标签
+ ignoreTags: makeMap('area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'),
+
+ // 自闭合的标签
+ voidTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
+
+ // html 实体
+ entities: {
+ lt: '<',
+ gt: '>',
+ quot: '"',
+ apos: "'",
+ ensp: '\u2002',
+ emsp: '\u2003',
+ nbsp: '\xA0',
+ semi: ';',
+ ndash: '–',
+ mdash: '—',
+ middot: '·',
+ lsquo: '‘',
+ rsquo: '’',
+ ldquo: '“',
+ rdquo: '”',
+ bull: '•',
+ hellip: '…',
+ larr: '←',
+ uarr: '↑',
+ rarr: '→',
+ darr: '↓'
+ },
+
+ // 默认的标签样式
+ tagStyle: {
+ // #ifndef APP-PLUS-NVUE
+ address: 'font-style:italic',
+ big: 'display:inline;font-size:1.2em',
+ caption: 'display:table-caption;text-align:center',
+ center: 'text-align:center',
+ cite: 'font-style:italic',
+ dd: 'margin-left:40px',
+ mark: 'background-color:yellow',
+ pre: 'font-family:monospace;white-space:pre',
+ s: 'text-decoration:line-through',
+ small: 'display:inline;font-size:0.8em',
+ strike: 'text-decoration:line-through',
+ u: 'text-decoration:underline'
+ // #endif
+ },
+
+ // svg 大小写对照表
+ svgDict: {
+ animatetransform: 'animateTransform',
+ lineargradient: 'linearGradient',
+ viewbox: 'viewBox',
+ attributename: 'attributeName',
+ repeatcount: 'repeatCount',
+ repeatdur: 'repeatDur',
+ foreignobject: 'foreignObject'
+ }
+}
+const tagSelector = {}
+const {
+ windowWidth,
+ // #ifdef MP-WEIXIN
+ system
+ // #endif
+} = uni.getSystemInfoSync()
+const blankChar = makeMap(' ,\r,\n,\t,\f')
+let idIndex = 0
+
+// #ifdef H5 || APP-PLUS
+config.ignoreTags.iframe = undefined
+config.trustTags.iframe = true
+config.ignoreTags.embed = undefined
+config.trustTags.embed = true
+// #endif
+// #ifdef APP-PLUS-NVUE
+config.ignoreTags.source = undefined
+config.ignoreTags.style = undefined
+// #endif
+
+/**
+ * @description 创建 map
+ * @param {String} str 逗号分隔
+ */
+function makeMap(str) {
+ const map = Object.create(null)
+ const list = str.split(',')
+ for (let i = list.length; i--;) {
+ map[list[i]] = true
+ }
+ return map
+}
+
+/**
+ * @description 解码 html 实体
+ * @param {String} str 要解码的字符串
+ * @param {Boolean} amp 要不要解码 &
+ * @returns {String} 解码后的字符串
+ */
+function decodeEntity(str, amp) {
+ let i = str.indexOf('&')
+ while (i !== -1) {
+ const j = str.indexOf(';', i + 3)
+ let code
+ if (j === -1) break
+ if (str[i + 1] === '#') {
+ // { 形式的实体
+ code = parseInt((str[i + 2] === 'x' ? '0' : '') + str.substring(i + 2, j))
+ if (!isNaN(code)) {
+ str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1)
+ }
+ } else {
+ // 形式的实体
+ code = str.substring(i + 1, j)
+ if (config.entities[code] || (code === 'amp' && amp)) {
+ str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1)
+ }
+ }
+ i = str.indexOf('&', i + 1)
+ }
+ return str
+}
+
+/**
+ * @description 合并多个块级标签,加快长内容渲染
+ * @param {Array} nodes 要合并的标签数组
+ */
+function mergeNodes(nodes) {
+ let i = nodes.length - 1
+ for (let j = i; j >= -1; j--) {
+ if (j === -1 || nodes[j].c || !nodes[j].name || (nodes[j].name !== 'div' && nodes[j].name !== 'p' && nodes[j].name[0] !== 'h') || (nodes[j].attrs.style || '').includes('inline')) {
+ if (i - j >= 5) {
+ nodes.splice(j + 1, i - j, {
+ name: 'div',
+ attrs: {},
+ children: nodes.slice(j + 1, i + 1)
+ })
+ }
+ i = j - 1
+ }
+ }
+}
+
+/**
+ * @description html 解析器
+ * @param {Object} vm 组件实例
+ */
+function Parser(vm) {
+
+ this.options = vm || {}
+
+ this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle)
+ this.imgList = vm.imgList || []
+ this.imgList._unloadimgs = 0
+ this.plugins = vm.plugins || []
+ this.attrs = Object.create(null)
+ this.stack = []
+ this.nodes = []
+ this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes('pre') ? 2 : 0
+}
+
+/**
+ * @description 执行解析
+ * @param {String} content 要解析的文本
+ */
+Parser.prototype.parse = function (content) {
+ // 插件处理
+ for (let i = this.plugins.length; i--;) {
+ if (this.plugins[i].onUpdate) {
+ content = this.plugins[i].onUpdate(content, config) || content
+ }
+ }
+
+ new Lexer(this).parse(content)
+ // 出栈未闭合的标签
+ while (this.stack.length) {
+ this.popNode()
+ }
+ if (this.nodes.length > 50) {
+ mergeNodes(this.nodes)
+ }
+ return this.nodes
+}
+
+/**
+ * @description 将标签暴露出来(不被 rich-text 包含)
+ */
+Parser.prototype.expose = function () {
+ // #ifndef APP-PLUS-NVUE
+ for (let i = this.stack.length; i--;) {
+ const item = this.stack[i]
+ if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') return
+ item.c = 1
+ }
+ // #endif
+}
+
+/**
+ * @description 处理插件
+ * @param {Object} node 要处理的标签
+ * @returns {Boolean} 是否要移除此标签
+ */
+Parser.prototype.hook = function (node) {
+ for (let i = this.plugins.length; i--;) {
+ if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {
+ return false
+ }
+ }
+ return true
+}
+
+/**
+ * @description 将链接拼接上主域名
+ * @param {String} url 需要拼接的链接
+ * @returns {String} 拼接后的链接
+ */
+Parser.prototype.getUrl = function (url) {
+ const domain = this.options.domain
+ if (url[0] === '/') {
+ if (url[1] === '/') {
+ // // 开头的补充协议名
+ url = (domain ? domain.split('://')[0] : 'http') + ':' + url
+ } else if (domain) {
+ // 否则补充整个域名
+ url = domain + url
+ } /* #ifdef APP-PLUS */ else {
+ url = plus.io.convertLocalFileSystemURL(url)
+ } /* #endif */
+ } else if (!url.includes('data:') && !url.includes('://')) {
+ if (domain) {
+ url = domain + '/' + url
+ } /* #ifdef APP-PLUS */ else {
+ url = plus.io.convertLocalFileSystemURL(url)
+ } /* #endif */
+ }
+ return url
+}
+
+/**
+ * @description 解析样式表
+ * @param {Object} node 标签
+ * @returns {Object}
+ */
+Parser.prototype.parseStyle = function (node) {
+ const attrs = node.attrs
+ const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'))
+ const styleObj = {}
+ let tmp = ''
+
+ if (attrs.id && !this.xml) {
+ // 暴露锚点
+ if (this.options.useAnchor) {
+ this.expose()
+ } else if (node.name !== 'img' && node.name !== 'a' && node.name !== 'video' && node.name !== 'audio') {
+ attrs.id = undefined
+ }
+ }
+
+ // 转换 width 和 height 属性
+ if (attrs.width) {
+ styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')
+ attrs.width = undefined
+ }
+ if (attrs.height) {
+ styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')
+ attrs.height = undefined
+ }
+
+ for (let i = 0, len = list.length; i < len; i++) {
+ const info = list[i].split(':')
+ if (info.length < 2) continue
+ const key = info.shift().trim().toLowerCase()
+ let value = info.join(':').trim()
+ if ((value[0] === '-' && value.lastIndexOf('-') > 0) || value.includes('safe')) {
+ // 兼容性的 css 不压缩
+ tmp += `;${key}:${value}`
+ } else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {
+ // 重复的样式进行覆盖
+ if (value.includes('url')) {
+ // 填充链接
+ let j = value.indexOf('(') + 1
+ if (j) {
+ while (value[j] === '"' || value[j] === "'" || blankChar[value[j]]) {
+ j++
+ }
+ value = value.substr(0, j) + this.getUrl(value.substr(j))
+ }
+ } else if (value.includes('rpx')) {
+ // 转换 rpx(rich-text 内部不支持 rpx)
+ value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px')
+ }
+ styleObj[key] = value
+ }
+ }
+
+ node.attrs.style = tmp
+ return styleObj
+}
+
+/**
+ * @description 解析到标签名
+ * @param {String} name 标签名
+ * @private
+ */
+Parser.prototype.onTagName = function (name) {
+ this.tagName = this.xml ? name : name.toLowerCase()
+ if (this.tagName === 'svg') {
+ this.xml = (this.xml || 0) + 1 // svg 标签内大小写敏感
+ config.ignoreTags.style = undefined // svg 标签内 style 可用
+ }
+}
+
+/**
+ * @description 解析到属性名
+ * @param {String} name 属性名
+ * @private
+ */
+Parser.prototype.onAttrName = function (name) {
+ name = this.xml ? name : name.toLowerCase()
+ // #ifdef (VUE3 && (H5 || APP-PLUS)) || APP-PLUS-NVUE
+ if (name.includes('?') || name.includes(';')) {
+ this.attrName = undefined
+ return
+ }
+ // #endif
+ if (name.substr(0, 5) === 'data-') {
+ if (name === 'data-src' && !this.attrs.src) {
+ // data-src 自动转为 src
+ this.attrName = 'src'
+ } else if (this.tagName === 'img' || this.tagName === 'a') {
+ // a 和 img 标签保留 data- 的属性,可以在 imgtap 和 linktap 事件中使用
+ this.attrName = name
+ } else {
+ // 剩余的移除以减小大小
+ this.attrName = undefined
+ }
+ } else {
+ this.attrName = name
+ this.attrs[name] = 'T' // boolean 型属性缺省设置
+ }
+}
+
+/**
+ * @description 解析到属性值
+ * @param {String} val 属性值
+ * @private
+ */
+Parser.prototype.onAttrVal = function (val) {
+ const name = this.attrName || ''
+ if (name === 'style' || name === 'href') {
+ // 部分属性进行实体解码
+ this.attrs[name] = decodeEntity(val, true)
+ } else if (name.includes('src')) {
+ // 拼接主域名
+ this.attrs[name] = this.getUrl(decodeEntity(val, true))
+ } else if (name) {
+ this.attrs[name] = val
+ }
+}
+
+/**
+ * @description 解析到标签开始
+ * @param {Boolean} selfClose 是否有自闭合标识 />
+ * @private
+ */
+Parser.prototype.onOpenTag = function (selfClose) {
+ // 拼装 node
+ const node = Object.create(null)
+ node.name = this.tagName
+ node.attrs = this.attrs
+ // 避免因为自动 diff 使得 type 被设置为 null 导致部分内容不显示
+ if (this.options.nodes.length) {
+ node.type = 'node'
+ }
+ this.attrs = Object.create(null)
+
+ const attrs = node.attrs
+ const parent = this.stack[this.stack.length - 1]
+ const siblings = parent ? parent.children : this.nodes
+ const close = this.xml ? selfClose : config.voidTags[node.name]
+
+ // 替换标签名选择器
+ if (tagSelector[node.name]) {
+ attrs.class = tagSelector[node.name] + (attrs.class ? ' ' + attrs.class : '')
+ }
+
+ // 转换 embed 标签
+ if (node.name === 'embed') {
+ // #ifndef H5 || APP-PLUS
+ const src = attrs.src || ''
+ // 按照后缀名和 type 将 embed 转为 video 或 audio
+ if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes('video')) {
+ node.name = 'video'
+ } else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (attrs.type || '').includes('audio')) {
+ node.name = 'audio'
+ }
+ if (attrs.autostart) {
+ attrs.autoplay = 'T'
+ }
+ attrs.controls = 'T'
+ // #endif
+ // #ifdef H5 || APP-PLUS
+ this.expose()
+ // #endif
+ }
+
+ // #ifndef APP-PLUS-NVUE
+ // 处理音视频
+ if (node.name === 'video' || node.name === 'audio') {
+ // 设置 id 以便获取 context
+ if (node.name === 'video' && !attrs.id) {
+ attrs.id = 'v' + idIndex++
+ }
+ // 没有设置 controls 也没有设置 autoplay 的自动设置 controls
+ if (!attrs.controls && !attrs.autoplay) {
+ attrs.controls = 'T'
+ }
+ // 用数组存储所有可用的 source
+ node.src = []
+ if (attrs.src) {
+ node.src.push(attrs.src)
+ attrs.src = undefined
+ }
+ this.expose()
+ }
+ // #endif
+
+ // 处理自闭合标签
+ if (close) {
+ if (!this.hook(node) || config.ignoreTags[node.name]) {
+ // 通过 base 标签设置主域名
+ if (node.name === 'base' && !this.options.domain) {
+ this.options.domain = attrs.href
+ } /* #ifndef APP-PLUS-NVUE */ else if (node.name === 'source' && parent && (parent.name === 'video' || parent.name === 'audio') && attrs.src) {
+ // 设置 source 标签(仅父节点为 video 或 audio 时有效)
+ parent.src.push(attrs.src)
+ } /* #endif */
+ return
+ }
+
+ // 解析 style
+ const styleObj = this.parseStyle(node)
+
+ // 处理图片
+ if (node.name === 'img') {
+ if (attrs.src) {
+ // 标记 webp
+ if (attrs.src.includes('webp')) {
+ node.webp = 'T'
+ }
+ // data url 图片如果没有设置 original-src 默认为不可预览的小图片
+ if (attrs.src.includes('data:') && this.options.previewImg !== 'all' && !attrs['original-src']) {
+ attrs.ignore = 'T'
+ }
+ if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) {
+ for (let i = this.stack.length; i--;) {
+ const item = this.stack[i]
+ if (item.name === 'a') {
+ node.a = item.attrs
+ }
+ if (item.name === 'table' && !node.webp && !attrs.src.includes('cloud://')) {
+ if (!styleObj.display || styleObj.display.includes('inline')) {
+ node.t = 'inline-block'
+ } else {
+ node.t = styleObj.display
+ }
+ styleObj.display = undefined
+ }
+ // #ifndef H5 || APP-PLUS
+ const style = item.attrs.style || ''
+ if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || parseInt(styleObj.width) > 100)) {
+ styleObj.width = '100% !important'
+ styleObj.height = ''
+ for (let j = i + 1; j < this.stack.length; j++) {
+ this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '')
+ }
+ } else if (style.includes('flex') && styleObj.width === '100%') {
+ for (let j = i + 1; j < this.stack.length; j++) {
+ const style = this.stack[j].attrs.style || ''
+ if (!style.includes(';width') && !style.includes(' width') && style.indexOf('width') !== 0) {
+ styleObj.width = ''
+ break
+ }
+ }
+ } else if (style.includes('inline-block')) {
+ if (styleObj.width && styleObj.width[styleObj.width.length - 1] === '%') {
+ item.attrs.style += ';max-width:' + styleObj.width
+ styleObj.width = ''
+ } else {
+ item.attrs.style += ';max-width:100%'
+ }
+ }
+ // #endif
+ item.c = 1
+ }
+ attrs.i = this.imgList.length.toString()
+ let src = attrs['original-src'] || attrs.src
+ // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360
+ if (this.imgList.includes(src)) {
+ // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位
+ let i = src.indexOf('://')
+ if (i !== -1) {
+ i += 3
+ let newSrc = src.substr(0, i)
+ for (; i < src.length; i++) {
+ if (src[i] === '/') break
+ newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i]
+ }
+ newSrc += src.substr(i)
+ src = newSrc
+ }
+ }
+ // #endif
+ this.imgList.push(src)
+ if (!node.t) {
+ this.imgList._unloadimgs += 1
+ }
+ // #ifdef H5 || APP-PLUS
+ if (this.options.lazyLoad) {
+ attrs['data-src'] = attrs.src
+ attrs.src = undefined
+ }
+ // #endif
+ }
+ }
+ if (styleObj.display === 'inline') {
+ styleObj.display = ''
+ }
+ // #ifndef APP-PLUS-NVUE
+ if (attrs.ignore) {
+ styleObj['max-width'] = styleObj['max-width'] || '100%'
+ attrs.style += ';-webkit-touch-callout:none'
+ }
+ // #endif
+ // 设置的宽度超出屏幕,为避免变形,高度转为自动
+ if (parseInt(styleObj.width) > windowWidth) {
+ styleObj.height = undefined
+ }
+ // 记录是否设置了宽高
+ if (!isNaN(parseInt(styleObj.width))) {
+ node.w = 'T'
+ }
+ if (!isNaN(parseInt(styleObj.height)) && (!styleObj.height.includes('%') || (parent && (parent.attrs.style || '').includes('height')))) {
+ node.h = 'T'
+ }
+ if (node.w && node.h && styleObj['object-fit']) {
+ if (styleObj['object-fit'] === 'contain') {
+ node.m = 'aspectFit'
+ } else if (styleObj['object-fit'] === 'cover') {
+ node.m = 'aspectFill'
+ }
+ }
+ } else if (node.name === 'svg') {
+ siblings.push(node)
+ this.stack.push(node)
+ this.popNode()
+ return
+ }
+ for (const key in styleObj) {
+ if (styleObj[key]) {
+ attrs.style += `;${key}:${styleObj[key].replace(' !important', '')}`
+ }
+ }
+ attrs.style = attrs.style.substr(1) || undefined
+ // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
+ if (!attrs.style) {
+ delete attrs.style
+ }
+ // #endif
+ } else {
+ if ((node.name === 'pre' || ((attrs.style || '').includes('white-space') && attrs.style.includes('pre'))) && this.pre !== 2) {
+ this.pre = node.pre = 1
+ }
+ node.children = []
+ this.stack.push(node)
+ }
+
+ // 加入节点树
+ siblings.push(node)
+}
+
+/**
+ * @description 解析到标签结束
+ * @param {String} name 标签名
+ * @private
+ */
+Parser.prototype.onCloseTag = function (name) {
+ // 依次出栈到匹配为止
+ name = this.xml ? name : name.toLowerCase()
+ let i
+ for (i = this.stack.length; i--;) {
+ if (this.stack[i].name === name) break
+ }
+ if (i !== -1) {
+ while (this.stack.length > i) {
+ this.popNode()
+ }
+ } else if (name === 'p' || name === 'br') {
+ const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
+ siblings.push({
+ name,
+ attrs: {
+ class: tagSelector[name] || '',
+ style: this.tagStyle[name] || ''
+ }
+ })
+ }
+}
+
+/**
+ * @description 处理标签出栈
+ * @private
+ */
+Parser.prototype.popNode = function () {
+ const node = this.stack.pop()
+ let attrs = node.attrs
+ const children = node.children
+ const parent = this.stack[this.stack.length - 1]
+ const siblings = parent ? parent.children : this.nodes
+
+ if (!this.hook(node) || config.ignoreTags[node.name]) {
+ // 获取标题
+ if (node.name === 'title' && children.length && children[0].type === 'text' && this.options.setTitle) {
+ uni.setNavigationBarTitle({
+ title: children[0].text
+ })
+ }
+ siblings.pop()
+ return
+ }
+
+ if (node.pre && this.pre !== 2) {
+ // 是否合并空白符标识
+ this.pre = node.pre = undefined
+ for (let i = this.stack.length; i--;) {
+ if (this.stack[i].pre) {
+ this.pre = 1
+ }
+ }
+ }
+
+ const styleObj = {}
+
+ // 转换 svg
+ if (node.name === 'svg') {
+ if (this.xml > 1) {
+ // 多层 svg 嵌套
+ this.xml--
+ return
+ }
+ // #ifdef APP-PLUS-NVUE
+ (function traversal(node) {
+ if (node.name) {
+ // 调整 svg 的大小写
+ node.name = config.svgDict[node.name] || node.name
+ for (const item in node.attrs) {
+ if (config.svgDict[item]) {
+ node.attrs[config.svgDict[item]] = node.attrs[item]
+ node.attrs[item] = undefined
+ }
+ }
+ for (let i = 0; i < (node.children || []).length; i++) {
+ traversal(node.children[i])
+ }
+ }
+ })(node)
+ // #endif
+ // #ifndef APP-PLUS-NVUE
+ let src = ''
+ const style = attrs.style
+ attrs.style = ''
+ attrs.xmlns = 'http://www.w3.org/2000/svg';
+ (function traversal(node) {
+ if (node.type === 'text') {
+ src += node.text
+ return
+ }
+ const name = config.svgDict[node.name] || node.name
+ if (name === 'foreignObject') {
+ for (const child of (node.children || [])) {
+ if (child.attrs && !child.attrs.xmlns) {
+ child.attrs.xmlns = 'http://www.w3.org/1999/xhtml'
+ break
+ }
+ }
+ }
+ src += '<' + name
+ for (const item in node.attrs) {
+ const val = node.attrs[item]
+ if (val) {
+ src += ` ${config.svgDict[item] || item}="${val.replace(/"/g, '')}"`
+ }
+ }
+ if (!node.children) {
+ src += '/>'
+ } else {
+ src += '>'
+ for (let i = 0; i < node.children.length; i++) {
+ traversal(node.children[i])
+ }
+ src += '' + name + '>'
+ }
+ })(node)
+ node.name = 'img'
+ node.attrs = {
+ src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
+ style,
+ ignore: 'T'
+ }
+ node.children = undefined
+ // #endif
+ this.xml = false
+ config.ignoreTags.style = true
+ return
+ }
+
+ // #ifndef APP-PLUS-NVUE
+ // 转换 align 属性
+ if (attrs.align) {
+ if (node.name === 'table') {
+ if (attrs.align === 'center') {
+ styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto'
+ } else {
+ styleObj.float = attrs.align
+ }
+ } else {
+ styleObj['text-align'] = attrs.align
+ }
+ attrs.align = undefined
+ }
+
+ // 转换 dir 属性
+ if (attrs.dir) {
+ styleObj.direction = attrs.dir
+ attrs.dir = undefined
+ }
+
+ // 转换 font 标签的属性
+ if (node.name === 'font') {
+ if (attrs.color) {
+ styleObj.color = attrs.color
+ attrs.color = undefined
+ }
+ if (attrs.face) {
+ styleObj['font-family'] = attrs.face
+ attrs.face = undefined
+ }
+ if (attrs.size) {
+ let size = parseInt(attrs.size)
+ if (!isNaN(size)) {
+ if (size < 1) {
+ size = 1
+ } else if (size > 7) {
+ size = 7
+ }
+ styleObj['font-size'] = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', 'xxx-large'][size - 1]
+ }
+ attrs.size = undefined
+ }
+ }
+ // #endif
+
+ // 一些编辑器的自带 class
+ if ((attrs.class || '').includes('align-center')) {
+ styleObj['text-align'] = 'center'
+ }
+
+ Object.assign(styleObj, this.parseStyle(node))
+
+ if (node.name !== 'table' && parseInt(styleObj.width) > windowWidth) {
+ styleObj['max-width'] = '100%'
+ styleObj['box-sizing'] = 'border-box'
+ }
+
+ // #ifndef APP-PLUS-NVUE
+ if (config.blockTags[node.name]) {
+ node.name = 'div'
+ } else if (!config.trustTags[node.name] && !this.xml) {
+ // 未知标签转为 span,避免无法显示
+ node.name = 'span'
+ }
+
+ if (node.name === 'a' || node.name === 'ad'
+ // #ifdef H5 || APP-PLUS
+ || node.name === 'iframe' // eslint-disable-line
+ // #endif
+ ) {
+ this.expose()
+ } else if (node.name === 'video') {
+ if ((styleObj.height || '').includes('auto')) {
+ styleObj.height = undefined
+ }
+ /* #ifdef APP-PLUS */
+ let str = ''
+ node.html = str
+ /* #endif */
+ } else if ((node.name === 'ul' || node.name === 'ol') && node.c) {
+ // 列表处理
+ const types = {
+ a: 'lower-alpha',
+ A: 'upper-alpha',
+ i: 'lower-roman',
+ I: 'upper-roman'
+ }
+ if (types[attrs.type]) {
+ attrs.style += ';list-style-type:' + types[attrs.type]
+ attrs.type = undefined
+ }
+ for (let i = children.length; i--;) {
+ if (children[i].name === 'li') {
+ children[i].c = 1
+ }
+ }
+ } else if (node.name === 'table') {
+ // 表格处理
+ // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现
+ let padding = parseFloat(attrs.cellpadding)
+ let spacing = parseFloat(attrs.cellspacing)
+ const border = parseFloat(attrs.border)
+ const bordercolor = styleObj['border-color']
+ const borderstyle = styleObj['border-style']
+ if (node.c) {
+ // padding 和 spacing 默认 2
+ if (isNaN(padding)) {
+ padding = 2
+ }
+ if (isNaN(spacing)) {
+ spacing = 2
+ }
+ }
+ if (border) {
+ attrs.style += `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}`
+ }
+ if (node.flag && node.c) {
+ // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现
+ styleObj.display = 'grid'
+ if (styleObj['border-collapse'] === 'collapse') {
+ styleObj['border-collapse'] = undefined
+ spacing = 0
+ }
+ if (spacing) {
+ styleObj['grid-gap'] = spacing + 'px'
+ styleObj.padding = spacing + 'px'
+ } else if (border) {
+ // 无间隔的情况下避免边框重叠
+ attrs.style += ';border-left:0;border-top:0'
+ }
+
+ const width = [] // 表格的列宽
+ const trList = [] // tr 列表
+ const cells = [] // 保存新的单元格
+ const map = {}; // 被合并单元格占用的格子
+
+ (function traversal(nodes) {
+ for (let i = 0; i < nodes.length; i++) {
+ if (nodes[i].name === 'tr') {
+ trList.push(nodes[i])
+ } else if (nodes[i].name === 'colgroup') {
+ let colI = 1
+ for (const col of (nodes[i].children || [])) {
+ if (col.name === 'col') {
+ const style = col.attrs.style || ''
+ const start = style.indexOf('width') ? style.indexOf(';width') : 0
+ // 提取出宽度
+ if (start !== -1) {
+ let end = style.indexOf(';', start + 6)
+ if (end === -1) {
+ end = style.length
+ }
+ width[colI] = style.substring(start ? start + 7 : 6, end)
+ }
+ colI += 1
+ }
+ }
+ } else {
+ traversal(nodes[i].children || [])
+ }
+ }
+ })(children)
+
+ for (let row = 1; row <= trList.length; row++) {
+ let col = 1
+ for (let j = 0; j < trList[row - 1].children.length; j++) {
+ const td = trList[row - 1].children[j]
+ if (td.name === 'td' || td.name === 'th') {
+ // 这个格子被上面的单元格占用,则列号++
+ while (map[row + '.' + col]) {
+ col++
+ }
+ let style = td.attrs.style || ''
+ let start = style.indexOf('width') ? style.indexOf(';width') : 0
+ // 提取出 td 的宽度
+ if (start !== -1) {
+ let end = style.indexOf(';', start + 6)
+ if (end === -1) {
+ end = style.length
+ }
+ if (!td.attrs.colspan) {
+ width[col] = style.substring(start ? start + 7 : 6, end)
+ }
+ style = style.substr(0, start) + style.substr(end)
+ }
+ // 设置竖直对齐
+ style += ';display:flex'
+ start = style.indexOf('vertical-align')
+ if (start !== -1) {
+ const val = style.substr(start + 15, 10)
+ if (val.includes('middle')) {
+ style += ';align-items:center'
+ } else if (val.includes('bottom')) {
+ style += ';align-items:flex-end'
+ }
+ } else {
+ style += ';align-items:center'
+ }
+ // 设置水平对齐
+ start = style.indexOf('text-align')
+ if (start !== -1) {
+ const val = style.substr(start + 11, 10)
+ if (val.includes('center')) {
+ style += ';justify-content: center'
+ } else if (val.includes('right')) {
+ style += ';justify-content: right'
+ }
+ }
+ style = (border ? `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}` + (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? `;padding:${padding}px` : '') + ';' + style
+ // 处理列合并
+ if (td.attrs.colspan) {
+ style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}`
+ if (!td.attrs.rowspan) {
+ style += `;grid-row-start:${row};grid-row-end:${row + 1}`
+ }
+ col += parseInt(td.attrs.colspan) - 1
+ }
+ // 处理行合并
+ if (td.attrs.rowspan) {
+ style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}`
+ if (!td.attrs.colspan) {
+ style += `;grid-column-start:${col};grid-column-end:${col + 1}`
+ }
+ // 记录下方单元格被占用
+ for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {
+ for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {
+ map[(row + rowspan) + '.' + (col - colspan)] = 1
+ }
+ }
+ }
+ if (style) {
+ td.attrs.style = style
+ }
+ cells.push(td)
+ col++
+ }
+ }
+ if (row === 1) {
+ let temp = ''
+ for (let i = 1; i < col; i++) {
+ temp += (width[i] ? width[i] : 'auto') + ' '
+ }
+ styleObj['grid-template-columns'] = temp
+ }
+ }
+ node.children = cells
+ } else {
+ // 没有使用合并单元格的表格通过 table 布局实现
+ if (node.c) {
+ styleObj.display = 'table'
+ }
+ if (!isNaN(spacing)) {
+ styleObj['border-spacing'] = spacing + 'px'
+ }
+ if (border || padding) {
+ // 遍历
+ (function traversal(nodes) {
+ for (let i = 0; i < nodes.length; i++) {
+ const td = nodes[i]
+ if (td.name === 'th' || td.name === 'td') {
+ if (border) {
+ td.attrs.style = `border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'};${td.attrs.style || ''}`
+ }
+ if (padding) {
+ td.attrs.style = `padding:${padding}px;${td.attrs.style || ''}`
+ }
+ } else if (td.children) {
+ traversal(td.children)
+ }
+ }
+ })(children)
+ }
+ }
+ // 给表格添加一个单独的横向滚动层
+ if (this.options.scrollTable && !(attrs.style || '').includes('inline')) {
+ const table = Object.assign({}, node)
+ node.name = 'div'
+ node.attrs = {
+ style: 'overflow:auto'
+ }
+ node.children = [table]
+ attrs = table.attrs
+ }
+ } else if ((node.name === 'tbody' || node.name === 'tr') && node.flag && node.c) {
+ node.flag = undefined;
+ (function traversal(nodes) {
+ for (let i = 0; i < nodes.length; i++) {
+ if (nodes[i].name === 'td') {
+ // 颜色样式设置给单元格避免丢失
+ for (const style of ['color', 'background', 'background-color']) {
+ if (styleObj[style]) {
+ nodes[i].attrs.style = style + ':' + styleObj[style] + ';' + (nodes[i].attrs.style || '')
+ }
+ }
+ } else {
+ traversal(nodes[i].children || [])
+ }
+ }
+ })(children)
+ } else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) {
+ for (let i = this.stack.length; i--;) {
+ if (this.stack[i].name === 'table' || this.stack[i].name === 'tbody' || this.stack[i].name === 'tr') {
+ this.stack[i].flag = 1 // 指示含有合并单元格
+ }
+ }
+ } else if (node.name === 'ruby') {
+ // 转换 ruby
+ node.name = 'span'
+ for (let i = 0; i < children.length - 1; i++) {
+ if (children[i].type === 'text' && children[i + 1].name === 'rt') {
+ children[i] = {
+ name: 'div',
+ attrs: {
+ style: 'display:inline-block;text-align:center'
+ },
+ children: [{
+ name: 'div',
+ attrs: {
+ style: 'font-size:50%;' + (children[i + 1].attrs.style || '')
+ },
+ children: children[i + 1].children
+ }, children[i]]
+ }
+ children.splice(i + 1, 1)
+ }
+ }
+ } else if (node.c) {
+ (function traversal(node) {
+ node.c = 2
+ for (let i = node.children.length; i--;) {
+ const child = node.children[i]
+ // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
+ if (child.name && (config.inlineTags[child.name] || ((child.attrs.style || '').includes('inline') && child.children)) && !child.c) {
+ traversal(child)
+ }
+ // #endif
+ if (!child.c || child.name === 'table') {
+ node.c = 1
+ }
+ }
+ })(node)
+ }
+
+ if ((styleObj.display || '').includes('flex') && !node.c) {
+ for (let i = children.length; i--;) {
+ const item = children[i]
+ if (item.f) {
+ item.attrs.style = (item.attrs.style || '') + item.f
+ item.f = undefined
+ }
+ }
+ }
+ // flex 布局时部分样式需要提取到 rich-text 外层
+ const flex = parent && ((parent.attrs.style || '').includes('flex') || (parent.attrs.style || '').includes('grid'))
+ // #ifdef MP-WEIXIN
+ // 检查基础库版本 virtualHost 是否可用
+ && !(node.c && wx.getNFCAdapter) // eslint-disable-line
+ // #endif
+ // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO
+ && !node.c // eslint-disable-line
+ // #endif
+ if (flex) {
+ node.f = ';max-width:100%'
+ }
+
+ if (children.length >= 50 && node.c && !(styleObj.display || '').includes('flex')) {
+ mergeNodes(children)
+ }
+ // #endif
+
+ for (const key in styleObj) {
+ if (styleObj[key]) {
+ const val = `;${key}:${styleObj[key].replace(' !important', '')}`
+ /* #ifndef APP-PLUS-NVUE */
+ if (flex && ((key.includes('flex') && key !== 'flex-direction') || key === 'align-self' || key.includes('grid') || styleObj[key][0] === '-' || (key.includes('width') && val.includes('%')))) {
+ node.f += val
+ if (key === 'width') {
+ attrs.style += ';width:100%'
+ }
+ } else /* #endif */ {
+ attrs.style += val
+ }
+ }
+ }
+ attrs.style = attrs.style.substr(1) || undefined
+ // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
+ for (const key in attrs) {
+ if (!attrs[key]) {
+ delete attrs[key]
+ }
+ }
+ // #endif
+}
+
+/**
+ * @description 解析到文本
+ * @param {String} text 文本内容
+ */
+Parser.prototype.onText = function (text) {
+ if (!this.pre) {
+ // 合并空白符
+ let trim = ''
+ let flag
+ for (let i = 0, len = text.length; i < len; i++) {
+ if (!blankChar[text[i]]) {
+ trim += text[i]
+ } else {
+ if (trim[trim.length - 1] !== ' ') {
+ trim += ' '
+ }
+ if (text[i] === '\n' && !flag) {
+ flag = true
+ }
+ }
+ }
+ // 去除含有换行符的空串
+ if (trim === ' ') {
+ if (flag) return
+ // #ifdef VUE3
+ else {
+ const parent = this.stack[this.stack.length - 1]
+ if (parent && parent.name[0] === 't') return
+ }
+ // #endif
+ }
+ text = trim
+ }
+ const node = Object.create(null)
+ node.type = 'text'
+ // #ifdef (MP-BAIDU || MP-ALIPAY || MP-TOUTIAO) && VUE3
+ node.attrs = {}
+ // #endif
+ node.text = decodeEntity(text)
+ if (this.hook(node)) {
+ // #ifdef MP-WEIXIN
+ if (this.options.selectable === 'force' && system.includes('iOS') && !uni.canIUse('rich-text.user-select')) {
+ this.expose()
+ }
+ // #endif
+ const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
+ siblings.push(node)
+ }
+}
+
+/**
+ * @description html 词法分析器
+ * @param {Object} handler 高层处理器
+ */
+function Lexer(handler) {
+ this.handler = handler
+}
+
+/**
+ * @description 执行解析
+ * @param {String} content 要解析的文本
+ */
+Lexer.prototype.parse = function (content) {
+ this.content = content || ''
+ this.i = 0 // 标记解析位置
+ this.start = 0 // 标记一个单词的开始位置
+ this.state = this.text // 当前状态
+ for (let len = this.content.length; this.i !== -1 && this.i < len;) {
+ this.state()
+ }
+}
+
+/**
+ * @description 检查标签是否闭合
+ * @param {String} method 如果闭合要进行的操作
+ * @returns {Boolean} 是否闭合
+ * @private
+ */
+Lexer.prototype.checkClose = function (method) {
+ const selfClose = this.content[this.i] === '/'
+ if (this.content[this.i] === '>' || (selfClose && this.content[this.i + 1] === '>')) {
+ if (method) {
+ this.handler[method](this.content.substring(this.start, this.i))
+ }
+ this.i += selfClose ? 2 : 1
+ this.start = this.i
+ this.handler.onOpenTag(selfClose)
+ if (this.handler.tagName === 'script') {
+ this.i = this.content.indexOf('', this.i)
+ if (this.i !== -1) {
+ this.i += 2
+ this.start = this.i
+ }
+ this.state = this.endTag
+ } else {
+ this.state = this.text
+ }
+ return true
+ }
+ return false
+}
+
+/**
+ * @description 文本状态
+ * @private
+ */
+Lexer.prototype.text = function () {
+ this.i = this.content.indexOf('<', this.i) // 查找最近的标签
+ if (this.i === -1) {
+ // 没有标签了
+ if (this.start < this.content.length) {
+ this.handler.onText(this.content.substring(this.start, this.content.length))
+ }
+ return
+ }
+ const c = this.content[this.i + 1]
+ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
+ // 标签开头
+ if (this.start !== this.i) {
+ this.handler.onText(this.content.substring(this.start, this.i))
+ }
+ this.start = ++this.i
+ this.state = this.tagName
+ } else if (c === '/' || c === '!' || c === '?') {
+ if (this.start !== this.i) {
+ this.handler.onText(this.content.substring(this.start, this.i))
+ }
+ const next = this.content[this.i + 2]
+ if (c === '/' && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) {
+ // 标签结尾
+ this.i += 2
+ this.start = this.i
+ this.state = this.endTag
+ return
+ }
+ // 处理注释
+ let end = '-->'
+ if (c !== '!' || this.content[this.i + 2] !== '-' || this.content[this.i + 3] !== '-') {
+ end = '>'
+ }
+ this.i = this.content.indexOf(end, this.i)
+ if (this.i !== -1) {
+ this.i += end.length
+ this.start = this.i
+ }
+ } else {
+ this.i++
+ }
+}
+
+/**
+ * @description 标签名状态
+ * @private
+ */
+Lexer.prototype.tagName = function () {
+ if (blankChar[this.content[this.i]]) {
+ // 解析到标签名
+ this.handler.onTagName(this.content.substring(this.start, this.i))
+ while (blankChar[this.content[++this.i]]);
+ if (this.i < this.content.length && !this.checkClose()) {
+ this.start = this.i
+ this.state = this.attrName
+ }
+ } else if (!this.checkClose('onTagName')) {
+ this.i++
+ }
+}
+
+/**
+ * @description 属性名状态
+ * @private
+ */
+Lexer.prototype.attrName = function () {
+ let c = this.content[this.i]
+ if (blankChar[c] || c === '=') {
+ // 解析到属性名
+ this.handler.onAttrName(this.content.substring(this.start, this.i))
+ let needVal = c === '='
+ const len = this.content.length
+ while (++this.i < len) {
+ c = this.content[this.i]
+ if (!blankChar[c]) {
+ if (this.checkClose()) return
+ if (needVal) {
+ // 等号后遇到第一个非空字符
+ this.start = this.i
+ this.state = this.attrVal
+ return
+ }
+ if (this.content[this.i] === '=') {
+ needVal = true
+ } else {
+ this.start = this.i
+ this.state = this.attrName
+ return
+ }
+ }
+ }
+ } else if (!this.checkClose('onAttrName')) {
+ this.i++
+ }
+}
+
+/**
+ * @description 属性值状态
+ * @private
+ */
+Lexer.prototype.attrVal = function () {
+ const c = this.content[this.i]
+ const len = this.content.length
+ if (c === '"' || c === "'") {
+ // 有冒号的属性
+ this.start = ++this.i
+ this.i = this.content.indexOf(c, this.i)
+ if (this.i === -1) return
+ this.handler.onAttrVal(this.content.substring(this.start, this.i))
+ } else {
+ // 没有冒号的属性
+ for (; this.i < len; this.i++) {
+ if (blankChar[this.content[this.i]]) {
+ this.handler.onAttrVal(this.content.substring(this.start, this.i))
+ break
+ } else if (this.checkClose('onAttrVal')) return
+ }
+ }
+ while (blankChar[this.content[++this.i]]);
+ if (this.i < len && !this.checkClose()) {
+ this.start = this.i
+ this.state = this.attrName
+ }
+}
+
+/**
+ * @description 结束标签状态
+ * @returns {String} 结束的标签名
+ * @private
+ */
+Lexer.prototype.endTag = function () {
+ const c = this.content[this.i]
+ if (blankChar[c] || c === '>' || c === '/') {
+ this.handler.onCloseTag(this.content.substring(this.start, this.i))
+ if (c !== '>') {
+ this.i = this.content.indexOf('>', this.i)
+ if (this.i === -1) return
+ }
+ this.start = ++this.i
+ this.state = this.text
+ } else {
+ this.i++
+ }
+}
+
export default Parser
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-html/tm-html.vue b/src/uni_modules/tm-ui/components/tm-html/tm-html.vue
index 0b24b91..a7f6660 100644
--- a/src/uni_modules/tm-ui/components/tm-html/tm-html.vue
+++ b/src/uni_modules/tm-ui/components/tm-html/tm-html.vue
@@ -1,300 +1,301 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-icon/tm-icon.vue b/src/uni_modules/tm-ui/components/tm-icon/tm-icon.vue
index 24b037a..7e64e79 100644
--- a/src/uni_modules/tm-ui/components/tm-icon/tm-icon.vue
+++ b/src/uni_modules/tm-ui/components/tm-icon/tm-icon.vue
@@ -1,171 +1,172 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-image/tm-image.vue b/src/uni_modules/tm-ui/components/tm-image/tm-image.vue
index 6f545bf..843ec98 100644
--- a/src/uni_modules/tm-ui/components/tm-image/tm-image.vue
+++ b/src/uni_modules/tm-ui/components/tm-image/tm-image.vue
@@ -1,399 +1,423 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-input/tm-input.vue b/src/uni_modules/tm-ui/components/tm-input/tm-input.vue
index 252b792..95d3725 100644
--- a/src/uni_modules/tm-ui/components/tm-input/tm-input.vue
+++ b/src/uni_modules/tm-ui/components/tm-input/tm-input.vue
@@ -1,778 +1,792 @@
-
-
-
-
- {{
- _attrs.leftText
- }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ String(nowValue).length + '/' + _attrs.maxlength }}
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- _attrs.rightText
- }}
-
-
-
-
-
-
-
+
+
+
+
+ {{
+ _attrs.leftText
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ String(nowValue).length + '/' + _attrs.maxlength }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ _attrs.rightText
+ }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-modal/tm-modal.vue b/src/uni_modules/tm-ui/components/tm-modal/tm-modal.vue
index 98a4895..8625acf 100644
--- a/src/uni_modules/tm-ui/components/tm-modal/tm-modal.vue
+++ b/src/uni_modules/tm-ui/components/tm-modal/tm-modal.vue
@@ -1,601 +1,755 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ _title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-money/tm-money.vue b/src/uni_modules/tm-ui/components/tm-money/tm-money.vue
new file mode 100644
index 0000000..9b24d71
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-money/tm-money.vue
@@ -0,0 +1,293 @@
+
+
+
+
+
+ {{ _symbolText }}
+
+ {{ _showCn
+ ? money_rmb : money_str.val }}
+
+ {{
+ money_str.xs != ''
+ ? '.' : '' }}{{ money_str.xs }}
+ {{ _symbolText
+ }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-more/tm-more.vue b/src/uni_modules/tm-ui/components/tm-more/tm-more.vue
new file mode 100644
index 0000000..e50d819
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-more/tm-more.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ opened ? _text[1] : _text[0] }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-navbar/tm-navbar.vue b/src/uni_modules/tm-ui/components/tm-navbar/tm-navbar.vue
index efee376..1a1361a 100644
--- a/src/uni_modules/tm-ui/components/tm-navbar/tm-navbar.vue
+++ b/src/uni_modules/tm-ui/components/tm-navbar/tm-navbar.vue
@@ -1,419 +1,443 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- _title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ _title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-picker-date/tm-picker-date.vue b/src/uni_modules/tm-ui/components/tm-picker-date/tm-picker-date.vue
index b4e923d..fb00ae8 100644
--- a/src/uni_modules/tm-ui/components/tm-picker-date/tm-picker-date.vue
+++ b/src/uni_modules/tm-ui/components/tm-picker-date/tm-picker-date.vue
@@ -1,543 +1,581 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-picker-selected/tm-picker-selected.vue b/src/uni_modules/tm-ui/components/tm-picker-selected/tm-picker-selected.vue
new file mode 100644
index 0000000..76d4fe9
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-picker-selected/tm-picker-selected.vue
@@ -0,0 +1,508 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+ 没有数据
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-picker-view/picker-item copy.vue b/src/uni_modules/tm-ui/components/tm-picker-view/picker-item copy.vue
deleted file mode 100644
index 70c2add..0000000
--- a/src/uni_modules/tm-ui/components/tm-picker-view/picker-item copy.vue
+++ /dev/null
@@ -1,326 +0,0 @@
-
-
-
-
-
- {{ _unitsName }}
-
-
-
-
-
-
-
- {{ item[rangText] }}
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-picker-view/picker-item.vue b/src/uni_modules/tm-ui/components/tm-picker-view/picker-item.vue
index 22b4268..364ffc5 100644
--- a/src/uni_modules/tm-ui/components/tm-picker-view/picker-item.vue
+++ b/src/uni_modules/tm-ui/components/tm-picker-view/picker-item.vue
@@ -1,267 +1,277 @@
-
-
-
-
-
-
- {{ item }}
-
-
-
-
-
-
- {{ item[rangText] || "" }}
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+ {{ item[rangText]||"" }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-picker-view/tm-picker-view copy.vue b/src/uni_modules/tm-ui/components/tm-picker-view/tm-picker-view copy.vue
deleted file mode 100644
index 42fe184..0000000
--- a/src/uni_modules/tm-ui/components/tm-picker-view/tm-picker-view copy.vue
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-picker-view/tm-picker-view.vue b/src/uni_modules/tm-ui/components/tm-picker-view/tm-picker-view.vue
index df2bf50..65a793d 100644
--- a/src/uni_modules/tm-ui/components/tm-picker-view/tm-picker-view.vue
+++ b/src/uni_modules/tm-ui/components/tm-picker-view/tm-picker-view.vue
@@ -1,273 +1,328 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-picker-view/util.ts b/src/uni_modules/tm-ui/components/tm-picker-view/util.ts
index 9eb39f6..505cbec 100644
--- a/src/uni_modules/tm-ui/components/tm-picker-view/util.ts
+++ b/src/uni_modules/tm-ui/components/tm-picker-view/util.ts
@@ -1,129 +1,129 @@
-type TM_PICKER_X_ITEM = Record
-/**
- * 当前树有多少个被选中了。
- */
-export function getTreeSelectedNum(item: TM_PICKER_X_ITEM[], target: Set): number {
- let inx = 0;
- function jshz(tree: TM_PICKER_X_ITEM[]) {
- for (let i = 0; i < tree.length; i++) {
- let item = tree[i]
- if (item.children.length > 0) {
- jshz(item.children)
- } else if (target.has(item.id)) {
- inx += 1
- }
- }
- }
- jshz(item)
- return inx;
-}
-
-/**
- * 根据目标节点,过滤掉父节点。
- * @param item
- * @param target
- */
-export function filterParentNode(item: TM_PICKER_X_ITEM[], target: Set): string[] {
- function jshz(tree: TM_PICKER_X_ITEM[]): string[] {
- let arr = [] as string[]
- for (let i = 0; i < tree.length; i++) {
- let item = tree[i]
- if (item.children.length > 0) {
- arr = arr.concat(jshz(item.children))
- } else if (target.has(item.id)) {
- arr.push(item.id)
- }
- }
- return arr;
- }
- return jshz(item)
-}
-
-/**
- * 根据给定的长度值,赋值默认值
- */
-export function setDefaultByValueAr(list: TM_PICKER_X_ITEM[], value: string[], maxLen: number): string[] {
- let v = value;
- let pr = [] as string[];
- for (let j = 0; j < maxLen; j++) {
- pr.push("")
- }
- v = v.concat(pr).slice(0, maxLen)
- let defaultAr = [] as string[];
- function setvalue(item: TM_PICKER_X_ITEM[]) {
- if (item.length > 0) {
- defaultAr.push(item[0].id);
- if (item[0].children.length > 0) {
- setvalue(item[0].children)
- }
- }
- }
-
- setvalue(list);
-
- for (let i = 0; i < maxLen; i++) {
- if (defaultAr.length - 1 >= i && v[i] == "") {
- v[i] = defaultAr[i]
- }
- }
-
-
- return v;
-}
-
-
-
-// 通过 ID 查找节点的函数
-export function findNodeById(TreeNode: TM_PICKER_X_ITEM[], id: string): TM_PICKER_X_ITEM | null {
- let newnode = null as TM_PICKER_X_ITEM | null
- for (let i = 0; i < TreeNode.length; i++) {
- let node = TreeNode[i]
- if (node.id === id) {
- newnode = node;
- break;
- }
- if (node.children.length > 0) {
- const foundNode = findNodeById(node.children, id);
- if (foundNode != null) {
- newnode = foundNode;
- break;
- }
- }
-
- }
-
- return newnode;
-}
-
-
-// 查找节点的上级节点
-export function findParentNode(nodes: TM_PICKER_X_ITEM[], targetNodeId: string): TM_PICKER_X_ITEM | null {
- function search(node: TM_PICKER_X_ITEM): TM_PICKER_X_ITEM | null {
- if (node.children.length > 0) {
- for (let i = 0; i < node.children.length; i++) {
- const child = node.children[i];
- if (child.id === targetNodeId) {
- return node;
- } else {
- const foundParent = search(child);
- if (foundParent != null) {
- return foundParent;
- }
- }
- }
- }
-
- return null;
- }
-
- // 使用for循环遍历根节点数组
- for (let i = 0; i < nodes.length; i++) {
- const root = nodes[i];
- const parentNode = search(root);
- if (parentNode != null) {
- return parentNode;
- }
- }
-
- return null; // 如果未找到目标节点的父节点,则返回undefined
+type TM_PICKER_X_ITEM = Record
+/**
+ * 当前树有多少个被选中了。
+ */
+export function getTreeSelectedNum(item: TM_PICKER_X_ITEM[], target: Set): number {
+ let inx = 0;
+ function jshz(tree: TM_PICKER_X_ITEM[]) {
+ for (let i = 0; i < tree.length; i++) {
+ let item = tree[i]
+ if (item.children.length > 0) {
+ jshz(item.children)
+ } else if (target.has(item.id)) {
+ inx += 1
+ }
+ }
+ }
+ jshz(item)
+ return inx;
+}
+
+/**
+ * 根据目标节点,过滤掉父节点。
+ * @param item
+ * @param target
+ */
+export function filterParentNode(item: TM_PICKER_X_ITEM[], target: Set): string[] {
+ function jshz(tree: TM_PICKER_X_ITEM[]): string[] {
+ let arr = [] as string[]
+ for (let i = 0; i < tree.length; i++) {
+ let item = tree[i]
+ if (item.children.length > 0) {
+ arr = arr.concat(jshz(item.children))
+ } else if (target.has(item.id)) {
+ arr.push(item.id)
+ }
+ }
+ return arr;
+ }
+ return jshz(item)
+}
+
+/**
+ * 根据给定的长度值,赋值默认值
+ */
+export function setDefaultByValueAr(list: TM_PICKER_X_ITEM[], value: string[], maxLen: number): string[] {
+ let v = value;
+ let pr = [] as string[];
+ for (let j = 0; j < maxLen; j++) {
+ pr.push("")
+ }
+ v = v.concat(pr).slice(0, maxLen)
+ let defaultAr = [] as string[];
+ function setvalue(item: TM_PICKER_X_ITEM[]) {
+ if (item.length > 0) {
+ defaultAr.push(item[0].id);
+ if (item[0].children.length > 0) {
+ setvalue(item[0].children)
+ }
+ }
+ }
+
+ setvalue(list);
+
+ for (let i = 0; i < maxLen; i++) {
+ if (defaultAr.length - 1 >= i && v[i] == "") {
+ v[i] = defaultAr[i]
+ }
+ }
+
+
+ return v;
+}
+
+
+
+// 通过 ID 查找节点的函数
+export function findNodeById(TreeNode: TM_PICKER_X_ITEM[], id: string): TM_PICKER_X_ITEM | null {
+ let newnode = null as TM_PICKER_X_ITEM | null
+ for (let i = 0; i < TreeNode.length; i++) {
+ let node = TreeNode[i]
+ if (node.id === id) {
+ newnode = node;
+ break;
+ }
+ if (node.children.length > 0) {
+ const foundNode = findNodeById(node.children, id);
+ if (foundNode != null) {
+ newnode = foundNode;
+ break;
+ }
+ }
+
+ }
+
+ return newnode;
+}
+
+
+// 查找节点的上级节点
+export function findParentNode(nodes: TM_PICKER_X_ITEM[], targetNodeId: string): TM_PICKER_X_ITEM | null {
+ function search(node: TM_PICKER_X_ITEM): TM_PICKER_X_ITEM | null {
+ if (node.children.length > 0) {
+ for (let i = 0; i < node.children.length; i++) {
+ const child = node.children[i];
+ if (child.id === targetNodeId) {
+ return node;
+ } else {
+ const foundParent = search(child);
+ if (foundParent != null) {
+ return foundParent;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ // 使用for循环遍历根节点数组
+ for (let i = 0; i < nodes.length; i++) {
+ const root = nodes[i];
+ const parentNode = search(root);
+ if (parentNode != null) {
+ return parentNode;
+ }
+ }
+
+ return null; // 如果未找到目标节点的父节点,则返回undefined
}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-picker/tm-picker.vue b/src/uni_modules/tm-ui/components/tm-picker/tm-picker.vue
index 2491266..301962c 100644
--- a/src/uni_modules/tm-ui/components/tm-picker/tm-picker.vue
+++ b/src/uni_modules/tm-ui/components/tm-picker/tm-picker.vue
@@ -1,365 +1,367 @@
-
-
-
-
-
-
-
-
-
-
-
- 取消
-
- 确定
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-popover/propsType.ts b/src/uni_modules/tm-ui/components/tm-popover/propsType.ts
new file mode 100644
index 0000000..1d389ad
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-popover/propsType.ts
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2025. tmzdy by @https://tmui.design
+ */
+
+export type PositionType = 'tr' | 'tc' | 'tl' | 'br' | 'bc' | 'bl' | 'left' | 'right';
+export interface propsType {
+ /**
+ * tr:左上;tc:上中;tl:右上;br:左下;bc:下中;bl:右下;left:左边;right:右边
+ */
+ position?:PositionType,
+ /**
+ * 是否显示
+ */
+ modelValue?:boolean,
+ /**
+ * 是否点击内容区域关闭
+ */
+ isClickClose?:boolean,
+ /**
+ * 遮罩背景色
+ */
+ showMask?:boolean,
+ /**
+ * 层级
+ */
+ zIndex?:number|string,
+ /**
+ * 是否显示三角
+ */
+ showTriangle?:boolean,
+ /**
+ * 三角颜色
+ */
+ triangleColor?:string,
+ /**
+ * 三角暗黑时的颜色
+ */
+ triangleDarkColor?:string
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-popover/tm-popover.vue b/src/uni_modules/tm-ui/components/tm-popover/tm-popover.vue
new file mode 100644
index 0000000..7d48723
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-popover/tm-popover.vue
@@ -0,0 +1,503 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-progress/propsType.ts b/src/uni_modules/tm-ui/components/tm-progress/propsType.ts
new file mode 100644
index 0000000..268602b
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-progress/propsType.ts
@@ -0,0 +1,74 @@
+/**
+ * @description 进度条组件属性类型定义
+ */
+export interface PropsType {
+ /**
+ * 当前进度值
+ */
+ modelValue?: number;
+
+ /**
+ * 最小值
+ */
+ min?: number;
+
+ /**
+ * 最大值
+ */
+ max?: number;
+
+ /**
+ * 进度条颜色
+ */
+ color?: string;
+
+ /**
+ * 线性渐变颜色
+ */
+ linearColor?: string;
+
+ /**
+ * 背景颜色
+ */
+ bgColor?: string;
+
+ /**
+ * 暗黑模式背景颜色
+ */
+ darkBgColor?: string;
+
+ /**
+ * 是否显示进度标签
+ */
+ showLabel?: boolean | string;
+
+ /**
+ * 标签文字颜色
+ */
+ labelColor?: string;
+
+ /**
+ * 标签字体大小
+ */
+ labelFontSize?: string | number;
+
+ /**
+ * 进度条高度
+ */
+ size?: string | number;
+
+ /**
+ * 圆角大小
+ */
+ round?: number | string;
+
+ /**
+ * 动画持续时间(毫秒)
+ */
+ duration?: number,
+
+ /**
+ * 标签显示在进度条内部
+ */
+ labelInside?: boolean | string;
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-progress/tm-progress.vue b/src/uni_modules/tm-ui/components/tm-progress/tm-progress.vue
new file mode 100644
index 0000000..76f57a4
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-progress/tm-progress.vue
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+ {{percent.toFixed(0)}}%
+
+
+
+
+
+ {{percent.toFixed(0)}}%
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-pull-refresh/tm-pull-refresh.vue b/src/uni_modules/tm-ui/components/tm-pull-refresh/tm-pull-refresh.vue
new file mode 100644
index 0000000..eb620b6
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-pull-refresh/tm-pull-refresh.vue
@@ -0,0 +1,456 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ pullText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ bottomText }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-radio-group/tm-radio-group.vue b/src/uni_modules/tm-ui/components/tm-radio-group/tm-radio-group.vue
index 380c124..5e4b159 100644
--- a/src/uni_modules/tm-ui/components/tm-radio-group/tm-radio-group.vue
+++ b/src/uni_modules/tm-ui/components/tm-radio-group/tm-radio-group.vue
@@ -1,111 +1,107 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-radio/tm-radio.vue b/src/uni_modules/tm-ui/components/tm-radio/tm-radio.vue
index 28a6bc7..2b81699 100644
--- a/src/uni_modules/tm-ui/components/tm-radio/tm-radio.vue
+++ b/src/uni_modules/tm-ui/components/tm-radio/tm-radio.vue
@@ -1,368 +1,382 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ _label }}
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-rate/tm-rate.vue b/src/uni_modules/tm-ui/components/tm-rate/tm-rate.vue
index f4a0678..f53542d 100644
--- a/src/uni_modules/tm-ui/components/tm-rate/tm-rate.vue
+++ b/src/uni_modules/tm-ui/components/tm-rate/tm-rate.vue
@@ -1,295 +1,309 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{score.toFixed(1)}}
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-row/tm-row.vue b/src/uni_modules/tm-ui/components/tm-row/tm-row.vue
index c4a4fcb..6d8cd4e 100644
--- a/src/uni_modules/tm-ui/components/tm-row/tm-row.vue
+++ b/src/uni_modules/tm-ui/components/tm-row/tm-row.vue
@@ -1,116 +1,116 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-sheet/tm-sheet.vue b/src/uni_modules/tm-ui/components/tm-sheet/tm-sheet.vue
index 1ffb7df..84ddd69 100644
--- a/src/uni_modules/tm-ui/components/tm-sheet/tm-sheet.vue
+++ b/src/uni_modules/tm-ui/components/tm-sheet/tm-sheet.vue
@@ -1,289 +1,293 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-sign-board/propsType.ts b/src/uni_modules/tm-ui/components/tm-sign-board/propsType.ts
new file mode 100644
index 0000000..7fd3204
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-sign-board/propsType.ts
@@ -0,0 +1,27 @@
+/**
+ * @description 进度条组件属性类型定义
+ */
+export interface PropsType {
+ /**
+ * 线颜色
+ */
+ strokeColor?: string;
+ /**
+ * 线颜色
+ */
+ backgroundColor?: string;
+
+ /**
+ * 线宽
+ */
+ strokeWidth?: string | number;
+
+ /**
+ * 画布宽和高,不允许%,只能是数字或者带单位的数字如:4,'4',20px,750rpx
+ */
+ width?: string | number;
+ /**
+ * 画布宽和高,不允许%,只能是数字或者带单位的数字如:4,'4',20px,750rpx
+ */
+ height?: string | number;
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-sign-board/tm-sign-board.vue b/src/uni_modules/tm-ui/components/tm-sign-board/tm-sign-board.vue
new file mode 100644
index 0000000..a123a46
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-sign-board/tm-sign-board.vue
@@ -0,0 +1,357 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-skeleton/tm-skeleton.vue b/src/uni_modules/tm-ui/components/tm-skeleton/tm-skeleton.vue
new file mode 100644
index 0000000..0caf226
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-skeleton/tm-skeleton.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-sku/tm-sku.vue b/src/uni_modules/tm-ui/components/tm-sku/tm-sku.vue
new file mode 100644
index 0000000..4cd2787
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-sku/tm-sku.vue
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+ {{ item2.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $i18n.t('tmui32x.tmSku.addText') }}
+
+
+
+
+
+
+ {{ buyBtnText }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-slider-double/propsType.ts b/src/uni_modules/tm-ui/components/tm-slider-double/propsType.ts
new file mode 100644
index 0000000..76b4256
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-slider-double/propsType.ts
@@ -0,0 +1,64 @@
+export interface PropsType {
+ /**
+ * 等同v-model当前值
+ */
+ modelValue?: number[];
+ /**
+ * 最大值
+ */
+ max?: number;
+ /**
+ * 最小值
+ */
+ min?: number;
+ /**
+ * 是否禁用
+ */
+ disabled?: boolean;
+ /**
+ * 步进值
+ */
+ step?: number;
+ /**
+ * 步进值刻度值
+ * 比如max-min为100总值,刻度为20,那么setpCount就是4,
+ */
+ stepCount?: number;
+ /**
+ * 激活时的颜色,空值取全局值,linearColor不空时取背景色会取linearColor,但其它label和按钮焦点色还是这个值。
+ */
+ color?: string;
+ /**
+ * 默认的背景色
+ */
+ bgColor?: string;
+ /**
+ * 滑条的大小
+ */
+ size?: string;
+ /**
+ * 滑块的尺寸
+ */
+ btnSize?: string;
+ /**
+ * 滑条的圆角。
+ * 为空值时,取全局的进度条值
+ */
+ round?: string;
+ /**
+ * 是否显示进度条上的label文本
+ */
+ showLabel?: boolean;
+ /**
+ * 文本颜色
+ */
+ labelColor?: string;
+ /**
+ * 文本文字大小
+ */
+ labelFontSize?: string;
+ /**
+ * 线性渐变背景颜色
+ */
+ linearColor?: string;
+}
diff --git a/src/uni_modules/tm-ui/components/tm-slider-double/tm-slider-double.vue b/src/uni_modules/tm-ui/components/tm-slider-double/tm-slider-double.vue
new file mode 100644
index 0000000..3c521b7
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-slider-double/tm-slider-double.vue
@@ -0,0 +1,426 @@
+
+
+
+
+ onTrackTouchStart(e, -1)" @touchmove.stop.prevent="onTrackTouchMove"
+ @touchend.stop="onTrackTouchEnd" @touchcancel.stop="onTrackTouchEnd"
+ @mousedown.stop.prevent="(e) => onTrackMouseDown(e, 0)">
+
+ onTrackTouchStart(e, index)"
+ @touchmove.stop.prevent="onTrackTouchMove"
+ @touchend.stop="onTrackTouchEnd"
+ @touchcancel.stop="onTrackTouchEnd"
+ @mousedown.stop.prevent="(e) => onTrackMouseDown(e, index)"
+ >
+
+ {{ nowValue[index] }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-slider-menu/tm-slider-menu.vue b/src/uni_modules/tm-ui/components/tm-slider-menu/tm-slider-menu.vue
new file mode 100644
index 0000000..76afb0e
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-slider-menu/tm-slider-menu.vue
@@ -0,0 +1,477 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-slider/propsType.ts b/src/uni_modules/tm-ui/components/tm-slider/propsType.ts
new file mode 100644
index 0000000..35799f0
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-slider/propsType.ts
@@ -0,0 +1,64 @@
+export interface PropsType {
+ /**
+ * 等同v-model当前值
+ */
+ modelValue?: number;
+ /**
+ * 最大值
+ */
+ max?: number;
+ /**
+ * 最小值
+ */
+ min?: number;
+ /**
+ * 是否禁用
+ */
+ disabled?: boolean;
+ /**
+ * 步进值
+ */
+ step?: number;
+ /**
+ * 步进值刻度值
+ * 比如max-min为100总值,刻度为20,那么setpCount就是4,
+ */
+ stepCount?: number;
+ /**
+ * 激活时的颜色,空值取全局值,linearColor不空时取背景色会取linearColor,但其它label和按钮焦点色还是这个值。
+ */
+ color?: string;
+ /**
+ * 默认的背景色
+ */
+ bgColor?: string;
+ /**
+ * 滑条的大小
+ */
+ size?: string;
+ /**
+ * 滑块的尺寸
+ */
+ btnSize?: string;
+ /**
+ * 滑条的圆角。
+ * 为空值时,取全局的进度条值
+ */
+ round?: string;
+ /**
+ * 是否显示进度条上的label文本
+ */
+ showLabel?: boolean;
+ /**
+ * 文本颜色
+ */
+ labelColor?: string;
+ /**
+ * 文本文字大小
+ */
+ labelFontSize?: string;
+ /**
+ * 线性渐变背景颜色
+ */
+ linearColor?: string;
+}
diff --git a/src/uni_modules/tm-ui/components/tm-slider/tm-slider.vue b/src/uni_modules/tm-ui/components/tm-slider/tm-slider.vue
new file mode 100644
index 0000000..bc69976
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-slider/tm-slider.vue
@@ -0,0 +1,367 @@
+
+
+
+
+
+
+
+
+ {{ nowValue }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-stepper/tm-stepper.vue b/src/uni_modules/tm-ui/components/tm-stepper/tm-stepper.vue
index 8d8397d..53007e8 100644
--- a/src/uni_modules/tm-ui/components/tm-stepper/tm-stepper.vue
+++ b/src/uni_modules/tm-ui/components/tm-stepper/tm-stepper.vue
@@ -1,415 +1,439 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-steps-item/tm-steps-item.vue b/src/uni_modules/tm-ui/components/tm-steps-item/tm-steps-item.vue
new file mode 100644
index 0000000..a9cc8f8
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-steps-item/tm-steps-item.vue
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{_label}}
+
+
+
+
+
+ {{_desc}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-steps-item/tmStepsItemPropsTypes.ts b/src/uni_modules/tm-ui/components/tm-steps-item/tmStepsItemPropsTypes.ts
new file mode 100644
index 0000000..6be763e
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-steps-item/tmStepsItemPropsTypes.ts
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2025. tmzdy by @https://tmui.design
+ */
+
+export interface tmStepsItemPropsTypes {
+ /** 默认图标 */
+ icon?: string,
+ /** 激活状态下的图标 */
+ activeIcon?: string,
+ /** 图标大小,可以是字符串或数字 */
+ iconSize?: string | number,
+ /** 标签文本大小,可以是字符串或数字 */
+ labelSize?: string | number,
+ /** 描述文本大小,可以是字符串或数字 */
+ descSize?: string | number,
+ /** 默认颜色 */
+ color?: string,
+ /** 激活状态下的颜色 */
+ activeColor?: string,
+ /** 标题 */
+ label?: string,
+ /** 辅助信息 */
+ desc?: string
+}
diff --git a/src/uni_modules/tm-ui/components/tm-steps/propsType.ts b/src/uni_modules/tm-ui/components/tm-steps/propsType.ts
new file mode 100644
index 0000000..fa230f4
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-steps/propsType.ts
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2025. tmzdy by @https://tmui.design
+ */
+
+export interface PropsTypes {
+ /** 绑定值,数字 */
+ modelValue?: number,
+ /** 默认图标 */
+ icon?: string,
+ /** 激活状态下的图标 */
+ activeIcon?: string,
+ /** 图标大小,可以是字符串或数字 */
+ iconSize?: string | number,
+ /** 标签文本大小,可以是字符串或数字 */
+ labelSize?: string | number,
+ /** 描述文本大小,可以是字符串或数字 */
+ descSize?: string | number,
+ /** 默认颜色 */
+ color?: string,
+ /** 激活状态下的颜色 */
+ activeColor?: string,
+ /** 是否垂直排列 */
+ vertical?: boolean,
+ /** 是否反转排列顺序 */
+ reverse?: boolean,
+ /** 是否禁用 */
+ disabled?: boolean,
+ /** 显示标题及辅助信息标签 */
+ showFooter?: boolean,
+}
diff --git a/src/uni_modules/tm-ui/components/tm-steps/tm-steps.vue b/src/uni_modules/tm-ui/components/tm-steps/tm-steps.vue
new file mode 100644
index 0000000..ac5fe73
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-steps/tm-steps.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-sticky-header/tm-sticky-header.vue b/src/uni_modules/tm-ui/components/tm-sticky-header/tm-sticky-header.vue
index 995b267..402b7c9 100644
--- a/src/uni_modules/tm-ui/components/tm-sticky-header/tm-sticky-header.vue
+++ b/src/uni_modules/tm-ui/components/tm-sticky-header/tm-sticky-header.vue
@@ -1,63 +1,63 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-sticky/tm-sticky.vue b/src/uni_modules/tm-ui/components/tm-sticky/tm-sticky.vue
index 27e405d..9e6889f 100644
--- a/src/uni_modules/tm-ui/components/tm-sticky/tm-sticky.vue
+++ b/src/uni_modules/tm-ui/components/tm-sticky/tm-sticky.vue
@@ -1,42 +1,42 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-switch/tm-switch.vue b/src/uni_modules/tm-ui/components/tm-switch/tm-switch.vue
index b253646..32aa5d9 100644
--- a/src/uni_modules/tm-ui/components/tm-switch/tm-switch.vue
+++ b/src/uni_modules/tm-ui/components/tm-switch/tm-switch.vue
@@ -1,397 +1,386 @@
-
-
-
-
-
-
-
-
- {{ !opened ? "" : _label[0] }}
- {{ opened ? "" : _label[1] }}
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ {{ !opened ? '' : _label[0] }}
+ {{ opened ? '' : _label[1] }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-tabbar/tm-tabbar.vue b/src/uni_modules/tm-ui/components/tm-tabbar/tm-tabbar.vue
new file mode 100644
index 0000000..5a72288
--- /dev/null
+++ b/src/uni_modules/tm-ui/components/tm-tabbar/tm-tabbar.vue
@@ -0,0 +1,477 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-tabs/tm-tabs.vue b/src/uni_modules/tm-ui/components/tm-tabs/tm-tabs.vue
index 38606f6..762fe2c 100644
--- a/src/uni_modules/tm-ui/components/tm-tabs/tm-tabs.vue
+++ b/src/uni_modules/tm-ui/components/tm-tabs/tm-tabs.vue
@@ -1,478 +1,502 @@
-
-
-
-
-
-
-
-
- {{ getValue(item) }}
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ {{ getValue(item) }}
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-tag/tm-tag.vue b/src/uni_modules/tm-ui/components/tm-tag/tm-tag.vue
index 5d91444..f2c95aa 100644
--- a/src/uni_modules/tm-ui/components/tm-tag/tm-tag.vue
+++ b/src/uni_modules/tm-ui/components/tm-tag/tm-tag.vue
@@ -1,357 +1,371 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-text/tm-text.vue b/src/uni_modules/tm-ui/components/tm-text/tm-text.vue
index 1441ae9..1aa5971 100644
--- a/src/uni_modules/tm-ui/components/tm-text/tm-text.vue
+++ b/src/uni_modules/tm-ui/components/tm-text/tm-text.vue
@@ -1,277 +1,286 @@
-
-
-
-
- {{ _attrs.label }}
-
-
- {{ item.text }}
-
-
-
-
-
-
-
+
+
+
+
+ {{ _attrs.label }}
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
diff --git a/src/uni_modules/tm-ui/components/tm-upload-photo/tm-upload-photo.vue b/src/uni_modules/tm-ui/components/tm-upload-photo/tm-upload-photo.vue
index 11bcd08..834bb87 100644
--- a/src/uni_modules/tm-ui/components/tm-upload-photo/tm-upload-photo.vue
+++ b/src/uni_modules/tm-ui/components/tm-upload-photo/tm-upload-photo.vue
@@ -1,629 +1,672 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.statusText
- }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/components/tm-upload-video/tm-upload-video.vue b/src/uni_modules/tm-ui/components/tm-upload-video/tm-upload-video.vue
index eb9bda3..b6c1165 100644
--- a/src/uni_modules/tm-ui/components/tm-upload-video/tm-upload-video.vue
+++ b/src/uni_modules/tm-ui/components/tm-upload-video/tm-upload-video.vue
@@ -1,552 +1,588 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.statusText
- }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/css/remixIcon.json b/src/uni_modules/tm-ui/css/remixIcon.json
new file mode 100644
index 0000000..e78c071
--- /dev/null
+++ b/src/uni_modules/tm-ui/css/remixIcon.json
@@ -0,0 +1,613 @@
+[
+ "arrow-right-line",
+ "arrow-down-line",
+ "arrow-left-line",
+ "arrow-up-line",
+ "arrow-up-s-line",
+ "arrow-right-s-line",
+ "arrow-down-s-line",
+ "arrow-left-s-line",
+ "arrow-up-s-fill",
+ "arrow-right-s-fill",
+ "arrow-down-s-fill",
+ "arrow-left-s-fill",
+ "skip-up-line",
+ "skip-right-line",
+ "skip-down-line",
+ "skip-left-line",
+ "skip-up-fill",
+ "skip-right-fill",
+ "skip-down-fill",
+ "skip-left-fill",
+ "arrow-up-down-line",
+ "arrow-left-right-line",
+ "arrow-up-wide-line",
+ "arrow-down-wide-line",
+ "corner-up-left-double-line",
+ "corner-up-right-double-line",
+ "arrow-left-double-line",
+ "arrow-right-double-fill",
+ "expand-up-down-line",
+ "expand-up-down-fill",
+ "expand-left-right-line",
+ "expand-left-right-fill",
+ "arrow-go-forward-line",
+ "arrow-turn-back-line",
+ "arrow-turn-forward-line",
+ "arrow-go-back-line",
+ "home-line",
+ "home-fill",
+ "home-4-line",
+ "home-4-fill",
+ "home-smile-2-line",
+ "home-smile-2-fill",
+ "building-2-line",
+ "building-2-fill",
+ "ancient-gate-line",
+ "ancient-gate-fill",
+ "store-2-line",
+ "store-2-fill",
+ "mail-unread-line",
+ "mail-check-line",
+ "mail-send-line",
+ "mail-open-line",
+ "mail-open-fill",
+ "mail-send-fill",
+ "mail-unread-fill",
+ "mail-check-fill",
+ "mail-add-line",
+ "mail-add-fill",
+ "mail-close-line",
+ "mail-close-fill",
+ "inbox-archive-line",
+ "inbox-archive-fill",
+ "cloud-off-line",
+ "cloud-off-fill",
+ "cloud-fill",
+ "cloud-line",
+ "inbox-unarchive-line",
+ "inbox-unarchive-fill",
+ "attachment-line",
+ "attachment-fill",
+ "profile-line",
+ "profile-fill",
+ "archive-2-line",
+ "archive-2-fill",
+ "at-line",
+ "award-fill",
+ "medal-fill",
+ "medal-2-fill",
+ "verified-badge-fill",
+ "verified-badge-line",
+ "archive-stack-line",
+ "archive-stack-fill",
+ "bar-chart-grouped-line",
+ "bar-chart-grouped-fill",
+ "bar-chart-2-line",
+ "bar-chart-2-fill",
+ "bar-chart-line",
+ "bar-chart-fill",
+ "bookmark-line",
+ "bookmark-fill",
+ "calendar-check-line",
+ "calendar-close-line",
+ "calendar-event-line",
+ "calendar-2-line",
+ "flag-2-line",
+ "triangular-flag-line",
+ "triangular-flag-fill",
+ "flag-2-fill",
+ "global-line",
+ "global-fill",
+ "honour-line",
+ "honour-fill",
+ "customer-service-line",
+ "customer-service-fill",
+ "calendar-schedule-line",
+ "calendar-schedule-fill",
+ "links-line",
+ "printer-line",
+ "printer-fill",
+ "reply-line",
+ "reply-fill",
+ "send-plane-line",
+ "send-plane-fill",
+ "stack-line",
+ "stack-fill",
+ "shake-hands-line",
+ "shake-hands-fill",
+ "copyright-line",
+ "copyright-fill",
+ "megaphone-line",
+ "megaphone-fill",
+ "pass-valid-line",
+ "pass-valid-fill",
+ "pass-pending-line",
+ "pass-pending-fill",
+ "pass-expired-line",
+ "pass-expired-fill",
+ "id-card-line",
+ "id-card-fill",
+ "chat-3-line",
+ "chat-3-fill",
+ "chat-2-line",
+ "chat-2-fill",
+ "message-3-line",
+ "message-3-fill",
+ "message-2-line",
+ "message-2-fill",
+ "chat-unread-line",
+ "chat-unread-fill",
+ "chat-smile-2-line",
+ "chat-smile-2-fill",
+ "chat-smile-line",
+ "chat-smile-fill",
+ "discuss-fill",
+ "discuss-line",
+ "chat-history-line",
+ "chat-history-fill",
+ "video-chat-line",
+ "video-chat-fill",
+ "chat-voice-fill",
+ "chat-voice-line",
+ "speak-fill",
+ "speak-line",
+ "edit-2-line",
+ "edit-2-fill",
+ "quill-pen-line",
+ "quill-pen-fill",
+ "sip-line",
+ "sip-fill",
+ "markup-line",
+ "markup-fill",
+ "edit-box-line",
+ "edit-box-fill",
+ "brush-line",
+ "brush-fill",
+ "brush-2-fill",
+ "brush-2-line",
+ "paint-brush-line",
+ "paint-brush-fill",
+ "drop-line",
+ "drop-fill",
+ "blur-off-line",
+ "blur-off-fill",
+ "color-filter-line",
+ "color-filter-fill",
+ "crop-line",
+ "artboard-2-line",
+ "paint-line",
+ "paint-fill",
+ "palette-line",
+ "palette-fill",
+ "pantone-line",
+ "pantone-fill",
+ "magic-line",
+ "magic-fill",
+ "anticlockwise-line",
+ "anticlockwise-fill",
+ "tools-line",
+ "tools-fill",
+ "clockwise-line",
+ "clockwise-fill",
+ "drag-drop-line",
+ "drag-drop-fill",
+ "hammer-fill",
+ "hammer-line",
+ "circle-line",
+ "circle-fill",
+ "code-line",
+ "code-fill",
+ "terminal-line",
+ "terminal-fill",
+ "cursor-line",
+ "cursor-fill",
+ "smartphone-line",
+ "computer-line",
+ "mac-line",
+ "macbook-line",
+ "phone-line",
+ "phone-fill",
+ "device-line",
+ "tablet-line",
+ "database-2-line",
+ "database-2-fill",
+ "server-line",
+ "server-fill",
+ "hard-drive-fill",
+ "hard-drive-line",
+ "qr-scan-2-line",
+ "qr-scan-line",
+ "qr-code-line",
+ "barcode-line",
+ "shut-down-line",
+ "fingerprint-line",
+ "bluetooth-line",
+ "wifi-line",
+ "wifi-off-line",
+ "rss-line",
+ "rss-fill",
+ "gps-line",
+ "gps-fill",
+ "dashboard-3-line",
+ "dashboard-3-fill",
+ "file-2-line",
+ "file-2-fill",
+ "sticky-note-add-line",
+ "sticky-note-add-fill",
+ "file-list-line",
+ "file-list-fill",
+ "file-text-line",
+ "file-text-fill",
+ "file-list-3-line",
+ "file-list-3-fill",
+ "file-copy-line",
+ "file-copy-fill",
+ "clipboard-line",
+ "clipboard-fill",
+ "survey-line",
+ "survey-fill",
+ "article-line",
+ "article-fill",
+ "book-marked-line",
+ "book-marked-fill",
+ "todo-line",
+ "todo-fill",
+ "file-marked-line",
+ "file-marked-fill",
+ "book-3-line",
+ "book-3-fill",
+ "book-open-line",
+ "book-open-fill",
+ "folder-add-line",
+ "folder-add-fill",
+ "folder-check-line",
+ "folder-check-fill",
+ "folder-open-line",
+ "folder-open-fill",
+ "folder-line",
+ "folder-fill",
+ "align-center",
+ "list-check",
+ "indent-decrease",
+ "indent-increase",
+ "list-indefinite",
+ "attachment-2",
+ "link",
+ "hashtag",
+ "sketching",
+ "wallet-line",
+ "wallet-fill",
+ "bank-card-line",
+ "bank-card-fill",
+ "price-tag-3-line",
+ "price-tag-3-fill",
+ "coupon-line",
+ "coupon-fill",
+ "price-tag-line",
+ "price-tag-fill",
+ "shopping-bag-line",
+ "shopping-bag-fill",
+ "shopping-basket-line",
+ "shopping-basket-fill",
+ "shopping-cart-line",
+ "shopping-cart-fill",
+ "trophy-line",
+ "trophy-fill",
+ "vip-diamond-fill",
+ "vip-diamond-line",
+ "vip-crown-2-line",
+ "vip-crown-2-fill",
+ "vip-crown-line",
+ "vip-crown-fill",
+ "vip-line",
+ "vip-fill",
+ "exchange-line",
+ "exchange-fill",
+ "exchange-dollar-line",
+ "exchange-dollar-fill",
+ "money-cny-circle-line",
+ "money-cny-circle-fill",
+ "copper-coin-line",
+ "copper-coin-fill",
+ "exchange-cny-line",
+ "exchange-cny-fill",
+ "money-euro-circle-line",
+ "money-euro-circle-fill",
+ "red-packet-line",
+ "red-packet-fill",
+ "water-flash-line",
+ "water-flash-fill",
+ "coin-line",
+ "coin-fill",
+ "stock-line",
+ "stock-fill",
+ "gift-line",
+ "gift-fill",
+ "24-hours-line",
+ "24-hours-fill",
+ "shopping-bag-4-line",
+ "shopping-bag-4-fill",
+ "bowl-line",
+ "bowl-fill",
+ "heart-3-line",
+ "heart-3-fill",
+ "dislike-line",
+ "dislike-fill",
+ "heart-pulse-line",
+ "heart-pulse-fill",
+ "alipay-line",
+ "android-line",
+ "alibaba-cloud-line",
+ "app-store-line",
+ "apple-line",
+ "baidu-line",
+ "bilibili-line",
+ "chrome-line",
+ "dingding-line",
+ "drive-line",
+ "dribbble-line",
+ "evernote-line",
+ "facebook-circle-line",
+ "firebase-line",
+ "flutter-line",
+ "github-line",
+ "google-line",
+ "google-play-line",
+ "instagram-line",
+ "invision-line",
+ "meta-line",
+ "qq-line",
+ "snapchat-line",
+ "tiktok-line",
+ "twitter-line",
+ "wechat-line",
+ "wechat-2-line",
+ "weibo-line",
+ "wechat-pay-line",
+ "whatsapp-line",
+ "zhihu-line",
+ "youtube-line",
+ "map-pin-2-line",
+ "map-pin-2-fill",
+ "map-pin-time-line",
+ "map-pin-time-fill",
+ "pushpin-line",
+ "pushpin-fill",
+ "map-pin-user-line",
+ "map-pin-user-fill",
+ "rocket-line",
+ "rocket-fill",
+ "planet-line",
+ "planet-fill",
+ "parking-line",
+ "parking-fill",
+ "road-map-line",
+ "road-map-fill",
+ "earth-line",
+ "earth-fill",
+ "car-line",
+ "car-fill",
+ "plane-line",
+ "image-line",
+ "image-fill",
+ "image-circle-line",
+ "image-circle-fill",
+ "landscape-line",
+ "landscape-fill",
+ "video-on-line",
+ "video-on-fill",
+ "video-line",
+ "video-fill",
+ "live-line",
+ "live-fill",
+ "camera-line",
+ "camera-fill",
+ "camera-off-line",
+ "camera-off-fill",
+ "headphone-line",
+ "headphone-fill",
+ "mic-off-line",
+ "mic-off-fill",
+ "mic-2-fill",
+ "mic-2-line",
+ "volume-down-line",
+ "volume-down-fill",
+ "volume-mute-line",
+ "volume-mute-fill",
+ "volume-up-line",
+ "volume-up-fill",
+ "notification-line",
+ "notification-fill",
+ "notification-off-line",
+ "notification-off-fill",
+ "play-circle-line",
+ "play-circle-fill",
+ "pause-circle-line",
+ "pause-circle-fill",
+ "stop-circle-line",
+ "stop-circle-fill",
+ "equalizer-line",
+ "equalizer-fill",
+ "menu-line",
+ "menu-fill",
+ "apps-line",
+ "apps-fill",
+ "more-line",
+ "more-fill",
+ "more-2-line",
+ "more-2-fill",
+ "star-line",
+ "star-fill",
+ "settings-2-line",
+ "settings-2-fill",
+ "forbid-line",
+ "forbid-fill",
+ "information-line",
+ "information-fill",
+ "checkbox-blank-circle-line",
+ "checkbox-blank-circle-fill",
+ "checkbox-line",
+ "checkbox-fill",
+ "checkbox-indeterminate-line",
+ "checkbox-indeterminate-fill",
+ "add-box-line",
+ "add-box-fill",
+ "checkbox-circle-line",
+ "checkbox-circle-fill",
+ "indeterminate-circle-line",
+ "indeterminate-circle-fill",
+ "add-circle-fill",
+ "add-circle-line",
+ "close-circle-line",
+ "close-circle-fill",
+ "radio-button-line",
+ "radio-button-fill",
+ "check-line",
+ "check-double-line",
+ "close-line",
+ "add-line",
+ "checkbox-multiple-line",
+ "checkbox-multiple-fill",
+ "subtract-line",
+ "equal-line",
+ "upload-line",
+ "download-line",
+ "download-cloud-line",
+ "upload-cloud-line",
+ "login-box-line",
+ "logout-circle-line",
+ "logout-circle-r-line",
+ "shield-line",
+ "shield-fill",
+ "shield-cross-line",
+ "shield-cross-fill",
+ "shield-check-line",
+ "shield-check-fill",
+ "shield-user-fill",
+ "shield-user-line",
+ "delete-bin-2-line",
+ "delete-bin-2-fill",
+ "delete-bin-fill",
+ "delete-bin-line",
+ "delete-back-2-line",
+ "delete-back-2-fill",
+ "lock-password-line",
+ "lock-password-fill",
+ "lock-2-line",
+ "lock-2-fill",
+ "lock-unlock-line",
+ "lock-unlock-fill",
+ "eye-off-line",
+ "eye-line",
+ "eye-fill",
+ "eye-close-line",
+ "eye-close-fill",
+ "eye-off-fill",
+ "search-2-line",
+ "search-2-fill",
+ "zoom-out-line",
+ "zoom-in-line",
+ "zoom-in-fill",
+ "zoom-out-fill",
+ "share-line",
+ "share-fill",
+ "share-circle-line",
+ "share-circle-fill",
+ "alarm-line",
+ "alarm-fill",
+ "thumb-up-line",
+ "thumb-up-fill",
+ "thumb-down-line",
+ "thumb-down-fill",
+ "alarm-warning-line",
+ "alarm-warning-fill",
+ "filter-2-line",
+ "filter-2-fill",
+ "loader-line",
+ "loader-fill",
+ "loop-right-line",
+ "loop-right-fill",
+ "loader-4-line",
+ "loader-4-fill",
+ "reset-right-line",
+ "user-line",
+ "user-fill",
+ "account-box-line",
+ "account-box-fill",
+ "user-add-line",
+ "user-add-fill",
+ "user-minus-fill",
+ "user-follow-fill",
+ "user-follow-line",
+ "user-minus-line",
+ "user-unfollow-line",
+ "user-unfollow-fill",
+ "user-shared-fill",
+ "user-shared-line",
+ "account-pin-circle-line",
+ "account-pin-circle-fill",
+ "group-line",
+ "group-fill",
+ "emotion-happy-line",
+ "emotion-happy-fill",
+ "emotion-normal-fill",
+ "emotion-normal-line",
+ "emotion-unhappy-line",
+ "emotion-unhappy-fill",
+ "emotion-sad-line",
+ "emotion-sad-fill",
+ "women-line",
+ "men-line",
+ "star-smile-line",
+ "star-smile-fill",
+ "sun-line",
+ "sun-fill",
+ "moon-fill",
+ "moon-line",
+ "lightbulb-line",
+ "key-2-line",
+ "key-line",
+ "outlet-line",
+ "lightbulb-flash-line",
+ "t-shirt-line",
+ "t-shirt-fill",
+ "seedling-fill",
+ "seedling-line",
+ "leaf-line",
+ "leaf-fill",
+ "character-recognition-line",
+ "character-recognition-fill",
+ "recycle-line",
+ "recycle-fill",
+ "door-line",
+ "door-fill",
+ "graduation-cap-line",
+ "graduation-cap-fill",
+ "sofa-line",
+ "sofa-fill",
+ "error-warning-line",
+ "error-warning-fill",
+ "question-line",
+ "question-fill",
+ "spam-3-line",
+ "spam-3-fill",
+ "prohibited-line",
+ "prohibited-fill",
+ "information-off-line",
+ "information-off-fill",
+ "star-half-line",
+ "star-half-fill",
+ "settings-line",
+ "settings-fill",
+ "checkbox-multiple-blank-line",
+ "alert-line",
+ "alert-fill",
+ "home-heart-line",
+ "camera-ai-fill",
+ "camera-ai-line",
+ "navigation-line",
+ "navigation-fill",
+ "time-line",
+ "time-fill"
+]
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/css/RemixIcon_Collection_2409112337.remixicon b/src/uni_modules/tm-ui/css/remixIcon.remixicon
similarity index 98%
rename from src/uni_modules/tm-ui/css/RemixIcon_Collection_2409112337.remixicon
rename to src/uni_modules/tm-ui/css/remixIcon.remixicon
index 4f714dd..f279dcb 100644
--- a/src/uni_modules/tm-ui/css/RemixIcon_Collection_2409112337.remixicon
+++ b/src/uni_modules/tm-ui/css/remixIcon.remixicon
@@ -1 +1 @@
-arrow-right-line,arrow-down-line,arrow-left-line,arrow-up-line,arrow-up-s-line,arrow-right-s-line,arrow-down-s-line,arrow-left-s-line,arrow-up-s-fill,arrow-right-s-fill,arrow-down-s-fill,arrow-left-s-fill,skip-up-line,skip-right-line,skip-down-line,skip-left-line,skip-up-fill,skip-right-fill,skip-down-fill,skip-left-fill,arrow-up-down-line,arrow-left-right-line,arrow-up-wide-line,arrow-down-wide-line,corner-up-left-double-line,corner-up-right-double-line,arrow-left-double-line,arrow-right-double-fill,expand-up-down-line,expand-up-down-fill,expand-left-right-line,expand-left-right-fill,arrow-go-forward-line,arrow-turn-back-line,arrow-turn-forward-line,arrow-go-back-line,home-line,home-fill,home-4-line,home-4-fill,home-smile-2-line,home-smile-2-fill,building-2-line,building-2-fill,ancient-gate-line,ancient-gate-fill,store-2-line,store-2-fill,mail-unread-line,mail-check-line,mail-send-line,mail-open-line,mail-open-fill,mail-send-fill,mail-unread-fill,mail-check-fill,mail-add-line,mail-add-fill,mail-close-line,mail-close-fill,inbox-archive-line,inbox-archive-fill,cloud-off-line,cloud-off-fill,cloud-fill,cloud-line,inbox-unarchive-line,inbox-unarchive-fill,attachment-line,attachment-fill,profile-line,profile-fill,archive-2-line,archive-2-fill,at-line,award-fill,medal-fill,medal-2-fill,verified-badge-fill,verified-badge-line,archive-stack-line,archive-stack-fill,bar-chart-grouped-line,bar-chart-grouped-fill,bar-chart-2-line,bar-chart-2-fill,bar-chart-line,bar-chart-fill,bookmark-line,bookmark-fill,calendar-check-line,calendar-close-line,calendar-event-line,calendar-2-line,flag-2-line,triangular-flag-line,triangular-flag-fill,flag-2-fill,global-line,global-fill,honour-line,honour-fill,customer-service-line,customer-service-fill,calendar-schedule-line,calendar-schedule-fill,links-line,printer-line,printer-fill,reply-line,reply-fill,send-plane-line,send-plane-fill,stack-line,stack-fill,shake-hands-line,shake-hands-fill,copyright-line,copyright-fill,megaphone-line,megaphone-fill,pass-valid-line,pass-valid-fill,pass-pending-line,pass-pending-fill,pass-expired-line,pass-expired-fill,id-card-line,id-card-fill,chat-3-line,chat-3-fill,chat-2-line,chat-2-fill,message-3-line,message-3-fill,message-2-line,message-2-fill,chat-unread-line,chat-unread-fill,chat-smile-2-line,chat-smile-2-fill,chat-smile-line,chat-smile-fill,discuss-fill,discuss-line,chat-history-line,chat-history-fill,video-chat-line,video-chat-fill,chat-voice-fill,chat-voice-line,speak-fill,speak-line,edit-2-line,edit-2-fill,quill-pen-line,quill-pen-fill,sip-line,sip-fill,markup-line,markup-fill,edit-box-line,edit-box-fill,brush-line,brush-fill,brush-2-fill,brush-2-line,paint-brush-line,paint-brush-fill,drop-line,drop-fill,blur-off-line,blur-off-fill,color-filter-line,color-filter-fill,crop-line,artboard-2-line,paint-line,paint-fill,palette-line,palette-fill,pantone-line,pantone-fill,magic-line,magic-fill,anticlockwise-line,anticlockwise-fill,tools-line,tools-fill,clockwise-line,clockwise-fill,drag-drop-line,drag-drop-fill,hammer-fill,hammer-line,circle-line,circle-fill,code-line,code-fill,terminal-line,terminal-fill,cursor-line,cursor-fill,smartphone-line,computer-line,mac-line,macbook-line,phone-line,phone-fill,device-line,tablet-line,database-2-line,database-2-fill,server-line,server-fill,hard-drive-fill,hard-drive-line,qr-scan-2-line,qr-scan-line,qr-code-line,barcode-line,shut-down-line,fingerprint-line,bluetooth-line,wifi-line,wifi-off-line,rss-line,rss-fill,gps-line,gps-fill,dashboard-3-line,dashboard-3-fill,file-2-line,file-2-fill,sticky-note-add-line,sticky-note-add-fill,file-list-line,file-list-fill,file-text-line,file-text-fill,file-list-3-line,file-list-3-fill,file-copy-line,file-copy-fill,clipboard-line,clipboard-fill,survey-line,survey-fill,article-line,article-fill,book-marked-line,book-marked-fill,todo-line,todo-fill,file-marked-line,file-marked-fill,book-3-line,book-3-fill,book-open-line,book-open-fill,folder-add-line,folder-add-fill,folder-check-line,folder-check-fill,folder-open-line,folder-open-fill,folder-line,folder-fill,align-center,list-check,indent-decrease,indent-increase,list-indefinite,attachment-2,link,hashtag,sketching,wallet-line,wallet-fill,bank-card-line,bank-card-fill,price-tag-3-line,price-tag-3-fill,coupon-line,coupon-fill,price-tag-line,price-tag-fill,shopping-bag-line,shopping-bag-fill,shopping-basket-line,shopping-basket-fill,shopping-cart-line,shopping-cart-fill,trophy-line,trophy-fill,vip-diamond-fill,vip-diamond-line,vip-crown-2-line,vip-crown-2-fill,vip-crown-line,vip-crown-fill,vip-line,vip-fill,exchange-line,exchange-fill,exchange-dollar-line,exchange-dollar-fill,money-cny-circle-line,money-cny-circle-fill,copper-coin-line,copper-coin-fill,exchange-cny-line,exchange-cny-fill,money-euro-circle-line,money-euro-circle-fill,red-packet-line,red-packet-fill,water-flash-line,water-flash-fill,coin-line,coin-fill,stock-line,stock-fill,gift-line,gift-fill,24-hours-line,24-hours-fill,shopping-bag-4-line,shopping-bag-4-fill,bowl-line,bowl-fill,heart-3-line,heart-3-fill,dislike-line,dislike-fill,heart-pulse-line,heart-pulse-fill,alipay-line,android-line,alibaba-cloud-line,app-store-line,apple-line,baidu-line,bilibili-line,chrome-line,dingding-line,drive-line,dribbble-line,evernote-line,facebook-circle-line,firebase-line,flutter-line,github-line,google-line,google-play-line,instagram-line,invision-line,meta-line,qq-line,snapchat-line,tiktok-line,twitter-line,wechat-line,wechat-2-line,weibo-line,wechat-pay-line,whatsapp-line,zhihu-line,youtube-line,map-pin-2-line,map-pin-2-fill,map-pin-time-line,map-pin-time-fill,pushpin-line,pushpin-fill,map-pin-user-line,map-pin-user-fill,rocket-line,rocket-fill,planet-line,planet-fill,parking-line,parking-fill,road-map-line,road-map-fill,earth-line,earth-fill,car-line,car-fill,plane-line,image-line,image-fill,image-circle-line,image-circle-fill,landscape-line,landscape-fill,video-on-line,video-on-fill,video-line,video-fill,live-line,live-fill,camera-line,camera-fill,camera-off-line,camera-off-fill,headphone-line,headphone-fill,mic-off-line,mic-off-fill,mic-2-fill,mic-2-line,volume-down-line,volume-down-fill,volume-mute-line,volume-mute-fill,volume-up-line,volume-up-fill,notification-line,notification-fill,notification-off-line,notification-off-fill,play-circle-line,play-circle-fill,pause-circle-line,pause-circle-fill,stop-circle-line,stop-circle-fill,equalizer-line,equalizer-fill,menu-line,menu-fill,apps-line,apps-fill,more-line,more-fill,more-2-line,more-2-fill,star-line,star-fill,settings-2-line,settings-2-fill,forbid-line,forbid-fill,information-line,information-fill,checkbox-blank-circle-line,checkbox-blank-circle-fill,checkbox-line,checkbox-fill,checkbox-indeterminate-line,checkbox-indeterminate-fill,add-box-line,add-box-fill,checkbox-circle-line,checkbox-circle-fill,indeterminate-circle-line,indeterminate-circle-fill,add-circle-fill,add-circle-line,close-circle-line,close-circle-fill,radio-button-line,radio-button-fill,check-line,check-double-line,close-line,add-line,checkbox-multiple-line,checkbox-multiple-fill,subtract-line,equal-line,upload-line,download-line,download-cloud-line,upload-cloud-line,login-box-line,logout-circle-line,logout-circle-r-line,shield-line,shield-fill,shield-cross-line,shield-cross-fill,shield-check-line,shield-check-fill,shield-user-fill,shield-user-line,delete-bin-2-line,delete-bin-2-fill,delete-bin-fill,delete-bin-line,delete-back-2-line,delete-back-2-fill,lock-password-line,lock-password-fill,lock-2-line,lock-2-fill,lock-unlock-line,lock-unlock-fill,eye-off-line,eye-line,eye-fill,eye-close-line,eye-close-fill,eye-off-fill,search-2-line,search-2-fill,zoom-out-line,zoom-in-line,zoom-in-fill,zoom-out-fill,share-line,share-fill,share-circle-line,share-circle-fill,alarm-line,alarm-fill,thumb-up-line,thumb-up-fill,thumb-down-line,thumb-down-fill,alarm-warning-line,alarm-warning-fill,filter-2-line,filter-2-fill,loader-line,loader-fill,loop-right-line,loop-right-fill,loader-4-line,loader-4-fill,reset-right-line,user-line,user-fill,account-box-line,account-box-fill,user-add-line,user-add-fill,user-minus-fill,user-follow-fill,user-follow-line,user-minus-line,user-unfollow-line,user-unfollow-fill,user-shared-fill,user-shared-line,account-pin-circle-line,account-pin-circle-fill,group-line,group-fill,emotion-happy-line,emotion-happy-fill,emotion-normal-fill,emotion-normal-line,emotion-unhappy-line,emotion-unhappy-fill,emotion-sad-line,emotion-sad-fill,women-line,men-line,star-smile-line,star-smile-fill,sun-line,sun-fill,moon-fill,moon-line,lightbulb-line,key-2-line,key-line,outlet-line,lightbulb-flash-line,t-shirt-line,t-shirt-fill,seedling-fill,seedling-line,leaf-line,leaf-fill,character-recognition-line,character-recognition-fill,recycle-line,recycle-fill,door-line,door-fill,graduation-cap-line,graduation-cap-fill,sofa-line,sofa-fill,error-warning-line,error-warning-fill,question-line,question-fill,spam-3-line,spam-3-fill,prohibited-line,prohibited-fill,information-off-line,information-off-fill,star-half-line,star-half-fill,settings-line,settings-fill,checkbox-multiple-blank-line,alert-line,alert-fill
\ No newline at end of file
+arrow-right-line,arrow-down-line,arrow-left-line,arrow-up-line,arrow-up-s-line,arrow-right-s-line,arrow-down-s-line,arrow-left-s-line,arrow-up-s-fill,arrow-right-s-fill,arrow-down-s-fill,arrow-left-s-fill,skip-up-line,skip-right-line,skip-down-line,skip-left-line,skip-up-fill,skip-right-fill,skip-down-fill,skip-left-fill,arrow-up-down-line,arrow-left-right-line,arrow-up-wide-line,arrow-down-wide-line,corner-up-left-double-line,corner-up-right-double-line,arrow-left-double-line,arrow-right-double-fill,expand-up-down-line,expand-up-down-fill,expand-left-right-line,expand-left-right-fill,arrow-go-forward-line,arrow-turn-back-line,arrow-turn-forward-line,arrow-go-back-line,home-line,home-fill,home-4-line,home-4-fill,home-smile-2-line,home-smile-2-fill,building-2-line,building-2-fill,ancient-gate-line,ancient-gate-fill,store-2-line,store-2-fill,mail-unread-line,mail-check-line,mail-send-line,mail-open-line,mail-open-fill,mail-send-fill,mail-unread-fill,mail-check-fill,mail-add-line,mail-add-fill,mail-close-line,mail-close-fill,inbox-archive-line,inbox-archive-fill,cloud-off-line,cloud-off-fill,cloud-fill,cloud-line,inbox-unarchive-line,inbox-unarchive-fill,attachment-line,attachment-fill,profile-line,profile-fill,archive-2-line,archive-2-fill,at-line,award-fill,medal-fill,medal-2-fill,verified-badge-fill,verified-badge-line,archive-stack-line,archive-stack-fill,bar-chart-grouped-line,bar-chart-grouped-fill,bar-chart-2-line,bar-chart-2-fill,bar-chart-line,bar-chart-fill,bookmark-line,bookmark-fill,calendar-check-line,calendar-close-line,calendar-event-line,calendar-2-line,flag-2-line,triangular-flag-line,triangular-flag-fill,flag-2-fill,global-line,global-fill,honour-line,honour-fill,customer-service-line,customer-service-fill,calendar-schedule-line,calendar-schedule-fill,links-line,printer-line,printer-fill,reply-line,reply-fill,send-plane-line,send-plane-fill,stack-line,stack-fill,shake-hands-line,shake-hands-fill,copyright-line,copyright-fill,megaphone-line,megaphone-fill,pass-valid-line,pass-valid-fill,pass-pending-line,pass-pending-fill,pass-expired-line,pass-expired-fill,id-card-line,id-card-fill,chat-3-line,chat-3-fill,chat-2-line,chat-2-fill,message-3-line,message-3-fill,message-2-line,message-2-fill,chat-unread-line,chat-unread-fill,chat-smile-2-line,chat-smile-2-fill,chat-smile-line,chat-smile-fill,discuss-fill,discuss-line,chat-history-line,chat-history-fill,video-chat-line,video-chat-fill,chat-voice-fill,chat-voice-line,speak-fill,speak-line,edit-2-line,edit-2-fill,quill-pen-line,quill-pen-fill,sip-line,sip-fill,markup-line,markup-fill,edit-box-line,edit-box-fill,brush-line,brush-fill,brush-2-fill,brush-2-line,paint-brush-line,paint-brush-fill,drop-line,drop-fill,blur-off-line,blur-off-fill,color-filter-line,color-filter-fill,crop-line,artboard-2-line,paint-line,paint-fill,palette-line,palette-fill,pantone-line,pantone-fill,magic-line,magic-fill,anticlockwise-line,anticlockwise-fill,tools-line,tools-fill,clockwise-line,clockwise-fill,drag-drop-line,drag-drop-fill,hammer-fill,hammer-line,circle-line,circle-fill,code-line,code-fill,terminal-line,terminal-fill,cursor-line,cursor-fill,smartphone-line,computer-line,mac-line,macbook-line,phone-line,phone-fill,device-line,tablet-line,database-2-line,database-2-fill,server-line,server-fill,hard-drive-fill,hard-drive-line,qr-scan-2-line,qr-scan-line,qr-code-line,barcode-line,shut-down-line,fingerprint-line,bluetooth-line,wifi-line,wifi-off-line,rss-line,rss-fill,gps-line,gps-fill,dashboard-3-line,dashboard-3-fill,file-2-line,file-2-fill,sticky-note-add-line,sticky-note-add-fill,file-list-line,file-list-fill,file-text-line,file-text-fill,file-list-3-line,file-list-3-fill,file-copy-line,file-copy-fill,clipboard-line,clipboard-fill,survey-line,survey-fill,article-line,article-fill,book-marked-line,book-marked-fill,todo-line,todo-fill,file-marked-line,file-marked-fill,book-3-line,book-3-fill,book-open-line,book-open-fill,folder-add-line,folder-add-fill,folder-check-line,folder-check-fill,folder-open-line,folder-open-fill,folder-line,folder-fill,align-center,list-check,indent-decrease,indent-increase,list-indefinite,attachment-2,link,hashtag,sketching,wallet-line,wallet-fill,bank-card-line,bank-card-fill,price-tag-3-line,price-tag-3-fill,coupon-line,coupon-fill,price-tag-line,price-tag-fill,shopping-bag-line,shopping-bag-fill,shopping-basket-line,shopping-basket-fill,shopping-cart-line,shopping-cart-fill,trophy-line,trophy-fill,vip-diamond-fill,vip-diamond-line,vip-crown-2-line,vip-crown-2-fill,vip-crown-line,vip-crown-fill,vip-line,vip-fill,exchange-line,exchange-fill,exchange-dollar-line,exchange-dollar-fill,money-cny-circle-line,money-cny-circle-fill,copper-coin-line,copper-coin-fill,exchange-cny-line,exchange-cny-fill,money-euro-circle-line,money-euro-circle-fill,red-packet-line,red-packet-fill,water-flash-line,water-flash-fill,coin-line,coin-fill,stock-line,stock-fill,gift-line,gift-fill,24-hours-line,24-hours-fill,shopping-bag-4-line,shopping-bag-4-fill,bowl-line,bowl-fill,heart-3-line,heart-3-fill,dislike-line,dislike-fill,heart-pulse-line,heart-pulse-fill,alipay-line,android-line,alibaba-cloud-line,app-store-line,apple-line,baidu-line,bilibili-line,chrome-line,dingding-line,drive-line,dribbble-line,evernote-line,facebook-circle-line,firebase-line,flutter-line,github-line,google-line,google-play-line,instagram-line,invision-line,meta-line,qq-line,snapchat-line,tiktok-line,twitter-line,wechat-line,wechat-2-line,weibo-line,wechat-pay-line,whatsapp-line,zhihu-line,youtube-line,map-pin-2-line,map-pin-2-fill,map-pin-time-line,map-pin-time-fill,pushpin-line,pushpin-fill,map-pin-user-line,map-pin-user-fill,rocket-line,rocket-fill,planet-line,planet-fill,parking-line,parking-fill,road-map-line,road-map-fill,earth-line,earth-fill,car-line,car-fill,plane-line,image-line,image-fill,image-circle-line,image-circle-fill,landscape-line,landscape-fill,video-on-line,video-on-fill,video-line,video-fill,live-line,live-fill,camera-line,camera-fill,camera-off-line,camera-off-fill,headphone-line,headphone-fill,mic-off-line,mic-off-fill,mic-2-fill,mic-2-line,volume-down-line,volume-down-fill,volume-mute-line,volume-mute-fill,volume-up-line,volume-up-fill,notification-line,notification-fill,notification-off-line,notification-off-fill,play-circle-line,play-circle-fill,pause-circle-line,pause-circle-fill,stop-circle-line,stop-circle-fill,equalizer-line,equalizer-fill,menu-line,menu-fill,apps-line,apps-fill,more-line,more-fill,more-2-line,more-2-fill,star-line,star-fill,settings-2-line,settings-2-fill,forbid-line,forbid-fill,information-line,information-fill,checkbox-blank-circle-line,checkbox-blank-circle-fill,checkbox-line,checkbox-fill,checkbox-indeterminate-line,checkbox-indeterminate-fill,add-box-line,add-box-fill,checkbox-circle-line,checkbox-circle-fill,indeterminate-circle-line,indeterminate-circle-fill,add-circle-fill,add-circle-line,close-circle-line,close-circle-fill,radio-button-line,radio-button-fill,check-line,check-double-line,close-line,add-line,checkbox-multiple-line,checkbox-multiple-fill,subtract-line,equal-line,upload-line,download-line,download-cloud-line,upload-cloud-line,login-box-line,logout-circle-line,logout-circle-r-line,shield-line,shield-fill,shield-cross-line,shield-cross-fill,shield-check-line,shield-check-fill,shield-user-fill,shield-user-line,delete-bin-2-line,delete-bin-2-fill,delete-bin-fill,delete-bin-line,delete-back-2-line,delete-back-2-fill,lock-password-line,lock-password-fill,lock-2-line,lock-2-fill,lock-unlock-line,lock-unlock-fill,eye-off-line,eye-line,eye-fill,eye-close-line,eye-close-fill,eye-off-fill,search-2-line,search-2-fill,zoom-out-line,zoom-in-line,zoom-in-fill,zoom-out-fill,share-line,share-fill,share-circle-line,share-circle-fill,alarm-line,alarm-fill,thumb-up-line,thumb-up-fill,thumb-down-line,thumb-down-fill,alarm-warning-line,alarm-warning-fill,filter-2-line,filter-2-fill,loader-line,loader-fill,loop-right-line,loop-right-fill,loader-4-line,loader-4-fill,reset-right-line,user-line,user-fill,account-box-line,account-box-fill,user-add-line,user-add-fill,user-minus-fill,user-follow-fill,user-follow-line,user-minus-line,user-unfollow-line,user-unfollow-fill,user-shared-fill,user-shared-line,account-pin-circle-line,account-pin-circle-fill,group-line,group-fill,emotion-happy-line,emotion-happy-fill,emotion-normal-fill,emotion-normal-line,emotion-unhappy-line,emotion-unhappy-fill,emotion-sad-line,emotion-sad-fill,women-line,men-line,star-smile-line,star-smile-fill,sun-line,sun-fill,moon-fill,moon-line,lightbulb-line,key-2-line,key-line,outlet-line,lightbulb-flash-line,t-shirt-line,t-shirt-fill,seedling-fill,seedling-line,leaf-line,leaf-fill,character-recognition-line,character-recognition-fill,recycle-line,recycle-fill,door-line,door-fill,graduation-cap-line,graduation-cap-fill,sofa-line,sofa-fill,error-warning-line,error-warning-fill,question-line,question-fill,spam-3-line,spam-3-fill,prohibited-line,prohibited-fill,information-off-line,information-off-fill,star-half-line,star-half-fill,settings-line,settings-fill,checkbox-multiple-blank-line,alert-line,alert-fill,home-heart-line,camera-ai-fill,camera-ai-line,navigation-line,navigation-fill,time-line,time-fill
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/css/remixicon.css b/src/uni_modules/tm-ui/css/remixicon.css
index c16b7ba..3da6e47 100644
--- a/src/uni_modules/tm-ui/css/remixicon.css
+++ b/src/uni_modules/tm-ui/css/remixicon.css
@@ -1,616 +1,625 @@
-/*
-* https://remixicon.com
-* https://github.com/Remix-Design/RemixIcon
-* Copyright RemixIcon.com
-* Released under the Apache License Version 2.0
-*/
-@font-face {
- font-family: "remixicon";
- src: url("data:application/font-woff2;base64,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") format("woff2");
- font-display: swap;
-}
-
-.ri-arrow-right-line:before { content: "\ea6c"; }
-.ri-arrow-down-line:before { content: "\ea4c"; }
-.ri-arrow-left-line:before { content: "\ea60"; }
-.ri-arrow-up-line:before { content: "\ea76"; }
-.ri-arrow-up-s-line:before { content: "\ea78"; }
-.ri-arrow-right-s-line:before { content: "\ea6e"; }
-.ri-arrow-down-s-line:before { content: "\ea4e"; }
-.ri-arrow-left-s-line:before { content: "\ea64"; }
-.ri-arrow-up-s-fill:before { content: "\ea77"; }
-.ri-arrow-right-s-fill:before { content: "\ea6d"; }
-.ri-arrow-down-s-fill:before { content: "\ea4d"; }
-.ri-arrow-left-s-fill:before { content: "\ea63"; }
-.ri-skip-up-line:before { content: "\f367"; }
-.ri-skip-right-line:before { content: "\f365"; }
-.ri-skip-down-line:before { content: "\f361"; }
-.ri-skip-left-line:before { content: "\f363"; }
-.ri-skip-up-fill:before { content: "\f366"; }
-.ri-skip-right-fill:before { content: "\f364"; }
-.ri-skip-down-fill:before { content: "\f360"; }
-.ri-skip-left-fill:before { content: "\f362"; }
-.ri-arrow-up-down-line:before { content: "\ea74"; }
-.ri-arrow-left-right-line:before { content: "\ea62"; }
-.ri-arrow-up-wide-line:before { content: "\f498"; }
-.ri-arrow-down-wide-line:before { content: "\f492"; }
-.ri-corner-up-left-double-line:before { content: "\f313"; }
-.ri-corner-up-right-double-line:before { content: "\f317"; }
-.ri-arrow-left-double-line:before { content: "\f2e3"; }
-.ri-arrow-right-double-fill:before { content: "\f2e4"; }
-.ri-expand-up-down-line:before { content: "\f327"; }
-.ri-expand-up-down-fill:before { content: "\f326"; }
-.ri-expand-left-right-line:before { content: "\f323"; }
-.ri-expand-left-right-fill:before { content: "\f322"; }
-.ri-arrow-go-forward-line:before { content: "\ea5a"; }
-.ri-arrow-turn-back-line:before { content: "\f2e7"; }
-.ri-arrow-turn-forward-line:before { content: "\f2e9"; }
-.ri-arrow-go-back-line:before { content: "\ea58"; }
-.ri-home-line:before { content: "\ee2b"; }
-.ri-home-fill:before { content: "\ee26"; }
-.ri-home-4-line:before { content: "\ee1d"; }
-.ri-home-4-fill:before { content: "\ee1c"; }
-.ri-home-smile-2-line:before { content: "\ee2d"; }
-.ri-home-smile-2-fill:before { content: "\ee2c"; }
-.ri-building-2-line:before { content: "\eb09"; }
-.ri-building-2-fill:before { content: "\eb08"; }
-.ri-ancient-gate-line:before { content: "\ea32"; }
-.ri-ancient-gate-fill:before { content: "\ea31"; }
-.ri-store-2-line:before { content: "\f1a5"; }
-.ri-store-2-fill:before { content: "\f1a4"; }
-.ri-mail-unread-line:before { content: "\ef02"; }
-.ri-mail-check-line:before { content: "\eeee"; }
-.ri-mail-send-line:before { content: "\eefc"; }
-.ri-mail-open-line:before { content: "\eefa"; }
-.ri-mail-open-fill:before { content: "\eef9"; }
-.ri-mail-send-fill:before { content: "\eefb"; }
-.ri-mail-unread-fill:before { content: "\ef01"; }
-.ri-mail-check-fill:before { content: "\eeed"; }
-.ri-mail-add-line:before { content: "\eeec"; }
-.ri-mail-add-fill:before { content: "\eeeb"; }
-.ri-mail-close-line:before { content: "\eef0"; }
-.ri-mail-close-fill:before { content: "\eeef"; }
-.ri-inbox-archive-line:before { content: "\ee4d"; }
-.ri-inbox-archive-fill:before { content: "\ee4c"; }
-.ri-cloud-off-line:before { content: "\eb9f"; }
-.ri-cloud-off-fill:before { content: "\eb9e"; }
-.ri-cloud-fill:before { content: "\eb9c"; }
-.ri-cloud-line:before { content: "\eb9d"; }
-.ri-inbox-unarchive-line:before { content: "\ee51"; }
-.ri-inbox-unarchive-fill:before { content: "\ee50"; }
-.ri-attachment-line:before { content: "\ea86"; }
-.ri-attachment-fill:before { content: "\ea85"; }
-.ri-profile-line:before { content: "\f02d"; }
-.ri-profile-fill:before { content: "\f02c"; }
-.ri-archive-2-line:before { content: "\f3a7"; }
-.ri-archive-2-fill:before { content: "\f3a6"; }
-.ri-at-line:before { content: "\ea83"; }
-.ri-award-fill:before { content: "\ea89"; }
-.ri-medal-fill:before { content: "\ef27"; }
-.ri-medal-2-fill:before { content: "\ef25"; }
-.ri-verified-badge-fill:before { content: "\f3e8"; }
-.ri-verified-badge-line:before { content: "\f3e9"; }
-.ri-archive-stack-line:before { content: "\f428"; }
-.ri-archive-stack-fill:before { content: "\f427"; }
-.ri-bar-chart-grouped-line:before { content: "\ea9b"; }
-.ri-bar-chart-grouped-fill:before { content: "\ea9a"; }
-.ri-bar-chart-2-line:before { content: "\ea96"; }
-.ri-bar-chart-2-fill:before { content: "\ea95"; }
-.ri-bar-chart-line:before { content: "\ea9e"; }
-.ri-bar-chart-fill:before { content: "\ea99"; }
-.ri-bookmark-line:before { content: "\eae5"; }
-.ri-bookmark-fill:before { content: "\eae4"; }
-.ri-calendar-check-line:before { content: "\eb23"; }
-.ri-calendar-close-line:before { content: "\f38e"; }
-.ri-calendar-event-line:before { content: "\eb25"; }
-.ri-calendar-2-line:before { content: "\eb21"; }
-.ri-flag-2-line:before { content: "\ed39"; }
-.ri-triangular-flag-line:before { content: "\f54a"; }
-.ri-triangular-flag-fill:before { content: "\f549"; }
-.ri-flag-2-fill:before { content: "\ed38"; }
-.ri-global-line:before { content: "\edcf"; }
-.ri-global-fill:before { content: "\edce"; }
-.ri-honour-line:before { content: "\ee35"; }
-.ri-honour-fill:before { content: "\ee34"; }
-.ri-customer-service-line:before { content: "\ec0e"; }
-.ri-customer-service-fill:before { content: "\ec0d"; }
-.ri-calendar-schedule-line:before { content: "\f3f3"; }
-.ri-calendar-schedule-fill:before { content: "\f3f2"; }
-.ri-links-line:before { content: "\eeb8"; }
-.ri-printer-line:before { content: "\f029"; }
-.ri-printer-fill:before { content: "\f028"; }
-.ri-reply-line:before { content: "\f07a"; }
-.ri-reply-fill:before { content: "\f079"; }
-.ri-send-plane-line:before { content: "\f0da"; }
-.ri-send-plane-fill:before { content: "\f0d9"; }
-.ri-stack-line:before { content: "\f181"; }
-.ri-stack-fill:before { content: "\f180"; }
-.ri-shake-hands-line:before { content: "\f3ab"; }
-.ri-shake-hands-fill:before { content: "\f3aa"; }
-.ri-copyright-line:before { content: "\ebe2"; }
-.ri-copyright-fill:before { content: "\ebe1"; }
-.ri-megaphone-line:before { content: "\f385"; }
-.ri-megaphone-fill:before { content: "\f384"; }
-.ri-pass-valid-line:before { content: "\f38b"; }
-.ri-pass-valid-fill:before { content: "\f38a"; }
-.ri-pass-pending-line:before { content: "\f389"; }
-.ri-pass-pending-fill:before { content: "\f388"; }
-.ri-pass-expired-line:before { content: "\f387"; }
-.ri-pass-expired-fill:before { content: "\f386"; }
-.ri-id-card-line:before { content: "\f4e9"; }
-.ri-id-card-fill:before { content: "\f4e8"; }
-.ri-chat-3-line:before { content: "\eb51"; }
-.ri-chat-3-fill:before { content: "\eb50"; }
-.ri-chat-2-line:before { content: "\eb4f"; }
-.ri-chat-2-fill:before { content: "\eb4e"; }
-.ri-message-3-line:before { content: "\ef46"; }
-.ri-message-3-fill:before { content: "\ef45"; }
-.ri-message-2-line:before { content: "\ef44"; }
-.ri-message-2-fill:before { content: "\ef43"; }
-.ri-chat-unread-line:before { content: "\f52a"; }
-.ri-chat-unread-fill:before { content: "\f529"; }
-.ri-chat-smile-2-line:before { content: "\eb6f"; }
-.ri-chat-smile-2-fill:before { content: "\eb6e"; }
-.ri-chat-smile-line:before { content: "\eb73"; }
-.ri-chat-smile-fill:before { content: "\eb72"; }
-.ri-discuss-fill:before { content: "\ec39"; }
-.ri-discuss-line:before { content: "\ec3a"; }
-.ri-chat-history-line:before { content: "\eb61"; }
-.ri-chat-history-fill:before { content: "\eb60"; }
-.ri-video-chat-line:before { content: "\f27e"; }
-.ri-video-chat-fill:before { content: "\f27d"; }
-.ri-chat-voice-fill:before { content: "\eb76"; }
-.ri-chat-voice-line:before { content: "\eb77"; }
-.ri-speak-fill:before { content: "\f36e"; }
-.ri-speak-line:before { content: "\f36f"; }
-.ri-edit-2-line:before { content: "\ec80"; }
-.ri-edit-2-fill:before { content: "\ec7f"; }
-.ri-quill-pen-line:before { content: "\f04a"; }
-.ri-quill-pen-fill:before { content: "\f049"; }
-.ri-sip-line:before { content: "\f13e"; }
-.ri-sip-fill:before { content: "\f13d"; }
-.ri-markup-line:before { content: "\ef20"; }
-.ri-markup-fill:before { content: "\ef1f"; }
-.ri-edit-box-line:before { content: "\ec82"; }
-.ri-edit-box-fill:before { content: "\ec81"; }
-.ri-brush-line:before { content: "\eb01"; }
-.ri-brush-fill:before { content: "\eb00"; }
-.ri-brush-2-fill:before { content: "\eafa"; }
-.ri-brush-2-line:before { content: "\eafb"; }
-.ri-paint-brush-line:before { content: "\efc1"; }
-.ri-paint-brush-fill:before { content: "\efc0"; }
-.ri-drop-line:before { content: "\ec6a"; }
-.ri-drop-fill:before { content: "\ec69"; }
-.ri-blur-off-line:before { content: "\eace"; }
-.ri-blur-off-fill:before { content: "\eacd"; }
-.ri-color-filter-line:before { content: "\f42f"; }
-.ri-color-filter-fill:before { content: "\f42e"; }
-.ri-crop-line:before { content: "\ec02"; }
-.ri-artboard-2-line:before { content: "\ea7a"; }
-.ri-paint-line:before { content: "\efc3"; }
-.ri-paint-fill:before { content: "\efc2"; }
-.ri-palette-line:before { content: "\efc5"; }
-.ri-palette-fill:before { content: "\efc4"; }
-.ri-pantone-line:before { content: "\efc7"; }
-.ri-pantone-fill:before { content: "\efc6"; }
-.ri-magic-line:before { content: "\eeea"; }
-.ri-magic-fill:before { content: "\eee9"; }
-.ri-anticlockwise-line:before { content: "\ea3c"; }
-.ri-anticlockwise-fill:before { content: "\ea3b"; }
-.ri-tools-line:before { content: "\f21b"; }
-.ri-tools-fill:before { content: "\f21a"; }
-.ri-clockwise-line:before { content: "\eb95"; }
-.ri-clockwise-fill:before { content: "\eb94"; }
-.ri-drag-drop-line:before { content: "\ec5e"; }
-.ri-drag-drop-fill:before { content: "\ec5d"; }
-.ri-hammer-fill:before { content: "\edee"; }
-.ri-hammer-line:before { content: "\edef"; }
-.ri-circle-line:before { content: "\f3c2"; }
-.ri-circle-fill:before { content: "\f3c1"; }
-.ri-code-line:before { content: "\eba9"; }
-.ri-code-fill:before { content: "\eba8"; }
-.ri-terminal-line:before { content: "\f1f8"; }
-.ri-terminal-fill:before { content: "\f1f7"; }
-.ri-cursor-line:before { content: "\ec0a"; }
-.ri-cursor-fill:before { content: "\ec09"; }
-.ri-smartphone-line:before { content: "\f15a"; }
-.ri-computer-line:before { content: "\ebca"; }
-.ri-mac-line:before { content: "\eee6"; }
-.ri-macbook-line:before { content: "\eee8"; }
-.ri-phone-line:before { content: "\efec"; }
-.ri-phone-fill:before { content: "\efe9"; }
-.ri-device-line:before { content: "\ec2e"; }
-.ri-tablet-line:before { content: "\f1e0"; }
-.ri-database-2-line:before { content: "\ec16"; }
-.ri-database-2-fill:before { content: "\ec15"; }
-.ri-server-line:before { content: "\f0e0"; }
-.ri-server-fill:before { content: "\f0df"; }
-.ri-hard-drive-fill:before { content: "\edfa"; }
-.ri-hard-drive-line:before { content: "\edfb"; }
-.ri-qr-scan-2-line:before { content: "\f03f"; }
-.ri-qr-scan-line:before { content: "\f041"; }
-.ri-qr-code-line:before { content: "\f03d"; }
-.ri-barcode-line:before { content: "\eaa2"; }
-.ri-shut-down-line:before { content: "\f126"; }
-.ri-fingerprint-line:before { content: "\ed31"; }
-.ri-bluetooth-line:before { content: "\eacc"; }
-.ri-wifi-line:before { content: "\f2c0"; }
-.ri-wifi-off-line:before { content: "\f2c2"; }
-.ri-rss-line:before { content: "\f09f"; }
-.ri-rss-fill:before { content: "\f09e"; }
-.ri-gps-line:before { content: "\eddb"; }
-.ri-gps-fill:before { content: "\edda"; }
-.ri-dashboard-3-line:before { content: "\ec12"; }
-.ri-dashboard-3-fill:before { content: "\ec11"; }
-.ri-file-2-line:before { content: "\ecc3"; }
-.ri-file-2-fill:before { content: "\ecc2"; }
-.ri-sticky-note-add-line:before { content: "\f466"; }
-.ri-sticky-note-add-fill:before { content: "\f465"; }
-.ri-file-list-line:before { content: "\ecf1"; }
-.ri-file-list-fill:before { content: "\ecf0"; }
-.ri-file-text-line:before { content: "\ed0f"; }
-.ri-file-text-fill:before { content: "\ed0e"; }
-.ri-file-list-3-line:before { content: "\ecef"; }
-.ri-file-list-3-fill:before { content: "\ecee"; }
-.ri-file-copy-line:before { content: "\ecd5"; }
-.ri-file-copy-fill:before { content: "\ecd4"; }
-.ri-clipboard-line:before { content: "\eb91"; }
-.ri-clipboard-fill:before { content: "\eb90"; }
-.ri-survey-line:before { content: "\f1c7"; }
-.ri-survey-fill:before { content: "\f1c6"; }
-.ri-article-line:before { content: "\ea7e"; }
-.ri-article-fill:before { content: "\ea7d"; }
-.ri-book-marked-line:before { content: "\ead9"; }
-.ri-book-marked-fill:before { content: "\ead8"; }
-.ri-todo-line:before { content: "\f217"; }
-.ri-todo-fill:before { content: "\f216"; }
-.ri-file-marked-line:before { content: "\ecf5"; }
-.ri-file-marked-fill:before { content: "\ecf4"; }
-.ri-book-3-line:before { content: "\ead5"; }
-.ri-book-3-fill:before { content: "\ead4"; }
-.ri-book-open-line:before { content: "\eadb"; }
-.ri-book-open-fill:before { content: "\eada"; }
-.ri-folder-add-line:before { content: "\ed5a"; }
-.ri-folder-add-fill:before { content: "\ed59"; }
-.ri-folder-check-line:before { content: "\f43e"; }
-.ri-folder-check-fill:before { content: "\f43d"; }
-.ri-folder-open-line:before { content: "\ed70"; }
-.ri-folder-open-fill:before { content: "\ed6f"; }
-.ri-folder-line:before { content: "\ed6a"; }
-.ri-folder-fill:before { content: "\ed61"; }
-.ri-align-center:before { content: "\ea25"; }
-.ri-list-check:before { content: "\eeba"; }
-.ri-indent-decrease:before { content: "\ee54"; }
-.ri-indent-increase:before { content: "\ee55"; }
-.ri-list-indefinite:before { content: "\f399"; }
-.ri-attachment-2:before { content: "\ea84"; }
-.ri-link:before { content: "\eeb2"; }
-.ri-hashtag:before { content: "\edfc"; }
-.ri-sketching:before { content: "\f35f"; }
-.ri-wallet-line:before { content: "\f2ae"; }
-.ri-wallet-fill:before { content: "\f2ad"; }
-.ri-bank-card-line:before { content: "\ea92"; }
-.ri-bank-card-fill:before { content: "\ea91"; }
-.ri-price-tag-3-line:before { content: "\f023"; }
-.ri-price-tag-3-fill:before { content: "\f022"; }
-.ri-coupon-line:before { content: "\ebee"; }
-.ri-coupon-fill:before { content: "\ebed"; }
-.ri-price-tag-line:before { content: "\f025"; }
-.ri-price-tag-fill:before { content: "\f024"; }
-.ri-shopping-bag-line:before { content: "\f118"; }
-.ri-shopping-bag-fill:before { content: "\f117"; }
-.ri-shopping-basket-line:before { content: "\f11c"; }
-.ri-shopping-basket-fill:before { content: "\f11b"; }
-.ri-shopping-cart-line:before { content: "\f120"; }
-.ri-shopping-cart-fill:before { content: "\f11f"; }
-.ri-trophy-line:before { content: "\f22f"; }
-.ri-trophy-fill:before { content: "\f22e"; }
-.ri-vip-diamond-fill:before { content: "\f28f"; }
-.ri-vip-diamond-line:before { content: "\f290"; }
-.ri-vip-crown-2-line:before { content: "\f28c"; }
-.ri-vip-crown-2-fill:before { content: "\f28b"; }
-.ri-vip-crown-line:before { content: "\f28e"; }
-.ri-vip-crown-fill:before { content: "\f28d"; }
-.ri-vip-line:before { content: "\f292"; }
-.ri-vip-fill:before { content: "\f291"; }
-.ri-exchange-line:before { content: "\ecad"; }
-.ri-exchange-fill:before { content: "\ecaa"; }
-.ri-exchange-dollar-line:before { content: "\eca9"; }
-.ri-exchange-dollar-fill:before { content: "\eca8"; }
-.ri-money-cny-circle-line:before { content: "\ef61"; }
-.ri-money-cny-circle-fill:before { content: "\ef60"; }
-.ri-copper-coin-line:before { content: "\ebdc"; }
-.ri-copper-coin-fill:before { content: "\ebdb"; }
-.ri-exchange-cny-line:before { content: "\eca7"; }
-.ri-exchange-cny-fill:before { content: "\eca6"; }
-.ri-money-euro-circle-line:before { content: "\ef69"; }
-.ri-money-euro-circle-fill:before { content: "\ef68"; }
-.ri-red-packet-line:before { content: "\f060"; }
-.ri-red-packet-fill:before { content: "\f05f"; }
-.ri-water-flash-line:before { content: "\f2b0"; }
-.ri-water-flash-fill:before { content: "\f2af"; }
-.ri-coin-line:before { content: "\ebb2"; }
-.ri-coin-fill:before { content: "\ebb1"; }
-.ri-stock-line:before { content: "\f19d"; }
-.ri-stock-fill:before { content: "\f19c"; }
-.ri-gift-line:before { content: "\edbb"; }
-.ri-gift-fill:before { content: "\edba"; }
-.ri-24-hours-line:before { content: "\ea02"; }
-.ri-24-hours-fill:before { content: "\ea01"; }
-.ri-shopping-bag-4-line:before { content: "\f511"; }
-.ri-shopping-bag-4-fill:before { content: "\f510"; }
-.ri-bowl-line:before { content: "\f42a"; }
-.ri-bowl-fill:before { content: "\f429"; }
-.ri-heart-3-line:before { content: "\ee0b"; }
-.ri-heart-3-fill:before { content: "\ee0a"; }
-.ri-dislike-line:before { content: "\ec3c"; }
-.ri-dislike-fill:before { content: "\ec3b"; }
-.ri-heart-pulse-line:before { content: "\ee11"; }
-.ri-heart-pulse-fill:before { content: "\ee10"; }
-.ri-alipay-line:before { content: "\ea2c"; }
-.ri-android-line:before { content: "\ea36"; }
-.ri-alibaba-cloud-line:before { content: "\f4b8"; }
-.ri-app-store-line:before { content: "\ea3e"; }
-.ri-apple-line:before { content: "\ea40"; }
-.ri-baidu-line:before { content: "\ea8c"; }
-.ri-bilibili-line:before { content: "\eac0"; }
-.ri-chrome-line:before { content: "\eb8d"; }
-.ri-dingding-line:before { content: "\ec32"; }
-.ri-drive-line:before { content: "\ec66"; }
-.ri-dribbble-line:before { content: "\ec64"; }
-.ri-evernote-line:before { content: "\eca3"; }
-.ri-facebook-circle-line:before { content: "\ecbb"; }
-.ri-firebase-line:before { content: "\f4d4"; }
-.ri-flutter-line:before { content: "\ed48"; }
-.ri-github-line:before { content: "\edcb"; }
-.ri-google-line:before { content: "\edd5"; }
-.ri-google-play-line:before { content: "\edd7"; }
-.ri-instagram-line:before { content: "\ee66"; }
-.ri-invision-line:before { content: "\ee6a"; }
-.ri-meta-line:before { content: "\f343"; }
-.ri-qq-line:before { content: "\f03b"; }
-.ri-snapchat-line:before { content: "\f15c"; }
-.ri-tiktok-line:before { content: "\f373"; }
-.ri-twitter-line:before { content: "\f23b"; }
-.ri-wechat-line:before { content: "\f2b6"; }
-.ri-wechat-2-line:before { content: "\f2b4"; }
-.ri-weibo-line:before { content: "\f2ba"; }
-.ri-wechat-pay-line:before { content: "\f2b8"; }
-.ri-whatsapp-line:before { content: "\f2bc"; }
-.ri-zhihu-line:before { content: "\f2d9"; }
-.ri-youtube-line:before { content: "\f2d5"; }
-.ri-map-pin-2-line:before { content: "\ef0a"; }
-.ri-map-pin-2-fill:before { content: "\ef09"; }
-.ri-map-pin-time-line:before { content: "\ef18"; }
-.ri-map-pin-time-fill:before { content: "\ef17"; }
-.ri-pushpin-line:before { content: "\f039"; }
-.ri-pushpin-fill:before { content: "\f038"; }
-.ri-map-pin-user-line:before { content: "\ef1a"; }
-.ri-map-pin-user-fill:before { content: "\ef19"; }
-.ri-rocket-line:before { content: "\f096"; }
-.ri-rocket-fill:before { content: "\f095"; }
-.ri-planet-line:before { content: "\f39f"; }
-.ri-planet-fill:before { content: "\f39e"; }
-.ri-parking-line:before { content: "\efd0"; }
-.ri-parking-fill:before { content: "\efcf"; }
-.ri-road-map-line:before { content: "\f08e"; }
-.ri-road-map-fill:before { content: "\f08d"; }
-.ri-earth-line:before { content: "\ec7a"; }
-.ri-earth-fill:before { content: "\ec79"; }
-.ri-car-line:before { content: "\eb39"; }
-.ri-car-fill:before { content: "\eb38"; }
-.ri-plane-line:before { content: "\f005"; }
-.ri-image-line:before { content: "\ee4b"; }
-.ri-image-fill:before { content: "\ee4a"; }
-.ri-image-circle-line:before { content: "\f413"; }
-.ri-image-circle-fill:before { content: "\f412"; }
-.ri-landscape-line:before { content: "\ee7d"; }
-.ri-landscape-fill:before { content: "\ee7c"; }
-.ri-video-on-line:before { content: "\f51e"; }
-.ri-video-on-fill:before { content: "\f51d"; }
-.ri-video-line:before { content: "\f282"; }
-.ri-video-fill:before { content: "\f281"; }
-.ri-live-line:before { content: "\eec0"; }
-.ri-live-fill:before { content: "\eebf"; }
-.ri-camera-line:before { content: "\eb31"; }
-.ri-camera-fill:before { content: "\eb2e"; }
-.ri-camera-off-line:before { content: "\eb33"; }
-.ri-camera-off-fill:before { content: "\eb32"; }
-.ri-headphone-line:before { content: "\ee05"; }
-.ri-headphone-fill:before { content: "\ee04"; }
-.ri-mic-off-line:before { content: "\ef52"; }
-.ri-mic-off-fill:before { content: "\ef51"; }
-.ri-mic-2-fill:before { content: "\ef4d"; }
-.ri-mic-2-line:before { content: "\ef4e"; }
-.ri-volume-down-line:before { content: "\f29c"; }
-.ri-volume-down-fill:before { content: "\f29b"; }
-.ri-volume-mute-line:before { content: "\f29e"; }
-.ri-volume-mute-fill:before { content: "\f29d"; }
-.ri-volume-up-line:before { content: "\f2a2"; }
-.ri-volume-up-fill:before { content: "\f2a1"; }
-.ri-notification-line:before { content: "\ef9a"; }
-.ri-notification-fill:before { content: "\ef99"; }
-.ri-notification-off-line:before { content: "\ef9c"; }
-.ri-notification-off-fill:before { content: "\ef9b"; }
-.ri-play-circle-line:before { content: "\f009"; }
-.ri-play-circle-fill:before { content: "\f008"; }
-.ri-pause-circle-line:before { content: "\efd6"; }
-.ri-pause-circle-fill:before { content: "\efd5"; }
-.ri-stop-circle-line:before { content: "\f19f"; }
-.ri-stop-circle-fill:before { content: "\f19e"; }
-.ri-equalizer-line:before { content: "\ec9d"; }
-.ri-equalizer-fill:before { content: "\ec9c"; }
-.ri-menu-line:before { content: "\ef3e"; }
-.ri-menu-fill:before { content: "\ef3b"; }
-.ri-apps-line:before { content: "\ea44"; }
-.ri-apps-fill:before { content: "\ea43"; }
-.ri-more-line:before { content: "\ef79"; }
-.ri-more-fill:before { content: "\ef78"; }
-.ri-more-2-line:before { content: "\ef77"; }
-.ri-more-2-fill:before { content: "\ef76"; }
-.ri-star-line:before { content: "\f18b"; }
-.ri-star-fill:before { content: "\f186"; }
-.ri-settings-2-line:before { content: "\f0e4"; }
-.ri-settings-2-fill:before { content: "\f0e3"; }
-.ri-forbid-line:before { content: "\ed95"; }
-.ri-forbid-fill:before { content: "\ed94"; }
-.ri-information-line:before { content: "\ee59"; }
-.ri-information-fill:before { content: "\ee58"; }
-.ri-checkbox-blank-circle-line:before { content: "\eb7d"; }
-.ri-checkbox-blank-circle-fill:before { content: "\eb7c"; }
-.ri-checkbox-line:before { content: "\eb85"; }
-.ri-checkbox-fill:before { content: "\eb82"; }
-.ri-checkbox-indeterminate-line:before { content: "\eb84"; }
-.ri-checkbox-indeterminate-fill:before { content: "\eb83"; }
-.ri-add-box-line:before { content: "\ea0f"; }
-.ri-add-box-fill:before { content: "\ea0e"; }
-.ri-checkbox-circle-line:before { content: "\eb81"; }
-.ri-checkbox-circle-fill:before { content: "\eb80"; }
-.ri-indeterminate-circle-line:before { content: "\ee57"; }
-.ri-indeterminate-circle-fill:before { content: "\ee56"; }
-.ri-add-circle-fill:before { content: "\ea10"; }
-.ri-add-circle-line:before { content: "\ea11"; }
-.ri-close-circle-line:before { content: "\eb97"; }
-.ri-close-circle-fill:before { content: "\eb96"; }
-.ri-radio-button-line:before { content: "\f050"; }
-.ri-radio-button-fill:before { content: "\f04f"; }
-.ri-check-line:before { content: "\eb7b"; }
-.ri-check-double-line:before { content: "\eb79"; }
-.ri-close-line:before { content: "\eb99"; }
-.ri-add-line:before { content: "\ea13"; }
-.ri-checkbox-multiple-line:before { content: "\eb89"; }
-.ri-checkbox-multiple-fill:before { content: "\eb88"; }
-.ri-subtract-line:before { content: "\f1af"; }
-.ri-equal-line:before { content: "\f31f"; }
-.ri-upload-line:before { content: "\f250"; }
-.ri-download-line:before { content: "\ec5a"; }
-.ri-download-cloud-line:before { content: "\ec58"; }
-.ri-upload-cloud-line:before { content: "\f24e"; }
-.ri-login-box-line:before { content: "\eed4"; }
-.ri-logout-circle-line:before { content: "\eedc"; }
-.ri-logout-circle-r-line:before { content: "\eede"; }
-.ri-shield-line:before { content: "\f108"; }
-.ri-shield-fill:before { content: "\f103"; }
-.ri-shield-cross-line:before { content: "\f102"; }
-.ri-shield-cross-fill:before { content: "\f101"; }
-.ri-shield-check-line:before { content: "\f100"; }
-.ri-shield-check-fill:before { content: "\f0ff"; }
-.ri-shield-user-fill:before { content: "\f10b"; }
-.ri-shield-user-line:before { content: "\f10c"; }
-.ri-delete-bin-2-line:before { content: "\ec1e"; }
-.ri-delete-bin-2-fill:before { content: "\ec1d"; }
-.ri-delete-bin-fill:before { content: "\ec29"; }
-.ri-delete-bin-line:before { content: "\ec2a"; }
-.ri-delete-back-2-line:before { content: "\ec1a"; }
-.ri-delete-back-2-fill:before { content: "\ec19"; }
-.ri-lock-password-line:before { content: "\eed0"; }
-.ri-lock-password-fill:before { content: "\eecf"; }
-.ri-lock-2-line:before { content: "\eecc"; }
-.ri-lock-2-fill:before { content: "\eecb"; }
-.ri-lock-unlock-line:before { content: "\eed2"; }
-.ri-lock-unlock-fill:before { content: "\eed1"; }
-.ri-eye-off-line:before { content: "\ecb7"; }
-.ri-eye-line:before { content: "\ecb5"; }
-.ri-eye-fill:before { content: "\ecb4"; }
-.ri-eye-close-line:before { content: "\ecb3"; }
-.ri-eye-close-fill:before { content: "\ecb2"; }
-.ri-eye-off-fill:before { content: "\ecb6"; }
-.ri-search-2-line:before { content: "\f0cd"; }
-.ri-search-2-fill:before { content: "\f0cc"; }
-.ri-zoom-out-line:before { content: "\f2dd"; }
-.ri-zoom-in-line:before { content: "\f2db"; }
-.ri-zoom-in-fill:before { content: "\f2da"; }
-.ri-zoom-out-fill:before { content: "\f2dc"; }
-.ri-share-line:before { content: "\f0fe"; }
-.ri-share-fill:before { content: "\f0f7"; }
-.ri-share-circle-line:before { content: "\f0f6"; }
-.ri-share-circle-fill:before { content: "\f0f5"; }
-.ri-alarm-line:before { content: "\ea1b"; }
-.ri-alarm-fill:before { content: "\ea1a"; }
-.ri-thumb-up-line:before { content: "\f207"; }
-.ri-thumb-up-fill:before { content: "\f206"; }
-.ri-thumb-down-line:before { content: "\f205"; }
-.ri-thumb-down-fill:before { content: "\f204"; }
-.ri-alarm-warning-line:before { content: "\ea1d"; }
-.ri-alarm-warning-fill:before { content: "\ea1c"; }
-.ri-filter-2-line:before { content: "\ed23"; }
-.ri-filter-2-fill:before { content: "\ed22"; }
-.ri-loader-line:before { content: "\eeca"; }
-.ri-loader-fill:before { content: "\eec9"; }
-.ri-loop-right-line:before { content: "\f33f"; }
-.ri-loop-right-fill:before { content: "\f33e"; }
-.ri-loader-4-line:before { content: "\eec6"; }
-.ri-loader-4-fill:before { content: "\eec5"; }
-.ri-reset-right-line:before { content: "\f544"; }
-.ri-user-line:before { content: "\f264"; }
-.ri-user-fill:before { content: "\f25f"; }
-.ri-account-box-line:before { content: "\ea07"; }
-.ri-account-box-fill:before { content: "\ea06"; }
-.ri-user-add-line:before { content: "\f25e"; }
-.ri-user-add-fill:before { content: "\f25d"; }
-.ri-user-minus-fill:before { content: "\f54b"; }
-.ri-user-follow-fill:before { content: "\f260"; }
-.ri-user-follow-line:before { content: "\f261"; }
-.ri-user-minus-line:before { content: "\f54c"; }
-.ri-user-unfollow-line:before { content: "\f278"; }
-.ri-user-unfollow-fill:before { content: "\f277"; }
-.ri-user-shared-fill:before { content: "\f271"; }
-.ri-user-shared-line:before { content: "\f272"; }
-.ri-account-pin-circle-line:before { content: "\ea0d"; }
-.ri-account-pin-circle-fill:before { content: "\ea0c"; }
-.ri-group-line:before { content: "\ede3"; }
-.ri-group-fill:before { content: "\ede2"; }
-.ri-emotion-happy-line:before { content: "\ec8d"; }
-.ri-emotion-happy-fill:before { content: "\ec8c"; }
-.ri-emotion-normal-fill:before { content: "\ec91"; }
-.ri-emotion-normal-line:before { content: "\ec92"; }
-.ri-emotion-unhappy-line:before { content: "\ec96"; }
-.ri-emotion-unhappy-fill:before { content: "\ec95"; }
-.ri-emotion-sad-line:before { content: "\ec94"; }
-.ri-emotion-sad-fill:before { content: "\ec93"; }
-.ri-women-line:before { content: "\f2ce"; }
-.ri-men-line:before { content: "\ef2e"; }
-.ri-star-smile-line:before { content: "\f18f"; }
-.ri-star-smile-fill:before { content: "\f18e"; }
-.ri-sun-line:before { content: "\f1bf"; }
-.ri-sun-fill:before { content: "\f1bc"; }
-.ri-moon-fill:before { content: "\ef72"; }
-.ri-moon-line:before { content: "\ef75"; }
-.ri-lightbulb-line:before { content: "\eea9"; }
-.ri-key-2-line:before { content: "\ee6f"; }
-.ri-key-line:before { content: "\ee71"; }
-.ri-outlet-line:before { content: "\efbc"; }
-.ri-lightbulb-flash-line:before { content: "\eea8"; }
-.ri-t-shirt-line:before { content: "\f1d9"; }
-.ri-t-shirt-fill:before { content: "\f1d8"; }
-.ri-seedling-fill:before { content: "\f0d4"; }
-.ri-seedling-line:before { content: "\f0d5"; }
-.ri-leaf-line:before { content: "\eea3"; }
-.ri-leaf-fill:before { content: "\eea2"; }
-.ri-character-recognition-line:before { content: "\eb47"; }
-.ri-character-recognition-fill:before { content: "\eb46"; }
-.ri-recycle-line:before { content: "\f05e"; }
-.ri-recycle-fill:before { content: "\f05d"; }
-.ri-door-line:before { content: "\ec46"; }
-.ri-door-fill:before { content: "\ec45"; }
-.ri-graduation-cap-line:before { content: "\f333"; }
-.ri-graduation-cap-fill:before { content: "\f332"; }
-.ri-sofa-line:before { content: "\f41e"; }
-.ri-sofa-fill:before { content: "\f41d"; }
-.ri-error-warning-line:before { content: "\eca1"; }
-.ri-error-warning-fill:before { content: "\eca0"; }
-.ri-question-line:before { content: "\f045"; }
-.ri-question-fill:before { content: "\f044"; }
-.ri-spam-3-line:before { content: "\f16b"; }
-.ri-spam-3-fill:before { content: "\f16a"; }
-.ri-prohibited-line:before { content: "\f3a1"; }
-.ri-prohibited-fill:before { content: "\f3a0"; }
-.ri-information-off-line:before { content: "\f4eb"; }
-.ri-information-off-fill:before { content: "\f4ea"; }
-.ri-star-half-line:before { content: "\f188"; }
-.ri-star-half-fill:before { content: "\f187"; }
-.ri-settings-line:before { content: "\f0ee"; }
-.ri-settings-fill:before { content: "\f0ed"; }
-.ri-checkbox-multiple-blank-line:before { content: "\eb87"; }
-.ri-alert-line:before { content: "\ea21"; }
-.ri-alert-fill:before { content: "\ea20"; }
+/*
+* https://remixicon.com
+* https://github.com/Remix-Design/RemixIcon
+* Copyright RemixIcon.com
+* Released under the Apache License Version 2.0
+*/
+@font-face {
+ font-family: "remixicon";
+ src: url("data:application/font-woff2;base64,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") format("woff2");
+ font-display: swap;
+}
+.ri{
+ font-family: "remixicon";
+}
+.ri-arrow-right-line:before { content: "\ea6c"; }
+.ri-arrow-down-line:before { content: "\ea4c"; }
+.ri-arrow-left-line:before { content: "\ea60"; }
+.ri-arrow-up-line:before { content: "\ea76"; }
+.ri-arrow-up-s-line:before { content: "\ea78"; }
+.ri-arrow-right-s-line:before { content: "\ea6e"; }
+.ri-arrow-down-s-line:before { content: "\ea4e"; }
+.ri-arrow-left-s-line:before { content: "\ea64"; }
+.ri-arrow-up-s-fill:before { content: "\ea77"; }
+.ri-arrow-right-s-fill:before { content: "\ea6d"; }
+.ri-arrow-down-s-fill:before { content: "\ea4d"; }
+.ri-arrow-left-s-fill:before { content: "\ea63"; }
+.ri-skip-up-line:before { content: "\f367"; }
+.ri-skip-right-line:before { content: "\f365"; }
+.ri-skip-down-line:before { content: "\f361"; }
+.ri-skip-left-line:before { content: "\f363"; }
+.ri-skip-up-fill:before { content: "\f366"; }
+.ri-skip-right-fill:before { content: "\f364"; }
+.ri-skip-down-fill:before { content: "\f360"; }
+.ri-skip-left-fill:before { content: "\f362"; }
+.ri-arrow-up-down-line:before { content: "\ea74"; }
+.ri-arrow-left-right-line:before { content: "\ea62"; }
+.ri-arrow-up-wide-line:before { content: "\f498"; }
+.ri-arrow-down-wide-line:before { content: "\f492"; }
+.ri-corner-up-left-double-line:before { content: "\f313"; }
+.ri-corner-up-right-double-line:before { content: "\f317"; }
+.ri-arrow-left-double-line:before { content: "\f2e3"; }
+.ri-arrow-right-double-fill:before { content: "\f2e4"; }
+.ri-expand-up-down-line:before { content: "\f327"; }
+.ri-expand-up-down-fill:before { content: "\f326"; }
+.ri-expand-left-right-line:before { content: "\f323"; }
+.ri-expand-left-right-fill:before { content: "\f322"; }
+.ri-arrow-go-forward-line:before { content: "\ea5a"; }
+.ri-arrow-turn-back-line:before { content: "\f2e7"; }
+.ri-arrow-turn-forward-line:before { content: "\f2e9"; }
+.ri-arrow-go-back-line:before { content: "\ea58"; }
+.ri-home-line:before { content: "\ee2b"; }
+.ri-home-fill:before { content: "\ee26"; }
+.ri-home-4-line:before { content: "\ee1d"; }
+.ri-home-4-fill:before { content: "\ee1c"; }
+.ri-home-smile-2-line:before { content: "\ee2d"; }
+.ri-home-smile-2-fill:before { content: "\ee2c"; }
+.ri-building-2-line:before { content: "\eb09"; }
+.ri-building-2-fill:before { content: "\eb08"; }
+.ri-ancient-gate-line:before { content: "\ea32"; }
+.ri-ancient-gate-fill:before { content: "\ea31"; }
+.ri-store-2-line:before { content: "\f1a5"; }
+.ri-store-2-fill:before { content: "\f1a4"; }
+.ri-mail-unread-line:before { content: "\ef02"; }
+.ri-mail-check-line:before { content: "\eeee"; }
+.ri-mail-send-line:before { content: "\eefc"; }
+.ri-mail-open-line:before { content: "\eefa"; }
+.ri-mail-open-fill:before { content: "\eef9"; }
+.ri-mail-send-fill:before { content: "\eefb"; }
+.ri-mail-unread-fill:before { content: "\ef01"; }
+.ri-mail-check-fill:before { content: "\eeed"; }
+.ri-mail-add-line:before { content: "\eeec"; }
+.ri-mail-add-fill:before { content: "\eeeb"; }
+.ri-mail-close-line:before { content: "\eef0"; }
+.ri-mail-close-fill:before { content: "\eeef"; }
+.ri-inbox-archive-line:before { content: "\ee4d"; }
+.ri-inbox-archive-fill:before { content: "\ee4c"; }
+.ri-cloud-off-line:before { content: "\eb9f"; }
+.ri-cloud-off-fill:before { content: "\eb9e"; }
+.ri-cloud-fill:before { content: "\eb9c"; }
+.ri-cloud-line:before { content: "\eb9d"; }
+.ri-inbox-unarchive-line:before { content: "\ee51"; }
+.ri-inbox-unarchive-fill:before { content: "\ee50"; }
+.ri-attachment-line:before { content: "\ea86"; }
+.ri-attachment-fill:before { content: "\ea85"; }
+.ri-profile-line:before { content: "\f02d"; }
+.ri-profile-fill:before { content: "\f02c"; }
+.ri-archive-2-line:before { content: "\f3a7"; }
+.ri-archive-2-fill:before { content: "\f3a6"; }
+.ri-at-line:before { content: "\ea83"; }
+.ri-award-fill:before { content: "\ea89"; }
+.ri-medal-fill:before { content: "\ef27"; }
+.ri-medal-2-fill:before { content: "\ef25"; }
+.ri-verified-badge-fill:before { content: "\f3e8"; }
+.ri-verified-badge-line:before { content: "\f3e9"; }
+.ri-archive-stack-line:before { content: "\f428"; }
+.ri-archive-stack-fill:before { content: "\f427"; }
+.ri-bar-chart-grouped-line:before { content: "\ea9b"; }
+.ri-bar-chart-grouped-fill:before { content: "\ea9a"; }
+.ri-bar-chart-2-line:before { content: "\ea96"; }
+.ri-bar-chart-2-fill:before { content: "\ea95"; }
+.ri-bar-chart-line:before { content: "\ea9e"; }
+.ri-bar-chart-fill:before { content: "\ea99"; }
+.ri-bookmark-line:before { content: "\eae5"; }
+.ri-bookmark-fill:before { content: "\eae4"; }
+.ri-calendar-check-line:before { content: "\eb23"; }
+.ri-calendar-close-line:before { content: "\f38e"; }
+.ri-calendar-event-line:before { content: "\eb25"; }
+.ri-calendar-2-line:before { content: "\eb21"; }
+.ri-flag-2-line:before { content: "\ed39"; }
+.ri-triangular-flag-line:before { content: "\f54a"; }
+.ri-triangular-flag-fill:before { content: "\f549"; }
+.ri-flag-2-fill:before { content: "\ed38"; }
+.ri-global-line:before { content: "\edcf"; }
+.ri-global-fill:before { content: "\edce"; }
+.ri-honour-line:before { content: "\ee35"; }
+.ri-honour-fill:before { content: "\ee34"; }
+.ri-customer-service-line:before { content: "\ec0e"; }
+.ri-customer-service-fill:before { content: "\ec0d"; }
+.ri-calendar-schedule-line:before { content: "\f3f3"; }
+.ri-calendar-schedule-fill:before { content: "\f3f2"; }
+.ri-links-line:before { content: "\eeb8"; }
+.ri-printer-line:before { content: "\f029"; }
+.ri-printer-fill:before { content: "\f028"; }
+.ri-reply-line:before { content: "\f07a"; }
+.ri-reply-fill:before { content: "\f079"; }
+.ri-send-plane-line:before { content: "\f0da"; }
+.ri-send-plane-fill:before { content: "\f0d9"; }
+.ri-stack-line:before { content: "\f181"; }
+.ri-stack-fill:before { content: "\f180"; }
+.ri-shake-hands-line:before { content: "\f3ab"; }
+.ri-shake-hands-fill:before { content: "\f3aa"; }
+.ri-copyright-line:before { content: "\ebe2"; }
+.ri-copyright-fill:before { content: "\ebe1"; }
+.ri-megaphone-line:before { content: "\f385"; }
+.ri-megaphone-fill:before { content: "\f384"; }
+.ri-pass-valid-line:before { content: "\f38b"; }
+.ri-pass-valid-fill:before { content: "\f38a"; }
+.ri-pass-pending-line:before { content: "\f389"; }
+.ri-pass-pending-fill:before { content: "\f388"; }
+.ri-pass-expired-line:before { content: "\f387"; }
+.ri-pass-expired-fill:before { content: "\f386"; }
+.ri-id-card-line:before { content: "\f4e9"; }
+.ri-id-card-fill:before { content: "\f4e8"; }
+.ri-chat-3-line:before { content: "\eb51"; }
+.ri-chat-3-fill:before { content: "\eb50"; }
+.ri-chat-2-line:before { content: "\eb4f"; }
+.ri-chat-2-fill:before { content: "\eb4e"; }
+.ri-message-3-line:before { content: "\ef46"; }
+.ri-message-3-fill:before { content: "\ef45"; }
+.ri-message-2-line:before { content: "\ef44"; }
+.ri-message-2-fill:before { content: "\ef43"; }
+.ri-chat-unread-line:before { content: "\f52a"; }
+.ri-chat-unread-fill:before { content: "\f529"; }
+.ri-chat-smile-2-line:before { content: "\eb6f"; }
+.ri-chat-smile-2-fill:before { content: "\eb6e"; }
+.ri-chat-smile-line:before { content: "\eb73"; }
+.ri-chat-smile-fill:before { content: "\eb72"; }
+.ri-discuss-fill:before { content: "\ec39"; }
+.ri-discuss-line:before { content: "\ec3a"; }
+.ri-chat-history-line:before { content: "\eb61"; }
+.ri-chat-history-fill:before { content: "\eb60"; }
+.ri-video-chat-line:before { content: "\f27e"; }
+.ri-video-chat-fill:before { content: "\f27d"; }
+.ri-chat-voice-fill:before { content: "\eb76"; }
+.ri-chat-voice-line:before { content: "\eb77"; }
+.ri-speak-fill:before { content: "\f36e"; }
+.ri-speak-line:before { content: "\f36f"; }
+.ri-edit-2-line:before { content: "\ec80"; }
+.ri-edit-2-fill:before { content: "\ec7f"; }
+.ri-quill-pen-line:before { content: "\f04a"; }
+.ri-quill-pen-fill:before { content: "\f049"; }
+.ri-sip-line:before { content: "\f13e"; }
+.ri-sip-fill:before { content: "\f13d"; }
+.ri-markup-line:before { content: "\ef20"; }
+.ri-markup-fill:before { content: "\ef1f"; }
+.ri-edit-box-line:before { content: "\ec82"; }
+.ri-edit-box-fill:before { content: "\ec81"; }
+.ri-brush-line:before { content: "\eb01"; }
+.ri-brush-fill:before { content: "\eb00"; }
+.ri-brush-2-fill:before { content: "\eafa"; }
+.ri-brush-2-line:before { content: "\eafb"; }
+.ri-paint-brush-line:before { content: "\efc1"; }
+.ri-paint-brush-fill:before { content: "\efc0"; }
+.ri-drop-line:before { content: "\ec6a"; }
+.ri-drop-fill:before { content: "\ec69"; }
+.ri-blur-off-line:before { content: "\eace"; }
+.ri-blur-off-fill:before { content: "\eacd"; }
+.ri-color-filter-line:before { content: "\f42f"; }
+.ri-color-filter-fill:before { content: "\f42e"; }
+.ri-crop-line:before { content: "\ec02"; }
+.ri-artboard-2-line:before { content: "\ea7a"; }
+.ri-paint-line:before { content: "\efc3"; }
+.ri-paint-fill:before { content: "\efc2"; }
+.ri-palette-line:before { content: "\efc5"; }
+.ri-palette-fill:before { content: "\efc4"; }
+.ri-pantone-line:before { content: "\efc7"; }
+.ri-pantone-fill:before { content: "\efc6"; }
+.ri-magic-line:before { content: "\eeea"; }
+.ri-magic-fill:before { content: "\eee9"; }
+.ri-anticlockwise-line:before { content: "\ea3c"; }
+.ri-anticlockwise-fill:before { content: "\ea3b"; }
+.ri-tools-line:before { content: "\f21b"; }
+.ri-tools-fill:before { content: "\f21a"; }
+.ri-clockwise-line:before { content: "\eb95"; }
+.ri-clockwise-fill:before { content: "\eb94"; }
+.ri-drag-drop-line:before { content: "\ec5e"; }
+.ri-drag-drop-fill:before { content: "\ec5d"; }
+.ri-hammer-fill:before { content: "\edee"; }
+.ri-hammer-line:before { content: "\edef"; }
+.ri-circle-line:before { content: "\f3c2"; }
+.ri-circle-fill:before { content: "\f3c1"; }
+.ri-code-line:before { content: "\eba9"; }
+.ri-code-fill:before { content: "\eba8"; }
+.ri-terminal-line:before { content: "\f1f8"; }
+.ri-terminal-fill:before { content: "\f1f7"; }
+.ri-cursor-line:before { content: "\ec0a"; }
+.ri-cursor-fill:before { content: "\ec09"; }
+.ri-smartphone-line:before { content: "\f15a"; }
+.ri-computer-line:before { content: "\ebca"; }
+.ri-mac-line:before { content: "\eee6"; }
+.ri-macbook-line:before { content: "\eee8"; }
+.ri-phone-line:before { content: "\efec"; }
+.ri-phone-fill:before { content: "\efe9"; }
+.ri-device-line:before { content: "\ec2e"; }
+.ri-tablet-line:before { content: "\f1e0"; }
+.ri-database-2-line:before { content: "\ec16"; }
+.ri-database-2-fill:before { content: "\ec15"; }
+.ri-server-line:before { content: "\f0e0"; }
+.ri-server-fill:before { content: "\f0df"; }
+.ri-hard-drive-fill:before { content: "\edfa"; }
+.ri-hard-drive-line:before { content: "\edfb"; }
+.ri-qr-scan-2-line:before { content: "\f03f"; }
+.ri-qr-scan-line:before { content: "\f041"; }
+.ri-qr-code-line:before { content: "\f03d"; }
+.ri-barcode-line:before { content: "\eaa2"; }
+.ri-shut-down-line:before { content: "\f126"; }
+.ri-fingerprint-line:before { content: "\ed31"; }
+.ri-bluetooth-line:before { content: "\eacc"; }
+.ri-wifi-line:before { content: "\f2c0"; }
+.ri-wifi-off-line:before { content: "\f2c2"; }
+.ri-rss-line:before { content: "\f09f"; }
+.ri-rss-fill:before { content: "\f09e"; }
+.ri-gps-line:before { content: "\eddb"; }
+.ri-gps-fill:before { content: "\edda"; }
+.ri-dashboard-3-line:before { content: "\ec12"; }
+.ri-dashboard-3-fill:before { content: "\ec11"; }
+.ri-file-2-line:before { content: "\ecc3"; }
+.ri-file-2-fill:before { content: "\ecc2"; }
+.ri-sticky-note-add-line:before { content: "\f466"; }
+.ri-sticky-note-add-fill:before { content: "\f465"; }
+.ri-file-list-line:before { content: "\ecf1"; }
+.ri-file-list-fill:before { content: "\ecf0"; }
+.ri-file-text-line:before { content: "\ed0f"; }
+.ri-file-text-fill:before { content: "\ed0e"; }
+.ri-file-list-3-line:before { content: "\ecef"; }
+.ri-file-list-3-fill:before { content: "\ecee"; }
+.ri-file-copy-line:before { content: "\ecd5"; }
+.ri-file-copy-fill:before { content: "\ecd4"; }
+.ri-clipboard-line:before { content: "\eb91"; }
+.ri-clipboard-fill:before { content: "\eb90"; }
+.ri-survey-line:before { content: "\f1c7"; }
+.ri-survey-fill:before { content: "\f1c6"; }
+.ri-article-line:before { content: "\ea7e"; }
+.ri-article-fill:before { content: "\ea7d"; }
+.ri-book-marked-line:before { content: "\ead9"; }
+.ri-book-marked-fill:before { content: "\ead8"; }
+.ri-todo-line:before { content: "\f217"; }
+.ri-todo-fill:before { content: "\f216"; }
+.ri-file-marked-line:before { content: "\ecf5"; }
+.ri-file-marked-fill:before { content: "\ecf4"; }
+.ri-book-3-line:before { content: "\ead5"; }
+.ri-book-3-fill:before { content: "\ead4"; }
+.ri-book-open-line:before { content: "\eadb"; }
+.ri-book-open-fill:before { content: "\eada"; }
+.ri-folder-add-line:before { content: "\ed5a"; }
+.ri-folder-add-fill:before { content: "\ed59"; }
+.ri-folder-check-line:before { content: "\f43e"; }
+.ri-folder-check-fill:before { content: "\f43d"; }
+.ri-folder-open-line:before { content: "\ed70"; }
+.ri-folder-open-fill:before { content: "\ed6f"; }
+.ri-folder-line:before { content: "\ed6a"; }
+.ri-folder-fill:before { content: "\ed61"; }
+.ri-align-center:before { content: "\ea25"; }
+.ri-list-check:before { content: "\eeba"; }
+.ri-indent-decrease:before { content: "\ee54"; }
+.ri-indent-increase:before { content: "\ee55"; }
+.ri-list-indefinite:before { content: "\f399"; }
+.ri-attachment-2:before { content: "\ea84"; }
+.ri-link:before { content: "\eeb2"; }
+.ri-hashtag:before { content: "\edfc"; }
+.ri-sketching:before { content: "\f35f"; }
+.ri-wallet-line:before { content: "\f2ae"; }
+.ri-wallet-fill:before { content: "\f2ad"; }
+.ri-bank-card-line:before { content: "\ea92"; }
+.ri-bank-card-fill:before { content: "\ea91"; }
+.ri-price-tag-3-line:before { content: "\f023"; }
+.ri-price-tag-3-fill:before { content: "\f022"; }
+.ri-coupon-line:before { content: "\ebee"; }
+.ri-coupon-fill:before { content: "\ebed"; }
+.ri-price-tag-line:before { content: "\f025"; }
+.ri-price-tag-fill:before { content: "\f024"; }
+.ri-shopping-bag-line:before { content: "\f118"; }
+.ri-shopping-bag-fill:before { content: "\f117"; }
+.ri-shopping-basket-line:before { content: "\f11c"; }
+.ri-shopping-basket-fill:before { content: "\f11b"; }
+.ri-shopping-cart-line:before { content: "\f120"; }
+.ri-shopping-cart-fill:before { content: "\f11f"; }
+.ri-trophy-line:before { content: "\f22f"; }
+.ri-trophy-fill:before { content: "\f22e"; }
+.ri-vip-diamond-fill:before { content: "\f28f"; }
+.ri-vip-diamond-line:before { content: "\f290"; }
+.ri-vip-crown-2-line:before { content: "\f28c"; }
+.ri-vip-crown-2-fill:before { content: "\f28b"; }
+.ri-vip-crown-line:before { content: "\f28e"; }
+.ri-vip-crown-fill:before { content: "\f28d"; }
+.ri-vip-line:before { content: "\f292"; }
+.ri-vip-fill:before { content: "\f291"; }
+.ri-exchange-line:before { content: "\ecad"; }
+.ri-exchange-fill:before { content: "\ecaa"; }
+.ri-exchange-dollar-line:before { content: "\eca9"; }
+.ri-exchange-dollar-fill:before { content: "\eca8"; }
+.ri-money-cny-circle-line:before { content: "\ef61"; }
+.ri-money-cny-circle-fill:before { content: "\ef60"; }
+.ri-copper-coin-line:before { content: "\ebdc"; }
+.ri-copper-coin-fill:before { content: "\ebdb"; }
+.ri-exchange-cny-line:before { content: "\eca7"; }
+.ri-exchange-cny-fill:before { content: "\eca6"; }
+.ri-money-euro-circle-line:before { content: "\ef69"; }
+.ri-money-euro-circle-fill:before { content: "\ef68"; }
+.ri-red-packet-line:before { content: "\f060"; }
+.ri-red-packet-fill:before { content: "\f05f"; }
+.ri-water-flash-line:before { content: "\f2b0"; }
+.ri-water-flash-fill:before { content: "\f2af"; }
+.ri-coin-line:before { content: "\ebb2"; }
+.ri-coin-fill:before { content: "\ebb1"; }
+.ri-stock-line:before { content: "\f19d"; }
+.ri-stock-fill:before { content: "\f19c"; }
+.ri-gift-line:before { content: "\edbb"; }
+.ri-gift-fill:before { content: "\edba"; }
+.ri-24-hours-line:before { content: "\ea02"; }
+.ri-24-hours-fill:before { content: "\ea01"; }
+.ri-shopping-bag-4-line:before { content: "\f511"; }
+.ri-shopping-bag-4-fill:before { content: "\f510"; }
+.ri-bowl-line:before { content: "\f42a"; }
+.ri-bowl-fill:before { content: "\f429"; }
+.ri-heart-3-line:before { content: "\ee0b"; }
+.ri-heart-3-fill:before { content: "\ee0a"; }
+.ri-dislike-line:before { content: "\ec3c"; }
+.ri-dislike-fill:before { content: "\ec3b"; }
+.ri-heart-pulse-line:before { content: "\ee11"; }
+.ri-heart-pulse-fill:before { content: "\ee10"; }
+.ri-alipay-line:before { content: "\ea2c"; }
+.ri-android-line:before { content: "\ea36"; }
+.ri-alibaba-cloud-line:before { content: "\f4b8"; }
+.ri-app-store-line:before { content: "\ea3e"; }
+.ri-apple-line:before { content: "\ea40"; }
+.ri-baidu-line:before { content: "\ea8c"; }
+.ri-bilibili-line:before { content: "\eac0"; }
+.ri-chrome-line:before { content: "\eb8d"; }
+.ri-dingding-line:before { content: "\ec32"; }
+.ri-drive-line:before { content: "\ec66"; }
+.ri-dribbble-line:before { content: "\ec64"; }
+.ri-evernote-line:before { content: "\eca3"; }
+.ri-facebook-circle-line:before { content: "\ecbb"; }
+.ri-firebase-line:before { content: "\f4d4"; }
+.ri-flutter-line:before { content: "\ed48"; }
+.ri-github-line:before { content: "\edcb"; }
+.ri-google-line:before { content: "\edd5"; }
+.ri-google-play-line:before { content: "\edd7"; }
+.ri-instagram-line:before { content: "\ee66"; }
+.ri-invision-line:before { content: "\ee6a"; }
+.ri-meta-line:before { content: "\f343"; }
+.ri-qq-line:before { content: "\f03b"; }
+.ri-snapchat-line:before { content: "\f15c"; }
+.ri-tiktok-line:before { content: "\f373"; }
+.ri-twitter-line:before { content: "\f23b"; }
+.ri-wechat-line:before { content: "\f2b6"; }
+.ri-wechat-2-line:before { content: "\f2b4"; }
+.ri-weibo-line:before { content: "\f2ba"; }
+.ri-wechat-pay-line:before { content: "\f2b8"; }
+.ri-whatsapp-line:before { content: "\f2bc"; }
+.ri-zhihu-line:before { content: "\f2d9"; }
+.ri-youtube-line:before { content: "\f2d5"; }
+.ri-map-pin-2-line:before { content: "\ef0a"; }
+.ri-map-pin-2-fill:before { content: "\ef09"; }
+.ri-map-pin-time-line:before { content: "\ef18"; }
+.ri-map-pin-time-fill:before { content: "\ef17"; }
+.ri-pushpin-line:before { content: "\f039"; }
+.ri-pushpin-fill:before { content: "\f038"; }
+.ri-map-pin-user-line:before { content: "\ef1a"; }
+.ri-map-pin-user-fill:before { content: "\ef19"; }
+.ri-rocket-line:before { content: "\f096"; }
+.ri-rocket-fill:before { content: "\f095"; }
+.ri-planet-line:before { content: "\f39f"; }
+.ri-planet-fill:before { content: "\f39e"; }
+.ri-parking-line:before { content: "\efd0"; }
+.ri-parking-fill:before { content: "\efcf"; }
+.ri-road-map-line:before { content: "\f08e"; }
+.ri-road-map-fill:before { content: "\f08d"; }
+.ri-earth-line:before { content: "\ec7a"; }
+.ri-earth-fill:before { content: "\ec79"; }
+.ri-car-line:before { content: "\eb39"; }
+.ri-car-fill:before { content: "\eb38"; }
+.ri-plane-line:before { content: "\f005"; }
+.ri-image-line:before { content: "\ee4b"; }
+.ri-image-fill:before { content: "\ee4a"; }
+.ri-image-circle-line:before { content: "\f413"; }
+.ri-image-circle-fill:before { content: "\f412"; }
+.ri-landscape-line:before { content: "\ee7d"; }
+.ri-landscape-fill:before { content: "\ee7c"; }
+.ri-video-on-line:before { content: "\f51e"; }
+.ri-video-on-fill:before { content: "\f51d"; }
+.ri-video-line:before { content: "\f282"; }
+.ri-video-fill:before { content: "\f281"; }
+.ri-live-line:before { content: "\eec0"; }
+.ri-live-fill:before { content: "\eebf"; }
+.ri-camera-line:before { content: "\eb31"; }
+.ri-camera-fill:before { content: "\eb2e"; }
+.ri-camera-off-line:before { content: "\eb33"; }
+.ri-camera-off-fill:before { content: "\eb32"; }
+.ri-headphone-line:before { content: "\ee05"; }
+.ri-headphone-fill:before { content: "\ee04"; }
+.ri-mic-off-line:before { content: "\ef52"; }
+.ri-mic-off-fill:before { content: "\ef51"; }
+.ri-mic-2-fill:before { content: "\ef4d"; }
+.ri-mic-2-line:before { content: "\ef4e"; }
+.ri-volume-down-line:before { content: "\f29c"; }
+.ri-volume-down-fill:before { content: "\f29b"; }
+.ri-volume-mute-line:before { content: "\f29e"; }
+.ri-volume-mute-fill:before { content: "\f29d"; }
+.ri-volume-up-line:before { content: "\f2a2"; }
+.ri-volume-up-fill:before { content: "\f2a1"; }
+.ri-notification-line:before { content: "\ef9a"; }
+.ri-notification-fill:before { content: "\ef99"; }
+.ri-notification-off-line:before { content: "\ef9c"; }
+.ri-notification-off-fill:before { content: "\ef9b"; }
+.ri-play-circle-line:before { content: "\f009"; }
+.ri-play-circle-fill:before { content: "\f008"; }
+.ri-pause-circle-line:before { content: "\efd6"; }
+.ri-pause-circle-fill:before { content: "\efd5"; }
+.ri-stop-circle-line:before { content: "\f19f"; }
+.ri-stop-circle-fill:before { content: "\f19e"; }
+.ri-equalizer-line:before { content: "\ec9d"; }
+.ri-equalizer-fill:before { content: "\ec9c"; }
+.ri-menu-line:before { content: "\ef3e"; }
+.ri-menu-fill:before { content: "\ef3b"; }
+.ri-apps-line:before { content: "\ea44"; }
+.ri-apps-fill:before { content: "\ea43"; }
+.ri-more-line:before { content: "\ef79"; }
+.ri-more-fill:before { content: "\ef78"; }
+.ri-more-2-line:before { content: "\ef77"; }
+.ri-more-2-fill:before { content: "\ef76"; }
+.ri-star-line:before { content: "\f18b"; }
+.ri-star-fill:before { content: "\f186"; }
+.ri-settings-2-line:before { content: "\f0e4"; }
+.ri-settings-2-fill:before { content: "\f0e3"; }
+.ri-forbid-line:before { content: "\ed95"; }
+.ri-forbid-fill:before { content: "\ed94"; }
+.ri-information-line:before { content: "\ee59"; }
+.ri-information-fill:before { content: "\ee58"; }
+.ri-checkbox-blank-circle-line:before { content: "\eb7d"; }
+.ri-checkbox-blank-circle-fill:before { content: "\eb7c"; }
+.ri-checkbox-line:before { content: "\eb85"; }
+.ri-checkbox-fill:before { content: "\eb82"; }
+.ri-checkbox-indeterminate-line:before { content: "\eb84"; }
+.ri-checkbox-indeterminate-fill:before { content: "\eb83"; }
+.ri-add-box-line:before { content: "\ea0f"; }
+.ri-add-box-fill:before { content: "\ea0e"; }
+.ri-checkbox-circle-line:before { content: "\eb81"; }
+.ri-checkbox-circle-fill:before { content: "\eb80"; }
+.ri-indeterminate-circle-line:before { content: "\ee57"; }
+.ri-indeterminate-circle-fill:before { content: "\ee56"; }
+.ri-add-circle-fill:before { content: "\ea10"; }
+.ri-add-circle-line:before { content: "\ea11"; }
+.ri-close-circle-line:before { content: "\eb97"; }
+.ri-close-circle-fill:before { content: "\eb96"; }
+.ri-radio-button-line:before { content: "\f050"; }
+.ri-radio-button-fill:before { content: "\f04f"; }
+.ri-check-line:before { content: "\eb7b"; }
+.ri-check-double-line:before { content: "\eb79"; }
+.ri-close-line:before { content: "\eb99"; }
+.ri-add-line:before { content: "\ea13"; }
+.ri-checkbox-multiple-line:before { content: "\eb89"; }
+.ri-checkbox-multiple-fill:before { content: "\eb88"; }
+.ri-subtract-line:before { content: "\f1af"; }
+.ri-equal-line:before { content: "\f31f"; }
+.ri-upload-line:before { content: "\f250"; }
+.ri-download-line:before { content: "\ec5a"; }
+.ri-download-cloud-line:before { content: "\ec58"; }
+.ri-upload-cloud-line:before { content: "\f24e"; }
+.ri-login-box-line:before { content: "\eed4"; }
+.ri-logout-circle-line:before { content: "\eedc"; }
+.ri-logout-circle-r-line:before { content: "\eede"; }
+.ri-shield-line:before { content: "\f108"; }
+.ri-shield-fill:before { content: "\f103"; }
+.ri-shield-cross-line:before { content: "\f102"; }
+.ri-shield-cross-fill:before { content: "\f101"; }
+.ri-shield-check-line:before { content: "\f100"; }
+.ri-shield-check-fill:before { content: "\f0ff"; }
+.ri-shield-user-fill:before { content: "\f10b"; }
+.ri-shield-user-line:before { content: "\f10c"; }
+.ri-delete-bin-2-line:before { content: "\ec1e"; }
+.ri-delete-bin-2-fill:before { content: "\ec1d"; }
+.ri-delete-bin-fill:before { content: "\ec29"; }
+.ri-delete-bin-line:before { content: "\ec2a"; }
+.ri-delete-back-2-line:before { content: "\ec1a"; }
+.ri-delete-back-2-fill:before { content: "\ec19"; }
+.ri-lock-password-line:before { content: "\eed0"; }
+.ri-lock-password-fill:before { content: "\eecf"; }
+.ri-lock-2-line:before { content: "\eecc"; }
+.ri-lock-2-fill:before { content: "\eecb"; }
+.ri-lock-unlock-line:before { content: "\eed2"; }
+.ri-lock-unlock-fill:before { content: "\eed1"; }
+.ri-eye-off-line:before { content: "\ecb7"; }
+.ri-eye-line:before { content: "\ecb5"; }
+.ri-eye-fill:before { content: "\ecb4"; }
+.ri-eye-close-line:before { content: "\ecb3"; }
+.ri-eye-close-fill:before { content: "\ecb2"; }
+.ri-eye-off-fill:before { content: "\ecb6"; }
+.ri-search-2-line:before { content: "\f0cd"; }
+.ri-search-2-fill:before { content: "\f0cc"; }
+.ri-zoom-out-line:before { content: "\f2dd"; }
+.ri-zoom-in-line:before { content: "\f2db"; }
+.ri-zoom-in-fill:before { content: "\f2da"; }
+.ri-zoom-out-fill:before { content: "\f2dc"; }
+.ri-share-line:before { content: "\f0fe"; }
+.ri-share-fill:before { content: "\f0f7"; }
+.ri-share-circle-line:before { content: "\f0f6"; }
+.ri-share-circle-fill:before { content: "\f0f5"; }
+.ri-alarm-line:before { content: "\ea1b"; }
+.ri-alarm-fill:before { content: "\ea1a"; }
+.ri-thumb-up-line:before { content: "\f207"; }
+.ri-thumb-up-fill:before { content: "\f206"; }
+.ri-thumb-down-line:before { content: "\f205"; }
+.ri-thumb-down-fill:before { content: "\f204"; }
+.ri-alarm-warning-line:before { content: "\ea1d"; }
+.ri-alarm-warning-fill:before { content: "\ea1c"; }
+.ri-filter-2-line:before { content: "\ed23"; }
+.ri-filter-2-fill:before { content: "\ed22"; }
+.ri-loader-line:before { content: "\eeca"; }
+.ri-loader-fill:before { content: "\eec9"; }
+.ri-loop-right-line:before { content: "\f33f"; }
+.ri-loop-right-fill:before { content: "\f33e"; }
+.ri-loader-4-line:before { content: "\eec6"; }
+.ri-loader-4-fill:before { content: "\eec5"; }
+.ri-reset-right-line:before { content: "\f544"; }
+.ri-user-line:before { content: "\f264"; }
+.ri-user-fill:before { content: "\f25f"; }
+.ri-account-box-line:before { content: "\ea07"; }
+.ri-account-box-fill:before { content: "\ea06"; }
+.ri-user-add-line:before { content: "\f25e"; }
+.ri-user-add-fill:before { content: "\f25d"; }
+.ri-user-minus-fill:before { content: "\f54b"; }
+.ri-user-follow-fill:before { content: "\f260"; }
+.ri-user-follow-line:before { content: "\f261"; }
+.ri-user-minus-line:before { content: "\f54c"; }
+.ri-user-unfollow-line:before { content: "\f278"; }
+.ri-user-unfollow-fill:before { content: "\f277"; }
+.ri-user-shared-fill:before { content: "\f271"; }
+.ri-user-shared-line:before { content: "\f272"; }
+.ri-account-pin-circle-line:before { content: "\ea0d"; }
+.ri-account-pin-circle-fill:before { content: "\ea0c"; }
+.ri-group-line:before { content: "\ede3"; }
+.ri-group-fill:before { content: "\ede2"; }
+.ri-emotion-happy-line:before { content: "\ec8d"; }
+.ri-emotion-happy-fill:before { content: "\ec8c"; }
+.ri-emotion-normal-fill:before { content: "\ec91"; }
+.ri-emotion-normal-line:before { content: "\ec92"; }
+.ri-emotion-unhappy-line:before { content: "\ec96"; }
+.ri-emotion-unhappy-fill:before { content: "\ec95"; }
+.ri-emotion-sad-line:before { content: "\ec94"; }
+.ri-emotion-sad-fill:before { content: "\ec93"; }
+.ri-women-line:before { content: "\f2ce"; }
+.ri-men-line:before { content: "\ef2e"; }
+.ri-star-smile-line:before { content: "\f18f"; }
+.ri-star-smile-fill:before { content: "\f18e"; }
+.ri-sun-line:before { content: "\f1bf"; }
+.ri-sun-fill:before { content: "\f1bc"; }
+.ri-moon-fill:before { content: "\ef72"; }
+.ri-moon-line:before { content: "\ef75"; }
+.ri-lightbulb-line:before { content: "\eea9"; }
+.ri-key-2-line:before { content: "\ee6f"; }
+.ri-key-line:before { content: "\ee71"; }
+.ri-outlet-line:before { content: "\efbc"; }
+.ri-lightbulb-flash-line:before { content: "\eea8"; }
+.ri-t-shirt-line:before { content: "\f1d9"; }
+.ri-t-shirt-fill:before { content: "\f1d8"; }
+.ri-seedling-fill:before { content: "\f0d4"; }
+.ri-seedling-line:before { content: "\f0d5"; }
+.ri-leaf-line:before { content: "\eea3"; }
+.ri-leaf-fill:before { content: "\eea2"; }
+.ri-character-recognition-line:before { content: "\eb47"; }
+.ri-character-recognition-fill:before { content: "\eb46"; }
+.ri-recycle-line:before { content: "\f05e"; }
+.ri-recycle-fill:before { content: "\f05d"; }
+.ri-door-line:before { content: "\ec46"; }
+.ri-door-fill:before { content: "\ec45"; }
+.ri-graduation-cap-line:before { content: "\f333"; }
+.ri-graduation-cap-fill:before { content: "\f332"; }
+.ri-sofa-line:before { content: "\f41e"; }
+.ri-sofa-fill:before { content: "\f41d"; }
+.ri-error-warning-line:before { content: "\eca1"; }
+.ri-error-warning-fill:before { content: "\eca0"; }
+.ri-question-line:before { content: "\f045"; }
+.ri-question-fill:before { content: "\f044"; }
+.ri-spam-3-line:before { content: "\f16b"; }
+.ri-spam-3-fill:before { content: "\f16a"; }
+.ri-prohibited-line:before { content: "\f3a1"; }
+.ri-prohibited-fill:before { content: "\f3a0"; }
+.ri-information-off-line:before { content: "\f4eb"; }
+.ri-information-off-fill:before { content: "\f4ea"; }
+.ri-star-half-line:before { content: "\f188"; }
+.ri-star-half-fill:before { content: "\f187"; }
+.ri-settings-line:before { content: "\f0ee"; }
+.ri-settings-fill:before { content: "\f0ed"; }
+.ri-checkbox-multiple-blank-line:before { content: "\eb87"; }
+.ri-alert-line:before { content: "\ea21"; }
+.ri-alert-fill:before { content: "\ea20"; }
+.ri-home-heart-line:before { content: "\ee2a"; }
+.ri-camera-ai-fill:before { content: "\f567"; }
+.ri-camera-ai-line:before { content: "\f568"; }
+.ri-navigation-line:before { content: "\ef89"; }
+.ri-navigation-fill:before { content: "\ef88"; }
+.ri-time-line:before { content: "\f20f"; }
+.ri-time-fill:before { content: "\f20e"; }
diff --git a/src/uni_modules/tm-ui/css/remixicon.min.css b/src/uni_modules/tm-ui/css/remixicon.min.css
index 3c02eba..9d65d27 100644
--- a/src/uni_modules/tm-ui/css/remixicon.min.css
+++ b/src/uni_modules/tm-ui/css/remixicon.min.css
@@ -1 +1,5 @@
-@font-face{font-family:remixicon;src:url(data:application/font-woff2;base64,d09GMgABAAAAAKGkAAsAAAABt9QAAKFTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGVgDWWgqFoyCEuncBNgIkA5JQC4kqAAQgBYYqB89MWzp+kUbB5P62Bagi6sYA8OnbbW69disyMGxcAAj8rC1hx14S2DjA2DwtZ////////6IE3yPi9v+le5cmTdeVDgBABFBUtQiH62zREtEJLzGE0/Dq8zbSuBAj7Wuc09xLby4SJEhIx74fe0vtaK21kut6viV6LB6pn2MXd4mWnVZnp2VefDfuYxl5FM2WnfyQECQEmUzysZqjRhOt6NGyI54CRUIQKAJFeB9m9JKnRTYK90ARKAJFODpcix7c8pwO5LNsKAL1Eihyy/Vbesr9FQ25xvgur0iQIGeKX2JVVTMdSMrfLM3kMFl/t7I+LEHOFNfpXp+LbgWauJ96kR/v5XNwKp9AqeMHyWFlbSarYexMJvMTyjjNL0XBwi6ZxlabLaguNsUr8jGYiSqYUw1MdhAOkhFmcaWqC7mmzXpcxB6raj2quIlZ8csndx2/vz5yP70h6b33/rLGn+n+lp/1P7lt25ZHNP05PSVv8kY9A4r4fyJLyMmGl1B05EjYY/XzENh99aq6PzizuwcpIhHlUEazLl1heL5uPXQ4rmEmxzWGOZjB3M5hrv8NczCuORiD+cZ1FVGuqBBRMtGNtntLtR0bW1GbqbQdauverm3VLtvGKvbor3emG0SfDnDngKSCdQi+OghWwA7sS1K4MLtgB6SCtgROyiG0AnJAG0D3izjoglSQSvP/rdl3K8la3chKVXW1I92OBfOoPa4gMTxGjJnJkFrp/q3adSAKxIYGOnEIAU8yKlfeeT+fi4ZteUALjJTdaUKrr39dDwDYBqNk3Q/9M5C791cTIaMyui0T75jKOgPzDDmP0vnQllOXeTgTeQKkZhD1Y7+9S18U1ZZIVj1KZka8EhKUAqVAC5D33r2qvc0ApPTeDEGQti+XVzYJQSI3KJL+3s3yt1ZCA7ZEfTFX5+pCDBvy3X3djzl7/gsOQ5DBEUEZ1+vu3pBeiKmoXx+b6tcfKhhj7R6l08RiFm8RKjRoeIjiTUznDm38Qw9/DO990yVYCZZAg2xWZdEka5v40VsEe87T11e7O///cOD+fTKBjQaoZVbEBX6wQp5teykJBgQ2x/LempfuhUQeKE7H3Iy5GYLaNXPPCP//HOq7P2PbRkpAw8HNEcnxhCDHq6Vua3neDAAQgP+Hw989D+2P2ZhaBIkvsbLiLRbhPdBs7HjYVDNr32l+ETQgl95CBay0f3BZw/ar10ly0hTe18UErq/d36H1NoPDkhCEnEZLHMkFrmpqMyuFZrRSFMLXAT0RHq9UGhYM4g2haT/OV/pKliGALDuIs5rhc9MHvofNA912+uJyMnlSmeFf7KRTruX6JCHIyiKIdUuAKnWJqKashW1lHazWKBZpfIQL34+AQT3vO4W0FUQIVIBADGw65f9taRhI/21YvQ7CVkCHkHyynPLvuXfadUD3fz0/+IsaSzTUua0X0JiEcURr+RoWLpA81RjCARhqVK1FSbUuhFA3vCnSNPz8m6rVAg5xg3xRvqy3T95Q7buisnwxlen1sbv3fhiEP4MBMINADgBSHJCSOIQCBiRFgKJkhMFoZkDJAEjJFCnrJMrSSbKcKK1XcW8AUjJBWl6Cm6iNor3vXghJsrX75LUvxNCHyOvc3V63TXlFGWK5ZblFeWV51Z0tTXzaT4cGKK0Bfv4UnAB2L4WAy3o81mozaW08KaWwtjtn/8/agCWAXPQEvuJ/v1+lDZMjUkDCTEW42LgYuefc+15mfsNCdy/2wELPEnaHOjn39Yo/QXAzUUvg1obAxkX56OgyUQu2uz2RAiR2nTXdY/v7pgnU5ETr1ChjlGX3GDP9UghoNZ2FisWUiHEypKb/zvun/8dqe3fvo2Ma2VakpQQhuH9vXub8HrV2bM/2q79aFQhJGAKyRgYZoNc7CDclLhnGHzJ1EAkSHilSRIKIf/5m3YNVCsvfTYli1mIJmiDtJgJDO9lbHnjwkSeaXnnejVdbRytqDubVceVll5yn341pd1DoB7uCme3DKTrkkmY/7i01ua/dg9VapxGNPPbigy60b5ksOHL/rDqSKyvhSXU56JRpsJ058elSYX4yX1N7tit9Q1G2nbyr6zchkb59y7RudUEUBkes1JqtdkIySmoZEMVWWq1GnQ0INJHK4gp9IIQCOjjgz0RxCl2zckqrGvqSl1lJFVVVXW3rC7WtZ3uxl3uzD9rfRdGLVVhSBA/efA1PIFFUWr9XqU5H9Pk16xjVCaKy2a4/h3wt3ejOdjX2U8uUr1SPJT9QRAVV1NFGkv7bw6l/ZOGKR8qr6ucvWbb24Omvv7t4nU32OeWcex755FnhmT95iTY6hyc1Wb1kEmTKU67aLhpDxrKUD4nPT4IHcYVq1GnQZAdIrHgZamxGvemKQmu2Y1/d+VI9XzlFaqy9tApq7Jm2JPdmO9uT1qmMmua2ud8ef29x3dH4TKR8dd26/x1/9HL27bvF5XU1LIb9su42F5egfFFlmuySo0SFTf7THQ9lZH1wm2m5CpSouMb62trt3sW6+4ADJ979yDiylEmd9awfkc55oMDJKCChLIVQKdZqkgQKY7gPOdSww2//m8O4or43WRkVV14l8JoawohPZru8gTuxCOp+X1FeXLrbHwexZg9q2udV17cLtg+QwtjuxwHFr4DsFqAaVVxim0UMx7W0EtNvjKUPXJPLHzxB40+S1j7w+6anPscOR/fe/COPYKWB5UVKLkMurdInnZaRLFy9WzEFqpcVihFHo1oH1RsuyzUmG/LhB+3QmrcgNnB+DT0lbe+1dtD5asevPVvmWRFoHlW2qtWucVv26t7eLnBvtmnz9gsiSjWSVjE2zztu0oz3bvnNGpi/aEU11AvaW/fff1wf87yPGp3mTPeNnzBZLCaVAkpUG9PKIKRcKBSLWylVtrq1wxtaV0tttbe5Lhi3LUO97WlfA+3vAPCRvus8XegyX8vYDZ7op+50v9f9fu5RT3rWCxDf9g6n2n/ojz411/+DjaYAQ1it3QrOPGHh+AIQkMT+KAKROo6OiS1MhEhcfHCFicjEU0tp0mWYZkHkK723wQYt2nTZCpa9dthlj310yHFpxEWXXccY3TDhp2XvuOe+J5554aXX3npnygd/mPHpf6Hof2CTaYu+LnK/HbZTaXYr5kyuc3f0nO8II80f6I9ijr2QhU002eKXAu7py9BmDZl+ubR6Ndgy7+Z1beu2zbDe7diuDWz/DuwQqI9vaKc2IA/eEHFgeLJ/2uV66RaXe6Vzvd3HrerPv8o2T8ix0TOOsYPtI97znmtsjIvd7ZJGejazscYaxk/wPMPucVbXGuh41KKFR0Q/BzvIkTE+kgPjJCc6xQnsdZzse5OT/AQe9IBVsHLJ6d0vJgYC1pS+ccB+gyjINNTS2qJLt63WaTz8sJo1WafRVlu022SzDj0MTbjZVVcaM2rERT8YXu6O21KaBZ/ART9kNO5WPHxcUX4cH3uRON2IiVGlVbly6QSjcTn0fvXWPXf7zTtvvPbWr91OUaeuJMRHHemB+112KRVlRxyuQX079BnQP+xee4+bMH7ffRx1ZGghNTYWqiCBAnySkZYyKym137zzF/gI/jTjdx/8B/4F0/7Y8mrnmUzpaZhR9OjSoc3dOXw86elkpZXRG6/nuUejxjzwcyg9tokVQ0YaCREBnj8/2ZDWay4Sh5Aga0Y8uOKC72XKmjpNq5ZDD5lxEPvys+Ji81ag654R3z54b8q0Pzz0yONumnDeOWFChaCLEI6FiY0hGC1KlShXptKq9tlLRjqSY+PrqcVGG6yvV5/tDOhoQgQfcKBTThpyQr99Bg1M75CDTjnpO6eddaa11jjoQD+5VZNv7OfMiTu3ChUQiW6lCkiPPfRo0cPtsrMbrs85QpjQihVVp9ZqVb3ysr/lNx5cqRL3TXbWmeOP85+6mqq/ld9Vl1103lk33daYv5yC5ZXrB3DnHe+ZDOaB3G/dWrPm/0YfJN5kYvGao6npmLKTHfttnUtawMpm5T4Fb0ubNmT/TYj0x6G9EK98+cjxs8kdRm1b4zHb1GLXnXdqm+46tCMh8ucHj4CCbKcddttlrz3QHEUIlydXgXyFvfDLiIoV+aKkopgbdzg+XLjGvbC8ePJI3twtq8eGQ47sAJo9B7YAxQZs15u+1arUqbXWGjWqpWbLWfXiY1MQY6UK38nTihMvT24bbVgwvwTyRKI77tuW0sx7U5w5hVxaDeonXQIG2aQtf3mts04G7Rwfeq4guqLNGNY7tyzPpExGukocSJkSB1DLyFlqOTlDWZPrUTbkupQt8SplR7xC2RNvUSjibcqR+JhyJVZRbsRKyp3sUB5kS2HJEyhv8ngKTwwpCnEMRcMOFB3bU2ziWCocz1MReI6KXLQd16JkAsTDlJB4iJIgKSlGlAw9SonNKDU2pjLQUFlYg9JhTCHoU4UIqghDqhhdaiVWpyrRUlUYUKvRoWrwKFWLRaoOC1UTjqCaiRlqPQ6mNuAgqhVHUu3EidQWYg1qK7E61YOTKMPk1genUDtwArXzpfbAydQAvgfq8qK9JuAnoG7hQeonPEDdxypQD7BSPcIS9RiL1RMiqKcE6i1Oo37FqdQi7qKuw/4DzwJ41AQeNIdJLWBCb1jVB5bEw4qBZIs00iWddMsgWw0h6wwljcKMcKMZYcpg1zjYMX60kdxQhlGmTHBiMexbAnuWw6EVcGAlXFgFl1aTCdeQm66FV2AtvAAbyJiNZNR1ZMQmctFm8oPrybAbGXJbyB1byW07SIpd8AvcAj/AbUM9hgyI0e1k3D5yy12w4G5YdA/MuxfmPARvwMMvdRKJ9BTheGPMeoowfUYYvoJtX8OW08TVpdQMdgFTtAALtAVgiTYBbNAwsEVDAIUeARzQAwAG7QGsQLsALvg3cMXvwAO/AU/8Gvzm9vI3lykQ2gagYwUIRSMIQ6MIxxIQgcUAIqIAJiJBiR+AGt8HDVoCSEeLQLAK6Of65UHTyEdTqMYNUPO5HqBxNKAxNKJJrEMTaCew0EF4wRbCG7YSOOgmCLCNwEMP4QsGwgd24aOwe34e7UNAoJ8QgkGsBgcwGw5iFhzCVDiMg+AIDoRvcQCcwp8Qp/FfiO/wR8QZ/CecxbOIc3gGhnEqGEPPAFfQE8D9qe0emDRj8gcVwEf0DvAXegOYQ/8h/kb4/UtblCDtECBxxPL0IZYlDV2ADEG9GYq6UoQ1qcJmqcammYktMh+bZ8lcslKztsHnswefywuYn8OYlzfnx9JPUH/eRn35AGvzIc7IJ+ge5NNPdyAJz3xDeOQMWgb5J1oBuTiV6B/oCOS/GFVLcE8txdvKEseWFY4peywrFJaWO2otD9RShGkWGWoqCmqvANRWTDRYLDRQsXh9iXFzSbj9lPNKyVnjyW3l5KZJYN1ksGkKXK0CrlQJF6qC76uHzOZDVksYassYWtdCa2uhpQNMaAeZkB5iGD3MBPUU2Pc8eegFsOol6Oxl2NwfN8e75qWuY8x74+km+L0T8KG34X3vwFTvwnTvwR+9Dw/7DB71BTzuu6VcUxa9tzzPPiB//Z0c+wc5dJrsO0OW/ZOc9iM56QLZdJGs+w/Z9l+y0oTsNCULLaBUSyjRCcp1hjJdoFJXWKUXeRNLXsWTe4nkzkCGZDgcM/KlBMiLQvIsRJ6EyaNS6FUGfcphuwlgMAPoZgLNXAgxD4ItZwJcxQRaCaesgpOuhiGr4YR90O8O2OdOGHQXDDiyeYxdRj4cJe+OkU+vLOW7inz7I/nyGvl1nPx4G9Z6B9b4YJTpZ3DA9+Qf+Ac5iT8CLoWmgObwTUAL2B8QB84BfcApoC+4B8SDW0AS2QH6kS0ghawAA8gSMARWBgyFioDhgATkkA/AKPIGyCPvgMJVe0EoOGAMuQHGkitgHNwIGA/XA2pW5UpHRQTUQljAjPFYq0YOgDVkD9gBdQE3Q23AHlgd0ABVAfeQL8C95BNwAv4OeAvmAt6n2AEfUMEBH5MT4BNyBPxlqdNL5AnwDZwN+BbOBJym4gPOUHEB/4b/As7DvwE/wz8B/4fFgF/hFywKyIuakOc1Jc9qRp7WnDypFXlZa/KqTsSzzsSjbgRb9y9eJbhiiXcJo2QccN1IuKoavkDTSHbzGTEtYIjaAOtthLVuIN91I0PWlpfahJzuZoZ/Oxl+3UW43U2iuocc7l5yqPthtt/ATE+Qux1hUHqJQe41+Acdhz/QRwxWHzOYfQnfoJ+3Hfvq98Uv/luCmVnKTC1jJpYzcFZw/4AT9we4ct/cuC+B5CuIfIRTDhn9LJ4maZiDdIaiZbYyGFomw0CYjTLmopy5qmLOVjMntdynOu5DI3VYR+02EUk7EXWQv83kp5PwuohgC1FsJbKda9YutMPupT3WsfrRXgNL3yK04+ToBEUYonDfUZ6zlOs8FbhA+Uao0GXuxxj36ydG9ICKPaYiT+gLT+kzz2iB5zTPG+7pLffyG/dGsvewqyMs6wQrehH3xMGWPkMEsCER1qWTPBkk10jS0ijSQgGhU0s4mAGzZsIYmAVz6mAiMuqVDUZAPUzNgSGwGD4sgU8rFnVqBneuh1s3wIsb4dkWeLIVHm2DBzfBvZvh2L7F422PRW57LbQPKbafjPXASB0Eex6BG4+O59Yo+HUMfpyCfd/DgZ/gylm4LAdiYzkSG8qDFJQnyS8iHBUJDsuPEJU/EV2B8F1B8FUcYmlFEksqG/5LD3+1FZaqFxbr/KJ8912kacrxpveOV31wKdXvSEmzJ+CGIqDmQWxqnkRb8xspf8e7hC6tFeO4UKzjXGKXjnowjoTfklyDPJH23t7sJStvgvsfMvfz/sTgE4Kvc1+SC/ujRyJJ/pqyxwccUAwEP3s4dB6l9vdhrTvE/5IfRhfGGlDQX8WK8HiupAwU51bZfuZHWQ7UuUKeRQxYT54nZmTPkZTrKZPHPY4lqRLwHstCpNRK2RVRBHKfR7EzitRXQl+0NWgMaALLMothGQ1UjEDNQII/SMowRKEvobGMMivKvCgxi2jEhMaETmgmiJF6tN+XVCm15VWhFItMVGwp42JXUEO1nDWv554l1qELofqEeCulJSSopetyWp/4wrJQoLqZ5yRt6BRKEyVSNm6RkX4Fk68IQZqiLnNG9ILEo0A68VFsHtSD7kyhP6P04bZcgfBiXL6iseIEiocCTry/lwXxluUiK1kN9bm8NgJMTInJgFTEG5OSK8qLLRIEOaBpA9YlXuty2YqmuNxwNdQAUyyVKunEK1E1ya9J50xwSA5tumtDfufuuhz7Wh4FEVW4Ulrnr3xt3CJRBPAtffspAdlDQbD4ZlsHJVjTVYB5hcka5kmddQmJvEIIowVG4Av8uDtudBe+vb1XN18VsfDMGGeZIPN0v89xl8euTfXdAT1DArPLfMnNeKDtA9qNKQgAYgJwyOTatbp5YV0WIFtcajNeeNYuKtmqpsxhdmFT2sjbnD3eAl3meM7nNVuGi9I3zNk+DaoyzHay/c4x1W8eG6QkZlbKLGkUP70l8dJJmMGlEVvM/R5A7lPT3RgEIgn1LTBZME+y+FC9+yyYxJ0kAmorKcopwHInxQ1wcFgVvQMRz9vrFljnZenae2uy5BiBjpEiCEVfWnh4IczDK+Kw3UyjMSLZ0hYyjSIjvV6M2V615QC8jvnZMhWTFpPUiFtwmVobFAOgescgchuog7WrLsLS4UQ4byw+6wLYnoAOSBC7R7/7k/c5o1AqaSWlE7BjKYjcJoN7cfj4vEM7/toeZHe2LzNYHvjC4TKuajnzluIphHSDOBfTxpz4ajYprlbrduZiOIcEuOQhXNJmrfJkfd73Z22r2uIGqKjrvs/rOvTISWothWa6WXTXBJSnM8B8Tm/tcdCP675Dzk+O45z2Yz8f95f7we3D+PTGOz/qhHSEYMPk2kLbP/05v/vRUni5nzkuTBbWpt8DIMPjMPKgH/8p76lpBoT/l/6jMTCYz/Dhe4IfwvQ4/fbFj//bzAv37xxfrCHsz5f3Tu8/L6c/7p17/sCUwvHkhagIyepK4LXwy1Wm/GaMKw8vkSWi8lLSKf2n+vTJDiiAqVkTC/bCi9cB/FYLwxf2AA5BkXKg4Ki+MtfGeQxjyr3iM+DTC6hdKE51Go1UxRdRTSLVacTGLAGybKvPwxXtLQpMLUHRqJCwBJi3A+AEKgWEG5zsVO6MONOzMD+zNq9eskVAQlQCvGySpI0UKeM0LQDjkhbTsTI5UEpbAG3h5iALCKfNJQnduddXdwPmUsobExVWYl8S+46Ezn1AKqBaS+ijFuIRi/YDOR5a9ADIphqqn69DZ0HF+9upzK2h4aQAqW054X2OKu8/hAfXGgFp7Doh7llKyQBiSe1WbzzzWvu+ba/v98apVUx8Yo7LAhdbYgEhRKkHG0jopQYVZdbMMhUGSS2KNgkCmFrBtMy21vheGuB9yOh14YNjlHgqW+RuVYXrXb/H68YXPlKGC15pN7VaOVI6bl6JvLmDaTHzXOOKmgASygA3PC7H9uF1691UM/ceHuOoIroWE+ZuAkUi5uHbQqkiS2oWQMXQ57cb15d40283l1o599ugL6Out/uM8mAA387saIfE7/zGt7ORdWzLXU++69N9f7bDvtvYMzK5Idt35sapb0fMtnenJeoddZutv8w5uwCK0KPDRpz15GEjrvrL9UbW9md75FaiIf61S+y34C17gmDRXbAGC95Mv1+a1cLt1m6xMkGQLDLhNY3gMdYKlipuzra3cbbvt96Rme1ICIFrbJKQTcHby4wRY0mbu0138RVy/hSPmEuS6vsUiDMjMlyUwsnLQgUeSXdRmloJKucRqxcBMkFqCMRoBCSNgbSDEQVBxBCM1apIEnRoB8QrkojHzXkLI7iweNOqFqiAmOLPGjXEKbUaZ5R8iEZtR6+eADPZbZwg7lBeC5J2NtkZS2iqS6OILPnwlhFOFgF0MIwP5M/aJUfOHSkVjozZQgBt9jVUU/H5kHWV21/oLQDLz0zn/QrgiqzyxeuUy2449zflwz2oSkEpNMY5TNEcY6mShAhokN6fNTpni448rSfa8VGcqaMgxaoDm5X080X73VMALBeFMrgmHFl8/BlH1cSxqRjRngjAtHQ4YBkdXdc11LNF0bGnzK4lIMVrAluUtESuwAFELkllsLJl6ZhxpTLMM3Cb84UOxxMWEFHxoI28N00djcC2m6Ccev8TTL8Elfk5d/6nI7w/nI/pBLrCZNuqA0TnllLudMlu/YOaSi1dy+840bTIpemQhSGtVEHDdAuWkuAmBS3CrE7T4GEbDREjSXzFTohkWOebTgLHPQWjB2Eot+fPb3kLZE80EafrfHVarss5IoShSu3FDfTLODKYvsy1BkGGCX+FKU3UnweRF57FolJLpTxi3VVrRkks/MbU/TRsKeCK7k3k6AsJGZlBJhRmc8e6CwIBcVzuV8YntD3D8qAwfgr8Yf6GuhMYp3FdmtrKhz/2HRLI+pCyJgwDvVAbClTWyKHSICd/FFjzIq6+nEOVXAPNjsYhDv76xEHEeIeUQQh1LCcLj3tH1JFUIjsbB+CFmm3HT+T4pjqyasSz1JFhCK9JCaOxJMnAxc0WRaC3ks6NtAeuM5Zhn5TpCrESEgO8ZBcLg8VP74z04JQtaAC5DeIGUziIZqYU1LOETG86WSFhEPDAFWfNml3O4KM6xydyyDrTAOK0k1WQKQvSKYIE64xXAmFVPlSbaica9qKQVz+SI2B9MAqlvJeHwnuhZMqJcSuuGBRyV6F0nIa69OzN/IbqPGergQwkDPpp/GKkdQhU5zFRkofwDTLqSLpdCMUjcqyAZA29vEN1pg0mHs/xamU1MsYPKu5pnDisjgZBc9IYU+TDShPVbhGZs91GWrw6+iJqbnQzaa3Z/GAABEZi6tMwngmJ05Dc2yL4BCGV+xyS2kXWnxMNP2I/wvIBogFznfkh1UCOv6+AVIf5n3gV5jq05C9BzF24+1EGEHPhovhQiZiBCj+LckCMQQxTMM7gexbg82FoVWFjToeNGkjHTJDzQ/m+BnoFgMxGUKccqG8N1KxFbNyLiwGUnXDhqeJBmDYRVSjOK9VhvlI/uAAq8bg32YGRhJaAolt3lSBVy4LcJXvO6HzJkScUZt0qUexVVhzVpGgAbDPOrWAZRoKfXFiIhA3odnJMyujKhp7nzaUCLJ/3PZCdrJehY7NEkIHKLDDe1Tym6Ud0BAoOfELRAhSO3DiFhkslNIQZlfzkVWn5nHMN3Y0Y+hIZQd4pZn5QJ4TtSima9Z5Vrq5Dn480AqLm+a3bWlOtgKaHUmh3ntbvDdl5fbg1NqWWCNxnZ9N8Yow6ZceNOG8WuKo9ZilkGDKkS9RTmHQk2FKXHpEdH3dTv1Bj0qmfiaEJ1s+D63ChaUzME+tArBDKFdeICY+NAwNDNMOODYamH69znI7DWqE0NqrkhG9ClS3Xsy4VuBvM8iHdQnDlvp4hllxmiG7JYnVcfK7g8GIJ8nPNPCNDOi08AxCfvlMBGQ3Cq5tBgieAvzwgP58gkPgFpCy1tkelu2taNGcbkrTGoScV05MM5WiV+l2p6EaaXh5JVajhjK8bFMyC6SKk92cIYL5+QvAH2i14n/Ewl03Jj1I0kiJ1pBgTsPrYOuMNGAii9TtJLR88Mo04/kSvI0fgoexzSAYjqxw0Or8qIOfVhgujUFEpJLsQss7vyhssAZatqcSOADZwpMRYcaUWCbHx0Xzsi5VjhqdDqITGRuGQWQUP/Fd64hmO6veiV4xp9Ftk6JKePjPm1xuYil/5mt7RiBYntpFkd13c9W0kdW/ffJpLiRNKcQddjsSuQBSIsTC8QrLOmpI1UDiPOcaqgfp1pMwS0arw6s8FVLv1vazkcTjDCzC/ZwyzSelbUyTC1UdeYUM/s7XLoZEvGtw3hRcOBTeqduQvEPmM3zUQe2tRFdur34ecNysR1ieiMeObMKRXgToWjmjz3s+URwlUFR3VJGVDjOMpyQuT8Za8/LlXFBsTniQbTcrSuJ6QySsLouSt3IXqrIVaVRhJk7Lts1NFzTgVuuDNsqmzan+GVCiMKVfAC6JbC1sVzoHf8RqCTlbZOP8x/SFShoVltGZEzfLXa/zUIcesRHy2ANny+Z8PWZp+Jq/2phYyHMPd+REZlH7CCcbX3UTvlvv6rypXxexqUEc/zNhTioqHKvNOB7LW+rcx0jmdqwGd/b6bCQgwrk8BVYJT8rgK3xJ5ejZfO+xvB+EPwshxojEzYVflJJlukruDxQfdz2lVQEYm3jw6Zc/05wz7MqAoZk1/qzUm7s9vqs6wfqUtFNgSsIrrP9o/f0h//MX56T2qMwbUIISV1o49BA2ibPjws/3j+ngNjs0c5n10FsKu0t2MSR3JrxwqXIcHIv4BQbdeAcoMrwLZaNwnE8o4lVeZssGBSP9kA9W/82dlH5k+KNF+tVgncg57BimnChClGwALd+jazGHKbcslh7Csjl5bmVHMLsWAMn3hh10DI2rTFKdS37YjTmly/cW0N9sh7On1d7LRIdyINhNMSQ2PCLcuF51ROBGhDNuoXSORi8OsbLJxmQ3bE56Ao2rIjjWoMvIZDwTD57ZIlsIRbWTxlpZlDf7UM8dHFQnAEitVCYW0946D4dUmP3qb/iyfQk0WqCNb6ftICWoRMs6ngIhyC7aRCKt8m/tEQvwEKr1Sw4J6l8oqQZXMBcrHOjAOpG/QZ4gey7TYySwZq6u05776lR0JAIWcll4o2AlRcp2DyQwvxzCQH2UgFwW5RHXvKkr5G7r/nKNjK6Xtyb1jmco56NjbgEMSIDrvs/Q3lbhDDTLd6zxs+NXHAqHhhPiwuI5etAzKaH1nl+1OAqiBkd5DI1BF4f5WrDHg209n76eWwq1pHQVp2u1bapUq/HNRgsOpLOR5itpDgZr9FZ/AfVdlKu1vQ0qTM2oxTpnw9kDi0Nd9Gt1nZ4yT70yIIZNp6SeLUJruI2wEfcjEH/yddBlDTdOUvGwekKbIfCkIt+d4soytTpA5/qFV7XPU7roUnAoeKq7XmM6Wvo4JBpHCMVM3pimLC3qU6kKnFRW3DvRWa+pnP0JUFF6XahY4saCrTa2LCZKMPcCfAPnK45lXL5e//X719RsLET0kXNBY5BLpkqC6xra9n1p+c3SvjS8HEA/DAIMQZXJkBMTVj376IkhLqFRQI4obeKYg+p6w5pui6Hlayt5D1UbwX68+1INGOU5wg95LnqlJ4Au1UvnqTO72XJOlL14WL2dIrl0kF1jBUyYCYP26paoZbl3Sh0A7fs9j2WolqSg/IP8JXd0+erdvhuMrjO1/Y7+1Hrt3RUg1rD8LZct8CrrmNMgYBA+h5Epn5fQK3ZGjaxVsOLDHMDYUqVWU3Nz7DA+fsFKNothcw/eMQUTTh9+oNK6DuALir7qSEx7aJyXkJOvX2RN8sb2+ml5zVlLLW47XkbzpnqW1sZZetZdTK1uM60jo4pq7vdzx5twbJ56GCsffepaMIGqh++5zb1E3DjDsLfdNNCSOT8zPjd2nYTz70SWyxemyaXICN7Lq0Jt1426A4HYl4YECwBuFyJfqGKD5xBgz6B9S5jluHy33YJ2AP1BvDi1oInX/kQpNzAjboQODrvruKkZABD9Uch3WSoyyWDuDRsbAxfRm+p2RJRGte7xBoa/0KQy8EI2rohifEVN7oswIIRJX8KGKM+OupTDASMH7CLeFsF8GTturj5L2pDuEUAmrchmwSKgLXBZChewohPCFZT/Q0zfSpYtyiUeHDI4FOd4EaL17e+Xa4zyMWM0Zs6ujuoWt0chPU5Dc1ERPPj+lxhbKC5zpCLghrIEyRxpnPPJzb5dnMWMgGefsCZjKyKnJcw2Mg3KMjzpbFYpqvGPRjtl9eR02uuDdHAKI93oB1zz21xv1741nq+m11tpcU0bON6ZVb6TEd3klAGNTmaHmCDcww+7YS0dRy7CQ4D76K1SfWAje6Gf4kf+n6MIJPiGEQOj66xZShmCLCFtLJtHXORl+BRykQsZnAjdrl6CMuOS5RcCN6M4NrWGIuiG3b+kJ/mJkZGjqzjQC9okNxF+HwTJTlQNV9J0ME831tB2j8TM1L7kjD91LnlPwH2PJwNGtB70AxCo5tHx+VJ1PfAQiHv8AEfnTp37QhOnE2dpXwmb7b8dOkxRZwowpGE98HNEOafn8+VmnRDP9Pi0GvBq1IydLHXi0NSv0YgyRLm73iMhWc7Y1P2kpeQAbqzioSbqI/A6sQhspwykBnn1hAYCMg2AxC9uX4FhGCD0d4w5jTuc1fPSn8RD16aOVkpZyQEaGVngxuhpUy2BRKDxeqigsQVgHSVEIFa4B6KV3Bj4qUbQA+sO1D2gowt63LdYLNmhac1se2wZQiwmotrCsDXdoBIjiyHtTLALsvp6FiNIxRD3aImIlDRucA5o/SGXHF5GOzFeGYNssiSuiU61OZXVk9eQ9tWfxPMuxbl1EruWfN7WDWFHSuEh2HlO83Ti+Yeq31P4HTjAQrfl3ZBBqMFio01F8f8hOonFwN255Ne44DbDdXY86N4ehtrSzjpJBtIvsJEXsbqciqOPuQJwHNm/rXJRNrbxGzh0FA4BlgNy9LK40TSIuSGNqjPSs64MQPKJ5VXu/o70G+5kbNbT/WnxYeZhOvVjU3T/xWdhLROkkjz1ak0hLAbe/6PQ4o3UwK9PJc53127316KctO+hQnzLWpHeCjJg63GfFSbZp+y7WaDSnZ7YeA3TMcVPf0DNR7nW5pADK9PRcpawia6CQewhmYIS9ARI+SBaqw2Gl4vWwm3KcGVQQrH1JY7VOnIYyDXrHnFGL758HeWgSUAxryJxycq6dRm5W0JrPRHBh6MMsbvc5YTHR783y2rTbaQatYubWhNUEGux1h3IUQuJ2zxg2Y2RmTjTTMkN2ZGOnAX177rO0ErzAaLvOly1bnsvQZipfKcF5AWYYNHxAtUTR21KmcwJ7voeFQpP2/OZa2GCBRDtXBfbaFxDyNacEoLsTF+Bnky5eJOWygtfcFOBMFNbmIXw+SAnbrw4hhmTZR02FgcYpkP0cpi0inBFtBqSboNyH8DYVuKKWCezLA8snerqsoQTNvXnqWdOLMFHyWdsp5lKipKz1SEca0Fnq0zLIPIQlyHKs3Z59HQcNNSJrwPRNdu2Vsnvi8ayE6tPncj0umpLp/HxRpSwUhLbcvGhrEU6cj3NwC5lZyddfZHVeuHm3NQISgjXzVzNIYY6kA4tc2ckVVDMncAdkAoob+JotEPz6/WkSpjXKjdRwbxtx9NS5Imvr1vEptS1n2vJXIpgJmTPmDBUIvpQaVKc5aM3B2pLg+hw3LNhAfhrCIIhkFt+7uiaAYRfeud/dmFSQKpOvxsXn6RdLzsKzh0/fqTbJYMXEfgI8A9DNkJ5r00xNO67onBS/CxbrWfoZ2o+VcbEQdWSIxOp7TjOEbjLZHxMvCg1BxAtBQxEAQRMjMBqfhlihiBWyZ+PeDLqZvAwVe7rAW42skWYXxycr6jxWixrQmdZlcDvHRiIrkcwpOjCERkGyeMUv+3J2XWatWJlfGDPt6nJIjege5slKBDE4IPYA3urew2LVTlRFbzH/7psl37PVI3XI1NSCt6KWRyicrd3ny08IIAYN/ftQnwowKFpIzstVbCqxgi2DAmizDJVYDv02eMPSJ6RhP/sKg8rZd+Cdx2vffLXS/2D5y69NXounz32zNvho9esvl/c9PMMFo2jdnmwAESOhpOk//Exf8hTbLw78m0jLQ1KkAZ3pvGDY7iqBEiiy35HzKrNhJbKIJZXFqq1PSy/aBDCvey5KaWVEH67w0eC8bRAz6FUro3AAwz1YX69qUJq9crVOaEe27gNwwZ8rhWBCDCpGsXKc8QRkH0oVa3qzc91xTa0q1oyM5Tj6zIu9qNS3Outae+aglWcR+lDSbYl6HYiaQ11bpOi2bQ13MefBWAVD/ybgG1wRQEPGbtVxZC0iMuxC+ziAFesmJxD72XE6CLAhnjvZk3HIAH1hxLCd2aexxFTt/t7cuQm8AMOp+XBL95npwbdMcthSPbynb/JF9FTvmVdsKyMdVKR5UE1t63O6anMBxJ++h/4+5oUW1BhSc263QpJlXKKqAzphmG6fNT916nVYEoH715xi3y2qJBiR00hqWCXGL7N2FwQXtAXCVD+tIG6GkjG8CEh4GyIrDbTohBBol/nbh1qKhpGuMSElRnTTrfSoStwr3OymAh6HUyOQeVmQr8WoTZInSHbhznO4OdAPRJ0vP77XCB2h1Nm0y1fySPuD2pYSbhUjRNMhjAeXWI5uJ0EDArrdFsX5tNdFhJ8qungKzyAQA3ISQBOVY78fxXBslsjemhQtyuK201e4U4fn5cVieSryt2TGDrMQ3bXZyfc6JJ0avijUEum8VOAbnMMki8ltWwQg7l9kiyzh+4TPDZIKeD87wglSZZd7vJ57JMswdHaAdG1MCCIbAke5KzxxHKx9lkEpGetHVNQzpJa9ThfrSObWJ+u+YwZAbJ6OUbgA4Hc9LmXRzmqx+YGXERuSQSUldakjs/8FOwRvn6JDr2VaHHxFuhaCprhjRrIgsuvxdS+oO3gbETsf3YYtLZLKIsfEBsDlboaVdvuNxXZXFWhQ3biCkN+X7JNnZWtGqH7JvNMLnvK3CojD75Xd9V99gNMfQeI4L8f3Tgk+OrQOVgPxZQw0GP3naM4coCcs8EUL/3W6jjjBIn0yfU3WhNVz9oLgrzaS4e8tBlqdOxHE3vovug00i5rz7LcwcxksuLMB5QKsXEHD+TYGjVEbKBP8dSeIuuVhTVQ1SSD0lN9yDRguRbliwXTRJmUmCYlk+OWWqdkZmZdHB/it9ZBsz0lJE4agELHD8YMAt2TuMQNtHzA9E3Gf7ikg2BUR2Qw9CKEjk/c40oyC63dgj4LSM7NIbz8XsDKlD1x02kKPR9yjpRampxCY+RMb+oc2P/eOBRC1PzqNshhA1dyPWwP3extrYQMeySL/1ILkgZAtaCiBk3XGrX3ssOOgdX6R1Qha5UcOJXYAXf/Zcf99NLc3eyL/ntKjHvvyjLkYQxwEMgiA4Hqi4VGADQNfpRgIWAXLJQNeRJ1DfuWErbpNvFyhHXjiTf6R0pgoMe6ChN5BPCILc5ocJXi/zpaudfRl5K6NvSvqGCubklsOT1i02QztEF+7a1s6giGYf3bka9RARBAekn5pTk1tWXss+Q4fE/E+ZqPwn49GpP6u3sCg4TAsDsJRT69TRSZZ1XOAzM6Mu15b7YDBhwqqiun9qUljONuTkSmUjmmDx8Jj5hFCe74gRWwiO6c/8xyft/TZENfeNu1KZjw5qc6ygjayOZ6PVzIpE/adLrAT1ipCdATeStZ21bzM2Cm9Q1yqk+UKZwcJ9Qrauc6ORk1Fl8x2cz3GGZXLRyPse0O3QySkamrIrK0WDVOXuMoLXZTUqNDG16OuOVEenYp2Sb26V1koa0lZlS/JdWfgN1UetsJW1apXuWsw493ZxoWicHVx1qyz6qeJyy+JxMradIKYUj2Umscz8RDV5d3EzMXaaGmvHnnSOjrlS7tH119/eqIaKNFWE7/lqiX7xbVfqro1E903wZhZ320mdE9WSXtb0IlrbrmrU5QNKh+jtbmVV6ZELlTuC9/yOv1G9ir18h0y0YhZ74ByI9S+Cduexp03b1kwSLkzndIA5SEgotYKPIcVpIRMWDrrXKPWEPPwy6+Eg9ucNa9/9RJHiRrU1m3Z6nMFC7YoHbbLJpfHBN+4VHgPYgkayMozCe6QfN+tD96VUFXQ/RpKxwWtlNI/QiGtJd5uflkxIcICVctFEvmcnvg8H5bZhwU7on8IhJmLhzUMv3ArNwwWKHhz2YXWoYM/Xw9bOjXJxUE4MniUHukeFtp+OXp+8Fh7DAStkmgsx2wku0MeThZAwjOypZbcCfYT0tPd51GXNBM2a+s3eXTgrsdGthrxeGch4BIbTRdsF9TLaVdSvdJFDs6jcNI30vwc7WGQwrJe4VU86yrKivUKqo/qT2jh9YaiIgc8kSqRN9MK0Vc9YQZY5/laUHmdqFauEHFYk0JqyD640RimCtTwFAKFtGzp0350Cjrnm6fuTAnZCLQTnzWOT+83I4JdO/lBGd4kLVHPjpAFp2ruwxT5s0SDzlI7z8xN6744rA4Lwz86esUTLAlzfA+5yXmVUuy5ZewzKnw0zj65fRsAjNB6opUughE4zCafaP9GihEfuygAOo+I2doQGDmfGrp8JdiTEPp+DX6CYnriWaZXZwz9+cRSWItXCpn+TMAiVYq3YajsUiXKXUaFdcRzcOEgYZOI20ElsUwGiE7rnG+iVlhVaHrcYOPZqFc3MDDJTnbXVQz4Zw+rkQ17f/baqcz56W1tjluw4QTWpu9rxJREmkmEkw4TosPPBo/e4coY7WlPEDhfcQLMHlTmcZTOnKQVYIr+nzZmEu1fzjvDBvkuDcSS9/ZjAHES/viP1LOOqFhFum8uiw3U3zXKypfK1WUzl5NjIHL/mF9eCVt7LPQyWbVaZaxRemZQlMogAqVAdjXS2dsRJFNB4nzE4TwYS/lAbENAplpCAiPuTRwpKOPpIIhnjEq7cJ4sRR2hilexQINIAqkRndbwvpp3l26lExKfv6UmICAFHRcPvmGr46qS9mKupGdUGwEh/+mPP5kO/0Mim7Yiq9MCcUtbyYdpeJdc6JxwYGrql3l/Kf5RYmaN1fT2n/F4wwx06CFtkTaym+OZiuFQxUIpb8nRHfvwVgqMunnLJ7l95yzGrP2pwkaDGSIa0ekea99qVNuzXLXq4iWArLJf3FLceaqKi7sUTyEv2yZV7IBR1d67VCkAyA3d0wx2inLNw3hv02IZVmipC2bD7+TKpqTVy/NWWglOKOniBpN6cX35KXhz8jGqj5fkTCkmhaju+3GFFtZqQtoXTibZ+AjRboWXKczTLMoad8o2ofHLmbw1O5erDMWtpn7dJkx4prABUjm+z0QnYCp0dApSMRLKi+Oqt93+O+5GzfYeOlI8JXM3MUXfS0a4U66GQRB7oUQV9NrwG6w5cJUnhbPGSuU9ap8le7RVPKAYLEJoTlelAg7FrcCkWq1GFeRQ2LpDCAURQdZjj+9HUCA92qQw7EKKlEyLz15tGZzJ3JwykEts7GBBj4Czr+zvlKgmJs96vYUJGoJfRI0628wVtJIq28QVjav7vGPh7xMHTm9I005WmIZTaZ5nuCQOZoYUBuKJ0PQrt4w3eSLKQthUG8aUECCGPuPCTewO4VmhVYb7aamRFYhlN6RTURFCeug8VxGis1tRTA70FSKMtQmz0WGKpmR2Onrey8oKl2iaLykBh9og8oZQhfsAiegzXqyMR7FNyDC7LOjayic7sSskHqXPBgFM93kNM0DuWS6cQesTKQQlFg32ttwsL3NJYltU0gZLk1GT1e+5RZUhj3lsUyrDaiUb7ZbevX3uVXT0INMYMqhYqHHVy4qLw6rtQUkdcnSYgZpjByTmqCBrxfDsCmX4JATDx97hZP9hvIAAXrAvF0cvZaA+UhS47TREJk+LZEQPNeLPTACuEzOuPlRu6YGrMgLA1iSNDGsnXjkkDKsRQVgi7JJmgUDZH3DaKwDZqF7/PvpoKXlY5lFaBebJNsGcb6iAW36bXSttgKePblIREixW0DF/m4SwyqUcO4XH3AFJ0bDzH9SL8rw/63wvTUo0j8dyH3n4Vo7ty/1abiIbgbBNX9n5PVAiJSX/cb4XLP5R1WXpw6cNKqzfrt7T+XuSIpDO/CfoGz/hU4dAJfAe6mJZKw6s66IpGluQxj7sTJIE5m/4JW+N21B1sxLgQwREz0GcwIcYgATGVw4YUy+YxXN2EmchviNs1uadXTxMj9VnFWAo0Oo0A4KS60UPIRBzqgW7sJigbra/r7YBZoVLbR9lf4DK+S7+Af6hOu69raRdQnfHATFXvh/7LharbHfao5B+IpEuFtnsGfmM6WCizh4r2k3WgsWAS7zBsgucS/JinbGyT/KPUWYUXLyChrc+lfW8RipSug8AZ2vJojy0mu/4nHa9atNaTQk6/Ax39euq4BpTfjpEdSc3b+aWy9WuGfukQ+GcyMv13deqjIpl/ESEVanXP67pVjaQvRSRuN7ewyaupZDfjTaoVgCqv2Y9GjnjI4yd1TP30gi+T+yuCWxa6Owd4q8GADpIIPYssQzCxxsSNat9U2pj5wQcAWhWSLPw3djFPRR3VRRP1mgSZrBgIRWjRpXhFLbre+k07P9i+o67aK8wF8vunkNiFkS46EUi/rch1SQkKepqw2LPsdUGCzdKRH8VmaKkm63BsfPEgKKWv3A+rcCIkyFzFmGCKN3RnUKSKuxR5UW8OxPxI6c9LDn+OA0arXRwCa1rSIiUA82v6NUNrxiNP+wjpUSNCv8XLu5ddHIp1K2FsrIidFiYcuMv/QJ1+snd5uxt2lagPuZJ9rThcG9bK4ZYe1+3Z09lO93bbqa8URR3YWEZ6eUC1xJHGWCHtQW1kQoTB29rldx9SQMPIE6W0YgGsb63gVrYhhWF3fDVCCvufmGhPnLGmQOFgoct74F79MFw44KLPupm4zZOFwZS971Dwcc9BjZmz/f9Vjk7UuqnGfIURL9Jwkpz30rNAyCrPjXi/4UWtlUz8dDMaoeUwy2YAJgLsioqot4SYW11tUcNKUplnsSuykx3dVoGzn0YADFhxOU4rLkBb22GbAkZs0ANpB+a3Mq1nETdabnqIiUB1R0raAHmp4XtGXoZx/lhGFGZdj+h5HdSBlmMz6vcT5TqipQiR2+5v/H7Lr9HKzhENOnqQccNA/dLh5WyiZzGsjJ5jabKV3cIQ9vih7/5+/ZGQHl0WakVSqWI4YRxsD1qw1u5dYbd62Ihj0D11AJV2JdzKS4MRFnxpf2ZyBugx1Q/En9Tna025iOPh4K7RssgIeTN+PVTaein6+1m0sWBK3DmqYHaaSv2u4ZzrE7oxlLMwWCzU9G2mED0vAEKsE79FKYzekRhO2IbLAAXraVvt1NftvVyt3X/LmLSRpNRbEnZStrMjiOuiXz5GeeWMh3IeldBE3O3aWsUidT9gpwTnKB9pVePwh2eYtX4fdkbCp7J1qSo/1j4FBMD/gdWuhucEg7KynE07fruDqff9S4Dob2jcDRRR9by7LugWW7LBwOmqg4VZq2GlMEany6RVHSHPT1xgELkNvVLNVHurCsKdOMpuf6adLh/C5iTF1ax3/1gCBpuM7ZW7mXb0927vq5HVTRIXIiFJSWbYZvYQmyTw2vNzTu9TL36DgLQw3Xh/W7OD28UvBjA5wltw5/U6yoAhuk0EcWDXXhcr2LXnsKou4FFexKSbpt71Oy7t62v2+w6016l2nS6bVvLbHZboO6T6+vadRaI7uRsmfafkiuFsFYO/WLFryExEQDCPhNrRGHdAvTMQGsGta1xCcGhKwY/Q1gOWWhhWIH1Gr2T5IzfSGUQPGpg072q29RMj0evOr4cqk2tQZAL1DRSpZupWUwxuZlP7inkRKcQK22MbzvGCI8e4fmIKgSg9K3EY7YX0vaW80W3EQvMZqXtfVHxVBkaWGUvTLu/1ZVR6afPCAyZYtEVxylod6e69U69VjGg2g69boW+StMc35oUtxn5Q2EUZ+SBaH+Eeya9w1PktSAjBFwVy50v6d3S2zx4TDqlQsuMUqUSOS+XnVbXqsHO0+Z4Jz0BQSgKg4CmD0rwyT49H9py9+P3MW0d6zgR2z1dOMEbhp53SouDvwVEmEJoVTUdLsb3LN7SqFdtDjiUFc7kbaihpiVIhsSuYZPYozWyQMHRh4PlPf1PrPn8EOqIzGFFP3S8l+0O0PmbsfqXBrHD4I7pHabjauWSDeXiiajqGtnhQumd0G97GiKv6Szfk4pcWeQBqpvl6+xAGa+GwWRItFhAcgTGVojR+oh2AgFGWClxNEqyMozcb8Z0Hv7UCbLNd/ZYpl4v19Kg7MWmzYbSErFZTtt0FyM1kbRKaclmOnDdCWThAoZKCEX42E3Xpb+dNfKS7VpB9BlIWvZgJ5V9xQz2/Oo0vTjltKHtLfKFYonPtH7xgZdCy8X0Bp52lLA8YDwGhJ2PnOBSighp5obguMdVKfTqu6T+biFBjXCqco9Qf8rzvQba0+9t8YUWD9ZICBrO/XBVMII1p5e/TRQSTxBMY63icvMbhoioq990GnYhjYMxC9s6yVJpnsB+Kpxhc71BgPohbK9gyPw7Kp8d6h85WBCGSTWrI9na32H1otLgdQOVbaajS+0m7hIgfiRIP0zWjEAGfcIhmKIIbPh+5iznUvrji/uMIrb95CPX6HhoI16aJkfdF0IYQMTqHzAUj5hWeKiGY1DCPxcgOgiXtvHfMhSmaDB3dWh1WYRMoodeN/W1Q1SHyai2FMLq+kowhXaQNg57Q1GwCZ8tp5NKssBDx0ygiZSJ52TrWj9Q23WDW8ucgkiv//aOvrv2+2V+2N0S5yMrdAxWUv2IxC0FageaxPuvUAkCtHaORq64OnGcgMqkLxMkX3uEOMsN071dkmC8N4ea15hVMtT0msWTT5nSLEXHO9zX4+g6TBh/fs3LlY0aP7WeRk7RaBsUGN0NQn4dzNYBEqqL4O/PMFmGeMP2tFYCjU/062s9MeiuCPanyhkk/fRq2HjiEf3HjnNUSwqUMxh9FuSg3ybHvYyEao3o6XSMeLLUTIIfdcqjawsUDU+Dv09KCG/GAATfsgmDTxm3VXc7RnZYQ7nto9UeG2GCUIvu1JbYP3E/pGYvPJ+Iyozrrt5wA+MT/gknx19MCbjDibHrN7godlMQSdDRQH5mOGjB3tFMwBOtLu7B7OGzCsy9Bleauz04I/zd6ObRwe7ArhGXBAfBhJOOca3S9TAzXnG6lAlkATxrcWzqiOaiILuml6IZUAU7QNpiz9E6TdEZy+6qEjFqm9/9WW3jsfh29UORrRq3Mc1zOvV77Tsd9UVwUEzgylIkbNmffK7trcR2eicKmK2E7Q3tFDb/BEsf8W2MQOzfzQNFX/PT9oePZw4CJJ9Qq2TPh+kk7gLlH7tDRYrEZ4AgwV+cWP+VpMXFTYR5DB4LOQ2Od1MzdmIACDN7PecV+JQCN1MRauhMwMfrTziIjCH5Y8nAzS9/YbirMf+Zhs31FHp7qmMfPts0VsZUeEIZLqO+Ua6M3YgnCp2h0SxVsquM+rCVMKC54VkiE25X1N9KDa5Al4a7ho3pqThGiRkohwR+ofhSmfAbybPweTyjXZeamBHJrgZvqJdqaftrTRLJnOb02pa1A+tThyY9SwgsmuLxkbnoAOrjnaqzeq3hB5gOLG5aFYSO6N4yG+BKd7TfBoZKOz2ncN8N7vY0ofmlWHRGw1PCT9p7/Sy/6PmlQhiUGQA9xoAJ6JNpsvUOa7+vMhDJn8Nqft/G3wNXigyq68lkSY4G2WssmWMN7VkSC2GVG3pLbjrQBX74ALalPee+aDLC6xYxXN0D8n9KWA9skD6RIYjlG2S6VaDI16TDRluadV2qiMTCkfhicbF1WICric7sifHwl5ubsfvm+elYuxRNNp4djCpctIy/wFn9MhPRRTatSd6mDLvBr4z/xuWgkUtPT6bVR15y7J5fuLyLFlRZtmN6wC1ah+lLRgEd06+54wlTd7mdaw0Q94yPRIsZZ6ZdGbR3AK44g76iSiD58RfmOjTwDLMoUVxYgKD4fjFkQLsFc+jdMiAH77smMg5PFuTAimsuez3RF6Y9T8Nf7Xt+NuQcvDwT3ISQTnPuyV5BTs+kM+dLJLSc806NapY5UTAdk/fNphYFMnanypGhcwu6gcCBJ0yAzWBSTZd0wp4td1YFe4HFlCrB8oIUPfXYQ9t8EvhkViT9zkOIdDHT7juFyF6JaTJy8ksTEV+SDhSl3AgNYSbXxHnCElJ6tjTHOKIvpmLMIW8r/ERb9FxGWiPftMKrImPcZT3m3o5jcYYO2r3TIWnEWyVI05IOMVnNueSiK5ZL8Y6dkcPyARrbJrkI8Zn4E8b8/lcgNGes05qCQ9naCSFqedH8/Afnii7OD1M50VRllTgHMwCHNZi0rMkqM0tFyNRb0hJMK+Aouh5H2xuG2rQHRjlJTXpXHO22jansBPvYBUiZUzZq1xmIYtfd5FfcBwDoD6EJhEhQvgS6uTUr6cW4t6d08OGBbRdgw79DKGnvXz4LS/gN1HHZpEN/yNANPjKXaJRMxLxx8Vcfnoow2NAgru0sgMPW2RSd7JcZI6zychwH+z49Y/Sxr0WDMEun54vzA9MlLwHlwOgzbxzes5b4uV25K00Gnao+c5EzFMm05tqb/S/Up7aya7tQtUaOtpPk/l2UbRVMj5LLXYKmLs7m0aGqGlbnGUMjCa0lS9hKbDNXBtE06QG0y7Ka3nSz1gtnuU5tBsUwgG5btuZLkaeN/As59EGZJjEfGlyxQvPKz/MXeiZjyg40ItiTnylfL0Pf8rO1FQw3b88Gw9ZWmQhovWdlfXejlbV3w4PUZEIIoHXlbdp7ClA8mp+HIc62NwyB9sH5eQi+IlDo7YuXxSWGkslKMD24u0lh4xq9yIr//BOCWVs5BIfHKBElTvTPP2HI9xEwFBNeVvEIfMftHHn3jifr6Aks3B0TnqGzPIR7JKxBU2UnJxVDcF1dN9Kdcgien//QPr913EcBnda/eiEMNchCz+YwND8PFPCl6QDFlvsE5QRIvzLnmXwdo3Tm1R8hKJKDqhB89WqfFQx/nv/8WSQ7D/b+H5VkFWGzIGjmTwtDkBtn5M/tUYEhEMbbHxoJeR0iFHRbhH95kUAIP4y8vUlBXgWuPGbhFL3EmyEwehvEUCAmCeYX5cghkoBAFJCgQZ0nUSAgQiT5GDJWlMZWMZkqtuYxO42pVjHTWEU5ggjB859F1Abo9i3FCHYCF+GEOUWsNKZKzUxjP9aQcGlFFNxyZmSQ/Y1EgkwO6A6Xc8JuR7iKiOKDiVhUMg37cRpbTe5npZnQ7jIPwSC88En45z8bXBorFos69JitwfGlsU07NSonVkIK4O0zxUxgsG6SjUtgJ/sx7nHGB7ronlzR2LE/V6IkEJ4RPeKPHzOY3f+D8IebGMYwE1zd4h9ke0/5Y5GCgMgGDCgLWBrVURAKXkvAhMbRV0zQAZ2udUVL2BPckwRIHl6P+BGFQmKCTIhCP0TILy/ntwzQMB2Fl6KmReuEeE806HHus3d5+/pEN8nPccmX8Ny3/vZ3EESCGNPnNfXDq44tJALgc0Xaolp+NLebDJ07stPuy4OGI03sUMdlAHNF/0VFFcYSyC6V4dRoCYmipCS4vr7CK13IsQSqcL59W62+dtuhgysOPpkiOZhbMtlJVznpiNu3T9hPvnVD0jlX2UlMS3MHuZBEO0XDpMncy/p4/eWp+VvOhsSVKw/o/iUanG/Nx7KcXlZI7pa/6ykCclGSuYCA169PoCNTCD3hBSszLGp2w4eCQtsDtoUFG97PRYWxMrcIhmyCEn1efjxc6fv6g2yGAkb8ErGr77lDzo044ofJiuL0iskPsuON6cWXLRHX6Ax5rL4LhJfRTPf1RUJQN4W3KYjBFNFFgtWSf14tfxhD7NZJsQvN9GYyZgLT/GCjIVzEjyNPAm/4lAJ4J1VIwqYseGkOIaCfofHP0B812fvoqyUVEpPuhKEhGMrL262BgfCKnhaKTqE3x3TmzI6Kz3UvKJAuZGEBWUQ42MW56kRQUnkLc9b9rBewXQvbvtZWF4yN50Dnn6bLzF9EiaPRcegoCdSVM+wjQ+24dlHixuiaaNAzJc6FI9FnrHi5iCwaupAuEDzgHRLmkte+nSKXQM+Ey+A5g8H8UJTz5TUfma/u7nKmXTD3sY/1UXbcxEENNTVDF8FaXv9+BCuu9DTZjLWxrQbE8A9CGnWzT0cGsHO4B0/cLMaZlp+pRxLas7YiMgKixNxCmzBjInuIXm1I6cN5eVBWQLjg3VUwB8Ek0Y2AkdC0Wgm7JzBAMCaM6+PsuZJG+N5wY3tribtFNul1422pq9GmG6ebULBzWM2o0TC+vXiDsWlhP01nDqw367EobXiNEQHeOqyh6a4AWHUaCB+8AMEIwgydy31lLr1cndiNCkMPDMyh/v/svMdAzt/F5HDZrNRUFnvOVre28ViI08qDZAEBsiC5FtWtTqSXc+OJwpiYSWIwS43gJXJeYSExXjqdXmEclwLDV4rwSa2aQjEArdn29gqJhzXxsLcQm7nKMfZwAKcU9/X/x+SNYuHWJ0m8Y7yKV7mLNThRoqKUFkXkaFsKyNlfhDZIHiCTBciDtDRHB/imek7ypxBO1wkl7+5mKZCTcJzsDLNSCy/j8nLFEeleYYmaCgavIJQ8N75z9JnFEKPBZfQtK0KgUwO6pjU8oHSMiS5cmbIdlWSxf0yMv5g8JNBggX0S5VPkaUWoLlirDdaFvnPgwIE3VDjy5BlYxTtSA+PiAjME+pKojoij13DkMOAN6msyPGykMDdiJvwnMLv0Blhr7IJgXU/7Qgyy2DIMC4tgR0pkHKJEyJ2UaFSMI2gc1yGgO0+jgWUeZiPCjS+gXaWgERsh0LOoqEmGhZJWuoUQfngh8pxh0fAu461tVmCIqTOLuHq6KbJxv1LRlMZ+otAE0574Zl7EKcHZsRPOQ2gYI9GnEZT4tja8kpA2IdAP1damxKcRJkJ8enHxbUilSEgVPmkkZoVgWqp9m7/Y5bM4R/bqfCndzFjYLwqracvlCZN1fJxmpoi1XAEFE+JICZoi9cr9pEdzEkUaUgIhLoqsyhgP9NV88boqaC3yMgtFnQ7NAoqzRZzm4N208DhvfTc6P9d5a5OQoMCcrBttF7hoEIQkU7QWuu29Ca5JBSEGoMjP+w+FuXMqyurDZoICMwWF0fDHkDGlSwxlYcbAS9DtClv1fiTJin6WkexareB+1ySZDDPqt4Jb7WSkn4tIso+9sJVrkuvbt0MlNNn8OAy3d0C/j0KZmQkkH0+r90Anur144ZOiPepJMvU3MtLnuzy3xOnpcTp5dz/LSN+oSTJwRU+3ycnMTBhydW3vkMpRU/tgwK/9yyKYhTUGkEB6rMQfP6QBBaigURDW4skURNjMJSagtWGIQY8fAlDQioRBLYBCJEdwGLi4BxkLkyGyUOiiRFuFMIV7ExRGRZtnYLRNDTTbfiwUiAqm/Qg86mEm0E3DjPg0MyrQZ8piLBpiYcZ9d5gxivpFpnq1SScsE7Fb4mPfglsqLKvJJ/TLbxCpM69BITAeZeb1IgISRkwa9GbQquMY/vOZIQPVebd//R2lWDIRRAodwSrMXIHgCjQmq6EQEb2ooLuNzNgpjrmmiRWszjOHbZcNDDOKAJHyQuZ8/CcbcPU6Uag10remes4bfU+F8E9yUWIzf7lqETnLuIw8mnu0eQEsfPHKm+hAD5dP000v/W9xcsWMEQG2z3dMlw+jLyDGmRUXLf4Hy+L1P5DfM6CIa4TSQ2bycGXsbovj1yykko2rM9Rsy9Mpux2Ul3ztoVLM7hjM6gzJRho4dfPBsbtjI1jpVYgh13tjiGYMsssclq3Gl/kWczOL7c+uDdGEaq0mrUoKTHADb6efm+lbjC9btvoegknq/NLZXhme6awkggKz3NIbt0TfXcTLXpqvyTp1mdGsNeYvRyYtzSc0O/CSE/jxLiQnmJvuDOU6x79hk1/XJXjmaUES39ZLey2GkbLG7fG37saRiZlbt1VGyd6kAEWgUaDBAjvX7TZaSTC6f/vYzYDALWYX3i2qtlYvcUKwSBe14lUp2boFo8HYOu4tOMZtAJ0oLTm4rAUXkWrUDTGMUJD0Slc0PKpSeApPA2SOd+bGA74KC++OlpdBUFJyYzKakyV6XXfxCi7cBq5XBHNXvAutWftMQYan2X6IpvK56WnQng1DfL5T6gol253UfD5KQqqT4gaUb/36IKcCABVg+Kt3vXeDVtuwD339+49Xh/MV9hp+DdxWGKIZBSyf3kwTg0fm3IABOXoQH8rzmUanuwxd43hsF0IPSqUjCg1iQPDk9dmA5vDc4pxCtziyiOtuhuFM5mwfrZMJUbJrBwrH2U5qF1/IuerRjuxcJErPrzFbqdMhVelmSlwwV+ob56tCNv95CbnR38lo3+jqQrG71DMZAZBZDcrxQiJv3ZtrP54hmLHD+yPZ9E11WTdcSrcHgbJwgsN9/YkoswuJ1PLT3eTOTjKIvDx3er1A5JtwZtkgDSRpvnRJPN39qft5kPf2Ctq/Ay4/gLy3MebAiLMpoJ2lncNeQOToL+8Ddy+nPaJJ5DCbagDvuC5aCRS3m5K7KejWLXHE8k3/760rLTogMj0Lrv9oK5zxCHWqCv5O+Xn4hMcHiW2s07cbus0sM6oXeg5khz1jtb9/swZfE+f47IXgfGsSNP/onOd529PTfQeurPF9rvY8O2obm+7jWa9qiYfBdU5t1NEN2140As7rVz6YW+jacqGQ2z5+V6bW+G5P85mxk3FsTnfu67zddO7CnjjY0zYQXPcwDgb8U6L4j+xb+RLozA3722S1l0tiTKAaleL2aUO3yqr05JfoSfKzJv+20WWl0K/la3yn05xQM0dsYtygOUB/jV9Wxtuo4jk3bj2XJTFoQoK8VwdP+0Qtl+hldHrIzoZw9f1Rh2+/AXxTbydwj7IXhFnkkhicXAiwa8wBN/WPwH5/jMtmvs9hOnoCE2S+H97/JQjzDE3vE/hsfpzbfoH9P1OQ0f3JbjeK2+4nbgzaAqLb8az/KC1PtE6gx+3/Q+Zvb6QYQVSCJ0kyn1fHSPUtd3E1YGA18Hksd2SCARZnngE9Vc3KZh0NM4GZ0qChQ6xzFDPh/zuMDu2nOOPT29yT5PthIwQl6/xLEf9kGKpaXMUdH4eg/YMqJQTt3Tei0I7Q3IZWMj0D1MZM9OGqz/i4z959EIT3jv2DWWx9oKEgv5s9fcE0CaUFkbbojzkqZfFBj1Zxbb80g9HldMppVqR52/HklA74yY+qBEGg53a2y9GGv+nR8do0C7pFZLFyHOfcKGx0Fu7Ca+9Qx6xM+uBrNGCWZ5rjI1HgEQpCG8datr29EG0eFqZtK6yrq6dUX5c+CBSByAjqkVeEBCqA11aK9YB7BTXHq4+LMBPoH9AT3GbMLXT6L4YbzURilVhlLIREvhgzckW3uEAXmkCCiHw+ESIldOkpipQjl7YQrnFOL3FVV0QdTPlqJHciwZAH0vky4BTjUHQX5IH8ghfHdyefsqAzKrF7NIPh1DC+oA5hyPAosh0HRK7b2iAkEYXy5scDzjXV+PFmenOPUQHt0UQzRJ2YR233i+MPubeQ+5J0Ls3jmAnMw7igTpHSsiy4xzmoVSXT86olNKg1s5P2CoTq6xmEsJCMSAnmEG9WpjaMOMBsSNx0nOwSpc/uPguRTQkJCJaAKNETYDgV1L4kSGc6Ej1MU8vxTZlIylqfvehri8JEMFy2rkiEg9jqJepHaljPohGhpFOf3fYFJJ2CGMEwtqeU0lNSmk5J3zkqtDI1HqLJXliC5rsyyNNf2lNCAX/zhFBX2qGfc/fBziWGeiiITup+UoBuUI/h37KF9U5/9DMrZUnxEVurYLi/A4uQ8VEB6SR7eCg6pSIwkVKyxzqjZEglPJPpt3W8MRbEMPa9giNV4ZMpk/hENkyoa5EJnMgm853ETrIDA7QImJ8iSHfYk0gRfPUieAW3uJsjVXw/ZkBGK8famul3Rqiid9VqQH8NiW0UJFZZiDCS1RLv+0bDYnJNYt68tzZkNDORt3ABjr5zB4Lv3qWDI8339+597v+8o2PafyY8TLI8Hd4+HrgFS5Dm+zMzk5Ptrnl5wPnPywNqjuf3ImamVapVXLCU7R8XLapaDQhJE15tteuqDhJQLhK2ICxaFpBE01qNOysNdeNWtDomeHdSyyI7Vdm5VZuj9kXfjX0ZGztK9PbefYE7eBdU2ZGg+fTudExY0YpDaAvjzulWySFSWriMLXKRxdJQ+kJ/HhDLjx2F4aPHkE/wdkqlsr1j2m86L++F34uOdqXSHOuNG/fvgyuXArnMzDdp8v795qY3k9kZxplEBusUjnw+G2Jf1H6q0E4QTJARE9KKHvZM04gJBJkgWGhH3Y/y1XU6oHhLb/DMxwRqvy1FoXRKnpr6AdHwA/lojISfOnC1x85znTbLfJ6cYRQzzpBxp1iMxNME0GfjdbrfRkZ+K1KryGGZUBV9C8NooEDQjZvR0ZFHYeWq+/dXrVz9PUrqVjM9VugAO2zwzUIcRH7uy2J8RAMp3mq0Fh3LKWLIUv9xgPGbdv3y96Xf5c+3bXuO+eHS/AqNcxpGXiLbJjyYjdGgU3FK77+jWVmLwzVRBL5LpkDIE6hcUl2tVgmELTV7UlL21IBdJ7B7sxr+zcvbs2doaPEInKDizZUd7S/8X2zyaf/p9o6aNXt5U/OM/4uZmRLKNTcF50B/F8ucOXSovePgQeZ9sl62LjfDiGFaV1zsoqSFB2H1KMVJNNApRgodWcchSGyLQsn4Kju7rx99rf0MLM16jL74Jvb8ZwHfST2AljZsUDspN8DBtPsrCvjzzRxOSrLHKo+y35dddezYKs8yd+DA7ZaYkgxcIPJd1xFy2TZFXuFW4lriWeZ5+JBnuefZzK1CnnL9OgRx3rzIWrcmOAK00jHFKdlJuW6dcj9BiqMSLeCcy4yLC3kTedz5zytXwvDwBQ7nf+8ErMzkGLALYQ+4fTvz4udvYDmPOK4ZktZkXLbfm3dFkYm/Spg53673kux2nryuU04+35oMEYkwQQBk8vh2mCggyEAfSEz66ackKRgnAwICTPz09SQHMoKACEPEZNutLaBux5lEUhBLw2KkgTxWehojD3zwKfvVdakm51sNKw+kMVjpII+R9nORSEJhFGDcw8ax2umvz6iwomzhu0sbJOlTXkLQh4XpJaw1ZsWgn1sBmgWrynnr+x9Xnr3YLJUuazGv4eYV968v5wlWgWZuxaMEpg8jYx8MYU7ygJnZhZmu2xbQWdAVi2Z1SgmLGJARV7BuwoaSLqOJhVOeghY6wFoQ1pCsLDfca+9InpObmKzKyx081NxBT/Sfbm4u7dyJzO12y8hEdV1p1WFN/DmjrQYvIySoJXiu9O3fkiyfjz5ee7E4gGu63gHT0wQ6NTGRRs+iyoOC4mlprDimVBWQFvRUgk6RQ1UFpSSwkoIR803fZC21oF/34DH4tcfZHPEHa2ax3a8szSi77whO+ZMVfxNuDxO05c5nK5YSfhpma7NiTY2YCYzNAQFxaTlBW1JsryMk/JTgk/TPrKqs55Pq+SJRO/93sfbXv8ElEd8VQkr/8Om4Bn44KminA08/KP4+2ImZ8Lvlf8tvAnyy7adx7GuJWfWw1929t1YR09Ln+OBjfilvU2j3Jl7xkeLfxFX7+YyhCzn7/seenHVb6ljzWukS9J/b5Kl47n9BW9a/rumpVPsuxf5vuezCUMvyVgbvt+JuXF7n9WBCEJj7gt0kDJ2bMLO5HKwrgeIwWq2OhFsvDE9X47JwmxEx+qm97cLlhvEFljMggeUWaJTOD6CuxL7Mwgha7cr7VzhBkNMK13K7XiYmy7akJPlRjJfcg9qrgCDFHiVq6bwxnxNZFc0tpv2GMccZAMVIxOREItgWD4+8vMN+Y7MWGVB7LLBfYT/n7o0j+yXPf06O2uGHF4KILb9nH6vtxM+gloDLaGiZ5DGjPK8AEZ/M85UX6qwAtbEx9cY2//xzKbS8c8X52R8RRMZ3MiKGuTnjObKIIAdulnwq1Y17WoobAcO3kS6hinzcZGtxvrKPhPsu0nnvnPmKzEN0cJVGJ9an9RQDetb39cZ8GV4ygTZinmFGhBm2175x3AeBqMST6JYosNAWMaM2B8zEkiqbh9fsNwp1gS9KCNAIQn68R7KoqJykjxqUzlSqSTEVRL/an5kJwa5bUDelZSI5BtABaJMZGfNzIC4EDGdcmkPmwEhSveZDcn36WPVSR28u7S1vw8puRxcH4sY62YwHTet3HGqnH+e8vTtmyskSYN4wsXNYvE45ZWw7BLnTEyUVwfgcloAdbUWMyJxFur7CbehbaOiQDIa7EB2N3kVPrPPPCE9g4drGsGPLgd0IWEIIl/7+n+HIFEqCSMDkrwEIcu+HE9Hm+WHV5t5H0b847vKuIO3pjGgLe/AgrC2icw8p2OG64y/oCw7m1WH5DSsXhy3TBcQUW22zSyuzlr76woXV9Fpmq0uz1jaFKEjvzMaK/Kqq/ESmKYC3b/yk4zFvE8xgd2RnxLNnEZ2R3YMYe4cbjictn5mTbXMp6cFRSIGEWn7yZDlVUgDPVqRTcm1PNdxCA9XcbEcKAeWUFj0W62ZixGatI3Oe53LrLMFC/3imHCtxq04TnO2gWWSY2I/7DPCMrelwf0OmNQmeATZzf5yESUu+Mw5Uce+i9pXRXCgTbDWc3TcrKzd7zkAPd/Jqw21EPzAKSe9KYrs5FOK9U0uxs33dg+rmE5FtDfrAVSf9qjDbzVMAFviyoNERHY++OfJzkExhUKCWi//OAzebBIIBbiLTDC4LyQ0DDKCa3oGIj/Q+uFS5w3ONaTMNQhpt4GO3f6LFaQs+Qtq6js2vELTw51ZLemYa7SlNOT19BP/T65OGrPqM6fVZDQec8B8yGmujSLwu6MHvZlMWgTKeAKPgFGxuPrikAFFuhmClET53gteSRkW0uPZVN3+2gBNEaDxCp2EBIrqJQEEkj7NTSzVfU2wR4Y1BgxjNYgfF6a4TA1CfroniTN8RTZzyCO7VOEWClxWj3kz6jgpzGvgsg3zh2B0ZKpcFUxIDFUjRFM/lQUmUBYfKM4Uh+aGFtYP6Fn1taOFfvCxJOjzBbO9qem7Qj4Hq71Koij1Lz8aM9yBPTXOElyPjv5VGhkKRB03VtAFhuYBfJkRI+hiL3EnSPBuSwvrSjkYLf6CuDPpGKCgrEwjG1+RwssPCsyNyawz1HjX5WhePQtNSD4M2KP7PRpbA89aG5fsORcPHYReRi/0hOHrBB8GUJuNjilNoY352iCxochj8NPjokasrInv8GIaxWKqBBouTIQ1avK9be0e7b3uYdQDv3ZXaDvpWZoRAg5UcKc1NqgtYF+hswIAlp1ckCfW+efi3BswsSciRikJTvJReYwAAKz59ZdivPKd2e6VfwzjSei0uP6U+vaIhv0GzshkmLAuwRoNLRWSwYCUEmZq+oLEi54sjnV8VwDVtbCzwUMAcSTwv07esPJkUEx4phYKlpJKSzSvLyqzKY7PixyDJks237MkWQJ/FpKRcF9BzWJX/42IklGb7Z/lt3+6X5Z9ditRE5IZnZ4fnRtSMnTsA9wu+fBH0wwfOIYOR3RGdz551RnRHDgILoo94Boa+sLaQDT/9tCGkLazPSEtjqBusMa7LBiD2Ev+K9Z5ybHJamaichk32lFesl/iTVWqGlrW85mnlan8arGGp/zgJipJPJAiIwqXU9gGikCDYIcFDUlQ7qEqmgFdFJlW5o9Crh0wBiqdfPRw8M6NKN/QfnBu2bpn8jTZEJwncB8aJaHMqx69h/oY4yTf3Rak290VZOLy3feMChpvyr7XHSTiwnjeDVg6+/druah4me5bzbtT6rC2nZ/ye+93ym/D7Nn5fVZ9sILap5K1/tH3YhfW/Dr5VovFH8bjD10L6ab64f0OuuNQgF7lyoFrAkwnV3pVzb8YuOoUaFvWECpgJTpg7fixtwXbQtshtKh/auQc5HIMupatFKz2y8JWkQmSj/dF3YhxMY3PxRXn5x/iNx0IfjfczfczDNW6Ir4S7e3V4BKu2CkWgRS4bwfZpuQj8CRuyovawxWvhCsf9i04sR8OHDEBRwPpOK9nAPpHxOseRbUOjImqrmz5aa6Xbm3S/xCQDQ2obIlHOgaFiKfHgcQfR6TBvR8VR09eWxSb/NdqSQHY1dOs5/HmSWydZEq9TLJAsEJdjOTb9u3KwgDK6BVUHt70ALGIABWmNjMYkI9joMEgXUyQNsjttpgibrycDAFE/aVlwSwmqbnYIAJzlYfkLjAo7x40kysIPc4u98gVGAAqVmLjWJPwLZxrzRYYObUBNj/Q77N0qJjLwFROBGy2TSyQ9nZhyl7kuuLisEFF2EyK8FIDBw3BFXh04BkIRUUZP/QCfcN/Bxf5wAEEP+IxgKwUNmvJb7nDRQRw+Jxa0HOKpvqj3KInNK5Vrbp/uqtz1JENrm7vClbdLyfNCe6JomjhZyCVLqnxyf5VBSgHyhQm6x8EaQ44Q9rZsnECR5l26dAQolB+iW6c5WKIZEkhecI7WDookKTORaGPauXtAupw84J2BOAAVxjvu6vZis0tZ3Ew0LO0kxOsXPc8JVJI5atnUddx6Qfk+FsS0VEJ2SBL12qUj/c7YvS8VdBDbsg+qHrNlTFvRhsPsYvDlXfoxK6NibX/AcMiDs5wLt4iQNUkTHNXBYkJSlEP5hMVXHt7hkNfZtAo02SHyPMHUzBABQ52O8Xb/5w4TbLKrjQhCkIQ00Ih/Y/WboLRO5WEkbK+hwbIlZ3+6RxzDZp+EjZeT/RZYgfuUhxq7AwevNrqXLB6hgOIYXJtbMKGl8vUnVdXRZddfMpEorchMRU/M+Yqiv1x7uRFix9z30EsCIUNWV7rLC/pM3Jfp6ROu4SQvL72uiS381UgJNDmxh/4XPKSlxG+dnKI0QAU3rKe9cq0eIGQNQPCcfEWAYOk+LPBmDCB0uun1Skcx74cCASvEnFAkepUDxw25N2C/dzovCkYljd+E52n2rPQF9jXCATjx8/8UueNJhoEC/buQFxOZDuWEVmwt5F9rjKiOKeLrIBlfvOPnnf+7OdwraXSxvW/PDd0XFrLLI5cfnpKMUinryDtIju4MPdE5odo1ZQUaVkN9/dWsjVvI0Zu37v/7Vlh3EQpjzXeOIznHJy7bQFammKiVxeQdIQ4ePiiKPYG/EBSyWxK861/OQTQI4e9BjPaycUr5qU1EeQtbIjKCEtydBqCI1JwV5JqiU97YBMMUc7kdj1DoDGYrQ1oqFyqYCRbLYSZfwja3xbrDdbMaNyC32NZj+n3AAORGjiW8cOLSxS9p+z977idmNAffey8YLF/UvTvuZnxCACc5fnMCJwBIkHxwJtAcABorEMGOWH0unIiCEW43jjd8dVv7Jq1a/QJ+YRO0DYmP/GC58FQQhq/X4tXWnWlGtpGs9tSHPDVBm+C/tabsYyq/cgCU6qbVDv6xMNRsTwQWr7qqOrA0Cyr1UmJobR0GwG8+2ebExvw7a8MsiJiJ4qO4rvL2zVTq+6LWgk7CXAEpwvP/mqm1kSacUEE0Qhj+R9cF19kluFbVAhNLr8RvRj/Ecm6HpEQLYi1/YlL1Cklkp+RFdNEr6MqJlXRMwXV4NQS687PsQghL25k5CcIkm0fkebD7TuzKrTE5bQcZ3GUiikBdw9YYUdrYY6nENssh6uctmFqhY3MckMApPSfTam8JJYmsDVGwFDLWmbSPdElk5HEkGhMQIxLZEBXKIYu+F4HM0M5TbbRW511cGg1SgvU56MqQnBQQvQ82T304zle36dLP/xFUHDguisLdU8v4+pdhZvYBfXfTHd+hDVYI3GBNYrlx33Fv+QWH844Ux/MO1yF8umjeT9Ladt30ELiCe4gwBVPY3m23LUx3S7fI9nLMPFL1fcmwHxdUmzecKgREHvmRrIdAgRflqf/bRV2TbaBuk3gEFKa1QfsxR3HzL1R4p9vOVXok7xgYgMCix4deYffHGqdAeMawoviB3p50YOKwnoma6EkF7dWuiYGRxqh0v6rI20MMxuxw+iVQBlTuOi0K+mNLZT9GlzMSU2gadgHIBWoGLSX2OoK/AU2yVdpKKUVRvIKoHPMa87WMMj7hdrH57wMo4PC6J47xwBqj5ojodIRei+xfLLCfdOWHJ2KTsenhuQi9zCkGE/3DBo9aMv01LDHWS+SVm9sOuF0mTvlhwSUXvadFh6lfBxnoBqRRaWFXNiIG9wZijMK76cgXXtAjhRvmP67JU9UF3/ik8Q8gsw1edyWiF24ae2/5/fpZViFZ5mA1+hn5XCMMSQ1ICvkrmUANzWRy1DkMhJHT7z4zmaHUZMJfSSEBqcKQ2TZfwyOcrOYzAq46Cm2r+fa7R3bbm6nQ1nqLcItrwxkeNUHSmVrnXPH/jQtkueafenmQ8mA6yYs9rstC2WyFt9o0WGBnu60Cnvq1mR4OPyhNszvDDUyQ8wzAtkAkHGQlj2tfCl8t1RB1kJU8fvVSWGtA9ydjlmY7ZWG2J/Qc5Bg5B3uu156FyXYq7a4l1uBjeGKBmezukbmWKFqrcCu9xaFuPgJ4YjrOPgmlWZ3nkelarYrEicM+Pk4VrmVWk4SKs5+eEMCwtfGFPTScVRhx6foi90s/NeAnAmdcY+LYg4RV2NQw1o9EX2PtWVg0Lo72zLIBFM92bsHBAVe9vsqab98gyNw5a5tDkDfCFyybYJbv7KSMUTpHP/nZ6adaRFVWAYJfznIHxB5CAWKQ5T1oVTDRwfQDyAdQisWvKCO2x/eqSkpP7UAoKedPzvgzm3DnlE5u6XQeQwxGioKmbHleUHB1rH9ps4fcKzF1dra+JCI/VJgN5VivzbbKVPexUP437boyKDmAHd+EUChILZSmZ+axPPgpQ1LjCTLfYH5+PoVSXQ3FZVB0gWD0LKVLXawjtcZZQx+axa6OBk2nHFHO6qRXiRBJ+lHDLocag71B6aycvw4uZhXoW/63MHRTXz2wW/vIk9ZJcmwPHk8zE4Q6bgArej6qtQN6X1M6ZqILjPWYHQEDPdH9GKsPOwfaHcwtND2bkOqr3NiqIPhhbmEo3Am0v4KA0+erJKRm09ET3EDdQBZymGaYDCwA2YxyJk99h5ynGdytm2H7tF0T2i7v5gQY3RXiWqkPHw8lr2TlB6iTEnk8dSQugVpbezhx88nm8ZISA9Ss/JXJeMiHXysVc8H/qr4+1dfl/2Qj8I8pU4dqw3WFYQGpcTRAkhN6/79Y+iovJFHjGIHqsMJwXai2TB0j8Jfs2ePNBQDcmR2hFdth+MLw9esHDzrjOn26CAWFp86na9ete/V6DqPhjGkn6VXoWEcRtidUHg9BsrgV6Cy3TJEo23WYLH44nisb/i0t/bwGb9XdgxU5itH4hoS9zEJRwufbHhzLx+/v2RS6MJ0ngJJVZG0aQC73Mx4H4JKIqUUfLQT6oz0LgdK3yDH9sXVXSQ0I1VWmR5WhJGqVRl2615U/gEBJz4L+2DHkbaB0PfzRyX0B+TM2GBq+64+GsMGCktk4dgLRHxLRF/mNS2KX+fb18KpOLQR77QgewY3EmZlmL5NqjDhj8CBGRRYXXotw5osU1B9pmUnkBD/z7+vtX9FOLiwk4tzzgCJ2wMMmNW7l0RNmIDyzfCR9ZEzL+UnWCrXHYWeRyy6BfvTjomgIihZ9cIZdRLKy1ynbNnWGP0SLIOimgGfidlq3AbuIKf30GkrUSNMZqmSaQhEdxUDTabYNjDZ5TScXYuENOj35VmyCsMP8ckPtPbtFQvXdAlQVrgoVQYQ6Gu586di+fNG2h6HZdeC3hrohWgP6e31Dpen7E/LWT/mJ6houm2/28tpsDuhjWtDyxD5hqDAibeBB7mXMPkng6ndADqSMQ4ECei4EZt+Vl16bF787G7fu3RuLOzihT8TXW71eOy+BWFABp/W5Zpt2Qm7HfwsKTHlgA2JVh0ZK3ybdagFPMUP7ZrHO2ZPsN4bws3PD1VegePslJ+8RfqeLPNNxOZmgKCAusiYWAvssfDltpzDO6O6Wk+t3OCje7n94Os3eMhxSB3ZJwR+gOsrWzv5xtJ3EXHjwxuCSB1ssTrCF2i/VL/9zsEy0Ok0L5sZRUSgA8lD0P3LU6SKr9QPU3PxjYjjhQd/I3qvJa/ypUZ8E9lY/v4aQH+/syym87Ik1S/bf41Sov03hlT/cyHzyyMch23OBXyHoYaJNl1i1uFNL493VVI/A6/ggrNxze5btmmbTZ1KMmSyjlYFlh4x/kJZiwsvhU4zwj+Cv5njvTc6Z8sG9okB6ieEZWLI+4rerqJjax2BFRXZ//x71mvZ75jejVufyIiLxQV0jLbjaOBNiV1Bg/I6Yq1bPANQpdGzzOEhe3uWZN7a8zeMA2bzLa5jcUzvYBpN2QN/6ZuudDJZmZBywi8qNvDrgSpSnaf0SSfFdpUYX/fJkdgKbmkJT5XIjRpXCqLlkhomV1tBv9Pj/mPyzRVjapNceOFco5InZ8ckByqBshcxHjLPz4Ugh3XN8E5O8Uk8C/Ns5fAXcXHbX5B/p1ivY5gi08qylvGzLnd9C6X1HieGEc1ILYTQu6385ZilPh96Y5pCCKuWi9+zX//B4OsDUNJGXRsoLEDhX8EQe018fK8C1izN7Ugx/7u69/UKx/ZcXuuk8of83LsskDWJ+S9l0nDI7wC1ZByLLvqcQiwKZhuhwDfGGQZpvVWt/ruTeOypMhG0UuL+zTMVcJ76zyEdLfonUWVW4+8XQxfERUkLxBvZ3di8qKjsCsDe+acL32nCXBkc7cYvnj6657azDaToZmUhrC76axJd9k7BLutZaNG6WYCW2wKauSG/+42FEc1bt9fs8HLd+YaXx5t+4eUzuPlZqgp8TeUpN+sY+meCKbS7qgEi26b+64L8djz//Pm2KB2C787aGFvQdjGWfTfD80RWu33efpbNU2NTO4U9+tf1c08G/f2j9dt9vx+7l7M3hKXa0xQqxEkcS9fuqyzUbd7rqU9ZW/dvpdcz0NMi2lNkWXzz2cvlLE7rAW4PzPFO6nGKdbGeTC+uw65jr3ztYquseWTpjuOKp9K9N57yWLPM165cuPwO80aB1BU1OibAKpNEJmVZ+ZGW9iUExrEGm4CddY7bWBefoMuDnnVjrrGOBq/Y8UzAhLX/Eiltl2WymErq6mQ/K1Y/qw+rzvNPKPY2HW5ryrhV6FsbaPp08EDxtPnkloh93FlBfvetw/YDG/xDsJzqYLBgG4fqIgnxHkyWrBtmYn+MJ5xN4+1AOMb+ssmxyqyl3C4kNl7WlMaJRYu/EVXoud27TLR7Pro1rx7u1aS6eq2jGJqLETFjTFiELiS1324sHG18LAxlZgv13DS5gl8upjf8RN/PFyx8uBGrj4Lt9EsmbXWCNgJJ9d+Pd5AhBzc43EknfKBwXoF0Ylyzn1zn9VylfuWK3y4bR7xhlDM/ke3ThEpB5/yjFUw8dWmyOcZW4q1LivMQe1SW+oiDtfYEGC+zPOM4rRSn1jPE4JxJd2HCQrxWKwJMIva4pIqKQoNpomRQDrDd/Y3OGbnLH5WB/6mpWNVvybfdgJk5F//LSff+hQxI8/qnso2Wj7D/i770OA0XodDBFJJ22rqZl02rtKmQs3m5hSRoP9Ms5v89cnMQ4A642DfBcMZMXZz5Eyhu5QGvxaY+/uel3zu/P0nVZVM8tkGk2USwmZptCrh5Lx8w8XUwhYrZYnE2ETPs94scs7VJo6UsO1nG+/6VSXiUMRKCgrpD3QjvLlnXx93z/5T733cFBQY12MoeHll6E6k0097VO6kgLJ5Rl68g+d7dsESHPB813To2wX1GNYaGkQcbkGSzDC6/0RSf7OIFAEPQx8CPgNdxH85n8SNk1Wa83795KTHSKLCo4Liwh4OPj3f+BxP7AtIpy7qPMCGwO2xPWpdSU12Wv2TU0dAxZU1d++/qFdWxPbE5E5iNueVpFYGK/iV/DPW+erPdapIzPRPNdZAEfwxKC46Jk0SkYwL7bhlO5y534rqKQjv0dIf39zYkvd8eprDtewZE4L+6+R/evAiJJyi2INJhjfES4xlHevXu80UacyAdjbogs4EpJxPtfLqFLuV64SPjVHlzxNcr7DWZZn6iSM2ck1E9ZZhveU66l7FxdsVeQY2vlktxl7xZtWUFIJWliGXHsnwUA1v/ACKkVlm4izy0uyVa2OYK9Fat3Airqq7IR60bFxq/a+M5PfnOHFBtglkzcHRwM3fz44EvbK9ubdSYVOVc3qZ0P1l8IeJJxwFm96UFyOXrtkf9e3ll9RfpMT8Bf/M7U2fJXEsoya4mSGlZkKjC5J+RWxsXQiJqQaKlZgrndfBOv0drpz6M26NLF7QDaZr59Gyh7cJPj19fwrYX1hZZ3XgsOqkgqqusTmDpg6nJNSyeptKlRIidEe83FlH3u06ey11GUAofHUe96j1hbHGuMt40QvNGYdKeFmTdDNGhqdIXl3I+DANfUy3uA1cQFSigB0kDZsAHzSii768LjBQuQpV+I91bTnelB0oCAeCr9tC7ZEJam5lTLYy0FFCmjkM8tKeY2u8graeJtTPg28TaUWDI5RgXQTiVe2T8m4JWLkMlk/A9RCGgDL4k8PJFLNJFZo4bkltsdN1diqv3Ufop8fgr7QLTKVxAXGmNWU+mk4Cn5gXm04k67ZRGjEHYT4PKKS6L4dBXewf6Oz88pNsK27xrPQK2c6lIZAtU5y+x05hrzAbZpYnsaBkK8/uvGcv2TgH5NxJa67kamZ9IVHviCNzHlRBQWigW2rfL0p1w3sVyI5XtJi7gxnKqUXq+9N97Ss5zdaWl6ouek7vRmbciBy0Bkt1wJToyMxBCyg9NYMoZERUkNKEBSiImEohbLxESz1pg17dEUL/loH9NtKWxtdnlfsyRAnIUrd+ZX+islkO03dUe+QkOYlFDZsuCa4GWgVZtkjgMKDD1zE7JpSeIYbp/w7xyEVxuY9yAbfPcbr8K0ACU5d/vJXIOSkkZ5JNDALpyK4av12/HCXR7mZXhkwtuzxKJ0yaOZ1pQH9c5cWEmI85W0VCqxqdgb5lVisc5XQog7ceSHsXc2QXgaeg2ivAMia1RtaoVzmqtu7aSEI+DCKlHiTqkYFm5PeMs3W8UIFWNajI+t7bkHXSKeU14wKu6tyb26jFDfXZZxhfpHubzKK1nPzfinXhnW8q9gNT04UyN3TXLPihejhagyLUdKdLtRMPezQiXwbRUkKl1JiWNgVhOqEgQ/ew3v/U5IBOH3Ut87e2eZoxs0102WLm+xFhTEPrS1KN99pjgel+SbWRhmI5u4+ZpRxh4TxsJRzE9nprEet/5+HD5mpQm8qjZvFnw2z60T6pf+ABPW4Rqid1halsYfcMzii/eIqh0d0U5sX+q0fVT/jzwq1VyfbgL0Q0tpWWRayhITC3OCJvj5hqTmb/zil3w0P1vglhizESXk8bzgJbig71AKYUtCBVi1PpGVf9ALiVWd5J+H4Ot2ay2Ou/LMYvieX09GCj1dFsRIzo+i3MzEHH/8Gqk11iIrNbNrkueMc/gWRdeIYa2OphMDDn+P/y9bK8VLcpeTBDq5cusv/jnRy6XnMbjonKNzUFG3L4Xp7mZm7vSl8PZmVqg6cylslmYSBwjKC5vdTr06lNX8cGk5Kcj8NAa/SycfB4oaKu62wTDtuPTzpuHFexiacYU5XLqtCfweMv+ydGMLOwLKW3FUpTsQ0AoWtZ+3UcAJRHVAmmw8eBCCGZOTuCE1loTP8xA0/1lUxDuEq+cmIy9v6n27m1Do1v5+Cgjkj4HeCBgCrExUFB+jQitWpDip1jeHAcxJnVQrUtAKjCqKX8/HC/B7JPHxba3ffbSsy4isxDbuXHliQU4JC+Hh0Do/IYko6CDtQoGQ5DGsufL0rLCVF2YLtbWUMnLRngPZ/gQF5owpZbWcIxnqZGzw2jciVjMWV1wyjTHFTHd7JboS5fggD8YmZ6iPxOi+zFjvaeqpF26kqrJQX/dvYmR4KjyTS1tiSQT1lHgmeyoyGOtEX1FZwiHrDSzu2kWLaymlLjrJjo26SmvFdtGIMtk7umZCxFxv711SOjN3zjQ0ju9gUjMR7Z186nccsqGUAE3uGqFoC3I+ORFrcjUUoTvCnyJV7dhQpjTnkeQPQms4uWEW3ylzOTWhGjmJZ77eKfdw1brNvrDOO8rGe2Km5y6au0/M9VDNTDjcmX3UC7jeQqaI3dLCFjGF3lxUpmiLLUsbHyQLDJQFxWtZL11EmYMJuX5aeeDPv9oHxmeQNsZWvn4N5n/IraIfqcQ6tHjbUDO/DRHh5XGOteu+kh7SVkLu+RKfRE5SZP++yGROgo/koAcU7NvR+NX5EX9Ojncucyv1qPA8esRzpUdp0qc+hq3ZHdM+rOkoOyHRq9Sj0LmYGFO1c+vWnVWxpBKnQo9SL4Bi6NPlI1YdW75IQZYJsF2L43MqstfVQDGODxsNcTlDNzB+ovHfAnLPfF4j162bGIJeatT07P6wDQ/UAKbU6yhzFC+aZOXl62bH8vL9eJv69o5sV70JEon+D/hC3yS7HHg6DvK4zqoVyWjFWibSGjv5dolOCc6J/89/HuIMfdBfBcMoQTJKSOxYIPg87A55iOK4jX+HMl7kQRJTtS7puhFPS+4SL0VNtPJa1oEdyfsU+85lLwPOd+7bW7gvc4vuTi+B5Z4xHtFFRbAnl3zPIbQid99fpfHAwexMS8SS5ULl7RyeczQTx1/aa7ukjAHOnIZjiFbLUABj6VicuuIro0M9Jt4PugAvAN5K3nEg68CJVkWgV1jI0XSdSyZOq0715cbuJSxzt7C/f8cZLJt1bt+tm8lSbCy27f0vjpYYgFpmRYyBT58BjLIltr1L+ThmtDMv57ZSuHxJRMsZMwcQX/rXvtyKUIc30UEyHAjPgEfomAnM0mRuDXbY3jPE0374Yuf2H4fWiV3E0srSbfMXQszx+p7u5TeZsCZjtbJjPl50L59jYMeMnu9GHUrI9KVQ10PmAxGd/yKdtdY9CeKXNDrFp9P65kTeaXvLUbxAj4dMCYehSbVd8sjsLPk8mazXdys6izmJnChSGLlzZwyFQ5lbhPCJsrWl5FGbEofmMzp6d3IVFfxgXxkhPpWp8BMeP4zI5Z45w5YnByqD9GoVBaqZoXBzCX6p8H53dZ7E/ka79n7P7px21bQeCm6c/jB98fnF4rMJx+/hRvuBs2cOqKWe098Nh3ROT+PJeOXxVpNJWTjqkjOr+CLIPM1yxtI8aWPv8b3sy5bS8U0Rur/DLkqlEnA0YEGYct6cbpo4Th04MtuPBLFxuD8n9wn2XQabD5svsymu5QuWHZ4SXuYLf0Jm+3E4dhAC6GZ2+nvP3cZWnTIqrbmxTPCoFYli4+h/TGdh36UrzIdPgPFNvsoXvh6bj8s/wCxZsTT/fgLtUSsdh7cR4jAVAM/TpjrdJSVWecnBdFJSaxTSRatk40KruDYmptYg0B7DxherY9N6MqYYxjd7B+4+evhBDssnGjQaGNs221iIawCH6slB0uRRWDRKwLjUSes45cHCwvAUz6Cg9RUHeaacjob/YNOR5eyfuqp0unMhWvNkBoYmHtucGShHwKPgiFq5cosL3oc4fFhEygnV2xgnNIfUDMMH+c74oF0MG+/Mr2kru34d5Wi90hG1e5cH0qH96S2/losat6lY8HDI1YvoqT/pmjuedEsKzJGfZP/OLhoW55ZfrWC8DY8jb3YDjPiGmekTjjg5x2lof7P5ukikkJdUISbGEDJarBKzLfXBClZSEksRrLe8idxUWwxgl0FQxpLfo6OLLUTZVmWTdImU6qDksYkfVcJejI0xHzrmjREeiHEUtYWzmegtFcFJLFZSsMJSn22VmNESQwBReBSTSF18haBNcU7OvilSV+AuOXsWmUPGVEvhUlPf5t9szHREqUu2yklJ/hcFGiywm2U6Ysraz2Yz8pgzDhw4hHZJufjpQ+y2bxuVbjPhjS/derjtO+N3yd8i1BVWyh8IjZk/WsW7aOFqNe2IvL8AR4f7yaksuupIdHTr/3ZDhBPfg4GnYO6nyJdMEK6gn330M/SV5R3P0citfePteodOUICgoQ8G+n7gYAjYfma3I2b54bYXnnA0cnCSEcdpK1eLi7xVyxbImfA/GqtphdQ8hQSGYyJJKf7qGwI9w5hIGFZIqHm0woXV8MyzmOjomoAUBM6a65+VmGczQPcUUXRh90gaf5PEKVHygRc7pmDBWaLmSk0uJztc4XLdmsvNl9doEMqWT55ZxLk0DJyL9/nf0osAU4fZ+z+2nHGEwk5mUVKOH4fgdHl2+M1rRmgX6kixTvdDwkTdd+4XEkTRH0u9OZcqaSuyxi9OTacExb0KTyoqAl5wcmMDEvl1lIqeDHTkQP214HzaiYRHKMj4JFkqog7+0yo5vwD9tIspFEpgIHgcs+p3aXCGVvz+H/LfZtVd5F/N3HPXbKA7GqCgRtdvDnI1m+tXbFbMqKWyohlpXlxWBxif+tDMkJDM0Af3w1bOCiVlhhwWlnlOcoJMLjgv4+9DRwc8FWbhUJ3XYfi6zqt0V2noS2vY/QehxouEngd4lunGH8wxgrVhupJSL9z98HS/fKi1mwPA1p6U32GNuBm8nGmhu2+vrzPsABaWd6N1/VvLVK8E+Ca9gwbP6Y22chwanR601HV4ZxmNOVDEZvwoayehtgQdKiYoMIGbZgRPVgbOnNr/l3v2MwcOHHhuWzLg5sNc16hzAtLkPGYCc75x3bT/9MDfSo6JNN3Qmg/joa8B18y2ukpZuoCq7NXAGvyVERZcnkzkNg8MvGFEfqqJW+44Fcl4MzBgLDxf0WF6oFsZqcBu3I7Hk7Yo4snxnXiaHXWlhFzWwfLWyxIMCoad8wqy2mYOE/qIrKUyL5G2jf2fnK7qOq0WXnxqx0Ot5ruWHCMLLlh8+2h0qoiV1+KjWtWskRHDxfgHO/+0F/BT8aiA8AQLf25vh+H29i9VXXoehKFQIbgFe4bwVX0pTO7l9ppecvMmBKMcRrZqBHBsVj14AIKnpzmRMDSEuxBewufP9yZh2OwphSEAfB/m52F4fv4LZgQ0gantn42AZrcRM4FpW2qMW7c+w5DT49INBAJ5ARGCUHedDm7yPnzeEJzzcOELwZP3J9SqARYeICMICM8qHEFGjEsB9FBaEe2z80FIUNwCwQcDEHxAs+EBmkyDAJpNil8MKRoiW2cUS0SjSy04KQvsLRCZFP18wY4QRUS4RZWwdBYkLGtREWGiiNbQ3p3OYetWhSC2q9MtYhIrG4QGgQbrsdJX24Ygq9i6dE536f1zmim6nsdGD1B1iN83BAs2sKjEKhdHbMyggAjkWYNV/LihCwHkB8l07ZwMbXajlu8sdBVnuz5FYqEr31m7Uey8H9VZ61Trq/NYeibAx5ltDyjNhchbssFXccAqXrJDTROzVNSsBG56H35vTPoebpLMolKlSTcZgYqdS74dR3dnoIJxUyO1qR6OElqqlrtCqJLqLJCR8U037g5htsNSI0Xfpe47COZwmg2FMNFqm8+f6wZ+cvKSncoCUHJ0G50x/MPCZT0ZulxrRr0Q6zajKDIBa9/Scy51usIBCGedLmEEHMqNuNXoXpDiBL/nfT6v1+f7Wlm+ExFG1UA2DSiCwdR2OrlKrNC7gNxJUm0DWWML+yyo63033gjZXZHimR3vHiTH+0x5rKf8z9lrM+78lELdLT/vzUbNn1yCK3I0mFGrbI9W3ToOVI8HAlFT9uFDqqVZsjG5+VB3J31snq1Dx1NK3DAlPeSJ9gbkx9o3FJHe6T4ZsTT5k7nt7YcpWgiqqRjqBAVOf10EC7GUsV9ySk2abmHNeRavikT6JfQmnjW+IqGMnCIJ/y0fNpgSlkhURVN0VW1eXTgYEW8jA5DgwS+DuSQRRoyJb14VXhq6Y2JFnZ0ieQc3fOcuVt/8LC4GCCvtBCt0dXvVZE1AbqU+FMnO4nH0ERF6Do/w++/9/eudGSNAd9qbC0fToh2T7fWM2ieTafF5WLusqHVMX74cirbtj6UdddYVmMOvCjf/cTYBNlcToCbX7V2hw2l4x/DlrMXnrBFoT82mNELHcRhk2KAL1I8Bl9Z0HwYW6AilOd+r0LoQtiq9RBEFBRCcX/BjeIM1lIlyyKk9lBaopT6RNy1wgT0lE2UNhTf8mG9jBgUFogilF2Gr1oW49WH6Q7BodXJaZwTLYpPG88RrSfV+DgI9TJ543KkVe5XzcvDq3vkZ+Jv9yRe7IoqZwfm8qx9uJka0WUxFHkbs2HNGukhzLl/GOZgkOOCA95t9zLerwtxzjDfnnF42Ozwsm5M7B/pIssNyOcsHsdKZxhf3WpeZdbSX6mqgbML5+NqOD37544MHMHyM/TjkHOMiq7HnnkN1edbIXGKcoW7Mn7v3wlp/dNbCC4//H6ZcIHXh4S3BUxo/VfHfbZftIK8wxQ7pQsChQ3fLRsTe/hx3p//uHHkYRuHC7tDa38vSFcDYeg+2i+Y4jaGES975NK6KY4BLO79uqlr0GXRqofosVv0ehuZA5UHZDpXzpdnFlkdCdQA4nSFb+JovQrqC8AJfl5aZbb0WyhFm54eWRNQrAU9WH1ESmp8tzIEid3Z2wvAh/Ip0RcTmRbX4v6eyuMVxsv37w0AREf8wtn05f6fdjJvI3xE5qdlXrZPEoLLFkPiAuIzijNspo2qgPLBLY0AW0xF6MjNfGhqi7vu8tsBquMBFj8ofAZU1xjkNPaZyuUob56HL+qo0DXaxjcATdNxanWffGI1eqabofOOOHKJ9E9ihzONifVR1lCHnkgq7D1K/et+s49NZXWwLQVy6BzcqKtk7+4THeyj0NUqradkPpocDD5Jd2kVtev18pHGXwMU+KYGOBIFKQjObaPuAwuEeCt9tXu+PuSv/nPQyjoVJkJVihE0jJcjoQYZHB7K7opsMRZXCOOnidcAi76dEGAZm6xZIeAxJYaBuHlaBgV8l9VPo6Z3xfpzdst2lMda1RnDwT6S+pX/tYhxq7968pcYVYZeDglnb9m5ki+FizCDmAZjZurAZPRKNPtM3/Nv5d4uKIBBWWstJawkWrVqFr8riYihFR9XTVuY1u1xBaNZrGP74nusW3XRotCNMsnOFIa3BeJXXpCXg4nHXAVF+lZmu2UHKgOR4dgScbBrE1LPywHiu1keurNVGHk0QfkeF+0lCi+GFpP17/ZAPm+f2YMs7sUF+AG3KNaZHcohnZMPphtl/vyoJW9+0B4nE/jJyqkriF0sMgjp+DMoLri0MO3BHJqAhSEcdV4DxWT1IiwwSxhAlpCExKZb4/jsEe4BSl9wLeqeXs3cTwzt+SjLJdeF+LXVpmsN5tz4eh/ZNLlRRIqt9rBDqRrV6hELXLb/VwPHLCuAeQ+A58rdVF0bnP3/+OghUUvL+ipw0RAB5GwBdg1OZzNQi5lRotqsMFyt+QL8A459P1YR9h7XEvCuoR5Ailt9pFt7sPu3/4KWRPUUnsXqbKC8PusR65kXXebD2LNl/yUI6enST5V+sYDdWQSTrU4gyL0e7E6Dey8BB1fANLd+IfR5Xq6FJ560QdxpB4Mo9eewHylANWYbwTNpUduXqyW5cLu/si5xPtNMQun6V3MgTuoqupyEn2oucS0u/eELBSvSZFy/OpGNEkR//4bmJxAIPrkelQyQvwTcZr60ej9D7BQ1fGSX8ta9+a7I3cZYEo33phxp+kixwwYkytRHnWYEGK+6xxDPe67gBG/iPgf7T8z62nE2YPA955hdLbH4dxCNqamyQKM5n2Waxp6Y1OZq3ulwsXJrdI6QSYskMVuKZwKDzmvbvnxi+c1Se1YwHs+M7w7NE7LAm01eIh5fGGzJwSu+kwTO/4cQ4mSKPpqpJhRn6iHbH89F+Kioll0oL0g6W7+6ytZquD0Y7ev00D63huCtOoGUCLiN8l/agUCF6eDV5rMnNGhNqnIt+9cTXXUs2+rWQyAV+M7LIAB9lPXtQqUSNcXA5ZCT5n/o/5Yet63zh4MzlSgYM4a5cSY6IwA2byNpROLbWn/BhyjD1gXAFVy+42q9az5OqmHnJd1JgiM+FlLWm0qP/b+YKYTVBQ7wV0VVbGWqC9+oPU2JB033s17+9XdSMPqutunP94/zlGj09hZaUREuhTwh0fbQkeope4y/3j+vOVVvlLCKLRsR4OyBtXGoyBn7OGxrqNTp/PfcSR6yIQuSe2DtifVQF8VQmBnN805V7zJy8t0TLyoxagvK+Jd4mvde07fG/sfvuLF/2RfFZsWzZBAh+Of0LPvBveGAKLxWpwKm/2MK6V4GSxlb4WCJts1cj4jYCUFSJbnaYTSMG5CpEZk66FgjKz4NhJvNoz8uHoHiBprZvyM9rini1DUgNr3axOSMBbZ0+g73NHhA2Oj6boaAmJVEVjOz4aGyF/VtheSNUIMgviiiNaspOI6rwra14FTEtuymqNKIoX1AAgdndNM5XoYjn9sFkKUHwUEvtj7vxyLwW0qZl2rC0ELqWzOx718itYZ7S0kPSwrTgUxcjxTxtjNhcZv6LW7jP3lpm/fSeYXpr531uvchn5i7dTDfSdy5cI9DgydX/EnOFuZ+vE2qTkDa2sSvWEq5/zhUCp6sbW+CPhDVrYKimpjWEujAVCov+tC3zKer72jCy7WKtFlvf62tfkW+5rZ162tsWaa8ETWfvCV548zSA9WVWUGL5nx9jztSE8piPfyaWW0FfEMS4GLizhzRZcNUhd2fWNYb8uyN2yaeuG1H5lfvWZiPduJMsyzKtfUk2LmUgQLe0sfHqWBtNTs74zYyM3KDPO28suMtNTh6dpLHRVydbs6aj4+yZsbmxBFf+DtYB4die2l+DwSlraTKSydIEVQt/8qeGmBQ5LhF68jwyC1cIG7x5OOESCeN3b/xMMACHK/qUWIIIn7XBOmGi9zz/FZLiLsRmWwiPUkszZ11WK4ZfInQ6BmX8EgLeYD0yJR8Qb2+TNsUeHbESJCB6+yT7jAN54VH0ngvBd31M98sSz9bvSEXMgGiIww9LZdCSi6MEcHQsLqN/+4um8PrIZtNhNO31o7P38P4cqV0ixq+Mzf75/OmuXVM7UmMbJM2mow4eSWDBhhnJa9L8aGI0kkef4gvDeyZUrfApntbJ2bl2chSxopvvGGSkcRDLZ3sQO5xNz11NEEk7L25eDdIC4uMDg3JqJxl9C47X5qAtTvzzXtJs86NLUEEkXdWF9jqK7UP6+qgz0ObQVQWclDMbcxnKgkjXIMeGmxlducXl+KUPkqYU2pFSHR+gAZzGYyg/viYgXh4UpAfZc9LpwXJPRTzJTNI8cdclKJnGUOKXW3zbwO0FBsmocUGBcelvUgqNO7phlZhMcwlCN6QApCasNE3xETc3xqI7ZnxAGgDVAv1wEJpxeB1vC49Yn8ukqLPz0kXtV8dXKjTsehgp0YXJjlFRnFMCbQqlHNM5fqyT4GS+QwDoVfeRfHyLZsv7BaprEUTfWZ8S5HBkw6tXdB3XJ15z6FXnlBZAWh+xloOcLrRO+rAYw1nnNeyVsExdx4lZ/GCdRBced1QYk4wHbBNSCTEUSZeEQohZ/m2mTDEXReZ+Rj0aOvLa64iXc+HzqkXXmLg8bF5cS4tVzwudj4RfI/Rr10wQw8XeSSyzgrusMm9U3CXm8GjaOVZdVvCj/A4X+1p70oZf0wv3CqF30ZFXw0mPZ3PqYIgwAJ1IOQQmFduDxrH/wNAQtF0xeYiSiA4IER6UY/IuILG152TDiAbmvVLXKeKK/STpzmARcQxgtaVx3BpVmQ5VXtG+/il+v1PDoVT/rk7IgFLD1TPG8Y/29arKdFA1uiGHrmwqRgBtsh6DaftnqVbHfvqUj8zlpmSx4k0PsQyOkfULlVqu0Qrr2PsS/v3g7N4D++7zIyS8Zj9+vhTAGcplcd3jPOSqiuZUquQece5cFgwfz5temD7rOdVPfPC3sOjtZ7ZQqyl/+JBNr6UjxriHMRYWbPbHj+Y9aCIPD5lD21S5T09hcDCb3bPc09MS/m8tOSPiWY9Taz08nLkYixQjsqiFWiVQoQhF4xMHgtBny57KR6eAjC3d19/PgCp8iGTPW/6IXpBaqgOQGCqPydCug64HbM9jbqFt1TvmW2pczrqeplivH6BZI3HvxpBFBIRJuaYH0bS93gcO99fnMv2I+tC6KX428nPM5wdvL+cLduvNBzUX9oX/THfCnV1n5Nqe8sHN7fEktKYzRSyW/trgysCeuhRtnwfFOrD9kZiX6/dOJU52E71fn5pP1+gl6xi2pxKxhkupcGx9qf/MTTXNPXW6AmHrCdtUPWGHuK13rpeDq6twuI/r9ba6Wu+p9LxFAqqPWKb3emyvNg9V6GBN2oKECY89RKXq9apXkEl0dO1VrbVKiVVY9e4N/97oXnjKqb3iB042FyXaK5prFCCEMQIlUojriEHDmNjDCJL2SBKGpUwg7a9xsxMsYcvebbG6GdT1jNocInGcQfZbkH9XxNv17xG7oMY8riUp+l2ygOB/AGEZH3HwDlOt7YsUwh3ByI4D67C21c/1zEtqr191RKpdncR/sc0BS0izU72LHVGKtz+tzjdCktORqj5E9SvjlXhmEJIzijRjUDQkR4nwPdqIkfMfrRFJ6gWYhGQEstasv6vnFpjkQ+lvYEXhVd/Sd7rOdVVHEbZa7DYJV/+0GxCtcHVc9t6cFs0Z+6McIFT4dS47TIo9+G8BxBkG6ZjdQZ1l94nYrXvu58XbVlfwszO5TVpKM0yY27/BpogRfespJbdRgqpZEJB6r/rVYyarhb3LInJvdKjFbQ77Rp3RNoeOzFgkoVX2oXqUHhfLp/KlmKWZna3e1WTlrt/IvKfqU7NRzXRRanchmDDVqEuVB+VCa7qSDqoS+4dQ2rKS+anWzWI8KbNG1eaIDMc6atvcgArqp9QZZSF95lFwxyLNJ0fUNC+s1Nqh26S4O5URb7ZAZ19pJpvTW7qhZdFzsH73jET3CqnvHUSNFuCaDSAyTZrdTlJ92gp4VfZORarPrJatEmaLNS29senutvfGcydb/4PUyhquTsiqTSm9X7WkuTWjve5zbcpPe97F22x2+v//2cu+xnk68EbTl01fgX3cI6Jp6e0jsTXP6CH7G8pAsSZb+Y5oR3BM/W7BJ/bQOpqo7uBr1hXivxNmsuYNtnVqjQdgTg8egBZ62llvz1CtXaVLu0/NsQYhNNLLsv5My1bH6rO54wRUWoh3ydj0GdMyvKumRPe7FThnQYltIHiwNxAgmElgbUPT5sjVDMP10sntZAGCM9LeoiP756TWdw2IzJUi5mqN9ATQ9f/8IXMgbjAr9jTSD+t2hWZQtR/n6kHdnXPJur9xVo4DTfKzlbW3tv1GLM+u+MT7bGf/Z/1LhXfit4brkp1W1iEe3WZjA5hzpNuqATUTVdRdzd1WzXTQUtOfBFb2wN7x8IKkzF8XYcSYPVInlHpq8AXVqYi21Zw6g9eW+ls1zPJ+4Nq8WQX59g4ypae+YMyfJPQpU0pO8clpedHrIWHq7E0Bo6YJhwTsMAQ9+zuQXGp5+l3wznPQo8RNyIhSf6NtyGzjG9+adtubEcONqq6qeKybqdXqnJTF73vYKqsH2YF1X45grb9hHYN13sK2gY4byIn4COf2mPJna2NtuSHRGlsW1Z3AM6gozExezLxllvU9k5FsYwwzPn7KV2WZQwMx+P2U/OTyfzP1CzqwfRT+WH7ZMh5j1da9x3foS9w4vsBIuhzY0D46tkW2MO78I0EAwKOpTzyhGu9tMAbJf5wvIqiby+f6+SmYa3AwzskgpuZLU8/cpY2Bta3ttZss7RjZdmnXwM5Lh663z3gj8zymEe1AJ/smWuPar5emqX9JM2IXoqV9YZgv7VgjXElXdC116dCfJvtPNbJFEo7/WXArP584ulbW0vOL06qgyw5s/89qBbuH5/bYEzI6yJqGYgGCsYchOt/J/WJjKXLovFyhXszPysFOc25FcoujWuAK34sUfNEZsJY4U5ChgdhK6hcmBui0JOxc1aWqbSG7z4+v9HCjH/EO1LHhaG9f3MrPJ46ua9cWtPvk0qqgu3Iw639BrYPY0QnP7aGU4p6gm4SR1QikkrHz8JCcTC71izFpKSIJSHhEnIWh7oj5WTvEasSRDmoktIhMVc+wPWgZyTGOLzkDMtIlhIzsvCVQzErSx6qJTN+NxMwuTXG0g2xdIXu8ZH68IyVs14IOYjaL2fbyheVF2aPXISGVjcomSqnUGppa/9cV/fGbJ/fq0w8gwoQyXhAlWVE13TAtOyyS3zU9PwijOEmzvCirumm7fhineVm3HUAwgmI4QVI0w3K8IIZFc3aKqumGadmO64Xj8jucH4RRnKRZXpRV3bRdP4zTvKzbfpzX/bwfAEIwgmJ49y0hKZphOV4QJVlRteBZftc0LdtxPT8IozhJs7woq7ppu34Yp3lZt/04r/t5vT+KqunB4XxrLdtxPT8IozhJs7woQ4A5btv1wzgFxjK0bqHTnM/zuh/AGQIiTHqWkZWTV1BUUlZR9V1fT7KGplYmYELRDCaLzcPh5fLxA4hCYilQ1kFhsRxPkhVV0wOwSazO7BzX84MwipM0C3Fmr7Kqm2Bfvr+qH8ZpXtZtBxCMoBhOkBTNsBwviJKsqJpumJbtuN7v7wdhFCdplhdlVTdt1w/jNC/rth/ndT/vB4AQjKAYTpAUzbAcL4iSrKiabpiW7bieH4RRnKRZXpRV3bRdP4zTvKzbfpzX/bzen0q1Vm80W+1Ot9cfDEfjyXQ2XyxX6812tz8cT+fL9XZ/PF/vj1DElMvPM7Nz8wuLS8srq2vrG5tbShvHf9BxuT08vbz9+Pj19ecfQIQJZbwgSrKiarphWrbjen4QRnGSZnlRVnXTdv0wTvOybjsAAkOgMDgCiUJjsDg8gUgiU6inPfmgTT9RNS8eqwSHU4rZg/yRj0jlK+qaULLWF1xjDB60JZe8jK2fnWjReX/L49VEzNgsgFoOcKCzN5V6kZCnqno3W2ZlK6dDGwGwriAWQWtaXznX7/WSyiXW/Ycy1m8Nyj6H/4M2QQvMvJfcJvaf8q8Vqbf6o0T1W/LsRr/hnC9+5buA5M8ij5zrH6UnmeSHTG/0f0iOYvuA5We8y8dWRKS1VvQJMduX9Nk+8ZC9oYci1QmqZ0By0Ln2fKRdxBjvEQWOvTsWhziTzJGBNrH6qUqE4jHBUV4DZ4I2u9XyzwT2/ujYQBxXGULOm0wfA5+l6q3lRskfVCNLQEmTmOWc2QwFrF8bOnBaYmuyFakVa0WaYvzDpSb9Rui00Bv/lVw+zKqTj2o5jtfrUYWExhEUcfAtj8+sKrbsg87PDLAd0rKhzEZCs8s3ztZZAyER0OrzsOFQEp3ODopadwQp46PtbczABRqyeP/3dafRizDHiDwj71JqhfdsQ4nF3Z8/IixigHlMra1gZ9RGvw+4M2yKAEFseEeI1nUDq1Io1vQIBKNkIwmc8nnoBdbzr6szWJ0GJ0mYIkfcvAlkz1RFv8lfnJiegfiolDoBF+Tgk/ch0WYE2HXHqX77dotGe1PCzwkBbNn8oEN2LJjbMjjBj729v0rWKjWnIHE0gjEeVxb+ObLtYIyS40yQcaM0M8jwO0J43mgBK8bcyGVGxkbSt11+G5SQjDi2cYayaIlqIPzEMFFr3MG0xCj9uIj5PD11SIapwEn0Pr4LmVAWDIT9XTkjzs2ZYP89DQM8PtySoKn31r0p+2qFGeMrGSNe5m7ZqrEInVMjw2YQ4rwfbwQFgtpwBR2pplbrnxRzeVnV1X4c4pHDrowag2gpLRX3dotuMExs7lsIjth5c3xSRzomjLyGmOOqISRs25tKEO8cEPw4uGqUMGIVisPPMPYKhc4Rx9itLj+O0L2ue5+7wx5ZmCCpmjNE5h0i5gO1Vm8e7cWYzTYToWxAt5rVlmmsFjjE3gGLGx+gfVKw/CjXHRXZCvIUGN3d8cCe+FTLhm0U2zFTKsQQzF+gHMOsaf1QXRMiy2xPuJWrmWkV1Szv0ycf6alhji2lpM2cfWxbwxO2idaXJblOhnVOxzlgODhtI5mNL4pjVc20pW7ZBebzzlBAb6V1/pZ9Qydc1c2kvx1v3RzXER9sPXEGP+bkmBinxRrCWg/qNA0OswyM9m6QYz7UaIblSK0sKG1j4JiOdoDk2erI9JVbYbGLMDiht2iuBR85imRG2xIs6qUxG7qqL3sOh17kXRuS2Hb3ulDwzjHYTYtDgL0joS7yee0jWrZxyvyVMPb94s02pfUXux3Vu/IfBcfVo051EFIiXuH8EqA2xvRHC4xkxd+UAkkX6Q6VZ3FIpvXp1XP9z/5gfwftJLWZwH01Chd+q7LapAwF+yq/Vs2TBoQMgYHqlIevXI6h6kF0cXFhdBBzRmv7QCM0zyBaV8GxxzLIxUeLpgPBsXXQDybNEpHiaMf+YJ5/O5TKKB6JyRAq0reXYjzsuPCLhBw7jfpf3R9Vsu4y6uIwH+yNnhaS+XSAR2rCrpN+SlZlQEmEQ8fZlDC2kiQnMHDsCd2KynxjGGp9LNwpyS79CQsthWSOMbTA2dQQwFNwo+QD7Qu0ULcu2XzI1d7oLD9wDD8z7iqRBJseyALDJ4b92PqRLTEAGypAEBt6+33lvn4fC3ynBWSeizPFJmc4iswMBkUfePO9WfAXsUaySkwIMGXrJ1wKWkST/FOGkPNHNRqRg8aj2BU8puVN8sP9uwZljhOp5wLNx1l3YLvvJagWgfFVzutqnivmU/R63XtIenkiGvD2cH8+w83qr1DoLb3Kml06FHkW+UD0h+nB/i4TbCnNRNIvtzOtGJgMaIxxts/hGhEZyuYTkFRguIPKpnR9Mp80AWvx8L23h1XiGYXtgfurMHo8gnLbHaKYRklrb9mpy4FAkvkIUTuutdNh+foUTXa38Q9tE4I9N0HCuVMHfU8QGW7xCEOdZHO3jknypU24b53jN0foznzSH+hLVYfZYPseC6XeVEmHfFujg7dl9/pELVpBUcj3nVyrqyvLOv+jstcfjNEM2DXIxw/SpM3BSF2+JhydmfrC0nn8N2hpw93p5m06tI2gxCnZ12QSWmfoutq64JpSumnqwsCJmLG3vspx5GDupJ5OCTOIh1cHN62iWdg60JlAOCyoIcfG2fBMYf++I8N8p2AI+nuExog5k8gR+uRjuWBGfB4DlZgChzjeV0iuCUrnCsk62qHLxUEomgYEQ9A7VHE2z9apJ7GhgTnQHCCpfIHGw4l9JuQju5Cw2DWldJlAd+Zoyf3Lto0TzW1DzTQwtvUYdNtMugi21hj43k9txJ85dzu9KIGPoAL3WhHzPdV9QgAeqnGSat9Fxq8cPqfVwY0cnDza1lJAYGCs508Dpv9lXkl09xwapX31D7A0cPMsIi2DZtjhWK5zE2ayrm35Nc8vg45xJ5lr0kC7+ta1aSlOGGHjWKpT29o5urirgjqXj+KZgva/sKNUxn1cy98MHEewKY2zZ475ZQJ3N960k8s+pxAx/52nxj2OQDvL/VJnpu0Y/3mpMhA5+LmzIpPGOO6SGQ2oH3VtQ/r+o3Y872ztdfb2o3EjbdipXBqW/WAs2ExukC4RKGNER53WYoX8ZsJ3MVM3XmUFbp4TCjfSV88kgzJ96X5Xm/dDgU274ZODkDN2DZkwi61nVpGL0dJZ0fBTS0JePaLF5O8hMjrGuKIVOPTqAxS/2NAEfaQ1h5KL+42X6jQ0UetH3w8VTI41go9bxzQJ61b9pxEYWNbxP+7esZLvtrysIsKjZExpEjIgWDoHE4rBu3+tW3wToerMtJEnq5AEcXC0AG3NkA8ehBETOWa6CfK6zUwYCh5tmzYAoXDXGEBe+6pj51zMY3DARCsosYjNcCbnzc+UD08LDrQrhmp9NxtoFuHJTMe+4Kis6G77IIS1g3xeAI6kTc4xI4NeFZLlF2OZIhD2NEmr39eOlyFm1s8n66uJEa+9fHpVeMmVPDhUH5AZaD3r/J0p6eGJQexnvlMyMATbLnzpetLPKKc0JdZeATvs6LbtpUzxZgdJh0+tKqp8Q+eGsWVX9IGBHcfD26lHa3+vhi1Vr+SVhv7eJjHmvnUvUc8WUnw4tk2NJ9hx/OZPCHv77+umwRjncwGJK4fJK+j8aUHmhI/tOcws5JmCEw+V8PL+oYj5HwwwSI4WlUlnoe3+ePx3iZi7jfbvFCwRcNOBXN7pwZHX1JAbZGyiQl7kme0B8wvomXR8T5vaaC6whMXXYK21UDQGtmA7P3MMPzPM1oUmcnwrJTQsuak7ad4t+9ClDAwy+LWcuoJVoE4jYv5v3d4RE+TIfxIkmqPDRMx/AA==) format("woff2");font-display:swap}.ri-arrow-right-line:before{content:"\ea6c"}.ri-arrow-down-line:before{content:"\ea4c"}.ri-arrow-left-line:before{content:"\ea60"}.ri-arrow-up-line:before{content:"\ea76"}.ri-arrow-up-s-line:before{content:"\ea78"}.ri-arrow-right-s-line:before{content:"\ea6e"}.ri-arrow-down-s-line:before{content:"\ea4e"}.ri-arrow-left-s-line:before{content:"\ea64"}.ri-arrow-up-s-fill:before{content:"\ea77"}.ri-arrow-right-s-fill:before{content:"\ea6d"}.ri-arrow-down-s-fill:before{content:"\ea4d"}.ri-arrow-left-s-fill:before{content:"\ea63"}.ri-skip-up-line:before{content:"\f367"}.ri-skip-right-line:before{content:"\f365"}.ri-skip-down-line:before{content:"\f361"}.ri-skip-left-line:before{content:"\f363"}.ri-skip-up-fill:before{content:"\f366"}.ri-skip-right-fill:before{content:"\f364"}.ri-skip-down-fill:before{content:"\f360"}.ri-skip-left-fill:before{content:"\f362"}.ri-arrow-up-down-line:before{content:"\ea74"}.ri-arrow-left-right-line:before{content:"\ea62"}.ri-arrow-up-wide-line:before{content:"\f498"}.ri-arrow-down-wide-line:before{content:"\f492"}.ri-corner-up-left-double-line:before{content:"\f313"}.ri-corner-up-right-double-line:before{content:"\f317"}.ri-arrow-left-double-line:before{content:"\f2e3"}.ri-arrow-right-double-fill:before{content:"\f2e4"}.ri-expand-up-down-line:before{content:"\f327"}.ri-expand-up-down-fill:before{content:"\f326"}.ri-expand-left-right-line:before{content:"\f323"}.ri-expand-left-right-fill:before{content:"\f322"}.ri-arrow-go-forward-line:before{content:"\ea5a"}.ri-arrow-turn-back-line:before{content:"\f2e7"}.ri-arrow-turn-forward-line:before{content:"\f2e9"}.ri-arrow-go-back-line:before{content:"\ea58"}.ri-home-line:before{content:"\ee2b"}.ri-home-fill:before{content:"\ee26"}.ri-home-4-line:before{content:"\ee1d"}.ri-home-4-fill:before{content:"\ee1c"}.ri-home-smile-2-line:before{content:"\ee2d"}.ri-home-smile-2-fill:before{content:"\ee2c"}.ri-building-2-line:before{content:"\eb09"}.ri-building-2-fill:before{content:"\eb08"}.ri-ancient-gate-line:before{content:"\ea32"}.ri-ancient-gate-fill:before{content:"\ea31"}.ri-store-2-line:before{content:"\f1a5"}.ri-store-2-fill:before{content:"\f1a4"}.ri-mail-unread-line:before{content:"\ef02"}.ri-mail-check-line:before{content:"\eeee"}.ri-mail-send-line:before{content:"\eefc"}.ri-mail-open-line:before{content:"\eefa"}.ri-mail-open-fill:before{content:"\eef9"}.ri-mail-send-fill:before{content:"\eefb"}.ri-mail-unread-fill:before{content:"\ef01"}.ri-mail-check-fill:before{content:"\eeed"}.ri-mail-add-line:before{content:"\eeec"}.ri-mail-add-fill:before{content:"\eeeb"}.ri-mail-close-line:before{content:"\eef0"}.ri-mail-close-fill:before{content:"\eeef"}.ri-inbox-archive-line:before{content:"\ee4d"}.ri-inbox-archive-fill:before{content:"\ee4c"}.ri-cloud-off-line:before{content:"\eb9f"}.ri-cloud-off-fill:before{content:"\eb9e"}.ri-cloud-fill:before{content:"\eb9c"}.ri-cloud-line:before{content:"\eb9d"}.ri-inbox-unarchive-line:before{content:"\ee51"}.ri-inbox-unarchive-fill:before{content:"\ee50"}.ri-attachment-line:before{content:"\ea86"}.ri-attachment-fill:before{content:"\ea85"}.ri-profile-line:before{content:"\f02d"}.ri-profile-fill:before{content:"\f02c"}.ri-archive-2-line:before{content:"\f3a7"}.ri-archive-2-fill:before{content:"\f3a6"}.ri-at-line:before{content:"\ea83"}.ri-award-fill:before{content:"\ea89"}.ri-medal-fill:before{content:"\ef27"}.ri-medal-2-fill:before{content:"\ef25"}.ri-verified-badge-fill:before{content:"\f3e8"}.ri-verified-badge-line:before{content:"\f3e9"}.ri-archive-stack-line:before{content:"\f428"}.ri-archive-stack-fill:before{content:"\f427"}.ri-bar-chart-grouped-line:before{content:"\ea9b"}.ri-bar-chart-grouped-fill:before{content:"\ea9a"}.ri-bar-chart-2-line:before{content:"\ea96"}.ri-bar-chart-2-fill:before{content:"\ea95"}.ri-bar-chart-line:before{content:"\ea9e"}.ri-bar-chart-fill:before{content:"\ea99"}.ri-bookmark-line:before{content:"\eae5"}.ri-bookmark-fill:before{content:"\eae4"}.ri-calendar-check-line:before{content:"\eb23"}.ri-calendar-close-line:before{content:"\f38e"}.ri-calendar-event-line:before{content:"\eb25"}.ri-calendar-2-line:before{content:"\eb21"}.ri-flag-2-line:before{content:"\ed39"}.ri-triangular-flag-line:before{content:"\f54a"}.ri-triangular-flag-fill:before{content:"\f549"}.ri-flag-2-fill:before{content:"\ed38"}.ri-global-line:before{content:"\edcf"}.ri-global-fill:before{content:"\edce"}.ri-honour-line:before{content:"\ee35"}.ri-honour-fill:before{content:"\ee34"}.ri-customer-service-line:before{content:"\ec0e"}.ri-customer-service-fill:before{content:"\ec0d"}.ri-calendar-schedule-line:before{content:"\f3f3"}.ri-calendar-schedule-fill:before{content:"\f3f2"}.ri-links-line:before{content:"\eeb8"}.ri-printer-line:before{content:"\f029"}.ri-printer-fill:before{content:"\f028"}.ri-reply-line:before{content:"\f07a"}.ri-reply-fill:before{content:"\f079"}.ri-send-plane-line:before{content:"\f0da"}.ri-send-plane-fill:before{content:"\f0d9"}.ri-stack-line:before{content:"\f181"}.ri-stack-fill:before{content:"\f180"}.ri-shake-hands-line:before{content:"\f3ab"}.ri-shake-hands-fill:before{content:"\f3aa"}.ri-copyright-line:before{content:"\ebe2"}.ri-copyright-fill:before{content:"\ebe1"}.ri-megaphone-line:before{content:"\f385"}.ri-megaphone-fill:before{content:"\f384"}.ri-pass-valid-line:before{content:"\f38b"}.ri-pass-valid-fill:before{content:"\f38a"}.ri-pass-pending-line:before{content:"\f389"}.ri-pass-pending-fill:before{content:"\f388"}.ri-pass-expired-line:before{content:"\f387"}.ri-pass-expired-fill:before{content:"\f386"}.ri-id-card-line:before{content:"\f4e9"}.ri-id-card-fill:before{content:"\f4e8"}.ri-chat-3-line:before{content:"\eb51"}.ri-chat-3-fill:before{content:"\eb50"}.ri-chat-2-line:before{content:"\eb4f"}.ri-chat-2-fill:before{content:"\eb4e"}.ri-message-3-line:before{content:"\ef46"}.ri-message-3-fill:before{content:"\ef45"}.ri-message-2-line:before{content:"\ef44"}.ri-message-2-fill:before{content:"\ef43"}.ri-chat-unread-line:before{content:"\f52a"}.ri-chat-unread-fill:before{content:"\f529"}.ri-chat-smile-2-line:before{content:"\eb6f"}.ri-chat-smile-2-fill:before{content:"\eb6e"}.ri-chat-smile-line:before{content:"\eb73"}.ri-chat-smile-fill:before{content:"\eb72"}.ri-discuss-fill:before{content:"\ec39"}.ri-discuss-line:before{content:"\ec3a"}.ri-chat-history-line:before{content:"\eb61"}.ri-chat-history-fill:before{content:"\eb60"}.ri-video-chat-line:before{content:"\f27e"}.ri-video-chat-fill:before{content:"\f27d"}.ri-chat-voice-fill:before{content:"\eb76"}.ri-chat-voice-line:before{content:"\eb77"}.ri-speak-fill:before{content:"\f36e"}.ri-speak-line:before{content:"\f36f"}.ri-edit-2-line:before{content:"\ec80"}.ri-edit-2-fill:before{content:"\ec7f"}.ri-quill-pen-line:before{content:"\f04a"}.ri-quill-pen-fill:before{content:"\f049"}.ri-sip-line:before{content:"\f13e"}.ri-sip-fill:before{content:"\f13d"}.ri-markup-line:before{content:"\ef20"}.ri-markup-fill:before{content:"\ef1f"}.ri-edit-box-line:before{content:"\ec82"}.ri-edit-box-fill:before{content:"\ec81"}.ri-brush-line:before{content:"\eb01"}.ri-brush-fill:before{content:"\eb00"}.ri-brush-2-fill:before{content:"\eafa"}.ri-brush-2-line:before{content:"\eafb"}.ri-paint-brush-line:before{content:"\efc1"}.ri-paint-brush-fill:before{content:"\efc0"}.ri-drop-line:before{content:"\ec6a"}.ri-drop-fill:before{content:"\ec69"}.ri-blur-off-line:before{content:"\eace"}.ri-blur-off-fill:before{content:"\eacd"}.ri-color-filter-line:before{content:"\f42f"}.ri-color-filter-fill:before{content:"\f42e"}.ri-crop-line:before{content:"\ec02"}.ri-artboard-2-line:before{content:"\ea7a"}.ri-paint-line:before{content:"\efc3"}.ri-paint-fill:before{content:"\efc2"}.ri-palette-line:before{content:"\efc5"}.ri-palette-fill:before{content:"\efc4"}.ri-pantone-line:before{content:"\efc7"}.ri-pantone-fill:before{content:"\efc6"}.ri-magic-line:before{content:"\eeea"}.ri-magic-fill:before{content:"\eee9"}.ri-anticlockwise-line:before{content:"\ea3c"}.ri-anticlockwise-fill:before{content:"\ea3b"}.ri-tools-line:before{content:"\f21b"}.ri-tools-fill:before{content:"\f21a"}.ri-clockwise-line:before{content:"\eb95"}.ri-clockwise-fill:before{content:"\eb94"}.ri-drag-drop-line:before{content:"\ec5e"}.ri-drag-drop-fill:before{content:"\ec5d"}.ri-hammer-fill:before{content:"\edee"}.ri-hammer-line:before{content:"\edef"}.ri-circle-line:before{content:"\f3c2"}.ri-circle-fill:before{content:"\f3c1"}.ri-code-line:before{content:"\eba9"}.ri-code-fill:before{content:"\eba8"}.ri-terminal-line:before{content:"\f1f8"}.ri-terminal-fill:before{content:"\f1f7"}.ri-cursor-line:before{content:"\ec0a"}.ri-cursor-fill:before{content:"\ec09"}.ri-smartphone-line:before{content:"\f15a"}.ri-computer-line:before{content:"\ebca"}.ri-mac-line:before{content:"\eee6"}.ri-macbook-line:before{content:"\eee8"}.ri-phone-line:before{content:"\efec"}.ri-phone-fill:before{content:"\efe9"}.ri-device-line:before{content:"\ec2e"}.ri-tablet-line:before{content:"\f1e0"}.ri-database-2-line:before{content:"\ec16"}.ri-database-2-fill:before{content:"\ec15"}.ri-server-line:before{content:"\f0e0"}.ri-server-fill:before{content:"\f0df"}.ri-hard-drive-fill:before{content:"\edfa"}.ri-hard-drive-line:before{content:"\edfb"}.ri-qr-scan-2-line:before{content:"\f03f"}.ri-qr-scan-line:before{content:"\f041"}.ri-qr-code-line:before{content:"\f03d"}.ri-barcode-line:before{content:"\eaa2"}.ri-shut-down-line:before{content:"\f126"}.ri-fingerprint-line:before{content:"\ed31"}.ri-bluetooth-line:before{content:"\eacc"}.ri-wifi-line:before{content:"\f2c0"}.ri-wifi-off-line:before{content:"\f2c2"}.ri-rss-line:before{content:"\f09f"}.ri-rss-fill:before{content:"\f09e"}.ri-gps-line:before{content:"\eddb"}.ri-gps-fill:before{content:"\edda"}.ri-dashboard-3-line:before{content:"\ec12"}.ri-dashboard-3-fill:before{content:"\ec11"}.ri-file-2-line:before{content:"\ecc3"}.ri-file-2-fill:before{content:"\ecc2"}.ri-sticky-note-add-line:before{content:"\f466"}.ri-sticky-note-add-fill:before{content:"\f465"}.ri-file-list-line:before{content:"\ecf1"}.ri-file-list-fill:before{content:"\ecf0"}.ri-file-text-line:before{content:"\ed0f"}.ri-file-text-fill:before{content:"\ed0e"}.ri-file-list-3-line:before{content:"\ecef"}.ri-file-list-3-fill:before{content:"\ecee"}.ri-file-copy-line:before{content:"\ecd5"}.ri-file-copy-fill:before{content:"\ecd4"}.ri-clipboard-line:before{content:"\eb91"}.ri-clipboard-fill:before{content:"\eb90"}.ri-survey-line:before{content:"\f1c7"}.ri-survey-fill:before{content:"\f1c6"}.ri-article-line:before{content:"\ea7e"}.ri-article-fill:before{content:"\ea7d"}.ri-book-marked-line:before{content:"\ead9"}.ri-book-marked-fill:before{content:"\ead8"}.ri-todo-line:before{content:"\f217"}.ri-todo-fill:before{content:"\f216"}.ri-file-marked-line:before{content:"\ecf5"}.ri-file-marked-fill:before{content:"\ecf4"}.ri-book-3-line:before{content:"\ead5"}.ri-book-3-fill:before{content:"\ead4"}.ri-book-open-line:before{content:"\eadb"}.ri-book-open-fill:before{content:"\eada"}.ri-folder-add-line:before{content:"\ed5a"}.ri-folder-add-fill:before{content:"\ed59"}.ri-folder-check-line:before{content:"\f43e"}.ri-folder-check-fill:before{content:"\f43d"}.ri-folder-open-line:before{content:"\ed70"}.ri-folder-open-fill:before{content:"\ed6f"}.ri-folder-line:before{content:"\ed6a"}.ri-folder-fill:before{content:"\ed61"}.ri-align-center:before{content:"\ea25"}.ri-list-check:before{content:"\eeba"}.ri-indent-decrease:before{content:"\ee54"}.ri-indent-increase:before{content:"\ee55"}.ri-list-indefinite:before{content:"\f399"}.ri-attachment-2:before{content:"\ea84"}.ri-link:before{content:"\eeb2"}.ri-hashtag:before{content:"\edfc"}.ri-sketching:before{content:"\f35f"}.ri-wallet-line:before{content:"\f2ae"}.ri-wallet-fill:before{content:"\f2ad"}.ri-bank-card-line:before{content:"\ea92"}.ri-bank-card-fill:before{content:"\ea91"}.ri-price-tag-3-line:before{content:"\f023"}.ri-price-tag-3-fill:before{content:"\f022"}.ri-coupon-line:before{content:"\ebee"}.ri-coupon-fill:before{content:"\ebed"}.ri-price-tag-line:before{content:"\f025"}.ri-price-tag-fill:before{content:"\f024"}.ri-shopping-bag-line:before{content:"\f118"}.ri-shopping-bag-fill:before{content:"\f117"}.ri-shopping-basket-line:before{content:"\f11c"}.ri-shopping-basket-fill:before{content:"\f11b"}.ri-shopping-cart-line:before{content:"\f120"}.ri-shopping-cart-fill:before{content:"\f11f"}.ri-trophy-line:before{content:"\f22f"}.ri-trophy-fill:before{content:"\f22e"}.ri-vip-diamond-fill:before{content:"\f28f"}.ri-vip-diamond-line:before{content:"\f290"}.ri-vip-crown-2-line:before{content:"\f28c"}.ri-vip-crown-2-fill:before{content:"\f28b"}.ri-vip-crown-line:before{content:"\f28e"}.ri-vip-crown-fill:before{content:"\f28d"}.ri-vip-line:before{content:"\f292"}.ri-vip-fill:before{content:"\f291"}.ri-exchange-line:before{content:"\ecad"}.ri-exchange-fill:before{content:"\ecaa"}.ri-exchange-dollar-line:before{content:"\eca9"}.ri-exchange-dollar-fill:before{content:"\eca8"}.ri-money-cny-circle-line:before{content:"\ef61"}.ri-money-cny-circle-fill:before{content:"\ef60"}.ri-copper-coin-line:before{content:"\ebdc"}.ri-copper-coin-fill:before{content:"\ebdb"}.ri-exchange-cny-line:before{content:"\eca7"}.ri-exchange-cny-fill:before{content:"\eca6"}.ri-money-euro-circle-line:before{content:"\ef69"}.ri-money-euro-circle-fill:before{content:"\ef68"}.ri-red-packet-line:before{content:"\f060"}.ri-red-packet-fill:before{content:"\f05f"}.ri-water-flash-line:before{content:"\f2b0"}.ri-water-flash-fill:before{content:"\f2af"}.ri-coin-line:before{content:"\ebb2"}.ri-coin-fill:before{content:"\ebb1"}.ri-stock-line:before{content:"\f19d"}.ri-stock-fill:before{content:"\f19c"}.ri-gift-line:before{content:"\edbb"}.ri-gift-fill:before{content:"\edba"}.ri-24-hours-line:before{content:"\ea02"}.ri-24-hours-fill:before{content:"\ea01"}.ri-shopping-bag-4-line:before{content:"\f511"}.ri-shopping-bag-4-fill:before{content:"\f510"}.ri-bowl-line:before{content:"\f42a"}.ri-bowl-fill:before{content:"\f429"}.ri-heart-3-line:before{content:"\ee0b"}.ri-heart-3-fill:before{content:"\ee0a"}.ri-dislike-line:before{content:"\ec3c"}.ri-dislike-fill:before{content:"\ec3b"}.ri-heart-pulse-line:before{content:"\ee11"}.ri-heart-pulse-fill:before{content:"\ee10"}.ri-alipay-line:before{content:"\ea2c"}.ri-android-line:before{content:"\ea36"}.ri-alibaba-cloud-line:before{content:"\f4b8"}.ri-app-store-line:before{content:"\ea3e"}.ri-apple-line:before{content:"\ea40"}.ri-baidu-line:before{content:"\ea8c"}.ri-bilibili-line:before{content:"\eac0"}.ri-chrome-line:before{content:"\eb8d"}.ri-dingding-line:before{content:"\ec32"}.ri-drive-line:before{content:"\ec66"}.ri-dribbble-line:before{content:"\ec64"}.ri-evernote-line:before{content:"\eca3"}.ri-facebook-circle-line:before{content:"\ecbb"}.ri-firebase-line:before{content:"\f4d4"}.ri-flutter-line:before{content:"\ed48"}.ri-github-line:before{content:"\edcb"}.ri-google-line:before{content:"\edd5"}.ri-google-play-line:before{content:"\edd7"}.ri-instagram-line:before{content:"\ee66"}.ri-invision-line:before{content:"\ee6a"}.ri-meta-line:before{content:"\f343"}.ri-qq-line:before{content:"\f03b"}.ri-snapchat-line:before{content:"\f15c"}.ri-tiktok-line:before{content:"\f373"}.ri-twitter-line:before{content:"\f23b"}.ri-wechat-line:before{content:"\f2b6"}.ri-wechat-2-line:before{content:"\f2b4"}.ri-weibo-line:before{content:"\f2ba"}.ri-wechat-pay-line:before{content:"\f2b8"}.ri-whatsapp-line:before{content:"\f2bc"}.ri-zhihu-line:before{content:"\f2d9"}.ri-youtube-line:before{content:"\f2d5"}.ri-map-pin-2-line:before{content:"\ef0a"}.ri-map-pin-2-fill:before{content:"\ef09"}.ri-map-pin-time-line:before{content:"\ef18"}.ri-map-pin-time-fill:before{content:"\ef17"}.ri-pushpin-line:before{content:"\f039"}.ri-pushpin-fill:before{content:"\f038"}.ri-map-pin-user-line:before{content:"\ef1a"}.ri-map-pin-user-fill:before{content:"\ef19"}.ri-rocket-line:before{content:"\f096"}.ri-rocket-fill:before{content:"\f095"}.ri-planet-line:before{content:"\f39f"}.ri-planet-fill:before{content:"\f39e"}.ri-parking-line:before{content:"\efd0"}.ri-parking-fill:before{content:"\efcf"}.ri-road-map-line:before{content:"\f08e"}.ri-road-map-fill:before{content:"\f08d"}.ri-earth-line:before{content:"\ec7a"}.ri-earth-fill:before{content:"\ec79"}.ri-car-line:before{content:"\eb39"}.ri-car-fill:before{content:"\eb38"}.ri-plane-line:before{content:"\f005"}.ri-image-line:before{content:"\ee4b"}.ri-image-fill:before{content:"\ee4a"}.ri-image-circle-line:before{content:"\f413"}.ri-image-circle-fill:before{content:"\f412"}.ri-landscape-line:before{content:"\ee7d"}.ri-landscape-fill:before{content:"\ee7c"}.ri-video-on-line:before{content:"\f51e"}.ri-video-on-fill:before{content:"\f51d"}.ri-video-line:before{content:"\f282"}.ri-video-fill:before{content:"\f281"}.ri-live-line:before{content:"\eec0"}.ri-live-fill:before{content:"\eebf"}.ri-camera-line:before{content:"\eb31"}.ri-camera-fill:before{content:"\eb2e"}.ri-camera-off-line:before{content:"\eb33"}.ri-camera-off-fill:before{content:"\eb32"}.ri-headphone-line:before{content:"\ee05"}.ri-headphone-fill:before{content:"\ee04"}.ri-mic-off-line:before{content:"\ef52"}.ri-mic-off-fill:before{content:"\ef51"}.ri-mic-2-fill:before{content:"\ef4d"}.ri-mic-2-line:before{content:"\ef4e"}.ri-volume-down-line:before{content:"\f29c"}.ri-volume-down-fill:before{content:"\f29b"}.ri-volume-mute-line:before{content:"\f29e"}.ri-volume-mute-fill:before{content:"\f29d"}.ri-volume-up-line:before{content:"\f2a2"}.ri-volume-up-fill:before{content:"\f2a1"}.ri-notification-line:before{content:"\ef9a"}.ri-notification-fill:before{content:"\ef99"}.ri-notification-off-line:before{content:"\ef9c"}.ri-notification-off-fill:before{content:"\ef9b"}.ri-play-circle-line:before{content:"\f009"}.ri-play-circle-fill:before{content:"\f008"}.ri-pause-circle-line:before{content:"\efd6"}.ri-pause-circle-fill:before{content:"\efd5"}.ri-stop-circle-line:before{content:"\f19f"}.ri-stop-circle-fill:before{content:"\f19e"}.ri-equalizer-line:before{content:"\ec9d"}.ri-equalizer-fill:before{content:"\ec9c"}.ri-menu-line:before{content:"\ef3e"}.ri-menu-fill:before{content:"\ef3b"}.ri-apps-line:before{content:"\ea44"}.ri-apps-fill:before{content:"\ea43"}.ri-more-line:before{content:"\ef79"}.ri-more-fill:before{content:"\ef78"}.ri-more-2-line:before{content:"\ef77"}.ri-more-2-fill:before{content:"\ef76"}.ri-star-line:before{content:"\f18b"}.ri-star-fill:before{content:"\f186"}.ri-settings-2-line:before{content:"\f0e4"}.ri-settings-2-fill:before{content:"\f0e3"}.ri-forbid-line:before{content:"\ed95"}.ri-forbid-fill:before{content:"\ed94"}.ri-information-line:before{content:"\ee59"}.ri-information-fill:before{content:"\ee58"}.ri-checkbox-blank-circle-line:before{content:"\eb7d"}.ri-checkbox-blank-circle-fill:before{content:"\eb7c"}.ri-checkbox-line:before{content:"\eb85"}.ri-checkbox-fill:before{content:"\eb82"}.ri-checkbox-indeterminate-line:before{content:"\eb84"}.ri-checkbox-indeterminate-fill:before{content:"\eb83"}.ri-add-box-line:before{content:"\ea0f"}.ri-add-box-fill:before{content:"\ea0e"}.ri-checkbox-circle-line:before{content:"\eb81"}.ri-checkbox-circle-fill:before{content:"\eb80"}.ri-indeterminate-circle-line:before{content:"\ee57"}.ri-indeterminate-circle-fill:before{content:"\ee56"}.ri-add-circle-fill:before{content:"\ea10"}.ri-add-circle-line:before{content:"\ea11"}.ri-close-circle-line:before{content:"\eb97"}.ri-close-circle-fill:before{content:"\eb96"}.ri-radio-button-line:before{content:"\f050"}.ri-radio-button-fill:before{content:"\f04f"}.ri-check-line:before{content:"\eb7b"}.ri-check-double-line:before{content:"\eb79"}.ri-close-line:before{content:"\eb99"}.ri-add-line:before{content:"\ea13"}.ri-checkbox-multiple-line:before{content:"\eb89"}.ri-checkbox-multiple-fill:before{content:"\eb88"}.ri-subtract-line:before{content:"\f1af"}.ri-equal-line:before{content:"\f31f"}.ri-upload-line:before{content:"\f250"}.ri-download-line:before{content:"\ec5a"}.ri-download-cloud-line:before{content:"\ec58"}.ri-upload-cloud-line:before{content:"\f24e"}.ri-login-box-line:before{content:"\eed4"}.ri-logout-circle-line:before{content:"\eedc"}.ri-logout-circle-r-line:before{content:"\eede"}.ri-shield-line:before{content:"\f108"}.ri-shield-fill:before{content:"\f103"}.ri-shield-cross-line:before{content:"\f102"}.ri-shield-cross-fill:before{content:"\f101"}.ri-shield-check-line:before{content:"\f100"}.ri-shield-check-fill:before{content:"\f0ff"}.ri-shield-user-fill:before{content:"\f10b"}.ri-shield-user-line:before{content:"\f10c"}.ri-delete-bin-2-line:before{content:"\ec1e"}.ri-delete-bin-2-fill:before{content:"\ec1d"}.ri-delete-bin-fill:before{content:"\ec29"}.ri-delete-bin-line:before{content:"\ec2a"}.ri-delete-back-2-line:before{content:"\ec1a"}.ri-delete-back-2-fill:before{content:"\ec19"}.ri-lock-password-line:before{content:"\eed0"}.ri-lock-password-fill:before{content:"\eecf"}.ri-lock-2-line:before{content:"\eecc"}.ri-lock-2-fill:before{content:"\eecb"}.ri-lock-unlock-line:before{content:"\eed2"}.ri-lock-unlock-fill:before{content:"\eed1"}.ri-eye-off-line:before{content:"\ecb7"}.ri-eye-line:before{content:"\ecb5"}.ri-eye-fill:before{content:"\ecb4"}.ri-eye-close-line:before{content:"\ecb3"}.ri-eye-close-fill:before{content:"\ecb2"}.ri-eye-off-fill:before{content:"\ecb6"}.ri-search-2-line:before{content:"\f0cd"}.ri-search-2-fill:before{content:"\f0cc"}.ri-zoom-out-line:before{content:"\f2dd"}.ri-zoom-in-line:before{content:"\f2db"}.ri-zoom-in-fill:before{content:"\f2da"}.ri-zoom-out-fill:before{content:"\f2dc"}.ri-share-line:before{content:"\f0fe"}.ri-share-fill:before{content:"\f0f7"}.ri-share-circle-line:before{content:"\f0f6"}.ri-share-circle-fill:before{content:"\f0f5"}.ri-alarm-line:before{content:"\ea1b"}.ri-alarm-fill:before{content:"\ea1a"}.ri-thumb-up-line:before{content:"\f207"}.ri-thumb-up-fill:before{content:"\f206"}.ri-thumb-down-line:before{content:"\f205"}.ri-thumb-down-fill:before{content:"\f204"}.ri-alarm-warning-line:before{content:"\ea1d"}.ri-alarm-warning-fill:before{content:"\ea1c"}.ri-filter-2-line:before{content:"\ed23"}.ri-filter-2-fill:before{content:"\ed22"}.ri-loader-line:before{content:"\eeca"}.ri-loader-fill:before{content:"\eec9"}.ri-loop-right-line:before{content:"\f33f"}.ri-loop-right-fill:before{content:"\f33e"}.ri-loader-4-line:before{content:"\eec6"}.ri-loader-4-fill:before{content:"\eec5"}.ri-reset-right-line:before{content:"\f544"}.ri-user-line:before{content:"\f264"}.ri-user-fill:before{content:"\f25f"}.ri-account-box-line:before{content:"\ea07"}.ri-account-box-fill:before{content:"\ea06"}.ri-user-add-line:before{content:"\f25e"}.ri-user-add-fill:before{content:"\f25d"}.ri-user-minus-fill:before{content:"\f54b"}.ri-user-follow-fill:before{content:"\f260"}.ri-user-follow-line:before{content:"\f261"}.ri-user-minus-line:before{content:"\f54c"}.ri-user-unfollow-line:before{content:"\f278"}.ri-user-unfollow-fill:before{content:"\f277"}.ri-user-shared-fill:before{content:"\f271"}.ri-user-shared-line:before{content:"\f272"}.ri-account-pin-circle-line:before{content:"\ea0d"}.ri-account-pin-circle-fill:before{content:"\ea0c"}.ri-group-line:before{content:"\ede3"}.ri-group-fill:before{content:"\ede2"}.ri-emotion-happy-line:before{content:"\ec8d"}.ri-emotion-happy-fill:before{content:"\ec8c"}.ri-emotion-normal-fill:before{content:"\ec91"}.ri-emotion-normal-line:before{content:"\ec92"}.ri-emotion-unhappy-line:before{content:"\ec96"}.ri-emotion-unhappy-fill:before{content:"\ec95"}.ri-emotion-sad-line:before{content:"\ec94"}.ri-emotion-sad-fill:before{content:"\ec93"}.ri-women-line:before{content:"\f2ce"}.ri-men-line:before{content:"\ef2e"}.ri-star-smile-line:before{content:"\f18f"}.ri-star-smile-fill:before{content:"\f18e"}.ri-sun-line:before{content:"\f1bf"}.ri-sun-fill:before{content:"\f1bc"}.ri-moon-fill:before{content:"\ef72"}.ri-moon-line:before{content:"\ef75"}.ri-lightbulb-line:before{content:"\eea9"}.ri-key-2-line:before{content:"\ee6f"}.ri-key-line:before{content:"\ee71"}.ri-outlet-line:before{content:"\efbc"}.ri-lightbulb-flash-line:before{content:"\eea8"}.ri-t-shirt-line:before{content:"\f1d9"}.ri-t-shirt-fill:before{content:"\f1d8"}.ri-seedling-fill:before{content:"\f0d4"}.ri-seedling-line:before{content:"\f0d5"}.ri-leaf-line:before{content:"\eea3"}.ri-leaf-fill:before{content:"\eea2"}.ri-character-recognition-line:before{content:"\eb47"}.ri-character-recognition-fill:before{content:"\eb46"}.ri-recycle-line:before{content:"\f05e"}.ri-recycle-fill:before{content:"\f05d"}.ri-door-line:before{content:"\ec46"}.ri-door-fill:before{content:"\ec45"}.ri-graduation-cap-line:before{content:"\f333"}.ri-graduation-cap-fill:before{content:"\f332"}.ri-sofa-line:before{content:"\f41e"}.ri-sofa-fill:before{content:"\f41d"}.ri-error-warning-line:before{content:"\eca1"}.ri-error-warning-fill:before{content:"\eca0"}.ri-question-line:before{content:"\f045"}.ri-question-fill:before{content:"\f044"}.ri-spam-3-line:before{content:"\f16b"}.ri-spam-3-fill:before{content:"\f16a"}.ri-prohibited-line:before{content:"\f3a1"}.ri-prohibited-fill:before{content:"\f3a0"}.ri-information-off-line:before{content:"\f4eb"}.ri-information-off-fill:before{content:"\f4ea"}.ri-star-half-line:before{content:"\f188"}.ri-star-half-fill:before{content:"\f187"}.ri-settings-line:before{content:"\f0ee"}.ri-settings-fill:before{content:"\f0ed"}.ri-checkbox-multiple-blank-line:before{content:"\eb87"}.ri-alert-line:before{content:"\ea21"}.ri-alert-fill:before{content:"\ea20"}
\ No newline at end of file
+@font-face{font-family:remixicon;src:url(data:application/font-woff2;base64,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) format("woff2");font-display:swap}
+.ri{
+ font-family: "remixicon";
+}
+.ri-arrow-right-line:before{content:"\ea6c"}.ri-arrow-down-line:before{content:"\ea4c"}.ri-arrow-left-line:before{content:"\ea60"}.ri-arrow-up-line:before{content:"\ea76"}.ri-arrow-up-s-line:before{content:"\ea78"}.ri-arrow-right-s-line:before{content:"\ea6e"}.ri-arrow-down-s-line:before{content:"\ea4e"}.ri-arrow-left-s-line:before{content:"\ea64"}.ri-arrow-up-s-fill:before{content:"\ea77"}.ri-arrow-right-s-fill:before{content:"\ea6d"}.ri-arrow-down-s-fill:before{content:"\ea4d"}.ri-arrow-left-s-fill:before{content:"\ea63"}.ri-skip-up-line:before{content:"\f367"}.ri-skip-right-line:before{content:"\f365"}.ri-skip-down-line:before{content:"\f361"}.ri-skip-left-line:before{content:"\f363"}.ri-skip-up-fill:before{content:"\f366"}.ri-skip-right-fill:before{content:"\f364"}.ri-skip-down-fill:before{content:"\f360"}.ri-skip-left-fill:before{content:"\f362"}.ri-arrow-up-down-line:before{content:"\ea74"}.ri-arrow-left-right-line:before{content:"\ea62"}.ri-arrow-up-wide-line:before{content:"\f498"}.ri-arrow-down-wide-line:before{content:"\f492"}.ri-corner-up-left-double-line:before{content:"\f313"}.ri-corner-up-right-double-line:before{content:"\f317"}.ri-arrow-left-double-line:before{content:"\f2e3"}.ri-arrow-right-double-fill:before{content:"\f2e4"}.ri-expand-up-down-line:before{content:"\f327"}.ri-expand-up-down-fill:before{content:"\f326"}.ri-expand-left-right-line:before{content:"\f323"}.ri-expand-left-right-fill:before{content:"\f322"}.ri-arrow-go-forward-line:before{content:"\ea5a"}.ri-arrow-turn-back-line:before{content:"\f2e7"}.ri-arrow-turn-forward-line:before{content:"\f2e9"}.ri-arrow-go-back-line:before{content:"\ea58"}.ri-home-line:before{content:"\ee2b"}.ri-home-fill:before{content:"\ee26"}.ri-home-4-line:before{content:"\ee1d"}.ri-home-4-fill:before{content:"\ee1c"}.ri-home-smile-2-line:before{content:"\ee2d"}.ri-home-smile-2-fill:before{content:"\ee2c"}.ri-building-2-line:before{content:"\eb09"}.ri-building-2-fill:before{content:"\eb08"}.ri-ancient-gate-line:before{content:"\ea32"}.ri-ancient-gate-fill:before{content:"\ea31"}.ri-store-2-line:before{content:"\f1a5"}.ri-store-2-fill:before{content:"\f1a4"}.ri-mail-unread-line:before{content:"\ef02"}.ri-mail-check-line:before{content:"\eeee"}.ri-mail-send-line:before{content:"\eefc"}.ri-mail-open-line:before{content:"\eefa"}.ri-mail-open-fill:before{content:"\eef9"}.ri-mail-send-fill:before{content:"\eefb"}.ri-mail-unread-fill:before{content:"\ef01"}.ri-mail-check-fill:before{content:"\eeed"}.ri-mail-add-line:before{content:"\eeec"}.ri-mail-add-fill:before{content:"\eeeb"}.ri-mail-close-line:before{content:"\eef0"}.ri-mail-close-fill:before{content:"\eeef"}.ri-inbox-archive-line:before{content:"\ee4d"}.ri-inbox-archive-fill:before{content:"\ee4c"}.ri-cloud-off-line:before{content:"\eb9f"}.ri-cloud-off-fill:before{content:"\eb9e"}.ri-cloud-fill:before{content:"\eb9c"}.ri-cloud-line:before{content:"\eb9d"}.ri-inbox-unarchive-line:before{content:"\ee51"}.ri-inbox-unarchive-fill:before{content:"\ee50"}.ri-attachment-line:before{content:"\ea86"}.ri-attachment-fill:before{content:"\ea85"}.ri-profile-line:before{content:"\f02d"}.ri-profile-fill:before{content:"\f02c"}.ri-archive-2-line:before{content:"\f3a7"}.ri-archive-2-fill:before{content:"\f3a6"}.ri-at-line:before{content:"\ea83"}.ri-award-fill:before{content:"\ea89"}.ri-medal-fill:before{content:"\ef27"}.ri-medal-2-fill:before{content:"\ef25"}.ri-verified-badge-fill:before{content:"\f3e8"}.ri-verified-badge-line:before{content:"\f3e9"}.ri-archive-stack-line:before{content:"\f428"}.ri-archive-stack-fill:before{content:"\f427"}.ri-bar-chart-grouped-line:before{content:"\ea9b"}.ri-bar-chart-grouped-fill:before{content:"\ea9a"}.ri-bar-chart-2-line:before{content:"\ea96"}.ri-bar-chart-2-fill:before{content:"\ea95"}.ri-bar-chart-line:before{content:"\ea9e"}.ri-bar-chart-fill:before{content:"\ea99"}.ri-bookmark-line:before{content:"\eae5"}.ri-bookmark-fill:before{content:"\eae4"}.ri-calendar-check-line:before{content:"\eb23"}.ri-calendar-close-line:before{content:"\f38e"}.ri-calendar-event-line:before{content:"\eb25"}.ri-calendar-2-line:before{content:"\eb21"}.ri-flag-2-line:before{content:"\ed39"}.ri-triangular-flag-line:before{content:"\f54a"}.ri-triangular-flag-fill:before{content:"\f549"}.ri-flag-2-fill:before{content:"\ed38"}.ri-global-line:before{content:"\edcf"}.ri-global-fill:before{content:"\edce"}.ri-honour-line:before{content:"\ee35"}.ri-honour-fill:before{content:"\ee34"}.ri-customer-service-line:before{content:"\ec0e"}.ri-customer-service-fill:before{content:"\ec0d"}.ri-calendar-schedule-line:before{content:"\f3f3"}.ri-calendar-schedule-fill:before{content:"\f3f2"}.ri-links-line:before{content:"\eeb8"}.ri-printer-line:before{content:"\f029"}.ri-printer-fill:before{content:"\f028"}.ri-reply-line:before{content:"\f07a"}.ri-reply-fill:before{content:"\f079"}.ri-send-plane-line:before{content:"\f0da"}.ri-send-plane-fill:before{content:"\f0d9"}.ri-stack-line:before{content:"\f181"}.ri-stack-fill:before{content:"\f180"}.ri-shake-hands-line:before{content:"\f3ab"}.ri-shake-hands-fill:before{content:"\f3aa"}.ri-copyright-line:before{content:"\ebe2"}.ri-copyright-fill:before{content:"\ebe1"}.ri-megaphone-line:before{content:"\f385"}.ri-megaphone-fill:before{content:"\f384"}.ri-pass-valid-line:before{content:"\f38b"}.ri-pass-valid-fill:before{content:"\f38a"}.ri-pass-pending-line:before{content:"\f389"}.ri-pass-pending-fill:before{content:"\f388"}.ri-pass-expired-line:before{content:"\f387"}.ri-pass-expired-fill:before{content:"\f386"}.ri-id-card-line:before{content:"\f4e9"}.ri-id-card-fill:before{content:"\f4e8"}.ri-chat-3-line:before{content:"\eb51"}.ri-chat-3-fill:before{content:"\eb50"}.ri-chat-2-line:before{content:"\eb4f"}.ri-chat-2-fill:before{content:"\eb4e"}.ri-message-3-line:before{content:"\ef46"}.ri-message-3-fill:before{content:"\ef45"}.ri-message-2-line:before{content:"\ef44"}.ri-message-2-fill:before{content:"\ef43"}.ri-chat-unread-line:before{content:"\f52a"}.ri-chat-unread-fill:before{content:"\f529"}.ri-chat-smile-2-line:before{content:"\eb6f"}.ri-chat-smile-2-fill:before{content:"\eb6e"}.ri-chat-smile-line:before{content:"\eb73"}.ri-chat-smile-fill:before{content:"\eb72"}.ri-discuss-fill:before{content:"\ec39"}.ri-discuss-line:before{content:"\ec3a"}.ri-chat-history-line:before{content:"\eb61"}.ri-chat-history-fill:before{content:"\eb60"}.ri-video-chat-line:before{content:"\f27e"}.ri-video-chat-fill:before{content:"\f27d"}.ri-chat-voice-fill:before{content:"\eb76"}.ri-chat-voice-line:before{content:"\eb77"}.ri-speak-fill:before{content:"\f36e"}.ri-speak-line:before{content:"\f36f"}.ri-edit-2-line:before{content:"\ec80"}.ri-edit-2-fill:before{content:"\ec7f"}.ri-quill-pen-line:before{content:"\f04a"}.ri-quill-pen-fill:before{content:"\f049"}.ri-sip-line:before{content:"\f13e"}.ri-sip-fill:before{content:"\f13d"}.ri-markup-line:before{content:"\ef20"}.ri-markup-fill:before{content:"\ef1f"}.ri-edit-box-line:before{content:"\ec82"}.ri-edit-box-fill:before{content:"\ec81"}.ri-brush-line:before{content:"\eb01"}.ri-brush-fill:before{content:"\eb00"}.ri-brush-2-fill:before{content:"\eafa"}.ri-brush-2-line:before{content:"\eafb"}.ri-paint-brush-line:before{content:"\efc1"}.ri-paint-brush-fill:before{content:"\efc0"}.ri-drop-line:before{content:"\ec6a"}.ri-drop-fill:before{content:"\ec69"}.ri-blur-off-line:before{content:"\eace"}.ri-blur-off-fill:before{content:"\eacd"}.ri-color-filter-line:before{content:"\f42f"}.ri-color-filter-fill:before{content:"\f42e"}.ri-crop-line:before{content:"\ec02"}.ri-artboard-2-line:before{content:"\ea7a"}.ri-paint-line:before{content:"\efc3"}.ri-paint-fill:before{content:"\efc2"}.ri-palette-line:before{content:"\efc5"}.ri-palette-fill:before{content:"\efc4"}.ri-pantone-line:before{content:"\efc7"}.ri-pantone-fill:before{content:"\efc6"}.ri-magic-line:before{content:"\eeea"}.ri-magic-fill:before{content:"\eee9"}.ri-anticlockwise-line:before{content:"\ea3c"}.ri-anticlockwise-fill:before{content:"\ea3b"}.ri-tools-line:before{content:"\f21b"}.ri-tools-fill:before{content:"\f21a"}.ri-clockwise-line:before{content:"\eb95"}.ri-clockwise-fill:before{content:"\eb94"}.ri-drag-drop-line:before{content:"\ec5e"}.ri-drag-drop-fill:before{content:"\ec5d"}.ri-hammer-fill:before{content:"\edee"}.ri-hammer-line:before{content:"\edef"}.ri-circle-line:before{content:"\f3c2"}.ri-circle-fill:before{content:"\f3c1"}.ri-code-line:before{content:"\eba9"}.ri-code-fill:before{content:"\eba8"}.ri-terminal-line:before{content:"\f1f8"}.ri-terminal-fill:before{content:"\f1f7"}.ri-cursor-line:before{content:"\ec0a"}.ri-cursor-fill:before{content:"\ec09"}.ri-smartphone-line:before{content:"\f15a"}.ri-computer-line:before{content:"\ebca"}.ri-mac-line:before{content:"\eee6"}.ri-macbook-line:before{content:"\eee8"}.ri-phone-line:before{content:"\efec"}.ri-phone-fill:before{content:"\efe9"}.ri-device-line:before{content:"\ec2e"}.ri-tablet-line:before{content:"\f1e0"}.ri-database-2-line:before{content:"\ec16"}.ri-database-2-fill:before{content:"\ec15"}.ri-server-line:before{content:"\f0e0"}.ri-server-fill:before{content:"\f0df"}.ri-hard-drive-fill:before{content:"\edfa"}.ri-hard-drive-line:before{content:"\edfb"}.ri-qr-scan-2-line:before{content:"\f03f"}.ri-qr-scan-line:before{content:"\f041"}.ri-qr-code-line:before{content:"\f03d"}.ri-barcode-line:before{content:"\eaa2"}.ri-shut-down-line:before{content:"\f126"}.ri-fingerprint-line:before{content:"\ed31"}.ri-bluetooth-line:before{content:"\eacc"}.ri-wifi-line:before{content:"\f2c0"}.ri-wifi-off-line:before{content:"\f2c2"}.ri-rss-line:before{content:"\f09f"}.ri-rss-fill:before{content:"\f09e"}.ri-gps-line:before{content:"\eddb"}.ri-gps-fill:before{content:"\edda"}.ri-dashboard-3-line:before{content:"\ec12"}.ri-dashboard-3-fill:before{content:"\ec11"}.ri-file-2-line:before{content:"\ecc3"}.ri-file-2-fill:before{content:"\ecc2"}.ri-sticky-note-add-line:before{content:"\f466"}.ri-sticky-note-add-fill:before{content:"\f465"}.ri-file-list-line:before{content:"\ecf1"}.ri-file-list-fill:before{content:"\ecf0"}.ri-file-text-line:before{content:"\ed0f"}.ri-file-text-fill:before{content:"\ed0e"}.ri-file-list-3-line:before{content:"\ecef"}.ri-file-list-3-fill:before{content:"\ecee"}.ri-file-copy-line:before{content:"\ecd5"}.ri-file-copy-fill:before{content:"\ecd4"}.ri-clipboard-line:before{content:"\eb91"}.ri-clipboard-fill:before{content:"\eb90"}.ri-survey-line:before{content:"\f1c7"}.ri-survey-fill:before{content:"\f1c6"}.ri-article-line:before{content:"\ea7e"}.ri-article-fill:before{content:"\ea7d"}.ri-book-marked-line:before{content:"\ead9"}.ri-book-marked-fill:before{content:"\ead8"}.ri-todo-line:before{content:"\f217"}.ri-todo-fill:before{content:"\f216"}.ri-file-marked-line:before{content:"\ecf5"}.ri-file-marked-fill:before{content:"\ecf4"}.ri-book-3-line:before{content:"\ead5"}.ri-book-3-fill:before{content:"\ead4"}.ri-book-open-line:before{content:"\eadb"}.ri-book-open-fill:before{content:"\eada"}.ri-folder-add-line:before{content:"\ed5a"}.ri-folder-add-fill:before{content:"\ed59"}.ri-folder-check-line:before{content:"\f43e"}.ri-folder-check-fill:before{content:"\f43d"}.ri-folder-open-line:before{content:"\ed70"}.ri-folder-open-fill:before{content:"\ed6f"}.ri-folder-line:before{content:"\ed6a"}.ri-folder-fill:before{content:"\ed61"}.ri-align-center:before{content:"\ea25"}.ri-list-check:before{content:"\eeba"}.ri-indent-decrease:before{content:"\ee54"}.ri-indent-increase:before{content:"\ee55"}.ri-list-indefinite:before{content:"\f399"}.ri-attachment-2:before{content:"\ea84"}.ri-link:before{content:"\eeb2"}.ri-hashtag:before{content:"\edfc"}.ri-sketching:before{content:"\f35f"}.ri-wallet-line:before{content:"\f2ae"}.ri-wallet-fill:before{content:"\f2ad"}.ri-bank-card-line:before{content:"\ea92"}.ri-bank-card-fill:before{content:"\ea91"}.ri-price-tag-3-line:before{content:"\f023"}.ri-price-tag-3-fill:before{content:"\f022"}.ri-coupon-line:before{content:"\ebee"}.ri-coupon-fill:before{content:"\ebed"}.ri-price-tag-line:before{content:"\f025"}.ri-price-tag-fill:before{content:"\f024"}.ri-shopping-bag-line:before{content:"\f118"}.ri-shopping-bag-fill:before{content:"\f117"}.ri-shopping-basket-line:before{content:"\f11c"}.ri-shopping-basket-fill:before{content:"\f11b"}.ri-shopping-cart-line:before{content:"\f120"}.ri-shopping-cart-fill:before{content:"\f11f"}.ri-trophy-line:before{content:"\f22f"}.ri-trophy-fill:before{content:"\f22e"}.ri-vip-diamond-fill:before{content:"\f28f"}.ri-vip-diamond-line:before{content:"\f290"}.ri-vip-crown-2-line:before{content:"\f28c"}.ri-vip-crown-2-fill:before{content:"\f28b"}.ri-vip-crown-line:before{content:"\f28e"}.ri-vip-crown-fill:before{content:"\f28d"}.ri-vip-line:before{content:"\f292"}.ri-vip-fill:before{content:"\f291"}.ri-exchange-line:before{content:"\ecad"}.ri-exchange-fill:before{content:"\ecaa"}.ri-exchange-dollar-line:before{content:"\eca9"}.ri-exchange-dollar-fill:before{content:"\eca8"}.ri-money-cny-circle-line:before{content:"\ef61"}.ri-money-cny-circle-fill:before{content:"\ef60"}.ri-copper-coin-line:before{content:"\ebdc"}.ri-copper-coin-fill:before{content:"\ebdb"}.ri-exchange-cny-line:before{content:"\eca7"}.ri-exchange-cny-fill:before{content:"\eca6"}.ri-money-euro-circle-line:before{content:"\ef69"}.ri-money-euro-circle-fill:before{content:"\ef68"}.ri-red-packet-line:before{content:"\f060"}.ri-red-packet-fill:before{content:"\f05f"}.ri-water-flash-line:before{content:"\f2b0"}.ri-water-flash-fill:before{content:"\f2af"}.ri-coin-line:before{content:"\ebb2"}.ri-coin-fill:before{content:"\ebb1"}.ri-stock-line:before{content:"\f19d"}.ri-stock-fill:before{content:"\f19c"}.ri-gift-line:before{content:"\edbb"}.ri-gift-fill:before{content:"\edba"}.ri-24-hours-line:before{content:"\ea02"}.ri-24-hours-fill:before{content:"\ea01"}.ri-shopping-bag-4-line:before{content:"\f511"}.ri-shopping-bag-4-fill:before{content:"\f510"}.ri-bowl-line:before{content:"\f42a"}.ri-bowl-fill:before{content:"\f429"}.ri-heart-3-line:before{content:"\ee0b"}.ri-heart-3-fill:before{content:"\ee0a"}.ri-dislike-line:before{content:"\ec3c"}.ri-dislike-fill:before{content:"\ec3b"}.ri-heart-pulse-line:before{content:"\ee11"}.ri-heart-pulse-fill:before{content:"\ee10"}.ri-alipay-line:before{content:"\ea2c"}.ri-android-line:before{content:"\ea36"}.ri-alibaba-cloud-line:before{content:"\f4b8"}.ri-app-store-line:before{content:"\ea3e"}.ri-apple-line:before{content:"\ea40"}.ri-baidu-line:before{content:"\ea8c"}.ri-bilibili-line:before{content:"\eac0"}.ri-chrome-line:before{content:"\eb8d"}.ri-dingding-line:before{content:"\ec32"}.ri-drive-line:before{content:"\ec66"}.ri-dribbble-line:before{content:"\ec64"}.ri-evernote-line:before{content:"\eca3"}.ri-facebook-circle-line:before{content:"\ecbb"}.ri-firebase-line:before{content:"\f4d4"}.ri-flutter-line:before{content:"\ed48"}.ri-github-line:before{content:"\edcb"}.ri-google-line:before{content:"\edd5"}.ri-google-play-line:before{content:"\edd7"}.ri-instagram-line:before{content:"\ee66"}.ri-invision-line:before{content:"\ee6a"}.ri-meta-line:before{content:"\f343"}.ri-qq-line:before{content:"\f03b"}.ri-snapchat-line:before{content:"\f15c"}.ri-tiktok-line:before{content:"\f373"}.ri-twitter-line:before{content:"\f23b"}.ri-wechat-line:before{content:"\f2b6"}.ri-wechat-2-line:before{content:"\f2b4"}.ri-weibo-line:before{content:"\f2ba"}.ri-wechat-pay-line:before{content:"\f2b8"}.ri-whatsapp-line:before{content:"\f2bc"}.ri-zhihu-line:before{content:"\f2d9"}.ri-youtube-line:before{content:"\f2d5"}.ri-map-pin-2-line:before{content:"\ef0a"}.ri-map-pin-2-fill:before{content:"\ef09"}.ri-map-pin-time-line:before{content:"\ef18"}.ri-map-pin-time-fill:before{content:"\ef17"}.ri-pushpin-line:before{content:"\f039"}.ri-pushpin-fill:before{content:"\f038"}.ri-map-pin-user-line:before{content:"\ef1a"}.ri-map-pin-user-fill:before{content:"\ef19"}.ri-rocket-line:before{content:"\f096"}.ri-rocket-fill:before{content:"\f095"}.ri-planet-line:before{content:"\f39f"}.ri-planet-fill:before{content:"\f39e"}.ri-parking-line:before{content:"\efd0"}.ri-parking-fill:before{content:"\efcf"}.ri-road-map-line:before{content:"\f08e"}.ri-road-map-fill:before{content:"\f08d"}.ri-earth-line:before{content:"\ec7a"}.ri-earth-fill:before{content:"\ec79"}.ri-car-line:before{content:"\eb39"}.ri-car-fill:before{content:"\eb38"}.ri-plane-line:before{content:"\f005"}.ri-image-line:before{content:"\ee4b"}.ri-image-fill:before{content:"\ee4a"}.ri-image-circle-line:before{content:"\f413"}.ri-image-circle-fill:before{content:"\f412"}.ri-landscape-line:before{content:"\ee7d"}.ri-landscape-fill:before{content:"\ee7c"}.ri-video-on-line:before{content:"\f51e"}.ri-video-on-fill:before{content:"\f51d"}.ri-video-line:before{content:"\f282"}.ri-video-fill:before{content:"\f281"}.ri-live-line:before{content:"\eec0"}.ri-live-fill:before{content:"\eebf"}.ri-camera-line:before{content:"\eb31"}.ri-camera-fill:before{content:"\eb2e"}.ri-camera-off-line:before{content:"\eb33"}.ri-camera-off-fill:before{content:"\eb32"}.ri-headphone-line:before{content:"\ee05"}.ri-headphone-fill:before{content:"\ee04"}.ri-mic-off-line:before{content:"\ef52"}.ri-mic-off-fill:before{content:"\ef51"}.ri-mic-2-fill:before{content:"\ef4d"}.ri-mic-2-line:before{content:"\ef4e"}.ri-volume-down-line:before{content:"\f29c"}.ri-volume-down-fill:before{content:"\f29b"}.ri-volume-mute-line:before{content:"\f29e"}.ri-volume-mute-fill:before{content:"\f29d"}.ri-volume-up-line:before{content:"\f2a2"}.ri-volume-up-fill:before{content:"\f2a1"}.ri-notification-line:before{content:"\ef9a"}.ri-notification-fill:before{content:"\ef99"}.ri-notification-off-line:before{content:"\ef9c"}.ri-notification-off-fill:before{content:"\ef9b"}.ri-play-circle-line:before{content:"\f009"}.ri-play-circle-fill:before{content:"\f008"}.ri-pause-circle-line:before{content:"\efd6"}.ri-pause-circle-fill:before{content:"\efd5"}.ri-stop-circle-line:before{content:"\f19f"}.ri-stop-circle-fill:before{content:"\f19e"}.ri-equalizer-line:before{content:"\ec9d"}.ri-equalizer-fill:before{content:"\ec9c"}.ri-menu-line:before{content:"\ef3e"}.ri-menu-fill:before{content:"\ef3b"}.ri-apps-line:before{content:"\ea44"}.ri-apps-fill:before{content:"\ea43"}.ri-more-line:before{content:"\ef79"}.ri-more-fill:before{content:"\ef78"}.ri-more-2-line:before{content:"\ef77"}.ri-more-2-fill:before{content:"\ef76"}.ri-star-line:before{content:"\f18b"}.ri-star-fill:before{content:"\f186"}.ri-settings-2-line:before{content:"\f0e4"}.ri-settings-2-fill:before{content:"\f0e3"}.ri-forbid-line:before{content:"\ed95"}.ri-forbid-fill:before{content:"\ed94"}.ri-information-line:before{content:"\ee59"}.ri-information-fill:before{content:"\ee58"}.ri-checkbox-blank-circle-line:before{content:"\eb7d"}.ri-checkbox-blank-circle-fill:before{content:"\eb7c"}.ri-checkbox-line:before{content:"\eb85"}.ri-checkbox-fill:before{content:"\eb82"}.ri-checkbox-indeterminate-line:before{content:"\eb84"}.ri-checkbox-indeterminate-fill:before{content:"\eb83"}.ri-add-box-line:before{content:"\ea0f"}.ri-add-box-fill:before{content:"\ea0e"}.ri-checkbox-circle-line:before{content:"\eb81"}.ri-checkbox-circle-fill:before{content:"\eb80"}.ri-indeterminate-circle-line:before{content:"\ee57"}.ri-indeterminate-circle-fill:before{content:"\ee56"}.ri-add-circle-fill:before{content:"\ea10"}.ri-add-circle-line:before{content:"\ea11"}.ri-close-circle-line:before{content:"\eb97"}.ri-close-circle-fill:before{content:"\eb96"}.ri-radio-button-line:before{content:"\f050"}.ri-radio-button-fill:before{content:"\f04f"}.ri-check-line:before{content:"\eb7b"}.ri-check-double-line:before{content:"\eb79"}.ri-close-line:before{content:"\eb99"}.ri-add-line:before{content:"\ea13"}.ri-checkbox-multiple-line:before{content:"\eb89"}.ri-checkbox-multiple-fill:before{content:"\eb88"}.ri-subtract-line:before{content:"\f1af"}.ri-equal-line:before{content:"\f31f"}.ri-upload-line:before{content:"\f250"}.ri-download-line:before{content:"\ec5a"}.ri-download-cloud-line:before{content:"\ec58"}.ri-upload-cloud-line:before{content:"\f24e"}.ri-login-box-line:before{content:"\eed4"}.ri-logout-circle-line:before{content:"\eedc"}.ri-logout-circle-r-line:before{content:"\eede"}.ri-shield-line:before{content:"\f108"}.ri-shield-fill:before{content:"\f103"}.ri-shield-cross-line:before{content:"\f102"}.ri-shield-cross-fill:before{content:"\f101"}.ri-shield-check-line:before{content:"\f100"}.ri-shield-check-fill:before{content:"\f0ff"}.ri-shield-user-fill:before{content:"\f10b"}.ri-shield-user-line:before{content:"\f10c"}.ri-delete-bin-2-line:before{content:"\ec1e"}.ri-delete-bin-2-fill:before{content:"\ec1d"}.ri-delete-bin-fill:before{content:"\ec29"}.ri-delete-bin-line:before{content:"\ec2a"}.ri-delete-back-2-line:before{content:"\ec1a"}.ri-delete-back-2-fill:before{content:"\ec19"}.ri-lock-password-line:before{content:"\eed0"}.ri-lock-password-fill:before{content:"\eecf"}.ri-lock-2-line:before{content:"\eecc"}.ri-lock-2-fill:before{content:"\eecb"}.ri-lock-unlock-line:before{content:"\eed2"}.ri-lock-unlock-fill:before{content:"\eed1"}.ri-eye-off-line:before{content:"\ecb7"}.ri-eye-line:before{content:"\ecb5"}.ri-eye-fill:before{content:"\ecb4"}.ri-eye-close-line:before{content:"\ecb3"}.ri-eye-close-fill:before{content:"\ecb2"}.ri-eye-off-fill:before{content:"\ecb6"}.ri-search-2-line:before{content:"\f0cd"}.ri-search-2-fill:before{content:"\f0cc"}.ri-zoom-out-line:before{content:"\f2dd"}.ri-zoom-in-line:before{content:"\f2db"}.ri-zoom-in-fill:before{content:"\f2da"}.ri-zoom-out-fill:before{content:"\f2dc"}.ri-share-line:before{content:"\f0fe"}.ri-share-fill:before{content:"\f0f7"}.ri-share-circle-line:before{content:"\f0f6"}.ri-share-circle-fill:before{content:"\f0f5"}.ri-alarm-line:before{content:"\ea1b"}.ri-alarm-fill:before{content:"\ea1a"}.ri-thumb-up-line:before{content:"\f207"}.ri-thumb-up-fill:before{content:"\f206"}.ri-thumb-down-line:before{content:"\f205"}.ri-thumb-down-fill:before{content:"\f204"}.ri-alarm-warning-line:before{content:"\ea1d"}.ri-alarm-warning-fill:before{content:"\ea1c"}.ri-filter-2-line:before{content:"\ed23"}.ri-filter-2-fill:before{content:"\ed22"}.ri-loader-line:before{content:"\eeca"}.ri-loader-fill:before{content:"\eec9"}.ri-loop-right-line:before{content:"\f33f"}.ri-loop-right-fill:before{content:"\f33e"}.ri-loader-4-line:before{content:"\eec6"}.ri-loader-4-fill:before{content:"\eec5"}.ri-reset-right-line:before{content:"\f544"}.ri-user-line:before{content:"\f264"}.ri-user-fill:before{content:"\f25f"}.ri-account-box-line:before{content:"\ea07"}.ri-account-box-fill:before{content:"\ea06"}.ri-user-add-line:before{content:"\f25e"}.ri-user-add-fill:before{content:"\f25d"}.ri-user-minus-fill:before{content:"\f54b"}.ri-user-follow-fill:before{content:"\f260"}.ri-user-follow-line:before{content:"\f261"}.ri-user-minus-line:before{content:"\f54c"}.ri-user-unfollow-line:before{content:"\f278"}.ri-user-unfollow-fill:before{content:"\f277"}.ri-user-shared-fill:before{content:"\f271"}.ri-user-shared-line:before{content:"\f272"}.ri-account-pin-circle-line:before{content:"\ea0d"}.ri-account-pin-circle-fill:before{content:"\ea0c"}.ri-group-line:before{content:"\ede3"}.ri-group-fill:before{content:"\ede2"}.ri-emotion-happy-line:before{content:"\ec8d"}.ri-emotion-happy-fill:before{content:"\ec8c"}.ri-emotion-normal-fill:before{content:"\ec91"}.ri-emotion-normal-line:before{content:"\ec92"}.ri-emotion-unhappy-line:before{content:"\ec96"}.ri-emotion-unhappy-fill:before{content:"\ec95"}.ri-emotion-sad-line:before{content:"\ec94"}.ri-emotion-sad-fill:before{content:"\ec93"}.ri-women-line:before{content:"\f2ce"}.ri-men-line:before{content:"\ef2e"}.ri-star-smile-line:before{content:"\f18f"}.ri-star-smile-fill:before{content:"\f18e"}.ri-sun-line:before{content:"\f1bf"}.ri-sun-fill:before{content:"\f1bc"}.ri-moon-fill:before{content:"\ef72"}.ri-moon-line:before{content:"\ef75"}.ri-lightbulb-line:before{content:"\eea9"}.ri-key-2-line:before{content:"\ee6f"}.ri-key-line:before{content:"\ee71"}.ri-outlet-line:before{content:"\efbc"}.ri-lightbulb-flash-line:before{content:"\eea8"}.ri-t-shirt-line:before{content:"\f1d9"}.ri-t-shirt-fill:before{content:"\f1d8"}.ri-seedling-fill:before{content:"\f0d4"}.ri-seedling-line:before{content:"\f0d5"}.ri-leaf-line:before{content:"\eea3"}.ri-leaf-fill:before{content:"\eea2"}.ri-character-recognition-line:before{content:"\eb47"}.ri-character-recognition-fill:before{content:"\eb46"}.ri-recycle-line:before{content:"\f05e"}.ri-recycle-fill:before{content:"\f05d"}.ri-door-line:before{content:"\ec46"}.ri-door-fill:before{content:"\ec45"}.ri-graduation-cap-line:before{content:"\f333"}.ri-graduation-cap-fill:before{content:"\f332"}.ri-sofa-line:before{content:"\f41e"}.ri-sofa-fill:before{content:"\f41d"}.ri-error-warning-line:before{content:"\eca1"}.ri-error-warning-fill:before{content:"\eca0"}.ri-question-line:before{content:"\f045"}.ri-question-fill:before{content:"\f044"}.ri-spam-3-line:before{content:"\f16b"}.ri-spam-3-fill:before{content:"\f16a"}.ri-prohibited-line:before{content:"\f3a1"}.ri-prohibited-fill:before{content:"\f3a0"}.ri-information-off-line:before{content:"\f4eb"}.ri-information-off-fill:before{content:"\f4ea"}.ri-star-half-line:before{content:"\f188"}.ri-star-half-fill:before{content:"\f187"}.ri-settings-line:before{content:"\f0ee"}.ri-settings-fill:before{content:"\f0ed"}.ri-checkbox-multiple-blank-line:before{content:"\eb87"}.ri-alert-line:before{content:"\ea21"}.ri-alert-fill:before{content:"\ea20"}.ri-home-heart-line:before{content:"\ee2a"}.ri-camera-ai-fill:before{content:"\f567"}.ri-camera-ai-line:before{content:"\f568"}.ri-navigation-line:before{content:"\ef89"}.ri-navigation-fill:before{content:"\ef88"}.ri-time-line:before{content:"\f20f"}.ri-time-fill:before{content:"\f20e"}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/css/tmui.css b/src/uni_modules/tm-ui/css/tmui.css
index 2781972..b3b8088 100644
--- a/src/uni_modules/tm-ui/css/tmui.css
+++ b/src/uni_modules/tm-ui/css/tmui.css
@@ -1,8401 +1 @@
-.uni-input-input[type=password]::-ms-reveal {
- display: none;
-}
-
-.tableHeader .uni-scroll-view::-webkit-scrollbar,
-.tableHeader .uni-scroll-view::-webkit-scrollbar {
- display: none;
-}
-
-.safe-height {
- height: var(--window-bottom);
-}
-
-.safe-top {
- height: var(--window-top);
-}
-
-.safe-statusbar {
- height: var(--status-bar-height);
-}
-
-.blur {
- -webkit-backdrop-filter: blur(10px);
- backdrop-filter: blur(10px);
- background-color: rgba(0, 0, 0, 0.3);
-}
-
-.pointer {
- cursor: pointer;
-}
-
-.pointer:hover {
- opacity: 0.7;
-}
-
-.overflow {
- overflow: hidden;
-}
-
-.overflow-x {
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.overflow-y {
- overflow-x: auto;
- overflow-y: hidden;
-}
-
-.relative {
- position: relative !important;
-}
-
-.absolute {
- position: absolute !important;
-}
-
-.fixed {
- position: fixed !important;
-}
-
-.sticky {
- position: sticky !important;
-}
-
-.fulled-height {
- display: flex;
- align-items: stretch;
-}
-
-.clear {
- clear: both;
-}
-
-.fulled {
- width: 100%;
- display: block;
-}
-
-.fulled-height {
- height: 100%;
- display: block;
-}
-
-.gray-100 {
- filter: grayscale(100%);
-}
-
-.gray {
- filter: grayscale(25%);
-}
-
-.d-inline-block {
- display: inline-block !important;
-}
-
-.d-block {
- display: block;
-}
-
-.vertical-align-top {
- vertical-align: top;
-}
-
-.vertical-align-middle {
- vertical-align: middle;
-}
-
-.vertical-align-bottom {
- vertical-align: bottom;
-}
-
-.wrap {
- white-space: pre-wrap;
- word-break: break-all;
-}
-
-.nowrap {
- white-space: nowrap;
-}
-
-.vertical-align-top {
- vertical-align: top;
-}
-
-.vertical-align-middle {
- vertical-align: middle;
-}
-
-.vertical-align-bottom {
- vertical-align: bottom;
-}
-
-.zIndex-0 {
- z-index: 0;
-}
-
-.zIndex-n0 {
- z-index: 0;
-}
-
-.zIndex-1 {
- z-index: 1;
-}
-
-.zIndex-n1 {
- z-index: 4;
-}
-
-.zIndex-2 {
- z-index: 2;
-}
-
-.zIndex-n2 {
- z-index: 8;
-}
-
-.zIndex-3 {
- z-index: 3;
-}
-
-.zIndex-n3 {
- z-index: 12;
-}
-
-.zIndex-4 {
- z-index: 4;
-}
-
-.zIndex-n4 {
- z-index: 16;
-}
-
-.zIndex-5 {
- z-index: 5;
-}
-
-.zIndex-n5 {
- z-index: 20;
-}
-
-.zIndex-6 {
- z-index: 6;
-}
-
-.zIndex-n6 {
- z-index: 24;
-}
-
-.zIndex-7 {
- z-index: 7;
-}
-
-.zIndex-n7 {
- z-index: 28;
-}
-
-.zIndex-8 {
- z-index: 8;
-}
-
-.zIndex-n8 {
- z-index: 32;
-}
-
-.zIndex-9 {
- z-index: 9;
-}
-
-.zIndex-n9 {
- z-index: 36;
-}
-
-.zIndex-10 {
- z-index: 10;
-}
-
-.zIndex-n10 {
- z-index: 40;
-}
-
-.zIndex-11 {
- z-index: 11;
-}
-
-.zIndex-n11 {
- z-index: 44;
-}
-
-.zIndex-12 {
- z-index: 12;
-}
-
-.zIndex-n12 {
- z-index: 48;
-}
-
-.zIndex-13 {
- z-index: 13;
-}
-
-.zIndex-n13 {
- z-index: 52;
-}
-
-.zIndex-14 {
- z-index: 14;
-}
-
-.zIndex-n14 {
- z-index: 56;
-}
-
-.zIndex-15 {
- z-index: 15;
-}
-
-.zIndex-n15 {
- z-index: 60;
-}
-
-.zIndex-16 {
- z-index: 16;
-}
-
-.zIndex-n16 {
- z-index: 64;
-}
-
-.zIndex-17 {
- z-index: 17;
-}
-
-.zIndex-n17 {
- z-index: 68;
-}
-
-.zIndex-18 {
- z-index: 18;
-}
-
-.zIndex-n18 {
- z-index: 72;
-}
-
-.zIndex-19 {
- z-index: 19;
-}
-
-.zIndex-n19 {
- z-index: 76;
-}
-
-.zIndex-20 {
- z-index: 20;
-}
-
-.zIndex-n20 {
- z-index: 80;
-}
-
-.zIndex-21 {
- z-index: 21;
-}
-
-.zIndex-n21 {
- z-index: 84;
-}
-
-.zIndex-22 {
- z-index: 22;
-}
-
-.zIndex-n22 {
- z-index: 88;
-}
-
-.zIndex-23 {
- z-index: 23;
-}
-
-.zIndex-n23 {
- z-index: 92;
-}
-
-.zIndex-24 {
- z-index: 24;
-}
-
-.zIndex-n24 {
- z-index: 96;
-}
-
-.zIndex-25 {
- z-index: 25;
-}
-
-.zIndex-n25 {
- z-index: 100;
-}
-
-.zIndex-26 {
- z-index: 26;
-}
-
-.zIndex-n26 {
- z-index: 104;
-}
-
-.text-overflow {
- width: 100%;
- display: block;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-.text-overflow-1 {
- width: 100%;
- display: -webkit-box;
- white-space: inherit;
- overflow: hidden;
- -webkit-line-clamp: 1;
- -webkit-box-orient: vertical;
- text-overflow: ellipsis;
-}
-
-.text-overflow-2 {
- width: 100%;
- display: -webkit-box;
- white-space: inherit;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- text-overflow: ellipsis;
-}
-
-.text-overflow-3 {
- width: 100%;
- display: -webkit-box;
- white-space: inherit;
- overflow: hidden;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- text-overflow: ellipsis;
-}
-
-.text-overflow-4 {
- width: 100%;
- display: -webkit-box;
- white-space: inherit;
- overflow: hidden;
- -webkit-line-clamp: 4;
- -webkit-box-orient: vertical;
- text-overflow: ellipsis;
-}
-
-.text-delete {
- text-decoration: line-through;
-}
-
-.text-underline {
- text-decoration: underline;
-}
-
-.text-size-xxs {
- font-size: 20rpx;
-}
-
-.text-size-xs {
- font-size: 22rpx;
-}
-
-.text-size-s {
- font-size: 24rpx;
-}
-
-.text-size-m {
- font-size: 28rpx;
-}
-
-.text-size-n {
- font-size: 30rpx;
-}
-
-.text-size-g {
- font-size: 34rpx;
-}
-
-.text-size-lg {
- font-size: 36rpx;
-}
-
-.text-size-xl {
- font-size: 40rpx;
-}
-
-.text-weight-s {
- font-weight: 100;
-}
-
-.text-weight-n {
- font-weight: 400;
-}
-
-.text-weight-b {
- font-weight: 700;
-}
-
-.text-align-left {
- text-align: left;
-}
-
-.text-align-right {
- text-align: right;
-}
-
-.text-align-center {
- text-align: center;
-}
-
-.round-tl-0 {
- border-top-left-radius: 0rpx !important;
-}
-
-.round-tl-1 {
- border-top-left-radius: 4rpx !important;
-}
-
-.round-tl-2 {
- border-top-left-radius: 8rpx !important;
-}
-
-.round-tl-3 {
- border-top-left-radius: 12rpx !important;
-}
-
-.round-tl-4 {
- border-top-left-radius: 16rpx !important;
-}
-
-.round-tl-5 {
- border-top-left-radius: 20rpx !important;
-}
-
-.round-tl-6 {
- border-top-left-radius: 24rpx !important;
-}
-
-.round-tl-7 {
- border-top-left-radius: 28rpx !important;
-}
-
-.round-tl-8 {
- border-top-left-radius: 32rpx !important;
-}
-
-.round-tl-9 {
- border-top-left-radius: 36rpx !important;
-}
-
-.round-tl-10 {
- border-top-left-radius: 40rpx !important;
-}
-
-.round-tl-11 {
- border-top-left-radius: 44rpx !important;
-}
-
-.round-tl-12 {
- border-top-left-radius: 48rpx !important;
-}
-
-.round-tl-13 {
- border-top-left-radius: 52rpx !important;
-}
-
-.round-tl-14 {
- border-top-left-radius: 56rpx !important;
-}
-
-.round-tl-15 {
- border-top-left-radius: 60rpx !important;
-}
-
-.round-tl-16 {
- border-top-left-radius: 64rpx !important;
-}
-
-.round-tl-17 {
- border-top-left-radius: 68rpx !important;
-}
-
-.round-tl-18 {
- border-top-left-radius: 72rpx !important;
-}
-
-.round-tl-19 {
- border-top-left-radius: 76rpx !important;
-}
-
-.round-tl-20 {
- border-top-left-radius: 80rpx !important;
-}
-
-.round-tl-21 {
- border-top-left-radius: 84rpx !important;
-}
-
-.round-tl-22 {
- border-top-left-radius: 88rpx !important;
-}
-
-.round-tl-23 {
- border-top-left-radius: 92rpx !important;
-}
-
-.round-tl-24 {
- border-top-left-radius: 96rpx !important;
-}
-
-.round-tl-25 {
- border-top-left-radius: 100rpx !important;
-}
-
-.round-tr-0 {
- border-top-right-radius: 0rpx !important;
-}
-
-.round-tr-1 {
- border-top-right-radius: 4rpx !important;
-}
-
-.round-tr-2 {
- border-top-right-radius: 8rpx !important;
-}
-
-.round-tr-3 {
- border-top-right-radius: 12rpx !important;
-}
-
-.round-tr-4 {
- border-top-right-radius: 16rpx !important;
-}
-
-.round-tr-5 {
- border-top-right-radius: 20rpx !important;
-}
-
-.round-tr-6 {
- border-top-right-radius: 24rpx !important;
-}
-
-.round-tr-7 {
- border-top-right-radius: 28rpx !important;
-}
-
-.round-tr-8 {
- border-top-right-radius: 32rpx !important;
-}
-
-.round-tr-9 {
- border-top-right-radius: 36rpx !important;
-}
-
-.round-tr-10 {
- border-top-right-radius: 40rpx !important;
-}
-
-.round-tr-11 {
- border-top-right-radius: 44rpx !important;
-}
-
-.round-tr-12 {
- border-top-right-radius: 48rpx !important;
-}
-
-.round-tr-13 {
- border-top-right-radius: 52rpx !important;
-}
-
-.round-tr-14 {
- border-top-right-radius: 56rpx !important;
-}
-
-.round-tr-15 {
- border-top-right-radius: 60rpx !important;
-}
-
-.round-tr-16 {
- border-top-right-radius: 64rpx !important;
-}
-
-.round-tr-17 {
- border-top-right-radius: 68rpx !important;
-}
-
-.round-tr-18 {
- border-top-right-radius: 72rpx !important;
-}
-
-.round-tr-19 {
- border-top-right-radius: 76rpx !important;
-}
-
-.round-tr-20 {
- border-top-right-radius: 80rpx !important;
-}
-
-.round-tr-21 {
- border-top-right-radius: 84rpx !important;
-}
-
-.round-tr-22 {
- border-top-right-radius: 88rpx !important;
-}
-
-.round-tr-23 {
- border-top-right-radius: 92rpx !important;
-}
-
-.round-tr-24 {
- border-top-right-radius: 96rpx !important;
-}
-
-.round-tr-25 {
- border-top-right-radius: 100rpx !important;
-}
-
-.round-bl-0 {
- border-bottom-left-radius: 0rpx !important;
-}
-
-.round-bl-1 {
- border-bottom-left-radius: 4rpx !important;
-}
-
-.round-bl-2 {
- border-bottom-left-radius: 8rpx !important;
-}
-
-.round-bl-3 {
- border-bottom-left-radius: 12rpx !important;
-}
-
-.round-bl-4 {
- border-bottom-left-radius: 16rpx !important;
-}
-
-.round-bl-5 {
- border-bottom-left-radius: 20rpx !important;
-}
-
-.round-bl-6 {
- border-bottom-left-radius: 24rpx !important;
-}
-
-.round-bl-7 {
- border-bottom-left-radius: 28rpx !important;
-}
-
-.round-bl-8 {
- border-bottom-left-radius: 32rpx !important;
-}
-
-.round-bl-9 {
- border-bottom-left-radius: 36rpx !important;
-}
-
-.round-bl-10 {
- border-bottom-left-radius: 40rpx !important;
-}
-
-.round-bl-11 {
- border-bottom-left-radius: 44rpx !important;
-}
-
-.round-bl-12 {
- border-bottom-left-radius: 48rpx !important;
-}
-
-.round-bl-13 {
- border-bottom-left-radius: 52rpx !important;
-}
-
-.round-bl-14 {
- border-bottom-left-radius: 56rpx !important;
-}
-
-.round-bl-15 {
- border-bottom-left-radius: 60rpx !important;
-}
-
-.round-bl-16 {
- border-bottom-left-radius: 64rpx !important;
-}
-
-.round-bl-17 {
- border-bottom-left-radius: 68rpx !important;
-}
-
-.round-bl-18 {
- border-bottom-left-radius: 72rpx !important;
-}
-
-.round-bl-19 {
- border-bottom-left-radius: 76rpx !important;
-}
-
-.round-bl-20 {
- border-bottom-left-radius: 80rpx !important;
-}
-
-.round-bl-21 {
- border-bottom-left-radius: 84rpx !important;
-}
-
-.round-bl-22 {
- border-bottom-left-radius: 88rpx !important;
-}
-
-.round-bl-23 {
- border-bottom-left-radius: 92rpx !important;
-}
-
-.round-bl-24 {
- border-bottom-left-radius: 96rpx !important;
-}
-
-.round-bl-25 {
- border-bottom-left-radius: 100rpx !important;
-}
-
-.round-br-0 {
- border-bottom-right-radius: 0rpx !important;
-}
-
-.round-br-1 {
- border-bottom-right-radius: 4rpx !important;
-}
-
-.round-br-2 {
- border-bottom-right-radius: 8rpx !important;
-}
-
-.round-br-3 {
- border-bottom-right-radius: 12rpx !important;
-}
-
-.round-br-4 {
- border-bottom-right-radius: 16rpx !important;
-}
-
-.round-br-5 {
- border-bottom-right-radius: 20rpx !important;
-}
-
-.round-br-6 {
- border-bottom-right-radius: 24rpx !important;
-}
-
-.round-br-7 {
- border-bottom-right-radius: 28rpx !important;
-}
-
-.round-br-8 {
- border-bottom-right-radius: 32rpx !important;
-}
-
-.round-br-9 {
- border-bottom-right-radius: 36rpx !important;
-}
-
-.round-br-10 {
- border-bottom-right-radius: 40rpx !important;
-}
-
-.round-br-11 {
- border-bottom-right-radius: 44rpx !important;
-}
-
-.round-br-12 {
- border-bottom-right-radius: 48rpx !important;
-}
-
-.round-br-13 {
- border-bottom-right-radius: 52rpx !important;
-}
-
-.round-br-14 {
- border-bottom-right-radius: 56rpx !important;
-}
-
-.round-br-15 {
- border-bottom-right-radius: 60rpx !important;
-}
-
-.round-br-16 {
- border-bottom-right-radius: 64rpx !important;
-}
-
-.round-br-17 {
- border-bottom-right-radius: 68rpx !important;
-}
-
-.round-br-18 {
- border-bottom-right-radius: 72rpx !important;
-}
-
-.round-br-19 {
- border-bottom-right-radius: 76rpx !important;
-}
-
-.round-br-20 {
- border-bottom-right-radius: 80rpx !important;
-}
-
-.round-br-21 {
- border-bottom-right-radius: 84rpx !important;
-}
-
-.round-br-22 {
- border-bottom-right-radius: 88rpx !important;
-}
-
-.round-br-23 {
- border-bottom-right-radius: 92rpx !important;
-}
-
-.round-br-24 {
- border-bottom-right-radius: 96rpx !important;
-}
-
-.round-br-25 {
- border-bottom-right-radius: 100rpx !important;
-}
-
-.round-a-0 {
- border-radius: 0rpx !important;
-}
-
-.round-a-1 {
- border-radius: 4rpx !important;
-}
-
-.round-a-2 {
- border-radius: 8rpx !important;
-}
-
-.round-a-3 {
- border-radius: 12rpx !important;
-}
-
-.round-a-4 {
- border-radius: 16rpx !important;
-}
-
-.round-a-5 {
- border-radius: 20rpx !important;
-}
-
-.round-a-6 {
- border-radius: 24rpx !important;
-}
-
-.round-a-7 {
- border-radius: 28rpx !important;
-}
-
-.round-a-8 {
- border-radius: 32rpx !important;
-}
-
-.round-a-9 {
- border-radius: 36rpx !important;
-}
-
-.round-a-10 {
- border-radius: 40rpx !important;
-}
-
-.round-a-11 {
- border-radius: 44rpx !important;
-}
-
-.round-a-12 {
- border-radius: 48rpx !important;
-}
-
-.round-a-13 {
- border-radius: 52rpx !important;
-}
-
-.round-a-14 {
- border-radius: 56rpx !important;
-}
-
-.round-a-15 {
- border-radius: 60rpx !important;
-}
-
-.round-a-16 {
- border-radius: 64rpx !important;
-}
-
-.round-a-17 {
- border-radius: 68rpx !important;
-}
-
-.round-a-18 {
- border-radius: 72rpx !important;
-}
-
-.round-a-19 {
- border-radius: 76rpx !important;
-}
-
-.round-a-20 {
- border-radius: 80rpx !important;
-}
-
-.round-a-21 {
- border-radius: 84rpx !important;
-}
-
-.round-a-22 {
- border-radius: 88rpx !important;
-}
-
-.round-a-23 {
- border-radius: 92rpx !important;
-}
-
-.round-a-24 {
- border-radius: 96rpx !important;
-}
-
-.round-a-25 {
- border-radius: 100rpx !important;
-}
-
-.round-t-0 {
- border-top-left-radius: 0rpx !important;
- border-top-right-radius: 0rpx !important;
-}
-
-.round-t-1 {
- border-top-left-radius: 4rpx !important;
- border-top-right-radius: 4rpx !important;
-}
-
-.round-t-2 {
- border-top-left-radius: 8rpx !important;
- border-top-right-radius: 8rpx !important;
-}
-
-.round-t-3 {
- border-top-left-radius: 12rpx !important;
- border-top-right-radius: 12rpx !important;
-}
-
-.round-t-4 {
- border-top-left-radius: 16rpx !important;
- border-top-right-radius: 16rpx !important;
-}
-
-.round-t-5 {
- border-top-left-radius: 20rpx !important;
- border-top-right-radius: 20rpx !important;
-}
-
-.round-t-6 {
- border-top-left-radius: 24rpx !important;
- border-top-right-radius: 24rpx !important;
-}
-
-.round-t-7 {
- border-top-left-radius: 28rpx !important;
- border-top-right-radius: 28rpx !important;
-}
-
-.round-t-8 {
- border-top-left-radius: 32rpx !important;
- border-top-right-radius: 32rpx !important;
-}
-
-.round-t-9 {
- border-top-left-radius: 36rpx !important;
- border-top-right-radius: 36rpx !important;
-}
-
-.round-t-10 {
- border-top-left-radius: 40rpx !important;
- border-top-right-radius: 40rpx !important;
-}
-
-.round-t-11 {
- border-top-left-radius: 44rpx !important;
- border-top-right-radius: 44rpx !important;
-}
-
-.round-t-12 {
- border-top-left-radius: 48rpx !important;
- border-top-right-radius: 48rpx !important;
-}
-
-.round-t-13 {
- border-top-left-radius: 52rpx !important;
- border-top-right-radius: 52rpx !important;
-}
-
-.round-t-14 {
- border-top-left-radius: 56rpx !important;
- border-top-right-radius: 56rpx !important;
-}
-
-.round-t-15 {
- border-top-left-radius: 60rpx !important;
- border-top-right-radius: 60rpx !important;
-}
-
-.round-t-16 {
- border-top-left-radius: 64rpx !important;
- border-top-right-radius: 64rpx !important;
-}
-
-.round-t-17 {
- border-top-left-radius: 68rpx !important;
- border-top-right-radius: 68rpx !important;
-}
-
-.round-t-18 {
- border-top-left-radius: 72rpx !important;
- border-top-right-radius: 72rpx !important;
-}
-
-.round-t-19 {
- border-top-left-radius: 76rpx !important;
- border-top-right-radius: 76rpx !important;
-}
-
-.round-t-20 {
- border-top-left-radius: 80rpx !important;
- border-top-right-radius: 80rpx !important;
-}
-
-.round-t-21 {
- border-top-left-radius: 84rpx !important;
- border-top-right-radius: 84rpx !important;
-}
-
-.round-t-22 {
- border-top-left-radius: 88rpx !important;
- border-top-right-radius: 88rpx !important;
-}
-
-.round-t-23 {
- border-top-left-radius: 92rpx !important;
- border-top-right-radius: 92rpx !important;
-}
-
-.round-t-24 {
- border-top-left-radius: 96rpx !important;
- border-top-right-radius: 96rpx !important;
-}
-
-.round-t-25 {
- border-top-left-radius: 100rpx !important;
- border-top-right-radius: 100rpx !important;
-}
-
-.round-b-0 {
- border-bottom-left-radius: 0rpx !important;
- border-bottom-right-radius: 0rpx !important;
-}
-
-.round-b-1 {
- border-bottom-left-radius: 4rpx !important;
- border-bottom-right-radius: 4rpx !important;
-}
-
-.round-b-2 {
- border-bottom-left-radius: 8rpx !important;
- border-bottom-right-radius: 8rpx !important;
-}
-
-.round-b-3 {
- border-bottom-left-radius: 12rpx !important;
- border-bottom-right-radius: 12rpx !important;
-}
-
-.round-b-4 {
- border-bottom-left-radius: 16rpx !important;
- border-bottom-right-radius: 16rpx !important;
-}
-
-.round-b-5 {
- border-bottom-left-radius: 20rpx !important;
- border-bottom-right-radius: 20rpx !important;
-}
-
-.round-b-6 {
- border-bottom-left-radius: 24rpx !important;
- border-bottom-right-radius: 24rpx !important;
-}
-
-.round-b-7 {
- border-bottom-left-radius: 28rpx !important;
- border-bottom-right-radius: 28rpx !important;
-}
-
-.round-b-8 {
- border-bottom-left-radius: 32rpx !important;
- border-bottom-right-radius: 32rpx !important;
-}
-
-.round-b-9 {
- border-bottom-left-radius: 36rpx !important;
- border-bottom-right-radius: 36rpx !important;
-}
-
-.round-b-10 {
- border-bottom-left-radius: 40rpx !important;
- border-bottom-right-radius: 40rpx !important;
-}
-
-.round-b-11 {
- border-bottom-left-radius: 44rpx !important;
- border-bottom-right-radius: 44rpx !important;
-}
-
-.round-b-12 {
- border-bottom-left-radius: 48rpx !important;
- border-bottom-right-radius: 48rpx !important;
-}
-
-.round-b-13 {
- border-bottom-left-radius: 52rpx !important;
- border-bottom-right-radius: 52rpx !important;
-}
-
-.round-b-14 {
- border-bottom-left-radius: 56rpx !important;
- border-bottom-right-radius: 56rpx !important;
-}
-
-.round-b-15 {
- border-bottom-left-radius: 60rpx !important;
- border-bottom-right-radius: 60rpx !important;
-}
-
-.round-b-16 {
- border-bottom-left-radius: 64rpx !important;
- border-bottom-right-radius: 64rpx !important;
-}
-
-.round-b-17 {
- border-bottom-left-radius: 68rpx !important;
- border-bottom-right-radius: 68rpx !important;
-}
-
-.round-b-18 {
- border-bottom-left-radius: 72rpx !important;
- border-bottom-right-radius: 72rpx !important;
-}
-
-.round-b-19 {
- border-bottom-left-radius: 76rpx !important;
- border-bottom-right-radius: 76rpx !important;
-}
-
-.round-b-20 {
- border-bottom-left-radius: 80rpx !important;
- border-bottom-right-radius: 80rpx !important;
-}
-
-.round-b-21 {
- border-bottom-left-radius: 84rpx !important;
- border-bottom-right-radius: 84rpx !important;
-}
-
-.round-b-22 {
- border-bottom-left-radius: 88rpx !important;
- border-bottom-right-radius: 88rpx !important;
-}
-
-.round-b-23 {
- border-bottom-left-radius: 92rpx !important;
- border-bottom-right-radius: 92rpx !important;
-}
-
-.round-b-24 {
- border-bottom-left-radius: 96rpx !important;
- border-bottom-right-radius: 96rpx !important;
-}
-
-.round-b-25 {
- border-bottom-left-radius: 100rpx !important;
- border-bottom-right-radius: 100rpx !important;
-}
-
-.round-l-0 {
- border-top-left-radius: 0rpx !important;
- border-bottom-left-radius: 0rpx !important;
-}
-
-.round-l-1 {
- border-top-left-radius: 4rpx !important;
- border-bottom-left-radius: 4rpx !important;
-}
-
-.round-l-2 {
- border-top-left-radius: 8rpx !important;
- border-bottom-left-radius: 8rpx !important;
-}
-
-.round-l-3 {
- border-top-left-radius: 12rpx !important;
- border-bottom-left-radius: 12rpx !important;
-}
-
-.round-l-4 {
- border-top-left-radius: 16rpx !important;
- border-bottom-left-radius: 16rpx !important;
-}
-
-.round-l-5 {
- border-top-left-radius: 20rpx !important;
- border-bottom-left-radius: 20rpx !important;
-}
-
-.round-l-6 {
- border-top-left-radius: 24rpx !important;
- border-bottom-left-radius: 24rpx !important;
-}
-
-.round-l-7 {
- border-top-left-radius: 28rpx !important;
- border-bottom-left-radius: 28rpx !important;
-}
-
-.round-l-8 {
- border-top-left-radius: 32rpx !important;
- border-bottom-left-radius: 32rpx !important;
-}
-
-.round-l-9 {
- border-top-left-radius: 36rpx !important;
- border-bottom-left-radius: 36rpx !important;
-}
-
-.round-l-10 {
- border-top-left-radius: 40rpx !important;
- border-bottom-left-radius: 40rpx !important;
-}
-
-.round-l-11 {
- border-top-left-radius: 44rpx !important;
- border-bottom-left-radius: 44rpx !important;
-}
-
-.round-l-12 {
- border-top-left-radius: 48rpx !important;
- border-bottom-left-radius: 48rpx !important;
-}
-
-.round-l-13 {
- border-top-left-radius: 52rpx !important;
- border-bottom-left-radius: 52rpx !important;
-}
-
-.round-l-14 {
- border-top-left-radius: 56rpx !important;
- border-bottom-left-radius: 56rpx !important;
-}
-
-.round-l-15 {
- border-top-left-radius: 60rpx !important;
- border-bottom-left-radius: 60rpx !important;
-}
-
-.round-l-16 {
- border-top-left-radius: 64rpx !important;
- border-bottom-left-radius: 64rpx !important;
-}
-
-.round-l-17 {
- border-top-left-radius: 68rpx !important;
- border-bottom-left-radius: 68rpx !important;
-}
-
-.round-l-18 {
- border-top-left-radius: 72rpx !important;
- border-bottom-left-radius: 72rpx !important;
-}
-
-.round-l-19 {
- border-top-left-radius: 76rpx !important;
- border-bottom-left-radius: 76rpx !important;
-}
-
-.round-l-20 {
- border-top-left-radius: 80rpx !important;
- border-bottom-left-radius: 80rpx !important;
-}
-
-.round-l-21 {
- border-top-left-radius: 84rpx !important;
- border-bottom-left-radius: 84rpx !important;
-}
-
-.round-l-22 {
- border-top-left-radius: 88rpx !important;
- border-bottom-left-radius: 88rpx !important;
-}
-
-.round-l-23 {
- border-top-left-radius: 92rpx !important;
- border-bottom-left-radius: 92rpx !important;
-}
-
-.round-l-24 {
- border-top-left-radius: 96rpx !important;
- border-bottom-left-radius: 96rpx !important;
-}
-
-.round-l-25 {
- border-top-left-radius: 100rpx !important;
- border-bottom-left-radius: 100rpx !important;
-}
-
-.round-r-0 {
- border-top-right-radius: 0rpx !important;
- border-bottom-right-radius: 0rpx !important;
-}
-
-.round-r-1 {
- border-top-right-radius: 4rpx !important;
- border-bottom-right-radius: 4rpx !important;
-}
-
-.round-r-2 {
- border-top-right-radius: 8rpx !important;
- border-bottom-right-radius: 8rpx !important;
-}
-
-.round-r-3 {
- border-top-right-radius: 12rpx !important;
- border-bottom-right-radius: 12rpx !important;
-}
-
-.round-r-4 {
- border-top-right-radius: 16rpx !important;
- border-bottom-right-radius: 16rpx !important;
-}
-
-.round-r-5 {
- border-top-right-radius: 20rpx !important;
- border-bottom-right-radius: 20rpx !important;
-}
-
-.round-r-6 {
- border-top-right-radius: 24rpx !important;
- border-bottom-right-radius: 24rpx !important;
-}
-
-.round-r-7 {
- border-top-right-radius: 28rpx !important;
- border-bottom-right-radius: 28rpx !important;
-}
-
-.round-r-8 {
- border-top-right-radius: 32rpx !important;
- border-bottom-right-radius: 32rpx !important;
-}
-
-.round-r-9 {
- border-top-right-radius: 36rpx !important;
- border-bottom-right-radius: 36rpx !important;
-}
-
-.round-r-10 {
- border-top-right-radius: 40rpx !important;
- border-bottom-right-radius: 40rpx !important;
-}
-
-.round-r-11 {
- border-top-right-radius: 44rpx !important;
- border-bottom-right-radius: 44rpx !important;
-}
-
-.round-r-12 {
- border-top-right-radius: 48rpx !important;
- border-bottom-right-radius: 48rpx !important;
-}
-
-.round-r-13 {
- border-top-right-radius: 52rpx !important;
- border-bottom-right-radius: 52rpx !important;
-}
-
-.round-r-14 {
- border-top-right-radius: 56rpx !important;
- border-bottom-right-radius: 56rpx !important;
-}
-
-.round-r-15 {
- border-top-right-radius: 60rpx !important;
- border-bottom-right-radius: 60rpx !important;
-}
-
-.round-r-16 {
- border-top-right-radius: 64rpx !important;
- border-bottom-right-radius: 64rpx !important;
-}
-
-.round-r-17 {
- border-top-right-radius: 68rpx !important;
- border-bottom-right-radius: 68rpx !important;
-}
-
-.round-r-18 {
- border-top-right-radius: 72rpx !important;
- border-bottom-right-radius: 72rpx !important;
-}
-
-.round-r-19 {
- border-top-right-radius: 76rpx !important;
- border-bottom-right-radius: 76rpx !important;
-}
-
-.round-r-20 {
- border-top-right-radius: 80rpx !important;
- border-bottom-right-radius: 80rpx !important;
-}
-
-.round-r-21 {
- border-top-right-radius: 84rpx !important;
- border-bottom-right-radius: 84rpx !important;
-}
-
-.round-r-22 {
- border-top-right-radius: 88rpx !important;
- border-bottom-right-radius: 88rpx !important;
-}
-
-.round-r-23 {
- border-top-right-radius: 92rpx !important;
- border-bottom-right-radius: 92rpx !important;
-}
-
-.round-r-24 {
- border-top-right-radius: 96rpx !important;
- border-bottom-right-radius: 96rpx !important;
-}
-
-.round-r-25 {
- border-top-right-radius: 100rpx !important;
- border-bottom-right-radius: 100rpx !important;
-}
-
-.round-0 {
- border-radius: 0rpx;
-}
-
-.round-1 {
- border-radius: 4rpx;
-}
-
-.round-2 {
- border-radius: 8rpx;
-}
-
-.round-3 {
- border-radius: 12rpx;
-}
-
-.round-4 {
- border-radius: 16rpx;
-}
-
-.round-5 {
- border-radius: 20rpx;
-}
-
-.round-6 {
- border-radius: 24rpx;
-}
-
-.round-7 {
- border-radius: 28rpx;
-}
-
-.round-8 {
- border-radius: 32rpx;
-}
-
-.round-9 {
- border-radius: 36rpx;
-}
-
-.round-10 {
- border-radius: 40rpx;
-}
-
-.round-11 {
- border-radius: 44rpx;
-}
-
-.round-12 {
- border-radius: 48rpx;
-}
-
-.round-13 {
- border-radius: 52rpx;
-}
-
-.round-14 {
- border-radius: 56rpx;
-}
-
-.round-15 {
- border-radius: 60rpx;
-}
-
-.round-16 {
- border-radius: 64rpx;
-}
-
-.round-17 {
- border-radius: 68rpx;
-}
-
-.round-18 {
- border-radius: 72rpx;
-}
-
-.round-19 {
- border-radius: 76rpx;
-}
-
-.round-20 {
- border-radius: 80rpx;
-}
-
-.round-21 {
- border-radius: 84rpx;
-}
-
-.round-22 {
- border-radius: 88rpx;
-}
-
-.round-23 {
- border-radius: 92rpx;
-}
-
-.round-24 {
- border-radius: 96rpx;
-}
-
-.round-25 {
- border-radius: 100rpx;
-}
-
-.round-26 {
- border-radius: 104rpx;
-}
-
-.rounded {
- border-radius: 50% !important;
-}
-
-.opacity-0 {
- opacity: 0;
-}
-
-.opacity-1 {
- opacity: 0.1;
-}
-
-.opacity-2 {
- opacity: 0.2;
-}
-
-.opacity-3 {
- opacity: 0.3;
-}
-
-.opacity-4 {
- opacity: 0.4;
-}
-
-.opacity-5 {
- opacity: 0.5;
-}
-
-.opacity-6 {
- opacity: 0.6;
-}
-
-.opacity-7 {
- opacity: 0.7;
-}
-
-.opacity-8 {
- opacity: 0.8;
-}
-
-.opacity-9 {
- opacity: 0.9;
-}
-
-.opacity-10 {
- opacity: 1;
-}
-
-.shadow {
- box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-0 {
- box-shadow: 0 0rpx 10rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-1 {
- box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-2 {
- box-shadow: 0 4rpx 14rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-3 {
- box-shadow: 0 6rpx 16rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-4 {
- box-shadow: 0 8rpx 18rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-5 {
- box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-6 {
- box-shadow: 0 12rpx 22rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-7 {
- box-shadow: 0 14rpx 24rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-8 {
- box-shadow: 0 16rpx 26rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-9 {
- box-shadow: 0 18rpx 28rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-10 {
- box-shadow: 0 20rpx 30rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-11 {
- box-shadow: 0 22rpx 32rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-12 {
- box-shadow: 0 24rpx 34rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-13 {
- box-shadow: 0 26rpx 36rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-14 {
- box-shadow: 0 28rpx 38rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-15 {
- box-shadow: 0 30rpx 40rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-16 {
- box-shadow: 0 32rpx 42rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-17 {
- box-shadow: 0 34rpx 44rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-18 {
- box-shadow: 0 36rpx 46rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-19 {
- box-shadow: 0 38rpx 48rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-20 {
- box-shadow: 0 40rpx 50rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-21 {
- box-shadow: 0 42rpx 52rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-22 {
- box-shadow: 0 44rpx 54rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-23 {
- box-shadow: 0 46rpx 56rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-24 {
- box-shadow: 0 48rpx 58rpx rgba(0, 0, 0, 0.08);
-}
-
-.shadow-25 {
- box-shadow: 0 50rpx 60rpx rgba(0, 0, 0, 0.08);
-}
-
-.border-0 {
- border: solid 0rpx #f5f5f5 !important;
-}
-
-.border-0-bk {
- border: solid 0rpx #282828 !important;
-}
-
-.border {
- border: solid 2rpx #f5f5f5 !important;
-}
-
-.border-bk {
- border: solid 2rpx #282828 !important;
-}
-
-.border-1 {
- border: solid 2px #f5f5f5 !important;
-}
-
-.border-1-bk {
- border: solid 2px #f5f5f5 !important;
-}
-
-.border-2 {
- border: solid 4px #f5f5f5 !important;
-}
-
-.border-2-bk {
- border: solid 4px #f5f5f5 !important;
-}
-
-.border-3 {
- border: solid 6px #f5f5f5 !important;
-}
-
-.border-3-bk {
- border: solid 6px #f5f5f5 !important;
-}
-
-.border-4 {
- border: solid 8px #f5f5f5 !important;
-}
-
-.border-4-bk {
- border: solid 8px #f5f5f5 !important;
-}
-
-.border-5 {
- border: solid 10px #f5f5f5 !important;
-}
-
-.border-5-bk {
- border: solid 10px #f5f5f5 !important;
-}
-
-.border-l-1 {
- border-left: solid 2rpx whitesmoke !important;
-}
-
-.border-l-1-bk {
- border-left: solid 2rpx #282828 !important;
-}
-
-.border-l-2 {
- border-left: solid 4rpx whitesmoke !important;
-}
-
-.border-l-2-bk {
- border-left: solid 4rpx #282828 !important;
-}
-
-.border-l-3 {
- border-left: solid 6rpx whitesmoke !important;
-}
-
-.border-l-3-bk {
- border-left: solid 6rpx #282828 !important;
-}
-
-.border-l-4 {
- border-left: solid 8rpx whitesmoke !important;
-}
-
-.border-l-4-bk {
- border-left: solid 8rpx #282828 !important;
-}
-
-.border-l-5 {
- border-left: solid 10rpx whitesmoke !important;
-}
-
-.border-l-5-bk {
- border-left: solid 10rpx #282828 !important;
-}
-
-.border-r-1 {
- border-right: solid 2rpx whitesmoke !important;
-}
-
-.border-r-1-bk {
- border-right: solid 2rpx #282828 !important;
-}
-
-.border-r-2 {
- border-right: solid 4rpx whitesmoke !important;
-}
-
-.border-r-2-bk {
- border-right: solid 4rpx #282828 !important;
-}
-
-.border-r-3 {
- border-right: solid 6rpx whitesmoke !important;
-}
-
-.border-r-3-bk {
- border-right: solid 6rpx #282828 !important;
-}
-
-.border-r-4 {
- border-right: solid 8rpx whitesmoke !important;
-}
-
-.border-r-4-bk {
- border-right: solid 8rpx #282828 !important;
-}
-
-.border-r-5 {
- border-right: solid 10rpx whitesmoke !important;
-}
-
-.border-r-5-bk {
- border-right: solid 10rpx #282828 !important;
-}
-
-.border-t-1 {
- border-top: solid 2rpx whitesmoke !important;
-}
-
-.border-t-1-bk {
- border-top: solid 2rpx #282828 !important;
-}
-
-.border-t-2 {
- border-top: solid 4rpx whitesmoke !important;
-}
-
-.border-t-2-bk {
- border-top: solid 4rpx #282828 !important;
-}
-
-.border-t-3 {
- border-top: solid 6rpx whitesmoke !important;
-}
-
-.border-t-3-bk {
- border-top: solid 6rpx #282828 !important;
-}
-
-.border-t-4 {
- border-top: solid 8rpx whitesmoke !important;
-}
-
-.border-t-4-bk {
- border-top: solid 8rpx #282828 !important;
-}
-
-.border-t-5 {
- border-top: solid 10rpx whitesmoke !important;
-}
-
-.border-t-5-bk {
- border-top: solid 10rpx #282828 !important;
-}
-
-.border-b-1 {
- border-bottom: solid 2rpx whitesmoke !important;
-}
-
-.border-b-1-bk {
- border-bottom: solid 2rpx #282828 !important;
-}
-
-.border-b-2 {
- border-bottom: solid 4rpx whitesmoke !important;
-}
-
-.border-b-2-bk {
- border-bottom: solid 4rpx #282828 !important;
-}
-
-.border-b-3 {
- border-bottom: solid 6rpx whitesmoke !important;
-}
-
-.border-b-3-bk {
- border-bottom: solid 6rpx #282828 !important;
-}
-
-.border-b-4 {
- border-bottom: solid 8rpx whitesmoke !important;
-}
-
-.border-b-4-bk {
- border-bottom: solid 8rpx #282828 !important;
-}
-
-.border-b-5 {
- border-bottom: solid 10rpx whitesmoke !important;
-}
-
-.border-b-5-bk {
- border-bottom: solid 10rpx #282828 !important;
-}
-
-.border-a-1 {
- border: solid 2rpx whitesmoke !important;
-}
-
-.border-a-1-bk {
- border: solid 2rpx #282828 !important;
-}
-
-.border-a-2 {
- border: solid 4rpx whitesmoke !important;
-}
-
-.border-a-2-bk {
- border: solid 4rpx #282828 !important;
-}
-
-.border-a-3 {
- border: solid 6rpx whitesmoke !important;
-}
-
-.border-a-3-bk {
- border: solid 6rpx #282828 !important;
-}
-
-.border-a-4 {
- border: solid 8rpx whitesmoke !important;
-}
-
-.border-a-4-bk {
- border: solid 8rpx #282828 !important;
-}
-
-.border-a-5 {
- border: solid 10rpx whitesmoke !important;
-}
-
-.border-a-5-bk {
- border: solid 10rpx #282828 !important;
-}
-
-.pa-0 {
- padding: 0rpx;
-}
-
-.pa-1 {
- padding: 1rpx;
-}
-
-.pa-2 {
- padding: 2rpx;
-}
-
-.pa-3 {
- padding: 3rpx;
-}
-
-.pa-4 {
- padding: 4rpx;
-}
-
-.pa-5 {
- padding: 5rpx;
-}
-
-.pa-6 {
- padding: 6rpx;
-}
-
-.pa-7 {
- padding: 7rpx;
-}
-
-.pa-8 {
- padding: 8rpx;
-}
-
-.pa-9 {
- padding: 9rpx;
-}
-
-.pa-10 {
- padding: 10rpx;
-}
-
-.pa-11 {
- padding: 11rpx;
-}
-
-.pa-12 {
- padding: 12rpx;
-}
-
-.pa-13 {
- padding: 13rpx;
-}
-
-.pa-14 {
- padding: 14rpx;
-}
-
-.pa-15 {
- padding: 15rpx;
-}
-
-.pa-16 {
- padding: 16rpx;
-}
-
-.pa-17 {
- padding: 17rpx;
-}
-
-.pa-18 {
- padding: 18rpx;
-}
-
-.pa-19 {
- padding: 19rpx;
-}
-
-.pa-20 {
- padding: 20rpx;
-}
-
-.pa-21 {
- padding: 21rpx;
-}
-
-.pa-22 {
- padding: 22rpx;
-}
-
-.pa-23 {
- padding: 23rpx;
-}
-
-.pa-24 {
- padding: 24rpx;
-}
-
-.pa-25 {
- padding: 25rpx;
-}
-
-.pa-n1 {
- padding: 4rpx;
-}
-
-.pa-n2 {
- padding: 8rpx;
-}
-
-.pa-n3 {
- padding: 12rpx;
-}
-
-.pa-n4 {
- padding: 16rpx;
-}
-
-.pa-n5 {
- padding: 20rpx;
-}
-
-.pa-n6 {
- padding: 24rpx;
-}
-
-.pa-n7 {
- padding: 28rpx;
-}
-
-.pa-n8 {
- padding: 32rpx;
-}
-
-.pa-n9 {
- padding: 36rpx;
-}
-
-.pa-n10 {
- padding: 40rpx;
-}
-
-.pa-n11 {
- padding: 44rpx;
-}
-
-.pa-n12 {
- padding: 48rpx;
-}
-
-.pa-n13 {
- padding: 52rpx;
-}
-
-.pa-n14 {
- padding: 56rpx;
-}
-
-.pa-n15 {
- padding: 60rpx;
-}
-
-.pa-n16 {
- padding: 64rpx;
-}
-
-.pa-n17 {
- padding: 68rpx;
-}
-
-.pa-n18 {
- padding: 72rpx;
-}
-
-.pa-n19 {
- padding: 76rpx;
-}
-
-.pa-n20 {
- padding: 80rpx;
-}
-
-.pa-n21 {
- padding: 84rpx;
-}
-
-.pa-n22 {
- padding: 88rpx;
-}
-
-.pa-n23 {
- padding: 92rpx;
-}
-
-.pa-n24 {
- padding: 96rpx;
-}
-
-.pa-n25 {
- padding: 100rpx;
-}
-
-.pt-0 {
- padding-top: 0rpx;
-}
-
-.pt-1 {
- padding-top: 1rpx;
-}
-
-.pt-2 {
- padding-top: 2rpx;
-}
-
-.pt-3 {
- padding-top: 3rpx;
-}
-
-.pt-4 {
- padding-top: 4rpx;
-}
-
-.pt-5 {
- padding-top: 5rpx;
-}
-
-.pt-6 {
- padding-top: 6rpx;
-}
-
-.pt-7 {
- padding-top: 7rpx;
-}
-
-.pt-8 {
- padding-top: 8rpx;
-}
-
-.pt-9 {
- padding-top: 9rpx;
-}
-
-.pt-10 {
- padding-top: 10rpx;
-}
-
-.pt-11 {
- padding-top: 11rpx;
-}
-
-.pt-12 {
- padding-top: 12rpx;
-}
-
-.pt-13 {
- padding-top: 13rpx;
-}
-
-.pt-14 {
- padding-top: 14rpx;
-}
-
-.pt-15 {
- padding-top: 15rpx;
-}
-
-.pt-16 {
- padding-top: 16rpx;
-}
-
-.pt-17 {
- padding-top: 17rpx;
-}
-
-.pt-18 {
- padding-top: 18rpx;
-}
-
-.pt-19 {
- padding-top: 19rpx;
-}
-
-.pt-20 {
- padding-top: 20rpx;
-}
-
-.pt-21 {
- padding-top: 21rpx;
-}
-
-.pt-22 {
- padding-top: 22rpx;
-}
-
-.pt-23 {
- padding-top: 23rpx;
-}
-
-.pt-24 {
- padding-top: 24rpx;
-}
-
-.pt-25 {
- padding-top: 25rpx;
-}
-
-.pt-n1 {
- padding-top: 4rpx;
-}
-
-.pt-n2 {
- padding-top: 8rpx;
-}
-
-.pt-n3 {
- padding-top: 12rpx;
-}
-
-.pt-n4 {
- padding-top: 16rpx;
-}
-
-.pt-n5 {
- padding-top: 20rpx;
-}
-
-.pt-n6 {
- padding-top: 24rpx;
-}
-
-.pt-n7 {
- padding-top: 28rpx;
-}
-
-.pt-n8 {
- padding-top: 32rpx;
-}
-
-.pt-n9 {
- padding-top: 36rpx;
-}
-
-.pt-n10 {
- padding-top: 40rpx;
-}
-
-.pt-n11 {
- padding-top: 44rpx;
-}
-
-.pt-n12 {
- padding-top: 48rpx;
-}
-
-.pt-n13 {
- padding-top: 52rpx;
-}
-
-.pt-n14 {
- padding-top: 56rpx;
-}
-
-.pt-n15 {
- padding-top: 60rpx;
-}
-
-.pt-n16 {
- padding-top: 64rpx;
-}
-
-.pt-n17 {
- padding-top: 68rpx;
-}
-
-.pt-n18 {
- padding-top: 72rpx;
-}
-
-.pt-n19 {
- padding-top: 76rpx;
-}
-
-.pt-n20 {
- padding-top: 80rpx;
-}
-
-.pt-n21 {
- padding-top: 84rpx;
-}
-
-.pt-n22 {
- padding-top: 88rpx;
-}
-
-.pt-n23 {
- padding-top: 92rpx;
-}
-
-.pt-n24 {
- padding-top: 96rpx;
-}
-
-.pt-n25 {
- padding-top: 100rpx;
-}
-
-.pr-0 {
- padding-right: 0rpx;
-}
-
-.pr-1 {
- padding-right: 1rpx;
-}
-
-.pr-2 {
- padding-right: 2rpx;
-}
-
-.pr-3 {
- padding-right: 3rpx;
-}
-
-.pr-4 {
- padding-right: 4rpx;
-}
-
-.pr-5 {
- padding-right: 5rpx;
-}
-
-.pr-6 {
- padding-right: 6rpx;
-}
-
-.pr-7 {
- padding-right: 7rpx;
-}
-
-.pr-8 {
- padding-right: 8rpx;
-}
-
-.pr-9 {
- padding-right: 9rpx;
-}
-
-.pr-10 {
- padding-right: 10rpx;
-}
-
-.pr-11 {
- padding-right: 11rpx;
-}
-
-.pr-12 {
- padding-right: 12rpx;
-}
-
-.pr-13 {
- padding-right: 13rpx;
-}
-
-.pr-14 {
- padding-right: 14rpx;
-}
-
-.pr-15 {
- padding-right: 15rpx;
-}
-
-.pr-16 {
- padding-right: 16rpx;
-}
-
-.pr-17 {
- padding-right: 17rpx;
-}
-
-.pr-18 {
- padding-right: 18rpx;
-}
-
-.pr-19 {
- padding-right: 19rpx;
-}
-
-.pr-20 {
- padding-right: 20rpx;
-}
-
-.pr-21 {
- padding-right: 21rpx;
-}
-
-.pr-22 {
- padding-right: 22rpx;
-}
-
-.pr-23 {
- padding-right: 23rpx;
-}
-
-.pr-24 {
- padding-right: 24rpx;
-}
-
-.pr-25 {
- padding-right: 25rpx;
-}
-
-.pr-n1 {
- padding-right: 4rpx;
-}
-
-.pr-n2 {
- padding-right: 8rpx;
-}
-
-.pr-n3 {
- padding-right: 12rpx;
-}
-
-.pr-n4 {
- padding-right: 16rpx;
-}
-
-.pr-n5 {
- padding-right: 20rpx;
-}
-
-.pr-n6 {
- padding-right: 24rpx;
-}
-
-.pr-n7 {
- padding-right: 28rpx;
-}
-
-.pr-n8 {
- padding-right: 32rpx;
-}
-
-.pr-n9 {
- padding-right: 36rpx;
-}
-
-.pr-n10 {
- padding-right: 40rpx;
-}
-
-.pr-n11 {
- padding-right: 44rpx;
-}
-
-.pr-n12 {
- padding-right: 48rpx;
-}
-
-.pr-n13 {
- padding-right: 52rpx;
-}
-
-.pr-n14 {
- padding-right: 56rpx;
-}
-
-.pr-n15 {
- padding-right: 60rpx;
-}
-
-.pr-n16 {
- padding-right: 64rpx;
-}
-
-.pr-n17 {
- padding-right: 68rpx;
-}
-
-.pr-n18 {
- padding-right: 72rpx;
-}
-
-.pr-n19 {
- padding-right: 76rpx;
-}
-
-.pr-n20 {
- padding-right: 80rpx;
-}
-
-.pr-n21 {
- padding-right: 84rpx;
-}
-
-.pr-n22 {
- padding-right: 88rpx;
-}
-
-.pr-n23 {
- padding-right: 92rpx;
-}
-
-.pr-n24 {
- padding-right: 96rpx;
-}
-
-.pr-n25 {
- padding-right: 100rpx;
-}
-
-.pb-0 {
- padding-bottom: 0rpx;
-}
-
-.pb-1 {
- padding-bottom: 1rpx;
-}
-
-.pb-2 {
- padding-bottom: 2rpx;
-}
-
-.pb-3 {
- padding-bottom: 3rpx;
-}
-
-.pb-4 {
- padding-bottom: 4rpx;
-}
-
-.pb-5 {
- padding-bottom: 5rpx;
-}
-
-.pb-6 {
- padding-bottom: 6rpx;
-}
-
-.pb-7 {
- padding-bottom: 7rpx;
-}
-
-.pb-8 {
- padding-bottom: 8rpx;
-}
-
-.pb-9 {
- padding-bottom: 9rpx;
-}
-
-.pb-10 {
- padding-bottom: 10rpx;
-}
-
-.pb-11 {
- padding-bottom: 11rpx;
-}
-
-.pb-12 {
- padding-bottom: 12rpx;
-}
-
-.pb-13 {
- padding-bottom: 13rpx;
-}
-
-.pb-14 {
- padding-bottom: 14rpx;
-}
-
-.pb-15 {
- padding-bottom: 15rpx;
-}
-
-.pb-16 {
- padding-bottom: 16rpx;
-}
-
-.pb-17 {
- padding-bottom: 17rpx;
-}
-
-.pb-18 {
- padding-bottom: 18rpx;
-}
-
-.pb-19 {
- padding-bottom: 19rpx;
-}
-
-.pb-20 {
- padding-bottom: 20rpx;
-}
-
-.pb-21 {
- padding-bottom: 21rpx;
-}
-
-.pb-22 {
- padding-bottom: 22rpx;
-}
-
-.pb-23 {
- padding-bottom: 23rpx;
-}
-
-.pb-24 {
- padding-bottom: 24rpx;
-}
-
-.pb-25 {
- padding-bottom: 25rpx;
-}
-
-.pb-n1 {
- padding-bottom: 4rpx;
-}
-
-.pb-n2 {
- padding-bottom: 8rpx;
-}
-
-.pb-n3 {
- padding-bottom: 12rpx;
-}
-
-.pb-n4 {
- padding-bottom: 16rpx;
-}
-
-.pb-n5 {
- padding-bottom: 20rpx;
-}
-
-.pb-n6 {
- padding-bottom: 24rpx;
-}
-
-.pb-n7 {
- padding-bottom: 28rpx;
-}
-
-.pb-n8 {
- padding-bottom: 32rpx;
-}
-
-.pb-n9 {
- padding-bottom: 36rpx;
-}
-
-.pb-n10 {
- padding-bottom: 40rpx;
-}
-
-.pb-n11 {
- padding-bottom: 44rpx;
-}
-
-.pb-n12 {
- padding-bottom: 48rpx;
-}
-
-.pb-n13 {
- padding-bottom: 52rpx;
-}
-
-.pb-n14 {
- padding-bottom: 56rpx;
-}
-
-.pb-n15 {
- padding-bottom: 60rpx;
-}
-
-.pb-n16 {
- padding-bottom: 64rpx;
-}
-
-.pb-n17 {
- padding-bottom: 68rpx;
-}
-
-.pb-n18 {
- padding-bottom: 72rpx;
-}
-
-.pb-n19 {
- padding-bottom: 76rpx;
-}
-
-.pb-n20 {
- padding-bottom: 80rpx;
-}
-
-.pb-n21 {
- padding-bottom: 84rpx;
-}
-
-.pb-n22 {
- padding-bottom: 88rpx;
-}
-
-.pb-n23 {
- padding-bottom: 92rpx;
-}
-
-.pb-n24 {
- padding-bottom: 96rpx;
-}
-
-.pb-n25 {
- padding-bottom: 100rpx;
-}
-
-.pl-0 {
- padding-left: 0rpx;
-}
-
-.pl-1 {
- padding-left: 1rpx;
-}
-
-.pl-2 {
- padding-left: 2rpx;
-}
-
-.pl-3 {
- padding-left: 3rpx;
-}
-
-.pl-4 {
- padding-left: 4rpx;
-}
-
-.pl-5 {
- padding-left: 5rpx;
-}
-
-.pl-6 {
- padding-left: 6rpx;
-}
-
-.pl-7 {
- padding-left: 7rpx;
-}
-
-.pl-8 {
- padding-left: 8rpx;
-}
-
-.pl-9 {
- padding-left: 9rpx;
-}
-
-.pl-10 {
- padding-left: 10rpx;
-}
-
-.pl-11 {
- padding-left: 11rpx;
-}
-
-.pl-12 {
- padding-left: 12rpx;
-}
-
-.pl-13 {
- padding-left: 13rpx;
-}
-
-.pl-14 {
- padding-left: 14rpx;
-}
-
-.pl-15 {
- padding-left: 15rpx;
-}
-
-.pl-16 {
- padding-left: 16rpx;
-}
-
-.pl-17 {
- padding-left: 17rpx;
-}
-
-.pl-18 {
- padding-left: 18rpx;
-}
-
-.pl-19 {
- padding-left: 19rpx;
-}
-
-.pl-20 {
- padding-left: 20rpx;
-}
-
-.pl-21 {
- padding-left: 21rpx;
-}
-
-.pl-22 {
- padding-left: 22rpx;
-}
-
-.pl-23 {
- padding-left: 23rpx;
-}
-
-.pl-24 {
- padding-left: 24rpx;
-}
-
-.pl-25 {
- padding-left: 25rpx;
-}
-
-.pl-n1 {
- padding-left: 4rpx;
-}
-
-.pl-n2 {
- padding-left: 8rpx;
-}
-
-.pl-n3 {
- padding-left: 12rpx;
-}
-
-.pl-n4 {
- padding-left: 16rpx;
-}
-
-.pl-n5 {
- padding-left: 20rpx;
-}
-
-.pl-n6 {
- padding-left: 24rpx;
-}
-
-.pl-n7 {
- padding-left: 28rpx;
-}
-
-.pl-n8 {
- padding-left: 32rpx;
-}
-
-.pl-n9 {
- padding-left: 36rpx;
-}
-
-.pl-n10 {
- padding-left: 40rpx;
-}
-
-.pl-n11 {
- padding-left: 44rpx;
-}
-
-.pl-n12 {
- padding-left: 48rpx;
-}
-
-.pl-n13 {
- padding-left: 52rpx;
-}
-
-.pl-n14 {
- padding-left: 56rpx;
-}
-
-.pl-n15 {
- padding-left: 60rpx;
-}
-
-.pl-n16 {
- padding-left: 64rpx;
-}
-
-.pl-n17 {
- padding-left: 68rpx;
-}
-
-.pl-n18 {
- padding-left: 72rpx;
-}
-
-.pl-n19 {
- padding-left: 76rpx;
-}
-
-.pl-n20 {
- padding-left: 80rpx;
-}
-
-.pl-n21 {
- padding-left: 84rpx;
-}
-
-.pl-n22 {
- padding-left: 88rpx;
-}
-
-.pl-n23 {
- padding-left: 92rpx;
-}
-
-.pl-n24 {
- padding-left: 96rpx;
-}
-
-.pl-n25 {
- padding-left: 100rpx;
-}
-
-.px-0 {
- padding-left: 0rpx;
- padding-right: 0rpx;
-}
-
-.px-1 {
- padding-left: 1rpx;
- padding-right: 1rpx;
-}
-
-.px-2 {
- padding-left: 2rpx;
- padding-right: 2rpx;
-}
-
-.px-3 {
- padding-left: 3rpx;
- padding-right: 3rpx;
-}
-
-.px-4 {
- padding-left: 4rpx;
- padding-right: 4rpx;
-}
-
-.px-5 {
- padding-left: 5rpx;
- padding-right: 5rpx;
-}
-
-.px-6 {
- padding-left: 6rpx;
- padding-right: 6rpx;
-}
-
-.px-7 {
- padding-left: 7rpx;
- padding-right: 7rpx;
-}
-
-.px-8 {
- padding-left: 8rpx;
- padding-right: 8rpx;
-}
-
-.px-9 {
- padding-left: 9rpx;
- padding-right: 9rpx;
-}
-
-.px-10 {
- padding-left: 10rpx;
- padding-right: 10rpx;
-}
-
-.px-11 {
- padding-left: 11rpx;
- padding-right: 11rpx;
-}
-
-.px-12 {
- padding-left: 12rpx;
- padding-right: 12rpx;
-}
-
-.px-13 {
- padding-left: 13rpx;
- padding-right: 13rpx;
-}
-
-.px-14 {
- padding-left: 14rpx;
- padding-right: 14rpx;
-}
-
-.px-15 {
- padding-left: 15rpx;
- padding-right: 15rpx;
-}
-
-.px-16 {
- padding-left: 16rpx;
- padding-right: 16rpx;
-}
-
-.px-17 {
- padding-left: 17rpx;
- padding-right: 17rpx;
-}
-
-.px-18 {
- padding-left: 18rpx;
- padding-right: 18rpx;
-}
-
-.px-19 {
- padding-left: 19rpx;
- padding-right: 19rpx;
-}
-
-.px-20 {
- padding-left: 20rpx;
- padding-right: 20rpx;
-}
-
-.px-21 {
- padding-left: 21rpx;
- padding-right: 21rpx;
-}
-
-.px-22 {
- padding-left: 22rpx;
- padding-right: 22rpx;
-}
-
-.px-23 {
- padding-left: 23rpx;
- padding-right: 23rpx;
-}
-
-.px-24 {
- padding-left: 24rpx;
- padding-right: 24rpx;
-}
-
-.px-25 {
- padding-left: 25rpx;
- padding-right: 25rpx;
-}
-
-.px-n1 {
- padding-left: 4rpx;
- padding-right: 4rpx;
-}
-
-.px-n2 {
- padding-left: 8rpx;
- padding-right: 8rpx;
-}
-
-.px-n3 {
- padding-left: 12rpx;
- padding-right: 12rpx;
-}
-
-.px-n4 {
- padding-left: 16rpx;
- padding-right: 16rpx;
-}
-
-.px-n5 {
- padding-left: 20rpx;
- padding-right: 20rpx;
-}
-
-.px-n6 {
- padding-left: 24rpx;
- padding-right: 24rpx;
-}
-
-.px-n7 {
- padding-left: 28rpx;
- padding-right: 28rpx;
-}
-
-.px-n8 {
- padding-left: 32rpx;
- padding-right: 32rpx;
-}
-
-.px-n9 {
- padding-left: 36rpx;
- padding-right: 36rpx;
-}
-
-.px-n10 {
- padding-left: 40rpx;
- padding-right: 40rpx;
-}
-
-.px-n11 {
- padding-left: 44rpx;
- padding-right: 44rpx;
-}
-
-.px-n12 {
- padding-left: 48rpx;
- padding-right: 48rpx;
-}
-
-.px-n13 {
- padding-left: 52rpx;
- padding-right: 52rpx;
-}
-
-.px-n14 {
- padding-left: 56rpx;
- padding-right: 56rpx;
-}
-
-.px-n15 {
- padding-left: 60rpx;
- padding-right: 60rpx;
-}
-
-.px-n16 {
- padding-left: 64rpx;
- padding-right: 64rpx;
-}
-
-.px-n17 {
- padding-left: 68rpx;
- padding-right: 68rpx;
-}
-
-.px-n18 {
- padding-left: 72rpx;
- padding-right: 72rpx;
-}
-
-.px-n19 {
- padding-left: 76rpx;
- padding-right: 76rpx;
-}
-
-.px-n20 {
- padding-left: 80rpx;
- padding-right: 80rpx;
-}
-
-.px-n21 {
- padding-left: 84rpx;
- padding-right: 84rpx;
-}
-
-.px-n22 {
- padding-left: 88rpx;
- padding-right: 88rpx;
-}
-
-.px-n23 {
- padding-left: 92rpx;
- padding-right: 92rpx;
-}
-
-.px-n24 {
- padding-left: 96rpx;
- padding-right: 96rpx;
-}
-
-.px-n25 {
- padding-left: 100rpx;
- padding-right: 100rpx;
-}
-
-.py-0 {
- padding-top: 0rpx;
- padding-bottom: 0rpx;
-}
-
-.py-1 {
- padding-top: 1rpx;
- padding-bottom: 1rpx;
-}
-
-.py-2 {
- padding-top: 2rpx;
- padding-bottom: 2rpx;
-}
-
-.py-3 {
- padding-top: 3rpx;
- padding-bottom: 3rpx;
-}
-
-.py-4 {
- padding-top: 4rpx;
- padding-bottom: 4rpx;
-}
-
-.py-5 {
- padding-top: 5rpx;
- padding-bottom: 5rpx;
-}
-
-.py-6 {
- padding-top: 6rpx;
- padding-bottom: 6rpx;
-}
-
-.py-7 {
- padding-top: 7rpx;
- padding-bottom: 7rpx;
-}
-
-.py-8 {
- padding-top: 8rpx;
- padding-bottom: 8rpx;
-}
-
-.py-9 {
- padding-top: 9rpx;
- padding-bottom: 9rpx;
-}
-
-.py-10 {
- padding-top: 10rpx;
- padding-bottom: 10rpx;
-}
-
-.py-11 {
- padding-top: 11rpx;
- padding-bottom: 11rpx;
-}
-
-.py-12 {
- padding-top: 12rpx;
- padding-bottom: 12rpx;
-}
-
-.py-13 {
- padding-top: 13rpx;
- padding-bottom: 13rpx;
-}
-
-.py-14 {
- padding-top: 14rpx;
- padding-bottom: 14rpx;
-}
-
-.py-15 {
- padding-top: 15rpx;
- padding-bottom: 15rpx;
-}
-
-.py-16 {
- padding-top: 16rpx;
- padding-bottom: 16rpx;
-}
-
-.py-17 {
- padding-top: 17rpx;
- padding-bottom: 17rpx;
-}
-
-.py-18 {
- padding-top: 18rpx;
- padding-bottom: 18rpx;
-}
-
-.py-19 {
- padding-top: 19rpx;
- padding-bottom: 19rpx;
-}
-
-.py-20 {
- padding-top: 20rpx;
- padding-bottom: 20rpx;
-}
-
-.py-21 {
- padding-top: 21rpx;
- padding-bottom: 21rpx;
-}
-
-.py-22 {
- padding-top: 22rpx;
- padding-bottom: 22rpx;
-}
-
-.py-23 {
- padding-top: 23rpx;
- padding-bottom: 23rpx;
-}
-
-.py-24 {
- padding-top: 24rpx;
- padding-bottom: 24rpx;
-}
-
-.py-25 {
- padding-top: 25rpx;
- padding-bottom: 25rpx;
-}
-
-.py-n1 {
- padding-top: 4rpx;
- padding-bottom: 4rpx;
-}
-
-.py-n2 {
- padding-top: 8rpx;
- padding-bottom: 8rpx;
-}
-
-.py-n3 {
- padding-top: 12rpx;
- padding-bottom: 12rpx;
-}
-
-.py-n4 {
- padding-top: 16rpx;
- padding-bottom: 16rpx;
-}
-
-.py-n5 {
- padding-top: 20rpx;
- padding-bottom: 20rpx;
-}
-
-.py-n6 {
- padding-top: 24rpx;
- padding-bottom: 24rpx;
-}
-
-.py-n7 {
- padding-top: 28rpx;
- padding-bottom: 28rpx;
-}
-
-.py-n8 {
- padding-top: 32rpx;
- padding-bottom: 32rpx;
-}
-
-.py-n9 {
- padding-top: 36rpx;
- padding-bottom: 36rpx;
-}
-
-.py-n10 {
- padding-top: 40rpx;
- padding-bottom: 40rpx;
-}
-
-.py-n11 {
- padding-top: 44rpx;
- padding-bottom: 44rpx;
-}
-
-.py-n12 {
- padding-top: 48rpx;
- padding-bottom: 48rpx;
-}
-
-.py-n13 {
- padding-top: 52rpx;
- padding-bottom: 52rpx;
-}
-
-.py-n14 {
- padding-top: 56rpx;
- padding-bottom: 56rpx;
-}
-
-.py-n15 {
- padding-top: 60rpx;
- padding-bottom: 60rpx;
-}
-
-.py-n16 {
- padding-top: 64rpx;
- padding-bottom: 64rpx;
-}
-
-.py-n17 {
- padding-top: 68rpx;
- padding-bottom: 68rpx;
-}
-
-.py-n18 {
- padding-top: 72rpx;
- padding-bottom: 72rpx;
-}
-
-.py-n19 {
- padding-top: 76rpx;
- padding-bottom: 76rpx;
-}
-
-.py-n20 {
- padding-top: 80rpx;
- padding-bottom: 80rpx;
-}
-
-.py-n21 {
- padding-top: 84rpx;
- padding-bottom: 84rpx;
-}
-
-.py-n22 {
- padding-top: 88rpx;
- padding-bottom: 88rpx;
-}
-
-.py-n23 {
- padding-top: 92rpx;
- padding-bottom: 92rpx;
-}
-
-.py-n24 {
- padding-top: 96rpx;
- padding-bottom: 96rpx;
-}
-
-.py-n25 {
- padding-top: 100rpx;
- padding-bottom: 100rpx;
-}
-
-.ma-0 {
- margin: 0rpx;
-}
-
-.ma-1 {
- margin: 1rpx;
-}
-
-.ma-2 {
- margin: 2rpx;
-}
-
-.ma-3 {
- margin: 3rpx;
-}
-
-.ma-4 {
- margin: 4rpx;
-}
-
-.ma-5 {
- margin: 5rpx;
-}
-
-.ma-6 {
- margin: 6rpx;
-}
-
-.ma-7 {
- margin: 7rpx;
-}
-
-.ma-8 {
- margin: 8rpx;
-}
-
-.ma-9 {
- margin: 9rpx;
-}
-
-.ma-10 {
- margin: 10rpx;
-}
-
-.ma-11 {
- margin: 11rpx;
-}
-
-.ma-12 {
- margin: 12rpx;
-}
-
-.ma-13 {
- margin: 13rpx;
-}
-
-.ma-14 {
- margin: 14rpx;
-}
-
-.ma-15 {
- margin: 15rpx;
-}
-
-.ma-16 {
- margin: 16rpx;
-}
-
-.ma-17 {
- margin: 17rpx;
-}
-
-.ma-18 {
- margin: 18rpx;
-}
-
-.ma-19 {
- margin: 19rpx;
-}
-
-.ma-20 {
- margin: 20rpx;
-}
-
-.ma-21 {
- margin: 21rpx;
-}
-
-.ma-22 {
- margin: 22rpx;
-}
-
-.ma-23 {
- margin: 23rpx;
-}
-
-.ma-24 {
- margin: 24rpx;
-}
-
-.ma-25 {
- margin: 25rpx;
-}
-
-.ma-n1 {
- margin: 4rpx;
-}
-
-.ma-n2 {
- margin: 8rpx;
-}
-
-.ma-n3 {
- margin: 12rpx;
-}
-
-.ma-n4 {
- margin: 16rpx;
-}
-
-.ma-n5 {
- margin: 20rpx;
-}
-
-.ma-n6 {
- margin: 24rpx;
-}
-
-.ma-n7 {
- margin: 28rpx;
-}
-
-.ma-n8 {
- margin: 32rpx;
-}
-
-.ma-n9 {
- margin: 36rpx;
-}
-
-.ma-n10 {
- margin: 40rpx;
-}
-
-.ma-n11 {
- margin: 44rpx;
-}
-
-.ma-n12 {
- margin: 48rpx;
-}
-
-.ma-n13 {
- margin: 52rpx;
-}
-
-.ma-n14 {
- margin: 56rpx;
-}
-
-.ma-n15 {
- margin: 60rpx;
-}
-
-.ma-n16 {
- margin: 64rpx;
-}
-
-.ma-n17 {
- margin: 68rpx;
-}
-
-.ma-n18 {
- margin: 72rpx;
-}
-
-.ma-n19 {
- margin: 76rpx;
-}
-
-.ma-n20 {
- margin: 80rpx;
-}
-
-.ma-n21 {
- margin: 84rpx;
-}
-
-.ma-n22 {
- margin: 88rpx;
-}
-
-.ma-n23 {
- margin: 92rpx;
-}
-
-.ma-n24 {
- margin: 96rpx;
-}
-
-.ma-n25 {
- margin: 100rpx;
-}
-
-.mt-0 {
- margin-top: 0rpx;
-}
-
-.mt--0 {
- margin-top: -0rpx;
-}
-
-.mt-1 {
- margin-top: 1rpx;
-}
-
-.mt--1 {
- margin-top: -1rpx;
-}
-
-.mt-2 {
- margin-top: 2rpx;
-}
-
-.mt--2 {
- margin-top: -2rpx;
-}
-
-.mt-3 {
- margin-top: 3rpx;
-}
-
-.mt--3 {
- margin-top: -3rpx;
-}
-
-.mt-4 {
- margin-top: 4rpx;
-}
-
-.mt--4 {
- margin-top: -4rpx;
-}
-
-.mt-5 {
- margin-top: 5rpx;
-}
-
-.mt--5 {
- margin-top: -5rpx;
-}
-
-.mt-6 {
- margin-top: 6rpx;
-}
-
-.mt--6 {
- margin-top: -6rpx;
-}
-
-.mt-7 {
- margin-top: 7rpx;
-}
-
-.mt--7 {
- margin-top: -7rpx;
-}
-
-.mt-8 {
- margin-top: 8rpx;
-}
-
-.mt--8 {
- margin-top: -8rpx;
-}
-
-.mt-9 {
- margin-top: 9rpx;
-}
-
-.mt--9 {
- margin-top: -9rpx;
-}
-
-.mt-10 {
- margin-top: 10rpx;
-}
-
-.mt--10 {
- margin-top: -10rpx;
-}
-
-.mt-11 {
- margin-top: 11rpx;
-}
-
-.mt--11 {
- margin-top: -11rpx;
-}
-
-.mt-12 {
- margin-top: 12rpx;
-}
-
-.mt--12 {
- margin-top: -12rpx;
-}
-
-.mt-13 {
- margin-top: 13rpx;
-}
-
-.mt--13 {
- margin-top: -13rpx;
-}
-
-.mt-14 {
- margin-top: 14rpx;
-}
-
-.mt--14 {
- margin-top: -14rpx;
-}
-
-.mt-15 {
- margin-top: 15rpx;
-}
-
-.mt--15 {
- margin-top: -15rpx;
-}
-
-.mt-16 {
- margin-top: 16rpx;
-}
-
-.mt--16 {
- margin-top: -16rpx;
-}
-
-.mt-17 {
- margin-top: 17rpx;
-}
-
-.mt--17 {
- margin-top: -17rpx;
-}
-
-.mt-18 {
- margin-top: 18rpx;
-}
-
-.mt--18 {
- margin-top: -18rpx;
-}
-
-.mt-19 {
- margin-top: 19rpx;
-}
-
-.mt--19 {
- margin-top: -19rpx;
-}
-
-.mt-20 {
- margin-top: 20rpx;
-}
-
-.mt--20 {
- margin-top: -20rpx;
-}
-
-.mt-21 {
- margin-top: 21rpx;
-}
-
-.mt--21 {
- margin-top: -21rpx;
-}
-
-.mt-22 {
- margin-top: 22rpx;
-}
-
-.mt--22 {
- margin-top: -22rpx;
-}
-
-.mt-23 {
- margin-top: 23rpx;
-}
-
-.mt--23 {
- margin-top: -23rpx;
-}
-
-.mt-24 {
- margin-top: 24rpx;
-}
-
-.mt--24 {
- margin-top: -24rpx;
-}
-
-.mt-25 {
- margin-top: 25rpx;
-}
-
-.mt--25 {
- margin-top: -25rpx;
-}
-
-.mt-n1 {
- margin-top: 4rpx;
-}
-
-.mt--n1 {
- margin-top: -4rpx;
-}
-
-.mt-n2 {
- margin-top: 8rpx;
-}
-
-.mt--n2 {
- margin-top: -8rpx;
-}
-
-.mt-n3 {
- margin-top: 12rpx;
-}
-
-.mt--n3 {
- margin-top: -12rpx;
-}
-
-.mt-n4 {
- margin-top: 16rpx;
-}
-
-.mt--n4 {
- margin-top: -16rpx;
-}
-
-.mt-n5 {
- margin-top: 20rpx;
-}
-
-.mt--n5 {
- margin-top: -20rpx;
-}
-
-.mt-n6 {
- margin-top: 24rpx;
-}
-
-.mt--n6 {
- margin-top: -24rpx;
-}
-
-.mt-n7 {
- margin-top: 28rpx;
-}
-
-.mt--n7 {
- margin-top: -28rpx;
-}
-
-.mt-n8 {
- margin-top: 32rpx;
-}
-
-.mt--n8 {
- margin-top: -32rpx;
-}
-
-.mt-n9 {
- margin-top: 36rpx;
-}
-
-.mt--n9 {
- margin-top: -36rpx;
-}
-
-.mt-n10 {
- margin-top: 40rpx;
-}
-
-.mt--n10 {
- margin-top: -40rpx;
-}
-
-.mt-n11 {
- margin-top: 44rpx;
-}
-
-.mt--n11 {
- margin-top: -44rpx;
-}
-
-.mt-n12 {
- margin-top: 48rpx;
-}
-
-.mt--n12 {
- margin-top: -48rpx;
-}
-
-.mt-n13 {
- margin-top: 52rpx;
-}
-
-.mt--n13 {
- margin-top: -52rpx;
-}
-
-.mt-n14 {
- margin-top: 56rpx;
-}
-
-.mt--n14 {
- margin-top: -56rpx;
-}
-
-.mt-n15 {
- margin-top: 60rpx;
-}
-
-.mt--n15 {
- margin-top: -60rpx;
-}
-
-.mt-n16 {
- margin-top: 64rpx;
-}
-
-.mt--n16 {
- margin-top: -64rpx;
-}
-
-.mt-n17 {
- margin-top: 68rpx;
-}
-
-.mt--n17 {
- margin-top: -68rpx;
-}
-
-.mt-n18 {
- margin-top: 72rpx;
-}
-
-.mt--n18 {
- margin-top: -72rpx;
-}
-
-.mt-n19 {
- margin-top: 76rpx;
-}
-
-.mt--n19 {
- margin-top: -76rpx;
-}
-
-.mt-n20 {
- margin-top: 80rpx;
-}
-
-.mt--n20 {
- margin-top: -80rpx;
-}
-
-.mt-n21 {
- margin-top: 84rpx;
-}
-
-.mt--n21 {
- margin-top: -84rpx;
-}
-
-.mt-n22 {
- margin-top: 88rpx;
-}
-
-.mt--n22 {
- margin-top: -88rpx;
-}
-
-.mt-n23 {
- margin-top: 92rpx;
-}
-
-.mt--n23 {
- margin-top: -92rpx;
-}
-
-.mt-n24 {
- margin-top: 96rpx;
-}
-
-.mt--n24 {
- margin-top: -96rpx;
-}
-
-.mt-n25 {
- margin-top: 100rpx;
-}
-
-.mt--n25 {
- margin-top: -100rpx;
-}
-
-.mr-0 {
- margin-right: 0rpx;
-}
-
-.mr--0 {
- margin-right: -0rpx;
-}
-
-.mr-1 {
- margin-right: 1rpx;
-}
-
-.mr--1 {
- margin-right: -1rpx;
-}
-
-.mr-2 {
- margin-right: 2rpx;
-}
-
-.mr--2 {
- margin-right: -2rpx;
-}
-
-.mr-3 {
- margin-right: 3rpx;
-}
-
-.mr--3 {
- margin-right: -3rpx;
-}
-
-.mr-4 {
- margin-right: 4rpx;
-}
-
-.mr--4 {
- margin-right: -4rpx;
-}
-
-.mr-5 {
- margin-right: 5rpx;
-}
-
-.mr--5 {
- margin-right: -5rpx;
-}
-
-.mr-6 {
- margin-right: 6rpx;
-}
-
-.mr--6 {
- margin-right: -6rpx;
-}
-
-.mr-7 {
- margin-right: 7rpx;
-}
-
-.mr--7 {
- margin-right: -7rpx;
-}
-
-.mr-8 {
- margin-right: 8rpx;
-}
-
-.mr--8 {
- margin-right: -8rpx;
-}
-
-.mr-9 {
- margin-right: 9rpx;
-}
-
-.mr--9 {
- margin-right: -9rpx;
-}
-
-.mr-10 {
- margin-right: 10rpx;
-}
-
-.mr--10 {
- margin-right: -10rpx;
-}
-
-.mr-11 {
- margin-right: 11rpx;
-}
-
-.mr--11 {
- margin-right: -11rpx;
-}
-
-.mr-12 {
- margin-right: 12rpx;
-}
-
-.mr--12 {
- margin-right: -12rpx;
-}
-
-.mr-13 {
- margin-right: 13rpx;
-}
-
-.mr--13 {
- margin-right: -13rpx;
-}
-
-.mr-14 {
- margin-right: 14rpx;
-}
-
-.mr--14 {
- margin-right: -14rpx;
-}
-
-.mr-15 {
- margin-right: 15rpx;
-}
-
-.mr--15 {
- margin-right: -15rpx;
-}
-
-.mr-16 {
- margin-right: 16rpx;
-}
-
-.mr--16 {
- margin-right: -16rpx;
-}
-
-.mr-17 {
- margin-right: 17rpx;
-}
-
-.mr--17 {
- margin-right: -17rpx;
-}
-
-.mr-18 {
- margin-right: 18rpx;
-}
-
-.mr--18 {
- margin-right: -18rpx;
-}
-
-.mr-19 {
- margin-right: 19rpx;
-}
-
-.mr--19 {
- margin-right: -19rpx;
-}
-
-.mr-20 {
- margin-right: 20rpx;
-}
-
-.mr--20 {
- margin-right: -20rpx;
-}
-
-.mr-21 {
- margin-right: 21rpx;
-}
-
-.mr--21 {
- margin-right: -21rpx;
-}
-
-.mr-22 {
- margin-right: 22rpx;
-}
-
-.mr--22 {
- margin-right: -22rpx;
-}
-
-.mr-23 {
- margin-right: 23rpx;
-}
-
-.mr--23 {
- margin-right: -23rpx;
-}
-
-.mr-24 {
- margin-right: 24rpx;
-}
-
-.mr--24 {
- margin-right: -24rpx;
-}
-
-.mr-25 {
- margin-right: 25rpx;
-}
-
-.mr--25 {
- margin-right: -25rpx;
-}
-
-.mr-n1 {
- margin-right: 4rpx;
-}
-
-.mr--n1 {
- margin-right: -4rpx;
-}
-
-.mr-n2 {
- margin-right: 8rpx;
-}
-
-.mr--n2 {
- margin-right: -8rpx;
-}
-
-.mr-n3 {
- margin-right: 12rpx;
-}
-
-.mr--n3 {
- margin-right: -12rpx;
-}
-
-.mr-n4 {
- margin-right: 16rpx;
-}
-
-.mr--n4 {
- margin-right: -16rpx;
-}
-
-.mr-n5 {
- margin-right: 20rpx;
-}
-
-.mr--n5 {
- margin-right: -20rpx;
-}
-
-.mr-n6 {
- margin-right: 24rpx;
-}
-
-.mr--n6 {
- margin-right: -24rpx;
-}
-
-.mr-n7 {
- margin-right: 28rpx;
-}
-
-.mr--n7 {
- margin-right: -28rpx;
-}
-
-.mr-n8 {
- margin-right: 32rpx;
-}
-
-.mr--n8 {
- margin-right: -32rpx;
-}
-
-.mr-n9 {
- margin-right: 36rpx;
-}
-
-.mr--n9 {
- margin-right: -36rpx;
-}
-
-.mr-n10 {
- margin-right: 40rpx;
-}
-
-.mr--n10 {
- margin-right: -40rpx;
-}
-
-.mr-n11 {
- margin-right: 44rpx;
-}
-
-.mr--n11 {
- margin-right: -44rpx;
-}
-
-.mr-n12 {
- margin-right: 48rpx;
-}
-
-.mr--n12 {
- margin-right: -48rpx;
-}
-
-.mr-n13 {
- margin-right: 52rpx;
-}
-
-.mr--n13 {
- margin-right: -52rpx;
-}
-
-.mr-n14 {
- margin-right: 56rpx;
-}
-
-.mr--n14 {
- margin-right: -56rpx;
-}
-
-.mr-n15 {
- margin-right: 60rpx;
-}
-
-.mr--n15 {
- margin-right: -60rpx;
-}
-
-.mr-n16 {
- margin-right: 64rpx;
-}
-
-.mr--n16 {
- margin-right: -64rpx;
-}
-
-.mr-n17 {
- margin-right: 68rpx;
-}
-
-.mr--n17 {
- margin-right: -68rpx;
-}
-
-.mr-n18 {
- margin-right: 72rpx;
-}
-
-.mr--n18 {
- margin-right: -72rpx;
-}
-
-.mr-n19 {
- margin-right: 76rpx;
-}
-
-.mr--n19 {
- margin-right: -76rpx;
-}
-
-.mr-n20 {
- margin-right: 80rpx;
-}
-
-.mr--n20 {
- margin-right: -80rpx;
-}
-
-.mr-n21 {
- margin-right: 84rpx;
-}
-
-.mr--n21 {
- margin-right: -84rpx;
-}
-
-.mr-n22 {
- margin-right: 88rpx;
-}
-
-.mr--n22 {
- margin-right: -88rpx;
-}
-
-.mr-n23 {
- margin-right: 92rpx;
-}
-
-.mr--n23 {
- margin-right: -92rpx;
-}
-
-.mr-n24 {
- margin-right: 96rpx;
-}
-
-.mr--n24 {
- margin-right: -96rpx;
-}
-
-.mr-n25 {
- margin-right: 100rpx;
-}
-
-.mr--n25 {
- margin-right: -100rpx;
-}
-
-.mb-0 {
- margin-bottom: 0rpx;
-}
-
-.mb--0 {
- margin-bottom: -0rpx;
-}
-
-.mb-1 {
- margin-bottom: 1rpx;
-}
-
-.mb--1 {
- margin-bottom: -1rpx;
-}
-
-.mb-2 {
- margin-bottom: 2rpx;
-}
-
-.mb--2 {
- margin-bottom: -2rpx;
-}
-
-.mb-3 {
- margin-bottom: 3rpx;
-}
-
-.mb--3 {
- margin-bottom: -3rpx;
-}
-
-.mb-4 {
- margin-bottom: 4rpx;
-}
-
-.mb--4 {
- margin-bottom: -4rpx;
-}
-
-.mb-5 {
- margin-bottom: 5rpx;
-}
-
-.mb--5 {
- margin-bottom: -5rpx;
-}
-
-.mb-6 {
- margin-bottom: 6rpx;
-}
-
-.mb--6 {
- margin-bottom: -6rpx;
-}
-
-.mb-7 {
- margin-bottom: 7rpx;
-}
-
-.mb--7 {
- margin-bottom: -7rpx;
-}
-
-.mb-8 {
- margin-bottom: 8rpx;
-}
-
-.mb--8 {
- margin-bottom: -8rpx;
-}
-
-.mb-9 {
- margin-bottom: 9rpx;
-}
-
-.mb--9 {
- margin-bottom: -9rpx;
-}
-
-.mb-10 {
- margin-bottom: 10rpx;
-}
-
-.mb--10 {
- margin-bottom: -10rpx;
-}
-
-.mb-11 {
- margin-bottom: 11rpx;
-}
-
-.mb--11 {
- margin-bottom: -11rpx;
-}
-
-.mb-12 {
- margin-bottom: 12rpx;
-}
-
-.mb--12 {
- margin-bottom: -12rpx;
-}
-
-.mb-13 {
- margin-bottom: 13rpx;
-}
-
-.mb--13 {
- margin-bottom: -13rpx;
-}
-
-.mb-14 {
- margin-bottom: 14rpx;
-}
-
-.mb--14 {
- margin-bottom: -14rpx;
-}
-
-.mb-15 {
- margin-bottom: 15rpx;
-}
-
-.mb--15 {
- margin-bottom: -15rpx;
-}
-
-.mb-16 {
- margin-bottom: 16rpx;
-}
-
-.mb--16 {
- margin-bottom: -16rpx;
-}
-
-.mb-17 {
- margin-bottom: 17rpx;
-}
-
-.mb--17 {
- margin-bottom: -17rpx;
-}
-
-.mb-18 {
- margin-bottom: 18rpx;
-}
-
-.mb--18 {
- margin-bottom: -18rpx;
-}
-
-.mb-19 {
- margin-bottom: 19rpx;
-}
-
-.mb--19 {
- margin-bottom: -19rpx;
-}
-
-.mb-20 {
- margin-bottom: 20rpx;
-}
-
-.mb--20 {
- margin-bottom: -20rpx;
-}
-
-.mb-21 {
- margin-bottom: 21rpx;
-}
-
-.mb--21 {
- margin-bottom: -21rpx;
-}
-
-.mb-22 {
- margin-bottom: 22rpx;
-}
-
-.mb--22 {
- margin-bottom: -22rpx;
-}
-
-.mb-23 {
- margin-bottom: 23rpx;
-}
-
-.mb--23 {
- margin-bottom: -23rpx;
-}
-
-.mb-24 {
- margin-bottom: 24rpx;
-}
-
-.mb--24 {
- margin-bottom: -24rpx;
-}
-
-.mb-25 {
- margin-bottom: 25rpx;
-}
-
-.mb--25 {
- margin-bottom: -25rpx;
-}
-
-.mb-n1 {
- margin-bottom: 4rpx;
-}
-
-.mb--n1 {
- margin-bottom: -4rpx;
-}
-
-.mb-n2 {
- margin-bottom: 8rpx;
-}
-
-.mb--n2 {
- margin-bottom: -8rpx;
-}
-
-.mb-n3 {
- margin-bottom: 12rpx;
-}
-
-.mb--n3 {
- margin-bottom: -12rpx;
-}
-
-.mb-n4 {
- margin-bottom: 16rpx;
-}
-
-.mb--n4 {
- margin-bottom: -16rpx;
-}
-
-.mb-n5 {
- margin-bottom: 20rpx;
-}
-
-.mb--n5 {
- margin-bottom: -20rpx;
-}
-
-.mb-n6 {
- margin-bottom: 24rpx;
-}
-
-.mb--n6 {
- margin-bottom: -24rpx;
-}
-
-.mb-n7 {
- margin-bottom: 28rpx;
-}
-
-.mb--n7 {
- margin-bottom: -28rpx;
-}
-
-.mb-n8 {
- margin-bottom: 32rpx;
-}
-
-.mb--n8 {
- margin-bottom: -32rpx;
-}
-
-.mb-n9 {
- margin-bottom: 36rpx;
-}
-
-.mb--n9 {
- margin-bottom: -36rpx;
-}
-
-.mb-n10 {
- margin-bottom: 40rpx;
-}
-
-.mb--n10 {
- margin-bottom: -40rpx;
-}
-
-.mb-n11 {
- margin-bottom: 44rpx;
-}
-
-.mb--n11 {
- margin-bottom: -44rpx;
-}
-
-.mb-n12 {
- margin-bottom: 48rpx;
-}
-
-.mb--n12 {
- margin-bottom: -48rpx;
-}
-
-.mb-n13 {
- margin-bottom: 52rpx;
-}
-
-.mb--n13 {
- margin-bottom: -52rpx;
-}
-
-.mb-n14 {
- margin-bottom: 56rpx;
-}
-
-.mb--n14 {
- margin-bottom: -56rpx;
-}
-
-.mb-n15 {
- margin-bottom: 60rpx;
-}
-
-.mb--n15 {
- margin-bottom: -60rpx;
-}
-
-.mb-n16 {
- margin-bottom: 64rpx;
-}
-
-.mb--n16 {
- margin-bottom: -64rpx;
-}
-
-.mb-n17 {
- margin-bottom: 68rpx;
-}
-
-.mb--n17 {
- margin-bottom: -68rpx;
-}
-
-.mb-n18 {
- margin-bottom: 72rpx;
-}
-
-.mb--n18 {
- margin-bottom: -72rpx;
-}
-
-.mb-n19 {
- margin-bottom: 76rpx;
-}
-
-.mb--n19 {
- margin-bottom: -76rpx;
-}
-
-.mb-n20 {
- margin-bottom: 80rpx;
-}
-
-.mb--n20 {
- margin-bottom: -80rpx;
-}
-
-.mb-n21 {
- margin-bottom: 84rpx;
-}
-
-.mb--n21 {
- margin-bottom: -84rpx;
-}
-
-.mb-n22 {
- margin-bottom: 88rpx;
-}
-
-.mb--n22 {
- margin-bottom: -88rpx;
-}
-
-.mb-n23 {
- margin-bottom: 92rpx;
-}
-
-.mb--n23 {
- margin-bottom: -92rpx;
-}
-
-.mb-n24 {
- margin-bottom: 96rpx;
-}
-
-.mb--n24 {
- margin-bottom: -96rpx;
-}
-
-.mb-n25 {
- margin-bottom: 100rpx;
-}
-
-.mb--n25 {
- margin-bottom: -100rpx;
-}
-
-.ml-0 {
- margin-left: 0rpx;
-}
-
-.ml--0 {
- margin-left: -0rpx;
-}
-
-.ml-1 {
- margin-left: 1rpx;
-}
-
-.ml--1 {
- margin-left: -1rpx;
-}
-
-.ml-2 {
- margin-left: 2rpx;
-}
-
-.ml--2 {
- margin-left: -2rpx;
-}
-
-.ml-3 {
- margin-left: 3rpx;
-}
-
-.ml--3 {
- margin-left: -3rpx;
-}
-
-.ml-4 {
- margin-left: 4rpx;
-}
-
-.ml--4 {
- margin-left: -4rpx;
-}
-
-.ml-5 {
- margin-left: 5rpx;
-}
-
-.ml--5 {
- margin-left: -5rpx;
-}
-
-.ml-6 {
- margin-left: 6rpx;
-}
-
-.ml--6 {
- margin-left: -6rpx;
-}
-
-.ml-7 {
- margin-left: 7rpx;
-}
-
-.ml--7 {
- margin-left: -7rpx;
-}
-
-.ml-8 {
- margin-left: 8rpx;
-}
-
-.ml--8 {
- margin-left: -8rpx;
-}
-
-.ml-9 {
- margin-left: 9rpx;
-}
-
-.ml--9 {
- margin-left: -9rpx;
-}
-
-.ml-10 {
- margin-left: 10rpx;
-}
-
-.ml--10 {
- margin-left: -10rpx;
-}
-
-.ml-11 {
- margin-left: 11rpx;
-}
-
-.ml--11 {
- margin-left: -11rpx;
-}
-
-.ml-12 {
- margin-left: 12rpx;
-}
-
-.ml--12 {
- margin-left: -12rpx;
-}
-
-.ml-13 {
- margin-left: 13rpx;
-}
-
-.ml--13 {
- margin-left: -13rpx;
-}
-
-.ml-14 {
- margin-left: 14rpx;
-}
-
-.ml--14 {
- margin-left: -14rpx;
-}
-
-.ml-15 {
- margin-left: 15rpx;
-}
-
-.ml--15 {
- margin-left: -15rpx;
-}
-
-.ml-16 {
- margin-left: 16rpx;
-}
-
-.ml--16 {
- margin-left: -16rpx;
-}
-
-.ml-17 {
- margin-left: 17rpx;
-}
-
-.ml--17 {
- margin-left: -17rpx;
-}
-
-.ml-18 {
- margin-left: 18rpx;
-}
-
-.ml--18 {
- margin-left: -18rpx;
-}
-
-.ml-19 {
- margin-left: 19rpx;
-}
-
-.ml--19 {
- margin-left: -19rpx;
-}
-
-.ml-20 {
- margin-left: 20rpx;
-}
-
-.ml--20 {
- margin-left: -20rpx;
-}
-
-.ml-21 {
- margin-left: 21rpx;
-}
-
-.ml--21 {
- margin-left: -21rpx;
-}
-
-.ml-22 {
- margin-left: 22rpx;
-}
-
-.ml--22 {
- margin-left: -22rpx;
-}
-
-.ml-23 {
- margin-left: 23rpx;
-}
-
-.ml--23 {
- margin-left: -23rpx;
-}
-
-.ml-24 {
- margin-left: 24rpx;
-}
-
-.ml--24 {
- margin-left: -24rpx;
-}
-
-.ml-25 {
- margin-left: 25rpx;
-}
-
-.ml--25 {
- margin-left: -25rpx;
-}
-
-.ml-n1 {
- margin-left: 4rpx;
-}
-
-.ml--n1 {
- margin-left: -4rpx;
-}
-
-.ml-n2 {
- margin-left: 8rpx;
-}
-
-.ml--n2 {
- margin-left: -8rpx;
-}
-
-.ml-n3 {
- margin-left: 12rpx;
-}
-
-.ml--n3 {
- margin-left: -12rpx;
-}
-
-.ml-n4 {
- margin-left: 16rpx;
-}
-
-.ml--n4 {
- margin-left: -16rpx;
-}
-
-.ml-n5 {
- margin-left: 20rpx;
-}
-
-.ml--n5 {
- margin-left: -20rpx;
-}
-
-.ml-n6 {
- margin-left: 24rpx;
-}
-
-.ml--n6 {
- margin-left: -24rpx;
-}
-
-.ml-n7 {
- margin-left: 28rpx;
-}
-
-.ml--n7 {
- margin-left: -28rpx;
-}
-
-.ml-n8 {
- margin-left: 32rpx;
-}
-
-.ml--n8 {
- margin-left: -32rpx;
-}
-
-.ml-n9 {
- margin-left: 36rpx;
-}
-
-.ml--n9 {
- margin-left: -36rpx;
-}
-
-.ml-n10 {
- margin-left: 40rpx;
-}
-
-.ml--n10 {
- margin-left: -40rpx;
-}
-
-.ml-n11 {
- margin-left: 44rpx;
-}
-
-.ml--n11 {
- margin-left: -44rpx;
-}
-
-.ml-n12 {
- margin-left: 48rpx;
-}
-
-.ml--n12 {
- margin-left: -48rpx;
-}
-
-.ml-n13 {
- margin-left: 52rpx;
-}
-
-.ml--n13 {
- margin-left: -52rpx;
-}
-
-.ml-n14 {
- margin-left: 56rpx;
-}
-
-.ml--n14 {
- margin-left: -56rpx;
-}
-
-.ml-n15 {
- margin-left: 60rpx;
-}
-
-.ml--n15 {
- margin-left: -60rpx;
-}
-
-.ml-n16 {
- margin-left: 64rpx;
-}
-
-.ml--n16 {
- margin-left: -64rpx;
-}
-
-.ml-n17 {
- margin-left: 68rpx;
-}
-
-.ml--n17 {
- margin-left: -68rpx;
-}
-
-.ml-n18 {
- margin-left: 72rpx;
-}
-
-.ml--n18 {
- margin-left: -72rpx;
-}
-
-.ml-n19 {
- margin-left: 76rpx;
-}
-
-.ml--n19 {
- margin-left: -76rpx;
-}
-
-.ml-n20 {
- margin-left: 80rpx;
-}
-
-.ml--n20 {
- margin-left: -80rpx;
-}
-
-.ml-n21 {
- margin-left: 84rpx;
-}
-
-.ml--n21 {
- margin-left: -84rpx;
-}
-
-.ml-n22 {
- margin-left: 88rpx;
-}
-
-.ml--n22 {
- margin-left: -88rpx;
-}
-
-.ml-n23 {
- margin-left: 92rpx;
-}
-
-.ml--n23 {
- margin-left: -92rpx;
-}
-
-.ml-n24 {
- margin-left: 96rpx;
-}
-
-.ml--n24 {
- margin-left: -96rpx;
-}
-
-.ml-n25 {
- margin-left: 100rpx;
-}
-
-.ml--n25 {
- margin-left: -100rpx;
-}
-
-.mx-0 {
- margin-left: 0rpx;
- margin-right: 0rpx;
-}
-
-.mx-1 {
- margin-left: 1rpx;
- margin-right: 1rpx;
-}
-
-.mx-2 {
- margin-left: 2rpx;
- margin-right: 2rpx;
-}
-
-.mx-3 {
- margin-left: 3rpx;
- margin-right: 3rpx;
-}
-
-.mx-4 {
- margin-left: 4rpx;
- margin-right: 4rpx;
-}
-
-.mx-5 {
- margin-left: 5rpx;
- margin-right: 5rpx;
-}
-
-.mx-6 {
- margin-left: 6rpx;
- margin-right: 6rpx;
-}
-
-.mx-7 {
- margin-left: 7rpx;
- margin-right: 7rpx;
-}
-
-.mx-8 {
- margin-left: 8rpx;
- margin-right: 8rpx;
-}
-
-.mx-9 {
- margin-left: 9rpx;
- margin-right: 9rpx;
-}
-
-.mx-10 {
- margin-left: 10rpx;
- margin-right: 10rpx;
-}
-
-.mx-11 {
- margin-left: 11rpx;
- margin-right: 11rpx;
-}
-
-.mx-12 {
- margin-left: 12rpx;
- margin-right: 12rpx;
-}
-
-.mx-13 {
- margin-left: 13rpx;
- margin-right: 13rpx;
-}
-
-.mx-14 {
- margin-left: 14rpx;
- margin-right: 14rpx;
-}
-
-.mx-15 {
- margin-left: 15rpx;
- margin-right: 15rpx;
-}
-
-.mx-16 {
- margin-left: 16rpx;
- margin-right: 16rpx;
-}
-
-.mx-17 {
- margin-left: 17rpx;
- margin-right: 17rpx;
-}
-
-.mx-18 {
- margin-left: 18rpx;
- margin-right: 18rpx;
-}
-
-.mx-19 {
- margin-left: 19rpx;
- margin-right: 19rpx;
-}
-
-.mx-20 {
- margin-left: 20rpx;
- margin-right: 20rpx;
-}
-
-.mx-21 {
- margin-left: 21rpx;
- margin-right: 21rpx;
-}
-
-.mx-22 {
- margin-left: 22rpx;
- margin-right: 22rpx;
-}
-
-.mx-23 {
- margin-left: 23rpx;
- margin-right: 23rpx;
-}
-
-.mx-24 {
- margin-left: 24rpx;
- margin-right: 24rpx;
-}
-
-.mx-25 {
- margin-left: 25rpx;
- margin-right: 25rpx;
-}
-
-.mx-n1 {
- margin-left: 4rpx;
- margin-right: 4rpx;
-}
-
-.mx-n2 {
- margin-left: 8rpx;
- margin-right: 8rpx;
-}
-
-.mx-n3 {
- margin-left: 12rpx;
- margin-right: 12rpx;
-}
-
-.mx-n4 {
- margin-left: 16rpx;
- margin-right: 16rpx;
-}
-
-.mx-n5 {
- margin-left: 20rpx;
- margin-right: 20rpx;
-}
-
-.mx-n6 {
- margin-left: 24rpx;
- margin-right: 24rpx;
-}
-
-.mx-n7 {
- margin-left: 28rpx;
- margin-right: 28rpx;
-}
-
-.mx-n8 {
- margin-left: 32rpx;
- margin-right: 32rpx;
-}
-
-.mx-n9 {
- margin-left: 36rpx;
- margin-right: 36rpx;
-}
-
-.mx-n10 {
- margin-left: 40rpx;
- margin-right: 40rpx;
-}
-
-.mx-n11 {
- margin-left: 44rpx;
- margin-right: 44rpx;
-}
-
-.mx-n12 {
- margin-left: 48rpx;
- margin-right: 48rpx;
-}
-
-.mx-n13 {
- margin-left: 52rpx;
- margin-right: 52rpx;
-}
-
-.mx-n14 {
- margin-left: 56rpx;
- margin-right: 56rpx;
-}
-
-.mx-n15 {
- margin-left: 60rpx;
- margin-right: 60rpx;
-}
-
-.mx-n16 {
- margin-left: 64rpx;
- margin-right: 64rpx;
-}
-
-.mx-n17 {
- margin-left: 68rpx;
- margin-right: 68rpx;
-}
-
-.mx-n18 {
- margin-left: 72rpx;
- margin-right: 72rpx;
-}
-
-.mx-n19 {
- margin-left: 76rpx;
- margin-right: 76rpx;
-}
-
-.mx-n20 {
- margin-left: 80rpx;
- margin-right: 80rpx;
-}
-
-.mx-n21 {
- margin-left: 84rpx;
- margin-right: 84rpx;
-}
-
-.mx-n22 {
- margin-left: 88rpx;
- margin-right: 88rpx;
-}
-
-.mx-n23 {
- margin-left: 92rpx;
- margin-right: 92rpx;
-}
-
-.mx-n24 {
- margin-left: 96rpx;
- margin-right: 96rpx;
-}
-
-.mx-n25 {
- margin-left: 100rpx;
- margin-right: 100rpx;
-}
-
-.my-0 {
- margin-top: 0rpx;
- margin-bottom: 0rpx;
-}
-
-.my-1 {
- margin-top: 1rpx;
- margin-bottom: 1rpx;
-}
-
-.my-2 {
- margin-top: 2rpx;
- margin-bottom: 2rpx;
-}
-
-.my-3 {
- margin-top: 3rpx;
- margin-bottom: 3rpx;
-}
-
-.my-4 {
- margin-top: 4rpx;
- margin-bottom: 4rpx;
-}
-
-.my-5 {
- margin-top: 5rpx;
- margin-bottom: 5rpx;
-}
-
-.my-6 {
- margin-top: 6rpx;
- margin-bottom: 6rpx;
-}
-
-.my-7 {
- margin-top: 7rpx;
- margin-bottom: 7rpx;
-}
-
-.my-8 {
- margin-top: 8rpx;
- margin-bottom: 8rpx;
-}
-
-.my-9 {
- margin-top: 9rpx;
- margin-bottom: 9rpx;
-}
-
-.my-10 {
- margin-top: 10rpx;
- margin-bottom: 10rpx;
-}
-
-.my-11 {
- margin-top: 11rpx;
- margin-bottom: 11rpx;
-}
-
-.my-12 {
- margin-top: 12rpx;
- margin-bottom: 12rpx;
-}
-
-.my-13 {
- margin-top: 13rpx;
- margin-bottom: 13rpx;
-}
-
-.my-14 {
- margin-top: 14rpx;
- margin-bottom: 14rpx;
-}
-
-.my-15 {
- margin-top: 15rpx;
- margin-bottom: 15rpx;
-}
-
-.my-16 {
- margin-top: 16rpx;
- margin-bottom: 16rpx;
-}
-
-.my-17 {
- margin-top: 17rpx;
- margin-bottom: 17rpx;
-}
-
-.my-18 {
- margin-top: 18rpx;
- margin-bottom: 18rpx;
-}
-
-.my-19 {
- margin-top: 19rpx;
- margin-bottom: 19rpx;
-}
-
-.my-20 {
- margin-top: 20rpx;
- margin-bottom: 20rpx;
-}
-
-.my-21 {
- margin-top: 21rpx;
- margin-bottom: 21rpx;
-}
-
-.my-22 {
- margin-top: 22rpx;
- margin-bottom: 22rpx;
-}
-
-.my-23 {
- margin-top: 23rpx;
- margin-bottom: 23rpx;
-}
-
-.my-24 {
- margin-top: 24rpx;
- margin-bottom: 24rpx;
-}
-
-.my-25 {
- margin-top: 25rpx;
- margin-bottom: 25rpx;
-}
-
-.my-n1 {
- margin-top: 4rpx;
- margin-bottom: 4rpx;
-}
-
-.my-n2 {
- margin-top: 8rpx;
- margin-bottom: 8rpx;
-}
-
-.my-n3 {
- margin-top: 12rpx;
- margin-bottom: 12rpx;
-}
-
-.my-n4 {
- margin-top: 16rpx;
- margin-bottom: 16rpx;
-}
-
-.my-n5 {
- margin-top: 20rpx;
- margin-bottom: 20rpx;
-}
-
-.my-n6 {
- margin-top: 24rpx;
- margin-bottom: 24rpx;
-}
-
-.my-n7 {
- margin-top: 28rpx;
- margin-bottom: 28rpx;
-}
-
-.my-n8 {
- margin-top: 32rpx;
- margin-bottom: 32rpx;
-}
-
-.my-n9 {
- margin-top: 36rpx;
- margin-bottom: 36rpx;
-}
-
-.my-n10 {
- margin-top: 40rpx;
- margin-bottom: 40rpx;
-}
-
-.my-n11 {
- margin-top: 44rpx;
- margin-bottom: 44rpx;
-}
-
-.my-n12 {
- margin-top: 48rpx;
- margin-bottom: 48rpx;
-}
-
-.my-n13 {
- margin-top: 52rpx;
- margin-bottom: 52rpx;
-}
-
-.my-n14 {
- margin-top: 56rpx;
- margin-bottom: 56rpx;
-}
-
-.my-n15 {
- margin-top: 60rpx;
- margin-bottom: 60rpx;
-}
-
-.my-n16 {
- margin-top: 64rpx;
- margin-bottom: 64rpx;
-}
-
-.my-n17 {
- margin-top: 68rpx;
- margin-bottom: 68rpx;
-}
-
-.my-n18 {
- margin-top: 72rpx;
- margin-bottom: 72rpx;
-}
-
-.my-n19 {
- margin-top: 76rpx;
- margin-bottom: 76rpx;
-}
-
-.my-n20 {
- margin-top: 80rpx;
- margin-bottom: 80rpx;
-}
-
-.my-n21 {
- margin-top: 84rpx;
- margin-bottom: 84rpx;
-}
-
-.my-n22 {
- margin-top: 88rpx;
- margin-bottom: 88rpx;
-}
-
-.my-n23 {
- margin-top: 92rpx;
- margin-bottom: 92rpx;
-}
-
-.my-n24 {
- margin-top: 96rpx;
- margin-bottom: 96rpx;
-}
-
-.my-n25 {
- margin-top: 100rpx;
- margin-bottom: 100rpx;
-}
-
-.t-0 {
- top: 0rpx;
-}
-
-.t--0 {
- top: -0rpx;
-}
-
-.t-1 {
- top: 1rpx;
-}
-
-.t--1 {
- top: -1rpx;
-}
-
-.t-2 {
- top: 2rpx;
-}
-
-.t--2 {
- top: -2rpx;
-}
-
-.t-3 {
- top: 3rpx;
-}
-
-.t--3 {
- top: -3rpx;
-}
-
-.t-4 {
- top: 4rpx;
-}
-
-.t--4 {
- top: -4rpx;
-}
-
-.t-5 {
- top: 5rpx;
-}
-
-.t--5 {
- top: -5rpx;
-}
-
-.t-6 {
- top: 6rpx;
-}
-
-.t--6 {
- top: -6rpx;
-}
-
-.t-7 {
- top: 7rpx;
-}
-
-.t--7 {
- top: -7rpx;
-}
-
-.t-8 {
- top: 8rpx;
-}
-
-.t--8 {
- top: -8rpx;
-}
-
-.t-9 {
- top: 9rpx;
-}
-
-.t--9 {
- top: -9rpx;
-}
-
-.t-10 {
- top: 10rpx;
-}
-
-.t--10 {
- top: -10rpx;
-}
-
-.t-11 {
- top: 11rpx;
-}
-
-.t--11 {
- top: -11rpx;
-}
-
-.t-12 {
- top: 12rpx;
-}
-
-.t--12 {
- top: -12rpx;
-}
-
-.t-13 {
- top: 13rpx;
-}
-
-.t--13 {
- top: -13rpx;
-}
-
-.t-14 {
- top: 14rpx;
-}
-
-.t--14 {
- top: -14rpx;
-}
-
-.t-15 {
- top: 15rpx;
-}
-
-.t--15 {
- top: -15rpx;
-}
-
-.t-16 {
- top: 16rpx;
-}
-
-.t--16 {
- top: -16rpx;
-}
-
-.t-17 {
- top: 17rpx;
-}
-
-.t--17 {
- top: -17rpx;
-}
-
-.t-18 {
- top: 18rpx;
-}
-
-.t--18 {
- top: -18rpx;
-}
-
-.t-19 {
- top: 19rpx;
-}
-
-.t--19 {
- top: -19rpx;
-}
-
-.t-20 {
- top: 20rpx;
-}
-
-.t--20 {
- top: -20rpx;
-}
-
-.t-21 {
- top: 21rpx;
-}
-
-.t--21 {
- top: -21rpx;
-}
-
-.t-22 {
- top: 22rpx;
-}
-
-.t--22 {
- top: -22rpx;
-}
-
-.t-23 {
- top: 23rpx;
-}
-
-.t--23 {
- top: -23rpx;
-}
-
-.t-24 {
- top: 24rpx;
-}
-
-.t--24 {
- top: -24rpx;
-}
-
-.t-25 {
- top: 25rpx;
-}
-
-.t--25 {
- top: -25rpx;
-}
-
-.t-n1 {
- top: 4rpx;
-}
-
-.t--n1 {
- top: -4rpx;
-}
-
-.t-n2 {
- top: 8rpx;
-}
-
-.t--n2 {
- top: -8rpx;
-}
-
-.t-n3 {
- top: 12rpx;
-}
-
-.t--n3 {
- top: -12rpx;
-}
-
-.t-n4 {
- top: 16rpx;
-}
-
-.t--n4 {
- top: -16rpx;
-}
-
-.t-n5 {
- top: 20rpx;
-}
-
-.t--n5 {
- top: -20rpx;
-}
-
-.t-n6 {
- top: 24rpx;
-}
-
-.t--n6 {
- top: -24rpx;
-}
-
-.t-n7 {
- top: 28rpx;
-}
-
-.t--n7 {
- top: -28rpx;
-}
-
-.t-n8 {
- top: 32rpx;
-}
-
-.t--n8 {
- top: -32rpx;
-}
-
-.t-n9 {
- top: 36rpx;
-}
-
-.t--n9 {
- top: -36rpx;
-}
-
-.t-n10 {
- top: 40rpx;
-}
-
-.t--n10 {
- top: -40rpx;
-}
-
-.t-n11 {
- top: 44rpx;
-}
-
-.t--n11 {
- top: -44rpx;
-}
-
-.t-n12 {
- top: 48rpx;
-}
-
-.t--n12 {
- top: -48rpx;
-}
-
-.t-n13 {
- top: 52rpx;
-}
-
-.t--n13 {
- top: -52rpx;
-}
-
-.t-n14 {
- top: 56rpx;
-}
-
-.t--n14 {
- top: -56rpx;
-}
-
-.t-n15 {
- top: 60rpx;
-}
-
-.t--n15 {
- top: -60rpx;
-}
-
-.t-n16 {
- top: 64rpx;
-}
-
-.t--n16 {
- top: -64rpx;
-}
-
-.t-n17 {
- top: 68rpx;
-}
-
-.t--n17 {
- top: -68rpx;
-}
-
-.t-n18 {
- top: 72rpx;
-}
-
-.t--n18 {
- top: -72rpx;
-}
-
-.t-n19 {
- top: 76rpx;
-}
-
-.t--n19 {
- top: -76rpx;
-}
-
-.t-n20 {
- top: 80rpx;
-}
-
-.t--n20 {
- top: -80rpx;
-}
-
-.t-n21 {
- top: 84rpx;
-}
-
-.t--n21 {
- top: -84rpx;
-}
-
-.t-n22 {
- top: 88rpx;
-}
-
-.t--n22 {
- top: -88rpx;
-}
-
-.t-n23 {
- top: 92rpx;
-}
-
-.t--n23 {
- top: -92rpx;
-}
-
-.t-n24 {
- top: 96rpx;
-}
-
-.t--n24 {
- top: -96rpx;
-}
-
-.t-n25 {
- top: 100rpx;
-}
-
-.t--n25 {
- top: -100rpx;
-}
-
-.r-0 {
- right: 0rpx;
-}
-
-.r--0 {
- right: -0rpx;
-}
-
-.r-1 {
- right: 1rpx;
-}
-
-.r--1 {
- right: -1rpx;
-}
-
-.r-2 {
- right: 2rpx;
-}
-
-.r--2 {
- right: -2rpx;
-}
-
-.r-3 {
- right: 3rpx;
-}
-
-.r--3 {
- right: -3rpx;
-}
-
-.r-4 {
- right: 4rpx;
-}
-
-.r--4 {
- right: -4rpx;
-}
-
-.r-5 {
- right: 5rpx;
-}
-
-.r--5 {
- right: -5rpx;
-}
-
-.r-6 {
- right: 6rpx;
-}
-
-.r--6 {
- right: -6rpx;
-}
-
-.r-7 {
- right: 7rpx;
-}
-
-.r--7 {
- right: -7rpx;
-}
-
-.r-8 {
- right: 8rpx;
-}
-
-.r--8 {
- right: -8rpx;
-}
-
-.r-9 {
- right: 9rpx;
-}
-
-.r--9 {
- right: -9rpx;
-}
-
-.r-10 {
- right: 10rpx;
-}
-
-.r--10 {
- right: -10rpx;
-}
-
-.r-11 {
- right: 11rpx;
-}
-
-.r--11 {
- right: -11rpx;
-}
-
-.r-12 {
- right: 12rpx;
-}
-
-.r--12 {
- right: -12rpx;
-}
-
-.r-13 {
- right: 13rpx;
-}
-
-.r--13 {
- right: -13rpx;
-}
-
-.r-14 {
- right: 14rpx;
-}
-
-.r--14 {
- right: -14rpx;
-}
-
-.r-15 {
- right: 15rpx;
-}
-
-.r--15 {
- right: -15rpx;
-}
-
-.r-16 {
- right: 16rpx;
-}
-
-.r--16 {
- right: -16rpx;
-}
-
-.r-17 {
- right: 17rpx;
-}
-
-.r--17 {
- right: -17rpx;
-}
-
-.r-18 {
- right: 18rpx;
-}
-
-.r--18 {
- right: -18rpx;
-}
-
-.r-19 {
- right: 19rpx;
-}
-
-.r--19 {
- right: -19rpx;
-}
-
-.r-20 {
- right: 20rpx;
-}
-
-.r--20 {
- right: -20rpx;
-}
-
-.r-21 {
- right: 21rpx;
-}
-
-.r--21 {
- right: -21rpx;
-}
-
-.r-22 {
- right: 22rpx;
-}
-
-.r--22 {
- right: -22rpx;
-}
-
-.r-23 {
- right: 23rpx;
-}
-
-.r--23 {
- right: -23rpx;
-}
-
-.r-24 {
- right: 24rpx;
-}
-
-.r--24 {
- right: -24rpx;
-}
-
-.r-25 {
- right: 25rpx;
-}
-
-.r--25 {
- right: -25rpx;
-}
-
-.r-n1 {
- right: 4rpx;
-}
-
-.r--n1 {
- right: -4rpx;
-}
-
-.r-n2 {
- right: 8rpx;
-}
-
-.r--n2 {
- right: -8rpx;
-}
-
-.r-n3 {
- right: 12rpx;
-}
-
-.r--n3 {
- right: -12rpx;
-}
-
-.r-n4 {
- right: 16rpx;
-}
-
-.r--n4 {
- right: -16rpx;
-}
-
-.r-n5 {
- right: 20rpx;
-}
-
-.r--n5 {
- right: -20rpx;
-}
-
-.r-n6 {
- right: 24rpx;
-}
-
-.r--n6 {
- right: -24rpx;
-}
-
-.r-n7 {
- right: 28rpx;
-}
-
-.r--n7 {
- right: -28rpx;
-}
-
-.r-n8 {
- right: 32rpx;
-}
-
-.r--n8 {
- right: -32rpx;
-}
-
-.r-n9 {
- right: 36rpx;
-}
-
-.r--n9 {
- right: -36rpx;
-}
-
-.r-n10 {
- right: 40rpx;
-}
-
-.r--n10 {
- right: -40rpx;
-}
-
-.r-n11 {
- right: 44rpx;
-}
-
-.r--n11 {
- right: -44rpx;
-}
-
-.r-n12 {
- right: 48rpx;
-}
-
-.r--n12 {
- right: -48rpx;
-}
-
-.r-n13 {
- right: 52rpx;
-}
-
-.r--n13 {
- right: -52rpx;
-}
-
-.r-n14 {
- right: 56rpx;
-}
-
-.r--n14 {
- right: -56rpx;
-}
-
-.r-n15 {
- right: 60rpx;
-}
-
-.r--n15 {
- right: -60rpx;
-}
-
-.r-n16 {
- right: 64rpx;
-}
-
-.r--n16 {
- right: -64rpx;
-}
-
-.r-n17 {
- right: 68rpx;
-}
-
-.r--n17 {
- right: -68rpx;
-}
-
-.r-n18 {
- right: 72rpx;
-}
-
-.r--n18 {
- right: -72rpx;
-}
-
-.r-n19 {
- right: 76rpx;
-}
-
-.r--n19 {
- right: -76rpx;
-}
-
-.r-n20 {
- right: 80rpx;
-}
-
-.r--n20 {
- right: -80rpx;
-}
-
-.r-n21 {
- right: 84rpx;
-}
-
-.r--n21 {
- right: -84rpx;
-}
-
-.r-n22 {
- right: 88rpx;
-}
-
-.r--n22 {
- right: -88rpx;
-}
-
-.r-n23 {
- right: 92rpx;
-}
-
-.r--n23 {
- right: -92rpx;
-}
-
-.r-n24 {
- right: 96rpx;
-}
-
-.r--n24 {
- right: -96rpx;
-}
-
-.r-n25 {
- right: 100rpx;
-}
-
-.r--n25 {
- right: -100rpx;
-}
-
-.b-0 {
- bottom: 0rpx;
-}
-
-.b--0 {
- bottom: -0rpx;
-}
-
-.b-1 {
- bottom: 1rpx;
-}
-
-.b--1 {
- bottom: -1rpx;
-}
-
-.b-2 {
- bottom: 2rpx;
-}
-
-.b--2 {
- bottom: -2rpx;
-}
-
-.b-3 {
- bottom: 3rpx;
-}
-
-.b--3 {
- bottom: -3rpx;
-}
-
-.b-4 {
- bottom: 4rpx;
-}
-
-.b--4 {
- bottom: -4rpx;
-}
-
-.b-5 {
- bottom: 5rpx;
-}
-
-.b--5 {
- bottom: -5rpx;
-}
-
-.b-6 {
- bottom: 6rpx;
-}
-
-.b--6 {
- bottom: -6rpx;
-}
-
-.b-7 {
- bottom: 7rpx;
-}
-
-.b--7 {
- bottom: -7rpx;
-}
-
-.b-8 {
- bottom: 8rpx;
-}
-
-.b--8 {
- bottom: -8rpx;
-}
-
-.b-9 {
- bottom: 9rpx;
-}
-
-.b--9 {
- bottom: -9rpx;
-}
-
-.b-10 {
- bottom: 10rpx;
-}
-
-.b--10 {
- bottom: -10rpx;
-}
-
-.b-11 {
- bottom: 11rpx;
-}
-
-.b--11 {
- bottom: -11rpx;
-}
-
-.b-12 {
- bottom: 12rpx;
-}
-
-.b--12 {
- bottom: -12rpx;
-}
-
-.b-13 {
- bottom: 13rpx;
-}
-
-.b--13 {
- bottom: -13rpx;
-}
-
-.b-14 {
- bottom: 14rpx;
-}
-
-.b--14 {
- bottom: -14rpx;
-}
-
-.b-15 {
- bottom: 15rpx;
-}
-
-.b--15 {
- bottom: -15rpx;
-}
-
-.b-16 {
- bottom: 16rpx;
-}
-
-.b--16 {
- bottom: -16rpx;
-}
-
-.b-17 {
- bottom: 17rpx;
-}
-
-.b--17 {
- bottom: -17rpx;
-}
-
-.b-18 {
- bottom: 18rpx;
-}
-
-.b--18 {
- bottom: -18rpx;
-}
-
-.b-19 {
- bottom: 19rpx;
-}
-
-.b--19 {
- bottom: -19rpx;
-}
-
-.b-20 {
- bottom: 20rpx;
-}
-
-.b--20 {
- bottom: -20rpx;
-}
-
-.b-21 {
- bottom: 21rpx;
-}
-
-.b--21 {
- bottom: -21rpx;
-}
-
-.b-22 {
- bottom: 22rpx;
-}
-
-.b--22 {
- bottom: -22rpx;
-}
-
-.b-23 {
- bottom: 23rpx;
-}
-
-.b--23 {
- bottom: -23rpx;
-}
-
-.b-24 {
- bottom: 24rpx;
-}
-
-.b--24 {
- bottom: -24rpx;
-}
-
-.b-25 {
- bottom: 25rpx;
-}
-
-.b--25 {
- bottom: -25rpx;
-}
-
-.b-n1 {
- bottom: 4rpx;
-}
-
-.b--n1 {
- bottom: -4rpx;
-}
-
-.b-n2 {
- bottom: 8rpx;
-}
-
-.b--n2 {
- bottom: -8rpx;
-}
-
-.b-n3 {
- bottom: 12rpx;
-}
-
-.b--n3 {
- bottom: -12rpx;
-}
-
-.b-n4 {
- bottom: 16rpx;
-}
-
-.b--n4 {
- bottom: -16rpx;
-}
-
-.b-n5 {
- bottom: 20rpx;
-}
-
-.b--n5 {
- bottom: -20rpx;
-}
-
-.b-n6 {
- bottom: 24rpx;
-}
-
-.b--n6 {
- bottom: -24rpx;
-}
-
-.b-n7 {
- bottom: 28rpx;
-}
-
-.b--n7 {
- bottom: -28rpx;
-}
-
-.b-n8 {
- bottom: 32rpx;
-}
-
-.b--n8 {
- bottom: -32rpx;
-}
-
-.b-n9 {
- bottom: 36rpx;
-}
-
-.b--n9 {
- bottom: -36rpx;
-}
-
-.b-n10 {
- bottom: 40rpx;
-}
-
-.b--n10 {
- bottom: -40rpx;
-}
-
-.b-n11 {
- bottom: 44rpx;
-}
-
-.b--n11 {
- bottom: -44rpx;
-}
-
-.b-n12 {
- bottom: 48rpx;
-}
-
-.b--n12 {
- bottom: -48rpx;
-}
-
-.b-n13 {
- bottom: 52rpx;
-}
-
-.b--n13 {
- bottom: -52rpx;
-}
-
-.b-n14 {
- bottom: 56rpx;
-}
-
-.b--n14 {
- bottom: -56rpx;
-}
-
-.b-n15 {
- bottom: 60rpx;
-}
-
-.b--n15 {
- bottom: -60rpx;
-}
-
-.b-n16 {
- bottom: 64rpx;
-}
-
-.b--n16 {
- bottom: -64rpx;
-}
-
-.b-n17 {
- bottom: 68rpx;
-}
-
-.b--n17 {
- bottom: -68rpx;
-}
-
-.b-n18 {
- bottom: 72rpx;
-}
-
-.b--n18 {
- bottom: -72rpx;
-}
-
-.b-n19 {
- bottom: 76rpx;
-}
-
-.b--n19 {
- bottom: -76rpx;
-}
-
-.b-n20 {
- bottom: 80rpx;
-}
-
-.b--n20 {
- bottom: -80rpx;
-}
-
-.b-n21 {
- bottom: 84rpx;
-}
-
-.b--n21 {
- bottom: -84rpx;
-}
-
-.b-n22 {
- bottom: 88rpx;
-}
-
-.b--n22 {
- bottom: -88rpx;
-}
-
-.b-n23 {
- bottom: 92rpx;
-}
-
-.b--n23 {
- bottom: -92rpx;
-}
-
-.b-n24 {
- bottom: 96rpx;
-}
-
-.b--n24 {
- bottom: -96rpx;
-}
-
-.b-n25 {
- bottom: 100rpx;
-}
-
-.b--n25 {
- bottom: -100rpx;
-}
-
-.l-0 {
- left: 0rpx;
-}
-
-.l--0 {
- left: -0rpx;
-}
-
-.l-1 {
- left: 1rpx;
-}
-
-.l--1 {
- left: -1rpx;
-}
-
-.l-2 {
- left: 2rpx;
-}
-
-.l--2 {
- left: -2rpx;
-}
-
-.l-3 {
- left: 3rpx;
-}
-
-.l--3 {
- left: -3rpx;
-}
-
-.l-4 {
- left: 4rpx;
-}
-
-.l--4 {
- left: -4rpx;
-}
-
-.l-5 {
- left: 5rpx;
-}
-
-.l--5 {
- left: -5rpx;
-}
-
-.l-6 {
- left: 6rpx;
-}
-
-.l--6 {
- left: -6rpx;
-}
-
-.l-7 {
- left: 7rpx;
-}
-
-.l--7 {
- left: -7rpx;
-}
-
-.l-8 {
- left: 8rpx;
-}
-
-.l--8 {
- left: -8rpx;
-}
-
-.l-9 {
- left: 9rpx;
-}
-
-.l--9 {
- left: -9rpx;
-}
-
-.l-10 {
- left: 10rpx;
-}
-
-.l--10 {
- left: -10rpx;
-}
-
-.l-11 {
- left: 11rpx;
-}
-
-.l--11 {
- left: -11rpx;
-}
-
-.l-12 {
- left: 12rpx;
-}
-
-.l--12 {
- left: -12rpx;
-}
-
-.l-13 {
- left: 13rpx;
-}
-
-.l--13 {
- left: -13rpx;
-}
-
-.l-14 {
- left: 14rpx;
-}
-
-.l--14 {
- left: -14rpx;
-}
-
-.l-15 {
- left: 15rpx;
-}
-
-.l--15 {
- left: -15rpx;
-}
-
-.l-16 {
- left: 16rpx;
-}
-
-.l--16 {
- left: -16rpx;
-}
-
-.l-17 {
- left: 17rpx;
-}
-
-.l--17 {
- left: -17rpx;
-}
-
-.l-18 {
- left: 18rpx;
-}
-
-.l--18 {
- left: -18rpx;
-}
-
-.l-19 {
- left: 19rpx;
-}
-
-.l--19 {
- left: -19rpx;
-}
-
-.l-20 {
- left: 20rpx;
-}
-
-.l--20 {
- left: -20rpx;
-}
-
-.l-21 {
- left: 21rpx;
-}
-
-.l--21 {
- left: -21rpx;
-}
-
-.l-22 {
- left: 22rpx;
-}
-
-.l--22 {
- left: -22rpx;
-}
-
-.l-23 {
- left: 23rpx;
-}
-
-.l--23 {
- left: -23rpx;
-}
-
-.l-24 {
- left: 24rpx;
-}
-
-.l--24 {
- left: -24rpx;
-}
-
-.l-25 {
- left: 25rpx;
-}
-
-.l--25 {
- left: -25rpx;
-}
-
-.l-n1 {
- left: 4rpx;
-}
-
-.l--n1 {
- left: -4rpx;
-}
-
-.l-n2 {
- left: 8rpx;
-}
-
-.l--n2 {
- left: -8rpx;
-}
-
-.l-n3 {
- left: 12rpx;
-}
-
-.l--n3 {
- left: -12rpx;
-}
-
-.l-n4 {
- left: 16rpx;
-}
-
-.l--n4 {
- left: -16rpx;
-}
-
-.l-n5 {
- left: 20rpx;
-}
-
-.l--n5 {
- left: -20rpx;
-}
-
-.l-n6 {
- left: 24rpx;
-}
-
-.l--n6 {
- left: -24rpx;
-}
-
-.l-n7 {
- left: 28rpx;
-}
-
-.l--n7 {
- left: -28rpx;
-}
-
-.l-n8 {
- left: 32rpx;
-}
-
-.l--n8 {
- left: -32rpx;
-}
-
-.l-n9 {
- left: 36rpx;
-}
-
-.l--n9 {
- left: -36rpx;
-}
-
-.l-n10 {
- left: 40rpx;
-}
-
-.l--n10 {
- left: -40rpx;
-}
-
-.l-n11 {
- left: 44rpx;
-}
-
-.l--n11 {
- left: -44rpx;
-}
-
-.l-n12 {
- left: 48rpx;
-}
-
-.l--n12 {
- left: -48rpx;
-}
-
-.l-n13 {
- left: 52rpx;
-}
-
-.l--n13 {
- left: -52rpx;
-}
-
-.l-n14 {
- left: 56rpx;
-}
-
-.l--n14 {
- left: -56rpx;
-}
-
-.l-n15 {
- left: 60rpx;
-}
-
-.l--n15 {
- left: -60rpx;
-}
-
-.l-n16 {
- left: 64rpx;
-}
-
-.l--n16 {
- left: -64rpx;
-}
-
-.l-n17 {
- left: 68rpx;
-}
-
-.l--n17 {
- left: -68rpx;
-}
-
-.l-n18 {
- left: 72rpx;
-}
-
-.l--n18 {
- left: -72rpx;
-}
-
-.l-n19 {
- left: 76rpx;
-}
-
-.l--n19 {
- left: -76rpx;
-}
-
-.l-n20 {
- left: 80rpx;
-}
-
-.l--n20 {
- left: -80rpx;
-}
-
-.l-n21 {
- left: 84rpx;
-}
-
-.l--n21 {
- left: -84rpx;
-}
-
-.l-n22 {
- left: 88rpx;
-}
-
-.l--n22 {
- left: -88rpx;
-}
-
-.l-n23 {
- left: 92rpx;
-}
-
-.l--n23 {
- left: -92rpx;
-}
-
-.l-n24 {
- left: 96rpx;
-}
-
-.l--n24 {
- left: -96rpx;
-}
-
-.l-n25 {
- left: 100rpx;
-}
-
-.l--n25 {
- left: -100rpx;
-}
-
-.grid {
- display: grid !important;
-}
-
-.grid-col-1 {
- grid-template-columns: repeat(1, 1fr);
-}
-
-.grid-col-2 {
- grid-template-columns: repeat(2, 1fr);
-}
-
-.grid-col-3 {
- grid-template-columns: repeat(3, 1fr);
-}
-
-.grid-col-4 {
- grid-template-columns: repeat(4, 1fr);
-}
-
-.grid-col-5 {
- grid-template-columns: repeat(5, 1fr);
-}
-
-.grid-col-6 {
- grid-template-columns: repeat(6, 1fr);
-}
-
-.grid-col-7 {
- grid-template-columns: repeat(7, 1fr);
-}
-
-.grid-col-8 {
- grid-template-columns: repeat(8, 1fr);
-}
-
-.grid-col-9 {
- grid-template-columns: repeat(9, 1fr);
-}
-
-.grid-col-10 {
- grid-template-columns: repeat(10, 1fr);
-}
-
-.grid-col-11 {
- grid-template-columns: repeat(11, 1fr);
-}
-
-.gap-1 {
- gap: 2rpx;
-}
-
-.gap-col-1 {
- grid-column-gap: 2rpx;
-}
-
-.gap-row-1 {
- grid-row-gap: 2rpx;
-}
-
-.gap-2 {
- gap: 4rpx;
-}
-
-.gap-col-2 {
- grid-column-gap: 4rpx;
-}
-
-.gap-row-2 {
- grid-row-gap: 4rpx;
-}
-
-.gap-3 {
- gap: 6rpx;
-}
-
-.gap-col-3 {
- grid-column-gap: 6rpx;
-}
-
-.gap-row-3 {
- grid-row-gap: 6rpx;
-}
-
-.gap-4 {
- gap: 8rpx;
-}
-
-.gap-col-4 {
- grid-column-gap: 8rpx;
-}
-
-.gap-row-4 {
- grid-row-gap: 8rpx;
-}
-
-.gap-5 {
- gap: 10rpx;
-}
-
-.gap-col-5 {
- grid-column-gap: 10rpx;
-}
-
-.gap-row-5 {
- grid-row-gap: 10rpx;
-}
-
-.gap-6 {
- gap: 12rpx;
-}
-
-.gap-col-6 {
- grid-column-gap: 12rpx;
-}
-
-.gap-row-6 {
- grid-row-gap: 12rpx;
-}
-
-.gap-7 {
- gap: 14rpx;
-}
-
-.gap-col-7 {
- grid-column-gap: 14rpx;
-}
-
-.gap-row-7 {
- grid-row-gap: 14rpx;
-}
-
-.gap-8 {
- gap: 16rpx;
-}
-
-.gap-col-8 {
- grid-column-gap: 16rpx;
-}
-
-.gap-row-8 {
- grid-row-gap: 16rpx;
-}
-
-.gap-9 {
- gap: 18rpx;
-}
-
-.gap-col-9 {
- grid-column-gap: 18rpx;
-}
-
-.gap-row-9 {
- grid-row-gap: 18rpx;
-}
-
-.gap-10 {
- gap: 20rpx;
-}
-
-.gap-col-10 {
- grid-column-gap: 20rpx;
-}
-
-.gap-row-10 {
- grid-row-gap: 20rpx;
-}
-
-.gap-11 {
- gap: 22rpx;
-}
-
-.gap-col-11 {
- grid-column-gap: 22rpx;
-}
-
-.gap-row-11 {
- grid-row-gap: 22rpx;
-}
-
-.gap-12 {
- gap: 24rpx;
-}
-
-.gap-col-12 {
- grid-column-gap: 24rpx;
-}
-
-.gap-row-12 {
- grid-row-gap: 24rpx;
-}
-
-.gap-13 {
- gap: 26rpx;
-}
-
-.gap-col-13 {
- grid-column-gap: 26rpx;
-}
-
-.gap-row-13 {
- grid-row-gap: 26rpx;
-}
-
-.gap-14 {
- gap: 28rpx;
-}
-
-.gap-col-14 {
- grid-column-gap: 28rpx;
-}
-
-.gap-row-14 {
- grid-row-gap: 28rpx;
-}
-
-.gap-15 {
- gap: 30rpx;
-}
-
-.gap-col-15 {
- grid-column-gap: 30rpx;
-}
-
-.gap-row-15 {
- grid-row-gap: 30rpx;
-}
-
-.gap-16 {
- gap: 32rpx;
-}
-
-.gap-col-16 {
- grid-column-gap: 32rpx;
-}
-
-.gap-row-16 {
- grid-row-gap: 32rpx;
-}
-
-.gap-17 {
- gap: 34rpx;
-}
-
-.gap-col-17 {
- grid-column-gap: 34rpx;
-}
-
-.gap-row-17 {
- grid-row-gap: 34rpx;
-}
-
-.gap-18 {
- gap: 36rpx;
-}
-
-.gap-col-18 {
- grid-column-gap: 36rpx;
-}
-
-.gap-row-18 {
- grid-row-gap: 36rpx;
-}
-
-.gap-19 {
- gap: 38rpx;
-}
-
-.gap-col-19 {
- grid-column-gap: 38rpx;
-}
-
-.gap-row-19 {
- grid-row-gap: 38rpx;
-}
-
-.gap-20 {
- gap: 40rpx;
-}
-
-.gap-col-20 {
- grid-column-gap: 40rpx;
-}
-
-.gap-row-20 {
- grid-row-gap: 40rpx;
-}
-
-.gap-21 {
- gap: 42rpx;
-}
-
-.gap-col-21 {
- grid-column-gap: 42rpx;
-}
-
-.gap-row-21 {
- grid-row-gap: 42rpx;
-}
-
-.gap-22 {
- gap: 44rpx;
-}
-
-.gap-col-22 {
- grid-column-gap: 44rpx;
-}
-
-.gap-row-22 {
- grid-row-gap: 44rpx;
-}
-
-.gap-23 {
- gap: 46rpx;
-}
-
-.gap-col-23 {
- grid-column-gap: 46rpx;
-}
-
-.gap-row-23 {
- grid-row-gap: 46rpx;
-}
-
-.gap-24 {
- gap: 48rpx;
-}
-
-.gap-col-24 {
- grid-column-gap: 48rpx;
-}
-
-.gap-row-24 {
- grid-row-gap: 48rpx;
-}
-
-.gap-25 {
- gap: 50rpx;
-}
-
-.gap-col-25 {
- grid-column-gap: 50rpx;
-}
-
-.gap-row-25 {
- grid-row-gap: 50rpx;
-}
-
-.flex {
- display: flex !important;
-}
-
-.flex-col {
- flex-direction: column !important;
-}
-
-.flex-wrap {
- flex-flow: row wrap !important;
-}
-
-/* #ifndef APP-PLUS-NVUE */
-.flex-shrink {
- flex-shrink: 0 !important;
-}
-
-/* #endif */
-.flex-row {
- flex-direction: row !important;
-}
-
-.flex-reverse {
- flex-direction: row-reverse !important;
-}
-
-.flex-row-top-start {
- justify-content: flex-start !important;
- align-items: flex-start !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-top-center {
- justify-content: center !important;
- align-items: flex-start !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-top-end {
- justify-content: flex-end !important;
- align-items: flex-start !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-center-start {
- justify-content: flex-start !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-center-center {
- justify-content: center !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-center-end {
- justify-content: flex-end !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-bottom-start {
- justify-content: flex-start !important;
- align-items: flex-end !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-bottom-center {
- justify-content: center !important;
- align-items: flex-end !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-bottom-end {
- justify-content: flex-end !important;
- align-items: flex-end !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-center-between {
- justify-content: space-between !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-top-start {
- justify-content: flex-start !important;
- align-items: flex-start !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-top-center {
- justify-content: flex-start !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-top-end {
- justify-content: flex-start !important;
- align-items: flex-end !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-center-start {
- justify-content: center !important;
- align-items: flex-start !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-center-center {
- justify-content: center !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-center-end {
- justify-content: center !important;
- align-items: flex-end !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-bottom-start {
- justify-content: flex-end !important;
- align-items: flex-start !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-bottom-center {
- justify-content: flex-end !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-col-bottom-end {
- justify-content: flex-end !important;
- align-items: flex-end !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-start {
- justify-content: flex-start !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-end {
- justify-content: flex-end !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-center {
- justify-content: center !important;
- align-items: center !important;
- align-content: center;
- display: flex !important;
-}
-
-.flex-between {
- justify-content: space-between;
-}
-
-.flex-col-full {
- flex-direction: column;
- align-items: stretch;
-}
-
-.flex-around {
- justify-content: space-around;
-}
-
-.flex-row-baseline-start {
- justify-content: flex-start !important;
- align-items: baseline !important;
- align-content: center;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-baseline-center {
- justify-content: center !important;
- align-items: baseline !important;
- align-content: center;
- align-content: center;
- display: flex !important;
-}
-
-.flex-row-baseline-end {
- justify-content: flex-end !important;
- align-items: baseline !important;
- align-content: center;
- align-content: center;
- display: flex !important;
-}
-
-.flex-0 {
- flex-grow: 0 !important;
-}
-
-.flex-1 {
- flex-grow: 1 !important;
-}
-
-.flex-2 {
- flex-grow: 2 !important;
-}
-
-.flex-3 {
- flex-grow: 3 !important;
-}
-
-.flex-4 {
- flex-grow: 4 !important;
-}
-
-.flex-5 {
- flex-grow: 5 !important;
-}
-
-.flex-6 {
- flex-grow: 6 !important;
-}
-
-.flex-7 {
- flex-grow: 7 !important;
-}
-
-.flex-8 {
- flex-grow: 8 !important;
-}
-
-.flex-9 {
- flex-grow: 9 !important;
-}
-
-.flex-10 {
- flex-grow: 10 !important;
-}
-
-.flex-11 {
- flex-grow: 11 !important;
-}
-
-.flex-12 {
- flex-grow: 12 !important;
-}
-
-.text-red {
- color: #f44336 !important;
-}
-
-.red {
- background-color: #f44336;
-}
-
-.text-pink {
- color: #e91e63 !important;
-}
-
-.pink {
- background-color: #e91e63;
-}
-
-.text-purple {
- color: #9c27b0 !important;
-}
-
-.purple {
- background-color: #9c27b0;
-}
-
-.text-deep-purple {
- color: #673ab7 !important;
-}
-
-.deep-purple {
- background-color: #673ab7;
-}
-
-.text-indigo {
- color: #3f51b5 !important;
-}
-
-.indigo {
- background-color: #3f51b5;
-}
-
-.text-blue {
- color: #2196f3 !important;
-}
-
-.blue {
- background-color: #2196f3;
-}
-
-.text-light-blue {
- color: #03a9f4 !important;
-}
-
-.light-blue {
- background-color: #03a9f4;
-}
-
-.text-cyan {
- color: #00bcd4 !important;
-}
-
-.cyan {
- background-color: #00bcd4;
-}
-
-.text-teal {
- color: #009688 !important;
-}
-
-.teal {
- background-color: #009688;
-}
-
-.text-green {
- color: #4caf50 !important;
-}
-
-.green {
- background-color: #4caf50;
-}
-
-.text-light-green {
- color: #8bc34a !important;
-}
-
-.light-green {
- background-color: #8bc34a;
-}
-
-.text-lime {
- color: #cddc39 !important;
-}
-
-.lime {
- background-color: #cddc39;
-}
-
-.text-yellow {
- color: #ffeb3b !important;
-}
-
-.yellow {
- background-color: #ffeb3b;
-}
-
-.text-amber {
- color: #ffc107 !important;
-}
-
-.amber {
- background-color: #ffc107;
-}
-
-.text-orange {
- color: #ff9800 !important;
-}
-
-.orange {
- background-color: #ff9800;
-}
-
-.text-deep-orange {
- color: #ff5722 !important;
-}
-
-.deep-orange {
- background-color: #ff5722;
-}
-
-.text-brown {
- color: #795548 !important;
-}
-
-.brown {
- background-color: #795548;
-}
-
-.text-blue-grey {
- color: #607d8b !important;
-}
-
-.blue-grey {
- background-color: #607d8b;
-}
-
-.text-grey {
- color: #9e9e9e !important;
-}
-
-.grey {
- background-color: #9e9e9e;
-}
-
-.text-black {
- color: #000000 !important;
-}
-
-.black {
- background-color: #000000;
-}
-
-.text-white {
- color: #ffffff !important;
-}
-
-.white {
- background-color: #ffffff;
-}
-
-.text-lighten-5 {
- color: #fafafa !important;
-}
-
-.lighten-5 {
- background-color: #fafafa;
-}
-
-.text-lighten-4 {
- color: #f5f5f5 !important;
-}
-
-.lighten-4 {
- background-color: #f5f5f5;
-}
-
-.text-lighten-3 {
- color: #eeeeee !important;
-}
-
-.lighten-3 {
- background-color: #eeeeee;
-}
-
-.text-lighten-2 {
- color: #e0e0e0 !important;
-}
-
-.lighten-2 {
- background-color: #e0e0e0;
-}
-
-.text-lighten-1 {
- color: #bdbdbd !important;
-}
-
-.lighten-1 {
- background-color: #bdbdbd;
-}
-
-.text-darken-1 {
- color: #757575 !important;
-}
-
-.darken-1 {
- background-color: #757575;
-}
-
-.text-darken-2 {
- color: #616161 !important;
-}
-
-.darken-2 {
- background-color: #616161;
-}
-
-.text-darken-3 {
- color: #424242 !important;
-}
-
-.darken-3 {
- background-color: #424242;
-}
-
-.text-darken-4 {
- color: #212121 !important;
-}
-
-.darken-4 {
- background-color: #212121;
-}
-
-.text-darken-5 {
- color: #131313 !important;
-}
-
-.darken-5 {
- background-color: #131313;
-}
-
-.text-darken-6 {
- color: #0a0a0a !important;
-}
-
-.darken-6 {
- background-color: #0a0a0a;
-}/*# sourceMappingURL=tmui.css.map */
\ No newline at end of file
+.uni-input-input[type=password]::-ms-reveal{display:none}.tableHeader .uni-scroll-view::-webkit-scrollbar,.tableHeader .uni-scroll-view::-webkit-scrollbar{display:none}.safe-height{height:var(--window-bottom)}.safe-top{height:var(--window-top)}.safe-statusbar{height:var(--status-bar-height)}.blur{backdrop-filter:blur(10px);background-color:rgba(0,0,0,.3)}.pointer{cursor:pointer}.pointer:hover{opacity:.7}.overflow{overflow:hidden}.overflow-x{overflow-x:hidden;overflow-y:auto}.overflow-y{overflow-x:auto;overflow-y:hidden}.relative{position:relative !important}.absolute{position:absolute !important}.fixed{position:fixed !important}.sticky{position:sticky !important}.fulled-height{display:flex;align-items:stretch}.clear{clear:both}.fulled{width:100%;display:block}.fulled-height{height:100%;display:block}.gray-100{filter:grayscale(100%)}.gray{filter:grayscale(25%)}.d-inline-block{display:inline-block !important}.d-block{display:block}.vertical-align-top{vertical-align:top}.vertical-align-middle{vertical-align:middle}.vertical-align-bottom{vertical-align:bottom}.wrap{white-space:pre-wrap;word-break:break-all}.nowrap{white-space:nowrap}.vertical-align-top{vertical-align:top}.vertical-align-middle{vertical-align:middle}.vertical-align-bottom{vertical-align:bottom}.zIndex-0{z-index:0}.zIndex-n0{z-index:0}.zIndex-1{z-index:1}.zIndex-n1{z-index:4}.zIndex-2{z-index:2}.zIndex-n2{z-index:8}.zIndex-3{z-index:3}.zIndex-n3{z-index:12}.zIndex-4{z-index:4}.zIndex-n4{z-index:16}.zIndex-5{z-index:5}.zIndex-n5{z-index:20}.zIndex-6{z-index:6}.zIndex-n6{z-index:24}.zIndex-7{z-index:7}.zIndex-n7{z-index:28}.zIndex-8{z-index:8}.zIndex-n8{z-index:32}.zIndex-9{z-index:9}.zIndex-n9{z-index:36}.zIndex-10{z-index:10}.zIndex-n10{z-index:40}.zIndex-11{z-index:11}.zIndex-n11{z-index:44}.zIndex-12{z-index:12}.zIndex-n12{z-index:48}.zIndex-13{z-index:13}.zIndex-n13{z-index:52}.zIndex-14{z-index:14}.zIndex-n14{z-index:56}.zIndex-15{z-index:15}.zIndex-n15{z-index:60}.zIndex-16{z-index:16}.zIndex-n16{z-index:64}.zIndex-17{z-index:17}.zIndex-n17{z-index:68}.zIndex-18{z-index:18}.zIndex-n18{z-index:72}.zIndex-19{z-index:19}.zIndex-n19{z-index:76}.zIndex-20{z-index:20}.zIndex-n20{z-index:80}.zIndex-21{z-index:21}.zIndex-n21{z-index:84}.zIndex-22{z-index:22}.zIndex-n22{z-index:88}.zIndex-23{z-index:23}.zIndex-n23{z-index:92}.zIndex-24{z-index:24}.zIndex-n24{z-index:96}.zIndex-25{z-index:25}.zIndex-n25{z-index:100}.zIndex-26{z-index:26}.zIndex-n26{z-index:104}.text-overflow{width:100%;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-overflow-1{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:1;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-2{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-3{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-4{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:4;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-5{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:5;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-delete{text-decoration:line-through}.text-underline{text-decoration:underline}.text-size-xxs{font-size:20rpx}.text-size-xs{font-size:22rpx}.text-size-s{font-size:24rpx}.text-size-m{font-size:28rpx}.text-size-n{font-size:30rpx}.text-size-g{font-size:34rpx}.text-size-lg{font-size:36rpx}.text-size-xl{font-size:40rpx}.text-weight-s{font-weight:100}.text-weight-n{font-weight:400}.text-weight-b{font-weight:700}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-align-center{text-align:center}.round-tl-0{border-top-left-radius:0rpx !important}.round-tl-1{border-top-left-radius:4rpx !important}.round-tl-2{border-top-left-radius:8rpx !important}.round-tl-3{border-top-left-radius:12rpx !important}.round-tl-4{border-top-left-radius:16rpx !important}.round-tl-5{border-top-left-radius:20rpx !important}.round-tl-6{border-top-left-radius:24rpx !important}.round-tl-7{border-top-left-radius:28rpx !important}.round-tl-8{border-top-left-radius:32rpx !important}.round-tl-9{border-top-left-radius:36rpx !important}.round-tl-10{border-top-left-radius:40rpx !important}.round-tl-11{border-top-left-radius:44rpx !important}.round-tl-12{border-top-left-radius:48rpx !important}.round-tl-13{border-top-left-radius:52rpx !important}.round-tl-14{border-top-left-radius:56rpx !important}.round-tl-15{border-top-left-radius:60rpx !important}.round-tl-16{border-top-left-radius:64rpx !important}.round-tl-17{border-top-left-radius:68rpx !important}.round-tl-18{border-top-left-radius:72rpx !important}.round-tl-19{border-top-left-radius:76rpx !important}.round-tl-20{border-top-left-radius:80rpx !important}.round-tl-21{border-top-left-radius:84rpx !important}.round-tl-22{border-top-left-radius:88rpx !important}.round-tl-23{border-top-left-radius:92rpx !important}.round-tl-24{border-top-left-radius:96rpx !important}.round-tl-25{border-top-left-radius:100rpx !important}.round-tr-0{border-top-right-radius:0rpx !important}.round-tr-1{border-top-right-radius:4rpx !important}.round-tr-2{border-top-right-radius:8rpx !important}.round-tr-3{border-top-right-radius:12rpx !important}.round-tr-4{border-top-right-radius:16rpx !important}.round-tr-5{border-top-right-radius:20rpx !important}.round-tr-6{border-top-right-radius:24rpx !important}.round-tr-7{border-top-right-radius:28rpx !important}.round-tr-8{border-top-right-radius:32rpx !important}.round-tr-9{border-top-right-radius:36rpx !important}.round-tr-10{border-top-right-radius:40rpx !important}.round-tr-11{border-top-right-radius:44rpx !important}.round-tr-12{border-top-right-radius:48rpx !important}.round-tr-13{border-top-right-radius:52rpx !important}.round-tr-14{border-top-right-radius:56rpx !important}.round-tr-15{border-top-right-radius:60rpx !important}.round-tr-16{border-top-right-radius:64rpx !important}.round-tr-17{border-top-right-radius:68rpx !important}.round-tr-18{border-top-right-radius:72rpx !important}.round-tr-19{border-top-right-radius:76rpx !important}.round-tr-20{border-top-right-radius:80rpx !important}.round-tr-21{border-top-right-radius:84rpx !important}.round-tr-22{border-top-right-radius:88rpx !important}.round-tr-23{border-top-right-radius:92rpx !important}.round-tr-24{border-top-right-radius:96rpx !important}.round-tr-25{border-top-right-radius:100rpx !important}.round-bl-0{border-bottom-left-radius:0rpx !important}.round-bl-1{border-bottom-left-radius:4rpx !important}.round-bl-2{border-bottom-left-radius:8rpx !important}.round-bl-3{border-bottom-left-radius:12rpx !important}.round-bl-4{border-bottom-left-radius:16rpx !important}.round-bl-5{border-bottom-left-radius:20rpx !important}.round-bl-6{border-bottom-left-radius:24rpx !important}.round-bl-7{border-bottom-left-radius:28rpx !important}.round-bl-8{border-bottom-left-radius:32rpx !important}.round-bl-9{border-bottom-left-radius:36rpx !important}.round-bl-10{border-bottom-left-radius:40rpx !important}.round-bl-11{border-bottom-left-radius:44rpx !important}.round-bl-12{border-bottom-left-radius:48rpx !important}.round-bl-13{border-bottom-left-radius:52rpx !important}.round-bl-14{border-bottom-left-radius:56rpx !important}.round-bl-15{border-bottom-left-radius:60rpx !important}.round-bl-16{border-bottom-left-radius:64rpx !important}.round-bl-17{border-bottom-left-radius:68rpx !important}.round-bl-18{border-bottom-left-radius:72rpx !important}.round-bl-19{border-bottom-left-radius:76rpx !important}.round-bl-20{border-bottom-left-radius:80rpx !important}.round-bl-21{border-bottom-left-radius:84rpx !important}.round-bl-22{border-bottom-left-radius:88rpx !important}.round-bl-23{border-bottom-left-radius:92rpx !important}.round-bl-24{border-bottom-left-radius:96rpx !important}.round-bl-25{border-bottom-left-radius:100rpx !important}.round-br-0{border-bottom-right-radius:0rpx !important}.round-br-1{border-bottom-right-radius:4rpx !important}.round-br-2{border-bottom-right-radius:8rpx !important}.round-br-3{border-bottom-right-radius:12rpx !important}.round-br-4{border-bottom-right-radius:16rpx !important}.round-br-5{border-bottom-right-radius:20rpx !important}.round-br-6{border-bottom-right-radius:24rpx !important}.round-br-7{border-bottom-right-radius:28rpx !important}.round-br-8{border-bottom-right-radius:32rpx !important}.round-br-9{border-bottom-right-radius:36rpx !important}.round-br-10{border-bottom-right-radius:40rpx !important}.round-br-11{border-bottom-right-radius:44rpx !important}.round-br-12{border-bottom-right-radius:48rpx !important}.round-br-13{border-bottom-right-radius:52rpx !important}.round-br-14{border-bottom-right-radius:56rpx !important}.round-br-15{border-bottom-right-radius:60rpx !important}.round-br-16{border-bottom-right-radius:64rpx !important}.round-br-17{border-bottom-right-radius:68rpx !important}.round-br-18{border-bottom-right-radius:72rpx !important}.round-br-19{border-bottom-right-radius:76rpx !important}.round-br-20{border-bottom-right-radius:80rpx !important}.round-br-21{border-bottom-right-radius:84rpx !important}.round-br-22{border-bottom-right-radius:88rpx !important}.round-br-23{border-bottom-right-radius:92rpx !important}.round-br-24{border-bottom-right-radius:96rpx !important}.round-br-25{border-bottom-right-radius:100rpx !important}.round-a-0{border-radius:0rpx !important}.round-a-1{border-radius:4rpx !important}.round-a-2{border-radius:8rpx !important}.round-a-3{border-radius:12rpx !important}.round-a-4{border-radius:16rpx !important}.round-a-5{border-radius:20rpx !important}.round-a-6{border-radius:24rpx !important}.round-a-7{border-radius:28rpx !important}.round-a-8{border-radius:32rpx !important}.round-a-9{border-radius:36rpx !important}.round-a-10{border-radius:40rpx !important}.round-a-11{border-radius:44rpx !important}.round-a-12{border-radius:48rpx !important}.round-a-13{border-radius:52rpx !important}.round-a-14{border-radius:56rpx !important}.round-a-15{border-radius:60rpx !important}.round-a-16{border-radius:64rpx !important}.round-a-17{border-radius:68rpx !important}.round-a-18{border-radius:72rpx !important}.round-a-19{border-radius:76rpx !important}.round-a-20{border-radius:80rpx !important}.round-a-21{border-radius:84rpx !important}.round-a-22{border-radius:88rpx !important}.round-a-23{border-radius:92rpx !important}.round-a-24{border-radius:96rpx !important}.round-a-25{border-radius:100rpx !important}.round-t-0{border-top-left-radius:0rpx !important;border-top-right-radius:0rpx !important}.round-t-1{border-top-left-radius:4rpx !important;border-top-right-radius:4rpx !important}.round-t-2{border-top-left-radius:8rpx !important;border-top-right-radius:8rpx !important}.round-t-3{border-top-left-radius:12rpx !important;border-top-right-radius:12rpx !important}.round-t-4{border-top-left-radius:16rpx !important;border-top-right-radius:16rpx !important}.round-t-5{border-top-left-radius:20rpx !important;border-top-right-radius:20rpx !important}.round-t-6{border-top-left-radius:24rpx !important;border-top-right-radius:24rpx !important}.round-t-7{border-top-left-radius:28rpx !important;border-top-right-radius:28rpx !important}.round-t-8{border-top-left-radius:32rpx !important;border-top-right-radius:32rpx !important}.round-t-9{border-top-left-radius:36rpx !important;border-top-right-radius:36rpx !important}.round-t-10{border-top-left-radius:40rpx !important;border-top-right-radius:40rpx !important}.round-t-11{border-top-left-radius:44rpx !important;border-top-right-radius:44rpx !important}.round-t-12{border-top-left-radius:48rpx !important;border-top-right-radius:48rpx !important}.round-t-13{border-top-left-radius:52rpx !important;border-top-right-radius:52rpx !important}.round-t-14{border-top-left-radius:56rpx !important;border-top-right-radius:56rpx !important}.round-t-15{border-top-left-radius:60rpx !important;border-top-right-radius:60rpx !important}.round-t-16{border-top-left-radius:64rpx !important;border-top-right-radius:64rpx !important}.round-t-17{border-top-left-radius:68rpx !important;border-top-right-radius:68rpx !important}.round-t-18{border-top-left-radius:72rpx !important;border-top-right-radius:72rpx !important}.round-t-19{border-top-left-radius:76rpx !important;border-top-right-radius:76rpx !important}.round-t-20{border-top-left-radius:80rpx !important;border-top-right-radius:80rpx !important}.round-t-21{border-top-left-radius:84rpx !important;border-top-right-radius:84rpx !important}.round-t-22{border-top-left-radius:88rpx !important;border-top-right-radius:88rpx !important}.round-t-23{border-top-left-radius:92rpx !important;border-top-right-radius:92rpx !important}.round-t-24{border-top-left-radius:96rpx !important;border-top-right-radius:96rpx !important}.round-t-25{border-top-left-radius:100rpx !important;border-top-right-radius:100rpx !important}.round-b-0{border-bottom-left-radius:0rpx !important;border-bottom-right-radius:0rpx !important}.round-b-1{border-bottom-left-radius:4rpx !important;border-bottom-right-radius:4rpx !important}.round-b-2{border-bottom-left-radius:8rpx !important;border-bottom-right-radius:8rpx !important}.round-b-3{border-bottom-left-radius:12rpx !important;border-bottom-right-radius:12rpx !important}.round-b-4{border-bottom-left-radius:16rpx !important;border-bottom-right-radius:16rpx !important}.round-b-5{border-bottom-left-radius:20rpx !important;border-bottom-right-radius:20rpx !important}.round-b-6{border-bottom-left-radius:24rpx !important;border-bottom-right-radius:24rpx !important}.round-b-7{border-bottom-left-radius:28rpx !important;border-bottom-right-radius:28rpx !important}.round-b-8{border-bottom-left-radius:32rpx !important;border-bottom-right-radius:32rpx !important}.round-b-9{border-bottom-left-radius:36rpx !important;border-bottom-right-radius:36rpx !important}.round-b-10{border-bottom-left-radius:40rpx !important;border-bottom-right-radius:40rpx !important}.round-b-11{border-bottom-left-radius:44rpx !important;border-bottom-right-radius:44rpx !important}.round-b-12{border-bottom-left-radius:48rpx !important;border-bottom-right-radius:48rpx !important}.round-b-13{border-bottom-left-radius:52rpx !important;border-bottom-right-radius:52rpx !important}.round-b-14{border-bottom-left-radius:56rpx !important;border-bottom-right-radius:56rpx !important}.round-b-15{border-bottom-left-radius:60rpx !important;border-bottom-right-radius:60rpx !important}.round-b-16{border-bottom-left-radius:64rpx !important;border-bottom-right-radius:64rpx !important}.round-b-17{border-bottom-left-radius:68rpx !important;border-bottom-right-radius:68rpx !important}.round-b-18{border-bottom-left-radius:72rpx !important;border-bottom-right-radius:72rpx !important}.round-b-19{border-bottom-left-radius:76rpx !important;border-bottom-right-radius:76rpx !important}.round-b-20{border-bottom-left-radius:80rpx !important;border-bottom-right-radius:80rpx !important}.round-b-21{border-bottom-left-radius:84rpx !important;border-bottom-right-radius:84rpx !important}.round-b-22{border-bottom-left-radius:88rpx !important;border-bottom-right-radius:88rpx !important}.round-b-23{border-bottom-left-radius:92rpx !important;border-bottom-right-radius:92rpx !important}.round-b-24{border-bottom-left-radius:96rpx !important;border-bottom-right-radius:96rpx !important}.round-b-25{border-bottom-left-radius:100rpx !important;border-bottom-right-radius:100rpx !important}.round-l-0{border-top-left-radius:0rpx !important;border-bottom-left-radius:0rpx !important}.round-l-1{border-top-left-radius:4rpx !important;border-bottom-left-radius:4rpx !important}.round-l-2{border-top-left-radius:8rpx !important;border-bottom-left-radius:8rpx !important}.round-l-3{border-top-left-radius:12rpx !important;border-bottom-left-radius:12rpx !important}.round-l-4{border-top-left-radius:16rpx !important;border-bottom-left-radius:16rpx !important}.round-l-5{border-top-left-radius:20rpx !important;border-bottom-left-radius:20rpx !important}.round-l-6{border-top-left-radius:24rpx !important;border-bottom-left-radius:24rpx !important}.round-l-7{border-top-left-radius:28rpx !important;border-bottom-left-radius:28rpx !important}.round-l-8{border-top-left-radius:32rpx !important;border-bottom-left-radius:32rpx !important}.round-l-9{border-top-left-radius:36rpx !important;border-bottom-left-radius:36rpx !important}.round-l-10{border-top-left-radius:40rpx !important;border-bottom-left-radius:40rpx !important}.round-l-11{border-top-left-radius:44rpx !important;border-bottom-left-radius:44rpx !important}.round-l-12{border-top-left-radius:48rpx !important;border-bottom-left-radius:48rpx !important}.round-l-13{border-top-left-radius:52rpx !important;border-bottom-left-radius:52rpx !important}.round-l-14{border-top-left-radius:56rpx !important;border-bottom-left-radius:56rpx !important}.round-l-15{border-top-left-radius:60rpx !important;border-bottom-left-radius:60rpx !important}.round-l-16{border-top-left-radius:64rpx !important;border-bottom-left-radius:64rpx !important}.round-l-17{border-top-left-radius:68rpx !important;border-bottom-left-radius:68rpx !important}.round-l-18{border-top-left-radius:72rpx !important;border-bottom-left-radius:72rpx !important}.round-l-19{border-top-left-radius:76rpx !important;border-bottom-left-radius:76rpx !important}.round-l-20{border-top-left-radius:80rpx !important;border-bottom-left-radius:80rpx !important}.round-l-21{border-top-left-radius:84rpx !important;border-bottom-left-radius:84rpx !important}.round-l-22{border-top-left-radius:88rpx !important;border-bottom-left-radius:88rpx !important}.round-l-23{border-top-left-radius:92rpx !important;border-bottom-left-radius:92rpx !important}.round-l-24{border-top-left-radius:96rpx !important;border-bottom-left-radius:96rpx !important}.round-l-25{border-top-left-radius:100rpx !important;border-bottom-left-radius:100rpx !important}.round-r-0{border-top-right-radius:0rpx !important;border-bottom-right-radius:0rpx !important}.round-r-1{border-top-right-radius:4rpx !important;border-bottom-right-radius:4rpx !important}.round-r-2{border-top-right-radius:8rpx !important;border-bottom-right-radius:8rpx !important}.round-r-3{border-top-right-radius:12rpx !important;border-bottom-right-radius:12rpx !important}.round-r-4{border-top-right-radius:16rpx !important;border-bottom-right-radius:16rpx !important}.round-r-5{border-top-right-radius:20rpx !important;border-bottom-right-radius:20rpx !important}.round-r-6{border-top-right-radius:24rpx !important;border-bottom-right-radius:24rpx !important}.round-r-7{border-top-right-radius:28rpx !important;border-bottom-right-radius:28rpx !important}.round-r-8{border-top-right-radius:32rpx !important;border-bottom-right-radius:32rpx !important}.round-r-9{border-top-right-radius:36rpx !important;border-bottom-right-radius:36rpx !important}.round-r-10{border-top-right-radius:40rpx !important;border-bottom-right-radius:40rpx !important}.round-r-11{border-top-right-radius:44rpx !important;border-bottom-right-radius:44rpx !important}.round-r-12{border-top-right-radius:48rpx !important;border-bottom-right-radius:48rpx !important}.round-r-13{border-top-right-radius:52rpx !important;border-bottom-right-radius:52rpx !important}.round-r-14{border-top-right-radius:56rpx !important;border-bottom-right-radius:56rpx !important}.round-r-15{border-top-right-radius:60rpx !important;border-bottom-right-radius:60rpx !important}.round-r-16{border-top-right-radius:64rpx !important;border-bottom-right-radius:64rpx !important}.round-r-17{border-top-right-radius:68rpx !important;border-bottom-right-radius:68rpx !important}.round-r-18{border-top-right-radius:72rpx !important;border-bottom-right-radius:72rpx !important}.round-r-19{border-top-right-radius:76rpx !important;border-bottom-right-radius:76rpx !important}.round-r-20{border-top-right-radius:80rpx !important;border-bottom-right-radius:80rpx !important}.round-r-21{border-top-right-radius:84rpx !important;border-bottom-right-radius:84rpx !important}.round-r-22{border-top-right-radius:88rpx !important;border-bottom-right-radius:88rpx !important}.round-r-23{border-top-right-radius:92rpx !important;border-bottom-right-radius:92rpx !important}.round-r-24{border-top-right-radius:96rpx !important;border-bottom-right-radius:96rpx !important}.round-r-25{border-top-right-radius:100rpx !important;border-bottom-right-radius:100rpx !important}.round-0{border-radius:0rpx}.round-1{border-radius:4rpx}.round-2{border-radius:8rpx}.round-3{border-radius:12rpx}.round-4{border-radius:16rpx}.round-5{border-radius:20rpx}.round-6{border-radius:24rpx}.round-7{border-radius:28rpx}.round-8{border-radius:32rpx}.round-9{border-radius:36rpx}.round-10{border-radius:40rpx}.round-11{border-radius:44rpx}.round-12{border-radius:48rpx}.round-13{border-radius:52rpx}.round-14{border-radius:56rpx}.round-15{border-radius:60rpx}.round-16{border-radius:64rpx}.round-17{border-radius:68rpx}.round-18{border-radius:72rpx}.round-19{border-radius:76rpx}.round-20{border-radius:80rpx}.round-21{border-radius:84rpx}.round-22{border-radius:88rpx}.round-23{border-radius:92rpx}.round-24{border-radius:96rpx}.round-25{border-radius:100rpx}.round-26{border-radius:104rpx}.rounded{border-radius:50% !important}.opacity-0{opacity:0}.opacity-1{opacity:.1}.opacity-2{opacity:.2}.opacity-3{opacity:.3}.opacity-4{opacity:.4}.opacity-5{opacity:.5}.opacity-6{opacity:.6}.opacity-7{opacity:.7}.opacity-8{opacity:.8}.opacity-9{opacity:.9}.opacity-10{opacity:1}.shadow{box-shadow:0 2rpx 12rpx rgba(0,0,0,.08)}.shadow-0{box-shadow:0 0rpx 10rpx rgba(0,0,0,.08)}.shadow-1{box-shadow:0 2rpx 12rpx rgba(0,0,0,.08)}.shadow-2{box-shadow:0 4rpx 14rpx rgba(0,0,0,.08)}.shadow-3{box-shadow:0 6rpx 16rpx rgba(0,0,0,.08)}.shadow-4{box-shadow:0 8rpx 18rpx rgba(0,0,0,.08)}.shadow-5{box-shadow:0 10rpx 20rpx rgba(0,0,0,.08)}.shadow-6{box-shadow:0 12rpx 22rpx rgba(0,0,0,.08)}.shadow-7{box-shadow:0 14rpx 24rpx rgba(0,0,0,.08)}.shadow-8{box-shadow:0 16rpx 26rpx rgba(0,0,0,.08)}.shadow-9{box-shadow:0 18rpx 28rpx rgba(0,0,0,.08)}.shadow-10{box-shadow:0 20rpx 30rpx rgba(0,0,0,.08)}.shadow-11{box-shadow:0 22rpx 32rpx rgba(0,0,0,.08)}.shadow-12{box-shadow:0 24rpx 34rpx rgba(0,0,0,.08)}.shadow-13{box-shadow:0 26rpx 36rpx rgba(0,0,0,.08)}.shadow-14{box-shadow:0 28rpx 38rpx rgba(0,0,0,.08)}.shadow-15{box-shadow:0 30rpx 40rpx rgba(0,0,0,.08)}.shadow-16{box-shadow:0 32rpx 42rpx rgba(0,0,0,.08)}.shadow-17{box-shadow:0 34rpx 44rpx rgba(0,0,0,.08)}.shadow-18{box-shadow:0 36rpx 46rpx rgba(0,0,0,.08)}.shadow-19{box-shadow:0 38rpx 48rpx rgba(0,0,0,.08)}.shadow-20{box-shadow:0 40rpx 50rpx rgba(0,0,0,.08)}.shadow-21{box-shadow:0 42rpx 52rpx rgba(0,0,0,.08)}.shadow-22{box-shadow:0 44rpx 54rpx rgba(0,0,0,.08)}.shadow-23{box-shadow:0 46rpx 56rpx rgba(0,0,0,.08)}.shadow-24{box-shadow:0 48rpx 58rpx rgba(0,0,0,.08)}.shadow-25{box-shadow:0 50rpx 60rpx rgba(0,0,0,.08)}.border-0{border:solid 0 #f5f5f5 !important}.border-0-bk{border:solid 0 #282828 !important}.border{border:solid 2rpx #f5f5f5 !important}.border-bk{border:solid 2rpx #282828 !important}.border-1{border:solid 2px #f5f5f5 !important}.border-1-bk{border:solid 2px #f5f5f5 !important}.border-2{border:solid 4px #f5f5f5 !important}.border-2-bk{border:solid 4px #f5f5f5 !important}.border-3{border:solid 6px #f5f5f5 !important}.border-3-bk{border:solid 6px #f5f5f5 !important}.border-4{border:solid 8px #f5f5f5 !important}.border-4-bk{border:solid 8px #f5f5f5 !important}.border-5{border:solid 10px #f5f5f5 !important}.border-5-bk{border:solid 10px #f5f5f5 !important}.border-l-1{border-left:solid 2rpx #f5f5f5 !important}.border-l-1-bk{border-left:solid 2rpx #282828 !important}.border-l-2{border-left:solid 4rpx #f5f5f5 !important}.border-l-2-bk{border-left:solid 4rpx #282828 !important}.border-l-3{border-left:solid 6rpx #f5f5f5 !important}.border-l-3-bk{border-left:solid 6rpx #282828 !important}.border-l-4{border-left:solid 8rpx #f5f5f5 !important}.border-l-4-bk{border-left:solid 8rpx #282828 !important}.border-l-5{border-left:solid 10rpx #f5f5f5 !important}.border-l-5-bk{border-left:solid 10rpx #282828 !important}.border-r-1{border-right:solid 2rpx #f5f5f5 !important}.border-r-1-bk{border-right:solid 2rpx #282828 !important}.border-r-2{border-right:solid 4rpx #f5f5f5 !important}.border-r-2-bk{border-right:solid 4rpx #282828 !important}.border-r-3{border-right:solid 6rpx #f5f5f5 !important}.border-r-3-bk{border-right:solid 6rpx #282828 !important}.border-r-4{border-right:solid 8rpx #f5f5f5 !important}.border-r-4-bk{border-right:solid 8rpx #282828 !important}.border-r-5{border-right:solid 10rpx #f5f5f5 !important}.border-r-5-bk{border-right:solid 10rpx #282828 !important}.border-t-1{border-top:solid 2rpx #f5f5f5 !important}.border-t-1-bk{border-top:solid 2rpx #282828 !important}.border-t-2{border-top:solid 4rpx #f5f5f5 !important}.border-t-2-bk{border-top:solid 4rpx #282828 !important}.border-t-3{border-top:solid 6rpx #f5f5f5 !important}.border-t-3-bk{border-top:solid 6rpx #282828 !important}.border-t-4{border-top:solid 8rpx #f5f5f5 !important}.border-t-4-bk{border-top:solid 8rpx #282828 !important}.border-t-5{border-top:solid 10rpx #f5f5f5 !important}.border-t-5-bk{border-top:solid 10rpx #282828 !important}.border-b-1{border-bottom:solid 2rpx #f5f5f5 !important}.border-b-1-bk{border-bottom:solid 2rpx #282828 !important}.border-b-2{border-bottom:solid 4rpx #f5f5f5 !important}.border-b-2-bk{border-bottom:solid 4rpx #282828 !important}.border-b-3{border-bottom:solid 6rpx #f5f5f5 !important}.border-b-3-bk{border-bottom:solid 6rpx #282828 !important}.border-b-4{border-bottom:solid 8rpx #f5f5f5 !important}.border-b-4-bk{border-bottom:solid 8rpx #282828 !important}.border-b-5{border-bottom:solid 10rpx #f5f5f5 !important}.border-b-5-bk{border-bottom:solid 10rpx #282828 !important}.border-a-1{border:solid 2rpx #f5f5f5 !important}.border-a-1-bk{border:solid 2rpx #282828 !important}.border-a-2{border:solid 4rpx #f5f5f5 !important}.border-a-2-bk{border:solid 4rpx #282828 !important}.border-a-3{border:solid 6rpx #f5f5f5 !important}.border-a-3-bk{border:solid 6rpx #282828 !important}.border-a-4{border:solid 8rpx #f5f5f5 !important}.border-a-4-bk{border:solid 8rpx #282828 !important}.border-a-5{border:solid 10rpx #f5f5f5 !important}.border-a-5-bk{border:solid 10rpx #282828 !important}.pa-0{padding:0rpx}.pa-1{padding:1rpx}.pa-2{padding:2rpx}.pa-3{padding:3rpx}.pa-4{padding:4rpx}.pa-5{padding:5rpx}.pa-6{padding:6rpx}.pa-7{padding:7rpx}.pa-8{padding:8rpx}.pa-9{padding:9rpx}.pa-10{padding:10rpx}.pa-11{padding:11rpx}.pa-12{padding:12rpx}.pa-13{padding:13rpx}.pa-14{padding:14rpx}.pa-15{padding:15rpx}.pa-16{padding:16rpx}.pa-17{padding:17rpx}.pa-18{padding:18rpx}.pa-19{padding:19rpx}.pa-20{padding:20rpx}.pa-21{padding:21rpx}.pa-22{padding:22rpx}.pa-23{padding:23rpx}.pa-24{padding:24rpx}.pa-25{padding:25rpx}.pa-n1{padding:4rpx}.pa-n2{padding:8rpx}.pa-n3{padding:12rpx}.pa-n4{padding:16rpx}.pa-n5{padding:20rpx}.pa-n6{padding:24rpx}.pa-n7{padding:28rpx}.pa-n8{padding:32rpx}.pa-n9{padding:36rpx}.pa-n10{padding:40rpx}.pa-n11{padding:44rpx}.pa-n12{padding:48rpx}.pa-n13{padding:52rpx}.pa-n14{padding:56rpx}.pa-n15{padding:60rpx}.pa-n16{padding:64rpx}.pa-n17{padding:68rpx}.pa-n18{padding:72rpx}.pa-n19{padding:76rpx}.pa-n20{padding:80rpx}.pa-n21{padding:84rpx}.pa-n22{padding:88rpx}.pa-n23{padding:92rpx}.pa-n24{padding:96rpx}.pa-n25{padding:100rpx}.pt-0{padding-top:0rpx}.pt-1{padding-top:1rpx}.pt-2{padding-top:2rpx}.pt-3{padding-top:3rpx}.pt-4{padding-top:4rpx}.pt-5{padding-top:5rpx}.pt-6{padding-top:6rpx}.pt-7{padding-top:7rpx}.pt-8{padding-top:8rpx}.pt-9{padding-top:9rpx}.pt-10{padding-top:10rpx}.pt-11{padding-top:11rpx}.pt-12{padding-top:12rpx}.pt-13{padding-top:13rpx}.pt-14{padding-top:14rpx}.pt-15{padding-top:15rpx}.pt-16{padding-top:16rpx}.pt-17{padding-top:17rpx}.pt-18{padding-top:18rpx}.pt-19{padding-top:19rpx}.pt-20{padding-top:20rpx}.pt-21{padding-top:21rpx}.pt-22{padding-top:22rpx}.pt-23{padding-top:23rpx}.pt-24{padding-top:24rpx}.pt-25{padding-top:25rpx}.pt-n1{padding-top:4rpx}.pt-n2{padding-top:8rpx}.pt-n3{padding-top:12rpx}.pt-n4{padding-top:16rpx}.pt-n5{padding-top:20rpx}.pt-n6{padding-top:24rpx}.pt-n7{padding-top:28rpx}.pt-n8{padding-top:32rpx}.pt-n9{padding-top:36rpx}.pt-n10{padding-top:40rpx}.pt-n11{padding-top:44rpx}.pt-n12{padding-top:48rpx}.pt-n13{padding-top:52rpx}.pt-n14{padding-top:56rpx}.pt-n15{padding-top:60rpx}.pt-n16{padding-top:64rpx}.pt-n17{padding-top:68rpx}.pt-n18{padding-top:72rpx}.pt-n19{padding-top:76rpx}.pt-n20{padding-top:80rpx}.pt-n21{padding-top:84rpx}.pt-n22{padding-top:88rpx}.pt-n23{padding-top:92rpx}.pt-n24{padding-top:96rpx}.pt-n25{padding-top:100rpx}.pr-0{padding-right:0rpx}.pr-1{padding-right:1rpx}.pr-2{padding-right:2rpx}.pr-3{padding-right:3rpx}.pr-4{padding-right:4rpx}.pr-5{padding-right:5rpx}.pr-6{padding-right:6rpx}.pr-7{padding-right:7rpx}.pr-8{padding-right:8rpx}.pr-9{padding-right:9rpx}.pr-10{padding-right:10rpx}.pr-11{padding-right:11rpx}.pr-12{padding-right:12rpx}.pr-13{padding-right:13rpx}.pr-14{padding-right:14rpx}.pr-15{padding-right:15rpx}.pr-16{padding-right:16rpx}.pr-17{padding-right:17rpx}.pr-18{padding-right:18rpx}.pr-19{padding-right:19rpx}.pr-20{padding-right:20rpx}.pr-21{padding-right:21rpx}.pr-22{padding-right:22rpx}.pr-23{padding-right:23rpx}.pr-24{padding-right:24rpx}.pr-25{padding-right:25rpx}.pr-n1{padding-right:4rpx}.pr-n2{padding-right:8rpx}.pr-n3{padding-right:12rpx}.pr-n4{padding-right:16rpx}.pr-n5{padding-right:20rpx}.pr-n6{padding-right:24rpx}.pr-n7{padding-right:28rpx}.pr-n8{padding-right:32rpx}.pr-n9{padding-right:36rpx}.pr-n10{padding-right:40rpx}.pr-n11{padding-right:44rpx}.pr-n12{padding-right:48rpx}.pr-n13{padding-right:52rpx}.pr-n14{padding-right:56rpx}.pr-n15{padding-right:60rpx}.pr-n16{padding-right:64rpx}.pr-n17{padding-right:68rpx}.pr-n18{padding-right:72rpx}.pr-n19{padding-right:76rpx}.pr-n20{padding-right:80rpx}.pr-n21{padding-right:84rpx}.pr-n22{padding-right:88rpx}.pr-n23{padding-right:92rpx}.pr-n24{padding-right:96rpx}.pr-n25{padding-right:100rpx}.pb-0{padding-bottom:0rpx}.pb-1{padding-bottom:1rpx}.pb-2{padding-bottom:2rpx}.pb-3{padding-bottom:3rpx}.pb-4{padding-bottom:4rpx}.pb-5{padding-bottom:5rpx}.pb-6{padding-bottom:6rpx}.pb-7{padding-bottom:7rpx}.pb-8{padding-bottom:8rpx}.pb-9{padding-bottom:9rpx}.pb-10{padding-bottom:10rpx}.pb-11{padding-bottom:11rpx}.pb-12{padding-bottom:12rpx}.pb-13{padding-bottom:13rpx}.pb-14{padding-bottom:14rpx}.pb-15{padding-bottom:15rpx}.pb-16{padding-bottom:16rpx}.pb-17{padding-bottom:17rpx}.pb-18{padding-bottom:18rpx}.pb-19{padding-bottom:19rpx}.pb-20{padding-bottom:20rpx}.pb-21{padding-bottom:21rpx}.pb-22{padding-bottom:22rpx}.pb-23{padding-bottom:23rpx}.pb-24{padding-bottom:24rpx}.pb-25{padding-bottom:25rpx}.pb-n1{padding-bottom:4rpx}.pb-n2{padding-bottom:8rpx}.pb-n3{padding-bottom:12rpx}.pb-n4{padding-bottom:16rpx}.pb-n5{padding-bottom:20rpx}.pb-n6{padding-bottom:24rpx}.pb-n7{padding-bottom:28rpx}.pb-n8{padding-bottom:32rpx}.pb-n9{padding-bottom:36rpx}.pb-n10{padding-bottom:40rpx}.pb-n11{padding-bottom:44rpx}.pb-n12{padding-bottom:48rpx}.pb-n13{padding-bottom:52rpx}.pb-n14{padding-bottom:56rpx}.pb-n15{padding-bottom:60rpx}.pb-n16{padding-bottom:64rpx}.pb-n17{padding-bottom:68rpx}.pb-n18{padding-bottom:72rpx}.pb-n19{padding-bottom:76rpx}.pb-n20{padding-bottom:80rpx}.pb-n21{padding-bottom:84rpx}.pb-n22{padding-bottom:88rpx}.pb-n23{padding-bottom:92rpx}.pb-n24{padding-bottom:96rpx}.pb-n25{padding-bottom:100rpx}.pl-0{padding-left:0rpx}.pl-1{padding-left:1rpx}.pl-2{padding-left:2rpx}.pl-3{padding-left:3rpx}.pl-4{padding-left:4rpx}.pl-5{padding-left:5rpx}.pl-6{padding-left:6rpx}.pl-7{padding-left:7rpx}.pl-8{padding-left:8rpx}.pl-9{padding-left:9rpx}.pl-10{padding-left:10rpx}.pl-11{padding-left:11rpx}.pl-12{padding-left:12rpx}.pl-13{padding-left:13rpx}.pl-14{padding-left:14rpx}.pl-15{padding-left:15rpx}.pl-16{padding-left:16rpx}.pl-17{padding-left:17rpx}.pl-18{padding-left:18rpx}.pl-19{padding-left:19rpx}.pl-20{padding-left:20rpx}.pl-21{padding-left:21rpx}.pl-22{padding-left:22rpx}.pl-23{padding-left:23rpx}.pl-24{padding-left:24rpx}.pl-25{padding-left:25rpx}.pl-n1{padding-left:4rpx}.pl-n2{padding-left:8rpx}.pl-n3{padding-left:12rpx}.pl-n4{padding-left:16rpx}.pl-n5{padding-left:20rpx}.pl-n6{padding-left:24rpx}.pl-n7{padding-left:28rpx}.pl-n8{padding-left:32rpx}.pl-n9{padding-left:36rpx}.pl-n10{padding-left:40rpx}.pl-n11{padding-left:44rpx}.pl-n12{padding-left:48rpx}.pl-n13{padding-left:52rpx}.pl-n14{padding-left:56rpx}.pl-n15{padding-left:60rpx}.pl-n16{padding-left:64rpx}.pl-n17{padding-left:68rpx}.pl-n18{padding-left:72rpx}.pl-n19{padding-left:76rpx}.pl-n20{padding-left:80rpx}.pl-n21{padding-left:84rpx}.pl-n22{padding-left:88rpx}.pl-n23{padding-left:92rpx}.pl-n24{padding-left:96rpx}.pl-n25{padding-left:100rpx}.px-0{padding-left:0rpx;padding-right:0rpx}.px-1{padding-left:1rpx;padding-right:1rpx}.px-2{padding-left:2rpx;padding-right:2rpx}.px-3{padding-left:3rpx;padding-right:3rpx}.px-4{padding-left:4rpx;padding-right:4rpx}.px-5{padding-left:5rpx;padding-right:5rpx}.px-6{padding-left:6rpx;padding-right:6rpx}.px-7{padding-left:7rpx;padding-right:7rpx}.px-8{padding-left:8rpx;padding-right:8rpx}.px-9{padding-left:9rpx;padding-right:9rpx}.px-10{padding-left:10rpx;padding-right:10rpx}.px-11{padding-left:11rpx;padding-right:11rpx}.px-12{padding-left:12rpx;padding-right:12rpx}.px-13{padding-left:13rpx;padding-right:13rpx}.px-14{padding-left:14rpx;padding-right:14rpx}.px-15{padding-left:15rpx;padding-right:15rpx}.px-16{padding-left:16rpx;padding-right:16rpx}.px-17{padding-left:17rpx;padding-right:17rpx}.px-18{padding-left:18rpx;padding-right:18rpx}.px-19{padding-left:19rpx;padding-right:19rpx}.px-20{padding-left:20rpx;padding-right:20rpx}.px-21{padding-left:21rpx;padding-right:21rpx}.px-22{padding-left:22rpx;padding-right:22rpx}.px-23{padding-left:23rpx;padding-right:23rpx}.px-24{padding-left:24rpx;padding-right:24rpx}.px-25{padding-left:25rpx;padding-right:25rpx}.px-n1{padding-left:4rpx;padding-right:4rpx}.px-n2{padding-left:8rpx;padding-right:8rpx}.px-n3{padding-left:12rpx;padding-right:12rpx}.px-n4{padding-left:16rpx;padding-right:16rpx}.px-n5{padding-left:20rpx;padding-right:20rpx}.px-n6{padding-left:24rpx;padding-right:24rpx}.px-n7{padding-left:28rpx;padding-right:28rpx}.px-n8{padding-left:32rpx;padding-right:32rpx}.px-n9{padding-left:36rpx;padding-right:36rpx}.px-n10{padding-left:40rpx;padding-right:40rpx}.px-n11{padding-left:44rpx;padding-right:44rpx}.px-n12{padding-left:48rpx;padding-right:48rpx}.px-n13{padding-left:52rpx;padding-right:52rpx}.px-n14{padding-left:56rpx;padding-right:56rpx}.px-n15{padding-left:60rpx;padding-right:60rpx}.px-n16{padding-left:64rpx;padding-right:64rpx}.px-n17{padding-left:68rpx;padding-right:68rpx}.px-n18{padding-left:72rpx;padding-right:72rpx}.px-n19{padding-left:76rpx;padding-right:76rpx}.px-n20{padding-left:80rpx;padding-right:80rpx}.px-n21{padding-left:84rpx;padding-right:84rpx}.px-n22{padding-left:88rpx;padding-right:88rpx}.px-n23{padding-left:92rpx;padding-right:92rpx}.px-n24{padding-left:96rpx;padding-right:96rpx}.px-n25{padding-left:100rpx;padding-right:100rpx}.py-0{padding-top:0rpx;padding-bottom:0rpx}.py-1{padding-top:1rpx;padding-bottom:1rpx}.py-2{padding-top:2rpx;padding-bottom:2rpx}.py-3{padding-top:3rpx;padding-bottom:3rpx}.py-4{padding-top:4rpx;padding-bottom:4rpx}.py-5{padding-top:5rpx;padding-bottom:5rpx}.py-6{padding-top:6rpx;padding-bottom:6rpx}.py-7{padding-top:7rpx;padding-bottom:7rpx}.py-8{padding-top:8rpx;padding-bottom:8rpx}.py-9{padding-top:9rpx;padding-bottom:9rpx}.py-10{padding-top:10rpx;padding-bottom:10rpx}.py-11{padding-top:11rpx;padding-bottom:11rpx}.py-12{padding-top:12rpx;padding-bottom:12rpx}.py-13{padding-top:13rpx;padding-bottom:13rpx}.py-14{padding-top:14rpx;padding-bottom:14rpx}.py-15{padding-top:15rpx;padding-bottom:15rpx}.py-16{padding-top:16rpx;padding-bottom:16rpx}.py-17{padding-top:17rpx;padding-bottom:17rpx}.py-18{padding-top:18rpx;padding-bottom:18rpx}.py-19{padding-top:19rpx;padding-bottom:19rpx}.py-20{padding-top:20rpx;padding-bottom:20rpx}.py-21{padding-top:21rpx;padding-bottom:21rpx}.py-22{padding-top:22rpx;padding-bottom:22rpx}.py-23{padding-top:23rpx;padding-bottom:23rpx}.py-24{padding-top:24rpx;padding-bottom:24rpx}.py-25{padding-top:25rpx;padding-bottom:25rpx}.py-n1{padding-top:4rpx;padding-bottom:4rpx}.py-n2{padding-top:8rpx;padding-bottom:8rpx}.py-n3{padding-top:12rpx;padding-bottom:12rpx}.py-n4{padding-top:16rpx;padding-bottom:16rpx}.py-n5{padding-top:20rpx;padding-bottom:20rpx}.py-n6{padding-top:24rpx;padding-bottom:24rpx}.py-n7{padding-top:28rpx;padding-bottom:28rpx}.py-n8{padding-top:32rpx;padding-bottom:32rpx}.py-n9{padding-top:36rpx;padding-bottom:36rpx}.py-n10{padding-top:40rpx;padding-bottom:40rpx}.py-n11{padding-top:44rpx;padding-bottom:44rpx}.py-n12{padding-top:48rpx;padding-bottom:48rpx}.py-n13{padding-top:52rpx;padding-bottom:52rpx}.py-n14{padding-top:56rpx;padding-bottom:56rpx}.py-n15{padding-top:60rpx;padding-bottom:60rpx}.py-n16{padding-top:64rpx;padding-bottom:64rpx}.py-n17{padding-top:68rpx;padding-bottom:68rpx}.py-n18{padding-top:72rpx;padding-bottom:72rpx}.py-n19{padding-top:76rpx;padding-bottom:76rpx}.py-n20{padding-top:80rpx;padding-bottom:80rpx}.py-n21{padding-top:84rpx;padding-bottom:84rpx}.py-n22{padding-top:88rpx;padding-bottom:88rpx}.py-n23{padding-top:92rpx;padding-bottom:92rpx}.py-n24{padding-top:96rpx;padding-bottom:96rpx}.py-n25{padding-top:100rpx;padding-bottom:100rpx}.ma-0{margin:0rpx}.ma-1{margin:1rpx}.ma-2{margin:2rpx}.ma-3{margin:3rpx}.ma-4{margin:4rpx}.ma-5{margin:5rpx}.ma-6{margin:6rpx}.ma-7{margin:7rpx}.ma-8{margin:8rpx}.ma-9{margin:9rpx}.ma-10{margin:10rpx}.ma-11{margin:11rpx}.ma-12{margin:12rpx}.ma-13{margin:13rpx}.ma-14{margin:14rpx}.ma-15{margin:15rpx}.ma-16{margin:16rpx}.ma-17{margin:17rpx}.ma-18{margin:18rpx}.ma-19{margin:19rpx}.ma-20{margin:20rpx}.ma-21{margin:21rpx}.ma-22{margin:22rpx}.ma-23{margin:23rpx}.ma-24{margin:24rpx}.ma-25{margin:25rpx}.ma-n1{margin:4rpx}.ma-n2{margin:8rpx}.ma-n3{margin:12rpx}.ma-n4{margin:16rpx}.ma-n5{margin:20rpx}.ma-n6{margin:24rpx}.ma-n7{margin:28rpx}.ma-n8{margin:32rpx}.ma-n9{margin:36rpx}.ma-n10{margin:40rpx}.ma-n11{margin:44rpx}.ma-n12{margin:48rpx}.ma-n13{margin:52rpx}.ma-n14{margin:56rpx}.ma-n15{margin:60rpx}.ma-n16{margin:64rpx}.ma-n17{margin:68rpx}.ma-n18{margin:72rpx}.ma-n19{margin:76rpx}.ma-n20{margin:80rpx}.ma-n21{margin:84rpx}.ma-n22{margin:88rpx}.ma-n23{margin:92rpx}.ma-n24{margin:96rpx}.ma-n25{margin:100rpx}.mt-0{margin-top:0rpx}.mt--0{margin-top:-0rpx}.mt-1{margin-top:1rpx}.mt--1{margin-top:-1rpx}.mt-2{margin-top:2rpx}.mt--2{margin-top:-2rpx}.mt-3{margin-top:3rpx}.mt--3{margin-top:-3rpx}.mt-4{margin-top:4rpx}.mt--4{margin-top:-4rpx}.mt-5{margin-top:5rpx}.mt--5{margin-top:-5rpx}.mt-6{margin-top:6rpx}.mt--6{margin-top:-6rpx}.mt-7{margin-top:7rpx}.mt--7{margin-top:-7rpx}.mt-8{margin-top:8rpx}.mt--8{margin-top:-8rpx}.mt-9{margin-top:9rpx}.mt--9{margin-top:-9rpx}.mt-10{margin-top:10rpx}.mt--10{margin-top:-10rpx}.mt-11{margin-top:11rpx}.mt--11{margin-top:-11rpx}.mt-12{margin-top:12rpx}.mt--12{margin-top:-12rpx}.mt-13{margin-top:13rpx}.mt--13{margin-top:-13rpx}.mt-14{margin-top:14rpx}.mt--14{margin-top:-14rpx}.mt-15{margin-top:15rpx}.mt--15{margin-top:-15rpx}.mt-16{margin-top:16rpx}.mt--16{margin-top:-16rpx}.mt-17{margin-top:17rpx}.mt--17{margin-top:-17rpx}.mt-18{margin-top:18rpx}.mt--18{margin-top:-18rpx}.mt-19{margin-top:19rpx}.mt--19{margin-top:-19rpx}.mt-20{margin-top:20rpx}.mt--20{margin-top:-20rpx}.mt-21{margin-top:21rpx}.mt--21{margin-top:-21rpx}.mt-22{margin-top:22rpx}.mt--22{margin-top:-22rpx}.mt-23{margin-top:23rpx}.mt--23{margin-top:-23rpx}.mt-24{margin-top:24rpx}.mt--24{margin-top:-24rpx}.mt-25{margin-top:25rpx}.mt--25{margin-top:-25rpx}.mt-n1{margin-top:4rpx}.mt--n1{margin-top:-4rpx}.mt-n2{margin-top:8rpx}.mt--n2{margin-top:-8rpx}.mt-n3{margin-top:12rpx}.mt--n3{margin-top:-12rpx}.mt-n4{margin-top:16rpx}.mt--n4{margin-top:-16rpx}.mt-n5{margin-top:20rpx}.mt--n5{margin-top:-20rpx}.mt-n6{margin-top:24rpx}.mt--n6{margin-top:-24rpx}.mt-n7{margin-top:28rpx}.mt--n7{margin-top:-28rpx}.mt-n8{margin-top:32rpx}.mt--n8{margin-top:-32rpx}.mt-n9{margin-top:36rpx}.mt--n9{margin-top:-36rpx}.mt-n10{margin-top:40rpx}.mt--n10{margin-top:-40rpx}.mt-n11{margin-top:44rpx}.mt--n11{margin-top:-44rpx}.mt-n12{margin-top:48rpx}.mt--n12{margin-top:-48rpx}.mt-n13{margin-top:52rpx}.mt--n13{margin-top:-52rpx}.mt-n14{margin-top:56rpx}.mt--n14{margin-top:-56rpx}.mt-n15{margin-top:60rpx}.mt--n15{margin-top:-60rpx}.mt-n16{margin-top:64rpx}.mt--n16{margin-top:-64rpx}.mt-n17{margin-top:68rpx}.mt--n17{margin-top:-68rpx}.mt-n18{margin-top:72rpx}.mt--n18{margin-top:-72rpx}.mt-n19{margin-top:76rpx}.mt--n19{margin-top:-76rpx}.mt-n20{margin-top:80rpx}.mt--n20{margin-top:-80rpx}.mt-n21{margin-top:84rpx}.mt--n21{margin-top:-84rpx}.mt-n22{margin-top:88rpx}.mt--n22{margin-top:-88rpx}.mt-n23{margin-top:92rpx}.mt--n23{margin-top:-92rpx}.mt-n24{margin-top:96rpx}.mt--n24{margin-top:-96rpx}.mt-n25{margin-top:100rpx}.mt--n25{margin-top:-100rpx}.mr-0{margin-right:0rpx}.mr--0{margin-right:-0rpx}.mr-1{margin-right:1rpx}.mr--1{margin-right:-1rpx}.mr-2{margin-right:2rpx}.mr--2{margin-right:-2rpx}.mr-3{margin-right:3rpx}.mr--3{margin-right:-3rpx}.mr-4{margin-right:4rpx}.mr--4{margin-right:-4rpx}.mr-5{margin-right:5rpx}.mr--5{margin-right:-5rpx}.mr-6{margin-right:6rpx}.mr--6{margin-right:-6rpx}.mr-7{margin-right:7rpx}.mr--7{margin-right:-7rpx}.mr-8{margin-right:8rpx}.mr--8{margin-right:-8rpx}.mr-9{margin-right:9rpx}.mr--9{margin-right:-9rpx}.mr-10{margin-right:10rpx}.mr--10{margin-right:-10rpx}.mr-11{margin-right:11rpx}.mr--11{margin-right:-11rpx}.mr-12{margin-right:12rpx}.mr--12{margin-right:-12rpx}.mr-13{margin-right:13rpx}.mr--13{margin-right:-13rpx}.mr-14{margin-right:14rpx}.mr--14{margin-right:-14rpx}.mr-15{margin-right:15rpx}.mr--15{margin-right:-15rpx}.mr-16{margin-right:16rpx}.mr--16{margin-right:-16rpx}.mr-17{margin-right:17rpx}.mr--17{margin-right:-17rpx}.mr-18{margin-right:18rpx}.mr--18{margin-right:-18rpx}.mr-19{margin-right:19rpx}.mr--19{margin-right:-19rpx}.mr-20{margin-right:20rpx}.mr--20{margin-right:-20rpx}.mr-21{margin-right:21rpx}.mr--21{margin-right:-21rpx}.mr-22{margin-right:22rpx}.mr--22{margin-right:-22rpx}.mr-23{margin-right:23rpx}.mr--23{margin-right:-23rpx}.mr-24{margin-right:24rpx}.mr--24{margin-right:-24rpx}.mr-25{margin-right:25rpx}.mr--25{margin-right:-25rpx}.mr-n1{margin-right:4rpx}.mr--n1{margin-right:-4rpx}.mr-n2{margin-right:8rpx}.mr--n2{margin-right:-8rpx}.mr-n3{margin-right:12rpx}.mr--n3{margin-right:-12rpx}.mr-n4{margin-right:16rpx}.mr--n4{margin-right:-16rpx}.mr-n5{margin-right:20rpx}.mr--n5{margin-right:-20rpx}.mr-n6{margin-right:24rpx}.mr--n6{margin-right:-24rpx}.mr-n7{margin-right:28rpx}.mr--n7{margin-right:-28rpx}.mr-n8{margin-right:32rpx}.mr--n8{margin-right:-32rpx}.mr-n9{margin-right:36rpx}.mr--n9{margin-right:-36rpx}.mr-n10{margin-right:40rpx}.mr--n10{margin-right:-40rpx}.mr-n11{margin-right:44rpx}.mr--n11{margin-right:-44rpx}.mr-n12{margin-right:48rpx}.mr--n12{margin-right:-48rpx}.mr-n13{margin-right:52rpx}.mr--n13{margin-right:-52rpx}.mr-n14{margin-right:56rpx}.mr--n14{margin-right:-56rpx}.mr-n15{margin-right:60rpx}.mr--n15{margin-right:-60rpx}.mr-n16{margin-right:64rpx}.mr--n16{margin-right:-64rpx}.mr-n17{margin-right:68rpx}.mr--n17{margin-right:-68rpx}.mr-n18{margin-right:72rpx}.mr--n18{margin-right:-72rpx}.mr-n19{margin-right:76rpx}.mr--n19{margin-right:-76rpx}.mr-n20{margin-right:80rpx}.mr--n20{margin-right:-80rpx}.mr-n21{margin-right:84rpx}.mr--n21{margin-right:-84rpx}.mr-n22{margin-right:88rpx}.mr--n22{margin-right:-88rpx}.mr-n23{margin-right:92rpx}.mr--n23{margin-right:-92rpx}.mr-n24{margin-right:96rpx}.mr--n24{margin-right:-96rpx}.mr-n25{margin-right:100rpx}.mr--n25{margin-right:-100rpx}.mb-0{margin-bottom:0rpx}.mb--0{margin-bottom:-0rpx}.mb-1{margin-bottom:1rpx}.mb--1{margin-bottom:-1rpx}.mb-2{margin-bottom:2rpx}.mb--2{margin-bottom:-2rpx}.mb-3{margin-bottom:3rpx}.mb--3{margin-bottom:-3rpx}.mb-4{margin-bottom:4rpx}.mb--4{margin-bottom:-4rpx}.mb-5{margin-bottom:5rpx}.mb--5{margin-bottom:-5rpx}.mb-6{margin-bottom:6rpx}.mb--6{margin-bottom:-6rpx}.mb-7{margin-bottom:7rpx}.mb--7{margin-bottom:-7rpx}.mb-8{margin-bottom:8rpx}.mb--8{margin-bottom:-8rpx}.mb-9{margin-bottom:9rpx}.mb--9{margin-bottom:-9rpx}.mb-10{margin-bottom:10rpx}.mb--10{margin-bottom:-10rpx}.mb-11{margin-bottom:11rpx}.mb--11{margin-bottom:-11rpx}.mb-12{margin-bottom:12rpx}.mb--12{margin-bottom:-12rpx}.mb-13{margin-bottom:13rpx}.mb--13{margin-bottom:-13rpx}.mb-14{margin-bottom:14rpx}.mb--14{margin-bottom:-14rpx}.mb-15{margin-bottom:15rpx}.mb--15{margin-bottom:-15rpx}.mb-16{margin-bottom:16rpx}.mb--16{margin-bottom:-16rpx}.mb-17{margin-bottom:17rpx}.mb--17{margin-bottom:-17rpx}.mb-18{margin-bottom:18rpx}.mb--18{margin-bottom:-18rpx}.mb-19{margin-bottom:19rpx}.mb--19{margin-bottom:-19rpx}.mb-20{margin-bottom:20rpx}.mb--20{margin-bottom:-20rpx}.mb-21{margin-bottom:21rpx}.mb--21{margin-bottom:-21rpx}.mb-22{margin-bottom:22rpx}.mb--22{margin-bottom:-22rpx}.mb-23{margin-bottom:23rpx}.mb--23{margin-bottom:-23rpx}.mb-24{margin-bottom:24rpx}.mb--24{margin-bottom:-24rpx}.mb-25{margin-bottom:25rpx}.mb--25{margin-bottom:-25rpx}.mb-n1{margin-bottom:4rpx}.mb--n1{margin-bottom:-4rpx}.mb-n2{margin-bottom:8rpx}.mb--n2{margin-bottom:-8rpx}.mb-n3{margin-bottom:12rpx}.mb--n3{margin-bottom:-12rpx}.mb-n4{margin-bottom:16rpx}.mb--n4{margin-bottom:-16rpx}.mb-n5{margin-bottom:20rpx}.mb--n5{margin-bottom:-20rpx}.mb-n6{margin-bottom:24rpx}.mb--n6{margin-bottom:-24rpx}.mb-n7{margin-bottom:28rpx}.mb--n7{margin-bottom:-28rpx}.mb-n8{margin-bottom:32rpx}.mb--n8{margin-bottom:-32rpx}.mb-n9{margin-bottom:36rpx}.mb--n9{margin-bottom:-36rpx}.mb-n10{margin-bottom:40rpx}.mb--n10{margin-bottom:-40rpx}.mb-n11{margin-bottom:44rpx}.mb--n11{margin-bottom:-44rpx}.mb-n12{margin-bottom:48rpx}.mb--n12{margin-bottom:-48rpx}.mb-n13{margin-bottom:52rpx}.mb--n13{margin-bottom:-52rpx}.mb-n14{margin-bottom:56rpx}.mb--n14{margin-bottom:-56rpx}.mb-n15{margin-bottom:60rpx}.mb--n15{margin-bottom:-60rpx}.mb-n16{margin-bottom:64rpx}.mb--n16{margin-bottom:-64rpx}.mb-n17{margin-bottom:68rpx}.mb--n17{margin-bottom:-68rpx}.mb-n18{margin-bottom:72rpx}.mb--n18{margin-bottom:-72rpx}.mb-n19{margin-bottom:76rpx}.mb--n19{margin-bottom:-76rpx}.mb-n20{margin-bottom:80rpx}.mb--n20{margin-bottom:-80rpx}.mb-n21{margin-bottom:84rpx}.mb--n21{margin-bottom:-84rpx}.mb-n22{margin-bottom:88rpx}.mb--n22{margin-bottom:-88rpx}.mb-n23{margin-bottom:92rpx}.mb--n23{margin-bottom:-92rpx}.mb-n24{margin-bottom:96rpx}.mb--n24{margin-bottom:-96rpx}.mb-n25{margin-bottom:100rpx}.mb--n25{margin-bottom:-100rpx}.ml-0{margin-left:0rpx}.ml--0{margin-left:-0rpx}.ml-1{margin-left:1rpx}.ml--1{margin-left:-1rpx}.ml-2{margin-left:2rpx}.ml--2{margin-left:-2rpx}.ml-3{margin-left:3rpx}.ml--3{margin-left:-3rpx}.ml-4{margin-left:4rpx}.ml--4{margin-left:-4rpx}.ml-5{margin-left:5rpx}.ml--5{margin-left:-5rpx}.ml-6{margin-left:6rpx}.ml--6{margin-left:-6rpx}.ml-7{margin-left:7rpx}.ml--7{margin-left:-7rpx}.ml-8{margin-left:8rpx}.ml--8{margin-left:-8rpx}.ml-9{margin-left:9rpx}.ml--9{margin-left:-9rpx}.ml-10{margin-left:10rpx}.ml--10{margin-left:-10rpx}.ml-11{margin-left:11rpx}.ml--11{margin-left:-11rpx}.ml-12{margin-left:12rpx}.ml--12{margin-left:-12rpx}.ml-13{margin-left:13rpx}.ml--13{margin-left:-13rpx}.ml-14{margin-left:14rpx}.ml--14{margin-left:-14rpx}.ml-15{margin-left:15rpx}.ml--15{margin-left:-15rpx}.ml-16{margin-left:16rpx}.ml--16{margin-left:-16rpx}.ml-17{margin-left:17rpx}.ml--17{margin-left:-17rpx}.ml-18{margin-left:18rpx}.ml--18{margin-left:-18rpx}.ml-19{margin-left:19rpx}.ml--19{margin-left:-19rpx}.ml-20{margin-left:20rpx}.ml--20{margin-left:-20rpx}.ml-21{margin-left:21rpx}.ml--21{margin-left:-21rpx}.ml-22{margin-left:22rpx}.ml--22{margin-left:-22rpx}.ml-23{margin-left:23rpx}.ml--23{margin-left:-23rpx}.ml-24{margin-left:24rpx}.ml--24{margin-left:-24rpx}.ml-25{margin-left:25rpx}.ml--25{margin-left:-25rpx}.ml-n1{margin-left:4rpx}.ml--n1{margin-left:-4rpx}.ml-n2{margin-left:8rpx}.ml--n2{margin-left:-8rpx}.ml-n3{margin-left:12rpx}.ml--n3{margin-left:-12rpx}.ml-n4{margin-left:16rpx}.ml--n4{margin-left:-16rpx}.ml-n5{margin-left:20rpx}.ml--n5{margin-left:-20rpx}.ml-n6{margin-left:24rpx}.ml--n6{margin-left:-24rpx}.ml-n7{margin-left:28rpx}.ml--n7{margin-left:-28rpx}.ml-n8{margin-left:32rpx}.ml--n8{margin-left:-32rpx}.ml-n9{margin-left:36rpx}.ml--n9{margin-left:-36rpx}.ml-n10{margin-left:40rpx}.ml--n10{margin-left:-40rpx}.ml-n11{margin-left:44rpx}.ml--n11{margin-left:-44rpx}.ml-n12{margin-left:48rpx}.ml--n12{margin-left:-48rpx}.ml-n13{margin-left:52rpx}.ml--n13{margin-left:-52rpx}.ml-n14{margin-left:56rpx}.ml--n14{margin-left:-56rpx}.ml-n15{margin-left:60rpx}.ml--n15{margin-left:-60rpx}.ml-n16{margin-left:64rpx}.ml--n16{margin-left:-64rpx}.ml-n17{margin-left:68rpx}.ml--n17{margin-left:-68rpx}.ml-n18{margin-left:72rpx}.ml--n18{margin-left:-72rpx}.ml-n19{margin-left:76rpx}.ml--n19{margin-left:-76rpx}.ml-n20{margin-left:80rpx}.ml--n20{margin-left:-80rpx}.ml-n21{margin-left:84rpx}.ml--n21{margin-left:-84rpx}.ml-n22{margin-left:88rpx}.ml--n22{margin-left:-88rpx}.ml-n23{margin-left:92rpx}.ml--n23{margin-left:-92rpx}.ml-n24{margin-left:96rpx}.ml--n24{margin-left:-96rpx}.ml-n25{margin-left:100rpx}.ml--n25{margin-left:-100rpx}.mx-0{margin-left:0rpx;margin-right:0rpx}.mx-1{margin-left:1rpx;margin-right:1rpx}.mx-2{margin-left:2rpx;margin-right:2rpx}.mx-3{margin-left:3rpx;margin-right:3rpx}.mx-4{margin-left:4rpx;margin-right:4rpx}.mx-5{margin-left:5rpx;margin-right:5rpx}.mx-6{margin-left:6rpx;margin-right:6rpx}.mx-7{margin-left:7rpx;margin-right:7rpx}.mx-8{margin-left:8rpx;margin-right:8rpx}.mx-9{margin-left:9rpx;margin-right:9rpx}.mx-10{margin-left:10rpx;margin-right:10rpx}.mx-11{margin-left:11rpx;margin-right:11rpx}.mx-12{margin-left:12rpx;margin-right:12rpx}.mx-13{margin-left:13rpx;margin-right:13rpx}.mx-14{margin-left:14rpx;margin-right:14rpx}.mx-15{margin-left:15rpx;margin-right:15rpx}.mx-16{margin-left:16rpx;margin-right:16rpx}.mx-17{margin-left:17rpx;margin-right:17rpx}.mx-18{margin-left:18rpx;margin-right:18rpx}.mx-19{margin-left:19rpx;margin-right:19rpx}.mx-20{margin-left:20rpx;margin-right:20rpx}.mx-21{margin-left:21rpx;margin-right:21rpx}.mx-22{margin-left:22rpx;margin-right:22rpx}.mx-23{margin-left:23rpx;margin-right:23rpx}.mx-24{margin-left:24rpx;margin-right:24rpx}.mx-25{margin-left:25rpx;margin-right:25rpx}.mx-n1{margin-left:4rpx;margin-right:4rpx}.mx-n2{margin-left:8rpx;margin-right:8rpx}.mx-n3{margin-left:12rpx;margin-right:12rpx}.mx-n4{margin-left:16rpx;margin-right:16rpx}.mx-n5{margin-left:20rpx;margin-right:20rpx}.mx-n6{margin-left:24rpx;margin-right:24rpx}.mx-n7{margin-left:28rpx;margin-right:28rpx}.mx-n8{margin-left:32rpx;margin-right:32rpx}.mx-n9{margin-left:36rpx;margin-right:36rpx}.mx-n10{margin-left:40rpx;margin-right:40rpx}.mx-n11{margin-left:44rpx;margin-right:44rpx}.mx-n12{margin-left:48rpx;margin-right:48rpx}.mx-n13{margin-left:52rpx;margin-right:52rpx}.mx-n14{margin-left:56rpx;margin-right:56rpx}.mx-n15{margin-left:60rpx;margin-right:60rpx}.mx-n16{margin-left:64rpx;margin-right:64rpx}.mx-n17{margin-left:68rpx;margin-right:68rpx}.mx-n18{margin-left:72rpx;margin-right:72rpx}.mx-n19{margin-left:76rpx;margin-right:76rpx}.mx-n20{margin-left:80rpx;margin-right:80rpx}.mx-n21{margin-left:84rpx;margin-right:84rpx}.mx-n22{margin-left:88rpx;margin-right:88rpx}.mx-n23{margin-left:92rpx;margin-right:92rpx}.mx-n24{margin-left:96rpx;margin-right:96rpx}.mx-n25{margin-left:100rpx;margin-right:100rpx}.my-0{margin-top:0rpx;margin-bottom:0rpx}.my-1{margin-top:1rpx;margin-bottom:1rpx}.my-2{margin-top:2rpx;margin-bottom:2rpx}.my-3{margin-top:3rpx;margin-bottom:3rpx}.my-4{margin-top:4rpx;margin-bottom:4rpx}.my-5{margin-top:5rpx;margin-bottom:5rpx}.my-6{margin-top:6rpx;margin-bottom:6rpx}.my-7{margin-top:7rpx;margin-bottom:7rpx}.my-8{margin-top:8rpx;margin-bottom:8rpx}.my-9{margin-top:9rpx;margin-bottom:9rpx}.my-10{margin-top:10rpx;margin-bottom:10rpx}.my-11{margin-top:11rpx;margin-bottom:11rpx}.my-12{margin-top:12rpx;margin-bottom:12rpx}.my-13{margin-top:13rpx;margin-bottom:13rpx}.my-14{margin-top:14rpx;margin-bottom:14rpx}.my-15{margin-top:15rpx;margin-bottom:15rpx}.my-16{margin-top:16rpx;margin-bottom:16rpx}.my-17{margin-top:17rpx;margin-bottom:17rpx}.my-18{margin-top:18rpx;margin-bottom:18rpx}.my-19{margin-top:19rpx;margin-bottom:19rpx}.my-20{margin-top:20rpx;margin-bottom:20rpx}.my-21{margin-top:21rpx;margin-bottom:21rpx}.my-22{margin-top:22rpx;margin-bottom:22rpx}.my-23{margin-top:23rpx;margin-bottom:23rpx}.my-24{margin-top:24rpx;margin-bottom:24rpx}.my-25{margin-top:25rpx;margin-bottom:25rpx}.my-n1{margin-top:4rpx;margin-bottom:4rpx}.my-n2{margin-top:8rpx;margin-bottom:8rpx}.my-n3{margin-top:12rpx;margin-bottom:12rpx}.my-n4{margin-top:16rpx;margin-bottom:16rpx}.my-n5{margin-top:20rpx;margin-bottom:20rpx}.my-n6{margin-top:24rpx;margin-bottom:24rpx}.my-n7{margin-top:28rpx;margin-bottom:28rpx}.my-n8{margin-top:32rpx;margin-bottom:32rpx}.my-n9{margin-top:36rpx;margin-bottom:36rpx}.my-n10{margin-top:40rpx;margin-bottom:40rpx}.my-n11{margin-top:44rpx;margin-bottom:44rpx}.my-n12{margin-top:48rpx;margin-bottom:48rpx}.my-n13{margin-top:52rpx;margin-bottom:52rpx}.my-n14{margin-top:56rpx;margin-bottom:56rpx}.my-n15{margin-top:60rpx;margin-bottom:60rpx}.my-n16{margin-top:64rpx;margin-bottom:64rpx}.my-n17{margin-top:68rpx;margin-bottom:68rpx}.my-n18{margin-top:72rpx;margin-bottom:72rpx}.my-n19{margin-top:76rpx;margin-bottom:76rpx}.my-n20{margin-top:80rpx;margin-bottom:80rpx}.my-n21{margin-top:84rpx;margin-bottom:84rpx}.my-n22{margin-top:88rpx;margin-bottom:88rpx}.my-n23{margin-top:92rpx;margin-bottom:92rpx}.my-n24{margin-top:96rpx;margin-bottom:96rpx}.my-n25{margin-top:100rpx;margin-bottom:100rpx}.t-0{top:0rpx}.t--0{top:-0rpx}.t-1{top:1rpx}.t--1{top:-1rpx}.t-2{top:2rpx}.t--2{top:-2rpx}.t-3{top:3rpx}.t--3{top:-3rpx}.t-4{top:4rpx}.t--4{top:-4rpx}.t-5{top:5rpx}.t--5{top:-5rpx}.t-6{top:6rpx}.t--6{top:-6rpx}.t-7{top:7rpx}.t--7{top:-7rpx}.t-8{top:8rpx}.t--8{top:-8rpx}.t-9{top:9rpx}.t--9{top:-9rpx}.t-10{top:10rpx}.t--10{top:-10rpx}.t-11{top:11rpx}.t--11{top:-11rpx}.t-12{top:12rpx}.t--12{top:-12rpx}.t-13{top:13rpx}.t--13{top:-13rpx}.t-14{top:14rpx}.t--14{top:-14rpx}.t-15{top:15rpx}.t--15{top:-15rpx}.t-16{top:16rpx}.t--16{top:-16rpx}.t-17{top:17rpx}.t--17{top:-17rpx}.t-18{top:18rpx}.t--18{top:-18rpx}.t-19{top:19rpx}.t--19{top:-19rpx}.t-20{top:20rpx}.t--20{top:-20rpx}.t-21{top:21rpx}.t--21{top:-21rpx}.t-22{top:22rpx}.t--22{top:-22rpx}.t-23{top:23rpx}.t--23{top:-23rpx}.t-24{top:24rpx}.t--24{top:-24rpx}.t-25{top:25rpx}.t--25{top:-25rpx}.t-n1{top:4rpx}.t--n1{top:-4rpx}.t-n2{top:8rpx}.t--n2{top:-8rpx}.t-n3{top:12rpx}.t--n3{top:-12rpx}.t-n4{top:16rpx}.t--n4{top:-16rpx}.t-n5{top:20rpx}.t--n5{top:-20rpx}.t-n6{top:24rpx}.t--n6{top:-24rpx}.t-n7{top:28rpx}.t--n7{top:-28rpx}.t-n8{top:32rpx}.t--n8{top:-32rpx}.t-n9{top:36rpx}.t--n9{top:-36rpx}.t-n10{top:40rpx}.t--n10{top:-40rpx}.t-n11{top:44rpx}.t--n11{top:-44rpx}.t-n12{top:48rpx}.t--n12{top:-48rpx}.t-n13{top:52rpx}.t--n13{top:-52rpx}.t-n14{top:56rpx}.t--n14{top:-56rpx}.t-n15{top:60rpx}.t--n15{top:-60rpx}.t-n16{top:64rpx}.t--n16{top:-64rpx}.t-n17{top:68rpx}.t--n17{top:-68rpx}.t-n18{top:72rpx}.t--n18{top:-72rpx}.t-n19{top:76rpx}.t--n19{top:-76rpx}.t-n20{top:80rpx}.t--n20{top:-80rpx}.t-n21{top:84rpx}.t--n21{top:-84rpx}.t-n22{top:88rpx}.t--n22{top:-88rpx}.t-n23{top:92rpx}.t--n23{top:-92rpx}.t-n24{top:96rpx}.t--n24{top:-96rpx}.t-n25{top:100rpx}.t--n25{top:-100rpx}.r-0{right:0rpx}.r--0{right:-0rpx}.r-1{right:1rpx}.r--1{right:-1rpx}.r-2{right:2rpx}.r--2{right:-2rpx}.r-3{right:3rpx}.r--3{right:-3rpx}.r-4{right:4rpx}.r--4{right:-4rpx}.r-5{right:5rpx}.r--5{right:-5rpx}.r-6{right:6rpx}.r--6{right:-6rpx}.r-7{right:7rpx}.r--7{right:-7rpx}.r-8{right:8rpx}.r--8{right:-8rpx}.r-9{right:9rpx}.r--9{right:-9rpx}.r-10{right:10rpx}.r--10{right:-10rpx}.r-11{right:11rpx}.r--11{right:-11rpx}.r-12{right:12rpx}.r--12{right:-12rpx}.r-13{right:13rpx}.r--13{right:-13rpx}.r-14{right:14rpx}.r--14{right:-14rpx}.r-15{right:15rpx}.r--15{right:-15rpx}.r-16{right:16rpx}.r--16{right:-16rpx}.r-17{right:17rpx}.r--17{right:-17rpx}.r-18{right:18rpx}.r--18{right:-18rpx}.r-19{right:19rpx}.r--19{right:-19rpx}.r-20{right:20rpx}.r--20{right:-20rpx}.r-21{right:21rpx}.r--21{right:-21rpx}.r-22{right:22rpx}.r--22{right:-22rpx}.r-23{right:23rpx}.r--23{right:-23rpx}.r-24{right:24rpx}.r--24{right:-24rpx}.r-25{right:25rpx}.r--25{right:-25rpx}.r-n1{right:4rpx}.r--n1{right:-4rpx}.r-n2{right:8rpx}.r--n2{right:-8rpx}.r-n3{right:12rpx}.r--n3{right:-12rpx}.r-n4{right:16rpx}.r--n4{right:-16rpx}.r-n5{right:20rpx}.r--n5{right:-20rpx}.r-n6{right:24rpx}.r--n6{right:-24rpx}.r-n7{right:28rpx}.r--n7{right:-28rpx}.r-n8{right:32rpx}.r--n8{right:-32rpx}.r-n9{right:36rpx}.r--n9{right:-36rpx}.r-n10{right:40rpx}.r--n10{right:-40rpx}.r-n11{right:44rpx}.r--n11{right:-44rpx}.r-n12{right:48rpx}.r--n12{right:-48rpx}.r-n13{right:52rpx}.r--n13{right:-52rpx}.r-n14{right:56rpx}.r--n14{right:-56rpx}.r-n15{right:60rpx}.r--n15{right:-60rpx}.r-n16{right:64rpx}.r--n16{right:-64rpx}.r-n17{right:68rpx}.r--n17{right:-68rpx}.r-n18{right:72rpx}.r--n18{right:-72rpx}.r-n19{right:76rpx}.r--n19{right:-76rpx}.r-n20{right:80rpx}.r--n20{right:-80rpx}.r-n21{right:84rpx}.r--n21{right:-84rpx}.r-n22{right:88rpx}.r--n22{right:-88rpx}.r-n23{right:92rpx}.r--n23{right:-92rpx}.r-n24{right:96rpx}.r--n24{right:-96rpx}.r-n25{right:100rpx}.r--n25{right:-100rpx}.b-0{bottom:0rpx}.b--0{bottom:-0rpx}.b-1{bottom:1rpx}.b--1{bottom:-1rpx}.b-2{bottom:2rpx}.b--2{bottom:-2rpx}.b-3{bottom:3rpx}.b--3{bottom:-3rpx}.b-4{bottom:4rpx}.b--4{bottom:-4rpx}.b-5{bottom:5rpx}.b--5{bottom:-5rpx}.b-6{bottom:6rpx}.b--6{bottom:-6rpx}.b-7{bottom:7rpx}.b--7{bottom:-7rpx}.b-8{bottom:8rpx}.b--8{bottom:-8rpx}.b-9{bottom:9rpx}.b--9{bottom:-9rpx}.b-10{bottom:10rpx}.b--10{bottom:-10rpx}.b-11{bottom:11rpx}.b--11{bottom:-11rpx}.b-12{bottom:12rpx}.b--12{bottom:-12rpx}.b-13{bottom:13rpx}.b--13{bottom:-13rpx}.b-14{bottom:14rpx}.b--14{bottom:-14rpx}.b-15{bottom:15rpx}.b--15{bottom:-15rpx}.b-16{bottom:16rpx}.b--16{bottom:-16rpx}.b-17{bottom:17rpx}.b--17{bottom:-17rpx}.b-18{bottom:18rpx}.b--18{bottom:-18rpx}.b-19{bottom:19rpx}.b--19{bottom:-19rpx}.b-20{bottom:20rpx}.b--20{bottom:-20rpx}.b-21{bottom:21rpx}.b--21{bottom:-21rpx}.b-22{bottom:22rpx}.b--22{bottom:-22rpx}.b-23{bottom:23rpx}.b--23{bottom:-23rpx}.b-24{bottom:24rpx}.b--24{bottom:-24rpx}.b-25{bottom:25rpx}.b--25{bottom:-25rpx}.b-n1{bottom:4rpx}.b--n1{bottom:-4rpx}.b-n2{bottom:8rpx}.b--n2{bottom:-8rpx}.b-n3{bottom:12rpx}.b--n3{bottom:-12rpx}.b-n4{bottom:16rpx}.b--n4{bottom:-16rpx}.b-n5{bottom:20rpx}.b--n5{bottom:-20rpx}.b-n6{bottom:24rpx}.b--n6{bottom:-24rpx}.b-n7{bottom:28rpx}.b--n7{bottom:-28rpx}.b-n8{bottom:32rpx}.b--n8{bottom:-32rpx}.b-n9{bottom:36rpx}.b--n9{bottom:-36rpx}.b-n10{bottom:40rpx}.b--n10{bottom:-40rpx}.b-n11{bottom:44rpx}.b--n11{bottom:-44rpx}.b-n12{bottom:48rpx}.b--n12{bottom:-48rpx}.b-n13{bottom:52rpx}.b--n13{bottom:-52rpx}.b-n14{bottom:56rpx}.b--n14{bottom:-56rpx}.b-n15{bottom:60rpx}.b--n15{bottom:-60rpx}.b-n16{bottom:64rpx}.b--n16{bottom:-64rpx}.b-n17{bottom:68rpx}.b--n17{bottom:-68rpx}.b-n18{bottom:72rpx}.b--n18{bottom:-72rpx}.b-n19{bottom:76rpx}.b--n19{bottom:-76rpx}.b-n20{bottom:80rpx}.b--n20{bottom:-80rpx}.b-n21{bottom:84rpx}.b--n21{bottom:-84rpx}.b-n22{bottom:88rpx}.b--n22{bottom:-88rpx}.b-n23{bottom:92rpx}.b--n23{bottom:-92rpx}.b-n24{bottom:96rpx}.b--n24{bottom:-96rpx}.b-n25{bottom:100rpx}.b--n25{bottom:-100rpx}.l-0{left:0rpx}.l--0{left:-0rpx}.l-1{left:1rpx}.l--1{left:-1rpx}.l-2{left:2rpx}.l--2{left:-2rpx}.l-3{left:3rpx}.l--3{left:-3rpx}.l-4{left:4rpx}.l--4{left:-4rpx}.l-5{left:5rpx}.l--5{left:-5rpx}.l-6{left:6rpx}.l--6{left:-6rpx}.l-7{left:7rpx}.l--7{left:-7rpx}.l-8{left:8rpx}.l--8{left:-8rpx}.l-9{left:9rpx}.l--9{left:-9rpx}.l-10{left:10rpx}.l--10{left:-10rpx}.l-11{left:11rpx}.l--11{left:-11rpx}.l-12{left:12rpx}.l--12{left:-12rpx}.l-13{left:13rpx}.l--13{left:-13rpx}.l-14{left:14rpx}.l--14{left:-14rpx}.l-15{left:15rpx}.l--15{left:-15rpx}.l-16{left:16rpx}.l--16{left:-16rpx}.l-17{left:17rpx}.l--17{left:-17rpx}.l-18{left:18rpx}.l--18{left:-18rpx}.l-19{left:19rpx}.l--19{left:-19rpx}.l-20{left:20rpx}.l--20{left:-20rpx}.l-21{left:21rpx}.l--21{left:-21rpx}.l-22{left:22rpx}.l--22{left:-22rpx}.l-23{left:23rpx}.l--23{left:-23rpx}.l-24{left:24rpx}.l--24{left:-24rpx}.l-25{left:25rpx}.l--25{left:-25rpx}.l-n1{left:4rpx}.l--n1{left:-4rpx}.l-n2{left:8rpx}.l--n2{left:-8rpx}.l-n3{left:12rpx}.l--n3{left:-12rpx}.l-n4{left:16rpx}.l--n4{left:-16rpx}.l-n5{left:20rpx}.l--n5{left:-20rpx}.l-n6{left:24rpx}.l--n6{left:-24rpx}.l-n7{left:28rpx}.l--n7{left:-28rpx}.l-n8{left:32rpx}.l--n8{left:-32rpx}.l-n9{left:36rpx}.l--n9{left:-36rpx}.l-n10{left:40rpx}.l--n10{left:-40rpx}.l-n11{left:44rpx}.l--n11{left:-44rpx}.l-n12{left:48rpx}.l--n12{left:-48rpx}.l-n13{left:52rpx}.l--n13{left:-52rpx}.l-n14{left:56rpx}.l--n14{left:-56rpx}.l-n15{left:60rpx}.l--n15{left:-60rpx}.l-n16{left:64rpx}.l--n16{left:-64rpx}.l-n17{left:68rpx}.l--n17{left:-68rpx}.l-n18{left:72rpx}.l--n18{left:-72rpx}.l-n19{left:76rpx}.l--n19{left:-76rpx}.l-n20{left:80rpx}.l--n20{left:-80rpx}.l-n21{left:84rpx}.l--n21{left:-84rpx}.l-n22{left:88rpx}.l--n22{left:-88rpx}.l-n23{left:92rpx}.l--n23{left:-92rpx}.l-n24{left:96rpx}.l--n24{left:-96rpx}.l-n25{left:100rpx}.l--n25{left:-100rpx}.grid{display:grid !important}.grid-col-1{grid-template-columns:repeat(1, 1fr)}.grid-col-2{grid-template-columns:repeat(2, 1fr)}.grid-col-3{grid-template-columns:repeat(3, 1fr)}.grid-col-4{grid-template-columns:repeat(4, 1fr)}.grid-col-5{grid-template-columns:repeat(5, 1fr)}.grid-col-6{grid-template-columns:repeat(6, 1fr)}.grid-col-7{grid-template-columns:repeat(7, 1fr)}.grid-col-8{grid-template-columns:repeat(8, 1fr)}.grid-col-9{grid-template-columns:repeat(9, 1fr)}.grid-col-10{grid-template-columns:repeat(10, 1fr)}.grid-col-11{grid-template-columns:repeat(11, 1fr)}.grid-col-12{grid-template-columns:repeat(12, 1fr)}.gap-1{gap:2rpx}.gap-col-1{grid-column-gap:2rpx}.gap-row-1{grid-row-gap:2rpx}.gap-2{gap:4rpx}.gap-col-2{grid-column-gap:4rpx}.gap-row-2{grid-row-gap:4rpx}.gap-3{gap:6rpx}.gap-col-3{grid-column-gap:6rpx}.gap-row-3{grid-row-gap:6rpx}.gap-4{gap:8rpx}.gap-col-4{grid-column-gap:8rpx}.gap-row-4{grid-row-gap:8rpx}.gap-5{gap:10rpx}.gap-col-5{grid-column-gap:10rpx}.gap-row-5{grid-row-gap:10rpx}.gap-6{gap:12rpx}.gap-col-6{grid-column-gap:12rpx}.gap-row-6{grid-row-gap:12rpx}.gap-7{gap:14rpx}.gap-col-7{grid-column-gap:14rpx}.gap-row-7{grid-row-gap:14rpx}.gap-8{gap:16rpx}.gap-col-8{grid-column-gap:16rpx}.gap-row-8{grid-row-gap:16rpx}.gap-9{gap:18rpx}.gap-col-9{grid-column-gap:18rpx}.gap-row-9{grid-row-gap:18rpx}.gap-10{gap:20rpx}.gap-col-10{grid-column-gap:20rpx}.gap-row-10{grid-row-gap:20rpx}.gap-11{gap:22rpx}.gap-col-11{grid-column-gap:22rpx}.gap-row-11{grid-row-gap:22rpx}.gap-12{gap:24rpx}.gap-col-12{grid-column-gap:24rpx}.gap-row-12{grid-row-gap:24rpx}.gap-13{gap:26rpx}.gap-col-13{grid-column-gap:26rpx}.gap-row-13{grid-row-gap:26rpx}.gap-14{gap:28rpx}.gap-col-14{grid-column-gap:28rpx}.gap-row-14{grid-row-gap:28rpx}.gap-15{gap:30rpx}.gap-col-15{grid-column-gap:30rpx}.gap-row-15{grid-row-gap:30rpx}.gap-16{gap:32rpx}.gap-col-16{grid-column-gap:32rpx}.gap-row-16{grid-row-gap:32rpx}.gap-17{gap:34rpx}.gap-col-17{grid-column-gap:34rpx}.gap-row-17{grid-row-gap:34rpx}.gap-18{gap:36rpx}.gap-col-18{grid-column-gap:36rpx}.gap-row-18{grid-row-gap:36rpx}.gap-19{gap:38rpx}.gap-col-19{grid-column-gap:38rpx}.gap-row-19{grid-row-gap:38rpx}.gap-20{gap:40rpx}.gap-col-20{grid-column-gap:40rpx}.gap-row-20{grid-row-gap:40rpx}.gap-21{gap:42rpx}.gap-col-21{grid-column-gap:42rpx}.gap-row-21{grid-row-gap:42rpx}.gap-22{gap:44rpx}.gap-col-22{grid-column-gap:44rpx}.gap-row-22{grid-row-gap:44rpx}.gap-23{gap:46rpx}.gap-col-23{grid-column-gap:46rpx}.gap-row-23{grid-row-gap:46rpx}.gap-24{gap:48rpx}.gap-col-24{grid-column-gap:48rpx}.gap-row-24{grid-row-gap:48rpx}.gap-25{gap:50rpx}.gap-col-25{grid-column-gap:50rpx}.gap-row-25{grid-row-gap:50rpx}.flex{display:flex !important}.flex-col{flex-direction:column !important}.flex-wrap{flex-flow:row wrap !important}.flex-shrink{flex-shrink:0 !important}.flex-row{flex-direction:row !important}.flex-reverse{flex-direction:row-reverse !important}.flex-row-top-start{justify-content:flex-start !important;align-items:flex-start !important;align-content:center;display:flex !important}.flex-row-top-center{justify-content:center !important;align-items:flex-start !important;align-content:center;display:flex !important}.flex-row-top-end{justify-content:flex-end !important;align-items:flex-start !important;align-content:center;display:flex !important}.flex-row-center-start{justify-content:flex-start !important;align-items:center !important;align-content:center;display:flex !important}.flex-row-center-center{justify-content:center !important;align-items:center !important;align-content:center;display:flex !important}.flex-row-center-end{justify-content:flex-end !important;align-items:center !important;align-content:center;display:flex !important}.flex-row-bottom-start{justify-content:flex-start !important;align-items:flex-end !important;align-content:center;display:flex !important}.flex-row-bottom-center{justify-content:center !important;align-items:flex-end !important;align-content:center;display:flex !important}.flex-row-bottom-end{justify-content:flex-end !important;align-items:flex-end !important;align-content:center;display:flex !important}.flex-row-center-between{justify-content:space-between !important;align-items:center !important;align-content:center;display:flex !important}.flex-col-top-start{justify-content:flex-start !important;align-items:flex-start !important;align-content:center;display:flex !important}.flex-col-top-center{justify-content:flex-start !important;align-items:center !important;align-content:center;display:flex !important}.flex-col-top-end{justify-content:flex-start !important;align-items:flex-end !important;align-content:center;display:flex !important}.flex-col-center-start{justify-content:center !important;align-items:flex-start !important;align-content:center;display:flex !important}.flex-col-center-center{justify-content:center !important;align-items:center !important;align-content:center;display:flex !important}.flex-col-center-end{justify-content:center !important;align-items:flex-end !important;align-content:center;display:flex !important}.flex-col-bottom-start{justify-content:flex-end !important;align-items:flex-start !important;align-content:center;display:flex !important}.flex-col-bottom-center{justify-content:flex-end !important;align-items:center !important;align-content:center;display:flex !important}.flex-col-bottom-end{justify-content:flex-end !important;align-items:flex-end !important;align-content:center;display:flex !important}.flex-start{justify-content:flex-start !important;align-items:center !important;align-content:center;display:flex !important}.flex-end{justify-content:flex-end !important;align-items:center !important;align-content:center;display:flex !important}.flex-center{justify-content:center !important;align-items:center !important;align-content:center;display:flex !important}.flex-between{justify-content:space-between}.flex-col-full{flex-direction:column;align-items:stretch}.flex-around{justify-content:space-around}.flex-row-baseline-start{justify-content:flex-start !important;align-items:baseline !important;align-content:center;display:flex !important}.flex-row-baseline-center{justify-content:center !important;align-items:baseline !important;align-content:center;display:flex !important}.flex-row-baseline-end{justify-content:flex-end !important;align-items:baseline !important;align-content:center;display:flex !important}.flex-0{flex-grow:0 !important}.flex-1{flex-grow:1 !important}.flex-2{flex-grow:2 !important}.flex-3{flex-grow:3 !important}.flex-4{flex-grow:4 !important}.flex-5{flex-grow:5 !important}.flex-6{flex-grow:6 !important}.flex-7{flex-grow:7 !important}.flex-8{flex-grow:8 !important}.flex-9{flex-grow:9 !important}.flex-10{flex-grow:10 !important}.flex-11{flex-grow:11 !important}.flex-12{flex-grow:12 !important}.text-red{color:#f44336 !important}.red{background-color:#f44336}.text-pink{color:#e91e63 !important}.pink{background-color:#e91e63}.text-purple{color:#9c27b0 !important}.purple{background-color:#9c27b0}.text-deep-purple{color:#673ab7 !important}.deep-purple{background-color:#673ab7}.text-indigo{color:#3f51b5 !important}.indigo{background-color:#3f51b5}.text-blue{color:#2196f3 !important}.blue{background-color:#2196f3}.text-light-blue{color:#03a9f4 !important}.light-blue{background-color:#03a9f4}.text-cyan{color:#00bcd4 !important}.cyan{background-color:#00bcd4}.text-teal{color:#009688 !important}.teal{background-color:#009688}.text-green{color:#4caf50 !important}.green{background-color:#4caf50}.text-light-green{color:#8bc34a !important}.light-green{background-color:#8bc34a}.text-lime{color:#cddc39 !important}.lime{background-color:#cddc39}.text-yellow{color:#ffeb3b !important}.yellow{background-color:#ffeb3b}.text-amber{color:#ffc107 !important}.amber{background-color:#ffc107}.text-orange{color:#ff9800 !important}.orange{background-color:#ff9800}.text-deep-orange{color:#ff5722 !important}.deep-orange{background-color:#ff5722}.text-brown{color:#795548 !important}.brown{background-color:#795548}.text-blue-grey{color:#607d8b !important}.blue-grey{background-color:#607d8b}.text-grey{color:#9e9e9e !important}.grey{background-color:#9e9e9e}.text-black{color:#000 !important}.black{background-color:#000}.text-white{color:#fff !important}.white{background-color:#fff}.text-lighten-5{color:#fafafa !important}.lighten-5{background-color:#fafafa}.text-lighten-4{color:#f5f5f5 !important}.lighten-4{background-color:#f5f5f5}.text-lighten-3{color:#eee !important}.lighten-3{background-color:#eee}.text-lighten-2{color:#e0e0e0 !important}.lighten-2{background-color:#e0e0e0}.text-lighten-1{color:#bdbdbd !important}.lighten-1{background-color:#bdbdbd}.text-darken-1{color:#757575 !important}.darken-1{background-color:#757575}.text-darken-2{color:#616161 !important}.darken-2{background-color:#616161}.text-darken-3{color:#424242 !important}.darken-3{background-color:#424242}.text-darken-4{color:#212121 !important}.darken-4{background-color:#212121}.text-darken-5{color:#131313 !important}.darken-5{background-color:#131313}.text-darken-6{color:#0a0a0a !important}.darken-6{background-color:#0a0a0a}/*# sourceMappingURL=tmui.css.map */
diff --git a/src/uni_modules/tm-ui/css/tmui.css.map b/src/uni_modules/tm-ui/css/tmui.css.map
index c6095d4..45e3ec2 100644
--- a/src/uni_modules/tm-ui/css/tmui.css.map
+++ b/src/uni_modules/tm-ui/css/tmui.css.map
@@ -1 +1 @@
-{"version":3,"sources":["tmui.scss","tmui.css"],"names":[],"mappings":"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XE;EAME,yCAAA;ACuXJ;;AD7XE;EAME,yCAAA;AC2XJ;;ADjYE;EAME,yCAAA;AC+XJ;;ADrYE;EAME,yCAAA;ACmYJ;;ADzYE;EAME,yCAAA;ACuYJ;;AD7YE;EAME,yCAAA;AC2YJ;;ADjZE;EAME,yCAAA;AC+YJ;;ADrZE;EAME,yCAAA;ACmZJ;;ADzZE;EAME,yCAAA;ACuZJ;;AD7ZE;EAME,yCAAA;AC2ZJ;;ADjaE;EAME,yCAAA;AC+ZJ;;ADraE;EAME,yCAAA;ACmaJ;;ADzaE;EAME,yCAAA;ACuaJ;;AD7aE;EAME,yCAAA;AC2aJ;;ADjbE;EAME,yCAAA;AC+aJ;;ADrbE;EAME,yCAAA;ACmbJ;;ADzbE;EAME,yCAAA;ACubJ;;AD7bE;EAME,yCAAA;AC2bJ;;ADjcE;EAME,yCAAA;AC+bJ;;ADrcE;EAME,0CAAA;ACmcJ;;ADzcE;EAUE,0CAAA;ACmcJ;;AD7cE;EAUE,0CAAA;ACucJ;;ADjdE;EAUE,0CAAA;AC2cJ;;ADrdE;EAUE,2CAAA;AC+cJ;;ADzdE;EAUE,2CAAA;ACmdJ;;AD7dE;EAUE,2CAAA;ACudJ;;ADjeE;EAUE,2CAAA;AC2dJ;;ADreE;EAUE,2CAAA;AC+dJ;;ADzeE;EAUE,2CAAA;ACmeJ;;AD7eE;EAUE,2CAAA;ACueJ;;ADjfE;EAUE,2CAAA;AC2eJ;;ADrfE;EAUE,2CAAA;AC+eJ;;ADzfE;EAUE,2CAAA;ACmfJ;;AD7fE;EAUE,2CAAA;ACufJ;;ADjgBE;EAUE,2CAAA;AC2fJ;;ADrgBE;EAUE,2CAAA;AC+fJ;;ADzgBE;EAUE,2CAAA;ACmgBJ;;AD7gBE;EAUE,2CAAA;ACugBJ;;ADjhBE;EAUE,2CAAA;AC2gBJ;;ADrhBE;EAUE,2CAAA;AC+gBJ;;ADzhBE;EAUE,2CAAA;ACmhBJ;;AD7hBE;EAUE,2CAAA;ACuhBJ;;ADjiBE;EAUE,2CAAA;AC2hBJ;;ADriBE;EAUE,2CAAA;AC+hBJ;;ADziBE;EAUE,2CAAA;ACmiBJ;;AD7iBE;EAUE,4CAAA;ACuiBJ;;ADjjBE;EAcE,2CAAA;ACuiBJ;;ADrjBE;EAcE,2CAAA;AC2iBJ;;ADzjBE;EAcE,2CAAA;AC+iBJ;;AD7jBE;EAcE,4CAAA;ACmjBJ;;ADjkBE;EAcE,4CAAA;ACujBJ;;ADrkBE;EAcE,4CAAA;AC2jBJ;;ADzkBE;EAcE,4CAAA;AC+jBJ;;AD7kBE;EAcE,4CAAA;ACmkBJ;;ADjlBE;EAcE,4CAAA;ACukBJ;;ADrlBE;EAcE,4CAAA;AC2kBJ;;ADzlBE;EAcE,4CAAA;AC+kBJ;;AD7lBE;EAcE,4CAAA;ACmlBJ;;ADjmBE;EAcE,4CAAA;ACulBJ;;ADrmBE;EAcE,4CAAA;AC2lBJ;;ADzmBE;EAcE,4CAAA;AC+lBJ;;AD7mBE;EAcE,4CAAA;ACmmBJ;;ADjnBE;EAcE,4CAAA;ACumBJ;;ADrnBE;EAcE,4CAAA;AC2mBJ;;ADznBE;EAcE,4CAAA;AC+mBJ;;AD7nBE;EAcE,4CAAA;ACmnBJ;;ADjoBE;EAcE,4CAAA;ACunBJ;;ADroBE;EAcE,4CAAA;AC2nBJ;;ADzoBE;EAcE,4CAAA;AC+nBJ;;AD7oBE;EAcE,4CAAA;ACmoBJ;;ADjpBE;EAcE,4CAAA;ACuoBJ;;ADrpBE;EAcE,6CAAA;AC2oBJ;;ADzpBE;EAsCE,8BAAA;ACunBJ;;AD7pBE;EAsCE,8BAAA;AC2nBJ;;ADjqBE;EAsCE,8BAAA;AC+nBJ;;ADrqBE;EAsCE,+BAAA;ACmoBJ;;ADzqBE;EAsCE,+BAAA;ACuoBJ;;AD7qBE;EAsCE,+BAAA;AC2oBJ;;ADjrBE;EAsCE,+BAAA;AC+oBJ;;ADrrBE;EAsCE,+BAAA;ACmpBJ;;ADzrBE;EAsCE,+BAAA;ACupBJ;;AD7rBE;EAsCE,+BAAA;AC2pBJ;;ADjsBE;EAsCE,+BAAA;AC+pBJ;;ADrsBE;EAsCE,+BAAA;ACmqBJ;;ADzsBE;EAsCE,+BAAA;ACuqBJ;;AD7sBE;EAsCE,+BAAA;AC2qBJ;;ADjtBE;EAsCE,+BAAA;AC+qBJ;;ADrtBE;EAsCE,+BAAA;ACmrBJ;;ADztBE;EAsCE,+BAAA;ACurBJ;;AD7tBE;EAsCE,+BAAA;AC2rBJ;;ADjuBE;EAsCE,+BAAA;AC+rBJ;;ADruBE;EAsCE,+BAAA;ACmsBJ;;ADzuBE;EAsCE,+BAAA;ACusBJ;;AD7uBE;EAsCE,+BAAA;AC2sBJ;;ADjvBE;EAsCE,+BAAA;AC+sBJ;;ADrvBE;EAsCE,+BAAA;ACmtBJ;;ADzvBE;EAsCE,+BAAA;ACutBJ;;AD7vBE;EAsCE,gCAAA;AC2tBJ;;ADjwBE;EAkBE,uCAAA;EACA,wCAAA;ACmvBJ;;ADtwBE;EAkBE,uCAAA;EACA,wCAAA;ACwvBJ;;AD3wBE;EAkBE,uCAAA;EACA,wCAAA;AC6vBJ;;ADhxBE;EAkBE,wCAAA;EACA,yCAAA;ACkwBJ;;ADrxBE;EAkBE,wCAAA;EACA,yCAAA;ACuwBJ;;AD1xBE;EAkBE,wCAAA;EACA,yCAAA;AC4wBJ;;AD/xBE;EAkBE,wCAAA;EACA,yCAAA;ACixBJ;;ADpyBE;EAkBE,wCAAA;EACA,yCAAA;ACsxBJ;;ADzyBE;EAkBE,wCAAA;EACA,yCAAA;AC2xBJ;;AD9yBE;EAkBE,wCAAA;EACA,yCAAA;ACgyBJ;;ADnzBE;EAkBE,wCAAA;EACA,yCAAA;ACqyBJ;;ADxzBE;EAkBE,wCAAA;EACA,yCAAA;AC0yBJ;;AD7zBE;EAkBE,wCAAA;EACA,yCAAA;AC+yBJ;;ADl0BE;EAkBE,wCAAA;EACA,yCAAA;ACozBJ;;ADv0BE;EAkBE,wCAAA;EACA,yCAAA;ACyzBJ;;AD50BE;EAkBE,wCAAA;EACA,yCAAA;AC8zBJ;;ADj1BE;EAkBE,wCAAA;EACA,yCAAA;ACm0BJ;;ADt1BE;EAkBE,wCAAA;EACA,yCAAA;ACw0BJ;;AD31BE;EAkBE,wCAAA;EACA,yCAAA;AC60BJ;;ADh2BE;EAkBE,wCAAA;EACA,yCAAA;ACk1BJ;;ADr2BE;EAkBE,wCAAA;EACA,yCAAA;ACu1BJ;;AD12BE;EAkBE,wCAAA;EACA,yCAAA;AC41BJ;;AD/2BE;EAkBE,wCAAA;EACA,yCAAA;ACi2BJ;;ADp3BE;EAkBE,wCAAA;EACA,yCAAA;ACs2BJ;;ADz3BE;EAkBE,wCAAA;EACA,yCAAA;AC22BJ;;AD93BE;EAkBE,yCAAA;EACA,0CAAA;ACg3BJ;;ADn4BE;EAuBE,0CAAA;EACA,2CAAA;ACg3BJ;;ADx4BE;EAuBE,0CAAA;EACA,2CAAA;ACq3BJ;;AD74BE;EAuBE,0CAAA;EACA,2CAAA;AC03BJ;;ADl5BE;EAuBE,2CAAA;EACA,4CAAA;AC+3BJ;;ADv5BE;EAuBE,2CAAA;EACA,4CAAA;ACo4BJ;;AD55BE;EAuBE,2CAAA;EACA,4CAAA;ACy4BJ;;ADj6BE;EAuBE,2CAAA;EACA,4CAAA;AC84BJ;;ADt6BE;EAuBE,2CAAA;EACA,4CAAA;ACm5BJ;;AD36BE;EAuBE,2CAAA;EACA,4CAAA;ACw5BJ;;ADh7BE;EAuBE,2CAAA;EACA,4CAAA;AC65BJ;;ADr7BE;EAuBE,2CAAA;EACA,4CAAA;ACk6BJ;;AD17BE;EAuBE,2CAAA;EACA,4CAAA;ACu6BJ;;AD/7BE;EAuBE,2CAAA;EACA,4CAAA;AC46BJ;;ADp8BE;EAuBE,2CAAA;EACA,4CAAA;ACi7BJ;;ADz8BE;EAuBE,2CAAA;EACA,4CAAA;ACs7BJ;;AD98BE;EAuBE,2CAAA;EACA,4CAAA;AC27BJ;;ADn9BE;EAuBE,2CAAA;EACA,4CAAA;ACg8BJ;;ADx9BE;EAuBE,2CAAA;EACA,4CAAA;ACq8BJ;;AD79BE;EAuBE,2CAAA;EACA,4CAAA;AC08BJ;;ADl+BE;EAuBE,2CAAA;EACA,4CAAA;AC+8BJ;;ADv+BE;EAuBE,2CAAA;EACA,4CAAA;ACo9BJ;;AD5+BE;EAuBE,2CAAA;EACA,4CAAA;ACy9BJ;;ADj/BE;EAuBE,2CAAA;EACA,4CAAA;AC89BJ;;ADt/BE;EAuBE,2CAAA;EACA,4CAAA;ACm+BJ;;AD3/BE;EAuBE,2CAAA;EACA,4CAAA;ACw+BJ;;ADhgCE;EAuBE,4CAAA;EACA,6CAAA;AC6+BJ;;ADrgCE;EA4BE,uCAAA;EACA,0CAAA;AC6+BJ;;AD1gCE;EA4BE,uCAAA;EACA,0CAAA;ACk/BJ;;AD/gCE;EA4BE,uCAAA;EACA,0CAAA;ACu/BJ;;ADphCE;EA4BE,wCAAA;EACA,2CAAA;AC4/BJ;;ADzhCE;EA4BE,wCAAA;EACA,2CAAA;ACigCJ;;AD9hCE;EA4BE,wCAAA;EACA,2CAAA;ACsgCJ;;ADniCE;EA4BE,wCAAA;EACA,2CAAA;AC2gCJ;;ADxiCE;EA4BE,wCAAA;EACA,2CAAA;ACghCJ;;AD7iCE;EA4BE,wCAAA;EACA,2CAAA;ACqhCJ;;ADljCE;EA4BE,wCAAA;EACA,2CAAA;AC0hCJ;;ADvjCE;EA4BE,wCAAA;EACA,2CAAA;AC+hCJ;;AD5jCE;EA4BE,wCAAA;EACA,2CAAA;ACoiCJ;;ADjkCE;EA4BE,wCAAA;EACA,2CAAA;ACyiCJ;;ADtkCE;EA4BE,wCAAA;EACA,2CAAA;AC8iCJ;;AD3kCE;EA4BE,wCAAA;EACA,2CAAA;ACmjCJ;;ADhlCE;EA4BE,wCAAA;EACA,2CAAA;ACwjCJ;;ADrlCE;EA4BE,wCAAA;EACA,2CAAA;AC6jCJ;;AD1lCE;EA4BE,wCAAA;EACA,2CAAA;ACkkCJ;;AD/lCE;EA4BE,wCAAA;EACA,2CAAA;ACukCJ;;ADpmCE;EA4BE,wCAAA;EACA,2CAAA;AC4kCJ;;ADzmCE;EA4BE,wCAAA;EACA,2CAAA;ACilCJ;;AD9mCE;EA4BE,wCAAA;EACA,2CAAA;ACslCJ;;ADnnCE;EA4BE,wCAAA;EACA,2CAAA;AC2lCJ;;ADxnCE;EA4BE,wCAAA;EACA,2CAAA;ACgmCJ;;AD7nCE;EA4BE,wCAAA;EACA,2CAAA;ACqmCJ;;ADloCE;EA4BE,yCAAA;EACA,4CAAA;AC0mCJ;;ADvoCE;EAiCE,wCAAA;EACA,2CAAA;AC0mCJ;;AD5oCE;EAiCE,wCAAA;EACA,2CAAA;AC+mCJ;;ADjpCE;EAiCE,wCAAA;EACA,2CAAA;AConCJ;;ADtpCE;EAiCE,yCAAA;EACA,4CAAA;ACynCJ;;AD3pCE;EAiCE,yCAAA;EACA,4CAAA;AC8nCJ;;ADhqCE;EAiCE,yCAAA;EACA,4CAAA;ACmoCJ;;ADrqCE;EAiCE,yCAAA;EACA,4CAAA;ACwoCJ;;AD1qCE;EAiCE,yCAAA;EACA,4CAAA;AC6oCJ;;AD/qCE;EAiCE,yCAAA;EACA,4CAAA;ACkpCJ;;ADprCE;EAiCE,yCAAA;EACA,4CAAA;ACupCJ;;ADzrCE;EAiCE,yCAAA;EACA,4CAAA;AC4pCJ;;AD9rCE;EAiCE,yCAAA;EACA,4CAAA;ACiqCJ;;ADnsCE;EAiCE,yCAAA;EACA,4CAAA;ACsqCJ;;ADxsCE;EAiCE,yCAAA;EACA,4CAAA;AC2qCJ;;AD7sCE;EAiCE,yCAAA;EACA,4CAAA;ACgrCJ;;ADltCE;EAiCE,yCAAA;EACA,4CAAA;ACqrCJ;;ADvtCE;EAiCE,yCAAA;EACA,4CAAA;AC0rCJ;;AD5tCE;EAiCE,yCAAA;EACA,4CAAA;AC+rCJ;;ADjuCE;EAiCE,yCAAA;EACA,4CAAA;ACosCJ;;ADtuCE;EAiCE,yCAAA;EACA,4CAAA;ACysCJ;;AD3uCE;EAiCE,yCAAA;EACA,4CAAA;AC8sCJ;;ADhvCE;EAiCE,yCAAA;EACA,4CAAA;ACmtCJ;;ADrvCE;EAiCE,yCAAA;EACA,4CAAA;ACwtCJ;;AD1vCE;EAiCE,yCAAA;EACA,4CAAA;AC6tCJ;;AD/vCE;EAiCE,yCAAA;EACA,4CAAA;ACkuCJ;;ADpwCE;EAiCE,0CAAA;EACA,6CAAA;ACuuCJ;;AD3tCC;EACC,mBAAA;AC8tCF;;AD/tCC;EACC,mBAAA;ACkuCF;;ADnuCC;EACC,mBAAA;ACsuCF;;ADvuCC;EACC,oBAAA;AC0uCF;;AD3uCC;EACC,oBAAA;AC8uCF;;AD/uCC;EACC,oBAAA;ACkvCF;;ADnvCC;EACC,oBAAA;ACsvCF;;ADvvCC;EACC,oBAAA;AC0vCF;;AD3vCC;EACC,oBAAA;AC8vCF;;AD/vCC;EACC,oBAAA;ACkwCF;;ADnwCC;EACC,oBAAA;ACswCF;;ADvwCC;EACC,oBAAA;AC0wCF;;AD3wCC;EACC,oBAAA;AC8wCF;;AD/wCC;EACC,oBAAA;ACkxCF;;ADnxCC;EACC,oBAAA;ACsxCF;;ADvxCC;EACC,oBAAA;AC0xCF;;AD3xCC;EACC,oBAAA;AC8xCF;;AD/xCC;EACC,oBAAA;ACkyCF;;ADnyCC;EACC,oBAAA;ACsyCF;;ADvyCC;EACC,oBAAA;AC0yCF;;AD3yCC;EACC,oBAAA;AC8yCF;;AD/yCC;EACC,oBAAA;ACkzCF;;ADnzCC;EACC,oBAAA;ACszCF;;ADvzCC;EACC,oBAAA;AC0zCF;;AD3zCC;EACC,oBAAA;AC8zCF;;AD/zCC;EACC,qBAAA;ACk0CF;;ADn0CC;EACC,qBAAA;ACs0CF;;ADj0CA;EACC,6BAAA;ACo0CD;;AD/zCC;EAME,UAAA;AC6zCH;;ADn0CC;EAEE,YAAA;ACq0CH;;ADv0CC;EAEE,YAAA;ACy0CH;;AD30CC;EAEE,YAAA;AC60CH;;AD/0CC;EAEE,YAAA;ACi1CH;;ADn1CC;EAEE,YAAA;ACq1CH;;ADv1CC;EAEE,YAAA;ACy1CH;;AD31CC;EAEE,YAAA;AC61CH;;AD/1CC;EAEE,YAAA;ACi2CH;;ADn2CC;EAEE,YAAA;ACq2CH;;ADv2CC;EAUE,UAAA;ACi2CH;;AD51CA;EACC,4CAAA;AC+1CD;;AD31CC;EACC,4CAAA;AC81CF;;AD/1CC;EACC,4CAAA;ACk2CF;;ADn2CC;EACC,4CAAA;ACs2CF;;ADv2CC;EACC,4CAAA;AC02CF;;AD32CC;EACC,4CAAA;AC82CF;;AD/2CC;EACC,6CAAA;ACk3CF;;ADn3CC;EACC,6CAAA;ACs3CF;;ADv3CC;EACC,6CAAA;AC03CF;;AD33CC;EACC,6CAAA;AC83CF;;AD/3CC;EACC,6CAAA;ACk4CF;;ADn4CC;EACC,6CAAA;ACs4CF;;ADv4CC;EACC,6CAAA;AC04CF;;AD34CC;EACC,6CAAA;AC84CF;;AD/4CC;EACC,6CAAA;ACk5CF;;ADn5CC;EACC,6CAAA;ACs5CF;;ADv5CC;EACC,6CAAA;AC05CF;;AD35CC;EACC,6CAAA;AC85CF;;AD/5CC;EACC,6CAAA;ACk6CF;;ADn6CC;EACC,6CAAA;ACs6CF;;ADv6CC;EACC,6CAAA;AC06CF;;AD36CC;EACC,6CAAA;AC86CF;;AD/6CC;EACC,6CAAA;ACk7CF;;ADn7CC;EACC,6CAAA;ACs7CF;;ADv7CC;EACC,6CAAA;AC07CF;;AD37CC;EACC,6CAAA;AC87CF;;AD/7CC;EACC,6CAAA;ACk8CF;;AD17CE;EACC,qCAAA;AC67CH;;AD17CE;EACC,qCAAA;AC67CH;;AD17CE;EACC,qCAAA;AC67CH;;AD17CE;EACC,qCAAA;AC67CH;;ADx7CE;EACC,oCAAA;AC27CH;;ADx7CE;EACC,oCAAA;AC27CH;;ADh8CE;EACC,oCAAA;ACm8CH;;ADh8CE;EACC,oCAAA;ACm8CH;;ADx8CE;EACC,oCAAA;AC28CH;;ADx8CE;EACC,oCAAA;AC28CH;;ADh9CE;EACC,oCAAA;ACm9CH;;ADh9CE;EACC,oCAAA;ACm9CH;;ADx9CE;EACC,qCAAA;AC29CH;;ADx9CE;EACC,qCAAA;AC29CH;;ADl9CE;EAME,6CAAA;ACg9CJ;;AD58CE;EAME,0CAAA;AC08CJ;;AD19CE;EAME,6CAAA;ACw9CJ;;ADp9CE;EAME,0CAAA;ACk9CJ;;ADl+CE;EAME,6CAAA;ACg+CJ;;AD59CE;EAME,0CAAA;AC09CJ;;AD1+CE;EAME,6CAAA;ACw+CJ;;ADp+CE;EAME,0CAAA;ACk+CJ;;ADl/CE;EAME,8CAAA;ACg/CJ;;AD5+CE;EAME,2CAAA;AC0+CJ;;AD1/CE;EAME,8CAAA;ACw/CJ;;ADp/CE;EAME,2CAAA;ACk/CJ;;ADlgDE;EAME,8CAAA;ACggDJ;;AD5/CE;EAME,2CAAA;AC0/CJ;;AD1gDE;EAME,8CAAA;ACwgDJ;;ADpgDE;EAME,2CAAA;ACkgDJ;;ADlhDE;EAME,8CAAA;ACghDJ;;AD5gDE;EAME,2CAAA;AC0gDJ;;AD1hDE;EAME,+CAAA;ACwhDJ;;ADphDE;EAME,4CAAA;ACkhDJ;;ADliDE;EAME,4CAAA;ACgiDJ;;AD5hDE;EAME,yCAAA;AC0hDJ;;AD1iDE;EAME,4CAAA;ACwiDJ;;ADpiDE;EAME,yCAAA;ACkiDJ;;ADljDE;EAME,4CAAA;ACgjDJ;;AD5iDE;EAME,yCAAA;AC0iDJ;;AD1jDE;EAME,4CAAA;ACwjDJ;;ADpjDE;EAME,yCAAA;ACkjDJ;;ADlkDE;EAME,6CAAA;ACgkDJ;;AD5jDE;EAME,0CAAA;AC0jDJ;;AD1kDE;EAME,+CAAA;ACwkDJ;;ADpkDE;EAME,4CAAA;ACkkDJ;;ADllDE;EAME,+CAAA;ACglDJ;;AD5kDE;EAME,4CAAA;AC0kDJ;;AD1lDE;EAME,+CAAA;ACwlDJ;;ADplDE;EAME,4CAAA;ACklDJ;;ADlmDE;EAME,+CAAA;ACgmDJ;;AD5lDE;EAME,4CAAA;AC0lDJ;;AD1mDE;EAME,gDAAA;ACwmDJ;;ADpmDE;EAME,6CAAA;ACkmDJ;;ADlnDE;EAEE,wCAAA;AConDJ;;AD5mDE;EAEE,qCAAA;AC8mDJ;;AD1nDE;EAEE,wCAAA;AC4nDJ;;ADpnDE;EAEE,qCAAA;ACsnDJ;;ADloDE;EAEE,wCAAA;ACooDJ;;AD5nDE;EAEE,qCAAA;AC8nDJ;;AD1oDE;EAEE,wCAAA;AC4oDJ;;ADpoDE;EAEE,qCAAA;ACsoDJ;;ADlpDE;EAEE,yCAAA;ACopDJ;;AD5oDE;EAEE,sCAAA;AC8oDJ;;AD/nDG;EACC,aAAA;ACkoDJ;;ADnoDG;EACC,aAAA;ACsoDJ;;ADvoDG;EACC,aAAA;AC0oDJ;;AD3oDG;EACC,aAAA;AC8oDJ;;AD/oDG;EACC,aAAA;ACkpDJ;;ADnpDG;EACC,aAAA;ACspDJ;;ADvpDG;EACC,aAAA;AC0pDJ;;AD3pDG;EACC,aAAA;AC8pDJ;;AD/pDG;EACC,aAAA;ACkqDJ;;ADnqDG;EACC,aAAA;ACsqDJ;;ADvqDG;EACC,cAAA;AC0qDJ;;AD3qDG;EACC,cAAA;AC8qDJ;;AD/qDG;EACC,cAAA;ACkrDJ;;ADnrDG;EACC,cAAA;ACsrDJ;;ADvrDG;EACC,cAAA;AC0rDJ;;AD3rDG;EACC,cAAA;AC8rDJ;;AD/rDG;EACC,cAAA;ACksDJ;;ADnsDG;EACC,cAAA;ACssDJ;;ADvsDG;EACC,cAAA;AC0sDJ;;AD3sDG;EACC,cAAA;AC8sDJ;;AD/sDG;EACC,cAAA;ACktDJ;;ADntDG;EACC,cAAA;ACstDJ;;ADvtDG;EACC,cAAA;AC0tDJ;;AD3tDG;EACC,cAAA;AC8tDJ;;AD/tDG;EACC,cAAA;ACkuDJ;;ADnuDG;EACC,cAAA;ACsuDJ;;ADjtDG;EACC,aAAA;ACotDJ;;ADrtDG;EACC,aAAA;ACwtDJ;;ADztDG;EACC,cAAA;AC4tDJ;;AD7tDG;EACC,cAAA;ACguDJ;;ADjuDG;EACC,cAAA;ACouDJ;;ADruDG;EACC,cAAA;ACwuDJ;;ADzuDG;EACC,cAAA;AC4uDJ;;AD7uDG;EACC,cAAA;ACgvDJ;;ADjvDG;EACC,cAAA;ACovDJ;;ADrvDG;EACC,cAAA;ACwvDJ;;ADzvDG;EACC,cAAA;AC4vDJ;;AD7vDG;EACC,cAAA;ACgwDJ;;ADjwDG;EACC,cAAA;ACowDJ;;ADrwDG;EACC,cAAA;ACwwDJ;;ADzwDG;EACC,cAAA;AC4wDJ;;AD7wDG;EACC,cAAA;ACgxDJ;;ADjxDG;EACC,cAAA;ACoxDJ;;ADrxDG;EACC,cAAA;ACwxDJ;;ADzxDG;EACC,cAAA;AC4xDJ;;AD7xDG;EACC,cAAA;ACgyDJ;;ADjyDG;EACC,cAAA;ACoyDJ;;ADryDG;EACC,cAAA;ACwyDJ;;ADzyDG;EACC,cAAA;AC4yDJ;;AD7yDG;EACC,cAAA;ACgzDJ;;ADjzDG;EACC,eAAA;ACozDJ;;AD30DG;EACC,iBAAA;AC80DJ;;AD/0DG;EACC,iBAAA;ACk1DJ;;ADn1DG;EACC,iBAAA;ACs1DJ;;ADv1DG;EACC,iBAAA;AC01DJ;;AD31DG;EACC,iBAAA;AC81DJ;;AD/1DG;EACC,iBAAA;ACk2DJ;;ADn2DG;EACC,iBAAA;ACs2DJ;;ADv2DG;EACC,iBAAA;AC02DJ;;AD32DG;EACC,iBAAA;AC82DJ;;AD/2DG;EACC,iBAAA;ACk3DJ;;ADn3DG;EACC,kBAAA;ACs3DJ;;ADv3DG;EACC,kBAAA;AC03DJ;;AD33DG;EACC,kBAAA;AC83DJ;;AD/3DG;EACC,kBAAA;ACk4DJ;;ADn4DG;EACC,kBAAA;ACs4DJ;;ADv4DG;EACC,kBAAA;AC04DJ;;AD34DG;EACC,kBAAA;AC84DJ;;AD/4DG;EACC,kBAAA;ACk5DJ;;ADn5DG;EACC,kBAAA;ACs5DJ;;ADv5DG;EACC,kBAAA;AC05DJ;;AD35DG;EACC,kBAAA;AC85DJ;;AD/5DG;EACC,kBAAA;ACk6DJ;;ADn6DG;EACC,kBAAA;ACs6DJ;;ADv6DG;EACC,kBAAA;AC06DJ;;AD36DG;EACC,kBAAA;AC86DJ;;AD/6DG;EACC,kBAAA;ACk7DJ;;AD75DG;EACC,iBAAA;ACg6DJ;;ADj6DG;EACC,iBAAA;ACo6DJ;;ADr6DG;EACC,kBAAA;ACw6DJ;;ADz6DG;EACC,kBAAA;AC46DJ;;AD76DG;EACC,kBAAA;ACg7DJ;;ADj7DG;EACC,kBAAA;ACo7DJ;;ADr7DG;EACC,kBAAA;ACw7DJ;;ADz7DG;EACC,kBAAA;AC47DJ;;AD77DG;EACC,kBAAA;ACg8DJ;;ADj8DG;EACC,kBAAA;ACo8DJ;;ADr8DG;EACC,kBAAA;ACw8DJ;;ADz8DG;EACC,kBAAA;AC48DJ;;AD78DG;EACC,kBAAA;ACg9DJ;;ADj9DG;EACC,kBAAA;ACo9DJ;;ADr9DG;EACC,kBAAA;ACw9DJ;;ADz9DG;EACC,kBAAA;AC49DJ;;AD79DG;EACC,kBAAA;ACg+DJ;;ADj+DG;EACC,kBAAA;ACo+DJ;;ADr+DG;EACC,kBAAA;ACw+DJ;;ADz+DG;EACC,kBAAA;AC4+DJ;;AD7+DG;EACC,kBAAA;ACg/DJ;;ADj/DG;EACC,kBAAA;ACo/DJ;;ADr/DG;EACC,kBAAA;ACw/DJ;;ADz/DG;EACC,kBAAA;AC4/DJ;;AD7/DG;EACC,mBAAA;ACggEJ;;ADvhEG;EACC,mBAAA;AC0hEJ;;AD3hEG;EACC,mBAAA;AC8hEJ;;AD/hEG;EACC,mBAAA;ACkiEJ;;ADniEG;EACC,mBAAA;ACsiEJ;;ADviEG;EACC,mBAAA;AC0iEJ;;AD3iEG;EACC,mBAAA;AC8iEJ;;AD/iEG;EACC,mBAAA;ACkjEJ;;ADnjEG;EACC,mBAAA;ACsjEJ;;ADvjEG;EACC,mBAAA;AC0jEJ;;AD3jEG;EACC,mBAAA;AC8jEJ;;AD/jEG;EACC,oBAAA;ACkkEJ;;ADnkEG;EACC,oBAAA;ACskEJ;;ADvkEG;EACC,oBAAA;AC0kEJ;;AD3kEG;EACC,oBAAA;AC8kEJ;;AD/kEG;EACC,oBAAA;ACklEJ;;ADnlEG;EACC,oBAAA;ACslEJ;;ADvlEG;EACC,oBAAA;AC0lEJ;;AD3lEG;EACC,oBAAA;AC8lEJ;;AD/lEG;EACC,oBAAA;ACkmEJ;;ADnmEG;EACC,oBAAA;ACsmEJ;;ADvmEG;EACC,oBAAA;AC0mEJ;;AD3mEG;EACC,oBAAA;AC8mEJ;;AD/mEG;EACC,oBAAA;ACknEJ;;ADnnEG;EACC,oBAAA;ACsnEJ;;ADvnEG;EACC,oBAAA;AC0nEJ;;AD3nEG;EACC,oBAAA;AC8nEJ;;ADzmEG;EACC,mBAAA;AC4mEJ;;AD7mEG;EACC,mBAAA;ACgnEJ;;ADjnEG;EACC,oBAAA;AConEJ;;ADrnEG;EACC,oBAAA;ACwnEJ;;ADznEG;EACC,oBAAA;AC4nEJ;;AD7nEG;EACC,oBAAA;ACgoEJ;;ADjoEG;EACC,oBAAA;ACooEJ;;ADroEG;EACC,oBAAA;ACwoEJ;;ADzoEG;EACC,oBAAA;AC4oEJ;;AD7oEG;EACC,oBAAA;ACgpEJ;;ADjpEG;EACC,oBAAA;ACopEJ;;ADrpEG;EACC,oBAAA;ACwpEJ;;ADzpEG;EACC,oBAAA;AC4pEJ;;AD7pEG;EACC,oBAAA;ACgqEJ;;ADjqEG;EACC,oBAAA;ACoqEJ;;ADrqEG;EACC,oBAAA;ACwqEJ;;ADzqEG;EACC,oBAAA;AC4qEJ;;AD7qEG;EACC,oBAAA;ACgrEJ;;ADjrEG;EACC,oBAAA;ACorEJ;;ADrrEG;EACC,oBAAA;ACwrEJ;;ADzrEG;EACC,oBAAA;AC4rEJ;;AD7rEG;EACC,oBAAA;ACgsEJ;;ADjsEG;EACC,oBAAA;ACosEJ;;ADrsEG;EACC,oBAAA;ACwsEJ;;ADzsEG;EACC,qBAAA;AC4sEJ;;ADnuEG;EACC,oBAAA;ACsuEJ;;ADvuEG;EACC,oBAAA;AC0uEJ;;AD3uEG;EACC,oBAAA;AC8uEJ;;AD/uEG;EACC,oBAAA;ACkvEJ;;ADnvEG;EACC,oBAAA;ACsvEJ;;ADvvEG;EACC,oBAAA;AC0vEJ;;AD3vEG;EACC,oBAAA;AC8vEJ;;AD/vEG;EACC,oBAAA;ACkwEJ;;ADnwEG;EACC,oBAAA;ACswEJ;;ADvwEG;EACC,oBAAA;AC0wEJ;;AD3wEG;EACC,qBAAA;AC8wEJ;;AD/wEG;EACC,qBAAA;ACkxEJ;;ADnxEG;EACC,qBAAA;ACsxEJ;;ADvxEG;EACC,qBAAA;AC0xEJ;;AD3xEG;EACC,qBAAA;AC8xEJ;;AD/xEG;EACC,qBAAA;ACkyEJ;;ADnyEG;EACC,qBAAA;ACsyEJ;;ADvyEG;EACC,qBAAA;AC0yEJ;;AD3yEG;EACC,qBAAA;AC8yEJ;;AD/yEG;EACC,qBAAA;ACkzEJ;;ADnzEG;EACC,qBAAA;ACszEJ;;ADvzEG;EACC,qBAAA;AC0zEJ;;AD3zEG;EACC,qBAAA;AC8zEJ;;AD/zEG;EACC,qBAAA;ACk0EJ;;ADn0EG;EACC,qBAAA;ACs0EJ;;ADv0EG;EACC,qBAAA;AC00EJ;;ADrzEG;EACC,oBAAA;ACwzEJ;;ADzzEG;EACC,oBAAA;AC4zEJ;;AD7zEG;EACC,qBAAA;ACg0EJ;;ADj0EG;EACC,qBAAA;ACo0EJ;;ADr0EG;EACC,qBAAA;ACw0EJ;;ADz0EG;EACC,qBAAA;AC40EJ;;AD70EG;EACC,qBAAA;ACg1EJ;;ADj1EG;EACC,qBAAA;ACo1EJ;;ADr1EG;EACC,qBAAA;ACw1EJ;;ADz1EG;EACC,qBAAA;AC41EJ;;AD71EG;EACC,qBAAA;ACg2EJ;;ADj2EG;EACC,qBAAA;ACo2EJ;;ADr2EG;EACC,qBAAA;ACw2EJ;;ADz2EG;EACC,qBAAA;AC42EJ;;AD72EG;EACC,qBAAA;ACg3EJ;;ADj3EG;EACC,qBAAA;ACo3EJ;;ADr3EG;EACC,qBAAA;ACw3EJ;;ADz3EG;EACC,qBAAA;AC43EJ;;AD73EG;EACC,qBAAA;ACg4EJ;;ADj4EG;EACC,qBAAA;ACo4EJ;;ADr4EG;EACC,qBAAA;ACw4EJ;;ADz4EG;EACC,qBAAA;AC44EJ;;AD74EG;EACC,qBAAA;ACg5EJ;;ADj5EG;EACC,qBAAA;ACo5EJ;;ADr5EG;EACC,sBAAA;ACw5EJ;;AD/6EG;EACC,kBAAA;ACk7EJ;;ADn7EG;EACC,kBAAA;ACs7EJ;;ADv7EG;EACC,kBAAA;AC07EJ;;AD37EG;EACC,kBAAA;AC87EJ;;AD/7EG;EACC,kBAAA;ACk8EJ;;ADn8EG;EACC,kBAAA;ACs8EJ;;ADv8EG;EACC,kBAAA;AC08EJ;;AD38EG;EACC,kBAAA;AC88EJ;;AD/8EG;EACC,kBAAA;ACk9EJ;;ADn9EG;EACC,kBAAA;ACs9EJ;;ADv9EG;EACC,mBAAA;AC09EJ;;AD39EG;EACC,mBAAA;AC89EJ;;AD/9EG;EACC,mBAAA;ACk+EJ;;ADn+EG;EACC,mBAAA;ACs+EJ;;ADv+EG;EACC,mBAAA;AC0+EJ;;AD3+EG;EACC,mBAAA;AC8+EJ;;AD/+EG;EACC,mBAAA;ACk/EJ;;ADn/EG;EACC,mBAAA;ACs/EJ;;ADv/EG;EACC,mBAAA;AC0/EJ;;AD3/EG;EACC,mBAAA;AC8/EJ;;AD//EG;EACC,mBAAA;ACkgFJ;;ADngFG;EACC,mBAAA;ACsgFJ;;ADvgFG;EACC,mBAAA;AC0gFJ;;AD3gFG;EACC,mBAAA;AC8gFJ;;AD/gFG;EACC,mBAAA;ACkhFJ;;ADnhFG;EACC,mBAAA;ACshFJ;;ADjgFG;EACC,kBAAA;ACogFJ;;ADrgFG;EACC,kBAAA;ACwgFJ;;ADzgFG;EACC,mBAAA;AC4gFJ;;AD7gFG;EACC,mBAAA;ACghFJ;;ADjhFG;EACC,mBAAA;ACohFJ;;ADrhFG;EACC,mBAAA;ACwhFJ;;ADzhFG;EACC,mBAAA;AC4hFJ;;AD7hFG;EACC,mBAAA;ACgiFJ;;ADjiFG;EACC,mBAAA;ACoiFJ;;ADriFG;EACC,mBAAA;ACwiFJ;;ADziFG;EACC,mBAAA;AC4iFJ;;AD7iFG;EACC,mBAAA;ACgjFJ;;ADjjFG;EACC,mBAAA;ACojFJ;;ADrjFG;EACC,mBAAA;ACwjFJ;;ADzjFG;EACC,mBAAA;AC4jFJ;;AD7jFG;EACC,mBAAA;ACgkFJ;;ADjkFG;EACC,mBAAA;ACokFJ;;ADrkFG;EACC,mBAAA;ACwkFJ;;ADzkFG;EACC,mBAAA;AC4kFJ;;AD7kFG;EACC,mBAAA;ACglFJ;;ADjlFG;EACC,mBAAA;AColFJ;;ADrlFG;EACC,mBAAA;ACwlFJ;;ADzlFG;EACC,mBAAA;AC4lFJ;;AD7lFG;EACC,mBAAA;ACgmFJ;;ADjmFG;EACC,oBAAA;AComFJ;;ADrnFG;EACC,kBAAA;EACA,mBAAA;ACwnFJ;;AD1nFG;EACC,kBAAA;EACA,mBAAA;AC6nFJ;;AD/nFG;EACC,kBAAA;EACA,mBAAA;ACkoFJ;;ADpoFG;EACC,kBAAA;EACA,mBAAA;ACuoFJ;;ADzoFG;EACC,kBAAA;EACA,mBAAA;AC4oFJ;;AD9oFG;EACC,kBAAA;EACA,mBAAA;ACipFJ;;ADnpFG;EACC,kBAAA;EACA,mBAAA;ACspFJ;;ADxpFG;EACC,kBAAA;EACA,mBAAA;AC2pFJ;;AD7pFG;EACC,kBAAA;EACA,mBAAA;ACgqFJ;;ADlqFG;EACC,kBAAA;EACA,mBAAA;ACqqFJ;;ADvqFG;EACC,mBAAA;EACA,oBAAA;AC0qFJ;;AD5qFG;EACC,mBAAA;EACA,oBAAA;AC+qFJ;;ADjrFG;EACC,mBAAA;EACA,oBAAA;ACorFJ;;ADtrFG;EACC,mBAAA;EACA,oBAAA;ACyrFJ;;AD3rFG;EACC,mBAAA;EACA,oBAAA;AC8rFJ;;ADhsFG;EACC,mBAAA;EACA,oBAAA;ACmsFJ;;ADrsFG;EACC,mBAAA;EACA,oBAAA;ACwsFJ;;AD1sFG;EACC,mBAAA;EACA,oBAAA;AC6sFJ;;AD/sFG;EACC,mBAAA;EACA,oBAAA;ACktFJ;;ADptFG;EACC,mBAAA;EACA,oBAAA;ACutFJ;;ADztFG;EACC,mBAAA;EACA,oBAAA;AC4tFJ;;AD9tFG;EACC,mBAAA;EACA,oBAAA;ACiuFJ;;ADnuFG;EACC,mBAAA;EACA,oBAAA;ACsuFJ;;ADxuFG;EACC,mBAAA;EACA,oBAAA;AC2uFJ;;AD7uFG;EACC,mBAAA;EACA,oBAAA;ACgvFJ;;ADlvFG;EACC,mBAAA;EACA,oBAAA;ACqvFJ;;ADjuFG;EACC,kBAAA;EACA,mBAAA;ACouFJ;;ADtuFG;EACC,kBAAA;EACA,mBAAA;ACyuFJ;;AD3uFG;EACC,mBAAA;EACA,oBAAA;AC8uFJ;;ADhvFG;EACC,mBAAA;EACA,oBAAA;ACmvFJ;;ADrvFG;EACC,mBAAA;EACA,oBAAA;ACwvFJ;;AD1vFG;EACC,mBAAA;EACA,oBAAA;AC6vFJ;;AD/vFG;EACC,mBAAA;EACA,oBAAA;ACkwFJ;;ADpwFG;EACC,mBAAA;EACA,oBAAA;ACuwFJ;;ADzwFG;EACC,mBAAA;EACA,oBAAA;AC4wFJ;;AD9wFG;EACC,mBAAA;EACA,oBAAA;ACixFJ;;ADnxFG;EACC,mBAAA;EACA,oBAAA;ACsxFJ;;ADxxFG;EACC,mBAAA;EACA,oBAAA;AC2xFJ;;AD7xFG;EACC,mBAAA;EACA,oBAAA;ACgyFJ;;ADlyFG;EACC,mBAAA;EACA,oBAAA;ACqyFJ;;ADvyFG;EACC,mBAAA;EACA,oBAAA;AC0yFJ;;AD5yFG;EACC,mBAAA;EACA,oBAAA;AC+yFJ;;ADjzFG;EACC,mBAAA;EACA,oBAAA;ACozFJ;;ADtzFG;EACC,mBAAA;EACA,oBAAA;ACyzFJ;;AD3zFG;EACC,mBAAA;EACA,oBAAA;AC8zFJ;;ADh0FG;EACC,mBAAA;EACA,oBAAA;ACm0FJ;;ADr0FG;EACC,mBAAA;EACA,oBAAA;ACw0FJ;;AD10FG;EACC,mBAAA;EACA,oBAAA;AC60FJ;;AD/0FG;EACC,mBAAA;EACA,oBAAA;ACk1FJ;;ADp1FG;EACC,mBAAA;EACA,oBAAA;ACu1FJ;;ADz1FG;EACC,oBAAA;EACA,qBAAA;AC41FJ;;AD72FG;EACC,iBAAA;EACA,oBAAA;ACg3FJ;;ADl3FG;EACC,iBAAA;EACA,oBAAA;ACq3FJ;;ADv3FG;EACC,iBAAA;EACA,oBAAA;AC03FJ;;AD53FG;EACC,iBAAA;EACA,oBAAA;AC+3FJ;;ADj4FG;EACC,iBAAA;EACA,oBAAA;ACo4FJ;;ADt4FG;EACC,iBAAA;EACA,oBAAA;ACy4FJ;;AD34FG;EACC,iBAAA;EACA,oBAAA;AC84FJ;;ADh5FG;EACC,iBAAA;EACA,oBAAA;ACm5FJ;;ADr5FG;EACC,iBAAA;EACA,oBAAA;ACw5FJ;;AD15FG;EACC,iBAAA;EACA,oBAAA;AC65FJ;;AD/5FG;EACC,kBAAA;EACA,qBAAA;ACk6FJ;;ADp6FG;EACC,kBAAA;EACA,qBAAA;ACu6FJ;;ADz6FG;EACC,kBAAA;EACA,qBAAA;AC46FJ;;AD96FG;EACC,kBAAA;EACA,qBAAA;ACi7FJ;;ADn7FG;EACC,kBAAA;EACA,qBAAA;ACs7FJ;;ADx7FG;EACC,kBAAA;EACA,qBAAA;AC27FJ;;AD77FG;EACC,kBAAA;EACA,qBAAA;ACg8FJ;;ADl8FG;EACC,kBAAA;EACA,qBAAA;ACq8FJ;;ADv8FG;EACC,kBAAA;EACA,qBAAA;AC08FJ;;AD58FG;EACC,kBAAA;EACA,qBAAA;AC+8FJ;;ADj9FG;EACC,kBAAA;EACA,qBAAA;ACo9FJ;;ADt9FG;EACC,kBAAA;EACA,qBAAA;ACy9FJ;;AD39FG;EACC,kBAAA;EACA,qBAAA;AC89FJ;;ADh+FG;EACC,kBAAA;EACA,qBAAA;ACm+FJ;;ADr+FG;EACC,kBAAA;EACA,qBAAA;ACw+FJ;;AD1+FG;EACC,kBAAA;EACA,qBAAA;AC6+FJ;;ADz9FG;EACC,iBAAA;EACA,oBAAA;AC49FJ;;AD99FG;EACC,iBAAA;EACA,oBAAA;ACi+FJ;;ADn+FG;EACC,kBAAA;EACA,qBAAA;ACs+FJ;;ADx+FG;EACC,kBAAA;EACA,qBAAA;AC2+FJ;;AD7+FG;EACC,kBAAA;EACA,qBAAA;ACg/FJ;;ADl/FG;EACC,kBAAA;EACA,qBAAA;ACq/FJ;;ADv/FG;EACC,kBAAA;EACA,qBAAA;AC0/FJ;;AD5/FG;EACC,kBAAA;EACA,qBAAA;AC+/FJ;;ADjgGG;EACC,kBAAA;EACA,qBAAA;ACogGJ;;ADtgGG;EACC,kBAAA;EACA,qBAAA;ACygGJ;;AD3gGG;EACC,kBAAA;EACA,qBAAA;AC8gGJ;;ADhhGG;EACC,kBAAA;EACA,qBAAA;ACmhGJ;;ADrhGG;EACC,kBAAA;EACA,qBAAA;ACwhGJ;;AD1hGG;EACC,kBAAA;EACA,qBAAA;AC6hGJ;;AD/hGG;EACC,kBAAA;EACA,qBAAA;ACkiGJ;;ADpiGG;EACC,kBAAA;EACA,qBAAA;ACuiGJ;;ADziGG;EACC,kBAAA;EACA,qBAAA;AC4iGJ;;AD9iGG;EACC,kBAAA;EACA,qBAAA;ACijGJ;;ADnjGG;EACC,kBAAA;EACA,qBAAA;ACsjGJ;;ADxjGG;EACC,kBAAA;EACA,qBAAA;AC2jGJ;;AD7jGG;EACC,kBAAA;EACA,qBAAA;ACgkGJ;;ADlkGG;EACC,kBAAA;EACA,qBAAA;ACqkGJ;;ADvkGG;EACC,kBAAA;EACA,qBAAA;AC0kGJ;;AD5kGG;EACC,kBAAA;EACA,qBAAA;AC+kGJ;;ADjlGG;EACC,mBAAA;EACA,sBAAA;AColGJ;;ADzkGG;EACC,YAAA;AC4kGJ;;AD7kGG;EACC,YAAA;ACglGJ;;ADjlGG;EACC,YAAA;AColGJ;;ADrlGG;EACC,YAAA;ACwlGJ;;ADzlGG;EACC,YAAA;AC4lGJ;;AD7lGG;EACC,YAAA;ACgmGJ;;ADjmGG;EACC,YAAA;AComGJ;;ADrmGG;EACC,YAAA;ACwmGJ;;ADzmGG;EACC,YAAA;AC4mGJ;;AD7mGG;EACC,YAAA;ACgnGJ;;ADjnGG;EACC,aAAA;AConGJ;;ADrnGG;EACC,aAAA;ACwnGJ;;ADznGG;EACC,aAAA;AC4nGJ;;AD7nGG;EACC,aAAA;ACgoGJ;;ADjoGG;EACC,aAAA;ACooGJ;;ADroGG;EACC,aAAA;ACwoGJ;;ADzoGG;EACC,aAAA;AC4oGJ;;AD7oGG;EACC,aAAA;ACgpGJ;;ADjpGG;EACC,aAAA;ACopGJ;;ADrpGG;EACC,aAAA;ACwpGJ;;ADzpGG;EACC,aAAA;AC4pGJ;;AD7pGG;EACC,aAAA;ACgqGJ;;ADjqGG;EACC,aAAA;ACoqGJ;;ADrqGG;EACC,aAAA;ACwqGJ;;ADzqGG;EACC,aAAA;AC4qGJ;;AD7qGG;EACC,aAAA;ACgrGJ;;ADrpGG;EACC,YAAA;ACwpGJ;;ADzpGG;EACC,YAAA;AC4pGJ;;AD7pGG;EACC,aAAA;ACgqGJ;;ADjqGG;EACC,aAAA;ACoqGJ;;ADrqGG;EACC,aAAA;ACwqGJ;;ADzqGG;EACC,aAAA;AC4qGJ;;AD7qGG;EACC,aAAA;ACgrGJ;;ADjrGG;EACC,aAAA;ACorGJ;;ADrrGG;EACC,aAAA;ACwrGJ;;ADzrGG;EACC,aAAA;AC4rGJ;;AD7rGG;EACC,aAAA;ACgsGJ;;ADjsGG;EACC,aAAA;ACosGJ;;ADrsGG;EACC,aAAA;ACwsGJ;;ADzsGG;EACC,aAAA;AC4sGJ;;AD7sGG;EACC,aAAA;ACgtGJ;;ADjtGG;EACC,aAAA;ACotGJ;;ADrtGG;EACC,aAAA;ACwtGJ;;ADztGG;EACC,aAAA;AC4tGJ;;AD7tGG;EACC,aAAA;ACguGJ;;ADjuGG;EACC,aAAA;ACouGJ;;ADruGG;EACC,aAAA;ACwuGJ;;ADzuGG;EACC,aAAA;AC4uGJ;;AD7uGG;EACC,aAAA;ACgvGJ;;ADjvGG;EACC,aAAA;ACovGJ;;ADrvGG;EACC,cAAA;ACwvGJ;;ADrxGG;EACC,gBAAA;ACwxGJ;;ADpxGI;EACC,iBAAA;ACuxGL;;AD7xGG;EACC,gBAAA;ACgyGJ;;AD5xGI;EACC,iBAAA;AC+xGL;;ADryGG;EACC,gBAAA;ACwyGJ;;ADpyGI;EACC,iBAAA;ACuyGL;;AD7yGG;EACC,gBAAA;ACgzGJ;;AD5yGI;EACC,iBAAA;AC+yGL;;ADrzGG;EACC,gBAAA;ACwzGJ;;ADpzGI;EACC,iBAAA;ACuzGL;;AD7zGG;EACC,gBAAA;ACg0GJ;;AD5zGI;EACC,iBAAA;AC+zGL;;ADr0GG;EACC,gBAAA;ACw0GJ;;ADp0GI;EACC,iBAAA;ACu0GL;;AD70GG;EACC,gBAAA;ACg1GJ;;AD50GI;EACC,iBAAA;AC+0GL;;ADr1GG;EACC,gBAAA;ACw1GJ;;ADp1GI;EACC,iBAAA;ACu1GL;;AD71GG;EACC,gBAAA;ACg2GJ;;AD51GI;EACC,iBAAA;AC+1GL;;ADr2GG;EACC,iBAAA;ACw2GJ;;ADp2GI;EACC,kBAAA;ACu2GL;;AD72GG;EACC,iBAAA;ACg3GJ;;AD52GI;EACC,kBAAA;AC+2GL;;ADr3GG;EACC,iBAAA;ACw3GJ;;ADp3GI;EACC,kBAAA;ACu3GL;;AD73GG;EACC,iBAAA;ACg4GJ;;AD53GI;EACC,kBAAA;AC+3GL;;ADr4GG;EACC,iBAAA;ACw4GJ;;ADp4GI;EACC,kBAAA;ACu4GL;;AD74GG;EACC,iBAAA;ACg5GJ;;AD54GI;EACC,kBAAA;AC+4GL;;ADr5GG;EACC,iBAAA;ACw5GJ;;ADp5GI;EACC,kBAAA;ACu5GL;;AD75GG;EACC,iBAAA;ACg6GJ;;AD55GI;EACC,kBAAA;AC+5GL;;ADr6GG;EACC,iBAAA;ACw6GJ;;ADp6GI;EACC,kBAAA;ACu6GL;;AD76GG;EACC,iBAAA;ACg7GJ;;AD56GI;EACC,kBAAA;AC+6GL;;ADr7GG;EACC,iBAAA;ACw7GJ;;ADp7GI;EACC,kBAAA;ACu7GL;;AD77GG;EACC,iBAAA;ACg8GJ;;AD57GI;EACC,kBAAA;AC+7GL;;ADr8GG;EACC,iBAAA;ACw8GJ;;ADp8GI;EACC,kBAAA;ACu8GL;;AD78GG;EACC,iBAAA;ACg9GJ;;AD58GI;EACC,kBAAA;AC+8GL;;ADr9GG;EACC,iBAAA;ACw9GJ;;ADp9GI;EACC,kBAAA;ACu9GL;;AD79GG;EACC,iBAAA;ACg+GJ;;AD59GI;EACC,kBAAA;AC+9GL;;ADz8GG;EACC,gBAAA;AC48GJ;;ADx8GI;EACC,iBAAA;AC28GL;;ADj9GG;EACC,gBAAA;ACo9GJ;;ADh9GI;EACC,iBAAA;ACm9GL;;ADz9GG;EACC,iBAAA;AC49GJ;;ADx9GI;EACC,kBAAA;AC29GL;;ADj+GG;EACC,iBAAA;ACo+GJ;;ADh+GI;EACC,kBAAA;ACm+GL;;ADz+GG;EACC,iBAAA;AC4+GJ;;ADx+GI;EACC,kBAAA;AC2+GL;;ADj/GG;EACC,iBAAA;ACo/GJ;;ADh/GI;EACC,kBAAA;ACm/GL;;ADz/GG;EACC,iBAAA;AC4/GJ;;ADx/GI;EACC,kBAAA;AC2/GL;;ADjgHG;EACC,iBAAA;ACogHJ;;ADhgHI;EACC,kBAAA;ACmgHL;;ADzgHG;EACC,iBAAA;AC4gHJ;;ADxgHI;EACC,kBAAA;AC2gHL;;ADjhHG;EACC,iBAAA;ACohHJ;;ADhhHI;EACC,kBAAA;ACmhHL;;ADzhHG;EACC,iBAAA;AC4hHJ;;ADxhHI;EACC,kBAAA;AC2hHL;;ADjiHG;EACC,iBAAA;ACoiHJ;;ADhiHI;EACC,kBAAA;ACmiHL;;ADziHG;EACC,iBAAA;AC4iHJ;;ADxiHI;EACC,kBAAA;AC2iHL;;ADjjHG;EACC,iBAAA;ACojHJ;;ADhjHI;EACC,kBAAA;ACmjHL;;ADzjHG;EACC,iBAAA;AC4jHJ;;ADxjHI;EACC,kBAAA;AC2jHL;;ADjkHG;EACC,iBAAA;ACokHJ;;ADhkHI;EACC,kBAAA;ACmkHL;;ADzkHG;EACC,iBAAA;AC4kHJ;;ADxkHI;EACC,kBAAA;AC2kHL;;ADjlHG;EACC,iBAAA;AColHJ;;ADhlHI;EACC,kBAAA;ACmlHL;;ADzlHG;EACC,iBAAA;AC4lHJ;;ADxlHI;EACC,kBAAA;AC2lHL;;ADjmHG;EACC,iBAAA;AComHJ;;ADhmHI;EACC,kBAAA;ACmmHL;;ADzmHG;EACC,iBAAA;AC4mHJ;;ADxmHI;EACC,kBAAA;AC2mHL;;ADjnHG;EACC,iBAAA;AConHJ;;ADhnHI;EACC,kBAAA;ACmnHL;;ADznHG;EACC,iBAAA;AC4nHJ;;ADxnHI;EACC,kBAAA;AC2nHL;;ADjoHG;EACC,iBAAA;ACooHJ;;ADhoHI;EACC,kBAAA;ACmoHL;;ADzoHG;EACC,kBAAA;AC4oHJ;;ADxoHI;EACC,mBAAA;AC2oHL;;AD7qHG;EACC,kBAAA;ACgrHJ;;AD5qHI;EACC,mBAAA;AC+qHL;;ADrrHG;EACC,kBAAA;ACwrHJ;;ADprHI;EACC,mBAAA;ACurHL;;AD7rHG;EACC,kBAAA;ACgsHJ;;AD5rHI;EACC,mBAAA;AC+rHL;;ADrsHG;EACC,kBAAA;ACwsHJ;;ADpsHI;EACC,mBAAA;ACusHL;;AD7sHG;EACC,kBAAA;ACgtHJ;;AD5sHI;EACC,mBAAA;AC+sHL;;ADrtHG;EACC,kBAAA;ACwtHJ;;ADptHI;EACC,mBAAA;ACutHL;;AD7tHG;EACC,kBAAA;ACguHJ;;AD5tHI;EACC,mBAAA;AC+tHL;;ADruHG;EACC,kBAAA;ACwuHJ;;ADpuHI;EACC,mBAAA;ACuuHL;;AD7uHG;EACC,kBAAA;ACgvHJ;;AD5uHI;EACC,mBAAA;AC+uHL;;ADrvHG;EACC,kBAAA;ACwvHJ;;ADpvHI;EACC,mBAAA;ACuvHL;;AD7vHG;EACC,mBAAA;ACgwHJ;;AD5vHI;EACC,oBAAA;AC+vHL;;ADrwHG;EACC,mBAAA;ACwwHJ;;ADpwHI;EACC,oBAAA;ACuwHL;;AD7wHG;EACC,mBAAA;ACgxHJ;;AD5wHI;EACC,oBAAA;AC+wHL;;ADrxHG;EACC,mBAAA;ACwxHJ;;ADpxHI;EACC,oBAAA;ACuxHL;;AD7xHG;EACC,mBAAA;ACgyHJ;;AD5xHI;EACC,oBAAA;AC+xHL;;ADryHG;EACC,mBAAA;ACwyHJ;;ADpyHI;EACC,oBAAA;ACuyHL;;AD7yHG;EACC,mBAAA;ACgzHJ;;AD5yHI;EACC,oBAAA;AC+yHL;;ADrzHG;EACC,mBAAA;ACwzHJ;;ADpzHI;EACC,oBAAA;ACuzHL;;AD7zHG;EACC,mBAAA;ACg0HJ;;AD5zHI;EACC,oBAAA;AC+zHL;;ADr0HG;EACC,mBAAA;ACw0HJ;;ADp0HI;EACC,oBAAA;ACu0HL;;AD70HG;EACC,mBAAA;ACg1HJ;;AD50HI;EACC,oBAAA;AC+0HL;;ADr1HG;EACC,mBAAA;ACw1HJ;;ADp1HI;EACC,oBAAA;ACu1HL;;AD71HG;EACC,mBAAA;ACg2HJ;;AD51HI;EACC,oBAAA;AC+1HL;;ADr2HG;EACC,mBAAA;ACw2HJ;;ADp2HI;EACC,oBAAA;ACu2HL;;AD72HG;EACC,mBAAA;ACg3HJ;;AD52HI;EACC,oBAAA;AC+2HL;;ADr3HG;EACC,mBAAA;ACw3HJ;;ADp3HI;EACC,oBAAA;ACu3HL;;ADj2HG;EACC,kBAAA;ACo2HJ;;ADh2HI;EACC,mBAAA;ACm2HL;;ADz2HG;EACC,kBAAA;AC42HJ;;ADx2HI;EACC,mBAAA;AC22HL;;ADj3HG;EACC,mBAAA;ACo3HJ;;ADh3HI;EACC,oBAAA;ACm3HL;;ADz3HG;EACC,mBAAA;AC43HJ;;ADx3HI;EACC,oBAAA;AC23HL;;ADj4HG;EACC,mBAAA;ACo4HJ;;ADh4HI;EACC,oBAAA;ACm4HL;;ADz4HG;EACC,mBAAA;AC44HJ;;ADx4HI;EACC,oBAAA;AC24HL;;ADj5HG;EACC,mBAAA;ACo5HJ;;ADh5HI;EACC,oBAAA;ACm5HL;;ADz5HG;EACC,mBAAA;AC45HJ;;ADx5HI;EACC,oBAAA;AC25HL;;ADj6HG;EACC,mBAAA;ACo6HJ;;ADh6HI;EACC,oBAAA;ACm6HL;;ADz6HG;EACC,mBAAA;AC46HJ;;ADx6HI;EACC,oBAAA;AC26HL;;ADj7HG;EACC,mBAAA;ACo7HJ;;ADh7HI;EACC,oBAAA;ACm7HL;;ADz7HG;EACC,mBAAA;AC47HJ;;ADx7HI;EACC,oBAAA;AC27HL;;ADj8HG;EACC,mBAAA;ACo8HJ;;ADh8HI;EACC,oBAAA;ACm8HL;;ADz8HG;EACC,mBAAA;AC48HJ;;ADx8HI;EACC,oBAAA;AC28HL;;ADj9HG;EACC,mBAAA;ACo9HJ;;ADh9HI;EACC,oBAAA;ACm9HL;;ADz9HG;EACC,mBAAA;AC49HJ;;ADx9HI;EACC,oBAAA;AC29HL;;ADj+HG;EACC,mBAAA;ACo+HJ;;ADh+HI;EACC,oBAAA;ACm+HL;;ADz+HG;EACC,mBAAA;AC4+HJ;;ADx+HI;EACC,oBAAA;AC2+HL;;ADj/HG;EACC,mBAAA;ACo/HJ;;ADh/HI;EACC,oBAAA;ACm/HL;;ADz/HG;EACC,mBAAA;AC4/HJ;;ADx/HI;EACC,oBAAA;AC2/HL;;ADjgIG;EACC,mBAAA;ACogIJ;;ADhgII;EACC,oBAAA;ACmgIL;;ADzgIG;EACC,mBAAA;AC4gIJ;;ADxgII;EACC,oBAAA;AC2gIL;;ADjhIG;EACC,mBAAA;ACohIJ;;ADhhII;EACC,oBAAA;ACmhIL;;ADzhIG;EACC,mBAAA;AC4hIJ;;ADxhII;EACC,oBAAA;AC2hIL;;ADjiIG;EACC,oBAAA;ACoiIJ;;ADhiII;EACC,qBAAA;ACmiIL;;ADrkIG;EACC,mBAAA;ACwkIJ;;ADpkII;EACC,oBAAA;ACukIL;;AD7kIG;EACC,mBAAA;ACglIJ;;AD5kII;EACC,oBAAA;AC+kIL;;ADrlIG;EACC,mBAAA;ACwlIJ;;ADplII;EACC,oBAAA;ACulIL;;AD7lIG;EACC,mBAAA;ACgmIJ;;AD5lII;EACC,oBAAA;AC+lIL;;ADrmIG;EACC,mBAAA;ACwmIJ;;ADpmII;EACC,oBAAA;ACumIL;;AD7mIG;EACC,mBAAA;ACgnIJ;;AD5mII;EACC,oBAAA;AC+mIL;;ADrnIG;EACC,mBAAA;ACwnIJ;;ADpnII;EACC,oBAAA;ACunIL;;AD7nIG;EACC,mBAAA;ACgoIJ;;AD5nII;EACC,oBAAA;AC+nIL;;ADroIG;EACC,mBAAA;ACwoIJ;;ADpoII;EACC,oBAAA;ACuoIL;;AD7oIG;EACC,mBAAA;ACgpIJ;;AD5oII;EACC,oBAAA;AC+oIL;;ADrpIG;EACC,oBAAA;ACwpIJ;;ADppII;EACC,qBAAA;ACupIL;;AD7pIG;EACC,oBAAA;ACgqIJ;;AD5pII;EACC,qBAAA;AC+pIL;;ADrqIG;EACC,oBAAA;ACwqIJ;;ADpqII;EACC,qBAAA;ACuqIL;;AD7qIG;EACC,oBAAA;ACgrIJ;;AD5qII;EACC,qBAAA;AC+qIL;;ADrrIG;EACC,oBAAA;ACwrIJ;;ADprII;EACC,qBAAA;ACurIL;;AD7rIG;EACC,oBAAA;ACgsIJ;;AD5rII;EACC,qBAAA;AC+rIL;;ADrsIG;EACC,oBAAA;ACwsIJ;;ADpsII;EACC,qBAAA;ACusIL;;AD7sIG;EACC,oBAAA;ACgtIJ;;AD5sII;EACC,qBAAA;AC+sIL;;ADrtIG;EACC,oBAAA;ACwtIJ;;ADptII;EACC,qBAAA;ACutIL;;AD7tIG;EACC,oBAAA;ACguIJ;;AD5tII;EACC,qBAAA;AC+tIL;;ADruIG;EACC,oBAAA;ACwuIJ;;ADpuII;EACC,qBAAA;ACuuIL;;AD7uIG;EACC,oBAAA;ACgvIJ;;AD5uII;EACC,qBAAA;AC+uIL;;ADrvIG;EACC,oBAAA;ACwvIJ;;ADpvII;EACC,qBAAA;ACuvIL;;AD7vIG;EACC,oBAAA;ACgwIJ;;AD5vII;EACC,qBAAA;AC+vIL;;ADrwIG;EACC,oBAAA;ACwwIJ;;ADpwII;EACC,qBAAA;ACuwIL;;AD7wIG;EACC,oBAAA;ACgxIJ;;AD5wII;EACC,qBAAA;AC+wIL;;ADzvIG;EACC,mBAAA;AC4vIJ;;ADxvII;EACC,oBAAA;AC2vIL;;ADjwIG;EACC,mBAAA;ACowIJ;;ADhwII;EACC,oBAAA;ACmwIL;;ADzwIG;EACC,oBAAA;AC4wIJ;;ADxwII;EACC,qBAAA;AC2wIL;;ADjxIG;EACC,oBAAA;ACoxIJ;;ADhxII;EACC,qBAAA;ACmxIL;;ADzxIG;EACC,oBAAA;AC4xIJ;;ADxxII;EACC,qBAAA;AC2xIL;;ADjyIG;EACC,oBAAA;ACoyIJ;;ADhyII;EACC,qBAAA;ACmyIL;;ADzyIG;EACC,oBAAA;AC4yIJ;;ADxyII;EACC,qBAAA;AC2yIL;;ADjzIG;EACC,oBAAA;ACozIJ;;ADhzII;EACC,qBAAA;ACmzIL;;ADzzIG;EACC,oBAAA;AC4zIJ;;ADxzII;EACC,qBAAA;AC2zIL;;ADj0IG;EACC,oBAAA;ACo0IJ;;ADh0II;EACC,qBAAA;ACm0IL;;ADz0IG;EACC,oBAAA;AC40IJ;;ADx0II;EACC,qBAAA;AC20IL;;ADj1IG;EACC,oBAAA;ACo1IJ;;ADh1II;EACC,qBAAA;ACm1IL;;ADz1IG;EACC,oBAAA;AC41IJ;;ADx1II;EACC,qBAAA;AC21IL;;ADj2IG;EACC,oBAAA;ACo2IJ;;ADh2II;EACC,qBAAA;ACm2IL;;ADz2IG;EACC,oBAAA;AC42IJ;;ADx2II;EACC,qBAAA;AC22IL;;ADj3IG;EACC,oBAAA;ACo3IJ;;ADh3II;EACC,qBAAA;ACm3IL;;ADz3IG;EACC,oBAAA;AC43IJ;;ADx3II;EACC,qBAAA;AC23IL;;ADj4IG;EACC,oBAAA;ACo4IJ;;ADh4II;EACC,qBAAA;ACm4IL;;ADz4IG;EACC,oBAAA;AC44IJ;;ADx4II;EACC,qBAAA;AC24IL;;ADj5IG;EACC,oBAAA;ACo5IJ;;ADh5II;EACC,qBAAA;ACm5IL;;ADz5IG;EACC,oBAAA;AC45IJ;;ADx5II;EACC,qBAAA;AC25IL;;ADj6IG;EACC,oBAAA;ACo6IJ;;ADh6II;EACC,qBAAA;ACm6IL;;ADz6IG;EACC,oBAAA;AC46IJ;;ADx6II;EACC,qBAAA;AC26IL;;ADj7IG;EACC,oBAAA;ACo7IJ;;ADh7II;EACC,qBAAA;ACm7IL;;ADz7IG;EACC,qBAAA;AC47IJ;;ADx7II;EACC,sBAAA;AC27IL;;AD79IG;EACC,iBAAA;ACg+IJ;;AD59II;EACC,kBAAA;AC+9IL;;ADr+IG;EACC,iBAAA;ACw+IJ;;ADp+II;EACC,kBAAA;ACu+IL;;AD7+IG;EACC,iBAAA;ACg/IJ;;AD5+II;EACC,kBAAA;AC++IL;;ADr/IG;EACC,iBAAA;ACw/IJ;;ADp/II;EACC,kBAAA;ACu/IL;;AD7/IG;EACC,iBAAA;ACggJJ;;AD5/II;EACC,kBAAA;AC+/IL;;ADrgJG;EACC,iBAAA;ACwgJJ;;ADpgJI;EACC,kBAAA;ACugJL;;AD7gJG;EACC,iBAAA;ACghJJ;;AD5gJI;EACC,kBAAA;AC+gJL;;ADrhJG;EACC,iBAAA;ACwhJJ;;ADphJI;EACC,kBAAA;ACuhJL;;AD7hJG;EACC,iBAAA;ACgiJJ;;AD5hJI;EACC,kBAAA;AC+hJL;;ADriJG;EACC,iBAAA;ACwiJJ;;ADpiJI;EACC,kBAAA;ACuiJL;;AD7iJG;EACC,kBAAA;ACgjJJ;;AD5iJI;EACC,mBAAA;AC+iJL;;ADrjJG;EACC,kBAAA;ACwjJJ;;ADpjJI;EACC,mBAAA;ACujJL;;AD7jJG;EACC,kBAAA;ACgkJJ;;AD5jJI;EACC,mBAAA;AC+jJL;;ADrkJG;EACC,kBAAA;ACwkJJ;;ADpkJI;EACC,mBAAA;ACukJL;;AD7kJG;EACC,kBAAA;ACglJJ;;AD5kJI;EACC,mBAAA;AC+kJL;;ADrlJG;EACC,kBAAA;ACwlJJ;;ADplJI;EACC,mBAAA;ACulJL;;AD7lJG;EACC,kBAAA;ACgmJJ;;AD5lJI;EACC,mBAAA;AC+lJL;;ADrmJG;EACC,kBAAA;ACwmJJ;;ADpmJI;EACC,mBAAA;ACumJL;;AD7mJG;EACC,kBAAA;ACgnJJ;;AD5mJI;EACC,mBAAA;AC+mJL;;ADrnJG;EACC,kBAAA;ACwnJJ;;ADpnJI;EACC,mBAAA;ACunJL;;AD7nJG;EACC,kBAAA;ACgoJJ;;AD5nJI;EACC,mBAAA;AC+nJL;;ADroJG;EACC,kBAAA;ACwoJJ;;ADpoJI;EACC,mBAAA;ACuoJL;;AD7oJG;EACC,kBAAA;ACgpJJ;;AD5oJI;EACC,mBAAA;AC+oJL;;ADrpJG;EACC,kBAAA;ACwpJJ;;ADppJI;EACC,mBAAA;ACupJL;;AD7pJG;EACC,kBAAA;ACgqJJ;;AD5pJI;EACC,mBAAA;AC+pJL;;ADrqJG;EACC,kBAAA;ACwqJJ;;ADpqJI;EACC,mBAAA;ACuqJL;;ADjpJG;EACC,iBAAA;ACopJJ;;ADhpJI;EACC,kBAAA;ACmpJL;;ADzpJG;EACC,iBAAA;AC4pJJ;;ADxpJI;EACC,kBAAA;AC2pJL;;ADjqJG;EACC,kBAAA;ACoqJJ;;ADhqJI;EACC,mBAAA;ACmqJL;;ADzqJG;EACC,kBAAA;AC4qJJ;;ADxqJI;EACC,mBAAA;AC2qJL;;ADjrJG;EACC,kBAAA;ACorJJ;;ADhrJI;EACC,mBAAA;ACmrJL;;ADzrJG;EACC,kBAAA;AC4rJJ;;ADxrJI;EACC,mBAAA;AC2rJL;;ADjsJG;EACC,kBAAA;ACosJJ;;ADhsJI;EACC,mBAAA;ACmsJL;;ADzsJG;EACC,kBAAA;AC4sJJ;;ADxsJI;EACC,mBAAA;AC2sJL;;ADjtJG;EACC,kBAAA;ACotJJ;;ADhtJI;EACC,mBAAA;ACmtJL;;ADztJG;EACC,kBAAA;AC4tJJ;;ADxtJI;EACC,mBAAA;AC2tJL;;ADjuJG;EACC,kBAAA;ACouJJ;;ADhuJI;EACC,mBAAA;ACmuJL;;ADzuJG;EACC,kBAAA;AC4uJJ;;ADxuJI;EACC,mBAAA;AC2uJL;;ADjvJG;EACC,kBAAA;ACovJJ;;ADhvJI;EACC,mBAAA;ACmvJL;;ADzvJG;EACC,kBAAA;AC4vJJ;;ADxvJI;EACC,mBAAA;AC2vJL;;ADjwJG;EACC,kBAAA;ACowJJ;;ADhwJI;EACC,mBAAA;ACmwJL;;ADzwJG;EACC,kBAAA;AC4wJJ;;ADxwJI;EACC,mBAAA;AC2wJL;;ADjxJG;EACC,kBAAA;ACoxJJ;;ADhxJI;EACC,mBAAA;ACmxJL;;ADzxJG;EACC,kBAAA;AC4xJJ;;ADxxJI;EACC,mBAAA;AC2xJL;;ADjyJG;EACC,kBAAA;ACoyJJ;;ADhyJI;EACC,mBAAA;ACmyJL;;ADzyJG;EACC,kBAAA;AC4yJJ;;ADxyJI;EACC,mBAAA;AC2yJL;;ADjzJG;EACC,kBAAA;ACozJJ;;ADhzJI;EACC,mBAAA;ACmzJL;;ADzzJG;EACC,kBAAA;AC4zJJ;;ADxzJI;EACC,mBAAA;AC2zJL;;ADj0JG;EACC,kBAAA;ACo0JJ;;ADh0JI;EACC,mBAAA;ACm0JL;;ADz0JG;EACC,kBAAA;AC40JJ;;ADx0JI;EACC,mBAAA;AC20JL;;ADj1JG;EACC,mBAAA;ACo1JJ;;ADh1JI;EACC,oBAAA;ACm1JL;;ADz2JG;EACC,iBAAA;EACA,kBAAA;AC42JJ;;AD92JG;EACC,iBAAA;EACA,kBAAA;ACi3JJ;;ADn3JG;EACC,iBAAA;EACA,kBAAA;ACs3JJ;;ADx3JG;EACC,iBAAA;EACA,kBAAA;AC23JJ;;AD73JG;EACC,iBAAA;EACA,kBAAA;ACg4JJ;;ADl4JG;EACC,iBAAA;EACA,kBAAA;ACq4JJ;;ADv4JG;EACC,iBAAA;EACA,kBAAA;AC04JJ;;AD54JG;EACC,iBAAA;EACA,kBAAA;AC+4JJ;;ADj5JG;EACC,iBAAA;EACA,kBAAA;ACo5JJ;;ADt5JG;EACC,iBAAA;EACA,kBAAA;ACy5JJ;;AD35JG;EACC,kBAAA;EACA,mBAAA;AC85JJ;;ADh6JG;EACC,kBAAA;EACA,mBAAA;ACm6JJ;;ADr6JG;EACC,kBAAA;EACA,mBAAA;ACw6JJ;;AD16JG;EACC,kBAAA;EACA,mBAAA;AC66JJ;;AD/6JG;EACC,kBAAA;EACA,mBAAA;ACk7JJ;;ADp7JG;EACC,kBAAA;EACA,mBAAA;ACu7JJ;;ADz7JG;EACC,kBAAA;EACA,mBAAA;AC47JJ;;AD97JG;EACC,kBAAA;EACA,mBAAA;ACi8JJ;;ADn8JG;EACC,kBAAA;EACA,mBAAA;ACs8JJ;;ADx8JG;EACC,kBAAA;EACA,mBAAA;AC28JJ;;AD78JG;EACC,kBAAA;EACA,mBAAA;ACg9JJ;;ADl9JG;EACC,kBAAA;EACA,mBAAA;ACq9JJ;;ADv9JG;EACC,kBAAA;EACA,mBAAA;AC09JJ;;AD59JG;EACC,kBAAA;EACA,mBAAA;AC+9JJ;;ADj+JG;EACC,kBAAA;EACA,mBAAA;ACo+JJ;;ADt+JG;EACC,kBAAA;EACA,mBAAA;ACy+JJ;;AD/8JG;EACC,iBAAA;EACA,kBAAA;ACk9JJ;;ADp9JG;EACC,iBAAA;EACA,kBAAA;ACu9JJ;;ADz9JG;EACC,kBAAA;EACA,mBAAA;AC49JJ;;AD99JG;EACC,kBAAA;EACA,mBAAA;ACi+JJ;;ADn+JG;EACC,kBAAA;EACA,mBAAA;ACs+JJ;;ADx+JG;EACC,kBAAA;EACA,mBAAA;AC2+JJ;;AD7+JG;EACC,kBAAA;EACA,mBAAA;ACg/JJ;;ADl/JG;EACC,kBAAA;EACA,mBAAA;ACq/JJ;;ADv/JG;EACC,kBAAA;EACA,mBAAA;AC0/JJ;;AD5/JG;EACC,kBAAA;EACA,mBAAA;AC+/JJ;;ADjgKG;EACC,kBAAA;EACA,mBAAA;ACogKJ;;ADtgKG;EACC,kBAAA;EACA,mBAAA;ACygKJ;;AD3gKG;EACC,kBAAA;EACA,mBAAA;AC8gKJ;;ADhhKG;EACC,kBAAA;EACA,mBAAA;ACmhKJ;;ADrhKG;EACC,kBAAA;EACA,mBAAA;ACwhKJ;;AD1hKG;EACC,kBAAA;EACA,mBAAA;AC6hKJ;;AD/hKG;EACC,kBAAA;EACA,mBAAA;ACkiKJ;;ADpiKG;EACC,kBAAA;EACA,mBAAA;ACuiKJ;;ADziKG;EACC,kBAAA;EACA,mBAAA;AC4iKJ;;AD9iKG;EACC,kBAAA;EACA,mBAAA;ACijKJ;;ADnjKG;EACC,kBAAA;EACA,mBAAA;ACsjKJ;;ADxjKG;EACC,kBAAA;EACA,mBAAA;AC2jKJ;;AD7jKG;EACC,kBAAA;EACA,mBAAA;ACgkKJ;;ADlkKG;EACC,kBAAA;EACA,mBAAA;ACqkKJ;;ADvkKG;EACC,mBAAA;EACA,oBAAA;AC0kKJ;;ADjmKG;EACC,gBAAA;EACA,mBAAA;AComKJ;;ADtmKG;EACC,gBAAA;EACA,mBAAA;ACymKJ;;AD3mKG;EACC,gBAAA;EACA,mBAAA;AC8mKJ;;ADhnKG;EACC,gBAAA;EACA,mBAAA;ACmnKJ;;ADrnKG;EACC,gBAAA;EACA,mBAAA;ACwnKJ;;AD1nKG;EACC,gBAAA;EACA,mBAAA;AC6nKJ;;AD/nKG;EACC,gBAAA;EACA,mBAAA;ACkoKJ;;ADpoKG;EACC,gBAAA;EACA,mBAAA;ACuoKJ;;ADzoKG;EACC,gBAAA;EACA,mBAAA;AC4oKJ;;AD9oKG;EACC,gBAAA;EACA,mBAAA;ACipKJ;;ADnpKG;EACC,iBAAA;EACA,oBAAA;ACspKJ;;ADxpKG;EACC,iBAAA;EACA,oBAAA;AC2pKJ;;AD7pKG;EACC,iBAAA;EACA,oBAAA;ACgqKJ;;ADlqKG;EACC,iBAAA;EACA,oBAAA;ACqqKJ;;ADvqKG;EACC,iBAAA;EACA,oBAAA;AC0qKJ;;AD5qKG;EACC,iBAAA;EACA,oBAAA;AC+qKJ;;ADjrKG;EACC,iBAAA;EACA,oBAAA;ACorKJ;;ADtrKG;EACC,iBAAA;EACA,oBAAA;ACyrKJ;;AD3rKG;EACC,iBAAA;EACA,oBAAA;AC8rKJ;;ADhsKG;EACC,iBAAA;EACA,oBAAA;ACmsKJ;;ADrsKG;EACC,iBAAA;EACA,oBAAA;ACwsKJ;;AD1sKG;EACC,iBAAA;EACA,oBAAA;AC6sKJ;;AD/sKG;EACC,iBAAA;EACA,oBAAA;ACktKJ;;ADptKG;EACC,iBAAA;EACA,oBAAA;ACutKJ;;ADztKG;EACC,iBAAA;EACA,oBAAA;AC4tKJ;;AD9tKG;EACC,iBAAA;EACA,oBAAA;ACiuKJ;;ADvsKG;EACC,gBAAA;EACA,mBAAA;AC0sKJ;;AD5sKG;EACC,gBAAA;EACA,mBAAA;AC+sKJ;;ADjtKG;EACC,iBAAA;EACA,oBAAA;ACotKJ;;ADttKG;EACC,iBAAA;EACA,oBAAA;ACytKJ;;AD3tKG;EACC,iBAAA;EACA,oBAAA;AC8tKJ;;ADhuKG;EACC,iBAAA;EACA,oBAAA;ACmuKJ;;ADruKG;EACC,iBAAA;EACA,oBAAA;ACwuKJ;;AD1uKG;EACC,iBAAA;EACA,oBAAA;AC6uKJ;;AD/uKG;EACC,iBAAA;EACA,oBAAA;ACkvKJ;;ADpvKG;EACC,iBAAA;EACA,oBAAA;ACuvKJ;;ADzvKG;EACC,iBAAA;EACA,oBAAA;AC4vKJ;;AD9vKG;EACC,iBAAA;EACA,oBAAA;ACiwKJ;;ADnwKG;EACC,iBAAA;EACA,oBAAA;ACswKJ;;ADxwKG;EACC,iBAAA;EACA,oBAAA;AC2wKJ;;AD7wKG;EACC,iBAAA;EACA,oBAAA;ACgxKJ;;ADlxKG;EACC,iBAAA;EACA,oBAAA;ACqxKJ;;ADvxKG;EACC,iBAAA;EACA,oBAAA;AC0xKJ;;AD5xKG;EACC,iBAAA;EACA,oBAAA;AC+xKJ;;ADjyKG;EACC,iBAAA;EACA,oBAAA;ACoyKJ;;ADtyKG;EACC,iBAAA;EACA,oBAAA;ACyyKJ;;AD3yKG;EACC,iBAAA;EACA,oBAAA;AC8yKJ;;ADhzKG;EACC,iBAAA;EACA,oBAAA;ACmzKJ;;ADrzKG;EACC,iBAAA;EACA,oBAAA;ACwzKJ;;AD1zKG;EACC,iBAAA;EACA,oBAAA;AC6zKJ;;AD/zKG;EACC,kBAAA;EACA,qBAAA;ACk0KJ;;ADxzKE;EACC,SAAA;AC2zKH;;ADxzKE;EACC,UAAA;AC2zKH;;ADh0KE;EACC,SAAA;ACm0KH;;ADh0KE;EACC,UAAA;ACm0KH;;ADx0KE;EACC,SAAA;AC20KH;;ADx0KE;EACC,UAAA;AC20KH;;ADh1KE;EACC,SAAA;ACm1KH;;ADh1KE;EACC,UAAA;ACm1KH;;ADx1KE;EACC,SAAA;AC21KH;;ADx1KE;EACC,UAAA;AC21KH;;ADh2KE;EACC,SAAA;ACm2KH;;ADh2KE;EACC,UAAA;ACm2KH;;ADx2KE;EACC,SAAA;AC22KH;;ADx2KE;EACC,UAAA;AC22KH;;ADh3KE;EACC,SAAA;ACm3KH;;ADh3KE;EACC,UAAA;ACm3KH;;ADx3KE;EACC,SAAA;AC23KH;;ADx3KE;EACC,UAAA;AC23KH;;ADh4KE;EACC,SAAA;ACm4KH;;ADh4KE;EACC,UAAA;ACm4KH;;ADx4KE;EACC,UAAA;AC24KH;;ADx4KE;EACC,WAAA;AC24KH;;ADh5KE;EACC,UAAA;ACm5KH;;ADh5KE;EACC,WAAA;ACm5KH;;ADx5KE;EACC,UAAA;AC25KH;;ADx5KE;EACC,WAAA;AC25KH;;ADh6KE;EACC,UAAA;ACm6KH;;ADh6KE;EACC,WAAA;ACm6KH;;ADx6KE;EACC,UAAA;AC26KH;;ADx6KE;EACC,WAAA;AC26KH;;ADh7KE;EACC,UAAA;ACm7KH;;ADh7KE;EACC,WAAA;ACm7KH;;ADx7KE;EACC,UAAA;AC27KH;;ADx7KE;EACC,WAAA;AC27KH;;ADh8KE;EACC,UAAA;ACm8KH;;ADh8KE;EACC,WAAA;ACm8KH;;ADx8KE;EACC,UAAA;AC28KH;;ADx8KE;EACC,WAAA;AC28KH;;ADh9KE;EACC,UAAA;ACm9KH;;ADh9KE;EACC,WAAA;ACm9KH;;ADx9KE;EACC,UAAA;AC29KH;;ADx9KE;EACC,WAAA;AC29KH;;ADh+KE;EACC,UAAA;ACm+KH;;ADh+KE;EACC,WAAA;ACm+KH;;ADx+KE;EACC,UAAA;AC2+KH;;ADx+KE;EACC,WAAA;AC2+KH;;ADh/KE;EACC,UAAA;ACm/KH;;ADh/KE;EACC,WAAA;ACm/KH;;ADx/KE;EACC,UAAA;AC2/KH;;ADx/KE;EACC,WAAA;AC2/KH;;ADhgLE;EACC,UAAA;ACmgLH;;ADhgLE;EACC,WAAA;ACmgLH;;AD9/KE;EACC,SAAA;ACigLH;;AD9/KE;EACC,UAAA;ACigLH;;ADtgLE;EACC,SAAA;ACygLH;;ADtgLE;EACC,UAAA;ACygLH;;AD9gLE;EACC,UAAA;ACihLH;;AD9gLE;EACC,WAAA;ACihLH;;ADthLE;EACC,UAAA;ACyhLH;;ADthLE;EACC,WAAA;ACyhLH;;AD9hLE;EACC,UAAA;ACiiLH;;AD9hLE;EACC,WAAA;ACiiLH;;ADtiLE;EACC,UAAA;ACyiLH;;ADtiLE;EACC,WAAA;ACyiLH;;AD9iLE;EACC,UAAA;ACijLH;;AD9iLE;EACC,WAAA;ACijLH;;ADtjLE;EACC,UAAA;ACyjLH;;ADtjLE;EACC,WAAA;ACyjLH;;AD9jLE;EACC,UAAA;ACikLH;;AD9jLE;EACC,WAAA;ACikLH;;ADtkLE;EACC,UAAA;ACykLH;;ADtkLE;EACC,WAAA;ACykLH;;AD9kLE;EACC,UAAA;ACilLH;;AD9kLE;EACC,WAAA;ACilLH;;ADtlLE;EACC,UAAA;ACylLH;;ADtlLE;EACC,WAAA;ACylLH;;AD9lLE;EACC,UAAA;ACimLH;;AD9lLE;EACC,WAAA;ACimLH;;ADtmLE;EACC,UAAA;ACymLH;;ADtmLE;EACC,WAAA;ACymLH;;AD9mLE;EACC,UAAA;ACinLH;;AD9mLE;EACC,WAAA;ACinLH;;ADtnLE;EACC,UAAA;ACynLH;;ADtnLE;EACC,WAAA;ACynLH;;AD9nLE;EACC,UAAA;ACioLH;;AD9nLE;EACC,WAAA;ACioLH;;ADtoLE;EACC,UAAA;ACyoLH;;ADtoLE;EACC,WAAA;ACyoLH;;AD9oLE;EACC,UAAA;ACipLH;;AD9oLE;EACC,WAAA;ACipLH;;ADtpLE;EACC,UAAA;ACypLH;;ADtpLE;EACC,WAAA;ACypLH;;AD9pLE;EACC,UAAA;ACiqLH;;AD9pLE;EACC,WAAA;ACiqLH;;ADtqLE;EACC,UAAA;ACyqLH;;ADtqLE;EACC,WAAA;ACyqLH;;AD9qLE;EACC,UAAA;ACirLH;;AD9qLE;EACC,WAAA;ACirLH;;ADtrLE;EACC,UAAA;ACyrLH;;ADtrLE;EACC,WAAA;ACyrLH;;AD9rLE;EACC,WAAA;ACisLH;;AD9rLE;EACC,YAAA;ACisLH;;ADhtLE;EACC,WAAA;ACmtLH;;ADhtLE;EACC,YAAA;ACmtLH;;ADxtLE;EACC,WAAA;AC2tLH;;ADxtLE;EACC,YAAA;AC2tLH;;ADhuLE;EACC,WAAA;ACmuLH;;ADhuLE;EACC,YAAA;ACmuLH;;ADxuLE;EACC,WAAA;AC2uLH;;ADxuLE;EACC,YAAA;AC2uLH;;ADhvLE;EACC,WAAA;ACmvLH;;ADhvLE;EACC,YAAA;ACmvLH;;ADxvLE;EACC,WAAA;AC2vLH;;ADxvLE;EACC,YAAA;AC2vLH;;ADhwLE;EACC,WAAA;ACmwLH;;ADhwLE;EACC,YAAA;ACmwLH;;ADxwLE;EACC,WAAA;AC2wLH;;ADxwLE;EACC,YAAA;AC2wLH;;ADhxLE;EACC,WAAA;ACmxLH;;ADhxLE;EACC,YAAA;ACmxLH;;ADxxLE;EACC,WAAA;AC2xLH;;ADxxLE;EACC,YAAA;AC2xLH;;ADhyLE;EACC,YAAA;ACmyLH;;ADhyLE;EACC,aAAA;ACmyLH;;ADxyLE;EACC,YAAA;AC2yLH;;ADxyLE;EACC,aAAA;AC2yLH;;ADhzLE;EACC,YAAA;ACmzLH;;ADhzLE;EACC,aAAA;ACmzLH;;ADxzLE;EACC,YAAA;AC2zLH;;ADxzLE;EACC,aAAA;AC2zLH;;ADh0LE;EACC,YAAA;ACm0LH;;ADh0LE;EACC,aAAA;ACm0LH;;ADx0LE;EACC,YAAA;AC20LH;;ADx0LE;EACC,aAAA;AC20LH;;ADh1LE;EACC,YAAA;ACm1LH;;ADh1LE;EACC,aAAA;ACm1LH;;ADx1LE;EACC,YAAA;AC21LH;;ADx1LE;EACC,aAAA;AC21LH;;ADh2LE;EACC,YAAA;ACm2LH;;ADh2LE;EACC,aAAA;ACm2LH;;ADx2LE;EACC,YAAA;AC22LH;;ADx2LE;EACC,aAAA;AC22LH;;ADh3LE;EACC,YAAA;ACm3LH;;ADh3LE;EACC,aAAA;ACm3LH;;ADx3LE;EACC,YAAA;AC23LH;;ADx3LE;EACC,aAAA;AC23LH;;ADh4LE;EACC,YAAA;ACm4LH;;ADh4LE;EACC,aAAA;ACm4LH;;ADx4LE;EACC,YAAA;AC24LH;;ADx4LE;EACC,aAAA;AC24LH;;ADh5LE;EACC,YAAA;ACm5LH;;ADh5LE;EACC,aAAA;ACm5LH;;ADx5LE;EACC,YAAA;AC25LH;;ADx5LE;EACC,aAAA;AC25LH;;ADt5LE;EACC,WAAA;ACy5LH;;ADt5LE;EACC,YAAA;ACy5LH;;AD95LE;EACC,WAAA;ACi6LH;;AD95LE;EACC,YAAA;ACi6LH;;ADt6LE;EACC,YAAA;ACy6LH;;ADt6LE;EACC,aAAA;ACy6LH;;AD96LE;EACC,YAAA;ACi7LH;;AD96LE;EACC,aAAA;ACi7LH;;ADt7LE;EACC,YAAA;ACy7LH;;ADt7LE;EACC,aAAA;ACy7LH;;AD97LE;EACC,YAAA;ACi8LH;;AD97LE;EACC,aAAA;ACi8LH;;ADt8LE;EACC,YAAA;ACy8LH;;ADt8LE;EACC,aAAA;ACy8LH;;AD98LE;EACC,YAAA;ACi9LH;;AD98LE;EACC,aAAA;ACi9LH;;ADt9LE;EACC,YAAA;ACy9LH;;ADt9LE;EACC,aAAA;ACy9LH;;AD99LE;EACC,YAAA;ACi+LH;;AD99LE;EACC,aAAA;ACi+LH;;ADt+LE;EACC,YAAA;ACy+LH;;ADt+LE;EACC,aAAA;ACy+LH;;AD9+LE;EACC,YAAA;ACi/LH;;AD9+LE;EACC,aAAA;ACi/LH;;ADt/LE;EACC,YAAA;ACy/LH;;ADt/LE;EACC,aAAA;ACy/LH;;AD9/LE;EACC,YAAA;ACigMH;;AD9/LE;EACC,aAAA;ACigMH;;ADtgME;EACC,YAAA;ACygMH;;ADtgME;EACC,aAAA;ACygMH;;AD9gME;EACC,YAAA;ACihMH;;AD9gME;EACC,aAAA;ACihMH;;ADthME;EACC,YAAA;ACyhMH;;ADthME;EACC,aAAA;ACyhMH;;AD9hME;EACC,YAAA;ACiiMH;;AD9hME;EACC,aAAA;ACiiMH;;ADtiME;EACC,YAAA;ACyiMH;;ADtiME;EACC,aAAA;ACyiMH;;AD9iME;EACC,YAAA;ACijMH;;AD9iME;EACC,aAAA;ACijMH;;ADtjME;EACC,YAAA;ACyjMH;;ADtjME;EACC,aAAA;ACyjMH;;AD9jME;EACC,YAAA;ACikMH;;AD9jME;EACC,aAAA;ACikMH;;ADtkME;EACC,YAAA;ACykMH;;ADtkME;EACC,aAAA;ACykMH;;AD9kME;EACC,YAAA;ACilMH;;AD9kME;EACC,aAAA;ACilMH;;ADtlME;EACC,aAAA;ACylMH;;ADtlME;EACC,cAAA;ACylMH;;ADxmME;EACC,YAAA;AC2mMH;;ADxmME;EACC,aAAA;AC2mMH;;ADhnME;EACC,YAAA;ACmnMH;;ADhnME;EACC,aAAA;ACmnMH;;ADxnME;EACC,YAAA;AC2nMH;;ADxnME;EACC,aAAA;AC2nMH;;ADhoME;EACC,YAAA;ACmoMH;;ADhoME;EACC,aAAA;ACmoMH;;ADxoME;EACC,YAAA;AC2oMH;;ADxoME;EACC,aAAA;AC2oMH;;ADhpME;EACC,YAAA;ACmpMH;;ADhpME;EACC,aAAA;ACmpMH;;ADxpME;EACC,YAAA;AC2pMH;;ADxpME;EACC,aAAA;AC2pMH;;ADhqME;EACC,YAAA;ACmqMH;;ADhqME;EACC,aAAA;ACmqMH;;ADxqME;EACC,YAAA;AC2qMH;;ADxqME;EACC,aAAA;AC2qMH;;ADhrME;EACC,YAAA;ACmrMH;;ADhrME;EACC,aAAA;ACmrMH;;ADxrME;EACC,aAAA;AC2rMH;;ADxrME;EACC,cAAA;AC2rMH;;ADhsME;EACC,aAAA;ACmsMH;;ADhsME;EACC,cAAA;ACmsMH;;ADxsME;EACC,aAAA;AC2sMH;;ADxsME;EACC,cAAA;AC2sMH;;ADhtME;EACC,aAAA;ACmtMH;;ADhtME;EACC,cAAA;ACmtMH;;ADxtME;EACC,aAAA;AC2tMH;;ADxtME;EACC,cAAA;AC2tMH;;ADhuME;EACC,aAAA;ACmuMH;;ADhuME;EACC,cAAA;ACmuMH;;ADxuME;EACC,aAAA;AC2uMH;;ADxuME;EACC,cAAA;AC2uMH;;ADhvME;EACC,aAAA;ACmvMH;;ADhvME;EACC,cAAA;ACmvMH;;ADxvME;EACC,aAAA;AC2vMH;;ADxvME;EACC,cAAA;AC2vMH;;ADhwME;EACC,aAAA;ACmwMH;;ADhwME;EACC,cAAA;ACmwMH;;ADxwME;EACC,aAAA;AC2wMH;;ADxwME;EACC,cAAA;AC2wMH;;ADhxME;EACC,aAAA;ACmxMH;;ADhxME;EACC,cAAA;ACmxMH;;ADxxME;EACC,aAAA;AC2xMH;;ADxxME;EACC,cAAA;AC2xMH;;ADhyME;EACC,aAAA;ACmyMH;;ADhyME;EACC,cAAA;ACmyMH;;ADxyME;EACC,aAAA;AC2yMH;;ADxyME;EACC,cAAA;AC2yMH;;ADhzME;EACC,aAAA;ACmzMH;;ADhzME;EACC,cAAA;ACmzMH;;AD9yME;EACC,YAAA;ACizMH;;AD9yME;EACC,aAAA;ACizMH;;ADtzME;EACC,YAAA;ACyzMH;;ADtzME;EACC,aAAA;ACyzMH;;AD9zME;EACC,aAAA;ACi0MH;;AD9zME;EACC,cAAA;ACi0MH;;ADt0ME;EACC,aAAA;ACy0MH;;ADt0ME;EACC,cAAA;ACy0MH;;AD90ME;EACC,aAAA;ACi1MH;;AD90ME;EACC,cAAA;ACi1MH;;ADt1ME;EACC,aAAA;ACy1MH;;ADt1ME;EACC,cAAA;ACy1MH;;AD91ME;EACC,aAAA;ACi2MH;;AD91ME;EACC,cAAA;ACi2MH;;ADt2ME;EACC,aAAA;ACy2MH;;ADt2ME;EACC,cAAA;ACy2MH;;AD92ME;EACC,aAAA;ACi3MH;;AD92ME;EACC,cAAA;ACi3MH;;ADt3ME;EACC,aAAA;ACy3MH;;ADt3ME;EACC,cAAA;ACy3MH;;AD93ME;EACC,aAAA;ACi4MH;;AD93ME;EACC,cAAA;ACi4MH;;ADt4ME;EACC,aAAA;ACy4MH;;ADt4ME;EACC,cAAA;ACy4MH;;AD94ME;EACC,aAAA;ACi5MH;;AD94ME;EACC,cAAA;ACi5MH;;ADt5ME;EACC,aAAA;ACy5MH;;ADt5ME;EACC,cAAA;ACy5MH;;AD95ME;EACC,aAAA;ACi6MH;;AD95ME;EACC,cAAA;ACi6MH;;ADt6ME;EACC,aAAA;ACy6MH;;ADt6ME;EACC,cAAA;ACy6MH;;AD96ME;EACC,aAAA;ACi7MH;;AD96ME;EACC,cAAA;ACi7MH;;ADt7ME;EACC,aAAA;ACy7MH;;ADt7ME;EACC,cAAA;ACy7MH;;AD97ME;EACC,aAAA;ACi8MH;;AD97ME;EACC,cAAA;ACi8MH;;ADt8ME;EACC,aAAA;ACy8MH;;ADt8ME;EACC,cAAA;ACy8MH;;AD98ME;EACC,aAAA;ACi9MH;;AD98ME;EACC,cAAA;ACi9MH;;ADt9ME;EACC,aAAA;ACy9MH;;ADt9ME;EACC,cAAA;ACy9MH;;AD99ME;EACC,aAAA;ACi+MH;;AD99ME;EACC,cAAA;ACi+MH;;ADt+ME;EACC,aAAA;ACy+MH;;ADt+ME;EACC,cAAA;ACy+MH;;AD9+ME;EACC,cAAA;ACi/MH;;AD9+ME;EACC,eAAA;ACi/MH;;ADhgNE;EACC,UAAA;ACmgNH;;ADhgNE;EACC,WAAA;ACmgNH;;ADxgNE;EACC,UAAA;AC2gNH;;ADxgNE;EACC,WAAA;AC2gNH;;ADhhNE;EACC,UAAA;ACmhNH;;ADhhNE;EACC,WAAA;ACmhNH;;ADxhNE;EACC,UAAA;AC2hNH;;ADxhNE;EACC,WAAA;AC2hNH;;ADhiNE;EACC,UAAA;ACmiNH;;ADhiNE;EACC,WAAA;ACmiNH;;ADxiNE;EACC,UAAA;AC2iNH;;ADxiNE;EACC,WAAA;AC2iNH;;ADhjNE;EACC,UAAA;ACmjNH;;ADhjNE;EACC,WAAA;ACmjNH;;ADxjNE;EACC,UAAA;AC2jNH;;ADxjNE;EACC,WAAA;AC2jNH;;ADhkNE;EACC,UAAA;ACmkNH;;ADhkNE;EACC,WAAA;ACmkNH;;ADxkNE;EACC,UAAA;AC2kNH;;ADxkNE;EACC,WAAA;AC2kNH;;ADhlNE;EACC,WAAA;ACmlNH;;ADhlNE;EACC,YAAA;ACmlNH;;ADxlNE;EACC,WAAA;AC2lNH;;ADxlNE;EACC,YAAA;AC2lNH;;ADhmNE;EACC,WAAA;ACmmNH;;ADhmNE;EACC,YAAA;ACmmNH;;ADxmNE;EACC,WAAA;AC2mNH;;ADxmNE;EACC,YAAA;AC2mNH;;ADhnNE;EACC,WAAA;ACmnNH;;ADhnNE;EACC,YAAA;ACmnNH;;ADxnNE;EACC,WAAA;AC2nNH;;ADxnNE;EACC,YAAA;AC2nNH;;ADhoNE;EACC,WAAA;ACmoNH;;ADhoNE;EACC,YAAA;ACmoNH;;ADxoNE;EACC,WAAA;AC2oNH;;ADxoNE;EACC,YAAA;AC2oNH;;ADhpNE;EACC,WAAA;ACmpNH;;ADhpNE;EACC,YAAA;ACmpNH;;ADxpNE;EACC,WAAA;AC2pNH;;ADxpNE;EACC,YAAA;AC2pNH;;ADhqNE;EACC,WAAA;ACmqNH;;ADhqNE;EACC,YAAA;ACmqNH;;ADxqNE;EACC,WAAA;AC2qNH;;ADxqNE;EACC,YAAA;AC2qNH;;ADhrNE;EACC,WAAA;ACmrNH;;ADhrNE;EACC,YAAA;ACmrNH;;ADxrNE;EACC,WAAA;AC2rNH;;ADxrNE;EACC,YAAA;AC2rNH;;ADhsNE;EACC,WAAA;ACmsNH;;ADhsNE;EACC,YAAA;ACmsNH;;ADxsNE;EACC,WAAA;AC2sNH;;ADxsNE;EACC,YAAA;AC2sNH;;ADtsNE;EACC,UAAA;ACysNH;;ADtsNE;EACC,WAAA;ACysNH;;AD9sNE;EACC,UAAA;ACitNH;;AD9sNE;EACC,WAAA;ACitNH;;ADttNE;EACC,WAAA;ACytNH;;ADttNE;EACC,YAAA;ACytNH;;AD9tNE;EACC,WAAA;ACiuNH;;AD9tNE;EACC,YAAA;ACiuNH;;ADtuNE;EACC,WAAA;ACyuNH;;ADtuNE;EACC,YAAA;ACyuNH;;AD9uNE;EACC,WAAA;ACivNH;;AD9uNE;EACC,YAAA;ACivNH;;ADtvNE;EACC,WAAA;ACyvNH;;ADtvNE;EACC,YAAA;ACyvNH;;AD9vNE;EACC,WAAA;ACiwNH;;AD9vNE;EACC,YAAA;ACiwNH;;ADtwNE;EACC,WAAA;ACywNH;;ADtwNE;EACC,YAAA;ACywNH;;AD9wNE;EACC,WAAA;ACixNH;;AD9wNE;EACC,YAAA;ACixNH;;ADtxNE;EACC,WAAA;ACyxNH;;ADtxNE;EACC,YAAA;ACyxNH;;AD9xNE;EACC,WAAA;ACiyNH;;AD9xNE;EACC,YAAA;ACiyNH;;ADtyNE;EACC,WAAA;ACyyNH;;ADtyNE;EACC,YAAA;ACyyNH;;AD9yNE;EACC,WAAA;ACizNH;;AD9yNE;EACC,YAAA;ACizNH;;ADtzNE;EACC,WAAA;ACyzNH;;ADtzNE;EACC,YAAA;ACyzNH;;AD9zNE;EACC,WAAA;ACi0NH;;AD9zNE;EACC,YAAA;ACi0NH;;ADt0NE;EACC,WAAA;ACy0NH;;ADt0NE;EACC,YAAA;ACy0NH;;AD90NE;EACC,WAAA;ACi1NH;;AD90NE;EACC,YAAA;ACi1NH;;ADt1NE;EACC,WAAA;ACy1NH;;ADt1NE;EACC,YAAA;ACy1NH;;AD91NE;EACC,WAAA;ACi2NH;;AD91NE;EACC,YAAA;ACi2NH;;ADt2NE;EACC,WAAA;ACy2NH;;ADt2NE;EACC,YAAA;ACy2NH;;AD92NE;EACC,WAAA;ACi3NH;;AD92NE;EACC,YAAA;ACi3NH;;ADt3NE;EACC,WAAA;ACy3NH;;ADt3NE;EACC,YAAA;ACy3NH;;AD93NE;EACC,WAAA;ACi4NH;;AD93NE;EACC,YAAA;ACi4NH;;ADt4NE;EACC,YAAA;ACy4NH;;ADt4NE;EACC,aAAA;ACy4NH;;ADp4NA;EACC,wBAAA;ACu4ND;;ADp4NC;EACC,qCAAA;ACu4NF;;ADx4NC;EACC,qCAAA;AC24NF;;AD54NC;EACC,qCAAA;AC+4NF;;ADh5NC;EACC,qCAAA;ACm5NF;;ADp5NC;EACC,qCAAA;ACu5NF;;ADx5NC;EACC,qCAAA;AC25NF;;AD55NC;EACC,qCAAA;AC+5NF;;ADh6NC;EACC,qCAAA;ACm6NF;;ADp6NC;EACC,qCAAA;ACu6NF;;ADx6NC;EACC,sCAAA;AC26NF;;AD56NC;EACC,sCAAA;AC+6NF;;AD36NC;EACC,SAAA;AC86NF;;AD56NC;EACC,qBAAA;AC+6NF;;AD76NC;EACC,kBAAA;ACg7NF;;ADv7NC;EACC,SAAA;AC07NF;;ADx7NC;EACC,qBAAA;AC27NF;;ADz7NC;EACC,kBAAA;AC47NF;;ADn8NC;EACC,SAAA;ACs8NF;;ADp8NC;EACC,qBAAA;ACu8NF;;ADr8NC;EACC,kBAAA;ACw8NF;;AD/8NC;EACC,SAAA;ACk9NF;;ADh9NC;EACC,qBAAA;ACm9NF;;ADj9NC;EACC,kBAAA;ACo9NF;;AD39NC;EACC,UAAA;AC89NF;;AD59NC;EACC,sBAAA;AC+9NF;;AD79NC;EACC,mBAAA;ACg+NF;;ADv+NC;EACC,UAAA;AC0+NF;;ADx+NC;EACC,sBAAA;AC2+NF;;ADz+NC;EACC,mBAAA;AC4+NF;;ADn/NC;EACC,UAAA;ACs/NF;;ADp/NC;EACC,sBAAA;ACu/NF;;ADr/NC;EACC,mBAAA;ACw/NF;;AD//NC;EACC,UAAA;ACkgOF;;ADhgOC;EACC,sBAAA;ACmgOF;;ADjgOC;EACC,mBAAA;ACogOF;;AD3gOC;EACC,UAAA;AC8gOF;;AD5gOC;EACC,sBAAA;AC+gOF;;AD7gOC;EACC,mBAAA;ACghOF;;ADvhOC;EACC,UAAA;AC0hOF;;ADxhOC;EACC,sBAAA;AC2hOF;;ADzhOC;EACC,mBAAA;AC4hOF;;ADniOC;EACC,UAAA;ACsiOF;;ADpiOC;EACC,sBAAA;ACuiOF;;ADriOC;EACC,mBAAA;ACwiOF;;AD/iOC;EACC,UAAA;ACkjOF;;ADhjOC;EACC,sBAAA;ACmjOF;;ADjjOC;EACC,mBAAA;ACojOF;;AD3jOC;EACC,UAAA;AC8jOF;;AD5jOC;EACC,sBAAA;AC+jOF;;AD7jOC;EACC,mBAAA;ACgkOF;;ADvkOC;EACC,UAAA;AC0kOF;;ADxkOC;EACC,sBAAA;AC2kOF;;ADzkOC;EACC,mBAAA;AC4kOF;;ADnlOC;EACC,UAAA;ACslOF;;ADplOC;EACC,sBAAA;ACulOF;;ADrlOC;EACC,mBAAA;ACwlOF;;AD/lOC;EACC,UAAA;ACkmOF;;ADhmOC;EACC,sBAAA;ACmmOF;;ADjmOC;EACC,mBAAA;AComOF;;AD3mOC;EACC,UAAA;AC8mOF;;AD5mOC;EACC,sBAAA;AC+mOF;;AD7mOC;EACC,mBAAA;ACgnOF;;ADvnOC;EACC,UAAA;AC0nOF;;ADxnOC;EACC,sBAAA;AC2nOF;;ADznOC;EACC,mBAAA;AC4nOF;;ADnoOC;EACC,UAAA;ACsoOF;;ADpoOC;EACC,sBAAA;ACuoOF;;ADroOC;EACC,mBAAA;ACwoOF;;AD/oOC;EACC,UAAA;ACkpOF;;ADhpOC;EACC,sBAAA;ACmpOF;;ADjpOC;EACC,mBAAA;ACopOF;;AD3pOC;EACC,UAAA;AC8pOF;;AD5pOC;EACC,sBAAA;AC+pOF;;AD7pOC;EACC,mBAAA;ACgqOF;;ADvqOC;EACC,UAAA;AC0qOF;;ADxqOC;EACC,sB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BAAA;AC6wOF;;AD9wOC;EACC,wBAAA;ACixOF;;ADlxOC;EACC,wBAAA;ACqxOF;;ADtxOC;EACC,wBAAA;ACyxOF;;AD7uOC;EACC,yBAAA;ACgvOF;;AD7uOC;EACC,yBA7BO;AC6wOT;;ADrvOC;EACC,yBAAA;ACwvOF;;ADrvOC;EACC,yBA7BO;ACqxOT;;AD7vOC;EACC,yBAAA;ACgwOF;;AD7vOC;EACC,yBA7BO;AC6xOT;;ADrwOC;EACC,yBAAA;ACwwOF;;ADrwOC;EACC,yBA7BO;ACqyOT;;AD7wOC;EACC,yBAAA;ACgxOF;;AD7wOC;EACC,yBA7BO;AC6yOT;;ADrxOC;EACC,yBAAA;ACwxOF;;ADrxOC;EACC,yBA7BO;ACqzOT;;AD7xOC;EACC,yBAAA;ACgyOF;;AD7xOC;EACC,yBA7BO;AC6zOT;;ADryOC;EACC,yBAAA;ACwyOF;;ADryOC;EACC,yBA7BO;ACq0OT;;AD7yOC;EACC,yBAAA;ACgzOF;;AD7yOC;EACC,yBA7BO;AC60OT;;ADrzOC;EACC,yBAAA;ACwzOF;;ADrzOC;EACC,yBA7BO;ACq1OT;;AD7zOC;EACC,yBAAA;ACg0OF;;AD7zOC;EACC,yBA7BO;AC61OT;;ADr0OC;EACC,yBAAA;ACw0OF;;ADr0OC;EACC,yBA7BO;ACq2OT;;AD70OC;EACC,yBAAA;ACg1OF;;AD70OC;EACC,yBA7BO;AC62OT;;ADr1OC;EACC,yBAAA;ACw1OF;;ADr1OC;EACC,yBA7BO;ACq3OT;;AD71OC;EACC,yBAAA;ACg2OF;;AD71OC;EACC,yBA7BO;AC63OT;;ADr2OC;EACC,yBAAA;ACw2OF;;ADr2OC;EACC,yBA7BO;ACq4OT;;AD72OC;EACC,yBAAA;ACg3OF;;AD72OC;EACC,yBA7BO;AC64OT;;ADr3OC;EACC,yBAAA;ACw3OF;;ADr3OC;EACC,yBA7BO;ACq5OT;;ADl3OC;EACC,yBAAA;ACq3OF;;ADl3OC;EACC,yBAxDc;AC66OhB;;AD13OC;EACC,yBAAA;AC63OF;;AD13OC;EACC,yBAxDc;ACq7OhB;;ADl4OC;EACC,yBAAA;ACq4OF;;ADl4OC;EACC,yBAxDc;AC67OhB;;AD14OC;EACC,yBAAA;AC64OF;;AD14OC;EACC,yBAxDc;ACq8OhB;;ADl5OC;EACC,yBAAA;ACq5OF;;ADl5OC;EACC,yBAxDc;AC68OhB;;AD15OC;EACC,yBAAA;AC65OF;;AD15OC;EACC,yBAxDc;ACq9OhB;;ADl6OC;EACC,yBAAA;ACq6OF;;ADl6OC;EACC,yBAxDc;AC69OhB;;AD16OC;EACC,yBAAA;AC66OF;;AD16OC;EACC,yBAxDc;ACq+OhB;;ADl7OC;EACC,yBAAA;ACq7OF;;ADl7OC;EACC,yBAxDc;AC6+OhB;;AD17OC;EACC,yBAAA;AC67OF;;AD17OC;EACC,yBAxDc;ACq/OhB;;ADl8OC;EACC,yBAAA;ACq8OF;;ADl8OC;EACC,yBAxDc;AC6/OhB;;AD18OC;EACC,yBAAA;AC68OF;;AD18OC;EACC,yBAxDc;ACqgPhB;;ADl9OC;EACC,yBAAA;ACq9OF;;ADl9OC;EACC,yBAxDc;AC6gPhB;;AD19OC;EACC,yBAAA;AC69OF;;AD19OC;EACC,yBAxDc;ACqhPhB","file":"tmui.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["tmui.scss"],"names":[],"mappings":"AAAA,4CACC,aAED,kGAEC,aAED,aACC,4BAED,UACC,yBAGD,gBACC,gCAGD,MACC,2BACA,gCAGD,SACC,eAGD,eACC,WAMD,UACC,gBAID,YACC,kBACA,gBAGD,YACC,gBACA,kBAaA,UACC,6BADD,UACC,6BADD,OACC,0BADD,QACC,2BAKF,eACC,aACA,oBAID,OACC,WAGD,QACC,WACA,cAGD,eACC,YACA,cAGD,UACC,uBAGD,MACC,sBAGD,gBACC,gCAGD,SACC,cAMA,oBACC,eAFM,IACP,uBACC,eAFM,OACP,uBACC,eAFM,OAMR,MACC,qBACA,qBAGD,QACC,mBAMA,oBACC,eAFM,IACP,uBACC,eAFM,OACP,uBACC,eAFM,OAQP,UACC,UAGD,WACC,UALD,UACC,UAGD,WACC,UALD,UACC,UAGD,WACC,UALD,UACC,UAGD,WACC,WALD,UACC,UAGD,WACC,WALD,UACC,UAGD,WACC,WALD,UACC,UAGD,WACC,WALD,UACC,UAGD,WACC,WALD,UACC,UAGD,WACC,WALD,UACC,UAGD,WACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,WALD,WACC,WAGD,YACC,YALD,WACC,WAGD,YACC,YAcF,eAPC,MAD4B,KAE5B,QAF4C,MAG5C,YAH2D,OAI3D,gBAMA,uBAKA,iBAdA,MAewB,KAdxB,QAc8B,YAb9B,YAa2C,QAZ3C,gBAaC,mBAHW,EAIX,4BACA,uBAJD,iBAdA,MAewB,KAdxB,QAc8B,YAb9B,YAa2C,QAZ3C,gBAaC,mBAHW,EAIX,4BACA,uBAJD,iBAdA,MAewB,KAdxB,QAc8B,YAb9B,YAa2C,QAZ3C,gBAaC,mBAHW,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CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,yCACA,4CAlCF,YAiCE,0CACA,6CAYH,SACC,mBADD,SACC,mBADD,SACC,mBADD,SACC,oBADD,SACC,oBADD,SACC,oBADD,SACC,oBADD,SACC,oBADD,SACC,oBADD,SACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,oBADD,UACC,qBADD,UACC,qBAKF,SACC,6BAKA,WAME,UANF,WAEE,WAFF,WAEE,WAFF,WAEE,WAFF,WAEE,WAFF,WAEE,WAFF,WAEE,WAFF,WAEE,WAFF,WAEE,WAFF,WAEE,WAFF,YAUE,UAKH,QACC,wCAIA,UACC,wCADD,UACC,wCADD,UACC,wCADD,UACC,wCADD,UACC,wCADD,UACC,yCADD,UACC,yCADD,UACC,yCADD,UACC,yCADD,UACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCADD,WACC,yCAQA,UACC,kCAGD,aACC,kCAGD,QACC,qCAGD,WACC,qCAKD,UACC,oCAGD,aACC,oCALD,UACC,oCAGD,aACC,oCALD,UACC,oCAGD,aACC,oCALD,UACC,oCAGD,aACC,oCALD,UACC,qCAGD,aACC,qCASD,YAME,0CAIF,eAME,0CAhBF,YAME,0CAIF,eAME,0CAhBF,YAME,0CAIF,eAME,0CAhBF,YAME,0CAIF,eAME,0CAhBF,YAME,2CAIF,eAME,2CAhBF,YAME,2CAIF,eAME,2CAhBF,YAME,2CAIF,eAME,2CAhBF,YAME,2CAIF,eAME,2CAhBF,YAME,2CAIF,eAME,2CAhBF,YAME,4CAIF,eAME,4CAhBF,YAME,yCAIF,eAME,yCAhBF,YAME,yCAIF,eAME,yCAhBF,YAME,yCAIF,eAME,yCAhBF,YAME,yCAIF,eAME,yCAhBF,YAME,0CAIF,eAME,0CAhBF,YAME,4CAIF,eAME,4CAhBF,YAME,4CAIF,eAME,4CAhBF,YAME,4CAIF,eAME,4CAhBF,YAME,4CAIF,eAME,4CAhBF,YAME,6CAIF,eAME,6CAhBF,YAEE,qCAQF,eAEE,qCAZF,YAEE,qCAQF,eAEE,qCAZF,YAEE,qCAQF,eAEE,qCAZF,YAEE,qCAQF,eAEE,qCAZF,YAEE,sCAQF,eAEE,sCAeD,MACC,aADD,MACC,aADD,MACC,aADD,MACC,aADD,MACC,aADD,MACC,aADD,MACC,aADD,MACC,aADD,MACC,aADD,MACC,aADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cAqBD,OACC,aADD,OACC,aADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,OACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,cADD,QACC,eAvBD,MACC,iBADD,MACC,iBADD,MACC,iBADD,MACC,iBADD,MACC,iBADD,MACC,iBADD,MACC,iBADD,MACC,iBADD,MACC,iBADD,MACC,iBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBAqBD,OACC,iBADD,OACC,iBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,OACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,kBADD,QACC,mBAvBD,MACC,mBADD,MACC,mBADD,MACC,mBADD,MACC,mBADD,MACC,mBADD,MACC,mBADD,MACC,mBADD,MACC,mBADD,MACC,mBADD,MACC,mBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBAqBD,OACC,mBADD,OACC,mBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,OACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,oBADD,QACC,qBAvBD,MACC,oBADD,MACC,oBADD,MACC,oBADD,MACC,oBADD,MACC,oBADD,MACC,oBADD,MACC,oBADD,MACC,oBADD,MACC,oBADD,MACC,oBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBAqBD,OACC,oBADD,OACC,oBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,OACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,qBADD,QACC,sBAvBD,MACC,kBADD,MACC,kBADD,MACC,kBADD,MACC,kBADD,MACC,kBADD,MACC,kBADD,MACC,kBADD,MACC,kBADD,MACC,kBADD,MACC,kBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBAqBD,OACC,kBADD,OACC,kBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,OACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,mBADD,QACC,oBAjBD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,MACC,kBACA,mBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAoBD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,OACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,mBACA,oBAFD,QACC,oBACA,qBAjBD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,MACC,iBACA,oBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAoBD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,OACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,kBACA,qBAFD,QACC,mBACA,sBAWD,MACC,YADD,MACC,YADD,MACC,YADD,MACC,YADD,MACC,YADD,MACC,YADD,MACC,YADD,MACC,YADD,MACC,YADD,MACC,YADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aA2BD,OACC,YADD,OACC,YADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,OACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,aADD,QACC,cA7BD,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,MACC,gBAIA,OACC,iBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBAsBF,OACC,gBAIA,QACC,iBANF,OACC,gBAIA,QACC,iBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,iBAIA,SACC,kBANF,QACC,kBAIA,SACC,mBAlCF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,MACC,kBAIA,OACC,mBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBAsBF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,mBAIA,SACC,oBANF,QACC,oBAIA,SACC,qBAlCF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,MACC,mBAIA,OACC,oBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBAsBF,OACC,mBAIA,QACC,oBANF,OACC,mBAIA,QACC,oBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,OACC,oBAIA,QACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,oBAIA,SACC,qBANF,QACC,qBAIA,SACC,sBAlCF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,MACC,iBAIA,OACC,kBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBAsBF,OACC,iBAIA,QACC,kBANF,OACC,iBAIA,QACC,kBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,OACC,kBAIA,QACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,kBAIA,SACC,mBANF,QACC,mBAIA,SACC,oBAtBF,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,MACC,iBACA,kBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBA0BD,OACC,iBACA,kBAFD,OACC,iBACA,kBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,OACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,kBACA,mBAFD,QACC,mBACA,oBAvBD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,MACC,gBACA,mBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBA0BD,OACC,gBACA,mBAFD,OACC,gBACA,mBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,OACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,iBACA,oBAFD,QACC,kBACA,qBAUF,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,KACC,SAGD,MACC,UALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WAKD,MACC,SAGD,OACC,UALD,MACC,SAGD,OACC,UALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,UAGD,QACC,WALD,OACC,WAGD,QACC,YAfD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,KACC,WAGD,MACC,YALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aAKD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,YAGD,QACC,aALD,OACC,aAGD,QACC,cAfD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,KACC,YAGD,MACC,aALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cAKD,MACC,YAGD,OACC,aALD,MACC,YAGD,OACC,aALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,MACC,aAGD,OACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,aAGD,QACC,cALD,OACC,cAGD,QACC,eAfD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,KACC,UAGD,MACC,WALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YAKD,MACC,UAGD,OACC,WALD,MACC,UAGD,OACC,WALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,MACC,WAGD,OACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,WAGD,QACC,YALD,OACC,YAGD,QACC,aAKH,MACC,wBAIA,YACC,qCADD,YACC,qCADD,YACC,qCADD,YACC,qCADD,YACC,qCADD,YACC,qCADD,YACC,qCADD,YACC,qCADD,YACC,qCADD,aACC,sCADD,aACC,sCADD,aACC,sCAID,OACC,SAED,WACC,qBAED,WACC,kBAPD,OACC,SAED,WACC,qBAED,WACC,kBAPD,OACC,SAED,WACC,qBAED,WACC,kBAPD,OACC,SAED,WACC,qBAED,WACC,kBAPD,OACC,UAED,WACC,sBAED,WACC,mBAPD,OACC,UAED,WACC,sBAED,WACC,mBAPD,OACC,UAED,WACC,sBAED,WACC,mBAPD,OACC,UAED,WACC,sBAED,WACC,mBAPD,OACC,UAED,WACC,sBAED,WACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAPD,QACC,UAED,YACC,sBAED,YACC,mBAeF,MACC,wBAKD,UACC,iCAGD,WACC,8BAGD,aACC,yB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","file":"tmui.css"}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/css/tmui.min.css b/src/uni_modules/tm-ui/css/tmui.min.css
index cfd61d3..66dbe0f 100644
--- a/src/uni_modules/tm-ui/css/tmui.min.css
+++ b/src/uni_modules/tm-ui/css/tmui.min.css
@@ -1 +1 @@
-.uni-input-input[type=password]::-ms-reveal{display:none}.tableHeader .uni-scroll-view::-webkit-scrollbar{display:none}.safe-height{height:var(--window-bottom)}.safe-top{height:var(--window-top)}.safe-statusbar{height:var(--status-bar-height)}.blur{backdrop-filter:blur(10px);background-color:rgba(0,0,0,.3)}.pointer{cursor:pointer}.pointer:hover{opacity:.7}.overflow{overflow:hidden}.overflow-x{overflow-x:hidden;overflow-y:auto}.overflow-y{overflow-x:auto;overflow-y:hidden}.relative{position:relative!important}.absolute{position:absolute!important}.fixed{position:fixed!important}.sticky{position:sticky!important}.fulled-height{display:flex;align-items:stretch}.clear{clear:both}.fulled{width:100%;display:block}.fulled-height{height:100%;display:block}.gray-100{filter:grayscale(100%)}.gray{filter:grayscale(25%)}.d-inline-block{display:inline-block!important}.d-block{display:block}.vertical-align-top{vertical-align:top}.vertical-align-middle{vertical-align:middle}.vertical-align-bottom{vertical-align:bottom}.wrap{white-space:pre-wrap;word-break:break-all}.nowrap{white-space:nowrap}.vertical-align-top{vertical-align:top}.vertical-align-middle{vertical-align:middle}.vertical-align-bottom{vertical-align:bottom}.zIndex-0{z-index:0}.zIndex-n0{z-index:0}.zIndex-1{z-index:1}.zIndex-n1{z-index:4}.zIndex-2{z-index:2}.zIndex-n2{z-index:8}.zIndex-3{z-index:3}.zIndex-n3{z-index:12}.zIndex-4{z-index:4}.zIndex-n4{z-index:16}.zIndex-5{z-index:5}.zIndex-n5{z-index:20}.zIndex-6{z-index:6}.zIndex-n6{z-index:24}.zIndex-7{z-index:7}.zIndex-n7{z-index:28}.zIndex-8{z-index:8}.zIndex-n8{z-index:32}.zIndex-9{z-index:9}.zIndex-n9{z-index:36}.zIndex-10{z-index:10}.zIndex-n10{z-index:40}.zIndex-11{z-index:11}.zIndex-n11{z-index:44}.zIndex-12{z-index:12}.zIndex-n12{z-index:48}.zIndex-13{z-index:13}.zIndex-n13{z-index:52}.zIndex-14{z-index:14}.zIndex-n14{z-index:56}.zIndex-15{z-index:15}.zIndex-n15{z-index:60}.zIndex-16{z-index:16}.zIndex-n16{z-index:64}.zIndex-17{z-index:17}.zIndex-n17{z-index:68}.zIndex-18{z-index:18}.zIndex-n18{z-index:72}.zIndex-19{z-index:19}.zIndex-n19{z-index:76}.zIndex-20{z-index:20}.zIndex-n20{z-index:80}.zIndex-21{z-index:21}.zIndex-n21{z-index:84}.zIndex-22{z-index:22}.zIndex-n22{z-index:88}.zIndex-23{z-index:23}.zIndex-n23{z-index:92}.zIndex-24{z-index:24}.zIndex-n24{z-index:96}.zIndex-25{z-index:25}.zIndex-n25{z-index:100}.zIndex-26{z-index:26}.zIndex-n26{z-index:104}.text-overflow{width:100%;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-overflow-1{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:1;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-2{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-3{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-4{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:4;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-delete{text-decoration:line-through}.text-underline{text-decoration:underline}.text-size-xxs{font-size:20rpx}.text-size-xs{font-size:22rpx}.text-size-s{font-size:24rpx}.text-size-m{font-size:28rpx}.text-size-n{font-size:30rpx}.text-size-g{font-size:34rpx}.text-size-lg{font-size:36rpx}.text-size-xl{font-size:40rpx}.text-weight-s{font-weight:100}.text-weight-n{font-weight:400}.text-weight-b{font-weight:700}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-align-center{text-align:center}.round-tl-0{border-top-left-radius:0rpx!important}.round-tl-1{border-top-left-radius:4rpx!important}.round-tl-2{border-top-left-radius:8rpx!important}.round-tl-3{border-top-left-radius:12rpx!important}.round-tl-4{border-top-left-radius:16rpx!important}.round-tl-5{border-top-left-radius:20rpx!important}.round-tl-6{border-top-left-radius:24rpx!important}.round-tl-7{border-top-left-radius:28rpx!important}.round-tl-8{border-top-left-radius:32rpx!important}.round-tl-9{border-top-left-radius:36rpx!important}.round-tl-10{border-top-left-radius:40rpx!important}.round-tl-11{border-top-left-radius:44rpx!important}.round-tl-12{border-top-left-radius:48rpx!important}.round-tl-13{border-top-left-radius:52rpx!important}.round-tl-14{border-top-left-radius:56rpx!important}.round-tl-15{border-top-left-radius:60rpx!important}.round-tl-16{border-top-left-radius:64rpx!important}.round-tl-17{border-top-left-radius:68rpx!important}.round-tl-18{border-top-left-radius:72rpx!important}.round-tl-19{border-top-left-radius:76rpx!important}.round-tl-20{border-top-left-radius:80rpx!important}.round-tl-21{border-top-left-radius:84rpx!important}.round-tl-22{border-top-left-radius:88rpx!important}.round-tl-23{border-top-left-radius:92rpx!important}.round-tl-24{border-top-left-radius:96rpx!important}.round-tl-25{border-top-left-radius:100rpx!important}.round-tr-0{border-top-right-radius:0rpx!important}.round-tr-1{border-top-right-radius:4rpx!important}.round-tr-2{border-top-right-radius:8rpx!important}.round-tr-3{border-top-right-radius:12rpx!important}.round-tr-4{border-top-right-radius:16rpx!important}.round-tr-5{border-top-right-radius:20rpx!important}.round-tr-6{border-top-right-radius:24rpx!important}.round-tr-7{border-top-right-radius:28rpx!important}.round-tr-8{border-top-right-radius:32rpx!important}.round-tr-9{border-top-right-radius:36rpx!important}.round-tr-10{border-top-right-radius:40rpx!important}.round-tr-11{border-top-right-radius:44rpx!important}.round-tr-12{border-top-right-radius:48rpx!important}.round-tr-13{border-top-right-radius:52rpx!important}.round-tr-14{border-top-right-radius:56rpx!important}.round-tr-15{border-top-right-radius:60rpx!important}.round-tr-16{border-top-right-radius:64rpx!important}.round-tr-17{border-top-right-radius:68rpx!important}.round-tr-18{border-top-right-radius:72rpx!important}.round-tr-19{border-top-right-radius:76rpx!important}.round-tr-20{border-top-right-radius:80rpx!important}.round-tr-21{border-top-right-radius:84rpx!important}.round-tr-22{border-top-right-radius:88rpx!important}.round-tr-23{border-top-right-radius:92rpx!important}.round-tr-24{border-top-right-radius:96rpx!important}.round-tr-25{border-top-right-radius:100rpx!important}.round-bl-0{border-bottom-left-radius:0rpx!important}.round-bl-1{border-bottom-left-radius:4rpx!important}.round-bl-2{border-bottom-left-radius:8rpx!important}.round-bl-3{border-bottom-left-radius:12rpx!important}.round-bl-4{border-bottom-left-radius:16rpx!important}.round-bl-5{border-bottom-left-radius:20rpx!important}.round-bl-6{border-bottom-left-radius:24rpx!important}.round-bl-7{border-bottom-left-radius:28rpx!important}.round-bl-8{border-bottom-left-radius:32rpx!important}.round-bl-9{border-bottom-left-radius:36rpx!important}.round-bl-10{border-bottom-left-radius:40rpx!important}.round-bl-11{border-bottom-left-radius:44rpx!important}.round-bl-12{border-bottom-left-radius:48rpx!important}.round-bl-13{border-bottom-left-radius:52rpx!important}.round-bl-14{border-bottom-left-radius:56rpx!important}.round-bl-15{border-bottom-left-radius:60rpx!important}.round-bl-16{border-bottom-left-radius:64rpx!important}.round-bl-17{border-bottom-left-radius:68rpx!important}.round-bl-18{border-bottom-left-radius:72rpx!important}.round-bl-19{border-bottom-left-radius:76rpx!important}.round-bl-20{border-bottom-left-radius:80rpx!important}.round-bl-21{border-bottom-left-radius:84rpx!important}.round-bl-22{border-bottom-left-radius:88rpx!important}.round-bl-23{border-bottom-left-radius:92rpx!important}.round-bl-24{border-bottom-left-radius:96rpx!important}.round-bl-25{border-bottom-left-radius:100rpx!important}.round-br-0{border-bottom-right-radius:0rpx!important}.round-br-1{border-bottom-right-radius:4rpx!important}.round-br-2{border-bottom-right-radius:8rpx!important}.round-br-3{border-bottom-right-radius:12rpx!important}.round-br-4{border-bottom-right-radius:16rpx!important}.round-br-5{border-bottom-right-radius:20rpx!important}.round-br-6{border-bottom-right-radius:24rpx!important}.round-br-7{border-bottom-right-radius:28rpx!important}.round-br-8{border-bottom-right-radius:32rpx!important}.round-br-9{border-bottom-right-radius:36rpx!important}.round-br-10{border-bottom-right-radius:40rpx!important}.round-br-11{border-bottom-right-radius:44rpx!important}.round-br-12{border-bottom-right-radius:48rpx!important}.round-br-13{border-bottom-right-radius:52rpx!important}.round-br-14{border-bottom-right-radius:56rpx!important}.round-br-15{border-bottom-right-radius:60rpx!important}.round-br-16{border-bottom-right-radius:64rpx!important}.round-br-17{border-bottom-right-radius:68rpx!important}.round-br-18{border-bottom-right-radius:72rpx!important}.round-br-19{border-bottom-right-radius:76rpx!important}.round-br-20{border-bottom-right-radius:80rpx!important}.round-br-21{border-bottom-right-radius:84rpx!important}.round-br-22{border-bottom-right-radius:88rpx!important}.round-br-23{border-bottom-right-radius:92rpx!important}.round-br-24{border-bottom-right-radius:96rpx!important}.round-br-25{border-bottom-right-radius:100rpx!important}.round-a-0{border-radius:0rpx!important}.round-a-1{border-radius:4rpx!important}.round-a-2{border-radius:8rpx!important}.round-a-3{border-radius:12rpx!important}.round-a-4{border-radius:16rpx!important}.round-a-5{border-radius:20rpx!important}.round-a-6{border-radius:24rpx!important}.round-a-7{border-radius:28rpx!important}.round-a-8{border-radius:32rpx!important}.round-a-9{border-radius:36rpx!important}.round-a-10{border-radius:40rpx!important}.round-a-11{border-radius:44rpx!important}.round-a-12{border-radius:48rpx!important}.round-a-13{border-radius:52rpx!important}.round-a-14{border-radius:56rpx!important}.round-a-15{border-radius:60rpx!important}.round-a-16{border-radius:64rpx!important}.round-a-17{border-radius:68rpx!important}.round-a-18{border-radius:72rpx!important}.round-a-19{border-radius:76rpx!important}.round-a-20{border-radius:80rpx!important}.round-a-21{border-radius:84rpx!important}.round-a-22{border-radius:88rpx!important}.round-a-23{border-radius:92rpx!important}.round-a-24{border-radius:96rpx!important}.round-a-25{border-radius:100rpx!important}.round-t-0{border-top-left-radius:0rpx!important;border-top-right-radius:0rpx!important}.round-t-1{border-top-left-radius:4rpx!important;border-top-right-radius:4rpx!important}.round-t-2{border-top-left-radius:8rpx!important;border-top-right-radius:8rpx!important}.round-t-3{border-top-left-radius:12rpx!important;border-top-right-radius:12rpx!important}.round-t-4{border-top-left-radius:16rpx!important;border-top-right-radius:16rpx!important}.round-t-5{border-top-left-radius:20rpx!important;border-top-right-radius:20rpx!important}.round-t-6{border-top-left-radius:24rpx!important;border-top-right-radius:24rpx!important}.round-t-7{border-top-left-radius:28rpx!important;border-top-right-radius:28rpx!important}.round-t-8{border-top-left-radius:32rpx!important;border-top-right-radius:32rpx!important}.round-t-9{border-top-left-radius:36rpx!important;border-top-right-radius:36rpx!important}.round-t-10{border-top-left-radius:40rpx!important;border-top-right-radius:40rpx!important}.round-t-11{border-top-left-radius:44rpx!important;border-top-right-radius:44rpx!important}.round-t-12{border-top-left-radius:48rpx!important;border-top-right-radius:48rpx!important}.round-t-13{border-top-left-radius:52rpx!important;border-top-right-radius:52rpx!important}.round-t-14{border-top-left-radius:56rpx!important;border-top-right-radius:56rpx!important}.round-t-15{border-top-left-radius:60rpx!important;border-top-right-radius:60rpx!important}.round-t-16{border-top-left-radius:64rpx!important;border-top-right-radius:64rpx!important}.round-t-17{border-top-left-radius:68rpx!important;border-top-right-radius:68rpx!important}.round-t-18{border-top-left-radius:72rpx!important;border-top-right-radius:72rpx!important}.round-t-19{border-top-left-radius:76rpx!important;border-top-right-radius:76rpx!important}.round-t-20{border-top-left-radius:80rpx!important;border-top-right-radius:80rpx!important}.round-t-21{border-top-left-radius:84rpx!important;border-top-right-radius:84rpx!important}.round-t-22{border-top-left-radius:88rpx!important;border-top-right-radius:88rpx!important}.round-t-23{border-top-left-radius:92rpx!important;border-top-right-radius:92rpx!important}.round-t-24{border-top-left-radius:96rpx!important;border-top-right-radius:96rpx!important}.round-t-25{border-top-left-radius:100rpx!important;border-top-right-radius:100rpx!important}.round-b-0{border-bottom-left-radius:0rpx!important;border-bottom-right-radius:0rpx!important}.round-b-1{border-bottom-left-radius:4rpx!important;border-bottom-right-radius:4rpx!important}.round-b-2{border-bottom-left-radius:8rpx!important;border-bottom-right-radius:8rpx!important}.round-b-3{border-bottom-left-radius:12rpx!important;border-bottom-right-radius:12rpx!important}.round-b-4{border-bottom-left-radius:16rpx!important;border-bottom-right-radius:16rpx!important}.round-b-5{border-bottom-left-radius:20rpx!important;border-bottom-right-radius:20rpx!important}.round-b-6{border-bottom-left-radius:24rpx!important;border-bottom-right-radius:24rpx!important}.round-b-7{border-bottom-left-radius:28rpx!important;border-bottom-right-radius:28rpx!important}.round-b-8{border-bottom-left-radius:32rpx!important;border-bottom-right-radius:32rpx!important}.round-b-9{border-bottom-left-radius:36rpx!important;border-bottom-right-radius:36rpx!important}.round-b-10{border-bottom-left-radius:40rpx!important;border-bottom-right-radius:40rpx!important}.round-b-11{border-bottom-left-radius:44rpx!important;border-bottom-right-radius:44rpx!important}.round-b-12{border-bottom-left-radius:48rpx!important;border-bottom-right-radius:48rpx!important}.round-b-13{border-bottom-left-radius:52rpx!important;border-bottom-right-radius:52rpx!important}.round-b-14{border-bottom-left-radius:56rpx!important;border-bottom-right-radius:56rpx!important}.round-b-15{border-bottom-left-radius:60rpx!important;border-bottom-right-radius:60rpx!important}.round-b-16{border-bottom-left-radius:64rpx!important;border-bottom-right-radius:64rpx!important}.round-b-17{border-bottom-left-radius:68rpx!important;border-bottom-right-radius:68rpx!important}.round-b-18{border-bottom-left-radius:72rpx!important;border-bottom-right-radius:72rpx!important}.round-b-19{border-bottom-left-radius:76rpx!important;border-bottom-right-radius:76rpx!important}.round-b-20{border-bottom-left-radius:80rpx!important;border-bottom-right-radius:80rpx!important}.round-b-21{border-bottom-left-radius:84rpx!important;border-bottom-right-radius:84rpx!important}.round-b-22{border-bottom-left-radius:88rpx!important;border-bottom-right-radius:88rpx!important}.round-b-23{border-bottom-left-radius:92rpx!important;border-bottom-right-radius:92rpx!important}.round-b-24{border-bottom-left-radius:96rpx!important;border-bottom-right-radius:96rpx!important}.round-b-25{border-bottom-left-radius:100rpx!important;border-bottom-right-radius:100rpx!important}.round-l-0{border-top-left-radius:0rpx!important;border-bottom-left-radius:0rpx!important}.round-l-1{border-top-left-radius:4rpx!important;border-bottom-left-radius:4rpx!important}.round-l-2{border-top-left-radius:8rpx!important;border-bottom-left-radius:8rpx!important}.round-l-3{border-top-left-radius:12rpx!important;border-bottom-left-radius:12rpx!important}.round-l-4{border-top-left-radius:16rpx!important;border-bottom-left-radius:16rpx!important}.round-l-5{border-top-left-radius:20rpx!important;border-bottom-left-radius:20rpx!important}.round-l-6{border-top-left-radius:24rpx!important;border-bottom-left-radius:24rpx!important}.round-l-7{border-top-left-radius:28rpx!important;border-bottom-left-radius:28rpx!important}.round-l-8{border-top-left-radius:32rpx!important;border-bottom-left-radius:32rpx!important}.round-l-9{border-top-left-radius:36rpx!important;border-bottom-left-radius:36rpx!important}.round-l-10{border-top-left-radius:40rpx!important;border-bottom-left-radius:40rpx!important}.round-l-11{border-top-left-radius:44rpx!important;border-bottom-left-radius:44rpx!important}.round-l-12{border-top-left-radius:48rpx!important;border-bottom-left-radius:48rpx!important}.round-l-13{border-top-left-radius:52rpx!important;border-bottom-left-radius:52rpx!important}.round-l-14{border-top-left-radius:56rpx!important;border-bottom-left-radius:56rpx!important}.round-l-15{border-top-left-radius:60rpx!important;border-bottom-left-radius:60rpx!important}.round-l-16{border-top-left-radius:64rpx!important;border-bottom-left-radius:64rpx!important}.round-l-17{border-top-left-radius:68rpx!important;border-bottom-left-radius:68rpx!important}.round-l-18{border-top-left-radius:72rpx!important;border-bottom-left-radius:72rpx!important}.round-l-19{border-top-left-radius:76rpx!important;border-bottom-left-radius:76rpx!important}.round-l-20{border-top-left-radius:80rpx!important;border-bottom-left-radius:80rpx!important}.round-l-21{border-top-left-radius:84rpx!important;border-bottom-left-radius:84rpx!important}.round-l-22{border-top-left-radius:88rpx!important;border-bottom-left-radius:88rpx!important}.round-l-23{border-top-left-radius:92rpx!important;border-bottom-left-radius:92rpx!important}.round-l-24{border-top-left-radius:96rpx!important;border-bottom-left-radius:96rpx!important}.round-l-25{border-top-left-radius:100rpx!important;border-bottom-left-radius:100rpx!important}.round-r-0{border-top-right-radius:0rpx!important;border-bottom-right-radius:0rpx!important}.round-r-1{border-top-right-radius:4rpx!important;border-bottom-right-radius:4rpx!important}.round-r-2{border-top-right-radius:8rpx!important;border-bottom-right-radius:8rpx!important}.round-r-3{border-top-right-radius:12rpx!important;border-bottom-right-radius:12rpx!important}.round-r-4{border-top-right-radius:16rpx!important;border-bottom-right-radius:16rpx!important}.round-r-5{border-top-right-radius:20rpx!important;border-bottom-right-radius:20rpx!important}.round-r-6{border-top-right-radius:24rpx!important;border-bottom-right-radius:24rpx!important}.round-r-7{border-top-right-radius:28rpx!important;border-bottom-right-radius:28rpx!important}.round-r-8{border-top-right-radius:32rpx!important;border-bottom-right-radius:32rpx!important}.round-r-9{border-top-right-radius:36rpx!important;border-bottom-right-radius:36rpx!important}.round-r-10{border-top-right-radius:40rpx!important;border-bottom-right-radius:40rpx!important}.round-r-11{border-top-right-radius:44rpx!important;border-bottom-right-radius:44rpx!important}.round-r-12{border-top-right-radius:48rpx!important;border-bottom-right-radius:48rpx!important}.round-r-13{border-top-right-radius:52rpx!important;border-bottom-right-radius:52rpx!important}.round-r-14{border-top-right-radius:56rpx!important;border-bottom-right-radius:56rpx!important}.round-r-15{border-top-right-radius:60rpx!important;border-bottom-right-radius:60rpx!important}.round-r-16{border-top-right-radius:64rpx!important;border-bottom-right-radius:64rpx!important}.round-r-17{border-top-right-radius:68rpx!important;border-bottom-right-radius:68rpx!important}.round-r-18{border-top-right-radius:72rpx!important;border-bottom-right-radius:72rpx!important}.round-r-19{border-top-right-radius:76rpx!important;border-bottom-right-radius:76rpx!important}.round-r-20{border-top-right-radius:80rpx!important;border-bottom-right-radius:80rpx!important}.round-r-21{border-top-right-radius:84rpx!important;border-bottom-right-radius:84rpx!important}.round-r-22{border-top-right-radius:88rpx!important;border-bottom-right-radius:88rpx!important}.round-r-23{border-top-right-radius:92rpx!important;border-bottom-right-radius:92rpx!important}.round-r-24{border-top-right-radius:96rpx!important;border-bottom-right-radius:96rpx!important}.round-r-25{border-top-right-radius:100rpx!important;border-bottom-right-radius:100rpx!important}.round-0{border-radius:0rpx}.round-1{border-radius:4rpx}.round-2{border-radius:8rpx}.round-3{border-radius:12rpx}.round-4{border-radius:16rpx}.round-5{border-radius:20rpx}.round-6{border-radius:24rpx}.round-7{border-radius:28rpx}.round-8{border-radius:32rpx}.round-9{border-radius:36rpx}.round-10{border-radius:40rpx}.round-11{border-radius:44rpx}.round-12{border-radius:48rpx}.round-13{border-radius:52rpx}.round-14{border-radius:56rpx}.round-15{border-radius:60rpx}.round-16{border-radius:64rpx}.round-17{border-radius:68rpx}.round-18{border-radius:72rpx}.round-19{border-radius:76rpx}.round-20{border-radius:80rpx}.round-21{border-radius:84rpx}.round-22{border-radius:88rpx}.round-23{border-radius:92rpx}.round-24{border-radius:96rpx}.round-25{border-radius:100rpx}.round-26{border-radius:104rpx}.rounded{border-radius:50%!important}.opacity-0{opacity:0}.opacity-1{opacity:.1}.opacity-2{opacity:.2}.opacity-3{opacity:.3}.opacity-4{opacity:.4}.opacity-5{opacity:.5}.opacity-6{opacity:.6}.opacity-7{opacity:.7}.opacity-8{opacity:.8}.opacity-9{opacity:.9}.opacity-10{opacity:1}.shadow{box-shadow:0 2rpx 12rpx rgba(0,0,0,.08)}.shadow-0{box-shadow:0 0rpx 10rpx rgba(0,0,0,.08)}.shadow-1{box-shadow:0 2rpx 12rpx rgba(0,0,0,.08)}.shadow-2{box-shadow:0 4rpx 14rpx rgba(0,0,0,.08)}.shadow-3{box-shadow:0 6rpx 16rpx rgba(0,0,0,.08)}.shadow-4{box-shadow:0 8rpx 18rpx rgba(0,0,0,.08)}.shadow-5{box-shadow:0 10rpx 20rpx rgba(0,0,0,.08)}.shadow-6{box-shadow:0 12rpx 22rpx rgba(0,0,0,.08)}.shadow-7{box-shadow:0 14rpx 24rpx rgba(0,0,0,.08)}.shadow-8{box-shadow:0 16rpx 26rpx rgba(0,0,0,.08)}.shadow-9{box-shadow:0 18rpx 28rpx rgba(0,0,0,.08)}.shadow-10{box-shadow:0 20rpx 30rpx rgba(0,0,0,.08)}.shadow-11{box-shadow:0 22rpx 32rpx rgba(0,0,0,.08)}.shadow-12{box-shadow:0 24rpx 34rpx rgba(0,0,0,.08)}.shadow-13{box-shadow:0 26rpx 36rpx rgba(0,0,0,.08)}.shadow-14{box-shadow:0 28rpx 38rpx rgba(0,0,0,.08)}.shadow-15{box-shadow:0 30rpx 40rpx rgba(0,0,0,.08)}.shadow-16{box-shadow:0 32rpx 42rpx rgba(0,0,0,.08)}.shadow-17{box-shadow:0 34rpx 44rpx rgba(0,0,0,.08)}.shadow-18{box-shadow:0 36rpx 46rpx rgba(0,0,0,.08)}.shadow-19{box-shadow:0 38rpx 48rpx rgba(0,0,0,.08)}.shadow-20{box-shadow:0 40rpx 50rpx rgba(0,0,0,.08)}.shadow-21{box-shadow:0 42rpx 52rpx rgba(0,0,0,.08)}.shadow-22{box-shadow:0 44rpx 54rpx rgba(0,0,0,.08)}.shadow-23{box-shadow:0 46rpx 56rpx rgba(0,0,0,.08)}.shadow-24{box-shadow:0 48rpx 58rpx rgba(0,0,0,.08)}.shadow-25{box-shadow:0 50rpx 60rpx rgba(0,0,0,.08)}.border-0{border:solid 0rpx #f5f5f5!important}.border-0-bk{border:solid 0rpx #282828!important}.border{border:solid 2rpx #f5f5f5!important}.border-bk{border:solid 2rpx #282828!important}.border-1{border:solid 2px #f5f5f5!important}.border-1-bk{border:solid 2px #f5f5f5!important}.border-2{border:solid 4px #f5f5f5!important}.border-2-bk{border:solid 4px #f5f5f5!important}.border-3{border:solid 6px #f5f5f5!important}.border-3-bk{border:solid 6px #f5f5f5!important}.border-4{border:solid 8px #f5f5f5!important}.border-4-bk{border:solid 8px #f5f5f5!important}.border-5{border:solid 10px #f5f5f5!important}.border-5-bk{border:solid 10px #f5f5f5!important}.border-l-1{border-left:solid 2rpx #f5f5f5!important}.border-l-1-bk{border-left:solid 2rpx #282828!important}.border-l-2{border-left:solid 4rpx #f5f5f5!important}.border-l-2-bk{border-left:solid 4rpx #282828!important}.border-l-3{border-left:solid 6rpx #f5f5f5!important}.border-l-3-bk{border-left:solid 6rpx #282828!important}.border-l-4{border-left:solid 8rpx #f5f5f5!important}.border-l-4-bk{border-left:solid 8rpx #282828!important}.border-l-5{border-left:solid 10rpx #f5f5f5!important}.border-l-5-bk{border-left:solid 10rpx #282828!important}.border-r-1{border-right:solid 2rpx #f5f5f5!important}.border-r-1-bk{border-right:solid 2rpx #282828!important}.border-r-2{border-right:solid 4rpx #f5f5f5!important}.border-r-2-bk{border-right:solid 4rpx #282828!important}.border-r-3{border-right:solid 6rpx #f5f5f5!important}.border-r-3-bk{border-right:solid 6rpx #282828!important}.border-r-4{border-right:solid 8rpx #f5f5f5!important}.border-r-4-bk{border-right:solid 8rpx #282828!important}.border-r-5{border-right:solid 10rpx #f5f5f5!important}.border-r-5-bk{border-right:solid 10rpx #282828!important}.border-t-1{border-top:solid 2rpx #f5f5f5!important}.border-t-1-bk{border-top:solid 2rpx #282828!important}.border-t-2{border-top:solid 4rpx #f5f5f5!important}.border-t-2-bk{border-top:solid 4rpx #282828!important}.border-t-3{border-top:solid 6rpx #f5f5f5!important}.border-t-3-bk{border-top:solid 6rpx #282828!important}.border-t-4{border-top:solid 8rpx #f5f5f5!important}.border-t-4-bk{border-top:solid 8rpx #282828!important}.border-t-5{border-top:solid 10rpx #f5f5f5!important}.border-t-5-bk{border-top:solid 10rpx #282828!important}.border-b-1{border-bottom:solid 2rpx #f5f5f5!important}.border-b-1-bk{border-bottom:solid 2rpx #282828!important}.border-b-2{border-bottom:solid 4rpx #f5f5f5!important}.border-b-2-bk{border-bottom:solid 4rpx #282828!important}.border-b-3{border-bottom:solid 6rpx #f5f5f5!important}.border-b-3-bk{border-bottom:solid 6rpx #282828!important}.border-b-4{border-bottom:solid 8rpx #f5f5f5!important}.border-b-4-bk{border-bottom:solid 8rpx #282828!important}.border-b-5{border-bottom:solid 10rpx #f5f5f5!important}.border-b-5-bk{border-bottom:solid 10rpx #282828!important}.border-a-1{border:solid 2rpx #f5f5f5!important}.border-a-1-bk{border:solid 2rpx #282828!important}.border-a-2{border:solid 4rpx #f5f5f5!important}.border-a-2-bk{border:solid 4rpx #282828!important}.border-a-3{border:solid 6rpx #f5f5f5!important}.border-a-3-bk{border:solid 6rpx #282828!important}.border-a-4{border:solid 8rpx #f5f5f5!important}.border-a-4-bk{border:solid 8rpx #282828!important}.border-a-5{border:solid 10rpx #f5f5f5!important}.border-a-5-bk{border:solid 10rpx #282828!important}.pa-0{padding:0rpx}.pa-1{padding:1rpx}.pa-2{padding:2rpx}.pa-3{padding:3rpx}.pa-4{padding:4rpx}.pa-5{padding:5rpx}.pa-6{padding:6rpx}.pa-7{padding:7rpx}.pa-8{padding:8rpx}.pa-9{padding:9rpx}.pa-10{padding:10rpx}.pa-11{padding:11rpx}.pa-12{padding:12rpx}.pa-13{padding:13rpx}.pa-14{padding:14rpx}.pa-15{padding:15rpx}.pa-16{padding:16rpx}.pa-17{padding:17rpx}.pa-18{padding:18rpx}.pa-19{padding:19rpx}.pa-20{padding:20rpx}.pa-21{padding:21rpx}.pa-22{padding:22rpx}.pa-23{padding:23rpx}.pa-24{padding:24rpx}.pa-25{padding:25rpx}.pa-n1{padding:4rpx}.pa-n2{padding:8rpx}.pa-n3{padding:12rpx}.pa-n4{padding:16rpx}.pa-n5{padding:20rpx}.pa-n6{padding:24rpx}.pa-n7{padding:28rpx}.pa-n8{padding:32rpx}.pa-n9{padding:36rpx}.pa-n10{padding:40rpx}.pa-n11{padding:44rpx}.pa-n12{padding:48rpx}.pa-n13{padding:52rpx}.pa-n14{padding:56rpx}.pa-n15{padding:60rpx}.pa-n16{padding:64rpx}.pa-n17{padding:68rpx}.pa-n18{padding:72rpx}.pa-n19{padding:76rpx}.pa-n20{padding:80rpx}.pa-n21{padding:84rpx}.pa-n22{padding:88rpx}.pa-n23{padding:92rpx}.pa-n24{padding:96rpx}.pa-n25{padding:100rpx}.pt-0{padding-top:0rpx}.pt-1{padding-top:1rpx}.pt-2{padding-top:2rpx}.pt-3{padding-top:3rpx}.pt-4{padding-top:4rpx}.pt-5{padding-top:5rpx}.pt-6{padding-top:6rpx}.pt-7{padding-top:7rpx}.pt-8{padding-top:8rpx}.pt-9{padding-top:9rpx}.pt-10{padding-top:10rpx}.pt-11{padding-top:11rpx}.pt-12{padding-top:12rpx}.pt-13{padding-top:13rpx}.pt-14{padding-top:14rpx}.pt-15{padding-top:15rpx}.pt-16{padding-top:16rpx}.pt-17{padding-top:17rpx}.pt-18{padding-top:18rpx}.pt-19{padding-top:19rpx}.pt-20{padding-top:20rpx}.pt-21{padding-top:21rpx}.pt-22{padding-top:22rpx}.pt-23{padding-top:23rpx}.pt-24{padding-top:24rpx}.pt-25{padding-top:25rpx}.pt-n1{padding-top:4rpx}.pt-n2{padding-top:8rpx}.pt-n3{padding-top:12rpx}.pt-n4{padding-top:16rpx}.pt-n5{padding-top:20rpx}.pt-n6{padding-top:24rpx}.pt-n7{padding-top:28rpx}.pt-n8{padding-top:32rpx}.pt-n9{padding-top:36rpx}.pt-n10{padding-top:40rpx}.pt-n11{padding-top:44rpx}.pt-n12{padding-top:48rpx}.pt-n13{padding-top:52rpx}.pt-n14{padding-top:56rpx}.pt-n15{padding-top:60rpx}.pt-n16{padding-top:64rpx}.pt-n17{padding-top:68rpx}.pt-n18{padding-top:72rpx}.pt-n19{padding-top:76rpx}.pt-n20{padding-top:80rpx}.pt-n21{padding-top:84rpx}.pt-n22{padding-top:88rpx}.pt-n23{padding-top:92rpx}.pt-n24{padding-top:96rpx}.pt-n25{padding-top:100rpx}.pr-0{padding-right:0rpx}.pr-1{padding-right:1rpx}.pr-2{padding-right:2rpx}.pr-3{padding-right:3rpx}.pr-4{padding-right:4rpx}.pr-5{padding-right:5rpx}.pr-6{padding-right:6rpx}.pr-7{padding-right:7rpx}.pr-8{padding-right:8rpx}.pr-9{padding-right:9rpx}.pr-10{padding-right:10rpx}.pr-11{padding-right:11rpx}.pr-12{padding-right:12rpx}.pr-13{padding-right:13rpx}.pr-14{padding-right:14rpx}.pr-15{padding-right:15rpx}.pr-16{padding-right:16rpx}.pr-17{padding-right:17rpx}.pr-18{padding-right:18rpx}.pr-19{padding-right:19rpx}.pr-20{padding-right:20rpx}.pr-21{padding-right:21rpx}.pr-22{padding-right:22rpx}.pr-23{padding-right:23rpx}.pr-24{padding-right:24rpx}.pr-25{padding-right:25rpx}.pr-n1{padding-right:4rpx}.pr-n2{padding-right:8rpx}.pr-n3{padding-right:12rpx}.pr-n4{padding-right:16rpx}.pr-n5{padding-right:20rpx}.pr-n6{padding-right:24rpx}.pr-n7{padding-right:28rpx}.pr-n8{padding-right:32rpx}.pr-n9{padding-right:36rpx}.pr-n10{padding-right:40rpx}.pr-n11{padding-right:44rpx}.pr-n12{padding-right:48rpx}.pr-n13{padding-right:52rpx}.pr-n14{padding-right:56rpx}.pr-n15{padding-right:60rpx}.pr-n16{padding-right:64rpx}.pr-n17{padding-right:68rpx}.pr-n18{padding-right:72rpx}.pr-n19{padding-right:76rpx}.pr-n20{padding-right:80rpx}.pr-n21{padding-right:84rpx}.pr-n22{padding-right:88rpx}.pr-n23{padding-right:92rpx}.pr-n24{padding-right:96rpx}.pr-n25{padding-right:100rpx}.pb-0{padding-bottom:0rpx}.pb-1{padding-bottom:1rpx}.pb-2{padding-bottom:2rpx}.pb-3{padding-bottom:3rpx}.pb-4{padding-bottom:4rpx}.pb-5{padding-bottom:5rpx}.pb-6{padding-bottom:6rpx}.pb-7{padding-bottom:7rpx}.pb-8{padding-bottom:8rpx}.pb-9{padding-bottom:9rpx}.pb-10{padding-bottom:10rpx}.pb-11{padding-bottom:11rpx}.pb-12{padding-bottom:12rpx}.pb-13{padding-bottom:13rpx}.pb-14{padding-bottom:14rpx}.pb-15{padding-bottom:15rpx}.pb-16{padding-bottom:16rpx}.pb-17{padding-bottom:17rpx}.pb-18{padding-bottom:18rpx}.pb-19{padding-bottom:19rpx}.pb-20{padding-bottom:20rpx}.pb-21{padding-bottom:21rpx}.pb-22{padding-bottom:22rpx}.pb-23{padding-bottom:23rpx}.pb-24{padding-bottom:24rpx}.pb-25{padding-bottom:25rpx}.pb-n1{padding-bottom:4rpx}.pb-n2{padding-bottom:8rpx}.pb-n3{padding-bottom:12rpx}.pb-n4{padding-bottom:16rpx}.pb-n5{padding-bottom:20rpx}.pb-n6{padding-bottom:24rpx}.pb-n7{padding-bottom:28rpx}.pb-n8{padding-bottom:32rpx}.pb-n9{padding-bottom:36rpx}.pb-n10{padding-bottom:40rpx}.pb-n11{padding-bottom:44rpx}.pb-n12{padding-bottom:48rpx}.pb-n13{padding-bottom:52rpx}.pb-n14{padding-bottom:56rpx}.pb-n15{padding-bottom:60rpx}.pb-n16{padding-bottom:64rpx}.pb-n17{padding-bottom:68rpx}.pb-n18{padding-bottom:72rpx}.pb-n19{padding-bottom:76rpx}.pb-n20{padding-bottom:80rpx}.pb-n21{padding-bottom:84rpx}.pb-n22{padding-bottom:88rpx}.pb-n23{padding-bottom:92rpx}.pb-n24{padding-bottom:96rpx}.pb-n25{padding-bottom:100rpx}.pl-0{padding-left:0rpx}.pl-1{padding-left:1rpx}.pl-2{padding-left:2rpx}.pl-3{padding-left:3rpx}.pl-4{padding-left:4rpx}.pl-5{padding-left:5rpx}.pl-6{padding-left:6rpx}.pl-7{padding-left:7rpx}.pl-8{padding-left:8rpx}.pl-9{padding-left:9rpx}.pl-10{padding-left:10rpx}.pl-11{padding-left:11rpx}.pl-12{padding-left:12rpx}.pl-13{padding-left:13rpx}.pl-14{padding-left:14rpx}.pl-15{padding-left:15rpx}.pl-16{padding-left:16rpx}.pl-17{padding-left:17rpx}.pl-18{padding-left:18rpx}.pl-19{padding-left:19rpx}.pl-20{padding-left:20rpx}.pl-21{padding-left:21rpx}.pl-22{padding-left:22rpx}.pl-23{padding-left:23rpx}.pl-24{padding-left:24rpx}.pl-25{padding-left:25rpx}.pl-n1{padding-left:4rpx}.pl-n2{padding-left:8rpx}.pl-n3{padding-left:12rpx}.pl-n4{padding-left:16rpx}.pl-n5{padding-left:20rpx}.pl-n6{padding-left:24rpx}.pl-n7{padding-left:28rpx}.pl-n8{padding-left:32rpx}.pl-n9{padding-left:36rpx}.pl-n10{padding-left:40rpx}.pl-n11{padding-left:44rpx}.pl-n12{padding-left:48rpx}.pl-n13{padding-left:52rpx}.pl-n14{padding-left:56rpx}.pl-n15{padding-left:60rpx}.pl-n16{padding-left:64rpx}.pl-n17{padding-left:68rpx}.pl-n18{padding-left:72rpx}.pl-n19{padding-left:76rpx}.pl-n20{padding-left:80rpx}.pl-n21{padding-left:84rpx}.pl-n22{padding-left:88rpx}.pl-n23{padding-left:92rpx}.pl-n24{padding-left:96rpx}.pl-n25{padding-left:100rpx}.px-0{padding-left:0rpx;padding-right:0rpx}.px-1{padding-left:1rpx;padding-right:1rpx}.px-2{padding-left:2rpx;padding-right:2rpx}.px-3{padding-left:3rpx;padding-right:3rpx}.px-4{padding-left:4rpx;padding-right:4rpx}.px-5{padding-left:5rpx;padding-right:5rpx}.px-6{padding-left:6rpx;padding-right:6rpx}.px-7{padding-left:7rpx;padding-right:7rpx}.px-8{padding-left:8rpx;padding-right:8rpx}.px-9{padding-left:9rpx;padding-right:9rpx}.px-10{padding-left:10rpx;padding-right:10rpx}.px-11{padding-left:11rpx;padding-right:11rpx}.px-12{padding-left:12rpx;padding-right:12rpx}.px-13{padding-left:13rpx;padding-right:13rpx}.px-14{padding-left:14rpx;padding-right:14rpx}.px-15{padding-left:15rpx;padding-right:15rpx}.px-16{padding-left:16rpx;padding-right:16rpx}.px-17{padding-left:17rpx;padding-right:17rpx}.px-18{padding-left:18rpx;padding-right:18rpx}.px-19{padding-left:19rpx;padding-right:19rpx}.px-20{padding-left:20rpx;padding-right:20rpx}.px-21{padding-left:21rpx;padding-right:21rpx}.px-22{padding-left:22rpx;padding-right:22rpx}.px-23{padding-left:23rpx;padding-right:23rpx}.px-24{padding-left:24rpx;padding-right:24rpx}.px-25{padding-left:25rpx;padding-right:25rpx}.px-n1{padding-left:4rpx;padding-right:4rpx}.px-n2{padding-left:8rpx;padding-right:8rpx}.px-n3{padding-left:12rpx;padding-right:12rpx}.px-n4{padding-left:16rpx;padding-right:16rpx}.px-n5{padding-left:20rpx;padding-right:20rpx}.px-n6{padding-left:24rpx;padding-right:24rpx}.px-n7{padding-left:28rpx;padding-right:28rpx}.px-n8{padding-left:32rpx;padding-right:32rpx}.px-n9{padding-left:36rpx;padding-right:36rpx}.px-n10{padding-left:40rpx;padding-right:40rpx}.px-n11{padding-left:44rpx;padding-right:44rpx}.px-n12{padding-left:48rpx;padding-right:48rpx}.px-n13{padding-left:52rpx;padding-right:52rpx}.px-n14{padding-left:56rpx;padding-right:56rpx}.px-n15{padding-left:60rpx;padding-right:60rpx}.px-n16{padding-left:64rpx;padding-right:64rpx}.px-n17{padding-left:68rpx;padding-right:68rpx}.px-n18{padding-left:72rpx;padding-right:72rpx}.px-n19{padding-left:76rpx;padding-right:76rpx}.px-n20{padding-left:80rpx;padding-right:80rpx}.px-n21{padding-left:84rpx;padding-right:84rpx}.px-n22{padding-left:88rpx;padding-right:88rpx}.px-n23{padding-left:92rpx;padding-right:92rpx}.px-n24{padding-left:96rpx;padding-right:96rpx}.px-n25{padding-left:100rpx;padding-right:100rpx}.py-0{padding-top:0rpx;padding-bottom:0rpx}.py-1{padding-top:1rpx;padding-bottom:1rpx}.py-2{padding-top:2rpx;padding-bottom:2rpx}.py-3{padding-top:3rpx;padding-bottom:3rpx}.py-4{padding-top:4rpx;padding-bottom:4rpx}.py-5{padding-top:5rpx;padding-bottom:5rpx}.py-6{padding-top:6rpx;padding-bottom:6rpx}.py-7{padding-top:7rpx;padding-bottom:7rpx}.py-8{padding-top:8rpx;padding-bottom:8rpx}.py-9{padding-top:9rpx;padding-bottom:9rpx}.py-10{padding-top:10rpx;padding-bottom:10rpx}.py-11{padding-top:11rpx;padding-bottom:11rpx}.py-12{padding-top:12rpx;padding-bottom:12rpx}.py-13{padding-top:13rpx;padding-bottom:13rpx}.py-14{padding-top:14rpx;padding-bottom:14rpx}.py-15{padding-top:15rpx;padding-bottom:15rpx}.py-16{padding-top:16rpx;padding-bottom:16rpx}.py-17{padding-top:17rpx;padding-bottom:17rpx}.py-18{padding-top:18rpx;padding-bottom:18rpx}.py-19{padding-top:19rpx;padding-bottom:19rpx}.py-20{padding-top:20rpx;padding-bottom:20rpx}.py-21{padding-top:21rpx;padding-bottom:21rpx}.py-22{padding-top:22rpx;padding-bottom:22rpx}.py-23{padding-top:23rpx;padding-bottom:23rpx}.py-24{padding-top:24rpx;padding-bottom:24rpx}.py-25{padding-top:25rpx;padding-bottom:25rpx}.py-n1{padding-top:4rpx;padding-bottom:4rpx}.py-n2{padding-top:8rpx;padding-bottom:8rpx}.py-n3{padding-top:12rpx;padding-bottom:12rpx}.py-n4{padding-top:16rpx;padding-bottom:16rpx}.py-n5{padding-top:20rpx;padding-bottom:20rpx}.py-n6{padding-top:24rpx;padding-bottom:24rpx}.py-n7{padding-top:28rpx;padding-bottom:28rpx}.py-n8{padding-top:32rpx;padding-bottom:32rpx}.py-n9{padding-top:36rpx;padding-bottom:36rpx}.py-n10{padding-top:40rpx;padding-bottom:40rpx}.py-n11{padding-top:44rpx;padding-bottom:44rpx}.py-n12{padding-top:48rpx;padding-bottom:48rpx}.py-n13{padding-top:52rpx;padding-bottom:52rpx}.py-n14{padding-top:56rpx;padding-bottom:56rpx}.py-n15{padding-top:60rpx;padding-bottom:60rpx}.py-n16{padding-top:64rpx;padding-bottom:64rpx}.py-n17{padding-top:68rpx;padding-bottom:68rpx}.py-n18{padding-top:72rpx;padding-bottom:72rpx}.py-n19{padding-top:76rpx;padding-bottom:76rpx}.py-n20{padding-top:80rpx;padding-bottom:80rpx}.py-n21{padding-top:84rpx;padding-bottom:84rpx}.py-n22{padding-top:88rpx;padding-bottom:88rpx}.py-n23{padding-top:92rpx;padding-bottom:92rpx}.py-n24{padding-top:96rpx;padding-bottom:96rpx}.py-n25{padding-top:100rpx;padding-bottom:100rpx}.ma-0{margin:0rpx}.ma-1{margin:1rpx}.ma-2{margin:2rpx}.ma-3{margin:3rpx}.ma-4{margin:4rpx}.ma-5{margin:5rpx}.ma-6{margin:6rpx}.ma-7{margin:7rpx}.ma-8{margin:8rpx}.ma-9{margin:9rpx}.ma-10{margin:10rpx}.ma-11{margin:11rpx}.ma-12{margin:12rpx}.ma-13{margin:13rpx}.ma-14{margin:14rpx}.ma-15{margin:15rpx}.ma-16{margin:16rpx}.ma-17{margin:17rpx}.ma-18{margin:18rpx}.ma-19{margin:19rpx}.ma-20{margin:20rpx}.ma-21{margin:21rpx}.ma-22{margin:22rpx}.ma-23{margin:23rpx}.ma-24{margin:24rpx}.ma-25{margin:25rpx}.ma-n1{margin:4rpx}.ma-n2{margin:8rpx}.ma-n3{margin:12rpx}.ma-n4{margin:16rpx}.ma-n5{margin:20rpx}.ma-n6{margin:24rpx}.ma-n7{margin:28rpx}.ma-n8{margin:32rpx}.ma-n9{margin:36rpx}.ma-n10{margin:40rpx}.ma-n11{margin:44rpx}.ma-n12{margin:48rpx}.ma-n13{margin:52rpx}.ma-n14{margin:56rpx}.ma-n15{margin:60rpx}.ma-n16{margin:64rpx}.ma-n17{margin:68rpx}.ma-n18{margin:72rpx}.ma-n19{margin:76rpx}.ma-n20{margin:80rpx}.ma-n21{margin:84rpx}.ma-n22{margin:88rpx}.ma-n23{margin:92rpx}.ma-n24{margin:96rpx}.ma-n25{margin:100rpx}.mt-0{margin-top:0rpx}.mt--0{margin-top:0rpx}.mt-1{margin-top:1rpx}.mt--1{margin-top:-1rpx}.mt-2{margin-top:2rpx}.mt--2{margin-top:-2rpx}.mt-3{margin-top:3rpx}.mt--3{margin-top:-3rpx}.mt-4{margin-top:4rpx}.mt--4{margin-top:-4rpx}.mt-5{margin-top:5rpx}.mt--5{margin-top:-5rpx}.mt-6{margin-top:6rpx}.mt--6{margin-top:-6rpx}.mt-7{margin-top:7rpx}.mt--7{margin-top:-7rpx}.mt-8{margin-top:8rpx}.mt--8{margin-top:-8rpx}.mt-9{margin-top:9rpx}.mt--9{margin-top:-9rpx}.mt-10{margin-top:10rpx}.mt--10{margin-top:-10rpx}.mt-11{margin-top:11rpx}.mt--11{margin-top:-11rpx}.mt-12{margin-top:12rpx}.mt--12{margin-top:-12rpx}.mt-13{margin-top:13rpx}.mt--13{margin-top:-13rpx}.mt-14{margin-top:14rpx}.mt--14{margin-top:-14rpx}.mt-15{margin-top:15rpx}.mt--15{margin-top:-15rpx}.mt-16{margin-top:16rpx}.mt--16{margin-top:-16rpx}.mt-17{margin-top:17rpx}.mt--17{margin-top:-17rpx}.mt-18{margin-top:18rpx}.mt--18{margin-top:-18rpx}.mt-19{margin-top:19rpx}.mt--19{margin-top:-19rpx}.mt-20{margin-top:20rpx}.mt--20{margin-top:-20rpx}.mt-21{margin-top:21rpx}.mt--21{margin-top:-21rpx}.mt-22{margin-top:22rpx}.mt--22{margin-top:-22rpx}.mt-23{margin-top:23rpx}.mt--23{margin-top:-23rpx}.mt-24{margin-top:24rpx}.mt--24{margin-top:-24rpx}.mt-25{margin-top:25rpx}.mt--25{margin-top:-25rpx}.mt-n1{margin-top:4rpx}.mt--n1{margin-top:-4rpx}.mt-n2{margin-top:8rpx}.mt--n2{margin-top:-8rpx}.mt-n3{margin-top:12rpx}.mt--n3{margin-top:-12rpx}.mt-n4{margin-top:16rpx}.mt--n4{margin-top:-16rpx}.mt-n5{margin-top:20rpx}.mt--n5{margin-top:-20rpx}.mt-n6{margin-top:24rpx}.mt--n6{margin-top:-24rpx}.mt-n7{margin-top:28rpx}.mt--n7{margin-top:-28rpx}.mt-n8{margin-top:32rpx}.mt--n8{margin-top:-32rpx}.mt-n9{margin-top:36rpx}.mt--n9{margin-top:-36rpx}.mt-n10{margin-top:40rpx}.mt--n10{margin-top:-40rpx}.mt-n11{margin-top:44rpx}.mt--n11{margin-top:-44rpx}.mt-n12{margin-top:48rpx}.mt--n12{margin-top:-48rpx}.mt-n13{margin-top:52rpx}.mt--n13{margin-top:-52rpx}.mt-n14{margin-top:56rpx}.mt--n14{margin-top:-56rpx}.mt-n15{margin-top:60rpx}.mt--n15{margin-top:-60rpx}.mt-n16{margin-top:64rpx}.mt--n16{margin-top:-64rpx}.mt-n17{margin-top:68rpx}.mt--n17{margin-top:-68rpx}.mt-n18{margin-top:72rpx}.mt--n18{margin-top:-72rpx}.mt-n19{margin-top:76rpx}.mt--n19{margin-top:-76rpx}.mt-n20{margin-top:80rpx}.mt--n20{margin-top:-80rpx}.mt-n21{margin-top:84rpx}.mt--n21{margin-top:-84rpx}.mt-n22{margin-top:88rpx}.mt--n22{margin-top:-88rpx}.mt-n23{margin-top:92rpx}.mt--n23{margin-top:-92rpx}.mt-n24{margin-top:96rpx}.mt--n24{margin-top:-96rpx}.mt-n25{margin-top:100rpx}.mt--n25{margin-top:-100rpx}.mr-0{margin-right:0rpx}.mr--0{margin-right:0rpx}.mr-1{margin-right:1rpx}.mr--1{margin-right:-1rpx}.mr-2{margin-right:2rpx}.mr--2{margin-right:-2rpx}.mr-3{margin-right:3rpx}.mr--3{margin-right:-3rpx}.mr-4{margin-right:4rpx}.mr--4{margin-right:-4rpx}.mr-5{margin-right:5rpx}.mr--5{margin-right:-5rpx}.mr-6{margin-right:6rpx}.mr--6{margin-right:-6rpx}.mr-7{margin-right:7rpx}.mr--7{margin-right:-7rpx}.mr-8{margin-right:8rpx}.mr--8{margin-right:-8rpx}.mr-9{margin-right:9rpx}.mr--9{margin-right:-9rpx}.mr-10{margin-right:10rpx}.mr--10{margin-right:-10rpx}.mr-11{margin-right:11rpx}.mr--11{margin-right:-11rpx}.mr-12{margin-right:12rpx}.mr--12{margin-right:-12rpx}.mr-13{margin-right:13rpx}.mr--13{margin-right:-13rpx}.mr-14{margin-right:14rpx}.mr--14{margin-right:-14rpx}.mr-15{margin-right:15rpx}.mr--15{margin-right:-15rpx}.mr-16{margin-right:16rpx}.mr--16{margin-right:-16rpx}.mr-17{margin-right:17rpx}.mr--17{margin-right:-17rpx}.mr-18{margin-right:18rpx}.mr--18{margin-right:-18rpx}.mr-19{margin-right:19rpx}.mr--19{margin-right:-19rpx}.mr-20{margin-right:20rpx}.mr--20{margin-right:-20rpx}.mr-21{margin-right:21rpx}.mr--21{margin-right:-21rpx}.mr-22{margin-right:22rpx}.mr--22{margin-right:-22rpx}.mr-23{margin-right:23rpx}.mr--23{margin-right:-23rpx}.mr-24{margin-right:24rpx}.mr--24{margin-right:-24rpx}.mr-25{margin-right:25rpx}.mr--25{margin-right:-25rpx}.mr-n1{margin-right:4rpx}.mr--n1{margin-right:-4rpx}.mr-n2{margin-right:8rpx}.mr--n2{margin-right:-8rpx}.mr-n3{margin-right:12rpx}.mr--n3{margin-right:-12rpx}.mr-n4{margin-right:16rpx}.mr--n4{margin-right:-16rpx}.mr-n5{margin-right:20rpx}.mr--n5{margin-right:-20rpx}.mr-n6{margin-right:24rpx}.mr--n6{margin-right:-24rpx}.mr-n7{margin-right:28rpx}.mr--n7{margin-right:-28rpx}.mr-n8{margin-right:32rpx}.mr--n8{margin-right:-32rpx}.mr-n9{margin-right:36rpx}.mr--n9{margin-right:-36rpx}.mr-n10{margin-right:40rpx}.mr--n10{margin-right:-40rpx}.mr-n11{margin-right:44rpx}.mr--n11{margin-right:-44rpx}.mr-n12{margin-right:48rpx}.mr--n12{margin-right:-48rpx}.mr-n13{margin-right:52rpx}.mr--n13{margin-right:-52rpx}.mr-n14{margin-right:56rpx}.mr--n14{margin-right:-56rpx}.mr-n15{margin-right:60rpx}.mr--n15{margin-right:-60rpx}.mr-n16{margin-right:64rpx}.mr--n16{margin-right:-64rpx}.mr-n17{margin-right:68rpx}.mr--n17{margin-right:-68rpx}.mr-n18{margin-right:72rpx}.mr--n18{margin-right:-72rpx}.mr-n19{margin-right:76rpx}.mr--n19{margin-right:-76rpx}.mr-n20{margin-right:80rpx}.mr--n20{margin-right:-80rpx}.mr-n21{margin-right:84rpx}.mr--n21{margin-right:-84rpx}.mr-n22{margin-right:88rpx}.mr--n22{margin-right:-88rpx}.mr-n23{margin-right:92rpx}.mr--n23{margin-right:-92rpx}.mr-n24{margin-right:96rpx}.mr--n24{margin-right:-96rpx}.mr-n25{margin-right:100rpx}.mr--n25{margin-right:-100rpx}.mb-0{margin-bottom:0rpx}.mb--0{margin-bottom:0rpx}.mb-1{margin-bottom:1rpx}.mb--1{margin-bottom:-1rpx}.mb-2{margin-bottom:2rpx}.mb--2{margin-bottom:-2rpx}.mb-3{margin-bottom:3rpx}.mb--3{margin-bottom:-3rpx}.mb-4{margin-bottom:4rpx}.mb--4{margin-bottom:-4rpx}.mb-5{margin-bottom:5rpx}.mb--5{margin-bottom:-5rpx}.mb-6{margin-bottom:6rpx}.mb--6{margin-bottom:-6rpx}.mb-7{margin-bottom:7rpx}.mb--7{margin-bottom:-7rpx}.mb-8{margin-bottom:8rpx}.mb--8{margin-bottom:-8rpx}.mb-9{margin-bottom:9rpx}.mb--9{margin-bottom:-9rpx}.mb-10{margin-bottom:10rpx}.mb--10{margin-bottom:-10rpx}.mb-11{margin-bottom:11rpx}.mb--11{margin-bottom:-11rpx}.mb-12{margin-bottom:12rpx}.mb--12{margin-bottom:-12rpx}.mb-13{margin-bottom:13rpx}.mb--13{margin-bottom:-13rpx}.mb-14{margin-bottom:14rpx}.mb--14{margin-bottom:-14rpx}.mb-15{margin-bottom:15rpx}.mb--15{margin-bottom:-15rpx}.mb-16{margin-bottom:16rpx}.mb--16{margin-bottom:-16rpx}.mb-17{margin-bottom:17rpx}.mb--17{margin-bottom:-17rpx}.mb-18{margin-bottom:18rpx}.mb--18{margin-bottom:-18rpx}.mb-19{margin-bottom:19rpx}.mb--19{margin-bottom:-19rpx}.mb-20{margin-bottom:20rpx}.mb--20{margin-bottom:-20rpx}.mb-21{margin-bottom:21rpx}.mb--21{margin-bottom:-21rpx}.mb-22{margin-bottom:22rpx}.mb--22{margin-bottom:-22rpx}.mb-23{margin-bottom:23rpx}.mb--23{margin-bottom:-23rpx}.mb-24{margin-bottom:24rpx}.mb--24{margin-bottom:-24rpx}.mb-25{margin-bottom:25rpx}.mb--25{margin-bottom:-25rpx}.mb-n1{margin-bottom:4rpx}.mb--n1{margin-bottom:-4rpx}.mb-n2{margin-bottom:8rpx}.mb--n2{margin-bottom:-8rpx}.mb-n3{margin-bottom:12rpx}.mb--n3{margin-bottom:-12rpx}.mb-n4{margin-bottom:16rpx}.mb--n4{margin-bottom:-16rpx}.mb-n5{margin-bottom:20rpx}.mb--n5{margin-bottom:-20rpx}.mb-n6{margin-bottom:24rpx}.mb--n6{margin-bottom:-24rpx}.mb-n7{margin-bottom:28rpx}.mb--n7{margin-bottom:-28rpx}.mb-n8{margin-bottom:32rpx}.mb--n8{margin-bottom:-32rpx}.mb-n9{margin-bottom:36rpx}.mb--n9{margin-bottom:-36rpx}.mb-n10{margin-bottom:40rpx}.mb--n10{margin-bottom:-40rpx}.mb-n11{margin-bottom:44rpx}.mb--n11{margin-bottom:-44rpx}.mb-n12{margin-bottom:48rpx}.mb--n12{margin-bottom:-48rpx}.mb-n13{margin-bottom:52rpx}.mb--n13{margin-bottom:-52rpx}.mb-n14{margin-bottom:56rpx}.mb--n14{margin-bottom:-56rpx}.mb-n15{margin-bottom:60rpx}.mb--n15{margin-bottom:-60rpx}.mb-n16{margin-bottom:64rpx}.mb--n16{margin-bottom:-64rpx}.mb-n17{margin-bottom:68rpx}.mb--n17{margin-bottom:-68rpx}.mb-n18{margin-bottom:72rpx}.mb--n18{margin-bottom:-72rpx}.mb-n19{margin-bottom:76rpx}.mb--n19{margin-bottom:-76rpx}.mb-n20{margin-bottom:80rpx}.mb--n20{margin-bottom:-80rpx}.mb-n21{margin-bottom:84rpx}.mb--n21{margin-bottom:-84rpx}.mb-n22{margin-bottom:88rpx}.mb--n22{margin-bottom:-88rpx}.mb-n23{margin-bottom:92rpx}.mb--n23{margin-bottom:-92rpx}.mb-n24{margin-bottom:96rpx}.mb--n24{margin-bottom:-96rpx}.mb-n25{margin-bottom:100rpx}.mb--n25{margin-bottom:-100rpx}.ml-0{margin-left:0rpx}.ml--0{margin-left:0rpx}.ml-1{margin-left:1rpx}.ml--1{margin-left:-1rpx}.ml-2{margin-left:2rpx}.ml--2{margin-left:-2rpx}.ml-3{margin-left:3rpx}.ml--3{margin-left:-3rpx}.ml-4{margin-left:4rpx}.ml--4{margin-left:-4rpx}.ml-5{margin-left:5rpx}.ml--5{margin-left:-5rpx}.ml-6{margin-left:6rpx}.ml--6{margin-left:-6rpx}.ml-7{margin-left:7rpx}.ml--7{margin-left:-7rpx}.ml-8{margin-left:8rpx}.ml--8{margin-left:-8rpx}.ml-9{margin-left:9rpx}.ml--9{margin-left:-9rpx}.ml-10{margin-left:10rpx}.ml--10{margin-left:-10rpx}.ml-11{margin-left:11rpx}.ml--11{margin-left:-11rpx}.ml-12{margin-left:12rpx}.ml--12{margin-left:-12rpx}.ml-13{margin-left:13rpx}.ml--13{margin-left:-13rpx}.ml-14{margin-left:14rpx}.ml--14{margin-left:-14rpx}.ml-15{margin-left:15rpx}.ml--15{margin-left:-15rpx}.ml-16{margin-left:16rpx}.ml--16{margin-left:-16rpx}.ml-17{margin-left:17rpx}.ml--17{margin-left:-17rpx}.ml-18{margin-left:18rpx}.ml--18{margin-left:-18rpx}.ml-19{margin-left:19rpx}.ml--19{margin-left:-19rpx}.ml-20{margin-left:20rpx}.ml--20{margin-left:-20rpx}.ml-21{margin-left:21rpx}.ml--21{margin-left:-21rpx}.ml-22{margin-left:22rpx}.ml--22{margin-left:-22rpx}.ml-23{margin-left:23rpx}.ml--23{margin-left:-23rpx}.ml-24{margin-left:24rpx}.ml--24{margin-left:-24rpx}.ml-25{margin-left:25rpx}.ml--25{margin-left:-25rpx}.ml-n1{margin-left:4rpx}.ml--n1{margin-left:-4rpx}.ml-n2{margin-left:8rpx}.ml--n2{margin-left:-8rpx}.ml-n3{margin-left:12rpx}.ml--n3{margin-left:-12rpx}.ml-n4{margin-left:16rpx}.ml--n4{margin-left:-16rpx}.ml-n5{margin-left:20rpx}.ml--n5{margin-left:-20rpx}.ml-n6{margin-left:24rpx}.ml--n6{margin-left:-24rpx}.ml-n7{margin-left:28rpx}.ml--n7{margin-left:-28rpx}.ml-n8{margin-left:32rpx}.ml--n8{margin-left:-32rpx}.ml-n9{margin-left:36rpx}.ml--n9{margin-left:-36rpx}.ml-n10{margin-left:40rpx}.ml--n10{margin-left:-40rpx}.ml-n11{margin-left:44rpx}.ml--n11{margin-left:-44rpx}.ml-n12{margin-left:48rpx}.ml--n12{margin-left:-48rpx}.ml-n13{margin-left:52rpx}.ml--n13{margin-left:-52rpx}.ml-n14{margin-left:56rpx}.ml--n14{margin-left:-56rpx}.ml-n15{margin-left:60rpx}.ml--n15{margin-left:-60rpx}.ml-n16{margin-left:64rpx}.ml--n16{margin-left:-64rpx}.ml-n17{margin-left:68rpx}.ml--n17{margin-left:-68rpx}.ml-n18{margin-left:72rpx}.ml--n18{margin-left:-72rpx}.ml-n19{margin-left:76rpx}.ml--n19{margin-left:-76rpx}.ml-n20{margin-left:80rpx}.ml--n20{margin-left:-80rpx}.ml-n21{margin-left:84rpx}.ml--n21{margin-left:-84rpx}.ml-n22{margin-left:88rpx}.ml--n22{margin-left:-88rpx}.ml-n23{margin-left:92rpx}.ml--n23{margin-left:-92rpx}.ml-n24{margin-left:96rpx}.ml--n24{margin-left:-96rpx}.ml-n25{margin-left:100rpx}.ml--n25{margin-left:-100rpx}.mx-0{margin-left:0rpx;margin-right:0rpx}.mx-1{margin-left:1rpx;margin-right:1rpx}.mx-2{margin-left:2rpx;margin-right:2rpx}.mx-3{margin-left:3rpx;margin-right:3rpx}.mx-4{margin-left:4rpx;margin-right:4rpx}.mx-5{margin-left:5rpx;margin-right:5rpx}.mx-6{margin-left:6rpx;margin-right:6rpx}.mx-7{margin-left:7rpx;margin-right:7rpx}.mx-8{margin-left:8rpx;margin-right:8rpx}.mx-9{margin-left:9rpx;margin-right:9rpx}.mx-10{margin-left:10rpx;margin-right:10rpx}.mx-11{margin-left:11rpx;margin-right:11rpx}.mx-12{margin-left:12rpx;margin-right:12rpx}.mx-13{margin-left:13rpx;margin-right:13rpx}.mx-14{margin-left:14rpx;margin-right:14rpx}.mx-15{margin-left:15rpx;margin-right:15rpx}.mx-16{margin-left:16rpx;margin-right:16rpx}.mx-17{margin-left:17rpx;margin-right:17rpx}.mx-18{margin-left:18rpx;margin-right:18rpx}.mx-19{margin-left:19rpx;margin-right:19rpx}.mx-20{margin-left:20rpx;margin-right:20rpx}.mx-21{margin-left:21rpx;margin-right:21rpx}.mx-22{margin-left:22rpx;margin-right:22rpx}.mx-23{margin-left:23rpx;margin-right:23rpx}.mx-24{margin-left:24rpx;margin-right:24rpx}.mx-25{margin-left:25rpx;margin-right:25rpx}.mx-n1{margin-left:4rpx;margin-right:4rpx}.mx-n2{margin-left:8rpx;margin-right:8rpx}.mx-n3{margin-left:12rpx;margin-right:12rpx}.mx-n4{margin-left:16rpx;margin-right:16rpx}.mx-n5{margin-left:20rpx;margin-right:20rpx}.mx-n6{margin-left:24rpx;margin-right:24rpx}.mx-n7{margin-left:28rpx;margin-right:28rpx}.mx-n8{margin-left:32rpx;margin-right:32rpx}.mx-n9{margin-left:36rpx;margin-right:36rpx}.mx-n10{margin-left:40rpx;margin-right:40rpx}.mx-n11{margin-left:44rpx;margin-right:44rpx}.mx-n12{margin-left:48rpx;margin-right:48rpx}.mx-n13{margin-left:52rpx;margin-right:52rpx}.mx-n14{margin-left:56rpx;margin-right:56rpx}.mx-n15{margin-left:60rpx;margin-right:60rpx}.mx-n16{margin-left:64rpx;margin-right:64rpx}.mx-n17{margin-left:68rpx;margin-right:68rpx}.mx-n18{margin-left:72rpx;margin-right:72rpx}.mx-n19{margin-left:76rpx;margin-right:76rpx}.mx-n20{margin-left:80rpx;margin-right:80rpx}.mx-n21{margin-left:84rpx;margin-right:84rpx}.mx-n22{margin-left:88rpx;margin-right:88rpx}.mx-n23{margin-left:92rpx;margin-right:92rpx}.mx-n24{margin-left:96rpx;margin-right:96rpx}.mx-n25{margin-left:100rpx;margin-right:100rpx}.my-0{margin-top:0rpx;margin-bottom:0rpx}.my-1{margin-top:1rpx;margin-bottom:1rpx}.my-2{margin-top:2rpx;margin-bottom:2rpx}.my-3{margin-top:3rpx;margin-bottom:3rpx}.my-4{margin-top:4rpx;margin-bottom:4rpx}.my-5{margin-top:5rpx;margin-bottom:5rpx}.my-6{margin-top:6rpx;margin-bottom:6rpx}.my-7{margin-top:7rpx;margin-bottom:7rpx}.my-8{margin-top:8rpx;margin-bottom:8rpx}.my-9{margin-top:9rpx;margin-bottom:9rpx}.my-10{margin-top:10rpx;margin-bottom:10rpx}.my-11{margin-top:11rpx;margin-bottom:11rpx}.my-12{margin-top:12rpx;margin-bottom:12rpx}.my-13{margin-top:13rpx;margin-bottom:13rpx}.my-14{margin-top:14rpx;margin-bottom:14rpx}.my-15{margin-top:15rpx;margin-bottom:15rpx}.my-16{margin-top:16rpx;margin-bottom:16rpx}.my-17{margin-top:17rpx;margin-bottom:17rpx}.my-18{margin-top:18rpx;margin-bottom:18rpx}.my-19{margin-top:19rpx;margin-bottom:19rpx}.my-20{margin-top:20rpx;margin-bottom:20rpx}.my-21{margin-top:21rpx;margin-bottom:21rpx}.my-22{margin-top:22rpx;margin-bottom:22rpx}.my-23{margin-top:23rpx;margin-bottom:23rpx}.my-24{margin-top:24rpx;margin-bottom:24rpx}.my-25{margin-top:25rpx;margin-bottom:25rpx}.my-n1{margin-top:4rpx;margin-bottom:4rpx}.my-n2{margin-top:8rpx;margin-bottom:8rpx}.my-n3{margin-top:12rpx;margin-bottom:12rpx}.my-n4{margin-top:16rpx;margin-bottom:16rpx}.my-n5{margin-top:20rpx;margin-bottom:20rpx}.my-n6{margin-top:24rpx;margin-bottom:24rpx}.my-n7{margin-top:28rpx;margin-bottom:28rpx}.my-n8{margin-top:32rpx;margin-bottom:32rpx}.my-n9{margin-top:36rpx;margin-bottom:36rpx}.my-n10{margin-top:40rpx;margin-bottom:40rpx}.my-n11{margin-top:44rpx;margin-bottom:44rpx}.my-n12{margin-top:48rpx;margin-bottom:48rpx}.my-n13{margin-top:52rpx;margin-bottom:52rpx}.my-n14{margin-top:56rpx;margin-bottom:56rpx}.my-n15{margin-top:60rpx;margin-bottom:60rpx}.my-n16{margin-top:64rpx;margin-bottom:64rpx}.my-n17{margin-top:68rpx;margin-bottom:68rpx}.my-n18{margin-top:72rpx;margin-bottom:72rpx}.my-n19{margin-top:76rpx;margin-bottom:76rpx}.my-n20{margin-top:80rpx;margin-bottom:80rpx}.my-n21{margin-top:84rpx;margin-bottom:84rpx}.my-n22{margin-top:88rpx;margin-bottom:88rpx}.my-n23{margin-top:92rpx;margin-bottom:92rpx}.my-n24{margin-top:96rpx;margin-bottom:96rpx}.my-n25{margin-top:100rpx;margin-bottom:100rpx}.t-0{top:0rpx}.t--0{top:0rpx}.t-1{top:1rpx}.t--1{top:-1rpx}.t-2{top:2rpx}.t--2{top:-2rpx}.t-3{top:3rpx}.t--3{top:-3rpx}.t-4{top:4rpx}.t--4{top:-4rpx}.t-5{top:5rpx}.t--5{top:-5rpx}.t-6{top:6rpx}.t--6{top:-6rpx}.t-7{top:7rpx}.t--7{top:-7rpx}.t-8{top:8rpx}.t--8{top:-8rpx}.t-9{top:9rpx}.t--9{top:-9rpx}.t-10{top:10rpx}.t--10{top:-10rpx}.t-11{top:11rpx}.t--11{top:-11rpx}.t-12{top:12rpx}.t--12{top:-12rpx}.t-13{top:13rpx}.t--13{top:-13rpx}.t-14{top:14rpx}.t--14{top:-14rpx}.t-15{top:15rpx}.t--15{top:-15rpx}.t-16{top:16rpx}.t--16{top:-16rpx}.t-17{top:17rpx}.t--17{top:-17rpx}.t-18{top:18rpx}.t--18{top:-18rpx}.t-19{top:19rpx}.t--19{top:-19rpx}.t-20{top:20rpx}.t--20{top:-20rpx}.t-21{top:21rpx}.t--21{top:-21rpx}.t-22{top:22rpx}.t--22{top:-22rpx}.t-23{top:23rpx}.t--23{top:-23rpx}.t-24{top:24rpx}.t--24{top:-24rpx}.t-25{top:25rpx}.t--25{top:-25rpx}.t-n1{top:4rpx}.t--n1{top:-4rpx}.t-n2{top:8rpx}.t--n2{top:-8rpx}.t-n3{top:12rpx}.t--n3{top:-12rpx}.t-n4{top:16rpx}.t--n4{top:-16rpx}.t-n5{top:20rpx}.t--n5{top:-20rpx}.t-n6{top:24rpx}.t--n6{top:-24rpx}.t-n7{top:28rpx}.t--n7{top:-28rpx}.t-n8{top:32rpx}.t--n8{top:-32rpx}.t-n9{top:36rpx}.t--n9{top:-36rpx}.t-n10{top:40rpx}.t--n10{top:-40rpx}.t-n11{top:44rpx}.t--n11{top:-44rpx}.t-n12{top:48rpx}.t--n12{top:-48rpx}.t-n13{top:52rpx}.t--n13{top:-52rpx}.t-n14{top:56rpx}.t--n14{top:-56rpx}.t-n15{top:60rpx}.t--n15{top:-60rpx}.t-n16{top:64rpx}.t--n16{top:-64rpx}.t-n17{top:68rpx}.t--n17{top:-68rpx}.t-n18{top:72rpx}.t--n18{top:-72rpx}.t-n19{top:76rpx}.t--n19{top:-76rpx}.t-n20{top:80rpx}.t--n20{top:-80rpx}.t-n21{top:84rpx}.t--n21{top:-84rpx}.t-n22{top:88rpx}.t--n22{top:-88rpx}.t-n23{top:92rpx}.t--n23{top:-92rpx}.t-n24{top:96rpx}.t--n24{top:-96rpx}.t-n25{top:100rpx}.t--n25{top:-100rpx}.r-0{right:0rpx}.r--0{right:0rpx}.r-1{right:1rpx}.r--1{right:-1rpx}.r-2{right:2rpx}.r--2{right:-2rpx}.r-3{right:3rpx}.r--3{right:-3rpx}.r-4{right:4rpx}.r--4{right:-4rpx}.r-5{right:5rpx}.r--5{right:-5rpx}.r-6{right:6rpx}.r--6{right:-6rpx}.r-7{right:7rpx}.r--7{right:-7rpx}.r-8{right:8rpx}.r--8{right:-8rpx}.r-9{right:9rpx}.r--9{right:-9rpx}.r-10{right:10rpx}.r--10{right:-10rpx}.r-11{right:11rpx}.r--11{right:-11rpx}.r-12{right:12rpx}.r--12{right:-12rpx}.r-13{right:13rpx}.r--13{right:-13rpx}.r-14{right:14rpx}.r--14{right:-14rpx}.r-15{right:15rpx}.r--15{right:-15rpx}.r-16{right:16rpx}.r--16{right:-16rpx}.r-17{right:17rpx}.r--17{right:-17rpx}.r-18{right:18rpx}.r--18{right:-18rpx}.r-19{right:19rpx}.r--19{right:-19rpx}.r-20{right:20rpx}.r--20{right:-20rpx}.r-21{right:21rpx}.r--21{right:-21rpx}.r-22{right:22rpx}.r--22{right:-22rpx}.r-23{right:23rpx}.r--23{right:-23rpx}.r-24{right:24rpx}.r--24{right:-24rpx}.r-25{right:25rpx}.r--25{right:-25rpx}.r-n1{right:4rpx}.r--n1{right:-4rpx}.r-n2{right:8rpx}.r--n2{right:-8rpx}.r-n3{right:12rpx}.r--n3{right:-12rpx}.r-n4{right:16rpx}.r--n4{right:-16rpx}.r-n5{right:20rpx}.r--n5{right:-20rpx}.r-n6{right:24rpx}.r--n6{right:-24rpx}.r-n7{right:28rpx}.r--n7{right:-28rpx}.r-n8{right:32rpx}.r--n8{right:-32rpx}.r-n9{right:36rpx}.r--n9{right:-36rpx}.r-n10{right:40rpx}.r--n10{right:-40rpx}.r-n11{right:44rpx}.r--n11{right:-44rpx}.r-n12{right:48rpx}.r--n12{right:-48rpx}.r-n13{right:52rpx}.r--n13{right:-52rpx}.r-n14{right:56rpx}.r--n14{right:-56rpx}.r-n15{right:60rpx}.r--n15{right:-60rpx}.r-n16{right:64rpx}.r--n16{right:-64rpx}.r-n17{right:68rpx}.r--n17{right:-68rpx}.r-n18{right:72rpx}.r--n18{right:-72rpx}.r-n19{right:76rpx}.r--n19{right:-76rpx}.r-n20{right:80rpx}.r--n20{right:-80rpx}.r-n21{right:84rpx}.r--n21{right:-84rpx}.r-n22{right:88rpx}.r--n22{right:-88rpx}.r-n23{right:92rpx}.r--n23{right:-92rpx}.r-n24{right:96rpx}.r--n24{right:-96rpx}.r-n25{right:100rpx}.r--n25{right:-100rpx}.b-0{bottom:0rpx}.b--0{bottom:0rpx}.b-1{bottom:1rpx}.b--1{bottom:-1rpx}.b-2{bottom:2rpx}.b--2{bottom:-2rpx}.b-3{bottom:3rpx}.b--3{bottom:-3rpx}.b-4{bottom:4rpx}.b--4{bottom:-4rpx}.b-5{bottom:5rpx}.b--5{bottom:-5rpx}.b-6{bottom:6rpx}.b--6{bottom:-6rpx}.b-7{bottom:7rpx}.b--7{bottom:-7rpx}.b-8{bottom:8rpx}.b--8{bottom:-8rpx}.b-9{bottom:9rpx}.b--9{bottom:-9rpx}.b-10{bottom:10rpx}.b--10{bottom:-10rpx}.b-11{bottom:11rpx}.b--11{bottom:-11rpx}.b-12{bottom:12rpx}.b--12{bottom:-12rpx}.b-13{bottom:13rpx}.b--13{bottom:-13rpx}.b-14{bottom:14rpx}.b--14{bottom:-14rpx}.b-15{bottom:15rpx}.b--15{bottom:-15rpx}.b-16{bottom:16rpx}.b--16{bottom:-16rpx}.b-17{bottom:17rpx}.b--17{bottom:-17rpx}.b-18{bottom:18rpx}.b--18{bottom:-18rpx}.b-19{bottom:19rpx}.b--19{bottom:-19rpx}.b-20{bottom:20rpx}.b--20{bottom:-20rpx}.b-21{bottom:21rpx}.b--21{bottom:-21rpx}.b-22{bottom:22rpx}.b--22{bottom:-22rpx}.b-23{bottom:23rpx}.b--23{bottom:-23rpx}.b-24{bottom:24rpx}.b--24{bottom:-24rpx}.b-25{bottom:25rpx}.b--25{bottom:-25rpx}.b-n1{bottom:4rpx}.b--n1{bottom:-4rpx}.b-n2{bottom:8rpx}.b--n2{bottom:-8rpx}.b-n3{bottom:12rpx}.b--n3{bottom:-12rpx}.b-n4{bottom:16rpx}.b--n4{bottom:-16rpx}.b-n5{bottom:20rpx}.b--n5{bottom:-20rpx}.b-n6{bottom:24rpx}.b--n6{bottom:-24rpx}.b-n7{bottom:28rpx}.b--n7{bottom:-28rpx}.b-n8{bottom:32rpx}.b--n8{bottom:-32rpx}.b-n9{bottom:36rpx}.b--n9{bottom:-36rpx}.b-n10{bottom:40rpx}.b--n10{bottom:-40rpx}.b-n11{bottom:44rpx}.b--n11{bottom:-44rpx}.b-n12{bottom:48rpx}.b--n12{bottom:-48rpx}.b-n13{bottom:52rpx}.b--n13{bottom:-52rpx}.b-n14{bottom:56rpx}.b--n14{bottom:-56rpx}.b-n15{bottom:60rpx}.b--n15{bottom:-60rpx}.b-n16{bottom:64rpx}.b--n16{bottom:-64rpx}.b-n17{bottom:68rpx}.b--n17{bottom:-68rpx}.b-n18{bottom:72rpx}.b--n18{bottom:-72rpx}.b-n19{bottom:76rpx}.b--n19{bottom:-76rpx}.b-n20{bottom:80rpx}.b--n20{bottom:-80rpx}.b-n21{bottom:84rpx}.b--n21{bottom:-84rpx}.b-n22{bottom:88rpx}.b--n22{bottom:-88rpx}.b-n23{bottom:92rpx}.b--n23{bottom:-92rpx}.b-n24{bottom:96rpx}.b--n24{bottom:-96rpx}.b-n25{bottom:100rpx}.b--n25{bottom:-100rpx}.l-0{left:0rpx}.l--0{left:0rpx}.l-1{left:1rpx}.l--1{left:-1rpx}.l-2{left:2rpx}.l--2{left:-2rpx}.l-3{left:3rpx}.l--3{left:-3rpx}.l-4{left:4rpx}.l--4{left:-4rpx}.l-5{left:5rpx}.l--5{left:-5rpx}.l-6{left:6rpx}.l--6{left:-6rpx}.l-7{left:7rpx}.l--7{left:-7rpx}.l-8{left:8rpx}.l--8{left:-8rpx}.l-9{left:9rpx}.l--9{left:-9rpx}.l-10{left:10rpx}.l--10{left:-10rpx}.l-11{left:11rpx}.l--11{left:-11rpx}.l-12{left:12rpx}.l--12{left:-12rpx}.l-13{left:13rpx}.l--13{left:-13rpx}.l-14{left:14rpx}.l--14{left:-14rpx}.l-15{left:15rpx}.l--15{left:-15rpx}.l-16{left:16rpx}.l--16{left:-16rpx}.l-17{left:17rpx}.l--17{left:-17rpx}.l-18{left:18rpx}.l--18{left:-18rpx}.l-19{left:19rpx}.l--19{left:-19rpx}.l-20{left:20rpx}.l--20{left:-20rpx}.l-21{left:21rpx}.l--21{left:-21rpx}.l-22{left:22rpx}.l--22{left:-22rpx}.l-23{left:23rpx}.l--23{left:-23rpx}.l-24{left:24rpx}.l--24{left:-24rpx}.l-25{left:25rpx}.l--25{left:-25rpx}.l-n1{left:4rpx}.l--n1{left:-4rpx}.l-n2{left:8rpx}.l--n2{left:-8rpx}.l-n3{left:12rpx}.l--n3{left:-12rpx}.l-n4{left:16rpx}.l--n4{left:-16rpx}.l-n5{left:20rpx}.l--n5{left:-20rpx}.l-n6{left:24rpx}.l--n6{left:-24rpx}.l-n7{left:28rpx}.l--n7{left:-28rpx}.l-n8{left:32rpx}.l--n8{left:-32rpx}.l-n9{left:36rpx}.l--n9{left:-36rpx}.l-n10{left:40rpx}.l--n10{left:-40rpx}.l-n11{left:44rpx}.l--n11{left:-44rpx}.l-n12{left:48rpx}.l--n12{left:-48rpx}.l-n13{left:52rpx}.l--n13{left:-52rpx}.l-n14{left:56rpx}.l--n14{left:-56rpx}.l-n15{left:60rpx}.l--n15{left:-60rpx}.l-n16{left:64rpx}.l--n16{left:-64rpx}.l-n17{left:68rpx}.l--n17{left:-68rpx}.l-n18{left:72rpx}.l--n18{left:-72rpx}.l-n19{left:76rpx}.l--n19{left:-76rpx}.l-n20{left:80rpx}.l--n20{left:-80rpx}.l-n21{left:84rpx}.l--n21{left:-84rpx}.l-n22{left:88rpx}.l--n22{left:-88rpx}.l-n23{left:92rpx}.l--n23{left:-92rpx}.l-n24{left:96rpx}.l--n24{left:-96rpx}.l-n25{left:100rpx}.l--n25{left:-100rpx}.grid{display:grid!important}.grid-col-1{grid-template-columns:repeat(1,1fr)}.grid-col-2{grid-template-columns:repeat(2,1fr)}.grid-col-3{grid-template-columns:repeat(3,1fr)}.grid-col-4{grid-template-columns:repeat(4,1fr)}.grid-col-5{grid-template-columns:repeat(5,1fr)}.grid-col-6{grid-template-columns:repeat(6,1fr)}.grid-col-7{grid-template-columns:repeat(7,1fr)}.grid-col-8{grid-template-columns:repeat(8,1fr)}.grid-col-9{grid-template-columns:repeat(9,1fr)}.grid-col-10{grid-template-columns:repeat(10,1fr)}.grid-col-11{grid-template-columns:repeat(11,1fr)}.gap-1{gap:2rpx}.gap-col-1{grid-column-gap:2rpx}.gap-row-1{grid-row-gap:2rpx}.gap-2{gap:4rpx}.gap-col-2{grid-column-gap:4rpx}.gap-row-2{grid-row-gap:4rpx}.gap-3{gap:6rpx}.gap-col-3{grid-column-gap:6rpx}.gap-row-3{grid-row-gap:6rpx}.gap-4{gap:8rpx}.gap-col-4{grid-column-gap:8rpx}.gap-row-4{grid-row-gap:8rpx}.gap-5{gap:10rpx}.gap-col-5{grid-column-gap:10rpx}.gap-row-5{grid-row-gap:10rpx}.gap-6{gap:12rpx}.gap-col-6{grid-column-gap:12rpx}.gap-row-6{grid-row-gap:12rpx}.gap-7{gap:14rpx}.gap-col-7{grid-column-gap:14rpx}.gap-row-7{grid-row-gap:14rpx}.gap-8{gap:16rpx}.gap-col-8{grid-column-gap:16rpx}.gap-row-8{grid-row-gap:16rpx}.gap-9{gap:18rpx}.gap-col-9{grid-column-gap:18rpx}.gap-row-9{grid-row-gap:18rpx}.gap-10{gap:20rpx}.gap-col-10{grid-column-gap:20rpx}.gap-row-10{grid-row-gap:20rpx}.gap-11{gap:22rpx}.gap-col-11{grid-column-gap:22rpx}.gap-row-11{grid-row-gap:22rpx}.gap-12{gap:24rpx}.gap-col-12{grid-column-gap:24rpx}.gap-row-12{grid-row-gap:24rpx}.gap-13{gap:26rpx}.gap-col-13{grid-column-gap:26rpx}.gap-row-13{grid-row-gap:26rpx}.gap-14{gap:28rpx}.gap-col-14{grid-column-gap:28rpx}.gap-row-14{grid-row-gap:28rpx}.gap-15{gap:30rpx}.gap-col-15{grid-column-gap:30rpx}.gap-row-15{grid-row-gap:30rpx}.gap-16{gap:32rpx}.gap-col-16{grid-column-gap:32rpx}.gap-row-16{grid-row-gap:32rpx}.gap-17{gap:34rpx}.gap-col-17{grid-column-gap:34rpx}.gap-row-17{grid-row-gap:34rpx}.gap-18{gap:36rpx}.gap-col-18{grid-column-gap:36rpx}.gap-row-18{grid-row-gap:36rpx}.gap-19{gap:38rpx}.gap-col-19{grid-column-gap:38rpx}.gap-row-19{grid-row-gap:38rpx}.gap-20{gap:40rpx}.gap-col-20{grid-column-gap:40rpx}.gap-row-20{grid-row-gap:40rpx}.gap-21{gap:42rpx}.gap-col-21{grid-column-gap:42rpx}.gap-row-21{grid-row-gap:42rpx}.gap-22{gap:44rpx}.gap-col-22{grid-column-gap:44rpx}.gap-row-22{grid-row-gap:44rpx}.gap-23{gap:46rpx}.gap-col-23{grid-column-gap:46rpx}.gap-row-23{grid-row-gap:46rpx}.gap-24{gap:48rpx}.gap-col-24{grid-column-gap:48rpx}.gap-row-24{grid-row-gap:48rpx}.gap-25{gap:50rpx}.gap-col-25{grid-column-gap:50rpx}.gap-row-25{grid-row-gap:50rpx}.flex{display:flex!important}.flex-col{flex-direction:column!important}.flex-wrap{flex-flow:row wrap!important}.flex-shrink{flex-shrink:0!important}.flex-row{flex-direction:row!important}.flex-reverse{flex-direction:row-reverse!important}.flex-row-top-start{justify-content:flex-start!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-row-top-center{justify-content:center!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-row-top-end{justify-content:flex-end!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-row-center-start{justify-content:flex-start!important;align-items:center!important;align-content:center;display:flex!important}.flex-row-center-center{justify-content:center!important;align-items:center!important;align-content:center;display:flex!important}.flex-row-center-end{justify-content:flex-end!important;align-items:center!important;align-content:center;display:flex!important}.flex-row-bottom-start{justify-content:flex-start!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-row-bottom-center{justify-content:center!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-row-bottom-end{justify-content:flex-end!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-row-center-between{justify-content:space-between!important;align-items:center!important;align-content:center;display:flex!important}.flex-col-top-start{justify-content:flex-start!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-col-top-center{justify-content:flex-start!important;align-items:center!important;align-content:center;display:flex!important}.flex-col-top-end{justify-content:flex-start!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-col-center-start{justify-content:center!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-col-center-center{justify-content:center!important;align-items:center!important;align-content:center;display:flex!important}.flex-col-center-end{justify-content:center!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-col-bottom-start{justify-content:flex-end!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-col-bottom-center{justify-content:flex-end!important;align-items:center!important;align-content:center;display:flex!important}.flex-col-bottom-end{justify-content:flex-end!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-start{justify-content:flex-start!important;align-items:center!important;align-content:center;display:flex!important}.flex-end{justify-content:flex-end!important;align-items:center!important;align-content:center;display:flex!important}.flex-center{justify-content:center!important;align-items:center!important;align-content:center;display:flex!important}.flex-between{justify-content:space-between}.flex-col-full{flex-direction:column;align-items:stretch}.flex-around{justify-content:space-around}.flex-row-baseline-start{justify-content:flex-start!important;align-items:baseline!important;align-content:center;align-content:center;display:flex!important}.flex-row-baseline-center{justify-content:center!important;align-items:baseline!important;align-content:center;align-content:center;display:flex!important}.flex-row-baseline-end{justify-content:flex-end!important;align-items:baseline!important;align-content:center;align-content:center;display:flex!important}.flex-0{flex-grow:0!important}.flex-1{flex-grow:1!important}.flex-2{flex-grow:2!important}.flex-3{flex-grow:3!important}.flex-4{flex-grow:4!important}.flex-5{flex-grow:5!important}.flex-6{flex-grow:6!important}.flex-7{flex-grow:7!important}.flex-8{flex-grow:8!important}.flex-9{flex-grow:9!important}.flex-10{flex-grow:10!important}.flex-11{flex-grow:11!important}.flex-12{flex-grow:12!important}.text-red{color:#f44336!important}.red{background-color:#f44336}.text-pink{color:#e91e63!important}.pink{background-color:#e91e63}.text-purple{color:#9c27b0!important}.purple{background-color:#9c27b0}.text-deep-purple{color:#673ab7!important}.deep-purple{background-color:#673ab7}.text-indigo{color:#3f51b5!important}.indigo{background-color:#3f51b5}.text-blue{color:#2196f3!important}.blue{background-color:#2196f3}.text-light-blue{color:#03a9f4!important}.light-blue{background-color:#03a9f4}.text-cyan{color:#00bcd4!important}.cyan{background-color:#00bcd4}.text-teal{color:#009688!important}.teal{background-color:#009688}.text-green{color:#4caf50!important}.green{background-color:#4caf50}.text-light-green{color:#8bc34a!important}.light-green{background-color:#8bc34a}.text-lime{color:#cddc39!important}.lime{background-color:#cddc39}.text-yellow{color:#ffeb3b!important}.yellow{background-color:#ffeb3b}.text-amber{color:#ffc107!important}.amber{background-color:#ffc107}.text-orange{color:#ff9800!important}.orange{background-color:#ff9800}.text-deep-orange{color:#ff5722!important}.deep-orange{background-color:#ff5722}.text-brown{color:#795548!important}.brown{background-color:#795548}.text-blue-grey{color:#607d8b!important}.blue-grey{background-color:#607d8b}.text-grey{color:#9e9e9e!important}.grey{background-color:#9e9e9e}.text-black{color:#000!important}.black{background-color:#000}.text-white{color:#fff!important}.white{background-color:#fff}.text-lighten-5{color:#fafafa!important}.lighten-5{background-color:#fafafa}.text-lighten-4{color:#f5f5f5!important}.lighten-4{background-color:#f5f5f5}.text-lighten-3{color:#eee!important}.lighten-3{background-color:#eee}.text-lighten-2{color:#e0e0e0!important}.lighten-2{background-color:#e0e0e0}.text-lighten-1{color:#bdbdbd!important}.lighten-1{background-color:#bdbdbd}.text-darken-1{color:#757575!important}.darken-1{background-color:#757575}.text-darken-2{color:#616161!important}.darken-2{background-color:#616161}.text-darken-3{color:#424242!important}.darken-3{background-color:#424242}.text-darken-4{color:#212121!important}.darken-4{background-color:#212121}.text-darken-5{color:#131313!important}.darken-5{background-color:#131313}.text-darken-6{color:#0a0a0a!important}.darken-6{background-color:#0a0a0a}
\ No newline at end of file
+.uni-input-input[type=password]::-ms-reveal{display:none}.tableHeader .uni-scroll-view::-webkit-scrollbar{display:none}.safe-height{height:var(--window-bottom)}.safe-top{height:var(--window-top)}.safe-statusbar{height:var(--status-bar-height)}.blur{backdrop-filter:blur(10px);background-color:rgba(0,0,0,.3)}.pointer{cursor:pointer}.pointer:hover{opacity:.7}.overflow{overflow:hidden}.overflow-x{overflow-x:hidden;overflow-y:auto}.overflow-y{overflow-x:auto;overflow-y:hidden}.relative{position:relative!important}.absolute{position:absolute!important}.fixed{position:fixed!important}.sticky{position:sticky!important}.fulled-height{display:flex;align-items:stretch}.clear{clear:both}.fulled{width:100%;display:block}.fulled-height{height:100%;display:block}.gray-100{filter:grayscale(100%)}.gray{filter:grayscale(25%)}.d-inline-block{display:inline-block!important}.d-block{display:block}.vertical-align-top{vertical-align:top}.vertical-align-middle{vertical-align:middle}.vertical-align-bottom{vertical-align:bottom}.wrap{white-space:pre-wrap;word-break:break-all}.nowrap{white-space:nowrap}.vertical-align-top{vertical-align:top}.vertical-align-middle{vertical-align:middle}.vertical-align-bottom{vertical-align:bottom}.zIndex-0{z-index:0}.zIndex-n0{z-index:0}.zIndex-1{z-index:1}.zIndex-n1{z-index:4}.zIndex-2{z-index:2}.zIndex-n2{z-index:8}.zIndex-3{z-index:3}.zIndex-n3{z-index:12}.zIndex-4{z-index:4}.zIndex-n4{z-index:16}.zIndex-5{z-index:5}.zIndex-n5{z-index:20}.zIndex-6{z-index:6}.zIndex-n6{z-index:24}.zIndex-7{z-index:7}.zIndex-n7{z-index:28}.zIndex-8{z-index:8}.zIndex-n8{z-index:32}.zIndex-9{z-index:9}.zIndex-n9{z-index:36}.zIndex-10{z-index:10}.zIndex-n10{z-index:40}.zIndex-11{z-index:11}.zIndex-n11{z-index:44}.zIndex-12{z-index:12}.zIndex-n12{z-index:48}.zIndex-13{z-index:13}.zIndex-n13{z-index:52}.zIndex-14{z-index:14}.zIndex-n14{z-index:56}.zIndex-15{z-index:15}.zIndex-n15{z-index:60}.zIndex-16{z-index:16}.zIndex-n16{z-index:64}.zIndex-17{z-index:17}.zIndex-n17{z-index:68}.zIndex-18{z-index:18}.zIndex-n18{z-index:72}.zIndex-19{z-index:19}.zIndex-n19{z-index:76}.zIndex-20{z-index:20}.zIndex-n20{z-index:80}.zIndex-21{z-index:21}.zIndex-n21{z-index:84}.zIndex-22{z-index:22}.zIndex-n22{z-index:88}.zIndex-23{z-index:23}.zIndex-n23{z-index:92}.zIndex-24{z-index:24}.zIndex-n24{z-index:96}.zIndex-25{z-index:25}.zIndex-n25{z-index:100}.zIndex-26{z-index:26}.zIndex-n26{z-index:104}.text-overflow{width:100%;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-overflow-1{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:1;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-2{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-3{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-overflow-4{width:100%;display:-webkit-box;white-space:inherit;overflow:hidden;-webkit-line-clamp:4;-webkit-box-orient:vertical;text-overflow:ellipsis}.text-delete{text-decoration:line-through}.text-underline{text-decoration:underline}.text-size-xxs{font-size:20rpx}.text-size-xs{font-size:22rpx}.text-size-s{font-size:24rpx}.text-size-m{font-size:28rpx}.text-size-n{font-size:30rpx}.text-size-g{font-size:34rpx}.text-size-lg{font-size:36rpx}.text-size-xl{font-size:40rpx}.text-weight-s{font-weight:100}.text-weight-n{font-weight:400}.text-weight-b{font-weight:700}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-align-center{text-align:center}.round-tl-0{border-top-left-radius:0rpx!important}.round-tl-1{border-top-left-radius:4rpx!important}.round-tl-2{border-top-left-radius:8rpx!important}.round-tl-3{border-top-left-radius:12rpx!important}.round-tl-4{border-top-left-radius:16rpx!important}.round-tl-5{border-top-left-radius:20rpx!important}.round-tl-6{border-top-left-radius:24rpx!important}.round-tl-7{border-top-left-radius:28rpx!important}.round-tl-8{border-top-left-radius:32rpx!important}.round-tl-9{border-top-left-radius:36rpx!important}.round-tl-10{border-top-left-radius:40rpx!important}.round-tl-11{border-top-left-radius:44rpx!important}.round-tl-12{border-top-left-radius:48rpx!important}.round-tl-13{border-top-left-radius:52rpx!important}.round-tl-14{border-top-left-radius:56rpx!important}.round-tl-15{border-top-left-radius:60rpx!important}.round-tl-16{border-top-left-radius:64rpx!important}.round-tl-17{border-top-left-radius:68rpx!important}.round-tl-18{border-top-left-radius:72rpx!important}.round-tl-19{border-top-left-radius:76rpx!important}.round-tl-20{border-top-left-radius:80rpx!important}.round-tl-21{border-top-left-radius:84rpx!important}.round-tl-22{border-top-left-radius:88rpx!important}.round-tl-23{border-top-left-radius:92rpx!important}.round-tl-24{border-top-left-radius:96rpx!important}.round-tl-25{border-top-left-radius:100rpx!important}.round-tr-0{border-top-right-radius:0rpx!important}.round-tr-1{border-top-right-radius:4rpx!important}.round-tr-2{border-top-right-radius:8rpx!important}.round-tr-3{border-top-right-radius:12rpx!important}.round-tr-4{border-top-right-radius:16rpx!important}.round-tr-5{border-top-right-radius:20rpx!important}.round-tr-6{border-top-right-radius:24rpx!important}.round-tr-7{border-top-right-radius:28rpx!important}.round-tr-8{border-top-right-radius:32rpx!important}.round-tr-9{border-top-right-radius:36rpx!important}.round-tr-10{border-top-right-radius:40rpx!important}.round-tr-11{border-top-right-radius:44rpx!important}.round-tr-12{border-top-right-radius:48rpx!important}.round-tr-13{border-top-right-radius:52rpx!important}.round-tr-14{border-top-right-radius:56rpx!important}.round-tr-15{border-top-right-radius:60rpx!important}.round-tr-16{border-top-right-radius:64rpx!important}.round-tr-17{border-top-right-radius:68rpx!important}.round-tr-18{border-top-right-radius:72rpx!important}.round-tr-19{border-top-right-radius:76rpx!important}.round-tr-20{border-top-right-radius:80rpx!important}.round-tr-21{border-top-right-radius:84rpx!important}.round-tr-22{border-top-right-radius:88rpx!important}.round-tr-23{border-top-right-radius:92rpx!important}.round-tr-24{border-top-right-radius:96rpx!important}.round-tr-25{border-top-right-radius:100rpx!important}.round-bl-0{border-bottom-left-radius:0rpx!important}.round-bl-1{border-bottom-left-radius:4rpx!important}.round-bl-2{border-bottom-left-radius:8rpx!important}.round-bl-3{border-bottom-left-radius:12rpx!important}.round-bl-4{border-bottom-left-radius:16rpx!important}.round-bl-5{border-bottom-left-radius:20rpx!important}.round-bl-6{border-bottom-left-radius:24rpx!important}.round-bl-7{border-bottom-left-radius:28rpx!important}.round-bl-8{border-bottom-left-radius:32rpx!important}.round-bl-9{border-bottom-left-radius:36rpx!important}.round-bl-10{border-bottom-left-radius:40rpx!important}.round-bl-11{border-bottom-left-radius:44rpx!important}.round-bl-12{border-bottom-left-radius:48rpx!important}.round-bl-13{border-bottom-left-radius:52rpx!important}.round-bl-14{border-bottom-left-radius:56rpx!important}.round-bl-15{border-bottom-left-radius:60rpx!important}.round-bl-16{border-bottom-left-radius:64rpx!important}.round-bl-17{border-bottom-left-radius:68rpx!important}.round-bl-18{border-bottom-left-radius:72rpx!important}.round-bl-19{border-bottom-left-radius:76rpx!important}.round-bl-20{border-bottom-left-radius:80rpx!important}.round-bl-21{border-bottom-left-radius:84rpx!important}.round-bl-22{border-bottom-left-radius:88rpx!important}.round-bl-23{border-bottom-left-radius:92rpx!important}.round-bl-24{border-bottom-left-radius:96rpx!important}.round-bl-25{border-bottom-left-radius:100rpx!important}.round-br-0{border-bottom-right-radius:0rpx!important}.round-br-1{border-bottom-right-radius:4rpx!important}.round-br-2{border-bottom-right-radius:8rpx!important}.round-br-3{border-bottom-right-radius:12rpx!important}.round-br-4{border-bottom-right-radius:16rpx!important}.round-br-5{border-bottom-right-radius:20rpx!important}.round-br-6{border-bottom-right-radius:24rpx!important}.round-br-7{border-bottom-right-radius:28rpx!important}.round-br-8{border-bottom-right-radius:32rpx!important}.round-br-9{border-bottom-right-radius:36rpx!important}.round-br-10{border-bottom-right-radius:40rpx!important}.round-br-11{border-bottom-right-radius:44rpx!important}.round-br-12{border-bottom-right-radius:48rpx!important}.round-br-13{border-bottom-right-radius:52rpx!important}.round-br-14{border-bottom-right-radius:56rpx!important}.round-br-15{border-bottom-right-radius:60rpx!important}.round-br-16{border-bottom-right-radius:64rpx!important}.round-br-17{border-bottom-right-radius:68rpx!important}.round-br-18{border-bottom-right-radius:72rpx!important}.round-br-19{border-bottom-right-radius:76rpx!important}.round-br-20{border-bottom-right-radius:80rpx!important}.round-br-21{border-bottom-right-radius:84rpx!important}.round-br-22{border-bottom-right-radius:88rpx!important}.round-br-23{border-bottom-right-radius:92rpx!important}.round-br-24{border-bottom-right-radius:96rpx!important}.round-br-25{border-bottom-right-radius:100rpx!important}.round-a-0{border-radius:0rpx!important}.round-a-1{border-radius:4rpx!important}.round-a-2{border-radius:8rpx!important}.round-a-3{border-radius:12rpx!important}.round-a-4{border-radius:16rpx!important}.round-a-5{border-radius:20rpx!important}.round-a-6{border-radius:24rpx!important}.round-a-7{border-radius:28rpx!important}.round-a-8{border-radius:32rpx!important}.round-a-9{border-radius:36rpx!important}.round-a-10{border-radius:40rpx!important}.round-a-11{border-radius:44rpx!important}.round-a-12{border-radius:48rpx!important}.round-a-13{border-radius:52rpx!important}.round-a-14{border-radius:56rpx!important}.round-a-15{border-radius:60rpx!important}.round-a-16{border-radius:64rpx!important}.round-a-17{border-radius:68rpx!important}.round-a-18{border-radius:72rpx!important}.round-a-19{border-radius:76rpx!important}.round-a-20{border-radius:80rpx!important}.round-a-21{border-radius:84rpx!important}.round-a-22{border-radius:88rpx!important}.round-a-23{border-radius:92rpx!important}.round-a-24{border-radius:96rpx!important}.round-a-25{border-radius:100rpx!important}.round-t-0{border-top-left-radius:0rpx!important;border-top-right-radius:0rpx!important}.round-t-1{border-top-left-radius:4rpx!important;border-top-right-radius:4rpx!important}.round-t-2{border-top-left-radius:8rpx!important;border-top-right-radius:8rpx!important}.round-t-3{border-top-left-radius:12rpx!important;border-top-right-radius:12rpx!important}.round-t-4{border-top-left-radius:16rpx!important;border-top-right-radius:16rpx!important}.round-t-5{border-top-left-radius:20rpx!important;border-top-right-radius:20rpx!important}.round-t-6{border-top-left-radius:24rpx!important;border-top-right-radius:24rpx!important}.round-t-7{border-top-left-radius:28rpx!important;border-top-right-radius:28rpx!important}.round-t-8{border-top-left-radius:32rpx!important;border-top-right-radius:32rpx!important}.round-t-9{border-top-left-radius:36rpx!important;border-top-right-radius:36rpx!important}.round-t-10{border-top-left-radius:40rpx!important;border-top-right-radius:40rpx!important}.round-t-11{border-top-left-radius:44rpx!important;border-top-right-radius:44rpx!important}.round-t-12{border-top-left-radius:48rpx!important;border-top-right-radius:48rpx!important}.round-t-13{border-top-left-radius:52rpx!important;border-top-right-radius:52rpx!important}.round-t-14{border-top-left-radius:56rpx!important;border-top-right-radius:56rpx!important}.round-t-15{border-top-left-radius:60rpx!important;border-top-right-radius:60rpx!important}.round-t-16{border-top-left-radius:64rpx!important;border-top-right-radius:64rpx!important}.round-t-17{border-top-left-radius:68rpx!important;border-top-right-radius:68rpx!important}.round-t-18{border-top-left-radius:72rpx!important;border-top-right-radius:72rpx!important}.round-t-19{border-top-left-radius:76rpx!important;border-top-right-radius:76rpx!important}.round-t-20{border-top-left-radius:80rpx!important;border-top-right-radius:80rpx!important}.round-t-21{border-top-left-radius:84rpx!important;border-top-right-radius:84rpx!important}.round-t-22{border-top-left-radius:88rpx!important;border-top-right-radius:88rpx!important}.round-t-23{border-top-left-radius:92rpx!important;border-top-right-radius:92rpx!important}.round-t-24{border-top-left-radius:96rpx!important;border-top-right-radius:96rpx!important}.round-t-25{border-top-left-radius:100rpx!important;border-top-right-radius:100rpx!important}.round-b-0{border-bottom-left-radius:0rpx!important;border-bottom-right-radius:0rpx!important}.round-b-1{border-bottom-left-radius:4rpx!important;border-bottom-right-radius:4rpx!important}.round-b-2{border-bottom-left-radius:8rpx!important;border-bottom-right-radius:8rpx!important}.round-b-3{border-bottom-left-radius:12rpx!important;border-bottom-right-radius:12rpx!important}.round-b-4{border-bottom-left-radius:16rpx!important;border-bottom-right-radius:16rpx!important}.round-b-5{border-bottom-left-radius:20rpx!important;border-bottom-right-radius:20rpx!important}.round-b-6{border-bottom-left-radius:24rpx!important;border-bottom-right-radius:24rpx!important}.round-b-7{border-bottom-left-radius:28rpx!important;border-bottom-right-radius:28rpx!important}.round-b-8{border-bottom-left-radius:32rpx!important;border-bottom-right-radius:32rpx!important}.round-b-9{border-bottom-left-radius:36rpx!important;border-bottom-right-radius:36rpx!important}.round-b-10{border-bottom-left-radius:40rpx!important;border-bottom-right-radius:40rpx!important}.round-b-11{border-bottom-left-radius:44rpx!important;border-bottom-right-radius:44rpx!important}.round-b-12{border-bottom-left-radius:48rpx!important;border-bottom-right-radius:48rpx!important}.round-b-13{border-bottom-left-radius:52rpx!important;border-bottom-right-radius:52rpx!important}.round-b-14{border-bottom-left-radius:56rpx!important;border-bottom-right-radius:56rpx!important}.round-b-15{border-bottom-left-radius:60rpx!important;border-bottom-right-radius:60rpx!important}.round-b-16{border-bottom-left-radius:64rpx!important;border-bottom-right-radius:64rpx!important}.round-b-17{border-bottom-left-radius:68rpx!important;border-bottom-right-radius:68rpx!important}.round-b-18{border-bottom-left-radius:72rpx!important;border-bottom-right-radius:72rpx!important}.round-b-19{border-bottom-left-radius:76rpx!important;border-bottom-right-radius:76rpx!important}.round-b-20{border-bottom-left-radius:80rpx!important;border-bottom-right-radius:80rpx!important}.round-b-21{border-bottom-left-radius:84rpx!important;border-bottom-right-radius:84rpx!important}.round-b-22{border-bottom-left-radius:88rpx!important;border-bottom-right-radius:88rpx!important}.round-b-23{border-bottom-left-radius:92rpx!important;border-bottom-right-radius:92rpx!important}.round-b-24{border-bottom-left-radius:96rpx!important;border-bottom-right-radius:96rpx!important}.round-b-25{border-bottom-left-radius:100rpx!important;border-bottom-right-radius:100rpx!important}.round-l-0{border-top-left-radius:0rpx!important;border-bottom-left-radius:0rpx!important}.round-l-1{border-top-left-radius:4rpx!important;border-bottom-left-radius:4rpx!important}.round-l-2{border-top-left-radius:8rpx!important;border-bottom-left-radius:8rpx!important}.round-l-3{border-top-left-radius:12rpx!important;border-bottom-left-radius:12rpx!important}.round-l-4{border-top-left-radius:16rpx!important;border-bottom-left-radius:16rpx!important}.round-l-5{border-top-left-radius:20rpx!important;border-bottom-left-radius:20rpx!important}.round-l-6{border-top-left-radius:24rpx!important;border-bottom-left-radius:24rpx!important}.round-l-7{border-top-left-radius:28rpx!important;border-bottom-left-radius:28rpx!important}.round-l-8{border-top-left-radius:32rpx!important;border-bottom-left-radius:32rpx!important}.round-l-9{border-top-left-radius:36rpx!important;border-bottom-left-radius:36rpx!important}.round-l-10{border-top-left-radius:40rpx!important;border-bottom-left-radius:40rpx!important}.round-l-11{border-top-left-radius:44rpx!important;border-bottom-left-radius:44rpx!important}.round-l-12{border-top-left-radius:48rpx!important;border-bottom-left-radius:48rpx!important}.round-l-13{border-top-left-radius:52rpx!important;border-bottom-left-radius:52rpx!important}.round-l-14{border-top-left-radius:56rpx!important;border-bottom-left-radius:56rpx!important}.round-l-15{border-top-left-radius:60rpx!important;border-bottom-left-radius:60rpx!important}.round-l-16{border-top-left-radius:64rpx!important;border-bottom-left-radius:64rpx!important}.round-l-17{border-top-left-radius:68rpx!important;border-bottom-left-radius:68rpx!important}.round-l-18{border-top-left-radius:72rpx!important;border-bottom-left-radius:72rpx!important}.round-l-19{border-top-left-radius:76rpx!important;border-bottom-left-radius:76rpx!important}.round-l-20{border-top-left-radius:80rpx!important;border-bottom-left-radius:80rpx!important}.round-l-21{border-top-left-radius:84rpx!important;border-bottom-left-radius:84rpx!important}.round-l-22{border-top-left-radius:88rpx!important;border-bottom-left-radius:88rpx!important}.round-l-23{border-top-left-radius:92rpx!important;border-bottom-left-radius:92rpx!important}.round-l-24{border-top-left-radius:96rpx!important;border-bottom-left-radius:96rpx!important}.round-l-25{border-top-left-radius:100rpx!important;border-bottom-left-radius:100rpx!important}.round-r-0{border-top-right-radius:0rpx!important;border-bottom-right-radius:0rpx!important}.round-r-1{border-top-right-radius:4rpx!important;border-bottom-right-radius:4rpx!important}.round-r-2{border-top-right-radius:8rpx!important;border-bottom-right-radius:8rpx!important}.round-r-3{border-top-right-radius:12rpx!important;border-bottom-right-radius:12rpx!important}.round-r-4{border-top-right-radius:16rpx!important;border-bottom-right-radius:16rpx!important}.round-r-5{border-top-right-radius:20rpx!important;border-bottom-right-radius:20rpx!important}.round-r-6{border-top-right-radius:24rpx!important;border-bottom-right-radius:24rpx!important}.round-r-7{border-top-right-radius:28rpx!important;border-bottom-right-radius:28rpx!important}.round-r-8{border-top-right-radius:32rpx!important;border-bottom-right-radius:32rpx!important}.round-r-9{border-top-right-radius:36rpx!important;border-bottom-right-radius:36rpx!important}.round-r-10{border-top-right-radius:40rpx!important;border-bottom-right-radius:40rpx!important}.round-r-11{border-top-right-radius:44rpx!important;border-bottom-right-radius:44rpx!important}.round-r-12{border-top-right-radius:48rpx!important;border-bottom-right-radius:48rpx!important}.round-r-13{border-top-right-radius:52rpx!important;border-bottom-right-radius:52rpx!important}.round-r-14{border-top-right-radius:56rpx!important;border-bottom-right-radius:56rpx!important}.round-r-15{border-top-right-radius:60rpx!important;border-bottom-right-radius:60rpx!important}.round-r-16{border-top-right-radius:64rpx!important;border-bottom-right-radius:64rpx!important}.round-r-17{border-top-right-radius:68rpx!important;border-bottom-right-radius:68rpx!important}.round-r-18{border-top-right-radius:72rpx!important;border-bottom-right-radius:72rpx!important}.round-r-19{border-top-right-radius:76rpx!important;border-bottom-right-radius:76rpx!important}.round-r-20{border-top-right-radius:80rpx!important;border-bottom-right-radius:80rpx!important}.round-r-21{border-top-right-radius:84rpx!important;border-bottom-right-radius:84rpx!important}.round-r-22{border-top-right-radius:88rpx!important;border-bottom-right-radius:88rpx!important}.round-r-23{border-top-right-radius:92rpx!important;border-bottom-right-radius:92rpx!important}.round-r-24{border-top-right-radius:96rpx!important;border-bottom-right-radius:96rpx!important}.round-r-25{border-top-right-radius:100rpx!important;border-bottom-right-radius:100rpx!important}.round-0{border-radius:0rpx}.round-1{border-radius:4rpx}.round-2{border-radius:8rpx}.round-3{border-radius:12rpx}.round-4{border-radius:16rpx}.round-5{border-radius:20rpx}.round-6{border-radius:24rpx}.round-7{border-radius:28rpx}.round-8{border-radius:32rpx}.round-9{border-radius:36rpx}.round-10{border-radius:40rpx}.round-11{border-radius:44rpx}.round-12{border-radius:48rpx}.round-13{border-radius:52rpx}.round-14{border-radius:56rpx}.round-15{border-radius:60rpx}.round-16{border-radius:64rpx}.round-17{border-radius:68rpx}.round-18{border-radius:72rpx}.round-19{border-radius:76rpx}.round-20{border-radius:80rpx}.round-21{border-radius:84rpx}.round-22{border-radius:88rpx}.round-23{border-radius:92rpx}.round-24{border-radius:96rpx}.round-25{border-radius:100rpx}.round-26{border-radius:104rpx}.rounded{border-radius:50%!important}.opacity-0{opacity:0}.opacity-1{opacity:.1}.opacity-2{opacity:.2}.opacity-3{opacity:.3}.opacity-4{opacity:.4}.opacity-5{opacity:.5}.opacity-6{opacity:.6}.opacity-7{opacity:.7}.opacity-8{opacity:.8}.opacity-9{opacity:.9}.opacity-10{opacity:1}.shadow{box-shadow:0 2rpx 12rpx rgba(0,0,0,.08)}.shadow-0{box-shadow:0 0rpx 10rpx rgba(0,0,0,.08)}.shadow-1{box-shadow:0 2rpx 12rpx rgba(0,0,0,.08)}.shadow-2{box-shadow:0 4rpx 14rpx rgba(0,0,0,.08)}.shadow-3{box-shadow:0 6rpx 16rpx rgba(0,0,0,.08)}.shadow-4{box-shadow:0 8rpx 18rpx rgba(0,0,0,.08)}.shadow-5{box-shadow:0 10rpx 20rpx rgba(0,0,0,.08)}.shadow-6{box-shadow:0 12rpx 22rpx rgba(0,0,0,.08)}.shadow-7{box-shadow:0 14rpx 24rpx rgba(0,0,0,.08)}.shadow-8{box-shadow:0 16rpx 26rpx rgba(0,0,0,.08)}.shadow-9{box-shadow:0 18rpx 28rpx rgba(0,0,0,.08)}.shadow-10{box-shadow:0 20rpx 30rpx rgba(0,0,0,.08)}.shadow-11{box-shadow:0 22rpx 32rpx rgba(0,0,0,.08)}.shadow-12{box-shadow:0 24rpx 34rpx rgba(0,0,0,.08)}.shadow-13{box-shadow:0 26rpx 36rpx rgba(0,0,0,.08)}.shadow-14{box-shadow:0 28rpx 38rpx rgba(0,0,0,.08)}.shadow-15{box-shadow:0 30rpx 40rpx rgba(0,0,0,.08)}.shadow-16{box-shadow:0 32rpx 42rpx rgba(0,0,0,.08)}.shadow-17{box-shadow:0 34rpx 44rpx rgba(0,0,0,.08)}.shadow-18{box-shadow:0 36rpx 46rpx rgba(0,0,0,.08)}.shadow-19{box-shadow:0 38rpx 48rpx rgba(0,0,0,.08)}.shadow-20{box-shadow:0 40rpx 50rpx rgba(0,0,0,.08)}.shadow-21{box-shadow:0 42rpx 52rpx rgba(0,0,0,.08)}.shadow-22{box-shadow:0 44rpx 54rpx rgba(0,0,0,.08)}.shadow-23{box-shadow:0 46rpx 56rpx rgba(0,0,0,.08)}.shadow-24{box-shadow:0 48rpx 58rpx rgba(0,0,0,.08)}.shadow-25{box-shadow:0 50rpx 60rpx rgba(0,0,0,.08)}.border-0{border:solid 0 #f5f5f5!important}.border-0-bk{border:solid 0 #282828!important}.border{border:solid 2rpx #f5f5f5!important}.border-bk{border:solid 2rpx #282828!important}.border-1{border:solid 2px #f5f5f5!important}.border-1-bk{border:solid 2px #f5f5f5!important}.border-2{border:solid 4px #f5f5f5!important}.border-2-bk{border:solid 4px #f5f5f5!important}.border-3{border:solid 6px #f5f5f5!important}.border-3-bk{border:solid 6px #f5f5f5!important}.border-4{border:solid 8px #f5f5f5!important}.border-4-bk{border:solid 8px #f5f5f5!important}.border-5{border:solid 10px #f5f5f5!important}.border-5-bk{border:solid 10px #f5f5f5!important}.border-l-1{border-left:solid 2rpx #f5f5f5!important}.border-l-1-bk{border-left:solid 2rpx #282828!important}.border-l-2{border-left:solid 4rpx #f5f5f5!important}.border-l-2-bk{border-left:solid 4rpx #282828!important}.border-l-3{border-left:solid 6rpx #f5f5f5!important}.border-l-3-bk{border-left:solid 6rpx #282828!important}.border-l-4{border-left:solid 8rpx #f5f5f5!important}.border-l-4-bk{border-left:solid 8rpx #282828!important}.border-l-5{border-left:solid 10rpx #f5f5f5!important}.border-l-5-bk{border-left:solid 10rpx #282828!important}.border-r-1{border-right:solid 2rpx #f5f5f5!important}.border-r-1-bk{border-right:solid 2rpx #282828!important}.border-r-2{border-right:solid 4rpx #f5f5f5!important}.border-r-2-bk{border-right:solid 4rpx #282828!important}.border-r-3{border-right:solid 6rpx #f5f5f5!important}.border-r-3-bk{border-right:solid 6rpx #282828!important}.border-r-4{border-right:solid 8rpx #f5f5f5!important}.border-r-4-bk{border-right:solid 8rpx #282828!important}.border-r-5{border-right:solid 10rpx #f5f5f5!important}.border-r-5-bk{border-right:solid 10rpx #282828!important}.border-t-1{border-top:solid 2rpx #f5f5f5!important}.border-t-1-bk{border-top:solid 2rpx #282828!important}.border-t-2{border-top:solid 4rpx #f5f5f5!important}.border-t-2-bk{border-top:solid 4rpx #282828!important}.border-t-3{border-top:solid 6rpx #f5f5f5!important}.border-t-3-bk{border-top:solid 6rpx #282828!important}.border-t-4{border-top:solid 8rpx #f5f5f5!important}.border-t-4-bk{border-top:solid 8rpx #282828!important}.border-t-5{border-top:solid 10rpx #f5f5f5!important}.border-t-5-bk{border-top:solid 10rpx #282828!important}.border-b-1{border-bottom:solid 2rpx #f5f5f5!important}.border-b-1-bk{border-bottom:solid 2rpx #282828!important}.border-b-2{border-bottom:solid 4rpx #f5f5f5!important}.border-b-2-bk{border-bottom:solid 4rpx #282828!important}.border-b-3{border-bottom:solid 6rpx #f5f5f5!important}.border-b-3-bk{border-bottom:solid 6rpx #282828!important}.border-b-4{border-bottom:solid 8rpx #f5f5f5!important}.border-b-4-bk{border-bottom:solid 8rpx #282828!important}.border-b-5{border-bottom:solid 10rpx #f5f5f5!important}.border-b-5-bk{border-bottom:solid 10rpx #282828!important}.border-a-1{border:solid 2rpx #f5f5f5!important}.border-a-1-bk{border:solid 2rpx #282828!important}.border-a-2{border:solid 4rpx #f5f5f5!important}.border-a-2-bk{border:solid 4rpx #282828!important}.border-a-3{border:solid 6rpx #f5f5f5!important}.border-a-3-bk{border:solid 6rpx #282828!important}.border-a-4{border:solid 8rpx #f5f5f5!important}.border-a-4-bk{border:solid 8rpx #282828!important}.border-a-5{border:solid 10rpx #f5f5f5!important}.border-a-5-bk{border:solid 10rpx #282828!important}.pa-0{padding:0rpx}.pa-1{padding:1rpx}.pa-2{padding:2rpx}.pa-3{padding:3rpx}.pa-4{padding:4rpx}.pa-5{padding:5rpx}.pa-6{padding:6rpx}.pa-7{padding:7rpx}.pa-8{padding:8rpx}.pa-9{padding:9rpx}.pa-10{padding:10rpx}.pa-11{padding:11rpx}.pa-12{padding:12rpx}.pa-13{padding:13rpx}.pa-14{padding:14rpx}.pa-15{padding:15rpx}.pa-16{padding:16rpx}.pa-17{padding:17rpx}.pa-18{padding:18rpx}.pa-19{padding:19rpx}.pa-20{padding:20rpx}.pa-21{padding:21rpx}.pa-22{padding:22rpx}.pa-23{padding:23rpx}.pa-24{padding:24rpx}.pa-25{padding:25rpx}.pa-n1{padding:4rpx}.pa-n2{padding:8rpx}.pa-n3{padding:12rpx}.pa-n4{padding:16rpx}.pa-n5{padding:20rpx}.pa-n6{padding:24rpx}.pa-n7{padding:28rpx}.pa-n8{padding:32rpx}.pa-n9{padding:36rpx}.pa-n10{padding:40rpx}.pa-n11{padding:44rpx}.pa-n12{padding:48rpx}.pa-n13{padding:52rpx}.pa-n14{padding:56rpx}.pa-n15{padding:60rpx}.pa-n16{padding:64rpx}.pa-n17{padding:68rpx}.pa-n18{padding:72rpx}.pa-n19{padding:76rpx}.pa-n20{padding:80rpx}.pa-n21{padding:84rpx}.pa-n22{padding:88rpx}.pa-n23{padding:92rpx}.pa-n24{padding:96rpx}.pa-n25{padding:100rpx}.pt-0{padding-top:0rpx}.pt-1{padding-top:1rpx}.pt-2{padding-top:2rpx}.pt-3{padding-top:3rpx}.pt-4{padding-top:4rpx}.pt-5{padding-top:5rpx}.pt-6{padding-top:6rpx}.pt-7{padding-top:7rpx}.pt-8{padding-top:8rpx}.pt-9{padding-top:9rpx}.pt-10{padding-top:10rpx}.pt-11{padding-top:11rpx}.pt-12{padding-top:12rpx}.pt-13{padding-top:13rpx}.pt-14{padding-top:14rpx}.pt-15{padding-top:15rpx}.pt-16{padding-top:16rpx}.pt-17{padding-top:17rpx}.pt-18{padding-top:18rpx}.pt-19{padding-top:19rpx}.pt-20{padding-top:20rpx}.pt-21{padding-top:21rpx}.pt-22{padding-top:22rpx}.pt-23{padding-top:23rpx}.pt-24{padding-top:24rpx}.pt-25{padding-top:25rpx}.pt-n1{padding-top:4rpx}.pt-n2{padding-top:8rpx}.pt-n3{padding-top:12rpx}.pt-n4{padding-top:16rpx}.pt-n5{padding-top:20rpx}.pt-n6{padding-top:24rpx}.pt-n7{padding-top:28rpx}.pt-n8{padding-top:32rpx}.pt-n9{padding-top:36rpx}.pt-n10{padding-top:40rpx}.pt-n11{padding-top:44rpx}.pt-n12{padding-top:48rpx}.pt-n13{padding-top:52rpx}.pt-n14{padding-top:56rpx}.pt-n15{padding-top:60rpx}.pt-n16{padding-top:64rpx}.pt-n17{padding-top:68rpx}.pt-n18{padding-top:72rpx}.pt-n19{padding-top:76rpx}.pt-n20{padding-top:80rpx}.pt-n21{padding-top:84rpx}.pt-n22{padding-top:88rpx}.pt-n23{padding-top:92rpx}.pt-n24{padding-top:96rpx}.pt-n25{padding-top:100rpx}.pr-0{padding-right:0rpx}.pr-1{padding-right:1rpx}.pr-2{padding-right:2rpx}.pr-3{padding-right:3rpx}.pr-4{padding-right:4rpx}.pr-5{padding-right:5rpx}.pr-6{padding-right:6rpx}.pr-7{padding-right:7rpx}.pr-8{padding-right:8rpx}.pr-9{padding-right:9rpx}.pr-10{padding-right:10rpx}.pr-11{padding-right:11rpx}.pr-12{padding-right:12rpx}.pr-13{padding-right:13rpx}.pr-14{padding-right:14rpx}.pr-15{padding-right:15rpx}.pr-16{padding-right:16rpx}.pr-17{padding-right:17rpx}.pr-18{padding-right:18rpx}.pr-19{padding-right:19rpx}.pr-20{padding-right:20rpx}.pr-21{padding-right:21rpx}.pr-22{padding-right:22rpx}.pr-23{padding-right:23rpx}.pr-24{padding-right:24rpx}.pr-25{padding-right:25rpx}.pr-n1{padding-right:4rpx}.pr-n2{padding-right:8rpx}.pr-n3{padding-right:12rpx}.pr-n4{padding-right:16rpx}.pr-n5{padding-right:20rpx}.pr-n6{padding-right:24rpx}.pr-n7{padding-right:28rpx}.pr-n8{padding-right:32rpx}.pr-n9{padding-right:36rpx}.pr-n10{padding-right:40rpx}.pr-n11{padding-right:44rpx}.pr-n12{padding-right:48rpx}.pr-n13{padding-right:52rpx}.pr-n14{padding-right:56rpx}.pr-n15{padding-right:60rpx}.pr-n16{padding-right:64rpx}.pr-n17{padding-right:68rpx}.pr-n18{padding-right:72rpx}.pr-n19{padding-right:76rpx}.pr-n20{padding-right:80rpx}.pr-n21{padding-right:84rpx}.pr-n22{padding-right:88rpx}.pr-n23{padding-right:92rpx}.pr-n24{padding-right:96rpx}.pr-n25{padding-right:100rpx}.pb-0{padding-bottom:0rpx}.pb-1{padding-bottom:1rpx}.pb-2{padding-bottom:2rpx}.pb-3{padding-bottom:3rpx}.pb-4{padding-bottom:4rpx}.pb-5{padding-bottom:5rpx}.pb-6{padding-bottom:6rpx}.pb-7{padding-bottom:7rpx}.pb-8{padding-bottom:8rpx}.pb-9{padding-bottom:9rpx}.pb-10{padding-bottom:10rpx}.pb-11{padding-bottom:11rpx}.pb-12{padding-bottom:12rpx}.pb-13{padding-bottom:13rpx}.pb-14{padding-bottom:14rpx}.pb-15{padding-bottom:15rpx}.pb-16{padding-bottom:16rpx}.pb-17{padding-bottom:17rpx}.pb-18{padding-bottom:18rpx}.pb-19{padding-bottom:19rpx}.pb-20{padding-bottom:20rpx}.pb-21{padding-bottom:21rpx}.pb-22{padding-bottom:22rpx}.pb-23{padding-bottom:23rpx}.pb-24{padding-bottom:24rpx}.pb-25{padding-bottom:25rpx}.pb-n1{padding-bottom:4rpx}.pb-n2{padding-bottom:8rpx}.pb-n3{padding-bottom:12rpx}.pb-n4{padding-bottom:16rpx}.pb-n5{padding-bottom:20rpx}.pb-n6{padding-bottom:24rpx}.pb-n7{padding-bottom:28rpx}.pb-n8{padding-bottom:32rpx}.pb-n9{padding-bottom:36rpx}.pb-n10{padding-bottom:40rpx}.pb-n11{padding-bottom:44rpx}.pb-n12{padding-bottom:48rpx}.pb-n13{padding-bottom:52rpx}.pb-n14{padding-bottom:56rpx}.pb-n15{padding-bottom:60rpx}.pb-n16{padding-bottom:64rpx}.pb-n17{padding-bottom:68rpx}.pb-n18{padding-bottom:72rpx}.pb-n19{padding-bottom:76rpx}.pb-n20{padding-bottom:80rpx}.pb-n21{padding-bottom:84rpx}.pb-n22{padding-bottom:88rpx}.pb-n23{padding-bottom:92rpx}.pb-n24{padding-bottom:96rpx}.pb-n25{padding-bottom:100rpx}.pl-0{padding-left:0rpx}.pl-1{padding-left:1rpx}.pl-2{padding-left:2rpx}.pl-3{padding-left:3rpx}.pl-4{padding-left:4rpx}.pl-5{padding-left:5rpx}.pl-6{padding-left:6rpx}.pl-7{padding-left:7rpx}.pl-8{padding-left:8rpx}.pl-9{padding-left:9rpx}.pl-10{padding-left:10rpx}.pl-11{padding-left:11rpx}.pl-12{padding-left:12rpx}.pl-13{padding-left:13rpx}.pl-14{padding-left:14rpx}.pl-15{padding-left:15rpx}.pl-16{padding-left:16rpx}.pl-17{padding-left:17rpx}.pl-18{padding-left:18rpx}.pl-19{padding-left:19rpx}.pl-20{padding-left:20rpx}.pl-21{padding-left:21rpx}.pl-22{padding-left:22rpx}.pl-23{padding-left:23rpx}.pl-24{padding-left:24rpx}.pl-25{padding-left:25rpx}.pl-n1{padding-left:4rpx}.pl-n2{padding-left:8rpx}.pl-n3{padding-left:12rpx}.pl-n4{padding-left:16rpx}.pl-n5{padding-left:20rpx}.pl-n6{padding-left:24rpx}.pl-n7{padding-left:28rpx}.pl-n8{padding-left:32rpx}.pl-n9{padding-left:36rpx}.pl-n10{padding-left:40rpx}.pl-n11{padding-left:44rpx}.pl-n12{padding-left:48rpx}.pl-n13{padding-left:52rpx}.pl-n14{padding-left:56rpx}.pl-n15{padding-left:60rpx}.pl-n16{padding-left:64rpx}.pl-n17{padding-left:68rpx}.pl-n18{padding-left:72rpx}.pl-n19{padding-left:76rpx}.pl-n20{padding-left:80rpx}.pl-n21{padding-left:84rpx}.pl-n22{padding-left:88rpx}.pl-n23{padding-left:92rpx}.pl-n24{padding-left:96rpx}.pl-n25{padding-left:100rpx}.px-0{padding-left:0rpx;padding-right:0rpx}.px-1{padding-left:1rpx;padding-right:1rpx}.px-2{padding-left:2rpx;padding-right:2rpx}.px-3{padding-left:3rpx;padding-right:3rpx}.px-4{padding-left:4rpx;padding-right:4rpx}.px-5{padding-left:5rpx;padding-right:5rpx}.px-6{padding-left:6rpx;padding-right:6rpx}.px-7{padding-left:7rpx;padding-right:7rpx}.px-8{padding-left:8rpx;padding-right:8rpx}.px-9{padding-left:9rpx;padding-right:9rpx}.px-10{padding-left:10rpx;padding-right:10rpx}.px-11{padding-left:11rpx;padding-right:11rpx}.px-12{padding-left:12rpx;padding-right:12rpx}.px-13{padding-left:13rpx;padding-right:13rpx}.px-14{padding-left:14rpx;padding-right:14rpx}.px-15{padding-left:15rpx;padding-right:15rpx}.px-16{padding-left:16rpx;padding-right:16rpx}.px-17{padding-left:17rpx;padding-right:17rpx}.px-18{padding-left:18rpx;padding-right:18rpx}.px-19{padding-left:19rpx;padding-right:19rpx}.px-20{padding-left:20rpx;padding-right:20rpx}.px-21{padding-left:21rpx;padding-right:21rpx}.px-22{padding-left:22rpx;padding-right:22rpx}.px-23{padding-left:23rpx;padding-right:23rpx}.px-24{padding-left:24rpx;padding-right:24rpx}.px-25{padding-left:25rpx;padding-right:25rpx}.px-n1{padding-left:4rpx;padding-right:4rpx}.px-n2{padding-left:8rpx;padding-right:8rpx}.px-n3{padding-left:12rpx;padding-right:12rpx}.px-n4{padding-left:16rpx;padding-right:16rpx}.px-n5{padding-left:20rpx;padding-right:20rpx}.px-n6{padding-left:24rpx;padding-right:24rpx}.px-n7{padding-left:28rpx;padding-right:28rpx}.px-n8{padding-left:32rpx;padding-right:32rpx}.px-n9{padding-left:36rpx;padding-right:36rpx}.px-n10{padding-left:40rpx;padding-right:40rpx}.px-n11{padding-left:44rpx;padding-right:44rpx}.px-n12{padding-left:48rpx;padding-right:48rpx}.px-n13{padding-left:52rpx;padding-right:52rpx}.px-n14{padding-left:56rpx;padding-right:56rpx}.px-n15{padding-left:60rpx;padding-right:60rpx}.px-n16{padding-left:64rpx;padding-right:64rpx}.px-n17{padding-left:68rpx;padding-right:68rpx}.px-n18{padding-left:72rpx;padding-right:72rpx}.px-n19{padding-left:76rpx;padding-right:76rpx}.px-n20{padding-left:80rpx;padding-right:80rpx}.px-n21{padding-left:84rpx;padding-right:84rpx}.px-n22{padding-left:88rpx;padding-right:88rpx}.px-n23{padding-left:92rpx;padding-right:92rpx}.px-n24{padding-left:96rpx;padding-right:96rpx}.px-n25{padding-left:100rpx;padding-right:100rpx}.py-0{padding-top:0rpx;padding-bottom:0rpx}.py-1{padding-top:1rpx;padding-bottom:1rpx}.py-2{padding-top:2rpx;padding-bottom:2rpx}.py-3{padding-top:3rpx;padding-bottom:3rpx}.py-4{padding-top:4rpx;padding-bottom:4rpx}.py-5{padding-top:5rpx;padding-bottom:5rpx}.py-6{padding-top:6rpx;padding-bottom:6rpx}.py-7{padding-top:7rpx;padding-bottom:7rpx}.py-8{padding-top:8rpx;padding-bottom:8rpx}.py-9{padding-top:9rpx;padding-bottom:9rpx}.py-10{padding-top:10rpx;padding-bottom:10rpx}.py-11{padding-top:11rpx;padding-bottom:11rpx}.py-12{padding-top:12rpx;padding-bottom:12rpx}.py-13{padding-top:13rpx;padding-bottom:13rpx}.py-14{padding-top:14rpx;padding-bottom:14rpx}.py-15{padding-top:15rpx;padding-bottom:15rpx}.py-16{padding-top:16rpx;padding-bottom:16rpx}.py-17{padding-top:17rpx;padding-bottom:17rpx}.py-18{padding-top:18rpx;padding-bottom:18rpx}.py-19{padding-top:19rpx;padding-bottom:19rpx}.py-20{padding-top:20rpx;padding-bottom:20rpx}.py-21{padding-top:21rpx;padding-bottom:21rpx}.py-22{padding-top:22rpx;padding-bottom:22rpx}.py-23{padding-top:23rpx;padding-bottom:23rpx}.py-24{padding-top:24rpx;padding-bottom:24rpx}.py-25{padding-top:25rpx;padding-bottom:25rpx}.py-n1{padding-top:4rpx;padding-bottom:4rpx}.py-n2{padding-top:8rpx;padding-bottom:8rpx}.py-n3{padding-top:12rpx;padding-bottom:12rpx}.py-n4{padding-top:16rpx;padding-bottom:16rpx}.py-n5{padding-top:20rpx;padding-bottom:20rpx}.py-n6{padding-top:24rpx;padding-bottom:24rpx}.py-n7{padding-top:28rpx;padding-bottom:28rpx}.py-n8{padding-top:32rpx;padding-bottom:32rpx}.py-n9{padding-top:36rpx;padding-bottom:36rpx}.py-n10{padding-top:40rpx;padding-bottom:40rpx}.py-n11{padding-top:44rpx;padding-bottom:44rpx}.py-n12{padding-top:48rpx;padding-bottom:48rpx}.py-n13{padding-top:52rpx;padding-bottom:52rpx}.py-n14{padding-top:56rpx;padding-bottom:56rpx}.py-n15{padding-top:60rpx;padding-bottom:60rpx}.py-n16{padding-top:64rpx;padding-bottom:64rpx}.py-n17{padding-top:68rpx;padding-bottom:68rpx}.py-n18{padding-top:72rpx;padding-bottom:72rpx}.py-n19{padding-top:76rpx;padding-bottom:76rpx}.py-n20{padding-top:80rpx;padding-bottom:80rpx}.py-n21{padding-top:84rpx;padding-bottom:84rpx}.py-n22{padding-top:88rpx;padding-bottom:88rpx}.py-n23{padding-top:92rpx;padding-bottom:92rpx}.py-n24{padding-top:96rpx;padding-bottom:96rpx}.py-n25{padding-top:100rpx;padding-bottom:100rpx}.ma-0{margin:0rpx}.ma-1{margin:1rpx}.ma-2{margin:2rpx}.ma-3{margin:3rpx}.ma-4{margin:4rpx}.ma-5{margin:5rpx}.ma-6{margin:6rpx}.ma-7{margin:7rpx}.ma-8{margin:8rpx}.ma-9{margin:9rpx}.ma-10{margin:10rpx}.ma-11{margin:11rpx}.ma-12{margin:12rpx}.ma-13{margin:13rpx}.ma-14{margin:14rpx}.ma-15{margin:15rpx}.ma-16{margin:16rpx}.ma-17{margin:17rpx}.ma-18{margin:18rpx}.ma-19{margin:19rpx}.ma-20{margin:20rpx}.ma-21{margin:21rpx}.ma-22{margin:22rpx}.ma-23{margin:23rpx}.ma-24{margin:24rpx}.ma-25{margin:25rpx}.ma-n1{margin:4rpx}.ma-n2{margin:8rpx}.ma-n3{margin:12rpx}.ma-n4{margin:16rpx}.ma-n5{margin:20rpx}.ma-n6{margin:24rpx}.ma-n7{margin:28rpx}.ma-n8{margin:32rpx}.ma-n9{margin:36rpx}.ma-n10{margin:40rpx}.ma-n11{margin:44rpx}.ma-n12{margin:48rpx}.ma-n13{margin:52rpx}.ma-n14{margin:56rpx}.ma-n15{margin:60rpx}.ma-n16{margin:64rpx}.ma-n17{margin:68rpx}.ma-n18{margin:72rpx}.ma-n19{margin:76rpx}.ma-n20{margin:80rpx}.ma-n21{margin:84rpx}.ma-n22{margin:88rpx}.ma-n23{margin:92rpx}.ma-n24{margin:96rpx}.ma-n25{margin:100rpx}.mt-0{margin-top:0rpx}.mt--0{margin-top:0rpx}.mt-1{margin-top:1rpx}.mt--1{margin-top:-1rpx}.mt-2{margin-top:2rpx}.mt--2{margin-top:-2rpx}.mt-3{margin-top:3rpx}.mt--3{margin-top:-3rpx}.mt-4{margin-top:4rpx}.mt--4{margin-top:-4rpx}.mt-5{margin-top:5rpx}.mt--5{margin-top:-5rpx}.mt-6{margin-top:6rpx}.mt--6{margin-top:-6rpx}.mt-7{margin-top:7rpx}.mt--7{margin-top:-7rpx}.mt-8{margin-top:8rpx}.mt--8{margin-top:-8rpx}.mt-9{margin-top:9rpx}.mt--9{margin-top:-9rpx}.mt-10{margin-top:10rpx}.mt--10{margin-top:-10rpx}.mt-11{margin-top:11rpx}.mt--11{margin-top:-11rpx}.mt-12{margin-top:12rpx}.mt--12{margin-top:-12rpx}.mt-13{margin-top:13rpx}.mt--13{margin-top:-13rpx}.mt-14{margin-top:14rpx}.mt--14{margin-top:-14rpx}.mt-15{margin-top:15rpx}.mt--15{margin-top:-15rpx}.mt-16{margin-top:16rpx}.mt--16{margin-top:-16rpx}.mt-17{margin-top:17rpx}.mt--17{margin-top:-17rpx}.mt-18{margin-top:18rpx}.mt--18{margin-top:-18rpx}.mt-19{margin-top:19rpx}.mt--19{margin-top:-19rpx}.mt-20{margin-top:20rpx}.mt--20{margin-top:-20rpx}.mt-21{margin-top:21rpx}.mt--21{margin-top:-21rpx}.mt-22{margin-top:22rpx}.mt--22{margin-top:-22rpx}.mt-23{margin-top:23rpx}.mt--23{margin-top:-23rpx}.mt-24{margin-top:24rpx}.mt--24{margin-top:-24rpx}.mt-25{margin-top:25rpx}.mt--25{margin-top:-25rpx}.mt-n1{margin-top:4rpx}.mt--n1{margin-top:-4rpx}.mt-n2{margin-top:8rpx}.mt--n2{margin-top:-8rpx}.mt-n3{margin-top:12rpx}.mt--n3{margin-top:-12rpx}.mt-n4{margin-top:16rpx}.mt--n4{margin-top:-16rpx}.mt-n5{margin-top:20rpx}.mt--n5{margin-top:-20rpx}.mt-n6{margin-top:24rpx}.mt--n6{margin-top:-24rpx}.mt-n7{margin-top:28rpx}.mt--n7{margin-top:-28rpx}.mt-n8{margin-top:32rpx}.mt--n8{margin-top:-32rpx}.mt-n9{margin-top:36rpx}.mt--n9{margin-top:-36rpx}.mt-n10{margin-top:40rpx}.mt--n10{margin-top:-40rpx}.mt-n11{margin-top:44rpx}.mt--n11{margin-top:-44rpx}.mt-n12{margin-top:48rpx}.mt--n12{margin-top:-48rpx}.mt-n13{margin-top:52rpx}.mt--n13{margin-top:-52rpx}.mt-n14{margin-top:56rpx}.mt--n14{margin-top:-56rpx}.mt-n15{margin-top:60rpx}.mt--n15{margin-top:-60rpx}.mt-n16{margin-top:64rpx}.mt--n16{margin-top:-64rpx}.mt-n17{margin-top:68rpx}.mt--n17{margin-top:-68rpx}.mt-n18{margin-top:72rpx}.mt--n18{margin-top:-72rpx}.mt-n19{margin-top:76rpx}.mt--n19{margin-top:-76rpx}.mt-n20{margin-top:80rpx}.mt--n20{margin-top:-80rpx}.mt-n21{margin-top:84rpx}.mt--n21{margin-top:-84rpx}.mt-n22{margin-top:88rpx}.mt--n22{margin-top:-88rpx}.mt-n23{margin-top:92rpx}.mt--n23{margin-top:-92rpx}.mt-n24{margin-top:96rpx}.mt--n24{margin-top:-96rpx}.mt-n25{margin-top:100rpx}.mt--n25{margin-top:-100rpx}.mr-0{margin-right:0rpx}.mr--0{margin-right:0rpx}.mr-1{margin-right:1rpx}.mr--1{margin-right:-1rpx}.mr-2{margin-right:2rpx}.mr--2{margin-right:-2rpx}.mr-3{margin-right:3rpx}.mr--3{margin-right:-3rpx}.mr-4{margin-right:4rpx}.mr--4{margin-right:-4rpx}.mr-5{margin-right:5rpx}.mr--5{margin-right:-5rpx}.mr-6{margin-right:6rpx}.mr--6{margin-right:-6rpx}.mr-7{margin-right:7rpx}.mr--7{margin-right:-7rpx}.mr-8{margin-right:8rpx}.mr--8{margin-right:-8rpx}.mr-9{margin-right:9rpx}.mr--9{margin-right:-9rpx}.mr-10{margin-right:10rpx}.mr--10{margin-right:-10rpx}.mr-11{margin-right:11rpx}.mr--11{margin-right:-11rpx}.mr-12{margin-right:12rpx}.mr--12{margin-right:-12rpx}.mr-13{margin-right:13rpx}.mr--13{margin-right:-13rpx}.mr-14{margin-right:14rpx}.mr--14{margin-right:-14rpx}.mr-15{margin-right:15rpx}.mr--15{margin-right:-15rpx}.mr-16{margin-right:16rpx}.mr--16{margin-right:-16rpx}.mr-17{margin-right:17rpx}.mr--17{margin-right:-17rpx}.mr-18{margin-right:18rpx}.mr--18{margin-right:-18rpx}.mr-19{margin-right:19rpx}.mr--19{margin-right:-19rpx}.mr-20{margin-right:20rpx}.mr--20{margin-right:-20rpx}.mr-21{margin-right:21rpx}.mr--21{margin-right:-21rpx}.mr-22{margin-right:22rpx}.mr--22{margin-right:-22rpx}.mr-23{margin-right:23rpx}.mr--23{margin-right:-23rpx}.mr-24{margin-right:24rpx}.mr--24{margin-right:-24rpx}.mr-25{margin-right:25rpx}.mr--25{margin-right:-25rpx}.mr-n1{margin-right:4rpx}.mr--n1{margin-right:-4rpx}.mr-n2{margin-right:8rpx}.mr--n2{margin-right:-8rpx}.mr-n3{margin-right:12rpx}.mr--n3{margin-right:-12rpx}.mr-n4{margin-right:16rpx}.mr--n4{margin-right:-16rpx}.mr-n5{margin-right:20rpx}.mr--n5{margin-right:-20rpx}.mr-n6{margin-right:24rpx}.mr--n6{margin-right:-24rpx}.mr-n7{margin-right:28rpx}.mr--n7{margin-right:-28rpx}.mr-n8{margin-right:32rpx}.mr--n8{margin-right:-32rpx}.mr-n9{margin-right:36rpx}.mr--n9{margin-right:-36rpx}.mr-n10{margin-right:40rpx}.mr--n10{margin-right:-40rpx}.mr-n11{margin-right:44rpx}.mr--n11{margin-right:-44rpx}.mr-n12{margin-right:48rpx}.mr--n12{margin-right:-48rpx}.mr-n13{margin-right:52rpx}.mr--n13{margin-right:-52rpx}.mr-n14{margin-right:56rpx}.mr--n14{margin-right:-56rpx}.mr-n15{margin-right:60rpx}.mr--n15{margin-right:-60rpx}.mr-n16{margin-right:64rpx}.mr--n16{margin-right:-64rpx}.mr-n17{margin-right:68rpx}.mr--n17{margin-right:-68rpx}.mr-n18{margin-right:72rpx}.mr--n18{margin-right:-72rpx}.mr-n19{margin-right:76rpx}.mr--n19{margin-right:-76rpx}.mr-n20{margin-right:80rpx}.mr--n20{margin-right:-80rpx}.mr-n21{margin-right:84rpx}.mr--n21{margin-right:-84rpx}.mr-n22{margin-right:88rpx}.mr--n22{margin-right:-88rpx}.mr-n23{margin-right:92rpx}.mr--n23{margin-right:-92rpx}.mr-n24{margin-right:96rpx}.mr--n24{margin-right:-96rpx}.mr-n25{margin-right:100rpx}.mr--n25{margin-right:-100rpx}.mb-0{margin-bottom:0rpx}.mb--0{margin-bottom:0rpx}.mb-1{margin-bottom:1rpx}.mb--1{margin-bottom:-1rpx}.mb-2{margin-bottom:2rpx}.mb--2{margin-bottom:-2rpx}.mb-3{margin-bottom:3rpx}.mb--3{margin-bottom:-3rpx}.mb-4{margin-bottom:4rpx}.mb--4{margin-bottom:-4rpx}.mb-5{margin-bottom:5rpx}.mb--5{margin-bottom:-5rpx}.mb-6{margin-bottom:6rpx}.mb--6{margin-bottom:-6rpx}.mb-7{margin-bottom:7rpx}.mb--7{margin-bottom:-7rpx}.mb-8{margin-bottom:8rpx}.mb--8{margin-bottom:-8rpx}.mb-9{margin-bottom:9rpx}.mb--9{margin-bottom:-9rpx}.mb-10{margin-bottom:10rpx}.mb--10{margin-bottom:-10rpx}.mb-11{margin-bottom:11rpx}.mb--11{margin-bottom:-11rpx}.mb-12{margin-bottom:12rpx}.mb--12{margin-bottom:-12rpx}.mb-13{margin-bottom:13rpx}.mb--13{margin-bottom:-13rpx}.mb-14{margin-bottom:14rpx}.mb--14{margin-bottom:-14rpx}.mb-15{margin-bottom:15rpx}.mb--15{margin-bottom:-15rpx}.mb-16{margin-bottom:16rpx}.mb--16{margin-bottom:-16rpx}.mb-17{margin-bottom:17rpx}.mb--17{margin-bottom:-17rpx}.mb-18{margin-bottom:18rpx}.mb--18{margin-bottom:-18rpx}.mb-19{margin-bottom:19rpx}.mb--19{margin-bottom:-19rpx}.mb-20{margin-bottom:20rpx}.mb--20{margin-bottom:-20rpx}.mb-21{margin-bottom:21rpx}.mb--21{margin-bottom:-21rpx}.mb-22{margin-bottom:22rpx}.mb--22{margin-bottom:-22rpx}.mb-23{margin-bottom:23rpx}.mb--23{margin-bottom:-23rpx}.mb-24{margin-bottom:24rpx}.mb--24{margin-bottom:-24rpx}.mb-25{margin-bottom:25rpx}.mb--25{margin-bottom:-25rpx}.mb-n1{margin-bottom:4rpx}.mb--n1{margin-bottom:-4rpx}.mb-n2{margin-bottom:8rpx}.mb--n2{margin-bottom:-8rpx}.mb-n3{margin-bottom:12rpx}.mb--n3{margin-bottom:-12rpx}.mb-n4{margin-bottom:16rpx}.mb--n4{margin-bottom:-16rpx}.mb-n5{margin-bottom:20rpx}.mb--n5{margin-bottom:-20rpx}.mb-n6{margin-bottom:24rpx}.mb--n6{margin-bottom:-24rpx}.mb-n7{margin-bottom:28rpx}.mb--n7{margin-bottom:-28rpx}.mb-n8{margin-bottom:32rpx}.mb--n8{margin-bottom:-32rpx}.mb-n9{margin-bottom:36rpx}.mb--n9{margin-bottom:-36rpx}.mb-n10{margin-bottom:40rpx}.mb--n10{margin-bottom:-40rpx}.mb-n11{margin-bottom:44rpx}.mb--n11{margin-bottom:-44rpx}.mb-n12{margin-bottom:48rpx}.mb--n12{margin-bottom:-48rpx}.mb-n13{margin-bottom:52rpx}.mb--n13{margin-bottom:-52rpx}.mb-n14{margin-bottom:56rpx}.mb--n14{margin-bottom:-56rpx}.mb-n15{margin-bottom:60rpx}.mb--n15{margin-bottom:-60rpx}.mb-n16{margin-bottom:64rpx}.mb--n16{margin-bottom:-64rpx}.mb-n17{margin-bottom:68rpx}.mb--n17{margin-bottom:-68rpx}.mb-n18{margin-bottom:72rpx}.mb--n18{margin-bottom:-72rpx}.mb-n19{margin-bottom:76rpx}.mb--n19{margin-bottom:-76rpx}.mb-n20{margin-bottom:80rpx}.mb--n20{margin-bottom:-80rpx}.mb-n21{margin-bottom:84rpx}.mb--n21{margin-bottom:-84rpx}.mb-n22{margin-bottom:88rpx}.mb--n22{margin-bottom:-88rpx}.mb-n23{margin-bottom:92rpx}.mb--n23{margin-bottom:-92rpx}.mb-n24{margin-bottom:96rpx}.mb--n24{margin-bottom:-96rpx}.mb-n25{margin-bottom:100rpx}.mb--n25{margin-bottom:-100rpx}.ml-0{margin-left:0rpx}.ml--0{margin-left:0rpx}.ml-1{margin-left:1rpx}.ml--1{margin-left:-1rpx}.ml-2{margin-left:2rpx}.ml--2{margin-left:-2rpx}.ml-3{margin-left:3rpx}.ml--3{margin-left:-3rpx}.ml-4{margin-left:4rpx}.ml--4{margin-left:-4rpx}.ml-5{margin-left:5rpx}.ml--5{margin-left:-5rpx}.ml-6{margin-left:6rpx}.ml--6{margin-left:-6rpx}.ml-7{margin-left:7rpx}.ml--7{margin-left:-7rpx}.ml-8{margin-left:8rpx}.ml--8{margin-left:-8rpx}.ml-9{margin-left:9rpx}.ml--9{margin-left:-9rpx}.ml-10{margin-left:10rpx}.ml--10{margin-left:-10rpx}.ml-11{margin-left:11rpx}.ml--11{margin-left:-11rpx}.ml-12{margin-left:12rpx}.ml--12{margin-left:-12rpx}.ml-13{margin-left:13rpx}.ml--13{margin-left:-13rpx}.ml-14{margin-left:14rpx}.ml--14{margin-left:-14rpx}.ml-15{margin-left:15rpx}.ml--15{margin-left:-15rpx}.ml-16{margin-left:16rpx}.ml--16{margin-left:-16rpx}.ml-17{margin-left:17rpx}.ml--17{margin-left:-17rpx}.ml-18{margin-left:18rpx}.ml--18{margin-left:-18rpx}.ml-19{margin-left:19rpx}.ml--19{margin-left:-19rpx}.ml-20{margin-left:20rpx}.ml--20{margin-left:-20rpx}.ml-21{margin-left:21rpx}.ml--21{margin-left:-21rpx}.ml-22{margin-left:22rpx}.ml--22{margin-left:-22rpx}.ml-23{margin-left:23rpx}.ml--23{margin-left:-23rpx}.ml-24{margin-left:24rpx}.ml--24{margin-left:-24rpx}.ml-25{margin-left:25rpx}.ml--25{margin-left:-25rpx}.ml-n1{margin-left:4rpx}.ml--n1{margin-left:-4rpx}.ml-n2{margin-left:8rpx}.ml--n2{margin-left:-8rpx}.ml-n3{margin-left:12rpx}.ml--n3{margin-left:-12rpx}.ml-n4{margin-left:16rpx}.ml--n4{margin-left:-16rpx}.ml-n5{margin-left:20rpx}.ml--n5{margin-left:-20rpx}.ml-n6{margin-left:24rpx}.ml--n6{margin-left:-24rpx}.ml-n7{margin-left:28rpx}.ml--n7{margin-left:-28rpx}.ml-n8{margin-left:32rpx}.ml--n8{margin-left:-32rpx}.ml-n9{margin-left:36rpx}.ml--n9{margin-left:-36rpx}.ml-n10{margin-left:40rpx}.ml--n10{margin-left:-40rpx}.ml-n11{margin-left:44rpx}.ml--n11{margin-left:-44rpx}.ml-n12{margin-left:48rpx}.ml--n12{margin-left:-48rpx}.ml-n13{margin-left:52rpx}.ml--n13{margin-left:-52rpx}.ml-n14{margin-left:56rpx}.ml--n14{margin-left:-56rpx}.ml-n15{margin-left:60rpx}.ml--n15{margin-left:-60rpx}.ml-n16{margin-left:64rpx}.ml--n16{margin-left:-64rpx}.ml-n17{margin-left:68rpx}.ml--n17{margin-left:-68rpx}.ml-n18{margin-left:72rpx}.ml--n18{margin-left:-72rpx}.ml-n19{margin-left:76rpx}.ml--n19{margin-left:-76rpx}.ml-n20{margin-left:80rpx}.ml--n20{margin-left:-80rpx}.ml-n21{margin-left:84rpx}.ml--n21{margin-left:-84rpx}.ml-n22{margin-left:88rpx}.ml--n22{margin-left:-88rpx}.ml-n23{margin-left:92rpx}.ml--n23{margin-left:-92rpx}.ml-n24{margin-left:96rpx}.ml--n24{margin-left:-96rpx}.ml-n25{margin-left:100rpx}.ml--n25{margin-left:-100rpx}.mx-0{margin-left:0rpx;margin-right:0rpx}.mx-1{margin-left:1rpx;margin-right:1rpx}.mx-2{margin-left:2rpx;margin-right:2rpx}.mx-3{margin-left:3rpx;margin-right:3rpx}.mx-4{margin-left:4rpx;margin-right:4rpx}.mx-5{margin-left:5rpx;margin-right:5rpx}.mx-6{margin-left:6rpx;margin-right:6rpx}.mx-7{margin-left:7rpx;margin-right:7rpx}.mx-8{margin-left:8rpx;margin-right:8rpx}.mx-9{margin-left:9rpx;margin-right:9rpx}.mx-10{margin-left:10rpx;margin-right:10rpx}.mx-11{margin-left:11rpx;margin-right:11rpx}.mx-12{margin-left:12rpx;margin-right:12rpx}.mx-13{margin-left:13rpx;margin-right:13rpx}.mx-14{margin-left:14rpx;margin-right:14rpx}.mx-15{margin-left:15rpx;margin-right:15rpx}.mx-16{margin-left:16rpx;margin-right:16rpx}.mx-17{margin-left:17rpx;margin-right:17rpx}.mx-18{margin-left:18rpx;margin-right:18rpx}.mx-19{margin-left:19rpx;margin-right:19rpx}.mx-20{margin-left:20rpx;margin-right:20rpx}.mx-21{margin-left:21rpx;margin-right:21rpx}.mx-22{margin-left:22rpx;margin-right:22rpx}.mx-23{margin-left:23rpx;margin-right:23rpx}.mx-24{margin-left:24rpx;margin-right:24rpx}.mx-25{margin-left:25rpx;margin-right:25rpx}.mx-n1{margin-left:4rpx;margin-right:4rpx}.mx-n2{margin-left:8rpx;margin-right:8rpx}.mx-n3{margin-left:12rpx;margin-right:12rpx}.mx-n4{margin-left:16rpx;margin-right:16rpx}.mx-n5{margin-left:20rpx;margin-right:20rpx}.mx-n6{margin-left:24rpx;margin-right:24rpx}.mx-n7{margin-left:28rpx;margin-right:28rpx}.mx-n8{margin-left:32rpx;margin-right:32rpx}.mx-n9{margin-left:36rpx;margin-right:36rpx}.mx-n10{margin-left:40rpx;margin-right:40rpx}.mx-n11{margin-left:44rpx;margin-right:44rpx}.mx-n12{margin-left:48rpx;margin-right:48rpx}.mx-n13{margin-left:52rpx;margin-right:52rpx}.mx-n14{margin-left:56rpx;margin-right:56rpx}.mx-n15{margin-left:60rpx;margin-right:60rpx}.mx-n16{margin-left:64rpx;margin-right:64rpx}.mx-n17{margin-left:68rpx;margin-right:68rpx}.mx-n18{margin-left:72rpx;margin-right:72rpx}.mx-n19{margin-left:76rpx;margin-right:76rpx}.mx-n20{margin-left:80rpx;margin-right:80rpx}.mx-n21{margin-left:84rpx;margin-right:84rpx}.mx-n22{margin-left:88rpx;margin-right:88rpx}.mx-n23{margin-left:92rpx;margin-right:92rpx}.mx-n24{margin-left:96rpx;margin-right:96rpx}.mx-n25{margin-left:100rpx;margin-right:100rpx}.my-0{margin-top:0rpx;margin-bottom:0rpx}.my-1{margin-top:1rpx;margin-bottom:1rpx}.my-2{margin-top:2rpx;margin-bottom:2rpx}.my-3{margin-top:3rpx;margin-bottom:3rpx}.my-4{margin-top:4rpx;margin-bottom:4rpx}.my-5{margin-top:5rpx;margin-bottom:5rpx}.my-6{margin-top:6rpx;margin-bottom:6rpx}.my-7{margin-top:7rpx;margin-bottom:7rpx}.my-8{margin-top:8rpx;margin-bottom:8rpx}.my-9{margin-top:9rpx;margin-bottom:9rpx}.my-10{margin-top:10rpx;margin-bottom:10rpx}.my-11{margin-top:11rpx;margin-bottom:11rpx}.my-12{margin-top:12rpx;margin-bottom:12rpx}.my-13{margin-top:13rpx;margin-bottom:13rpx}.my-14{margin-top:14rpx;margin-bottom:14rpx}.my-15{margin-top:15rpx;margin-bottom:15rpx}.my-16{margin-top:16rpx;margin-bottom:16rpx}.my-17{margin-top:17rpx;margin-bottom:17rpx}.my-18{margin-top:18rpx;margin-bottom:18rpx}.my-19{margin-top:19rpx;margin-bottom:19rpx}.my-20{margin-top:20rpx;margin-bottom:20rpx}.my-21{margin-top:21rpx;margin-bottom:21rpx}.my-22{margin-top:22rpx;margin-bottom:22rpx}.my-23{margin-top:23rpx;margin-bottom:23rpx}.my-24{margin-top:24rpx;margin-bottom:24rpx}.my-25{margin-top:25rpx;margin-bottom:25rpx}.my-n1{margin-top:4rpx;margin-bottom:4rpx}.my-n2{margin-top:8rpx;margin-bottom:8rpx}.my-n3{margin-top:12rpx;margin-bottom:12rpx}.my-n4{margin-top:16rpx;margin-bottom:16rpx}.my-n5{margin-top:20rpx;margin-bottom:20rpx}.my-n6{margin-top:24rpx;margin-bottom:24rpx}.my-n7{margin-top:28rpx;margin-bottom:28rpx}.my-n8{margin-top:32rpx;margin-bottom:32rpx}.my-n9{margin-top:36rpx;margin-bottom:36rpx}.my-n10{margin-top:40rpx;margin-bottom:40rpx}.my-n11{margin-top:44rpx;margin-bottom:44rpx}.my-n12{margin-top:48rpx;margin-bottom:48rpx}.my-n13{margin-top:52rpx;margin-bottom:52rpx}.my-n14{margin-top:56rpx;margin-bottom:56rpx}.my-n15{margin-top:60rpx;margin-bottom:60rpx}.my-n16{margin-top:64rpx;margin-bottom:64rpx}.my-n17{margin-top:68rpx;margin-bottom:68rpx}.my-n18{margin-top:72rpx;margin-bottom:72rpx}.my-n19{margin-top:76rpx;margin-bottom:76rpx}.my-n20{margin-top:80rpx;margin-bottom:80rpx}.my-n21{margin-top:84rpx;margin-bottom:84rpx}.my-n22{margin-top:88rpx;margin-bottom:88rpx}.my-n23{margin-top:92rpx;margin-bottom:92rpx}.my-n24{margin-top:96rpx;margin-bottom:96rpx}.my-n25{margin-top:100rpx;margin-bottom:100rpx}.t-0{top:0rpx}.t--0{top:0rpx}.t-1{top:1rpx}.t--1{top:-1rpx}.t-2{top:2rpx}.t--2{top:-2rpx}.t-3{top:3rpx}.t--3{top:-3rpx}.t-4{top:4rpx}.t--4{top:-4rpx}.t-5{top:5rpx}.t--5{top:-5rpx}.t-6{top:6rpx}.t--6{top:-6rpx}.t-7{top:7rpx}.t--7{top:-7rpx}.t-8{top:8rpx}.t--8{top:-8rpx}.t-9{top:9rpx}.t--9{top:-9rpx}.t-10{top:10rpx}.t--10{top:-10rpx}.t-11{top:11rpx}.t--11{top:-11rpx}.t-12{top:12rpx}.t--12{top:-12rpx}.t-13{top:13rpx}.t--13{top:-13rpx}.t-14{top:14rpx}.t--14{top:-14rpx}.t-15{top:15rpx}.t--15{top:-15rpx}.t-16{top:16rpx}.t--16{top:-16rpx}.t-17{top:17rpx}.t--17{top:-17rpx}.t-18{top:18rpx}.t--18{top:-18rpx}.t-19{top:19rpx}.t--19{top:-19rpx}.t-20{top:20rpx}.t--20{top:-20rpx}.t-21{top:21rpx}.t--21{top:-21rpx}.t-22{top:22rpx}.t--22{top:-22rpx}.t-23{top:23rpx}.t--23{top:-23rpx}.t-24{top:24rpx}.t--24{top:-24rpx}.t-25{top:25rpx}.t--25{top:-25rpx}.t-n1{top:4rpx}.t--n1{top:-4rpx}.t-n2{top:8rpx}.t--n2{top:-8rpx}.t-n3{top:12rpx}.t--n3{top:-12rpx}.t-n4{top:16rpx}.t--n4{top:-16rpx}.t-n5{top:20rpx}.t--n5{top:-20rpx}.t-n6{top:24rpx}.t--n6{top:-24rpx}.t-n7{top:28rpx}.t--n7{top:-28rpx}.t-n8{top:32rpx}.t--n8{top:-32rpx}.t-n9{top:36rpx}.t--n9{top:-36rpx}.t-n10{top:40rpx}.t--n10{top:-40rpx}.t-n11{top:44rpx}.t--n11{top:-44rpx}.t-n12{top:48rpx}.t--n12{top:-48rpx}.t-n13{top:52rpx}.t--n13{top:-52rpx}.t-n14{top:56rpx}.t--n14{top:-56rpx}.t-n15{top:60rpx}.t--n15{top:-60rpx}.t-n16{top:64rpx}.t--n16{top:-64rpx}.t-n17{top:68rpx}.t--n17{top:-68rpx}.t-n18{top:72rpx}.t--n18{top:-72rpx}.t-n19{top:76rpx}.t--n19{top:-76rpx}.t-n20{top:80rpx}.t--n20{top:-80rpx}.t-n21{top:84rpx}.t--n21{top:-84rpx}.t-n22{top:88rpx}.t--n22{top:-88rpx}.t-n23{top:92rpx}.t--n23{top:-92rpx}.t-n24{top:96rpx}.t--n24{top:-96rpx}.t-n25{top:100rpx}.t--n25{top:-100rpx}.r-0{right:0rpx}.r--0{right:0rpx}.r-1{right:1rpx}.r--1{right:-1rpx}.r-2{right:2rpx}.r--2{right:-2rpx}.r-3{right:3rpx}.r--3{right:-3rpx}.r-4{right:4rpx}.r--4{right:-4rpx}.r-5{right:5rpx}.r--5{right:-5rpx}.r-6{right:6rpx}.r--6{right:-6rpx}.r-7{right:7rpx}.r--7{right:-7rpx}.r-8{right:8rpx}.r--8{right:-8rpx}.r-9{right:9rpx}.r--9{right:-9rpx}.r-10{right:10rpx}.r--10{right:-10rpx}.r-11{right:11rpx}.r--11{right:-11rpx}.r-12{right:12rpx}.r--12{right:-12rpx}.r-13{right:13rpx}.r--13{right:-13rpx}.r-14{right:14rpx}.r--14{right:-14rpx}.r-15{right:15rpx}.r--15{right:-15rpx}.r-16{right:16rpx}.r--16{right:-16rpx}.r-17{right:17rpx}.r--17{right:-17rpx}.r-18{right:18rpx}.r--18{right:-18rpx}.r-19{right:19rpx}.r--19{right:-19rpx}.r-20{right:20rpx}.r--20{right:-20rpx}.r-21{right:21rpx}.r--21{right:-21rpx}.r-22{right:22rpx}.r--22{right:-22rpx}.r-23{right:23rpx}.r--23{right:-23rpx}.r-24{right:24rpx}.r--24{right:-24rpx}.r-25{right:25rpx}.r--25{right:-25rpx}.r-n1{right:4rpx}.r--n1{right:-4rpx}.r-n2{right:8rpx}.r--n2{right:-8rpx}.r-n3{right:12rpx}.r--n3{right:-12rpx}.r-n4{right:16rpx}.r--n4{right:-16rpx}.r-n5{right:20rpx}.r--n5{right:-20rpx}.r-n6{right:24rpx}.r--n6{right:-24rpx}.r-n7{right:28rpx}.r--n7{right:-28rpx}.r-n8{right:32rpx}.r--n8{right:-32rpx}.r-n9{right:36rpx}.r--n9{right:-36rpx}.r-n10{right:40rpx}.r--n10{right:-40rpx}.r-n11{right:44rpx}.r--n11{right:-44rpx}.r-n12{right:48rpx}.r--n12{right:-48rpx}.r-n13{right:52rpx}.r--n13{right:-52rpx}.r-n14{right:56rpx}.r--n14{right:-56rpx}.r-n15{right:60rpx}.r--n15{right:-60rpx}.r-n16{right:64rpx}.r--n16{right:-64rpx}.r-n17{right:68rpx}.r--n17{right:-68rpx}.r-n18{right:72rpx}.r--n18{right:-72rpx}.r-n19{right:76rpx}.r--n19{right:-76rpx}.r-n20{right:80rpx}.r--n20{right:-80rpx}.r-n21{right:84rpx}.r--n21{right:-84rpx}.r-n22{right:88rpx}.r--n22{right:-88rpx}.r-n23{right:92rpx}.r--n23{right:-92rpx}.r-n24{right:96rpx}.r--n24{right:-96rpx}.r-n25{right:100rpx}.r--n25{right:-100rpx}.b-0{bottom:0rpx}.b--0{bottom:0rpx}.b-1{bottom:1rpx}.b--1{bottom:-1rpx}.b-2{bottom:2rpx}.b--2{bottom:-2rpx}.b-3{bottom:3rpx}.b--3{bottom:-3rpx}.b-4{bottom:4rpx}.b--4{bottom:-4rpx}.b-5{bottom:5rpx}.b--5{bottom:-5rpx}.b-6{bottom:6rpx}.b--6{bottom:-6rpx}.b-7{bottom:7rpx}.b--7{bottom:-7rpx}.b-8{bottom:8rpx}.b--8{bottom:-8rpx}.b-9{bottom:9rpx}.b--9{bottom:-9rpx}.b-10{bottom:10rpx}.b--10{bottom:-10rpx}.b-11{bottom:11rpx}.b--11{bottom:-11rpx}.b-12{bottom:12rpx}.b--12{bottom:-12rpx}.b-13{bottom:13rpx}.b--13{bottom:-13rpx}.b-14{bottom:14rpx}.b--14{bottom:-14rpx}.b-15{bottom:15rpx}.b--15{bottom:-15rpx}.b-16{bottom:16rpx}.b--16{bottom:-16rpx}.b-17{bottom:17rpx}.b--17{bottom:-17rpx}.b-18{bottom:18rpx}.b--18{bottom:-18rpx}.b-19{bottom:19rpx}.b--19{bottom:-19rpx}.b-20{bottom:20rpx}.b--20{bottom:-20rpx}.b-21{bottom:21rpx}.b--21{bottom:-21rpx}.b-22{bottom:22rpx}.b--22{bottom:-22rpx}.b-23{bottom:23rpx}.b--23{bottom:-23rpx}.b-24{bottom:24rpx}.b--24{bottom:-24rpx}.b-25{bottom:25rpx}.b--25{bottom:-25rpx}.b-n1{bottom:4rpx}.b--n1{bottom:-4rpx}.b-n2{bottom:8rpx}.b--n2{bottom:-8rpx}.b-n3{bottom:12rpx}.b--n3{bottom:-12rpx}.b-n4{bottom:16rpx}.b--n4{bottom:-16rpx}.b-n5{bottom:20rpx}.b--n5{bottom:-20rpx}.b-n6{bottom:24rpx}.b--n6{bottom:-24rpx}.b-n7{bottom:28rpx}.b--n7{bottom:-28rpx}.b-n8{bottom:32rpx}.b--n8{bottom:-32rpx}.b-n9{bottom:36rpx}.b--n9{bottom:-36rpx}.b-n10{bottom:40rpx}.b--n10{bottom:-40rpx}.b-n11{bottom:44rpx}.b--n11{bottom:-44rpx}.b-n12{bottom:48rpx}.b--n12{bottom:-48rpx}.b-n13{bottom:52rpx}.b--n13{bottom:-52rpx}.b-n14{bottom:56rpx}.b--n14{bottom:-56rpx}.b-n15{bottom:60rpx}.b--n15{bottom:-60rpx}.b-n16{bottom:64rpx}.b--n16{bottom:-64rpx}.b-n17{bottom:68rpx}.b--n17{bottom:-68rpx}.b-n18{bottom:72rpx}.b--n18{bottom:-72rpx}.b-n19{bottom:76rpx}.b--n19{bottom:-76rpx}.b-n20{bottom:80rpx}.b--n20{bottom:-80rpx}.b-n21{bottom:84rpx}.b--n21{bottom:-84rpx}.b-n22{bottom:88rpx}.b--n22{bottom:-88rpx}.b-n23{bottom:92rpx}.b--n23{bottom:-92rpx}.b-n24{bottom:96rpx}.b--n24{bottom:-96rpx}.b-n25{bottom:100rpx}.b--n25{bottom:-100rpx}.l-0{left:0rpx}.l--0{left:0rpx}.l-1{left:1rpx}.l--1{left:-1rpx}.l-2{left:2rpx}.l--2{left:-2rpx}.l-3{left:3rpx}.l--3{left:-3rpx}.l-4{left:4rpx}.l--4{left:-4rpx}.l-5{left:5rpx}.l--5{left:-5rpx}.l-6{left:6rpx}.l--6{left:-6rpx}.l-7{left:7rpx}.l--7{left:-7rpx}.l-8{left:8rpx}.l--8{left:-8rpx}.l-9{left:9rpx}.l--9{left:-9rpx}.l-10{left:10rpx}.l--10{left:-10rpx}.l-11{left:11rpx}.l--11{left:-11rpx}.l-12{left:12rpx}.l--12{left:-12rpx}.l-13{left:13rpx}.l--13{left:-13rpx}.l-14{left:14rpx}.l--14{left:-14rpx}.l-15{left:15rpx}.l--15{left:-15rpx}.l-16{left:16rpx}.l--16{left:-16rpx}.l-17{left:17rpx}.l--17{left:-17rpx}.l-18{left:18rpx}.l--18{left:-18rpx}.l-19{left:19rpx}.l--19{left:-19rpx}.l-20{left:20rpx}.l--20{left:-20rpx}.l-21{left:21rpx}.l--21{left:-21rpx}.l-22{left:22rpx}.l--22{left:-22rpx}.l-23{left:23rpx}.l--23{left:-23rpx}.l-24{left:24rpx}.l--24{left:-24rpx}.l-25{left:25rpx}.l--25{left:-25rpx}.l-n1{left:4rpx}.l--n1{left:-4rpx}.l-n2{left:8rpx}.l--n2{left:-8rpx}.l-n3{left:12rpx}.l--n3{left:-12rpx}.l-n4{left:16rpx}.l--n4{left:-16rpx}.l-n5{left:20rpx}.l--n5{left:-20rpx}.l-n6{left:24rpx}.l--n6{left:-24rpx}.l-n7{left:28rpx}.l--n7{left:-28rpx}.l-n8{left:32rpx}.l--n8{left:-32rpx}.l-n9{left:36rpx}.l--n9{left:-36rpx}.l-n10{left:40rpx}.l--n10{left:-40rpx}.l-n11{left:44rpx}.l--n11{left:-44rpx}.l-n12{left:48rpx}.l--n12{left:-48rpx}.l-n13{left:52rpx}.l--n13{left:-52rpx}.l-n14{left:56rpx}.l--n14{left:-56rpx}.l-n15{left:60rpx}.l--n15{left:-60rpx}.l-n16{left:64rpx}.l--n16{left:-64rpx}.l-n17{left:68rpx}.l--n17{left:-68rpx}.l-n18{left:72rpx}.l--n18{left:-72rpx}.l-n19{left:76rpx}.l--n19{left:-76rpx}.l-n20{left:80rpx}.l--n20{left:-80rpx}.l-n21{left:84rpx}.l--n21{left:-84rpx}.l-n22{left:88rpx}.l--n22{left:-88rpx}.l-n23{left:92rpx}.l--n23{left:-92rpx}.l-n24{left:96rpx}.l--n24{left:-96rpx}.l-n25{left:100rpx}.l--n25{left:-100rpx}.grid{display:grid!important}.grid-col-1{grid-template-columns:repeat(1,1fr)}.grid-col-2{grid-template-columns:repeat(2,1fr)}.grid-col-3{grid-template-columns:repeat(3,1fr)}.grid-col-4{grid-template-columns:repeat(4,1fr)}.grid-col-5{grid-template-columns:repeat(5,1fr)}.grid-col-6{grid-template-columns:repeat(6,1fr)}.grid-col-7{grid-template-columns:repeat(7,1fr)}.grid-col-8{grid-template-columns:repeat(8,1fr)}.grid-col-9{grid-template-columns:repeat(9,1fr)}.grid-col-10{grid-template-columns:repeat(10,1fr)}.grid-col-11{grid-template-columns:repeat(11,1fr)}.gap-1{gap:2rpx}.gap-col-1{grid-column-gap:2rpx}.gap-row-1{grid-row-gap:2rpx}.gap-2{gap:4rpx}.gap-col-2{grid-column-gap:4rpx}.gap-row-2{grid-row-gap:4rpx}.gap-3{gap:6rpx}.gap-col-3{grid-column-gap:6rpx}.gap-row-3{grid-row-gap:6rpx}.gap-4{gap:8rpx}.gap-col-4{grid-column-gap:8rpx}.gap-row-4{grid-row-gap:8rpx}.gap-5{gap:10rpx}.gap-col-5{grid-column-gap:10rpx}.gap-row-5{grid-row-gap:10rpx}.gap-6{gap:12rpx}.gap-col-6{grid-column-gap:12rpx}.gap-row-6{grid-row-gap:12rpx}.gap-7{gap:14rpx}.gap-col-7{grid-column-gap:14rpx}.gap-row-7{grid-row-gap:14rpx}.gap-8{gap:16rpx}.gap-col-8{grid-column-gap:16rpx}.gap-row-8{grid-row-gap:16rpx}.gap-9{gap:18rpx}.gap-col-9{grid-column-gap:18rpx}.gap-row-9{grid-row-gap:18rpx}.gap-10{gap:20rpx}.gap-col-10{grid-column-gap:20rpx}.gap-row-10{grid-row-gap:20rpx}.gap-11{gap:22rpx}.gap-col-11{grid-column-gap:22rpx}.gap-row-11{grid-row-gap:22rpx}.gap-12{gap:24rpx}.gap-col-12{grid-column-gap:24rpx}.gap-row-12{grid-row-gap:24rpx}.gap-13{gap:26rpx}.gap-col-13{grid-column-gap:26rpx}.gap-row-13{grid-row-gap:26rpx}.gap-14{gap:28rpx}.gap-col-14{grid-column-gap:28rpx}.gap-row-14{grid-row-gap:28rpx}.gap-15{gap:30rpx}.gap-col-15{grid-column-gap:30rpx}.gap-row-15{grid-row-gap:30rpx}.gap-16{gap:32rpx}.gap-col-16{grid-column-gap:32rpx}.gap-row-16{grid-row-gap:32rpx}.gap-17{gap:34rpx}.gap-col-17{grid-column-gap:34rpx}.gap-row-17{grid-row-gap:34rpx}.gap-18{gap:36rpx}.gap-col-18{grid-column-gap:36rpx}.gap-row-18{grid-row-gap:36rpx}.gap-19{gap:38rpx}.gap-col-19{grid-column-gap:38rpx}.gap-row-19{grid-row-gap:38rpx}.gap-20{gap:40rpx}.gap-col-20{grid-column-gap:40rpx}.gap-row-20{grid-row-gap:40rpx}.gap-21{gap:42rpx}.gap-col-21{grid-column-gap:42rpx}.gap-row-21{grid-row-gap:42rpx}.gap-22{gap:44rpx}.gap-col-22{grid-column-gap:44rpx}.gap-row-22{grid-row-gap:44rpx}.gap-23{gap:46rpx}.gap-col-23{grid-column-gap:46rpx}.gap-row-23{grid-row-gap:46rpx}.gap-24{gap:48rpx}.gap-col-24{grid-column-gap:48rpx}.gap-row-24{grid-row-gap:48rpx}.gap-25{gap:50rpx}.gap-col-25{grid-column-gap:50rpx}.gap-row-25{grid-row-gap:50rpx}.flex{display:flex!important}.flex-col{flex-direction:column!important}.flex-wrap{flex-flow:row wrap!important}.flex-shrink{flex-shrink:0!important}.flex-row{flex-direction:row!important}.flex-reverse{flex-direction:row-reverse!important}.flex-row-top-start{justify-content:flex-start!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-row-top-center{justify-content:center!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-row-top-end{justify-content:flex-end!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-row-center-start{justify-content:flex-start!important;align-items:center!important;align-content:center;display:flex!important}.flex-row-center-center{justify-content:center!important;align-items:center!important;align-content:center;display:flex!important}.flex-row-center-end{justify-content:flex-end!important;align-items:center!important;align-content:center;display:flex!important}.flex-row-bottom-start{justify-content:flex-start!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-row-bottom-center{justify-content:center!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-row-bottom-end{justify-content:flex-end!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-row-center-between{justify-content:space-between!important;align-items:center!important;align-content:center;display:flex!important}.flex-col-top-start{justify-content:flex-start!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-col-top-center{justify-content:flex-start!important;align-items:center!important;align-content:center;display:flex!important}.flex-col-top-end{justify-content:flex-start!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-col-center-start{justify-content:center!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-col-center-center{justify-content:center!important;align-items:center!important;align-content:center;display:flex!important}.flex-col-center-end{justify-content:center!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-col-bottom-start{justify-content:flex-end!important;align-items:flex-start!important;align-content:center;display:flex!important}.flex-col-bottom-center{justify-content:flex-end!important;align-items:center!important;align-content:center;display:flex!important}.flex-col-bottom-end{justify-content:flex-end!important;align-items:flex-end!important;align-content:center;display:flex!important}.flex-start{justify-content:flex-start!important;align-items:center!important;align-content:center;display:flex!important}.flex-end{justify-content:flex-end!important;align-items:center!important;align-content:center;display:flex!important}.flex-center{justify-content:center!important;align-items:center!important;align-content:center;display:flex!important}.flex-between{justify-content:space-between}.flex-col-full{flex-direction:column;align-items:stretch}.flex-around{justify-content:space-around}.flex-row-baseline-start{justify-content:flex-start!important;align-items:baseline!important;align-content:center;display:flex!important}.flex-row-baseline-center{justify-content:center!important;align-items:baseline!important;align-content:center;display:flex!important}.flex-row-baseline-end{justify-content:flex-end!important;align-items:baseline!important;align-content:center;display:flex!important}.flex-0{flex-grow:0!important}.flex-1{flex-grow:1!important}.flex-2{flex-grow:2!important}.flex-3{flex-grow:3!important}.flex-4{flex-grow:4!important}.flex-5{flex-grow:5!important}.flex-6{flex-grow:6!important}.flex-7{flex-grow:7!important}.flex-8{flex-grow:8!important}.flex-9{flex-grow:9!important}.flex-10{flex-grow:10!important}.flex-11{flex-grow:11!important}.flex-12{flex-grow:12!important}.text-red{color:#f44336!important}.red{background-color:#f44336}.text-pink{color:#e91e63!important}.pink{background-color:#e91e63}.text-purple{color:#9c27b0!important}.purple{background-color:#9c27b0}.text-deep-purple{color:#673ab7!important}.deep-purple{background-color:#673ab7}.text-indigo{color:#3f51b5!important}.indigo{background-color:#3f51b5}.text-blue{color:#2196f3!important}.blue{background-color:#2196f3}.text-light-blue{color:#03a9f4!important}.light-blue{background-color:#03a9f4}.text-cyan{color:#00bcd4!important}.cyan{background-color:#00bcd4}.text-teal{color:#009688!important}.teal{background-color:#009688}.text-green{color:#4caf50!important}.green{background-color:#4caf50}.text-light-green{color:#8bc34a!important}.light-green{background-color:#8bc34a}.text-lime{color:#cddc39!important}.lime{background-color:#cddc39}.text-yellow{color:#ffeb3b!important}.yellow{background-color:#ffeb3b}.text-amber{color:#ffc107!important}.amber{background-color:#ffc107}.text-orange{color:#ff9800!important}.orange{background-color:#ff9800}.text-deep-orange{color:#ff5722!important}.deep-orange{background-color:#ff5722}.text-brown{color:#795548!important}.brown{background-color:#795548}.text-blue-grey{color:#607d8b!important}.blue-grey{background-color:#607d8b}.text-grey{color:#9e9e9e!important}.grey{background-color:#9e9e9e}.text-black{color:#000!important}.black{background-color:#000}.text-white{color:#fff!important}.white{background-color:#fff}.text-lighten-5{color:#fafafa!important}.lighten-5{background-color:#fafafa}.text-lighten-4{color:#f5f5f5!important}.lighten-4{background-color:#f5f5f5}.text-lighten-3{color:#eee!important}.lighten-3{background-color:#eee}.text-lighten-2{color:#e0e0e0!important}.lighten-2{background-color:#e0e0e0}.text-lighten-1{color:#bdbdbd!important}.lighten-1{background-color:#bdbdbd}.text-darken-1{color:#757575!important}.darken-1{background-color:#757575}.text-darken-2{color:#616161!important}.darken-2{background-color:#616161}.text-darken-3{color:#424242!important}.darken-3{background-color:#424242}.text-darken-4{color:#212121!important}.darken-4{background-color:#212121}.text-darken-5{color:#131313!important}.darken-5{background-color:#131313}.text-darken-6{color:#0a0a0a!important}.darken-6{background-color:#0a0a0a}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/css/tmui.scss b/src/uni_modules/tm-ui/css/tmui.scss
index 5f1b5eb..d50e529 100644
--- a/src/uni_modules/tm-ui/css/tmui.scss
+++ b/src/uni_modules/tm-ui/css/tmui.scss
@@ -1,17 +1,13 @@
-
.uni-input-input[type="password"]::-ms-reveal {
- display: none
- }
+ display: none;
+}
.tableHeader .uni-scroll-view::-webkit-scrollbar,
.tableHeader .uni-scroll-view::-webkit-scrollbar {
display: none;
}
-
-
.safe-height {
height: var(--window-bottom);
}
-
.safe-top {
height: var(--window-top);
}
@@ -53,10 +49,10 @@
$v_position: (
- relative: relative,
- absolute: absolute,
- fixed: fixed,
- sticky: sticky
+ relative: relative,
+ absolute: absolute,
+ fixed: fixed,
+ sticky: sticky
);
@each $name,
@@ -155,7 +151,7 @@ $key in (top: top, middle: middle, bottom: bottom) {
}
// 多行文本缩略。text-overflow-行:数字
-@for $i from 1 to 5 {
+@for $i from 1 to 6 {
.text-overflow-#{$i} {
@include text-overflow(100%, -webkit-box, inherit);
-webkit-line-clamp: $i;
@@ -295,11 +291,11 @@ $key in (tl: 'tl', tr: 'tr', bl: 'bl', br: 'br', a: 'a', t: 't', b: 'b', l: 'l',
@for $i from 0 to 6 {
@if $i==0 {
.border-0 {
- border: solid 0rpx #f5f5f5 !important;
+ border: solid 0 #f5f5f5 !important;
}
.border-0-bk {
- border: solid 0rpx #282828 !important;
+ border: solid 0 #282828 !important;
}
.border {
@@ -483,7 +479,8 @@ $key in (t: 'top', r: 'right', b: 'bottom', l: 'left') {
.grid{
display: grid !important;
}
-@for $i from 1 to 12 {
+
+@for $i from 1 to 13 {
.grid-col-#{$i} {
grid-template-columns: repeat(#{$i * 1},1fr);
}
@@ -502,7 +499,7 @@ $key in (t: 'top', r: 'right', b: 'bottom', l: 'left') {
// Flex辅助。
-@mixin dsplay-flex($justify, $items, $content) {
+@mixin display-flex($justify, $items, $content) {
justify-content: $justify !important;
align-items: $items !important;
align-content: $content;
@@ -525,12 +522,10 @@ $key in (t: 'top', r: 'right', b: 'bottom', l: 'left') {
flex-flow: row wrap !important;
}
-/* #ifndef APP-PLUS-NVUE */
.flex-shrink {
flex-shrink: 0 !important;
}
-/* #endif */
.flex-row {
flex-direction: row !important;
}
@@ -538,118 +533,117 @@ $key in (t: 'top', r: 'right', b: 'bottom', l: 'left') {
.flex-reverse {
flex-direction: row-reverse !important;
}
-
//row模式下,上左对齐
.flex-row-top-start {
- @include dsplay-flex(flex-start, flex-start, center);
+ @include display-flex(flex-start, flex-start, center);
}
//row模式下,上中对齐
.flex-row-top-center {
- @include dsplay-flex(center, flex-start, center);
+ @include display-flex(center, flex-start, center);
}
//row模式下,上右对齐
.flex-row-top-end {
- @include dsplay-flex(flex-end, flex-start, center);
+ @include display-flex(flex-end, flex-start, center);
}
//row模式下,中左对齐
.flex-row-center-start {
- @include dsplay-flex(flex-start, center, center);
+ @include display-flex(flex-start, center, center);
}
//row模式下,中中对齐
.flex-row-center-center {
- @include dsplay-flex(center, center, center);
+ @include display-flex(center, center, center);
}
//row模式下,上右对齐
.flex-row-center-end {
- @include dsplay-flex(flex-end, center, center);
+ @include display-flex(flex-end, center, center);
}
//row模式下,下左对齐
.flex-row-bottom-start {
- @include dsplay-flex(flex-start, flex-end, center);
+ @include display-flex(flex-start, flex-end, center);
}
//row模式下,下中对齐
.flex-row-bottom-center {
- @include dsplay-flex(center, flex-end, center);
+ @include display-flex(center, flex-end, center);
}
//row模式下,下右对齐
.flex-row-bottom-end {
- @include dsplay-flex(flex-end, flex-end, center);
+ @include display-flex(flex-end, flex-end, center);
}
//上下居中,两边对齐。
.flex-row-center-between {
- @include dsplay-flex(space-between, center, center);
+ @include display-flex(space-between, center, center);
}
//--------
//col模式下,上左对齐
.flex-col-top-start {
- @include dsplay-flex(flex-start, flex-start, center);
+ @include display-flex(flex-start, flex-start, center);
}
//col模式下,上中对齐
.flex-col-top-center {
- @include dsplay-flex(flex-start, center, center);
+ @include display-flex(flex-start, center, center);
}
//col模式下,上右对齐
.flex-col-top-end {
- @include dsplay-flex(flex-start, flex-end, center);
+ @include display-flex(flex-start, flex-end, center);
}
//col模式下,中左对齐
.flex-col-center-start {
- @include dsplay-flex(center, flex-start, center);
+ @include display-flex(center, flex-start, center);
}
//col模式下,中中对齐
.flex-col-center-center {
- @include dsplay-flex(center, center, center);
+ @include display-flex(center, center, center);
}
//col模式下,上右对齐
.flex-col-center-end {
- @include dsplay-flex(center, flex-end, center);
+ @include display-flex(center, flex-end, center);
}
//col模式下,下左对齐
.flex-col-bottom-start {
- @include dsplay-flex(flex-end, flex-start, center);
+ @include display-flex(flex-end, flex-start, center);
}
//col模式下,下中对齐
.flex-col-bottom-center {
- @include dsplay-flex(flex-end, center, center);
+ @include display-flex(flex-end, center, center);
}
//col模式下,下右对齐
.flex-col-bottom-end {
- @include dsplay-flex(flex-end, flex-end, center);
+ @include display-flex(flex-end, flex-end, center);
}
//-----------
// row居中左对齐
.flex-start {
- @include dsplay-flex(flex-start, center, center);
+ @include display-flex(flex-start, center, center);
}
// row居中右对齐
.flex-end {
- @include dsplay-flex(flex-end, center, center);
+ @include display-flex(flex-end, center, center);
}
// col,row上下左右居中对齐
.flex-center {
- @include dsplay-flex(center, center, center);
+ @include display-flex(center, center, center);
}
// col,row两端对齐
@@ -669,25 +663,22 @@ $key in (t: 'top', r: 'right', b: 'bottom', l: 'left') {
}
.flex-row-baseline-start {
- justify-content: flex-start !important;
- align-items: baseline !important;
- align-content: center;
- align-content: center;
- display: flex !important;
+ justify-content: flex-start !important;
+ align-items: baseline !important;
+ align-content: center;
+ display: flex !important;
}
.flex-row-baseline-center {
- justify-content: center !important;
- align-items: baseline !important;
- align-content: center;
- align-content: center;
- display: flex !important;
+ justify-content: center !important;
+ align-items: baseline !important;
+ align-content: center;
+ display: flex !important;
}
.flex-row-baseline-end {
- justify-content: flex-end !important;
- align-items: baseline !important;
- align-content: center;
- align-content: center;
- display: flex !important;
+ justify-content: flex-end !important;
+ align-items: baseline !important;
+ align-content: center;
+ display: flex !important;
}
@for $i from 0 through 12 {
@@ -697,40 +688,40 @@ $key in (t: 'top', r: 'right', b: 'bottom', l: 'left') {
}
$colorsDefault: (
- 'grey': #9e9e9e,
- 'black': #000000,
- 'white': #ffffff,
- 'lighten-5': #fafafa,
- 'lighten-4': #f5f5f5,
- 'lighten-3': #eeeeee,
- 'lighten-2': #e0e0e0,
- 'lighten-1': #bdbdbd,
- 'darken-1': #757575,
- 'darken-2': #616161,
- 'darken-3': #424242,
- 'darken-4': #212121,
- 'darken-5': #131313,
- 'darken-6': #0a0a0a
+ 'grey': #9e9e9e,
+ 'black': #000000,
+ 'white': #ffffff,
+ 'lighten-5': #fafafa,
+ 'lighten-4': #f5f5f5,
+ 'lighten-3': #eeeeee,
+ 'lighten-2': #e0e0e0,
+ 'lighten-1': #bdbdbd,
+ 'darken-1': #757575,
+ 'darken-2': #616161,
+ 'darken-3': #424242,
+ 'darken-4': #212121,
+ 'darken-5': #131313,
+ 'darken-6': #0a0a0a
);
$colors: (
- 'red': #f44336,
- 'pink': #e91e63,
- 'purple': #9c27b0,
- 'deep-purple': #673ab7,
- 'indigo': #3f51b5,
- 'blue': #2196f3,
- 'light-blue': #03a9f4,
- 'cyan': #00bcd4,
- 'teal': #009688,
- 'green': #4caf50,
- 'light-green': #8bc34a,
- 'lime': #cddc39,
- 'yellow': #ffeb3b,
- 'amber': #ffc107,
- 'orange': #ff9800,
- 'deep-orange': #ff5722,
- 'brown': #795548,
- 'blue-grey': #607d8b
+ 'red': #f44336,
+ 'pink': #e91e63,
+ 'purple': #9c27b0,
+ 'deep-purple': #673ab7,
+ 'indigo': #3f51b5,
+ 'blue': #2196f3,
+ 'light-blue': #03a9f4,
+ 'cyan': #00bcd4,
+ 'teal': #009688,
+ 'green': #4caf50,
+ 'light-green': #8bc34a,
+ 'lime': #cddc39,
+ 'yellow': #ffeb3b,
+ 'amber': #ffc107,
+ 'orange': #ff9800,
+ 'deep-orange': #ff5722,
+ 'brown': #795548,
+ 'blue-grey': #607d8b
);
// 文本颜色。text-颜色名
diff --git a/src/uni_modules/tm-ui/index.ts b/src/uni_modules/tm-ui/index.ts
index d32c382..2af999a 100644
--- a/src/uni_modules/tm-ui/index.ts
+++ b/src/uni_modules/tm-ui/index.ts
@@ -1,11 +1,49 @@
-export default {
- /**
- * tmui3.2.x
- * @param app Vue
- * @param options tmui3.0配置
- */
- // @ts-ignore
- install: (app: App, options: TM.THEME_CONFIG | null = null) => {
-
- }
+import { i18n } from "./local/i18nStore";
+import Axios from "./libs/axios";
+import type {
+ AxiosRequestConfig,
+ AxiosResponse,
+ AxiosInstance,
+ AxiosStatic,
+ AxiosInterceptorManager
+} from "./libs/axios";
+
+let $i18n = i18n()
+
+export { $i18n,Axios }
+// 导出类型定义
+export type {
+ AxiosRequestConfig,
+ AxiosResponse,
+ AxiosInstance,
+ AxiosStatic,
+ AxiosInterceptorManager
+};
+export default {
+ /**
+ * tmui3.2.x
+ * @param app Vue
+ * @param options tmui3.0配置
+ */
+ // @ts-ignore
+ install: (app: App, options: TM.THEME_CONFIG | null = null) => {
+ $i18n = i18n(options?.i18n)
+ console.log('[tm-ui] 欢迎使用极具精致的UniApp组件包');
+ app.mixin({
+ onReady() {
+
+ },
+ onResize() {
+ uni.$emit("onResize")
+ },
+ onPageScroll(e: any) {
+ const pages = getCurrentPages();
+ let page = undefined
+ if (pages.length > 0) {
+ page = pages[pages.length - 1]?.route || undefined
+ }
+ uni.$emit("onPageScroll", { scrollTop: e.scrollTop, page: page })
+ }
+ })
+ }
};
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/interface.ts b/src/uni_modules/tm-ui/interface.ts
index 5b875f7..a88f15c 100644
--- a/src/uni_modules/tm-ui/interface.ts
+++ b/src/uni_modules/tm-ui/interface.ts
@@ -1,148 +1,385 @@
-/**
- * 上传的文件状态
- * 0未上传,1上传中,2上传成功,3上传失败(网络错误),4已取消(终止,上到一半取消了),5超过大小
- * 0 Not uploaded, 1 Uploading, 2 Upload successful, 3 Upload failed (network error), 4 Cancelled (terminated, canceled halfway), 5 Exceeds size limit,
- */
-export enum TMUPLOAD_PHOTO_STATUS {
- NOT = 0,
- UPLOADING = 1,
- UPLOAD_SUCCESS = 2,
- UPLOAD_FAILED = 3,
- CANCELLED = 4,
- EXCEEDS_SIZE_LIMIT = 5,
-}
-declare global {
- /**
- * TMUI3.2.x类型命名空间
- * @author tmzdy
- * @date 2024-8-1
- */
- namespace TM {
- /** 按钮尺寸大小 */
- export type BUTTON_SIZE = "xs" | "s" | "m" | "n" | "g"
- /** 按钮或者标签的主题样式 */
- export type BUTTON_THEME = "thin" | "outlined" | "text" | "normal" | "dashed"
- /** 主题状态 */
- export type THEME_STATUS = "warn" | "success" | "info" | "error" | "error"
- /** 主题样式 */
- export type THEME_MODE = "auto" | "dark" | "light"
-
- export interface THEME_CONFIG {
- /** 主题模式 */
- mode: THEME_MODE,
- color: string,
- unit: 'rpx' | 'px',
- // 默认相对字号
- fontSizeBase: string | number,
- // 默认相对字号fontSizeBase倍数
- fontSizeScale: 1,
- buttonRadius: number | string,
- /** button默认的投影大小,none全局投影取消,但不影响局部值 */
- buttonShadow: number | string | Array,
-
- sheetRadius: number | string | Array,
- sheetShadow: number | string | Array,
- sheetMargin: number | string | Array,
- sheetPadding: number | string | Array,
-
- //列表默认的圆角。
- cellRadius: number | string | Array,
-
-
- /** 一般容器sheet的暗黑背景 */
- sheetDarkColor: string,
- /** 一般容器边线颜色如果你布局自己写了默认的边线色,但忘记填写组件上的暗黑线时,会取这里的值 */
- sheetDarkBorderColor: string[],
-
- /** 输入框,表单,常规灰背景待统一的二级暗黑背景 */
- inputDarkColor: string,
- /**输入框默认全局的亮系背景. */
- inputLightColor: string,
- /**输入框全局圆角 */
- inputRadius: number | string | Array,
- /** 一般的表单,列表底的暗黑统一边线颜色 */
- borderDarkColor: string,
- /**对话框圆角 */
- modalRadius: number | string,
- /**形状圆角 */
- switchRadius: number | string,
- /**抽屉圆角 */
- drawerRadius: number | string,
- unRadioAndCheckBoxColor: string,
-
- /**部分组件统一的动画差值。 */
- animation: string,
- }
- export type tmDateDayInfoType = {
- /** 年 */
- year: number,
- /** 月0-11 */
- month: number,
- /** 天 */
- day: number,
- /** 小时0-23 */
- hours: number,
- /** 分钟0-59 */
- minutes: number,
- /** 秒0-59 */
- seconds: number,
- /** 本年的第几周 */
- weeks: number,
- /** 本周星期几 */
- week: number,
- /** 本周星期几,中文名称 */
- weekCn: string,
- /** 格式化的日期字符串 */
- date: string,
- /** 是否渲染显示 */
- isRender?: boolean
- }
-
- /**
- * 上传的文件类型
- */
- export type TMUPLOAD_PHOTO_INFO = {
- id: string,
- /** 文件大小 */
- size?: number,
- /** 文件路径 */
- path: string,
- progress: number,
- statusText: string,
- status: TMUPLOAD_PHOTO_STATUS,
- response: any
- }
- export type FORM_RULE_TYPE = {
- /** 校验正则,如果同时提供了valid,以valid为准,默认为null */
- rule: RegExp|null,
- /** 校验失败提示,默认提示词:请正在选择/填写 */
- message: string,
- /**校验函数,如果不提供,默认以min,max来判断. */
- validator: null|((val: any) => boolean),
- /**
- * 如果校验的值类型是数字是起作用,默认为1,至少要大于0
- * 如果预期是数组,那长度至少要大于0
- * 如果是字符串,长度要大于0
- */
- min: number,
- //默认为-1最长/大值不限制
- max: number,
- //预期值的类型,如果不提供自动推断,不提供默认是auto
- type: "string" | "number" | "array" | "boolean" | "date" | "email" | "phone"|"auto",
- //必填项,是否校验本值
- required: boolean
- }
- export type FORM_RULE = { [Property in keyof FORM_RULE_TYPE]?: FORM_RULE_TYPE[Property] } & { required: boolean }
- export type FORM_RESULT_TYPE = { key: string, isPass: boolean, message: string, data: any }
- export type FORM_SUBMIT_RESULT = {
- /**是否校验通过 */
- isPass: boolean,
- /**校验不通过的第一条信息 */
- firstValid: FORM_RESULT_TYPE | null,
- /**校验结果集 */
- result: FORM_RESULT_TYPE[]
- }
- }
-}
-export { }
-
+import { I18nOptions, Tmui4xI18nTml } from "../tm-ui/local/interface";
+import { AxiosInstance } from "./libs/axios";
+import { Tmui4xI18n } from "./local/i18n";
+
+/*
+ * Copyright (c) 2025. tmzdy by @https://tmui.design
+ */
+export * from "../tm-ui/local/interface"
+/**
+ * 上传的文件状态
+ * 0未上传,1上传中,2上传成功,3上传失败(网络错误),4已取消(终止,上到一半取消了),5超过大小
+ * 0 Not uploaded, 1 Uploading, 2 Upload successful, 3 Upload failed (network error), 4 Cancelled (terminated, canceled halfway), 5 Exceeds size limit,
+ */
+export enum TMUPLOAD_PHOTO_STATUS {
+ NOT = 0,
+ UPLOADING = 1,
+ UPLOAD_SUCCESS = 2,
+ UPLOAD_FAILED = 3,
+ CANCELLED = 4,
+ EXCEEDS_SIZE_LIMIT = 5,
+}
+
+declare global {
+ interface Uni {
+ /**
+ * api接口的域名
+ */
+ apiHostUrl:string;
+ /**
+ * 图片地地址域名
+ */
+ imgHostUrl:string;
+ /**
+ * 上传文件的地址链接
+ */
+ uploadHost:string;
+
+ /**
+ * 获取图片的域名连接
+ * localImgName 图片名称如:a.jpg,也可以是本地的地址如/static/xxx或者https开头,会忽略域名的拼接,直接返回本身。
+ * hostname可以为空,取全局的uni.imgHostUrl
+ */
+ getHostImg : (localImgName : string,hostname?:string) => string;
+ // 导航跳转
+ navTo : (url : string, type : 'navigate' | 'redirect' | 'switchTab' | 'reLaunch') => void;
+ // 全局的请求实例
+ axios : AxiosInstance;
+
+ }
+
+ /**
+ * TMUI3.2.x类型命名空间
+ * @author tmzdy
+ * @date 2024-8-1
+ */
+ namespace TM {
+
+ export type NAVIGATE_TYPE = 'navigate' | 'redirect' | 'switchTab' | 'reLaunch' | 'navigateBack';
+ /** 按钮尺寸大小 */
+ export type BUTTON_SIZE = "xs" | "s" | "m" | "n" | "g"
+ /** 按钮或者标签的主题样式 */
+ export type BUTTON_THEME = "thin" | "outlined" | "text" | "normal" | "dashed"
+ /** 主题状态 */
+ export type THEME_STATUS = "warn" | "success" | "info" | "error" | "error"
+ /** 主题样式 */
+ export type THEME_MODE = "auto" | "dark" | "light"
+
+ export interface THEME_CONFIG {
+ i18n: I18nOptions,
+ /** 主题模式 */
+ mode: THEME_MODE,
+ color: string,
+ unit: 'rpx' | 'px',
+ // 默认相对字号
+ fontSizeBase: string | number,
+ // 默认相对字号fontSizeBase倍数
+ fontSizeScale: 1,
+ buttonRadius: number | string,
+ /** button默认的投影大小,none全局投影取消,但不影响局部值 */
+ buttonShadow: number | string | Array,
+
+ sheetRadius: number | string | Array,
+ sheetShadow: number | string | Array,
+ sheetMargin: number | string | Array,
+ sheetPadding: number | string | Array,
+
+ //列表默认的圆角。
+ cellRadius: number | string | Array,
+
+
+ /** 一般容器sheet的暗黑背景 */
+ sheetDarkColor: string,
+ /** 一般容器边线颜色如果你布局自己写了默认的边线色,但忘记填写组件上的暗黑线时,会取这里的值 */
+ sheetDarkBorderColor: string[],
+
+ /** 输入框,表单,常规灰背景待统一的二级暗黑背景 */
+ inputDarkColor: string,
+ /**输入框默认全局的亮系背景. */
+ inputLightColor: string,
+ /**输入框全局圆角 */
+ inputRadius: number | string | Array,
+ /** 一般的表单,列表底的暗黑统一边线颜色 */
+ borderDarkColor: string,
+ /**对话框圆角 */
+ modalRadius: number | string,
+ /**形状圆角 */
+ switchRadius: number | string,
+ /**抽屉圆角 */
+ drawerRadius: number | string,
+ unRadioAndCheckBoxColor: string,
+
+ /**部分组件统一的动画差值。 */
+ animation: string,
+
+ backgroundColorContentDark: string,
+ }
+ export type tmDateDayInfoType = {
+ /** 年 */
+ year: number,
+ /** 月0-11 */
+ month: number,
+ /** 天 */
+ day: number,
+ /** 小时0-23 */
+ hours: number,
+ /** 分钟0-59 */
+ minutes: number,
+ /** 秒0-59 */
+ seconds: number,
+ /** 本年的第几周 */
+ weeks: number,
+ /** 本周星期几 */
+ week: number,
+ /** 本周星期几,中文名称 */
+ weekCn: string,
+ /** 格式化的日期字符串 */
+ date: string,
+ /** 是否渲染显示 */
+ isRender?: boolean
+ }
+
+ /**
+ * 上传的文件类型
+ */
+ export type TMUPLOAD_PHOTO_INFO = {
+ id: string,
+ /** 文件大小 */
+ size?: number,
+ /** 文件路径 */
+ path: string,
+ url?:string,
+ progress: number,
+ statusText: string,
+ status: TMUPLOAD_PHOTO_STATUS,
+ response: any
+ }
+ export type FORM_RULE_TYPE = {
+ /** 校验正则,如果同时提供了valid,以valid为准,默认为null */
+ rule: RegExp | null,
+ /** 校验失败提示,默认提示词:请正在选择/填写 */
+ message: string,
+ /**校验函数,如果不提供,默认以min,max来判断. */
+ validator: null | ((val: any) => boolean),
+ /**
+ * 如果校验的值类型是数字是起作用,默认为1,至少要大于0
+ * 如果预期是数组,那长度至少要大于0
+ * 如果是字符串,长度要大于0
+ */
+ min: number,
+ //默认为-1最长/大值不限制
+ max: number,
+ //预期值的类型,如果不提供自动推断,不提供默认是auto
+ type: "string" | "number" | "array" | "boolean" | "date" | "email" | "phone" | "auto",
+ //必填项,是否校验本值
+ required: boolean
+ }
+ export type FORM_RULE = { [Property in keyof FORM_RULE_TYPE]?: FORM_RULE_TYPE[Property] } & { required: boolean }
+ export type FORM_RESULT_TYPE = { key: string, isPass: boolean, message: string, data: any }
+ export type FORM_SUBMIT_RESULT = {
+ /**是否校验通过 */
+ isPass: boolean,
+ /**校验不通过的第一条信息 */
+ firstValid: FORM_RESULT_TYPE | null,
+ /**校验结果集 */
+ result: FORM_RESULT_TYPE[]
+ }
+
+ export type SKU_DATA_ITEM = {
+ /** 产品id */
+ id: string | number,
+ /** 分类/规格名称 */
+ title: string,
+ /** 库存数量 */
+ inventory_quantity?: number,
+ /** 规格数组 */
+ children?: Array,
+ /** 自定义数据 */
+ [p: string]: any
+ }
+ export type SKU_PRODUCT = {
+ /** 唯一id值,必须是规格产品id组合,以 - 连接符连接,比如22-23-24 */
+ id: string | number,
+ /** 产品图片 */
+ img: string,
+ /** 库存数量 */
+ inventory_quantity: number,
+ /** 最大购买量 */
+ max_buy_quantity: number,
+ /** 最小购买量 */
+ min_buy_quantity: number,
+ /** 产品原价 */
+ original_price: number,
+ /** 产品现行售价 */
+ price: number,
+ /** 产品规格名称 */
+ title: string,
+ /** 自定义数据 */
+ [p: string]: any
+ }
+ export type SKU_DATA = {
+ /** 规格分组产品 */
+ data: Array,
+ /** 平铺产品列表 */
+ product: SKU_PRODUCT[] | null
+ }
+
+ /**
+ * 底部导航项目信息tabbar
+ */
+ export type TABBAR_ITEM_INFO = {
+ /**
+ * 标题
+ * @type {string}
+ */
+ title?: string;
+ /**
+ * 图标
+ * @type {string}
+ */
+ icon?: string;
+ /**
+ * 被选中时的图标
+ * @type {string}
+ */
+ selectedIcon?: string;
+ /**
+ * 是否禁用
+ * @type {boolean}
+ */
+ disabled?: boolean;
+
+ /**
+ * 默认颜色
+ * @type {string}
+ */
+ color?: string;
+ /**
+ * 选中时的颜色
+ * @type {string}
+ */
+ selectedColor?: string;
+
+ /**
+ * 打开方式
+ * @type {NAVIGATE_TYPE}
+ */
+ openType?: NAVIGATE_TYPE;
+ /**
+ * 链接地址
+ * @type {string}
+ */
+ url?: string;
+ /**
+ * 是否显示角标。如果为dot,dotLabel不为空优先展示文本角标
+ * dot,
+ * label
+ */
+ dotType?: string,
+ /**
+ * 文本角标。空不展示。
+ */
+ dotLabel?: string
+ }
+
+ export type TABBAR_ITEM = {
+ title: string,
+ icon: string,
+ selectedIcon: string,
+ disabled: boolean,
+ color: string,
+ selectedColor: string,
+ openType: string,
+ url: string,
+ /**
+ * 是否显示角标。如果为dot,dotLabel不为空优先展示文本角标
+ * dot,
+ * label
+ */
+ dotType?: string,
+ /**
+ * 文本角标。空不展示。
+ */
+ dotLabel?: string
+ }
+
+
+ /**
+ * 日期的对象属性
+ */
+ export type xDateDayInfoType = {
+ /** 年 */
+ year : number,
+ /** 月0-11 */
+ month : number,
+ /** 天 */
+ day : number,
+ /** 小时0-23 */
+ hours : number,
+ /** 分钟0-59 */
+ minutes : number,
+ /** 秒0-59 */
+ seconds : number,
+ /** 本年的第几周 */
+ weeks : number,
+ /** 本周星期几 */
+ week : number,
+ /** 本周星期几,中文名称 */
+ weekCn : string,
+ /** 格式化的日期字符串 */
+ date : string,
+ /** 是否渲染显示 */
+ isRender ?: boolean
+ }
+
+ /**
+ * 日历单个日期的样式对象
+ */
+ export type tmCalendarDateStyle_type = {
+ /** 是否显示右角标 */
+ dot ?: boolean,
+ /** 右角标背景颜色 */
+ dotColor ?: string,
+ /** 右角标文字颜色 */
+ dotLabelColor ?: string,
+ /** 注意如果dot为true,此内容为空就会显示小圆点。如果有内容优先显示本文本 */
+ dotLabel ?: string,
+ /** 底部文本 */
+ label ?: string,
+ /** 背景颜色 */
+ color ?: string,
+ /** 日期文字颜色 */
+ fontColor ?: string,
+ /** 设置的日期 */
+ date : string
+ }
+
+ export type tmCalendarDateStyleStatus = {
+ date:string,
+ color:string
+ }
+
+ export type tmCalendarDateStyleBetweenStatus = {
+ /** 指定了start和end,那么处于这两个日期(含起始)之间的会显示状态点 */
+ start?:string,
+ /** 指定了start和end,那么处于这两个日期(含起始)之间的会显示状态点 */
+ end?:string,
+ /** start和end间条件达成时的状态颜色 */
+ color?:string,
+ /* 区间内排除的指定日期 */
+ notDate?:string[],
+ }
+ /**
+ * 状态结构对象
+ */
+ export type tmCalendarDateStyleStatusType = {
+ /** 启用日期区间设置连续性的状态,它与下面的参数不冲突,如果日期不在区间内,但又在指定的日期内,也会启用状态显示。 */
+ between?:tmCalendarDateStyleBetweenStatus,
+ /** 指定单独的日期状态,高于between优先权 */
+ date?:tmCalendarDateStyleStatus[]
+ }
+
+ }
+}
+export { }
+
diff --git a/src/uni_modules/tm-ui/libs/axios.ts b/src/uni_modules/tm-ui/libs/axios.ts
new file mode 100644
index 0000000..a3eaefd
--- /dev/null
+++ b/src/uni_modules/tm-ui/libs/axios.ts
@@ -0,0 +1,482 @@
+// 类型定义
+interface AxiosRequestConfig {
+ url?: string;
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS' | 'TRACE' | 'CONNECT';
+ baseURL?: string;
+ headers?: Record;
+ params?: any;
+ data?: any;
+ timeout?: number;
+ responseType?: 'text' | 'arraybuffer';
+ dataType?: string;
+ validateStatus?: (status: number) => boolean;
+ useCache?: boolean; // 是否使用缓存
+ cacheTime?: number; // 缓存时间(毫秒),默认为60000(1分钟)
+ /**
+ * 服务返回的数据结构中的data.code字段中包含下面哪些值表示成功,并启用缓存。
+ * 默认值为:[200,0]
+ */
+ successCode?: number[],
+
+ [key: string]: any;
+}
+
+interface AxiosResponse {
+ data: T;
+ status: number;
+ statusText: string | undefined;
+ headers: Record;
+ config: AxiosRequestConfig;
+}
+
+// 拦截器管理器接口
+interface AxiosInterceptorManager {
+ use(onFulfilled ?: (value: V) => V | Promise, onRejected ?: (error: any) => any): number;
+
+ eject(id: number): void;
+}
+
+// Axios 实例接口
+interface AxiosInstance {
+ defaults: AxiosRequestConfig;
+ interceptors: {
+ request: AxiosInterceptorManager;
+ response: AxiosInterceptorManager;
+ };
+
+ (config: AxiosRequestConfig): Promise>;
+
+ (url: string, config ?: AxiosRequestConfig): Promise>;
+
+ get(url: string, config ?: AxiosRequestConfig): Promise>;
+
+ delete(url: string, config ?: AxiosRequestConfig): Promise>;
+
+ head(url: string, config ?: AxiosRequestConfig): Promise>;
+
+ options(url: string, config ?: AxiosRequestConfig): Promise>;
+
+ post(url: string, data ?: any, config ?: AxiosRequestConfig): Promise>;
+
+ put(url: string, data ?: any, config ?: AxiosRequestConfig): Promise>;
+
+ patch(url: string, data ?: any, config ?: AxiosRequestConfig): Promise>;
+}
+
+// Axios 静态接口
+interface AxiosStatic extends AxiosInstance {
+ defaults: AxiosRequestConfig;
+ interceptors: {
+ request: AxiosInterceptorManager;
+ response: AxiosInterceptorManager;
+ };
+
+ create(config ?: AxiosRequestConfig): AxiosInstance;
+}
+
+// 拦截器接口
+interface Interceptor {
+ fulfilled: ((value: V) => V | Promise) | null;
+ rejected: ((error: any) => any) | null;
+}
+
+// 拦截器管理器类
+class InterceptorManager implements AxiosInterceptorManager {
+ private handlers: Array | null> = [];
+
+ use(onFulfilled ?: (value: V) => V | Promise, onRejected ?: (error: any) => any): number {
+ this.handlers.push({
+ fulfilled: onFulfilled || null,
+ rejected: onRejected || null
+ });
+ return this.handlers.length - 1;
+ }
+
+ eject(id: number): void {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+ }
+
+ forEach(fn: (h: Interceptor) => void|Promise): void {
+ this.handlers.forEach(async h => {
+ if (h !== null) {
+ await fn(h);
+ }
+ });
+ }
+ clear(): void {
+ this.handlers = [];
+ }
+}
+
+
+// defaultConfig
+
+const defaultAxiosConfig: AxiosRequestConfig = {
+ baseURL: '',
+ timeout: 5000,
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ responseType: 'text',
+ validateStatus: (status: number) => status >= 200 && status < 300,
+ useCache: false,
+ cacheTime: 60000,
+};
+
+// 确保值是Object对象
+const isObject = (val: any): boolean => {
+ if (typeof val !== 'object' || val == null || val == undefined || Array.isArray(val)) {
+ return false;
+ }
+ const prototype = Object.getPrototypeOf(val);
+ return prototype === null || prototype === Object.prototype;
+};
+
+// 合并配置
+function mergeConfig(config1: AxiosRequestConfig, config2: AxiosRequestConfig = {}): AxiosRequestConfig {
+ const config: AxiosRequestConfig = {};
+
+ function getMergedValue(target: any, source: any) {
+ if (isObject(target) && isObject(source)) {
+ return {...target, ...source};
+ } else if (source !== undefined) {
+ return source;
+ } else {
+ return target;
+ }
+ }
+
+ ['url', 'method', 'params', 'data', 'useCache', 'cacheTime', 'successCode'].forEach((prop) => {
+ config[prop] = getMergedValue(config1[prop], config2[prop]);
+ });
+
+ config.headers = getMergedValue(config1.headers, config2.headers);
+ config.baseURL = config2.baseURL || config1.baseURL;
+ config.timeout = config2.timeout || config1.timeout;
+
+ return config;
+}
+
+// 缓存管理器
+class CacheManager {
+ private cache: Record = {};
+
+ constructor() {
+ this.cache = uni.getStorageSync('AxiosCaches') || {};
+ }
+
+ // 生成缓存键
+ generateCacheKey(config: AxiosRequestConfig): string {
+ const {url, method} = config;
+ let keyQ = url?.split('?')[0] ?? url
+ // 简化缓存键生成,避免复杂对象序列化可能导致的不一致
+ let key = `${method || 'GET'}_${keyQ}`;
+
+ // 对params进行处理,只取关键字段作为键的一部分
+ if (config.params) {
+ // 将params转为排序后的字符串
+ const paramKeys = Object.keys(config.params).sort();
+ const paramValues = paramKeys.map(k => {
+ const val = config.params[k];
+ // 简单类型直接使用,复杂类型使用类型标识
+ return typeof val === 'object' ? (Array.isArray(val) ? 'array' : 'object') : val;
+ });
+ key += `_p:${paramKeys.join(',')}-${paramValues.join(',')}`;
+ }
+
+ // 对data进行类似处理
+ if (config.data) {
+ // 如果是简单类型,直接使用
+ if (typeof config.data !== 'object') {
+ key += `_d:${config.data}`;
+ } else {
+ // 对于对象,只使用键名作为缓存键的一部分
+ const dataKeys = Object.keys(config.data).sort();
+ key += `_d:${dataKeys.join(',')}`;
+ }
+ }
+
+ return key;
+ }
+
+ // 设置缓存
+ set(config: AxiosRequestConfig, response: any): void {
+ const key = this.generateCacheKey(config);
+ this.cache[key] = {
+ data: response,
+ timestamp: Date.now()
+ };
+
+ try {
+ uni.setStorageSync('AxiosCaches', this.cache);
+ } catch (error) {
+ // 如果存储失败,可能是缓存太大,清理一部分
+ this.pruneCache();
+ try {
+ uni.setStorageSync('AxiosCaches', this.cache);
+ } catch (e) {
+ console.error('二次缓存设置失败');
+ }
+ }
+ }
+
+ // 获取缓存
+ get(config: AxiosRequestConfig): any | null {
+ const key = this.generateCacheKey(config);
+ const cacheItem = this.cache[key];
+
+ if (!cacheItem) return null;
+
+ const cacheTime = config.cacheTime || 60000; // 默认1分钟
+ const now = Date.now();
+
+ // 检查缓存是否过期
+ if (now - cacheItem.timestamp > cacheTime) {
+ delete this.cache[key];
+ return null;
+ }
+
+ // console.log('命中缓存:', key);
+ return cacheItem.data;
+ }
+
+ // 清除缓存
+ clear(): void {
+ this.cache = {};
+ uni.removeStorageSync('AxiosCaches');
+ }
+
+ private normalizeObject(obj: any): any {
+ // 如果不是对象或为null,直接返回
+ if (obj === null || typeof obj !== 'object') {
+ return obj;
+ }
+
+ // 如果是数组,对每个元素进行规范化
+ if (Array.isArray(obj)) {
+ return obj.map(item => this.normalizeObject(item));
+ }
+
+ // 如果是普通对象,对属性进行排序
+ const sortedKeys = Object.keys(obj).sort();
+ const result: Record = {};
+
+ // 按照排序后的键重新构建对象
+ for (const key of sortedKeys) {
+ // 过滤掉undefined和null值,减少不必要的差异
+ if (obj[key] !== undefined && obj[key] !== null) {
+ result[key] = this.normalizeObject(obj[key]);
+ }
+ }
+
+ return result;
+ }
+
+ // 清理部分缓存
+ private pruneCache(): void {
+ const keys = Object.keys(this.cache);
+ if (keys.length > 20) { // 如果缓存项超过20个
+ // 按时间戳排序,删除最旧的一半
+ const sortedKeys = keys.sort((a, b) =>
+ this.cache[a].timestamp - this.cache[b].timestamp
+ );
+
+ const toRemove = sortedKeys.slice(0, Math.floor(keys.length / 2));
+ toRemove.forEach(key => delete this.cache[key]);
+ console.log(`已清理${toRemove.length}个旧缓存项`);
+ }
+ }
+}
+
+// 主要请求类
+class Axios {
+ defaults: AxiosRequestConfig;
+ interceptors: {
+ request: InterceptorManager;
+ response: InterceptorManager;
+ };
+ private cacheManager: CacheManager;
+
+ constructor(defaultConfig ?: AxiosRequestConfig) {
+ this.defaults = defaultConfig ?? defaultAxiosConfig;
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ };
+ this.cacheManager = new CacheManager();
+ }
+
+ request(configOrUrl: string | AxiosRequestConfig, config ?: AxiosRequestConfig): Promise> {
+ if (typeof configOrUrl === 'string') {
+ config = config || {};
+ config.url = configOrUrl;
+ } else {
+ config = configOrUrl;
+ }
+
+ // 合并配置
+ config = mergeConfig(this.defaults, config);
+
+ // 确保有 method
+ config.method = (config.method || 'get').toUpperCase() as any;
+
+ // 处理 baseURL
+ if (config.baseURL && config.url && !config.url.startsWith('http')) {
+ config.url = config.baseURL.replace(/\/+$/, '') + '/' + config.url.replace(/^\/+/, '');
+ }
+
+ // 检查是否使用缓存,只针对post及get方式进行缓存.
+ if (config.useCache && (config.method === 'GET' || config.method === 'POST')) {
+ // 尝试从缓存获取响应
+ const cachedResponse = this.cacheManager.get(config);
+
+ if (cachedResponse) {
+ console.info('缓存接口:', config.url)
+ return Promise.resolve(cachedResponse);
+ }
+ }
+
+ // 执行请求处理链
+ let promise = Promise.resolve(config);
+
+
+ const processRequest = (config: AxiosRequestConfig): Promise> => {
+ return new Promise((resolve, reject) => {
+ if (!config.url) {
+ reject(new Error('URL is required'));
+ return;
+ }
+
+ // 处理查询参数
+ if (config.params) {
+ const queryString = Object.entries(config.params)
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
+ .join('&');
+ config.url += (config.url.includes('?') ? '&' : '?') + queryString;
+ }
+ const cachedResponse = this.cacheManager
+ uni.request({
+ url: config.url,
+ method: config.method as any,
+ data: config.data,
+ header: config.headers,
+ timeout: config.timeout,
+ dataType: config.dataType || 'json',
+ responseType: config.responseType as any,
+ success: (res) => {
+ const response: AxiosResponse = {
+ data: res.data as T,
+ status: res.statusCode,
+ statusText: res.errMsg,
+ headers: res.header as Record,
+ config: config
+ };
+
+ const validateStatus = config.validateStatus || ((status: number) => status >= 200 && status < 300);
+
+ if (!validateStatus(response.status)) {
+ reject(new Error(`Request failed with status code ${response.status}`));
+ } else {
+ //设置请求数据缓存
+ if (config.useCache && (config.method === 'GET' || config.method === 'POST')) {
+ // 根据设置的请求code进行缓存,因为每个人有服务器数据成功code不一样.
+ const codes = config.successCode || [];
+
+ if (codes.length > 0) {
+ let serverDataCode = (response.data as any)?.code ?? null;
+ if (typeof serverDataCode == 'number') {
+ if (codes.some(el => el == serverDataCode)) {
+ cachedResponse.set(config, response);
+ }
+ }
+ }
+ }
+ resolve(response);
+ }
+ },
+ fail: (err) => {
+ reject(new Error(err.errMsg));
+ }
+ });
+ });
+ };
+
+ // 构建请求链
+ const chain: Array = [];
+
+ // 添加请求拦截器
+ this.interceptors.request.forEach(interceptor => {
+ chain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ // 添加实际请求处理函数
+ chain.push(processRequest, undefined);
+
+ // 添加响应拦截器
+ this.interceptors.response.forEach(interceptor => {
+ chain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ // 执行请求链
+ while (chain.length) {
+ promise = promise.then(chain.shift(), chain.shift());
+ }
+ // 每次请求完后清除拦截器,以避免重复执行.
+ this.interceptors.request.clear();
+ this.interceptors.response.clear();
+ return promise as Promise>;
+ }
+
+ get(url: string, config ?: AxiosRequestConfig & {
+ useCache?: boolean,
+ cacheTime?: number
+ }): Promise> {
+ return this.request({
+ ...config,
+ method: 'GET',
+ url,
+ useCache: config?.useCache,
+ cacheTime: config?.cacheTime
+ });
+ }
+
+ post(url: string, data ?: any, config ?: AxiosRequestConfig & {
+ useCache?: boolean,
+ cacheTime?: number
+ }): Promise> {
+ return this.request({
+ ...config,
+ method: 'POST',
+ url,
+ data,
+ useCache: config?.useCache,
+ cacheTime: config?.cacheTime
+ });
+ }
+
+ put(url: string, data ?: any, config ?: AxiosRequestConfig): Promise> {
+ return this.request({...config, method: 'PUT', url, data});
+ }
+
+ delete(url: string, config ?: AxiosRequestConfig): Promise> {
+ return this.request({...config, method: 'DELETE', url});
+ }
+
+ clear() {
+ uni.removeStorageSync("AxiosCaches")
+ }
+}
+
+
+export default Axios;
+
+// 导出类型定义
+export type {
+ AxiosRequestConfig,
+ AxiosResponse,
+ AxiosInstance,
+ AxiosStatic,
+ AxiosInterceptorManager
+};
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/libs/colors.ts b/src/uni_modules/tm-ui/libs/colors.ts
index c106970..b01ff0c 100644
--- a/src/uni_modules/tm-ui/libs/colors.ts
+++ b/src/uni_modules/tm-ui/libs/colors.ts
@@ -1,684 +1,697 @@
-type rgb = {
- r: number,
- g: number,
- b: number,
- a: number
-}
-type hsla = {
- h: number,
- s: number,
- l: number,
- a: number
-}
-
-/**
- * 颜色值列表
- */
-export const colors = new Map([
- ['primary', '#0579FF'],
- ['success', '#07d73d'],
- ['danger', '#ff6411'],
- ['warn', '#ffa61e'],
- ['error', '#f10226'],
- ['info', '#F2F2F2'],
-
- ['kleinblue', '#002FA7'], // 克莱因蓝
- ['chinesered', '#FF0000'], // 中国红
- ['internationalorange', '#FF4F00'], // 国际橙
- ['egyptianvlue', '#1034A6'], // 埃及艳蓝
- ['parisviolet', '#6C3082'], // 巴黎紫
- ['moroccanblue', '#1256A7'], // 摩洛哥蓝
- ['brazilgreen', '#009B3A'], // 巴西绿
- ['britishracinggreen', '#004225'], // 英国赛车绿
- ['indianyellow', '#E3A857'], // 印度黄
- ['australiangold', '#FFDF00'], // 澳大利亚金
- ['venetianred', '#C80815'], // 威尼斯红
- ['majorelleblue', '#6050DC'], // 马若雷蓝
- ['tuscanred', '#7C3030'], // 托斯卡红
- ['naplesyellow', '#FADA5E'], // 那不勒斯黄
- ['capumortuum', '#592720'], // 死者之首
- ['mayablue', '#73C2FB'], // 玛雅蓝
- ['persianrose', '#FE28A2'], // 波斯玫瑰
- ['tyrianpurple', '#66023C'], // 泰尔紫
- ['saharasand', '#F1E788'], // 撒哈拉沙
- ['burmeseruby', '#B00A0A'], // 缅甸红宝石
-
- ['transparent', 'rgba(0,0,0,0)'],
- ['aliceblue', '#F0F8FF'],
- ['antiquewhite', '#FAEBD7'],
- ['aqua', '#00FFFF'],
- ['aquamarine', '#7FFFD4'],
- ['azure', '#F0FFFF'],
- ['beige', '#F5F5DC'],
- ['bisque', '#FFE4C4'],
- ['black', '#000000'],
- ['blanchedalmond', '#FFEBCD'],
- ['blue', '#0000FF'],
- ['blueviolet', '#8A2BE2'],
- ['brown', '#A52A2A'],
- ['burlywood', '#DEB887'],
- ['cadetblue', '#5F9EA0'],
- ['chartreuse', '#7FFF00'],
- ['chocolate', '#D2691E'],
- ['coral', '#FF7F50'],
- ['cornflowerblue', '#6495ED'],
- ['cornsilk', '#FFF8DC'],
- ['crimson', '#DC143C'],
- ['cyan', '#00FFFF'],
- ['darkblue', '#00008B'],
- ['darkcyan', '#008B8B'],
- ['darkgoldenrod', '#B8860B'],
- ['darkgray', '#A9A9A9'],
- ['darkgreen', '#006400'],
- ['darkkhaki', '#BDB76B'],
- ['darkmagenta', '#8B008B'],
- ['darkolivegreen', '#556B2F'],
- ['darkorange', '#FF8C00'],
- ['darkorchid', '#9932CC'],
- ['darkred', '#8B0000'],
- ['darksalmon', '#E9967A'],
- ['darkseagreen', '#8FBC8F'],
- ['darkslateblue', '#483D8B'],
- ['darkslategray', '#2F4F4F'],
- ['darkturquoise', '#00CED1'],
- ['darkviolet', '#9400D3'],
- ['deeppink', '#FF1493'],
- ['deepskyblue', '#00BFFF'],
- ['dimgray', '#696969'],
- ['dodgerblue', '#1E90FF'],
- ['firebrick', '#B22222'],
- ['floralwhite', '#FFFAF0'],
- ['forestgreen', '#228B22'],
- ['fuchsia', '#FF00FF'],
- ['gainsboro', '#DCDCDC'],
- ['ghostwhite', '#F8F8FF'],
- ['gold', '#FFD700'],
- ['goldenrod', '#DAA520'],
- ['gray', '#808080'],
- ['green', '#008000'],
- ['greenyellow', '#ADFF2F'],
- ['honeydew', '#F0FFF0'],
- ['hotpink', '#FF69B4'],
- ['indianred', '#CD5C5C'],
- ['indigo', '#4B0082'],
- ['ivory', '#FFFFF0'],
- ['khaki', '#F0E68C'],
- ['lavender', '#E6E6FA'],
- ['lavenderblush', '#FFF0F5'],
- ['lawngreen', '#7CFC00'],
- ['lemonchiffon', '#FFFACD'],
- ['lightblue', '#ADD8E6'],
- ['lightcoral', '#F08080'],
- ['lightcyan', '#E0FFFF'],
- ['lightgoldenrodyellow', '#FAFAD2'],
- ['lightgray', '#D3D3D3'],
- ['lightgreen', '#90EE90'],
- ['lightpink', '#FFB6C1'],
- ['lightsalmon', '#FFA07A'],
- ['lightseagreen', '#20B2AA'],
- ['lightskyblue', '#87CEFA'],
- ['lightslategray', '#778899'],
- ['lightsteelblue', '#B0C4DE'],
- ['lightyellow', '#FFFFE0'],
- ['lime', '#00FF00'],
- ['limegreen', '#32CD32'],
- ['linen', '#FAF0E6'],
- ['magenta', '#FF00FF'],
- ['maroon', '#800000'],
- ['mediumaquamarine', '#66CDAA'],
- ['mediumblue', '#0000CD'],
- ['mediumorchid', '#BA55D3'],
- ['mediumpurple', '#9370DB'],
- ['mediumseagreen', '#3CB371'],
- ['mediumslateblue', '#7B68EE'],
- ['mediumspringgreen', '#00FA9A'],
- ['mediumturquoise', '#48D1CC'],
- ['mediumvioletred', '#C71585'],
- ['midnightblue', '#191970'],
- ['mintcream', '#F5FFFA'],
- ['mistyrose', '#FFE4E1'],
- ['moccasin', '#FFE4B5'],
- ['navajowhite', '#FFDEAD'],
- ['navy', '#000080'],
- ['oldlace', '#FDF5E6'],
- ['olive', '#808000'],
- ['olivedrab', '#6B8E23'],
- ['orange', '#FFA500'],
- ['orangered', '#FF4500'],
- ['orchid', '#DA70D6'],
- ['palegoldenrod', '#EEE8AA'],
- ['palegreen', '#98FB98'],
- ['paleturquoise', '#AFEEEE'],
- ['palevioletred', '#DB7093'],
- ['papayawhip', '#FFEFD5'],
- ['peachpuff', '#FFDAB9'],
- ['peru', '#CD853F'],
- ['pink', '#FFC0CB'],
- ['plum', '#DDA0DD'],
- ['powderblue', '#B0E0E6'],
- ['purple', '#800080'],
- ['rebeccapurple', '#663399'],
- ['red', '#FF0000'],
- ['rosybrown', '#BC8F8F'],
- ['royalblue', '#4169E1'],
- ['saddlebrown', '#8B4513'],
- ['salmon', '#FA8072'],
- ['sandybrown', '#F4A460'],
- ['seagreen', '#2E8B57'],
- ['seashell', '#FFF5EE'],
- ['sienna', '#A0522D'],
- ['silver', '#C0C0C0'],
- ['skyblue', '#87CEEB'],
- ['slateblue', '#6A5ACD'],
- ['slategray', '#708090'],
- ['snow', '#FFFAFA'],
- ['springgreen', '#00FF7F'],
- ['steelblue', '#4682B4'],
- ['tan', '#D2B48C'],
- ['teal', '#008080'],
- ['thistle', '#D8BFD8'],
- ['tomato', '#FF6347'],
- ['turquoise', '#40E0D0'],
- ['violet', '#EE82EE'],
- ['wheat', '#F5DEB3'],
- ['white', '#FFFFFF'],
- ['whitesmoke', '#F5F5F5'],
- ['yellow', '#FFFF00'],
- ['yellowgreen', '#9ACD32']
-
-])
-
-
-export const toHex = (n: number): string => {
- let hex = n.toString(16);
- if (hex.length == 1) {
- return '0' + hex;
- } else {
- return hex;
- }
-}
-export function isValidColor(color: string): boolean {
- // return chroma.valid(color);
- const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$/;
- const rgbRegex = /^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/;
- const rgbaRegex = /^rgba\((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*((1(\.0{1,2})?)|(0(\.\d{1,2})?))\)$/;
- const hslRegex = /^hsl\((\d{1,3}), (\d{1,3})%, (\d{1,3})%\)$/;
- const hslaRegex = /^hsla\(\s*((\d{1,2}|[1-2]\d{2}|3[0-5]\d)(\.\d+)?|\d+(\.\d+)?)\s*,\s*((\d{1,2}|\d{0,1}\d{1}\d{1}|[1-2]\d{2}|3[0-5]\d)(\.\d+)?|\d+(\.\d+)?)%\s*,\s*((\d{1,2}|\d{0,1}\d{1}\d{1}|[1-2]\d{2}|3[0-5]\d)(\.\d+)?|\d+(\.\d+)?)%\s*,\s*((1|0(\.\d{1,2})?|(\.\d{1,2})))\)$/i;
-
-
- if (color == '') {
- return false; // 颜色值为空
- } else if (color === 'inherit' || color === 'transparent') {
- return false; // 特殊颜色值
- } else if (color === 'currentColor') {
- return false; // currentColor 不是有效的颜色值
- } else if (hexRegex.test(color) || rgbRegex.test(color) || rgbaRegex.test(color) || hslRegex.test(color) || hslaRegex.test(color)) {
- return true; // 符合颜色值的格式
- }
- return false;
-}
-/**
- * 获取默认的颜色值
- * @param [string] 颜色名称或者16进制颜色值
- */
-export function getDefaultColor(sColor: string): string {
- if (sColor == "") return ""
- let sc = sColor.toLocaleLowerCase().trim().replace(" ", "");
-
- if (isValidColor(sc)) {
- // 如果符合所有颜色值,进行转换为16进制。css方便统一解析。
- return sc;
- }
- // 检测是否是颜色名称。
- let sco = colors.get(sc);
- if (typeof sco == 'string') return sco as string;
- return colors.get("primary")!;
-}
-
-/**
- * 颜色转rgb
- */
-export function hexToRgb(sColors: string) {
- if (sColors == "") {
- return { r: 0, g: 0, b: 0, a: 0 }
- }
- let reg = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$/;
- let sColor: string = sColors.toLowerCase();
-
- if (sColor != '' && reg.test(sColor)) {
-
- if (sColor.length == 4) {
- let sColorNew = "#";
- for (let i = 1; i < 4; i += 1) {
- sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
- }
- sColor = sColorNew;
- }
-
- //处理六位的颜色值
- let sColorChange: number[] = [];
- sColorChange.push(parseInt(sColor.substring(1, 3), 16));
- sColorChange.push(parseInt(sColor.substring(3, 5), 16));
- sColorChange.push(parseInt(sColor.substring(5, 7), 16));
- if (sColor.length == 9) {
- sColorChange.push(parseInt(sColor.substring(7, 9), 16) / 255);
- }
- return {
- r: sColorChange[0],
- g: sColorChange[1],
- b: sColorChange[2],
- a: sColorChange.length == 4 ? sColorChange[3] : 1
- }
- } else if (/^(rgb|RGB|rgba|RGBA)/.test(sColor)) {
- let arr: string[] = sColor.replace(/(?:\(|\)|rgba|rgb|RGB|RGBA)*/g, "").split(",")
- let p: number[] = arr.map((val: string): number => parseInt(val));
- if (p.length < 3) {
- return {
- r: 0,
- g: 0,
- b: 0,
- a: 1
- }
- }
- if (p.length == 3) {
- p.push(1)
- }
- return {
- r: p[0],
- g: p[1],
- b: p[2],
- a: arr.length == 3 ? p[3] : parseFloat(arr[3])
- }
- } else {
- return {
- r: 0,
- g: 0,
- b: 0,
- a: 1
- }
- }
-}
-/**
- * rgb转hsl
- */
-export function rgbToHsl(rgb: rgb): hsla {
- let r = rgb.r / 255
- let g = rgb.g / 255
- let b = rgb.b / 255
- let a = rgb.a
-
- var max = Math.max(r, g, b);
- var min = Math.min(r, g, b);
- let h = 60 * (4 + (r - g) / (max - min));
- let sdy = Math.max(2 - max - min,1)
- let s=(max - min) / sdy;
- let l = (max + min) / 2;
-
- if (max === r) {
- h = (60 * (g - b)) / (max - min);
- } else if (max === g) {
- h = 60 * (2 + (b - r) / (max - min));
- }
-
- if (h < 0) {
- h += 360;
- }
-
-
- if (max === min) {
- s = 0;
- } else if (l < 0.5) {
- s = (max - min) / (max + min);
- }
-
- return { h: h, s: s * 100, l: l * 100, a: a };
-}
-
-/**
- * hsl转rgb
- */
-export function hslToRgb(hsl: hsla): rgb {
- let h = hsl.h
- let s = hsl.s
- let l = hsl.l
- let a = hsl.a
-
- h = h / 360;
- s = s / 100;
- l = l / 100;
- let r = l;
- let g = l;
- let b = l;
-
- function hue2rgb(pxx: number, q: number, txs: number): number {
- let t = txs;
- let p = pxx;
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6) return p + (q - p) * 6 * t;
- if (t < 1 / 2) return q;
- if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
- return p;
- }
-
-
-
- if (s > 0) {
- let q = l * (1 + s);
- if (l >= 0.5) {
- q = l + s - l * s;
- }
- var p = 2 * l - q;
- r = hue2rgb(p, q, h + 1 / 3);
- g = hue2rgb(p, q, h);
- b = hue2rgb(p, q, h - 1 / 3);
-
- }
-
- r = Math.round(r * 255);
- g = Math.round(g * 255);
- b = Math.round(b * 255);
- return { r, g, b, a };
-}
-
-/**
- * rgb转16进制
- */
-export function rgbToHex(rgb: rgb): string {
- let r = rgb.r
- let g = rgb.g
- let b = rgb.b
- let a = rgb.a
- return "#" + toHex(r) + toHex(g) + toHex(b) + toHex(a * 255)
-}
-export function hslaToCss(hsl: hsla): string {
-
- let rgb = hslToRgb(hsl)
-
- return rgbToHex(rgb)
-}
-
-export function hslaToRgbCss(hsl: hsla): string {
-
- let rgb = hslToRgb(hsl)
- let r = rgb.r
- let g = rgb.g
- let b = rgb.b
- let a = rgb.a
- return `rgba(${r},${g},${b},${a})`
-}
-
-// 根据 HSLA 颜色计算亮度
-export function getLuminance(color: rgb | hsla, type = "rgba"): number {
-
-
- let colordefault: rgb = (type == 'rgba' ? color : hslToRgb(color as hsla)) as rgb;
- const r = colordefault.r
- const g = colordefault.g
- const b = colordefault.b
- const rs = r / 255
- const gs = g / 255
- const bs = b / 255
- const rl = Math.pow(rs <= 0.03928 ? rs / 12.92 : ((rs + 0.055) / 1.055), 2.4);
- const gl = Math.pow(gs <= 0.03928 ? gs / 12.92 : ((gs + 0.055) / 1.055), 2.4);
- const bl = Math.pow(bs <= 0.03928 ? bs / 12.92 : ((bs + 0.055) / 1.055), 2.4);
-
- return 0.2126 * rl + 0.7152 * gl + 0.0722 * bl;
-}
-
-/**
- * 对颜色加深
- */
-export function colorAddDeepen(sColor: string): string {
-
- let rgb = hexToRgb(getDefaultColor(sColor));
-
- let hsl = rgbToHsl(rgb);
-
- let l = hsl.l - 5;
- l = Math.max(0, Math.min(l, 100))
-
- return hslaToRgbCss({ h: hsl.h, s: hsl.s, l, a: hsl.a })
-}
-/**
- * 对颜色提亮
- */
-export function colorAddBrighten(sColor: string): string {
- let rgb = hexToRgb(getDefaultColor(sColor));
- let hsl = rgbToHsl(rgb);
- let l = hsl.l + 10;
- l = Math.max(0, Math.min(l, 100))
- return rgbToHex(hslToRgb({ h: hsl.h, s: hsl.s, l, a: hsl.a }))
-}
-
-
-
-
-/**
- * 获取浅色系主题,根据颜色值计算。返回正常值和hover值。
- */
-export function colorGetThint(sColor: string) {
- let rgb = hexToRgb(getDefaultColor(sColor));
- let hsl = rgbToHsl(rgb);
- let s = hsl.s;
- // let l = hsl.getNumber("l");
- if (Math.ceil(s) > 0) {
- s = 45
- }
- return {
- default: rgbToHex(hslToRgb({ h: hsl.h, s, l: 93, a: hsl.a })),
- hover: rgbToHex(hslToRgb({ h: hsl.h, s, l: 85, a: hsl.a }))
- }
-}
-/**
- * 获取正常主题,根据颜色值计算。返回正常值和hover值。
- */
-export function colorGetHover(sColor: string) {
-
- return {
- default: sColor,
- hover: colorAddDeepen(sColor)
- }
-}
-
-
-/**
- * 处理相主题色。
- * @param color 需要处理的颜色值
- * @param hoverColor 对应按下去的颜色默认与color相等。
- * @returns UTSJSONObject
- */
-export function getDefaultColorObj(color: string, hoverColor: string) {
- let hsla = rgbToHsl(hexToRgb(getDefaultColor(color)));
- let hoverHsla = rgbToHsl(hexToRgb(getDefaultColor(hoverColor)));
- let shadow = hslaToRgbCss({ h: hsla.h, s: (hsla.s) == 0 ? 0 : 100, l: 50, a: 0.2 });
- let shadowHOver = hslaToRgbCss({ h: hoverHsla.h, s: (hoverHsla.s) == 0 ? 0 : 70, l: 50, a: 0.15 });
- if ((hsla.h) == 0 && (hsla.s) == 0) {
- shadow = "transparent"
- }
- if ((hoverHsla.h) == 0 && (hoverHsla.s) == 0) {
- shadowHOver = "transparent"
- }
- let lightnum = getLuminance(hoverHsla, 'hsla');
- let o = {
- default: {
- background: hslaToRgbCss(hsla),
- borderColor: hslaToRgbCss({ h: hsla.h, s: hsla.s, a: hsla.a, l: Math.min(Math.max(0, hsla.l - 5), hsla.l) }),
- fontColor: lightnum < 0.6 && hsla.a > 0.1 ? '#ffffff' : '#000000',
- shadow: shadow
- },
- active: {
- background: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: Math.min(Math.max(0, hoverHsla.l - 10), hoverHsla.l) }),
- borderColor: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: Math.max(Math.max(0, hoverHsla.l - 10), hoverHsla.l) }),
- fontColor: lightnum < 0.6 && hoverHsla.a > 0.1 ? '#ffffff' : '#000000',
- shadow: shadowHOver
- }
- }
-
- return o;
-}
-
-/**
- * 处理相主题色。
- * @param color 需要处理的颜色值
- * @param hoverColor 对应按下去的颜色默认与color相等。
- * @returns UTSJSONObject
- */
-export function getTextColorObj(color: string, hoverColor: string, isCoverDark?: boolean) {
- let dark = isCoverDark == null ? false : isCoverDark
- // #ifdef WEB
- dark = isCoverDark == undefined ? false : dark
- // #endif
- let hsla = rgbToHsl(hexToRgb(getDefaultColor(color)));
- let hsla2 = rgbToHsl(hexToRgb(getDefaultColor(color)));
- let hoverHsla = rgbToHsl(hexToRgb(getDefaultColor(hoverColor)));
- let bgcolor = hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: dark == true ? 20 : 95 })
- if (dark) {
- let p = hsla2;
- p.l = 20
- p.s = (p.s) != 0 ? 0 : 20
- bgcolor = hslaToRgbCss(p)
- }
- let o = {
- default: {
- background: "transparent",
- borderColor: "transparent",
- fontColor: getLuminance(hsla, 'hsla') < 0.3 && hsla.a > 0.1 ? hslaToRgbCss(hsla) : hslaToRgbCss({ h: hsla.h, s: hsla.s, a: hsla.a, l: 30 }),
- shadow: "transparent",
- },
- active: {
- background: bgcolor,
- borderColor: "transparent",
- fontColor: getLuminance(hoverHsla, 'hsla') < 0.3 && hoverHsla.a > 0.1 ? hslaToRgbCss(hoverHsla) : hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: 30 }),
- shadow: "transparent",
- }
- }
- return o;
-}
-
-/**
- * 处理相主题色。
- * @param color 需要处理的颜色值
- * @param hoverColor 对应按下去的颜色默认与color相等。
- * @returns UTSJSONObject
- */
-export function getThinColorObj(color: string, hoverColor: string, isCoverDark?: boolean) {
- let dark = isCoverDark == null ? false : isCoverDark
- // #ifdef WEB
- dark = isCoverDark == undefined ? false : dark
- // #endif
-
- let hsla = rgbToHsl(hexToRgb(getDefaultColor(color)));
- let hoverHsla = rgbToHsl(hexToRgb(getDefaultColor(hoverColor)));
- // tmxColor.hslaToCss({ ...hsla}) : tmxColor.hslaToCss({ ...hsla,l:30})
- let fontcolor = getLuminance(hsla, 'hsla') < 0.3 && hsla.a > 0.1 ? hslaToRgbCss(hsla) : hslaToRgbCss({ h: hsla.h, s: hsla.s, a: hsla.a, l: 30 })
- let bordercolor = hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: dark == true ? 21 : 92 })
- let bgcolor = hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: dark == true ? 20 : 95 })
-
- if (dark) {
- let p = hsla;
- p.l = 98
- fontcolor = hslaToRgbCss(p)
- p.l = 20
- p.s = (p.s) != 0 ? 5 : 20
- bgcolor = hslaToRgbCss(p)
- p.l = 22
- bordercolor = hslaToRgbCss(p)
- }
- let o = {
- default: {
- background: bgcolor,
- borderColor: bordercolor,
- fontColor: fontcolor,
- shadow: "transparent",
- },
- active: {
- background: hslaToRgbCss({ h: hoverHsla.h, s: dark ? 10 : 50, a: hoverHsla.a, l: dark == true ? 15 : 88 }),
- borderColor: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: 0, l: dark == true ? 18 : 80 }),
- fontColor: getLuminance(hoverHsla, 'hsla') < 0.3 && hoverHsla.a > 0.1 ? hslaToRgbCss(hoverHsla) : hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: 64 }),
- shadow: "transparent",
- }
- }
- return o;
-}
-
-/**
- * 处理相主题色。
- * @param color 需要处理的颜色值
- * @param hoverColor 对应按下去的颜色默认与color相等。
- * @returns UTSJSONObject
- */
-export function getOutlineColorObj(color: string, hoverColor: string) {
- let hsla = rgbToHsl(hexToRgb(getDefaultColor(color)));
- let hoverHsla = rgbToHsl(hexToRgb(getDefaultColor(hoverColor)));
- // tmxColor.hslaToCss({ ...hsla}) : tmxColor.hslaToCss({ ...hsla,l:30})
- let lightnum = getLuminance(hoverHsla, 'hsla');
-
- let o = {
- default: {
- background: 'transparent',
- borderColor: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: 1, l: 75 }),
- fontColor: lightnum < 0.6 && hsla.a > 0.1 ? hslaToRgbCss(hsla) : hslaToRgbCss({ h: hsla.h, s: hsla.s, a: hsla.a, l: 30 }),
- shadow: "transparent",
- },
-
- active: {
- background: 'transparent',
- borderColor: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: 1, l: 70 }),
- fontColor: lightnum < 0.6 && hoverHsla.a > 0.1 ? hslaToRgbCss(hoverHsla) : hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: 30 }),
- shadow: "transparent",
- }
- }
- return o;
-}
-
-/**
- * 设置颜色的亮度值。29
- * isCoverDark:是根据亮度值,是否要设置n的值,如果n超过了
- * 指定的30就不操作。
- */
-export function setTextColorLightByDark(color: string): string {
- let realColor = getDefaultColor(color);
- let hsla = rgbToHsl(hexToRgb(realColor))
- let l = hsla.l
- let s = hsla.s
- if (l < 30) {
- if (s > 0) {
- hsla.l = 50
- } else {
- hsla.l = 100
- }
-
- }
-
- return hslaToRgbCss(hsla)
-}
-/**
- * 变动的颜色是否需要变深。如果不需要返回原始颜色
- * 如果果需要自动加深。
- */
-export function setBgColorLightByDark(color: string): string {
- let realColor = getDefaultColor(color);
- let hsla = rgbToHsl(hexToRgb(realColor))
- let l = hsla.l
- let s = hsla.s
- if (s == 0 && l > 50) {
- hsla.l = 100 - l
- }
- if (s > 0) {
- if (l > 50) {
- hsla.l = 100 - l
- }
- }
- return hslaToRgbCss(hsla)
-}
-
-export function isBlackAndWhite(color: string): boolean {
- let realColor = getDefaultColor(color);
- let hsla = rgbToHsl(hexToRgb(realColor))
- let s = hsla.s
- return s == 0
-}
-
-
-
+type rgb = {
+ r: number,
+ g: number,
+ b: number,
+ a: number
+}
+type hsla = {
+ h: number,
+ s: number,
+ l: number,
+ a: number
+}
+
+/**
+ * 颜色值列表
+ */
+export const colors = new Map([
+ ['primary', '#0579FF'],
+ ['success', '#07d73d'],
+ ['danger', '#ff6411'],
+ ['warn', '#ffa61e'],
+ ['error', '#f10226'],
+ ['info', '#F2F2F2'],
+
+ ['kleinblue', '#002FA7'], // 克莱因蓝
+ ['chinesered', '#FF0000'], // 中国红
+ ['internationalorange', '#FF4F00'], // 国际橙
+ ['egyptianvlue', '#1034A6'], // 埃及艳蓝
+ ['parisviolet', '#6C3082'], // 巴黎紫
+ ['moroccanblue', '#1256A7'], // 摩洛哥蓝
+ ['brazilgreen', '#009B3A'], // 巴西绿
+ ['britishracinggreen', '#004225'], // 英国赛车绿
+ ['indianyellow', '#E3A857'], // 印度黄
+ ['australiangold', '#FFDF00'], // 澳大利亚金
+ ['venetianred', '#C80815'], // 威尼斯红
+ ['majorelleblue', '#6050DC'], // 马若雷蓝
+ ['tuscanred', '#7C3030'], // 托斯卡红
+ ['naplesyellow', '#FADA5E'], // 那不勒斯黄
+ ['capumortuum', '#592720'], // 死者之首
+ ['mayablue', '#73C2FB'], // 玛雅蓝
+ ['persianrose', '#FE28A2'], // 波斯玫瑰
+ ['tyrianpurple', '#66023C'], // 泰尔紫
+ ['saharasand', '#F1E788'], // 撒哈拉沙
+ ['burmeseruby', '#B00A0A'], // 缅甸红宝石
+
+ ['transparent', 'rgba(0,0,0,0)'],
+ ['aliceblue', '#F0F8FF'],
+ ['antiquewhite', '#FAEBD7'],
+ ['aqua', '#00FFFF'],
+ ['aquamarine', '#7FFFD4'],
+ ['azure', '#F0FFFF'],
+ ['beige', '#F5F5DC'],
+ ['bisque', '#FFE4C4'],
+ ['black', '#000000'],
+ ['blanchedalmond', '#FFEBCD'],
+ ['blue', '#0000FF'],
+ ['blueviolet', '#8A2BE2'],
+ ['brown', '#A52A2A'],
+ ['burlywood', '#DEB887'],
+ ['cadetblue', '#5F9EA0'],
+ ['chartreuse', '#7FFF00'],
+ ['chocolate', '#D2691E'],
+ ['coral', '#FF7F50'],
+ ['cornflowerblue', '#6495ED'],
+ ['cornsilk', '#FFF8DC'],
+ ['crimson', '#DC143C'],
+ ['cyan', '#00FFFF'],
+ ['darkblue', '#00008B'],
+ ['darkcyan', '#008B8B'],
+ ['darkgoldenrod', '#B8860B'],
+ ['darkgray', '#A9A9A9'],
+ ['darkgreen', '#006400'],
+ ['darkkhaki', '#BDB76B'],
+ ['darkmagenta', '#8B008B'],
+ ['darkolivegreen', '#556B2F'],
+ ['darkorange', '#FF8C00'],
+ ['darkorchid', '#9932CC'],
+ ['darkred', '#8B0000'],
+ ['darksalmon', '#E9967A'],
+ ['darkseagreen', '#8FBC8F'],
+ ['darkslateblue', '#483D8B'],
+ ['darkslategray', '#2F4F4F'],
+ ['darkturquoise', '#00CED1'],
+ ['darkviolet', '#9400D3'],
+ ['deeppink', '#FF1493'],
+ ['deepskyblue', '#00BFFF'],
+ ['dimgray', '#696969'],
+ ['dodgerblue', '#1E90FF'],
+ ['firebrick', '#B22222'],
+ ['floralwhite', '#FFFAF0'],
+ ['forestgreen', '#228B22'],
+ ['fuchsia', '#FF00FF'],
+ ['gainsboro', '#DCDCDC'],
+ ['ghostwhite', '#F8F8FF'],
+ ['gold', '#FFD700'],
+ ['goldenrod', '#DAA520'],
+ ['gray', '#808080'],
+ ['green', '#008000'],
+ ['greenyellow', '#ADFF2F'],
+ ['honeydew', '#F0FFF0'],
+ ['hotpink', '#FF69B4'],
+ ['indianred', '#CD5C5C'],
+ ['indigo', '#4B0082'],
+ ['ivory', '#FFFFF0'],
+ ['khaki', '#F0E68C'],
+ ['lavender', '#E6E6FA'],
+ ['lavenderblush', '#FFF0F5'],
+ ['lawngreen', '#7CFC00'],
+ ['lemonchiffon', '#FFFACD'],
+ ['lightblue', '#ADD8E6'],
+ ['lightcoral', '#F08080'],
+ ['lightcyan', '#E0FFFF'],
+ ['lightgoldenrodyellow', '#FAFAD2'],
+ ['lightgray', '#D3D3D3'],
+ ['lightgreen', '#90EE90'],
+ ['lightpink', '#FFB6C1'],
+ ['lightsalmon', '#FFA07A'],
+ ['lightseagreen', '#20B2AA'],
+ ['lightskyblue', '#87CEFA'],
+ ['lightslategray', '#778899'],
+ ['lightsteelblue', '#B0C4DE'],
+ ['lightyellow', '#FFFFE0'],
+ ['lime', '#00FF00'],
+ ['limegreen', '#32CD32'],
+ ['linen', '#FAF0E6'],
+ ['magenta', '#FF00FF'],
+ ['maroon', '#800000'],
+ ['mediumaquamarine', '#66CDAA'],
+ ['mediumblue', '#0000CD'],
+ ['mediumorchid', '#BA55D3'],
+ ['mediumpurple', '#9370DB'],
+ ['mediumseagreen', '#3CB371'],
+ ['mediumslateblue', '#7B68EE'],
+ ['mediumspringgreen', '#00FA9A'],
+ ['mediumturquoise', '#48D1CC'],
+ ['mediumvioletred', '#C71585'],
+ ['midnightblue', '#191970'],
+ ['mintcream', '#F5FFFA'],
+ ['mistyrose', '#FFE4E1'],
+ ['moccasin', '#FFE4B5'],
+ ['navajowhite', '#FFDEAD'],
+ ['navy', '#000080'],
+ ['oldlace', '#FDF5E6'],
+ ['olive', '#808000'],
+ ['olivedrab', '#6B8E23'],
+ ['orange', '#FFA500'],
+ ['orangered', '#FF4500'],
+ ['orchid', '#DA70D6'],
+ ['palegoldenrod', '#EEE8AA'],
+ ['palegreen', '#98FB98'],
+ ['paleturquoise', '#AFEEEE'],
+ ['palevioletred', '#DB7093'],
+ ['papayawhip', '#FFEFD5'],
+ ['peachpuff', '#FFDAB9'],
+ ['peru', '#CD853F'],
+ ['pink', '#FFC0CB'],
+ ['plum', '#DDA0DD'],
+ ['powderblue', '#B0E0E6'],
+ ['purple', '#800080'],
+ ['rebeccapurple', '#663399'],
+ ['red', '#FF0000'],
+ ['rosybrown', '#BC8F8F'],
+ ['royalblue', '#4169E1'],
+ ['saddlebrown', '#8B4513'],
+ ['salmon', '#FA8072'],
+ ['sandybrown', '#F4A460'],
+ ['seagreen', '#2E8B57'],
+ ['seashell', '#FFF5EE'],
+ ['sienna', '#A0522D'],
+ ['silver', '#C0C0C0'],
+ ['skyblue', '#87CEEB'],
+ ['slateblue', '#6A5ACD'],
+ ['slategray', '#708090'],
+ ['snow', '#FFFAFA'],
+ ['springgreen', '#00FF7F'],
+ ['steelblue', '#4682B4'],
+ ['tan', '#D2B48C'],
+ ['teal', '#008080'],
+ ['thistle', '#D8BFD8'],
+ ['tomato', '#FF6347'],
+ ['turquoise', '#40E0D0'],
+ ['violet', '#EE82EE'],
+ ['wheat', '#F5DEB3'],
+ ['white', '#FFFFFF'],
+ ['whitesmoke', '#F5F5F5'],
+ ['yellow', '#FFFF00'],
+ ['yellowgreen', '#9ACD32']
+
+])
+
+
+export const toHex = (n: number): string => {
+ let hex = n.toString(16);
+ if (hex.length == 1) {
+ return '0' + hex;
+ } else {
+ return hex;
+ }
+}
+export function isValidColor(color: string): boolean {
+
+ const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$/;
+ const rgbRegex = /^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/;
+ const rgbaRegex = /^rgba\((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*((1(\.0{1,2})?)|(0(\.\d{1,2})?))\)$/;
+ const hslRegex = /^hsl\((\d{1,3}), (\d{1,3})%, (\d{1,3})%\)$/;
+ const hslaRegex = /^hsla\(\s*((\d{1,2}|[1-2]\d{2}|3[0-5]\d)(\.\d+)?|\d+(\.\d+)?)\s*,\s*((\d{1,2}|\d{0,1}\d{1}\d{1}|[1-2]\d{2}|3[0-5]\d)(\.\d+)?|\d+(\.\d+)?)%\s*,\s*((\d{1,2}|\d{0,1}\d{1}\d{1}|[1-2]\d{2}|3[0-5]\d)(\.\d+)?|\d+(\.\d+)?)%\s*,\s*((1|0(\.\d{1,2})?|(\.\d{1,2})))\)$/i;
+
+
+ if (color == '') {
+ return false; // 颜色值为空
+ } else if (color === 'inherit' || color === 'transparent') {
+ return false; // 特殊颜色值
+ } else if (color === 'currentColor') {
+ return false; // currentColor 不是有效的颜色值
+ } else if (hexRegex.test(color) || rgbRegex.test(color) || rgbaRegex.test(color) || hslRegex.test(color) || hslaRegex.test(color)) {
+ return true; // 符合颜色值的格式
+ }
+ return false;
+}
+/**
+ * 获取默认的颜色值
+ * @param [string] 颜色名称或者16进制颜色值
+ */
+export function getDefaultColor(sColor: string): string {
+ if (sColor == "") return ""
+ let sc = sColor.toLocaleLowerCase().trim().replace(" ", "");
+
+ if (isValidColor(sc)) {
+ // 如果符合所有颜色值,进行转换为16进制。css方便统一解析。
+ return sc;
+ }
+ // 检测是否是颜色名称。
+ let sco = colors.get(sc);
+ if (typeof sco == 'string') return sco as string;
+ return colors.get("primary")!;
+}
+
+/**
+ * 颜色转rgb
+ */
+export function hexToRgb(sColors: string) {
+ if (sColors == "") {
+ return { r: 0, g: 0, b: 0, a: 0 }
+ }
+ let reg = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$/;
+ let sColor: string = sColors.toLowerCase();
+
+ if (sColor != '' && reg.test(sColor)) {
+
+ if (sColor.length == 4) {
+ let sColorNew = "#";
+ for (let i = 1; i < 4; i += 1) {
+ sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
+ }
+ sColor = sColorNew;
+ }
+
+ //处理六位的颜色值
+ let sColorChange: number[] = [];
+ sColorChange.push(parseInt(sColor.substring(1, 3), 16));
+ sColorChange.push(parseInt(sColor.substring(3, 5), 16));
+ sColorChange.push(parseInt(sColor.substring(5, 7), 16));
+ if (sColor.length == 9) {
+ sColorChange.push(parseInt(sColor.substring(7, 9), 16) / 255);
+ }
+ return {
+ r: sColorChange[0],
+ g: sColorChange[1],
+ b: sColorChange[2],
+ a: sColorChange.length == 4 ? sColorChange[3] : 1
+ }
+ } else if (/^(rgb|rgba)/i.test(sColor)) {
+ let arr: string[] = sColor.replace(/(?:\(|\)|rgba|rgb)*/gi, "").split(",")
+ let p: number[] = arr.map((val: string): number => {
+ let trimmed = val.trim();
+ return trimmed.includes('.') ? parseFloat(trimmed) : parseInt(trimmed);
+ });
+
+ if (p.length < 3 || p.some(val => isNaN(val))) {
+ return {
+ r: 0,
+ g: 0,
+ b: 0,
+ a: 1
+ }
+ }
+
+ // 确保RGB值在0-255范围内
+ p[0] = Math.max(0, Math.min(255, p[0]));
+ p[1] = Math.max(0, Math.min(255, p[1]));
+ p[2] = Math.max(0, Math.min(255, p[2]));
+
+ if (p.length == 3) {
+ p.push(1)
+ } else if (p.length >= 4) {
+ // 确保透明度在0-1范围内
+ p[3] = Math.max(0, Math.min(1, p[3]));
+ }
+
+ return {
+ r: p[0],
+ g: p[1],
+ b: p[2],
+ a: p[3]
+ }
+ } else {
+ return {
+ r: 0,
+ g: 0,
+ b: 0,
+ a: 1
+ }
+ }
+}
+/**
+ * rgb转hsl
+ */
+export function rgbToHsl(rgb: rgb): hsla {
+ let r = rgb.r / 255
+ let g = rgb.g / 255
+ let b = rgb.b / 255
+ let a = rgb.a
+
+ var max = Math.max(r, g, b);
+ var min = Math.min(r, g, b);
+ let h = 60 * (4 + (r - g) / (max - min));
+ let s=(max - min) / (2 - max - min);
+ let l = (max + min) / 2;
+
+ if (max === r) {
+ h = (60 * (g - b)) / (max - min);
+ } else if (max === g) {
+ h = 60 * (2 + (b - r) / (max - min));
+ }
+
+ if (h < 0) {
+ h += 360;
+ }
+
+
+ if (max === min) {
+ s = 0;
+ } else if (l < 0.5) {
+ s = (max - min) / (max + min);
+ }
+
+ return { h: h, s: s * 100, l: l * 100, a: a };
+}
+
+/**
+ * hsl转rgb
+ */
+export function hslToRgb(hsl: hsla): rgb {
+ let h = hsl.h
+ let s = hsl.s
+ let l = hsl.l
+ let a = hsl.a
+
+ h = h / 360;
+ s = s / 100;
+ l = l / 100;
+ let r = l;
+ let g = l;
+ let b = l;
+
+ function hue2rgb(pxx: number, q: number, txs: number): number {
+ let t = txs;
+ let p = pxx;
+ if (t < 0) t += 1;
+ if (t > 1) t -= 1;
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
+ if (t < 1 / 2) return q;
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
+ return p;
+ }
+
+
+
+ if (s > 0) {
+ let q = l * (1 + s);
+ if (l >= 0.5) {
+ q = l + s - l * s;
+ }
+ var p = 2 * l - q;
+ r = hue2rgb(p, q, h + 1 / 3);
+ g = hue2rgb(p, q, h);
+ b = hue2rgb(p, q, h - 1 / 3);
+
+ }
+
+ r = Math.round(r * 255);
+ g = Math.round(g * 255);
+ b = Math.round(b * 255);
+ return { r, g, b, a };
+}
+
+/**
+ * rgb转16进制
+ */
+export function rgbToHex(rgb: rgb): string {
+ let r = rgb.r
+ let g = rgb.g
+ let b = rgb.b
+ let a = rgb.a
+ return "#" + toHex(r) + toHex(g) + toHex(b) + toHex(a * 255)
+}
+export function hslaToCss(hsl: hsla): string {
+
+ let rgb = hslToRgb(hsl)
+
+ return rgbToHex(rgb)
+}
+
+export function hslaToRgbCss(hsl: hsla): string {
+
+ let rgb = hslToRgb(hsl)
+ let r = rgb.r
+ let g = rgb.g
+ let b = rgb.b
+ let a = rgb.a
+ return `rgba(${r},${g},${b},${a})`
+}
+
+// 根据 HSLA 颜色计算亮度
+export function getLuminance(color: rgb | hsla, type = "rgba"): number {
+
+
+ let colordefault: rgb = (type == 'rgba' ? color : hslToRgb(color as hsla)) as rgb;
+ const r = colordefault.r
+ const g = colordefault.g
+ const b = colordefault.b
+ const rs = r / 255
+ const gs = g / 255
+ const bs = b / 255
+ const rl = Math.pow(rs <= 0.03928 ? rs / 12.92 : ((rs + 0.055) / 1.055), 2.4);
+ const gl = Math.pow(gs <= 0.03928 ? gs / 12.92 : ((gs + 0.055) / 1.055), 2.4);
+ const bl = Math.pow(bs <= 0.03928 ? bs / 12.92 : ((bs + 0.055) / 1.055), 2.4);
+
+ return 0.2126 * rl + 0.7152 * gl + 0.0722 * bl;
+}
+
+/**
+ * 对颜色加深
+ */
+export function colorAddDeepen(sColor: string): string {
+
+ let rgb = hexToRgb(getDefaultColor(sColor));
+
+ let hsl = rgbToHsl(rgb);
+
+ let l = hsl.l - 5;
+ l = Math.max(0, Math.min(l, 100))
+
+ return hslaToRgbCss({ h: hsl.h, s: hsl.s, l, a: hsl.a })
+}
+/**
+ * 对颜色提亮
+ */
+export function colorAddBrighten(sColor: string): string {
+ let rgb = hexToRgb(getDefaultColor(sColor));
+ let hsl = rgbToHsl(rgb);
+ let l = hsl.l + 10;
+ l = Math.max(0, Math.min(l, 100))
+ return rgbToHex(hslToRgb({ h: hsl.h, s: hsl.s, l, a: hsl.a }))
+}
+
+
+
+
+/**
+ * 获取浅色系主题,根据颜色值计算。返回正常值和hover值。
+ */
+export function colorGetThint(sColor: string) {
+ let rgb = hexToRgb(getDefaultColor(sColor));
+ let hsl = rgbToHsl(rgb);
+ let s = hsl.s;
+ // let l = hsl.getNumber("l");
+ if (Math.ceil(s) > 0) {
+ s = 45
+ }
+ return {
+ default: rgbToHex(hslToRgb({ h: hsl.h, s, l: 93, a: hsl.a })),
+ hover: rgbToHex(hslToRgb({ h: hsl.h, s, l: 85, a: hsl.a }))
+ }
+}
+/**
+ * 获取正常主题,根据颜色值计算。返回正常值和hover值。
+ */
+export function colorGetHover(sColor: string) {
+
+ return {
+ default: sColor,
+ hover: colorAddDeepen(sColor)
+ }
+}
+
+
+/**
+ * 处理相主题色。
+ * @param color 需要处理的颜色值
+ * @param hoverColor 对应按下去的颜色默认与color相等。
+ * @returns UTSJSONObject
+ */
+export function getDefaultColorObj(color: string, hoverColor: string) {
+ let hsla = rgbToHsl(hexToRgb(getDefaultColor(color)));
+ let hoverHsla = rgbToHsl(hexToRgb(getDefaultColor(hoverColor)));
+ let shadow = hslaToRgbCss({ h: hsla.h, s: (hsla.s) == 0 ? 0 : 100, l: 50, a: 0.2 });
+ let shadowHOver = hslaToRgbCss({ h: hoverHsla.h, s: (hoverHsla.s) == 0 ? 0 : 70, l: 50, a: 0.15 });
+ if ((hsla.h) == 0 && (hsla.s) == 0) {
+ shadow = "transparent"
+ }
+ if ((hoverHsla.h) == 0 && (hoverHsla.s) == 0) {
+ shadowHOver = "transparent"
+ }
+ let lightnum = getLuminance(hoverHsla, 'hsla');
+ let o = {
+ default: {
+ background: hslaToRgbCss(hsla),
+ borderColor: hslaToRgbCss({ h: hsla.h, s: hsla.s, a: hsla.a, l: Math.min(Math.max(0, hsla.l - 5), hsla.l) }),
+ fontColor: lightnum < 0.6 && hsla.a > 0.1 ? '#ffffff' : '#000000',
+ shadow: shadow
+ },
+ active: {
+ background: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: Math.min(Math.max(0, hoverHsla.l - 10), hoverHsla.l) }),
+ borderColor: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: Math.max(Math.max(0, hoverHsla.l - 10), hoverHsla.l) }),
+ fontColor: lightnum < 0.6 && hoverHsla.a > 0.1 ? '#ffffff' : '#000000',
+ shadow: shadowHOver
+ }
+ }
+
+ return o;
+}
+
+/**
+ * 处理相主题色。
+ * @param color 需要处理的颜色值
+ * @param hoverColor 对应按下去的颜色默认与color相等。
+ * @returns UTSJSONObject
+ */
+export function getTextColorObj(color: string, hoverColor: string, isCoverDark?: boolean) {
+ let dark = isCoverDark == null ? false : isCoverDark
+ // #ifdef WEB
+ dark = isCoverDark == undefined ? false : dark
+ // #endif
+ let hsla = rgbToHsl(hexToRgb(getDefaultColor(color)));
+ let hsla2 = rgbToHsl(hexToRgb(getDefaultColor(color)));
+ let hoverHsla = rgbToHsl(hexToRgb(getDefaultColor(hoverColor)));
+ let bgcolor = hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: dark == true ? 20 : 95 })
+ if (dark) {
+ let p = hsla2;
+ p.l = 20
+ p.s = (p.s) != 0 ? 0 : 20
+ bgcolor = hslaToRgbCss(p)
+ }
+ let o = {
+ default: {
+ background: "transparent",
+ borderColor: "transparent",
+ fontColor: getLuminance(hsla, 'hsla') < 0.3 && hsla.a > 0.1 ? hslaToRgbCss(hsla) : hslaToRgbCss({ h: hsla.h, s: hsla.s, a: hsla.a, l: 30 }),
+ shadow: "transparent",
+ },
+ active: {
+ background: bgcolor,
+ borderColor: "transparent",
+ fontColor: getLuminance(hoverHsla, 'hsla') < 0.3 && hoverHsla.a > 0.1 ? hslaToRgbCss(hoverHsla) : hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: 30 }),
+ shadow: "transparent",
+ }
+ }
+ return o;
+}
+
+/**
+ * 处理相主题色。
+ * @param color 需要处理的颜色值
+ * @param hoverColor 对应按下去的颜色默认与color相等。
+ * @returns UTSJSONObject
+ */
+export function getThinColorObj(color: string, hoverColor: string, isCoverDark?: boolean) {
+ let dark = isCoverDark == null ? false : isCoverDark
+ // #ifdef WEB
+ dark = isCoverDark == undefined ? false : dark
+ // #endif
+
+ let hsla = rgbToHsl(hexToRgb(getDefaultColor(color)));
+ let hoverHsla = rgbToHsl(hexToRgb(getDefaultColor(hoverColor)));
+ // tmxColor.hslaToCss({ ...hsla}) : tmxColor.hslaToCss({ ...hsla,l:30})
+ let fontcolor = getLuminance(hsla, 'hsla') < 0.3 && hsla.a > 0.1 ? hslaToRgbCss(hsla) : hslaToRgbCss({ h: hsla.h, s: hsla.s, a: hsla.a, l: 30 })
+ let bordercolor = hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: dark == true ? 21 : 92 })
+ let bgcolor = hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: dark == true ? 20 : 95 })
+
+ if (dark) {
+ let p = hsla;
+ p.l = 98
+ fontcolor = hslaToRgbCss(p)
+ p.l = 20
+ p.s = (p.s) != 0 ? 5 : 20
+ bgcolor = hslaToRgbCss(p)
+ p.l = 22
+ bordercolor = hslaToRgbCss(p)
+ }
+ let o = {
+ default: {
+ background: bgcolor,
+ borderColor: bordercolor,
+ fontColor: fontcolor,
+ shadow: "transparent",
+ },
+ active: {
+ background: hslaToRgbCss({ h: hoverHsla.h, s: dark ? 10 : 50, a: hoverHsla.a, l: dark == true ? 15 : 88 }),
+ borderColor: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: 0, l: dark == true ? 18 : 80 }),
+ fontColor: getLuminance(hoverHsla, 'hsla') < 0.3 && hoverHsla.a > 0.1 ? hslaToRgbCss(hoverHsla) : hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: 64 }),
+ shadow: "transparent",
+ }
+ }
+ return o;
+}
+
+/**
+ * 处理相主题色。
+ * @param color 需要处理的颜色值
+ * @param hoverColor 对应按下去的颜色默认与color相等。
+ * @returns UTSJSONObject
+ */
+export function getOutlineColorObj(color: string, hoverColor: string) {
+ let hsla = rgbToHsl(hexToRgb(getDefaultColor(color)));
+ let hoverHsla = rgbToHsl(hexToRgb(getDefaultColor(hoverColor)));
+ // tmxColor.hslaToCss({ ...hsla}) : tmxColor.hslaToCss({ ...hsla,l:30})
+ let lightnum = getLuminance(hoverHsla, 'hsla');
+
+ let o = {
+ default: {
+ background: 'transparent',
+ borderColor: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: 1, l: 75 }),
+ fontColor: lightnum < 0.6 && hsla.a > 0.1 ? hslaToRgbCss(hsla) : hslaToRgbCss({ h: hsla.h, s: hsla.s, a: hsla.a, l: 30 }),
+ shadow: "transparent",
+ },
+
+ active: {
+ background: 'transparent',
+ borderColor: hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: 1, l: 70 }),
+ fontColor: lightnum < 0.6 && hoverHsla.a > 0.1 ? hslaToRgbCss(hoverHsla) : hslaToRgbCss({ h: hoverHsla.h, s: hoverHsla.s, a: hoverHsla.a, l: 30 }),
+ shadow: "transparent",
+ }
+ }
+ return o;
+}
+
+/**
+ * 设置颜色的亮度值。29
+ * isCoverDark:是根据亮度值,是否要设置n的值,如果n超过了
+ * 指定的30就不操作。
+ */
+export function setTextColorLightByDark(color: string): string {
+ let realColor = getDefaultColor(color);
+ let hsla = rgbToHsl(hexToRgb(realColor))
+ let l = hsla.l
+ let s = hsla.s
+ if (l < 30) {
+ if (s > 0) {
+ hsla.l = 50
+ } else {
+ hsla.l = 100
+ }
+
+ }
+
+ return hslaToRgbCss(hsla)
+}
+/**
+ * 变动的颜色是否需要变深。如果不需要返回原始颜色
+ * 如果果需要自动加深。
+ */
+export function setBgColorLightByDark(color: string): string {
+ let realColor = getDefaultColor(color);
+ let hsla = rgbToHsl(hexToRgb(realColor))
+ let l = hsla.l
+ let s = hsla.s
+ if (s == 0 && l > 50) {
+ hsla.l = 100 - l
+ }
+ if (s > 0) {
+ if (l > 50) {
+ hsla.l = 100 - l
+ }
+ }
+ return hslaToRgbCss(hsla)
+}
+
+export function isBlackAndWhite(color: string): boolean {
+ let realColor = getDefaultColor(color);
+ let hsla = rgbToHsl(hexToRgb(realColor))
+ let s = hsla.s
+ return s == 0
+}
+
+
+
diff --git a/src/uni_modules/tm-ui/libs/config.ts b/src/uni_modules/tm-ui/libs/config.ts
index 0656d09..329516b 100644
--- a/src/uni_modules/tm-ui/libs/config.ts
+++ b/src/uni_modules/tm-ui/libs/config.ts
@@ -1,47 +1,49 @@
-import { defineStore } from 'pinia';
-
-
-export const useTmConfig = defineStore('tmConfig', {
- state: () => {
- return {
- config: {
- mode: 'light',
- unit: 'rpx',
- fontSizeBase: '28',
- fontSizeScale: 1,
- buttonRadius: 24,
- buttonShadow: 'none',
- color: "primary",
-
- sheetRadius: 24,
- sheetMargin: [20, 0, 20, 20],
- sheetPadding: [24],
- sheetShadow: 'none',
-
- cellRadius: 24,
-
- sheetDarkColor: '#141414',
- sheetDarkBorderColor: ["#232323"],
-
- /** 输入框暗黑背景 */
- inputDarkColor: '#272727',
- inputLightColor: '#f5f5f5',
- inputRadius: 24,
- borderDarkColor: '#1c1c1c',
- unRadioAndCheckBoxColor: "#cfcfcf",
-
- switchRadius:64,
-
- modalRadius: 32,
- drawerRadius:32,
- animation: 'cubic-bezier(.42,.38,.15,.93)'
-
- } as TM.THEME_CONFIG
- }
- },
-
- actions: {
-
- },
-});
-
+import { defineStore } from 'pinia';
+
+
+export const useTmConfig = defineStore('tmConfig', {
+ state: () => {
+ return {
+ config: {
+ mode: 'light',
+ unit: 'rpx',
+ fontSizeBase: '28',
+ fontSizeScale: 1,
+ buttonRadius: 24,
+ buttonShadow: 'none',
+ color: "primary",
+
+ sheetRadius: 24,
+ sheetMargin: [20, 0, 20, 20],
+ sheetPadding: [24],
+ sheetShadow: 'none',
+
+ cellRadius: 24,
+
+ sheetDarkColor: '#141414',
+ sheetDarkBorderColor: ["#232323"],
+
+ /** 输入框暗黑背景 */
+ inputDarkColor: '#272727',
+ inputLightColor: '#f5f5f5',
+ inputRadius: 24,
+ borderDarkColor: '#1c1c1c',
+ unRadioAndCheckBoxColor: "#cfcfcf",
+
+ switchRadius:64,
+
+ modalRadius: 32,
+ drawerRadius:32,
+ animation: 'cubic-bezier(.42,.38,.15,.93)',
+
+ backgroundColorContentDark:"#000000"
+
+ } as TM.THEME_CONFIG
+ }
+ },
+
+ actions: {
+
+ },
+});
+
diff --git a/src/uni_modules/tm-ui/libs/tmDate.ts b/src/uni_modules/tm-ui/libs/tmDate.ts
index 7cbc97f..0825527 100644
--- a/src/uni_modules/tm-ui/libs/tmDate.ts
+++ b/src/uni_modules/tm-ui/libs/tmDate.ts
@@ -1,677 +1,838 @@
-export type tmDateTypeTime = 'y' | 'm' | 'd' | 'h' | 'M' | 's' | 'ms' | 'w'
-export type tmDateTypeQuarter = {
- quarter: number,
- start: string,
- end: string
-}
-
-/**
- * 将一个时间字符串解析为日期对象
- * @param {string} dateString 时间字符串
- * @returns Date - 日期对象
- */
-export function createDate(str: string | number | null): Date {
- if (str == null) {
- return new Date();
- }
- if(!str) return new Date()
- if(typeof str === 'number') return new Date(str)
- let nowstr = str.replace(/-/g, '/');
- let date = new Date(nowstr)
- if (isNaN(date.getTime())) {
- date = new Date();
- }
- return date;
-}
-
-export class tmDate {
- date: Date;
- constructor(dateStr: string | null | number = null) {
- this.date = createDate(dateStr)
- }
- /**
- * 给数字添加前缀0
- */
- translateFullDate(d: number, w: number): string {
- let dstr = d.toString();
- if (dstr.length < w) {
- let dar: number[] = new Array(w - dstr.length).fill(0);
- dstr = dar.join('') + dstr
- }
- return dstr;
- }
- /**
- * 格式化日期
- * @param {string} s 模板,比如YYYY/MM/DD hh:mm:ss
- * @returns {string} 格式化后的日期字符串
- */
- format(s: string | null = null): string {
- let str = "YYYY/MM/DD hh:mm:ss"
- if (s != null) {
- str = s;
- }
- str = str.replace(/YYYY/g, this.translateFullDate(this.date.getFullYear(), 2))
- str = str.replace(/MM/g, this.translateFullDate(this.date.getMonth() + 1, 2))
- str = str.replace(/DD/g, this.translateFullDate(this.date.getDate(), 2))
- str = str.replace(/hh/g, this.translateFullDate(this.date.getHours(), 2))
- str = str.replace(/HH/g, this.translateFullDate(this.date.getHours(), 2))
- str = str.replace(/mm/g, this.translateFullDate(this.date.getMinutes(), 2))
- str = str.replace(/ss/g, this.translateFullDate(this.date.getSeconds(), 2))
- return str;
- }
- /**
- * 获取当前年
- * @return — 根据当地时间,返回一个对应于给定日期的年份数字。
- */
- getYear(): number {
- return this.date.getFullYear()
- }
- /**
- * 获取当前月
- * @description 是从0开始,1-11月
- * @return — 一个 0 到 11 的整数值:0 代表一月份,1 代表二月份,2 代表三月份,依次类推
- */
- getMonth(): number {
-
- return this.date.getMonth()
- }
- /**
- * 获取当前天
- * @return — 返回一个 1 到 31 的整数值。
- */
- getDate(): number {
- return this.date.getDate()
- }
- /**
- * 获取当前小时
- * @return — 返回一个 0 到 23 之间的整数值。
- */
- getHours(): number {
- return this.date.getHours()
- }
- /**
- * 获取当前分钟
- * @return — 返回一个 0 到 59 的整数值。
- */
- getMinutes(): number {
- return this.date.getMinutes()
- }
- /**
- * 获取当前秒
- * @return — 返回一个 0 到 59 的整数值。
- */
- getSeconds(): number {
- return this.date.getSeconds()
- }
- /**
- * 获取指定是数据
- * @param {tmDateTypeTime} d - 'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
- * @returns - 指定类型的数值
- */
- getDateOf(d: tmDateTypeTime = 'd'): number {
- if (d == 'y') {
- return this.date.getFullYear()
- }
- else if (d == 'm') {
- return this.date.getMonth()
- }
- else if (d == 'd') {
- return this.date.getDate()
- }
- else if (d == 'h') {
- return this.date.getHours()
- }
- else if (d == 'M') {
- return this.date.getMinutes()
- }
- else if (d == 's') {
- return this.date.getSeconds()
- }
- return this.date.getMilliseconds()
- }
- /**
- * 设定日期
- * @param {number} n - 设定的数据,
- * @param {string} d - 比如d=y,那么就是设置本日期的年份数据,'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
- * @returns - xDate对象实例
- */
- setDateOf(n: number, d: tmDateTypeTime = 'd'): tmDate {
- if (d == 'y') {
- this.date.setFullYear(n)
- }
- else if (d == 'm') {
- this.date.setMonth(n)
- }
- else if (d == 'd') {
- this.date.setDate(n)
- }
- else if (d == 'h') {
- this.date.setHours(n)
- }
- else if (d == 'M') {
- this.date.setMinutes(n)
- }
- else if (d == 's') {
- this.date.setSeconds(n)
- }
- else if (d == 'ms') {
- this.date.setMilliseconds(n)
- }
- return this;
- }
-
- /**
- * @param {string} - d:'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
- * @returns - 返回从UTC时间1970年1月1日午夜开始以毫秒为单位存储的时间值。
- * @description 注意,如果不提供d就默认返回毫秒,比如设置d=m那么后面的h,M,s,ms会被设置为0
- */
- getTime(d: tmDateTypeTime): number {
- let date = new Date(this.date.getTime())
-
- if (d == 'y') {
- date.setMonth(0)
- date.setDate(1)
- date.setHours(0)
- date.setMinutes(0)
- date.setSeconds(0)
- date.setMilliseconds(0)
- return date.getTime()
- }
- else if (d == 'm') {
- date.setDate(1)
- date.setHours(0)
- date.setMinutes(0)
- date.setSeconds(0)
- date.setMilliseconds(0)
- return date.getTime()
- }
- else if (d == 'd') {
- date.setHours(0)
- date.setMinutes(0)
- date.setSeconds(0)
- date.setMilliseconds(0)
- return date.getTime()
- }
- else if (d == 'h') {
- date.setMinutes(0)
- date.setSeconds(0)
- date.setMilliseconds(0)
- return date.getTime()
- }
- else if (d == 'M') {
- date.setSeconds(0)
- date.setMilliseconds(0)
- return date.getTime()
- }
- else if (d == 's') {
- date.setMilliseconds(0)
- return date.getTime()
- }
- return date.getTime()
- }
-
- /**
- * 当前时间的副本
- */
- getClone(): tmDate {
- let p = this.format("YYYY/MM/DD HH:mm:ss");
- return new tmDate(p);
- }
- /**
- * 本年的第几周
- * @return 周次
- */
- getWeek(): number {
- var target = createDate(this.format());
- target.setDate(target.getDate() - (target.getDay() == 0 ? 7 : target.getDay()));
- var firstDayOfYear = new Date(target.getFullYear(), 0, 1);
- firstDayOfYear.setDate(firstDayOfYear.getDate() - (firstDayOfYear.getDay() == 0 ? 7 : firstDayOfYear.getDay()));
- return Math.ceil((((target.getTime() - firstDayOfYear.getTime()) / 86400000) + 1) / 7);
- }
- /**
- * 取时间的第一天
- * @param {m,w,y} - m表示取本月的第一天,w取本周的第一天,y表示本年的第一天
- * @returns {tmDate} - 返回xDate对象
- */
- getDateStartOf(d: 'm' | 'w' | 'y' = 'm'): tmDate {
- // 获取当前日期对象
- var now = createDate(this.format());
- if (d == 'w') {
- // 将日期设置为所在周的周一(遵循ISO 8601标准,周一开始于周一)
- var dayOfWeek = now.getDay();
- if (dayOfWeek === 0) { // 如果是星期日,则向前推一天至上周的周一
- now.setDate(now.getDate() - 7);
- }
- now.setDate(now.getDate() - dayOfWeek + 1);
- }
- if (d == 'm' || d == 'y') {
- now.setDate(1);
- }
- if (d == 'y') {
- now.setMonth(0);
- }
- now.setHours(0);
- now.setMinutes(0);
- now.setSeconds(0);
- return dateCovertTmDate(now);
- }
-
- /**
- * 取时间的最后一天
- * @param {string} - m,w,y m表示取本月的最后一天,w取本周的最后一天,y表示本年的最后一天
- * @returns {tmDate} - 返回xDate对象
- */
- getDateEndOf(d: 'm' | 'w' | 'y' = 'm') {
- // 获取当前日期对象
- var now = createDate(this.format());
- if (d == 'w') {
- // 将日期设置为所在周的周一(遵循ISO 8601标准,周一开始于周一)
- var dayOfWeek = now.getDay();
- if (dayOfWeek === 0) { // 如果是星期日,则向前推一天至上周的周一
- return dateCovertTmDate(now);
- }
- now.setDate(now.getDate() + (7 - dayOfWeek));
- }
- if (d == 'm' || d == 'y') {
- now.setDate(this.getMonthCountDay());
- }
- if (d == 'y') {
- now.setMonth(11);
- }
- now.setHours(23);
- now.setMinutes(59);
- now.setSeconds(59);
- return dateCovertTmDate(now);
- }
-
-
- /**
- * 根据本地时间,返回一个具体日期中一周的第几天,0 表示星期天。
- * @return — 根据本地时间,返回一个 0 到 6 之间的整数值,代表星期几:0 代表星期日,1 代表星期一,2 代表星期二,依次类推。
- */
- getWeekDay(): number {
- return this.date.getDay()
- }
- /**
- * 根据本地时间,返回一个具体日期中一周的第几天,0 表示星期天。
- * @param {string[]} model 具有星期的中文模板,请按照顺序放置如["周日","周一","周二","周三","周四","周五","周六"]
- * @return — 返回一个具中中国的星期的大写
- */
- getWeekDayCn(model: string[] | null = null): string {
- let ml = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
- if (model != null && model?.length == 7) {
- ml = model!;
- }
- return ml[this.getWeekDay()]!
- }
- /**
- * 返回当前日期本月的最大天数
- * @returns - 当前月份的最大天数
- */
- getMonthCountDay(): number {
- let nextDate = createDate(this.format());
- // 先设置为1号,避免后面设置月份时超过月的天数。
- nextDate.setDate(1)
- nextDate.setMonth(this.getMonth() + 1)
- // 设置为上月的最后一天。
- nextDate.setDate(0)
- return nextDate.getDate()
- }
-
- /**
- * 返回当日的信息
- * @returns - 返回一个包含年月日周次,星期,农历等的对象
- */
- getDateInfo(str: string | null = null): TM.tmDateDayInfoType {
- let date = this as tmDate
- if (str != null) {
- date = new tmDate(str)
- }
- let info = {
- year: date.getYear(),
- month: date.getMonth(),
- day: date.getDate(),
- hours: date.getHours(),
- minutes: date.getMinutes(),
- seconds: date.getSeconds(),
- week: date.getWeekDay(),
- weeks: date.getWeek(),
- weekCn: date.getWeekDayCn(),
- date: ""
- } as TM.tmDateDayInfoType
- info.date = info.year + '/' + (info.month + 1) + '/' + info.day
- return info
- }
-
- /**
- * 返回日期数组
- * @param {string} - m,w,m表示返回本月的日期数据,w表示返回本周的日期数据
- * @returns - 返回一个日期数组
- */
- getDaysOf(d: 'm' | 'w' = 'm'): TM.tmDateDayInfoType[] {
- let dates = [] as TM.tmDateDayInfoType[]
- if (d == 'w') {
- let first = this.getDateStartOf('w')
-
- for (let i = 0; i < 7; i++) {
- let date = first.getClone()
- date.date.setDate(date.date.getDate() + i)
- dates.push(date.getDateInfo())
- }
- }
- if (d == 'm') {
- let first = this.getDateStartOf('m')
- let maxDay = this.getMonthCountDay()
- for (let i = 1; i <= maxDay; i++) {
- let date = first.getClone()
- date.date.setDate(i)
- dates.push(date.getDateInfo())
- }
-
- }
-
- return dates;
- }
-
- /**
- * 为当前日期进行加操作
- * @param {string} - y,m,d,h,M,s,w,代表的是年份,月份,日期,小时,分钟,秒数,周
- */
- add(count: number, d: tmDateTypeTime = 'd') {
- if (d == 'y') {
- this.date.setFullYear(this.getYear() + count)
- }
- else if (d == 'm') {
- this.date.setMonth(this.getMonth() + count)
- }
- else if (d == 'd') {
- this.date.setDate(this.getDate() + count)
- }
- else if (d == 'h') {
- this.date.setHours(this.getHours() + count)
- }
- else if (d == 'M') {
- this.date.setMinutes(this.getMinutes() + count)
- }
- else if (d == 's') {
- this.date.setSeconds(this.getSeconds() + count)
- }
- // 添加一周
- else if (d == 'w') {
- this.date.setDate(this.getDate() + count * 7)
-
- }
-
- return this;
- }
- /**
- * 为当前日期进行减操作
- * @param {string} - y,m,d,h,M,s,w,代表的是年份,月份,日期,小时,分钟,秒数,周
- */
- subtraction(count: number, d: tmDateTypeTime = 'd') {
- if (d == 'y') {
- this.date.setFullYear(this.getYear() - count)
- }
- else if (d == 'm') {
- this.date.setMonth(this.getMonth() - count)
- }
- else if (d == 'd') {
- this.date.setDate(this.getDate() - count)
- }
- else if (d == 'h') {
- this.date.setHours(this.getHours() - count)
- }
- else if (d == 'M') {
- this.date.setMinutes(this.getMinutes() - count)
- }
- else if (d == 's') {
- this.date.setSeconds(this.getSeconds() - count)
- }
- // 添加一周
- else if (d == 'w') {
- this.date.setDate(this.getDate() - count * 7)
- }
-
- return this;
- }
-
-
- /**
- * 日期是否在一个区间内
- * @param {tmDate} start 开始日期
- * @param {tmDate} end 结束日期
- * @param {string} - type要比较的单位,默认为ms,'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
- * @param {string} - d,默认为[] 区间类型,'()'不含起始'[]'包含起始'(]'不包含开始,但包含结束'[)'包含开始,但不包含结束
- * @returns {boolean} 是否在区间内
- */
- isBetween(start: tmDate, end: tmDate, type: tmDateTypeTime = 'ms', d: '()' | '[]' | '(]' | '[)' = '[]'): boolean {
- let startTime = start.getTime(type)
-
- // new Date('1970-1-1 8:0:0').getTime()
- let endTime = end.getTime(type)
- let nowTime = this.getTime(type)
- if (d == '()') {
- return nowTime > startTime && nowTime < endTime
- }
- else if (d == '[]') {
- return nowTime >= startTime && nowTime <= endTime
- }
- else if (d == '(]') {
- return nowTime > startTime && nowTime <= endTime
- }
- else if (d == '[)') {
- return nowTime >= startTime && nowTime < endTime
- }
- return nowTime >= startTime && nowTime <= endTime
- }
-
- /**
- * 与目标日期比较
- * @param {tmDate} targetDate 要比较的日期
- * @param {string} - d,默认为> 比较类型,'>'大于目标日期,'>='大于等于目标'<'小于目标,'<='小于等于目标,'='全等
- * @param {string} - type要比较的单位,默认为ms,'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
- * @returns {boolean} 比较结果
- */
- isBetweenOf(targetDate: tmDate, d: '>' | '>=' | '<' | '<=' | '=' = '>', type: tmDateTypeTime = 'ms'): boolean {
- let startTime = targetDate.getTime(type)
- let nowTime = this.getTime(type)
- if (d == '>') {
- return nowTime > startTime
- }
- else if (d == '>=') {
- return nowTime >= startTime
- }
- else if (d == '<') {
- return nowTime < startTime
- }
- else if (d == '<=') {
- return nowTime <= startTime
- }
- else if (d == '=') {
- return nowTime == startTime
- }
- return nowTime > startTime
- }
- /**
- * 与目标时间过了多久
- * @param {string|tmDate|null} target 要对比的相对时间,如果填写null就表示当前时间以来的的多久
- * @param {Map} model 如果为null或者为空的map采用默认值,map格式key表示以秒为单位的时间,value为对应的文本
- * 比如60,1分钟前
- * @param {string} format 超过最大值最使用格式化日期,如果为null默认为YYYY-MM-DD
- * @returns {string} 返回对应的时间文本
- */
- fromBetweenLongTime(target: any, model: Map | null, format: string | null): string {
- let bijiaodate: tmDate = new tmDate()
- if (target instanceof tmDate) {
- bijiaodate = (target as tmDate)
- } else if (typeof target == 'string') {
- bijiaodate = new tmDate(target as string)
- } else if (target == null) {
- bijiaodate = new tmDate()
- }
-
- let mapmodel = new Map([
- [30, '刚刚'],
- [60, '1分前'],
- [60 * 5, '5分前'],
- [60 * 10, '10分前'],
- [60 * 30, '半小时前'],
- [60 * 60, '1小时前'],
- [60 * 60 * 2, '2小时前'],
- [60 * 60 * 3, '3小时前'],
- [60 * 60 * 5, '5小时前'],
- [60 * 60 * 23, '今天'],
- [60 * 60 * 24 * 1, '1天前'],
- [60 * 60 * 24 * 2, '2天前'],
- [60 * 60 * 24 * 7, '1周前'],
- [60 * 60 * 24 * 30, '1个月前'],
- [60 * 60 * 24 * 30 * 2, '2个月前'],
- [60 * 60 * 24 * 30 * 3, '3个月前'],
- [60 * 60 * 24 * 30 * 4, '4个月前'],
- [60 * 60 * 24 * 30 * 5, '5个月前'],
- [60 * 60 * 24 * 30 * 6, '半年前'],
- [60 * 60 * 24 * 30 * 12, '1年前'],
- [60 * 60 * 24 * 30 * 12 + 60 * 60 * 24 * 30, '']
- ])
- let fmt = format == null ? 'YYYY-MM-DD' : (format!)
-
- if (model != null) {
- if (model!.size > 0) {
- mapmodel = model!
- }
- }
- let str = ""
- let fanzhumap = [] as number[];
- mapmodel.forEach((value: string, key: number) => {
- fanzhumap.push(key)
- })
- fanzhumap.reverse()
-
- try {
- let startTime = bijiaodate.getTime('s')
- let nowTime = this.getTime('s')
- let diff = (nowTime - startTime) / 1000
-
- if (diff > 0) {
- for (let i = 0; i < fanzhumap.length; i++) {
- let key = fanzhumap[i];
-
- if (diff >= key) {
-
- str = mapmodel.get(key)!
- break;
- }
- }
-
- } else {
- str = mapmodel.get(fanzhumap[fanzhumap.length - 1])!
- }
- if (str == '') {
- str = bijiaodate.format(fmt)
- }
-
-
- } catch (e) {
- //TODO handle the exception
- }
-
-
-
- return str
- }
- /**
- * 与目标时间相差多少个单位
- * @param {string|tmDate|null} target 目标时间
- * @param {tmDateTypeTime} type 相差的单位,默认:s秒
- * @returns {string} 反返回以xDateTypeTime为单位相关的时间数
- */
- diffTime(target: any, type: tmDateTypeTime = 's'): number {
- let startTime = 0
- let typed: tmDateTypeTime = (type == 'w' ? 'd' : type)
- if (target instanceof tmDate) {
- startTime = (target as tmDate).getTime(typed)
- } else if (typeof target == 'string') {
- startTime = new tmDate(target as string).getTime(typed)
-
- } else if (target == null) {
- startTime = new tmDate().getTime(typed)
- }
-
- let nowTime = this.getTime(typed)
- let diff = Math.abs(nowTime - startTime);
- let d = 0
- if (type == 's') {
- d = diff
- } else if (type == 'M') {
- d = diff / 60 / 1000
- } else if (type == 'h') {
- d = diff / 60 / 60 / 1000
- } else if (type == 'd') {
- d = diff / 60 / 60 / 24 / 1000
- } else if (type == 'm') {
- d = diff / 60 / 60 / 24 / 30 / 1000
- } else if (type == 'y') {
- d = diff / 60 / 60 / 24 / 30 / 12 / 1000
- } else if (type == 'w') {
- let ondate = (1000 * 60 * 60 * 24 * 7);
- d = diff / ondate
- }
-
- return Math.floor(d)
- }
- /**
- * 获取季度
- * @param {string} type y表示获取本年的4个季度,空值表示获取当前时间所在的季度
- * @returns {tmDateTypeQuarter[]} 返回一个季度数组{quarter:number,start:string,end:string}
- */
- getQuarter(type: string = ''): tmDateTypeQuarter[] {
- let q1 = [1, 2, 3]
- let q2 = [4, 5, 6]
- let q3 = [7, 8, 9]
- let q4 = [10, 11, 12]
- let nowMonth = this.getMonth() + 1
- let qall = [q1, q2, q3, q4] as number[][]
- let qmap = [] as tmDateTypeQuarter[]
- if (type == 'y') {
- for (let i = 0; i < qall.length; i++) {
- let item = qall[i]
- let sdate = new tmDate(this.getYear() + '/' + item[0] + '/1')
- let edate = new tmDate(this.getYear() + '/' + item[item.length - 1] + '/1')
- let start = sdate.format('YYYY/MM/DD')
- let end = edate.getDateEndOf('m').format('YYYY/MM/DD')
- qmap.push({
- quarter: i,
- start,
- end
- } as tmDateTypeQuarter)
- }
- } else {
- for (let i = 0; i < qall.length; i++) {
- let item = qall[i]
- if (item.includes(nowMonth)) {
- let sdate = new tmDate(this.getYear() + '/' + item[0] + '/1')
- let edate = new tmDate(this.getYear() + '/' + item[item.length - 1] + '/1')
- let start = sdate.format('YYYY/MM/DD')
- let end = edate.getDateEndOf('m').format('YYYY/MM/DD')
- qmap.push({
- quarter: i,
- start,
- end
- } as tmDateTypeQuarter)
- break;
- }
- }
- }
- return qmap;
- }
-
-}
-
-/**
- * 将一个日期转换为tmDate对象
- */
-export const dateCovertTmDate = function (date: Date){
- let str = date.getFullYear().toString() + "/" + (date.getMonth() + 1).toString() + "/"
- + date.getDate().toString() + " " + date.getHours().toString() + ":" + date.getMinutes().toString() + ":" + date.getSeconds().toString()
- return new tmDate(str)
+export type tmDateTypeTime = 'y' | 'm' | 'd' | 'h' | 'M' | 's' | 'ms' | 'w'
+export type tmDateTypeQuarter = {
+ quarter: number,
+ start: string,
+ end: string
+}
+
+export type DateFormat = 'RFC2822' | 'ISO8601' | 'CUSTOM';
+/**
+ * 用来解析非标准时间以及各种奇怪的时间格式。
+ */
+export function createDate(dateStrs : string) : Date {
+ const dateStr = dateStrs.replace(/\//g,'-')
+ const result = new Date();
+
+ // YYYY,YYYY-MM,YYYY-MM-DD,YYYY-MM-DD HH,YYYY-MM-DD HH:mm,YYYY-MM-DD HH:mm:ss
+ let regxyy = /^(\d{4})$/
+ let regxyymm = /^(\d{4})[-/](\d{1,2})$/
+ let regxyymmdd = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/
+ let regxyymmddhh = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2}) (\d{1,2})$/
+ let regxyymmddhhmm = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2}) (\d{1,2}):(\d{1,2})$/
+ let regxyymmddhhmmss = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/
+
+ let year = result.getFullYear();
+ let month = result.getMonth()-1
+ let day = result.getDate()
+ let hour = result.getHours()
+ let minute = result.getMinutes()
+ let second = result.getSeconds()
+
+
+ result.setSeconds(59);
+ result.setMinutes(59);
+ result.setHours(59);
+ result.setDate(1);
+
+ if(regxyymmddhhmmss.test(dateStr)){
+ const match = dateStr.match(regxyymmddhhmmss)!;
+ year = (parseInt(match[1] as string));
+ month = (parseInt(match[2] as string) - 1);
+ day = (parseInt(match[3] as string));
+ hour = (parseInt(match[4] as string));
+ minute = (parseInt(match[5] as string));
+ second = (parseInt(match[6] as string));
+ }else if(regxyymmddhhmm.test(dateStr)){
+ const match = dateStr.match(regxyymmddhhmm)!;
+ year = (parseInt(match[1] as string));
+ month = (parseInt(match[2] as string) - 1);
+ day = (parseInt(match[3] as string));
+ hour = (parseInt(match[4] as string));
+ minute = (parseInt(match[5] as string));
+
+ }else if(regxyymmddhh.test(dateStr)){
+ const match = dateStr.match(regxyymmddhh)!;
+ year = (parseInt(match[1] as string));
+ month = (parseInt(match[2] as string) - 1);
+ day = (parseInt(match[3] as string));
+ hour = (parseInt(match[4] as string));
+ }else if(regxyymmdd.test(dateStr)){
+ const match = dateStr.match(regxyymmdd)!;
+ year = (parseInt(match[1] as string));
+ month = (parseInt(match[2] as string) - 1);
+ day = (parseInt(match[3] as string));
+
+
+ }else if(regxyymm.test(dateStr)){
+ const match = dateStr.match(regxyymm)!;
+ year = (parseInt(match[1] as string));
+ month = (parseInt(match[2] as string) - 1);
+ }else if(regxyy.test(dateStr)){
+ const match = dateStr.match(regxyy)!;
+ year = (parseInt(match[1] as string));
+
+ }
+
+
+ result.setSeconds(second);
+ result.setMinutes(minute);
+ result.setHours(hour);
+ result.setFullYear(year);
+ result.setMonth(month);
+ result.setDate(day);
+ return result;
+}
+
+export class tmDate {
+ date: Date;
+ constructor(dateStr: string | number | Date | null = null) {
+ if (dateStr == null) {
+ this.date = new Date();
+ return;
+ }
+ if(typeof dateStr == 'number'){
+ this.date = new Date(dateStr! as number);
+ }else if(typeof dateStr == 'string'){
+ if(dateStr == ''){
+ this.date = new Date();
+ return;
+ }
+ const dateformatStr = this.detectDateFormat(dateStr!)
+
+ if(dateformatStr=='CUSTOM'){
+ let str = dateStr! as string;
+ str = str.replace(/-/g,'/')
+ let isNumberStr = /^\d+$/.test(str)
+
+ if(!isNumberStr){
+ this.date = createDate(dateStr!)
+
+ }else{
+ this.date = new Date(parseInt(str!));
+ }
+
+ }else{
+ this.date = new Date(dateStr! as string);
+ }
+
+ return;
+ }else if(dateStr instanceof Date){
+ this.date = dateStr! as Date;
+ return;
+ }
+
+ this.date = new Date();
+ }
+ /**
+ * 检测字符串的日期格式类型
+ * @param dateStr - 日期字符串
+ * @returns 日期格式类型
+ */
+ detectDateFormat(dateStr : string) : DateFormat {
+ // RFC2822 格式检测
+ if (/^(?:\w{3},\s)?(?:\d{1,2}\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s\d{2}:\d{2}(?::\d{2})?(?:\sGMT)?)|(?:\w{3}\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{1,2}\s\d{2}:\d{2}(?::\d{2})?\s\d{4})/.test(dateStr)) {
+ return 'RFC2822';
+ }
+
+ // ISO8601 格式检测
+ if (/^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/.test(dateStr)) {
+ return 'ISO8601';
+ }
+
+ return 'CUSTOM';
+ }
+ /**
+ * 给数字添加前缀0
+ */
+ translateFullDate(d: number, w: number): string {
+ let dstr = d.toString();
+ if (dstr.length < w) {
+ let dar: number[] = new Array(w - dstr.length).fill(0);
+ dstr = dar.join('') + dstr
+ }
+ return dstr;
+ }
+ /**
+ * 格式化日期
+ * @param {string} s 模板,比如YYYY/MM/DD hh:mm:ss
+ * @returns {string} 格式化后的日期字符串
+ */
+ format(s: string | null = null): string {
+ let str = "YYYY/MM/DD hh:mm:ss"
+ if (s != null) {
+ str = s;
+ }
+ str = str.replace(/YYYY/g, this.translateFullDate(this.date.getFullYear(), 2))
+ str = str.replace(/MM/g, this.translateFullDate(this.date.getMonth() + 1, 2))
+ str = str.replace(/DD/g, this.translateFullDate(this.date.getDate(), 2))
+ str = str.replace(/hh/g, this.translateFullDate(this.date.getHours(), 2))
+ str = str.replace(/HH/g, this.translateFullDate(this.date.getHours(), 2))
+ str = str.replace(/mm/g, this.translateFullDate(this.date.getMinutes(), 2))
+ str = str.replace(/ss/g, this.translateFullDate(this.date.getSeconds(), 2))
+ return str;
+ }
+ /**
+ * 获取当前年
+ * @return — 根据当地时间,返回一个对应于给定日期的年份数字。
+ */
+ getYear(): number {
+ return this.date.getFullYear()
+ }
+ /**
+ * 获取当前月
+ * @description 是从0开始,1-11月
+ * @return — 一个 0 到 11 的整数值:0 代表一月份,1 代表二月份,2 代表三月份,依次类推
+ */
+ getMonth(): number {
+
+ return this.date.getMonth()
+ }
+ /**
+ * 获取当前天
+ * @return — 返回一个 1 到 31 的整数值。
+ */
+ getDate(): number {
+ return this.date.getDate()
+ }
+ /**
+ * 获取当前小时
+ * @return — 返回一个 0 到 23 之间的整数值。
+ */
+ getHours(): number {
+ return this.date.getHours()
+ }
+ /**
+ * 获取当前分钟
+ * @return — 返回一个 0 到 59 的整数值。
+ */
+ getMinutes(): number {
+ return this.date.getMinutes()
+ }
+ /**
+ * 获取当前秒
+ * @return — 返回一个 0 到 59 的整数值。
+ */
+ getSeconds(): number {
+ return this.date.getSeconds()
+ }
+ /**
+ * 获取指定是数据
+ * @param {tmDateTypeTime} d - 'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
+ * @returns - 指定类型的数值
+ */
+ getDateOf(d: tmDateTypeTime = 'd'): number {
+ if (d == 'y') {
+ return this.date.getFullYear()
+ }
+ else if (d == 'm') {
+ return this.date.getMonth()
+ }
+ else if (d == 'd') {
+ return this.date.getDate()
+ }
+ else if (d == 'h') {
+ return this.date.getHours()
+ }
+ else if (d == 'M') {
+ return this.date.getMinutes()
+ }
+ else if (d == 's') {
+ return this.date.getSeconds()
+ }
+ return this.date.getMilliseconds()
+ }
+ /**
+ * 设定日期
+ * @param {number} n - 设定的数据,
+ * @param {string} d - 比如d=y,那么就是设置本日期的年份数据,'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
+ * @returns - xDate对象实例
+ */
+ setDateOf(n: number, d: tmDateTypeTime = 'd'): tmDate {
+ if (d == 'y') {
+ this.date.setFullYear(n)
+ }
+ else if (d == 'm') {
+ this.date.setMonth(n)
+ }
+ else if (d == 'd') {
+ this.date.setDate(n)
+ }
+ else if (d == 'h') {
+ this.date.setHours(n)
+ }
+ else if (d == 'M') {
+ this.date.setMinutes(n)
+ }
+ else if (d == 's') {
+ this.date.setSeconds(n)
+ }
+ else if (d == 'ms') {
+ this.date.setMilliseconds(n)
+ }
+ return this;
+ }
+
+ /**
+ * @param {string} - d:'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
+ * @returns - 返回从UTC时间1970年1月1日午夜开始以毫秒为单位存储的时间值。
+ * @description 注意,如果不提供d就默认返回毫秒,比如设置d=m那么后面的h,M,s,ms会被设置为0
+ */
+ getTime(d: tmDateTypeTime): number {
+ let date = new Date(this.date.getTime())
+
+ if (d == 'y') {
+ date.setMonth(0)
+ date.setDate(1)
+ date.setHours(0)
+ date.setMinutes(0)
+ date.setSeconds(0)
+ date.setMilliseconds(0)
+ return date.getTime()
+ }
+ else if (d == 'm') {
+ date.setDate(1)
+ date.setHours(0)
+ date.setMinutes(0)
+ date.setSeconds(0)
+ date.setMilliseconds(0)
+ return date.getTime()
+ }
+ else if (d == 'd') {
+ date.setHours(0)
+ date.setMinutes(0)
+ date.setSeconds(0)
+ date.setMilliseconds(0)
+ return date.getTime()
+ }
+ else if (d == 'h') {
+ date.setMinutes(0)
+ date.setSeconds(0)
+ date.setMilliseconds(0)
+ return date.getTime()
+ }
+ else if (d == 'M') {
+ date.setSeconds(0)
+ date.setMilliseconds(0)
+ return date.getTime()
+ }
+ else if (d == 's') {
+ date.setMilliseconds(0)
+ return date.getTime()
+ }
+ return date.getTime()
+ }
+
+ /**
+ * 当前时间的副本
+ */
+ getClone(): tmDate {
+ let p = this.format("YYYY/MM/DD HH:mm:ss");
+ return new tmDate(p);
+ }
+ /**
+ * 本年的第几周
+ * @return 周次
+ */
+ getWeek(): number {
+ var target = createDate(this.format());
+ target.setDate(target.getDate() - (target.getDay() == 0 ? 7 : target.getDay()));
+ var firstDayOfYear = new Date(target.getFullYear(), 0, 1);
+ firstDayOfYear.setDate(firstDayOfYear.getDate() - (firstDayOfYear.getDay() == 0 ? 7 : firstDayOfYear.getDay()));
+ return Math.ceil((((target.getTime() - firstDayOfYear.getTime()) / 86400000) + 1) / 7);
+ }
+ /**
+ * 取时间的第一天
+ * @param {m,w,y} - m表示取本月的第一天,w取本周的第一天,y表示本年的第一天
+ * @returns {tmDate} - 返回xDate对象
+ */
+ getDateStartOf(d: 'm' | 'w' | 'y' = 'm'): tmDate {
+ // 获取当前日期对象
+ var now = createDate(this.format());
+ if (d == 'w') {
+ // 将日期设置为所在周的周一(遵循ISO 8601标准,周一开始于周一)
+ var dayOfWeek = now.getDay();
+ if (dayOfWeek === 0) { // 如果是星期日,则向前推一天至上周的周一
+ now.setDate(now.getDate() - 7);
+ }
+ now.setDate(now.getDate() - dayOfWeek + 1);
+ }
+ if (d == 'm' || d == 'y') {
+ now.setDate(1);
+ }
+ if (d == 'y') {
+ now.setMonth(0);
+ }
+ now.setHours(0);
+ now.setMinutes(0);
+ now.setSeconds(0);
+ return dateCovertTmDate(now);
+ }
+
+ /**
+ * 取时间的最后一天
+ * @param {string} - m,w,y m表示取本月的最后一天,w取本周的最后一天,y表示本年的最后一天
+ * @returns {tmDate} - 返回xDate对象
+ */
+ getDateEndOf(d: 'm' | 'w' | 'y' = 'm') {
+ // 获取当前日期对象
+ var now = createDate(this.format());
+ if (d == 'w') {
+ // 将日期设置为所在周的周一(遵循ISO 8601标准,周一开始于周一)
+ var dayOfWeek = now.getDay();
+ if (dayOfWeek === 0) { // 如果是星期日,则向前推一天至上周的周一
+ return dateCovertTmDate(now);
+ }
+ now.setDate(now.getDate() + (7 - dayOfWeek));
+ }
+ if (d == 'm' || d == 'y') {
+ now.setDate(this.getMonthCountDay());
+ }
+ if (d == 'y') {
+ now.setMonth(11);
+ }
+ now.setHours(23);
+ now.setMinutes(59);
+ now.setSeconds(59);
+ return dateCovertTmDate(now);
+ }
+
+
+ /**
+ * 根据本地时间,返回一个具体日期中一周的第几天,0 表示星期天。
+ * @return — 根据本地时间,返回一个 0 到 6 之间的整数值,代表星期几:0 代表星期日,1 代表星期一,2 代表星期二,依次类推。
+ */
+ getWeekDay(): number {
+ return this.date.getDay()
+ }
+ /**
+ * 根据本地时间,返回一个具体日期中一周的第几天,0 表示星期天。
+ * @param {string[]} model 具有星期的中文模板,请按照顺序放置如["周日","周一","周二","周三","周四","周五","周六"]
+ * @return — 返回一个具中中国的星期的大写
+ */
+ getWeekDayCn(model: string[] | null = null): string {
+ let ml = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
+ if (model != null && model?.length == 7) {
+ ml = model!;
+ }
+ return ml[this.getWeekDay()]!
+ }
+ /**
+ * 返回当前日期本月的最大天数
+ * @returns - 当前月份的最大天数
+ */
+ getMonthCountDay(): number {
+ let nextDate = createDate(this.format());
+
+ // 先设置为1号,避免后面设置月份时超过月的天数。
+ nextDate.setDate(1)
+ nextDate.setMonth(this.getMonth() + 1)
+ // 设置为上月的最后一天。
+ nextDate.setDate(0)
+ return nextDate.getDate()
+ }
+
+ /**
+ * 返回当日的信息
+ * @returns - 返回一个包含年月日周次,星期,农历等的对象
+ */
+ getDateInfo(str: string | null = null): TM.tmDateDayInfoType {
+ let date = this as tmDate
+ if (str != null) {
+ date = new tmDate(str)
+ }
+ let info = {
+ year: date.getYear(),
+ month: date.getMonth(),
+ day: date.getDate(),
+ hours: date.getHours(),
+ minutes: date.getMinutes(),
+ seconds: date.getSeconds(),
+ week: date.getWeekDay(),
+ weeks: date.getWeek(),
+ weekCn: date.getWeekDayCn(),
+ date: ""
+ } as TM.tmDateDayInfoType
+ info.date = info.year + '/' + (info.month + 1) + '/' + info.day
+ return info
+ }
+
+ /**
+ * 返回日期数组
+ * @param {string} - m,w,m表示返回本月的日期数据,w表示返回本周的日期数据
+ * @returns - 返回一个日期数组
+ */
+ getDaysOf(d: 'm' | 'w' = 'm'): TM.tmDateDayInfoType[] {
+ let dates = [] as TM.tmDateDayInfoType[]
+ if (d == 'w') {
+ let first = this.getDateStartOf('w')
+
+ for (let i = 0; i < 7; i++) {
+ let date = first.getClone()
+ date.date.setDate(date.date.getDate() + i)
+ dates.push(date.getDateInfo())
+ }
+ }
+ if (d == 'm') {
+ let first = this.getDateStartOf('m')
+ let maxDay = this.getMonthCountDay()
+ for (let i = 1; i <= maxDay; i++) {
+ let date = first.getClone()
+ date.date.setDate(i)
+ dates.push(date.getDateInfo())
+ }
+
+ }
+
+ return dates;
+ }
+
+ /**
+ * 为当前日期进行加操作
+ * @param {string} - y,m,d,h,M,s,w,代表的是年份,月份,日期,小时,分钟,秒数,周
+ */
+ add(count: number, d: tmDateTypeTime = 'd') {
+ if (d == 'y') {
+ this.date.setFullYear(this.getYear() + count)
+ }
+ else if (d == 'm') {
+ this.date.setMonth(this.getMonth() + count)
+ }
+ else if (d == 'd') {
+ this.date.setDate(this.getDate() + count)
+ }
+ else if (d == 'h') {
+ this.date.setHours(this.getHours() + count)
+ }
+ else if (d == 'M') {
+ this.date.setMinutes(this.getMinutes() + count)
+ }
+ else if (d == 's') {
+ this.date.setSeconds(this.getSeconds() + count)
+ }
+ // 添加一周
+ else if (d == 'w') {
+ this.date.setDate(this.getDate() + count * 7)
+
+ }
+
+ return this;
+ }
+ /**
+ * 为当前日期进行减操作
+ * @param {string} - y,m,d,h,M,s,w,代表的是年份,月份,日期,小时,分钟,秒数,周
+ */
+ subtraction(count: number, d: tmDateTypeTime = 'd') {
+ if (d == 'y') {
+ this.date.setFullYear(this.getYear() - count)
+ }
+ else if (d == 'm') {
+ this.date.setMonth(this.getMonth() - count)
+ }
+ else if (d == 'd') {
+ this.date.setDate(this.getDate() - count)
+ }
+ else if (d == 'h') {
+ this.date.setHours(this.getHours() - count)
+ }
+ else if (d == 'M') {
+ this.date.setMinutes(this.getMinutes() - count)
+ }
+ else if (d == 's') {
+ this.date.setSeconds(this.getSeconds() - count)
+ }
+ // 添加一周
+ else if (d == 'w') {
+ this.date.setDate(this.getDate() - count * 7)
+ }
+
+ return this;
+ }
+
+
+ /**
+ * 日期是否在一个区间内
+ * @param {tmDate} start 开始日期
+ * @param {tmDate} end 结束日期
+ * @param {string} - type要比较的单位,默认为ms,'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
+ * @param {string} - d,默认为[] 区间类型,'()'不含起始'[]'包含起始'(]'不包含开始,但包含结束'[)'包含开始,但不包含结束
+ * @returns {boolean} 是否在区间内
+ */
+ isBetween(start: tmDate, end: tmDate, type: tmDateTypeTime = 'ms', d: '()' | '[]' | '(]' | '[)' = '[]'): boolean {
+ let startTime = start.getTime(type)
+
+ // new Date('1970-1-1 8:0:0').getTime()
+ let endTime = end.getTime(type)
+ let nowTime = this.getTime(type)
+ if (d == '()') {
+ return nowTime > startTime && nowTime < endTime
+ }
+ else if (d == '[]') {
+ return nowTime >= startTime && nowTime <= endTime
+ }
+ else if (d == '(]') {
+ return nowTime > startTime && nowTime <= endTime
+ }
+ else if (d == '[)') {
+ return nowTime >= startTime && nowTime < endTime
+ }
+ return nowTime >= startTime && nowTime <= endTime
+ }
+
+ /**
+ * 与目标日期比较
+ * @param {tmDate} targetDate 要比较的日期
+ * @param {string} - d,默认为> 比较类型,'>'大于目标日期,'>='大于等于目标'<'小于目标,'<='小于等于目标,'='全等
+ * @param {string} - type要比较的单位,默认为ms,'y' 年 'm' 月 'd' 日 'h' 时 'M' 分 's' 秒 'ms' 毫秒
+ * @returns {boolean} 比较结果
+ */
+ isBetweenOf(targetDate: tmDate, d: '>' | '>=' | '<' | '<=' | '=' = '>', type: tmDateTypeTime = 'ms'): boolean {
+ let startTime = targetDate.getTime(type)
+ let nowTime = this.getTime(type)
+ if (d == '>') {
+ return nowTime > startTime
+ }
+ else if (d == '>=') {
+ return nowTime >= startTime
+ }
+ else if (d == '<') {
+ return nowTime < startTime
+ }
+ else if (d == '<=') {
+ return nowTime <= startTime
+ }
+ else if (d == '=') {
+ return nowTime == startTime
+ }
+ return nowTime > startTime
+ }
+ /**
+ * 与目标时间过了多久
+ * @param {string|tmDate|null} target 要对比的相对时间,如果填写null就表示当前时间以来的的多久
+ * @param {Map} model 如果为null或者为空的map采用默认值,map格式key表示以秒为单位的时间,value为对应的文本
+ * 比如60,1分钟前
+ * @param {string} format 超过最大值最使用格式化日期,如果为null默认为YYYY-MM-DD
+ * @returns {string} 返回对应的时间文本
+ */
+ fromBetweenLongTime(target: any, model: Map | null, format: string | null): string {
+ let bijiaodate: tmDate = new tmDate()
+ if (target instanceof tmDate) {
+ bijiaodate = (target as tmDate)
+ } else if (typeof target == 'string') {
+ bijiaodate = new tmDate(target as string)
+ } else if (target == null) {
+ bijiaodate = new tmDate()
+ }
+
+ let mapmodel = new Map([
+ [30, '刚刚'],
+ [60, '1分前'],
+ [60 * 5, '5分前'],
+ [60 * 10, '10分前'],
+ [60 * 30, '半小时前'],
+ [60 * 60, '1小时前'],
+ [60 * 60 * 2, '2小时前'],
+ [60 * 60 * 3, '3小时前'],
+ [60 * 60 * 5, '5小时前'],
+ [60 * 60 * 23, '今天'],
+ [60 * 60 * 24 * 1, '1天前'],
+ [60 * 60 * 24 * 2, '2天前'],
+ [60 * 60 * 24 * 7, '1周前'],
+ [60 * 60 * 24 * 30, '1个月前'],
+ [60 * 60 * 24 * 30 * 2, '2个月前'],
+ [60 * 60 * 24 * 30 * 3, '3个月前'],
+ [60 * 60 * 24 * 30 * 4, '4个月前'],
+ [60 * 60 * 24 * 30 * 5, '5个月前'],
+ [60 * 60 * 24 * 30 * 6, '半年前'],
+ [60 * 60 * 24 * 30 * 12, '1年前'],
+ [60 * 60 * 24 * 30 * 12 + 60 * 60 * 24 * 30, '']
+ ])
+ let fmt = format == null ? 'YYYY-MM-DD' : (format!)
+
+ if (model != null) {
+ if (model!.size > 0) {
+ mapmodel = model!
+ }
+ }
+ let str = ""
+ let fanzhumap = [] as number[];
+ mapmodel.forEach((value: string, key: number) => {
+ fanzhumap.push(key)
+ })
+ fanzhumap.reverse()
+
+ try {
+ let startTime = bijiaodate.getTime('s')
+ let nowTime = this.getTime('s')
+ let diff = (nowTime - startTime) / 1000
+
+ if (diff > 0) {
+ for (let i = 0; i < fanzhumap.length; i++) {
+ let key = fanzhumap[i];
+
+ if (diff >= key) {
+
+ str = mapmodel.get(key)!
+ break;
+ }
+ }
+
+ } else {
+ str = mapmodel.get(fanzhumap[fanzhumap.length - 1])!
+ }
+ if (str == '') {
+ str = bijiaodate.format(fmt)
+ }
+
+
+ } catch (e) {
+ //TODO handle the exception
+ }
+
+
+
+ return str
+ }
+ /**
+ * 与目标时间相差多少个单位
+ * @param {string|tmDate|null} target 目标时间
+ * @param {tmDateTypeTime} type 相差的单位,默认:s秒
+ * @returns {string} 反返回以xDateTypeTime为单位相关的时间数
+ */
+ diffTime(target: any, type: tmDateTypeTime = 's'): number {
+ let startTime = 0
+ let typed: tmDateTypeTime = (type == 'w' ? 'd' : type)
+ if (target instanceof tmDate) {
+ startTime = (target as tmDate).getTime(typed)
+ } else if (typeof target == 'string') {
+ startTime = new tmDate(target as string).getTime(typed)
+
+ } else if (target == null) {
+ startTime = new tmDate().getTime(typed)
+ }
+
+ let nowTime = this.getTime(typed)
+ let diff = Math.abs(nowTime - startTime);
+ let d = 0
+ if (type == 's') {
+ d = diff
+ } else if (type == 'M') {
+ d = diff / 60 / 1000
+ } else if (type == 'h') {
+ d = diff / 60 / 60 / 1000
+ } else if (type == 'd') {
+ d = diff / 60 / 60 / 24 / 1000
+ } else if (type == 'm') {
+ d = diff / 60 / 60 / 24 / 30 / 1000
+ } else if (type == 'y') {
+ d = diff / 60 / 60 / 24 / 30 / 12 / 1000
+ } else if (type == 'w') {
+ let ondate = (1000 * 60 * 60 * 24 * 7);
+ d = diff / ondate
+ }
+
+ return Math.floor(d)
+ }
+ /**
+ * 获取季度
+ * @param {string} type y表示获取本年的4个季度,空值表示获取当前时间所在的季度
+ * @returns {tmDateTypeQuarter[]} 返回一个季度数组{quarter:number,start:string,end:string}
+ */
+ getQuarter(type: string = ''): tmDateTypeQuarter[] {
+ let q1 = [1, 2, 3]
+ let q2 = [4, 5, 6]
+ let q3 = [7, 8, 9]
+ let q4 = [10, 11, 12]
+ let nowMonth = this.getMonth() + 1
+ let qall = [q1, q2, q3, q4] as number[][]
+ let qmap = [] as tmDateTypeQuarter[]
+ if (type == 'y') {
+ for (let i = 0; i < qall.length; i++) {
+ let item = qall[i]
+ let sdate = new tmDate(this.getYear() + '/' + item[0] + '/1')
+ let edate = new tmDate(this.getYear() + '/' + item[item.length - 1] + '/1')
+ let start = sdate.format('YYYY/MM/DD')
+ let end = edate.getDateEndOf('m').format('YYYY/MM/DD')
+ qmap.push({
+ quarter: i,
+ start,
+ end
+ } as tmDateTypeQuarter)
+ }
+ } else {
+ for (let i = 0; i < qall.length; i++) {
+ let item = qall[i]
+ if (item.includes(nowMonth)) {
+ let sdate = new tmDate(this.getYear() + '/' + item[0] + '/1')
+ let edate = new tmDate(this.getYear() + '/' + item[item.length - 1] + '/1')
+ let start = sdate.format('YYYY/MM/DD')
+ let end = edate.getDateEndOf('m').format('YYYY/MM/DD')
+ qmap.push({
+ quarter: i,
+ start,
+ end
+ } as tmDateTypeQuarter)
+ break;
+ }
+ }
+ }
+ return qmap;
+ }
+ /**
+ * 按指定天数返回日期数组
+ * @param {string} d - 返回多少天的日期数组
+ * @param {string} type - after表示返回当前日期之后的日期,before表示返回当前日期之前的日期
+ */
+ getDaysOfNum(d : number = 0, type : 'after' | 'before') : TM.tmDateDayInfoType[] {
+ let ar = [] as TM.tmDateDayInfoType[];
+ let nowdate = this.getClone()
+ if (type == 'after') {
+ for (let i = 0; i < d; i++) {
+ nowdate.add(1, 'd')
+ ar.push(nowdate.getDateInfo())
+ }
+ } else if (type == 'before') {
+ for (let i = 0; i < d; i++) {
+ nowdate.subtraction(1, 'd')
+ ar.push(nowdate.getDateInfo())
+ }
+ ar.reverse()
+ }
+
+ return ar;
+ }
+ /**
+ * 取开始和结束之间的时间(含开始和结束)
+ */
+ getBetweenDate(start: tmDate, end: tmDate,minx:'min'|'max'|'auto' = 'min'): tmDate {
+ if(this.isBetween(start, end,'s','[]')){
+ return this;
+ }
+ // this更接近哪边就取那边值
+ let startDiff = start.getTime('s')
+ let endDiff = end.getTime('s')
+
+ if(minx == 'min'){
+ return start;
+ }
+ if(minx == 'max'){
+ return end;
+ }
+
+ if(startDiff < endDiff){
+ return end;
+ }else{
+ return start;
+ }
+
+ }
+
+}
+
+/**
+ * 将一个日期转换为tmDate对象
+ */
+export const dateCovertTmDate = function (date: Date){
+ let str = date.getFullYear().toString() + "/" + (date.getMonth() + 1).toString() + "/"
+ + date.getDate().toString() + " " + date.getHours().toString() + ":" + date.getMinutes().toString() + ":" + date.getSeconds().toString()
+ return new tmDate(str)
}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/libs/tool.ts b/src/uni_modules/tm-ui/libs/tool.ts
index 1fe4ad4..9f64f2e 100644
--- a/src/uni_modules/tm-ui/libs/tool.ts
+++ b/src/uni_modules/tm-ui/libs/tool.ts
@@ -1,156 +1,180 @@
-import { getDefaultColor } from "./colors";
-
-export const covetUniNumber = (n: number | string, defaultUnit = 'rpx'): string => {
- if (typeof n === 'number') {
- return `${n}${defaultUnit}`
- }
- let unit = getUnit(n, defaultUnit);
- let zhi = n.match(/\d+(\.\d+)?/g);
- let real = '0'
- if (zhi) {
- real = zhi[0]
- }
- if (unit === 'rpx' && defaultUnit == 'px') {
- return uni.upx2px(Number(real)).toString() + unit;
- }
- if (unit == 'auto') return unit;
- return real + unit;
-}
-export const getUnit = (n: string | number, defaultUnit = 'rpx'): string => {
- if (typeof n === 'number') {
- return defaultUnit;
- }
- const unit = n.match(/[a-zA-Z|%|auto]+/g);
- if (!unit || !Array.isArray(unit) || unit?.length === 0) return defaultUnit;
- return unit[0];
-}
-
-/**
- * 随机一个uid
- * @param rdix 随机因子
- * @param length 取的长度
- * @param isAddStr 是否限制随机结果中的长度,不允许输出长度
- * @returns String
- */
-export function getUid(rdix = 1, length = 12): string {
- let ix = Math.floor(Math.random() * rdix * Math.floor(Math.random() * Date.now())).toString().substring(0, length);
- return ix;
-}
-
-export const linearValid = (linear: string[]): string => {
- if (linear.length < 3) return '';
- return `linear-gradient(${linear.join(',')})`
-}
-export const arrayNumberValid = (border: string | number | Array, defaultValue = '0px'): string[] => {
- let zhi: string[] = Array.isArray(border) ? border.map((item: string | number): string => covetUniNumber(item)) : [covetUniNumber(border || defaultValue)];
- if (zhi.length == 0) {
- zhi = [covetUniNumber(defaultValue)]
- } else {
- let diff = 4 - zhi.length;
- zhi = [...zhi, ...Array(diff).fill(zhi[0])]
- }
- return zhi;
-}
-export const arrayNumber = (border: string | number | Array, defaultValue = '0px', len = 2): string[] => {
- let zhi: string[] = Array.isArray(border) ? border.map((item: string | number): string => covetUniNumber(item)) : [covetUniNumber(border || defaultValue)];
- if (zhi.length == 0) {
- zhi = Array(len).fill(covetUniNumber(defaultValue))
- } else {
- let diff = len - zhi.length;
- if (diff < 0) {
- zhi = zhi.slice(0, len)
- diff = 0
- }
- zhi = [...zhi, ...Array(diff).fill(zhi[zhi.length - 1])]
- }
- return zhi;
-}
-
-/**
- * 用于margin,padding,border-width的校验
- */
-export const arrayNumberValidByStyleMP = (border: string | number | Array, defaultValue = '0px'): string[] => {
- let zhi: string[] = Array.isArray(border) ? border.map((item: string | number): string => covetUniNumber(item)) : [covetUniNumber(border || defaultValue)];
- if (zhi.length == 0) {
- zhi = [covetUniNumber(defaultValue)]
- } else if (zhi.length == 2) {
- zhi = [zhi[1], zhi[0]]
- } else if (zhi.length == 3) {
- // 左,上,右
- // [0,1,2]
- // 上 右 下 左
- zhi = [zhi[1], zhi[2], covetUniNumber(defaultValue), zhi[0]]
- } else if (zhi.length == 4) {
- zhi = [zhi[1], zhi[2], zhi[3], zhi[0]]
- }
- return zhi;
-}
-
-export const arrayNumberValidByStyleBorderColor = (border: string | Array, defaultValue = 'transparent'): string[] => {
- let zhi: string[] = Array.isArray(border) ? border.map((item: string): string => getDefaultColor(item)) : [getDefaultColor(border || defaultValue)];
- if (zhi.length == 0) {
- zhi = [getDefaultColor(defaultValue)]
- } else if (zhi.length == 2) {
- zhi = [zhi[1], zhi[0]]
- } else if (zhi.length == 3) {
- // 左,上,右
- // [0,1,2]
- // 上 右 下 左
- zhi = [zhi[1], zhi[2], getDefaultColor(defaultValue), zhi[0]]
- } else if (zhi.length == 4) {
- zhi = [zhi[1], zhi[2], zhi[3], zhi[0]]
- }
- return zhi;
-}
-export const arrayNumberValidByStyleBorderStyle = (border: string | Array, defaultValue = 'none'): string[] => {
- let zhi: string[] = Array.isArray(border) ? border : [border || defaultValue];
- if (zhi.length == 0) {
- zhi = [defaultValue]
- } else if (zhi.length == 2) {
- zhi = [zhi[1], zhi[0]]
- } else if (zhi.length == 3) {
- // 左,上,右
- // [0,1,2]
- // 上 右 下 左
- zhi = [zhi[1], zhi[2], defaultValue, zhi[0]]
- } else if (zhi.length == 4) {
- zhi = [zhi[1], zhi[2], zhi[3], zhi[0]]
- }
- return zhi;
-}
-
-/**
- * 深度克隆
- * @param {T} data 待大克隆复制的数据
- * @return {T} any
- */
-export function deepClone(data: T): T {
- // 对常见的“非”值,直接返回原来值
- if (data === null || typeof data !== "object") {
- return data;
- }
- if (Array.isArray(data)) {
- const clone: any[] = [];
- for (const item of data) {
- clone.push(deepClone(item));
- }
- return clone as any;
- }
- if (data instanceof Date) {
- return new Date(data.getTime()) as unknown as T;
- }
- if (data instanceof RegExp) {
- const flags = data.flags;
- return new RegExp(data.source, flags) as unknown as T;
- }
- if (typeof data === "function") {
- return data as unknown as T;
- }
- const clone = {} as T;
- for (const key in data) {
- if (Object.prototype.hasOwnProperty.call(data, key)) {
- clone[key] = deepClone(data[key]);
- }
- }
- return clone;
+import { getDefaultColor } from "./colors";
+import { type ComponentPublicInstance } from "vue"
+export const covetUniNumber = (n: number | string, defaultUnit = 'rpx'): string => {
+ if (typeof n === 'number') {
+ return `${n}${defaultUnit}`
+ }
+ let unit = getUnit(n, defaultUnit);
+ let zhi = n.match(/\d+(\.\d+)?/g);
+ let real = '0'
+ if (zhi) {
+ real = zhi[0]
+ }
+ if (unit === 'rpx' && defaultUnit == 'px') {
+ return uni.upx2px(Number(real)).toString() + unit;
+ }
+ if (unit == 'auto') return unit;
+ return real + unit;
+}
+export const getUnit = (n: string | number, defaultUnit = 'rpx'): string => {
+ if (typeof n === 'number') {
+ return defaultUnit;
+ }
+ const unit = n.match(/[a-zA-Z|%|auto]+/g);
+ if (!unit || !Array.isArray(unit) || unit?.length === 0) return defaultUnit;
+ return unit[0];
+}
+
+/**
+ * 随机一个uid
+ * @param rdix 随机因子
+ * @param length 取的长度
+ * @param isAddStr 是否限制随机结果中的长度,不允许输出长度
+ * @returns String
+ */
+export function getUid(rdix = 1, length = 12): string {
+ let ix = Math.floor(Math.random() * rdix * Math.floor(Math.random() * Date.now())).toString().substring(0, length);
+ return ix;
+}
+
+export const linearValid = (linear: string[]): string => {
+ if (linear.length < 3) return '';
+ return `linear-gradient(${linear.join(',')})`
+}
+export const arrayNumberValid = (border: string | number | Array, defaultValue = '0px'): string[] => {
+ let zhi: string[] = Array.isArray(border) ? border.map((item: string | number): string => covetUniNumber(item)) : [covetUniNumber(border || defaultValue)];
+ if (zhi.length == 0) {
+ zhi = [covetUniNumber(defaultValue)]
+ } else {
+ let diff = 4 - zhi.length;
+ zhi = [...zhi, ...Array(diff).fill(zhi[0])]
+ }
+ return zhi;
+}
+export const arrayNumber = (border: string | number | Array, defaultValue = '0px', len = 2): string[] => {
+ let zhi: string[] = Array.isArray(border) ? border.map((item: string | number): string => covetUniNumber(item)) : [covetUniNumber(border || defaultValue)];
+ if (zhi.length == 0) {
+ zhi = Array(len).fill(covetUniNumber(defaultValue))
+ } else {
+ let diff = len - zhi.length;
+ if (diff < 0) {
+ zhi = zhi.slice(0, len)
+ diff = 0
+ }
+ zhi = [...zhi, ...Array(diff).fill(zhi[zhi.length - 1])]
+ }
+ return zhi;
+}
+
+/**
+ * 用于margin,padding,border-width的校验
+ */
+export const arrayNumberValidByStyleMP = (border: string | number | Array, defaultValue = '0px'): string[] => {
+ let zhi: string[] = Array.isArray(border) ? border.map((item: string | number): string => covetUniNumber(item)) : [covetUniNumber(border || defaultValue)];
+ if (zhi.length == 0) {
+ zhi = [covetUniNumber(defaultValue)]
+ } else if (zhi.length == 2) {
+ zhi = [zhi[1], zhi[0]]
+ } else if (zhi.length == 3) {
+ // 左,上,右
+ // [0,1,2]
+ // 上 右 下 左
+ zhi = [zhi[1], zhi[2], covetUniNumber(defaultValue), zhi[0]]
+ } else if (zhi.length == 4) {
+ zhi = [zhi[1], zhi[2], zhi[3], zhi[0]]
+ }
+ return zhi;
+}
+export const arrayNumberValidByBorderWidth = (border: string | number | Array, defaultValue = '0px'): string[] => {
+ let zhi: string[] = Array.isArray(border) ? border.map((item: string | number): string => covetUniNumber(item)) : [covetUniNumber(border || defaultValue)];
+ if (zhi.length == 0) {
+ zhi = [covetUniNumber(defaultValue)]
+ } else if (zhi.length == 1) {
+ zhi = [zhi[0]]
+ } else if (zhi.length == 2) {
+ zhi = [zhi[1],zhi[0]]
+ } else if (zhi.length == 3) {
+ zhi = [zhi[0],zhi[1], zhi[2]]
+ } else if (zhi.length == 4) {
+ zhi = [zhi[0],zhi[1], zhi[2], zhi[3]]
+ }
+ return zhi;
+}
+export const arrayNumberValidByStyleBorderColor = (border: string | Array, defaultValue = 'transparent'): string[] => {
+ let zhi: string[] = Array.isArray(border) ? border.map((item: string): string => getDefaultColor(item)) : [getDefaultColor(border || defaultValue)];
+ if (zhi.length == 0) {
+ zhi = [getDefaultColor(defaultValue)]
+ } else if (zhi.length == 2) {
+ zhi = [zhi[1], zhi[0]]
+ } else if (zhi.length == 3) {
+ // 左,上,右
+ // [0,1,2]
+ // 上 右 下 左
+ zhi = [zhi[1], zhi[2], getDefaultColor(defaultValue), zhi[0]]
+ } else if (zhi.length == 4) {
+ zhi = [zhi[1], zhi[2], zhi[3], zhi[0]]
+ }
+ return zhi;
+}
+export const arrayNumberValidByStyleBorderStyle = (border: string | Array, defaultValue = 'none'): string[] => {
+ let zhi: string[] = Array.isArray(border) ? border : [border || defaultValue];
+ if (zhi.length == 0) {
+ zhi = [defaultValue]
+ } else if (zhi.length == 2) {
+ zhi = [zhi[1], zhi[0]]
+ } else if (zhi.length == 3) {
+ // 左,上,右
+ // [0,1,2]
+ // 上 右 下 左
+ zhi = [zhi[1], zhi[2], defaultValue, zhi[0]]
+ } else if (zhi.length == 4) {
+ zhi = [zhi[1], zhi[2], zhi[3], zhi[0]]
+ }
+ return zhi;
+}
+
+/**
+ * 深度克隆
+ * @param {T} data 待大克隆复制的数据
+ * @return {T} any
+ */
+export function deepClone(data: T): T {
+ // 对常见的“非”值,直接返回原来值
+ if (data === null || typeof data !== "object") {
+ return data;
+ }
+ if (Array.isArray(data)) {
+ const clone: any[] = [];
+ for (const item of data) {
+ clone.push(deepClone(item));
+ }
+ return clone as any;
+ }
+ if (data instanceof Date) {
+ return new Date(data.getTime()) as unknown as T;
+ }
+ if (data instanceof RegExp) {
+ const flags = data.flags;
+ return new RegExp(data.source, flags) as unknown as T;
+ }
+ if (typeof data === "function") {
+ return data as unknown as T;
+ }
+ const clone = {} as T;
+ for (const key in data) {
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
+ clone[key] = deepClone(data[key]);
+ }
+ }
+ return clone;
+}
+
+
+export function findParent(parent: ComponentPublicInstance|null,name:string): T|null {
+ if (parent == null) return null;
+ if (parent.$parent?.$options?.name == name) return parent.$parent as T;
+ if (parent.$parent == null) return null;
+ let parents = findParent(parent.$parent,name);
+ if (parents?.$options?.name == name) return parents as T;
+ return null;
}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/local/README.md b/src/uni_modules/tm-ui/local/README.md
new file mode 100644
index 0000000..c90febe
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/README.md
@@ -0,0 +1,456 @@
+# TMUI4x 国际化 (i18n) 使用文档
+
+## 概述
+
+TMUI4x 国际化插件是一个专为 uni-app 设计的多语言解决方案,支持 Vue I18n 标准 API,提供完整的国际化功能。
+
+## 特性
+
+- 🌍 支持多语言切换
+- 🔢 数字格式化
+- 📅 日期时间格式化
+- 📊 复数规则支持
+- 🔤 字符串插值
+- ⚡ 高性能类型安全
+- 📱 跨平台兼容
+
+## 快速开始
+
+### 1. 安装和配置
+
+```typescript
+// main.ts
+import { createApp } from 'vue'
+import App from './App.vue'
+import tmui from '@/uni_modules/tm-ui'
+
+const app = createApp(App)
+
+// 配置 TMUI
+app.use(tmui, {
+ language: 'zh-Hans',
+ i18n: {
+ locale: 'zh-Hans',
+ fallbackLocale: 'en',
+ messages: {
+ 'zh-Hans': {
+ welcome: '欢迎使用 TMUI',
+ hello: '你好,{name}!',
+ count: '你有 {count} 条消息 | 你有 {count} 条消息'
+ },
+ 'en': {
+ welcome: 'Welcome to TMUI',
+ hello: 'Hello, {name}!',
+ count: 'You have {count} message | You have {count} messages'
+ }
+ }
+ }
+})
+
+app.mount('#app')
+```
+
+### 2. 基本使用
+
+```typescript
+import {$i18n} from "@/uni_modules/tm-ui"
+// 在任何组件中使用
+export default {
+ mounted() {
+ // 基础翻译
+ console.log($i18n.t('welcome'))
+
+ // 带参数的翻译
+ console.log($i18n.t('hello', { name: 'World' }))
+
+ // 复数形式
+ console.log($i18n.t('count', 1)) // 单数
+ console.log($i18n.t('count', 5)) // 复数
+ }
+}
+```
+
+## API 参考
+
+### 核心方法
+
+#### `t(key, ...args)` - 翻译方法
+
+主要的翻译方法,支持多种参数格式:
+
+导入:
+
+```typescript
+import {$i18n} from "@/uni_modules/tm-ui"
+```
+
+```typescript
+// 基础翻译
+$i18n.t('welcome')
+
+// 带插值参数
+$i18n.t('hello', { name: 'Alice' })
+
+// 复数形式
+$i18n.t('count', 1) // 单数
+$i18n.t('count', 5) // 复数
+
+// 指定语言
+$i18n.t('welcome', 'en')
+
+// 复数 + 插值参数
+$i18n.t('count', 3, { count: 3 })
+```
+
+#### `n(value, formatName?, options?)` - 数字格式化
+
+```typescript
+// 基础数字格式化
+$i18n.n(1234.56) // "1234.56"
+
+// 货币格式化
+$i18n.n(1234.56, null, {
+ style: 'currency',
+ currency: 'CNY',
+ local: 'zh-CN'
+}) // "¥1,234.56"
+
+// 百分比格式化
+$i18n.n(0.1234, null, {
+ style: 'percent',
+ local: 'zh-CN'
+}) // "12.34%"
+
+// 使用预定义格式
+$i18n.n(1234.56, 'currency') // 使用预定义的货币格式
+```
+
+#### `d(value, formatName?, options?)` - 日期时间格式化
+
+```typescript
+// 基础日期格式化
+$i18n.d(new Date()) // "2025-1-15"
+
+// 使用预定义样式
+$i18n.d(new Date(), null, {
+ dateStyle: 'full',
+ local: 'zh-CN'
+}) // "2025年1月15日 星期三"
+
+// 自定义格式
+$i18n.d(new Date(), null, {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ local: 'zh-CN'
+}) // "2025年一月15日"
+
+// 时间格式化
+$i18n.d(new Date(), null, {
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit',
+ local: 'zh-CN'
+}) // "14:30:25"
+```
+
+#### `rt(timeValue, unit?, locale?)` - 相对时间
+
+```typescript
+// 相对时间格式化
+$i18n.rt(Date.now() - 60000, 'minute') // "1分钟前"
+$i18n.rt(Date.now() + 3600000, 'hour') // "1小时后"
+
+// 智能单位选择
+$i18n.rt(Date.now() - 7200000) // 自动选择最合适的单位
+```
+
+### 语言管理
+
+#### `setLocale(locale)` - 设置语言
+
+```typescript
+// 切换语言
+$i18n.setLocale('en')
+$i18n.setLocale('zh-Hans')
+$i18n.setLocale('ja')
+```
+
+#### `getLocale()` - 获取当前语言
+
+```typescript
+const currentLang = $i18n.getLocale()
+console.log(currentLang) // "zh-Hans"
+```
+
+#### `mergeLocaleMessage(locale, messages)` - 动态添加语言
+
+```typescript
+// 动态添加新的翻译内容
+$i18n.mergeLocaleMessage('zh-Hans', {
+ newKey: '新的翻译内容',
+ nested: {
+ key: '嵌套的翻译'
+ }
+})
+```
+
+#### `te(key, locale?)` - 检查翻译键是否存在
+
+```typescript
+// 检查翻译键是否存在
+if ($i18n.te('welcome')) {
+ console.log('翻译键存在')
+}
+
+// 检查特定语言的翻译键
+if ($i18n.te('welcome', 'en')) {
+ console.log('英文翻译键存在')
+}
+```
+
+#### `availableLocales()` - 获取可用语言列表
+
+```typescript
+const locales = $i18n.availableLocales()
+console.log(locales) // ["zh-Hans", "en", "ja"]
+```
+
+## 高级功能
+
+### 复数规则
+
+支持自定义复数规则:
+
+```typescript
+// 在配置中设置复数规则
+app.use(tmui, {
+ i18n: {
+ pluralRule: (choice, choicesLength) => {
+ // 中文复数规则
+ if (choice === 0) return 0
+ if (choice === 1) return 1
+ return 2
+ }
+ }
+})
+
+// 使用复数
+const message = $i18n.t('count', 0) // 零
+const message = $i18n.t('count', 1) // 单数
+const message = $i18n.t('count', 5) // 复数
+```
+
+### 字符串插值
+
+支持多种插值方式:
+
+```typescript
+// 命名插值
+$i18n.t('hello', { name: 'Alice', age: 25 })
+
+// 位置插值
+$i18n.t('welcome', ['World', 'TMUI'])
+
+// 混合使用
+$i18n.t('info', { name: 'Alice' })
+```
+
+### 数字格式化选项
+
+完整的数字格式化配置:
+
+```typescript
+$i18n.n(1234.56, null, {
+ style: 'currency', // 样式:decimal, currency, percent
+ currency: 'CNY', // 货币代码
+ local: 'zh-CN', // 语言代码
+ currencyDisplay: 'symbol', // 货币显示方式
+ useGrouping: true, // 使用千分位分隔符
+ minimumIntegerDigits: 1, // 最小整数位数
+ minimumFractionDigits: 2, // 最小小数位数
+ maximumFractionDigits: 2 // 最大小数位数
+})
+```
+
+### 日期时间格式化选项
+
+丰富的日期时间格式化配置:
+
+```typescript
+$i18n.d(new Date(), null, {
+ local: 'zh-CN', // 语言代码
+ calendar: 'gregory', // 日历系统
+ timeZone: 'Asia/Shanghai', // 时区
+ hour12: false, // 12小时制
+ dateStyle: 'full', // 日期样式
+ timeStyle: 'medium', // 时间样式
+ weekday: 'long', // 星期显示
+ year: 'numeric', // 年份显示
+ month: 'long', // 月份显示
+ day: 'numeric', // 日期显示
+ hour: '2-digit', // 小时显示
+ minute: '2-digit', // 分钟显示
+ second: '2-digit' // 秒显示
+})
+```
+
+## 配置选项
+
+### 完整配置示例
+
+```typescript
+app.use(tmui, {
+ language: 'zh-Hans',
+ i18n: {
+ locale: 'zh-Hans', // 当前语言
+ fallbackLocale: 'en', // 回退语言
+ messages: {}, // 翻译消息
+ datetimeFormats: new Map(), // 日期时间格式
+ numberFormats: new Map(), // 数字格式
+ modifiers: new Map(), // 字符串修饰器
+ pluralRules: new Map(), // 复数规则
+ missing: null, // 缺失翻译处理函数
+ missingWarn: true, // 缺失翻译警告
+ fallbackWarn: true, // 回退语言警告
+ fallbackRoot: true, // 回退到根实例
+ fallbackFormat: false, // 回退格式化
+ unresolving: true, // 允许未解析的翻译键
+ postTranslation: null, // 翻译后处理函数
+ warnHtmlMessage: true, // HTML消息警告
+ escapeParameter: true, // 转义参数
+ inheritLocale: true, // 继承父级语言设置
+ warnHandler: (msg, err) => {}, // 警告处理器
+ pluralRule: null, // 默认复数规则
+ globalInjection: true, // 全局注入
+ allowComposition: true, // 允许组合式API
+ legacy: true // 遗留模式
+ }
+})
+```
+
+## 最佳实践
+
+### 1. 语言文件组织
+
+```typescript
+// 按模块组织翻译文件
+const messages = {
+ 'zh-Hans': {
+ common: {
+ confirm: '确认',
+ cancel: '取消',
+ save: '保存'
+ },
+ user: {
+ profile: '个人资料',
+ settings: '设置'
+ }
+ }
+}
+```
+
+### 2. 动态语言切换
+
+```typescript
+// 语言切换函数
+function changeLanguage(locale: string) {
+ $i18n.setLocale(locale)
+ // 保存到本地存储
+ uni.setStorageSync('language', locale)
+ // 触发页面刷新或重新渲染
+}
+```
+
+### 3. 错误处理
+
+```typescript
+// 自定义缺失翻译处理
+app.use(tmui, {
+ i18n: {
+ missing: (locale, key) => {
+ console.warn(`Missing translation: ${locale}.${key}`)
+ return `[${key}]` // 返回键名作为占位符
+ }
+ }
+})
+```
+
+### 4. 性能优化
+
+```typescript
+// 预加载语言包
+const preloadLanguages = ['en', 'ja', 'ko']
+preloadLanguages.forEach(locale => {
+ // 异步加载语言包
+ import(`./locales/${locale}.json`).then(messages => {
+ $i18n.mergeLocaleMessage(locale, messages.default)
+ })
+})
+```
+
+## 常见问题
+
+### Q: 如何支持新的语言?
+
+A: 使用 `mergeLocaleMessage` 方法动态添加:
+
+```typescript
+$i18n.mergeLocaleMessage('fr', {
+ welcome: 'Bienvenue',
+ hello: 'Bonjour, {name}!'
+})
+```
+
+### Q: 如何处理复数形式的翻译?
+
+A: 使用 `|` 分隔符:
+
+```typescript
+// 翻译文件
+{
+ "count": "你有 {count} 条消息 | 你有 {count} 条消息"
+}
+
+// 使用
+$i18n.t('count', 1) // "你有 1 条消息"
+$i18n.t('count', 5) // "你有 5 条消息"
+```
+
+### Q: 如何格式化货币?
+
+A: 使用 `n` 方法配合货币选项:
+
+```typescript
+$i18n.n(1234.56, null, {
+ style: 'currency',
+ currency: 'CNY',
+ local: 'zh-CN'
+})
+```
+
+### Q: 如何获取相对时间?
+
+A: 使用 `rt` 方法:
+
+```typescript
+$i18n.rt(Date.now() - 60000, 'minute') // "1分钟前"
+```
+
+## 更新日志
+
+- **v1.0.0** - 初始版本,支持基础翻译功能
+- **v1.1.0** - 添加数字和日期时间格式化
+- **v1.2.0** - 支持复数规则和字符串插值
+- **v1.3.0** - 优化性能和类型安全
+
+## 技术支持
+
+如有问题或建议,请访问:
+- 官方网站:https://tmui.design
+- 文档:https://tmui.design/docs
+- GitHub:https://github.com/tmui4x
+
+---
+
+*本文档基于 TMUI4x v1.3.0 版本编写*
diff --git a/src/uni_modules/tm-ui/local/i18n.ts b/src/uni_modules/tm-ui/local/i18n.ts
new file mode 100644
index 0000000..ac0070f
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/i18n.ts
@@ -0,0 +1,1870 @@
+import { BasePluralRule, Tmui4xI18nTml, DateTimeFormatReal, I18nOptions, I18nOptionsReally, NumberFormat, NumberFormatOpts, StringOrNull, NumberOrNull, StringOrNumber, StringOrNumberOrNull, DateOrNumberOrString, UTSJSONObjectOrNull, UTSJSONObjectOrArray, AnyOrNull, GetAnyType, I18nOptionsOrNull, NumberFormatOrNull, DateTimeFormatOrNull, GetAnyTypeOrNull } from "./interface";
+
+/**
+ * uniapp-x多语言插件
+ * @author tmui4x
+ * @copyright https://tmui.design
+ * @date 2025/7/8
+ * @description 可以有效解决app无法使用插值的尴尬。
+ */
+
+// 日期时间名称格式类型
+type DateTimeNames = {
+ long : string[],
+ short : string[],
+ narrow : string[]
+}
+type BestTimeTYpe = { unit : string, value : number }
+type timeUnitsTYpe = { unit : string, ms : number, threshold : number }
+export function mergeI18nOpts(args ?: I18nOptions) : I18nOptionsReally {
+ let localLang = uni.getStorageSync("language")
+ // 提供默认配置
+ const currentLan = localLang != null && localLang != '' && typeof localLang == 'string' ? (localLang! as string) : "zh-Hans"
+ const defaultOptions : I18nOptionsReally = {
+ locale: currentLan,
+ fallbackLocale: "en",
+ messages: {},
+ datetimeFormats: new Map(),
+ numberFormats: new Map(),
+ modifiers: new Map(),
+ pluralRules: new Map(),
+ missing: null,
+ missingWarn: true,
+ fallbackWarn: true,
+ fallbackRoot: true,
+ fallbackFormat: false,
+ unresolving: true,
+ postTranslation: null,
+ warnHtmlMessage: true,
+ escapeParameter: true,
+ inheritLocale: true,
+ warnHandler: (v, e) => {
+ console.warn(`[tmui4x]:${v}`, e || '');
+ },
+ pluralRule: (choice : number, choicesLength : number, orgRule ?: BasePluralRule | null) : number => {
+ // 默认英语复数规则实现
+ // 参考 Vue I18n 标准实现:https://vue-i18n.intlify.dev/guide/essentials/pluralization
+ // 如果提供了原始规则函数,优先使用
+ if (orgRule) {
+ return orgRule(choice, choicesLength);
+ }
+
+ // 确保索引在有效范围内
+ if (choicesLength <= 1) {
+ return 0;
+ }
+ return choice;
+ // 标准英语复数规则
+ // 当只有2个选项时: 0=复数形式, 1=单数形式
+ // 当有3个或更多选项时: 0=零, 1=单数, 2=复数
+ // if (choicesLength == 2) {
+ // // 二元模式: [复数, 单数]
+ // return choice == 1 ? 1 : 0;
+ // } else {
+ // // 多元模式: [零, 单数, 复数, ...]
+ // if (choice == 0) {
+ // return 0; // 零
+ // } else if (choice == 1) {
+ // return 1; // 单数
+ // } else {
+ // return Math.min(2, choicesLength - 1); // 复数或最后一个选项
+ // }
+ // }
+ },
+ globalInjection: true,
+ allowComposition: true,
+ legacy: true
+ };
+
+ // 如果没有传入参数,返回默认配置
+ if (!args) {
+ return defaultOptions;
+ }
+
+ // 合并用户配置和默认配置
+ return {
+ locale: args.locale ?? defaultOptions.locale,
+ fallbackLocale: args.fallbackLocale ?? defaultOptions.fallbackLocale,
+ messages: args.messages ?? defaultOptions.messages,
+ datetimeFormats: args.datetimeFormats ?? defaultOptions.datetimeFormats,
+ numberFormats: args.numberFormats ?? defaultOptions.numberFormats,
+ modifiers: args.modifiers ?? defaultOptions.modifiers,
+ pluralRules: args.pluralRules ?? defaultOptions.pluralRules,
+ missing: args.missing ?? defaultOptions.missing,
+ missingWarn: args.missingWarn ?? defaultOptions.missingWarn,
+ fallbackWarn: args.fallbackWarn ?? defaultOptions.fallbackWarn,
+ fallbackRoot: args.fallbackRoot ?? defaultOptions.fallbackRoot,
+ fallbackFormat: args.fallbackFormat ?? defaultOptions.fallbackFormat,
+ unresolving: args.unresolving ?? defaultOptions.unresolving,
+ postTranslation: args.postTranslation ?? defaultOptions.postTranslation,
+ warnHtmlMessage: args.warnHtmlMessage ?? defaultOptions.warnHtmlMessage,
+ escapeParameter: args.escapeParameter ?? defaultOptions.escapeParameter,
+ inheritLocale: args.inheritLocale ?? defaultOptions.inheritLocale,
+ warnHandler: args.warnHandler ?? defaultOptions.warnHandler,
+ pluralRule: args.pluralRule ?? defaultOptions.pluralRule,
+ globalInjection: args.globalInjection ?? defaultOptions.globalInjection,
+ allowComposition: args.allowComposition ?? defaultOptions.allowComposition,
+ legacy: args.legacy ?? defaultOptions.legacy
+ } as I18nOptionsReally;
+
+
+}
+export class Tmui4xI18n implements Tmui4xI18nTml {
+ ops : I18nOptionsReally;
+ private static instance : Tmui4xI18n;
+ constructor(args ?: I18nOptions) {
+ this.ops = mergeI18nOpts(args)
+ }
+ /**
+ * 单例模式
+ */
+ public static getInstance(args ?: I18nOptions) : Tmui4xI18n {
+ if (Tmui4xI18n.instance) {
+ return Tmui4xI18n.instance
+ }
+ return new Tmui4xI18n(args);
+ }
+ // 语言
+ setLocale(local : string) {
+ uni.setStorageSync('language', local)
+ this.ops.locale = local
+ }
+ //设置语言
+ getLocale() : string {
+ return this.ops.locale
+ }
+ getFallbackLocale() : string {
+ return this.ops.fallbackLocale
+ }
+
+ setFallbackLocale(local : string) {
+ this.ops.fallbackLocale = local
+ }
+ setOptions(args : I18nOptions) {
+ this.ops = mergeI18nOpts(args)
+ }
+ /**
+ * 翻译方法 - 参考 Vue I18n 实现(UTS类型安全优化版本)
+ * @param key 翻译键
+ * @param args 可选参数:数字(用于复数)、对象(用于插值)、字符串(locale)等同原vueI18n使用方式
+ * @param opts 可选的第二个参数当args为复数数字,key中函数 | 时,此opts起效且必须为utsjsonobject格式等同原vueI18n使用方式
+ * @returns 翻译后的字符串
+ */
+ t(key : string, ...argsopts : Array) : string {
+ let repeatCount : NumberOrNull = null;
+ let values : UTSJSONObjectOrArray = {};
+ let locale : string = this.ops?.locale??'zh-Hans';
+ if (argsopts.length > 0) {
+ // 严格的类型检查和参数解析
+ let args : AnyOrNull = argsopts[0]
+ let opts : AnyOrNull = null;
+ if (argsopts.length > 1) {
+ opts = argsopts[1]
+ }
+
+ if (args != null && opts == null) {
+ if (typeof args == 'number') {
+ // args 是数字类型
+ const numArgs : number = args;
+ values = { count: numArgs, n: numArgs };
+ repeatCount = numArgs
+ } else if (typeof args == 'string') {
+ // args 是字符串类型(locale)
+ const strArgs : string = args;
+ locale = strArgs;
+
+ } else if (args instanceof Object && args != null) {
+ const objArgs : Record = args;
+ values = objArgs;
+
+ } else if (Array.isArray(args)) {
+ const arrArgs : Array = args;
+ values = arrArgs;
+ }
+ } else if (typeof args == 'number' && opts instanceof Object && opts != null) {
+ const objOpts : Record = opts;
+ values = objOpts;
+ const numArgs : number = args;
+ repeatCount = numArgs
+ }
+ }
+
+
+ // 类型安全的消息获取
+ let message : StringOrNull = this.getMessage(key, locale);
+
+ // 如果没有找到消息,尝试回退语言
+ if (message == null && locale != this.ops.fallbackLocale) {
+ message = this.getMessage(key, this.ops.fallbackLocale);
+ if (this.ops.fallbackWarn && message != null) {
+ this.ops.warnHandler(`Fall back to translate the key '${key}' with '${this.ops.fallbackLocale}' locale.`, null);
+ }
+ }
+
+ // 如果仍然没有找到消息
+ if (message == null) {
+ this.ops.warnHandler(`Not found '${key}' key in '${locale}' locale messages.`, null);
+ return key; // 返回键名作为默认值
+ }
+
+ // 类型安全的复数处理
+ if (repeatCount != null && typeof message == 'string' && message.includes('|')) {
+ const safeCount : number = repeatCount;
+ message = this.handlePlural(message, safeCount, locale);
+ }
+
+ // 类型安全的插值处理
+ if (typeof message == 'string') {
+ message = this.interpolate(message, values);
+ }
+
+ // 类型安全的后处理
+ if (this.ops.postTranslation != null && typeof message == 'string') {
+ const processedMessage : string = this.ops.postTranslation(message, key);
+ message = processedMessage;
+ }
+
+ // 确保返回字符串类型
+ return typeof message == 'string' ? message : key;
+ }
+
+ /**
+ * 数字格式化方法 - 参考 Vue I18n 实现
+ * @param val 要格式化的数字
+ * @param name 格式化名称模板,如果不存在以opts为准,如果opts也没有则取默认值。
+ * @param opts 格式化选项
+ * @returns 格式化后的字符串
+ */
+ n(val : number, formatName ?: StringOrNull, opts ?: NumberFormatOrNull) : string {
+ let currentLocale = (opts?.local ?? this.ops.locale)!;
+ let formatOptions : NumberFormatOpts = {
+ style: 'decimal',
+ currency: 'CNY',
+ local: currentLocale,
+ currencyDisplay: 'symbol',
+ useGrouping: false,
+ minimumIntegerDigits: 1,
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 3,
+ minimumSignificantDigits: null,
+ maximumSignificantDigits: null,
+ };
+ if (opts != null) {
+ formatOptions = {
+ style: opts?.style ?? formatOptions.style,
+ currency: opts?.currency ?? formatOptions.currency,
+ local: opts?.local ?? formatOptions.local,
+ currencyDisplay: opts?.currencyDisplay ?? formatOptions.currencyDisplay,
+ useGrouping: opts?.useGrouping ?? formatOptions.useGrouping,
+ minimumIntegerDigits: opts?.minimumIntegerDigits ?? formatOptions.minimumIntegerDigits,
+ minimumFractionDigits: opts?.minimumFractionDigits ?? formatOptions.minimumFractionDigits,
+ maximumFractionDigits: opts?.maximumFractionDigits ?? formatOptions.maximumFractionDigits,
+ minimumSignificantDigits: opts?.minimumSignificantDigits ?? formatOptions.minimumSignificantDigits,
+ maximumSignificantDigits: opts?.maximumSignificantDigits ?? formatOptions.maximumSignificantDigits
+ };
+ }
+
+ // 处理参数
+ if (typeof formatName == 'string') {
+ // 如果是字符串,从预定义格式中获取
+ const formatNameReal = formatName!;
+ if (this.ops.numberFormats.has(currentLocale)) {
+ const localeFormats = this.ops.numberFormats.get(currentLocale)!;
+ if (localeFormats.has(formatNameReal)) {
+ const formatOptions_templ = localeFormats.get(formatNameReal)!;
+ formatOptions = {
+ style: formatOptions_templ?.style ?? formatOptions.style,
+ currency: formatOptions_templ?.currency ?? formatOptions.currency,
+ local: formatOptions_templ?.local ?? formatOptions.local,
+ currencyDisplay: formatOptions_templ?.currencyDisplay ?? formatOptions.currencyDisplay,
+ useGrouping: formatOptions_templ?.useGrouping ?? formatOptions.useGrouping,
+ minimumIntegerDigits: formatOptions_templ?.minimumIntegerDigits ?? formatOptions.minimumIntegerDigits,
+ minimumFractionDigits: formatOptions_templ?.minimumFractionDigits ?? formatOptions.minimumFractionDigits,
+ maximumFractionDigits: formatOptions_templ?.maximumFractionDigits ?? formatOptions.maximumFractionDigits,
+ minimumSignificantDigits: formatOptions_templ?.minimumSignificantDigits ?? formatOptions.minimumSignificantDigits,
+ maximumSignificantDigits: formatOptions_templ?.maximumSignificantDigits ?? formatOptions.maximumSignificantDigits
+ };
+ } else {
+ this.ops.warnHandler(`Number format '${formatNameReal}' not found for locale '${currentLocale}'`, null);
+ }
+ } else {
+ this.ops.warnHandler(`Number formats not found for locale '${currentLocale}'`, null);
+ }
+ }
+
+ currentLocale = formatOptions.local
+ // 执行数字格式化
+ return this.formatNumber(val, formatOptions, currentLocale);
+ }
+
+ /**
+ * 日期时间格式化方法 - 参考 Vue I18n 实现
+ * @param val 要格式化的日期时间值(Date对象、时间戳数字或日期字符串)
+ * @param formatName 格式化名称模板,如果不存在以opts为准,如果opts也没有则取默认值
+ * @param opts 格式化选项
+ * @returns 格式化后的字符串
+ */
+ d(val : DateOrNumberOrString, formatName ?: StringOrNull, opts ?: DateTimeFormatOrNull) : string {
+ let currentLocale = (opts?.local ?? this.ops.locale)!;
+ let formatOptions : DateTimeFormatReal = {
+ localeMatcher: 'best fit',
+ local: currentLocale,
+ calendar: 'gregory',
+ numberingSystem: 'latn',
+ dateSeparator: "",
+ timeZone: 'UTC',
+ hour12: false,
+ hourCycle: 'h23',
+ formatMatcher: 'best fit',
+ weekday: '',
+ era: '',
+ year: 'numeric',
+ month: 'numeric',
+ day: 'numeric',
+ dayPeriod: '',
+ hour: '',
+ minute: '',
+ second: '',
+ fractionalSecondDigits: 0,
+ timeZoneName: '',
+ dateStyle: '',
+ timeStyle: ''
+ };
+
+ if (opts != null) {
+ formatOptions = {
+ localeMatcher: opts?.localeMatcher ?? formatOptions.localeMatcher,
+ local: opts?.local ?? formatOptions.local,
+ dateSeparator: opts?.dateSeparator ?? formatOptions.dateSeparator,
+ calendar: opts?.calendar ?? formatOptions.calendar,
+ numberingSystem: opts?.numberingSystem ?? formatOptions.numberingSystem,
+ timeZone: opts?.timeZone ?? formatOptions.timeZone,
+ hour12: opts?.hour12 ?? formatOptions.hour12,
+ hourCycle: opts?.hourCycle ?? formatOptions.hourCycle,
+ formatMatcher: opts?.formatMatcher ?? formatOptions.formatMatcher,
+ weekday: opts?.weekday ?? formatOptions.weekday,
+ era: opts?.era ?? formatOptions.era,
+ year: opts?.year ?? formatOptions.year,
+ month: opts?.month ?? formatOptions.month,
+ day: opts?.day ?? formatOptions.day,
+ dayPeriod: opts?.dayPeriod ?? formatOptions.dayPeriod,
+ hour: opts?.hour ?? formatOptions.hour,
+ minute: opts?.minute ?? formatOptions.minute,
+ second: opts?.second ?? formatOptions.second,
+ fractionalSecondDigits: opts?.fractionalSecondDigits ?? formatOptions.fractionalSecondDigits,
+ timeZoneName: opts?.timeZoneName ?? formatOptions.timeZoneName,
+ dateStyle: opts?.dateStyle ?? formatOptions.dateStyle,
+ timeStyle: opts?.timeStyle ?? formatOptions.timeStyle
+ };
+ }
+
+ // 处理参数
+ if (typeof formatName == 'string') {
+ // 如果是字符串,从预定义格式中获取
+ const formatNameReal = formatName!;
+ if (this.ops.datetimeFormats.has(currentLocale)) {
+ const localeFormats = this.ops.datetimeFormats.get(currentLocale)!;
+ if (localeFormats.has(formatNameReal)) {
+ const formatOptions_templ = localeFormats.get(formatNameReal)!;
+ formatOptions = {
+ localeMatcher: formatOptions_templ?.localeMatcher ?? formatOptions.localeMatcher,
+ local: formatOptions_templ?.local ?? formatOptions.local,
+ calendar: formatOptions_templ?.calendar ?? formatOptions.calendar,
+ numberingSystem: formatOptions_templ?.numberingSystem ?? formatOptions.numberingSystem,
+ timeZone: formatOptions_templ?.timeZone ?? formatOptions.timeZone,
+ hour12: formatOptions_templ?.hour12 ?? formatOptions.hour12,
+ hourCycle: formatOptions_templ?.hourCycle ?? formatOptions.hourCycle,
+ formatMatcher: formatOptions_templ?.formatMatcher ?? formatOptions.formatMatcher,
+ dateSeparator: formatOptions_templ?.dateSeparator ?? formatOptions.dateSeparator,
+ weekday: formatOptions_templ?.weekday ?? formatOptions.weekday,
+ era: formatOptions_templ?.era ?? formatOptions.era,
+ year: formatOptions_templ?.year ?? formatOptions.year,
+ month: formatOptions_templ?.month ?? formatOptions.month,
+ day: formatOptions_templ?.day ?? formatOptions.day,
+ dayPeriod: formatOptions_templ?.dayPeriod ?? formatOptions.dayPeriod,
+ hour: formatOptions_templ?.hour ?? formatOptions.hour,
+ minute: formatOptions_templ?.minute ?? formatOptions.minute,
+ second: formatOptions_templ?.second ?? formatOptions.second,
+ fractionalSecondDigits: formatOptions_templ?.fractionalSecondDigits ?? formatOptions.fractionalSecondDigits,
+ timeZoneName: formatOptions_templ?.timeZoneName ?? formatOptions.timeZoneName,
+ dateStyle: formatOptions_templ?.dateStyle ?? formatOptions.dateStyle,
+ timeStyle: formatOptions_templ?.timeStyle ?? formatOptions.timeStyle
+ };
+ } else {
+ this.ops.warnHandler(`DateTime format '${formatNameReal}' not found for locale '${currentLocale}'`, null);
+ }
+ } else {
+ this.ops.warnHandler(`DateTime formats not found for locale '${currentLocale}'`, null);
+ }
+ }
+ currentLocale = formatOptions.local
+
+ // 执行日期时间格式化
+ return this.formatDateTime(val, formatOptions, currentLocale);
+ }
+ /**
+ * 动态添加语言的新字段
+ * @param {string} local 语言
+ * @param {Record} newMessage 键值及字段。
+ */
+ mergeLocaleMessage(local : string, newMessage : Record) {
+ let nowmessage = this.ops.messages?.[local]??null;
+ if (nowmessage != null) {
+ nowmessage = { ...nowmessage, ...newMessage }
+ this.ops.messages[local] = {...this.ops.messages.local,...newMessage}
+ } else {
+ this.ops.messages[local] = newMessage
+ }
+ }
+ /**
+ * 检测翻译键是否存在 - 参考 Vue I18n 的 te 方法实现
+ * @param {string} key 翻译键,支持嵌套路径如 'user.name'
+ * @param {string} locale 可选的语言代码,不提供则使用当前语言
+ * @returns {boolean} 存在返回true,不存在返回false
+ */
+ te(key : string, locale ?: string | null) : boolean {
+ // 确定要检查的语言
+ const targetLocale = (locale != null ? locale : this.ops.locale);
+
+ // 检查语言包是否存在
+ const messages = this.ops.messages;
+ if (messages[targetLocale] == null) {
+ return false;
+ }
+
+ // 获取指定语言的消息
+ const localeMessages = messages[targetLocale] as UTSJSONObjectOrNull;
+ if (localeMessages == null) {
+ return false;
+ }
+
+ // 检查翻译键是否存在
+ const message = this.getNestedValue(localeMessages, key);
+ return message != null;
+ }
+ /**
+ * 相对时间
+ * @param {string,number,Date} timeValue 时间差(毫秒)
+ * @param {string} unit 首选单位,它会自动进阶更高的维度,比如提供秒,超过60秒以分为单位进阶。
+ * @param {string} locale 可选语言,不提供以默认创建的设置为准。
+ * @returns {string} 格式化后的时间字符串
+ */
+ rt(timeValues ?: number | Date | string | null, units ?: string | null, locale ?: string | null) : string {
+ const targetLocale = (locale != null ? locale : this.ops.locale)
+ const timeValue = (timeValues != null ? new Date() : timeValues!)
+ const unit = (units != null ? 'minute' : units!)
+
+
+ try {
+ // 获取目标时间的时间戳
+ let targetTimestamp = 0;
+ if (typeof timeValue == 'number') {
+ targetTimestamp = timeValue;
+ } else if (timeValue instanceof Date) {
+ targetTimestamp = timeValue.getTime();
+ } else if (typeof timeValue == 'string') {
+ targetTimestamp = new Date(timeValue.replace(/-/g, '/')).getTime();
+ }
+
+ // 获取当前时间戳
+ const currentTimestamp = new Date().getTime();
+
+ // 计算时间差(毫秒)
+ const timeDiff = targetTimestamp - currentTimestamp;
+
+ // 验证单位参数
+ const validUnits = ['year', 'years', 'quarter', 'quarters', 'month', 'months', 'week', 'weeks', 'day', 'days', 'hour', 'hours', 'minute', 'minutes', 'second', 'seconds'];
+ let normalizedUnit = unit.toLowerCase();
+
+ // 标准化单位名称(移除复数形式)
+ if (normalizedUnit.endsWith('s') && normalizedUnit != 'seconds') {
+ normalizedUnit = normalizedUnit.slice(0, -1);
+ }
+
+ // 处理特殊单位名称
+ switch (normalizedUnit) {
+ case 'yr':
+ case 'y':
+ normalizedUnit = 'year';
+ break;
+ case 'mo':
+ case 'm':
+ normalizedUnit = 'month';
+ break;
+ case 'w':
+ normalizedUnit = 'week';
+ break;
+ case 'd':
+ normalizedUnit = 'day';
+ break;
+ case 'h':
+ normalizedUnit = 'hour';
+ break;
+ case 'min':
+ normalizedUnit = 'minute';
+ break;
+ case 's':
+ case 'sec':
+ normalizedUnit = 'second';
+ break;
+ case 'q':
+ normalizedUnit = 'quarter';
+ break;
+ }
+
+ // 验证单位是否有效
+ if (!validUnits.includes(normalizedUnit) && !validUnits.includes(normalizedUnit + 's')) {
+ this.ops.warnHandler(`Invalid unit '${unit}' for relative time formatting. Valid units are: ${validUnits.join(', ')}`, null);
+ return `${timeValue} ${unit}`; // 返回原始格式作为回退
+ }
+
+ // 智能选择最合适的时间单位和数值
+ const bestTime = this.getBestTimeUnit(timeDiff, normalizedUnit);
+
+ // 使用自定义实现,确保跨平台兼容性
+ return this.formatRelativeTimeFallback(bestTime.value, bestTime.unit, targetLocale);
+
+ } catch (e) {
+ this.ops.warnHandler(`Relative time formatting failed for value ${timeValue} ${unit}`, e as Error);
+ return `${timeValue} ${unit}`; // 返回原始格式作为回退
+ }
+ }
+
+ /**
+ * 获取可用语言列表
+ * @returns {string[]}
+ */
+ availableLocales() : string[] {
+ return Object.keys(this.ops.messages)
+ }
+ /**
+ * 智能选择最合适的时间单位和数值
+ * @param timeDiff 时间差(毫秒)
+ * @param preferredUnit 首选单位
+ * @returns 包含最佳单位和数值的对象
+ */
+ private getBestTimeUnit(timeDiff : number, preferredUnit : string) : BestTimeTYpe {
+ const absTimeDiff = Math.abs(timeDiff);
+
+ // 定义时间单位的毫秒值和优先级
+ const timeUnits : timeUnitsTYpe[] = [
+ { unit: 'second', ms: 1000, threshold: 60 },
+ { unit: 'minute', ms: 1000 * 60, threshold: 60 },
+ { unit: 'hour', ms: 1000 * 60 * 60, threshold: 24 },
+ { unit: 'day', ms: 1000 * 60 * 60 * 24, threshold: 7 },
+ { unit: 'week', ms: 1000 * 60 * 60 * 24 * 7, threshold: 4.33 },
+ { unit: 'month', ms: 1000 * 60 * 60 * 24 * 30.44, threshold: 3 },
+ { unit: 'quarter', ms: 1000 * 60 * 60 * 24 * 30.44 * 3, threshold: 4 },
+ { unit: 'year', ms: 1000 * 60 * 60 * 24 * 365.25, threshold: Infinity }
+ ];
+
+ // 找到首选单位的索引
+ let startIndex = timeUnits.findIndex(tu => tu.unit === preferredUnit);
+ if (startIndex === -1) startIndex = 0; // 如果找不到,从秒开始
+
+ // 从首选单位开始,向上查找最合适的单位
+ for (let i = startIndex; i < timeUnits.length; i++) {
+ const currentUnit = timeUnits[i];
+ const value = Math.round(timeDiff / currentUnit.ms);
+ const absValue = Math.abs(value);
+
+ // 如果当前单位的值在合理范围内,或者已经是最大单位
+ if (absValue < currentUnit.threshold || i === timeUnits.length - 1) {
+ return { unit: currentUnit.unit, value: value } as BestTimeTYpe;
+ }
+ }
+
+ // 回退到首选单位
+ const fallbackUnit = timeUnits[startIndex];
+ return {
+ unit: fallbackUnit.unit,
+ value: Math.round(timeDiff / fallbackUnit.ms)
+ } as BestTimeTYpe;
+ }
+
+ /**
+ * 相对时间格式化的回退实现
+ * @param value 数值
+ * @param unit 单位
+ * @param locale 语言代码
+ * @returns 格式化后的相对时间字符串
+ */
+ private formatRelativeTimeFallback(value : number, unit : string, locale : string) : string {
+ const absValue = Math.abs(value);
+ const isPast = value < 0;
+ const isFuture = value > 0;
+ const isNow = value == 0;
+
+ // 获取语言代码
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ // 处理特殊情况(今天、昨天、明天等)
+ if (unit == 'day') {
+ if (isNow) {
+ return langCode == 'zh' ? '今天' : langCode == 'ja' ? '今日' : langCode == 'ko' ? '오늘' : 'today';
+ } else if (value == -1) {
+ return langCode == 'zh' ? '昨天' : langCode == 'ja' ? '昨日' : langCode == 'ko' ? '어제' : 'yesterday';
+ } else if (value == 1) {
+ return langCode == 'zh' ? '明天' : langCode == 'ja' ? '明日' : langCode == 'ko' ? '내일' : 'tomorrow';
+ }
+ }
+
+ // 获取单位的本地化名称
+ const unitName = this.getLocalizedUnitName(unit, absValue, langCode);
+
+ // 构建相对时间字符串
+ if (langCode == 'zh') {
+ if (isPast) {
+ return `${absValue}${unitName}前`;
+ } else if (isFuture) {
+ return `${absValue}${unitName}后`;
+ } else {
+ return `现在`;
+ }
+ } else if (langCode == 'ja') {
+ if (isPast) {
+ return `${absValue}${unitName}前`;
+ } else if (isFuture) {
+ return `${absValue}${unitName}後`;
+ } else {
+ return `今`;
+ }
+ } else if (langCode == 'ko') {
+ if (isPast) {
+ return `${absValue}${unitName} 전`;
+ } else if (isFuture) {
+ return `${absValue}${unitName} 후`;
+ } else {
+ return `지금`;
+ }
+ } else {
+ // 英语和其他语言
+ if (isPast) {
+ return `${absValue} ${unitName} ago`;
+ } else if (isFuture) {
+ return `in ${absValue} ${unitName}`;
+ } else {
+ return `now`;
+ }
+ }
+ }
+
+ /**
+ * 获取本地化的单位名称
+ * @param unit 单位
+ * @param value 数值(用于确定单复数)
+ * @param langCode 语言代码
+ * @returns 本地化的单位名称
+ */
+ private getLocalizedUnitName(unit : string, value : number, langCode : string) : string {
+ const isPlural = value != 1;
+
+ switch (langCode) {
+ case 'zh':
+ switch (unit) {
+ case 'year': return '年';
+ case 'quarter': return '季度';
+ case 'month': return '个月';
+ case 'week': return '周';
+ case 'day': return '天';
+ case 'hour': return '小时';
+ case 'minute': return '分钟';
+ case 'second': return '秒';
+ default: return unit;
+ }
+ case 'ja':
+ switch (unit) {
+ case 'year': return '年';
+ case 'quarter': return '四半期';
+ case 'month': return 'ヶ月';
+ case 'week': return '週間';
+ case 'day': return '日';
+ case 'hour': return '時間';
+ case 'minute': return '分';
+ case 'second': return '秒';
+ default: return unit;
+ }
+ case 'ko':
+ switch (unit) {
+ case 'year': return '년';
+ case 'quarter': return '분기';
+ case 'month': return '개월';
+ case 'week': return '주';
+ case 'day': return '일';
+ case 'hour': return '시간';
+ case 'minute': return '분';
+ case 'second': return '초';
+ default: return unit;
+ }
+ default:
+ // 英语和其他语言
+ switch (unit) {
+ case 'year': return isPlural ? 'years' : 'year';
+ case 'quarter': return isPlural ? 'quarters' : 'quarter';
+ case 'month': return isPlural ? 'months' : 'month';
+ case 'week': return isPlural ? 'weeks' : 'week';
+ case 'day': return isPlural ? 'days' : 'day';
+ case 'hour': return isPlural ? 'hours' : 'hour';
+ case 'minute': return isPlural ? 'minutes' : 'minute';
+ case 'second': return isPlural ? 'seconds' : 'second';
+ default: return unit;
+ }
+ }
+ }
+
+ /**
+ * 内部日期时间格式化实现
+ * @param value 日期时间值
+ * @param options 格式化选项
+ * @param locale 语言代码
+ * @returns 格式化后的字符串
+ */
+ private formatDateTime(value : DateOrNumberOrString, options : DateTimeFormatReal, locale : string) : string {
+ try {
+ // 转换输入值为Date对象
+ let dateObj : Date = new Date();
+ if (value instanceof Date) {
+ dateObj = value;
+ } else if (typeof value == 'number') {
+ dateObj = new Date(value);
+ } else if (typeof value == 'string') {
+ dateObj = new Date(value.replace(/-/g, '/'));
+ }
+
+ // 检查日期是否有效
+ if (isNaN(dateObj.getTime())) {
+ this.ops.warnHandler(`Invalid date: ${value}`, null);
+ return value.toString();
+ }
+
+ // 处理预定义样式
+ if (options.dateStyle != '' || options.timeStyle != '') {
+ return this.formatWithPredefinedStyle(dateObj, options, locale);
+ }
+
+ // 自定义格式化
+ return this.formatWithCustomOptions(dateObj, options, locale);
+
+ } catch (e) {
+ this.ops.warnHandler(`DateTime formatting failed for value ${value}`, e as Error);
+ return value.toString();
+ }
+ }
+
+ /**
+ * 使用预定义样式格式化日期时间
+ * @param date Date对象
+ * @param options 格式化选项
+ * @param locale 语言代码
+ * @returns 格式化后的字符串
+ */
+ private formatWithPredefinedStyle(date : Date, options : DateTimeFormatReal, locale : string) : string {
+ let result = '';
+
+ // 处理日期样式
+ if (options.dateStyle != '') {
+ switch (options.dateStyle) {
+ case 'full':
+ result += this.getFullDateFormat(date, locale);
+ break;
+ case 'long':
+ result += this.getLongDateFormat(date, locale);
+ break;
+ case 'medium':
+ result += this.getMediumDateFormat(date, locale);
+ break;
+ case 'short':
+ result += this.getShortDateFormat(date, locale);
+ break;
+ default:
+ result += this.getMediumDateFormat(date, locale);
+ break;
+ }
+ }
+
+ // 处理时间样式
+ if (options.timeStyle != '') {
+ if (result != '') result += ' ';
+ switch (options.timeStyle) {
+ case 'full':
+ result += this.getFullTimeFormat(date, options, locale);
+ break;
+ case 'long':
+ result += this.getLongTimeFormat(date, options, locale);
+ break;
+ case 'medium':
+ result += this.getMediumTimeFormat(date, options, locale);
+ break;
+ case 'short':
+ result += this.getShortTimeFormat(date, options, locale);
+ break;
+ default:
+ result += this.getMediumTimeFormat(date, options, locale);
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * 使用自定义选项格式化日期时间
+ * @param date Date对象
+ * @param options 格式化选项
+ * @param locale 语言代码
+ * @returns 格式化后的字符串
+ */
+ private formatWithCustomOptions(date : Date, options : DateTimeFormatReal, locale : string) : string {
+ const dateParts : string[] = [];
+ const timeParts : string[] = [];
+
+ // 根据语言环境确定日期组件的排列顺序
+ const langCode = locale.split('-')[0].toLowerCase();
+ const isUSFormat = langCode == 'en' && (locale.toLowerCase().includes('us') || locale.toLowerCase() == 'en');
+
+ // 处理非日期组件(星期和纪元)
+ if (options.weekday != '') {
+ dateParts.push(this.formatWeekday(date, options.weekday, locale));
+ }
+
+ if (options.era != '') {
+ dateParts.push(this.formatEra(date, options.era, locale));
+ }
+
+ // 根据语言环境按正确顺序添加日期组件
+ if (isUSFormat) {
+ // 美式英语:月/日/年
+ if (options.month != '') {
+ dateParts.push(this.formatMonth(date, options.month, locale, options.numberingSystem, options.dateSeparator));
+ }
+ if (options.day != '') {
+ dateParts.push(this.formatDay(date, options.day, locale, options.numberingSystem, options.dateSeparator));
+ }
+ if (options.year != '') {
+ dateParts.push(this.formatYear(date, options.year, locale, options.numberingSystem, options.dateSeparator));
+ }
+ } else {
+ // 其他语言(包括中文、英式英语等):年/月/日 或 日/月/年
+ if (langCode == 'zh' || langCode == 'ja' || langCode == 'ko') {
+ // 东亚语言:年/月/日
+ if (options.year != '') {
+ dateParts.push(this.formatYear(date, options.year, locale, options.numberingSystem, options.dateSeparator));
+ }
+ if (options.month != '') {
+ dateParts.push(this.formatMonth(date, options.month, locale, options.numberingSystem, options.dateSeparator));
+ }
+ if (options.day != '') {
+ dateParts.push(this.formatDay(date, options.day, locale, options.numberingSystem, options.dateSeparator));
+ }
+ } else {
+ // 欧洲语言(英式英语、德语、法语等):日/月/年
+ if (options.day != '') {
+ dateParts.push(this.formatDay(date, options.day, locale, options.numberingSystem, options.dateSeparator));
+ }
+ if (options.month != '') {
+ dateParts.push(this.formatMonth(date, options.month, locale, options.numberingSystem, options.dateSeparator));
+ }
+ if (options.year != '') {
+ dateParts.push(this.formatYear(date, options.year, locale, options.numberingSystem, options.dateSeparator));
+ }
+ }
+ }
+
+ // 处理时间组件
+ if (options.hour != '') {
+ timeParts.push(this.formatHour(date, options.hour, options.hour12, options.hourCycle, options.numberingSystem));
+ }
+
+ if (options.minute != '') {
+ timeParts.push(this.formatMinute(date, options.minute, options.numberingSystem));
+ }
+
+ if (options.second != '') {
+ timeParts.push(this.formatSecond(date, options.second, options.fractionalSecondDigits, options.numberingSystem));
+ }
+
+ // 组合时间部分(用冒号连接)
+ let timeStr = '';
+ if (timeParts.length > 0) {
+ timeStr = timeParts.join(':');
+
+ // 添加 AM/PM
+ if (options.dayPeriod != '' && options.hour12) {
+ timeStr += ` ${this.formatDayPeriod(date, options.dayPeriod, locale)}`;
+ }
+
+ // 添加时区
+ if (options.timeZoneName != '') {
+ timeStr += ` ${this.formatTimeZone(date, options.timeZoneName, options.timeZone)}`;
+ }
+ }
+
+ // 组合日期和时间
+ const result : string[] = [];
+ if (dateParts.length > 0) {
+ result.push(this.combineDateTimeParts(dateParts, locale, options.dateSeparator));
+ }
+ if (timeStr != '') {
+ result.push(timeStr);
+ }
+
+ return result.join(' ');
+ }
+
+ /**
+ * 内部数字格式化实现
+ * @param value 数字值
+ * @param options 格式化选项
+ * @param locale 语言代码
+ * @returns 格式化后的字符串
+ */
+ private formatNumber(value : number, options : NumberFormatOpts, locale : string) : string {
+ try {
+ // 基础格式化逻辑
+ let result = value.toString();
+
+ // 处理有效数字位数(优先级高于小数位数)
+ if (options.minimumSignificantDigits != null || options.maximumSignificantDigits != null) {
+ result = this.formatWithSignificantDigits(value, options);
+ } else {
+ // 处理小数位数
+ if (options.minimumFractionDigits != null || options.maximumFractionDigits != null) {
+ const minDigits = options.minimumFractionDigits == null ? 0 : options.minimumFractionDigits!;
+ const maxDigits = options.maximumFractionDigits == null ? 3 : options.maximumFractionDigits!;
+ result = value.toFixed(Math.max(minDigits, Math.min(maxDigits, 10)));
+
+ // 移除尾随零(如果maxDigits允许)
+ if (maxDigits > minDigits) {
+ result = parseFloat(result).toString();
+ // 确保最小小数位数
+ if (minDigits > 0) {
+ const parts = result.split('.');
+ if (parts.length == 1) {
+ result += '.' + '0'.repeat(minDigits);
+ } else {
+ const decimalPart = parts[1];
+ if (decimalPart.length < minDigits) {
+ result += '0'.repeat(minDigits - decimalPart.length);
+ }
+ }
+ }
+ }
+ }
+
+ // 处理最小整数位数
+ if (options.minimumIntegerDigits != null && options.minimumIntegerDigits > 1) {
+ result = this.formatWithMinimumIntegerDigits(result, options.minimumIntegerDigits);
+ }
+ }
+
+ // 处理千分位分隔符
+ if (options.useGrouping == true) {
+ result = this.addThousandsSeparator(result, locale);
+ }
+
+ // 处理样式
+ if (options.style != null) {
+ switch (options.style) {
+ case 'currency':
+ result = this.formatCurrency(result, options, locale);
+ break;
+ case 'percent':
+ result = this.formatPercent(result, value);
+ break;
+ case 'decimal':
+ default:
+ // 已经是十进制格式
+ break;
+ }
+ }
+
+ return result;
+ } catch (e) {
+ this.ops.warnHandler(`Number formatting failed for value ${value}`, e as Error);
+ return value.toString();
+ }
+ }
+
+ /**
+ * 使用有效数字位数格式化数字
+ * @param value 数字值
+ * @param options 格式化选项
+ * @returns 格式化后的字符串
+ */
+ private formatWithSignificantDigits(value : number, options : NumberFormatOpts) : string {
+ const minSigDigits = options.minimumSignificantDigits ?? 1;
+ const maxSigDigits = options.maximumSignificantDigits ?? 21;
+
+ // 确保有效数字位数在合理范围内
+ const actualMinSigDigits = Math.max(1, Math.min(minSigDigits, 21));
+ const actualMaxSigDigits = Math.max(actualMinSigDigits, Math.min(maxSigDigits, 21));
+
+ // 使用toPrecision方法格式化有效数字
+ let result = value.toPrecision(actualMaxSigDigits);
+
+ // 移除科学计数法表示(如果不是很大或很小的数)
+ if (!result.includes('e') && !result.includes('E')) {
+ // 移除尾随零,但保持最小有效数字位数
+ const num = parseFloat(result);
+ result = num.toPrecision(actualMinSigDigits);
+
+ // 如果结果不包含科学计数法,转换为普通数字格式
+ if (!result.includes('e') && !result.includes('E')) {
+ result = parseFloat(result).toString();
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * 使用最小整数位数格式化数字
+ * @param numStr 数字字符串
+ * @param minIntegerDigits 最小整数位数
+ * @returns 格式化后的字符串
+ */
+ private formatWithMinimumIntegerDigits(numStr : string, minIntegerDigits : number) : string {
+ const parts = numStr.split('.');
+ const integerPart = parts[0];
+ const decimalPart = parts.length > 1 ? parts[1] : '';
+
+ // 在整数部分前面补零
+ const paddedInteger = integerPart.padStart(minIntegerDigits, '0');
+
+ return decimalPart == '' ? `${paddedInteger}.${decimalPart}` : paddedInteger;
+ }
+
+ // ==================== 日期时间格式化辅助方法 ====================
+
+ /**
+ * 获取完整日期格式
+ */
+ private getFullDateFormat(date : Date, locale : string) : string {
+ const langCode = locale.split('-')[0].toLowerCase();
+ const isUSFormat = langCode == 'en' && (locale.toLowerCase().includes('us') || locale.toLowerCase() == 'en');
+
+ if (langCode == 'zh') {
+ return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日 ${this.formatWeekday(date, 'long', locale)}`;
+ } else if (langCode == 'ja') {
+ return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日 ${this.formatWeekday(date, 'long', locale)}`;
+ } else if (langCode == 'ko') {
+ return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일 ${this.formatWeekday(date, 'long', locale)}`;
+ } else if (isUSFormat) {
+ // 美式英语:dddd, MMMM d, yyyy
+ return `${this.formatWeekday(date, 'long', locale)}, ${this.formatMonth(date, 'long', locale)} ${date.getDate()}, ${date.getFullYear()}`;
+ } else {
+ // 欧洲语言:dddd, d MMMM yyyy
+ return `${this.formatWeekday(date, 'long', locale)}, ${date.getDate()} ${this.formatMonth(date, 'long', locale)} ${date.getFullYear()}`;
+ }
+ }
+
+ /**
+ * 获取长日期格式
+ */
+ private getLongDateFormat(date : Date, locale : string) : string {
+ const langCode = locale.split('-')[0].toLowerCase();
+ const isUSFormat = langCode == 'en' && (locale.toLowerCase().includes('us') || locale.toLowerCase() == 'en');
+
+ if (langCode == 'zh') {
+ return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`;
+ } else if (langCode == 'ja') {
+ return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`;
+ } else if (langCode == 'ko') {
+ return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일`;
+ } else if (isUSFormat) {
+ // 美式英语:MMMM d, yyyy
+ return `${this.formatMonth(date, 'long', locale)} ${date.getDate()}, ${date.getFullYear()}`;
+ } else {
+ // 欧洲语言:d MMMM yyyy
+ return `${date.getDate()} ${this.formatMonth(date, 'long', locale)} ${date.getFullYear()}`;
+ }
+ }
+
+ /**
+ * 获取中等日期格式
+ */
+ private getMediumDateFormat(date : Date, locale : string) : string {
+ const langCode = locale.split('-')[0].toLowerCase();
+ const isUSFormat = langCode == 'en' && (locale.toLowerCase().includes('us') || locale.toLowerCase() == 'en');
+
+ if (langCode == 'zh' || langCode == 'ja' || langCode == 'ko') {
+ // 东亚语言:YYYY-MM-dd
+ return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
+ } else if (isUSFormat) {
+ // 美式英语:MMM d, yyyy
+ return `${this.formatMonth(date, 'short', locale)} ${date.getDate()}, ${date.getFullYear()}`;
+ } else {
+ // 欧洲语言:d MMM yyyy
+ return `${date.getDate()} ${this.formatMonth(date, 'short', locale)} ${date.getFullYear()}`;
+ }
+ }
+
+ /**
+ * 获取短日期格式
+ */
+ private getShortDateFormat(date : Date, locale : string) : string {
+ const langCode = locale.split('-')[0].toLowerCase();
+ const isUSFormat = langCode == 'en' && (locale.toLowerCase().includes('us') || locale.toLowerCase() == 'en');
+ const year = date.getFullYear().toString().slice(-2);
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
+ const day = date.getDate().toString().padStart(2, '0');
+
+ if (isUSFormat) {
+ // 美式英语:MM/dd/yy
+ return `${month}/${day}/${year}`;
+ } else if (langCode == 'zh' || langCode == 'ja' || langCode == 'ko') {
+ // 东亚语言:yy/MM/dd
+ return `${year}/${month}/${day}`;
+ } else {
+ // 欧洲语言(英式英语、德语、法语等):dd/MM/yy
+ return `${day}/${month}/${year}`;
+ }
+ }
+
+ /**
+ * 获取完整时间格式
+ */
+ private getFullTimeFormat(date : Date, options : DateTimeFormatReal, locale : string) : string {
+ const timeStr = this.getMediumTimeFormat(date, options, locale);
+ const timeZone = this.formatTimeZone(date, 'long', options.timeZone);
+ return `${timeStr} ${timeZone}`;
+ }
+
+ /**
+ * 获取长时间格式
+ */
+ private getLongTimeFormat(date : Date, options : DateTimeFormatReal, locale : string) : string {
+ const timeStr = this.getMediumTimeFormat(date, options, locale);
+ const timeZone = this.formatTimeZone(date, 'short', options.timeZone);
+ return `${timeStr} ${timeZone}`;
+ }
+
+ /**
+ * 获取中等时间格式
+ */
+ private getMediumTimeFormat(date : Date, options : DateTimeFormatReal, locale : string) : string {
+ const hour = this.formatHour(date, 'numeric', options.hour12, options.hourCycle);
+ const minute = this.formatMinute(date, '2-digit');
+ const second = this.formatSecond(date, '2-digit', 0);
+ const dayPeriod = options.hour12 ? ` ${this.formatDayPeriod(date, 'short', locale)}` : '';
+ return `${hour}:${minute}:${second}${dayPeriod}`;
+ }
+
+ /**
+ * 获取短时间格式
+ */
+ private getShortTimeFormat(date : Date, options : DateTimeFormatReal, locale : string) : string {
+ const hour = this.formatHour(date, 'numeric', options.hour12, options.hourCycle);
+ const minute = this.formatMinute(date, '2-digit');
+ const dayPeriod = options.hour12 ? ` ${this.formatDayPeriod(date, 'short', locale)}` : '';
+ return `${hour}:${minute}${dayPeriod}`;
+ }
+
+ /**
+ * 格式化星期
+ */
+ private formatWeekday(date : Date, style : string, locale : string) : string {
+ const weekdays = this.getWeekdayNames(locale);
+ const dayIndex = date.getDay();
+
+ switch (style) {
+ case 'long':
+ return weekdays.long[dayIndex];
+ case 'short':
+ return weekdays.short[dayIndex];
+ case 'narrow':
+ return weekdays.narrow[dayIndex];
+ default:
+ return weekdays.long[dayIndex];
+ }
+ }
+
+ /**
+ * 格式化纪元
+ */
+ private formatEra(date : Date, style : string, locale : string) : string {
+ const year = date.getFullYear();
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ if (langCode == 'zh') {
+ return year > 0 ? '公元' : '公元前';
+ } else {
+ switch (style) {
+ case 'long':
+ return year > 0 ? 'Anno Domini' : 'Before Christ';
+ case 'short':
+ case 'narrow':
+ default:
+ return year > 0 ? 'AD' : 'BC';
+ }
+ }
+ }
+
+ /**
+ * 数字系统转换
+ * @param number 数字字符串
+ * @param numberingSystem 数字系统
+ * @returns 转换后的数字字符串
+ */
+ private convertNumberingSystem(number : string, numberingSystem : string) : string {
+ if (numberingSystem == 'latn' || numberingSystem == '') {
+ return number; // 拉丁数字(默认)
+ }
+
+ // 数字系统映射表
+ const numberingSystems = new Map();
+ numberingSystems.set('arab', ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩']); // 阿拉伯-印度数字
+ numberingSystems.set('arabext', ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']); // 扩展阿拉伯-印度数字
+ numberingSystems.set('deva', ['०', '१', '२', '३', '४', '५', '६', '७', '८', '९']); // 天城文数字
+ numberingSystems.set('fullwide', ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']); // 全角数字
+ numberingSystems.set('hanidec', ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九']); // 汉字数字
+ numberingSystems.set('thai', ['๐', '๑', '๒', '๓', '๔', '๕', '๖', '๗', '๘', '๙']); // 泰文数字
+
+ const digits = numberingSystems.get(numberingSystem);
+ if (digits == null) {
+ return number; // 不支持的数字系统,返回原数字
+ }
+
+ // 转换每个数字字符
+ let result = '';
+ for (let i = 0; i < number.length; i++) {
+ const char = number.charAt(i);
+ if (char >= '0' && char <= '9') {
+ const digitIndex = parseInt(char);
+ result += digits[digitIndex];
+ } else {
+ result += char; // 非数字字符保持不变
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * 格式化年份
+ */
+ private formatYear(date : Date, style : string, locale : string = '', numberingSystem : string = 'latn', dateSeparator : string = '') : string {
+ const year = date.getFullYear();
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ let yearStr = '';
+ switch (style) {
+ case 'numeric':
+ yearStr = this.convertNumberingSystem(year.toString(), numberingSystem);
+ // 如果提供了分隔符,返回纯数字;否则中文环境下添加"年"字
+ return (dateSeparator != '' || langCode != 'zh') ? yearStr : `${yearStr}年`;
+ case '2-digit':
+ const shortYear = year.toString().slice(-2).padStart(2, '0');
+ yearStr = this.convertNumberingSystem(shortYear, numberingSystem);
+ return (dateSeparator != '' || langCode != 'zh') ? yearStr : `${yearStr}年`;
+ default:
+ yearStr = this.convertNumberingSystem(year.toString(), numberingSystem);
+ return (dateSeparator != '' || langCode != 'zh') ? yearStr : `${yearStr}年`;
+ }
+ }
+
+ /**
+ * 格式化月份
+ */
+ private formatMonth(date : Date, style : string, locale : string, numberingSystem : string = 'latn', dateSeparator : string = '') : string {
+ const month = date.getMonth();
+ const monthNames = this.getMonthNames(locale);
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ switch (style) {
+ case 'numeric':
+ // 如果提供了分隔符,返回纯数字;否则中文环境下添加"月"字
+ const monthStr = this.convertNumberingSystem((month + 1).toString(), numberingSystem);
+ return (dateSeparator != '' || langCode != 'zh') ? monthStr : `${monthStr}月`;
+ case '2-digit':
+ const paddedMonth = (month + 1).toString().padStart(2, '0');
+ const paddedMonthStr = this.convertNumberingSystem(paddedMonth, numberingSystem);
+ return (dateSeparator != '' || langCode != 'zh') ? paddedMonthStr : `${paddedMonthStr}月`;
+ case 'long':
+ return monthNames.long[month];
+ case 'short':
+ return monthNames.short[month];
+ case 'narrow':
+ return monthNames.narrow[month];
+ default:
+ const defaultMonthStr = this.convertNumberingSystem((month + 1).toString(), numberingSystem);
+ return (dateSeparator != '' || langCode != 'zh') ? defaultMonthStr : `${defaultMonthStr}月`;
+ }
+ }
+
+ /**
+ * 格式化日期
+ */
+ private formatDay(date : Date, style : string, locale : string = '', numberingSystem : string = 'latn', dateSeparator : string = '') : string {
+ const day = date.getDate();
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ switch (style) {
+ case 'numeric':
+ // 如果提供了分隔符,返回纯数字;否则中文环境下添加"日"字
+ const dayStr = this.convertNumberingSystem(day.toString(), numberingSystem);
+ return (dateSeparator != '' || langCode != 'zh') ? dayStr : `${dayStr}日`;
+ case '2-digit':
+ const paddedDay = day.toString().padStart(2, '0');
+ const paddedDayStr = this.convertNumberingSystem(paddedDay, numberingSystem);
+ return (dateSeparator != '' || langCode != 'zh') ? paddedDayStr : `${paddedDayStr}日`;
+ default:
+ const defaultDayStr = this.convertNumberingSystem(day.toString(), numberingSystem);
+ return (dateSeparator != '' || langCode != 'zh') ? defaultDayStr : `${defaultDayStr}日`;
+ }
+ }
+
+ /**
+ * 格式化小时
+ */
+ private formatHour(date : Date, style : string, hour12 : boolean, hourCycle : string, numberingSystem : string = 'latn') : string {
+ let hour = date.getHours();
+
+ if (hour12) {
+ if (hourCycle == 'h11') {
+ hour = hour % 12;
+ } else { // h12
+ hour = hour % 12;
+ if (hour == 0) hour = 12;
+ }
+ } else {
+ if (hourCycle == 'h11') {
+ hour = hour % 12;
+ } else if (hourCycle == 'h24') {
+ if (hour == 0) hour = 24;
+ }
+ // h23 保持原样
+ }
+
+ switch (style) {
+ case 'numeric':
+ return this.convertNumberingSystem(hour.toString(), numberingSystem);
+ case '2-digit':
+ return this.convertNumberingSystem(hour.toString().padStart(2, '0'), numberingSystem);
+ default:
+ return this.convertNumberingSystem(hour.toString(), numberingSystem);
+ }
+ }
+
+ /**
+ * 格式化分钟
+ */
+ private formatMinute(date : Date, style : string, numberingSystem : string = 'latn') : string {
+ const minute = date.getMinutes();
+ switch (style) {
+ case 'numeric':
+ return this.convertNumberingSystem(minute.toString(), numberingSystem);
+ case '2-digit':
+ return this.convertNumberingSystem(minute.toString().padStart(2, '0'), numberingSystem);
+ default:
+ return this.convertNumberingSystem(minute.toString(), numberingSystem);
+ }
+ }
+
+ /**
+ * 格式化秒
+ */
+ private formatSecond(date : Date, style : string, fractionalDigits : number, numberingSystem : string = 'latn') : string {
+ const second = date.getSeconds();
+ const millisecond = date.getMilliseconds();
+
+ let result = '';
+ switch (style) {
+ case 'numeric':
+ result = this.convertNumberingSystem(second.toString(), numberingSystem);
+ break;
+ case '2-digit':
+ result = this.convertNumberingSystem(second.toString().padStart(2, '0'), numberingSystem);
+ break;
+ default:
+ result = this.convertNumberingSystem(second.toString(), numberingSystem);
+ break;
+ }
+
+ // 添加小数秒
+ if (fractionalDigits > 0) {
+ const fractional = millisecond.toString().padStart(3, '0').slice(0, fractionalDigits);
+ const convertedFractional = this.convertNumberingSystem(fractional, numberingSystem);
+ result += `.${convertedFractional}`;
+ }
+
+ return result;
+ }
+
+ /**
+ * 格式化时段(AM/PM)
+ */
+ private formatDayPeriod(date : Date, style : string, locale : string) : string {
+ const hour = date.getHours();
+ const isAM = hour < 12;
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ if (langCode == 'zh') {
+ switch (style) {
+ case 'long':
+ return isAM ? '上午' : '下午';
+ case 'short':
+ case 'narrow':
+ default:
+ return isAM ? '上午' : '下午';
+ }
+ } else {
+ switch (style) {
+ case 'long':
+ return isAM ? 'AM' : 'PM';
+ case 'short':
+ case 'narrow':
+ default:
+ return isAM ? 'AM' : 'PM';
+ }
+ }
+ }
+
+ /**
+ * 格式化时区
+ */
+ private formatTimeZone(date : Date, style : string, timeZone : string) : string {
+ // 简化实现,实际应用中可能需要更复杂的时区处理
+ switch (style) {
+ case 'long':
+ return timeZone == 'UTC' ? 'Coordinated Universal Time' : timeZone;
+ case 'short':
+ default:
+ return timeZone == 'UTC' ? 'UTC' : timeZone;
+ }
+ }
+
+ /**
+ * 组合日期时间各部分
+ */
+ private combineDateTimeParts(parts : string[], locale : string, dateSeparator : string = '') : string {
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ // 如果设置了自定义分隔符,使用自定义分隔符连接
+ if (dateSeparator != '') {
+ return parts.join(dateSeparator);
+ }
+
+ if (langCode == 'zh') {
+ // 中文习惯:直接连接(年份和日期已包含单位字符)
+ return parts.join('');
+ } else {
+ // 英文习惯:用空格分隔
+ return parts.join(' ');
+ }
+ }
+
+ /**
+ * 获取星期名称
+ */
+ private getWeekdayNames(locale : string) : DateTimeNames {
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ if (langCode == 'zh') {
+ return {
+ long: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+ short: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+ narrow: ['日', '一', '二', '三', '四', '五', '六']
+ };
+ } else {
+ return {
+ long: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ narrow: ['S', 'M', 'T', 'W', 'T', 'F', 'S']
+ };
+ }
+ }
+
+ /**
+ * 获取月份名称
+ */
+ private getMonthNames(locale : string) : DateTimeNames {
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ if (langCode == 'zh') {
+ return {
+ long: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
+ short: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
+ narrow: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
+ };
+ } else {
+ return {
+ long: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
+ short: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D']
+ };
+ }
+ }
+
+ /**
+ * 添加千分位分隔符
+ * @param numStr 数字字符串
+ * @param locale 语言代码
+ * @returns 带千分位分隔符的字符串
+ */
+ private addThousandsSeparator(numStr : string, locale : string) : string {
+ const parts = numStr.split('.');
+ const integerPart = parts[0];
+ const decimalPart = parts.length > 1 ? parts[1] : '';
+
+ // 根据语言选择分隔符
+ const separator = this.getThousandsSeparator(locale);
+
+ // 添加千分位分隔符
+ const formattedInteger = integerPart.replace(/(\d)(?=(\d{3})+(?!\d))/g, `$1${separator}`);
+
+ return decimalPart == '' ? `${formattedInteger}.${decimalPart}` : formattedInteger;
+ }
+
+ /**
+ * 千分位分隔符映射配置
+ */
+ private static readonly THOUSANDS_SEPARATOR_MAP = new Map([
+ // 使用逗号的语言
+ ['en', ','], // 英语
+ ['zh', ','], // 中文
+ ['zh-Hant', ','], // 中文
+ ['zh', ','], // 中文
+ ['ja', ','], // 日语
+ ['ko', ','], // 韩语
+ ['pt', ','], // 葡萄牙语
+ ['th', ','], // 泰语
+ ['vi', ','], // 越南语
+ ['id', ','], // 印尼语
+ ['ms', ','], // 马来语
+ ['tl', ','], // 菲律宾语
+ ['he', ','], // 希伯来语
+ ['ar', ','], // 阿拉伯语
+ // 使用空格的语言
+ ['de', ' '], // 德语
+ ['fr', ' '], // 法语
+ ['ru', ' '], // 俄语
+ ['sv', ' '], // 瑞典语
+ ['no', ' '], // 挪威语
+ ['da', ' '], // 丹麦语
+ ['fi', ' '], // 芬兰语
+ ['cs', ' '], // 捷克语
+ ['sk', ' '], // 斯洛伐克语
+ ['pl', ' '], // 波兰语
+ // 使用点号的语言
+ ['es', '.'], // 西班牙语
+ ['it', '.'], // 意大利语
+ ['nl', '.'], // 荷兰语
+ ['tr', '.'], // 土耳其语
+ // 使用撇号的语言
+ ['ch', "'"], // 瑞士德语
+ ]);
+
+ /**
+ * 获取千分位分隔符
+ * @param locale 语言代码
+ * @returns 分隔符字符
+ */
+ private getThousandsSeparator(locale : string) : string {
+ // 提取语言代码前缀(如 'en-US' -> 'en')
+ const langCode = locale.split('-')[0].toLowerCase();
+
+ // 从映射中获取分隔符
+ const separator = Tmui4xI18n.THOUSANDS_SEPARATOR_MAP.get(langCode);
+
+ // 如果找到对应的分隔符则返回,否则返回默认的逗号
+ return separator ?? ',';
+ }
+
+ /**
+ * 格式化货币
+ * @param numStr 数字字符串
+ * @param options 格式化选项
+ * @param locale 语言代码
+ * @returns 格式化后的货币字符串
+ */
+ private formatCurrency(numStr : string, options : NumberFormatOpts, locale : string) : string {
+ const currency = options.currency ?? 'USD';
+ const currencyDisplay = options.currencyDisplay ?? 'symbol';
+
+ let currencySymbol = currency;
+ if (currencyDisplay == 'symbol') {
+ // 全球主要经济体货币符号映射
+ switch (currency.toUpperCase()) {
+ // 美洲
+ case 'USD':
+ currencySymbol = '$';
+ break;
+ case 'CAD':
+ currencySymbol = 'C$';
+ break;
+ case 'BRL':
+ currencySymbol = 'R$';
+ break;
+ case 'MXN':
+ currencySymbol = '$';
+ break;
+ // 欧洲
+ case 'EUR':
+ currencySymbol = '€';
+ break;
+ case 'GBP':
+ currencySymbol = '£';
+ break;
+ case 'CHF':
+ currencySymbol = 'CHF';
+ break;
+ case 'RUB':
+ currencySymbol = '₽';
+ break;
+ // 亚太地区
+ case 'JPY':
+ currencySymbol = '¥';
+ break;
+ case 'CNY':
+ case 'RMB':
+ currencySymbol = '¥';
+ break;
+ case 'KRW':
+ currencySymbol = '₩';
+ break;
+ case 'INR':
+ currencySymbol = '₹';
+ break;
+ case 'AUD':
+ currencySymbol = 'A$';
+ break;
+ case 'SGD':
+ currencySymbol = 'S$';
+ break;
+ case 'HKD':
+ currencySymbol = 'HK$';
+ break;
+ case 'TWD':
+ currencySymbol = 'NT$';
+ break;
+ case 'THB':
+ currencySymbol = '฿';
+ break;
+ case 'MYR':
+ currencySymbol = 'RM';
+ break;
+ case 'VND':
+ currencySymbol = '₫';
+ break;
+ case 'IDR':
+ currencySymbol = 'Rp';
+ break;
+ case 'PHP':
+ currencySymbol = '₱';
+ break;
+ // 中东地区
+ case 'SAR':
+ currencySymbol = '﷼';
+ break;
+ case 'AED':
+ currencySymbol = 'د.إ';
+ break;
+ case 'ILS':
+ currencySymbol = '₪';
+ break;
+ case 'TRY':
+ currencySymbol = '₺';
+ break;
+ // 非洲
+ case 'ZAR':
+ currencySymbol = 'R';
+ break;
+ default:
+ currencySymbol = currency;
+ break;
+ }
+ }
+
+ // 根据货币和地区决定货币符号位置(参考国际标准)
+ return this.getCurrencyPosition(currencySymbol, numStr, currency, locale);
+ }
+
+ /**
+ * 获取货币符号位置
+ * @param symbol 货币符号
+ * @param numStr 数字字符串
+ * @param currency 货币代码
+ * @param locale 语言代码
+ * @returns 格式化后的货币字符串
+ */
+ private getCurrencyPosition(symbol : string, numStr : string, currency : string, locale : string) : string {
+ const currencyCode = currency.toUpperCase();
+
+ // 符号在前面的货币(无空格)
+ const prefixNoSpace = ['USD', 'CAD', 'AUD', 'HKD', 'SGD', 'TWD', 'GBP', 'CNY', 'RMB', 'JPY'];
+ // 符号在前面的货币(有空格)
+ const prefixWithSpace = ['BRL', 'MXN', 'KRW', 'INR', 'THB', 'VND', 'IDR', 'PHP', 'ILS', 'TRY'];
+ // 符号在后面的货币(有空格)
+ const suffixWithSpace = ['EUR', 'CHF', 'RUB', 'MYR', 'SAR', 'AED', 'ZAR'];
+
+ if (prefixNoSpace.includes(currencyCode)) {
+ return `${symbol}${numStr}`;
+ } else if (prefixWithSpace.includes(currencyCode)) {
+ return `${symbol} ${numStr}`;
+ } else if (suffixWithSpace.includes(currencyCode)) {
+ return `${numStr} ${symbol}`;
+ } else {
+ // 默认根据语言决定
+ if (locale.startsWith('en') || locale.startsWith('zh')) {
+ return `${symbol}${numStr}`;
+ } else {
+ return `${numStr} ${symbol}`;
+ }
+ }
+ }
+
+ /**
+ * 格式化百分比
+ * @param numStr 数字字符串
+ * @param originalValue 原始数值
+ * @returns 格式化后的百分比字符串
+ */
+ private formatPercent(numStr : string, originalValue : number) : string {
+ // 将数值乘以100并添加百分号
+ const percentValue = originalValue * 100;
+ return `${percentValue}%`;
+ }
+ /**
+ * 获取翻译消息
+ * @param key 翻译键
+ * @param locale 语言代码
+ * @returns 翻译消息或null
+ */
+ private getMessage(key : string, locale : string) : StringOrNull {
+ const messages = this.ops.messages;
+ if (messages[locale] == null) {
+ return null;
+ }
+
+ const localeMessages = messages[locale] as UTSJSONObjectOrNull;
+ return this.getNestedValue(localeMessages, key);
+ }
+
+ /**
+ * 获取嵌套对象的值
+ * @param obj 对象
+ * @param path 路径,如 'user.name'
+ * @returns 值或null
+ */
+ private getNestedValue(obj : UTSJSONObjectOrNull, path : string) : StringOrNull {
+ const keys = path.split('.');
+
+ let getAny : GetAnyTypeOrNull = (objdata : AnyOrNull) : AnyOrNull => {
+ let realGetAny = getAny!;
+ let path : StringOrNull = keys.shift() || null
+ if (objdata == null) return null;
+ if (
+ typeof objdata == 'string' ||
+ typeof objdata == 'number'
+ ) return objdata
+ if (path == null) return null;
+ return realGetAny((objdata! as Record)?.[path]??null);
+ }
+
+ let current : AnyOrNull = getAny(obj);
+
+ if (typeof current == 'number') return current.toString()
+ return typeof current == 'string' ? current : null;
+ }
+
+ /**
+ * 处理复数形式
+ * @param message 包含复数的消息
+ * @param count 数量
+ * @param locale 语言代码
+ * @returns 选择的复数形式
+ */
+ private handlePlural(message : string, count : number, locale : string) : string {
+ const choices = message.split('|').map((choice : string) : string => choice.trim());
+ const choicesLength = choices.length;
+
+ // 获取复数规则
+ let pluralRule = this.ops.pluralRule;
+ if (this.ops.pluralRules.has(locale)) {
+ pluralRule = this.ops.pluralRules.get(locale)!;
+ }
+
+ // 应用复数规则
+ let index = 0;
+ if (pluralRule != null) {
+ // 第有理数无法类型嵌套,暂不支持设置为null
+ index = pluralRule(count, choicesLength, null);
+ }
+
+ // 确保索引在有效范围内
+ const safeIndex = Math.max(0, Math.min(index, choicesLength - 1));
+ let result = choices[safeIndex]
+ if (result == '' || result == null) {
+ result = choices[0]
+ }
+ if (result == '' || result == null) {
+ result = message
+ }
+
+ return result;
+ }
+
+ /**
+ * 字符串插值处理
+ * @param message 消息模板
+ * @param values 插值参数
+ * @returns 插值后的字符串
+ */
+ private interpolate(message : string, values : UTSJSONObjectOrArray) : string {
+ let msg = message;
+ if (Array.isArray(values)) {
+ // 处理位置插值 {0}, {1}, {2}...
+ // #ifndef APP-ANDROID
+ msg = message.replace(/\{(\d+)\}/g, (match : string, key : string, index : number) : string => {
+ const value = values[parseInt(key)];
+
+ if (value != null) {
+ let result = typeof value == 'number' ? value.toString() : value as string
+ return result;
+ }
+ return match; // 保持原样如果没有找到值
+ });
+ // #endif
+ // #ifdef APP-ANDROID
+ msg = message.replace(/\{(\d+)\}/g, (match : string, key : string, offset : number, str : string) : string => {
+ const value = values[parseInt(key)];
+ if (value != null) {
+ let result = typeof value == 'number' ? value.toString() : value as string
+ return result;
+ }
+ return match; // 保持原样如果没有找到值
+ });
+ // #endif
+ } else if (typeof values == 'object' && values != null) {
+ if (Object.keys(values).length == 0) {
+ return message;
+ }
+ // 处理命名插值 {name}比如{count},{n}等
+ // #ifndef APP-ANDROID
+ msg = message.replace(/\{([^}]+)\}/g, (match : string, key : string, index : number) : string => {
+ const value = values[key];
+ if (value != null) {
+ return value as string;
+ }
+ return match; // 保持原样如果没有找到值
+ });
+ // #endif
+ // #ifdef APP-ANDROID
+ msg = message.replace(/\{([^}]+)\}/g, (match : string, key : string, offset : number, str : string) : string => {
+ const value = values[key];
+ if (value != null) {
+ if (typeof value == 'string') return value;
+ if (typeof value == 'number') return value.toString();
+
+ }
+ return match; // 保持原样如果没有找到值
+ });
+ // #endif
+ }
+
+
+
+ return msg;
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/local/i18nStore.ts b/src/uni_modules/tm-ui/local/i18nStore.ts
new file mode 100644
index 0000000..4f7acbb
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/i18nStore.ts
@@ -0,0 +1,51 @@
+
+import { Tmui4xI18n } from './i18n';
+
+// 导入本地语言文件
+import zhHans from "./localLanuage/zh-Hans.json";
+import zhHant from "./localLanuage/zh-Hant.json";
+import en from "./localLanuage/en.json";
+import ja from "./localLanuage/ja.json";
+import ko from "./localLanuage/ko.json";
+import { I18nOptions } from "./interface";
+
+export const i18n = (options?: I18nOptions) => {
+ // 创建多语言实例
+ let i18nInstance = new Tmui4xI18n(options);
+ // 设置默认语言
+ const defaultLanguage = options?.locale ?? 'zh-Hans';
+ i18nInstance.setLocale(defaultLanguage);
+ // 合并本地语言文件
+ const localLanguages = {
+ 'zh-Hans': zhHans,
+ 'zh-Hant': zhHant,
+ 'en': en,
+ 'ja': ja,
+ 'ko': ko
+ };
+
+ // 循环合并所有本地语言
+ Object.entries(localLanguages).forEach(([locale, messages]) => {
+ try {
+ i18nInstance.mergeLocaleMessage(locale, messages);
+ // console.log(`[tm-ui] 语言包 ${locale} 加载成功`);
+ } catch (error) {
+ console.warn(`[tm-ui] 语言包 ${locale} 加载失败:`, error);
+ }
+ });
+ // 合并options中的语言消息(如果存在)
+ if (options?.messages) {
+ Object.entries(options.messages).forEach(([locale, messages]) => {
+ try {
+ i18nInstance.mergeLocaleMessage(locale, messages);
+ // console.log(`[tm-ui] 自定义语言包 ${locale} 加载成功`);
+ } catch (error) {
+ console.warn(`[tm-ui] 自定义语言包 ${locale} 加载失败:`, error);
+ }
+ });
+ }
+
+
+ return i18nInstance;
+}
+
diff --git a/src/uni_modules/tm-ui/local/interface.ts b/src/uni_modules/tm-ui/local/interface.ts
new file mode 100644
index 0000000..4c80672
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/interface.ts
@@ -0,0 +1,416 @@
+// 统一类型定义 - 替换联合类型
+export type StringOrNull = string | null
+export type NumberOrNull = number | null
+export type StringOrNumber = string | number
+export type StringOrNumberOrNull = string | number | null
+export type DateOrNumberOrString = Date | number | string
+export type UTSJSONObjectOrNull = Record | null
+export type UTSJSONObjectOrArray = Record | Array
+export type AnyOrNull = any | null
+export type StringOrMessageFunction = string | MessageFunction
+export type StringOrVoid = string | void
+export type GetAnyType = (obj : AnyOrNull) => AnyOrNull
+export type I18nOptionsOrNull = I18nOptions | null
+export type NumberFormatOrNull = NumberFormat | null
+export type DateTimeFormatOrNull = DateTimeFormat | null
+export type GetAnyTypeOrNull = GetAnyType | null
+
+/**
+ * 警告处理器类型 - 用于处理国际化过程中的警告信息
+ * @param msg 警告消息内容
+ * @param err 可选的错误对象
+ */
+export type WarnHandler = (msg : StringOrNumberOrNull, err ?: Error|null) => void
+
+/**
+ * 基础复数规则函数类型 - 定义基本的复数形式选择逻辑
+ * @param choice 数量值
+ * @param choicesLength 可选择的复数形式数量
+ * @returns 选择的复数形式索引
+ */
+export type BasePluralRule = (choice : number, choicesLength : number) => number
+
+/**
+ * 复数规则类型 - 扩展的复数规则,支持回退到原始规则
+ * @param choice 数量值
+ * @param choicesLength 可选择的复数形式数量
+ * @param orgRule 可选的原始复数规则
+ * @returns 选择的复数形式索引
+ */
+export type PluralRule = (choice : number, choicesLength : number, orgRule ?: BasePluralRule|null) => number
+
+/**
+ * 消息上下文类型 - 包含消息处理所需的所有上下文信息
+ */
+export type MessageContext = {
+ /** 列表参数 */
+ list : Array
+ /** 命名参数对象 */
+ named : Record
+ /** 复数索引 */
+ pluralIndex : number
+ /** 复数规则函数 */
+ pluralRule ?: PluralRule
+ /** 原始复数规则函数 */
+ orgPluralRule ?: BasePluralRule
+ /** 字符串修饰器函数 */
+ modifier : (str : string) => string
+ /** 消息内容或消息函数 */
+ message : StringOrMessageFunction
+ /** 消息类型 */
+ type : string
+ /** 插值函数 */
+ interpolate : (val : any) => string
+ /** 值标准化函数 */
+ normalize : (values : Array) => Array
+ /** 参数值数组 */
+ values : Array
+}
+
+/**
+ * 消息函数类型 - 接收上下文并返回格式化后的字符串
+ * @param ctx 消息上下文
+ * @returns 格式化后的消息字符串
+ */
+export type MessageFunction = (ctx : MessageContext) => string
+
+/**
+ * 消息函数返回值类型
+ */
+export type MessageFunctionReturn = StringOrNumber
+
+/**
+ * 数字格式化选项类型 - 基于 ECMA-402 Intl.NumberFormat 标准
+ */
+export type NumberFormat = {
+ /** 数字样式:'decimal'(十进制)、'currency'(货币)、'percent'(百分比) */
+ style ?: string
+ /** 货币代码,如 'USD'、'EUR'、'CNY' */
+ currency ?: string
+ /** 本地化代码 */
+ local ?: string
+ /** 货币显示方式:'symbol'(符号)、'code'(代码)、'name'(名称) */
+ currencyDisplay ?: string
+ /** 是否使用千分位分组 */
+ useGrouping ?: boolean
+ /** 最小整数位数 */
+ minimumIntegerDigits ?: number
+ /** 最小小数位数 */
+ minimumFractionDigits ?: number
+ /** 最大小数位数 */
+ maximumFractionDigits ?: number
+ /** 最小有效数字位数 */
+ minimumSignificantDigits ?: number
+ /** 最大有效数字位数 */
+ maximumSignificantDigits ?: number
+}
+/**
+ * 数字格式化选项类型(必填版本)- 所有字段都是必需的
+ */
+export type NumberFormatOpts = {
+ /** 数字样式 */
+ style : string
+ /** 本地化代码 */
+ local : string
+ /** 货币代码 */
+ currency : string
+ /** 货币显示方式 */
+ currencyDisplay : string
+ /** 是否使用千分位分组 */
+ useGrouping : boolean
+ /** 最小整数位数 */
+ minimumIntegerDigits : number
+ /** 最小小数位数 */
+ minimumFractionDigits : number | null
+ /** 最大小数位数 */
+ maximumFractionDigits : number | null
+ /** 最小有效数字位数 */
+ minimumSignificantDigits : number | null
+ /** 最大有效数字位数 */
+ maximumSignificantDigits : number | null
+}
+
+/**
+ * 数字格式化配置映射 - 语言代码 -> 格式名称 -> 格式配置
+ */
+export type NumberFormats = Map>
+
+/**
+ * 日期时间格式化选项类型 - 基于 ECMA-402 Intl.DateTimeFormat 标准
+ */
+export type DateTimeFormat = {
+ /** 本地化匹配算法:'lookup' 或 'best fit' */
+ localeMatcher ?: string
+ /** 本地化代码 */
+ local ?: string
+ /** 日历系统,如 'gregory'、'chinese'、'islamic'、'buddhist'、'coptic'、'dangi'、'ethioaa'、'ethiopic'、'hebrew'、'indian'、'iso8601'、'japanese'、'persian'、'roc' */
+ calendar ?: string
+ /** 数字系统,如 'arab'、'arabext'、'bali'、'beng'、'deva'、'fullwide'、'gujr'、'guru'、'hanidec'、'khmr'、'knda'、'laoo'、'latn'、'limb'、'mlym'、'mong'、'mymr'、'orya'、'tamldec'、'telu'、'thai'、'tibt' */
+ numberingSystem ?: string
+ /** 时区标识符,如 'UTC'、'Asia/Shanghai'、'America/New_York' */
+ timeZone ?: string
+ /** 是否使用12小时制 */
+ hour12 ?: boolean
+ /** 小时周期:'h11'(0-11 with AM/PM)、'h12'(1-12 with AM/PM)、'h23'(0-23)、'h24'(1-24) */
+ hourCycle ?: string
+ /** 格式匹配算法:'basic' 或 'best fit' */
+ formatMatcher ?: string
+ /** 日期分隔符:用于连接年月日的字符,如 '-'、'/'、'.' 等。设置后将输出纯数字格式(如 2025-5-3),忽略语言默认的文字后缀 */
+ dateSeparator ?: string
+ /** 星期显示:'long'(Monday)、'short'(Mon)、'narrow'(M) */
+ weekday ?: string
+ /** 纪元显示:'long'(Anno Domini)、'short'(AD)、'narrow'(A) */
+ era ?: string
+ /** 年份显示:'numeric'(2023)、'2-digit'(23) */
+ year ?: string
+ /** 月份显示:'numeric'(1)、'2-digit'(01)、'long'(January)、'short'(Jan)、'narrow'(J) */
+ month ?: string
+ /** 日期显示:'numeric'(1)、'2-digit'(01) */
+ day ?: string
+ /** 时段显示:'long'(in the morning)、'short'(AM)、'narrow'(a) */
+ dayPeriod ?: string
+ /** 小时显示:'numeric'(1)、'2-digit'(01) */
+ hour ?: string
+ /** 分钟显示:'numeric'(1)、'2-digit'(01) */
+ minute ?: string
+ /** 秒显示:'numeric'(1)、'2-digit'(01) */
+ second ?: string
+ /** 小数秒位数:0-3,控制毫秒显示精度 */
+ fractionalSecondDigits ?: number
+ /** 时区名称显示:'long'(Pacific Standard Time)、'short'(PST)、'shortOffset'(GMT-8)、'longOffset'(GMT-08:00)、'shortGeneric'(PT)、'longGeneric'(Pacific Time) */
+ timeZoneName ?: string
+ /** 日期样式:'full'、'long'、'medium'、'short' - 与单独的日期组件选项互斥 */
+ dateStyle ?: string
+ /** 时间样式:'full'、'long'、'medium'、'short' - 与单独的时间组件选项互斥 */
+ timeStyle ?: string
+}
+
+export type DateTimeFormatReal = {
+ /** 本地化匹配算法:'lookup' 或 'best fit' */
+ localeMatcher : string
+ /** 本地化代码 */
+ local : string
+ /** 日历系统,如 'gregory'、'chinese'、'islamic'、'buddhist'、'coptic'、'dangi'、'ethioaa'、'ethiopic'、'hebrew'、'indian'、'iso8601'、'japanese'、'persian'、'roc' */
+ calendar : string
+ /** 数字系统,如 'arab'、'arabext'、'bali'、'beng'、'deva'、'fullwide'、'gujr'、'guru'、'hanidec'、'khmr'、'knda'、'laoo'、'latn'、'limb'、'mlym'、'mong'、'mymr'、'orya'、'tamldec'、'telu'、'thai'、'tibt' */
+ numberingSystem : string
+ /** 时区标识符,如 'UTC'、'Asia/Shanghai'、'America/New_York' */
+ timeZone : string
+ /** 是否使用12小时制 */
+ hour12 : boolean
+ /** 小时周期:'h11'(0-11 with AM/PM)、'h12'(1-12 with AM/PM)、'h23'(0-23)、'h24'(1-24) */
+ hourCycle : string
+ /** 格式匹配算法:'basic' 或 'best fit' */
+ formatMatcher : string
+ /** 日期分隔符:用于连接年月日的字符,如 '-'、'/'、'.' 等。设置后将输出纯数字格式(如 2025-5-3),忽略语言默认的文字后缀 */
+ dateSeparator : string
+ /** 星期显示:'long'(Monday)、'short'(Mon)、'narrow'(M) */
+ weekday : string
+ /** 纪元显示:'long'(Anno Domini)、'short'(AD)、'narrow'(A) */
+ era : string
+ /** 年份显示:'numeric'(2023)、'2-digit'(23) */
+ year : string
+ /** 月份显示:'numeric'(1)、'2-digit'(01)、'long'(January)、'short'(Jan)、'narrow'(J) */
+ month : string
+ /** 日期显示:'numeric'(1)、'2-digit'(01) */
+ day : string
+ /** 时段显示:'long'(in the morning)、'short'(AM)、'narrow'(a) */
+ dayPeriod : string
+ /** 小时显示:'numeric'(1)、'2-digit'(01) */
+ hour : string
+ /** 分钟显示:'numeric'(1)、'2-digit'(01) */
+ minute : string
+ /** 秒显示:'numeric'(1)、'2-digit'(01) */
+ second : string
+ /** 小数秒位数:0-3,控制毫秒显示精度 */
+ fractionalSecondDigits : number
+ /** 时区名称显示:'long'(Pacific Standard Time)、'short'(PST)、'shortOffset'(GMT-8)、'longOffset'(GMT-08:00)、'shortGeneric'(PT)、'longGeneric'(Pacific Time) */
+ timeZoneName : string
+ /** 日期样式:'full'、'long'、'medium'、'short' - 与单独的日期组件选项互斥 */
+ dateStyle : string
+ /** 时间样式:'full'、'long'、'medium'、'short' - 与单独的时间组件选项互斥 */
+ timeStyle : string
+}
+
+/**
+ * 日期时间格式化配置映射 - 语言代码 -> 格式名称 -> 格式配置
+ */
+export type DateTimeFormats = Map>
+/**
+ * I18n配置选项类型(可选版本)- 用于初始化国际化实例
+ */
+export type I18nOptions = {
+ /** 当前语言代码,如 'en-US'、'zh-CN' */
+ locale ?: string
+ /** 回退语言代码,当当前语言缺少翻译时使用 */
+ fallbackLocale ?: string
+ /** 翻译消息对象,按语言代码组织 */
+ messages ?: Record
+ /** 日期时间格式化配置 */
+ datetimeFormats ?: DateTimeFormats
+ /** 数字格式化配置 */
+ numberFormats ?: NumberFormats
+ /** 字符串修饰器映射 */
+ modifiers ?: Map
+ /** 复数规则映射,按语言代码组织 */
+ pluralRules ?: Map
+ /** 缺失翻译处理函数 */
+ missing ?: ((locale : string, key : string, instance ?: any, type ?: string) => StringOrVoid) | null
+ /** 是否显示缺失翻译警告 */
+ missingWarn ?: boolean
+ /** 是否显示回退语言警告 */
+ fallbackWarn ?: boolean
+ /** 是否回退到根实例 */
+ fallbackRoot ?: boolean
+ /** 是否启用回退格式化 */
+ fallbackFormat ?: boolean
+ /** 是否允许未解析的翻译键 */
+ unresolving ?: boolean
+ /** 翻译后处理函数 */
+ postTranslation ?: ((str : string, key : string) => string) | null
+ /** 是否警告HTML消息 */
+ warnHtmlMessage ?: boolean
+ /** 是否转义参数 */
+ escapeParameter ?: boolean
+ /** 是否继承父级语言设置 */
+ inheritLocale ?: boolean
+ /** 警告处理器 */
+ warnHandler ?: WarnHandler
+ /** 默认复数规则 */
+ pluralRule ?: PluralRule
+ /** 是否全局注入 */
+ globalInjection ?: boolean
+ /** 是否允许组合式API */
+ allowComposition ?: boolean
+ /** 是否使用遗留模式 */
+ legacy ?: boolean
+}
+/**
+ * I18n配置选项类型(必填版本)- 内部使用的完整配置对象
+ * 参考语言代码标准:https://xnxy.github.io/2024/06/11/%E5%9B%BD%E9%99%85%E5%8C%96%E4%B8%AD%E5%B8%B8%E7%94%A8BCP-47%20Code%E5%92%8C%E8%AF%AD%E8%A8%80%E5%AF%B9%E7%85%A7%E8%A1%A8/
+ */
+export type I18nOptionsReally = {
+ /** 当前语言代码,如 'en-US'、'zh-CN' */
+ locale : string
+ /** 回退语言代码,当当前语言缺少翻译时使用 */
+ fallbackLocale : string
+ /** 翻译消息对象,按语言代码组织 */
+ messages : Record
+ /** 日期时间格式化配置 */
+ datetimeFormats : DateTimeFormats
+ /** 数字格式化配置 */
+ numberFormats : NumberFormats
+ /** 字符串修饰器映射 */
+ modifiers : Map
+ /** 复数规则映射,按语言代码组织 */
+ pluralRules : Map
+ /** 缺失翻译处理函数 */
+ missing : ((locale : string, key : string, instance ?: AnyOrNull, type ?: StringOrNull) => StringOrVoid) | null
+ /** 是否显示缺失翻译警告 */
+ missingWarn : boolean
+ /** 是否显示回退语言警告 */
+ fallbackWarn : boolean
+ /** 是否回退到根实例 */
+ fallbackRoot : boolean
+ /** 是否启用回退格式化 */
+ fallbackFormat : boolean
+ /** 是否允许未解析的翻译键 */
+ unresolving : boolean
+ /** 翻译后处理函数 */
+ postTranslation : ((str : string, key : string) => string) | null
+ /** 是否警告HTML消息 */
+ warnHtmlMessage : boolean
+ /** 是否转义参数 */
+ escapeParameter : boolean
+ /** 是否继承父级语言设置 */
+ inheritLocale : boolean
+ /** 警告处理器 */
+ warnHandler : WarnHandler
+ /** 默认复数规则 */
+ pluralRule : PluralRule
+ /** 是否全局注入 */
+ globalInjection : boolean
+ /** 是否允许组合式API */
+ allowComposition : boolean
+ /** 是否使用遗留模式 */
+ legacy : boolean
+}
+/**
+ * uniapp-x下的tmui4x附带的多语言插件,现面向所有用户开放本语言插件。
+ * @author tmui4x
+ * @copyright https://tmui.design
+ * @date 2025/7/8
+ */
+export interface Tmui4xI18nTml {
+ /** 实例配置,可以动态修改本配置 **/
+ ops : I18nOptionsReally
+
+ /** 设置语言 */
+ setLocale(local : string) : void;
+ /**
+ * 获取语言
+ * @returns {string} 当前设置的语言
+ */
+ getLocale() : string;
+ /**
+ * 获取回退语言
+ * @returns {string} 当前回退的语言
+ */
+ getFallbackLocale() : string;
+ /** 设置回退语言 */
+ setFallbackLocale(local : string) :void;
+ /** 全量填充配置 **/
+ setOptions(args : I18nOptions|null):void;
+ /**
+ * 翻译方法 - 参考 Vue I18n 实现(UTS类型安全优化版本)
+ * @param key 翻译键
+ * @param args 可选参数:数字(用于复数)、对象(用于插值)、字符串(locale)等同原vueI18n使用方式
+ * @param opts 可选的第二个参数当args为复数数字,key中函数 | 时,此opts起效且必须为Record格式等同原vueI18n使用方式
+ * @returns 翻译后的字符串
+ */
+ t(key : string, ...argsopts : Array) : string;
+ /**
+ * 数字格式化方法 - 参考 Vue I18n 实现
+ * @param val 要格式化的数字
+ * @param name 格式化名称模板,如果不存在以opts为准,如果opts也没有则取默认值。
+ * @param opts 格式化选项
+ * @returns 格式化后的字符串
+ */
+ n(val : number, formatName ?: StringOrNull, opts ?: NumberFormatOrNull) : string;
+ /**
+ * 日期时间格式化方法 - 参考 Vue I18n 实现
+ * @param val 要格式化的日期时间值(Date对象、时间戳数字或日期字符串)
+ * @param formatName 格式化名称模板,如果不存在以opts为准,如果opts也没有则取默认值
+ * @param opts 格式化选项
+ * @returns 格式化后的字符串
+ */
+ d(val : DateOrNumberOrString, formatName ?: StringOrNull, opts ?: DateTimeFormatOrNull) : string;
+ /**
+ * 动态添加语言的新字段
+ * @param {string} local 语言
+ * @param {Record} newMessage 键值及字段。
+ */
+ mergeLocaleMessage (local : string, newMessage : Record) : void;
+ /**
+ * 检测翻译键是否存在 - 参考 Vue I18n 的 te 方法实现
+ * @param {string} key 翻译键,支持嵌套路径如 'user.name'
+ * @param {string} locale 可选的语言代码,不提供则使用当前语言
+ * @returns {boolean} 存在返回true,不存在返回false
+ */
+ te(key : string, locale ?: string | null) : boolean;
+ /**
+ * 相对时间
+ * @param {string,number,Date} timeValue 时间差(毫秒)
+ * @param {string} unit 首选单位,它会自动进阶更高的维度,比如提供秒,超过60秒以分为单位进阶。
+ * @param {string} locale 可选语言,不提供以默认创建的设置为准。
+ * @returns {string} 格式化后的时间字符串
+ */
+ rt(timeValues ?: number | Date | string | null, units ?: string | null, locale ?: string | null) : string;
+ /**
+ * 获取可用语言列表
+ * @returns {string[]}
+ */
+ availableLocales() : string[]
+}
+
+
diff --git a/src/uni_modules/tm-ui/local/localLanuage/en.json b/src/uni_modules/tm-ui/local/localLanuage/en.json
new file mode 100644
index 0000000..fc99b9b
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/localLanuage/en.json
@@ -0,0 +1,94 @@
+{
+ "tmui32x": {
+ "cancel": "Cancel",
+ "confirm": "Confirm",
+ "success": "Success",
+ "fail": "Failed",
+ "warn": "Warning",
+ "info": "Info",
+ "clear":"Clear",
+ "pickerTitle":"Please select",
+ "tmBetweenTime":{
+ "title": "Please select time",
+ "startText": "Start time",
+ "endText": "End time",
+ "betweenText": "to",
+ "clearText": "Clear",
+ "nowText": "Today",
+ "thisWeekText": "This week",
+ "thisMonthText": "This month",
+ "thisYearText": "This year",
+ "thisQuarterText": "This quarter"
+ },
+ "tmMore":{
+ "off": "Expand more",
+ "on": "Collapse more"
+ },
+ "tmSku":{
+ "buyBtnText": "Buy now",
+ "noSelectedText": "No product selected",
+ "noStockText": "Out of stock",
+ "queHuo": "Out of stock",
+ "selectedText": "Selected: ",
+ "numberText": "Quantity: {count}",
+ "addText": "Add to cart",
+ "addSuccessText": "Added successfully",
+ "originalPriceText": "Original price {count}"
+ },
+ "tmNavbar":{
+ "title": "Title"
+ },
+ "tmForm":{
+ "ruleMessage": "Please select/fill correctly"
+ },
+ "cancelText": "Cancel",
+ "confirmText": "Confirm",
+ "tmModal":{
+ "title": "Title"
+ },
+ "tmDrawer":{
+ "title": "Title"
+ },
+ "tmUploadPhoto":{
+ "statusText":{
+ "0": "Pending upload",
+ "1": "Uploading",
+ "2": "Upload successful",
+ "3": "Upload failed",
+ "4": "Cancelled",
+ "5": "Exceeds size limit"
+ }
+ },
+ "tmPicker":{
+ "title": "Please select"
+ },
+ "tmPickerDate":{
+ "title": "Please select time"
+ },
+ "tmDateView":{
+ "cellUnits":{
+ "year": "Year",
+ "month": "Month",
+ "day": "Day",
+ "hour": "Hour",
+ "minute": "Minute",
+ "second": "Second"
+ }
+ },
+ "tmCalendar":{
+ "year": "Year",
+ "month": "Month",
+ "day": "Day",
+ "hour": "Hour",
+ "minute": "Minute",
+ "second": "Second",
+ "titleCurrentMonth":"{0} {1}",
+ "monthCountSelected":"{count} months",
+ "selectedStatus":"{count} days selected | No date selected | Selected | End date not selected",
+ "rangStatus":"Start | End | Today",
+ "tips":"Max {count} days",
+ "currentMonthTitle":"This month",
+ "week":"Mon | Tue | Wed | Thu | Fri | Sat | Sun"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/local/localLanuage/ja.json b/src/uni_modules/tm-ui/local/localLanuage/ja.json
new file mode 100644
index 0000000..160c653
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/localLanuage/ja.json
@@ -0,0 +1,94 @@
+{
+ "tmui32x": {
+ "cancel": "キャンセル",
+ "confirm": "確認",
+ "success": "成功",
+ "fail": "失敗",
+ "warn": "警告",
+ "info": "情報",
+ "clear":"クリア",
+ "pickerTitle":"選択してください",
+ "tmBetweenTime":{
+ "title": "時間を選択してください",
+ "startText": "開始時間",
+ "endText": "終了時間",
+ "betweenText": "から",
+ "clearText": "クリア",
+ "nowText": "今日",
+ "thisWeekText": "今週",
+ "thisMonthText": "今月",
+ "thisYearText": "今年",
+ "thisQuarterText": "今四半期"
+ },
+ "tmMore":{
+ "off": "もっと展開",
+ "on": "もっと収納"
+ },
+ "tmSku":{
+ "buyBtnText": "今すぐ購入",
+ "noSelectedText": "商品が選択されていません",
+ "noStockText": "在庫切れ",
+ "queHuo": "在庫切れ",
+ "selectedText": "選択済み:",
+ "numberText": "数量:{count}",
+ "addText": "カートに追加",
+ "addSuccessText": "追加しました",
+ "originalPriceText": "定価{count}"
+ },
+ "tmNavbar":{
+ "title": "タイトル"
+ },
+ "tmForm":{
+ "ruleMessage": "正しく選択/入力してください"
+ },
+ "cancelText": "キャンセル",
+ "confirmText": "確認",
+ "tmModal":{
+ "title": "タイトル"
+ },
+ "tmDrawer":{
+ "title": "タイトル"
+ },
+ "tmUploadPhoto":{
+ "statusText":{
+ "0": "アップロード待ち",
+ "1": "アップロード中",
+ "2": "アップロード成功",
+ "3": "アップロード失敗",
+ "4": "キャンセル",
+ "5": "サイズ制限超過"
+ }
+ },
+ "tmPicker":{
+ "title": "選択してください"
+ },
+ "tmPickerDate":{
+ "title": "時間を選択してください"
+ },
+ "tmDateView":{
+ "cellUnits":{
+ "year": "年",
+ "month": "月",
+ "day": "日",
+ "hour": "時",
+ "minute": "分",
+ "second": "秒"
+ }
+ },
+ "tmCalendar":{
+ "year": "年",
+ "month": "月",
+ "day": "日",
+ "hour": "時",
+ "minute": "分",
+ "second": "秒",
+ "titleCurrentMonth":"{0}年{1}月",
+ "monthCountSelected":"{count}ヶ月",
+ "selectedStatus":"選択済み{count}日 | 日付未選択 | 選択済み | 終了日未選択",
+ "rangStatus":"開始 | 終了 | 本日",
+ "tips":"最大選択{count}日",
+ "currentMonthTitle":"今月",
+ "week":"月曜日 | 火曜日 | 水曜日 | 木曜日 | 金曜日 | 土曜日 | 日曜日"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/local/localLanuage/ko.json b/src/uni_modules/tm-ui/local/localLanuage/ko.json
new file mode 100644
index 0000000..30add91
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/localLanuage/ko.json
@@ -0,0 +1,94 @@
+{
+ "tmui32x": {
+ "cancel": "취소",
+ "confirm": "확인",
+ "success": "성공",
+ "fail": "실패",
+ "warn": "경고",
+ "info": "정보",
+ "clear":"지우기",
+ "pickerTitle":"선택하세요",
+ "tmBetweenTime":{
+ "title": "시간을 선택하세요",
+ "startText": "시작 시간",
+ "endText": "종료 시간",
+ "betweenText": "부터",
+ "clearText": "지우기",
+ "nowText": "오늘",
+ "thisWeekText": "이번 주",
+ "thisMonthText": "이번 달",
+ "thisYearText": "올해",
+ "thisQuarterText": "이번 분기"
+ },
+ "tmMore":{
+ "off": "더 펼치기",
+ "on": "더 접기"
+ },
+ "tmSku":{
+ "buyBtnText": "지금 구매",
+ "noSelectedText": "상품이 선택되지 않았습니다",
+ "noStockText": "재고 부족",
+ "queHuo": "재고 부족",
+ "selectedText": "선택됨:",
+ "numberText": "수량:{count}",
+ "addText": "장바구니에 추가",
+ "addSuccessText": "추가되었습니다",
+ "originalPriceText": "정가{count}"
+ },
+ "tmNavbar":{
+ "title": "제목"
+ },
+ "tmForm":{
+ "ruleMessage": "올바르게 선택/입력하세요"
+ },
+ "cancelText": "취소",
+ "confirmText": "확인",
+ "tmModal":{
+ "title": "제목"
+ },
+ "tmDrawer":{
+ "title": "제목"
+ },
+ "tmUploadPhoto":{
+ "statusText":{
+ "0": "업로드 대기",
+ "1": "업로드 중",
+ "2": "업로드 성공",
+ "3": "업로드 실패",
+ "4": "취소됨",
+ "5": "크기 제한 초과"
+ }
+ },
+ "tmPicker":{
+ "title": "선택하세요"
+ },
+ "tmPickerDate":{
+ "title": "시간을 선택하세요"
+ },
+ "tmDateView":{
+ "cellUnits":{
+ "year": "년",
+ "month": "월",
+ "day": "일",
+ "hour": "시",
+ "minute": "분",
+ "second": "초"
+ }
+ },
+ "tmCalendar":{
+ "year": "년",
+ "month": "월",
+ "day": "일",
+ "hour": "시",
+ "minute": "분",
+ "second": "초",
+ "titleCurrentMonth":"{0}년{1}월",
+ "monthCountSelected":"{count}개월",
+ "selectedStatus":"선택됨{count}일 | 날짜 미선택 | 선택됨 | 종료일 미선택",
+ "rangStatus":"시작 | 종료 | 오늘",
+ "tips":"최대선택{count}일",
+ "currentMonthTitle":"이번 달",
+ "week":"월요일 | 화요일 | 수요일 | 목요일 | 금요일 | 토요일 | 일요일"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/local/localLanuage/zh-Hans.json b/src/uni_modules/tm-ui/local/localLanuage/zh-Hans.json
new file mode 100644
index 0000000..fad5c95
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/localLanuage/zh-Hans.json
@@ -0,0 +1,93 @@
+{
+ "tmui32x": {
+ "cancel": "取消",
+ "confirm": "确认",
+ "success": "成功",
+ "fail": "失败",
+ "warn": "警告",
+ "info": "提醒",
+ "clear":"清空",
+ "tmBetweenTime":{
+ "title": "请选择时间",
+ "startText": "开始时间",
+ "endText": "结束时间",
+ "betweenText": "至",
+ "clearText": "清空",
+ "nowText": "今天",
+ "thisWeekText": "本周",
+ "thisMonthText": "本月",
+ "thisYearText": "本年",
+ "thisQuarterText": "本季度"
+ },
+ "tmMore":{
+ "off": "展开更多",
+ "on": "收起更多"
+ },
+ "tmSku":{
+ "buyBtnText": "立即购买",
+ "noSelectedText": "未选择商品",
+ "noStockText": "缺货中",
+ "queHuo": "缺货",
+ "selectedText": "已选择:",
+ "numberText": "数量:{count}",
+ "addText": "加入购物车",
+ "addSuccessText": "加入成功",
+ "originalPriceText": "原价{count}"
+ },
+ "tmNavbar":{
+ "title": "标题"
+ },
+ "tmForm":{
+ "ruleMessage": "请正确认选择/填写"
+ },
+ "cancelText": "取消",
+ "confirmText": "确认",
+ "tmModal":{
+ "title": "标题"
+ },
+ "tmDrawer":{
+ "title": "标题"
+ },
+ "tmUploadPhoto":{
+ "statusText":{
+ "0": "待上传",
+ "1": "上传中",
+ "2": "上传成功",
+ "3": "上传失败",
+ "4": "已取消",
+ "5": "超出大小限制"
+ }
+ },
+ "tmPicker":{
+ "title": "请选择"
+ },
+ "tmPickerDate":{
+ "title": "请选择时间"
+ },
+ "tmDateView":{
+ "cellUnits":{
+ "year": "年",
+ "month": "月",
+ "day": "日",
+ "hour": "时",
+ "minute": "分",
+ "second": "秒"
+ }
+ },
+ "tmCalendar":{
+ "year": "年",
+ "month": "月",
+ "day": "日",
+ "hour": "时",
+ "minute": "分",
+ "second": "秒",
+ "titleCurrentMonth":"{0}年{1}月",
+ "monthCountSelected":"{count}月",
+ "selectedStatus":"已选择{count}日 | 未选择日期 | 已选择 | 未选择结束日期",
+ "rangStatus":"开始 | 结束 | 本日",
+ "tips":"最大选择{count}日",
+ "currentMonthTitle":"本月",
+ "week":"周一 | 周二 | 周三 | 周四 | 周五 | 周六 | 周日"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/local/localLanuage/zh-Hant.json b/src/uni_modules/tm-ui/local/localLanuage/zh-Hant.json
new file mode 100644
index 0000000..f40a877
--- /dev/null
+++ b/src/uni_modules/tm-ui/local/localLanuage/zh-Hant.json
@@ -0,0 +1,93 @@
+{
+ "tmui32x": {
+ "cancel": "取消",
+ "confirm": "確認",
+ "success": "成功",
+ "fail": "失敗",
+ "warn": "警告",
+ "info": "提醒",
+ "clear":"清空",
+ "tmBetweenTime":{
+ "title": "請選擇時間",
+ "startText": "開始時間",
+ "endText": "結束時間",
+ "betweenText": "至",
+ "clearText": "清空",
+ "nowText": "今天",
+ "thisWeekText": "本週",
+ "thisMonthText": "本月",
+ "thisYearText": "本年",
+ "thisQuarterText": "本季度"
+ },
+ "tmMore":{
+ "off": "展開更多",
+ "on": "收起更多"
+ },
+ "tmSku":{
+ "buyBtnText": "立即購買",
+ "noSelectedText": "未選擇商品",
+ "noStockText": "缺貨中",
+ "queHuo": "缺貨",
+ "selectedText": "已選擇:",
+ "numberText": "數量:{count}",
+ "addText": "加入購物車",
+ "addSuccessText": "加入成功",
+ "originalPriceText": "原價{count}"
+ },
+ "tmNavbar":{
+ "title": "標題"
+ },
+ "tmForm":{
+ "ruleMessage": "請正確認選擇/填寫"
+ },
+ "cancelText": "取消",
+ "confirmText": "確認",
+ "tmModal":{
+ "title": "標題"
+ },
+ "tmDrawer":{
+ "title": "標題"
+ },
+ "tmUploadPhoto":{
+ "statusText":{
+ "0": "待上傳",
+ "1": "上傳中",
+ "2": "上傳成功",
+ "3": "上傳失敗",
+ "4": "已取消",
+ "5": "超出大小限制"
+ }
+ },
+ "tmPicker":{
+ "title": "請選擇"
+ },
+ "tmPickerDate":{
+ "title": "請選擇時間"
+ },
+ "tmDateView":{
+ "cellUnits":{
+ "year": "年",
+ "month": "月",
+ "day": "日",
+ "hour": "時",
+ "minute": "分",
+ "second": "秒"
+ }
+ },
+ "tmCalendar":{
+ "year": "年",
+ "month": "月",
+ "day": "日",
+ "hour": "時",
+ "minute": "分",
+ "second": "秒",
+ "titleCurrentMonth":"{0}年{1}月",
+ "monthCountSelected":"{count}月",
+ "selectedStatus":"已選擇{count}日 | 未選擇日期 | 已選擇 | 未選擇結束日期",
+ "rangStatus":"開始 | 結束 | 本日",
+ "tips":"最大選擇{count}日",
+ "currentMonthTitle":"本月",
+ "week":"週一 | 週二 | 週三 | 週四 | 週五 | 週六 | 週日"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/package.json b/src/uni_modules/tm-ui/package.json
index 1d822e9..17561ee 100644
--- a/src/uni_modules/tm-ui/package.json
+++ b/src/uni_modules/tm-ui/package.json
@@ -1,92 +1,100 @@
-{
- "id": "tm-ui",
- "displayName": "tmui3.2.0 vue3 typeScript nvue全平台ui组件库 ",
- "version": "3.2.0",
- "description": "tmui3.0 高性能、高颜值、多主题、暗黑模式vue3 ui组件库,没有比它更完美!",
- "keywords": [
- "ui",
- "vue3",
- "typeScript"
- ],
- "repository": "https://gitee.com/LYTB/tmui-design",
- "engines": {
- "HBuilderX": "^3.6.18"
- },
- "dcloudext": {
- "sale": {
- "regular": {
- "price": "0.00"
- },
- "sourcecode": {
- "price": "0.00"
- }
- },
- "contact": {
- "qq": ""
- },
- "declaration": {
- "ads": "无",
- "data": "无",
- "permissions": "无"
- },
- "npmurl": "https://www.npmjs.com/package/tmui-cli",
- "type": "component-vue"
- },
- "uni_modules": {
- "dependencies": [],
- "encrypt": [],
- "platforms": {
- "cloud": {
- "tcb": "y",
- "aliyun": "y",
- "alipay": "n"
- },
- "client": {
- "Vue": {
- "vue2": "n",
- "vue3": "y"
- },
- "App": {
- "app-vue": "y",
- "app-nvue": "n"
- },
- "H5-mobile": {
- "Safari": {
- "minVersion": "10"
- },
- "Android Browser": {
- "minVersion": "6"
- },
- "微信浏览器(Android)": {
- "minVersion": "8"
- },
- "QQ浏览器(Android)": {
- "minVersion": "10"
- }
- },
- "H5-pc": {
- "Chrome": "y",
- "IE": "n",
- "Edge": "y",
- "Firefox": "y",
- "Safari": "y"
- },
- "小程序": {
- "微信": "y",
- "阿里": "u",
- "百度": "u",
- "字节跳动": "u",
- "QQ": "u",
- "钉钉": "u",
- "快手": "u",
- "飞书": "u",
- "京东": "u"
- },
- "快应用": {
- "华为": "u",
- "联盟": "u"
- }
- }
- }
- }
+{
+ "id": "tm-ui",
+ "displayName": "tmui3.2.0 vue3 ts Ui组件库 ",
+ "version": "3.2.13",
+ "description": "继承了tmui4.0x的设计,全新的脚手架已为您准备好",
+ "keywords": [
+ "ui",
+ "vue3",
+ "typeScript",
+ ""
+ ],
+ "repository": "https://gitee.com/LYTB/tmui-design",
+ "engines": {
+ "HBuilderX": "^3.6.18",
+ "uni-app": "^4.07",
+ "uni-app-x": ""
+ },
+ "dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/tmui-cli",
+ "type": "component-vue",
+ "darkmode": "x",
+ "i18n": "√",
+ "widescreen": "√"
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "√",
+ "aliyun": "√",
+ "alipay": "√"
+ },
+ "client": {
+ "uni-app": {
+ "vue": {
+ "vue2": "x",
+ "vue3": "√"
+ },
+ "web": {
+ "safari": "√",
+ "chrome": "√"
+ },
+ "app": {
+ "vue": "√",
+ "nvue": "x",
+ "android": "√",
+ "ios": "√",
+ "harmony": "√"
+ },
+ "mp": {
+ "weixin": "√",
+ "alipay": "-",
+ "toutiao": "-",
+ "baidu": "-",
+ "kuaishou": "-",
+ "jd": "-",
+ "harmony": "-",
+ "qq": "-",
+ "lark": "-"
+ },
+ "quickapp": {
+ "huawei": "-",
+ "union": "-"
+ }
+ },
+ "uni-app-x": {
+ "web": {
+ "safari": "-",
+ "chrome": "-"
+ },
+ "app": {
+ "android": "-",
+ "ios": "-",
+ "harmony": "-"
+ },
+ "mp": {
+ "weixin": "-"
+ }
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/src/uni_modules/tm-ui/useFun/toolUse.ts b/src/uni_modules/tm-ui/useFun/toolUse.ts
new file mode 100644
index 0000000..e3d4e8b
--- /dev/null
+++ b/src/uni_modules/tm-ui/useFun/toolUse.ts
@@ -0,0 +1,91 @@
+// 存储防抖函数的键值映射
+const debounceKeys = new Map()
+
+/**
+ * 防抖函数
+ * @param key 唯一标识符,用于区分不同的防抖函数
+ * @param func 需要防抖的函数
+ * @param delay 延迟执行的时间(毫秒)
+ * @param immediate 是否立即执行
+ */
+export function debounce(
+ key: string,
+ func: (...args: any[]) => void | Promise,
+ delay: number = 300,
+ immediate: boolean = false
+): void {
+ // 获取或创建该key对应的记录
+ const record = debounceKeys.get(key) || { timer: null, lastArgs: null }
+
+ // 清除之前的定时器
+ if (record.timer !== null) {
+ clearTimeout(record.timer)
+ }
+
+ // 如果需要立即执行
+ if (immediate) {
+ // 如果没有定时器,立即执行
+ if (record.timer === null) {
+ func()
+ }
+ // 设置新的定时器
+ record.timer = setTimeout(() => {
+ record.timer = null
+ }, delay)
+ } else {
+ // 设置新的定时器
+ record.timer = setTimeout(() => {
+ func()
+ record.timer = null
+ }, delay)
+ }
+
+ // 更新映射
+ debounceKeys.set(key, record)
+}
+
+// 存储节流函数的键值映射
+const throttleKeys = new Map()
+
+/**
+ * 节流函数
+ * @param key 唯一标识符,用于区分不同的节流函数
+ * @param func 需要节流的函数
+ * @param delay 执行间隔时间(毫秒)
+ */
+export function throttle(
+ key: string,
+ func: (...args: any[]) => void | Promise,
+ delay: number = 300
+): void {
+ const now = Date.now()
+ // 获取或创建该key对应的记录
+ const record = throttleKeys.get(key) || { timer: null, lastExecTime: 0 }
+
+ // 如果距离上次执行时间不足delay,则不执行
+ if (now - record.lastExecTime < delay) {
+ return
+ }
+
+ // 清除之前的定时器
+ if (record.timer !== null) {
+ clearTimeout(record.timer)
+ }
+
+ // 执行函数
+ func()
+ record.lastExecTime = now
+
+ // 更新映射
+ throttleKeys.set(key, record)
+}
+
+
+export function findParentView(parent: any,name:string): T|null {
+ if (parent == null) return null;
+ if (parent.$parent?.$options?.name == name) return parent.$parent as T;
+ let parents = findParentView(parent.$parent,name);
+ // @ts-ignore
+ if (parents?.$options?.name == name) return parents as T;
+ return null;
+}