@webiny/api-file-manager-ddb 0.0.0-mt-1
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/LICENSE +21 -0
- package/README.md +30 -0
- package/definitions/filesEntity.d.ts +7 -0
- package/definitions/filesEntity.js +80 -0
- package/definitions/settingsEntity.d.ts +7 -0
- package/definitions/settingsEntity.js +56 -0
- package/definitions/systemEntity.d.ts +7 -0
- package/definitions/systemEntity.js +44 -0
- package/definitions/table.d.ts +6 -0
- package/definitions/table.js +28 -0
- package/index.d.ts +5 -0
- package/index.js +16 -0
- package/operations/configurations.d.ts +14 -0
- package/operations/configurations.js +22 -0
- package/operations/files/FilesStorageOperations.d.ts +22 -0
- package/operations/files/FilesStorageOperations.js +345 -0
- package/operations/files/fields.d.ts +3 -0
- package/operations/files/fields.js +42 -0
- package/operations/files/index.d.ts +6 -0
- package/operations/files/index.js +35 -0
- package/operations/settings/SettingsStorageOperations.d.ts +15 -0
- package/operations/settings/SettingsStorageOperations.js +120 -0
- package/operations/settings/index.d.ts +8 -0
- package/operations/settings/index.js +32 -0
- package/operations/system/SystemStorageOperations.d.ts +14 -0
- package/operations/system/SystemStorageOperations.js +108 -0
- package/operations/system/index.d.ts +8 -0
- package/operations/system/index.js +32 -0
- package/operations/utils.d.ts +4 -0
- package/operations/utils.js +36 -0
- package/package.json +67 -0
- package/plugins/FileAttributePlugin.d.ts +4 -0
- package/plugins/FileAttributePlugin.js +27 -0
- package/plugins/FileDynamoDbFieldPlugin.d.ts +4 -0
- package/plugins/FileDynamoDbFieldPlugin.js +17 -0
- package/plugins/SettingsAttributePlugin.d.ts +4 -0
- package/plugins/SettingsAttributePlugin.js +27 -0
- package/plugins/SystemAttributePlugin.d.ts +4 -0
- package/plugins/SystemAttributePlugin.js +27 -0
- package/types.d.ts +0 -0
- package/types.js +1 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.SystemStorageOperations = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
13
|
+
|
|
14
|
+
var _systemEntity = _interopRequireDefault(require("../../definitions/systemEntity"));
|
|
15
|
+
|
|
16
|
+
var _table = _interopRequireDefault(require("../../definitions/table"));
|
|
17
|
+
|
|
18
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
19
|
+
|
|
20
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
21
|
+
|
|
22
|
+
const SORT_KEY = "FM";
|
|
23
|
+
|
|
24
|
+
class SystemStorageOperations {
|
|
25
|
+
get partitionKey() {
|
|
26
|
+
const tenant = this._context.tenancy.getCurrentTenant();
|
|
27
|
+
|
|
28
|
+
if (!tenant) {
|
|
29
|
+
throw new _error.default("Tenant missing.", "TENANT_NOT_FOUND");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return `T#${tenant.id}#SYSTEM`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
constructor({
|
|
36
|
+
context
|
|
37
|
+
}) {
|
|
38
|
+
(0, _defineProperty2.default)(this, "_context", void 0);
|
|
39
|
+
(0, _defineProperty2.default)(this, "_entity", void 0);
|
|
40
|
+
this._context = context;
|
|
41
|
+
const table = (0, _table.default)({
|
|
42
|
+
context
|
|
43
|
+
});
|
|
44
|
+
this._entity = (0, _systemEntity.default)({
|
|
45
|
+
context,
|
|
46
|
+
table
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async get() {
|
|
51
|
+
try {
|
|
52
|
+
const system = await this._entity.get({
|
|
53
|
+
PK: this.partitionKey,
|
|
54
|
+
SK: SORT_KEY
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
if (!system || !system.Item) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return system.Item;
|
|
62
|
+
} catch (ex) {
|
|
63
|
+
throw new _error.default(ex.message || "Could not fetch the FileManager system.", ex.code || "GET_SYSTEM_ERROR");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async create(params) {
|
|
68
|
+
const {
|
|
69
|
+
data
|
|
70
|
+
} = params;
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
await this._entity.put(_objectSpread({
|
|
74
|
+
PK: this.partitionKey,
|
|
75
|
+
SK: SORT_KEY
|
|
76
|
+
}, data));
|
|
77
|
+
} catch (ex) {
|
|
78
|
+
throw new _error.default("Could not insert new system data into DynamoDB", "CREATE_SYSTEM_ERROR", {
|
|
79
|
+
data
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return data;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async update(params) {
|
|
87
|
+
const {
|
|
88
|
+
original,
|
|
89
|
+
data
|
|
90
|
+
} = params;
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
await this._entity.update(_objectSpread({
|
|
94
|
+
PK: this.partitionKey,
|
|
95
|
+
SK: SORT_KEY
|
|
96
|
+
}, data));
|
|
97
|
+
} catch (ex) {
|
|
98
|
+
throw new _error.default("Could not update system data in the DynamoDB.", "UPDATE_SYSTEM_ERROR", {
|
|
99
|
+
data
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return _objectSpread(_objectSpread({}, original), data);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
exports.SystemStorageOperations = SystemStorageOperations;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SystemStorageOperations } from "./SystemStorageOperations";
|
|
2
|
+
import { SystemStorageOperationsProviderPlugin } from "@webiny/api-file-manager/plugins/definitions/SystemStorageOperationsProviderPlugin";
|
|
3
|
+
export declare class SystemStorageOperationsProviderDdbPlugin extends SystemStorageOperationsProviderPlugin {
|
|
4
|
+
name: string;
|
|
5
|
+
provide({ context }: {
|
|
6
|
+
context: any;
|
|
7
|
+
}): Promise<SystemStorageOperations>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.SystemStorageOperationsProviderDdbPlugin = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _SystemStorageOperations = require("./SystemStorageOperations");
|
|
13
|
+
|
|
14
|
+
var _SystemStorageOperationsProviderPlugin = require("@webiny/api-file-manager/plugins/definitions/SystemStorageOperationsProviderPlugin");
|
|
15
|
+
|
|
16
|
+
class SystemStorageOperationsProviderDdbPlugin extends _SystemStorageOperationsProviderPlugin.SystemStorageOperationsProviderPlugin {
|
|
17
|
+
constructor(...args) {
|
|
18
|
+
super(...args);
|
|
19
|
+
(0, _defineProperty2.default)(this, "name", "fm.storageOperationsProvider.system.ddb");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async provide({
|
|
23
|
+
context
|
|
24
|
+
}) {
|
|
25
|
+
return new _SystemStorageOperations.SystemStorageOperations({
|
|
26
|
+
context
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
exports.SystemStorageOperationsProviderDdbPlugin = SystemStorageOperationsProviderDdbPlugin;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { FileManagerContext } from "@webiny/api-file-manager/types";
|
|
2
|
+
import { DocumentClient } from "aws-sdk/clients/dynamodb";
|
|
3
|
+
export declare const getDocumentClient: (context: FileManagerContext) => DocumentClient;
|
|
4
|
+
export declare const getTable: (context: FileManagerContext) => string;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.getTable = exports.getDocumentClient = void 0;
|
|
9
|
+
|
|
10
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
11
|
+
|
|
12
|
+
const getDocumentClient = context => {
|
|
13
|
+
const driver = context.db.driver;
|
|
14
|
+
|
|
15
|
+
if (!driver || !driver.documentClient) {
|
|
16
|
+
throw new _error.default(`Missing documentDriver on the context db.driver property.`, "DOCUMENT_CLIENT_ERROR");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return driver.documentClient;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
exports.getDocumentClient = getDocumentClient;
|
|
23
|
+
|
|
24
|
+
const getTable = context => {
|
|
25
|
+
const db = context.db;
|
|
26
|
+
|
|
27
|
+
if (!db) {
|
|
28
|
+
throw new _error.default("Missing db on context.", "DB_ERROR");
|
|
29
|
+
} else if (!db.table) {
|
|
30
|
+
throw new _error.default("Missing table on context.db.", "TABLE_ERROR");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return db.table;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.getTable = getTable;
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webiny/api-file-manager-ddb",
|
|
3
|
+
"version": "0.0.0-mt-1",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"@webiny/api-file-manager",
|
|
7
|
+
"storage-operations",
|
|
8
|
+
"dynamodb",
|
|
9
|
+
"fm:ddb"
|
|
10
|
+
],
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/webiny/webiny-js.git",
|
|
14
|
+
"directory": "packages/api-file-manager-ddb"
|
|
15
|
+
},
|
|
16
|
+
"description": "The DynamoDB storage operations for File Manager API.",
|
|
17
|
+
"contributors": [
|
|
18
|
+
"Pavel Denisjuk <pavel@webiny.com>",
|
|
19
|
+
"Sven Al Hamad <sven@webiny.com>",
|
|
20
|
+
"Adrian Smijulj <adrian@webiny.com>"
|
|
21
|
+
],
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@babel/runtime": "7.15.4",
|
|
25
|
+
"@webiny/api-file-manager": "0.0.0-mt-1",
|
|
26
|
+
"@webiny/db-dynamodb": "0.0.0-mt-1",
|
|
27
|
+
"@webiny/error": "0.0.0-mt-1",
|
|
28
|
+
"@webiny/project-utils": "0.0.0-mt-1",
|
|
29
|
+
"aws-sdk": "2.1026.0",
|
|
30
|
+
"dynamodb-toolbox": "0.3.4"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@babel/cli": "^7.5.5",
|
|
34
|
+
"@babel/core": "^7.5.5",
|
|
35
|
+
"@babel/plugin-proposal-object-rest-spread": "^7.5.5",
|
|
36
|
+
"@babel/plugin-transform-runtime": "^7.5.5",
|
|
37
|
+
"@babel/preset-env": "^7.5.5",
|
|
38
|
+
"@babel/preset-typescript": "^7.0.0",
|
|
39
|
+
"@webiny/cli": "^0.0.0-mt-1",
|
|
40
|
+
"jest": "^26.6.3",
|
|
41
|
+
"jest-dynalite": "^3.2.0",
|
|
42
|
+
"jsonpack": "^1.1.5",
|
|
43
|
+
"rimraf": "^3.0.2",
|
|
44
|
+
"ttypescript": "^1.5.12",
|
|
45
|
+
"typescript": "^4.1.3"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public",
|
|
49
|
+
"directory": "dist"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"watch": "yarn webiny run watch",
|
|
53
|
+
"build": "yarn webiny run build"
|
|
54
|
+
},
|
|
55
|
+
"adio": {
|
|
56
|
+
"ignoreDirs": [
|
|
57
|
+
"__tests__"
|
|
58
|
+
],
|
|
59
|
+
"ignore": {
|
|
60
|
+
"src": [
|
|
61
|
+
"aws-sdk",
|
|
62
|
+
"sharp"
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"gitHead": "37736d8456a6ecb342a6c3645060bd9a3f2d4bb0"
|
|
67
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.FileAttributePlugin = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _AttributePlugin = require("@webiny/db-dynamodb/plugins/definitions/AttributePlugin");
|
|
13
|
+
|
|
14
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
15
|
+
|
|
16
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
17
|
+
|
|
18
|
+
class FileAttributePlugin extends _AttributePlugin.AttributePlugin {
|
|
19
|
+
constructor(params) {
|
|
20
|
+
super(_objectSpread(_objectSpread({}, params), {}, {
|
|
21
|
+
entity: "Files"
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.FileAttributePlugin = FileAttributePlugin;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.FileDynamoDbFieldPlugin = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _FieldPlugin = require("@webiny/db-dynamodb/plugins/definitions/FieldPlugin");
|
|
13
|
+
|
|
14
|
+
class FileDynamoDbFieldPlugin extends _FieldPlugin.FieldPlugin {}
|
|
15
|
+
|
|
16
|
+
exports.FileDynamoDbFieldPlugin = FileDynamoDbFieldPlugin;
|
|
17
|
+
(0, _defineProperty2.default)(FileDynamoDbFieldPlugin, "type", "fileManager.dynamodb.field.file");
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.SettingsAttributePlugin = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _AttributePlugin = require("@webiny/db-dynamodb/plugins/definitions/AttributePlugin");
|
|
13
|
+
|
|
14
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
15
|
+
|
|
16
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
17
|
+
|
|
18
|
+
class SettingsAttributePlugin extends _AttributePlugin.AttributePlugin {
|
|
19
|
+
constructor(params) {
|
|
20
|
+
super(_objectSpread(_objectSpread({}, params), {}, {
|
|
21
|
+
entity: "Settings"
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.SettingsAttributePlugin = SettingsAttributePlugin;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.SystemAttributePlugin = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _AttributePlugin = require("@webiny/db-dynamodb/plugins/definitions/AttributePlugin");
|
|
13
|
+
|
|
14
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
15
|
+
|
|
16
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
17
|
+
|
|
18
|
+
class SystemAttributePlugin extends _AttributePlugin.AttributePlugin {
|
|
19
|
+
constructor(params) {
|
|
20
|
+
super(_objectSpread(_objectSpread({}, params), {}, {
|
|
21
|
+
entity: "System"
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.SystemAttributePlugin = SystemAttributePlugin;
|
package/types.d.ts
ADDED
|
File without changes
|
package/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|