@nestjs-labs/nestjs-pino-extra 1.0.1 → 1.2.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/LICENSE +21 -0
- package/README.md +93 -180
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -13
- package/dist/index.js.map +1 -1
- package/dist/module-option.d.ts +1 -0
- package/dist/module-option.d.ts.map +1 -0
- package/dist/module-option.js +3 -4
- package/dist/module-option.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +42 -27
- package/dist/formatters.d.ts +0 -6
- package/dist/formatters.js +0 -22
- package/dist/formatters.js.map +0 -1
- package/dist/options.d.ts +0 -2
- package/dist/options.js +0 -54
- package/dist/options.js.map +0 -1
- package/dist/serializers.d.ts +0 -2
- package/dist/serializers.js +0 -26
- package/dist/serializers.js.map +0 -1
- package/dist/streams.d.ts +0 -5
- package/dist/streams.js +0 -51
- package/dist/streams.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestjs-labs/nestjs-pino-extra",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Enhanced nestjs-pino with OpenTelemetry, Loki, file rotation and enterprise features",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -9,20 +9,16 @@
|
|
|
9
9
|
".": {
|
|
10
10
|
"import": "./dist/index.js",
|
|
11
11
|
"require": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./module-option": {
|
|
14
|
+
"import": "./dist/module-option.js",
|
|
15
|
+
"require": "./dist/module-option.js"
|
|
12
16
|
}
|
|
13
17
|
},
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "tsc",
|
|
16
|
-
"lint": "eslint .",
|
|
17
|
-
"lint:fix": "eslint . --fix && prettier --write .",
|
|
18
|
-
"format": "prettier --write .",
|
|
19
|
-
"dry-run": "npm publish --dry-run",
|
|
20
|
-
"prepublishOnly": "npm run build",
|
|
21
|
-
"semantic-release": "semantic-release"
|
|
22
|
-
},
|
|
23
18
|
"repository": {
|
|
24
19
|
"type": "git",
|
|
25
|
-
"url": "git+https://github.com/nestjs-labs/nestjs-pino-extra.git"
|
|
20
|
+
"url": "git+https://github.com/nestjs-labs/nestjs-pino-extra.git",
|
|
21
|
+
"directory": "packages/nestjs-pino-extra"
|
|
26
22
|
},
|
|
27
23
|
"keywords": [
|
|
28
24
|
"nestjs",
|
|
@@ -37,27 +33,18 @@
|
|
|
37
33
|
"bugs": {
|
|
38
34
|
"url": "https://github.com/nestjs-labs/nestjs-pino-extra/issues"
|
|
39
35
|
},
|
|
40
|
-
"homepage": "https://
|
|
36
|
+
"homepage": "https://nestjs-labs.github.io/nestjs-pino-extra",
|
|
37
|
+
"docs": "https://nestjs-labs.github.io/nestjs-pino-extra",
|
|
41
38
|
"files": [
|
|
42
39
|
"dist"
|
|
43
40
|
],
|
|
44
|
-
"dependencies": {
|
|
45
|
-
"@opentelemetry/api": "^1.9.0",
|
|
46
|
-
"nestjs-pino": "^4.4.0",
|
|
47
|
-
"pino": "^9.7.0",
|
|
48
|
-
"pino-http": "^10.5.0",
|
|
49
|
-
"pino-loki": "^2.6.0",
|
|
50
|
-
"pino-pretty": "^13.0.0",
|
|
51
|
-
"pino-std-serializers": "^7.0.0",
|
|
52
|
-
"rotating-file-stream": "^3.2.6"
|
|
53
|
-
},
|
|
54
41
|
"devDependencies": {
|
|
55
42
|
"@commitlint/cli": "^19.4.1",
|
|
56
43
|
"@commitlint/config-conventional": "^19.4.1",
|
|
57
44
|
"@nestjs-labs/eslint-config": "^1.0.1",
|
|
58
|
-
"@nestjs/config": "^4.0.
|
|
45
|
+
"@nestjs/config": "^4.0.0",
|
|
59
46
|
"@semantic-release/changelog": "^6.0.3",
|
|
60
|
-
"@semantic-release/commit-analyzer": "^
|
|
47
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
61
48
|
"@semantic-release/git": "^10.0.1",
|
|
62
49
|
"@semantic-release/github": "^11.0.3",
|
|
63
50
|
"@semantic-release/npm": "^12.0.2",
|
|
@@ -67,10 +54,27 @@
|
|
|
67
54
|
"semantic-release": "^24.2.7",
|
|
68
55
|
"tslib": "^2.8.0",
|
|
69
56
|
"typedoc": "^0.28.7",
|
|
70
|
-
"typescript": "^5.5.4"
|
|
57
|
+
"typescript": "^5.5.4",
|
|
58
|
+
"@nestjs-labs/pino-http-extra": "1.0.2"
|
|
71
59
|
},
|
|
72
60
|
"peerDependencies": {
|
|
73
|
-
"@nestjs/config": "^4.0.
|
|
61
|
+
"@nestjs/config": "^4.0.0",
|
|
62
|
+
"nestjs-pino": "^4.4.0",
|
|
63
|
+
"@nestjs-labs/pino-http-extra": "1.0.2"
|
|
64
|
+
},
|
|
65
|
+
"peerDependenciesMeta": {
|
|
66
|
+
"@nestjs/config": {
|
|
67
|
+
"optional": false,
|
|
68
|
+
"description": "Required for configuration management"
|
|
69
|
+
},
|
|
70
|
+
"@nestjs-labs/pino-http-extra": {
|
|
71
|
+
"optional": false,
|
|
72
|
+
"description": "Required for enhanced pino-http functionality"
|
|
73
|
+
},
|
|
74
|
+
"nestjs-pino": {
|
|
75
|
+
"optional": false,
|
|
76
|
+
"description": "Required for NestJS Pino integration"
|
|
77
|
+
}
|
|
74
78
|
},
|
|
75
79
|
"config": {
|
|
76
80
|
"commitizen": {
|
|
@@ -81,5 +85,16 @@
|
|
|
81
85
|
"extends": [
|
|
82
86
|
"@commitlint/config-conventional"
|
|
83
87
|
]
|
|
88
|
+
},
|
|
89
|
+
"dependencies": {
|
|
90
|
+
"@anolilab/semantic-release-pnpm": "^2.0.2"
|
|
91
|
+
},
|
|
92
|
+
"scripts": {
|
|
93
|
+
"build": "tsc",
|
|
94
|
+
"lint": "eslint .",
|
|
95
|
+
"lint:fix": "eslint . --fix && prettier --write .",
|
|
96
|
+
"format": "prettier --write .",
|
|
97
|
+
"dry-run": "npm publish --dry-run",
|
|
98
|
+
"semantic-release": "semantic-release"
|
|
84
99
|
}
|
|
85
|
-
}
|
|
100
|
+
}
|
package/dist/formatters.d.ts
DELETED
package/dist/formatters.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getOtelFormatters = getOtelFormatters;
|
|
4
|
-
const api_1 = require("@opentelemetry/api");
|
|
5
|
-
function getOtelFormatters(spanIdKey = 'spanId', traceIdKey = 'traceId') {
|
|
6
|
-
return {
|
|
7
|
-
level: (label) => {
|
|
8
|
-
return { level: label };
|
|
9
|
-
},
|
|
10
|
-
log(object) {
|
|
11
|
-
const span = api_1.trace.getSpan(api_1.context.active());
|
|
12
|
-
if (!span)
|
|
13
|
-
return object;
|
|
14
|
-
const spanContext = api_1.trace.getSpan(api_1.context.active())?.spanContext();
|
|
15
|
-
if (!spanContext)
|
|
16
|
-
return object;
|
|
17
|
-
const { spanId, traceId } = spanContext;
|
|
18
|
-
return { ...object, [spanIdKey]: spanId, [traceIdKey]: traceId };
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=formatters.js.map
|
package/dist/formatters.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":";;AAMA,8CAsBC;AA5BD,4CAAoD;AAMpD,SAAgB,iBAAiB,CAC/B,SAAS,GAAG,QAAQ,EACpB,UAAU,GAAG,SAAS;IAEtB,OAAO;QACL,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;QAED,GAAG,CAAC,MAA+B;YACjC,MAAM,IAAI,GAAG,WAAK,CAAC,OAAO,CAAC,aAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAE7C,IAAI,CAAC,IAAI;gBAAE,OAAO,MAAM,CAAC;YACzB,MAAM,WAAW,GAAG,WAAK,CAAC,OAAO,CAAC,aAAO,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;YAEnE,IAAI,CAAC,WAAW;gBAAE,OAAO,MAAM,CAAC;YAEhC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAExC,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;QACnE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/options.d.ts
DELETED
package/dist/options.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getPinoHttpOption = getPinoHttpOption;
|
|
7
|
-
const node_crypto_1 = require("node:crypto");
|
|
8
|
-
const pino_1 = __importDefault(require("pino"));
|
|
9
|
-
const formatters_js_1 = require("./formatters.js");
|
|
10
|
-
const serializers_js_1 = require("./serializers.js");
|
|
11
|
-
function getPinoHttpOption(level = 'info', spanIdKey = 'spanId', traceIdKey = 'traceId') {
|
|
12
|
-
return {
|
|
13
|
-
level,
|
|
14
|
-
quietReqLogger: false,
|
|
15
|
-
timestamp: pino_1.default.stdTimeFunctions.isoTime,
|
|
16
|
-
customAttributeKeys: {
|
|
17
|
-
req: 'req',
|
|
18
|
-
res: 'res',
|
|
19
|
-
err: 'err',
|
|
20
|
-
responseTime: 'taken(ms)',
|
|
21
|
-
},
|
|
22
|
-
formatters: (0, formatters_js_1.getOtelFormatters)(spanIdKey, traceIdKey),
|
|
23
|
-
serializers: (0, serializers_js_1.getSerializers)(),
|
|
24
|
-
redact: {
|
|
25
|
-
paths: [
|
|
26
|
-
'password',
|
|
27
|
-
'reqBody.password',
|
|
28
|
-
'user.password',
|
|
29
|
-
'reqBody.user.password',
|
|
30
|
-
],
|
|
31
|
-
},
|
|
32
|
-
genReqId: function (req, res) {
|
|
33
|
-
const reqId = req.id ?? req.headers['x-request-id'];
|
|
34
|
-
if (reqId)
|
|
35
|
-
return reqId;
|
|
36
|
-
const id = (0, node_crypto_1.randomUUID)();
|
|
37
|
-
res.setHeader('X-Request-Id', id);
|
|
38
|
-
return id;
|
|
39
|
-
},
|
|
40
|
-
customLogLevel(_, res, err) {
|
|
41
|
-
if (res.statusCode >= 400 && res.statusCode < 500) {
|
|
42
|
-
return 'warn';
|
|
43
|
-
}
|
|
44
|
-
else if (res.statusCode >= 500 || err) {
|
|
45
|
-
return 'error';
|
|
46
|
-
}
|
|
47
|
-
else if (res.statusCode >= 300 && res.statusCode < 400) {
|
|
48
|
-
return 'silent';
|
|
49
|
-
}
|
|
50
|
-
return 'info';
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=options.js.map
|
package/dist/options.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":";;;;;AAcA,8CAuDC;AApED,6CAAyC;AAKzC,gDAAwB;AAExB,mDAAoD;AACpD,qDAAkD;AAKlD,SAAgB,iBAAiB,CAC/B,KAAK,GAAG,MAAM,EACd,SAAS,GAAG,QAAQ,EACpB,UAAU,GAAG,SAAS;IAEtB,OAAO;QAIL,KAAK;QACL,cAAc,EAAE,KAAK;QACrB,SAAS,EAAE,cAAI,CAAC,gBAAgB,CAAC,OAAO;QACxC,mBAAmB,EAAE;YACnB,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,KAAK;YACV,YAAY,EAAE,WAAW;SAC1B;QACD,UAAU,EAAE,IAAA,iCAAiB,EAAC,SAAS,EAAE,UAAU,CAAC;QACpD,WAAW,EAAE,IAAA,+BAAc,GAAE;QAC7B,MAAM,EAAE;YACN,KAAK,EAAE;gBACL,UAAU;gBACV,kBAAkB;gBAClB,eAAe;gBACf,uBAAuB;aACxB;SACF;QACD,QAAQ,EAAE,UAAU,GAAG,EAAE,GAAG;YAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAEpD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM,EAAE,GAAG,IAAA,wBAAU,GAAE,CAAC;YAExB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAElC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,cAAc,CACZ,CAAkB,EAClB,GAAoC,EACpC,GAAW;YAEX,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAC;YAChB,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;gBACxC,OAAO,OAAO,CAAC;YACjB,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;gBACzD,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/serializers.d.ts
DELETED
package/dist/serializers.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSerializers = getSerializers;
|
|
4
|
-
function getSerializers() {
|
|
5
|
-
return {
|
|
6
|
-
req(req) {
|
|
7
|
-
const request = req.raw;
|
|
8
|
-
return {
|
|
9
|
-
id: req.id,
|
|
10
|
-
method: req.method,
|
|
11
|
-
url: req.url,
|
|
12
|
-
headers: request.headers,
|
|
13
|
-
query: request.query,
|
|
14
|
-
body: request.body,
|
|
15
|
-
};
|
|
16
|
-
},
|
|
17
|
-
res(response) {
|
|
18
|
-
const { statusCode: status, ...serialized } = response;
|
|
19
|
-
return Object.assign({ status }, serialized);
|
|
20
|
-
},
|
|
21
|
-
err(err) {
|
|
22
|
-
return err;
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=serializers.js.map
|
package/dist/serializers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serializers.js","sourceRoot":"","sources":["../src/serializers.ts"],"names":[],"mappings":";;AAYA,wCAyBC;AAzBD,SAAgB,cAAc;IAC5B,OAAO;QACL,GAAG,CAAC,GAAsB;YACxB,MAAM,OAAO,GAAG,GAAG,CAAC,GAEnB,CAAC;YAEF,OAAO;gBACL,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,QAA4B;YAC9B,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,GAAG,QAAQ,CAAC;YAEvD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,GAAG,CAAC,GAAoB;YACtB,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/streams.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import pino from 'pino';
|
|
2
|
-
export declare function createPrettyStreamEntry(_app: string, level: pino.Level): pino.StreamEntry;
|
|
3
|
-
export declare function createLokiStreamEntry(app: string, level: pino.Level, host: string): pino.StreamEntry;
|
|
4
|
-
export declare function createFileStreamEntry(_app: string, level: pino.Level, filepath: string): pino.StreamEntry;
|
|
5
|
-
export declare function getMultiDestinationStream(app: string, level?: pino.Level, filepath?: string, loki?: string): pino.MultiStreamRes;
|
package/dist/streams.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createPrettyStreamEntry = createPrettyStreamEntry;
|
|
7
|
-
exports.createLokiStreamEntry = createLokiStreamEntry;
|
|
8
|
-
exports.createFileStreamEntry = createFileStreamEntry;
|
|
9
|
-
exports.getMultiDestinationStream = getMultiDestinationStream;
|
|
10
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
-
const pino_1 = __importDefault(require("pino"));
|
|
12
|
-
const pino_loki_1 = require("pino-loki");
|
|
13
|
-
const pino_pretty_1 = __importDefault(require("pino-pretty"));
|
|
14
|
-
const rotating_file_stream_1 = require("rotating-file-stream");
|
|
15
|
-
function createPrettyStreamEntry(_app, level) {
|
|
16
|
-
const stream = (0, pino_pretty_1.default)({
|
|
17
|
-
translateTime: false,
|
|
18
|
-
hideObject: false,
|
|
19
|
-
colorize: true,
|
|
20
|
-
});
|
|
21
|
-
return { level, stream };
|
|
22
|
-
}
|
|
23
|
-
function createLokiStreamEntry(app, level, host) {
|
|
24
|
-
const stream = (0, pino_loki_1.pinoLoki)({
|
|
25
|
-
replaceTimestamp: true,
|
|
26
|
-
batching: true,
|
|
27
|
-
interval: 5,
|
|
28
|
-
host,
|
|
29
|
-
labels: { app },
|
|
30
|
-
});
|
|
31
|
-
return { level, stream };
|
|
32
|
-
}
|
|
33
|
-
function createFileStreamEntry(_app, level, filepath) {
|
|
34
|
-
const { base, dir } = node_path_1.default.parse(filepath);
|
|
35
|
-
const stream = (0, rotating_file_stream_1.createStream)(base, {
|
|
36
|
-
size: '1G',
|
|
37
|
-
interval: '1d',
|
|
38
|
-
compress: 'gzip',
|
|
39
|
-
path: dir,
|
|
40
|
-
});
|
|
41
|
-
return { level, stream };
|
|
42
|
-
}
|
|
43
|
-
function getMultiDestinationStream(app, level = 'info', filepath, loki) {
|
|
44
|
-
const entries = [createPrettyStreamEntry(app, level)];
|
|
45
|
-
if (filepath)
|
|
46
|
-
entries.push(createFileStreamEntry(app, level, filepath));
|
|
47
|
-
if (loki)
|
|
48
|
-
entries.push(createLokiStreamEntry(app, level, loki));
|
|
49
|
-
return pino_1.default.multistream(entries);
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=streams.js.map
|
package/dist/streams.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":";;;;;AAWA,0DAWC;AAMD,sDAcC;AAMD,sDAeC;AAMD,8DAYC;AAhFD,0DAA6B;AAE7B,gDAAwB;AACxB,yCAAqC;AACrC,8DAAqC;AACrC,+DAAoD;AAKpD,SAAgB,uBAAuB,CACrC,IAAY,EACZ,KAAiB;IAEjB,MAAM,MAAM,GAAG,IAAA,qBAAU,EAAC;QACxB,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAMD,SAAgB,qBAAqB,CACnC,GAAW,EACX,KAAiB,EACjB,IAAY;IAEZ,MAAM,MAAM,GAAG,IAAA,oBAAQ,EAAC;QACtB,gBAAgB,EAAE,IAAI;QACtB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,CAAC;QACX,IAAI;QACJ,MAAM,EAAE,EAAE,GAAG,EAAE;KAChB,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAMD,SAAgB,qBAAqB,CACnC,IAAY,EACZ,KAAiB,EACjB,QAAgB;IAEhB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,mBAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAA,mCAAY,EAAC,IAAI,EAAE;QAChC,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAMD,SAAgB,yBAAyB,CACvC,GAAW,EACX,QAAoB,MAAM,EAC1B,QAAiB,EACjB,IAAa;IAEb,MAAM,OAAO,GAAuB,CAAC,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAE1E,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAEhE,OAAO,cAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
|