no-data 插槽设置没有数据时显示的内容',
+ 'en-US': 'Set what is displayed when there is no data via the no-data slot'
+ },
+ mode: ['pc'],
+ pcDemo: 'slot-nodata'
}
]
},
diff --git a/examples/sites/demos/apis/config-provider.js b/examples/sites/demos/apis/config-provider.js
index baa95059b..51cea1588 100644
--- a/examples/sites/demos/apis/config-provider.js
+++ b/examples/sites/demos/apis/config-provider.js
@@ -21,7 +21,7 @@ export default {
type: "'ltr' | 'rtl'",
defaultValue: 'ltr',
desc: {
- 'zh-CN': '文字排版方向',
+ 'zh-CN': '文字样式方向',
'en-US': 'Text layout direction'
},
mode: ['pc'],
diff --git a/examples/sites/demos/apis/credit-card-form.js b/examples/sites/demos/apis/credit-card-form.js
deleted file mode 100644
index 49738cd1d..000000000
--- a/examples/sites/demos/apis/credit-card-form.js
+++ /dev/null
@@ -1,98 +0,0 @@
-export default {
- mode: ['pc'],
- apis: [
- {
- name: 'credit-card-form',
- type: 'component',
- props: [
- {
- name: 'background-image',
- type: 'string , object',
- defaultValue: '',
- desc: {
- 'zh-CN': '设置卡片的背景图片;',
- 'en-US': 'Set the background image of the card.'
- },
- mode: ['pc'],
- pcDemo: 'background-image'
- },
- {
- name: 'form-data',
- type: 'object',
- defaultValue:
- "// 该属性的默认值为 \n{cardCvv: '', cardName: '', cardYear: '', cardMonth: '', cardNumber: ''}",
- desc: {
- 'zh-CN': '设置信用卡显示数据',
- 'en-US': 'Setting Credit Card Display Data'
- },
- mode: ['pc'],
- pcDemo: 'basic-usage'
- }
- ],
- events: [
- {
- name: 'input-card-cvv',
- defaultValue: '',
- desc: {
- 'zh-CN': '输入 cvv 时触发的事件',
- 'en-US': 'CVV input event triggered'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'input-card-month',
- defaultValue: '',
- desc: {
- 'zh-CN': '选择月时触发的事件',
- 'en-US': 'Event triggered when a month is selected'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'input-card-name',
- defaultValue: '',
- desc: {
- 'zh-CN': '输入卡持有者时触发的事件',
- 'en-US': 'Event triggered when a card holder is entered'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'input-card-number',
- defaultValue: '',
- desc: {
- 'zh-CN': '输入卡号时触发的事件',
- 'en-US': 'Event triggered when a card number is entered'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'input-card-year',
- defaultValue: '',
- desc: {
- 'zh-CN': '选择年时触发的事件',
- 'en-US': 'Event triggered when the year is selected'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'submit',
- defaultValue: '',
- desc: {
- 'zh-CN': '提交时触发的事件',
- 'en-US': 'Event triggered upon submission'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- }
- ],
- methods: [],
- slots: []
- }
- ]
-}
diff --git a/examples/sites/demos/apis/detail-page.js b/examples/sites/demos/apis/detail-page.js
deleted file mode 100644
index 61ea42630..000000000
--- a/examples/sites/demos/apis/detail-page.js
+++ /dev/null
@@ -1,126 +0,0 @@
-export default {
- mode: ['pc'],
- apis: [
- {
- name: 'detail-page',
- type: 'component',
- props: [
- {
- name: 'cancel-button',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗取消按钮的文本,默认为 '取消'",
- 'en-US': "Text of the cancel button in the personalized pop-up window, The default value is'Cancel'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'dialog-title',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗标题,默认为 '个性化标题'",
- 'en-US': "Personalize pop-up title, default is'Personalized title'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'label-title',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗表头文本标题栏字段;默认为 '文本字段'",
- 'en-US': "Personalized pop-up window header text title bar field, The default value is 'Title'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'modelValue / v-model',
- typeAnchorName: 'IDetailPageItem',
- type: 'IDetailPageItem[]',
- defaultValue: '',
- desc: {
- 'zh-CN': '设置表头详情栏的数据',
- 'en-US': 'Set the data in the table header details column'
- },
- mode: ['pc'],
- pcDemo: ''
- },
- {
- name: 'save-button',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗确定按钮的文本,默认为 '确定'",
- 'en-US': "Text of the confirmation button in the personalized pop-up window, The default value is'Confirm'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'text-split',
- type: 'string',
- defaultValue: "'---'",
- desc: {
- 'zh-CN': '详情栏标题分隔符',
- 'en-US': 'Details column title separator'
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'tips',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "提示不能全部隐藏的提示语,默认为 '不能全部隐藏'",
- 'en-US': "Prompt message that cannot be completely hidden, The default value is 'Cannot hide all' "
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'title',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "详情栏标, 默认为 '数据'",
- 'en-US': "Details field, default value is' Data '"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'value-title',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗表头文本操作栏字段,默认为 '勾选隐藏'",
- 'en-US':
- "Personalized pop-up window header text operation column field, The default value is'Click to hide'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- }
- ],
- events: [],
- methods: [],
- slots: []
- }
- ],
- types: [
- {
- name: 'IDetailPageItem',
- type: 'interface',
- code: `interface IDetailPageItem {
- label: string
- value: string
- hidden?: boolean
-}`
- }
- ]
-}
diff --git a/examples/sites/demos/apis/hui.js b/examples/sites/demos/apis/hui.js
new file mode 100644
index 000000000..51672ae79
--- /dev/null
+++ b/examples/sites/demos/apis/hui.js
@@ -0,0 +1,49 @@
+export default {
+ mode: ['pc'],
+ apis: [
+ {
+ name: 'chart',
+ type: 'component',
+ props: [
+ {
+ name: 'options',
+ type: 'object',
+ defaultValue: '--',
+ desc: {
+ 'zh-CN': '图表参数',
+ 'en-US': 'Whether to disable container detection during resize'
+ },
+ mode: ['pc'],
+ pcDemo: 'chart/question#question-base'
+ }
+ ],
+ events: [],
+ methods: [],
+ slots: []
+ }
+ ],
+ types: [
+ {
+ name: 'options',
+ type: 'interface',
+ code: `
+interface options {
+ theme: string // 主题
+ color: array | string // 颜色
+ padding: array // 图表内边距值
+ tipHtml: function // 悬浮提示框内容配置
+ event: object // 图表事件
+ data: array // 图表数据
+ name: string // 图表名称(必填)
+ unit: string // 进度图右侧文本单位
+ barWidth: number // 进度图柱形宽度
+ minWidth: string // 进度图单项数据的最小宽度
+ calibrationValue: number // 进度图标定值
+ label: object // 堆叠进度图图表图元文本样式
+ state: object // 根据状态设置颜色
+ title: object // 进度图图表标题样式
+ text: object // 进度图图表右侧文本样式
+}`
+ }
+ ]
+}
diff --git a/examples/sites/demos/apis/image.js b/examples/sites/demos/apis/image.js
index eb8b943fe..c0881c565 100644
--- a/examples/sites/demos/apis/image.js
+++ b/examples/sites/demos/apis/image.js
@@ -19,7 +19,7 @@ export default {
},
{
name: 'image-size',
- type: 'String',
+ type: 'string',
defaultValue: '',
desc: {
'zh-CN': '设置预览的图片的大小',
@@ -54,7 +54,7 @@ export default {
},
{
name: 'preview-visible',
- type: 'String',
+ type: 'string',
defaultValue: '',
desc: {
'zh-CN': '开启移动端预览大图的功能',
@@ -65,7 +65,7 @@ export default {
},
{
name: 'round',
- type: 'String',
+ type: 'string',
defaultValue: '',
desc: {
'zh-CN': '通过 round 设置是否展示圆形',
@@ -90,7 +90,7 @@ export default {
},
{
name: 'show-hover',
- type: 'String',
+ type: 'string',
defaultValue: '',
desc: {
'zh-CN': '设置预览的图片的悬浮效果',
@@ -101,14 +101,15 @@ export default {
},
{
name: 'show-index',
- type: 'String',
+ type: 'boolean',
defaultValue: '',
desc: {
'zh-CN': '开启图片序列号展示',
'en-US': 'Enable the display of image serial numbers.'
},
- mode: ['mobile-first'],
- mfDemo: 'preview-src-list'
+ mode: ['pc', 'mobile-first'],
+ mfDemo: 'preview-src-list',
+ pcDemo: 'preview'
},
{
name: 'src',
@@ -133,6 +134,18 @@ export default {
mode: ['pc', 'mobile-first'],
pcDemo: '',
mfDemo: ''
+ },
+ {
+ name: 'keep-style',
+ type: 'boolean',
+ defaultValue: '',
+ desc: {
+ 'zh-CN': '保持图片样式属性',
+ 'en-US': 'Preserve Picture Style Properties'
+ },
+ mode: ['pc', 'mobile-first'],
+ pcDemo: 'keep-style',
+ mfDemo: ''
}
],
events: [
@@ -197,6 +210,18 @@ export default {
mode: ['pc', 'mobile-first'],
pcDemo: 'slot',
mfDemo: ''
+ },
+ {
+ name: 'count',
+ type: '',
+ defaultValue: '',
+ desc: {
+ 'zh-CN': '设置图片计数插槽',
+ 'en-US': 'Set Picture Count Slot'
+ },
+ mode: ['pc', 'mobile-first'],
+ pcDemo: 'count-slot',
+ mfDemo: ''
}
]
}
diff --git a/examples/sites/demos/apis/mind-map.js b/examples/sites/demos/apis/mind-map.js
index 48edd6603..0f973574e 100644
--- a/examples/sites/demos/apis/mind-map.js
+++ b/examples/sites/demos/apis/mind-map.js
@@ -7,24 +7,26 @@ export default {
props: [
{
name: 'modelValue',
- type: 'NodeObj',
+ type: 'Object',
defaultValue: '{}',
desc: {
'zh-CN': '默认节点数据',
'en-US': 'Default node data'
},
mode: ['pc'],
- pcDemo: 'basic-usage'
+ pcDemo: 'export-data'
},
{
name: 'options',
- type: 'Options',
+ typeAnchorName: 'IMindMaoOptions',
+ type: 'IMindMaoOptions',
defaultValue: '{contextMenu: false,toolBar: false,nodeMenu: false}',
desc: {
'zh-CN': '配置项',
'en-US': 'options'
},
- mode: ['pc']
+ mode: ['pc'],
+ pcDemo: 'export-data'
}
],
events: [
@@ -57,7 +59,8 @@ export default {
},
{
name: 'expandNode',
- type: 'onExpandNode',
+ typeAnchorName: 'IMindExpandNode',
+ type: 'IMindnExpandNode',
desc: {
'zh-CN': '展开节点时会触发该事件',
'en-US': 'This event will be triggered when expanding a node'
@@ -66,7 +69,8 @@ export default {
},
{
name: 'operation',
- type: 'onOperation',
+ typeAnchorName: 'IMindMapOperation',
+ type: 'IMindMapOperation',
desc: {
'zh-CN': '节点重新计算时, 例如将节点A拖拽到节点B, 使得节点A是节点B的子节点',
'en-US':
@@ -76,7 +80,8 @@ export default {
},
{
name: 'selectNewNode',
- type: 'onSelectNewNode',
+ typeAnchorName: 'IMindMapSelectNewNode',
+ type: 'IMindMapSelectNewNode',
desc: {
'zh-CN': '创建新节点时',
'en-US': 'when create new node'
@@ -85,7 +90,8 @@ export default {
},
{
name: 'selectNode',
- type: 'onSelectNode',
+ typeAnchorName: 'IMindMapSelectNode',
+ type: 'IMindMapSelectNode',
desc: {
'zh-CN': '选择任意一个节点时, 会触发该事件',
'en-US': 'When selecting any node, this event will be triggered'
@@ -94,7 +100,8 @@ export default {
},
{
name: 'selectNodes',
- type: 'onSelectNodes',
+ typeAnchorName: 'IMindMapSelectNodes',
+ type: 'IMindMapSelectNodes',
desc: {
'zh-CN': '选择多个节点的时候会触发该事件',
'en-US': 'When selecting multiple nodes, this event will be triggered'
@@ -103,7 +110,8 @@ export default {
},
{
name: 'unselectNode',
- type: 'onUnselectNode',
+ typeAnchorName: 'IMindMapUnselectNode',
+ type: 'IMindMapUnselectNode',
desc: {
'zh-CN': '取消选择的时候会触发该事件',
'en-US': 'When deselecting, this event will be triggered'
@@ -112,7 +120,8 @@ export default {
},
{
name: 'unselectNodes',
- type: 'onUnselectNode',
+ typeAnchorName: 'IMindMapUnselectNodes',
+ type: 'IMindMapUnselectNodes',
desc: {
'zh-CN': '取消选择多个节点时会触发该事件',
'en-US': 'This event will be triggered when multiple nodes are unselected'
@@ -126,10 +135,10 @@ export default {
],
types: [
{
- name: 'Options',
+ name: 'IMindMaoOptions',
type: 'interface',
code: `
-interface Options {
+interface options {
direction?: number
locale?: string
draggable?: boolean
@@ -152,53 +161,39 @@ interface Options {
`
},
{
- name: 'onOperation',
+ name: 'IMindMapOperation',
type: 'type',
- code: `
-type onOperation = ({render, info}: {render:MindElixirInstance, info: Operation}) => void
-`
+ code: `type onOperation = ({render, info}: {render:MindElixirInstance, info: Operation}) => void`
},
{
- name: 'onSelectNode',
+ name: 'IMindMapSelectNode',
type: 'type',
- code: `
-type onSelectNode = ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}, e?: MouseEvent) => void
-`
+ code: `type onSelectNode = ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}, e?: MouseEvent) => void`
},
{
- name: 'onSelectNewNode',
+ name: 'IMindMapSelectNewNode',
type: 'type',
- code: `
-type selectNewNode: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}) => void
-`
+ code: `type selectNewNode: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}) => void`
},
{
- name: 'onSelectNodes',
+ name: 'IMindMapSelectNodes',
type: 'type',
- code: `
-type selectNodes: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj[]}) => void
-`
+ code: `type selectNodes: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj[]}) => void`
},
{
- name: 'onUnselectNode',
+ name: 'IMindMapUnselectNode',
type: 'type',
- code: `
-type unselectNodes: ({render}: {render: MindElixirInstance}) => void
-`
+ code: `type unselectNodes: ({render}: {render: MindElixirInstance}) => void`
},
{
- name: 'onUnselectNodes',
+ name: 'IMindMapUnselectNodes',
type: 'type',
- code: `
-type unselectNodes: ({render}: {render: MindElixirInstance}) => void
-`
+ code: `type unselectNodes: ({render}: {render: MindElixirInstance}) => void`
},
{
- name: 'onExpandNode',
+ name: 'IMindExpandNode',
type: 'type',
- code: `
-type expandNode: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}) => void
-`
+ code: `type expandNode: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}) => void`
},
{
name: 'NodeObj',
diff --git a/examples/sites/demos/apis/numeric.js b/examples/sites/demos/apis/numeric.js
index 50d844549..06f7a134d 100644
--- a/examples/sites/demos/apis/numeric.js
+++ b/examples/sites/demos/apis/numeric.js
@@ -17,6 +17,18 @@ export default {
pcDemo: 'allow-empty',
mfDemo: ''
},
+ {
+ name: 'empty-value',
+ type: 'any',
+ defaultValue: 'undefined',
+ desc: {
+ 'zh-CN': '设置计数器在可清空下,清空后组件的绑定值',
+ 'en-US': 'Sets the bound value of the cleared component when the counter can be cleared.'
+ },
+ mode: ['pc', 'mobile-first'],
+ pcDemo: 'empty-value',
+ mfDemo: 'empty-value'
+ },
{
name: 'blank',
type: 'string',
diff --git a/examples/sites/demos/apis/popeditor.js b/examples/sites/demos/apis/popeditor.js
index b8b931343..0f5a9a72a 100644
--- a/examples/sites/demos/apis/popeditor.js
+++ b/examples/sites/demos/apis/popeditor.js
@@ -229,7 +229,7 @@ export default {
'en-US': ''
},
mode: ['pc'],
- pcDemo: 'selected-box-op'
+ pcDemo: 'selected-box'
},
{
name: 'show-clear-btn',
diff --git a/examples/sites/demos/apis/roles.js b/examples/sites/demos/apis/roles.js
index a80859471..ef3b96f18 100644
--- a/examples/sites/demos/apis/roles.js
+++ b/examples/sites/demos/apis/roles.js
@@ -16,6 +16,19 @@ export default {
},
mode: ['pc'],
pcDemo: 'fetch-role'
+ },
+ {
+ name: 'popper-append-to-body',
+ type: 'boolean',
+ defaultValue: 'true',
+ desc: {
+ 'zh-CN':
+ '是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)',
+ 'en-US':
+ 'Indicates whether to insert the pop-up box to the body element. If a fault occurs in locating the fault in the dialog box that is displayed, you can set this attribute to false (for details, see the select component).'
+ },
+ mode: ['pc'],
+ pcDemo: 'base'
}
],
events: [
diff --git a/examples/sites/demos/apis/select.js b/examples/sites/demos/apis/select.js
index 74eb99912..40ae04a1e 100644
--- a/examples/sites/demos/apis/select.js
+++ b/examples/sites/demos/apis/select.js
@@ -81,6 +81,15 @@ export default {
pcDemo: 'clearable',
mfDemo: 'clearable'
},
+ {
+ name: 'click-expend',
+ type: 'boolean',
+ defaultValue: 'false',
+ desc: {
+ 'zh-CN': '点击可展开或收起显示不全的选项。仅用于多选',
+ 'en-US': 'Click to expand or collapse options. Only applicable to multiple selections'
+ }
+ },
{
name: 'collapse-tags',
type: 'boolean',
@@ -240,6 +249,18 @@ export default {
pcDemo: 'remote-method',
mfDemo: 'remote-method'
},
+ {
+ name: 'max-visible-rows',
+ type: 'number',
+ defaultValue: '1',
+ desc: {
+ 'zh-CN': '多行默认最大显示行数,超出后选项自动隐藏',
+ 'en-US':
+ 'Default maximum display lines for multiple lines, with automatic hiding option for exceeding lines'
+ },
+ mode: ['pc'],
+ pcDemo: 'collapse-tags'
+ },
{
name: 'modelValue / v-model',
type: 'string | number | Arrayempty-value 属性设置计数器在可清空下,清空后组件的绑定值。默认为 undefined。示例中将清空后组件绑定值改为null',
+ 'en-US':
+ 'You can use the empty-value attribute to set the binding value of the cleared component when the counter can be cleared. The default value is undefined. In the example, the component binding value is changed to null.'
+ },
+ codeFiles: ['empty-value.vue']
+ },
{
demoId: 'about-step',
name: {
diff --git a/examples/sites/demos/mobile/app/alert/basic-usage.spec.ts b/examples/sites/demos/mobile/app/alert/basic-usage.spec.ts
new file mode 100644
index 000000000..ac7d4d550
--- /dev/null
+++ b/examples/sites/demos/mobile/app/alert/basic-usage.spec.ts
@@ -0,0 +1,36 @@
+import { test, expect } from '@playwright/test'
+
+test('基本用法', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#base')
+
+ const alerts = page.locator('.demo-alert-base .tiny-mobile-alert')
+
+ // 背景色与图标色验证
+ await expect(alerts.first()).toHaveCSS('background-color', 'rgb(222, 236, 255)')
+ await expect(alerts.first().locator('.tiny-mobile-alert__icon').first()).toHaveCSS('fill', 'rgb(20, 118, 255)')
+ await expect(alerts.nth(1)).toHaveCSS('background-color', 'rgb(252, 227, 225)')
+ await expect(alerts.nth(1).locator('.tiny-mobile-alert__icon').first()).toHaveCSS('fill', 'rgb(242, 48, 48)')
+ await expect(alerts.nth(2)).toHaveCSS('background-color', 'rgb(230, 242, 213)')
+ await expect(alerts.nth(2).locator('.tiny-mobile-alert__icon').first()).toHaveCSS('fill', 'rgb(92, 179, 0)')
+ await expect(alerts.nth(3)).toHaveCSS('background-color', 'rgb(255, 235, 209)')
+ await expect(alerts.nth(3).locator('.tiny-mobile-alert__icon').first()).toHaveCSS('fill', 'rgb(255, 136, 0)')
+
+ // 警告可见
+ const alertSuccess = page.locator('.tiny-mobile-alert--success')
+ await expect(alertSuccess).toBeVisible()
+
+ // 状态图标存在
+ const icon = alertSuccess.locator('.tiny-mobile-alert__icon').first()
+ await expect(icon).toBeVisible()
+
+ // 提示内容存在
+ const content = alertSuccess.locator('.tiny-mobile-alert__content')
+ await expect(content).toBeVisible()
+
+ // 点击关闭按钮,警告消失
+ const close = alertSuccess.locator('.tiny-mobile-alert__close')
+ await expect(close).toBeVisible()
+ await close.click()
+ await expect(alertSuccess).toBeHidden()
+})
diff --git a/examples/sites/demos/mobile/app/alert/center.spec.ts b/examples/sites/demos/mobile/app/alert/center.spec.ts
new file mode 100644
index 000000000..720a6a6c5
--- /dev/null
+++ b/examples/sites/demos/mobile/app/alert/center.spec.ts
@@ -0,0 +1,11 @@
+import { test, expect } from '@playwright/test'
+
+test('指定挂载节点', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#target')
+
+ const target = page.locator('.alert-wrap')
+ const alert = target.locator('> .tiny-mobile-alert')
+
+ await expect(alert).toBeVisible()
+})
diff --git a/examples/sites/demos/mobile/app/alert/custom-close.spec.ts b/examples/sites/demos/mobile/app/alert/custom-close.spec.ts
new file mode 100644
index 000000000..5d9f12b12
--- /dev/null
+++ b/examples/sites/demos/mobile/app/alert/custom-close.spec.ts
@@ -0,0 +1,45 @@
+import { test, expect } from '@playwright/test'
+
+test.describe('自定义关闭', async (page) => {
+ test('隐藏关闭图标', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#custom-close')
+
+ const alerts = page.locator('.tiny-mobile-alert')
+ const closeIcon = alerts.first().locator('.tiny-mobile-alert__close')
+
+ await expect(closeIcon).not.toBeVisible()
+ })
+
+ test('自动关闭', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#custom-close')
+
+ const alerts = page.locator('.tiny-mobile-alert')
+ await page.locator('#custom-close span').first().click()
+ await expect(alerts.filter({ hasText: '2秒后将自动关闭' })).toBeVisible()
+ await page.waitForTimeout(2000)
+ await expect(alerts.filter({ hasText: '2秒后将自动关闭' })).not.toBeVisible()
+ })
+
+ test('自定义关闭按钮文本', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#custom-close')
+
+ const alert = page.locator('.tiny-mobile-alert').nth(2)
+ const closeIcon = alert.locator('.tiny-mobile-alert__close')
+
+ await expect(closeIcon).not.toBeVisible()
+ await expect(alert.locator('span').filter({ hasText: '自定义关闭' })).toBeVisible()
+ })
+
+ test('关闭close事件', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#custom-close')
+
+ const alert = page.locator('.tiny-mobile-alert').nth(3)
+ const toast = page.locator('.tiny-mobile-toast').filter({ hasText: 'close事件!' })
+ await alert.locator('.tiny-mobile-alert__close').click()
+ await expect(toast).toBeVisible()
+ })
+})
diff --git a/examples/sites/demos/mobile/app/alert/custom-close.vue b/examples/sites/demos/mobile/app/alert/custom-close.vue
index f8fe84042..70fb23243 100644
--- a/examples/sites/demos/mobile/app/alert/custom-close.vue
+++ b/examples/sites/demos/mobile/app/alert/custom-close.vue
@@ -19,7 +19,7 @@
diff --git a/examples/sites/demos/pc/app/calendar-view/calendar-event.spec.ts b/examples/sites/demos/pc/app/calendar-view/calendar-event.spec.ts
index d90023105..6496b8764 100644
--- a/examples/sites/demos/pc/app/calendar-view/calendar-event.spec.ts
+++ b/examples/sites/demos/pc/app/calendar-view/calendar-event.spec.ts
@@ -9,6 +9,8 @@ test('事件', async ({ page }) => {
const month6 = page.getByText('六月')
const leftSvg = page.locator('.header-left > .tiny-svg')
const rightSvg = page.locator('.header-right > .tiny-svg')
+ const mode = page.locator('label').nth(2)
+ const modalVal = page.getByText('模式切换事件: timeline')
await timeBtn.click()
await page.waitForTimeout(100)
await leftYear.click()
@@ -22,4 +24,7 @@ test('事件', async ({ page }) => {
await rightSvg.click()
await page.waitForTimeout(100)
await expect(timeInput).toHaveText('2022 年 06 月')
+ await mode.click()
+ await page.waitForTimeout(100)
+ await expect(modalVal).toBeVisible()
})
diff --git a/examples/sites/demos/pc/app/calendar-view/calendar-event.vue b/examples/sites/demos/pc/app/calendar-view/calendar-event.vue
index c8a72f54d..fab264e98 100644
--- a/examples/sites/demos/pc/app/calendar-view/calendar-event.vue
+++ b/examples/sites/demos/pc/app/calendar-view/calendar-event.vue
@@ -8,12 +8,13 @@
@week-change="weekChange"
@year-change="yearChange"
@month-change="monthChange"
+ @mode-change="modeChange"
>
+
+
diff --git a/examples/sites/demos/pc/app/cascader/slot.spec.ts b/examples/sites/demos/pc/app/cascader/slot.spec.ts
new file mode 100644
index 000000000..2494c68be
--- /dev/null
+++ b/examples/sites/demos/pc/app/cascader/slot.spec.ts
@@ -0,0 +1,16 @@
+import { test, expect } from '@playwright/test'
+
+test('基本用法', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('cascader#slot')
+
+ // 自定义节点
+ await page.getByRole('textbox', { name: '请选择' }).nth(0).click()
+ await expect(page.getByText('指南', { exact: true })).toHaveAttribute('title', '指南')
+ await page.waitForTimeout(100)
+
+ // 无数据
+ await page.getByRole('textbox', { name: '请选择' }).nth(1).click()
+ const cascader = page.locator('.tiny-cascader-menu__no-data')
+ await expect(cascader).toHaveText('no-data')
+})
diff --git a/examples/sites/demos/pc/app/cascader/slot.vue b/examples/sites/demos/pc/app/cascader/slot.vue
new file mode 100644
index 000000000..1fc4b1d62
--- /dev/null
+++ b/examples/sites/demos/pc/app/cascader/slot.vue
@@ -0,0 +1,234 @@
+
+ \n Cascader cascade selector events include: change, expand-change, blur, focus, < code>visible-change. \n Use props.emitPath to set the return type of the node.\n
default 插槽,自定义级联节点。no-data 插槽设置没有数据时显示的内容。
+ `,
+ 'en-US': `
+ Use the default slot to customize the cascaded node.no-data slot sets what is displayed when there is no data.
+ `
+ },
+ codeFiles: ['slot.vue']
}
]
}
diff --git a/examples/sites/demos/pc/app/chart/amap/amap.spec.ts b/examples/sites/demos/pc/app/chart/amap/amap.spec.ts
new file mode 100644
index 000000000..3e956a1bc
--- /dev/null
+++ b/examples/sites/demos/pc/app/chart/amap/amap.spec.ts
@@ -0,0 +1,6 @@
+import { test } from '@playwright/test'
+
+test('base', async ({ page }) => {
+ await page.goto('chart-autonavi-map')
+ const chart = page.locator('#amap-base .amap-layers')
+})
diff --git a/examples/sites/demos/pc/app/chart/amap/amap.spec.ts-snapshots/base-chromium-win32.png b/examples/sites/demos/pc/app/chart/amap/amap.spec.ts-snapshots/base-chromium-win32.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fa57b3da95e5ae564f8305f7ca0512633d97318
GIT binary patch
literal 174152
zcmXtgWl$V#*EDVcvS^Ut9w4|oEbeZ>-Q6v?JHg#GI0O&w?jGFT{hRyw>iw~^Q?paM
zHJ6;zr@POFE69nXAmJfFKtP~KN`RFhAfWmnARyxr;D9TJ??qa`8>EwxxG==;iLXZx
z5X2CYU?COv%+n4x@2`6;?{8UkvM%a%g}&3ZAQ33aAWY7;hJGmcx+qO|6Y_J>vy~S({^KnYDDAFBG z`3;N}Z7qErb{v6%2XGnc4yRooUwsbSl}Ng*GEN!;p;a$TKo?(qNPy&%=n$dv{j5FR zn1zpixZ@L`HH)c;uPI;?^}jd~*a?BemA9E9|M_6{l-F}OXus?Cv;O$FsJaLxcb%>B zzJF3GJ_us+7v4R7PZKP~9v=$JdIE)upIDynS;Ql8dT`vo*&3FU`QkO)dLai*86&m| zRxX^wr4+2qMxl$ZC9Y-?)>5&!Od?W2MRkH22yFBuuu|lqrrX2m^gqnfHW+(;F;HO2 z4c&MiJbQ>$9ycXPElC(Ca1uM%U~>__uJ9g8)MF#-d)d6KzgDAgcFP$?C!~Rj2dbGE zPD|v$+0HVXHQ)|Ne(l5gbU%%T>_L1v+P;DSsZcUpd0KXf6(*asHQr+61$}G_jAf|7 zSTI3jq|9ytZOB!DnH%=bz7P#>xi+aC^bQr;Qc=eUp zpwg@7R0e!fH&f18E* %4!e>uxFACQvU#Sh(-As%q*^%ism2}0{QisDAPwS2#NBiwuKDcKjA z>bXCkq*DGOgXc$&YrW^DEJkZS`&}5tdO?E+Zc^0WOM=E^^SCP6_R<2-seJ5;sVZ(6 z0e;`FK1-AWNS@XGtP5an9hH0P?m zxX(w{f{iJM zusWZ8dHqQ9jCgi6_!(f(@V8$z=hX(HDiX|V9}r}c^ryATm;R-NnS-5G#_oS}O+}*G zAn-%UN1N!77j5iY$xSM!Y^+9(pbmn&JqidE9&DJ9#8_Q4QMdEose|h`G$ySwRhzS1 zX93Hnx d4OFQOXt z%g#SlvYa7Ki=m%~?(oSYxT8<9zicccZY)Di_C|7}`8R~yj0{x}o`SqmQnEQPFt9kZ z1ewevGm9xelcK0e*GO=fa|ab7Pf*>d(OD6!lH#LC@(?j{>#U}bu1HsXS|8eLLy!I* zLqNU^Pn#wtob1n(7e(Was)a{61|lMgYTo+5aXZ9=7iPYwt3;nw!~h+Kz>lA`m&?O? zV?vdn>j{g{${PJWL2HHX7*~VB=_bwQCOuK7LRTh7`p2tZ^RSS5gu+)qSP@kJ }#rv-PXrjEX6L~kO>v0XTnU3^1AGHe-dGI|^iMU9M!ZW5s zPgq}L;XH!dV%F#d YMULzXe&O5efG!PF!xTdk$zgNT)4qCj0n&3`2Z zq0b)OY{tg~=#EN&ZB>cXrg=gdpyZ9`(nmP*9Im;3nO*bzQjPPInuW`_wx*JA1I^FE zrGYCIj%@PPtF2_)JR&=GMu;Xa9$?y{n6cbneS?_*3Nb5pdAV~p-`LiPOk>4PrRG3~ zhY0o3T^+s@(u7U7B{W$w7gQcAH6DZlgn0pzVOz*T!~`^e3NPKx@y$R+N-+@8!BTOY z8mI;P*KByI_s6g8$=LDUO~*?t& M<-UykFD#-SGIuwtp~IzEtyRdIhpY R z4Y`RaD^&bnFF>AeN54Wfd7^1_>!Ueahh5yY#hG?wg*AHlOf->#IR|u=nn#EOVQf z`k|020~3OdyhqclomV9R+$2)}wXwYVgz?M)mldc}zgg}h#fuO62y07!`w1HlCFz;_ z)J`~lw=umqFMWX<&2}EO%|91pB|ExEG9-be>XcSDUp4WF-pvRbA~t!kz&~=DW@lmG z?5W2BXT*|~={>f4?R5YQqEFwdW>0eLMnqwW7%Rgk5+#|0RI2Jo(t6 af`5VQaY#UbV}w@Y~_ za@SSsl5Tz 4wT>wuddU80xMWS;ez~iNw=n#w%-hI7Kq`a KKnc^}JoH25R0`j2@kY!son?mnDk_jcZIUv`|M#xXF8{*P#cm zgjgS(&Bb~1>F{M=-QS&8elQCm?l%J3J&*IfXczR8G|u+qZ8EVyCEJqfIZHDbW6v#q zskmX>Kx(`ajY-sq$?Ezdiqs Po^@l%FA$C@ PF3ECp6qxg4bl|+TBu$p>Bkb;5wAnqMTlP4MB)>B}nhCw@*E40p~!$ zUgQWXwUJyz$BUFnBm^~_DC$35%uSx-e5R-9`YB+w|LgwaXs#roZy% zbrg&V5Wa;a47KN_*{(-E|3;Zzkw!3J3WNb0$E)KVQl*v!c0M^({f5i_nH{`!TK>cS z5)deRVUn?hSLw8Oom@qz+MJ{SpTg(|?#yO3Pb0}rd3f*p>n|{KDrH#bQS#J&y&&x@ z`Eq#_gQUr(m9R}xS2S(}bM;~S>m2@q)pDtem1R-v2@w(9<8D*3j5lv*2d`W%OHL&v z{`gqULz93={%;7IaiYSx3Hw+hWhQ*BFzHZGK0&g{{KR&9YGH*kquf)wdLa~eseESy z&pLw;c|Q*IEgah-wv~y)EhpsPxk!SC?oIdAhLP=B14IvXd?H@ezP;;B&!CVU2lhRy zcz}vYX0vq{`E-vEB)sv%Aw7qHq5m3{`V%+H!N#uTuo)aBJe$rhCDFjRTk1g+MKO#6 zxJu6$UB&$Hvb*`l#B5*TnLK%eIUO~Dcb+8ACecvss~~u+vZD`(z?L@#0KB;NH}6u2 zOV#__e0ZHsGi;ChsIvv8%I(SQYoN0{?J}Im(;FZ1%wO@Ju+eB*m<~7;t!ay nfR|z0ue6qd4lBrd@b#-!fber1!!s^stxFJ|7 zB*h9|A_^;tAhBV6a7-=0K6M0^p29=(Awu%Uq4u2?wuLkwz)LI2mDj(ucl>QYZyR80 zH({j<{_65n2h e>-7R%gGNc5?`(bvbbriU zB zH`&{?>Ng_<^}K){w#i~%+4SYtU>+ev;zI4)K0InybC6kHQSdYqGWk($1-o@OWf^aa zP(~h%^RSd7k4P7Xc@+CXpHWwE2L^_OFY#6{3%#w`$yBaa9^MgHFe+)BuPnE%XU<>4 zIJ&z{*K;B6tPBAzamjH9F{JLwt&O)rbMO42wX(W>JeZ}K!US3<*n~}tF A8K>J-qKW%?ii#Q9Zbk$v6qmS3GjK+XRbtF=MG*CxW*1 zTF++I_4@`(#nG-Od>LgQMBI8E%GOFZfDJxZZ|Dpl2Zky~qCdj(3K%A`l|!a7kd3W@ zUT~m{X0zGI@_+|^FGw-DVNT*J0xrDH5N0PCj8X$P!pP%0bx~$@W&7-P+6Jq6UNFV# zquHFf$#`)9zAT%BCA8KPCCd2+RusM*n&;Z!Uy)a`>|GK=Hl0s@I0-ATO{p|Vs0S#Z zmx!|6!I+ft=U6h^(TylAdlc}{J1z|7wZ3r(muuU)gid3~iu~{;4e>&UfxUFf4Yk twcJ%`QX91YPRsuTzXoiOw1YMOfVI9})SzW8*-L~%qf$sgi)&3ny zIcSTM +tk4`hD37}ZtWybK>eg@1g@q0~Ob|L}4bUwGLW)$Z!MU?A}!7>nk z!}gb?7Pe0)lv1vZQuK1uQn0$RBUO`BV~4%v-wquA@-ju;mVs#Y8Z>b#ET^4xjVO!e zGx5I>*q-#(C(~{ Bq`Ik6su(mk3+Df z>5L;7tK(Z*d=*t=E|%ai=4?pP5p6dR{P56Kf13)+2wENXg$?iq8X?}k)v0cM?7%63 zs>_J2KW0nuOdn~tRMcH~#A0eZ1{R?lM_mv0x4dICi7K>7GQDL+x%slA*lSi6$jRlt zN9&o06LijEC0=;Yc4Z87$M+0Eb`J|FC4ft;fOWcgo_|Jyla#fA$OC!QYStURnGYQ@ zV=E4xU;B21{^J#(O3oslw_9RW7n3&Wm9%56Q7ocHTlk@PT9TFcgv*X1oZ751u9|&d zB6@v^9d+DAI HZSu!epIWQ0(}UU75@&NG(*!W4bl_*m{7>a(uG(4b*W~Ql-VRE0pte6Q4&=ck zQ2v>pvj9;jeo+r5S@ezn#(k|wKVs|`>d>T|){jnkKA%FPq|; zo)Y=y@-U~{wiB<|$y#|VRNmSo5_4>>8ZG9>k__NPOrs#n^4q(;l|O z@PCW&eGg|gSYz2Cj#*&F5pp8VPwci#x%lJb-&|&V>9e~LC|frFOSJ_$x3VRdtcu-G z_~`V;bAo>~Iy5SEe}ZzuqYo^|NTp`GS&nXsIHw*MS0og6=55?aX^QBX2Bz|D7i$H9 zZ(lX(vefO>e}w@A)THqhn9xKKqBO7bCUc%hTz{p_s8?ww0|!pdw$@M6$NQOurOQW1 zK4<&+THgcG%~hPFUh7H7UIdhE2)8Y;KqTmXCvD^U9%d1o2q!TPjFks?5GlYZTcB#+ z`?K=~mp?KPeGgA-g5&N@d89~t*Ys~RPW+>-wA$Yvkp;Jo!ge9%4uAkjHdD*6{_FtR zvRYvL%)Zv296psn_+ZfXWH dW5F62sZ?CO;3iriV4p3&c z>d_7m#&kxv^#5ZOI*eF{bSG|)6#rYpPk#Y0VUQ^iNmu@2GZK1MM6i2b{!Drer4Z&G z`Eega9o)xr)5M6^0CuZIOB}NJ>n&78&NZ06^j?>Lyc$=Z_;wl%9(4rQXx~Q3+s#?x zybdEeY}lJe$5D*wh-ZSna*0z=!a?4qh3|ESsC@sB#Vc~94Qxyv0^;*-R{Z}ll&63n z=f1IWtdp@pTyaXE9U`A|>5MTf?j2c;VG(scO2}!}4Q6Y{(0N|Qv$2JZr Ba9poqu1%J*9suoMP2b%^hIp?2Zw?eXkC~ZG zQ2?rqI$<|Faw5~ AqYOry9#U*aU}fPx6seD2-zNXhCGFTQyX*=i;AgTqMQI z^D`n#ZAz0rtC&VMN2JK{*?n#!OxVosrUV09j3bh Ek-^LJ1O gs*K9yc&~4(01kk{%bBvd=JXL-~$f?0ynJp +p2_393P)i)S$lpHQAhJy`7KA&NYLd4U26)b+ zB*WNa!xu@4kk5;ctGdHQRO8$H;a-UPtGeQI?=3IPEy1WcHXosVa7k7INaI53 SFS1;XKqYEOqg3nq}NV6>wnxaourxWL}xaR^&Z-i~a*bg;T0#kq~N6~C$r2luak z89W7f<;Kmj|9KWenqW&+oX8-4%B7i{gh3augM~<*tsTjFAMkeOviJLfmXm5G=W`Ss zn@i5>4HO$1>4nWKP5@)|Py;xT$QetQi?glO*j9hBBy(!J9n~{5r#8I7cuGfTvMn^u z+TXKcd9v9(fYaLJ%bF&mc 58os{T(540%Vajp-V{r zv= uhWS+P-)W=YLgokV>zm@4DkpXhyRIIS%cEG_#cV*Gk{$o~%9 zA2E?9;igY56Z~Mcke!EE9oJ&L`Fa-ji-&RKbLY&yfBkihgRCFBc%D*e)tFG(KN1H@ zFXRC%u3207y$cCV@LjonB2NxW#rLFe>F43TYdreDzX0Mv%GqU1l8HE_wKS~?J9cRp z7dp%}dRDvS9!`Xu!vZzO4!bn*3x{}7pz fEn2aQ&E(;*#6Z0+;}JAy^KT_o4W!>uXW{u+(EdUYvEsFm^$+{S@ds5ZuQTqs z*_HIwmaMi3h5SP%Yayz&o&LtTnp;ynVr0ACs*#Dq_B{5gHAL9A`@^8;a=l8~ n542F;UyYLgP_x&11}&d^M&YBS>JgqzuPFiwms z`7fj5%Vktln?W54z`4&BMzVISCMB& b4=m2 z;cHRoiE~yxd-zBlD4gDuu}~;7xUcYEKWyXW7?ui(muEEkbLl{`K!=#URa3@@cX#Qi z`pPGe`{Ow$;8*bBIi;BRLOd1*qSg__x~XvCEf~rGi4Vz%TKNT%z504^EH|vj7ys=1 zL{t{^+af|8dkvt>P{W9%h-9Ebq&$D2iN9!15u=%hEx>^vCLjKZY#<4^Q33jApgH>Z z9Z&mw0&t^1HKKw4OCbl^P!`>hQt3gZU;k8l#T{R8BHqRWTA1JajkjL|L5kD!t%n(> zl*sHL1{x)tW~$bS$lP%kQ0!NCFaf_Z$-do~pgg5`RO-rv{~p$?swQXy5Yepx?fk`c zu7*h?qr*{26Vg^kFkkLO6r1t&?RT?@)V{f323@j_T?~0XsO@oP|Kxca%{>Z46@5`N zdhgzdMgVLB$Y8ojYQO4`x4gjJ9*op7O4er;p${G~lWYjKuIvGBZG^^e-X;si1@td~ zs|cue|Ji$zH5 +l#S!#Bil&mUdX-j%hmktFf0HWwSytjWI(tYszWAz%b@7>>5 z)(}hhPO62u5ULf8)+?m33&JH8b~4L}nR}UW9OWD9AF+E6q~5{`k6-?Q6@Y;RhyV_{ z8O5>Ne@@y>q(`JKq==3)H@0a7p#1?wMF&`hib*6c5~zRJPXyZoFw6v~hzubbl6x(2 z^P7}LsF1HY5X{}TmP};`H@3NGm23b~8B)w+VIk5Hb8dID>mI&xLoL-$z83^La2n`W zPA((0A2gE^5Zt0xA713*v~Bz>*vZd-qDu-&B^!X~*;CU`EdnK5;E(UOl`m*gao!Id z@~raas(WR7c`wWvr1dO9(=f(Gzrbxj4Jg<_b&T)Xt$uw$zN}B4c`Zkhv@Em*_Y$8{ zb>DA{IA}!Y9?3h3(}+HVB@rzL7za%ZdKI2kqVH&~r|FrnJq^(Lm#d|5f|z4Bg*AQ1 zfVRVgFGo{A`E6YzUR%Q+=sO$HoyD&C1htTN)vQoVOS59cj4MN3Bvyg9)t9zw?CAaa zOS4k2HI}uZGxRzHMae8p35bl9S3pnxq~eE!oIi4GeNWa`6~9JvM|SXRC_h)?eMXhK zz@KN#d^s76h#IuW1l_Gt# 19-OHxsGf<<;8*%IW2zmtEnZzu3rA<1|2MzI3V(-$%pVeVQ_+5oqg^sGII!F_JCTj5;+_Ad{z;vNN_cna(87rOo+ zDK^yyoXS-C(9$>)KLbpcX#}3F>L#~#Q-|77KPSv~JXQr!n&@kH6ss#jWRE*Ta5r5t zv4!-5!VY~$;|5VAAtqpu$Tz!_Dnq?7&Y!Ed(lfOC(LP!3yKO<^Q)|rN;<=zX?xQQY zd{>?tf*)+)h8)^}zmi)x{l`b_il(v(raP_gD;j}AwzRh=|7-((A5XDDl^qik?(B?w z8_{IdjMs;=Mwus~k^^?cr5?mUOhZ8 JCPa2Rox^zmipR4J^L}}I}i>b94#6J9Cr1WnujStPSGmeD5F5gMt~f* zoW{Q(rH)9Y1Z+(W)i6gbs|%tk+E9xL8ZcdpopJufa7X{4OuC{Ic-zq}tu)Tu7RtPc z%(lV`VCt^g`9n$91C`O0i)tOcAH4p0Mj$Bna*=kQ1p0^>xBb^QX2P8^jNj>VBeWbK z_{iI8 9TD>dN@OD6Fq@xy+JW=+&_fD GcbnW4X&3>PIP8)L%n^x+P!ey{ISot?n?z<7fWjp|J{ zb-r)UJC?V7GjaZVC6|G5;lAHw*z>x^+_~TWB{eluwsU_+n4*qi-^!aw&h_^l!yw>Z zVX65sliwDZHHPF39V(a+s@ A_aA|~*j`2byZ)Q@fJtRKCkI(UJN(Zz32 zLIh=W3{)5%Z{zzy8&i0nNs?uyx|_>g{YI1b`g)sRjOFqJ?CoIu+$~gt0@wjyHtUjd zq7l6}V14-ADt3&0SVkLZM?Y*<%h%By2LI`(LTh_5*`4|icR;cuU+2XApW*h)ezQHV z71aV{q03cL?kYsWFFxE#Cm7K1ML>hq<2mLtTlp$twv)E@=+`(4eyP_(W%aNGP|UUF zu ka4m@j#6OK6XpK6csWFMqH>j{O^2vs7M;pYY>N@fGya5GJxY2k`KXy zZ VhRnXfGgXp~Zht(L<#uwZz{HoLYL`r4&gqFD%j6|{( zvnaGLxYFxsbZ;|ht|~7o?7){*fsi?s+mQy>TH^<=Tpn8kq*d+wicynzbLVS?q2el= z <~;Mwy-tAbXl>r$v0RS5Uw`DqgTkU5i0-{n*G5$*;!?E zerb2G0+n)TUqe*l8do21){ZySdrHVQV<4q}kZAx({{VAgQioax81it=^X1gAfZvXj zrgQfyH0zvbf3v6TIwVy`M?e*xCB(za*){ccy!s{x(^3tsJHW2ivT5WHQq1>5uX?&; zMGK&X3aX`QW%rY|^@o=Y{KwS5*Bb|pX#hDGi?};wZ8#7<&iK}HV)$b;)izLA b z$v?&E@Iej(@)BuaJONpg#dYSEaJ@bC$;cm9(GqW6L1#QZ49j&^-IF9ofu;>nRuQaL zzbOIG%Xx6q1QkB<1lQ0BA_gu_fUbE`mAWJgb^b1MSImbIN gOhSm2)>tdNx3CSb1N@j 4W?P0&lZp7JG}ZDsy^WpDiPyP z0GV Ur}4g}#}_-8A6=y1{%T{9DCwa; U^kw0u!Sk#sNPj9uBdfJGVYVgX52 EZfMBY6Btxd982dP!piqLMas` &}r&7%@e7wPqs^_l6rhCZX!7*-p?Y<7|e@n^K9{&-AqXD9@=;b_Nke|9@CFz7vY zAe8^zO~Cu YFKLr*FIrUITPee~uu(6~plG`}$^TGZ(WRne3}CV@S7 zTu}hl4&W3clZ12BFsCWeTaxA-MSzN1Gm#VWBwU}iVG^D;^9IPu?h^0mzeA2I@J1Kp zV`?ua0TAhqJ`nmBHKu4GVz5%jzy_2u6Q9xw2u~msi;s1XmcW}^edp&qU*JBy-p` oSIoMP+ z%7zjU_c5i99lAc3DXXPPn? 8Vk-4fs$x=cVfUf6$hILcIoZ2dtNX=#E&x;a??hJWe{bh{SX-5;yS5 zDiohG-H|3L8znKAja`KyE~yU>1}N|YCRLdCbq!-Y@@zGSIU<6I082*=j= PO(p!`3eyUubUE2mI4UDez-q#|C%8H~#~GGuV;79ceCDp5^m z$3b_IRp=p8tft;xu>P2V{y& 4qEIHaE6yY;4=!*xA_HXk**v#>vLEJ+U#t zH_u!3{hG{FDwVmfzPkJLIo<7Uw-f3E1Lm-?bS (ahYc(OgItXnk z>I8|@)F(UgDaD2;^vN2J{e&4$W^-S)IAw^->U>rcIi112NdVaFTAJy@DHOux;A-33 z?8@FJcV_`OZ1B>$w}ZM_Ui7{qI z{d#Hgs9EgyWTWq~;Z(l)M!d1oH<_um-QP7MJe1Ae7d3Nmc$2G?={LW2vC$CBYvq^X z^u8-fnIa+8x|}G1jIrCBlLqQ>2`%-H91%6sW1P3>BbfERLZC3mHS9HJ*1CRe{d`vb zOQMQ!IzR6=&YU^M%uILU`*p43_&I31?E_fZ{2b#a-0Xl0>NsJvxWwoaLnYn%RzQjw zn T(MECP;M+>sj!gMqC)yv>V2wUo;?hxk}5OMiI zKg(bjMa));sfcEJ|J?IaNQ`b7^E9!V+LWhfYdAoPa3z!{3(;<7slx;5#S+wrdKp2E zg{-HE#?JIXSKyp9B)jrK0!F6Cro&t5+I_zSB!3?Q;eRz2U?CI}fsqL;d5CrY+MfBx z+jIL%@ HThEs_?SE zp#}NtbHMu7tc(Q+u?6b={*ego@6$vhdquDo?q^|y8Rel~M@?5nxzAg4S52hH(ZEUn zgIbTTwJ?Q3rhx!ff^IzvrD1$s@vxch;uP6@FxYEYC(B4%9%`1n@xrW^Kn0d68p8L9 z$oMYww*CBkJhR{}yv01qtI|3D5w;&NC4=B30gC)G7fg<~q!06=4ET~UGi8pKf4mB1 zU6^@?=T^E3i1S}`xd4~toXtN3VwR(nHC4i_l_>5f @ zSc0O}w-Bk?h c*1ej0WQK@(7T-px&(#_sp z?(&|GM{i2ipZaa{G6@L3Y_V@rccyi?ProB@3r*A-@cOFCZ*f)LZnia_xN~@_ z(=|dcGOcdS9$4)1P!07cPKeHo<$j8unxx;fF7H+PMWuGExH$V4w|Q+AlFVtmswV97 zxf4K)euom3NUVN&7tQr`q&ms#3vJuhpZH_9BEjJKxlfhtf2DIs^*hCMTv{{4E94T* zVi*D<#Jn5~n+lnT542^CjO$Na+1DH9hA>be@O7%iu71sa(`Vx{7LQ0Lq>`?`H|~3V z`gF{satZ$ceJ837En1A9EhW3I 1@n{lM|2w|w?lA9L*sbTBNWuU auV$9CyEQm%8D zekL@f1UH>zZV#AOpBt9Bz{jcg*X31}gud5h23P6dcR4_#0g`A;=(js`n8A+GFKqaR zQgy1vO=YY#aP{l82{^YilLXv08UM>2xDacx#A+V?Y=O72uZ9Obtpn#p_P|fNY|l?q zux%eVMzE6{&s;zXHe<04LgH^!?78@rI&?Zol>xb?Ck?e5AOG&JPhUa-=O866|H )7-%JOhS7q8K%{0?5sBVtfZ`OX!&>mLDH)yZI##Df*_A`_`NllfWeB2s zhe6!}uL<$CdJF7W`GfnntnekVf&%WodR8OcMJ7vpx?DaNfe3n!6e8-uf70J&KD?mC zELqcNcbsTjz!vt65GUd~nf-ptx-ei;DGm2sIzX7*Sxw_hwvLVmgGNGI`?7HDL`wQR z{!9vxYI}qM86fG!2XbrmRXByHlXxDh9e!aHOSw7ER!hkVn0(0Js1xJqDGHhq#3X(> zhUZoisl;liZUb%U9JwbtoDgGjOhj@SYGw1-7M!qy(wib_p}*JeCJj^vZk~-N3+~-t z^Mf2KM8?N9=`O%uc5C%-aLAegBM$?JlLp8NpIq4bUPL6lZ#?OnuEI3gK5z$RQxqV# z6HWNnz5&cN0}%xo)ERkxB7rOosq1*vhn@%fNrYuuQ_|cptLx8{hO}_w9Yzs3LwH?U zAU{9OhIl1#R3_4Rdc4&49 iecgb04)Y~>&*JuVOY4$qTq>xPVEDeExC%7j!sUh!X|0Op7K#8l_MuceR^$V8{( z?RT?3m~lBCS{Ugd5Qe*3Oto_yOK>F}&93O8k7hc>zKOGs 5U$w9f1`?Rc=3+?y`2~S#3Tu8;K{1SUNvy zkS00a4ThY|64ayW3R*cics=>-A5PbgHGU4t=i7%C1;gZ9-}o6b^!B`CHeWoxc`M#h zxp@A_=C*7<%^%1L@}V=H_GP`j#FEIvjEC&4UR+#Qv!v?_%9Y$zmre=bbHOryBpDJM z 8#IYq-?V9f zC-qwENk!%M=(jtuKbojke_Y#q8A-?dm*HZu)=1N^Dm!6IJr1e6;o6;lOMTp6apz@` z-k=z$toIJ8tmp3|lCQBPb3JJ}%d-khqNQ8rYeT~EVG zG)bHkq+;g2e+D|4?@6w(J|5olG&;fb=jYun{Ez~(Me!3=wWS8>629I>ug3@klm1)* zY4mnJXnyC_n%(OKmKCju&b`nn ~+?E`7{P zS2aKtl*pd~>I)R_l@E5p5bdCFah=zdjgR7BMY#(FcsJcVoW97a!^ zMeykHkd-VZh-rdbbq{s48o9sh?_AmNtk2RMmQk!*zYsw(A_#}GpWZ7;BiT1DGH+9i zXhY<~bD>^5OKM=CR=Ct@2egER @X#2M!zaEB0%i!w`D_{xA$m^78hN^`}ch zJbvu+D@9P=O4-7YEc0v;7O5q}t9?<)C!#6!E#zh `lC6*rxpx805Z2|Vb*`2v9=W~*hJ^dNH5 z?_}AG$cEltc>f`)!<1>0K>(Jzqk**E0UDcYO#9te)ARAI%F^@a*L}85lfn}bEb0LM z6BssBfiBJveN7L&mR_B1l5UUDhV7Q^lBP{X&5BWv!*I cZt!Qf_6lx@c ztTu$s7}pwgQ?6S;U^Xv}6?ICSf|!V5LIleAWF~vccqV(@{{|qfpcp|JU;Z1laqV!4 z)MVK})w6AX= @*|0%Ri6?@p$=i1ukb2S?n z(Wn`ROE4T33xzR`O+r%Vo5Rb!373ZZ&gf3~ KM+EGz>03a!RVy-dOchSGsXKUA{+=CZrw%{`2Cnhw4Bi@pcZu{^L zGNnJ-&Qkag$I#DSn`n1BHTx=#@BI-;&cz~?5LJS~*+yoht831TOJrv9pjCv%5iz0W zLaZBI@637Y`kvs&>F7AP_;eZ%H6d@q=+w$sEdU(q1ff1q2qBR=&EjQ681Q-58}bSY zhzq4kH2nM#DKzoyrb9Am{?|Y BH3)hkkE!^JZElVA}q{v7Nb zsC+L# &3}xO7|A$CeG+?0&4ngUq6?g`2FisxoSP8t~9CCs9&` zD?OkMu@=L^eN}2Pw$eZyJN%982v16MfAZ&2?Yw{kzIZ%|)oBz4qM!?elNrUoc+bQd zJV6q+*zda%gQ$}d>4etiJR`4crV4^jhgW9H_)ixl4x_-;cPt4xj_Xv!898Y}e~M`4 z2RqLBlUeVVA0Io>eQ=U@W(o4ULj^esoj=ilZQY~O37_e8`fdbm@28TcM1Y2hF>uVa zIMNJUepkwaJUtj{1cxc43 H *bCV2eZ$9+97s*XGW|o_{u4Yz{LwwW8_+e>DF<#HGXW#wJfz}$ z1`*v>DIsVwhN}RlGZsv2c#OzKD+eaYnv|M4gcA6Gdfk1Gt)sJMztdYYsJu1SEs*A4 z*E6RChF+}$8sx`}oX6B_xyX?!YxD9eX&4B7B;UickoLM$mW&cNxeb5@VLaRd=EM zufUt|WBB@jnR$TYI@irI?-U+pdbOQgsi*sqn{e5`rzb3l)Dx!&yFyl>FN2U1T i)96Sh^>*v~*flP8A() z0EZ*(Gx}wh)WC|0FpE5UcU@L0@j)ttj`dEY)ReJ54OnB?BPH6L!gGt0aUttP5U*zB z9kR0t)WBx;4F?8%pa=?@j=n8XmRh q8FJh3Qs4?YfH&2BAeYHM-@jU2v)EjbC%)6Vf`LOr7uF*FszlZsT-^KQyGG`6 zZx dkvt(K#L*CO#7iOIwhc0|l3!sNxd#@yX}ZU*yRnLWj{R;k^3nhQW^Sp$-@H;ZRpySmJpB`AzMXo6~+&|O-qntOKH^JjW@cpMEfb=`I z>nS)AEA0dc6I$mkIT1BtWhKB~zsZ?wg+YJp1o(7zYYhOe+P$@f=|d&V$KZR_`5^T> zAmD~z33!Lv)^5r=7!`{OmFlkRJqGNW@qZadc7(B96Th4UN_Ougvtfo9&6ak^!<6U} ze)2*sxvd)go@MOSC0th6ufbcLg3FL3K$hpToU7FJr&buT@CRMO!0<%V=r7TMNjUBO zLiz9(%BbA8F#f^BXd;=V>%`M_ym?e=TtHk4-wDWvCS_$8r|dT`j={TFg|_Qtiv0b+ zqx`j&D@#6{UFbP1av+reHJjI0(GpckO6GC36=5+y8_*;hY9-(HVkgW0$w#R)qH>Fp zg~Ak3mGEF4iT78v89XFcMN#lF7Sm3GhrKs&u`!E}Cb>9~GC*`N{`~QPepl$%F6~f~ zkImTAZxX-Ak_Uru8-SDMj4nJQojB_- !=_%bU`$bI;X|4<4p1jUJE} z@m}F}+sxT;I!)uUoNapW=Sy*}%&GCLW``BHz9Fg-!qFZW$?|iOxHoZWFIY3+!1Ul2 ztFHgpr*pv}wnLL#gyt56soQCyzH5gtc+NaxuGOI%r$`EV3|!{Bf=Qx^!ol03Sq3(5 zU}8S*5HXa rrFiiF{L~&fkVfG8H)Qmu_w3v7njzJHkS$XB^o}5^`FVf z$vXFaRWI8;&q*1np@lMAvnE)kj%3^a#L3WvgADgg-uLnCZEuTVkB~m#L|Kx~GJ;wh zg{Sw47Sr?o`j*0@Motim>TYw)-&>&xKUr=*ap;!>qL2+wb!jHD-0zhqKRUB*V)Qxl zfC8Z8`W@T&or!%oIA4h|TIn7;pS`e)J~5~JkN8w#=__hodO--CADGEY)uf9dVG?_0 z@FRz3&vwPk^JZ~8sy_NO$5Co!^OyyvWqr=YE)?wZUq}&DMCYH {x{gM6yA!8V!;IXG{Q~-ea;@l5}A2abx`& zGIU75b}nHASiJw76thjb>!=xHpln6lja2fopK`;IYBHV$8#L3AzM9QvY2Zy^bg@2` zWwbLI>_FoDScAf5|A5&TkuZpcF_@^5LdU$NH2DC%sFerW`U8uZN8qbZ&RHgx;r`gy z R1fIDB}B#bU9&!kRgSniML519IArha`c6X9!Y6#F(uxbBk1XSB& z{&2Hd{7c>aZMBl8+tE!+xi9T%PIipF|D9Q^T%ednWz`hjr#pMYXf`rA-1)0sRw>e2 z6~?&`R -LC>PIWd~uPNSJ#73GPs)V zvUoLcmqQ_88#>TyV{5e-+NaAZhbkwi3bQkSpHFgwYA2t8KV9YetL~~{i2#hdPGX$# zFoyN{8R#j0n`8#EmtvQb$JG>?Fnx2p8g2*vZSnP6A&>z}{G!pW0xVaf>PE$Ub2=hR zeVC&ScZ;X;>XS+wW(h&u4FrlRTv;mI%4)N(vk!kL<{fOj2|Q&Amv($2M%k<}bbqLT zKtjg>Jg@gpluW$L*ld yC642A9Qni5QT_TaK}`_%ElN)lZjWVr0<>dJG?5M;vg*$`WYIXvk{JEw zqNoaEjU?u9{r2J#h^-TE;_AkrhaXv*A6Z(iu^$pi?hTs4Eg4h!kKVScuu#HF>DO(w zu0$32D>?mCh_xt-jz}6g*U1yKWh7x+LDFFq-ZnEMuco=Mwn8lMm_lZ1X)*1p_;v_~ zkM{>ITX-=V1_(%m(UBoY-WeI2YyWj@yCv}~4}bjQ)Dbp~EF}2^<1a~cjiaE6o`U`h zsFFxUf`?Z@3(kBdJNWt)03>(SqpAT_JNX`5(N#z97iR)$^|<+B3=txzChx7XJW;3@ zF Ps!2*;#Lb~c%bJ(Hg)Ca@<;}EbayVFK-SgNv`-t> z#!TZekkcM*be@lCCrLWn +k|E~pLVpcU p-#Hn!Z`e;GrREAFE22irEAQ;H3b>@!s6n7$_&{Q`oU&||n>1K=3OtcH!n8tg zko2oh+Q~JQ^$=oK$oMsA-d{HMe*ALcx2!x|m4eMOge@O)coNLq+E7~AEDcnPIJIx) zT6Qb+qJd5~{8dN`3v2&=9y8hQ19v-aGnR}Zc?a!_P;Hy3l{on(;OOUw;}SI
IA-u21S`1Yo``wgV)0aVqVkC644r;tPUvS!dz`U_p4Sh?k8rM1+ z0+uY`pmz35IY%lPWx4r$IxA;?LLw1MQVdQe(xt-uM^}9H*~)?=5v-4j`B^tn{yBW~ zg>*DTzZNBlYKHf=MkjVh014|FI~s$_i|rHo&1=1k;b9PrXfu?N_{ 3roZ*uQT zPg4FBJo@vUHs$Jts%FsgZ^afLT`LU|&92SjpGywcO#;(R^-l0A^+K(0Fq>BO&>uM< z!^--%xGAI8C>PQ*&Bms>9>K%OW>3ilDH|SVsN5uo;q-y+&l{jxdR?tvoqD!lJV7m@ zm_;k(${+z^b(@QcMU>*ftZ$d{DPv1)ULJ?ILAulw*(Iv)zAa7;FHAInWQWY^%o0ev zd#xEzjli`DBefICqP;H@)hvo+6Gl<;qT8HZZ&D7rfmO{_GI?(8eN)yU9(p=1%sR$U zQpgvss_Pu7M9D7kHm9&rafrwU8`=;&J$nH&1f2TwujSomZ&WC7S$NX6Ws@jH%b|9i z?wdR kU!m8KPAoxlSlQ^ytmq>dj>*GgRh==bG`zaTaB5FfEd*IKXK z(*!=zHGL67P!Y;Y45VHJ9PIV)^`vm7Y518LSQV1M@Su{Cw+LR%Tlm=317toXr*t12 z*uszQx8;=p!pyx+ykK@lexUB(LiUUnzQ0j;hHM8^LcG`;CPmJwe!V0jm4}WRQPqSx zONbymK`Kj{C0=KX$=mqu1o{{8zD;17uaW$w&c8?d3?FQtSSI`Dcp*EevdP(A^<&>b z08gy+t+06_7kh|hraVJ05?7(fnZPy1ffdf{SFfpj>V5R!Z(~LONDdJkxMS @UA~mkh1&qA|0sc0o+1UIo7IsRJzqryV6Dmfn(7?FfE$SAh6?xny&;v)Su| zZ1VmYYVeZtpq=@V6lm$3GA-^O>0ec{Gk+acn{Wz6BID3}N1BOYD@X7I2`JAI_mIMq zTnB&)6GncAxTfQtEF~FYs&cXB+G!hR3mkXH?4#t^3;>bc;;HZA7u-n fK?p7&lyjaTI;I11za3_ z^<*SK!)tVRE3zDR{ ?)ApjWwdGMigvN4PdCm -PM{UB5{d_hfc s^g z6G;V9lgYtm4Na5ru>s8|roxUAf6jiLU~Mn?p%d<0wRbd4!s6v$V>K|W!%7!-Em0j| ziF)OA#^Xnlkys{cLu$1V4=S{Ucq$yMe)?piF`no*zzmjiyNm->4SB=Af~RjvFl?4c zh1?3 hI8e|O-_Y=!BY&;9fAoXyGJhUH zE`I*E5jdHYlXtV4)kB28t4^zZ+2D5{e4>4S!4`k yxL5N>&*)$9^= zMuJazU0^==gCY =uN^8pvOe6?=IY)Kf_~fW8qb8Ki6mJ+AieTWh&eeT$ zd2?j}HP5){q%8TEsIxJ|uofGBj5-o;amGTr<9G6r5j4fb2}w`i)*JMRa;Rt&GL`A< zt7UjE)S))Hc6y_(Hd3>mm!7OXwvik-Ipnwgq{&>UUHD!B8sbVZx*is9NVX-;qgTbc zp)o+ 7sq lAolNZq#rxX z#V1v?V84=Ek79*S20c*MRm)yof$*OBQJszClegos-2g`bzI=W|@n`~x_tF;O*Qo}+ zlAq}E!}+69P=o9Gjx%oHpozIJy6eZbBbI3(&eHbwNXnR@+gNKnrG}`c?RRCazJ&rh zhRqFL+(a}QR@T7{vls;)T?Q_~0C(9olbLN~jp?5CbSW=?&bPi6dW)iT+*!f7L7^`? zhh+)C=vQQRJ4DYI6^(~jB#KTKqrM69R}W)bZ>+vysMGyF xnBQJil*J_D)&5xdmV!gY1f!H$_eN2MfR*dTMkx$cppnQZ&gr^=z~;ttm)1G9HQ1|>$SZSbtL&3xypeP;&l zJSZ}9GgtY#1h4w1K}17T)a+l!z>KDsu4-=&yz8C^^TddrsA1d7&I+b?%5Ak0aW$!L z2p|H%xOLCgUMsvw8tdkSrnji?HUG0go#I8_ha-}9T^qQQkiyDf^jI%}e}}GUZ}d!K z`{Q@xOTf}lP7Zf)-uq=xuk2C-^Xfy}&g~RTE`k9Un20Evf&o`!PMtLZ^31S>BDi{9 zMU{^*Ymp- %u6#W7xk~ pnCIgP-P%$|D*-B#I}d)X*Sl{*p!_%g1`Uq8EMXA9FoQ% zoM!O-C&^o}f|0~`?dCn)dzM^`K4|rl8NEKvV(^*~3!(EnI0`by+m+<`DbVtu>3qIy z46Xb&Oj~j1taUpFAvr+7j)-!{Vm>FXEt S+bi2izbfDS1#R^(_s+gZE z{=}ypk&qHW6rQ-(O@iL*>C7b&GCp1}u!CD;8Y@;+QEsN+HevY0!@b-fx8-!BvqT+L zqViuf9{)Lf7C^lPG;4O}W$@(n!l|$5>1XEW>hQB5!BaFA=J>B+%aak3&u}ebHZFPi z6C?NgH4#16XeGHLn7Yb^4N!8PIu~~D&Q>jZ*#I}bsFh2~?<7Ff`_4~MWzy!P2lR=k zB1Mu4)Bfd%d#wUJ{2F|-$7}tJAf1BvtJB_UDUDl@F~i4OHJ;<$Yyz)NOXykCTR=~; zp1EZzr(j+~A hZ+qFeH aEq6MY4(gnKexo9_N%pd{LXV?ZWpf!+4G(J1P zMQ8xGX?e>RA4x)<=&H_R$SsUhql5^Zl8aOQ_I_T_s!t94!Uc}O|B6w_@X>F~;Fb;# z)BoMm!|yq8Y&uV7eO4e`iMDu2XEbU*CpPnTDe>~VJW6 b{$8YX_N3A7Lo&VwIyLDw=|3YmGlr5GZLj-B@4ox-OyVILOps=>5V0 zA-Vq?QxGxQyq O|R(=GraH7ccF##XRj9PMJ^Cwyu@d? z7Q@J{r{&`t@w6a2kjR=HgTQ5TFPA(xR^N7qx?OGJm2wdE$YI(_b2ggQx5tu}>S8_w zJ^i*{TvlIVh_C)ZZKjl~a4?6(*MC-(Wij(FM03f &T%z=ssB|l@-HTaRV898yK#BZ)3u^$wh`2Hp`H|5v#r iy6OhFq5v3 O!7hG6^A+Vd_gMZD_)ZQA|5gvN zul9Pt|I(G39}&0Aw6Gy?bM`CaH@?h*6<=szX?4Ox4;WP`$!%Znff;UtIn8`_Z%4pD z(6Rkgtrde~BFX*&fHn!UfS;i4H&RC=nmBmX3Xj#Jm!4+V$Q7V$@HRfIYchtB*ZWlP zg|0v%rkNl)*lb`}Q&W3}26W9vT^8_D#%1Jt{*^{pM`we=phlD*%}>TqjABdPJ1)lb zqd-tLjo7Q)PAF3$YOMdS1S1gAw|5gnE81GWQe}Z=H``bSgm*aWV}{1h(hwskM~Gn7 zp0jrlf)FXXWCJAtw1>9_f?vVx08$qxW|5&yF^0C@YQvua_bV@x4eb*iyEOuss!8?} zcuF8wT>ou7aVH=VEy}wSrL6^U0Ez{3E$qehqk7)udIYKHT*U;vJ=iVF1Z)>fUur`S zG52V$-e_{(DnL0!mc9;Qv?-HLgmES`cUW5mU5zyyN=rmCAzmV1djZhJd!q)W{Gd+? zDko=s=prlYUc&h+>UfZYIH_wt0uG+T3!&~C3%r2e<|E=wf9_c@eBEGr3N%IQ#Pm+7 z*(I=f_akk70TafUv&)kAVBcjx<9zFcr?Q7VS^f4I 7vkf6khZSK%3CXm9WUTn)uRj6KhSz@)6P2dW-U~eo- zwsQZ++20{B7p+ig1TT-^8+xDa{A8B5`tO?J@!z|q2|U3}V&8T@qW}qz7rN~vWs)TV zk!EaQjkYhwMGUkeIqW^TsEDn^qvKkp=7I*3Yu|+a2vKl4;k$pmi}WegRu)$@fP)#? z@iLaF7akC3A&aCm1#^_JnFoSID eE@41b{D_yxma%cA_~G0~ z$z;aw2ukjpPt^?jQ)gBdnX`bbxG40bL=67mf5v#DFY7a7NEaeM-sl*6vmEopn`9r3 z^qnSeII;DAmJ;g4b05U3B+A7nW4aM(j>7V2gwF6m0dGAUIz2piJUaE3ucw*z=)4Kl z-iHiR_M8*k)-M7dK9TS#XXSYEt)hX(1KxrPH1Yz%mXyK*J_7Vzz5$bC$R}>1&7hjw zf3+-7*=qE}rl_Iy!#Dr^hWKA#N5tC7PQOuZCq;Q9Q~r{UyzCq`^-N!Gf|j6C|3wwt zM#CNqw6e8Bb;;W*j(%Z@C@hQ52!yRt`t9OA>*nobr7>?rh%s{QB7(@@t=n`JOjIbq zcO_@Qm|=Ka&bJWb(?DgkPM^B+VAy^lrR=WqK)Bl>L}nN}dp}nOE?hTP$H|Lma?!u? z0eb?VqFny>!7O~lq=@ZlO(b?76MTB5#AJ5z!+;_SiWdoh$d)(q6tzh!4cZL{`Dok_ zo4Kg^$H1QQkE^Tn4=McC^BMF6XD9*147DOPh9nGr@EG3sLsoVd;w{Oy)QV;eKN$v= zM*zWX-u8I;Z6)8Sa8F8w)(&i~>bic3xk9Gg@UoH&5kG;NnC2n@Ufk~~DUOS^7>oOf zA!xX`3&&+R#VP}G3M0Y2*0yDXn%W=PZ_3OFE*kbjS0Fc$e(CKWRu_PfUm1u`Cqz)V zI@mhrxCe{e )|ZPWjY$%okPGV9tyb6DMvde$Hu`m&o?Xn8L4 z=flxyJ6beMhKle5uc?#_|8wu&KVy1n`JbRT^HJ{RMCX>K4Nugp>M!G#A{lVZ{!kWk z*Hfv+(5jl>xLuu%6p@w^b7KA$cvs8RBL;Vz%K}}oAnad!9J^a2{E0qWUEHwwIMH{v zPQmT=+9#ZU?Yi>D=_6HdDX2JwS5P-urD6>gBlIb%xeXP6y)zy2+^W~l5#}}3H1U%l zEKM^>(3LPtrXtzhy}h=j;Ri{guklft`fsfBVqJNR^T}iri9S?Q2c3acXDfx=S>4-j zce{%+F20}4wiDS5VgC2D;b|OXlYypUe r1AG4K(70^+aPkB _c%@+PmX_1jmuI|)Ne#9%_Dx)H{dO?IYTpg5in{cVHXoN_b{G&)lM z9j>tsZ%(Jc_t)SDs7$qYrAo!|^EcC8T|m*O_|K&MCEY3^YKNyTgWmLCM36-Pow`R9 z=+v1;93|8IZ5!=8WybyjyTXQIJE6dDQZN6$S*r~B+bSP|u_bbvB2IkD3tDY|-ha)# zM$r>jdcg4RQrjJ_8Yid8DG#2MHjmQNezVY2;l+V>b8Hts(Ha@0k4B81yc7nil{Z$? zg7i>TjGE761RrCSuoYK<{{;}EKzzkGL%%QPf&EqTq8&_AMJ!(D5o}kMs*Y?+5NkY5 zU*F5Dtc(gGy+kEg!ZymGdpebUG0UIAo$VyOf|@-ZAp!lrIb9iyI<7oCy1#I+cfLU2 zkWg^V3bml-C!?Gm){}8_R@tq2-}gbtu-fp;!!{C1<9Zw1vfVB390tC<#Wg_1r?D&ZZ&IK~)xXhW=8 YwGtlg5`oG z9ic2A_2kY2XLQt5W}wg1pj5`}nb%RF#FQ0`po@;B)m?P_rlU&W2d(l9Tb1xzLx_rA z6r63A7&HPuvQY9wBATIqHW+zXrAG%>LqZ*@V~{X5B!o2M!P2C~a{yi6|9MXB+^$cT zI(8z=N>_2QeX^e!ss&o9MYY^J2C@QoC6{UN+~XF6%m @(&m1WuMHFkRA=s#Y`sX5&Pf#q`i*?%*9hra+1!!xZjS@f)WIxK zF;$_IYwi9d6vMw7%Ppq3+_n%Hb-uWBSNUf*O+lb!4hKnMT}#gbD_%`f8?mKBP~)>@ ztnJv~JE(^A19TnzmkNbt8_XsLU+jdH;an8Vk-A1KN=G +Df{*|co@zW ziF(w&{&;1BX!g_k%Z`v09Vy#onQ9Mr?a>pLf*~5RZ#|zmqIye7APL|6*G`E+;Uno2 zapfTBMiQD43pquc#^OfaJMa{;rt+~K2s|O@Q7O2k?=uIG$p2HGH0z80>B{|ZcwIuv zcedn|4B78@kw}nK^7O0$Cm~c g!oK)!MiPxKqJqhw`R7VU z6Xn~Ex3J7gw;i-*Rp$lz4F`xcT05aX&Lv-mbl)P|)IvNJ7Ygb%uj(O&r5ay9N5Iq< z?cPaPIV=E~Z`7-nnJk{P-}Vx%!;*?`kCeMMaLq(^lsHAKzb$uY!z+0iL%N*56-R3c zPNY9AQ*nMwwm6QSQpkd#hQ@HT<63Ca &WKF0IHMU2gRBRsXYrg>EUN zpm(OLk450FYTrr&NV5NcYZ7E1lHSzv`X%me V2n7}jlO&p)Y+MMUZ0C6KICC{+1Oyd}1N+65c`s<%t11h+VdZ^x{P!AOV{9OE zF#lZ2%0x$i%B3ps9$Vl3UklK7kLy2loS~pwrRn*V@0ggIH5suH-7Y|b6*N?#22|hs zuW(c~oFl5%#)%NqIz*C7$_g6bFdfxa5SxmIVN if7T}8 z0KM#gJUTb&OqFDlP2xlhD7zcM$qv6pl5OqyLpB@!bqUkZ{wHZ6oHRBMI%qt%@Yo80 z8q>j>&K^t+Rk5;7J}qQI6(VF@Oio`Ys$uX}mZ?%N#^v>#zdQs09}ZOrJ!dZY(B=HQ zuJrb=I4F5f0x^q;mx9wD87Y=2uH$^~Q%0n(0M=1Nq_+`D2nU+mHbNxtSWX-G<)Lxd zLM+K7xaPF|ij7#(^?K?bV$CHG5Mu$= gFpTC)0Si!$^uB9iuYa!kSSt% zm^aSg>?_g%LZ-fV#mGYYO>usF>aMZ3<)PYF2k#DA4GvOHUVq)b*}b*A&735wr(Sve z(l=qYlKYGl^iDRsC(@ex%z8&EgM+$v9^PYTfsw6sb@h~yYz95r(hR8g{$|{gZW%4U zF8YI0WE|6OU7pyue8}HSb6RZGNH>8xCRttTT2UaGql=SDUmH{M{unN1DDFDNIw&ZI z09=g!rqD7KdOD}qAdF85rX&4qEQ5A=iFLc%1c~(yu?urL?ewYV0iL;7vQOOE)b+1K z7e$uFY@>V6uWN79B<(+M4Kf%@kyV01@{##r3-KhmDrBicqW*or{6~0(Jqt;Na3Z8w zOD6ZgMuX&q|CP9Q{DLy7?Lf-+lfwc*^P^+a#vzY-N$cP3a2NsMW-o!p(c>e8{0tWc zu*l4`joX4Kq#4!yl-TaD1BC2|cK--bp(IiSGcaVGU;5=k3S|0socZV{8bQ~hf?2N& zWsNiErP`<(V|lToGl2)4ZNIpQzOFo4Ucznc3AFz$)Q$6Eg{T|JB3tMke(-mC1C8Q9 z?q-0#Pd1Qssx#^DHg^ND2k4nKi>qZlb;PQp)flD5cS_JKBwe6q1-4h2@G%-H0ynMm z(#cjhCC+PbF=5+M5ux7j+ny{=P<2(4uc&?yyNX7+&W+?-SE{i``*#Mmk67U2A`DAD z;AM$jI0(p2mJ@t?=olmbOk;5*7m-o?5JOy^&~^03o2X$n^KXW|{nIB!r!67xhGl5f zv^{d<#8cDz8Op%W)-5raA|2Ip8Hje!R9+|0zpb=g+zX&AT#FwE{55wc%`!t((1e;B zXl w5~_{dHMtV|HFr(z`VyqmUpt*jdd_=`7@TFsCB|FZ!?evXbaHy8!vQ z(JxYJJ2Xpa(HnVx;kZ#vGugg0&{s@M`~su)rT(u<+QKXZU;etq{IUB@H>U*_Hj -9F2{26)|o^M4V%YHwh z-8U?gi|uKIfOcezPX9;KJ4Q#^Jzv9_nQ&s;HYT>MiETTX*tR?7#I`-LJ+W<1toOQq z|MyudpSnA%`#R@TovOWeRb{-aYTf&dKtwV9Cq^HRSPZ5_+syadjIJ$&gO@4?LJSe! zp@g@7009HStC{9UNSsIS*T6BH*kA`4DSaFvuSkogd0lXDxJ4Mt@o_#o-S>LK8LEMu zCl>jT9EEERJcJuW#75md_rS&9*}t1qKmkfnBxTkKDjafkRt+-Yy +J(!!+o|o z7K;_$Gl+5z%Y`uZ?GtY0Q`L>PFXLbwi_3$3rGS9M^{)u=W5uQyka(Ar6$b*OYNkO> z;SDD1tfJ3%|DF&NPUJR)lgGAMy9zILX z>d2Tzp}%hf&41g#dCi6G&KUYzcnV7>lmU&!zXoYInmo7EPng640jy ?c*e+r}QRKZ*Px^C3UVUCpJD0)CztRcOWF4m92~WigQ<;F*!M5J^;9ycpkAt>d*2 zjYjo^Z5~iooBcMfaS*c}HT(H`1>yeQtK#!-MRDdsytlHI4k&pbV=}UF8z~|i+0Mv! zv9P)kp#`~EUX4Qo)ZA|UU&admlAHBa@;-_jkvLM2ueRUs2Fuq=l@@?5!IQ$)m=6 !ULZDtv%!W_kiZTG~+O0=o>)DLy2>f)$qh1?P^~LU|iK* zuP~dwJH-D%RHI|6wg}{6nNNEP-5Z8mNYb5oUBpz@0~+8zxA#=1EASts$_$x#f!+hD zes3QzU;xJj<$cKx08`qYA pb>J310qmjJz&-i#=V$V#N;Ri z1 ))LyojiO%kOtn|iI-U5 z=lG|Z6cU}7UDL9y;uhn&7xKH!2)XW{eYDirx*{J>z#SWHNV< f?*`_bT48O6E2a}|JMvw( zC}3iFr%%KPcD`{DchzUt8UKCM^FsmvG7WFu$A6k&SMa3}cD6^98|&Bp|8f S;{P_6)=)Q(i4Y1z$nMem<+Y(^3FiP&{6MMSaU|JI-S}Y z%#vYjR6$}<=5$!go=T~x*eCDj#P3Wss;{Dk0d5V9S}}LbEP`(!LQn7a#>0r7&wI zV(W6ouFelXZTP^p0UU@3K|%7MGgUH-nSr(qyVJ1T(bLC;Nemureem?gcfp5J7%Q4c zJVB;42R8Qqt>!;mw|NzH^!l1+3`#%G-8Jun_O0EKx@elA#jPp^}EZ_nvJ# zOOwxHw{+f5&s|WE6jW%dNKw_7=VjM{<`-Y$ew_az`}t~gGRP`^APQnlu8LZ9tSFLh zghYip9|aM&y??m3n3dIT*Sv$dJ?BEZPdW4WCnu!Hifa)AihY{LOY)}n3?N#S%Hl@f zuKc@u{TH_2fK+SNF 1PK}FonOl@nGsZ+W3m; zpBg?tKcbKALf5tSJ&Yj>tKFFliD0?<%vq)&%`=aki2GTu2)xCUu^7q+46#Ip lvT z3G=?v0PWUa_s5|hkiAV4R#6!}rhh+aBheu&c0W ycIn_(Xcoj2o>ILjG*Tl z=Q#5LqHCl1Oh)FtNP7ch^zyN8B4%S~$4K1IE#JsFC&;@_(?%^8P4`FCr&TS>@(SUb z=F)lHKuPTe(0@$I^ByJYay!b2zTa1Cx;}Koxr`s6y R^Z%=%DiNOO-vsF;DY!P>?L^gwI{#EH-#3 zp!G@cEOh9$5US)b;oGQ~GPL>*Y#^;Cfryi{H#7Ef{iUI@5fT`{upcgtJS?_D#}Z9b zhtcnvfYf5FSSV{TBRM(%SM#B7)|ny5tkG$QIUBqDHt3G4uxrT+BdD`zvTl0T?x9lp z^|yy@KVQqvApH)sLRvVa 6OY<(fm3aV)%6RqrL 84P_OQJ@mCI$#n|BRBpIzF55YrgC2)L(BQXH?W`$u1l1F< @x4vCYzqq#h=nmuIdbX^&X>r(G-K0i`!8fuKr zfho4Y4U$B-DPlDRU4Kha>! jV>#4W)IeQJj9EmwE|A8P7h;w z87ho10fpr%?URq)d(V(@g=N*7#-{=;XC0-2czmX1Y`pX=wi9J6rRfVRQ2(+tPswVe z^V}N-z}dJ>TjV$vfc#QQ%~^FBujh;UNsTb%(bvl#(6N1ANc-!x