@senhainfo/shared-utils 1.1.8 → 1.1.10
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/package.json +6 -5
- package/lib/exceptions/bad-request.d.ts +0 -5
- package/lib/exceptions/bad-request.d.ts.map +0 -1
- package/lib/exceptions/bad-request.js +0 -12
- package/lib/exceptions/bad-request.js.map +0 -1
- package/lib/exceptions/forbidden.d.ts +0 -5
- package/lib/exceptions/forbidden.d.ts.map +0 -1
- package/lib/exceptions/forbidden.js +0 -12
- package/lib/exceptions/forbidden.js.map +0 -1
- package/lib/exceptions/inactive.d.ts +0 -5
- package/lib/exceptions/inactive.d.ts.map +0 -1
- package/lib/exceptions/inactive.js +0 -12
- package/lib/exceptions/inactive.js.map +0 -1
- package/lib/exceptions/invalid-credentials.d.ts +0 -5
- package/lib/exceptions/invalid-credentials.d.ts.map +0 -1
- package/lib/exceptions/invalid-credentials.js +0 -11
- package/lib/exceptions/invalid-credentials.js.map +0 -1
- package/lib/exceptions/invalid-token.d.ts +0 -5
- package/lib/exceptions/invalid-token.d.ts.map +0 -1
- package/lib/exceptions/invalid-token.js +0 -12
- package/lib/exceptions/invalid-token.js.map +0 -1
- package/lib/exceptions/missing-token.d.ts +0 -5
- package/lib/exceptions/missing-token.d.ts.map +0 -1
- package/lib/exceptions/missing-token.js +0 -12
- package/lib/exceptions/missing-token.js.map +0 -1
- package/lib/exceptions/not-found.d.ts +0 -5
- package/lib/exceptions/not-found.d.ts.map +0 -1
- package/lib/exceptions/not-found.js +0 -12
- package/lib/exceptions/not-found.js.map +0 -1
- package/lib/handle-jwt-token.d.ts +0 -22
- package/lib/handle-jwt-token.d.ts.map +0 -1
- package/lib/handle-jwt-token.js +0 -30
- package/lib/handle-jwt-token.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@senhainfo/shared-utils",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.10",
|
|
4
4
|
"repository": "https://github.com/senha-info/senha-shared-utils.git",
|
|
5
5
|
"author": "Bruno Gaspar <bruninhoogaspar@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,19 +11,20 @@
|
|
|
11
11
|
],
|
|
12
12
|
"scripts": {
|
|
13
13
|
"types:check": "tsc --noEmit",
|
|
14
|
-
"
|
|
14
|
+
"clean": "rmdir /s /q lib",
|
|
15
|
+
"build": "npm run clean && tsc",
|
|
15
16
|
"prepare": "npm run build"
|
|
16
17
|
},
|
|
17
18
|
"publishConfig": {
|
|
18
19
|
"access": "public"
|
|
19
20
|
},
|
|
20
21
|
"devDependencies": {
|
|
21
|
-
"@types/node": "^22.
|
|
22
|
+
"@types/node": "^22.14.0",
|
|
22
23
|
"tsx": "^4.19.3",
|
|
23
|
-
"typescript": "^5.
|
|
24
|
+
"typescript": "^5.8.2"
|
|
24
25
|
},
|
|
25
26
|
"dependencies": {
|
|
26
|
-
"axios": "^1.8.
|
|
27
|
+
"axios": "^1.8.4",
|
|
27
28
|
"date-fns": "^4.1.0"
|
|
28
29
|
}
|
|
29
30
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bad-request.d.ts","sourceRoot":"","sources":["../../src/exceptions/bad-request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,SAAiC,EAAE,OAAO,CAAC,EAAE,MAAM;CAGvE"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BadRequestException = void 0;
|
|
4
|
-
const http_status_enum_1 = require("../http-status-enum");
|
|
5
|
-
const app_exception_1 = require("./app-exception");
|
|
6
|
-
class BadRequestException extends app_exception_1.AppException {
|
|
7
|
-
constructor(message = "Erro ao processar requisição", details) {
|
|
8
|
-
super(app_exception_1.AppExceptionEnum.BAD_REQUEST, message, http_status_enum_1.HttpStatusCodes.BAD_REQUEST, details);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
exports.BadRequestException = BadRequestException;
|
|
12
|
-
//# sourceMappingURL=bad-request.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bad-request.js","sourceRoot":"","sources":["../../src/exceptions/bad-request.ts"],"names":[],"mappings":";;;AAAA,0DAAsD;AACtD,mDAAiE;AAEjE,MAAa,mBAAoB,SAAQ,4BAAY;IACnD,YAAY,OAAO,GAAG,8BAA8B,EAAE,OAAgB;QACpE,KAAK,CAAC,gCAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,kCAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;CACF;AAJD,kDAIC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forbidden.d.ts","sourceRoot":"","sources":["../../src/exceptions/forbidden.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,SAA4C,EAAE,OAAO,CAAC,EAAE,MAAM;CAGlF"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ForbiddenException = void 0;
|
|
4
|
-
const http_status_enum_1 = require("../http-status-enum");
|
|
5
|
-
const app_exception_1 = require("./app-exception");
|
|
6
|
-
class ForbiddenException extends app_exception_1.AppException {
|
|
7
|
-
constructor(message = "Sem permissão para acessar este recurso", details) {
|
|
8
|
-
super(app_exception_1.AppExceptionEnum.FORBIDDEN, message, http_status_enum_1.HttpStatusCodes.FORBIDDEN, details);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
exports.ForbiddenException = ForbiddenException;
|
|
12
|
-
//# sourceMappingURL=forbidden.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forbidden.js","sourceRoot":"","sources":["../../src/exceptions/forbidden.ts"],"names":[],"mappings":";;;AAAA,0DAAsD;AAEtD,mDAAiE;AAEjE,MAAa,kBAAmB,SAAQ,4BAAY;IAClD,YAAY,OAAO,GAAG,yCAAyC,EAAE,OAAgB;QAC/E,KAAK,CAAC,gCAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,kCAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjF,CAAC;CACF;AAJD,gDAIC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inactive.d.ts","sourceRoot":"","sources":["../../src/exceptions/inactive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,SAAY,EAAE,OAAO,CAAC,EAAE,MAAM;CAGlD"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InactiveException = void 0;
|
|
4
|
-
const http_status_enum_1 = require("../http-status-enum");
|
|
5
|
-
const app_exception_1 = require("./app-exception");
|
|
6
|
-
class InactiveException extends app_exception_1.AppException {
|
|
7
|
-
constructor(message = "Inativo", details) {
|
|
8
|
-
super(app_exception_1.AppExceptionEnum.INACTIVE, message, http_status_enum_1.HttpStatusCodes.FORBIDDEN, details);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
exports.InactiveException = InactiveException;
|
|
12
|
-
//# sourceMappingURL=inactive.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inactive.js","sourceRoot":"","sources":["../../src/exceptions/inactive.ts"],"names":[],"mappings":";;;AAAA,0DAAsD;AAEtD,mDAAiE;AAEjE,MAAa,iBAAkB,SAAQ,4BAAY;IACjD,YAAY,OAAO,GAAG,SAAS,EAAE,OAAgB;QAC/C,KAAK,CAAC,gCAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,kCAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;CACF;AAJD,8CAIC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invalid-credentials.d.ts","sourceRoot":"","sources":["../../src/exceptions/invalid-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,qBAAa,2BAA4B,SAAQ,qBAAqB;gBACxD,OAAO,SAAgC,EAAE,OAAO,CAAC,EAAE,MAAM;CAGtE"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InvalidCredentialsException = void 0;
|
|
4
|
-
const unauthorized_exception_1 = require("./unauthorized-exception");
|
|
5
|
-
class InvalidCredentialsException extends unauthorized_exception_1.UnauthorizedException {
|
|
6
|
-
constructor(message = "Usuário ou senha incorretos", details) {
|
|
7
|
-
super(message, details);
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
exports.InvalidCredentialsException = InvalidCredentialsException;
|
|
11
|
-
//# sourceMappingURL=invalid-credentials.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invalid-credentials.js","sourceRoot":"","sources":["../../src/exceptions/invalid-credentials.ts"],"names":[],"mappings":";;;AAAA,qEAAiE;AAEjE,MAAa,2BAA4B,SAAQ,8CAAqB;IACpE,YAAY,OAAO,GAAG,6BAA6B,EAAE,OAAgB;QACnE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAJD,kEAIC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invalid-token.d.ts","sourceRoot":"","sources":["../../src/exceptions/invalid-token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,qBAAa,qBAAsB,SAAQ,YAAY;gBACzC,OAAO,SAA+C,EAAE,OAAO,CAAC,EAAE,MAAM;CAGrF"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InvalidTokenException = void 0;
|
|
4
|
-
const http_status_enum_1 = require("../http-status-enum");
|
|
5
|
-
const app_exception_1 = require("./app-exception");
|
|
6
|
-
class InvalidTokenException extends app_exception_1.AppException {
|
|
7
|
-
constructor(message = "Token de acesso inválido, tente novamente!", details) {
|
|
8
|
-
super(app_exception_1.AppExceptionEnum.INVALID_TOKEN, message, http_status_enum_1.HttpStatusCodes.UNAUTHORIZED, details);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
exports.InvalidTokenException = InvalidTokenException;
|
|
12
|
-
//# sourceMappingURL=invalid-token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invalid-token.js","sourceRoot":"","sources":["../../src/exceptions/invalid-token.ts"],"names":[],"mappings":";;;AAAA,0DAAsD;AACtD,mDAAiE;AAEjE,MAAa,qBAAsB,SAAQ,4BAAY;IACrD,YAAY,OAAO,GAAG,4CAA4C,EAAE,OAAgB;QAClF,KAAK,CAAC,gCAAgB,CAAC,aAAa,EAAE,OAAO,EAAE,kCAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxF,CAAC;CACF;AAJD,sDAIC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"missing-token.d.ts","sourceRoot":"","sources":["../../src/exceptions/missing-token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,qBAAa,qBAAsB,SAAQ,YAAY;gBACzC,OAAO,SAAkC,EAAE,OAAO,CAAC,EAAE,MAAM;CAGxE"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MissingTokenException = void 0;
|
|
4
|
-
const http_status_enum_1 = require("../http-status-enum");
|
|
5
|
-
const app_exception_1 = require("./app-exception");
|
|
6
|
-
class MissingTokenException extends app_exception_1.AppException {
|
|
7
|
-
constructor(message = "Token de acesso não informado", details) {
|
|
8
|
-
super(app_exception_1.AppExceptionEnum.MISSING_TOKEN, message, http_status_enum_1.HttpStatusCodes.UNAUTHORIZED, details);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
exports.MissingTokenException = MissingTokenException;
|
|
12
|
-
//# sourceMappingURL=missing-token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"missing-token.js","sourceRoot":"","sources":["../../src/exceptions/missing-token.ts"],"names":[],"mappings":";;;AAAA,0DAAsD;AACtD,mDAAiE;AAEjE,MAAa,qBAAsB,SAAQ,4BAAY;IACrD,YAAY,OAAO,GAAG,+BAA+B,EAAE,OAAgB;QACrE,KAAK,CAAC,gCAAgB,CAAC,aAAa,EAAE,OAAO,EAAE,kCAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxF,CAAC;CACF;AAJD,sDAIC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"not-found.d.ts","sourceRoot":"","sources":["../../src/exceptions/not-found.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,SAAmB,EAAE,OAAO,CAAC,EAAE,MAAM;CAGzD"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NotFoundException = void 0;
|
|
4
|
-
const http_status_enum_1 = require("../http-status-enum");
|
|
5
|
-
const app_exception_1 = require("./app-exception");
|
|
6
|
-
class NotFoundException extends app_exception_1.AppException {
|
|
7
|
-
constructor(message = "Não encontrado", details) {
|
|
8
|
-
super(app_exception_1.AppExceptionEnum.NOT_FOUND, message, http_status_enum_1.HttpStatusCodes.NOT_FOUND, details);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
exports.NotFoundException = NotFoundException;
|
|
12
|
-
//# sourceMappingURL=not-found.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"not-found.js","sourceRoot":"","sources":["../../src/exceptions/not-found.ts"],"names":[],"mappings":";;;AAAA,0DAAsD;AACtD,mDAAiE;AAEjE,MAAa,iBAAkB,SAAQ,4BAAY;IACjD,YAAY,OAAO,GAAG,gBAAgB,EAAE,OAAgB;QACtD,KAAK,CAAC,gCAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,kCAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjF,CAAC;CACF;AAJD,8CAIC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import jwt, { JwtPayload, SignOptions } from "jsonwebtoken";
|
|
2
|
-
interface TokenData {
|
|
3
|
-
userId: number;
|
|
4
|
-
}
|
|
5
|
-
type TokenType = "access" | "refresh";
|
|
6
|
-
interface GenerateTokenProps {
|
|
7
|
-
payload: JwtPayload;
|
|
8
|
-
options?: SignOptions & {
|
|
9
|
-
type?: TokenType;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
export declare class HandleJwtToken {
|
|
13
|
-
private jwtSecretKey;
|
|
14
|
-
private jwtRefreshSecretKey;
|
|
15
|
-
constructor(jwtSecretKey: string, jwtRefreshSecretKey: string);
|
|
16
|
-
private getSecret;
|
|
17
|
-
generate({ payload, options }: GenerateTokenProps): string;
|
|
18
|
-
verify(token: string, type?: TokenType): JwtPayload & TokenData;
|
|
19
|
-
decode(token: string): string | jwt.JwtPayload | null;
|
|
20
|
-
}
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=handle-jwt-token.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handle-jwt-token.d.ts","sourceRoot":"","sources":["../src/handle-jwt-token.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtC,UAAU,kBAAkB;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,WAAW,GAAG;QACtB,IAAI,CAAC,EAAE,SAAS,CAAC;KAClB,CAAC;CACH;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,YAAY;IAAU,OAAO,CAAC,mBAAmB;gBAAjD,YAAY,EAAE,MAAM,EAAU,mBAAmB,EAAE,MAAM;IAE7E,OAAO,CAAC,SAAS;IAIjB,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,kBAAkB;IAMjD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,SAAoB,GAAG,UAAU,GAAG,SAAS;IAKzE,MAAM,CAAC,KAAK,EAAE,MAAM;CAGrB"}
|
package/lib/handle-jwt-token.js
DELETED
|
@@ -1,30 +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.HandleJwtToken = void 0;
|
|
7
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
-
class HandleJwtToken {
|
|
9
|
-
constructor(jwtSecretKey, jwtRefreshSecretKey) {
|
|
10
|
-
this.jwtSecretKey = jwtSecretKey;
|
|
11
|
-
this.jwtRefreshSecretKey = jwtRefreshSecretKey;
|
|
12
|
-
}
|
|
13
|
-
getSecret(type = "access") {
|
|
14
|
-
return type === "access" ? this.jwtSecretKey : this.jwtRefreshSecretKey;
|
|
15
|
-
}
|
|
16
|
-
generate({ payload, options }) {
|
|
17
|
-
const SECRET = this.getSecret(options === null || options === void 0 ? void 0 : options.type);
|
|
18
|
-
options === null || options === void 0 ? true : delete options.type;
|
|
19
|
-
return jsonwebtoken_1.default.sign(payload, SECRET, options);
|
|
20
|
-
}
|
|
21
|
-
verify(token, type = "access") {
|
|
22
|
-
const SECRET = this.getSecret(type);
|
|
23
|
-
return jsonwebtoken_1.default.verify(token, SECRET);
|
|
24
|
-
}
|
|
25
|
-
decode(token) {
|
|
26
|
-
return jsonwebtoken_1.default.decode(token);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
exports.HandleJwtToken = HandleJwtToken;
|
|
30
|
-
//# sourceMappingURL=handle-jwt-token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handle-jwt-token.js","sourceRoot":"","sources":["../src/handle-jwt-token.ts"],"names":[],"mappings":";;;;;;AAAA,gEAA4D;AAe5D,MAAa,cAAc;IACzB,YAAoB,YAAoB,EAAU,mBAA2B;QAAzD,iBAAY,GAAZ,YAAY,CAAQ;QAAU,wBAAmB,GAAnB,mBAAmB,CAAQ;IAAG,CAAC;IAEzE,SAAS,CAAC,OAAkB,QAAQ;QAC1C,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAC1E,CAAC;IAED,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAsB;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC,CAAC;QACtC,OAAO,aAAP,OAAO,4BAAP,OAAO,CAAE,IAAI,CAAC;QACrB,OAAO,sBAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,OAAkB,QAAQ;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAA2B,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,sBAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACF;AArBD,wCAqBC"}
|