befly-tpl 3.0.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.
Files changed (142) hide show
  1. package/.env.development +83 -0
  2. package/LICENSE +201 -0
  3. package/README.md +20 -0
  4. package/README.ts.md +175 -0
  5. package/addon-loader.example.ts +99 -0
  6. package/addons/_template/README.md +123 -0
  7. package/addons/_template/addon.config.json +17 -0
  8. package/addons/_template/apis/example.ts +33 -0
  9. package/addons/_template/checks/example.ts +23 -0
  10. package/addons/_template/config/default.ts +12 -0
  11. package/addons/_template/plugins/example.ts +39 -0
  12. package/addons/_template/tables/example.json +7 -0
  13. package/addons/_template/types/index.d.ts +21 -0
  14. package/addons/admin/README.md +179 -0
  15. package/addons/admin/addon.config.json +13 -0
  16. package/addons/admin/apis/adminDel.ts +37 -0
  17. package/addons/admin/apis/adminInfo.ts +50 -0
  18. package/addons/admin/apis/adminIns.ts +70 -0
  19. package/addons/admin/apis/adminList.ts +24 -0
  20. package/addons/admin/apis/adminRoleDetail.ts +38 -0
  21. package/addons/admin/apis/adminRoleSave.ts +40 -0
  22. package/addons/admin/apis/adminUpd.ts +54 -0
  23. package/addons/admin/apis/apiAll.ts +38 -0
  24. package/addons/admin/apis/cacheRefresh.ts +36 -0
  25. package/addons/admin/apis/dashboardAddonList.ts +16 -0
  26. package/addons/admin/apis/dashboardChangelog.ts +41 -0
  27. package/addons/admin/apis/dashboardConfigStatus.ts +56 -0
  28. package/addons/admin/apis/dashboardEnvironmentInfo.ts +48 -0
  29. package/addons/admin/apis/dashboardPerformanceMetrics.ts +25 -0
  30. package/addons/admin/apis/dashboardPermissionStats.ts +33 -0
  31. package/addons/admin/apis/dashboardServiceStatus.ts +84 -0
  32. package/addons/admin/apis/dashboardSystemInfo.ts +34 -0
  33. package/addons/admin/apis/dashboardSystemOverview.ts +34 -0
  34. package/addons/admin/apis/dashboardSystemResources.ts +119 -0
  35. package/addons/admin/apis/dictAll.ts +26 -0
  36. package/addons/admin/apis/dictDel.ts +27 -0
  37. package/addons/admin/apis/dictDetail.ts +28 -0
  38. package/addons/admin/apis/dictIns.ts +38 -0
  39. package/addons/admin/apis/dictList.ts +27 -0
  40. package/addons/admin/apis/dictUpd.ts +44 -0
  41. package/addons/admin/apis/login.ts +123 -0
  42. package/addons/admin/apis/logout.ts +23 -0
  43. package/addons/admin/apis/menuAll.ts +70 -0
  44. package/addons/admin/apis/menuDel.ts +40 -0
  45. package/addons/admin/apis/menuIns.ts +31 -0
  46. package/addons/admin/apis/menuList.ts +26 -0
  47. package/addons/admin/apis/menuUpd.ts +41 -0
  48. package/addons/admin/apis/register.ts +50 -0
  49. package/addons/admin/apis/roleApiDetail.ts +34 -0
  50. package/addons/admin/apis/roleApiSave.ts +44 -0
  51. package/addons/admin/apis/roleDel.ts +48 -0
  52. package/addons/admin/apis/roleDetail.ts +28 -0
  53. package/addons/admin/apis/roleIns.ts +40 -0
  54. package/addons/admin/apis/roleList.ts +18 -0
  55. package/addons/admin/apis/roleMenuDetail.ts +33 -0
  56. package/addons/admin/apis/roleMenuSave.ts +39 -0
  57. package/addons/admin/apis/roleSave.ts +45 -0
  58. package/addons/admin/apis/roleUpd.ts +53 -0
  59. package/addons/admin/apis/sendSmsCode.ts +36 -0
  60. package/addons/admin/checks/admin.ts +36 -0
  61. package/addons/admin/config/index.ts +45 -0
  62. package/addons/admin/config/menu.json +44 -0
  63. package/addons/admin/scripts/syncApi.ts +285 -0
  64. package/addons/admin/scripts/syncDev.ts +203 -0
  65. package/addons/admin/scripts/syncMenu.ts +210 -0
  66. package/addons/admin/tables/admin.json +14 -0
  67. package/addons/admin/tables/api.json +8 -0
  68. package/addons/admin/tables/dict.json +8 -0
  69. package/addons/admin/tables/menu.json +8 -0
  70. package/addons/admin/tables/role.json +8 -0
  71. package/addons/admin/types/index.ts +44 -0
  72. package/addons/admin/util.ts +266 -0
  73. package/addons/befly/addon.config.json +13 -0
  74. package/addons/befly/apis/health/info.ts +77 -0
  75. package/addons/befly/apis/tool/tokenCheck.ts +52 -0
  76. package/addons/demo/README.md +62 -0
  77. package/addons/demo/addon.config.json +13 -0
  78. package/addons/demo/apis/demoIns.ts +36 -0
  79. package/addons/demo/apis/demoList.ts +36 -0
  80. package/addons/demo/checks/demo.ts +30 -0
  81. package/addons/demo/config/default.ts +17 -0
  82. package/addons/demo/plugins/tool.ts +61 -0
  83. package/addons/demo/tables/todo.json +6 -0
  84. package/addons/demo/types/index.d.ts +56 -0
  85. package/apis/article/articleDel.ts +33 -0
  86. package/apis/article/articleDetail.ts +26 -0
  87. package/apis/article/articleIns.ts +47 -0
  88. package/apis/article/articleList.ts +47 -0
  89. package/apis/article/articleUpd.ts +55 -0
  90. package/apis/article/increment.ts +37 -0
  91. package/apis/test/hi.ts +9 -0
  92. package/apis/user/login.ts +56 -0
  93. package/apis/user/userList.ts +40 -0
  94. package/bun.lock +140 -0
  95. package/checks/demo.ts +25 -0
  96. package/logs/2025-08-22.0.log +197 -0
  97. package/logs/2025-08-23.0.log +151 -0
  98. package/logs/2025-08-24.0.log +296 -0
  99. package/logs/2025-08-25.0.log +162 -0
  100. package/logs/2025-08-26.0.log +19 -0
  101. package/logs/2025-08-27.0.log +63 -0
  102. package/logs/2025-08-28.0.log +286 -0
  103. package/logs/2025-08-30.0.log +1 -0
  104. package/logs/2025-09-01.0.log +296 -0
  105. package/logs/2025-09-02.0.log +298 -0
  106. package/logs/2025-10-11.0.log +2718 -0
  107. package/logs/2025-10-12.0.log +4374 -0
  108. package/logs/2025-10-13.0.log +759 -0
  109. package/logs/2025-10-14.0.log +2350 -0
  110. package/logs/2025-10-15.0.log +2386 -0
  111. package/logs/2025-10-16.0.log +2807 -0
  112. package/logs/2025-10-17.0.log +1143 -0
  113. package/logs/2025-10-18.0.log +1292 -0
  114. package/logs/2025-10-19.0.log +1752 -0
  115. package/logs/2025-10-20.0.log +722 -0
  116. package/logs/2025-10-21.0.log +1075 -0
  117. package/logs/2025-10-23.0.log +3291 -0
  118. package/logs/2025-10-24.0.log +2341 -0
  119. package/logs/2025-10-25.0.log +1367 -0
  120. package/logs/debug.0.log +25174 -0
  121. package/main.ts +9 -0
  122. package/package.json +29 -0
  123. package/pm2.config.cjs +85 -0
  124. package/tables/article.json +11 -0
  125. package/tables/user.json +8 -0
  126. package/temp/addon-route-prefix-migration.md +400 -0
  127. package/temp/api-route-conflict-analysis.md +441 -0
  128. package/temp/interactive-cli-guide.md +199 -0
  129. package/temp/missing-apis-fix.md +362 -0
  130. package/temp/remove-status-field.md +239 -0
  131. package/temp/roleid-to-rolecode-optimization.md +321 -0
  132. package/temp/status-to-state-migration-complete.md +176 -0
  133. package/temp/syncMenu-guide.md +235 -0
  134. package/temp/test-admin-menus-cache.ts +125 -0
  135. package/temp/test-admin-menus.ts +110 -0
  136. package/temp/test-interactive-cli.ps1 +14 -0
  137. package/tests/core.test.ts +13 -0
  138. package/tsconfig.json +23 -0
  139. package/types/api.ts +128 -0
  140. package/types/index.ts +6 -0
  141. package/types/models.example.ts +267 -0
  142. package/types/models.ts +67 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Demo Addon 默认配置
3
+ */
4
+
5
+ export default {
6
+ // 是否启用组件
7
+ enabled: process.env.DEMO_ENABLE !== 'false',
8
+
9
+ // 默认优先级
10
+ defaultPriority: process.env.DEMO_DEFAULT_PRIORITY || 'medium',
11
+
12
+ // 每页默认数量
13
+ defaultPageSize: Number(process.env.DEMO_PAGE_SIZE) || 10,
14
+
15
+ // 最大每页数量
16
+ maxPageSize: Number(process.env.DEMO_MAX_PAGE_SIZE) || 100
17
+ };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Demo Addon 工具插件
3
+ * 提供待办事项相关的工具函数
4
+ */
5
+
6
+ import { Logger } from 'befly';
7
+
8
+ export default {
9
+ name: 'tool',
10
+ version: '1.0.0',
11
+ priority: 100,
12
+
13
+ async onLoad(befly) {
14
+ Logger.info('[Demo] 工具插件加载中...');
15
+ },
16
+
17
+ async onInit(befly) {
18
+ Logger.info('[Demo] 工具插件初始化中...');
19
+
20
+ return {
21
+ /**
22
+ * 验证优先级
23
+ */
24
+ validatePriority(priority: string): boolean {
25
+ return ['low', 'medium', 'high'].includes(priority);
26
+ },
27
+
28
+ /**
29
+ * 格式化待办数据
30
+ */
31
+ formatTodo(todo: any) {
32
+ return {
33
+ id: todo.id,
34
+ title: todo.title,
35
+ content: todo.content,
36
+ priority: todo.priority,
37
+ completed: Boolean(todo.completed),
38
+ priorityLabel:
39
+ {
40
+ low: '低',
41
+ medium: '中',
42
+ high: '高'
43
+ }[todo.priority] || '未知',
44
+ statusLabel: todo.completed ? '已完成' : '未完成',
45
+ createdAt: todo.created_at,
46
+ createdAtFormatted: new Date(Number(todo.created_at)).toLocaleString('zh-CN')
47
+ };
48
+ },
49
+
50
+ /**
51
+ * 获取配置
52
+ */
53
+ getConfig() {
54
+ return {
55
+ enabled: process.env.DEMO_ENABLE !== 'false',
56
+ defaultPriority: process.env.DEMO_DEFAULT_PRIORITY || 'medium'
57
+ };
58
+ }
59
+ };
60
+ }
61
+ } as BeflyPlugin;
@@ -0,0 +1,6 @@
1
+ {
2
+ "title": "标题|string|1|100|null|1|null",
3
+ "content": "内容|string|0|1000|null|0|null",
4
+ "completed": "是否完成|number|0|1|0|1|null",
5
+ "priority": "优先级|string|1|10|medium|1|^(low|medium|high)$"
6
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Demo Addon 类型定义
3
+ */
4
+
5
+ declare global {
6
+ namespace Befly {
7
+ interface Context {
8
+ /**
9
+ * Demo 工具插件
10
+ */
11
+ 'demo.tool'?: {
12
+ /**
13
+ * 验证优先级
14
+ */
15
+ validatePriority(priority: string): boolean;
16
+
17
+ /**
18
+ * 格式化待办数据
19
+ */
20
+ formatTodo(todo: any): {
21
+ id: number;
22
+ title: string;
23
+ content: string;
24
+ priority: string;
25
+ completed: boolean;
26
+ priorityLabel: string;
27
+ statusLabel: string;
28
+ createdAt: number;
29
+ createdAtFormatted: string;
30
+ };
31
+
32
+ /**
33
+ * 获取配置
34
+ */
35
+ getConfig(): {
36
+ enabled: boolean;
37
+ defaultPriority: string;
38
+ };
39
+ };
40
+ }
41
+ }
42
+ }
43
+
44
+ /**
45
+ * 待办事项数据结构
46
+ */
47
+ export interface Todo {
48
+ id: number;
49
+ title: string;
50
+ content: string;
51
+ completed: number;
52
+ priority: 'low' | 'medium' | 'high';
53
+ createdAt: number;
54
+ }
55
+
56
+ export {};
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 删除文章接口(软删除)
3
+ */
4
+
5
+ import { Yes, No, Fields } from 'befly';
6
+
7
+ export default {
8
+ name: '删除文章',
9
+ auth: false,
10
+ fields: {
11
+ id: Fields._id
12
+ },
13
+ required: ['id'],
14
+ handler: async (befly, ctx) => {
15
+ // 检查文章是否存在
16
+ const article = await befly.db.getOne({
17
+ table: 'article',
18
+ where: { id: ctx.body.id }
19
+ });
20
+
21
+ if (!article) {
22
+ return No('文章不存在');
23
+ }
24
+
25
+ // 软删除
26
+ const result = await befly.db.delData({
27
+ table: 'article',
28
+ where: { id: ctx.body.id }
29
+ });
30
+
31
+ return Yes('删除成功', { affected: result });
32
+ }
33
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 获取文章详情接口
3
+ */
4
+
5
+ import { Yes, No, Fields } from 'befly';
6
+
7
+ export default {
8
+ name: '获取文章详情',
9
+ auth: false,
10
+ fields: {
11
+ id: Fields._id
12
+ },
13
+ required: ['id'],
14
+ handler: async (befly, ctx) => {
15
+ const article = await befly.db.getOne({
16
+ table: 'article',
17
+ where: { id: ctx.body.id }
18
+ });
19
+
20
+ if (!article) {
21
+ return No('文章不存在');
22
+ }
23
+
24
+ return Yes('获取成功', article);
25
+ }
26
+ };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 创建文章接口 - TypeScript 示例
3
+ */
4
+
5
+ import { Yes } from 'befly';
6
+
7
+ import articleTable from '../../tables/article.json';
8
+
9
+ export default {
10
+ name: '创建文章',
11
+ auth: false,
12
+ fields: {
13
+ title: articleTable.title,
14
+ content: articleTable.content,
15
+ summary: articleTable.summary,
16
+ coverImage: articleTable.coverImage,
17
+ author: articleTable.author,
18
+ category: articleTable.category,
19
+ tags: articleTable.tags,
20
+ viewCount: articleTable.viewCount,
21
+ status: articleTable.status
22
+ },
23
+ required: ['title', 'content'],
24
+ handler: async (befly, ctx) => {
25
+ const userId = ctx.jwt?.userId || '1'; // 临时使用固定ID测试
26
+
27
+ // 插入文章
28
+ const articleId = await befly.db.insData({
29
+ table: 'article',
30
+ data: {
31
+ title: ctx.body.title,
32
+ content: ctx.body.content,
33
+ summary: ctx.body.summary,
34
+ coverImage: ctx.body.coverImage,
35
+ author: ctx.body.author,
36
+ category: ctx.body.category,
37
+ tags: ctx.body.tags,
38
+ viewCount: ctx.body.viewCount || 0,
39
+ status: ctx.body.status,
40
+ authorId: parseInt(userId),
41
+ published: 0
42
+ }
43
+ });
44
+
45
+ return Yes('创建成功', { articleId });
46
+ }
47
+ };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 获取文章列表接口 - TypeScript 示例
3
+ */
4
+
5
+ import { Yes, Fields } from 'befly';
6
+
7
+ export default {
8
+ name: '获取文章列表',
9
+ auth: false,
10
+ fields: {
11
+ page: Fields.page,
12
+ limit: Fields.limit,
13
+ categoryId: '分类ID|number|0|999999|null|0|null',
14
+ authorId: '作者ID|number|0|999999|null|0|null',
15
+ keyword: Fields.keyword,
16
+ published: '是否发布|number|0|1|null|0|^(0|1)'
17
+ },
18
+ handler: async (befly, ctx) => {
19
+ // 构建查询条件
20
+ let where = params.where || {};
21
+
22
+ // 兼容旧的查询参数
23
+ if (params.categoryId) {
24
+ where.categoryId = params.categoryId;
25
+ }
26
+ if (params.authorId) {
27
+ where.authorId = params.authorId;
28
+ }
29
+ if (params.keyword) {
30
+ where.title = { $like: `%${params.keyword}%` };
31
+ }
32
+ if (typeof params.published !== 'undefined') {
33
+ where.published = params.published;
34
+ }
35
+
36
+ // 查询文章列表
37
+ const result = await befly.db.getList({
38
+ table: 'article',
39
+ where,
40
+ page: params.page || 1,
41
+ limit: params.limit || 10,
42
+ orderBy: params.orderBy || ['createdAt#DESC']
43
+ });
44
+
45
+ return Yes('查询成功', result);
46
+ }
47
+ };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * 更新文章接口
3
+ */
4
+
5
+ import { Yes, No, Fields } from 'befly';
6
+
7
+ import articleTable from '../../tables/article.json';
8
+
9
+ export default {
10
+ name: '更新文章',
11
+ auth: false,
12
+ fields: {
13
+ id: Fields._id,
14
+ title: articleTable.title,
15
+ content: articleTable.content,
16
+ summary: articleTable.summary,
17
+ coverImage: articleTable.coverImage,
18
+ author: articleTable.author,
19
+ category: articleTable.category,
20
+ tags: articleTable.tags,
21
+ viewCount: articleTable.viewCount,
22
+ status: articleTable.status
23
+ },
24
+ required: ['id'],
25
+ handler: async (befly, ctx) => {
26
+ // 检查文章是否存在
27
+ const article = await befly.db.getOne({
28
+ table: 'article',
29
+ where: { id: ctx.body.id }
30
+ });
31
+
32
+ if (!article) {
33
+ return No('文章不存在');
34
+ }
35
+
36
+ // 更新文章
37
+ const result = await befly.db.updData({
38
+ table: 'article',
39
+ where: { id: ctx.body.id },
40
+ data: {
41
+ title: ctx.body.title,
42
+ content: ctx.body.content,
43
+ summary: ctx.body.summary,
44
+ coverImage: ctx.body.coverImage,
45
+ author: ctx.body.author,
46
+ category: ctx.body.category,
47
+ tags: ctx.body.tags,
48
+ viewCount: ctx.body.viewCount,
49
+ status: ctx.body.status
50
+ }
51
+ });
52
+
53
+ return Yes('更新成功', { affected: result });
54
+ }
55
+ };
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 文章字段增量接口
3
+ */
4
+
5
+ import { Yes, No, Fields } from 'befly';
6
+
7
+ export default {
8
+ name: '文章字段增量',
9
+ auth: false,
10
+ fields: {
11
+ id: Fields._id,
12
+ field: '字段名|string|1|50|null|1|^[a-zA-Z_][a-zA-Z0-9_]*$',
13
+ value: '自增值|number|-999999|999999|1|0|null'
14
+ },
15
+ required: ['id', 'field'],
16
+ handler: async (befly, ctx) => {
17
+ // 检查文章是否存在
18
+ const article = await befly.db.getOne({
19
+ table: 'article',
20
+ where: { id: ctx.body.id }
21
+ });
22
+
23
+ if (!article) {
24
+ return No('文章不存在');
25
+ }
26
+
27
+ // 执行自增
28
+ const result = await befly.db.increment({
29
+ table: 'article',
30
+ where: { id: ctx.body.id },
31
+ field: ctx.body.field,
32
+ value: ctx.body.value || 1
33
+ });
34
+
35
+ return Yes('自增成功', { affected: result });
36
+ }
37
+ };
@@ -0,0 +1,9 @@
1
+ import { Yes } from 'befly';
2
+
3
+ export default {
4
+ name: '测试接口',
5
+ handler: async (befly, ctx) => {
6
+ // 返回成功信息
7
+ return Yes('测试成功');
8
+ }
9
+ };
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 用户登录接口 - TypeScript 示例
3
+ */
4
+
5
+ import { Yes, No } from 'befly';
6
+ import { Crypto2 } from 'befly';
7
+ import { Jwt } from 'befly';
8
+
9
+ export default {
10
+ name: '用户登录',
11
+ auth: false, // 公开接口
12
+ fields: {
13
+ username: '用户名|string|3|50|null|0|^[a-zA-Z0-9_]+$',
14
+ password: '密码|string|6|100|null|0|null'
15
+ },
16
+ required: ['username', 'password'],
17
+ handler: async (befly, ctx) => {
18
+ // 查询用户
19
+ const user = await befly.db.getOne({
20
+ table: 'user',
21
+ where: { username: ctx.body.username }
22
+ });
23
+
24
+ if (!user) {
25
+ return No('用户名或密码错误');
26
+ }
27
+
28
+ // 验证密码
29
+ const isValid = await Crypto2.verifyPassword(ctx.body.password, user.password);
30
+ if (!isValid) {
31
+ return No('用户名或密码错误');
32
+ }
33
+
34
+ // 生成 JWT Token
35
+ const token = await Jwt.sign(
36
+ {
37
+ userId: user.id.toString(),
38
+ username: user.username,
39
+ role: user.role
40
+ },
41
+ {
42
+ expiresIn: '7d'
43
+ }
44
+ );
45
+
46
+ // 返回用户信息(不包含密码)
47
+ const { password: _, ...userWithoutPassword } = user;
48
+
49
+ const response = {
50
+ token,
51
+ user: userWithoutPassword
52
+ };
53
+
54
+ return Yes('登录成功', response);
55
+ }
56
+ };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 获取用户列表接口 - TypeScript 示例
3
+ */
4
+
5
+ import { Yes, Fields } from 'befly';
6
+
7
+ export default {
8
+ name: '获取用户列表',
9
+ auth: true, // 需要登录(权限由角色接口列表控制)
10
+ fields: {
11
+ page: Fields.page,
12
+ limit: Fields.limit,
13
+ role: '角色|string|0|20|null|0|^(admin|user|guest)$',
14
+ keyword: Fields.keyword
15
+ },
16
+ handler: async (befly, ctx) => {
17
+ const params = ctx.body as GetUsersRequest;
18
+
19
+ // 构建查询条件
20
+ const where = {};
21
+ if (params.role) {
22
+ where.role = params.role;
23
+ }
24
+ if (params.keyword) {
25
+ where.username = { $like: `%${params.keyword}%` };
26
+ }
27
+
28
+ // 查询用户列表(不返回密码字段)
29
+ const result = await befly.db.getList({
30
+ table: 'user',
31
+ fields: ['id', 'username', 'email', 'role', 'avatar', 'nickname', 'createdAt', 'updatedAt'],
32
+ where,
33
+ page: params.page || 1,
34
+ limit: params.limit || 10,
35
+ orderBy: ['createdAt#DESC']
36
+ });
37
+
38
+ return Yes('查询成功', result);
39
+ }
40
+ };
package/bun.lock ADDED
@@ -0,0 +1,140 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "workspaces": {
4
+ "": {
5
+ "name": "befly-template",
6
+ "dependencies": {
7
+ "befly": "../core",
8
+ "mysql2": "^3.15.2",
9
+ },
10
+ "devDependencies": {
11
+ "@types/bun": "latest",
12
+ },
13
+ },
14
+ },
15
+ "packages": {
16
+ "@types/bun": ["@types/bun@1.3.0", "", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="],
17
+
18
+ "@types/node": ["@types/node@24.7.2", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA=="],
19
+
20
+ "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="],
21
+
22
+ "ansi-escapes": ["ansi-escapes@7.0.0", "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="],
23
+
24
+ "ansi-regex": ["ansi-regex@6.2.0", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.0.tgz", {}, "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg=="],
25
+
26
+ "ansi-styles": ["ansi-styles@6.2.1", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
27
+
28
+ "aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="],
29
+
30
+ "befly": ["befly@file:../core", { "devDependencies": { "lint-staged": "^16.1.5", "prettier": "^3.6.2", "simple-git-hooks": "^2.13.1" } }],
31
+
32
+ "braces": ["braces@3.0.3", "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
33
+
34
+ "bun-types": ["bun-types@1.3.0", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="],
35
+
36
+ "chalk": ["chalk@5.6.0", "https://registry.npmmirror.com/chalk/-/chalk-5.6.0.tgz", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
37
+
38
+ "cli-cursor": ["cli-cursor@5.0.0", "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-5.0.0.tgz", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
39
+
40
+ "cli-truncate": ["cli-truncate@4.0.0", "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-4.0.0.tgz", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="],
41
+
42
+ "colorette": ["colorette@2.0.20", "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
43
+
44
+ "commander": ["commander@14.0.0", "https://registry.npmmirror.com/commander/-/commander-14.0.0.tgz", {}, "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA=="],
45
+
46
+ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
47
+
48
+ "debug": ["debug@4.4.1", "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
49
+
50
+ "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="],
51
+
52
+ "emoji-regex": ["emoji-regex@10.4.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.4.0.tgz", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
53
+
54
+ "environment": ["environment@1.1.0", "https://registry.npmmirror.com/environment/-/environment-1.1.0.tgz", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="],
55
+
56
+ "eventemitter3": ["eventemitter3@5.0.1", "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
57
+
58
+ "fill-range": ["fill-range@7.1.1", "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
59
+
60
+ "generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="],
61
+
62
+ "get-east-asian-width": ["get-east-asian-width@1.3.0", "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", {}, "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ=="],
63
+
64
+ "iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="],
65
+
66
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="],
67
+
68
+ "is-number": ["is-number@7.0.0", "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
69
+
70
+ "is-property": ["is-property@1.0.2", "", {}, "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="],
71
+
72
+ "lilconfig": ["lilconfig@3.1.3", "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
73
+
74
+ "lint-staged": ["lint-staged@16.1.5", "https://registry.npmmirror.com/lint-staged/-/lint-staged-16.1.5.tgz", { "dependencies": { "chalk": "^5.5.0", "commander": "^14.0.0", "debug": "^4.4.1", "lilconfig": "^3.1.3", "listr2": "^9.0.1", "micromatch": "^4.0.8", "nano-spawn": "^1.0.2", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A=="],
75
+
76
+ "listr2": ["listr2@9.0.2", "https://registry.npmmirror.com/listr2/-/listr2-9.0.2.tgz", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-VVd7cS6W+vLJu2wmq4QmfVj14Iep7cz4r/OWNk36Aq5ZOY7G8/BfCrQFexcwB1OIxB3yERiePfE/REBjEFulag=="],
77
+
78
+ "log-update": ["log-update@6.1.0", "https://registry.npmmirror.com/log-update/-/log-update-6.1.0.tgz", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
79
+
80
+ "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
81
+
82
+ "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
83
+
84
+ "lru.min": ["lru.min@1.1.2", "", {}, "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg=="],
85
+
86
+ "micromatch": ["micromatch@4.0.8", "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
87
+
88
+ "mimic-function": ["mimic-function@5.0.1", "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
89
+
90
+ "ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
91
+
92
+ "mysql2": ["mysql2@3.15.2", "", { "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.7.0", "long": "^5.2.1", "lru.min": "^1.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" } }, "sha512-kFm5+jbwR5mC+lo+3Cy46eHiykWSpUtTLOH3GE+AR7GeLq8PgfJcvpMiyVWk9/O53DjQsqm6a3VOOfq7gYWFRg=="],
93
+
94
+ "named-placeholders": ["named-placeholders@1.1.3", "", { "dependencies": { "lru-cache": "^7.14.1" } }, "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w=="],
95
+
96
+ "nano-spawn": ["nano-spawn@1.0.2", "https://registry.npmmirror.com/nano-spawn/-/nano-spawn-1.0.2.tgz", {}, "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg=="],
97
+
98
+ "onetime": ["onetime@7.0.0", "https://registry.npmmirror.com/onetime/-/onetime-7.0.0.tgz", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
99
+
100
+ "picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
101
+
102
+ "pidtree": ["pidtree@0.6.0", "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
103
+
104
+ "prettier": ["prettier@3.6.2", "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="],
105
+
106
+ "restore-cursor": ["restore-cursor@5.1.0", "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-5.1.0.tgz", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
107
+
108
+ "rfdc": ["rfdc@1.4.1", "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
109
+
110
+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
111
+
112
+ "seq-queue": ["seq-queue@0.0.5", "", {}, "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="],
113
+
114
+ "signal-exit": ["signal-exit@4.1.0", "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
115
+
116
+ "simple-git-hooks": ["simple-git-hooks@2.13.1", "https://registry.npmmirror.com/simple-git-hooks/-/simple-git-hooks-2.13.1.tgz", { "bin": { "simple-git-hooks": "cli.js" } }, "sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ=="],
117
+
118
+ "slice-ansi": ["slice-ansi@5.0.0", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="],
119
+
120
+ "sqlstring": ["sqlstring@2.3.3", "", {}, "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="],
121
+
122
+ "string-argv": ["string-argv@0.3.2", "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
123
+
124
+ "string-width": ["string-width@7.2.0", "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
125
+
126
+ "strip-ansi": ["strip-ansi@7.1.0", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
127
+
128
+ "to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
129
+
130
+ "undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="],
131
+
132
+ "wrap-ansi": ["wrap-ansi@9.0.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="],
133
+
134
+ "yaml": ["yaml@2.8.1", "https://registry.npmmirror.com/yaml/-/yaml-2.8.1.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="],
135
+
136
+ "log-update/slice-ansi": ["slice-ansi@7.1.0", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-7.1.0.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg=="],
137
+
138
+ "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", { "dependencies": { "get-east-asian-width": "^1.0.0" } }, "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA=="],
139
+ }
140
+ }