@homebridge-eufy-security/eufy-security-client 3.7.2-dev.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.
Files changed (129) hide show
  1. package/.prettierignore/342/200/216 +8 -0
  2. package/.prettierrc +11 -0
  3. package/LICENSE +21 -0
  4. package/README.md +970 -0
  5. package/build/error.d.ts +138 -0
  6. package/build/error.js +190 -0
  7. package/build/error.js.map +1 -0
  8. package/build/eufysecurity.d.ts +180 -0
  9. package/build/eufysecurity.js +3148 -0
  10. package/build/eufysecurity.js.map +1 -0
  11. package/build/http/api.d.ts +119 -0
  12. package/build/http/api.js +1877 -0
  13. package/build/http/api.js.map +1 -0
  14. package/build/http/cache.d.ts +8 -0
  15. package/build/http/cache.js +34 -0
  16. package/build/http/cache.js.map +1 -0
  17. package/build/http/const.d.ts +8 -0
  18. package/build/http/const.js +3054 -0
  19. package/build/http/const.js.map +1 -0
  20. package/build/http/device.d.ts +490 -0
  21. package/build/http/device.js +5256 -0
  22. package/build/http/device.js.map +1 -0
  23. package/build/http/error.d.ts +73 -0
  24. package/build/http/error.js +101 -0
  25. package/build/http/error.js.map +1 -0
  26. package/build/http/index.d.ts +10 -0
  27. package/build/http/index.js +30 -0
  28. package/build/http/index.js.map +1 -0
  29. package/build/http/interfaces.d.ts +248 -0
  30. package/build/http/interfaces.js +3 -0
  31. package/build/http/interfaces.js.map +1 -0
  32. package/build/http/models.d.ts +608 -0
  33. package/build/http/models.js +3 -0
  34. package/build/http/models.js.map +1 -0
  35. package/build/http/parameter.d.ts +7 -0
  36. package/build/http/parameter.js +119 -0
  37. package/build/http/parameter.js.map +1 -0
  38. package/build/http/station.d.ts +382 -0
  39. package/build/http/station.js +15735 -0
  40. package/build/http/station.js.map +1 -0
  41. package/build/http/types.d.ts +1358 -0
  42. package/build/http/types.js +10333 -0
  43. package/build/http/types.js.map +1 -0
  44. package/build/http/utils.d.ts +89 -0
  45. package/build/http/utils.js +916 -0
  46. package/build/http/utils.js.map +1 -0
  47. package/build/index.d.ts +8 -0
  48. package/build/index.js +29 -0
  49. package/build/index.js.map +1 -0
  50. package/build/interfaces.d.ts +147 -0
  51. package/build/interfaces.js +7 -0
  52. package/build/interfaces.js.map +1 -0
  53. package/build/logging.d.ts +36 -0
  54. package/build/logging.js +119 -0
  55. package/build/logging.js.map +1 -0
  56. package/build/mqtt/interface.d.ts +6 -0
  57. package/build/mqtt/interface.js +3 -0
  58. package/build/mqtt/interface.js.map +1 -0
  59. package/build/mqtt/model.d.ts +24 -0
  60. package/build/mqtt/model.js +3 -0
  61. package/build/mqtt/model.js.map +1 -0
  62. package/build/mqtt/mqtt-eufy.crt +79 -0
  63. package/build/mqtt/proto/lock.proto +33 -0
  64. package/build/mqtt/service.d.ts +28 -0
  65. package/build/mqtt/service.js +196 -0
  66. package/build/mqtt/service.js.map +1 -0
  67. package/build/p2p/ble.d.ts +59 -0
  68. package/build/p2p/ble.js +281 -0
  69. package/build/p2p/ble.js.map +1 -0
  70. package/build/p2p/error.d.ts +49 -0
  71. package/build/p2p/error.js +69 -0
  72. package/build/p2p/error.js.map +1 -0
  73. package/build/p2p/index.d.ts +8 -0
  74. package/build/p2p/index.js +28 -0
  75. package/build/p2p/index.js.map +1 -0
  76. package/build/p2p/interfaces.d.ts +423 -0
  77. package/build/p2p/interfaces.js +3 -0
  78. package/build/p2p/interfaces.js.map +1 -0
  79. package/build/p2p/models.d.ts +295 -0
  80. package/build/p2p/models.js +3 -0
  81. package/build/p2p/models.js.map +1 -0
  82. package/build/p2p/session.d.ts +186 -0
  83. package/build/p2p/session.js +3737 -0
  84. package/build/p2p/session.js.map +1 -0
  85. package/build/p2p/talkback.d.ts +8 -0
  86. package/build/p2p/talkback.js +23 -0
  87. package/build/p2p/talkback.js.map +1 -0
  88. package/build/p2p/types.d.ts +1164 -0
  89. package/build/p2p/types.js +1219 -0
  90. package/build/p2p/types.js.map +1 -0
  91. package/build/p2p/utils.d.ts +72 -0
  92. package/build/p2p/utils.js +865 -0
  93. package/build/p2p/utils.js.map +1 -0
  94. package/build/push/client.d.ts +49 -0
  95. package/build/push/client.js +344 -0
  96. package/build/push/client.js.map +1 -0
  97. package/build/push/error.d.ts +73 -0
  98. package/build/push/error.js +101 -0
  99. package/build/push/error.js.map +1 -0
  100. package/build/push/index.d.ts +6 -0
  101. package/build/push/index.js +26 -0
  102. package/build/push/index.js.map +1 -0
  103. package/build/push/interfaces.d.ts +19 -0
  104. package/build/push/interfaces.js +3 -0
  105. package/build/push/interfaces.js.map +1 -0
  106. package/build/push/models.d.ts +328 -0
  107. package/build/push/models.js +38 -0
  108. package/build/push/models.js.map +1 -0
  109. package/build/push/parser.d.ts +25 -0
  110. package/build/push/parser.js +231 -0
  111. package/build/push/parser.js.map +1 -0
  112. package/build/push/proto/checkin.proto +266 -0
  113. package/build/push/proto/mcs.proto +328 -0
  114. package/build/push/service.d.ts +46 -0
  115. package/build/push/service.js +965 -0
  116. package/build/push/service.js.map +1 -0
  117. package/build/push/types.d.ts +220 -0
  118. package/build/push/types.js +244 -0
  119. package/build/push/types.js.map +1 -0
  120. package/build/push/utils.d.ts +7 -0
  121. package/build/push/utils.js +116 -0
  122. package/build/push/utils.js.map +1 -0
  123. package/build/utils.d.ts +115 -0
  124. package/build/utils.js +438 -0
  125. package/build/utils.js.map +1 -0
  126. package/eslint.config.mts +68 -0
  127. package/jest.config.js +14 -0
  128. package/package.json +85 -0
  129. package/scripts/cut_release.sh +31 -0
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.sleep = exports.parseCheckinResponse = exports.buildCheckinRequest = exports.VALID_FID_PATTERN = void 0;
37
+ exports.generateFid = generateFid;
38
+ exports.convertTimestampMs = convertTimestampMs;
39
+ const crypto_1 = require("crypto");
40
+ const path = __importStar(require("path"));
41
+ const protobufjs_1 = require("protobufjs");
42
+ const error_1 = require("./error");
43
+ const logging_1 = require("../logging");
44
+ exports.VALID_FID_PATTERN = /^[cdef][\w-]{21}$/;
45
+ function generateFid() {
46
+ const fidByteArray = new Uint8Array(17);
47
+ fidByteArray.set((0, crypto_1.randomBytes)(fidByteArray.length));
48
+ // Replace the first 4 random bits with the constant FID header of 0b0111.
49
+ fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);
50
+ const b64 = Buffer.from(fidByteArray).toString("base64");
51
+ const b64_safe = b64.replace(/\+/g, "-").replace(/\//g, "_");
52
+ const fid = b64_safe.substr(0, 22);
53
+ if (exports.VALID_FID_PATTERN.test(fid)) {
54
+ logging_1.rootPushLogger.info("generateFid", fid);
55
+ return fid;
56
+ }
57
+ throw new error_1.FidGenerationError("Generated invalid FID", { context: { fid: fid } });
58
+ }
59
+ const buildCheckinRequest = async () => {
60
+ const root = await (0, protobufjs_1.load)(path.join(__dirname, "./proto/checkin.proto"));
61
+ const CheckinRequestModel = root.lookupType("CheckinRequest");
62
+ const payload = {
63
+ imei: "109269993813709",
64
+ androidId: 0,
65
+ checkin: {
66
+ build: {
67
+ fingerprint: "google/razor/flo:5.0.1/LRX22C/1602158:user/release-keys",
68
+ hardware: "flo",
69
+ brand: "google",
70
+ radio: "FLO-04.04",
71
+ clientId: "android-google",
72
+ },
73
+ lastCheckinMs: 0,
74
+ },
75
+ locale: "en",
76
+ loggingId: 1234567890,
77
+ macAddress: ["A1B2C3D4E5F6"],
78
+ meid: "109269993813709",
79
+ accountCookie: [],
80
+ timeZone: "GMT",
81
+ version: 3,
82
+ otaCert: ["71Q6Rn2DDZl1zPDVaaeEHItd+Yg="],
83
+ esn: "ABCDEF01",
84
+ macAddressType: ["wifi"],
85
+ fragment: 0,
86
+ userSerialNumber: 0,
87
+ };
88
+ const message = CheckinRequestModel.create(payload);
89
+ return CheckinRequestModel.encode(message).finish();
90
+ };
91
+ exports.buildCheckinRequest = buildCheckinRequest;
92
+ const parseCheckinResponse = async (data) => {
93
+ const root = await (0, protobufjs_1.load)(path.join(__dirname, "./proto/checkin.proto"));
94
+ const CheckinResponseModel = root.lookupType("CheckinResponse");
95
+ const message = CheckinResponseModel.decode(data);
96
+ const object = CheckinResponseModel.toObject(message, {
97
+ longs: String,
98
+ enums: String,
99
+ bytes: String,
100
+ });
101
+ return object;
102
+ };
103
+ exports.parseCheckinResponse = parseCheckinResponse;
104
+ const sleep = async (ms) => {
105
+ return new Promise((resolve) => {
106
+ setTimeout(resolve, ms);
107
+ });
108
+ };
109
+ exports.sleep = sleep;
110
+ function convertTimestampMs(timestamp) {
111
+ if (timestamp.toString().length === 10) {
112
+ return timestamp * 1000;
113
+ }
114
+ return timestamp;
115
+ }
116
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/push/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { Category } from "typescript-logging-category-style";
2
+ import EventEmitter from "events";
3
+ import { ErrorObject, EufySecurityPersistentData } from "./interfaces";
4
+ import { BaseError } from "./error";
5
+ import { PropertyMetadataAny } from "./http";
6
+ /**
7
+ * Get error structure from error object
8
+ * @param error
9
+ */
10
+ export declare const getError: (error: BaseError) => ErrorObject;
11
+ /**
12
+ * Remove last character from the string given
13
+ *
14
+ * @param text
15
+ * @param char
16
+ */
17
+ export declare const removeLastChar: (text: string, char: string) => string;
18
+ /**
19
+ * Generate a UDID
20
+ */
21
+ export declare const generateUDID: () => string;
22
+ /**
23
+ * Generate a random serial number
24
+ * @param length
25
+ */
26
+ export declare const generateSerialnumber: (length: number) => string;
27
+ /**
28
+ * Generate md5 from a given string
29
+ *
30
+ * @param contents
31
+ */
32
+ export declare const md5: (contents: string) => string;
33
+ export declare const handleUpdate: (config: EufySecurityPersistentData, oldVersion: number) => EufySecurityPersistentData;
34
+ /**
35
+ * Checking if a string is empty
36
+ *
37
+ * TODO: shouldnt you do a trim to remove any spaces too?
38
+ *
39
+ * @param str
40
+ */
41
+ export declare const isEmpty: (str: string | null | undefined) => boolean;
42
+ /**
43
+ * Try to parse the value as boolean otherwise raise and exception
44
+ *
45
+ * @param metadata
46
+ * @param value
47
+ */
48
+ export declare const parseValueBoolean: (metadata: PropertyMetadataAny, value: unknown) => boolean;
49
+ /**
50
+ * Try to parse the value as number otherwise raise and exception
51
+ *
52
+ * @param metadata
53
+ * @param value
54
+ */
55
+ export declare const parseValueNumber: (metadata: PropertyMetadataAny, value: unknown) => Number;
56
+ /**
57
+ * Try to parse the value as string otherwise raise and exception
58
+ *
59
+ * @param metadata
60
+ * @param value
61
+ */
62
+ export declare const parseValueString: (metadata: PropertyMetadataAny, value: unknown) => string;
63
+ /**
64
+ * Try to parse the value as object otherwise raise and exception
65
+ *
66
+ * @param metadata
67
+ * @param value
68
+ */
69
+ export declare const parseValueObject: (metadata: PropertyMetadataAny, value: unknown) => any;
70
+ /**
71
+ * Parse the value given to match the metadata from the propperty
72
+ * @param metadata
73
+ * @param value
74
+ */
75
+ export declare const parseValue: (metadata: PropertyMetadataAny, value: unknown) => unknown;
76
+ /**
77
+ * Parse data as json otherwise return undefined
78
+ *
79
+ * @param data
80
+ * @param log
81
+ */
82
+ export declare const parseJSON: (data: string, log: Category) => any;
83
+ /**
84
+ * Validate the value based on the metadata property
85
+ *
86
+ * @param metadata
87
+ * @param value
88
+ */
89
+ export declare const validValue: (metadata: PropertyMetadataAny, value: unknown) => void;
90
+ /**
91
+ *
92
+ * @param target
93
+ * @param source
94
+ */
95
+ export declare const mergeDeep: (target: Record<string, any> | undefined, source: Record<string, any>) => Record<string, any>;
96
+ /**
97
+ *
98
+ * @param emitter
99
+ * @param event
100
+ */
101
+ export declare function waitForEvent<T>(emitter: EventEmitter, event: string): Promise<T>;
102
+ /**
103
+ * Get short url from given url and ensure password is reeducated
104
+ *
105
+ * @param url
106
+ * @param prefixUrl
107
+ */
108
+ export declare function getShortUrl(url: URL, prefixUrl?: string): string;
109
+ /**
110
+ * Check if it is a valid url
111
+ *
112
+ * @param value
113
+ * @param protocols
114
+ */
115
+ export declare function isValidUrl(value: string, protocols?: Array<string>): boolean;
package/build/utils.js ADDED
@@ -0,0 +1,438 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.mergeDeep = exports.validValue = exports.parseJSON = exports.parseValue = exports.parseValueObject = exports.parseValueString = exports.parseValueNumber = exports.parseValueBoolean = exports.isEmpty = exports.handleUpdate = exports.md5 = exports.generateSerialnumber = exports.generateUDID = exports.removeLastChar = exports.getError = void 0;
37
+ exports.waitForEvent = waitForEvent;
38
+ exports.getShortUrl = getShortUrl;
39
+ exports.isValidUrl = isValidUrl;
40
+ const crypto = __importStar(require("crypto"));
41
+ const error_1 = require("./error");
42
+ /**
43
+ * Get error structure from error object
44
+ * @param error
45
+ */
46
+ const getError = function (error) {
47
+ return {
48
+ cause: error.cause,
49
+ message: `${error.name}: ${error.message}`,
50
+ context: error.context,
51
+ stacktrace: error.stack,
52
+ };
53
+ };
54
+ exports.getError = getError;
55
+ /**
56
+ * Remove last character from the string given
57
+ *
58
+ * @param text
59
+ * @param char
60
+ */
61
+ const removeLastChar = function (text, char) {
62
+ const strArr = [...text];
63
+ strArr.splice(text.lastIndexOf(char), 1);
64
+ return strArr.join("");
65
+ };
66
+ exports.removeLastChar = removeLastChar;
67
+ /**
68
+ * Generate a UDID
69
+ */
70
+ const generateUDID = function () {
71
+ return crypto.randomBytes(8).readBigUInt64BE().toString(16).padStart(16, "0");
72
+ };
73
+ exports.generateUDID = generateUDID;
74
+ /**
75
+ * Generate a random serial number
76
+ * @param length
77
+ */
78
+ const generateSerialnumber = function (length) {
79
+ return crypto.randomBytes(length / 2).toString("hex");
80
+ };
81
+ exports.generateSerialnumber = generateSerialnumber;
82
+ /**
83
+ * Generate md5 from a given string
84
+ *
85
+ * @param contents
86
+ */
87
+ const md5 = (contents) => crypto.createHash("md5").update(contents).digest("hex");
88
+ exports.md5 = md5;
89
+ const handleUpdate = function (config, oldVersion) {
90
+ if (oldVersion <= 1.24) {
91
+ config.cloud_token = "";
92
+ config.cloud_token_expiration = 0;
93
+ }
94
+ return config;
95
+ };
96
+ exports.handleUpdate = handleUpdate;
97
+ /**
98
+ * Checking if a string is empty
99
+ *
100
+ * TODO: shouldnt you do a trim to remove any spaces too?
101
+ *
102
+ * @param str
103
+ */
104
+ const isEmpty = function (str) {
105
+ if (str) {
106
+ if (str.length > 0)
107
+ return false;
108
+ return true;
109
+ }
110
+ return true;
111
+ };
112
+ exports.isEmpty = isEmpty;
113
+ /**
114
+ * Try to parse the value as boolean otherwise raise and exception
115
+ *
116
+ * @param metadata
117
+ * @param value
118
+ */
119
+ const parseValueBoolean = (metadata, value) => {
120
+ let successParsing = false;
121
+ let parsedValue = false;
122
+ switch (typeof value) {
123
+ case "boolean":
124
+ successParsing = true;
125
+ parsedValue = value;
126
+ break;
127
+ case "number":
128
+ if (value === 0 || value === 1) {
129
+ parsedValue = value === 1;
130
+ successParsing = true;
131
+ }
132
+ break;
133
+ case "string":
134
+ if (value.toLowerCase() === "true" || value.toLowerCase() === "false") {
135
+ parsedValue = value.toLowerCase() === "true";
136
+ successParsing = true;
137
+ }
138
+ break;
139
+ default:
140
+ break;
141
+ }
142
+ if (!successParsing) {
143
+ throw new error_1.InvalidPropertyValueError("Property expects a boolean value", {
144
+ context: {
145
+ propertyName: metadata.name,
146
+ propertyValue: value,
147
+ metadata: metadata,
148
+ },
149
+ });
150
+ }
151
+ return parsedValue;
152
+ };
153
+ exports.parseValueBoolean = parseValueBoolean;
154
+ /**
155
+ * Try to parse the value as number otherwise raise and exception
156
+ *
157
+ * @param metadata
158
+ * @param value
159
+ */
160
+ const parseValueNumber = (metadata, value) => {
161
+ let successParsing = false;
162
+ let parsedValue = 0;
163
+ let causeError = undefined;
164
+ switch (typeof value) {
165
+ case "number":
166
+ successParsing = true;
167
+ parsedValue = value;
168
+ break;
169
+ case "string":
170
+ try {
171
+ parsedValue = Number.parseInt(value);
172
+ // Ensure the value is not an invalid number
173
+ if (!isNaN(parsedValue))
174
+ successParsing = true;
175
+ }
176
+ catch (err) {
177
+ causeError = (0, error_1.ensureError)(err);
178
+ }
179
+ break;
180
+ default:
181
+ break;
182
+ }
183
+ if (!successParsing) {
184
+ throw new error_1.InvalidPropertyValueError("Property expects a number value", {
185
+ cause: causeError,
186
+ context: {
187
+ propertyName: metadata.name,
188
+ propertyValue: value,
189
+ metadata: metadata,
190
+ },
191
+ });
192
+ }
193
+ return parsedValue;
194
+ };
195
+ exports.parseValueNumber = parseValueNumber;
196
+ /**
197
+ * Try to parse the value as string otherwise raise and exception
198
+ *
199
+ * @param metadata
200
+ * @param value
201
+ */
202
+ const parseValueString = (metadata, value) => {
203
+ let successParsing = false;
204
+ let parsedValue = "";
205
+ switch (typeof value) {
206
+ case "number":
207
+ successParsing = true;
208
+ parsedValue = value.toString();
209
+ break;
210
+ case "string":
211
+ successParsing = true;
212
+ parsedValue = value;
213
+ break;
214
+ case "boolean":
215
+ successParsing = true;
216
+ parsedValue = value ? "true" : "false";
217
+ break;
218
+ default:
219
+ break;
220
+ }
221
+ if (!successParsing) {
222
+ throw new error_1.InvalidPropertyValueError("Property expects a string value", {
223
+ context: {
224
+ propertyName: metadata.name,
225
+ propertyValue: value,
226
+ metadata: metadata,
227
+ },
228
+ });
229
+ }
230
+ return parsedValue;
231
+ };
232
+ exports.parseValueString = parseValueString;
233
+ /**
234
+ * Try to parse the value as object otherwise raise and exception
235
+ *
236
+ * @param metadata
237
+ * @param value
238
+ */
239
+ const parseValueObject = (metadata, value) => {
240
+ if (value === null) {
241
+ throw new error_1.InvalidPropertyValueError("Property expects an object value", {
242
+ context: {
243
+ propertyName: metadata.name,
244
+ propertyValue: value,
245
+ metadata: metadata,
246
+ },
247
+ });
248
+ }
249
+ return value;
250
+ };
251
+ exports.parseValueObject = parseValueObject;
252
+ /**
253
+ * Parse the value given to match the metadata from the propperty
254
+ * @param metadata
255
+ * @param value
256
+ */
257
+ const parseValue = function (metadata, value) {
258
+ let parsedValue;
259
+ if (value === undefined) {
260
+ throw new error_1.InvalidPropertyValueError(`Property expects a ${metadata.type} value`, {
261
+ context: {
262
+ propertyName: metadata.name,
263
+ propertyValue: value,
264
+ metadata: metadata,
265
+ },
266
+ });
267
+ }
268
+ if (metadata.type === "boolean") {
269
+ parsedValue = (0, exports.parseValueBoolean)(metadata, value);
270
+ }
271
+ else if (metadata.type === "number") {
272
+ parsedValue = (0, exports.parseValueNumber)(metadata, value);
273
+ }
274
+ else if (metadata.type === "string") {
275
+ parsedValue = (0, exports.parseValueString)(metadata, value);
276
+ }
277
+ else if (metadata.type === "object") {
278
+ parsedValue = (0, exports.parseValueObject)(metadata, value);
279
+ }
280
+ else {
281
+ throw new error_1.InvalidPropertyValueError(`Property expects a ${metadata.type} value`, {
282
+ context: {
283
+ propertyName: metadata.name,
284
+ propertyValue: value,
285
+ metadata: metadata,
286
+ },
287
+ });
288
+ }
289
+ return parsedValue;
290
+ };
291
+ exports.parseValue = parseValue;
292
+ /**
293
+ * Parse data as json otherwise return undefined
294
+ *
295
+ * @param data
296
+ * @param log
297
+ */
298
+ const parseJSON = function (data, log) {
299
+ try {
300
+ return JSON.parse(data.replace(/[\0]+$/g, ""));
301
+ }
302
+ catch (err) {
303
+ const error = (0, error_1.ensureError)(err);
304
+ log.debug("JSON parse error", { error: (0, exports.getError)(error), data: data });
305
+ }
306
+ return undefined;
307
+ };
308
+ exports.parseJSON = parseJSON;
309
+ /**
310
+ * Validate the value based on the metadata property
311
+ *
312
+ * @param metadata
313
+ * @param value
314
+ */
315
+ const validValue = function (metadata, value) {
316
+ let isValidData = true;
317
+ if (metadata.type === "number") {
318
+ const numberMetadata = metadata;
319
+ const numericValue = Number(value);
320
+ if ((numberMetadata.min !== undefined && numberMetadata.min > numericValue) ||
321
+ (numberMetadata.max !== undefined && numberMetadata.max < numericValue) ||
322
+ (numberMetadata.states !== undefined && numberMetadata.states[numericValue] === undefined) ||
323
+ Number.isNaN(numericValue))
324
+ isValidData = false;
325
+ }
326
+ else if (metadata.type === "string") {
327
+ const stringMetadata = metadata;
328
+ const stringValue = String(value);
329
+ if ((stringMetadata.format !== undefined && stringValue.match(stringMetadata.format) === null) ||
330
+ (stringMetadata.minLength !== undefined && stringMetadata.minLength > stringValue.length) ||
331
+ (stringMetadata.maxLength !== undefined && stringMetadata.maxLength < stringValue.length))
332
+ isValidData = false;
333
+ }
334
+ else if (metadata.type === "boolean") {
335
+ const str = String(value).toLowerCase().trim();
336
+ if (str !== "true" && str !== "false" && str !== "1" && str !== "0")
337
+ isValidData = false;
338
+ }
339
+ else if (metadata.type === "object") {
340
+ const metadataObject = metadata;
341
+ if (value !== undefined && value !== null && metadataObject.isValidObject !== undefined)
342
+ isValidData = metadataObject.isValidObject(value);
343
+ }
344
+ else {
345
+ isValidData = false;
346
+ }
347
+ if (!isValidData) {
348
+ throw new error_1.InvalidPropertyValueError(`Invalid value for this property according to metadata type ${metadata.type}`, {
349
+ context: {
350
+ propertyName: metadata.name,
351
+ propertyValue: value,
352
+ metadata: metadata,
353
+ },
354
+ });
355
+ }
356
+ };
357
+ exports.validValue = validValue;
358
+ /**
359
+ *
360
+ * @param target
361
+ * @param source
362
+ */
363
+ const mergeDeep = function (target, source) {
364
+ target = target || {};
365
+ for (const [key, value] of Object.entries(source)) {
366
+ if (!(key in target)) {
367
+ target[key] = value;
368
+ }
369
+ else {
370
+ if (typeof value === "object") {
371
+ // merge objects
372
+ target[key] = (0, exports.mergeDeep)(target[key], value);
373
+ }
374
+ else if (typeof target[key] === "undefined") {
375
+ // don't override single keys
376
+ target[key] = value;
377
+ }
378
+ }
379
+ }
380
+ return target;
381
+ };
382
+ exports.mergeDeep = mergeDeep;
383
+ /**
384
+ *
385
+ * @param emitter
386
+ * @param event
387
+ */
388
+ function waitForEvent(emitter, event) {
389
+ return new Promise((resolve, reject) => {
390
+ const success = (val) => {
391
+ emitter.off("error", fail);
392
+ resolve(val);
393
+ };
394
+ const fail = (err) => {
395
+ emitter.off(event, success);
396
+ reject(err);
397
+ };
398
+ emitter.once(event, success);
399
+ emitter.once("error", fail);
400
+ });
401
+ }
402
+ /**
403
+ * Get short url from given url and ensure password is reeducated
404
+ *
405
+ * @param url
406
+ * @param prefixUrl
407
+ */
408
+ function getShortUrl(url, prefixUrl) {
409
+ if (url.password) {
410
+ url = new URL(url.toString()); // prevent original url mutation
411
+ url.password = "[redacted]";
412
+ }
413
+ let shortUrl = url.toString();
414
+ if (prefixUrl && shortUrl.startsWith(prefixUrl)) {
415
+ shortUrl = shortUrl.slice(prefixUrl.length);
416
+ }
417
+ return shortUrl;
418
+ }
419
+ /**
420
+ * Check if it is a valid url
421
+ *
422
+ * @param value
423
+ * @param protocols
424
+ */
425
+ function isValidUrl(value, protocols = ["http", "https"]) {
426
+ try {
427
+ const url = new URL(value);
428
+ return protocols
429
+ ? url.protocol
430
+ ? protocols.map((protocol) => `${protocol.toLowerCase()}:`).includes(url.protocol)
431
+ : false
432
+ : true;
433
+ }
434
+ catch (_) {
435
+ return false;
436
+ }
437
+ }
438
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqWA,oCAaC;AAQD,kCAWC;AAQD,gCAWC;AAxZD,+CAAiC;AAKjC,mCAA4E;AAG5E;;;GAGG;AACI,MAAM,QAAQ,GAAG,UAAU,KAAgB;IAChD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE;QAC1C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,KAAK,CAAC,KAAK;KACxB,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,QAAQ,YAOnB;AAEF;;;;;GAKG;AACI,MAAM,cAAc,GAAG,UAAU,IAAY,EAAE,IAAY;IAChE,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC,CAAC;AAJW,QAAA,cAAc,kBAIzB;AAEF;;GAEG;AACI,MAAM,YAAY,GAAG;IAC1B,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAChF,CAAC,CAAC;AAFW,QAAA,YAAY,gBAEvB;AAEF;;;GAGG;AACI,MAAM,oBAAoB,GAAG,UAAU,MAAc;IAC1D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC,CAAC;AAFW,QAAA,oBAAoB,wBAE/B;AAEF;;;;GAIG;AACI,MAAM,GAAG,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAA5F,QAAA,GAAG,OAAyF;AAElG,MAAM,YAAY,GAAG,UAC1B,MAAkC,EAClC,UAAkB;IAElB,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;QACxB,MAAM,CAAC,sBAAsB,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AATW,QAAA,YAAY,gBASvB;AAEF;;;;;;GAMG;AACI,MAAM,OAAO,GAAG,UAAU,GAA8B;IAC7D,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AANW,QAAA,OAAO,WAMlB;AAEF;;;;;GAKG;AACI,MAAM,iBAAiB,GAAG,CAAC,QAA6B,EAAE,KAAc,EAAW,EAAE;IAC1F,IAAI,cAAc,GAAY,KAAK,CAAC;IACpC,IAAI,WAAW,GAAY,KAAK,CAAC;IACjC,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,cAAc,GAAG,IAAI,CAAC;YACtB,WAAW,GAAG,KAAK,CAAC;YACpB,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC/B,WAAW,GAAG,KAAK,KAAK,CAAC,CAAC;gBAC1B,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;gBACtE,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;gBAC7C,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,MAAM;QACR;YACE,MAAM;IACV,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,iCAAyB,CAAC,kCAAkC,EAAE;YACtE,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAlCW,QAAA,iBAAiB,qBAkC5B;AAEF;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,QAA6B,EAAE,KAAc,EAAU,EAAE;IACxF,IAAI,cAAc,GAAY,KAAK,CAAC;IACpC,IAAI,WAAW,GAAW,CAAC,CAAC;IAC5B,IAAI,UAAU,GAAsB,SAAS,CAAC;IAC9C,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,cAAc,GAAG,IAAI,CAAC;YACtB,WAAW,GAAG,KAAK,CAAC;YACpB,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,CAAC;gBACH,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACrC,4CAA4C;gBAC5C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBAAE,cAAc,GAAG,IAAI,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,UAAU,GAAG,IAAA,mBAAW,EAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YACD,MAAM;QACR;YACE,MAAM;IACV,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,iCAAyB,CAAC,iCAAiC,EAAE;YACrE,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAjCW,QAAA,gBAAgB,oBAiC3B;AAEF;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,QAA6B,EAAE,KAAc,EAAU,EAAE;IACxF,IAAI,cAAc,GAAY,KAAK,CAAC;IACpC,IAAI,WAAW,GAAW,EAAE,CAAC;IAE7B,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,cAAc,GAAG,IAAI,CAAC;YACtB,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM;QACR,KAAK,QAAQ;YACX,cAAc,GAAG,IAAI,CAAC;YACtB,WAAW,GAAG,KAAK,CAAC;YACpB,MAAM;QACR,KAAK,SAAS;YACZ,cAAc,GAAG,IAAI,CAAC;YACtB,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,MAAM;QACR;YACE,MAAM;IACV,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,iCAAyB,CAAC,iCAAiC,EAAE;YACrE,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AA/BW,QAAA,gBAAgB,oBA+B3B;AAEF;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,QAA6B,EAAE,KAAc,EAAO,EAAE;IACrF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,iCAAyB,CAAC,kCAAkC,EAAE;YACtE,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAXW,QAAA,gBAAgB,oBAW3B;AAEF;;;;GAIG;AACI,MAAM,UAAU,GAAG,UAAU,QAA6B,EAAE,KAAc;IAC/E,IAAI,WAAoB,CAAC;IAEzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,iCAAyB,CAAC,sBAAsB,QAAQ,CAAC,IAAI,QAAQ,EAAE;YAC/E,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,WAAW,GAAG,IAAA,yBAAiB,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,WAAW,GAAG,IAAA,wBAAgB,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,WAAW,GAAG,IAAA,wBAAgB,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,WAAW,GAAG,IAAA,wBAAgB,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,iCAAyB,CAAC,sBAAsB,QAAQ,CAAC,IAAI,QAAQ,EAAE;YAC/E,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AA/BW,QAAA,UAAU,cA+BrB;AAEF;;;;;GAKG;AACI,MAAM,SAAS,GAAG,UAAU,IAAY,EAAE,GAAa;IAC5D,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,GAAG,CAAC,CAAC;QAC/B,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AARW,QAAA,SAAS,aAQpB;AAEF;;;;;GAKG;AACI,MAAM,UAAU,GAAG,UAAU,QAA6B,EAAE,KAAc;IAC/E,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,cAAc,GAAG,QAAmC,CAAC;QAC3D,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,IACE,CAAC,cAAc,CAAC,GAAG,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,GAAG,YAAY,CAAC;YACvE,CAAC,cAAc,CAAC,GAAG,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,GAAG,YAAY,CAAC;YACvE,CAAC,cAAc,CAAC,MAAM,KAAK,SAAS,IAAI,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,SAAS,CAAC;YAC1F,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;YAE1B,WAAW,GAAG,KAAK,CAAC;IACxB,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,QAAkC,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,IACE,CAAC,cAAc,CAAC,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;YAC1F,CAAC,cAAc,CAAC,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC;YACzF,CAAC,cAAc,CAAC,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC;YAEzF,WAAW,GAAG,KAAK,CAAC;IACxB,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG;YAAE,WAAW,GAAG,KAAK,CAAC;IAC3F,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,QAAkC,CAAC;QAC1D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,cAAc,CAAC,aAAa,KAAK,SAAS;YACrF,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,iCAAyB,CAAC,8DAA8D,QAAQ,CAAC,IAAI,EAAE,EAAE;YACjH,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AA1CW,QAAA,UAAU,cA0CrB;AAEF;;;;GAIG;AACI,MAAM,SAAS,GAAG,UACvB,MAAuC,EACvC,MAA2B;IAE3B,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,gBAAgB;gBAChB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAA,iBAAS,EAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC;gBAC9C,6BAA6B;gBAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAnBW,QAAA,SAAS,aAmBpB;AAEF;;;;GAIG;AACH,SAAgB,YAAY,CAAI,OAAqB,EAAE,KAAa;IAClE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,CAAC,GAAM,EAAQ,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,GAAU,EAAQ,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,GAAQ,EAAE,SAAkB;IACtD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,gCAAgC;QAC/D,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;IAC9B,CAAC;IACD,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC9B,IAAI,SAAS,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,KAAa,EAAE,YAA2B,CAAC,MAAM,EAAE,OAAO,CAAC;IACpF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,SAAS;YACd,CAAC,CAAC,GAAG,CAAC,QAAQ;gBACZ,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClF,CAAC,CAAC,KAAK;YACT,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}