cnhis-design-vue 3.3.3-beta.19 → 3.3.3-beta.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +87 -87
  2. package/es/components/base-search/index.d.ts +3 -0
  3. package/es/components/base-search/src/index.vue.d.ts +3 -0
  4. package/es/components/callback/src/components/render/popupMaps.d.ts +13 -0
  5. package/es/components/classification/index.d.ts +56 -6
  6. package/es/components/classification/src/components/search-filter/index.vue.d.ts +56 -6
  7. package/es/components/classification/src/components/set-classification/index.vue.d.ts +56 -6
  8. package/es/components/classification/src/components/table-modal/index.vue.d.ts +0 -3
  9. package/es/components/classification/src/index.vue.d.ts +56 -6
  10. package/es/components/field-editor/index.d.ts +13 -0
  11. package/es/components/field-editor/src/FieldEditor.vue.d.ts +13 -0
  12. package/es/components/field-set/src/FieldColor.vue.d.ts +4 -4
  13. package/es/components/field-set/src/FieldFilter.vue.d.ts +4 -4
  14. package/es/components/field-set/src/FieldSet.vue.d.ts +5 -5
  15. package/es/components/field-set/src/components/table-row.vue.d.ts +4 -4
  16. package/es/components/form-config/index.d.ts +39 -0
  17. package/es/components/form-config/src/FormConfig.vue.d.ts +39 -0
  18. package/es/components/form-config/src/components/FormConfigCreator.vue.d.ts +13 -0
  19. package/es/components/form-config/src/components/FormConfigEdit.vue.d.ts +13 -0
  20. package/es/components/form-config/src/components/FormConfigEventSetting.vue.d.ts +13 -0
  21. package/es/components/form-render/index.d.ts +13 -0
  22. package/es/components/form-render/src/FormRender.vue.d.ts +13 -0
  23. package/es/components/form-render/src/FormRender.vue2.js +4 -0
  24. package/es/components/form-render/src/FormRenderWrapper.vue.d.ts +13 -0
  25. package/es/components/form-render/src/hooks/useBusinessBinding.d.ts +12 -3
  26. package/es/components/form-render/src/hooks/useBusinessBinding.js +7 -7
  27. package/es/components/form-render/src/hooks/useFormContext.js +1 -1
  28. package/es/components/form-render/src/utils/business.d.ts +3 -1
  29. package/es/components/form-render/src/utils/business.js +7 -1
  30. package/es/components/iho-chat/index.d.ts +18 -1
  31. package/es/components/iho-chat/src/Index.vue.d.ts +18 -1
  32. package/es/components/iho-chat/src/components/ChatFooter.vue.d.ts +2 -1
  33. package/es/components/iho-chat/src/components/ChatFooter.vue2.js +14 -9
  34. package/es/components/iho-chat/src/components/ChatHeader.vue2.js +3 -2
  35. package/es/components/iho-chat/src/components/MultipleVideo.vue.d.ts +16 -0
  36. package/es/components/iho-chat/src/components/MultipleVideo.vue2.js +112 -53
  37. package/es/components/iho-chat/src/components/PersonProfile.vue2.js +1 -1
  38. package/es/components/iho-chat/src/hooks/index.d.ts +1 -0
  39. package/es/components/iho-chat/src/hooks/index.js +1 -0
  40. package/es/components/iho-chat/src/hooks/useDraggable.d.ts +25 -0
  41. package/es/components/iho-chat/src/hooks/useDraggable.js +151 -0
  42. package/es/components/iho-chat/style/index.css +1 -1
  43. package/es/components/index.css +1 -1
  44. package/es/components/info-header/index.d.ts +26 -0
  45. package/es/components/info-header/src/InfoHeader.vue.d.ts +26 -0
  46. package/es/components/info-header/src/components/infoDescription/index.vue.d.ts +13 -0
  47. package/es/components/info-header/src/components/patientInfo/index.vue.d.ts +13 -0
  48. package/es/components/quick-search/index.d.ts +2 -0
  49. package/es/components/quick-search/src/index.vue.d.ts +2 -0
  50. package/es/components/select-person/src/SelectPerson.vue2.js +2 -1
  51. package/es/components/shortcut-setter/index.d.ts +13 -0
  52. package/es/components/shortcut-setter/src/ShortcutSetter.vue.d.ts +13 -0
  53. package/es/components/table-filter/src/components/bi-filter/ValueCfg.vue.d.ts +1 -0
  54. package/es/components/table-filter/src/components/bi-filter/components/SelectFilter.vue.d.ts +1 -0
  55. package/es/components/table-filter/src/components/bi-filter/components/index.d.ts +1 -0
  56. package/es/components/table-filter/src/components/bi-filter/index.vue.d.ts +1 -0
  57. package/es/components/table-filter/src/components/classify-filter/ValueCfg.vue.d.ts +54 -6
  58. package/es/components/table-filter/src/components/classify-filter/ValueCfg.vue2.js +26 -10
  59. package/es/components/table-filter/src/components/classify-filter/components/Date.vue.d.ts +17 -2
  60. package/es/components/table-filter/src/components/classify-filter/components/Date.vue2.js +37 -2
  61. package/es/components/table-filter/src/components/classify-filter/components/DateRange.vue.d.ts +18 -2
  62. package/es/components/table-filter/src/components/classify-filter/components/DateRange.vue2.js +44 -1
  63. package/es/components/table-filter/src/components/classify-filter/components/SelectFilter.vue.d.ts +1 -0
  64. package/es/components/table-filter/src/components/classify-filter/components/index.d.ts +36 -4
  65. package/es/components/table-filter/src/components/classify-filter/hooks/useFilterConditions.js +2 -1
  66. package/es/components/table-filter/src/components/classify-filter/index.vue.d.ts +55 -6
  67. package/es/components/table-filter/src/components/classify-filter/index.vue2.js +6 -3
  68. package/es/components/table-filter/src/components/render-widget/components/DateInner.vue.d.ts +1 -1
  69. package/es/components/table-filter/src/components/render-widget/components/DateOut.vue2.js +12 -1
  70. package/es/components/table-filter/src/components/render-widget/components/DateQuickBtn/index.vue.d.ts +1 -1
  71. package/es/components/table-filter/src/components/render-widget/components/DateQuickBtn/index.vue2.js +25 -6
  72. package/es/components/table-filter/src/components/render-widget/components/DateRangeInner.vue.d.ts +1 -1
  73. package/es/components/table-filter/src/components/render-widget/components/DateRangeOut.vue2.js +12 -1
  74. package/es/components/table-filter/src/components/render-widget/components/index.d.ts +2 -2
  75. package/es/components/table-filter/src/components/render-widget/widgetCfgMaps.d.ts +2 -2
  76. package/es/components/table-filter/src/hooks/useAdvanced.d.ts +2 -0
  77. package/es/components/table-filter/src/hooks/useAdvanced.js +20 -3
  78. package/es/components/table-filter/src/hooks/useRenderWidget.js +4 -0
  79. package/es/components/table-filter/src/tool/date.d.ts +3 -0
  80. package/es/components/table-filter/src/tool/date.js +139 -0
  81. package/es/components/table-filter/src/tool/transformData.d.ts +1 -0
  82. package/es/components/table-filter/src/tool/transformData.js +11 -8
  83. package/es/components/table-filter/src/types/enums.d.ts +1 -0
  84. package/es/components/table-filter/src/types/enums.js +2 -1
  85. package/es/components/table-filter/src/types/index.d.ts +12 -0
  86. package/es/env.d.ts +25 -25
  87. package/es/shared/package.json.js +1 -1
  88. package/package.json +2 -2
@@ -0,0 +1,139 @@
1
+ import moment from 'moment';
2
+
3
+ function parseExpressions(expressions, format) {
4
+ if (!expressions || !Array.isArray(expressions)) {
5
+ console.warn("parseExpressions: \u8F93\u5165\u4E0D\u662F\u6570\u7EC4\uFF0C\u8FD4\u56DE\u7A7A\u503C");
6
+ return null;
7
+ }
8
+ return expressions.map((expr, index) => {
9
+ try {
10
+ if (expr === null || expr === void 0 || expr === "") {
11
+ console.warn(`parseExpressions: \u7D22\u5F15 ${index} \u7684\u8868\u8FBE\u5F0F\u4E3A\u7A7A\uFF0C\u8DF3\u8FC7`);
12
+ return null;
13
+ }
14
+ const exprStr = String(expr).trim();
15
+ const dateTimestamp = parseDateString(exprStr);
16
+ if (dateTimestamp !== null) {
17
+ return moment(Math.floor(dateTimestamp)).format(format);
18
+ }
19
+ const result = safeEval(exprStr);
20
+ if (!result)
21
+ return null;
22
+ if (typeof result === "number" && !isNaN(result)) {
23
+ return moment(Math.floor(result)).format(format);
24
+ } else {
25
+ console.warn(`parseExpressions: \u7D22\u5F15 ${index} \u7684\u8868\u8FBE\u5F0F "${exprStr}" \u6267\u884C\u7ED3\u679C\u4E0D\u662F\u6709\u6548\u6570\u5B57`);
26
+ return null;
27
+ }
28
+ } catch (error) {
29
+ console.error(`parseExpressions: \u89E3\u6790\u7D22\u5F15 ${index} \u7684\u8868\u8FBE\u5F0F\u65F6\u51FA\u9519:`, error == null ? void 0 : error.message);
30
+ return null;
31
+ }
32
+ }).filter(Boolean);
33
+ }
34
+ function isEffectiveTime(timestamp) {
35
+ return timestamp >= -22089888e5 && timestamp < 41024448e5;
36
+ }
37
+ function parseDateString(dateStr) {
38
+ if (/^\d+$/.test(dateStr)) {
39
+ const timestamp = parseInt(dateStr, 10);
40
+ return isEffectiveTime(timestamp) ? timestamp : null;
41
+ }
42
+ const datePatterns = [
43
+ /^(\d{4})-(\d{1,2})-(\d{1,2})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})$/,
44
+ /^(\d{4})-(\d{1,2})-(\d{1,2})\s+(\d{1,2}):(\d{1,2})$/,
45
+ /^(\d{4})-(\d{1,2})-(\d{1,2})$/,
46
+ /^(\d{4})-(\d{1,2})$/,
47
+ /^(\d{4})$/,
48
+ /^(\d{1,2}):(\d{1,2}):(\d{1,2})$/,
49
+ /^(\d{1,2}):(\d{1,2})$/
50
+ ];
51
+ for (let i = 0; i < datePatterns.length; i++) {
52
+ const pattern = datePatterns[i];
53
+ const match = dateStr.match(pattern);
54
+ if (match) {
55
+ let year, month, day, hour, minute, second;
56
+ if (i <= 4) {
57
+ year = parseInt(match[1], 10);
58
+ month = match[2] ? parseInt(match[2], 10) : 1;
59
+ day = match[3] ? parseInt(match[3], 10) : 1;
60
+ hour = match[4] ? parseInt(match[4], 10) : 0;
61
+ minute = match[5] ? parseInt(match[5], 10) : 0;
62
+ second = match[6] ? parseInt(match[6], 10) : 0;
63
+ } else {
64
+ const now = new Date();
65
+ year = now.getFullYear();
66
+ month = now.getMonth() + 1;
67
+ day = now.getDate();
68
+ hour = parseInt(match[1], 10);
69
+ minute = parseInt(match[2], 10);
70
+ second = match[3] ? parseInt(match[3], 10) : 0;
71
+ }
72
+ if (year < 1900 || year > 2100 || month < 1 || month > 12 || day < 1 || day > 31 || hour < 0 || hour > 23 || minute < 0 || minute > 59 || second < 0 || second > 59) {
73
+ return null;
74
+ }
75
+ try {
76
+ const date = new Date(year, month - 1, day, hour, minute, second);
77
+ if (date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day) {
78
+ return date.getTime();
79
+ }
80
+ } catch (error) {
81
+ return null;
82
+ }
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+ function safeEval(expression) {
88
+ try {
89
+ const result = new Function("return " + expression)();
90
+ if (typeof result === "number" && !isNaN(result) && isFinite(result)) {
91
+ return isEffectiveTime(result) ? result : null;
92
+ } else {
93
+ console.warn(`safeEval: \u8868\u8FBE\u5F0F "${expression}" \u6267\u884C\u7ED3\u679C\u4E0D\u662F\u6709\u6548\u6570\u5B57`);
94
+ return null;
95
+ }
96
+ } catch (error) {
97
+ console.error(`safeEval: \u8868\u8FBE\u5F0F "${expression}" \u6267\u884C\u5931\u8D25:`, error == null ? void 0 : error.message);
98
+ return null;
99
+ }
100
+ }
101
+ function getTimestamp(list) {
102
+ if (!(list == null ? void 0 : list.length))
103
+ return [];
104
+ return list.map((v) => v === null ? null : new Date(v).getTime());
105
+ }
106
+ const parseDateShortcuts = (row) => {
107
+ const {
108
+ dateShortcuts,
109
+ optionSetting,
110
+ format = "YYYY-MM-DD HH:mm:ss"
111
+ } = row;
112
+ if (!(dateShortcuts == null ? void 0 : dateShortcuts.length))
113
+ return [];
114
+ return dateShortcuts == null ? void 0 : dateShortcuts.map((v) => {
115
+ const {
116
+ name,
117
+ expressions
118
+ } = v;
119
+ if (!name || !(expressions == null ? void 0 : expressions.length))
120
+ return null;
121
+ const resultExp = parseExpressions(expressions, format);
122
+ if (!(resultExp == null ? void 0 : resultExp.length)) {
123
+ return null;
124
+ }
125
+ if (expressions.length !== resultExp.length) {
126
+ console.warn("expressions\u4E2D\u5B58\u5728\u65E0\u6548\u503C");
127
+ return null;
128
+ }
129
+ return {
130
+ name,
131
+ value: JSON.stringify(expressions),
132
+ parseValue: resultExp,
133
+ unit: optionSetting,
134
+ timestamp: getTimestamp(resultExp)
135
+ };
136
+ }).filter(Boolean);
137
+ };
138
+
139
+ export { parseDateShortcuts };
@@ -11,6 +11,7 @@ export declare const transformDataToFront: (dataType: string, rawData?: any[]) =
11
11
  type: any;
12
12
  optionSetting: any;
13
13
  openAdvancedFilter: any;
14
+ dateShortcuts: any;
14
15
  filterOutDisplay: any;
15
16
  filterOutRequired: any;
16
17
  width: any;
@@ -1,9 +1,9 @@
1
- import { DataTypeEnums, WidgetTypeEnums, WidgetOptionEnums } from '../types/enums.js';
1
+ import { DataTypeEnums, WidgetTypeEnums, WidgetOptionEnums, WidgetValEnums } from '../types/enums.js';
2
2
 
3
3
  const transformDataToFront = (dataType, rawData = []) => {
4
4
  if (dataType === DataTypeEnums.API) {
5
5
  return rawData.map((data) => {
6
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
6
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
7
7
  const optionList = (_b = (_a = data.optionInfo) == null ? void 0 : _a.list) != null ? _b : [];
8
8
  let customType = data.type;
9
9
  if (data.type === WidgetTypeEnums.LABEL) {
@@ -32,12 +32,13 @@ const transformDataToFront = (dataType, rawData = []) => {
32
32
  type: customType,
33
33
  optionSetting: data.optionType,
34
34
  openAdvancedFilter: data.isShowSearch,
35
+ dateShortcuts: (_g = data.dateShortcuts) != null ? _g : [],
35
36
  filterOutDisplay: data.filterExplicit,
36
37
  filterOutRequired: data.explicitRequired,
37
38
  width: data.width,
38
39
  defValCfg: {
39
- value: data.type === WidgetTypeEnums.SELECT && data.optionType === WidgetOptionEnums.MULTIPLE ? (_h = (_g = data.defaultValue) == null ? void 0 : _g.valueList) != null ? _h : [] : (_k = (_j = (_i = data.defaultValue) == null ? void 0 : _i.valueList) == null ? void 0 : _j[0]) != null ? _k : null,
40
- presetVal: data.type === WidgetTypeEnums.SELECT && data.optionType === WidgetOptionEnums.MULTIPLE ? ((_l = data.defaultValue) == null ? void 0 : _l.unit) ? [(_m = data.defaultValue) == null ? void 0 : _m.unit] : [] : (_o = (_n = data.defaultValue) == null ? void 0 : _n.unit) != null ? _o : null
40
+ value: data.type === WidgetTypeEnums.SELECT && data.optionType === WidgetOptionEnums.MULTIPLE ? (_i = (_h = data.defaultValue) == null ? void 0 : _h.valueList) != null ? _i : [] : (_l = (_k = (_j = data.defaultValue) == null ? void 0 : _j.valueList) == null ? void 0 : _k[0]) != null ? _l : null,
41
+ presetVal: data.type === WidgetTypeEnums.SELECT && data.optionType === WidgetOptionEnums.MULTIPLE ? ((_m = data.defaultValue) == null ? void 0 : _m.unit) ? [(_n = data.defaultValue) == null ? void 0 : _n.unit] : [] : (_p = (_o = data.defaultValue) == null ? void 0 : _o.unit) != null ? _p : null
41
42
  },
42
43
  mappingConfig: {
43
44
  mappingMethod: null,
@@ -124,7 +125,7 @@ const getParamCfg = (p_name, params) => {
124
125
  };
125
126
  const transformConditions = (rawConditions, params) => {
126
127
  return rawConditions.map((item) => {
127
- var _a, _b, _c;
128
+ var _a, _b, _c, _d;
128
129
  const cfg = getParamCfg(item.field_key, params);
129
130
  let val = item.value;
130
131
  if (val && !Array.isArray(val)) {
@@ -139,7 +140,8 @@ const transformConditions = (rawConditions, params) => {
139
140
  condition: item.con,
140
141
  value,
141
142
  presetVal: (_b = item.unit) != null ? _b : null,
142
- dynamicBaseList: (_c = item == null ? void 0 : item.dynamicBaseList) != null ? _c : []
143
+ customDate: (_c = item == null ? void 0 : item.customDate) != null ? _c : null,
144
+ dynamicBaseList: (_d = item == null ? void 0 : item.dynamicBaseList) != null ? _d : []
143
145
  };
144
146
  if (Object.keys(item).includes("isAccurateSearch")) {
145
147
  obj.isAccurateSearch = item.isAccurateSearch;
@@ -154,8 +156,9 @@ const transformRawConditions = (conditions) => {
154
156
  field_key: item.key,
155
157
  con: item.condition,
156
158
  value: Array.isArray(item.value) ? item.value : item.value ? [item.value] : [],
157
- unit: item.presetVal,
158
- dynamicBaseList: item.dynamicBaseList || []
159
+ unit: (item == null ? void 0 : item.customDate) ? WidgetValEnums.CUSTOM : item.presetVal,
160
+ dynamicBaseList: item.dynamicBaseList || [],
161
+ customDate: item == null ? void 0 : item.customDate
159
162
  };
160
163
  if (Object.keys(item).includes("isAccurateSearch")) {
161
164
  obj.isAccurateSearch = item.isAccurateSearch;
@@ -45,6 +45,7 @@ export declare const WidgetOptionEnums: {
45
45
  SELECT_TIME: string;
46
46
  PAST_TIME: string;
47
47
  FUTURE_TIME: string;
48
+ CUSTOM_TIME: string;
48
49
  };
49
50
  export declare const WidgetValEnums: {
50
51
  CUSTOM: string;
@@ -44,7 +44,8 @@ const WidgetOptionEnums = {
44
44
  ALL: "DATETIME_WHOLE",
45
45
  SELECT_TIME: "DATETIME_SELECT",
46
46
  PAST_TIME: "DATETIME_PAST",
47
- FUTURE_TIME: "DATETIME_FUTURE"
47
+ FUTURE_TIME: "DATETIME_FUTURE",
48
+ CUSTOM_TIME: "DATETIME_CUSTOM"
48
49
  };
49
50
  const WidgetValEnums = {
50
51
  CUSTOM: "CUSTOM",
@@ -93,6 +93,7 @@ export type ISearchConfigType = {
93
93
  isAccurateSearch?: boolean;
94
94
  accurateSearchKey?: string;
95
95
  dynamicBaseList?: any[];
96
+ customDate?: string;
96
97
  };
97
98
  export type ITreeDataType = {
98
99
  name: string;
@@ -148,6 +149,7 @@ export type IApiServerType = {
148
149
  componentProps?: any;
149
150
  extendKey?: string;
150
151
  extendType?: string;
152
+ dateShortcuts?: any[];
151
153
  };
152
154
  export type dynamicOptionInfoType = {
153
155
  filterKeys: string[];
@@ -212,6 +214,7 @@ export type IfilterConditionsType = {
212
214
  value: string;
213
215
  isAccurateSearch?: boolean;
214
216
  accurateSearchKey?: string;
217
+ customDate?: string;
215
218
  };
216
219
  export type ISearchParamsType = {
217
220
  field_key: string;
@@ -220,6 +223,7 @@ export type ISearchParamsType = {
220
223
  unit: 'custom' | null;
221
224
  widgetType?: string;
222
225
  dynamicBaseList?: any[];
226
+ dateShortcuts?: any[];
223
227
  isAccurateSearch?: boolean;
224
228
  accurateSearchKey?: string;
225
229
  };
@@ -243,3 +247,11 @@ export type IExtendConfigurationType = {
243
247
  _filterApiConfig: any;
244
248
  _selectCriticalNum?: number;
245
249
  };
250
+ export type ICustomDateType = {
251
+ name: string;
252
+ label: string;
253
+ unit: string;
254
+ value: string;
255
+ parseValue: any[];
256
+ timestamp: number[];
257
+ };
package/es/env.d.ts CHANGED
@@ -1,25 +1,25 @@
1
- /// <reference types="vite/client" />
2
-
3
- interface ImportMetaEnv {
4
- readonly VITE_APP_TYPE: string;
5
- // 更多环境变量...
6
- }
7
-
8
- interface ImportMeta {
9
- readonly env: ImportMetaEnv;
10
- }
11
-
12
- declare module '*.vue' {
13
- // @ts-ignore
14
- import type { App, defineComponent } from 'vue';
15
- // // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
16
- // // const component: DefineComponent<{}, {}, any>
17
- const component: ReturnType<typeof defineComponent> & {
18
- install(app: App): void;
19
- };
20
- // @ts-ignore
21
- export default component;
22
- }
23
-
24
- declare module '*.js';
25
-
1
+ /// <reference types="vite/client" />
2
+
3
+ interface ImportMetaEnv {
4
+ readonly VITE_APP_TYPE: string;
5
+ // 更多环境变量...
6
+ }
7
+
8
+ interface ImportMeta {
9
+ readonly env: ImportMetaEnv;
10
+ }
11
+
12
+ declare module '*.vue' {
13
+ // @ts-ignore
14
+ import type { App, defineComponent } from 'vue';
15
+ // // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
16
+ // // const component: DefineComponent<{}, {}, any>
17
+ const component: ReturnType<typeof defineComponent> & {
18
+ install(app: App): void;
19
+ };
20
+ // @ts-ignore
21
+ export default component;
22
+ }
23
+
24
+ declare module '*.js';
25
+
@@ -1,5 +1,5 @@
1
1
  var name = "@cnhis-design-vue/shared";
2
- var version = "3.3.3-beta.19";
2
+ var version = "3.3.3-beta.22";
3
3
  var main = "index.ts";
4
4
  var peerDependencies = {
5
5
  "naive-ui": "^2.30.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cnhis-design-vue",
3
- "version": "3.3.3-beta.19",
3
+ "version": "3.3.3-beta.22",
4
4
  "license": "ISC",
5
5
  "module": "./es/components/index.js",
6
6
  "main": "./es/components/index.js",
@@ -73,5 +73,5 @@
73
73
  "iOS 7",
74
74
  "last 3 iOS versions"
75
75
  ],
76
- "gitHead": "07ccd77e5ef62217c6c80d4881db82f9641c9252"
76
+ "gitHead": "bcb99abde9f0704e4e535eee1bbc4ccce1e46953"
77
77
  }