@nickyzj2023/utils 1.0.46 → 1.0.47

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 (43) hide show
  1. package/dist/network.d.ts +12 -1
  2. package/dist/string.d.ts +33 -6
  3. package/docs/assets/highlight.css +99 -92
  4. package/docs/assets/navigation.js +1 -1
  5. package/docs/assets/search.js +1 -1
  6. package/docs/functions/camelToSnake.html +178 -178
  7. package/docs/functions/capitalize.html +178 -178
  8. package/docs/functions/compactStr.html +182 -182
  9. package/docs/functions/debounce.html +187 -187
  10. package/docs/functions/decapitalize.html +178 -178
  11. package/docs/functions/fetcher.html +189 -188
  12. package/docs/functions/getRealURL.html +175 -175
  13. package/docs/functions/imageUrlToBase64.html +187 -184
  14. package/docs/functions/isFalsy.html +178 -178
  15. package/docs/functions/isNil.html +178 -178
  16. package/docs/functions/isObject.html +178 -178
  17. package/docs/functions/isPrimitive.html +178 -178
  18. package/docs/functions/isTruthy.html +178 -178
  19. package/docs/functions/loopUntil.html +180 -180
  20. package/docs/functions/mapKeys.html +180 -180
  21. package/docs/functions/mapValues.html +182 -182
  22. package/docs/functions/mergeObjects.html +184 -184
  23. package/docs/functions/randomInt.html +178 -178
  24. package/docs/functions/sleep.html +179 -179
  25. package/docs/functions/snakeToCamel.html +178 -178
  26. package/docs/functions/throttle.html +187 -187
  27. package/docs/functions/timeLog.html +178 -178
  28. package/docs/functions/to.html +180 -180
  29. package/docs/functions/withCache.html +185 -185
  30. package/docs/modules.html +174 -174
  31. package/docs/types/CamelToSnake.html +174 -174
  32. package/docs/types/Capitalize.html +174 -174
  33. package/docs/types/Decapitalize.html +174 -174
  34. package/docs/types/DeepMapKeys.html +174 -174
  35. package/docs/types/DeepMapValues.html +174 -174
  36. package/docs/types/Falsy.html +174 -174
  37. package/docs/types/ImageCompressionOptions.html +184 -0
  38. package/docs/types/Primitive.html +174 -174
  39. package/docs/types/RequestInit.html +174 -174
  40. package/docs/types/SetTtl.html +174 -174
  41. package/docs/types/SnakeToCamel.html +174 -174
  42. package/package.json +11 -14
  43. package/dist/tsdoc-metadata.json +0 -11
package/dist/network.d.ts CHANGED
@@ -1,4 +1,8 @@
1
- export type RequestInit = globalThis.RequestInit & {
1
+ type BunFetchOptions = {
2
+ /** 代理服务器配置(仅 Bun 支持) */
3
+ proxy?: string;
4
+ };
5
+ export type RequestInit = globalThis.RequestInit & BunFetchOptions & {
2
6
  params?: Record<string, any>;
3
7
  parser?: (response: Response) => Promise<any>;
4
8
  };
@@ -14,6 +18,7 @@ export type RequestInit = globalThis.RequestInit & {
14
18
  * - 在 body 里传递对象,自动 JSON.stringify
15
19
  * - 可选择使用 to() 转换请求结果为 [Error, Response]
16
20
  * - 可选择使用 withCache() 缓存请求结果
21
+ * - 支持 proxy 选项(仅在 Bun 环境有效)
17
22
  *
18
23
  * @example
19
24
  *
@@ -24,6 +29,11 @@ export type RequestInit = globalThis.RequestInit & {
24
29
  * const api = fetcher("https://nickyzj.run:3030", { headers: { Authorization: "Bearer token" } });
25
30
  * const res = await api.get<Blog>("/blogs/hello-world", { headers: {...}, params: { page: 1 } }); // 与实例相同的 headers 会覆盖上去,params 会转成 ?page=1 跟到 url 后面
26
31
  *
32
+ * // 用法3:使用代理(仅 Bun 环境)
33
+ * const api = fetcher("https://api.example.com", {
34
+ * proxy: "http://127.0.0.1:7890"
35
+ * });
36
+ *
27
37
  * // 安全处理请求结果
28
38
  * const [error, data] = await to(api.get<Blog>("/blogs/hello-world"));
29
39
  * if (error) {
@@ -55,3 +65,4 @@ export declare const fetcher: (baseURL?: string, baseOptions?: RequestInit) => {
55
65
  export declare const to: <T, E = Error>(promise: Promise<T>) => Promise<[null, T] | [E, undefined]>;
56
66
  /** 从 url 响应头获取真实链接 */
57
67
  export declare const getRealURL: (originURL: string) => Promise<string>;
68
+ export {};
package/dist/string.d.ts CHANGED
@@ -30,22 +30,49 @@ export type Decapitalize<S extends string> = S extends `${infer P1}${infer Rest}
30
30
  * decapitalize("Hello") // "hello"
31
31
  */
32
32
  export declare const decapitalize: <S extends string>(s: S) => Decapitalize<S>;
33
+ /**
34
+ * 图片压缩选项
35
+ */
36
+ export type ImageCompressionOptions = {
37
+ /** 压缩比率,默认 0.92 */
38
+ quality?: number;
39
+ /**
40
+ * 自定义压缩函数,用于非浏览器环境(Node.js/Bun)
41
+ * 如果提供,将使用此函数替代默认的 canvas 压缩
42
+ * @param arrayBuffer 图片的 ArrayBuffer 数据
43
+ * @param mime 图片的 MIME 类型
44
+ * @param quality 压缩质量
45
+ * @returns 压缩后的 base64 字符串
46
+ */
47
+ compressor?: (arrayBuffer: ArrayBuffer, mime: string, quality: number) => Promise<string> | string;
48
+ };
33
49
  /**
34
50
  * 图片地址转 base64 数据
35
51
  *
36
52
  * @param imageUrl 图片地址
37
53
  * @param options 可选配置
38
- * @param options.quality 压缩比率,默认 0.92(仅在浏览器支持 canvas 压缩时有效)
54
+ * @param options.quality 压缩比率,默认 0.92
55
+ * @param options.compressor 自定义压缩函数,用于 Node.js/Bun 环境
39
56
  *
40
57
  * @example
41
- * imageUrlToBase64("https://example.com/image.gif"); // "data:image/gif;base64,..."
58
+ * // 基本用法(浏览器自动使用 Canvas 压缩)
59
+ * imageUrlToBase64("https://example.com/image.jpg");
42
60
  *
43
61
  * @example
44
- * imageUrlToBase64("https://example.com/image.jpg", { quality: 0.8 }); // 压缩至 80% 质量
62
+ * // Node.js/Bun 使用 sharp 压缩
63
+ * import sharp from "sharp";
64
+ *
65
+ * imageUrlToBase64("https://example.com/image.jpg", {
66
+ * quality: 0.8,
67
+ * compressor: async (buffer, mime, quality) => {
68
+ * const compressed = await sharp(Buffer.from(buffer))
69
+ * .jpeg({ quality: Math.round(quality * 100) })
70
+ * .toBuffer();
71
+ * return `data:${mime};base64,${compressed.toString("base64")}`;
72
+ * }
73
+ * });
45
74
  */
46
- export declare const imageUrlToBase64: (imageUrl: string, { quality }?: {
47
- quality?: number;
48
- }) => Promise<string>;
75
+ export declare const imageUrlToBase64: (imageUrl: string, options?: ImageCompressionOptions) => Promise<string>;
49
76
  /**
50
77
  * 将字符串压缩为单行精简格式
51
78
  *
@@ -1,92 +1,99 @@
1
- :root {
2
- --light-hl-0: #008000;
3
- --dark-hl-0: #6A9955;
4
- --light-hl-1: #795E26;
5
- --dark-hl-1: #DCDCAA;
6
- --light-hl-2: #000000;
7
- --dark-hl-2: #D4D4D4;
8
- --light-hl-3: #A31515;
9
- --dark-hl-3: #CE9178;
10
- --light-hl-4: #AF00DB;
11
- --dark-hl-4: #C586C0;
12
- --light-hl-5: #001080;
13
- --dark-hl-5: #9CDCFE;
14
- --light-hl-6: #0000FF;
15
- --dark-hl-6: #569CD6;
16
- --light-hl-7: #0070C1;
17
- --dark-hl-7: #4FC1FF;
18
- --light-hl-8: #267F99;
19
- --dark-hl-8: #4EC9B0;
20
- --light-hl-9: #098658;
21
- --dark-hl-9: #B5CEA8;
22
- --light-code-background: #FFFFFF;
23
- --dark-code-background: #1E1E1E;
24
- }
25
-
26
- @media (prefers-color-scheme: light) { :root {
27
- --hl-0: var(--light-hl-0);
28
- --hl-1: var(--light-hl-1);
29
- --hl-2: var(--light-hl-2);
30
- --hl-3: var(--light-hl-3);
31
- --hl-4: var(--light-hl-4);
32
- --hl-5: var(--light-hl-5);
33
- --hl-6: var(--light-hl-6);
34
- --hl-7: var(--light-hl-7);
35
- --hl-8: var(--light-hl-8);
36
- --hl-9: var(--light-hl-9);
37
- --code-background: var(--light-code-background);
38
- } }
39
-
40
- @media (prefers-color-scheme: dark) { :root {
41
- --hl-0: var(--dark-hl-0);
42
- --hl-1: var(--dark-hl-1);
43
- --hl-2: var(--dark-hl-2);
44
- --hl-3: var(--dark-hl-3);
45
- --hl-4: var(--dark-hl-4);
46
- --hl-5: var(--dark-hl-5);
47
- --hl-6: var(--dark-hl-6);
48
- --hl-7: var(--dark-hl-7);
49
- --hl-8: var(--dark-hl-8);
50
- --hl-9: var(--dark-hl-9);
51
- --code-background: var(--dark-code-background);
52
- } }
53
-
54
- :root[data-theme='light'] {
55
- --hl-0: var(--light-hl-0);
56
- --hl-1: var(--light-hl-1);
57
- --hl-2: var(--light-hl-2);
58
- --hl-3: var(--light-hl-3);
59
- --hl-4: var(--light-hl-4);
60
- --hl-5: var(--light-hl-5);
61
- --hl-6: var(--light-hl-6);
62
- --hl-7: var(--light-hl-7);
63
- --hl-8: var(--light-hl-8);
64
- --hl-9: var(--light-hl-9);
65
- --code-background: var(--light-code-background);
66
- }
67
-
68
- :root[data-theme='dark'] {
69
- --hl-0: var(--dark-hl-0);
70
- --hl-1: var(--dark-hl-1);
71
- --hl-2: var(--dark-hl-2);
72
- --hl-3: var(--dark-hl-3);
73
- --hl-4: var(--dark-hl-4);
74
- --hl-5: var(--dark-hl-5);
75
- --hl-6: var(--dark-hl-6);
76
- --hl-7: var(--dark-hl-7);
77
- --hl-8: var(--dark-hl-8);
78
- --hl-9: var(--dark-hl-9);
79
- --code-background: var(--dark-code-background);
80
- }
81
-
82
- .hl-0 { color: var(--hl-0); }
83
- .hl-1 { color: var(--hl-1); }
84
- .hl-2 { color: var(--hl-2); }
85
- .hl-3 { color: var(--hl-3); }
86
- .hl-4 { color: var(--hl-4); }
87
- .hl-5 { color: var(--hl-5); }
88
- .hl-6 { color: var(--hl-6); }
89
- .hl-7 { color: var(--hl-7); }
90
- .hl-8 { color: var(--hl-8); }
91
- .hl-9 { color: var(--hl-9); }
92
- pre, code { background: var(--code-background); }
1
+ :root {
2
+ --light-hl-0: #008000;
3
+ --dark-hl-0: #6A9955;
4
+ --light-hl-1: #795E26;
5
+ --dark-hl-1: #DCDCAA;
6
+ --light-hl-2: #000000;
7
+ --dark-hl-2: #D4D4D4;
8
+ --light-hl-3: #A31515;
9
+ --dark-hl-3: #CE9178;
10
+ --light-hl-4: #AF00DB;
11
+ --dark-hl-4: #C586C0;
12
+ --light-hl-5: #001080;
13
+ --dark-hl-5: #9CDCFE;
14
+ --light-hl-6: #0000FF;
15
+ --dark-hl-6: #569CD6;
16
+ --light-hl-7: #0070C1;
17
+ --dark-hl-7: #4FC1FF;
18
+ --light-hl-8: #267F99;
19
+ --dark-hl-8: #4EC9B0;
20
+ --light-hl-9: #098658;
21
+ --dark-hl-9: #B5CEA8;
22
+ --light-hl-10: #000000FF;
23
+ --dark-hl-10: #D4D4D4;
24
+ --light-code-background: #FFFFFF;
25
+ --dark-code-background: #1E1E1E;
26
+ }
27
+
28
+ @media (prefers-color-scheme: light) { :root {
29
+ --hl-0: var(--light-hl-0);
30
+ --hl-1: var(--light-hl-1);
31
+ --hl-2: var(--light-hl-2);
32
+ --hl-3: var(--light-hl-3);
33
+ --hl-4: var(--light-hl-4);
34
+ --hl-5: var(--light-hl-5);
35
+ --hl-6: var(--light-hl-6);
36
+ --hl-7: var(--light-hl-7);
37
+ --hl-8: var(--light-hl-8);
38
+ --hl-9: var(--light-hl-9);
39
+ --hl-10: var(--light-hl-10);
40
+ --code-background: var(--light-code-background);
41
+ } }
42
+
43
+ @media (prefers-color-scheme: dark) { :root {
44
+ --hl-0: var(--dark-hl-0);
45
+ --hl-1: var(--dark-hl-1);
46
+ --hl-2: var(--dark-hl-2);
47
+ --hl-3: var(--dark-hl-3);
48
+ --hl-4: var(--dark-hl-4);
49
+ --hl-5: var(--dark-hl-5);
50
+ --hl-6: var(--dark-hl-6);
51
+ --hl-7: var(--dark-hl-7);
52
+ --hl-8: var(--dark-hl-8);
53
+ --hl-9: var(--dark-hl-9);
54
+ --hl-10: var(--dark-hl-10);
55
+ --code-background: var(--dark-code-background);
56
+ } }
57
+
58
+ :root[data-theme='light'] {
59
+ --hl-0: var(--light-hl-0);
60
+ --hl-1: var(--light-hl-1);
61
+ --hl-2: var(--light-hl-2);
62
+ --hl-3: var(--light-hl-3);
63
+ --hl-4: var(--light-hl-4);
64
+ --hl-5: var(--light-hl-5);
65
+ --hl-6: var(--light-hl-6);
66
+ --hl-7: var(--light-hl-7);
67
+ --hl-8: var(--light-hl-8);
68
+ --hl-9: var(--light-hl-9);
69
+ --hl-10: var(--light-hl-10);
70
+ --code-background: var(--light-code-background);
71
+ }
72
+
73
+ :root[data-theme='dark'] {
74
+ --hl-0: var(--dark-hl-0);
75
+ --hl-1: var(--dark-hl-1);
76
+ --hl-2: var(--dark-hl-2);
77
+ --hl-3: var(--dark-hl-3);
78
+ --hl-4: var(--dark-hl-4);
79
+ --hl-5: var(--dark-hl-5);
80
+ --hl-6: var(--dark-hl-6);
81
+ --hl-7: var(--dark-hl-7);
82
+ --hl-8: var(--dark-hl-8);
83
+ --hl-9: var(--dark-hl-9);
84
+ --hl-10: var(--dark-hl-10);
85
+ --code-background: var(--dark-code-background);
86
+ }
87
+
88
+ .hl-0 { color: var(--hl-0); }
89
+ .hl-1 { color: var(--hl-1); }
90
+ .hl-2 { color: var(--hl-2); }
91
+ .hl-3 { color: var(--hl-3); }
92
+ .hl-4 { color: var(--hl-4); }
93
+ .hl-5 { color: var(--hl-5); }
94
+ .hl-6 { color: var(--hl-6); }
95
+ .hl-7 { color: var(--hl-7); }
96
+ .hl-8 { color: var(--hl-8); }
97
+ .hl-9 { color: var(--hl-9); }
98
+ .hl-10 { color: var(--hl-10); }
99
+ pre, code { background: var(--code-background); }
@@ -1 +1 @@
1
- window.navigationData = "eJyNlF1P2zAUQP/Lfa4IQwU0P64ICa3A1KZ7QTwY99IY/JHFN9vKxH9HarDUWNfOXnNyjmLn2g//gPAvgYCFtGhqv3byFWEGraQGBNC+xVAds5OGrIEZvGq3BXF2+vXyy/nZ+yx2YCFbTdLot7RSRfI21YArVLlKdcymOleI7a1sv+M+pJmIcB/+s/JTmh5znQFOla6lCfu0cHg4Zf7otNWkf6fbUUUwtRewwl89BrpxmtJGRE7TVGWNVJNJA8PTKfcwPrU/DFNaOGZTHcVO6nPvFGnvQqVy0you5qNMOmLjCD9k44S3rVS0po5NRNrlEiBgi0++d4r9hsiKenkZ29xpGWeekVSD7Co+UU4GATukFUqzWS05P9LVMpcAAdrKHW46U/tvMuDFnAul75RyITlpsRKqT1SU77Th1TttiuL90wsq4t2BFfX0kCeFzFFPInXXU5NZ+sByOggw3rcbR/z6IyztgU1v26iHynK3bSqnl+xI5y7ZcQC7HQ4bzTciV1TKdNJtvb1x7J+MsPQrg0FsOfkASiJ7RUY/VCF3TY4z1HSeyLBzFFlJ1xaXfsfaAyrJnvV8TgEBfzQ1C6ka9nsjTD94/v74Abx58Vc="
1
+ window.navigationData = "eJyNlF1v2jAUQP+Ln9HaoX5oPJZqEiqDCkJfpj245pZ49Vfjm21s2n+fICU4zo2915yco9jx9dc/DOEXsgmbcg2qsGvDX4GNmONYsgnDvQN/EbIPJWrFRuxVmi2bjC8/3X68Hv8dBR0nkSv5m6icSK5xD2KwErJ8B9wX7h5g7/uZFv1n5YmrGoY6DcyVPnPl93Hh+DBnzjTfwdRqV4H30pqlQ2lN72sGXsvVHyupJcofvc1uQa6wgrcaPM6MxLgRoFxlDVigigPN06x7OJyFPR7VXiFguY4g5+ClNuK4lRdicBZurjqZ/gEOI/QR7iasdlzgGisy0dJEYgvPtjaC/IYTS+rpZWwHZ7GTeQEUJZCreEcJeQe4Aq42qznln2kiIQ9TsalUYe+4h5srKhS/k8r5aI6DiiemOZIXUtHqQqqkuHz+DgJpt2FJnRjysDAw6lGkqGosB5besISurHUbg/T6W5gI6PguP+uaustjOb7COzp1hXcDUO2g2Wi6EfBEpuJma/XMkH+yhYmAVwCOko8gJZJXZOAPXpOdDJaVRVTkOTqxlC41zO2OtBuUki3p2YTyU2I55aIkv7eFvcC3f/16Em8="
@@ -1 +1 @@
1
- window.searchData = "eJydmN1u4zYQhd9lroXYpGwn5mVTFAiaboskuzdCUCgyk7DRjyvS2WYFv3tBUQNQg3FD9yrBGZ/PEn1GFGeAvvtuQRUDvJl2B0out5diLTNoy0aDguuy0fVDd9+WbxoyOPQ1KHAfe20Xceni1TU1ZFDVpbXaggI4ZqeY1+XeuLI2PygRCz/O4/2sq1PEuHQmU+9/K/e/6g9LkVj5sP+H+K2sD/oEM9TOov5S1vaD0EbtLMofvWmMM+90+VA/b+3u9N8Hbd1NaxzhYaU17izivXYPriawIJ7H8Vl96MbkUhqWGv3fzM0KcVBxzfF8aCtnutYuqtQGmSFpkmfApCzHuK7Zl5W7dz2Hw2Kfitvpp+7QVty1YSkVteOaNsade7MKnrWrXjV3p1MlFfSi3Z0u6693t5TV2gUW725TcaYpX/TXvn7ofiqt3qwotLUL+pFUtLHzBwAS7WKqpIKM/WJqFvPFpPYDGPv701+6ciwnlFJRxtJn0pyW9mSaAR/6g3vllyqUUlF11+2/to5dL6ylrhk0ZJNBlF00n20yFET3lhnqs72FwHT/osMvxvKwXLlUJPRlu+uam5ZLB9ZS4wG21npPQa1djHoqxHK7AbLswp67I/i95LXvnKu5zGIpFeVMo2+7F44UKqkg13GMLtX+3bjX67J65e4Ja+xNPWZg2p3+B9QA77q3pmtBgbzIL7aQwbPR9c6/eYbvyfxW1egxHbuuOoz/Pk4f+6Yr1/X+w+HTiyVkxTKTm4t8Kx4fswLNY2EUkIHKZBSQFYIzCmpEZTJKyArJGSU1ojIZc8iKPMvFxWq7nRlzakRlMq4gK1accUWNqEzGNWTFmjOuqRGVybiBrNhwxg01ojIZLyErLjnjJTWiMhmvICuuOOMVNaIyGbeQFVvu59hSIyoYgFPRCRUSARKeU+kJFeKd50f4VIgld6+CRiiWgtknQwjWTGMUS8G8OhVdQZMUS8HrAyIk+8U0TbEUzD4kgs2+oImKpWD2QRFs/gVNVSwFsw+LYHtA0GTFUjD7wAi2DwRNVyyFx4RPjGB7QdJ8xVIwj/li+0HSgMVSMI8B27JmGrBYCmYfGcmmU9KAxVIwjwFj0ylpwmIpmH1mJJswSRMWS8HsMyPZhEmasFgKZp8ZySZM0oTFUjD7zEg2YZImLJaC+dTTK1SIdx6w3EdGsunMacBiKZh9ZCSbzpwGLJaCedwC2XTmNGCxFMxjwNh05jRgKD2OLxDvund6dxNeJIoinLldZ8OZe4A/p3eMJb6wDLAENRwzEOPfI75ZuKDil4y18TrwnDnDCcQNICacSMOFQ7X1J27EgRJ4eZ4nk0B4oJ5h4svKEzH8DeJQRA0gpxtcJQL1vin3b+OhBXmgcuQNkHphI+d9OrMgCRS+eqoB0q7oORyBkQBqjYQB1mkEnBwgA5TABfJLnUZ50a7XZe1fkmMQrowHbZJA4zTg0Neue5oGBogDJXB5PO4yDWfpCimBS+QpV4mU1sxvbIOMAcQ2kdFNAwLEgBKXiBlAprWssXs8/s9IV0gaQKZ1q7FumgogBpTYImYAmdar/tR/CBMB5PjhI3IGkGk9QfvKU7DlPSWtH9iuknHDp+V5POV3OARAFCiJifaotESzvxfmRw2QRgljAtPO8iOxIfzVpDVEH8bQZhxQIwkUBlENkMax2jk3+80xgWqAtK6aBhlIACWxM/3tJDL8Xui6KswxEAUKc6wG2AarTGtTHFXMrgt/Lf+AT2tTP6eo/QQDKaAkrrGnpLWoH18gAJTEFfaAtOb0Q4oqDDCQA0ri4njOZ815PPp3kb3Z69q0GlTxeDz+C1kStC8=";
1
+ window.searchData = "eJydmdtu4zYQQP+FfRUSc+j7Y1MUCLrdLZLsvghGochMzEa3lehs0yD/vqAkW0NxnI7zlECjOaKoM6Q0fhV1+aMR6/hVPJliK9YwWS3kDCJRJLkWa3GV5Dq7K2+L5EmLSOzrTKyFfal0c4lDFzubZyISaZY0jW7EWoi36DSzMjbJzH8h8RA4i/ebTk8RcehMpq7+TKo/9EsTII+RjxC/Jdlen2B2sbOovydZ8zKitcfOolznyaO+KvOq1k1jyuJLZU1ZjEd54qx3ryQnMD1eJu1zy/oM8i9eFrpIJKqk1oV9Z/wnxvF9n2TGjqft3UEMKR8dwXjO/6pNbqx5Hit7PH7WE7zR3/e6sdeFsSMeipxFvNX2zmYjWHfwPI5bH+7KdrUY01DoXeYcOUQtSA/7Im3n+zLlLkoeMlg9MJC1fsx9y5PU3tqawh2DXNxW35f7IqXGdgjxUe/e6pa7WCLkg7bpTlN32ke4oEdtb3SSfb35RLCGIBdnXD1+rbO78tek0fMpAR2fwkY3/qKLiM3/L70e6LPJSMxnw64H03y5/0enluR0IT4qXJMwjbcyecC7em939FR1IS4qK8vqa2HJ+TrGuLB8tLEPqJyxsfug0X7uoRj7OYbp+lF3T4zkoTAXWSfFtsyvC8qOY4wLazKtKwLUHmdDqN0AsT6wI9hdXVqbUc4eQmyUyfWn8pEidRE2qKQYJTf9h7G7qyTdUfd0jFGwTSRMsdX/ivWreNa1exMRawEX6mIlIvFgdLZ1b/vddSK3VeW6tWNbpvv2301/2jed2rJ2J3dnX05EFE8iWFyAVJtNFB+S20B74MAYjrSJUkSxpBJlkCi9RBBRDFQiBIngJSoRxSpScKFAeokqSFRe4lRE8ZRKnAaJUy9xJqJ4RiXOgsSZlzgXUTynEudB4txLXIgoXlCJiyBx4SUuRRQvqcRlkLj0ElciildU4ipIXPkCOB/khEqVoTxyZE+rjySTCYF8g6TzQpIOyVAi6Vsk1SnjZeiR9EWS05PShypJ3yXpDJGkvzLUSfo+SWeJJB2WoVLSd0ouTlWcDK2SvlbSySLJGpChWdJXSzphJFkHMrRL+npBqxdZCxDqBb5e0OpF1gOEesFogWr1ImsCiDXK1wucMUBWBYR+ge8XOGWArAoIBQNfMHDKAJDJoWDgCwZOGSDthFAw8AWDVjDSTggNA98wcM4AaRiEhoFvGDhngDQMQsPAN0w5Z4A0TIWGKd8w5ZwB0jAVGqZ8w9TpBUyFhqnRNtgaRuqpiJ3QN0w5ZxSppwoNU75hyjmjSD1VaJjyDVPOGUXqqULD+kPti8+zrq3eXncvQHHc9Qps2XS9glfxd/9uNDm8aL2KiVi/vkVCKvf3bXgjao8eX4pcrB0H+nwecHLAyR435eG6ZkDjOgUIpxBvxgYdWmQDaDFwFizM0GpAo5mi0cyZGHqeYCBBP0/ccekqT6qn9ptt4KF54j2+nvPcf7INJHSPvCf30HUABsJsIPAe2bFxgqYaQeSSRXnUttZJ5r4RMGiOQCsWqG2GpEP/sjx0gAcqgvI8aJn7OrPlfd+DQUNEcsKEh2uCWZdLRJFMSmH8yVohBjAZZd9zQXKjRQV4OpqmGvotiITWE+DpaBrbN1oQBpcbz0nXSNl3TRbEQWUGvAdP1CqgEgNe1ZOVCqhGgFcjbeOkPPRVEAoJDbwqIZ8X8odHOf6WMDCQx7yb6ro3pvAdREWleEVVd78OmPZ3A1QUyGbJIzXaWutXFt4YedXZ95jQLaGZUUyG2+5tmXYtJjQcVBCy34AUr+CHFhMaGXruilfwromUufYS2sPQRCtesbveEgKgSVa8MncdpLTrLiEOmh3FKPNNJCpT6cwUWqzjzdvbT3XIt20=";