@liuhange/dsh-data-asset-shared 3.2.2 → 3.3.0
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.
- package/config/business-rules.json +1109 -1023
- package/config/local-standard-terms.json +579 -0
- package/config/policy-references.json +6 -11
- package/config/reference-system.json +127 -0
- package/cordis.patch.yml +9 -0
- package/lib/auditLogger.js +8 -1
- package/lib/fileFormatAdapter.js +4 -6
- package/lib/types/auditLogger.d.ts +4 -0
- package/lib/types/index.d.ts +1 -1
- package/package.json +19 -13
- package/LICENSE +0 -21
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
{
|
|
2
|
+
"configVersion": "1.0",
|
|
3
|
+
"layer1_govOrders": [
|
|
4
|
+
{ "elementName": "事项名称", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第3条" },
|
|
5
|
+
{ "elementName": "事项编码", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第3条" },
|
|
6
|
+
{ "elementName": "实施主体", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第4条" },
|
|
7
|
+
{ "elementName": "事项类型", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第3条" },
|
|
8
|
+
{ "elementName": "设定依据", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第4条" },
|
|
9
|
+
{ "elementName": "办理条件", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第5条" },
|
|
10
|
+
{ "elementName": "申请材料", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第5条" },
|
|
11
|
+
{ "elementName": "办理流程", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第6条" },
|
|
12
|
+
{ "elementName": "办理时限", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第6条" },
|
|
13
|
+
{ "elementName": "收费标准", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第7条" },
|
|
14
|
+
{ "elementName": "办理地点", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第7条" },
|
|
15
|
+
{ "elementName": "咨询电话", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第7条" },
|
|
16
|
+
{ "elementName": "监督电话", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第7条" },
|
|
17
|
+
{ "elementName": "办理时间", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第7条" },
|
|
18
|
+
{ "elementName": "网上办理深度", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第8条" },
|
|
19
|
+
{ "elementName": "表格下载", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第8条" },
|
|
20
|
+
{ "elementName": "结果送达方式", "sourceDoc": "进一步深化互联网+政务服务推进一网一门一次改革实施方案", "docNumber": "国办发〔2018〕45号", "clause": "第8条" },
|
|
21
|
+
{ "elementName": "结果样本", "sourceDoc": "政府网站发展指引", "docNumber": "国办发〔2017〕47号", "clause": "第4条" },
|
|
22
|
+
{ "elementName": "通办范围", "sourceDoc": "政府网站发展指引", "docNumber": "国办发〔2017〕47号", "clause": "第5条" },
|
|
23
|
+
{ "elementName": "预约办理", "sourceDoc": "政务信息资源共享管理暂行办法", "docNumber": "国务院令第716号", "clause": "第8条" },
|
|
24
|
+
{ "elementName": "网上支付", "sourceDoc": "政务信息资源共享管理暂行办法", "docNumber": "国务院令第716号", "clause": "第8条" },
|
|
25
|
+
{ "elementName": "中介机构或特殊环节", "sourceDoc": "政务信息资源共享管理暂行办法", "docNumber": "国务院令第716号", "clause": "第9条" }
|
|
26
|
+
],
|
|
27
|
+
"layer2_nationalStandards": [
|
|
28
|
+
{
|
|
29
|
+
"standardNumber": "GB/T 36114-2018",
|
|
30
|
+
"standardName": "政务服务中心进驻事项服务指南编制规范",
|
|
31
|
+
"elements": [
|
|
32
|
+
{ "elementName": "事项名称", "clause": "第5.1节" },
|
|
33
|
+
{ "elementName": "实施主体", "clause": "第5.2节" },
|
|
34
|
+
{ "elementName": "办理条件", "clause": "第5.3节" },
|
|
35
|
+
{ "elementName": "申请材料", "clause": "第5.4节" },
|
|
36
|
+
{ "elementName": "办理流程", "clause": "第5.5节" },
|
|
37
|
+
{ "elementName": "办理时限", "clause": "第5.6节" },
|
|
38
|
+
{ "elementName": "收费标准", "clause": "第5.7节" },
|
|
39
|
+
{ "elementName": "结果送达方式", "clause": "第5.8节" }
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"standardNumber": "GB/T 44890-2024",
|
|
44
|
+
"standardName": "政务服务平台事项元数据规范",
|
|
45
|
+
"elements": [
|
|
46
|
+
{ "elementName": "事项编码", "clause": "第4.1条" },
|
|
47
|
+
{ "elementName": "事项类型", "clause": "第4.2条" },
|
|
48
|
+
{ "elementName": "设定依据", "clause": "第4.3条" },
|
|
49
|
+
{ "elementName": "网上办理深度", "clause": "第6.1条" },
|
|
50
|
+
{ "elementName": "通办范围", "clause": "第6.2条" }
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"standardNumber": "国标(现行)",
|
|
55
|
+
"standardName": "行政许可事项办事指南编写规范",
|
|
56
|
+
"elements": [
|
|
57
|
+
{ "elementName": "事项名称", "clause": "第4.1条" },
|
|
58
|
+
{ "elementName": "办理条件", "clause": "第4.2条" },
|
|
59
|
+
{ "elementName": "申请材料", "clause": "第4.3条" },
|
|
60
|
+
{ "elementName": "办理流程", "clause": "第4.4条" },
|
|
61
|
+
{ "elementName": "办理时限", "clause": "第4.5条" },
|
|
62
|
+
{ "elementName": "表格下载", "clause": "第4.6条" },
|
|
63
|
+
{ "elementName": "结果样本", "clause": "第4.7条" }
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"layer3_provincialStandards": [
|
|
68
|
+
{ "elementName": "事项名称_省级", "nationalElementMapping": "事项名称" },
|
|
69
|
+
{ "elementName": "事项编码_省级", "nationalElementMapping": "事项编码" },
|
|
70
|
+
{ "elementName": "实施主体_省级", "nationalElementMapping": "实施主体" },
|
|
71
|
+
{ "elementName": "事项类型_省级", "nationalElementMapping": "事项类型" },
|
|
72
|
+
{ "elementName": "设定依据_省级", "nationalElementMapping": "设定依据" },
|
|
73
|
+
{ "elementName": "办理条件_省级", "nationalElementMapping": "办理条件" },
|
|
74
|
+
{ "elementName": "申请材料_省级", "nationalElementMapping": "申请材料" },
|
|
75
|
+
{ "elementName": "办理流程_省级", "nationalElementMapping": "办理流程" },
|
|
76
|
+
{ "elementName": "办理时限_省级", "nationalElementMapping": "办理时限" },
|
|
77
|
+
{ "elementName": "收费标准_省级", "nationalElementMapping": "收费标准" },
|
|
78
|
+
{ "elementName": "办理地点_省级", "nationalElementMapping": "办理地点" },
|
|
79
|
+
{ "elementName": "咨询电话_省级", "nationalElementMapping": "咨询电话" },
|
|
80
|
+
{ "elementName": "监督电话_省级", "nationalElementMapping": "监督电话" },
|
|
81
|
+
{ "elementName": "办理时间_省级", "nationalElementMapping": "办理时间" },
|
|
82
|
+
{ "elementName": "网上办理深度_省级", "nationalElementMapping": "网上办理深度" },
|
|
83
|
+
{ "elementName": "表格下载_省级", "nationalElementMapping": "表格下载" },
|
|
84
|
+
{ "elementName": "结果送达方式_省级", "nationalElementMapping": "结果送达方式" },
|
|
85
|
+
{ "elementName": "结果样本_省级", "nationalElementMapping": "结果样本" },
|
|
86
|
+
{ "elementName": "通办范围_省级", "nationalElementMapping": "通办范围" },
|
|
87
|
+
{ "elementName": "预约办理_省级", "nationalElementMapping": "预约办理" },
|
|
88
|
+
{ "elementName": "网上支付_省级", "nationalElementMapping": "网上支付" },
|
|
89
|
+
{ "elementName": "中介机构或特殊环节_省级", "nationalElementMapping": "中介机构或特殊环节" },
|
|
90
|
+
{ "elementName": "材料来源_省级", "nationalElementMapping": "申请材料" },
|
|
91
|
+
{ "elementName": "纸质材料份数_省级", "nationalElementMapping": "申请材料" },
|
|
92
|
+
{ "elementName": "到办事现场次数_省级", "nationalElementMapping": "办理流程" },
|
|
93
|
+
{ "elementName": "空表下载_省级", "nationalElementMapping": "表格下载" },
|
|
94
|
+
{ "elementName": "样表下载_省级", "nationalElementMapping": "表格下载" },
|
|
95
|
+
{ "elementName": "物流快递_省级", "nationalElementMapping": "结果送达方式" },
|
|
96
|
+
{ "elementName": "办理渠道_省级", "nationalElementMapping": "网上办理深度" },
|
|
97
|
+
{ "elementName": "服务对象_省级", "nationalElementMapping": "办理条件" },
|
|
98
|
+
{ "elementName": "受理条件_省级", "nationalElementMapping": "办理条件" },
|
|
99
|
+
{ "elementName": "审批标准_省级", "nationalElementMapping": "办理流程" },
|
|
100
|
+
{ "elementName": "审批人员_省级", "nationalElementMapping": "实施主体" },
|
|
101
|
+
{ "elementName": "特殊环节_省级", "nationalElementMapping": "中介机构或特殊环节" },
|
|
102
|
+
{ "elementName": "数量限制_省级", "nationalElementMapping": "办理条件" },
|
|
103
|
+
{ "elementName": "中介服务_省级", "nationalElementMapping": "中介机构或特殊环节" }
|
|
104
|
+
],
|
|
105
|
+
"layer4_evaluationIndicators": {
|
|
106
|
+
"E1": [
|
|
107
|
+
{ "level": "L1", "indicatorCode": "E1", "description": "完整性指标:办事指南要素覆盖国家/省级要素清单的程度" },
|
|
108
|
+
{ "level": "L2", "indicatorCode": "E1", "description": "漏项检出率:缺失必填字段的检出比例" },
|
|
109
|
+
{ "level": "L3", "indicatorCode": "E1", "description": "字段填充率:各必填字段实际填充非空值的比例" }
|
|
110
|
+
],
|
|
111
|
+
"E2": [
|
|
112
|
+
{ "level": "L1", "indicatorCode": "E2", "description": "准确性指标:办事指南内容与国家/省级标准的一致程度" },
|
|
113
|
+
{ "level": "L2", "indicatorCode": "E2", "description": "语义检出率:语义错误检出比例(含降级模式)" },
|
|
114
|
+
{ "level": "L3", "indicatorCode": "E2", "description": "逻辑检出率:逻辑矛盾检出比例" }
|
|
115
|
+
],
|
|
116
|
+
"E3": [
|
|
117
|
+
{ "level": "L1", "indicatorCode": "E3", "description": "合规性指标:办事指南格式与编写规范的符合程度" },
|
|
118
|
+
{ "level": "L2", "indicatorCode": "E3", "description": "格式检出率:格式不规范检出比例" },
|
|
119
|
+
{ "level": "L3", "indicatorCode": "E3", "description": "误报率:错误检出中误报的比例" }
|
|
120
|
+
],
|
|
121
|
+
"E4": [
|
|
122
|
+
{ "level": "L1", "indicatorCode": "E4", "description": "可用性指标:办事指南对公众办事的实际指导价值" },
|
|
123
|
+
{ "level": "L2", "indicatorCode": "E4", "description": "政策依据可追溯率:检测结果标注policyBasis可追溯至法规条款的比例" },
|
|
124
|
+
{ "level": "L3", "indicatorCode": "E4", "description": "服务便利度:网上办理深度、物流快递、预约办理等便民措施覆盖程度" }
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
}
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Cordis Framework Patch Declaration for @liuhange/dsh-data-asset-shared
|
|
2
|
+
# This file declares the plugin's runtime patch for the Cordis framework.
|
|
3
|
+
# Used by DSH plugin manager to apply framework-level patches during installation.
|
|
4
|
+
plugin: @liuhange/dsh-data-asset-shared
|
|
5
|
+
version: "3.2.3"
|
|
6
|
+
patch:
|
|
7
|
+
- target: tools
|
|
8
|
+
action: register
|
|
9
|
+
description: Register plugin tools into Cordis runtime
|
package/lib/auditLogger.js
CHANGED
|
@@ -8,12 +8,19 @@ export class AuditLogger {
|
|
|
8
8
|
log(params) {
|
|
9
9
|
const timestamp = new Date().toISOString();
|
|
10
10
|
const operator = params.operator ?? 'system';
|
|
11
|
-
const
|
|
11
|
+
const level = params.level ?? 'INFO';
|
|
12
|
+
const logLine = `[${level}][${params.pluginName}] ${timestamp} | 操作: ${params.operation} | 操作人: ${operator} | 输入: ${params.inputPath} | 输出: ${params.outputPath} | 结果: ${params.result}`;
|
|
12
13
|
console.log(logLine);
|
|
13
14
|
if (params.writeToFile) {
|
|
14
15
|
this.writeToFile(logLine);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
18
|
+
warn(params) {
|
|
19
|
+
this.log({ ...params, level: 'WARN' });
|
|
20
|
+
}
|
|
21
|
+
error(params) {
|
|
22
|
+
this.log({ ...params, level: 'ERROR' });
|
|
23
|
+
}
|
|
17
24
|
writeToFile(logLine) {
|
|
18
25
|
if (!fs.existsSync(this.logDir)) {
|
|
19
26
|
fs.mkdirSync(this.logDir, { recursive: true });
|
package/lib/fileFormatAdapter.js
CHANGED
|
@@ -72,10 +72,8 @@ export class FileFormatAdapter {
|
|
|
72
72
|
const lines = [JSON.stringify(parsed)];
|
|
73
73
|
return { lines, format: 'json', raw: parsed };
|
|
74
74
|
}
|
|
75
|
-
readXlsx(
|
|
76
|
-
|
|
77
|
-
const lines = content.split('\n').filter(line => line.trim());
|
|
78
|
-
return { lines, format: 'xlsx', raw: content };
|
|
75
|
+
readXlsx(_filePath) {
|
|
76
|
+
throw new Error('XLSX_BINARY_FORMAT_NOT_SUPPORTED: xlsx是二进制格式(ZIP+XML),当前实现不支持。请先转换为CSV或JSON格式。');
|
|
79
77
|
}
|
|
80
78
|
writeCsv(filePath, lines) {
|
|
81
79
|
fs.writeFileSync(filePath, lines.join('\n'), 'utf-8');
|
|
@@ -91,8 +89,8 @@ export class FileFormatAdapter {
|
|
|
91
89
|
});
|
|
92
90
|
fs.writeFileSync(filePath, JSON.stringify(objects, null, 2), 'utf-8');
|
|
93
91
|
}
|
|
94
|
-
writeXlsx(
|
|
95
|
-
|
|
92
|
+
writeXlsx(_filePath, _lines) {
|
|
93
|
+
throw new Error('XLSX_BINARY_FORMAT_NOT_SUPPORTED: xlsx是二进制格式(ZIP+XML),当前实现不支持。请输出为CSV或JSON格式。');
|
|
96
94
|
}
|
|
97
95
|
}
|
|
98
96
|
//# sourceMappingURL=fileFormatAdapter.js.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export type AuditLogLevel = 'INFO' | 'WARN' | 'ERROR';
|
|
1
2
|
export interface AuditLogParams {
|
|
2
3
|
pluginName: string;
|
|
3
4
|
operation: string;
|
|
@@ -6,11 +7,14 @@ export interface AuditLogParams {
|
|
|
6
7
|
result: string;
|
|
7
8
|
operator?: string;
|
|
8
9
|
writeToFile?: boolean;
|
|
10
|
+
level?: AuditLogLevel;
|
|
9
11
|
}
|
|
10
12
|
export declare class AuditLogger {
|
|
11
13
|
private readonly logDir;
|
|
12
14
|
constructor(logDir?: string);
|
|
13
15
|
log(params: AuditLogParams): void;
|
|
16
|
+
warn(params: Omit<AuditLogParams, 'level'>): void;
|
|
17
|
+
error(params: Omit<AuditLogParams, 'level'>): void;
|
|
14
18
|
private writeToFile;
|
|
15
19
|
}
|
|
16
20
|
//# sourceMappingURL=auditLogger.d.ts.map
|
package/lib/types/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export { ReportGenerator } from './reportGenerator.js';
|
|
|
9
9
|
export type { MaskingReportParams, CleaningReportParams, InventoryReportParams, PackagingManualParams, } from './reportGenerator.js';
|
|
10
10
|
export { PathValidator } from './pathValidator.js';
|
|
11
11
|
export { AuditLogger } from './auditLogger.js';
|
|
12
|
-
export type { AuditLogParams } from './auditLogger.js';
|
|
12
|
+
export type { AuditLogParams, AuditLogLevel } from './auditLogger.js';
|
|
13
13
|
export { PolicyReferenceResolver } from './policyReferenceResolver.js';
|
|
14
14
|
export { RegistrationNavigationEnhancer } from './registrationNavigationEnhancer.js';
|
|
15
15
|
export { defaultRegistrationConfig, defaultPolicyReferences, } from './defaultBusinessRules.js';
|
package/package.json
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liuhange/dsh-data-asset-shared",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "3.
|
|
3
|
+
"description": "数据资产化共享基础包 — 共享类型定义、业务常量、工具函数(基础依赖)",
|
|
4
|
+
"version": "3.3.0",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/liuhange789/data-asset-inspector.git"
|
|
11
|
-
"directory": "packages/data-asset/data-asset-shared"
|
|
10
|
+
"url": "git+https://github.com/liuhange789/data-asset-inspector.git"
|
|
12
11
|
},
|
|
13
12
|
"type": "module",
|
|
14
13
|
"main": "lib/index.js",
|
|
@@ -29,9 +28,15 @@
|
|
|
29
28
|
"files": [
|
|
30
29
|
"lib/**/*.js",
|
|
31
30
|
"lib/types/**/*.d.ts",
|
|
32
|
-
"config/**/*.json"
|
|
31
|
+
"config/**/*.json",
|
|
32
|
+
"cordis.patch.yml"
|
|
33
33
|
],
|
|
34
34
|
"license": "MIT",
|
|
35
|
+
"scripts": {
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"build": "tsc"
|
|
39
|
+
},
|
|
35
40
|
"dependencies": {
|
|
36
41
|
"csv-parse": "^5.5.0"
|
|
37
42
|
},
|
|
@@ -71,12 +76,13 @@
|
|
|
71
76
|
"data-governance",
|
|
72
77
|
"data-quality",
|
|
73
78
|
"plugin",
|
|
74
|
-
"open-source"
|
|
79
|
+
"open-source",
|
|
80
|
+
"data-management",
|
|
81
|
+
"shared",
|
|
82
|
+
"common",
|
|
83
|
+
"utilities",
|
|
84
|
+
"helpers",
|
|
85
|
+
"core"
|
|
75
86
|
],
|
|
76
|
-
"homepage": "https://github.com/liuhange789/data-asset-inspector
|
|
77
|
-
|
|
78
|
-
"typecheck": "tsc --noEmit",
|
|
79
|
-
"test": "vitest run",
|
|
80
|
-
"build": "tsc"
|
|
81
|
-
}
|
|
82
|
-
}
|
|
87
|
+
"homepage": "https://github.com/liuhange789/data-asset-inspector/blob/main/PACKAGES.md"
|
|
88
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 liuhange789
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|