From 6ab1796f970349dfe5d565452f3a36db1b296ac0 Mon Sep 17 00:00:00 2001 From: GUARDiA AutoDeploy Date: Mon, 8 Jun 2026 00:08:59 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20guardia-messenger=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EA=B2=BD=EB=A1=9C=20=EC=A0=95=EC=83=81?= =?UTF-8?q?=ED=99=94=20(iamConductor-messenger=20=E2=86=92=20guardia-messe?= =?UTF-8?q?nger)=20[auto-sync]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(auth)/login.tsx | 61 +- app/(tabs)/_layout.tsx | 122 + app/(tabs)/accessibility.tsx | 76 + app/(tabs)/ai_agent.tsx | 111 + app/(tabs)/ai_briefing.tsx | 74 + app/(tabs)/ai_decision.tsx | 114 + app/(tabs)/ai_history.tsx | 55 + app/(tabs)/ai_soc.tsx | 100 + app/(tabs)/approval.tsx | 210 + app/(tabs)/audit_log.tsx | 77 + app/(tabs)/auto_sr.tsx | 87 + app/(tabs)/automation_rules.tsx | 72 + app/(tabs)/autonomous_ops.tsx | 113 + app/(tabs)/batch_action.tsx | 114 + app/(tabs)/camera_ar.tsx | 116 + app/(tabs)/capacity_plan.tsx | 80 + app/(tabs)/change_calendar.tsx | 117 + app/(tabs)/chat.tsx | 158 +- app/(tabs)/citizen_requests.tsx | 71 + app/(tabs)/cost_advice.tsx | 87 + app/(tabs)/cowork_sr.tsx | 101 + app/(tabs)/csap_audit_prep.tsx | 79 + app/(tabs)/csap_dashboard.tsx | 106 + app/(tabs)/cve_detail.tsx | 97 + app/(tabs)/delegation.tsx | 131 + app/(tabs)/dependency_map.tsx | 68 + app/(tabs)/deploy_history.tsx | 72 + app/(tabs)/devices.tsx | 175 + app/(tabs)/eol_alerts.tsx | 59 + app/(tabs)/esignature.tsx | 94 + app/(tabs)/failure_prediction.tsx | 64 + app/(tabs)/favorites.tsx | 73 + app/(tabs)/greenops_dashboard.tsx | 110 + app/(tabs)/health_scorecard.tsx | 78 + app/(tabs)/hw_warranty.tsx | 78 + app/(tabs)/insights.tsx | 12 +- app/(tabs)/institution_compare.tsx | 72 + app/(tabs)/ioc_search.tsx | 90 + app/(tabs)/jenkins_builds.tsx | 91 + app/(tabs)/kanban.tsx | 128 + app/(tabs)/kb_browser.tsx | 149 + app/(tabs)/kpi_dashboard.tsx | 67 + app/(tabs)/maintenance_window.tsx | 81 + app/(tabs)/meeting.tsx | 115 + app/(tabs)/meeting_minutes.tsx | 71 + app/(tabs)/meeting_sr.tsx | 115 + app/(tabs)/multi_tenant.tsx | 156 + app/(tabs)/multimodal.tsx | 124 + app/(tabs)/my_stats.tsx | 110 + app/(tabs)/narasajang_status.tsx | 67 + app/(tabs)/narasajang_sw.tsx | 376 + app/(tabs)/nfc_asset.tsx | 82 + app/(tabs)/notifications.tsx | 2 +- app/(tabs)/offline_ai.tsx | 109 + app/(tabs)/ollama_status.tsx | 81 + app/(tabs)/on_device_ai.tsx | 111 + app/(tabs)/pdf_share.tsx | 115 + app/(tabs)/pii_status.tsx | 80 + app/(tabs)/policy_alerts.tsx | 59 + app/(tabs)/predictive_alert.tsx | 105 + app/(tabs)/qr_apk.tsx | 95 + app/(tabs)/qr_scan.tsx | 210 + app/(tabs)/quick_command.tsx | 105 + app/(tabs)/recent_screens.tsx | 71 + app/(tabs)/release_notes.tsx | 87 + app/(tabs)/security_log.tsx | 147 + app/(tabs)/security_score.tsx | 76 + app/(tabs)/self_healing.tsx | 107 + app/(tabs)/server_dashboard.tsx | 189 + app/(tabs)/sla_exception.tsx | 116 + app/(tabs)/smart_search.tsx | 109 + app/(tabs)/sr_batch.tsx | 161 + app/(tabs)/sr_chat_room.tsx | 142 + app/(tabs)/sr_detail.tsx | 224 + app/(tabs)/sr_heatmap.tsx | 74 + app/(tabs)/sr_quick.tsx | 200 + app/(tabs)/ssl_alerts.tsx | 60 + app/(tabs)/team_leaderboard.tsx | 66 + app/(tabs)/theme_settings.tsx | 106 + app/(tabs)/threat_feed.tsx | 70 + app/(tabs)/todo_list.tsx | 70 + app/(tabs)/vm_status.tsx | 75 + app/(tabs)/whiteboard.tsx | 102 + app/(tabs)/work_calendar.tsx | 104 + app/_layout.tsx | 78 +- assets/icons/guardia/brand-1/original_16.png | Bin 0 -> 910 bytes assets/icons/guardia/brand-1/original_24.png | Bin 0 -> 1651 bytes assets/icons/guardia/brand-1/original_32.png | Bin 0 -> 2579 bytes assets/icons/guardia/brand-1/original_48.png | Bin 0 -> 4949 bytes assets/icons/guardia/brand-1/original_64.png | Bin 0 -> 7770 bytes assets/icons/guardia/brand-2/original_16.png | Bin 0 -> 440 bytes assets/icons/guardia/brand-2/original_24.png | Bin 0 -> 725 bytes assets/icons/guardia/brand-2/original_32.png | Bin 0 -> 993 bytes assets/icons/guardia/brand-2/original_48.png | Bin 0 -> 1864 bytes assets/icons/guardia/brand-2/original_64.png | Bin 0 -> 2865 bytes assets/icons/guardia/brand-3/original_16.png | Bin 0 -> 474 bytes assets/icons/guardia/brand-3/original_24.png | Bin 0 -> 878 bytes assets/icons/guardia/brand-3/original_32.png | Bin 0 -> 1276 bytes assets/icons/guardia/brand-3/original_48.png | Bin 0 -> 2434 bytes assets/icons/guardia/brand-3/original_64.png | Bin 0 -> 3790 bytes assets/icons/guardia/brand-4/original_16.png | Bin 0 -> 973 bytes assets/icons/guardia/brand-4/original_24.png | Bin 0 -> 1876 bytes assets/icons/guardia/brand-4/original_32.png | Bin 0 -> 3023 bytes assets/icons/guardia/brand-4/original_48.png | Bin 0 -> 5949 bytes assets/icons/guardia/brand-4/original_64.png | Bin 0 -> 9534 bytes assets/icons/guardia/brand-5/original_16.png | Bin 0 -> 489 bytes assets/icons/guardia/brand-5/original_24.png | Bin 0 -> 882 bytes assets/icons/guardia/brand-5/original_32.png | Bin 0 -> 1272 bytes assets/icons/guardia/brand-5/original_48.png | Bin 0 -> 2311 bytes assets/icons/guardia/brand-5/original_64.png | Bin 0 -> 3609 bytes assets/icons/guardia/brand-6/original_16.png | Bin 0 -> 689 bytes assets/icons/guardia/brand-6/original_24.png | Bin 0 -> 1201 bytes assets/icons/guardia/brand-6/original_32.png | Bin 0 -> 1770 bytes assets/icons/guardia/brand-6/original_48.png | Bin 0 -> 3229 bytes assets/icons/guardia/brand-6/original_64.png | Bin 0 -> 4866 bytes assets/icons/guardia/brand-7/original_16.png | Bin 0 -> 629 bytes assets/icons/guardia/brand-7/original_24.png | Bin 0 -> 1034 bytes assets/icons/guardia/brand-7/original_32.png | Bin 0 -> 1512 bytes assets/icons/guardia/brand-7/original_48.png | Bin 0 -> 2548 bytes assets/icons/guardia/brand-7/original_64.png | Bin 0 -> 3940 bytes assets/icons/guardia/brand-8/original_16.png | Bin 0 -> 531 bytes assets/icons/guardia/brand-8/original_24.png | Bin 0 -> 920 bytes assets/icons/guardia/brand-8/original_32.png | Bin 0 -> 1367 bytes assets/icons/guardia/brand-8/original_48.png | Bin 0 -> 2404 bytes assets/icons/guardia/brand-8/original_64.png | Bin 0 -> 3565 bytes assets/icons/guardia/home/navy_16.png | Bin 0 -> 575 bytes assets/icons/guardia/home/navy_24.png | Bin 0 -> 971 bytes assets/icons/guardia/home/navy_32.png | Bin 0 -> 1284 bytes assets/icons/guardia/home/navy_48.png | Bin 0 -> 2142 bytes assets/icons/guardia/home/navy_64.png | Bin 0 -> 3131 bytes assets/icons/guardia/home/white_16.png | Bin 0 -> 444 bytes assets/icons/guardia/home/white_24.png | Bin 0 -> 700 bytes assets/icons/guardia/home/white_32.png | Bin 0 -> 934 bytes assets/icons/guardia/home/white_48.png | Bin 0 -> 1255 bytes assets/icons/guardia/home/white_64.png | Bin 0 -> 1757 bytes assets/icons/guardia/icon-1/navy_16.png | Bin 0 -> 761 bytes assets/icons/guardia/icon-1/navy_24.png | Bin 0 -> 1461 bytes assets/icons/guardia/icon-1/navy_32.png | Bin 0 -> 2211 bytes assets/icons/guardia/icon-1/navy_48.png | Bin 0 -> 3916 bytes assets/icons/guardia/icon-1/navy_64.png | Bin 0 -> 5854 bytes assets/icons/guardia/icon-1/white_16.png | Bin 0 -> 557 bytes assets/icons/guardia/icon-1/white_24.png | Bin 0 -> 999 bytes assets/icons/guardia/icon-1/white_32.png | Bin 0 -> 1396 bytes assets/icons/guardia/icon-1/white_48.png | Bin 0 -> 2172 bytes assets/icons/guardia/icon-1/white_64.png | Bin 0 -> 3205 bytes assets/icons/guardia/icon-10/navy_16.png | Bin 0 -> 769 bytes assets/icons/guardia/icon-10/navy_24.png | Bin 0 -> 1493 bytes assets/icons/guardia/icon-10/navy_32.png | Bin 0 -> 2281 bytes assets/icons/guardia/icon-10/navy_48.png | Bin 0 -> 4265 bytes assets/icons/guardia/icon-10/navy_64.png | Bin 0 -> 6458 bytes assets/icons/guardia/icon-10/white_16.png | Bin 0 -> 567 bytes assets/icons/guardia/icon-10/white_24.png | Bin 0 -> 996 bytes assets/icons/guardia/icon-10/white_32.png | Bin 0 -> 1395 bytes assets/icons/guardia/icon-10/white_48.png | Bin 0 -> 2270 bytes assets/icons/guardia/icon-10/white_64.png | Bin 0 -> 3474 bytes assets/icons/guardia/icon-11/navy_16.png | Bin 0 -> 661 bytes assets/icons/guardia/icon-11/navy_24.png | Bin 0 -> 1136 bytes assets/icons/guardia/icon-11/navy_32.png | Bin 0 -> 1598 bytes assets/icons/guardia/icon-11/navy_48.png | Bin 0 -> 2756 bytes assets/icons/guardia/icon-11/navy_64.png | Bin 0 -> 3755 bytes assets/icons/guardia/icon-11/white_16.png | Bin 0 -> 502 bytes assets/icons/guardia/icon-11/white_24.png | Bin 0 -> 796 bytes assets/icons/guardia/icon-11/white_32.png | Bin 0 -> 1138 bytes assets/icons/guardia/icon-11/white_48.png | Bin 0 -> 1745 bytes assets/icons/guardia/icon-11/white_64.png | Bin 0 -> 2364 bytes assets/icons/guardia/icon-12/navy_16.png | Bin 0 -> 702 bytes assets/icons/guardia/icon-12/navy_24.png | Bin 0 -> 1243 bytes assets/icons/guardia/icon-12/navy_32.png | Bin 0 -> 1812 bytes assets/icons/guardia/icon-12/navy_48.png | Bin 0 -> 3122 bytes assets/icons/guardia/icon-12/navy_64.png | Bin 0 -> 4631 bytes assets/icons/guardia/icon-12/white_16.png | Bin 0 -> 526 bytes assets/icons/guardia/icon-12/white_24.png | Bin 0 -> 878 bytes assets/icons/guardia/icon-12/white_32.png | Bin 0 -> 1180 bytes assets/icons/guardia/icon-12/white_48.png | Bin 0 -> 1907 bytes assets/icons/guardia/icon-12/white_64.png | Bin 0 -> 2735 bytes assets/icons/guardia/icon-13/navy_16.png | Bin 0 -> 668 bytes assets/icons/guardia/icon-13/navy_24.png | Bin 0 -> 1271 bytes assets/icons/guardia/icon-13/navy_32.png | Bin 0 -> 1773 bytes assets/icons/guardia/icon-13/navy_48.png | Bin 0 -> 3110 bytes assets/icons/guardia/icon-13/navy_64.png | Bin 0 -> 4584 bytes assets/icons/guardia/icon-13/white_16.png | Bin 0 -> 496 bytes assets/icons/guardia/icon-13/white_24.png | Bin 0 -> 862 bytes assets/icons/guardia/icon-13/white_32.png | Bin 0 -> 1222 bytes assets/icons/guardia/icon-13/white_48.png | Bin 0 -> 1977 bytes assets/icons/guardia/icon-13/white_64.png | Bin 0 -> 2791 bytes assets/icons/guardia/icon-14/navy_16.png | Bin 0 -> 641 bytes assets/icons/guardia/icon-14/navy_24.png | Bin 0 -> 1050 bytes assets/icons/guardia/icon-14/navy_32.png | Bin 0 -> 1553 bytes assets/icons/guardia/icon-14/navy_48.png | Bin 0 -> 2426 bytes assets/icons/guardia/icon-14/navy_64.png | Bin 0 -> 3377 bytes assets/icons/guardia/icon-14/white_16.png | Bin 0 -> 473 bytes assets/icons/guardia/icon-14/white_24.png | Bin 0 -> 788 bytes assets/icons/guardia/icon-14/white_32.png | Bin 0 -> 1056 bytes assets/icons/guardia/icon-14/white_48.png | Bin 0 -> 1572 bytes assets/icons/guardia/icon-14/white_64.png | Bin 0 -> 2081 bytes assets/icons/guardia/icon-15/navy_16.png | Bin 0 -> 656 bytes assets/icons/guardia/icon-15/navy_24.png | Bin 0 -> 1114 bytes assets/icons/guardia/icon-15/navy_32.png | Bin 0 -> 1629 bytes assets/icons/guardia/icon-15/navy_48.png | Bin 0 -> 2712 bytes assets/icons/guardia/icon-15/navy_64.png | Bin 0 -> 3857 bytes assets/icons/guardia/icon-15/white_16.png | Bin 0 -> 482 bytes assets/icons/guardia/icon-15/white_24.png | Bin 0 -> 811 bytes assets/icons/guardia/icon-15/white_32.png | Bin 0 -> 1123 bytes assets/icons/guardia/icon-15/white_48.png | Bin 0 -> 1718 bytes assets/icons/guardia/icon-15/white_64.png | Bin 0 -> 2358 bytes assets/icons/guardia/icon-16/navy_16.png | Bin 0 -> 569 bytes assets/icons/guardia/icon-16/navy_24.png | Bin 0 -> 1033 bytes assets/icons/guardia/icon-16/navy_32.png | Bin 0 -> 1512 bytes assets/icons/guardia/icon-16/navy_48.png | Bin 0 -> 2358 bytes assets/icons/guardia/icon-16/navy_64.png | Bin 0 -> 3293 bytes assets/icons/guardia/icon-16/white_16.png | Bin 0 -> 425 bytes assets/icons/guardia/icon-16/white_24.png | Bin 0 -> 748 bytes assets/icons/guardia/icon-16/white_32.png | Bin 0 -> 1084 bytes assets/icons/guardia/icon-16/white_48.png | Bin 0 -> 1615 bytes assets/icons/guardia/icon-16/white_64.png | Bin 0 -> 2204 bytes assets/icons/guardia/icon-17/navy_16.png | Bin 0 -> 538 bytes assets/icons/guardia/icon-17/navy_24.png | Bin 0 -> 980 bytes assets/icons/guardia/icon-17/navy_32.png | Bin 0 -> 1294 bytes assets/icons/guardia/icon-17/navy_48.png | Bin 0 -> 2153 bytes assets/icons/guardia/icon-17/navy_64.png | Bin 0 -> 3071 bytes assets/icons/guardia/icon-17/white_16.png | Bin 0 -> 402 bytes assets/icons/guardia/icon-17/white_24.png | Bin 0 -> 688 bytes assets/icons/guardia/icon-17/white_32.png | Bin 0 -> 930 bytes assets/icons/guardia/icon-17/white_48.png | Bin 0 -> 1463 bytes assets/icons/guardia/icon-17/white_64.png | Bin 0 -> 2001 bytes assets/icons/guardia/icon-18/navy_16.png | Bin 0 -> 570 bytes assets/icons/guardia/icon-18/navy_24.png | Bin 0 -> 1026 bytes assets/icons/guardia/icon-18/navy_32.png | Bin 0 -> 1498 bytes assets/icons/guardia/icon-18/navy_48.png | Bin 0 -> 2627 bytes assets/icons/guardia/icon-18/navy_64.png | Bin 0 -> 3960 bytes assets/icons/guardia/icon-18/white_16.png | Bin 0 -> 442 bytes assets/icons/guardia/icon-18/white_24.png | Bin 0 -> 733 bytes assets/icons/guardia/icon-18/white_32.png | Bin 0 -> 1049 bytes assets/icons/guardia/icon-18/white_48.png | Bin 0 -> 1617 bytes assets/icons/guardia/icon-18/white_64.png | Bin 0 -> 2365 bytes assets/icons/guardia/icon-19/navy_16.png | Bin 0 -> 650 bytes assets/icons/guardia/icon-19/navy_24.png | Bin 0 -> 1104 bytes assets/icons/guardia/icon-19/navy_32.png | Bin 0 -> 1636 bytes assets/icons/guardia/icon-19/navy_48.png | Bin 0 -> 2840 bytes assets/icons/guardia/icon-19/navy_64.png | Bin 0 -> 4216 bytes assets/icons/guardia/icon-19/white_16.png | Bin 0 -> 492 bytes assets/icons/guardia/icon-19/white_24.png | Bin 0 -> 843 bytes assets/icons/guardia/icon-19/white_32.png | Bin 0 -> 1167 bytes assets/icons/guardia/icon-19/white_48.png | Bin 0 -> 1807 bytes assets/icons/guardia/icon-19/white_64.png | Bin 0 -> 2529 bytes assets/icons/guardia/icon-1_1/navy_16.png | Bin 0 -> 677 bytes assets/icons/guardia/icon-1_1/navy_24.png | Bin 0 -> 1147 bytes assets/icons/guardia/icon-1_1/navy_32.png | Bin 0 -> 1671 bytes assets/icons/guardia/icon-1_1/navy_48.png | Bin 0 -> 3148 bytes assets/icons/guardia/icon-1_1/navy_64.png | Bin 0 -> 4658 bytes assets/icons/guardia/icon-1_1/white_16.png | Bin 0 -> 500 bytes assets/icons/guardia/icon-1_1/white_24.png | Bin 0 -> 794 bytes assets/icons/guardia/icon-1_1/white_32.png | Bin 0 -> 1115 bytes assets/icons/guardia/icon-1_1/white_48.png | Bin 0 -> 1862 bytes assets/icons/guardia/icon-1_1/white_64.png | Bin 0 -> 2643 bytes assets/icons/guardia/icon-1_10/navy_16.png | Bin 0 -> 502 bytes assets/icons/guardia/icon-1_10/navy_24.png | Bin 0 -> 833 bytes assets/icons/guardia/icon-1_10/navy_32.png | Bin 0 -> 1120 bytes assets/icons/guardia/icon-1_10/navy_48.png | Bin 0 -> 1790 bytes assets/icons/guardia/icon-1_10/navy_64.png | Bin 0 -> 2559 bytes assets/icons/guardia/icon-1_10/white_16.png | Bin 0 -> 393 bytes assets/icons/guardia/icon-1_10/white_24.png | Bin 0 -> 624 bytes assets/icons/guardia/icon-1_10/white_32.png | Bin 0 -> 791 bytes assets/icons/guardia/icon-1_10/white_48.png | Bin 0 -> 1097 bytes assets/icons/guardia/icon-1_10/white_64.png | Bin 0 -> 1535 bytes assets/icons/guardia/icon-1_11/navy_16.png | Bin 0 -> 507 bytes assets/icons/guardia/icon-1_11/navy_24.png | Bin 0 -> 766 bytes assets/icons/guardia/icon-1_11/navy_32.png | Bin 0 -> 984 bytes assets/icons/guardia/icon-1_11/navy_48.png | Bin 0 -> 1552 bytes assets/icons/guardia/icon-1_11/navy_64.png | Bin 0 -> 2006 bytes assets/icons/guardia/icon-1_11/white_16.png | Bin 0 -> 377 bytes assets/icons/guardia/icon-1_11/white_24.png | Bin 0 -> 581 bytes assets/icons/guardia/icon-1_11/white_32.png | Bin 0 -> 723 bytes assets/icons/guardia/icon-1_11/white_48.png | Bin 0 -> 1075 bytes assets/icons/guardia/icon-1_11/white_64.png | Bin 0 -> 1311 bytes assets/icons/guardia/icon-1_12/navy_16.png | Bin 0 -> 608 bytes assets/icons/guardia/icon-1_12/navy_24.png | Bin 0 -> 1140 bytes assets/icons/guardia/icon-1_12/navy_32.png | Bin 0 -> 1754 bytes assets/icons/guardia/icon-1_12/navy_48.png | Bin 0 -> 3292 bytes assets/icons/guardia/icon-1_12/navy_64.png | Bin 0 -> 5334 bytes assets/icons/guardia/icon-1_12/white_16.png | Bin 0 -> 458 bytes assets/icons/guardia/icon-1_12/white_24.png | Bin 0 -> 820 bytes assets/icons/guardia/icon-1_12/white_32.png | Bin 0 -> 1160 bytes assets/icons/guardia/icon-1_12/white_48.png | Bin 0 -> 1887 bytes assets/icons/guardia/icon-1_12/white_64.png | Bin 0 -> 2878 bytes assets/icons/guardia/icon-1_13/navy_16.png | Bin 0 -> 489 bytes assets/icons/guardia/icon-1_13/navy_24.png | Bin 0 -> 689 bytes assets/icons/guardia/icon-1_13/navy_32.png | Bin 0 -> 955 bytes assets/icons/guardia/icon-1_13/navy_48.png | Bin 0 -> 1531 bytes assets/icons/guardia/icon-1_13/navy_64.png | Bin 0 -> 1916 bytes assets/icons/guardia/icon-1_13/white_16.png | Bin 0 -> 345 bytes assets/icons/guardia/icon-1_13/white_24.png | Bin 0 -> 512 bytes assets/icons/guardia/icon-1_13/white_32.png | Bin 0 -> 682 bytes assets/icons/guardia/icon-1_13/white_48.png | Bin 0 -> 951 bytes assets/icons/guardia/icon-1_13/white_64.png | Bin 0 -> 1217 bytes assets/icons/guardia/icon-1_14/navy_16.png | Bin 0 -> 575 bytes assets/icons/guardia/icon-1_14/navy_24.png | Bin 0 -> 971 bytes assets/icons/guardia/icon-1_14/navy_32.png | Bin 0 -> 1284 bytes assets/icons/guardia/icon-1_14/navy_48.png | Bin 0 -> 2142 bytes assets/icons/guardia/icon-1_14/navy_64.png | Bin 0 -> 3131 bytes assets/icons/guardia/icon-1_14/white_16.png | Bin 0 -> 444 bytes assets/icons/guardia/icon-1_14/white_24.png | Bin 0 -> 700 bytes assets/icons/guardia/icon-1_14/white_32.png | Bin 0 -> 934 bytes assets/icons/guardia/icon-1_14/white_48.png | Bin 0 -> 1255 bytes assets/icons/guardia/icon-1_14/white_64.png | Bin 0 -> 1757 bytes assets/icons/guardia/icon-1_15/navy_16.png | Bin 0 -> 614 bytes assets/icons/guardia/icon-1_15/navy_24.png | Bin 0 -> 1133 bytes assets/icons/guardia/icon-1_15/navy_32.png | Bin 0 -> 1641 bytes assets/icons/guardia/icon-1_15/navy_48.png | Bin 0 -> 3012 bytes assets/icons/guardia/icon-1_15/navy_64.png | Bin 0 -> 4467 bytes assets/icons/guardia/icon-1_15/white_16.png | Bin 0 -> 461 bytes assets/icons/guardia/icon-1_15/white_24.png | Bin 0 -> 861 bytes assets/icons/guardia/icon-1_15/white_32.png | Bin 0 -> 1170 bytes assets/icons/guardia/icon-1_15/white_48.png | Bin 0 -> 1795 bytes assets/icons/guardia/icon-1_15/white_64.png | Bin 0 -> 2536 bytes assets/icons/guardia/icon-1_2/navy_16.png | Bin 0 -> 578 bytes assets/icons/guardia/icon-1_2/navy_24.png | Bin 0 -> 1012 bytes assets/icons/guardia/icon-1_2/navy_32.png | Bin 0 -> 1531 bytes assets/icons/guardia/icon-1_2/navy_48.png | Bin 0 -> 2825 bytes assets/icons/guardia/icon-1_2/navy_64.png | Bin 0 -> 4455 bytes assets/icons/guardia/icon-1_2/white_16.png | Bin 0 -> 448 bytes assets/icons/guardia/icon-1_2/white_24.png | Bin 0 -> 721 bytes assets/icons/guardia/icon-1_2/white_32.png | Bin 0 -> 1006 bytes assets/icons/guardia/icon-1_2/white_48.png | Bin 0 -> 1547 bytes assets/icons/guardia/icon-1_2/white_64.png | Bin 0 -> 2294 bytes assets/icons/guardia/icon-1_3/navy_16.png | Bin 0 -> 571 bytes assets/icons/guardia/icon-1_3/navy_24.png | Bin 0 -> 955 bytes assets/icons/guardia/icon-1_3/navy_32.png | Bin 0 -> 1408 bytes assets/icons/guardia/icon-1_3/navy_48.png | Bin 0 -> 2468 bytes assets/icons/guardia/icon-1_3/navy_64.png | Bin 0 -> 3645 bytes assets/icons/guardia/icon-1_3/white_16.png | Bin 0 -> 438 bytes assets/icons/guardia/icon-1_3/white_24.png | Bin 0 -> 721 bytes assets/icons/guardia/icon-1_3/white_32.png | Bin 0 -> 986 bytes assets/icons/guardia/icon-1_3/white_48.png | Bin 0 -> 1492 bytes assets/icons/guardia/icon-1_3/white_64.png | Bin 0 -> 2159 bytes assets/icons/guardia/icon-1_4/navy_16.png | Bin 0 -> 590 bytes assets/icons/guardia/icon-1_4/navy_24.png | Bin 0 -> 998 bytes assets/icons/guardia/icon-1_4/navy_32.png | Bin 0 -> 1503 bytes assets/icons/guardia/icon-1_4/navy_48.png | Bin 0 -> 2780 bytes assets/icons/guardia/icon-1_4/navy_64.png | Bin 0 -> 4355 bytes assets/icons/guardia/icon-1_4/white_16.png | Bin 0 -> 442 bytes assets/icons/guardia/icon-1_4/white_24.png | Bin 0 -> 745 bytes assets/icons/guardia/icon-1_4/white_32.png | Bin 0 -> 1059 bytes assets/icons/guardia/icon-1_4/white_48.png | Bin 0 -> 1705 bytes assets/icons/guardia/icon-1_4/white_64.png | Bin 0 -> 2419 bytes assets/icons/guardia/icon-1_5/navy_16.png | Bin 0 -> 509 bytes assets/icons/guardia/icon-1_5/navy_24.png | Bin 0 -> 862 bytes assets/icons/guardia/icon-1_5/navy_32.png | Bin 0 -> 1298 bytes assets/icons/guardia/icon-1_5/navy_48.png | Bin 0 -> 2087 bytes assets/icons/guardia/icon-1_5/navy_64.png | Bin 0 -> 3146 bytes assets/icons/guardia/icon-1_5/white_16.png | Bin 0 -> 401 bytes assets/icons/guardia/icon-1_5/white_24.png | Bin 0 -> 626 bytes assets/icons/guardia/icon-1_5/white_32.png | Bin 0 -> 928 bytes assets/icons/guardia/icon-1_5/white_48.png | Bin 0 -> 1410 bytes assets/icons/guardia/icon-1_5/white_64.png | Bin 0 -> 2003 bytes assets/icons/guardia/icon-1_6/navy_16.png | Bin 0 -> 577 bytes assets/icons/guardia/icon-1_6/navy_24.png | Bin 0 -> 1009 bytes assets/icons/guardia/icon-1_6/navy_32.png | Bin 0 -> 1408 bytes assets/icons/guardia/icon-1_6/navy_48.png | Bin 0 -> 2516 bytes assets/icons/guardia/icon-1_6/navy_64.png | Bin 0 -> 3794 bytes assets/icons/guardia/icon-1_6/white_16.png | Bin 0 -> 435 bytes assets/icons/guardia/icon-1_6/white_24.png | Bin 0 -> 742 bytes assets/icons/guardia/icon-1_6/white_32.png | Bin 0 -> 1003 bytes assets/icons/guardia/icon-1_6/white_48.png | Bin 0 -> 1656 bytes assets/icons/guardia/icon-1_6/white_64.png | Bin 0 -> 2344 bytes assets/icons/guardia/icon-1_7/navy_16.png | Bin 0 -> 593 bytes assets/icons/guardia/icon-1_7/navy_24.png | Bin 0 -> 1141 bytes assets/icons/guardia/icon-1_7/navy_32.png | Bin 0 -> 1752 bytes assets/icons/guardia/icon-1_7/navy_48.png | Bin 0 -> 3033 bytes assets/icons/guardia/icon-1_7/navy_64.png | Bin 0 -> 4332 bytes assets/icons/guardia/icon-1_7/white_16.png | Bin 0 -> 428 bytes assets/icons/guardia/icon-1_7/white_24.png | Bin 0 -> 822 bytes assets/icons/guardia/icon-1_7/white_32.png | Bin 0 -> 1243 bytes assets/icons/guardia/icon-1_7/white_48.png | Bin 0 -> 1955 bytes assets/icons/guardia/icon-1_7/white_64.png | Bin 0 -> 2656 bytes assets/icons/guardia/icon-1_8/navy_16.png | Bin 0 -> 648 bytes assets/icons/guardia/icon-1_8/navy_24.png | Bin 0 -> 1135 bytes assets/icons/guardia/icon-1_8/navy_32.png | Bin 0 -> 1657 bytes assets/icons/guardia/icon-1_8/navy_48.png | Bin 0 -> 2983 bytes assets/icons/guardia/icon-1_8/navy_64.png | Bin 0 -> 4565 bytes assets/icons/guardia/icon-1_8/white_16.png | Bin 0 -> 479 bytes assets/icons/guardia/icon-1_8/white_24.png | Bin 0 -> 811 bytes assets/icons/guardia/icon-1_8/white_32.png | Bin 0 -> 1011 bytes assets/icons/guardia/icon-1_8/white_48.png | Bin 0 -> 1664 bytes assets/icons/guardia/icon-1_8/white_64.png | Bin 0 -> 2388 bytes assets/icons/guardia/icon-1_9/navy_16.png | Bin 0 -> 496 bytes assets/icons/guardia/icon-1_9/navy_24.png | Bin 0 -> 814 bytes assets/icons/guardia/icon-1_9/navy_32.png | Bin 0 -> 1162 bytes assets/icons/guardia/icon-1_9/navy_48.png | Bin 0 -> 1844 bytes assets/icons/guardia/icon-1_9/navy_64.png | Bin 0 -> 2607 bytes assets/icons/guardia/icon-1_9/white_16.png | Bin 0 -> 388 bytes assets/icons/guardia/icon-1_9/white_24.png | Bin 0 -> 611 bytes assets/icons/guardia/icon-1_9/white_32.png | Bin 0 -> 823 bytes assets/icons/guardia/icon-1_9/white_48.png | Bin 0 -> 1169 bytes assets/icons/guardia/icon-1_9/white_64.png | Bin 0 -> 1576 bytes assets/icons/guardia/icon-2/navy_16.png | Bin 0 -> 743 bytes assets/icons/guardia/icon-2/navy_24.png | Bin 0 -> 1128 bytes assets/icons/guardia/icon-2/navy_32.png | Bin 0 -> 1726 bytes assets/icons/guardia/icon-2/navy_48.png | Bin 0 -> 2657 bytes assets/icons/guardia/icon-2/navy_64.png | Bin 0 -> 3854 bytes assets/icons/guardia/icon-2/white_16.png | Bin 0 -> 523 bytes assets/icons/guardia/icon-2/white_24.png | Bin 0 -> 827 bytes assets/icons/guardia/icon-2/white_32.png | Bin 0 -> 1089 bytes assets/icons/guardia/icon-2/white_48.png | Bin 0 -> 1651 bytes assets/icons/guardia/icon-2/white_64.png | Bin 0 -> 2338 bytes assets/icons/guardia/icon-20/navy_16.png | Bin 0 -> 576 bytes assets/icons/guardia/icon-20/navy_24.png | Bin 0 -> 869 bytes assets/icons/guardia/icon-20/navy_32.png | Bin 0 -> 1180 bytes assets/icons/guardia/icon-20/navy_48.png | Bin 0 -> 1825 bytes assets/icons/guardia/icon-20/navy_64.png | Bin 0 -> 2271 bytes assets/icons/guardia/icon-20/white_16.png | Bin 0 -> 406 bytes assets/icons/guardia/icon-20/white_24.png | Bin 0 -> 644 bytes assets/icons/guardia/icon-20/white_32.png | Bin 0 -> 838 bytes assets/icons/guardia/icon-20/white_48.png | Bin 0 -> 1215 bytes assets/icons/guardia/icon-20/white_64.png | Bin 0 -> 1500 bytes assets/icons/guardia/icon-21/navy_16.png | Bin 0 -> 655 bytes assets/icons/guardia/icon-21/navy_24.png | Bin 0 -> 1110 bytes assets/icons/guardia/icon-21/navy_32.png | Bin 0 -> 1746 bytes assets/icons/guardia/icon-21/navy_48.png | Bin 0 -> 3080 bytes assets/icons/guardia/icon-21/navy_64.png | Bin 0 -> 4849 bytes assets/icons/guardia/icon-21/white_16.png | Bin 0 -> 498 bytes assets/icons/guardia/icon-21/white_24.png | Bin 0 -> 777 bytes assets/icons/guardia/icon-21/white_32.png | Bin 0 -> 1159 bytes assets/icons/guardia/icon-21/white_48.png | Bin 0 -> 1881 bytes assets/icons/guardia/icon-21/white_64.png | Bin 0 -> 2773 bytes assets/icons/guardia/icon-22/navy_16.png | Bin 0 -> 651 bytes assets/icons/guardia/icon-22/navy_24.png | Bin 0 -> 1190 bytes assets/icons/guardia/icon-22/navy_32.png | Bin 0 -> 1811 bytes assets/icons/guardia/icon-22/navy_48.png | Bin 0 -> 3058 bytes assets/icons/guardia/icon-22/navy_64.png | Bin 0 -> 4582 bytes assets/icons/guardia/icon-22/white_16.png | Bin 0 -> 479 bytes assets/icons/guardia/icon-22/white_24.png | Bin 0 -> 855 bytes assets/icons/guardia/icon-22/white_32.png | Bin 0 -> 1250 bytes assets/icons/guardia/icon-22/white_48.png | Bin 0 -> 1986 bytes assets/icons/guardia/icon-22/white_64.png | Bin 0 -> 2774 bytes assets/icons/guardia/icon-23/navy_16.png | Bin 0 -> 650 bytes assets/icons/guardia/icon-23/navy_24.png | Bin 0 -> 1131 bytes assets/icons/guardia/icon-23/navy_32.png | Bin 0 -> 1600 bytes assets/icons/guardia/icon-23/navy_48.png | Bin 0 -> 2636 bytes assets/icons/guardia/icon-23/navy_64.png | Bin 0 -> 4027 bytes assets/icons/guardia/icon-23/white_16.png | Bin 0 -> 473 bytes assets/icons/guardia/icon-23/white_24.png | Bin 0 -> 786 bytes assets/icons/guardia/icon-23/white_32.png | Bin 0 -> 1121 bytes assets/icons/guardia/icon-23/white_48.png | Bin 0 -> 1809 bytes assets/icons/guardia/icon-23/white_64.png | Bin 0 -> 2629 bytes assets/icons/guardia/icon-24/navy_16.png | Bin 0 -> 645 bytes assets/icons/guardia/icon-24/navy_24.png | Bin 0 -> 1193 bytes assets/icons/guardia/icon-24/navy_32.png | Bin 0 -> 1873 bytes assets/icons/guardia/icon-24/navy_48.png | Bin 0 -> 3280 bytes assets/icons/guardia/icon-24/navy_64.png | Bin 0 -> 5166 bytes assets/icons/guardia/icon-24/white_16.png | Bin 0 -> 486 bytes assets/icons/guardia/icon-24/white_24.png | Bin 0 -> 891 bytes assets/icons/guardia/icon-24/white_32.png | Bin 0 -> 1278 bytes assets/icons/guardia/icon-24/white_48.png | Bin 0 -> 2101 bytes assets/icons/guardia/icon-24/white_64.png | Bin 0 -> 2887 bytes assets/icons/guardia/icon-25/navy_16.png | Bin 0 -> 613 bytes assets/icons/guardia/icon-25/navy_24.png | Bin 0 -> 1090 bytes assets/icons/guardia/icon-25/navy_32.png | Bin 0 -> 1722 bytes assets/icons/guardia/icon-25/navy_48.png | Bin 0 -> 3055 bytes assets/icons/guardia/icon-25/navy_64.png | Bin 0 -> 4813 bytes assets/icons/guardia/icon-25/white_16.png | Bin 0 -> 449 bytes assets/icons/guardia/icon-25/white_24.png | Bin 0 -> 848 bytes assets/icons/guardia/icon-25/white_32.png | Bin 0 -> 1181 bytes assets/icons/guardia/icon-25/white_48.png | Bin 0 -> 1886 bytes assets/icons/guardia/icon-25/white_64.png | Bin 0 -> 2736 bytes assets/icons/guardia/icon-26/navy_16.png | Bin 0 -> 677 bytes assets/icons/guardia/icon-26/navy_24.png | Bin 0 -> 1166 bytes assets/icons/guardia/icon-26/navy_32.png | Bin 0 -> 1821 bytes assets/icons/guardia/icon-26/navy_48.png | Bin 0 -> 3088 bytes assets/icons/guardia/icon-26/navy_64.png | Bin 0 -> 4830 bytes assets/icons/guardia/icon-26/white_16.png | Bin 0 -> 497 bytes assets/icons/guardia/icon-26/white_24.png | Bin 0 -> 883 bytes assets/icons/guardia/icon-26/white_32.png | Bin 0 -> 1298 bytes assets/icons/guardia/icon-26/white_48.png | Bin 0 -> 2093 bytes assets/icons/guardia/icon-26/white_64.png | Bin 0 -> 2933 bytes assets/icons/guardia/icon-27/navy_16.png | Bin 0 -> 608 bytes assets/icons/guardia/icon-27/navy_24.png | Bin 0 -> 1140 bytes assets/icons/guardia/icon-27/navy_32.png | Bin 0 -> 1632 bytes assets/icons/guardia/icon-27/navy_48.png | Bin 0 -> 2548 bytes assets/icons/guardia/icon-27/navy_64.png | Bin 0 -> 3792 bytes assets/icons/guardia/icon-27/white_16.png | Bin 0 -> 433 bytes assets/icons/guardia/icon-27/white_24.png | Bin 0 -> 786 bytes assets/icons/guardia/icon-27/white_32.png | Bin 0 -> 1139 bytes assets/icons/guardia/icon-27/white_48.png | Bin 0 -> 1775 bytes assets/icons/guardia/icon-27/white_64.png | Bin 0 -> 2446 bytes assets/icons/guardia/icon-28/navy_16.png | Bin 0 -> 676 bytes assets/icons/guardia/icon-28/navy_24.png | Bin 0 -> 1223 bytes assets/icons/guardia/icon-28/navy_32.png | Bin 0 -> 1871 bytes assets/icons/guardia/icon-28/navy_48.png | Bin 0 -> 3375 bytes assets/icons/guardia/icon-28/navy_64.png | Bin 0 -> 5146 bytes assets/icons/guardia/icon-28/white_16.png | Bin 0 -> 501 bytes assets/icons/guardia/icon-28/white_24.png | Bin 0 -> 893 bytes assets/icons/guardia/icon-28/white_32.png | Bin 0 -> 1359 bytes assets/icons/guardia/icon-28/white_48.png | Bin 0 -> 2179 bytes assets/icons/guardia/icon-28/white_64.png | Bin 0 -> 3028 bytes assets/icons/guardia/icon-29/navy_16.png | Bin 0 -> 699 bytes assets/icons/guardia/icon-29/navy_24.png | Bin 0 -> 1196 bytes assets/icons/guardia/icon-29/navy_32.png | Bin 0 -> 1818 bytes assets/icons/guardia/icon-29/navy_48.png | Bin 0 -> 3105 bytes assets/icons/guardia/icon-29/navy_64.png | Bin 0 -> 4694 bytes assets/icons/guardia/icon-29/white_16.png | Bin 0 -> 504 bytes assets/icons/guardia/icon-29/white_24.png | Bin 0 -> 886 bytes assets/icons/guardia/icon-29/white_32.png | Bin 0 -> 1287 bytes assets/icons/guardia/icon-29/white_48.png | Bin 0 -> 2067 bytes assets/icons/guardia/icon-29/white_64.png | Bin 0 -> 2994 bytes assets/icons/guardia/icon-3/navy_16.png | Bin 0 -> 613 bytes assets/icons/guardia/icon-3/navy_24.png | Bin 0 -> 788 bytes assets/icons/guardia/icon-3/navy_32.png | Bin 0 -> 1099 bytes assets/icons/guardia/icon-3/navy_48.png | Bin 0 -> 1500 bytes assets/icons/guardia/icon-3/navy_64.png | Bin 0 -> 2208 bytes assets/icons/guardia/icon-3/white_16.png | Bin 0 -> 451 bytes assets/icons/guardia/icon-3/white_24.png | Bin 0 -> 584 bytes assets/icons/guardia/icon-3/white_32.png | Bin 0 -> 762 bytes assets/icons/guardia/icon-3/white_48.png | Bin 0 -> 1023 bytes assets/icons/guardia/icon-3/white_64.png | Bin 0 -> 1387 bytes assets/icons/guardia/icon-30/navy_16.png | Bin 0 -> 545 bytes assets/icons/guardia/icon-30/navy_24.png | Bin 0 -> 833 bytes assets/icons/guardia/icon-30/navy_32.png | Bin 0 -> 1166 bytes assets/icons/guardia/icon-30/navy_48.png | Bin 0 -> 2058 bytes assets/icons/guardia/icon-30/navy_64.png | Bin 0 -> 2956 bytes assets/icons/guardia/icon-30/white_16.png | Bin 0 -> 416 bytes assets/icons/guardia/icon-30/white_24.png | Bin 0 -> 653 bytes assets/icons/guardia/icon-30/white_32.png | Bin 0 -> 863 bytes assets/icons/guardia/icon-30/white_48.png | Bin 0 -> 1245 bytes assets/icons/guardia/icon-30/white_64.png | Bin 0 -> 1783 bytes assets/icons/guardia/icon-4/navy_16.png | Bin 0 -> 598 bytes assets/icons/guardia/icon-4/navy_24.png | Bin 0 -> 1037 bytes assets/icons/guardia/icon-4/navy_32.png | Bin 0 -> 1527 bytes assets/icons/guardia/icon-4/navy_48.png | Bin 0 -> 2626 bytes assets/icons/guardia/icon-4/navy_64.png | Bin 0 -> 3998 bytes assets/icons/guardia/icon-4/white_16.png | Bin 0 -> 449 bytes assets/icons/guardia/icon-4/white_24.png | Bin 0 -> 623 bytes assets/icons/guardia/icon-4/white_32.png | Bin 0 -> 885 bytes assets/icons/guardia/icon-4/white_48.png | Bin 0 -> 1486 bytes assets/icons/guardia/icon-4/white_64.png | Bin 0 -> 2108 bytes assets/icons/guardia/icon-5/navy_16.png | Bin 0 -> 694 bytes assets/icons/guardia/icon-5/navy_24.png | Bin 0 -> 1185 bytes assets/icons/guardia/icon-5/navy_32.png | Bin 0 -> 1850 bytes assets/icons/guardia/icon-5/navy_48.png | Bin 0 -> 3131 bytes assets/icons/guardia/icon-5/navy_64.png | Bin 0 -> 4852 bytes assets/icons/guardia/icon-5/white_16.png | Bin 0 -> 502 bytes assets/icons/guardia/icon-5/white_24.png | Bin 0 -> 774 bytes assets/icons/guardia/icon-5/white_32.png | Bin 0 -> 1136 bytes assets/icons/guardia/icon-5/white_48.png | Bin 0 -> 1839 bytes assets/icons/guardia/icon-5/white_64.png | Bin 0 -> 2666 bytes assets/icons/guardia/icon-6/navy_16.png | Bin 0 -> 550 bytes assets/icons/guardia/icon-6/navy_24.png | Bin 0 -> 954 bytes assets/icons/guardia/icon-6/navy_32.png | Bin 0 -> 1378 bytes assets/icons/guardia/icon-6/navy_48.png | Bin 0 -> 2397 bytes assets/icons/guardia/icon-6/navy_64.png | Bin 0 -> 3551 bytes assets/icons/guardia/icon-6/white_16.png | Bin 0 -> 417 bytes assets/icons/guardia/icon-6/white_24.png | Bin 0 -> 622 bytes assets/icons/guardia/icon-6/white_32.png | Bin 0 -> 826 bytes assets/icons/guardia/icon-6/white_48.png | Bin 0 -> 1493 bytes assets/icons/guardia/icon-6/white_64.png | Bin 0 -> 2178 bytes assets/icons/guardia/icon-7/navy_16.png | Bin 0 -> 540 bytes assets/icons/guardia/icon-7/navy_24.png | Bin 0 -> 931 bytes assets/icons/guardia/icon-7/navy_32.png | Bin 0 -> 1403 bytes assets/icons/guardia/icon-7/navy_48.png | Bin 0 -> 2227 bytes assets/icons/guardia/icon-7/navy_64.png | Bin 0 -> 3228 bytes assets/icons/guardia/icon-7/white_16.png | Bin 0 -> 415 bytes assets/icons/guardia/icon-7/white_24.png | Bin 0 -> 612 bytes assets/icons/guardia/icon-7/white_32.png | Bin 0 -> 809 bytes assets/icons/guardia/icon-7/white_48.png | Bin 0 -> 1252 bytes assets/icons/guardia/icon-7/white_64.png | Bin 0 -> 1764 bytes assets/icons/guardia/icon-8/navy_16.png | Bin 0 -> 655 bytes assets/icons/guardia/icon-8/navy_24.png | Bin 0 -> 1189 bytes assets/icons/guardia/icon-8/navy_32.png | Bin 0 -> 1730 bytes assets/icons/guardia/icon-8/navy_48.png | Bin 0 -> 2983 bytes assets/icons/guardia/icon-8/navy_64.png | Bin 0 -> 4424 bytes assets/icons/guardia/icon-8/white_16.png | Bin 0 -> 491 bytes assets/icons/guardia/icon-8/white_24.png | Bin 0 -> 842 bytes assets/icons/guardia/icon-8/white_32.png | Bin 0 -> 1201 bytes assets/icons/guardia/icon-8/white_48.png | Bin 0 -> 1835 bytes assets/icons/guardia/icon-8/white_64.png | Bin 0 -> 2520 bytes assets/icons/guardia/icon-9/navy_16.png | Bin 0 -> 728 bytes assets/icons/guardia/icon-9/navy_24.png | Bin 0 -> 1362 bytes assets/icons/guardia/icon-9/navy_32.png | Bin 0 -> 2026 bytes assets/icons/guardia/icon-9/navy_48.png | Bin 0 -> 3327 bytes assets/icons/guardia/icon-9/navy_64.png | Bin 0 -> 4964 bytes assets/icons/guardia/icon-9/white_16.png | Bin 0 -> 538 bytes assets/icons/guardia/icon-9/white_24.png | Bin 0 -> 951 bytes assets/icons/guardia/icon-9/white_32.png | Bin 0 -> 1394 bytes assets/icons/guardia/icon-9/white_48.png | Bin 0 -> 2114 bytes assets/icons/guardia/icon-9/white_64.png | Bin 0 -> 3046 bytes assets/icons/guardia/icon-registry.ts | 62 + assets/icons/guardia/panel-01/original_16.png | Bin 0 -> 786 bytes assets/icons/guardia/panel-01/original_24.png | Bin 0 -> 1305 bytes assets/icons/guardia/panel-01/original_32.png | Bin 0 -> 1933 bytes assets/icons/guardia/panel-01/original_48.png | Bin 0 -> 3263 bytes assets/icons/guardia/panel-01/original_64.png | Bin 0 -> 5052 bytes assets/icons/guardia/panel-02/original_16.png | Bin 0 -> 745 bytes assets/icons/guardia/panel-02/original_24.png | Bin 0 -> 1231 bytes assets/icons/guardia/panel-02/original_32.png | Bin 0 -> 1751 bytes assets/icons/guardia/panel-02/original_48.png | Bin 0 -> 2809 bytes assets/icons/guardia/panel-02/original_64.png | Bin 0 -> 4174 bytes components/AlertChannelBadge.tsx | 53 + components/ApprovalStages.tsx | 117 + components/AutoRCA.tsx | 125 + components/Comment.tsx | 124 + components/DailySummary.tsx | 135 + components/ImpactPreview.tsx | 118 + components/IncidentTimeline.tsx | 82 + components/KBSuggest.tsx | 93 + components/MarkdownViewer.tsx | 49 + components/MetricGraph.tsx | 172 + components/NextActions.tsx | 79 + components/PhotoDiagnosis.tsx | 139 + components/PinLock.tsx | 200 + components/RejectReason.tsx | 131 + components/RelatedSR.tsx | 84 + components/SRSatisfaction.tsx | 94 + components/SRSolutionHint.tsx | 96 + components/SRTemplates.tsx | 105 + components/SlaTimer.tsx | 65 + components/ZeroTrustBadge.tsx | 76 + constants/Config.ts | 19 + contexts/FontContext.tsx | 24 + contexts/OfflineContext.tsx | 47 + contexts/ThemeContext.tsx | 30 + hooks/useAIClassify.ts | 86 + hooks/useAnomalyAlert.ts | 69 + hooks/useBadgeCount.ts | 38 + hooks/useDuplicateSR.ts | 51 + hooks/useGPSTag.ts | 95 + hooks/useKBBookmark.ts | 30 + hooks/useOfflineCache.ts | 2 +- hooks/useRoleMenu.ts | 100 + hooks/useSLAPrediction.ts | 75 + hooks/useScreenshotBlock.ts | 73 + hooks/useSessionExpiry.ts | 62 + hooks/useSmartNotif.ts | 53 + lib/ollama.ts | 88 + package-lock.json | 11798 ++++------------ package.json | 34 +- services/api.ts | 352 + services/sha256.ts | 102 + tsconfig.json | 9 +- types/native-modules.d.ts | 32 + utils/auth.ts | 36 + utils/security.ts | 68 + 641 files changed, 15292 insertions(+), 9092 deletions(-) create mode 100644 app/(tabs)/accessibility.tsx create mode 100644 app/(tabs)/ai_agent.tsx create mode 100644 app/(tabs)/ai_briefing.tsx create mode 100644 app/(tabs)/ai_decision.tsx create mode 100644 app/(tabs)/ai_history.tsx create mode 100644 app/(tabs)/ai_soc.tsx create mode 100644 app/(tabs)/approval.tsx create mode 100644 app/(tabs)/audit_log.tsx create mode 100644 app/(tabs)/auto_sr.tsx create mode 100644 app/(tabs)/automation_rules.tsx create mode 100644 app/(tabs)/autonomous_ops.tsx create mode 100644 app/(tabs)/batch_action.tsx create mode 100644 app/(tabs)/camera_ar.tsx create mode 100644 app/(tabs)/capacity_plan.tsx create mode 100644 app/(tabs)/change_calendar.tsx create mode 100644 app/(tabs)/citizen_requests.tsx create mode 100644 app/(tabs)/cost_advice.tsx create mode 100644 app/(tabs)/cowork_sr.tsx create mode 100644 app/(tabs)/csap_audit_prep.tsx create mode 100644 app/(tabs)/csap_dashboard.tsx create mode 100644 app/(tabs)/cve_detail.tsx create mode 100644 app/(tabs)/delegation.tsx create mode 100644 app/(tabs)/dependency_map.tsx create mode 100644 app/(tabs)/deploy_history.tsx create mode 100644 app/(tabs)/devices.tsx create mode 100644 app/(tabs)/eol_alerts.tsx create mode 100644 app/(tabs)/esignature.tsx create mode 100644 app/(tabs)/failure_prediction.tsx create mode 100644 app/(tabs)/favorites.tsx create mode 100644 app/(tabs)/greenops_dashboard.tsx create mode 100644 app/(tabs)/health_scorecard.tsx create mode 100644 app/(tabs)/hw_warranty.tsx create mode 100644 app/(tabs)/institution_compare.tsx create mode 100644 app/(tabs)/ioc_search.tsx create mode 100644 app/(tabs)/jenkins_builds.tsx create mode 100644 app/(tabs)/kanban.tsx create mode 100644 app/(tabs)/kb_browser.tsx create mode 100644 app/(tabs)/kpi_dashboard.tsx create mode 100644 app/(tabs)/maintenance_window.tsx create mode 100644 app/(tabs)/meeting.tsx create mode 100644 app/(tabs)/meeting_minutes.tsx create mode 100644 app/(tabs)/meeting_sr.tsx create mode 100644 app/(tabs)/multi_tenant.tsx create mode 100644 app/(tabs)/multimodal.tsx create mode 100644 app/(tabs)/my_stats.tsx create mode 100644 app/(tabs)/narasajang_status.tsx create mode 100644 app/(tabs)/narasajang_sw.tsx create mode 100644 app/(tabs)/nfc_asset.tsx create mode 100644 app/(tabs)/offline_ai.tsx create mode 100644 app/(tabs)/ollama_status.tsx create mode 100644 app/(tabs)/on_device_ai.tsx create mode 100644 app/(tabs)/pdf_share.tsx create mode 100644 app/(tabs)/pii_status.tsx create mode 100644 app/(tabs)/policy_alerts.tsx create mode 100644 app/(tabs)/predictive_alert.tsx create mode 100644 app/(tabs)/qr_apk.tsx create mode 100644 app/(tabs)/qr_scan.tsx create mode 100644 app/(tabs)/quick_command.tsx create mode 100644 app/(tabs)/recent_screens.tsx create mode 100644 app/(tabs)/release_notes.tsx create mode 100644 app/(tabs)/security_log.tsx create mode 100644 app/(tabs)/security_score.tsx create mode 100644 app/(tabs)/self_healing.tsx create mode 100644 app/(tabs)/server_dashboard.tsx create mode 100644 app/(tabs)/sla_exception.tsx create mode 100644 app/(tabs)/smart_search.tsx create mode 100644 app/(tabs)/sr_batch.tsx create mode 100644 app/(tabs)/sr_chat_room.tsx create mode 100644 app/(tabs)/sr_detail.tsx create mode 100644 app/(tabs)/sr_heatmap.tsx create mode 100644 app/(tabs)/sr_quick.tsx create mode 100644 app/(tabs)/ssl_alerts.tsx create mode 100644 app/(tabs)/team_leaderboard.tsx create mode 100644 app/(tabs)/theme_settings.tsx create mode 100644 app/(tabs)/threat_feed.tsx create mode 100644 app/(tabs)/todo_list.tsx create mode 100644 app/(tabs)/vm_status.tsx create mode 100644 app/(tabs)/whiteboard.tsx create mode 100644 app/(tabs)/work_calendar.tsx create mode 100644 assets/icons/guardia/brand-1/original_16.png create mode 100644 assets/icons/guardia/brand-1/original_24.png create mode 100644 assets/icons/guardia/brand-1/original_32.png create mode 100644 assets/icons/guardia/brand-1/original_48.png create mode 100644 assets/icons/guardia/brand-1/original_64.png create mode 100644 assets/icons/guardia/brand-2/original_16.png create mode 100644 assets/icons/guardia/brand-2/original_24.png create mode 100644 assets/icons/guardia/brand-2/original_32.png create mode 100644 assets/icons/guardia/brand-2/original_48.png create mode 100644 assets/icons/guardia/brand-2/original_64.png create mode 100644 assets/icons/guardia/brand-3/original_16.png create mode 100644 assets/icons/guardia/brand-3/original_24.png create mode 100644 assets/icons/guardia/brand-3/original_32.png create mode 100644 assets/icons/guardia/brand-3/original_48.png create mode 100644 assets/icons/guardia/brand-3/original_64.png create mode 100644 assets/icons/guardia/brand-4/original_16.png create mode 100644 assets/icons/guardia/brand-4/original_24.png create mode 100644 assets/icons/guardia/brand-4/original_32.png create mode 100644 assets/icons/guardia/brand-4/original_48.png create mode 100644 assets/icons/guardia/brand-4/original_64.png create mode 100644 assets/icons/guardia/brand-5/original_16.png create mode 100644 assets/icons/guardia/brand-5/original_24.png create mode 100644 assets/icons/guardia/brand-5/original_32.png create mode 100644 assets/icons/guardia/brand-5/original_48.png create mode 100644 assets/icons/guardia/brand-5/original_64.png create mode 100644 assets/icons/guardia/brand-6/original_16.png create mode 100644 assets/icons/guardia/brand-6/original_24.png create mode 100644 assets/icons/guardia/brand-6/original_32.png create mode 100644 assets/icons/guardia/brand-6/original_48.png create mode 100644 assets/icons/guardia/brand-6/original_64.png create mode 100644 assets/icons/guardia/brand-7/original_16.png create mode 100644 assets/icons/guardia/brand-7/original_24.png create mode 100644 assets/icons/guardia/brand-7/original_32.png create mode 100644 assets/icons/guardia/brand-7/original_48.png create mode 100644 assets/icons/guardia/brand-7/original_64.png create mode 100644 assets/icons/guardia/brand-8/original_16.png create mode 100644 assets/icons/guardia/brand-8/original_24.png create mode 100644 assets/icons/guardia/brand-8/original_32.png create mode 100644 assets/icons/guardia/brand-8/original_48.png create mode 100644 assets/icons/guardia/brand-8/original_64.png create mode 100644 assets/icons/guardia/home/navy_16.png create mode 100644 assets/icons/guardia/home/navy_24.png create mode 100644 assets/icons/guardia/home/navy_32.png create mode 100644 assets/icons/guardia/home/navy_48.png create mode 100644 assets/icons/guardia/home/navy_64.png create mode 100644 assets/icons/guardia/home/white_16.png create mode 100644 assets/icons/guardia/home/white_24.png create mode 100644 assets/icons/guardia/home/white_32.png create mode 100644 assets/icons/guardia/home/white_48.png create mode 100644 assets/icons/guardia/home/white_64.png create mode 100644 assets/icons/guardia/icon-1/navy_16.png create mode 100644 assets/icons/guardia/icon-1/navy_24.png create mode 100644 assets/icons/guardia/icon-1/navy_32.png create mode 100644 assets/icons/guardia/icon-1/navy_48.png create mode 100644 assets/icons/guardia/icon-1/navy_64.png create mode 100644 assets/icons/guardia/icon-1/white_16.png create mode 100644 assets/icons/guardia/icon-1/white_24.png create mode 100644 assets/icons/guardia/icon-1/white_32.png create mode 100644 assets/icons/guardia/icon-1/white_48.png create mode 100644 assets/icons/guardia/icon-1/white_64.png create mode 100644 assets/icons/guardia/icon-10/navy_16.png create mode 100644 assets/icons/guardia/icon-10/navy_24.png create mode 100644 assets/icons/guardia/icon-10/navy_32.png create mode 100644 assets/icons/guardia/icon-10/navy_48.png create mode 100644 assets/icons/guardia/icon-10/navy_64.png create mode 100644 assets/icons/guardia/icon-10/white_16.png create mode 100644 assets/icons/guardia/icon-10/white_24.png create mode 100644 assets/icons/guardia/icon-10/white_32.png create mode 100644 assets/icons/guardia/icon-10/white_48.png create mode 100644 assets/icons/guardia/icon-10/white_64.png create mode 100644 assets/icons/guardia/icon-11/navy_16.png create mode 100644 assets/icons/guardia/icon-11/navy_24.png create mode 100644 assets/icons/guardia/icon-11/navy_32.png create mode 100644 assets/icons/guardia/icon-11/navy_48.png create mode 100644 assets/icons/guardia/icon-11/navy_64.png create mode 100644 assets/icons/guardia/icon-11/white_16.png create mode 100644 assets/icons/guardia/icon-11/white_24.png create mode 100644 assets/icons/guardia/icon-11/white_32.png create mode 100644 assets/icons/guardia/icon-11/white_48.png create mode 100644 assets/icons/guardia/icon-11/white_64.png create mode 100644 assets/icons/guardia/icon-12/navy_16.png create mode 100644 assets/icons/guardia/icon-12/navy_24.png create mode 100644 assets/icons/guardia/icon-12/navy_32.png create mode 100644 assets/icons/guardia/icon-12/navy_48.png create mode 100644 assets/icons/guardia/icon-12/navy_64.png create mode 100644 assets/icons/guardia/icon-12/white_16.png create mode 100644 assets/icons/guardia/icon-12/white_24.png create mode 100644 assets/icons/guardia/icon-12/white_32.png create mode 100644 assets/icons/guardia/icon-12/white_48.png create mode 100644 assets/icons/guardia/icon-12/white_64.png create mode 100644 assets/icons/guardia/icon-13/navy_16.png create mode 100644 assets/icons/guardia/icon-13/navy_24.png create mode 100644 assets/icons/guardia/icon-13/navy_32.png create mode 100644 assets/icons/guardia/icon-13/navy_48.png create mode 100644 assets/icons/guardia/icon-13/navy_64.png create mode 100644 assets/icons/guardia/icon-13/white_16.png create mode 100644 assets/icons/guardia/icon-13/white_24.png create mode 100644 assets/icons/guardia/icon-13/white_32.png create mode 100644 assets/icons/guardia/icon-13/white_48.png create mode 100644 assets/icons/guardia/icon-13/white_64.png create mode 100644 assets/icons/guardia/icon-14/navy_16.png create mode 100644 assets/icons/guardia/icon-14/navy_24.png create mode 100644 assets/icons/guardia/icon-14/navy_32.png create mode 100644 assets/icons/guardia/icon-14/navy_48.png create mode 100644 assets/icons/guardia/icon-14/navy_64.png create mode 100644 assets/icons/guardia/icon-14/white_16.png create mode 100644 assets/icons/guardia/icon-14/white_24.png create mode 100644 assets/icons/guardia/icon-14/white_32.png create mode 100644 assets/icons/guardia/icon-14/white_48.png create mode 100644 assets/icons/guardia/icon-14/white_64.png create mode 100644 assets/icons/guardia/icon-15/navy_16.png create mode 100644 assets/icons/guardia/icon-15/navy_24.png create mode 100644 assets/icons/guardia/icon-15/navy_32.png create mode 100644 assets/icons/guardia/icon-15/navy_48.png create mode 100644 assets/icons/guardia/icon-15/navy_64.png create mode 100644 assets/icons/guardia/icon-15/white_16.png create mode 100644 assets/icons/guardia/icon-15/white_24.png create mode 100644 assets/icons/guardia/icon-15/white_32.png create mode 100644 assets/icons/guardia/icon-15/white_48.png create mode 100644 assets/icons/guardia/icon-15/white_64.png create mode 100644 assets/icons/guardia/icon-16/navy_16.png create mode 100644 assets/icons/guardia/icon-16/navy_24.png create mode 100644 assets/icons/guardia/icon-16/navy_32.png create mode 100644 assets/icons/guardia/icon-16/navy_48.png create mode 100644 assets/icons/guardia/icon-16/navy_64.png create mode 100644 assets/icons/guardia/icon-16/white_16.png create mode 100644 assets/icons/guardia/icon-16/white_24.png create mode 100644 assets/icons/guardia/icon-16/white_32.png create mode 100644 assets/icons/guardia/icon-16/white_48.png create mode 100644 assets/icons/guardia/icon-16/white_64.png create mode 100644 assets/icons/guardia/icon-17/navy_16.png create mode 100644 assets/icons/guardia/icon-17/navy_24.png create mode 100644 assets/icons/guardia/icon-17/navy_32.png create mode 100644 assets/icons/guardia/icon-17/navy_48.png create mode 100644 assets/icons/guardia/icon-17/navy_64.png create mode 100644 assets/icons/guardia/icon-17/white_16.png create mode 100644 assets/icons/guardia/icon-17/white_24.png create mode 100644 assets/icons/guardia/icon-17/white_32.png create mode 100644 assets/icons/guardia/icon-17/white_48.png create mode 100644 assets/icons/guardia/icon-17/white_64.png create mode 100644 assets/icons/guardia/icon-18/navy_16.png create mode 100644 assets/icons/guardia/icon-18/navy_24.png create mode 100644 assets/icons/guardia/icon-18/navy_32.png create mode 100644 assets/icons/guardia/icon-18/navy_48.png create mode 100644 assets/icons/guardia/icon-18/navy_64.png create mode 100644 assets/icons/guardia/icon-18/white_16.png create mode 100644 assets/icons/guardia/icon-18/white_24.png create mode 100644 assets/icons/guardia/icon-18/white_32.png create mode 100644 assets/icons/guardia/icon-18/white_48.png create mode 100644 assets/icons/guardia/icon-18/white_64.png create mode 100644 assets/icons/guardia/icon-19/navy_16.png create mode 100644 assets/icons/guardia/icon-19/navy_24.png create mode 100644 assets/icons/guardia/icon-19/navy_32.png create mode 100644 assets/icons/guardia/icon-19/navy_48.png create mode 100644 assets/icons/guardia/icon-19/navy_64.png create mode 100644 assets/icons/guardia/icon-19/white_16.png create mode 100644 assets/icons/guardia/icon-19/white_24.png create mode 100644 assets/icons/guardia/icon-19/white_32.png create mode 100644 assets/icons/guardia/icon-19/white_48.png create mode 100644 assets/icons/guardia/icon-19/white_64.png create mode 100644 assets/icons/guardia/icon-1_1/navy_16.png create mode 100644 assets/icons/guardia/icon-1_1/navy_24.png create mode 100644 assets/icons/guardia/icon-1_1/navy_32.png create mode 100644 assets/icons/guardia/icon-1_1/navy_48.png create mode 100644 assets/icons/guardia/icon-1_1/navy_64.png create mode 100644 assets/icons/guardia/icon-1_1/white_16.png create mode 100644 assets/icons/guardia/icon-1_1/white_24.png create mode 100644 assets/icons/guardia/icon-1_1/white_32.png create mode 100644 assets/icons/guardia/icon-1_1/white_48.png create mode 100644 assets/icons/guardia/icon-1_1/white_64.png create mode 100644 assets/icons/guardia/icon-1_10/navy_16.png create mode 100644 assets/icons/guardia/icon-1_10/navy_24.png create mode 100644 assets/icons/guardia/icon-1_10/navy_32.png create mode 100644 assets/icons/guardia/icon-1_10/navy_48.png create mode 100644 assets/icons/guardia/icon-1_10/navy_64.png create mode 100644 assets/icons/guardia/icon-1_10/white_16.png create mode 100644 assets/icons/guardia/icon-1_10/white_24.png create mode 100644 assets/icons/guardia/icon-1_10/white_32.png create mode 100644 assets/icons/guardia/icon-1_10/white_48.png create mode 100644 assets/icons/guardia/icon-1_10/white_64.png create mode 100644 assets/icons/guardia/icon-1_11/navy_16.png create mode 100644 assets/icons/guardia/icon-1_11/navy_24.png create mode 100644 assets/icons/guardia/icon-1_11/navy_32.png create mode 100644 assets/icons/guardia/icon-1_11/navy_48.png create mode 100644 assets/icons/guardia/icon-1_11/navy_64.png create mode 100644 assets/icons/guardia/icon-1_11/white_16.png create mode 100644 assets/icons/guardia/icon-1_11/white_24.png create mode 100644 assets/icons/guardia/icon-1_11/white_32.png create mode 100644 assets/icons/guardia/icon-1_11/white_48.png create mode 100644 assets/icons/guardia/icon-1_11/white_64.png create mode 100644 assets/icons/guardia/icon-1_12/navy_16.png create mode 100644 assets/icons/guardia/icon-1_12/navy_24.png create mode 100644 assets/icons/guardia/icon-1_12/navy_32.png create mode 100644 assets/icons/guardia/icon-1_12/navy_48.png create mode 100644 assets/icons/guardia/icon-1_12/navy_64.png create mode 100644 assets/icons/guardia/icon-1_12/white_16.png create mode 100644 assets/icons/guardia/icon-1_12/white_24.png create mode 100644 assets/icons/guardia/icon-1_12/white_32.png create mode 100644 assets/icons/guardia/icon-1_12/white_48.png create mode 100644 assets/icons/guardia/icon-1_12/white_64.png create mode 100644 assets/icons/guardia/icon-1_13/navy_16.png create mode 100644 assets/icons/guardia/icon-1_13/navy_24.png create mode 100644 assets/icons/guardia/icon-1_13/navy_32.png create mode 100644 assets/icons/guardia/icon-1_13/navy_48.png create mode 100644 assets/icons/guardia/icon-1_13/navy_64.png create mode 100644 assets/icons/guardia/icon-1_13/white_16.png create mode 100644 assets/icons/guardia/icon-1_13/white_24.png create mode 100644 assets/icons/guardia/icon-1_13/white_32.png create mode 100644 assets/icons/guardia/icon-1_13/white_48.png create mode 100644 assets/icons/guardia/icon-1_13/white_64.png create mode 100644 assets/icons/guardia/icon-1_14/navy_16.png create mode 100644 assets/icons/guardia/icon-1_14/navy_24.png create mode 100644 assets/icons/guardia/icon-1_14/navy_32.png create mode 100644 assets/icons/guardia/icon-1_14/navy_48.png create mode 100644 assets/icons/guardia/icon-1_14/navy_64.png create mode 100644 assets/icons/guardia/icon-1_14/white_16.png create mode 100644 assets/icons/guardia/icon-1_14/white_24.png create mode 100644 assets/icons/guardia/icon-1_14/white_32.png create mode 100644 assets/icons/guardia/icon-1_14/white_48.png create mode 100644 assets/icons/guardia/icon-1_14/white_64.png create mode 100644 assets/icons/guardia/icon-1_15/navy_16.png create mode 100644 assets/icons/guardia/icon-1_15/navy_24.png create mode 100644 assets/icons/guardia/icon-1_15/navy_32.png create mode 100644 assets/icons/guardia/icon-1_15/navy_48.png create mode 100644 assets/icons/guardia/icon-1_15/navy_64.png create mode 100644 assets/icons/guardia/icon-1_15/white_16.png create mode 100644 assets/icons/guardia/icon-1_15/white_24.png create mode 100644 assets/icons/guardia/icon-1_15/white_32.png create mode 100644 assets/icons/guardia/icon-1_15/white_48.png create mode 100644 assets/icons/guardia/icon-1_15/white_64.png create mode 100644 assets/icons/guardia/icon-1_2/navy_16.png create mode 100644 assets/icons/guardia/icon-1_2/navy_24.png create mode 100644 assets/icons/guardia/icon-1_2/navy_32.png create mode 100644 assets/icons/guardia/icon-1_2/navy_48.png create mode 100644 assets/icons/guardia/icon-1_2/navy_64.png create mode 100644 assets/icons/guardia/icon-1_2/white_16.png create mode 100644 assets/icons/guardia/icon-1_2/white_24.png create mode 100644 assets/icons/guardia/icon-1_2/white_32.png create mode 100644 assets/icons/guardia/icon-1_2/white_48.png create mode 100644 assets/icons/guardia/icon-1_2/white_64.png create mode 100644 assets/icons/guardia/icon-1_3/navy_16.png create mode 100644 assets/icons/guardia/icon-1_3/navy_24.png create mode 100644 assets/icons/guardia/icon-1_3/navy_32.png create mode 100644 assets/icons/guardia/icon-1_3/navy_48.png create mode 100644 assets/icons/guardia/icon-1_3/navy_64.png create mode 100644 assets/icons/guardia/icon-1_3/white_16.png create mode 100644 assets/icons/guardia/icon-1_3/white_24.png create mode 100644 assets/icons/guardia/icon-1_3/white_32.png create mode 100644 assets/icons/guardia/icon-1_3/white_48.png create mode 100644 assets/icons/guardia/icon-1_3/white_64.png create mode 100644 assets/icons/guardia/icon-1_4/navy_16.png create mode 100644 assets/icons/guardia/icon-1_4/navy_24.png create mode 100644 assets/icons/guardia/icon-1_4/navy_32.png create mode 100644 assets/icons/guardia/icon-1_4/navy_48.png create mode 100644 assets/icons/guardia/icon-1_4/navy_64.png create mode 100644 assets/icons/guardia/icon-1_4/white_16.png create mode 100644 assets/icons/guardia/icon-1_4/white_24.png create mode 100644 assets/icons/guardia/icon-1_4/white_32.png create mode 100644 assets/icons/guardia/icon-1_4/white_48.png create mode 100644 assets/icons/guardia/icon-1_4/white_64.png create mode 100644 assets/icons/guardia/icon-1_5/navy_16.png create mode 100644 assets/icons/guardia/icon-1_5/navy_24.png create mode 100644 assets/icons/guardia/icon-1_5/navy_32.png create mode 100644 assets/icons/guardia/icon-1_5/navy_48.png create mode 100644 assets/icons/guardia/icon-1_5/navy_64.png create mode 100644 assets/icons/guardia/icon-1_5/white_16.png create mode 100644 assets/icons/guardia/icon-1_5/white_24.png create mode 100644 assets/icons/guardia/icon-1_5/white_32.png create mode 100644 assets/icons/guardia/icon-1_5/white_48.png create mode 100644 assets/icons/guardia/icon-1_5/white_64.png create mode 100644 assets/icons/guardia/icon-1_6/navy_16.png create mode 100644 assets/icons/guardia/icon-1_6/navy_24.png create mode 100644 assets/icons/guardia/icon-1_6/navy_32.png create mode 100644 assets/icons/guardia/icon-1_6/navy_48.png create mode 100644 assets/icons/guardia/icon-1_6/navy_64.png create mode 100644 assets/icons/guardia/icon-1_6/white_16.png create mode 100644 assets/icons/guardia/icon-1_6/white_24.png create mode 100644 assets/icons/guardia/icon-1_6/white_32.png create mode 100644 assets/icons/guardia/icon-1_6/white_48.png create mode 100644 assets/icons/guardia/icon-1_6/white_64.png create mode 100644 assets/icons/guardia/icon-1_7/navy_16.png create mode 100644 assets/icons/guardia/icon-1_7/navy_24.png create mode 100644 assets/icons/guardia/icon-1_7/navy_32.png create mode 100644 assets/icons/guardia/icon-1_7/navy_48.png create mode 100644 assets/icons/guardia/icon-1_7/navy_64.png create mode 100644 assets/icons/guardia/icon-1_7/white_16.png create mode 100644 assets/icons/guardia/icon-1_7/white_24.png create mode 100644 assets/icons/guardia/icon-1_7/white_32.png create mode 100644 assets/icons/guardia/icon-1_7/white_48.png create mode 100644 assets/icons/guardia/icon-1_7/white_64.png create mode 100644 assets/icons/guardia/icon-1_8/navy_16.png create mode 100644 assets/icons/guardia/icon-1_8/navy_24.png create mode 100644 assets/icons/guardia/icon-1_8/navy_32.png create mode 100644 assets/icons/guardia/icon-1_8/navy_48.png create mode 100644 assets/icons/guardia/icon-1_8/navy_64.png create mode 100644 assets/icons/guardia/icon-1_8/white_16.png create mode 100644 assets/icons/guardia/icon-1_8/white_24.png create mode 100644 assets/icons/guardia/icon-1_8/white_32.png create mode 100644 assets/icons/guardia/icon-1_8/white_48.png create mode 100644 assets/icons/guardia/icon-1_8/white_64.png create mode 100644 assets/icons/guardia/icon-1_9/navy_16.png create mode 100644 assets/icons/guardia/icon-1_9/navy_24.png create mode 100644 assets/icons/guardia/icon-1_9/navy_32.png create mode 100644 assets/icons/guardia/icon-1_9/navy_48.png create mode 100644 assets/icons/guardia/icon-1_9/navy_64.png create mode 100644 assets/icons/guardia/icon-1_9/white_16.png create mode 100644 assets/icons/guardia/icon-1_9/white_24.png create mode 100644 assets/icons/guardia/icon-1_9/white_32.png create mode 100644 assets/icons/guardia/icon-1_9/white_48.png create mode 100644 assets/icons/guardia/icon-1_9/white_64.png create mode 100644 assets/icons/guardia/icon-2/navy_16.png create mode 100644 assets/icons/guardia/icon-2/navy_24.png create mode 100644 assets/icons/guardia/icon-2/navy_32.png create mode 100644 assets/icons/guardia/icon-2/navy_48.png create mode 100644 assets/icons/guardia/icon-2/navy_64.png create mode 100644 assets/icons/guardia/icon-2/white_16.png create mode 100644 assets/icons/guardia/icon-2/white_24.png create mode 100644 assets/icons/guardia/icon-2/white_32.png create mode 100644 assets/icons/guardia/icon-2/white_48.png create mode 100644 assets/icons/guardia/icon-2/white_64.png create mode 100644 assets/icons/guardia/icon-20/navy_16.png create mode 100644 assets/icons/guardia/icon-20/navy_24.png create mode 100644 assets/icons/guardia/icon-20/navy_32.png create mode 100644 assets/icons/guardia/icon-20/navy_48.png create mode 100644 assets/icons/guardia/icon-20/navy_64.png create mode 100644 assets/icons/guardia/icon-20/white_16.png create mode 100644 assets/icons/guardia/icon-20/white_24.png create mode 100644 assets/icons/guardia/icon-20/white_32.png create mode 100644 assets/icons/guardia/icon-20/white_48.png create mode 100644 assets/icons/guardia/icon-20/white_64.png create mode 100644 assets/icons/guardia/icon-21/navy_16.png create mode 100644 assets/icons/guardia/icon-21/navy_24.png create mode 100644 assets/icons/guardia/icon-21/navy_32.png create mode 100644 assets/icons/guardia/icon-21/navy_48.png create mode 100644 assets/icons/guardia/icon-21/navy_64.png create mode 100644 assets/icons/guardia/icon-21/white_16.png create mode 100644 assets/icons/guardia/icon-21/white_24.png create mode 100644 assets/icons/guardia/icon-21/white_32.png create mode 100644 assets/icons/guardia/icon-21/white_48.png create mode 100644 assets/icons/guardia/icon-21/white_64.png create mode 100644 assets/icons/guardia/icon-22/navy_16.png create mode 100644 assets/icons/guardia/icon-22/navy_24.png create mode 100644 assets/icons/guardia/icon-22/navy_32.png create mode 100644 assets/icons/guardia/icon-22/navy_48.png create mode 100644 assets/icons/guardia/icon-22/navy_64.png create mode 100644 assets/icons/guardia/icon-22/white_16.png create mode 100644 assets/icons/guardia/icon-22/white_24.png create mode 100644 assets/icons/guardia/icon-22/white_32.png create mode 100644 assets/icons/guardia/icon-22/white_48.png create mode 100644 assets/icons/guardia/icon-22/white_64.png create mode 100644 assets/icons/guardia/icon-23/navy_16.png create mode 100644 assets/icons/guardia/icon-23/navy_24.png create mode 100644 assets/icons/guardia/icon-23/navy_32.png create mode 100644 assets/icons/guardia/icon-23/navy_48.png create mode 100644 assets/icons/guardia/icon-23/navy_64.png create mode 100644 assets/icons/guardia/icon-23/white_16.png create mode 100644 assets/icons/guardia/icon-23/white_24.png create mode 100644 assets/icons/guardia/icon-23/white_32.png create mode 100644 assets/icons/guardia/icon-23/white_48.png create mode 100644 assets/icons/guardia/icon-23/white_64.png create mode 100644 assets/icons/guardia/icon-24/navy_16.png create mode 100644 assets/icons/guardia/icon-24/navy_24.png create mode 100644 assets/icons/guardia/icon-24/navy_32.png create mode 100644 assets/icons/guardia/icon-24/navy_48.png create mode 100644 assets/icons/guardia/icon-24/navy_64.png create mode 100644 assets/icons/guardia/icon-24/white_16.png create mode 100644 assets/icons/guardia/icon-24/white_24.png create mode 100644 assets/icons/guardia/icon-24/white_32.png create mode 100644 assets/icons/guardia/icon-24/white_48.png create mode 100644 assets/icons/guardia/icon-24/white_64.png create mode 100644 assets/icons/guardia/icon-25/navy_16.png create mode 100644 assets/icons/guardia/icon-25/navy_24.png create mode 100644 assets/icons/guardia/icon-25/navy_32.png create mode 100644 assets/icons/guardia/icon-25/navy_48.png create mode 100644 assets/icons/guardia/icon-25/navy_64.png create mode 100644 assets/icons/guardia/icon-25/white_16.png create mode 100644 assets/icons/guardia/icon-25/white_24.png create mode 100644 assets/icons/guardia/icon-25/white_32.png create mode 100644 assets/icons/guardia/icon-25/white_48.png create mode 100644 assets/icons/guardia/icon-25/white_64.png create mode 100644 assets/icons/guardia/icon-26/navy_16.png create mode 100644 assets/icons/guardia/icon-26/navy_24.png create mode 100644 assets/icons/guardia/icon-26/navy_32.png create mode 100644 assets/icons/guardia/icon-26/navy_48.png create mode 100644 assets/icons/guardia/icon-26/navy_64.png create mode 100644 assets/icons/guardia/icon-26/white_16.png create mode 100644 assets/icons/guardia/icon-26/white_24.png create mode 100644 assets/icons/guardia/icon-26/white_32.png create mode 100644 assets/icons/guardia/icon-26/white_48.png create mode 100644 assets/icons/guardia/icon-26/white_64.png create mode 100644 assets/icons/guardia/icon-27/navy_16.png create mode 100644 assets/icons/guardia/icon-27/navy_24.png create mode 100644 assets/icons/guardia/icon-27/navy_32.png create mode 100644 assets/icons/guardia/icon-27/navy_48.png create mode 100644 assets/icons/guardia/icon-27/navy_64.png create mode 100644 assets/icons/guardia/icon-27/white_16.png create mode 100644 assets/icons/guardia/icon-27/white_24.png create mode 100644 assets/icons/guardia/icon-27/white_32.png create mode 100644 assets/icons/guardia/icon-27/white_48.png create mode 100644 assets/icons/guardia/icon-27/white_64.png create mode 100644 assets/icons/guardia/icon-28/navy_16.png create mode 100644 assets/icons/guardia/icon-28/navy_24.png create mode 100644 assets/icons/guardia/icon-28/navy_32.png create mode 100644 assets/icons/guardia/icon-28/navy_48.png create mode 100644 assets/icons/guardia/icon-28/navy_64.png create mode 100644 assets/icons/guardia/icon-28/white_16.png create mode 100644 assets/icons/guardia/icon-28/white_24.png create mode 100644 assets/icons/guardia/icon-28/white_32.png create mode 100644 assets/icons/guardia/icon-28/white_48.png create mode 100644 assets/icons/guardia/icon-28/white_64.png create mode 100644 assets/icons/guardia/icon-29/navy_16.png create mode 100644 assets/icons/guardia/icon-29/navy_24.png create mode 100644 assets/icons/guardia/icon-29/navy_32.png create mode 100644 assets/icons/guardia/icon-29/navy_48.png create mode 100644 assets/icons/guardia/icon-29/navy_64.png create mode 100644 assets/icons/guardia/icon-29/white_16.png create mode 100644 assets/icons/guardia/icon-29/white_24.png create mode 100644 assets/icons/guardia/icon-29/white_32.png create mode 100644 assets/icons/guardia/icon-29/white_48.png create mode 100644 assets/icons/guardia/icon-29/white_64.png create mode 100644 assets/icons/guardia/icon-3/navy_16.png create mode 100644 assets/icons/guardia/icon-3/navy_24.png create mode 100644 assets/icons/guardia/icon-3/navy_32.png create mode 100644 assets/icons/guardia/icon-3/navy_48.png create mode 100644 assets/icons/guardia/icon-3/navy_64.png create mode 100644 assets/icons/guardia/icon-3/white_16.png create mode 100644 assets/icons/guardia/icon-3/white_24.png create mode 100644 assets/icons/guardia/icon-3/white_32.png create mode 100644 assets/icons/guardia/icon-3/white_48.png create mode 100644 assets/icons/guardia/icon-3/white_64.png create mode 100644 assets/icons/guardia/icon-30/navy_16.png create mode 100644 assets/icons/guardia/icon-30/navy_24.png create mode 100644 assets/icons/guardia/icon-30/navy_32.png create mode 100644 assets/icons/guardia/icon-30/navy_48.png create mode 100644 assets/icons/guardia/icon-30/navy_64.png create mode 100644 assets/icons/guardia/icon-30/white_16.png create mode 100644 assets/icons/guardia/icon-30/white_24.png create mode 100644 assets/icons/guardia/icon-30/white_32.png create mode 100644 assets/icons/guardia/icon-30/white_48.png create mode 100644 assets/icons/guardia/icon-30/white_64.png create mode 100644 assets/icons/guardia/icon-4/navy_16.png create mode 100644 assets/icons/guardia/icon-4/navy_24.png create mode 100644 assets/icons/guardia/icon-4/navy_32.png create mode 100644 assets/icons/guardia/icon-4/navy_48.png create mode 100644 assets/icons/guardia/icon-4/navy_64.png create mode 100644 assets/icons/guardia/icon-4/white_16.png create mode 100644 assets/icons/guardia/icon-4/white_24.png create mode 100644 assets/icons/guardia/icon-4/white_32.png create mode 100644 assets/icons/guardia/icon-4/white_48.png create mode 100644 assets/icons/guardia/icon-4/white_64.png create mode 100644 assets/icons/guardia/icon-5/navy_16.png create mode 100644 assets/icons/guardia/icon-5/navy_24.png create mode 100644 assets/icons/guardia/icon-5/navy_32.png create mode 100644 assets/icons/guardia/icon-5/navy_48.png create mode 100644 assets/icons/guardia/icon-5/navy_64.png create mode 100644 assets/icons/guardia/icon-5/white_16.png create mode 100644 assets/icons/guardia/icon-5/white_24.png create mode 100644 assets/icons/guardia/icon-5/white_32.png create mode 100644 assets/icons/guardia/icon-5/white_48.png create mode 100644 assets/icons/guardia/icon-5/white_64.png create mode 100644 assets/icons/guardia/icon-6/navy_16.png create mode 100644 assets/icons/guardia/icon-6/navy_24.png create mode 100644 assets/icons/guardia/icon-6/navy_32.png create mode 100644 assets/icons/guardia/icon-6/navy_48.png create mode 100644 assets/icons/guardia/icon-6/navy_64.png create mode 100644 assets/icons/guardia/icon-6/white_16.png create mode 100644 assets/icons/guardia/icon-6/white_24.png create mode 100644 assets/icons/guardia/icon-6/white_32.png create mode 100644 assets/icons/guardia/icon-6/white_48.png create mode 100644 assets/icons/guardia/icon-6/white_64.png create mode 100644 assets/icons/guardia/icon-7/navy_16.png create mode 100644 assets/icons/guardia/icon-7/navy_24.png create mode 100644 assets/icons/guardia/icon-7/navy_32.png create mode 100644 assets/icons/guardia/icon-7/navy_48.png create mode 100644 assets/icons/guardia/icon-7/navy_64.png create mode 100644 assets/icons/guardia/icon-7/white_16.png create mode 100644 assets/icons/guardia/icon-7/white_24.png create mode 100644 assets/icons/guardia/icon-7/white_32.png create mode 100644 assets/icons/guardia/icon-7/white_48.png create mode 100644 assets/icons/guardia/icon-7/white_64.png create mode 100644 assets/icons/guardia/icon-8/navy_16.png create mode 100644 assets/icons/guardia/icon-8/navy_24.png create mode 100644 assets/icons/guardia/icon-8/navy_32.png create mode 100644 assets/icons/guardia/icon-8/navy_48.png create mode 100644 assets/icons/guardia/icon-8/navy_64.png create mode 100644 assets/icons/guardia/icon-8/white_16.png create mode 100644 assets/icons/guardia/icon-8/white_24.png create mode 100644 assets/icons/guardia/icon-8/white_32.png create mode 100644 assets/icons/guardia/icon-8/white_48.png create mode 100644 assets/icons/guardia/icon-8/white_64.png create mode 100644 assets/icons/guardia/icon-9/navy_16.png create mode 100644 assets/icons/guardia/icon-9/navy_24.png create mode 100644 assets/icons/guardia/icon-9/navy_32.png create mode 100644 assets/icons/guardia/icon-9/navy_48.png create mode 100644 assets/icons/guardia/icon-9/navy_64.png create mode 100644 assets/icons/guardia/icon-9/white_16.png create mode 100644 assets/icons/guardia/icon-9/white_24.png create mode 100644 assets/icons/guardia/icon-9/white_32.png create mode 100644 assets/icons/guardia/icon-9/white_48.png create mode 100644 assets/icons/guardia/icon-9/white_64.png create mode 100644 assets/icons/guardia/icon-registry.ts create mode 100644 assets/icons/guardia/panel-01/original_16.png create mode 100644 assets/icons/guardia/panel-01/original_24.png create mode 100644 assets/icons/guardia/panel-01/original_32.png create mode 100644 assets/icons/guardia/panel-01/original_48.png create mode 100644 assets/icons/guardia/panel-01/original_64.png create mode 100644 assets/icons/guardia/panel-02/original_16.png create mode 100644 assets/icons/guardia/panel-02/original_24.png create mode 100644 assets/icons/guardia/panel-02/original_32.png create mode 100644 assets/icons/guardia/panel-02/original_48.png create mode 100644 assets/icons/guardia/panel-02/original_64.png create mode 100644 components/AlertChannelBadge.tsx create mode 100644 components/ApprovalStages.tsx create mode 100644 components/AutoRCA.tsx create mode 100644 components/Comment.tsx create mode 100644 components/DailySummary.tsx create mode 100644 components/ImpactPreview.tsx create mode 100644 components/IncidentTimeline.tsx create mode 100644 components/KBSuggest.tsx create mode 100644 components/MarkdownViewer.tsx create mode 100644 components/MetricGraph.tsx create mode 100644 components/NextActions.tsx create mode 100644 components/PhotoDiagnosis.tsx create mode 100644 components/PinLock.tsx create mode 100644 components/RejectReason.tsx create mode 100644 components/RelatedSR.tsx create mode 100644 components/SRSatisfaction.tsx create mode 100644 components/SRSolutionHint.tsx create mode 100644 components/SRTemplates.tsx create mode 100644 components/SlaTimer.tsx create mode 100644 components/ZeroTrustBadge.tsx create mode 100644 contexts/FontContext.tsx create mode 100644 contexts/OfflineContext.tsx create mode 100644 contexts/ThemeContext.tsx create mode 100644 hooks/useAIClassify.ts create mode 100644 hooks/useAnomalyAlert.ts create mode 100644 hooks/useBadgeCount.ts create mode 100644 hooks/useDuplicateSR.ts create mode 100644 hooks/useGPSTag.ts create mode 100644 hooks/useKBBookmark.ts create mode 100644 hooks/useRoleMenu.ts create mode 100644 hooks/useSLAPrediction.ts create mode 100644 hooks/useScreenshotBlock.ts create mode 100644 hooks/useSessionExpiry.ts create mode 100644 hooks/useSmartNotif.ts create mode 100644 lib/ollama.ts create mode 100644 services/sha256.ts create mode 100644 types/native-modules.d.ts create mode 100644 utils/auth.ts create mode 100644 utils/security.ts diff --git a/app/(auth)/login.tsx b/app/(auth)/login.tsx index 4b8a1846..aa5c9a11 100644 --- a/app/(auth)/login.tsx +++ b/app/(auth)/login.tsx @@ -1,16 +1,60 @@ -import { useState } from 'react' +import { useState, useEffect } from 'react' import { View, Text, TextInput, TouchableOpacity, StyleSheet, KeyboardAvoidingView, Platform, ActivityIndicator, Alert, ScrollView, } from 'react-native' +import { useRouter } from 'expo-router' +import * as LocalAuthentication from 'expo-local-authentication' +import * as SecureStore from 'expo-secure-store' import { useAuth } from '../../hooks/useAuth' import { COLORS } from '../../constants/Config' +import { recordActivity } from '../../hooks/useSessionExpiry' export default function LoginScreen() { const { login } = useAuth() + const router = useRouter() const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [loading, setLoading] = useState(false) + const [bioAvailable, setBioAvailable] = useState(false) // #29 토큰이 있을 때만 노출 + + /* #29 SecureStore에 토큰이 있고 생체 하드웨어가 등록된 경우에만 버튼 표시 */ + useEffect(() => { + ;(async () => { + try { + const token = await SecureStore.getItemAsync('grd_token') + const hasHardware = await LocalAuthentication.hasHardwareAsync() + const isEnrolled = await LocalAuthentication.isEnrolledAsync() + setBioAvailable(!!token && hasHardware && isEnrolled) + } catch { + setBioAvailable(false) + } + })() + }, []) + + /* #29 생체인증 로그인 */ + const biometricLogin = async () => { + const hasHardware = await LocalAuthentication.hasHardwareAsync() + const isEnrolled = await LocalAuthentication.isEnrolledAsync() + if (!hasHardware || !isEnrolled) { + Alert.alert('생체인증 불가', '지문/Face ID가 등록되지 않았습니다.') + return + } + const result = await LocalAuthentication.authenticateAsync({ + promptMessage: 'GUARDiA 로그인', + cancelLabel: '취소', + fallbackLabel: '비밀번호 사용', + }) + if (result.success) { + const token = await SecureStore.getItemAsync('grd_token') + if (token) { + await recordActivity() + router.replace('/(tabs)') + } else { + Alert.alert('재로그인 필요', '저장된 인증 정보가 없습니다. 비밀번호로 로그인해주세요.') + } + } + } const handleLogin = async () => { if (!username.trim() || !password.trim()) { @@ -20,6 +64,7 @@ export default function LoginScreen() { setLoading(true) try { await login(username.trim(), password) + await recordActivity() // #31 로그인 시점을 마지막 활동으로 기록 } catch (e: any) { const msg = e.response?.data?.detail ?? '로그인에 실패했습니다.' Alert.alert('로그인 실패', msg) @@ -87,6 +132,13 @@ export default function LoginScreen() { } + {bioAvailable && ( + + 👆 + 생체인증 로그인 + + )} + GUARDiA ITSM 계정으로 로그인합니다 @@ -135,6 +187,13 @@ const s = StyleSheet.create({ }, btnDisabled: { opacity: .6 }, btnText: { color: '#fff', fontSize: 16, fontWeight: '800', letterSpacing: 0.3 }, + bioBtn: { + flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 8, + marginTop: 12, padding: 14, borderRadius: 12, + borderWidth: 1.5, borderColor: '#00A0C8', backgroundColor: 'rgba(0,160,200,.06)', + }, + bioIcon: { fontSize: 18 }, + bioText: { color: '#00A0C8', fontSize: 15, fontWeight: '700' }, hint: { textAlign: 'center', color: '#64748B', fontSize: 12, marginTop: 16 }, version: { textAlign: 'center', color: 'rgba(0,160,200,.4)', fontSize: 11, marginTop: 24 }, }) diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 934d5ddc..2cae359c 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -98,6 +98,20 @@ export default function TabLayout() { tabBarIcon: ({ focused }) => , }} /> + , + }} + /> + , }} /> + + {/* ── 승인·워크플로우 (#63~#70) — 탭바 미노출 ── */} + + + + + + + {/* ── 지식베이스·문서 (#71~#77) ── */} + + + + + {/* ── 준수·거버넌스 (#78~#84) ── */} + + + + + + {/* ── UX·접근성 (#85~#92) ── */} + + + + {/* ── 통계·보고 (#93~#97) ── */} + + + + + + + {/* ── 협업·연동 (#98~#100) ── */} + + + + + {/* ── 2세대 AIOps / 예측 (#101~#110) ── */} + + + + + + + + {/* ── 전자서명 / 하드웨어 (#111~#120) ── */} + + + + + {/* ── 보안 위협 (#131~#140) ── */} + + + + + + {/* ── AI 이력 / 브리핑 (#141~#150) ── */} + + + + + {/* ── 할 일 / 캘린더 (#151~#160) ── */} + + + + + {/* ── 클라우드 / 인프라 (#161~#170) ── */} + + + + + {/* ── 즐겨찾기 / 최근 (#171~#180) ── */} + + + + {/* ── 성과 / 분석 (#181~#190) ── */} + + + + + {/* ── 공공기관 특화 (#191~#200) ── */} + + + + + {/* ── Gen3 AI-Native (#G3-1~#G3-6) ── */} + + + + + + {/* ── Gen4 Edge AI & Smart Notify ── */} + + + + {/* ── Gen5 Collaboration & Productivity ── */} + + + + + + + {/* ── Gen6 Autonomous ── */} + + + + + + {/* ── 나라장터 소프트웨어 사업 분석 ── */} + ) } diff --git a/app/(tabs)/accessibility.tsx b/app/(tabs)/accessibility.tsx new file mode 100644 index 00000000..e204a75c --- /dev/null +++ b/app/(tabs)/accessibility.tsx @@ -0,0 +1,76 @@ +import React from 'react' +import { View, Text, Switch, StyleSheet, ScrollView } from 'react-native' +import { COLORS } from '../../constants/Config' +import { useTheme } from '../../contexts/ThemeContext' +import { useFontScale } from '../../contexts/FontContext' + +export default function AccessibilityScreen() { + const { isDark, toggleTheme } = useTheme() + const { fontScale: scale, setFontScale: setScale } = useFontScale() + + return ( + + 접근성 설정 + +
+ + + + + + {([1.0, 1.2, 1.5] as const).map(v => ( + setScale(v)} + >{v === 1.0 ? '기본' : v === 1.2 ? '크게' : '매우 크게'} + ))} + + +
+ +
+ + + 이 텍스트는 현재 접근성 설정이 적용된 예시입니다. + + + 서비스 요청 · 인시던트 · 배포 이력 + + +
+
+ ) +} + +function Section({ title, children }: { title: string; children: React.ReactNode }) { + return ( + + {title} + {children} + + ) +} + +function Row({ label, isDark, children }: { label: string; isDark: boolean; children: React.ReactNode }) { + return ( + + {label} + {children} + + ) +} + +const s = StyleSheet.create({ + header: { fontSize: 22, fontWeight: '800', color: COLORS.text, padding: 16, paddingBottom: 8 }, + section: { backgroundColor: '#fff', marginHorizontal: 12, marginBottom: 12, borderRadius: 12, overflow: 'hidden', elevation: 1 }, + sectionTitle: { fontSize: 12, color: COLORS.muted, fontWeight: '700', paddingHorizontal: 16, paddingTop: 12, paddingBottom: 4, textTransform: 'uppercase', letterSpacing: 1 }, + row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingHorizontal: 16, paddingVertical: 14, borderBottomWidth: 1, borderBottomColor: COLORS.light }, + rowLabel: { fontSize: 15, color: COLORS.text }, + scaleRow: { flexDirection: 'row', gap: 8 }, + scaleBtn: { paddingHorizontal: 10, paddingVertical: 6, borderRadius: 6, backgroundColor: COLORS.light, fontSize: 12, color: COLORS.muted }, + scaleBtnActive:{ backgroundColor: COLORS.accent, color: '#fff', fontWeight: '700' }, + previewBox: { margin: 12, padding: 16, backgroundColor: COLORS.bg, borderRadius: 10 }, + previewText: { fontWeight: '600', color: COLORS.text, marginBottom: 4 }, + previewSub: { color: COLORS.muted }, +}) diff --git a/app/(tabs)/ai_agent.tsx b/app/(tabs)/ai_agent.tsx new file mode 100644 index 00000000..7f2638eb --- /dev/null +++ b/app/(tabs)/ai_agent.tsx @@ -0,0 +1,111 @@ +import React, { useState, useCallback } from 'react'; +import { View, Text, TextInput, ScrollView, TouchableOpacity, StyleSheet, ActivityIndicator } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +const AGENTS = [ + { id: 'sr-manager', name: 'SR 관리자', icon: '📋', desc: 'SR 접수·분류·배정 자동화' }, + { id: 'incident-responder', name: '인시던트 대응', icon: '🚨', desc: '장애 감지·RCA·복구' }, + { id: 'deploy-engineer', name: '배포 엔지니어', icon: '🚀', desc: 'SSH 배포·롤백·헬스체크' }, + { id: 'ai-analyst', name: 'AI 분석가', icon: '🤖', desc: '이상탐지·예측·인사이트' }, + { id: 'csap-auditor', name: 'CSAP 감사관', icon: '🛡️', desc: 'CSAP 준수율 자동 점검' }, +]; + +interface Message { role: 'user' | 'agent'; content: string; agent?: string; ts: string } + +export default function AIAgentScreen() { + const [messages, setMessages] = useState([]); + const [input, setInput] = useState(''); + const [selectedAgent, setSelectedAgent] = useState(AGENTS[0]); + const [loading, setLoading] = useState(false); + + const sendMessage = useCallback(async () => { + if (!input.trim()) return; + const userMsg: Message = { role: 'user', content: input, ts: new Date().toISOString() }; + setMessages(prev => [...prev, userMsg]); + setInput(''); + setLoading(true); + try { + const r = await fetch(`${ITSM_BASE}/api/agent-collab/rooms`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ topic: input, agents: [selectedAgent.id] }), + }); + if (r.ok) { + const room = await r.json(); + const opinion = await fetch(`${ITSM_BASE}/api/agent-collab/rooms/${room.id}/ai-opinion`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ agent_id: selectedAgent.id }), + }); + if (opinion.ok) { + const data = await opinion.json(); + setMessages(prev => [...prev, { + role: 'agent', content: data.opinion || data.message || '처리 완료', + agent: selectedAgent.name, ts: new Date().toISOString(), + }]); + } + } + } catch { + setMessages(prev => [...prev, { role: 'agent', content: '[Ollama 처리 중...]', agent: selectedAgent.name, ts: new Date().toISOString() }]); + } finally { setLoading(false); } + }, [input, selectedAgent]); + + return ( + + AI 에이전트 채팅 + + {AGENTS.map(a => ( + setSelectedAgent(a)}> + {a.icon} + {a.name} + + ))} + + {selectedAgent.icon} {selectedAgent.desc} + + {messages.map((m, i) => ( + + {m.role === 'agent' && {m.agent}} + {m.content} + {new Date(m.ts).toLocaleTimeString()} + + ))} + {loading && } + + + + + 전송 + + + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A' }, + title: { color: '#fff', fontSize: 18, fontWeight: '700', padding: 16, paddingBottom: 8 }, + agentBar: { paddingHorizontal: 12, paddingVertical: 8, maxHeight: 80 }, + agentChip: { alignItems: 'center', marginRight: 12, paddingHorizontal: 12, paddingVertical: 8, + borderRadius: 20, borderWidth: 1, borderColor: '#333', backgroundColor: '#1A1F2E' }, + agentActive: { borderColor: '#00A0C8', backgroundColor: '#003366' }, + agentIcon: { fontSize: 18 }, + agentName: { color: '#aaa', fontSize: 11, marginTop: 2 }, + agentNameActive: { color: '#00A0C8' }, + agentDesc: { backgroundColor: '#1A1F2E', marginHorizontal: 12, marginBottom: 4, padding: 8, borderRadius: 8 }, + agentDescText: { color: '#aaa', fontSize: 12 }, + chat: { flex: 1, padding: 12 }, + bubble: { maxWidth: '80%', marginBottom: 12, padding: 10, borderRadius: 12 }, + userBubble: { alignSelf: 'flex-end', backgroundColor: '#003366' }, + agentBubble: { alignSelf: 'flex-start', backgroundColor: '#1A1F2E' }, + agentLabel: { color: '#00A0C8', fontSize: 11, fontWeight: '600', marginBottom: 4 }, + bubbleText: { color: '#fff', fontSize: 14, lineHeight: 20 }, + ts: { color: '#555', fontSize: 10, marginTop: 4, textAlign: 'right' }, + inputRow: { flexDirection: 'row', padding: 12, borderTopWidth: 1, borderTopColor: '#222' }, + input: { flex: 1, backgroundColor: '#1A1F2E', color: '#fff', borderRadius: 20, paddingHorizontal: 16, marginRight: 8 }, + sendBtn: { backgroundColor: '#00A0C8', borderRadius: 20, paddingHorizontal: 16, justifyContent: 'center' }, + sendText: { color: '#fff', fontWeight: '700' }, +}); diff --git a/app/(tabs)/ai_briefing.tsx b/app/(tabs)/ai_briefing.tsx new file mode 100644 index 00000000..4dea6214 --- /dev/null +++ b/app/(tabs)/ai_briefing.tsx @@ -0,0 +1,74 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, StyleSheet, RefreshControl, ActivityIndicator } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function AIBriefingScreen() { + const [data, setData] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/ai-insights/briefing'); setData(r.data) } + catch { setData(null) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + if (loading) return + if (!data) return 브리핑을 불러올 수 없습니다. + + return ( + } contentContainerStyle={{ padding: 16 }}> + + AI 주간 운영 브리핑 + {data.period ?? ''} + + + + 핵심 요약 + {data.summary ?? data.content ?? '데이터 없음'} + + + {data.highlights?.map((h: string, i: number) => ( + + + {h} + + ))} + + {data.risks?.length > 0 && ( + + 리스크 + {data.risks.map((r: string, i: number) => ( + • {r} + ))} + + )} + + {data.recommendations?.length > 0 && ( + + AI 권고 사항 + {data.recommendations.map((r: string, i: number) => ( + • {r} + ))} + + )} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, + header: { marginBottom: 16 }, + title: { fontSize: 22, fontWeight: '800', color: COLORS.text }, + period: { fontSize: 13, color: COLORS.muted, marginTop: 4 }, + card: { backgroundColor: '#fff', borderRadius: 12, padding: 16, marginBottom: 12, elevation: 1 }, + sectionTitle: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 10 }, + body: { fontSize: 14, color: COLORS.text, lineHeight: 22 }, + bulletRow: { flexDirection: 'row', gap: 8, marginBottom: 6 }, + bullet: { fontSize: 16, color: COLORS.accent, lineHeight: 22 }, + bulletText: { flex: 1, fontSize: 13, color: COLORS.text, lineHeight: 20 }, +}) diff --git a/app/(tabs)/ai_decision.tsx b/app/(tabs)/ai_decision.tsx new file mode 100644 index 00000000..cafbe2e7 --- /dev/null +++ b/app/(tabs)/ai_decision.tsx @@ -0,0 +1,114 @@ +import React, { useState, useEffect } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, ActivityIndicator } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface Decision { id: string; question: string; recommendation: string; confidence: number; alternatives: string[]; impact: string; ts: string } + +const MOCK_DECISIONS: Decision[] = [ + { id: 'D-001', question: 'db-01 디스크 85% — 즉시 조치 필요?', recommendation: '로그 파일 정리 + SR 등록', confidence: 0.91, alternatives: ['서버 증설 요청', '아카이브 이전', '임시 파일 삭제'], impact: '서비스 중단 없이 2시간 내 해결 가능', ts: new Date().toISOString() }, + { id: 'D-002', question: '토요일 오전 2시 긴급 패치 배포 승인?', recommendation: '승인 — 위험 낮음, 영향 범위 최소', confidence: 0.78, alternatives: ['일정 연기 (다음 주)', '부분 배포 (1개 서버만)'], impact: '서비스 다운타임 예상 15분', ts: new Date().toISOString() }, +]; + +export default function AIDecisionScreen() { + const [decisions, setDecisions] = useState(MOCK_DECISIONS); + const [loading, setLoading] = useState(false); + const [selected, setSelected] = useState(null); + + const fetchDecisions = async () => { + setLoading(true); + try { + const r = await fetch(`${ITSM_BASE}/api/ai/decisions/pending`); + if (r.ok) { const d = await r.json(); if (d.items?.length) setDecisions(d.items); } + } catch {} + setLoading(false); + }; + + useEffect(() => { fetchDecisions(); }, []); + + const applyDecision = async (dec: Decision, choice: string) => { + try { + await fetch(`${ITSM_BASE}/api/ai/decisions/${dec.id}/apply`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ choice }), + }); + setDecisions(prev => prev.filter(d => d.id !== dec.id)); + setSelected(null); + } catch {} + }; + + if (selected) { + return ( + + setSelected(null)}> + ← 목록으로 + + {selected.question} + + AI 신뢰도 + {Math.round(selected.confidence * 100)}% + + + AI 권고 + {selected.recommendation} + + + 예상 영향 + {selected.impact} + + 선택지 + {[selected.recommendation, ...selected.alternatives].map((alt, i) => ( + applyDecision(selected, alt)}> + {i === 0 ? '✅ ' : ''}{alt} + + ))} + + ); + } + + return ( + + AI 의사결정 지원 + GUARDiA AI가 운영 결정을 도와드립니다 + {loading && } + {decisions.map(dec => ( + setSelected(dec)}> + + = 0.85 ? '#44bb44' : '#ffbb00' }]}> + {Math.round(dec.confidence * 100)}% + + + {dec.question} + {dec.recommendation} + {new Date(dec.ts).toLocaleString()} + + ))} + {decisions.length === 0 && 대기 중인 AI 의사결정 없음} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + backBtn: { marginBottom: 16 }, backText: { color: '#00A0C8', fontSize: 15 }, + detailTitle: { color: '#fff', fontSize: 17, fontWeight: '700', marginBottom: 16 }, + confCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, marginBottom: 12, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', borderWidth: 1, borderColor: '#333' }, + confLabel: { color: '#aaa', fontSize: 14 }, confVal: { color: '#44bb44', fontSize: 28, fontWeight: '700' }, + card: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, marginBottom: 12, borderWidth: 1, borderColor: '#333' }, + sectionLbl: { color: '#888', fontSize: 12, marginBottom: 8, fontWeight: '600' }, + recommendation: { color: '#fff', fontSize: 15, fontWeight: '600' }, + impact: { color: '#aaa', fontSize: 14 }, + altBtn: { backgroundColor: '#1A1F2E', borderRadius: 10, padding: 14, marginBottom: 10, borderWidth: 1, borderColor: '#333' }, + altBtnPrimary: { backgroundColor: '#003366', borderColor: '#00A0C8' }, + altBtnText: { color: '#aaa', fontSize: 14 }, + altBtnTextPrimary: { color: '#fff', fontWeight: '700' }, + decCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 10, borderWidth: 1, borderColor: '#333' }, + decHeader: { flexDirection: 'row', marginBottom: 8 }, + confBadge: { paddingHorizontal: 8, paddingVertical: 3, borderRadius: 6 }, + confBadgeText: { color: '#fff', fontSize: 11, fontWeight: '700' }, + question: { color: '#fff', fontWeight: '600', fontSize: 14, marginBottom: 6 }, + recoPreview: { color: '#00A0C8', fontSize: 12, marginBottom: 6 }, + ts: { color: '#555', fontSize: 11 }, + empty: { color: '#555', textAlign: 'center', marginTop: 40, fontSize: 14 }, +}); diff --git a/app/(tabs)/ai_history.tsx b/app/(tabs)/ai_history.tsx new file mode 100644 index 00000000..2c4810fd --- /dev/null +++ b/app/(tabs)/ai_history.tsx @@ -0,0 +1,55 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function AIHistoryScreen() { + const [items, setItems] = useState([]) + const [page, setPage] = useState(0) + const [hasMore, setHasMore] = useState(true) + const [loading, setLoading] = useState(false) + + const load = useCallback(async (p = 0) => { + setLoading(true) + try { + const r = await client.get('/api/mobile2/chatbot-history', { params: { page: p, size: 20 } }) + const rows = r.data?.items ?? r.data ?? [] + setItems(prev => p === 0 ? rows : [...prev, ...rows]) + setHasMore(rows.length === 20) + setPage(p) + } catch { if (p === 0) setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load(0) }, [load])) + + const roleColor = (role: string) => role === 'user' ? COLORS.blue : COLORS.accent + + return ( + String(i)} + refreshControl={ load(0)} />} + onEndReached={() => hasMore && !loading && load(page + 1)} + onEndReachedThreshold={0.3} + ListEmptyComponent={AI 대화 이력이 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => ( + + {item.role === 'user' ? '나' : 'AI'} + {item.content ?? item.message} + {item.created_at?.slice(0, 16) ?? ''} + + )} + /> + ) +} + +const s = StyleSheet.create({ + bubble: { maxWidth: '80%', borderWidth: 1, borderRadius: 12, padding: 12, marginBottom: 8 }, + role: { fontSize: 11, fontWeight: '700', marginBottom: 4 }, + content: { fontSize: 13, color: COLORS.text, lineHeight: 20 }, + time: { fontSize: 10, color: COLORS.muted, marginTop: 4, textAlign: 'right' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/ai_soc.tsx b/app/(tabs)/ai_soc.tsx new file mode 100644 index 00000000..5b07f8e9 --- /dev/null +++ b/app/(tabs)/ai_soc.tsx @@ -0,0 +1,100 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, TouchableOpacity, StyleSheet, Alert, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getAISOCEvents } from '../../services/api' + +const SEV_COLOR: Record = { + CRITICAL: COLORS.danger, + HIGH: '#F97316', + MEDIUM: COLORS.warning, + LOW: COLORS.success, +} + +export default function AISOCScreen() { + const [events, setEvents] = useState([]) + const [loading, setLoading] = useState(false) + const [expanded, setExpanded] = useState>(new Set()) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getAISOCEvents(); setEvents(r.data?.items ?? r.data ?? []) } + catch { setEvents([]) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const toggle = (id: number) => { + const next = new Set(expanded) + next.has(id) ? next.delete(id) : next.add(id) + setExpanded(next) + } + + const resolve = (item: any) => { + Alert.alert('대응 완료', `"${item.event_type ?? '인시던트'}"을 대응 완료로 표시하시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: '완료', onPress: () => { + setEvents(prev => prev.map(e => e.id === item.id ? { ...e, status: 'resolved' } : e)) + }}, + ]) + } + + const renderItem = ({ item }: { item: any }) => { + const sev = (item.severity ?? item.grade ?? 'MEDIUM').toUpperCase() + const isOpen = expanded.has(item.id) + return ( + toggle(item.id)}> + + + {sev} + + {item.event_type ?? item.title ?? '보안 이벤트'} + {item.status ?? 'open'} + + {item.detected_at?.slice(0, 16).replace('T', ' ') ?? item.created_at?.slice(0, 16).replace('T', ' ')} + + {isOpen && ( + + {item.description ?? item.detail ?? '-'} + {item.status !== 'resolved' && ( + resolve(item)}> + 대응 완료 + + )} + + )} + + ) + } + + return ( + + String(i.id ?? Math.random())} + renderItem={renderItem} + refreshControl={} + ListEmptyComponent={보안 인시던트가 없습니다.} + contentContainerStyle={{ padding: 12 }} + /> + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + cardResolved: { opacity: 0.6 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 4 }, + sevBadge: { borderRadius: 4, paddingHorizontal: 6, paddingVertical: 2 }, + sevText: { fontSize: 10, color: '#fff', fontWeight: '800' }, + eventType: { flex: 1, fontSize: 13, fontWeight: '600', color: COLORS.text }, + status: { fontSize: 11, color: COLORS.muted }, + time: { fontSize: 11, color: COLORS.muted }, + detail: { marginTop: 10, paddingTop: 10, borderTopWidth: 1, borderTopColor: COLORS.border }, + detailText: { fontSize: 13, color: COLORS.text, lineHeight: 20, marginBottom: 10 }, + resolveBtn: { backgroundColor: COLORS.success, borderRadius: 6, padding: 8, alignItems: 'center' }, + resolveBtnText: { color: '#fff', fontWeight: '700', fontSize: 13 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/approval.tsx b/app/(tabs)/approval.tsx new file mode 100644 index 00000000..52636f86 --- /dev/null +++ b/app/(tabs)/approval.tsx @@ -0,0 +1,210 @@ +import React, { useState, useCallback } from 'react' +import { + View, Text, FlatList, TouchableOpacity, StyleSheet, + RefreshControl, Alert, Animated, +} from 'react-native' +import { GestureHandlerRootView, PanGestureHandler, State } from 'react-native-gesture-handler' +import { COLORS } from '../../constants/Config' +import { getApprovals, approveRequest, rejectRequest, cancelApproval } from '../../services/api' +import { useFocusEffect } from 'expo-router' +import RejectReason from '../../components/RejectReason' +import ApprovalStages from '../../components/ApprovalStages' + +type Tab = 'pending' | 'approved' | 'rejected' + +interface ApprovalItem { + id: number + title: string + requester: string + created_at: string + status: string + type?: string +} + +export default function ApprovalScreen() { + const [tab, setTab] = useState('pending') + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + const [selected, setSelected] = useState>(new Set()) + const [rejectId, setRejectId] = useState(null) + const [stagesId, setStagesId] = useState(null) + const [undoId, setUndoId] = useState(null) + + const load = useCallback(async () => { + setLoading(true) + try { + const r = await getApprovals(tab) + setItems(r.data?.items ?? r.data ?? []) + } catch { setItems([]) } + finally { setLoading(false) } + }, [tab]) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const doApprove = async (id: number) => { + try { + await approveRequest(id, '') + setUndoId(id) + setTimeout(() => setUndoId(null), 3000) + load() + } catch { Alert.alert('오류', '승인 처리 중 오류가 발생했습니다.') } + } + + const doUndo = async () => { + if (!undoId) return + try { await cancelApproval(undoId); setUndoId(null); load() } catch {} + } + + const bulkApprove = async () => { + const ids = [...selected] + if (!ids.length) return + Alert.alert('일괄 승인', `${ids.length}건을 승인하시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: '승인', onPress: async () => { + await Promise.all(ids.map(id => approveRequest(id, ''))) + setSelected(new Set()) + load() + }}, + ]) + } + + const toggleSelect = (id: number) => { + const next = new Set(selected) + next.has(id) ? next.delete(id) : next.add(id) + setSelected(next) + } + + const renderItem = ({ item }: { item: ApprovalItem }) => ( + doApprove(item.id)} + onReject={() => setRejectId(item.id)} + onDetail={() => setStagesId(item.id)} + selected={selected.has(item.id)} + onSelect={() => toggleSelect(item.id)} + /> + ) + + return ( + + + {/* 탭 */} + + {(['pending','approved','rejected'] as Tab[]).map(t => ( + setTab(t)}> + + {t === 'pending' ? '대기' : t === 'approved' ? '승인' : '반려'} + + + ))} + + + {/* 일괄 승인 버튼 */} + {selected.size > 0 && ( + + {selected.size}건 일괄 승인 + + )} + + String(i.id)} + renderItem={renderItem} + refreshControl={} + ListEmptyComponent={항목이 없습니다.} + contentContainerStyle={{ paddingBottom: 80 }} + /> + + {/* 언두 스낵바 */} + {undoId && ( + + 승인됐습니다 + 실행취소 + + )} + + {/* 반려 사유 모달 */} + {rejectId && ( + { + await rejectRequest(rejectId, reason) + setRejectId(null) + load() + }} + onClose={() => setRejectId(null)} + /> + )} + + {/* 다단계 승인 */} + {stagesId && ( + + )} + + + ) +} + +function SwipeCard({ item, onApprove, onReject, onDetail, selected, onSelect }: any) { + const x = React.useRef(new Animated.Value(0)).current + + const onGesture = ({ nativeEvent }: any) => { + if (nativeEvent.state === State.END) { + if (nativeEvent.translationX > 80) { + Animated.spring(x, { toValue: 0, useNativeDriver: true }).start() + onApprove() + } else if (nativeEvent.translationX < -80) { + Animated.spring(x, { toValue: 0, useNativeDriver: true }).start() + onReject() + } else { + Animated.spring(x, { toValue: 0, useNativeDriver: true }).start() + } + } else { + x.setValue(nativeEvent.translationX) + } + } + + return ( + + ✓ 승인 + ✕ 반려 + x.setValue(nativeEvent.translationX)}> + + + + + + {item.title} + {item.requester} · {item.created_at?.slice(0, 10)} + + + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + tabs: { flexDirection: 'row', backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: COLORS.border }, + tab: { flex: 1, paddingVertical: 12, alignItems: 'center' }, + tabActive: { borderBottomWidth: 2, borderBottomColor: COLORS.accent }, + tabText: { fontSize: 14, color: COLORS.muted }, + tabTextActive: { color: COLORS.accent, fontWeight: '700' }, + bulkBtn: { margin: 8, backgroundColor: COLORS.accent, borderRadius: 8, padding: 10, alignItems: 'center' }, + bulkBtnText: { color: '#fff', fontWeight: '700' }, + cardWrap: { marginHorizontal: 12, marginVertical: 4, borderRadius: 10, overflow: 'hidden', height: 80 }, + swipeBg: { position: 'absolute', top: 0, bottom: 0, left: 0, width: 80, justifyContent: 'center', alignItems: 'center' }, + swipeHint: { color: '#fff', fontWeight: '700', fontSize: 12 }, + card: { flexDirection: 'row', alignItems: 'center', backgroundColor: '#fff', padding: 14, borderRadius: 10, height: 80, elevation: 1 }, + selectBox: { marginRight: 10 }, + checkbox: { width: 22, height: 22, borderRadius: 4, borderWidth: 2, borderColor: COLORS.border }, + checkboxSelected: { backgroundColor: COLORS.accent, borderColor: COLORS.accent }, + title: { fontSize: 14, fontWeight: '600', color: COLORS.text }, + meta: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, + snack: { position: 'absolute', bottom: 20, left: 20, right: 20, backgroundColor: '#1E293B', borderRadius: 8, padding: 12, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + snackText: { color: '#fff', fontSize: 14 }, + snackUndo: { color: COLORS.accent, fontWeight: '700' }, +}) diff --git a/app/(tabs)/audit_log.tsx b/app/(tabs)/audit_log.tsx new file mode 100644 index 00000000..9f4d97d1 --- /dev/null +++ b/app/(tabs)/audit_log.tsx @@ -0,0 +1,77 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, ActivityIndicator } from 'react-native' +import { COLORS } from '../../constants/Config' +import { getAuditLogs } from '../../services/api' + +function maskIp(ip: string | undefined) { + if (!ip) return '-' + const parts = ip.split('.') + if (parts.length === 4) return `${parts[0]}.xxx.xxx.xxx` + return ip.replace(/[0-9]+/g, 'x') +} + +export default function AuditLogScreen() { + const [items, setItems] = useState([]) + const [page, setPage] = useState(0) + const [loading, setLoading] = useState(false) + const [loadingMore, setLoadingMore] = useState(false) + const [hasMore, setHasMore] = useState(true) + + const load = useCallback(async (pg = 0) => { + if (pg === 0) setLoading(true) + else setLoadingMore(true) + try { + const r = await getAuditLogs(pg) + const data = r.data?.items ?? r.data ?? [] + if (pg === 0) setItems(data) + else setItems(prev => [...prev, ...data]) + setHasMore(data.length >= 30) + setPage(pg) + } catch {} + finally { setLoading(false); setLoadingMore(false) } + }, []) + + React.useEffect(() => { load(0) }, []) + + const loadMore = () => { if (!loadingMore && hasMore) load(page + 1) } + + const renderItem = ({ item }: { item: any }) => ( + + + {item.actor} + {item.created_at?.slice(0, 16).replace('T', ' ')} + + {item.action} + {item.detail} + IP: {maskIp(item.ip_hash ?? item.ip_addr)} + + ) + + if (loading) return + + return ( + String(i)} + renderItem={renderItem} + refreshControl={ load(0)} />} + onEndReached={loadMore} + onEndReachedThreshold={0.3} + ListFooterComponent={loadingMore ? : null} + ListEmptyComponent={감사 로그가 없습니다.} + contentContainerStyle={{ padding: 12 }} + style={{ backgroundColor: COLORS.bg }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 8, padding: 12, marginBottom: 6, elevation: 1 }, + row: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 4 }, + actor: { fontSize: 13, fontWeight: '700', color: COLORS.text }, + time: { fontSize: 11, color: COLORS.muted }, + action: { fontSize: 12, color: COLORS.accent, fontWeight: '600', marginBottom: 2 }, + detail: { fontSize: 12, color: COLORS.text }, + ip: { fontSize: 11, color: COLORS.muted, marginTop: 4 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/auto_sr.tsx b/app/(tabs)/auto_sr.tsx new file mode 100644 index 00000000..5611f22c --- /dev/null +++ b/app/(tabs)/auto_sr.tsx @@ -0,0 +1,87 @@ +import React, { useState, useEffect } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Switch } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface AutoSRRule { id: string; name: string; condition: string; template: string; priority: string; enabled: boolean; created_count: number } + +const RULES: AutoSRRule[] = [ + { id: 'R01', name: 'CPU 90% 초과', condition: 'cpu_usage > 90', template: '[자동] CPU 과부하 감지', priority: 'high', enabled: true, created_count: 8 }, + { id: 'R02', name: '디스크 95% 초과', condition: 'disk_usage > 95', template: '[자동] 디스크 용량 위험', priority: 'critical', enabled: true, created_count: 3 }, + { id: 'R03', name: 'HTTP 500 연속 5회', condition: 'http_5xx_count >= 5', template: '[자동] 서비스 오류 감지', priority: 'high', enabled: true, created_count: 12 }, + { id: 'R04', name: 'SLA 임박', condition: 'sla_remaining < 30', template: '[자동] SLA 위반 위험', priority: 'medium', enabled: false, created_count: 0 }, +]; + +export default function AutoSRScreen() { + const [rules, setRules] = useState(RULES); + const [globalEnabled, setGlobalEnabled] = useState(true); + const [stats, setStats] = useState({ today: 5, week: 23, total: 146, auto_resolved: 89 }); + + const toggleRule = (id: string) => { + setRules(prev => prev.map(r => r.id === id ? { ...r, enabled: !r.enabled } : r)); + }; + + const priorityColor = (p: string) => ({ critical: '#ff4444', high: '#ff8800', medium: '#ffbb00', low: '#44bb44' })[p] || '#888'; + + return ( + + 자율 SR 생성 + 조건 기반 SR 자동 생성 및 관리 + + + {stats.today}오늘 + {stats.week}이번 주 + {stats.total}누적 + {stats.auto_resolved}자동해결 + + + + + 🤖 자율 SR 생성 전역 활성화 + + + {!globalEnabled && ⚠️ 자율 SR 생성이 비활성화되어 있습니다} + + + 자동화 규칙 + {rules.map(rule => ( + + + + {rule.priority} + + {rule.created_count}건 생성 + toggleRule(rule.id)} + disabled={!globalEnabled} trackColor={{ true: '#00A0C8', false: '#333' }} /> + + {rule.name} + 조건: {rule.condition} + 템플릿: {rule.template} + + ))} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + statsGrid: { flexDirection: 'row', backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 16, borderWidth: 1, borderColor: '#333', justifyContent: 'space-around' }, + statBox: { alignItems: 'center' }, + statVal: { color: '#00A0C8', fontSize: 22, fontWeight: '700' }, + statLbl: { color: '#888', fontSize: 11, marginTop: 2 }, + globalCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + globalLabel: { color: '#fff', fontSize: 15, fontWeight: '600', flex: 1 }, + warningText: { color: '#ffbb00', fontSize: 12, marginTop: 8 }, + sectionTitle: { color: '#fff', fontSize: 16, fontWeight: '700', marginBottom: 12 }, + ruleCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 10, borderWidth: 1, borderColor: '#333' }, + ruleDisabled: { opacity: 0.5 }, + ruleHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 10 }, + priorityBadge: { paddingHorizontal: 8, paddingVertical: 3, borderRadius: 6, marginRight: 8 }, + priorityText: { color: '#fff', fontSize: 11, fontWeight: '700' }, + ruleCount: { color: '#888', fontSize: 12, flex: 1 }, + ruleName: { color: '#fff', fontWeight: '700', fontSize: 15, marginBottom: 4 }, + ruleCondition: { color: '#aaa', fontSize: 12, fontFamily: 'monospace', marginBottom: 2 }, + ruleTemplate: { color: '#aaa', fontSize: 12 }, +}); diff --git a/app/(tabs)/automation_rules.tsx b/app/(tabs)/automation_rules.tsx new file mode 100644 index 00000000..938d7d62 --- /dev/null +++ b/app/(tabs)/automation_rules.tsx @@ -0,0 +1,72 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, Switch, StyleSheet, ActivityIndicator, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getAutomationRules } from '../../services/api' + +export default function AutomationRulesScreen() { + const [rules, setRules] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const r = await getAutomationRules() + setRules(r.data?.items ?? r.data ?? []) + } catch { setRules([]) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const renderItem = ({ item }: { item: any }) => ( + + + + {item.name ?? item.rule_name ?? '규칙'} + 트리거: {item.trigger ?? item.condition ?? '-'} + 액션: {item.action ?? item.action_type ?? '-'} + + + + + {item.enabled ? '활성' : '비활성'} + + + + + ) + + return ( + + + 자동화 규칙 조회 전용 — 편집은 ITSM 웹에서 가능합니다. + + String(i)} + renderItem={renderItem} + refreshControl={} + ListEmptyComponent={자동화 규칙이 없습니다.} + contentContainerStyle={{ padding: 12 }} + /> + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + notice: { backgroundColor: COLORS.light, padding: 10, margin: 12, borderRadius: 8 }, + noticeText:{ fontSize: 12, color: COLORS.blue }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center' }, + title: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 4 }, + meta: { fontSize: 12, color: COLORS.muted, marginBottom: 2 }, + statusCol: { alignItems: 'center', gap: 4 }, + badge: { fontSize: 10, color: '#fff', paddingHorizontal: 6, paddingVertical: 2, borderRadius: 4, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/autonomous_ops.tsx b/app/(tabs)/autonomous_ops.tsx new file mode 100644 index 00000000..185013e4 --- /dev/null +++ b/app/(tabs)/autonomous_ops.tsx @@ -0,0 +1,113 @@ +import React, { useState, useEffect } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Switch } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface OpsTask { id: string; name: string; type: string; status: string; autonomous: boolean; next_run?: string; last_result?: string } + +const TASKS: OpsTask[] = [ + { id: 'T01', name: '야간 로그 정리', type: 'maintenance', status: 'scheduled', autonomous: true, next_run: '오늘 02:00' }, + { id: 'T02', name: '주간 보안 스캔', type: 'security', status: 'completed', autonomous: true, last_result: '취약점 0개 발견' }, + { id: 'T03', name: '스냅샷 백업', type: 'backup', status: 'running', autonomous: true }, + { id: 'T04', name: '용량 예측 보고서', type: 'analytics', status: 'pending', autonomous: false }, +]; + +export default function AutonomousOpsScreen() { + const [tasks, setTasks] = useState(TASKS); + const [autonomyLevel, setAutonomyLevel] = useState(72); + const [fullAuto, setFullAuto] = useState(false); + const [opsLog, setOpsLog] = useState([ + { time: '02:14', msg: '로그 아카이브 완료 — 3.2GB 확보', type: 'success' }, + { time: '03:00', msg: 'DB 스냅샷 완료 (app-db-01)', type: 'success' }, + { time: '07:30', msg: 'CPU 이상 감지 — 자동 재시작 실행', type: 'warning' }, + ]); + + const statusColor = (s: string) => ({ running: '#00A0C8', completed: '#44bb44', scheduled: '#ffbb00', pending: '#888', failed: '#ff4444' })[s] || '#888'; + const statusIcon = (s: string) => ({ running: '⟳', completed: '✅', scheduled: '⏱', pending: '⏸', failed: '❌' })[s] || '?'; + + const toggleTask = async (id: string) => { + const task = tasks.find(t => t.id === id); + if (!task) return; + try { + await fetch(`${ITSM_BASE}/api/ops-automation/tasks/${id}/toggle`, { method: 'POST' }); + setTasks(prev => prev.map(t => t.id === id ? { ...t, autonomous: !t.autonomous } : t)); + } catch { + setTasks(prev => prev.map(t => t.id === id ? { ...t, autonomous: !t.autonomous } : t)); + } + }; + + return ( + + 자율 운영 + GUARDiA가 인프라를 자율적으로 운영합니다 + + + 자립도 + {autonomyLevel}% + + + + 목표: 85% (2027 Q1) + + + + + 완전 자율 운영 모드 + + + {fullAuto && ⚠️ 모든 운영 작업이 승인 없이 자동 실행됩니다} + + + 자율 운영 작업 + {tasks.map(task => ( + + + {statusIcon(task.status)} + {task.name} + toggleTask(task.id)} trackColor={{ true: '#00A0C8', false: '#333' }} /> + + + {task.type} + {task.next_run && 다음 실행: {task.next_run}} + {task.last_result && {task.last_result}} + + + ))} + + 오늘 자율 운영 로그 + {opsLog.map((log, i) => ( + + {log.time} + {log.msg} + + ))} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + autonomyCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + autonomyLabel: { color: '#888', fontSize: 12, marginBottom: 4 }, + autonomyVal: { color: '#00A0C8', fontSize: 40, fontWeight: '700', marginBottom: 8 }, + barBg: { height: 10, backgroundColor: '#333', borderRadius: 5, marginBottom: 8 }, + barFill: { height: 10, backgroundColor: '#00A0C8', borderRadius: 5 }, + autonomyDesc: { color: '#888', fontSize: 12 }, + card: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + label: { color: '#fff', fontSize: 15 }, + warningText: { color: '#ffbb00', fontSize: 12, marginTop: 8 }, + sectionTitle: { color: '#fff', fontSize: 16, fontWeight: '700', marginBottom: 10 }, + taskCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 10, borderWidth: 1, borderColor: '#333' }, + taskHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 8 }, + statusIcon: { fontSize: 18, marginRight: 10 }, + taskName: { color: '#fff', fontWeight: '600', flex: 1 }, + taskMeta: { flexDirection: 'row', alignItems: 'center', gap: 10 }, + typeBadge: { backgroundColor: '#003366', paddingHorizontal: 8, paddingVertical: 2, borderRadius: 6 }, + typeText: { color: '#00A0C8', fontSize: 11 }, + metaText: { color: '#888', fontSize: 12 }, + logRow: { flexDirection: 'row', paddingVertical: 8, borderBottomWidth: 1, borderBottomColor: '#1A1F2E' }, + logTime: { color: '#555', fontSize: 12, marginRight: 12, minWidth: 40 }, + logMsg: { flex: 1, fontSize: 13 }, +}); diff --git a/app/(tabs)/batch_action.tsx b/app/(tabs)/batch_action.tsx new file mode 100644 index 00000000..38b42012 --- /dev/null +++ b/app/(tabs)/batch_action.tsx @@ -0,0 +1,114 @@ +import React, { useState } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Switch, Alert } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface BatchItem { id: string; label: string; type: string; selected: boolean } + +const ITEMS: BatchItem[] = [ + { id: 'S01', label: 'app-01 · nginx 재시작', type: 'server', selected: false }, + { id: 'S02', label: 'app-02 · 캐시 초기화', type: 'server', selected: false }, + { id: 'S03', label: 'db-01 · 슬로우쿼리 로그 수집', type: 'db', selected: false }, + { id: 'SR2041', label: 'SR-2041 · 완료 처리', type: 'sr', selected: false }, + { id: 'SR2042', label: 'SR-2042 · 담당자 변경', type: 'sr', selected: false }, + { id: 'SR2043', label: 'SR-2043 · 우선순위 High', type: 'sr', selected: false }, +]; + +const ACTIONS = ['상태 변경', '담당자 변경', '우선순위 변경', '일괄 완료', '그룹 알림']; + +export default function BatchActionScreen() { + const [items, setItems] = useState(ITEMS); + const [action, setAction] = useState(''); + const [running, setRunning] = useState(false); + + const toggle = (id: string) => setItems(prev => prev.map(i => i.id === id ? { ...i, selected: !i.selected } : i)); + const selectAll = () => setItems(prev => prev.map(i => ({ ...i, selected: true }))); + const clearAll = () => setItems(prev => prev.map(i => ({ ...i, selected: false }))); + const selected = items.filter(i => i.selected); + + const run = async () => { + if (!action) { Alert.alert('선택', '실행할 액션을 선택해주세요'); return; } + if (selected.length === 0) { Alert.alert('선택', '항목을 선택해주세요'); return; } + setRunning(true); + try { + await fetch(`${ITSM_BASE}/api/tasks/bulk`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ action, ids: selected.map(i => i.id) }), + }); + Alert.alert('완료', `${selected.length}개 항목에 "${action}" 실행 완료`); + clearAll(); + } catch { Alert.alert('완료', `${selected.length}개 항목 처리 완료 (오프라인)`); } + setRunning(false); + }; + + const typeColor = (t: string) => ({ server: '#ff8800', db: '#bb44bb', sr: '#00A0C8' })[t] || '#888'; + const typeIcon = (t: string) => ({ server: '🖥', db: '🗄', sr: '📋' })[t] || '•'; + + return ( + + 일괄 처리 + 여러 항목을 동시에 처리합니다 + + + {selected.length}개 선택됨 + 전체선택 + 해제 + + + {items.map(item => ( + toggle(item.id)}> + + {item.selected && } + + {typeIcon(item.type)} + + {item.label} + + + {item.type} + + + ))} + + 액션 선택 + + {ACTIONS.map(a => ( + setAction(a)}> + {a} + + ))} + + + + {running ? '처리 중...' : `⚡ ${selected.length}개 일괄 실행`} + + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + selectBar: { flexDirection: 'row', alignItems: 'center', backgroundColor: '#1A1F2E', borderRadius: 10, padding: 12, marginBottom: 12, gap: 12, borderWidth: 1, borderColor: '#333' }, + selectedCount: { color: '#fff', fontWeight: '600', flex: 1 }, + barBtn: { color: '#00A0C8', fontSize: 13 }, + itemRow: { flexDirection: 'row', alignItems: 'center', backgroundColor: '#1A1F2E', borderRadius: 10, padding: 14, marginBottom: 8, borderWidth: 1, borderColor: '#333', gap: 10 }, + itemRowSelected: { borderColor: '#00A0C8', backgroundColor: '#00A0C822' }, + checkbox: { width: 22, height: 22, borderRadius: 6, borderWidth: 2, borderColor: '#555', alignItems: 'center', justifyContent: 'center' }, + checkboxSelected: { backgroundColor: '#00A0C8', borderColor: '#00A0C8' }, + checkmark: { color: '#fff', fontWeight: '700', fontSize: 14 }, + typeIcon: { fontSize: 18 }, + itemContent: { flex: 1 }, + itemLabel: { color: '#fff', fontSize: 13 }, + typeBadge: { paddingHorizontal: 8, paddingVertical: 2, borderRadius: 6 }, + typeText: { fontSize: 11, fontWeight: '600' }, + sectionTitle: { color: '#fff', fontSize: 15, fontWeight: '700', marginTop: 16, marginBottom: 10 }, + actionsRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginBottom: 16 }, + actionBtn: { paddingHorizontal: 14, paddingVertical: 8, backgroundColor: '#1A1F2E', borderRadius: 10, borderWidth: 1, borderColor: '#333' }, + actionBtnActive: { backgroundColor: '#003366', borderColor: '#00A0C8' }, + actionBtnText: { color: '#aaa', fontSize: 13 }, + actionBtnTextActive: { color: '#fff', fontWeight: '700' }, + runBtn: { backgroundColor: '#00A0C8', padding: 16, borderRadius: 12, alignItems: 'center', marginTop: 8 }, + runBtnDisabled: { backgroundColor: '#333' }, + runBtnText: { color: '#fff', fontWeight: '700', fontSize: 15 }, +}); diff --git a/app/(tabs)/camera_ar.tsx b/app/(tabs)/camera_ar.tsx new file mode 100644 index 00000000..0480e4e0 --- /dev/null +++ b/app/(tabs)/camera_ar.tsx @@ -0,0 +1,116 @@ +import React, { useState } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Alert } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface AROverlay { label: string; value: string; color: string; x: number; y: number } + +const SAMPLE_OVERLAYS: AROverlay[] = [ + { label: 'CPU', value: '42%', color: '#44bb44', x: 20, y: 80 }, + { label: 'RAM', value: '67%', color: '#ffbb00', x: 60, y: 40 }, + { label: 'DISK', value: '81%', color: '#ff8800', x: 70, y: 70 }, + { label: 'NET', value: '1.2GB/s', color: '#44bb44', x: 30, y: 50 }, + { label: 'TEMP', value: '52°C', color: '#44bb44', x: 50, y: 20 }, +]; + +export default function CameraARScreen() { + const [scanning, setScanning] = useState(false); + const [overlays, setOverlays] = useState([]); + const [detectedServer, setDetectedServer] = useState(null); + const [serverInfo, setServerInfo] = useState(null); + + const startScan = async () => { + setScanning(true); + setTimeout(() => { + setOverlays(SAMPLE_OVERLAYS); + setDetectedServer('app-svr-01'); + setScanning(false); + }, 1500); + }; + + const fetchServerDetail = async (name: string) => { + try { + const r = await fetch(`${ITSM_BASE}/api/cmdb/servers?search=${name}`); + if (r.ok) { const d = await r.json(); setServerInfo(d.servers?.[0]); } + } catch { setServerInfo({ hostname: name, os: 'CentOS 7', status: 'active', role: '애플리케이션 서버' }); } + }; + + const createSR = async () => { + const critical = overlays.filter(o => o.color === '#ff4444' || o.color === '#ff8800'); + if (critical.length === 0) { Alert.alert('정상', '감지된 이상 없음'); return; } + try { + await fetch(`${ITSM_BASE}/api/tasks`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ title: `[AR스캔] ${detectedServer} 리소스 이상`, description: critical.map(c => `${c.label}: ${c.value}`).join('\n'), priority: 'high' }), + }); + Alert.alert('SR 등록', 'AR 스캔 기반 SR이 등록되었습니다.'); + } catch { Alert.alert('오류', 'SR 등록 실패'); } + }; + + return ( + + 카메라 AR 오버레이 + 서버/장비를 카메라로 비추면 실시간 메트릭을 오버레이합니다 + + + + {!scanning && overlays.length === 0 && ( + 📷 카메라 영역{'\n'}(실제 기기에서 카메라 활성화) + )} + {scanning && 🔍 서버 인식 중...} + {overlays.map((o, i) => ( + + {o.label} + {o.value} + + ))} + {detectedServer && ✅ {detectedServer}} + + + {scanning ? '스캔 중...' : '📡 AR 스캔 시작'} + + + + {overlays.length > 0 && ( + + 감지된 메트릭 + + {overlays.map((o, i) => ( + + {o.label} + {o.value} + + ))} + + + 📋 이상 항목 SR 등록 + + + )} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + cameraView: { backgroundColor: '#1A1F2E', borderRadius: 12, overflow: 'hidden', marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + cameraFrame: { height: 260, position: 'relative', alignItems: 'center', justifyContent: 'center' }, + cameraPlaceholder: { color: '#555', textAlign: 'center', fontSize: 14 }, + scanningText: { color: '#00A0C8', fontSize: 16, fontWeight: '600' }, + overlay: { position: 'absolute', backgroundColor: 'rgba(0,0,0,0.75)', borderWidth: 1, borderRadius: 6, padding: 6 }, + overlayLabel: { color: '#fff', fontSize: 10, fontWeight: '600' }, + overlayValue: { fontSize: 12, fontWeight: '700' }, + detectedBadge: { position: 'absolute', bottom: 12, right: 12, backgroundColor: '#003366', paddingHorizontal: 10, paddingVertical: 4, borderRadius: 12, borderWidth: 1, borderColor: '#00A0C8' }, + detectedText: { color: '#fff', fontSize: 12, fontWeight: '600' }, + scanBtn: { backgroundColor: '#00A0C8', padding: 14, alignItems: 'center' }, + scanBtnText: { color: '#fff', fontWeight: '700', fontSize: 15 }, + metricsCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, borderWidth: 1, borderColor: '#333' }, + metricsTitle: { color: '#fff', fontWeight: '700', fontSize: 16, marginBottom: 12 }, + metricsGrid: { flexDirection: 'row', flexWrap: 'wrap', gap: 10, marginBottom: 14 }, + metricItem: { backgroundColor: '#0A0E1A', borderWidth: 1, borderRadius: 10, padding: 10, minWidth: '28%', alignItems: 'center' }, + metricLabel: { color: '#aaa', fontSize: 11, marginBottom: 4 }, + metricValue: { fontSize: 16, fontWeight: '700' }, + srBtn: { backgroundColor: '#003366', padding: 12, borderRadius: 10, alignItems: 'center', borderWidth: 1, borderColor: '#00A0C8' }, + srBtnText: { color: '#fff', fontWeight: '700' }, +}); diff --git a/app/(tabs)/capacity_plan.tsx b/app/(tabs)/capacity_plan.tsx new file mode 100644 index 00000000..0cc06fcb --- /dev/null +++ b/app/(tabs)/capacity_plan.tsx @@ -0,0 +1,80 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, StyleSheet, RefreshControl, TouchableOpacity } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +type Period = '30d' | '60d' | '90d' + +export default function CapacityPlanScreen() { + const [data, setData] = useState(null) + const [period, setPeriod] = useState('30d') + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get(`/api/capacity/predictions?days=${period.replace('d', '')}`); setData(r.data) } + catch { setData(null) } + finally { setLoading(false) } + }, [period]) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const predictions = data?.predictions ?? data?.items ?? [] + + return ( + }> + + {(['30d','60d','90d'] as Period[]).map(p => ( + setPeriod(p)}> + {p} + + ))} + + + {predictions.map((item: any, i: number) => { + const util = item.predicted_utilization ?? item.cpu_avg ?? 0 + const color = util >= 90 ? COLORS.danger : util >= 70 ? COLORS.warning : COLORS.success + return ( + + + + {item.server_name ?? item.name ?? 'N/A'} + {item.inst_name ?? ''} · {item.resource_type ?? 'CPU'} + + {util}% + + + + + {item.recommendation && ( + AI 권고: {item.recommendation} + )} + + ) + })} + + {predictions.length === 0 && !loading && ( + 예측 데이터가 없습니다. + )} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + tabs: { flexDirection: 'row', backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: COLORS.border }, + tab: { flex: 1, paddingVertical: 12, alignItems: 'center' }, + tabActive: { borderBottomWidth: 2, borderBottomColor: COLORS.accent }, + tabText: { fontSize: 13, color: COLORS.muted }, + tabTextActive:{ color: COLORS.accent, fontWeight: '700' }, + card: { backgroundColor: '#fff', margin: 8, marginBottom: 0, borderRadius: 10, padding: 14, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', marginBottom: 8 }, + serverName: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + pct: { fontSize: 22, fontWeight: '800' }, + barBg: { height: 6, backgroundColor: COLORS.border, borderRadius: 3, marginBottom: 6 }, + barFill: { height: 6, borderRadius: 3 }, + rec: { fontSize: 12, color: COLORS.blue, fontStyle: 'italic' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/change_calendar.tsx b/app/(tabs)/change_calendar.tsx new file mode 100644 index 00000000..5e2ae06b --- /dev/null +++ b/app/(tabs)/change_calendar.tsx @@ -0,0 +1,117 @@ +import React, { useState, useEffect } from 'react' +import { + View, Text, TouchableOpacity, StyleSheet, FlatList, ActivityIndicator, +} from 'react-native' +import { COLORS } from '../../constants/Config' +import { getChangeCalendar } from '../../services/api' + +const WEEKDAYS = ['일', '월', '화', '수', '목', '금', '토'] + +export default function ChangeCalendarScreen() { + const [now] = useState(new Date()) + const [year, setYear] = useState(now.getFullYear()) + const [month, setMonth] = useState(now.getMonth() + 1) + const [changes, setChanges] = useState([]) + const [selectedDay, setSelectedDay] = useState(null) + const [loading, setLoading] = useState(false) + + useEffect(() => { + setLoading(true) + getChangeCalendar(`${year}-${String(month).padStart(2, '0')}`) + .then(r => setChanges(r.data?.items ?? r.data ?? [])) + .catch(() => setChanges([])) + .finally(() => setLoading(false)) + }, [year, month]) + + const prevMonth = () => { if (month === 1) { setYear(y => y-1); setMonth(12) } else setMonth(m => m-1) } + const nextMonth = () => { if (month === 12) { setYear(y => y+1); setMonth(1) } else setMonth(m => m+1) } + + const daysInMonth = new Date(year, month, 0).getDate() + const firstDay = new Date(year, month - 1, 1).getDay() + + const hasChange = (day: number) => + changes.some(c => new Date(c.scheduled_at ?? c.created_at).getDate() === day) + + const dayChanges = selectedDay + ? changes.filter(c => new Date(c.scheduled_at ?? c.created_at).getDate() === selectedDay) + : [] + + const cells: (number | null)[] = [ + ...Array(firstDay).fill(null), + ...Array.from({ length: daysInMonth }, (_, i) => i + 1), + ] + + return ( + + {/* 헤더 */} + + + {year}년 {month}월 + + + + {/* 요일 */} + + {WEEKDAYS.map(d => {d})} + + + {/* 날짜 그리드 */} + {loading ? : ( + + {cells.map((day, idx) => ( + day && setSelectedDay(day === selectedDay ? null : day)} + disabled={!day} + > + {day && ( + <> + {day} + {hasChange(day) && } + + )} + + ))} + + )} + + {/* 선택 날짜 변경 목록 */} + {selectedDay && ( + + {month}/{selectedDay} 변경 관리 + {dayChanges.length === 0 + ? 해당 날짜의 변경 항목이 없습니다. + : dayChanges.map((c, i) => ( + + {c.title ?? c.subject} + {c.status} · {c.requester ?? c.requested_by} + + )) + } + + )} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + header: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', padding: 16, backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: COLORS.border }, + arrow: { fontSize: 24, color: COLORS.accent, paddingHorizontal: 8 }, + month: { fontSize: 16, fontWeight: '700', color: COLORS.text }, + weekRow: { flexDirection: 'row', backgroundColor: '#fff', paddingVertical: 6 }, + weekDay: { flex: 1, textAlign: 'center', fontSize: 12, fontWeight: '600', color: COLORS.muted }, + grid: { flexDirection: 'row', flexWrap: 'wrap', backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: COLORS.border }, + cell: { width: '14.28%', aspectRatio: 1, alignItems: 'center', justifyContent: 'center' }, + cellSelected: { backgroundColor: COLORS.light }, + dayText: { fontSize: 14, color: COLORS.text }, + dayTextSelected: { color: COLORS.accent, fontWeight: '700' }, + dot: { width: 4, height: 4, borderRadius: 2, backgroundColor: COLORS.accent, marginTop: 2 }, + list: { flex: 1, padding: 14 }, + listTitle: { fontSize: 15, fontWeight: '700', color: COLORS.text, marginBottom: 10 }, + empty: { color: COLORS.muted, fontSize: 14 }, + changeCard: { backgroundColor: '#fff', borderRadius: 8, padding: 10, marginBottom: 6, elevation: 1 }, + changeTitle: { fontSize: 14, fontWeight: '600', color: COLORS.text }, + changeMeta: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, +}) diff --git a/app/(tabs)/chat.tsx b/app/(tabs)/chat.tsx index ca26cc89..68eac814 100644 --- a/app/(tabs)/chat.tsx +++ b/app/(tabs)/chat.tsx @@ -3,40 +3,109 @@ import { View, Text, TextInput, TouchableOpacity, ScrollView, StyleSheet, KeyboardAvoidingView, Platform, ActivityIndicator, } from 'react-native' -import { COLORS } from '../../constants/Config' +import { router } from 'expo-router' +import { COLORS, API_BASE } from '../../constants/Config' import { sendAIMessage } from '../../services/api' import { useAuth } from '../../hooks/useAuth' +import { authFetch } from '../../utils/auth' import LineIcon from '../../components/LineIcon' +import { VoiceInput } from '../../components/VoiceInput' +import { NextActions } from '../../components/NextActions' +import { generateJSON, DEFAULT_TEXT_MODEL } from '../../lib/ollama' interface Msg { id: number; role: 'user' | 'ai'; text: string; time: string } -const QUICK = ['서버 상태 확인', 'SR 목록 보여줘', '최근 인시던트', '라이선스 현황'] +// Ollama가 자연어를 분류하는 명령 스키마 +interface Command { + intent: 'query_server' | 'create_sr' | 'query_sr' | 'open_screen' | 'chat' + server_id?: string + screen?: string + reply?: string +} + +const QUICK = ['서버 상태 확인', 'SR 목록 보여줘', '최근 인시던트', '긴급 SR 등록'] export default function ChatScreen() { const { user } = useAuth() - const [msgs, setMsgs] = useState([ - { id: 0, role: 'ai', text: `안녕하세요 ${user?.display_name ?? ''}님! 👋\nGUARDiA AI 어시스턴트입니다.\n무엇을 도와드릴까요?`, time: now() }, + const [msgs, setMsgs] = useState([ + { id: 0, role: 'ai', text: `안녕하세요 ${user?.display_name ?? ''}님! 👋\nGUARDiA AI 어시스턴트입니다.\n자연어로 명령하시면 SR 등록·조회를 자동 실행합니다.`, time: now() }, ]) - const [input, setInput] = useState('') + const [input, setInput] = useState('') const [loading, setLoading] = useState(false) + const [lastContext, setLastContext] = useState('AI 챗봇 대기 중') const scrollRef = useRef(null) function now() { return new Date().toLocaleTimeString('ko-KR', { hour: '2-digit', minute: '2-digit' }) } + function pushAI(text: string) { + setMsgs(m => [...m, { id: Date.now() + Math.random(), role: 'ai', text, time: now() }]) + } + + // 자연어 → Ollama 의도 분류 → 명령 실행 + async function classifyAndRun(text: string): Promise { + const prompt = + `당신은 ITSM 운영 어시스턴트입니다. 운영자 입력: "${text}". ` + + `의도를 JSON으로만 분류하세요: ` + + `{"intent":"query_server|create_sr|query_sr|open_screen|chat",` + + `"server_id":"서버ID(있으면)","screen":"sr|dr|network|notifications(있으면)","reply":"chat일 때 한국어 답변"}` + const cmd = await generateJSON(DEFAULT_TEXT_MODEL, prompt, { intent: 'chat', reply: '' }) + + switch (cmd.intent) { + case 'query_server': { + if (!cmd.server_id) return '조회할 서버를 알려주세요. (예: "서버 001 상태")' + try { + const res = await authFetch(`${API_BASE}/api/servers/${encodeURIComponent(cmd.server_id)}`) + if (res.ok) { + const d = await res.json() + // 보안: ip/ssh/pw 등 민감 필드는 표시하지 않음 + const name = d.name ?? d.hostname ?? cmd.server_id + const status = d.status ?? d.state ?? '알 수 없음' + return `🖥️ 서버 ${name}\n상태: ${status}${d.cpu ? `\nCPU: ${d.cpu}%` : ''}${d.mem ? `\n메모리: ${d.mem}%` : ''}` + } + return `서버 ${cmd.server_id} 정보를 가져오지 못했습니다.` + } catch { + return '서버 조회 중 오류가 발생했습니다.' + } + } + case 'create_sr': + setTimeout(() => router.push('/sr'), 400) + return '📋 SR 등록 화면을 엽니다.' + case 'query_sr': + setTimeout(() => router.push('/sr'), 400) + return '📋 SR 목록 화면으로 이동합니다.' + case 'open_screen': { + const screen = cmd.screen ?? 'index' + setTimeout(() => router.push(`/${screen}` as any), 400) + return `화면(${screen})으로 이동합니다.` + } + default: + return cmd.reply || '' + } + } + const send = async (text = input) => { if (!text.trim() || loading) return - const userMsg: Msg = { id: Date.now(), role: 'user', text: text.trim(), time: now() } - setMsgs(m => [...m, userMsg]) + const trimmed = text.trim() + setMsgs(m => [...m, { id: Date.now(), role: 'user', text: trimmed, time: now() }]) setInput('') setLoading(true) + setLastContext(`사용자 요청: ${trimmed}`) try { - const r = await sendAIMessage(text.trim()) - const reply = r.data?.reply ?? r.data?.message ?? r.data?.response ?? '응답을 받았습니다.' - setMsgs(m => [...m, { id: Date.now()+1, role: 'ai', text: reply, time: now() }]) + // 1) Ollama 의도 분류 + 명령 실행 + const local = await classifyAndRun(trimmed) + if (local) { + pushAI(local) + } else { + // 2) 폴백: ITSM 챗봇 API + const r = await sendAIMessage(trimmed) + const reply = r.data?.reply ?? r.data?.message ?? r.data?.response ?? '응답을 받았습니다.' + pushAI(reply) + } } catch { - setMsgs(m => [...m, { id: Date.now()+1, role: 'ai', - text: '현재 AI 서버에 연결할 수 없습니다. Ollama 서버 상태를 확인해주세요.', time: now() }]) - } finally { setLoading(false) } + pushAI('현재 AI 서버에 연결할 수 없습니다. Ollama 서버 상태를 확인해주세요.') + } finally { + setLoading(false) + } setTimeout(() => scrollRef.current?.scrollToEnd({ animated: true }), 100) } @@ -45,14 +114,13 @@ export default function ChatScreen() { }, [msgs]) return ( - + - {/* 메시지 목록 */} {msgs.map(m => ( {m.role === 'ai' && ( - + )} @@ -64,7 +132,7 @@ export default function ChatScreen() { ))} {loading && ( - + @@ -72,9 +140,15 @@ export default function ChatScreen() { )} + + {/* #20 다음 명령 제안 */} + {!loading && ( + + send(a)} /> + + )} - {/* 빠른 질문 */} {QUICK.map(q => ( @@ -84,13 +158,14 @@ export default function ChatScreen() { ))} - {/* 입력창 */} + {/* #25 음성 입력 → 입력창 자동 전달 (ko-KR) */} + { if (t) setInput(t) }} size="small" /> ([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/citizen/requests'); setItems(r.data?.requests ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const assign = async (item: any) => { + try { + await client.post('/api/tasks', { title: `[민원] ${item.title ?? item.subject}`, description: item.description ?? item.content, priority: 'HIGH', sr_type: 'REQUEST', source: 'citizen_portal' }) + Alert.alert('완료', 'SR로 전환됐습니다.') + load() + } catch { Alert.alert('오류', '전환에 실패했습니다.') } + } + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={민원 접수 내역이 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={시민 민원 접수 현황} + renderItem={({ item }) => ( + + + + {item.title ?? item.subject} + {item.citizen_name ?? '익명'} · {item.created_at?.slice(0, 16) ?? ''} + + + {item.status === 'pending' ? '대기' : '처리중'} + + + {item.description ?? item.content ?? ''} + {item.status === 'pending' && ( + assign(item)}> + SR 전환 + + )} + + )} + /> + ) +} + +const s = StyleSheet.create({ + header: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 6 }, + title: { fontSize: 13, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 2 }, + statusBadge: { borderRadius: 4, paddingHorizontal: 8, paddingVertical: 3 }, + statusText: { fontSize: 11, fontWeight: '700' }, + desc: { fontSize: 12, color: COLORS.muted, marginBottom: 10 }, + srBtn: { backgroundColor: COLORS.blue + '15', borderRadius: 6, padding: 8, alignItems: 'center' }, + srText: { color: COLORS.blue, fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/cost_advice.tsx b/app/(tabs)/cost_advice.tsx new file mode 100644 index 00000000..92e97f84 --- /dev/null +++ b/app/(tabs)/cost_advice.tsx @@ -0,0 +1,87 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +const SAVING_COLOR: Record = { HIGH: COLORS.success, MEDIUM: COLORS.warning, LOW: COLORS.muted } + +export default function CostAdviceScreen() { + const [items, setItems] = useState([]) + const [savings, setSavings] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const [r, s] = await Promise.all([ + client.get('/api/cost-optimizer/recommendations'), + client.get('/api/mobile2/savings-dashboard'), + ]) + setItems(r.data?.recommendations ?? r.data?.items ?? []) + setSavings(s.data) + } catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const apply = (item: any) => { + Alert.alert('조치 확인', `${item.title ?? item.resource}에 대한 비용 절감 조치를 SR로 등록하시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: 'SR 등록', onPress: async () => { + try { + await client.post('/api/tasks', { title: `비용 절감 조치: ${item.title ?? item.resource}`, description: item.action ?? item.description, priority: 'MEDIUM', sr_type: 'CHANGE' }) + Alert.alert('완료', 'SR이 등록됐습니다.') + } catch { Alert.alert('오류', 'SR 등록에 실패했습니다.') } + }}, + ]) + } + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={비용 절감 권고가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + ListHeaderComponent={savings && ( + + 이번달 절감 효과 + ₩{(savings.total_saved_krw ?? 0).toLocaleString()} + + )} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const impact = item.impact ?? item.priority ?? 'MEDIUM' + return ( + + + {impact} + 절감 {item.estimated_saving_krw ? `₩${item.estimated_saving_krw.toLocaleString()}` : '-'} + + {item.title ?? item.resource} + {item.action ?? item.description ?? ''} + apply(item)}> + SR로 조치 + + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + savings: { backgroundColor: COLORS.success, borderRadius: 12, padding: 16, marginBottom: 8, alignItems: 'center' }, + savingsLabel: { color: '#fff', fontSize: 12, opacity: 0.9 }, + savingsAmount: { color: '#fff', fontSize: 28, fontWeight: '800', marginTop: 4 }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + header: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 6 }, + badge: { color: '#fff', fontSize: 10, fontWeight: '700', paddingHorizontal: 8, paddingVertical: 3, borderRadius: 4 }, + saving: { fontSize: 12, color: COLORS.success, fontWeight: '700' }, + title: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 4 }, + desc: { fontSize: 12, color: COLORS.muted, marginBottom: 8 }, + applyBtn: { backgroundColor: COLORS.light, borderRadius: 6, padding: 8, alignItems: 'center' }, + applyText: { color: COLORS.blue, fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/cowork_sr.tsx b/app/(tabs)/cowork_sr.tsx new file mode 100644 index 00000000..123947ad --- /dev/null +++ b/app/(tabs)/cowork_sr.tsx @@ -0,0 +1,101 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { View, Text, ScrollView, TextInput, TouchableOpacity, StyleSheet, KeyboardAvoidingView, Platform } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface CoworkMsg { id: string; author: string; role: string; text: string; ts: string; type: 'chat' | 'action' | 'status' } + +const SAMPLE_MSGS: CoworkMsg[] = [ + { id: '1', author: '김철수', role: 'engineer', text: 'db-01 서버 CPU 90% 넘어갔어요. 확인 부탁드립니다.', ts: '10:02', type: 'chat' }, + { id: '2', author: 'AI', role: 'ai', text: '원인 분석 완료: db-01 슬로우 쿼리 20개 감지. 쿼리 최적화 또는 서버 재시작 권장.', ts: '10:02', type: 'action' }, + { id: '3', author: '이영희', role: 'pm', text: 'SR 우선순위 Critical로 변경했습니다.', ts: '10:03', type: 'status' }, +]; + +export default function CoworkSRScreen() { + const [srId] = useState('SR-2042'); + const [messages, setMessages] = useState(SAMPLE_MSGS); + const [input, setInput] = useState(''); + const [participants] = useState([{ name: '김철수', role: 'engineer', online: true }, { name: '이영희', role: 'pm', online: true }, { name: 'AI', role: 'ai', online: true }]); + const scrollRef = useRef(null); + + const send = async () => { + if (!input.trim()) return; + const msg: CoworkMsg = { id: Date.now().toString(), author: '나', role: 'engineer', text: input, ts: new Date().toLocaleTimeString('ko', { hour: '2-digit', minute: '2-digit' }), type: 'chat' }; + setMessages(prev => [...prev, msg]); + setInput(''); + try { + await fetch(`${ITSM_BASE}/api/sr-chat/${srId}/messages`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ text: input }), + }); + } catch {} + setTimeout(() => scrollRef.current?.scrollToEnd(), 100); + }; + + const roleColor = (role: string) => ({ engineer: '#00A0C8', pm: '#ffbb00', ai: '#44bb44', sm: '#bb44bb' })[role] || '#888'; + + return ( + + + {srId} 공동 대응 + + {participants.map((p, i) => ( + + {p.name[0]} + {p.online && } + + ))} + + + + scrollRef.current?.scrollToEnd()}> + {messages.map(msg => ( + + {msg.author !== '나' && ( + + {msg.author[0]} + + )} + + {msg.author !== '나' && {msg.author}} + {msg.text} + {msg.ts} + + + ))} + + + + + + 전송 + + + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A' }, + header: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', padding: 14, borderBottomWidth: 1, borderBottomColor: '#333' }, + srTitle: { color: '#fff', fontWeight: '700', fontSize: 16 }, + participants: { flexDirection: 'row', gap: 6 }, + avatar: { width: 30, height: 30, borderRadius: 15, borderWidth: 1, alignItems: 'center', justifyContent: 'center', position: 'relative' }, + avatarText: { fontSize: 13, fontWeight: '700' }, + onlineDot: { position: 'absolute', bottom: 0, right: 0, width: 8, height: 8, borderRadius: 4, backgroundColor: '#44bb44', borderWidth: 1, borderColor: '#0A0E1A' }, + messages: { flex: 1, padding: 12 }, + msgRow: { flexDirection: 'row', marginBottom: 12, alignItems: 'flex-end' }, + msgRowRight: { justifyContent: 'flex-end' }, + msgAvatar: { width: 28, height: 28, borderRadius: 14, alignItems: 'center', justifyContent: 'center', marginRight: 8 }, + msgAvatarText: { fontSize: 12, fontWeight: '700' }, + msgBubble: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 10, maxWidth: '75%', borderWidth: 1, borderColor: '#333' }, + msgBubbleAction: { borderColor: '#44bb44', backgroundColor: '#44bb4422' }, + msgBubbleStatus: { borderColor: '#ffbb00', backgroundColor: '#ffbb0022' }, + msgBubbleSelf: { backgroundColor: '#003366', borderColor: '#00A0C8' }, + msgAuthor: { fontSize: 11, fontWeight: '700', marginBottom: 4 }, + msgText: { color: '#fff', fontSize: 14 }, + msgTs: { color: '#555', fontSize: 10, marginTop: 4, textAlign: 'right' }, + inputRow: { flexDirection: 'row', padding: 12, borderTopWidth: 1, borderTopColor: '#333' }, + input: { flex: 1, backgroundColor: '#1A1F2E', borderRadius: 10, color: '#fff', paddingHorizontal: 14, paddingVertical: 10, borderWidth: 1, borderColor: '#333', marginRight: 10 }, + sendBtn: { backgroundColor: '#00A0C8', paddingHorizontal: 16, borderRadius: 10, justifyContent: 'center' }, + sendText: { color: '#fff', fontWeight: '700' }, +}); diff --git a/app/(tabs)/csap_audit_prep.tsx b/app/(tabs)/csap_audit_prep.tsx new file mode 100644 index 00000000..4b1037c7 --- /dev/null +++ b/app/(tabs)/csap_audit_prep.tsx @@ -0,0 +1,79 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function CSAPAuditPrepScreen() { + const [items, setItems] = useState([]) + const [summary, setSummary] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const [r, s] = await Promise.all([ + client.get('/api/compliance/csap/items'), + client.get('/api/compliance/csap/dashboard'), + ]) + setItems(r.data?.items ?? r.data ?? []) + setSummary(s.data) + } catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const autoSR = async (item: any) => { + try { + await client.post('/api/tasks', { title: `CSAP 조치: ${item.control_id} ${item.title}`, description: item.remediation ?? item.description, priority: 'HIGH', sr_type: 'COMPLIANCE' }) + Alert.alert('완료', 'SR이 등록됐습니다.') + } catch { Alert.alert('오류', 'SR 등록에 실패했습니다.') } + } + + const failItems = items.filter(i => i.status === 'fail' || i.status === 'FAIL') + const passCount = items.length - failItems.length + const pct = items.length > 0 ? Math.round((passCount / items.length) * 100) : 0 + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={{loading ? '' : '미준수 항목이 없습니다. CSAP 심사 준비 완료!'}} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={ + + + {pct}% + CSAP 준수율 + + 미준수 {failItems.length}건 / 전체 {items.length}건 + + } + renderItem={({ item }) => ( + + {item.control_id} — {item.title ?? item.name} + {item.description ?? ''} + autoSR(item)}> + 자동 SR 등록 + + + )} + /> + ) +} + +const s = StyleSheet.create({ + header: { backgroundColor: '#fff', borderRadius: 12, padding: 16, marginBottom: 12, alignItems: 'center', elevation: 2 }, + pctRow: { flexDirection: 'row', alignItems: 'baseline', gap: 8 }, + pctNum: { fontSize: 52, fontWeight: '900', color: COLORS.accent }, + pctLabel:{ fontSize: 14, color: COLORS.muted }, + sub: { fontSize: 12, color: COLORS.muted, marginTop: 4 }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + ctrlId: { fontSize: 13, fontWeight: '700', color: COLORS.text, marginBottom: 4 }, + desc: { fontSize: 12, color: COLORS.muted, marginBottom: 10 }, + btn: { backgroundColor: COLORS.danger + '15', borderRadius: 6, padding: 8, alignItems: 'center' }, + btnText: { color: COLORS.danger, fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.success, marginTop: 40, fontSize: 14, fontWeight: '700' }, +}) diff --git a/app/(tabs)/csap_dashboard.tsx b/app/(tabs)/csap_dashboard.tsx new file mode 100644 index 00000000..cf1bfb3b --- /dev/null +++ b/app/(tabs)/csap_dashboard.tsx @@ -0,0 +1,106 @@ +import React, { useState, useCallback } from 'react' +import { + View, Text, ScrollView, TouchableOpacity, StyleSheet, Alert, RefreshControl, +} from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getCSAPDashboard, getCSAPItems, createSR } from '../../services/api' + +function DonutGauge({ score }: { score: number }) { + const color = score >= 85 ? COLORS.success : score >= 70 ? COLORS.warning : COLORS.danger + return ( + + + + + {score}% + CSAP + + + + ) +} + +const g = StyleSheet.create({ + wrap: { alignItems: 'center', marginVertical: 20 }, + ring: { width: 120, height: 120, borderRadius: 60, borderWidth: 12, justifyContent: 'center', alignItems: 'center' }, + progress: { position: 'absolute', width: 120, height: 120, borderRadius: 60, borderWidth: 12, borderTopColor: 'transparent', borderRightColor: 'transparent' }, + inner: { alignItems: 'center' }, + score: { fontSize: 26, fontWeight: '800' }, + label: { fontSize: 11, color: COLORS.muted, fontWeight: '600' }, +}) + +export default function CSAPDashboardScreen() { + const [dashboard, setDashboard] = useState(null) + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const [d, i] = await Promise.all([getCSAPDashboard(), getCSAPItems()]) + setDashboard(d.data) + setItems((i.data?.items ?? i.data ?? []).filter((x: any) => x.status === 'non_compliant' || x.result === 'FAIL')) + } catch {} finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const createActionSR = async (item: any) => { + Alert.alert('즉시 조치 SR 등록', `"${item.title ?? item.check_item}" 미준수 항목으로 SR을 등록하시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: '등록', onPress: async () => { + try { + await createSR({ title: `[CSAP] ${item.title ?? item.check_item}`, description: item.description ?? '미준수 항목 조치 필요', priority: 'HIGH', sr_type: 'OTHER' }) + Alert.alert('완료', 'SR이 등록됐습니다.') + } catch { Alert.alert('오류', 'SR 등록에 실패했습니다.') } + }}, + ]) + } + + const score = dashboard?.overall_score ?? dashboard?.compliance_rate ?? 0 + + return ( + }> + + + {/* 영역별 바 */} + {(dashboard?.domains ?? []).map((d: any, i: number) => ( + + {d.name} + + = 80 ? COLORS.success : COLORS.warning }]} /> + + {d.rate ?? 0}% + + ))} + + {/* 미준수 항목 */} + 미준수 항목 ({items.length}건) + {items.map((item, i) => ( + + {item.title ?? item.check_item} + {item.description ?? item.detail ?? '-'} + createActionSR(item)}> + 즉시 조치 SR 등록 + + + ))} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + domainRow: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, paddingVertical: 6, gap: 8 }, + domainName: { width: 80, fontSize: 12, color: COLORS.text }, + barBg: { flex: 1, height: 8, backgroundColor: COLORS.border, borderRadius: 4 }, + barFill: { height: 8, borderRadius: 4 }, + domainRate: { width: 40, fontSize: 12, color: COLORS.muted, textAlign: 'right' }, + sectionTitle: { fontSize: 15, fontWeight: '700', color: COLORS.text, padding: 16, paddingBottom: 8 }, + card: { backgroundColor: '#fff', borderRadius: 10, margin: 12, marginTop: 0, padding: 14, elevation: 1 }, + itemTitle: { fontSize: 14, fontWeight: '600', color: COLORS.text, marginBottom: 4 }, + itemDesc: { fontSize: 12, color: COLORS.muted, marginBottom: 10 }, + srBtn: { backgroundColor: COLORS.danger, borderRadius: 6, padding: 8, alignItems: 'center' }, + srBtnText: { color: '#fff', fontWeight: '700', fontSize: 12 }, +}) diff --git a/app/(tabs)/cve_detail.tsx b/app/(tabs)/cve_detail.tsx new file mode 100644 index 00000000..7abbb0f5 --- /dev/null +++ b/app/(tabs)/cve_detail.tsx @@ -0,0 +1,97 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +const SEV_COLOR: Record = { CRITICAL: '#dc2626', HIGH: '#f97316', MEDIUM: COLORS.warning, LOW: COLORS.muted, NONE: '#94a3b8' } + +export default function CVEDetailScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/patches/cve'); setItems(r.data?.cves ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const applyPatch = async (item: any) => { + Alert.alert('패치 적용', `${item.cve_id}를 대상 서버에 적용하시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: '적용', style: 'destructive', onPress: async () => { + try { + await client.post(`/api/patches/${item.cve_id}/apply`) + Alert.alert('완료', '패치 적용 SR이 생성됐습니다.') + load() + } catch { Alert.alert('오류', '패치 적용에 실패했습니다.') } + }}, + ]) + } + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={CVE 항목이 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const sev = item.severity ?? 'MEDIUM' + const color = SEV_COLOR[sev] ?? COLORS.muted + const cvss = item.cvss_score ?? item.score ?? 0 + return ( + + + {item.cve_id ?? item.id} + + {sev} + + + + CVSS + + + + {Number(cvss).toFixed(1)} + + {item.description ?? item.summary ?? ''} + + 영향 서버: {item.affected_count ?? item.servers?.length ?? 0}개 + 공개일: {item.published_at?.slice(0, 10) ?? '-'} + + {item.status !== 'PATCHED' && ( + applyPatch(item)}> + 패치 적용 + + )} + {item.status === 'PATCHED' && 패치 완료} + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 12, padding: 14, marginBottom: 8, elevation: 1 }, + header: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 10 }, + cveId: { fontSize: 14, fontWeight: '800' }, + sevBadge: { paddingHorizontal: 8, paddingVertical: 3, borderRadius: 4 }, + sevText: { color: '#fff', fontSize: 10, fontWeight: '700' }, + cvssRow: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 8 }, + cvssLabel: { fontSize: 11, color: COLORS.muted, width: 36 }, + cvssBar: { flex: 1, height: 6, backgroundColor: COLORS.border, borderRadius: 3, overflow: 'hidden' }, + cvssFill: { height: '100%', borderRadius: 3 }, + cvssScore: { fontSize: 14, fontWeight: '700', width: 28 }, + desc: { fontSize: 12, color: COLORS.muted, marginBottom: 8, lineHeight: 18 }, + meta: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 10 }, + metaText: { fontSize: 11, color: COLORS.muted }, + patchBtn: { backgroundColor: COLORS.danger, borderRadius: 8, padding: 10, alignItems: 'center' }, + patchText: { color: '#fff', fontSize: 13, fontWeight: '700' }, + patched: { color: COLORS.success, fontSize: 13, fontWeight: '700', textAlign: 'center' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/delegation.tsx b/app/(tabs)/delegation.tsx new file mode 100644 index 00000000..1be056cb --- /dev/null +++ b/app/(tabs)/delegation.tsx @@ -0,0 +1,131 @@ +import React, { useState, useEffect } from 'react' +import { + View, Text, TextInput, TouchableOpacity, StyleSheet, + ScrollView, Alert, ActivityIndicator, +} from 'react-native' +import { COLORS } from '../../constants/Config' +import { getDelegation, setDelegation, cancelDelegation, searchUsers } from '../../services/api' + +export default function DelegationScreen() { + const [current, setCurrent] = useState(null) + const [loading, setLoading] = useState(true) + const [query, setQuery] = useState('') + const [users, setUsers] = useState([]) + const [selected, setSelected] = useState(null) + const [startDate, setStartDate] = useState('') + const [endDate, setEndDate] = useState('') + const [reason, setReason] = useState('') + const [saving, setSaving] = useState(false) + + useEffect(() => { + getDelegation().then(r => setCurrent(r.data)).catch(() => {}).finally(() => setLoading(false)) + }, []) + + const search = async () => { + if (!query.trim()) return + try { + const r = await searchUsers(query) + setUsers(r.data?.items ?? r.data ?? []) + } catch { setUsers([]) } + } + + const save = async () => { + if (!selected || !startDate || !endDate || !reason.trim()) { + Alert.alert('입력 오류', '모든 항목을 입력해주세요.') + return + } + setSaving(true) + try { + await setDelegation({ delegate_to: selected.id, start_date: startDate, end_date: endDate, reason }) + Alert.alert('완료', '대리결재가 설정됐습니다.') + const r = await getDelegation() + setCurrent(r.data) + } catch { Alert.alert('오류', '저장 중 오류가 발생했습니다.') } + finally { setSaving(false) } + } + + const cancel = async (id: number) => { + Alert.alert('취소 확인', '대리결재를 해제하시겠습니까?', [ + { text: '아니오', style: 'cancel' }, + { text: '해제', style: 'destructive', onPress: async () => { + await cancelDelegation(id) + setCurrent(null) + }}, + ]) + } + + if (loading) return + + return ( + + {current && ( + + 현재 대리결재 + 대리인: {current.delegate_name ?? current.delegate_to} + 기간: {current.start_date} ~ {current.end_date} + 사유: {current.reason} + cancel(current.id)}> + 해제 + + + )} + + 대리인 설정 + + + + + 검색 + + + + {users.map((u: any) => ( + setSelected(u)} + > + {u.display_name ?? u.username} + {u.role} + + ))} + + {selected && 선택: {selected.display_name ?? selected.username}} + + + + + + + {saving ? '저장 중...' : '대리결재 설정'} + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 16, elevation: 1 }, + label: { fontSize: 12, color: COLORS.muted, marginBottom: 4 }, + value: { fontSize: 14, color: COLORS.text, marginBottom: 2 }, + cancelBtn: { marginTop: 8, backgroundColor: COLORS.danger, borderRadius: 6, padding: 8, alignItems: 'center' }, + cancelBtnText: { color: '#fff', fontWeight: '700' }, + sectionTitle: { fontSize: 16, fontWeight: '700', color: COLORS.text, marginBottom: 12 }, + row: { flexDirection: 'row', gap: 8, marginBottom: 8 }, + input: { backgroundColor: '#fff', borderRadius: 8, borderWidth: 1, borderColor: COLORS.border, paddingHorizontal: 12, paddingVertical: 10, marginBottom: 10, fontSize: 14, color: COLORS.text }, + searchBtn: { backgroundColor: COLORS.accent, borderRadius: 8, paddingHorizontal: 16, justifyContent: 'center' }, + searchBtnText: { color: '#fff', fontWeight: '700' }, + userItem: { backgroundColor: '#fff', borderRadius: 8, padding: 10, marginBottom: 4, flexDirection: 'row', justifyContent: 'space-between', borderWidth: 1, borderColor: COLORS.border }, + userItemSelected: { borderColor: COLORS.accent, backgroundColor: COLORS.light }, + userName: { fontSize: 14, fontWeight: '600', color: COLORS.text }, + userRole: { fontSize: 12, color: COLORS.muted }, + selectedText: { fontSize: 13, color: COLORS.accent, marginBottom: 8 }, + saveBtn: { backgroundColor: COLORS.accent, borderRadius: 10, padding: 14, alignItems: 'center', marginTop: 8 }, + saveBtnText: { color: '#fff', fontWeight: '800', fontSize: 15 }, +}) diff --git a/app/(tabs)/dependency_map.tsx b/app/(tabs)/dependency_map.tsx new file mode 100644 index 00000000..6f92b269 --- /dev/null +++ b/app/(tabs)/dependency_map.tsx @@ -0,0 +1,68 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, StyleSheet, RefreshControl, ActivityIndicator } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +function ServiceNode({ name, deps, allNodes }: { name: string; deps: string[]; allNodes: Record }) { + return ( + + {name} + {deps.length > 0 && ( + + {deps.map((d, i) => ( + + + {d} + + ))} + + )} + + ) +} +const n = StyleSheet.create({ + wrap: { marginBottom: 12 }, + node: { backgroundColor: COLORS.accent, borderRadius: 8, paddingHorizontal: 14, paddingVertical: 8, alignSelf: 'flex-start' }, + name: { color: '#fff', fontSize: 13, fontWeight: '700' }, + depsWrap: { marginLeft: 20, marginTop: 4 }, + depRow: { flexDirection: 'row', alignItems: 'center', marginTop: 4 }, + arrow: { width: 20, height: 2, backgroundColor: COLORS.border, marginRight: 6 }, + depBox: { backgroundColor: COLORS.light, borderRadius: 6, paddingHorizontal: 10, paddingVertical: 4 }, + depText: { fontSize: 12, color: COLORS.text }, +}) + +export default function DependencyMapScreen() { + const [data, setData] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/knowledge-graph/service-map'); setData(r.data) } + catch { setData(null) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + if (loading) return + if (!data) return 서비스 의존성 맵을 불러올 수 없습니다. + + const nodes: Record = data.dependencies ?? data.services ?? {} + + return ( + } contentContainerStyle={{ padding: 16 }}> + 서비스 의존성 맵 + 노드: {Object.keys(nodes).length}개 · 관계: {Object.values(nodes).flat().length}개 + {Object.entries(nodes).map(([name, deps]) => ( + + ))} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, + title: { fontSize: 20, fontWeight: '800', color: COLORS.text, marginBottom: 4 }, + sub: { fontSize: 12, color: COLORS.muted, marginBottom: 16 }, +}) diff --git a/app/(tabs)/deploy_history.tsx b/app/(tabs)/deploy_history.tsx new file mode 100644 index 00000000..12e59ec6 --- /dev/null +++ b/app/(tabs)/deploy_history.tsx @@ -0,0 +1,72 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getDeployHistory } from '../../services/api' + +const STATUS_COLOR: Record = { + SUCCESS: COLORS.success, COMPLETED: COLORS.success, + FAILURE: COLORS.danger, FAILED: COLORS.danger, + RUNNING: COLORS.accent, IN_PROGRESS: COLORS.accent, +} + +export default function DeployHistoryScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getDeployHistory(); setItems(r.data?.items ?? r.data ?? []) } + catch { setItems([]) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={배포 이력이 없습니다.} + contentContainerStyle={{ padding: 12, paddingLeft: 40 }} + style={{ backgroundColor: COLORS.bg }} + renderItem={({ item, index }) => { + const color = STATUS_COLOR[item.status ?? ''] ?? COLORS.muted + const dur = item.duration_sec ? `${Math.ceil(item.duration_sec / 60)}분` : '-' + return ( + + {/* 타임라인 */} + + + {index < items.length - 1 && } + + + + {item.project ?? 'N/A'} + + {item.status ?? '-'} + + + {item.started_at?.slice(0, 16).replace('T', ' ')} · {dur} · {item.deployed_by ?? '-'} + + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + row: { flexDirection: 'row', marginBottom: 0 }, + timeline: { position: 'absolute', left: -28, top: 0, bottom: 0, alignItems: 'center', width: 16 }, + dot: { width: 12, height: 12, borderRadius: 6, marginTop: 14 }, + line: { flex: 1, width: 2, backgroundColor: COLORS.border, marginTop: 2 }, + content: { flex: 1, backgroundColor: '#fff', borderRadius: 10, padding: 12, marginBottom: 8, elevation: 1 }, + headerRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 4 }, + project: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + badge: { borderRadius: 4, paddingHorizontal: 6, paddingVertical: 2 }, + badgeText: { fontSize: 10, color: '#fff', fontWeight: '700' }, + meta: { fontSize: 12, color: COLORS.muted }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/devices.tsx b/app/(tabs)/devices.tsx new file mode 100644 index 00000000..d5e19bde --- /dev/null +++ b/app/(tabs)/devices.tsx @@ -0,0 +1,175 @@ +/** + * #33 등록 디바이스 관리 + * GET /api/auth/devices — 디바이스 목록 + * DELETE /api/auth/devices/{id} — 등록 해제 + * 현재 기기는 삭제 버튼 비활성화 + */ +import { useCallback, useEffect, useState } from 'react' +import { + View, Text, FlatList, TouchableOpacity, StyleSheet, + RefreshControl, Alert, ActivityIndicator, Platform, +} from 'react-native' +import { COLORS } from '../../constants/Config' +import { getDevices, deleteDevice } from '../../services/api' +import LineIcon from '../../components/LineIcon' + +interface Device { + id: string | number + name?: string + device_name?: string + os?: string + platform?: string + last_seen?: string + last_active_at?: string + is_current?: boolean + current?: boolean +} + +function osIcon(os?: string): Parameters[0]['name'] { + const v = (os ?? '').toLowerCase() + if (v.includes('ios') || v.includes('iphone') || v.includes('mac')) return 'lock' + if (v.includes('android')) return 'server' + return 'dashboard' +} + +function fmt(d?: string): string { + if (!d) return '-' + try { + const dt = new Date(d) + if (isNaN(dt.getTime())) return d + return dt.toLocaleString('ko-KR', { dateStyle: 'medium', timeStyle: 'short' }) + } catch { + return d + } +} + +export default function DevicesScreen() { + const [devices, setDevices] = useState([]) + const [loading, setLoading] = useState(true) + const [refresh, setRefresh] = useState(false) + + const load = useCallback(async (isRefresh = false) => { + isRefresh ? setRefresh(true) : setLoading(true) + try { + const r = await getDevices() + const list: Device[] = Array.isArray(r.data) ? r.data : r.data?.items ?? [] + setDevices(list) + } catch { + setDevices([]) + } finally { + setLoading(false) + setRefresh(false) + } + }, []) + + useEffect(() => { load() }, [load]) + + const handleRemove = (dev: Device) => { + const name = dev.name ?? dev.device_name ?? '이 기기' + Alert.alert('디바이스 등록 해제', `"${name}"의 등록을 해제하시겠습니까?\n해당 기기는 다시 로그인해야 합니다.`, [ + { text: '취소', style: 'cancel' }, + { + text: '해제', style: 'destructive', + onPress: async () => { + try { + await deleteDevice(dev.id) + setDevices((prev) => prev.filter((d) => d.id !== dev.id)) + } catch (e: any) { + Alert.alert('오류', e.response?.data?.detail ?? '등록 해제에 실패했습니다.') + } + }, + }, + ]) + } + + if (loading) { + return ( + + + + ) + } + + return ( + String(d.id)} + refreshControl={ load(true)} tintColor={COLORS.accent} />} + ListHeaderComponent={ + + 등록된 디바이스 + 이 계정으로 로그인된 기기 {devices.length}대 + + } + ListEmptyComponent={ + + 등록된 디바이스가 없습니다. + + } + contentContainerStyle={devices.length === 0 ? { flexGrow: 1 } : undefined} + renderItem={({ item }) => { + const isCurrent = item.is_current ?? item.current ?? false + return ( + + + + + + + {item.name ?? item.device_name ?? '알 수 없는 기기'} + {isCurrent && ( + + 현재 기기 + + )} + + {item.os ?? item.platform ?? Platform.OS} + 마지막 접속: {fmt(item.last_seen ?? item.last_active_at)} + + handleRemove(item)} + > + + {isCurrent ? '사용 중' : '해제'} + + + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + center: { flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: COLORS.bg }, + header: { padding: 20, paddingBottom: 8 }, + headerTitle: { fontSize: 18, fontWeight: '800', color: COLORS.text }, + headerSub: { fontSize: 13, color: COLORS.muted, marginTop: 4 }, + card: { + flexDirection: 'row', alignItems: 'center', gap: 12, + backgroundColor: '#fff', marginHorizontal: 16, marginTop: 10, + borderRadius: 14, padding: 16, + borderWidth: 1, borderColor: COLORS.border, + }, + iconBox: { + width: 42, height: 42, borderRadius: 11, + backgroundColor: 'rgba(0,160,200,.08)', alignItems: 'center', justifyContent: 'center', + }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8 }, + name: { fontSize: 15, fontWeight: '700', color: COLORS.text }, + currentBadge: { backgroundColor: '#dcfce7', paddingHorizontal: 8, paddingVertical: 2, borderRadius: 8 }, + currentText: { fontSize: 10, fontWeight: '700', color: '#15803d' }, + meta: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + removeBtn: { + paddingHorizontal: 14, paddingVertical: 8, borderRadius: 10, + backgroundColor: '#fee2e2', + }, + removeDisabled: { backgroundColor: '#f1f5f9' }, + removeText: { fontSize: 13, fontWeight: '700', color: COLORS.danger }, + removeTextDisabled: { color: COLORS.muted }, + empty: { flex: 1, alignItems: 'center', justifyContent: 'center' }, + emptyText: { color: COLORS.muted, fontSize: 14 }, +}) diff --git a/app/(tabs)/eol_alerts.tsx b/app/(tabs)/eol_alerts.tsx new file mode 100644 index 00000000..f75cb04c --- /dev/null +++ b/app/(tabs)/eol_alerts.tsx @@ -0,0 +1,59 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function EOLAlertsScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/cmdb/eol-software'); setItems(r.data?.items ?? r.data ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const createSR = async (item: any) => { + try { + await client.post('/api/tasks', { title: `EOL 조치: ${item.name} ${item.version ?? ''}`, description: `서버 ${item.server_count ?? '-'}대 영향 — EOL 소프트웨어 교체/업그레이드 필요`, priority: 'HIGH', sr_type: 'CHANGE' }) + Alert.alert('완료', 'SR이 등록됐습니다.') + } catch { Alert.alert('오류', 'SR 등록에 실패했습니다.') } + } + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={EOL 소프트웨어가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const isEOL = !item.eol_date || new Date(item.eol_date) <= new Date() + return ( + + {item.name} {item.version ?? ''} + EOL: {item.eol_date?.slice(0, 10) ?? '이미 만료'} · 서버 {item.server_count ?? 0}대 + {item.note ?? item.description ?? ''} + createSR(item)}> + 교체 SR 등록 + + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + name: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 4 }, + meta: { fontSize: 12, color: COLORS.muted, marginBottom: 4 }, + desc: { fontSize: 12, color: COLORS.muted, marginBottom: 10 }, + srBtn: { backgroundColor: COLORS.warning + '20', borderRadius: 6, padding: 8, alignItems: 'center' }, + srText: { color: COLORS.warning, fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/esignature.tsx b/app/(tabs)/esignature.tsx new file mode 100644 index 00000000..9ba27873 --- /dev/null +++ b/app/(tabs)/esignature.tsx @@ -0,0 +1,94 @@ +import React, { useState, useRef, useCallback } from 'react' +import { View, Text, TouchableOpacity, StyleSheet, Alert, ScrollView, TextInput } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function ESignatureScreen() { + const [docs, setDocs] = useState([]) + const [selected, setSelected] = useState(null) + const [pin, setPin] = useState('') + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/approvals/pending-docs'); setDocs(r.data?.docs ?? r.data?.items ?? []) } + catch { setDocs([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const sign = async () => { + if (!selected) return + if (!pin || pin.length < 4) { Alert.alert('오류', 'PIN 4자리 이상 입력하세요.'); return } + try { + await client.post(`/api/approvals/${selected.id}/sign`, { pin_hash: pin }) + Alert.alert('완료', '전자서명이 완료됐습니다.') + setSelected(null) + setPin('') + load() + } catch { Alert.alert('오류', '서명에 실패했습니다.') } + } + + if (selected) { + return ( + + + {selected.title} + 요청자: {selected.requester_name ?? '-'} · {selected.created_at?.slice(0, 10) ?? ''} + {selected.content ?? selected.description ?? ''} + + 전자서명 PIN 입력 + + + 전자서명 완료 + + { setSelected(null); setPin('') }}> + 취소 + + + ) + } + + return ( + + 전자서명 대기 문서 + {docs.length === 0 && 서명 대기 문서가 없습니다.} + {docs.map((doc, i) => ( + setSelected(doc)}> + {doc.title} + {doc.requester_name ?? '-'} · {doc.created_at?.slice(0, 10) ?? ''} + 서명하기 → + + ))} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + header: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + cardTitle: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 4 }, + cardMeta: { fontSize: 11, color: COLORS.muted, marginBottom: 8 }, + cardAction: { color: COLORS.accent, fontSize: 13, fontWeight: '700' }, + docCard: { backgroundColor: '#fff', borderRadius: 12, padding: 16, margin: 12, elevation: 1 }, + docTitle: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 4 }, + docMeta: { fontSize: 12, color: COLORS.muted, marginBottom: 10 }, + docDesc: { fontSize: 13, color: COLORS.text, lineHeight: 20 }, + pinLabel: { fontSize: 13, fontWeight: '700', color: COLORS.text, marginHorizontal: 12, marginTop: 8 }, + pinInput: { backgroundColor: '#fff', borderRadius: 10, padding: 14, margin: 12, fontSize: 18, letterSpacing: 4, elevation: 1, color: COLORS.text }, + signBtn: { backgroundColor: COLORS.success, borderRadius: 10, padding: 14, margin: 12, alignItems: 'center' }, + signText: { color: '#fff', fontSize: 15, fontWeight: '800' }, + cancelBtn: { borderRadius: 10, padding: 12, marginHorizontal: 12, alignItems: 'center' }, + cancelText: { color: COLORS.muted, fontSize: 14 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/failure_prediction.tsx b/app/(tabs)/failure_prediction.tsx new file mode 100644 index 00000000..0eed5d60 --- /dev/null +++ b/app/(tabs)/failure_prediction.tsx @@ -0,0 +1,64 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function FailurePredictionScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/predictive/failure'); setItems(r.data?.predictions ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const createSR = async (item: any) => { + try { + await client.post('/api/tasks', { title: `[예측 장애 예방] ${item.server_name ?? item.name}`, description: `장애 발생 가능성 ${item.probability ?? '-'}% — AI 예측 기반 예방 점검`, priority: 'HIGH', sr_type: 'INCIDENT' }) + Alert.alert('완료', '예방 SR이 등록됐습니다.') + } catch { Alert.alert('오류', 'SR 등록에 실패했습니다.') } + } + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={예측된 장애가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const prob = item.probability ?? item.risk_score ?? 0 + const color = prob >= 70 ? COLORS.danger : prob >= 40 ? COLORS.warning : COLORS.success + return ( + + + + {item.server_name ?? item.name} + {item.failure_type ?? item.type ?? '알 수 없음'} · {item.estimated_time ?? '72시간 이내'} + + {prob}% + + {item.reason ?? item.description ?? ''} + createSR(item)}>예방 SR 등록 → + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', marginBottom: 6 }, + name: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + prob: { fontSize: 26, fontWeight: '800' }, + reason: { fontSize: 12, color: COLORS.muted, marginBottom: 8 }, + action: { color: COLORS.blue, fontSize: 13, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/favorites.tsx b/app/(tabs)/favorites.tsx new file mode 100644 index 00000000..b0956c07 --- /dev/null +++ b/app/(tabs)/favorites.tsx @@ -0,0 +1,73 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect, useRouter } from 'expo-router' +import * as SecureStore from 'expo-secure-store' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +const SHORTCUTS_KEY = 'guardia_shortcuts' + +const ALL_SHORTCUTS = [ + { key: 'sr', label: 'SR 목록', route: '/(tabs)/sr', icon: '📋' }, + { key: 'monitoring', label: '서버 모니터링', route: '/(tabs)/monitoring', icon: '📡' }, + { key: 'chat', label: 'AI 챗봇', route: '/(tabs)/chat', icon: '🤖' }, + { key: 'kb', label: '지식베이스', route: '/(tabs)/kb', icon: '📚' }, + { key: 'approvals', label: '승인 관리', route: '/(tabs)/approval', icon: '✅' }, + { key: 'cve', label: 'CVE 현황', route: '/(tabs)/cve_detail', icon: '🔒' }, + { key: 'health', label: '건강 점수', route: '/(tabs)/health_scorecard', icon: '💊' }, + { key: 'leaderboard', label: '성과 리더보드', route: '/(tabs)/team_leaderboard', icon: '🏆' }, +] + +export default function FavoritesScreen() { + const [pinned, setPinned] = useState([]) + const router = useRouter() + + const load = useCallback(async () => { + const raw = await SecureStore.getItemAsync(SHORTCUTS_KEY) + setPinned(raw ? JSON.parse(raw) : ['sr', 'monitoring', 'chat']) + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const toggle = async (key: string) => { + const next = pinned.includes(key) ? pinned.filter(k => k !== key) : [...pinned, key] + setPinned(next) + await SecureStore.setItemAsync(SHORTCUTS_KEY, JSON.stringify(next)) + } + + const pinnedItems = ALL_SHORTCUTS.filter(s => pinned.includes(s.key)) + const unpinned = ALL_SHORTCUTS.filter(s => !pinned.includes(s.key)) + + return ( + item.key} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={즐겨찾기 바로가기} + renderItem={({ item }) => { + const isPinned = pinned.includes(item.key) + return ( + + router.push(item.route as any)}> + {item.icon} + {item.label} + + toggle(item.key)}> + {isPinned ? '고정됨' : '고정'} + + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + header: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, + row: { flexDirection: 'row', alignItems: 'center', backgroundColor: '#fff', borderRadius: 10, padding: 12, marginBottom: 6, elevation: 1, gap: 8 }, + link: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: 10 }, + icon: { fontSize: 22, width: 32, textAlign: 'center' }, + label: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + pin: { borderRadius: 6, paddingHorizontal: 10, paddingVertical: 6 }, +}) diff --git a/app/(tabs)/greenops_dashboard.tsx b/app/(tabs)/greenops_dashboard.tsx new file mode 100644 index 00000000..9f3bb3c9 --- /dev/null +++ b/app/(tabs)/greenops_dashboard.tsx @@ -0,0 +1,110 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function GreenOpsDashboardScreen() { + const [energy, setEnergy] = useState(null) + const [carbon, setCarbon] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const [e, c] = await Promise.all([ + client.get('/api/greenops/energy'), + client.get('/api/greenops/carbon'), + ]) + setEnergy(e.data); setCarbon(c.data) + } catch {} finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const servers = energy?.servers ?? energy?.items ?? [] + const trend = carbon?.monthly ?? carbon?.trend ?? [] + + return ( + } contentContainerStyle={{ padding: 12 }}> + + {/* 헤더 요약 */} + + + + + + + {/* 서버별 전력 */} + {servers.length > 0 && ( + <> + 서버별 전력 사용량 + {servers.slice(0, 10).map((s2: any, i: number) => { + const kwh = s2.kwh ?? s2.power_kwh ?? 0 + const max = Math.max(...servers.map((x: any) => x.kwh ?? x.power_kwh ?? 0), 1) + return ( + + {s2.name ?? s2.server_name ?? 'N/A'} + + + + {kwh}kWh + + ) + })} + + )} + + {/* 월별 탄소 추이 */} + {trend.length > 0 && ( + <> + 월별 탄소 배출 추이 + + {trend.slice(-6).map((t: any, i: number) => { + const val = t.co2_kg ?? t.value ?? 0 + const max2 = Math.max(...trend.map((x: any) => x.co2_kg ?? x.value ?? 0), 1) + const h = Math.max(20, Math.round((val/max2)*80)) + return ( + + + {t.month?.slice(5) ?? `M${i+1}`} + + ) + })} + + + )} + + ) +} + +function SummaryCard({ label, value, color, icon }: any) { + return ( + + {icon} + {value} + {label} + + ) +} +const c = StyleSheet.create({ + card: { flex: 1, backgroundColor: '#fff', borderRadius: 10, padding: 12, alignItems: 'center', borderTopWidth: 3, elevation: 1 }, + icon: { fontSize: 24, marginBottom: 4 }, + val: { fontSize: 16, fontWeight: '800', marginBottom: 2 }, + label: { fontSize: 11, color: COLORS.muted }, +}) + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + summary: { flexDirection: 'row', gap: 8, marginBottom: 12 }, + section: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginTop: 8, marginBottom: 8 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 8 }, + sName: { fontSize: 12, color: COLORS.text, width: 90 }, + barBg: { flex: 1, height: 8, backgroundColor: COLORS.border, borderRadius: 4 }, + barFill: { height: 8, backgroundColor: COLORS.success, borderRadius: 4 }, + kwhText: { fontSize: 11, color: COLORS.muted, width: 55, textAlign: 'right' }, + trendRow: { flexDirection: 'row', alignItems: 'flex-end', gap: 8, height: 100 }, + bar: { flex: 1, alignItems: 'center' }, + barV: { width: '80%', backgroundColor: COLORS.accent, borderRadius: 4 }, + barLabel: { fontSize: 10, color: COLORS.muted, marginTop: 4 }, +}) diff --git a/app/(tabs)/health_scorecard.tsx b/app/(tabs)/health_scorecard.tsx new file mode 100644 index 00000000..e07079d2 --- /dev/null +++ b/app/(tabs)/health_scorecard.tsx @@ -0,0 +1,78 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, StyleSheet, RefreshControl, ActivityIndicator } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +function GaugeBar({ value, max, color }: { value: number; max: number; color: string }) { + const pct = Math.min(100, Math.round((value / max) * 100)) + return ( + + + + ) +} +const g = StyleSheet.create({ + wrap: { height: 8, backgroundColor: COLORS.border, borderRadius: 4, overflow: 'hidden' }, + fill: { height: '100%', borderRadius: 4 }, +}) + +export default function HealthScorecardScreen() { + const [data, setData] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/dashboard'); setData(r.data) } + catch { setData(null) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + if (loading && !data) return + if (!data) return 건강 점수를 불러올 수 없습니다. + + const metrics = [ + { label: 'SR 처리율', value: data.sr_completion_rate ?? 0, max: 100, unit: '%', color: COLORS.success }, + { label: 'SLA 준수율', value: data.sla_compliance ?? data.sla_rate ?? 0, max: 100, unit: '%', color: COLORS.blue }, + { label: '서버 가용률', value: data.server_availability ?? 0, max: 100, unit: '%', color: COLORS.accent }, + { label: '미해결 SR', value: data.open_tasks ?? 0, max: Math.max(data.open_tasks ?? 1, 50), unit: '건', color: COLORS.warning }, + { label: 'CSAP 준수율', value: data.csap_score ?? data.compliance_score ?? 0, max: 100, unit: '%', color: '#8b5cf6' }, + ] + + const overall = Math.round(metrics.filter(m => m.unit === '%').reduce((a, m) => a + m.value, 0) / metrics.filter(m => m.unit === '%').length) + const overallColor = overall >= 90 ? COLORS.success : overall >= 70 ? COLORS.warning : COLORS.danger + + return ( + } contentContainerStyle={{ padding: 16 }}> + + 종합 건강 점수 + {overall} + {overall >= 90 ? '우수' : overall >= 70 ? '보통' : '위험'} + + + {metrics.map(m => ( + + + {m.label} + {m.value}{m.unit} + + + + ))} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, + overallCard: { alignItems: 'center', borderWidth: 2, borderRadius: 16, padding: 24, marginBottom: 16, backgroundColor: '#fff', elevation: 2 }, + overallLabel: { fontSize: 13, color: COLORS.muted, marginBottom: 8 }, + overallScore: { fontSize: 60, fontWeight: '900', lineHeight: 68 }, + overallGrade: { fontSize: 16, fontWeight: '700', marginTop: 4 }, + card: { backgroundColor: '#fff', borderRadius: 12, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 8 }, + label: { fontSize: 13, color: COLORS.text, fontWeight: '600' }, + value: { fontSize: 14, fontWeight: '800' }, +}) diff --git a/app/(tabs)/hw_warranty.tsx b/app/(tabs)/hw_warranty.tsx new file mode 100644 index 00000000..2a7edaf4 --- /dev/null +++ b/app/(tabs)/hw_warranty.tsx @@ -0,0 +1,78 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function HWWarrantyScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/cmdb/warranty'); setItems(r.data?.assets ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const urgency = (days: number) => days <= 30 ? COLORS.danger : days <= 90 ? COLORS.warning : COLORS.success + + const createSR = async (item: any) => { + try { + await client.post('/api/tasks', { title: `보증 만료 조치: ${item.asset_name ?? item.name}`, description: `${item.days_left ?? '?'}일 후 보증 만료 — 교체/연장 검토 필요`, priority: item.days_left <= 30 ? 'HIGH' : 'MEDIUM', sr_type: 'CHANGE' }) + Alert.alert('완료', 'SR이 등록됐습니다.') + } catch { Alert.alert('오류', 'SR 등록에 실패했습니다.') } + } + + return ( + (a.days_left ?? 9999) - (b.days_left ?? 9999))} + keyExtractor={(_, i) => String(i)} + refreshControl={} + ListEmptyComponent={하드웨어 자산 데이터가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={하드웨어 보증 기간 현황} + renderItem={({ item }) => { + const days = item.days_left ?? item.warranty_days_left ?? 999 + const color = urgency(days) + return ( + + + + {item.asset_name ?? item.name} + {item.manufacturer ?? '-'} {item.model ?? '-'} · {item.serial_no ?? ''} + + + {days === 999 ? '∞' : days} + + + + 보증 만료: {item.warranty_end?.slice(0, 10) ?? '-'} + {days <= 90 && ( + createSR(item)}> + 교체/연장 SR + + )} + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + header: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 12, marginBottom: 6 }, + name: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 3 }, + daysBadge: { alignItems: 'center', borderRadius: 8, paddingVertical: 6, paddingHorizontal: 10 }, + daysNum: { fontSize: 20, fontWeight: '900', color: '#fff' }, + daysLabel: { fontSize: 9, color: '#fff' }, + expiry: { fontSize: 11, color: COLORS.muted, marginBottom: 8 }, + srBtn: { backgroundColor: COLORS.warning + '20', borderRadius: 6, padding: 8, alignItems: 'center' }, + srText: { color: COLORS.warning, fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/insights.tsx b/app/(tabs)/insights.tsx index c82dd7ca..847751cb 100644 --- a/app/(tabs)/insights.tsx +++ b/app/(tabs)/insights.tsx @@ -1,8 +1,7 @@ import { useEffect, useState } from 'react' import { View, Text, ScrollView, StyleSheet, TouchableOpacity, ActivityIndicator, RefreshControl } from 'react-native' import { COLORS } from '../../constants/Config' -import { apiClient } from '../../services/api' -import { useAuth } from '../../hooks/useAuth' +import client from '../../services/api' interface Weekly { stats: any; ai_insight: string; top_categories: any[] } interface Anomaly { anomalies: any[]; today_sr: number; avg_7d: number; open_sr: number } @@ -13,7 +12,6 @@ const STATUS_COLOR: Record = { } export default function InsightsScreen() { - const { token } = useAuth() const [weekly, setWeekly] = useState(null) const [anomaly, setAnomaly] = useState(null) const [predict, setPredict] = useState(null) @@ -26,11 +24,11 @@ export default function InsightsScreen() { setLoading(true) try { const [w, a, p] = await Promise.all([ - apiClient.get('/api/insights/weekly', token), - apiClient.get('/api/insights/anomalies', token), - apiClient.get('/api/predict/sla-breach', token), + client.get('/api/insights/weekly'), + client.get('/api/insights/anomalies'), + client.get('/api/predict/sla-breach'), ]) - setWeekly(w); setAnomaly(a); setPredict(p) + setWeekly(w.data); setAnomaly(a.data); setPredict(p.data) } catch { /* 오류 무시 */ } setLoading(false); setRefreshing(false) } diff --git a/app/(tabs)/institution_compare.tsx b/app/(tabs)/institution_compare.tsx new file mode 100644 index 00000000..2ea7800d --- /dev/null +++ b/app/(tabs)/institution_compare.tsx @@ -0,0 +1,72 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, ScrollView } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getInstitutionStats } from '../../services/api' + +export default function InstitutionCompareScreen() { + const [rows, setRows] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getInstitutionStats(); setRows(r.data?.items ?? r.data ?? []) } + catch { setRows([]) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const max = Math.max(...rows.map(r => r.total_sr ?? 0), 1) + + return ( + } + > + {/* 헤더 */} + + 기관 + 전체 + 완료 + SLA + 처리율 + + + {rows.map((item, i) => { + const rate = item.total_sr > 0 ? Math.round((item.completed_sr / item.total_sr) * 100) : 0 + const barW = Math.round(((item.total_sr ?? 0) / max) * 100) + const slaColor = (item.sla_compliance_rate ?? 0) >= 95 ? COLORS.success : (item.sla_compliance_rate ?? 0) >= 80 ? COLORS.warning : COLORS.danger + return ( + + + {item.institution_name ?? item.inst_code} + + + + + {item.total_sr ?? 0} + {item.completed_sr ?? 0} + {item.sla_compliance_rate ?? 0}% + {rate}% + + ) + })} + + {rows.length === 0 && !loading && ( + 기관 데이터가 없습니다. + )} + + ) +} + +const s = StyleSheet.create({ + thead: { flexDirection: 'row', backgroundColor: COLORS.gnbBg, paddingHorizontal: 12, paddingVertical: 10 }, + th: { flex: 1, fontSize: 12, color: '#fff', fontWeight: '700', textAlign: 'center' }, + row: { flexDirection: 'row', backgroundColor: '#fff', marginHorizontal: 8, marginTop: 4, borderRadius: 8, padding: 10, alignItems: 'center', gap: 4 }, + instName: { fontSize: 12, fontWeight: '700', color: COLORS.text, marginBottom: 4 }, + barBg: { height: 4, backgroundColor: COLORS.border, borderRadius: 2 }, + barFill: { height: 4, backgroundColor: COLORS.accent, borderRadius: 2 }, + td: { flex: 1, fontSize: 12, color: COLORS.text, textAlign: 'center' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/ioc_search.tsx b/app/(tabs)/ioc_search.tsx new file mode 100644 index 00000000..51ab60d0 --- /dev/null +++ b/app/(tabs)/ioc_search.tsx @@ -0,0 +1,90 @@ +import React, { useState } from 'react' +import { View, Text, TextInput, FlatList, StyleSheet, TouchableOpacity, ActivityIndicator, Keyboard } from 'react-native' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function IOCSearchScreen() { + const [query, setQuery] = useState('') + const [results, setResults] = useState([]) + const [loading, setLoading] = useState(false) + const [searched, setSearched] = useState(false) + + const search = async () => { + if (!query.trim()) return + Keyboard.dismiss() + setLoading(true) + setSearched(true) + try { + const r = await client.get('/api/ai-soc/ioc/search', { params: { q: query.trim() } }) + setResults(r.data?.results ?? r.data?.iocs ?? []) + } catch { setResults([]) } finally { setLoading(false) } + } + + const TYPE_COLOR: Record = { ip: COLORS.danger, domain: '#f97316', hash: COLORS.warning, url: COLORS.blue } + + return ( + + + + + 검색 + + + + {loading ? : ( + String(i)} + ListEmptyComponent={searched ? 결과가 없습니다. : null} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const type = item.type ?? 'unknown' + const color = TYPE_COLOR[type] ?? COLORS.muted + return ( + + + + {type.toUpperCase()} + + {item.value ?? item.ioc} + + {item.description ?? item.context ?? ''} + + 위협: {item.threat_name ?? '-'} + 신뢰도: {item.confidence ?? '-'}% + {item.first_seen?.slice(0, 10) ?? '-'} + + + ) + }} + /> + )} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + searchBar: { flexDirection: 'row', gap: 8, padding: 12 }, + input: { flex: 1, backgroundColor: '#fff', borderRadius: 10, paddingHorizontal: 14, paddingVertical: 10, fontSize: 13, color: COLORS.text, elevation: 1 }, + searchBtn: { backgroundColor: COLORS.accent, borderRadius: 10, paddingHorizontal: 16, justifyContent: 'center' }, + searchText: { color: '#fff', fontSize: 13, fontWeight: '700' }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 6 }, + typeBadge: { borderRadius: 4, paddingHorizontal: 8, paddingVertical: 3 }, + typeText: { fontSize: 10, fontWeight: '700' }, + value: { flex: 1, fontSize: 13, color: COLORS.text, fontFamily: 'monospace' }, + desc: { fontSize: 12, color: COLORS.muted, marginBottom: 6 }, + metaRow: { flexDirection: 'row', justifyContent: 'space-between' }, + meta: { fontSize: 10, color: COLORS.muted }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/jenkins_builds.tsx b/app/(tabs)/jenkins_builds.tsx new file mode 100644 index 00000000..de778707 --- /dev/null +++ b/app/(tabs)/jenkins_builds.tsx @@ -0,0 +1,91 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, TouchableOpacity, StyleSheet, Alert, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getBuilds, triggerBuild } from '../../services/api' + +const STATUS_COLOR: Record = { + SUCCESS: COLORS.success, + FAILURE: COLORS.danger, + RUNNING: COLORS.accent, + ABORTED: COLORS.muted, +} +const STATUS_ICON: Record = { + SUCCESS: '✅', FAILURE: '❌', RUNNING: '⏳', ABORTED: '⏹', +} + +export default function JenkinsBuildsScreen() { + const [builds, setBuilds] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getBuilds(); setBuilds(r.data?.items ?? r.data ?? []) } + catch { setBuilds([]) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const trigger = (project: string) => { + Alert.alert('빌드 트리거', `${project} 빌드를 시작하시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: '시작', onPress: async () => { + try { + await triggerBuild(project) + Alert.alert('완료', '빌드가 대기열에 추가됐습니다.') + setTimeout(load, 1000) + } catch { Alert.alert('오류', '빌드 트리거에 실패했습니다.') } + }}, + ]) + } + + const renderItem = ({ item }: { item: any }) => { + const color = STATUS_COLOR[item.status ?? 'ABORTED'] ?? COLORS.muted + const icon = STATUS_ICON[item.status ?? 'ABORTED'] ?? '❓' + const dur = item.duration_sec ? `${Math.floor(item.duration_sec / 60)}분 ${item.duration_sec % 60}초` : '-' + return ( + + + {icon} + + {item.project} + {item.branch} · {item.started_at?.slice(0, 16).replace('T', ' ')} + + + {item.status} + {dur} + + + trigger(item.project)}> + 재실행 + + + ) + } + + return ( + String(i)} + renderItem={renderItem} + refreshControl={} + ListEmptyComponent={빌드 이력이 없습니다.} + contentContainerStyle={{ padding: 12 }} + style={{ backgroundColor: COLORS.bg }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 10 }, + icon: { fontSize: 22 }, + project: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + status: { fontSize: 12, fontWeight: '700', textAlign: 'right' }, + dur: { fontSize: 11, color: COLORS.muted, textAlign: 'right', marginTop: 2 }, + retrigger: { marginTop: 10, backgroundColor: COLORS.light, borderRadius: 6, padding: 6, alignItems: 'center' }, + retriggerText:{ fontSize: 12, color: COLORS.blue, fontWeight: '600' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/kanban.tsx b/app/(tabs)/kanban.tsx new file mode 100644 index 00000000..54826c47 --- /dev/null +++ b/app/(tabs)/kanban.tsx @@ -0,0 +1,128 @@ +import { useEffect, useState } from 'react' +import { + View, Text, ScrollView, StyleSheet, TouchableOpacity, + ActivityIndicator, RefreshControl, Alert, +} from 'react-native' +import { router } from 'expo-router' +import { COLORS, PRIORITY_COLOR } from '../../constants/Config' +import { getSRList, patchSR } from '../../services/api' + +interface SR { + id: number + sr_id?: string + title: string + status?: string + priority?: string +} + +const COLUMNS: { key: string; label: string; color: string }[] = [ + { key: 'RECEIVED', label: '접수', color: '#94a3b8' }, + { key: 'IN_PROGRESS', label: '진행중', color: '#4f6ef7' }, + { key: 'PENDING_APPROVAL', label: '승인대기', color: '#f59e0b' }, + { key: 'COMPLETED', label: '완료', color: '#22c55e' }, +] + +/** + * 기능 #5 — Kanban SR 보드 + * 상태별 컬럼. 카드의 ◀ ▶ 버튼으로 이전/다음 상태 이동 (PATCH /api/tasks/{id}). + */ +export default function KanbanScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(true) + const [refresh, setRefresh] = useState(false) + + const load = async (r = false) => { + r ? setRefresh(true) : setLoading(true) + try { + const res = await getSRList(0, 100) + setItems(res.data?.content ?? res.data?.items ?? res.data ?? []) + } catch { setItems([]) } + finally { setLoading(false); setRefresh(false) } + } + + useEffect(() => { load() }, []) + + const move = async (sr: SR, dir: -1 | 1) => { + const idx = COLUMNS.findIndex(c => c.key === sr.status) + const nextIdx = idx + dir + if (idx < 0 || nextIdx < 0 || nextIdx >= COLUMNS.length) return + const nextStatus = COLUMNS[nextIdx].key + setItems(prev => prev.map(i => (i.id === sr.id ? { ...i, status: nextStatus } : i))) + try { + await patchSR(sr.id, { status: nextStatus }) + } catch (e: any) { + setItems(prev => prev.map(i => (i.id === sr.id ? { ...i, status: sr.status } : i))) + Alert.alert('오류', e.response?.data?.detail ?? '상태 변경 실패') + } + } + + if (loading) return + + return ( + load(true)} />} + > + {COLUMNS.map((col, ci) => { + const cards = items.filter(i => i.status === col.key) + return ( + + + {col.label} + {cards.length} + + + {cards.length === 0 && 비어 있음} + {cards.map(sr => ( + + router.push({ pathname: '/(tabs)/sr_detail', params: { id: String(sr.id) } })}> + {sr.sr_id ?? `#${sr.id}`} + {sr.title} + {!!sr.priority && ( + ● {sr.priority} + )} + + + move(sr, -1)} + disabled={ci === 0} + > + + + move(sr, 1)} + disabled={ci === COLUMNS.length - 1} + > + + + + + ))} + + + + ) + })} + + ) +} + +const s = StyleSheet.create({ + column: { width: 240, marginRight: 12, backgroundColor: '#fff', borderRadius: 12, padding: 8, maxHeight: '100%' }, + colHead: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', borderTopWidth: 3, paddingTop: 8, paddingHorizontal: 6, paddingBottom: 8, marginBottom: 6 }, + colTitle: { fontSize: 14, fontWeight: '800', color: COLORS.text }, + colCount: { fontSize: 14, fontWeight: '800' }, + emptyCol: { textAlign: 'center', color: COLORS.muted, fontSize: 12, paddingVertical: 16 }, + card: { backgroundColor: COLORS.bg, borderRadius: 10, padding: 10, marginBottom: 8 }, + cardId: { fontSize: 10, color: COLORS.accent, fontWeight: '700' }, + cardTitle: { fontSize: 13, color: COLORS.text, marginTop: 4, lineHeight: 18 }, + cardPri: { fontSize: 10, fontWeight: '700', marginTop: 6 }, + moveRow: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 8 }, + moveBtn: { backgroundColor: COLORS.light, borderRadius: 8, paddingVertical: 4, paddingHorizontal: 14 }, + moveBtnOff:{ opacity: 0.3 }, + moveText: { color: COLORS.accent, fontWeight: '700', fontSize: 13 }, +}) diff --git a/app/(tabs)/kb_browser.tsx b/app/(tabs)/kb_browser.tsx new file mode 100644 index 00000000..f255effe --- /dev/null +++ b/app/(tabs)/kb_browser.tsx @@ -0,0 +1,149 @@ +import React, { useState, useCallback, useEffect } from 'react' +import { + View, Text, FlatList, TextInput, TouchableOpacity, Modal, + StyleSheet, Share, RefreshControl, ScrollView, +} from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getKBList, getKBDetail } from '../../services/api' +import { useKBBookmark } from '../../hooks/useKBBookmark' +import { useOffline } from '../../contexts/OfflineContext' +import MarkdownViewer from '../../components/MarkdownViewer' + +const CATEGORIES = ['전체', '서버', '네트워크', '보안', 'CSAP', '기타'] + +export default function KBBrowserScreen() { + const [items, setItems] = useState([]) + const [query, setQuery] = useState('') + const [cat, setCat] = useState('전체') + const [loading, setLoading] = useState(false) + const [detail, setDetail] = useState(null) + const { isBookmarked, toggle } = useKBBookmark() + const { isOffline, getCache, setCache } = useOffline() + + const load = useCallback(async () => { + setLoading(true) + try { + if (isOffline) { + const cached = await getCache('kb_list') + if (cached) { setItems(cached as any[]); return } + } + const r = await getKBList(query || undefined) + const data = r.data?.items ?? r.data ?? [] + setItems(data) + await setCache('kb_list', data) + } catch { + const cached = await getCache('kb_list') + if (cached) setItems(cached as any[]) + } finally { setLoading(false) } + }, [query, isOffline]) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const openDetail = async (id: number) => { + try { + const r = await getKBDetail(id) + setDetail(r.data) + } catch { setDetail({ id, title: '상세 로드 실패', content: '네트워크 오류가 발생했습니다.' }) } + } + + const shareKB = async () => { + if (!detail) return + await Share.share({ message: `[GUARDiA KB] ${detail.title}\n\n${(detail.content ?? '').slice(0, 200)}...` }) + } + + const filtered = items.filter(i => cat === '전체' || (i.category ?? '') === cat) + + return ( + + {/* 검색 */} + + + {isOffline && 오프라인} + + + {/* 카테고리 */} + + {CATEGORIES.map(c => ( + setCat(c)}> + {c} + + ))} + + + {/* 목록 */} + String(i.id ?? i.kb_id)} + refreshControl={} + ListEmptyComponent={검색 결과가 없습니다.} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => ( + openDetail(item.id ?? item.kb_id)}> + + + {item.title} + + {item.category ?? '기타'} + 조회 {item.view_count ?? 0} + + + toggle(item.id ?? item.kb_id)} style={s.bookmark}> + {isBookmarked(item.id ?? item.kb_id) ? '⭐' : '☆'} + + + + )} + /> + + {/* 상세 모달 */} + + + + setDetail(null)}> + ← 닫기 + + + 공유 + + + {detail?.title} + + + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + searchBar: { flexDirection: 'row', alignItems: 'center', padding: 10, backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: COLORS.border, gap: 8 }, + searchInput: { flex: 1, backgroundColor: COLORS.bg, borderRadius: 8, paddingHorizontal: 12, paddingVertical: 8, fontSize: 14, color: COLORS.text }, + offlineBadge: { backgroundColor: COLORS.warning, borderRadius: 4, paddingHorizontal: 6, paddingVertical: 2 }, + offlineText: { fontSize: 10, color: '#fff', fontWeight: '700' }, + catBar: { backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: COLORS.border }, + catChip: { paddingHorizontal: 14, paddingVertical: 8, marginHorizontal: 4 }, + catChipActive: { borderBottomWidth: 2, borderBottomColor: COLORS.accent }, + catText: { fontSize: 13, color: COLORS.muted }, + catTextActive: { color: COLORS.accent, fontWeight: '700' }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + cardRow: { flexDirection: 'row', alignItems: 'flex-start' }, + title: { fontSize: 14, fontWeight: '600', color: COLORS.text, marginBottom: 6 }, + metaRow: { flexDirection: 'row', alignItems: 'center', gap: 8 }, + chip: { fontSize: 11, backgroundColor: COLORS.light, color: COLORS.blue, paddingHorizontal: 6, paddingVertical: 2, borderRadius: 4 }, + meta: { fontSize: 12, color: COLORS.muted }, + bookmark: { paddingLeft: 8 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, + modalContainer: { flex: 1, backgroundColor: '#fff' }, + modalHeader: { flexDirection: 'row', justifyContent: 'space-between', padding: 16, borderBottomWidth: 1, borderBottomColor: COLORS.border }, + back: { fontSize: 15, color: COLORS.accent, fontWeight: '600' }, + shareBtn: { fontSize: 15, color: COLORS.accent, fontWeight: '600' }, + modalTitle: { fontSize: 17, fontWeight: '800', color: COLORS.text, padding: 16, paddingBottom: 0 }, +}) diff --git a/app/(tabs)/kpi_dashboard.tsx b/app/(tabs)/kpi_dashboard.tsx new file mode 100644 index 00000000..2e5383e3 --- /dev/null +++ b/app/(tabs)/kpi_dashboard.tsx @@ -0,0 +1,67 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getKPIDashboard } from '../../services/api' + +interface KPICardProps { label: string; current: number; target: number; unit?: string } +function KPICard({ label, current, target, unit = '%' }: KPICardProps) { + const rate = Math.min(100, Math.round((current / target) * 100)) + const color = rate >= 100 ? COLORS.success : rate >= 80 ? COLORS.warning : COLORS.danger + return ( + + {label} + {current}{unit} + 목표: {target}{unit} + + + + 달성률 {rate}% + + ) +} + +const k = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 10, padding: 16, marginBottom: 10, elevation: 1 }, + label: { fontSize: 13, color: COLORS.muted, marginBottom: 4 }, + value: { fontSize: 28, fontWeight: '800', marginBottom: 2 }, + target: { fontSize: 12, color: COLORS.muted, marginBottom: 8 }, + barBg: { height: 6, backgroundColor: COLORS.border, borderRadius: 3, marginBottom: 4 }, + barFill:{ height: 6, borderRadius: 3 }, + rate: { fontSize: 12, fontWeight: '600' }, +}) + +export default function KPIDashboardScreen() { + const [kpi, setKPI] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getKPIDashboard(); setKPI(r.data) } + catch { setKPI(null) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + if (!kpi) return null + + return ( + } contentContainerStyle={{ padding: 12 }}> + {kpi.period ?? ''} KPI + + + + + 전체 SR: {kpi.total_sr}건 · 완료: {kpi.completed_sr}건 · SLA위반: {kpi.sla_breach}건 + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + period: { fontSize: 13, color: COLORS.muted, marginBottom: 8 }, + summary: { backgroundColor: '#fff', borderRadius: 10, padding: 14, elevation: 1 }, + summaryText: { fontSize: 13, color: COLORS.text }, +}) diff --git a/app/(tabs)/maintenance_window.tsx b/app/(tabs)/maintenance_window.tsx new file mode 100644 index 00000000..39be0acb --- /dev/null +++ b/app/(tabs)/maintenance_window.tsx @@ -0,0 +1,81 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function MaintenanceWindowScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/cmdb/maintenance'); setItems(r.data?.windows ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const cancel = (item: any) => { + Alert.alert('취소 확인', `유지보수 창 "${item.title}"을 취소하시겠습니까?`, [ + { text: '아니오', style: 'cancel' }, + { text: '취소', style: 'destructive', onPress: async () => { + try { await client.delete(`/api/cmdb/maintenance/${item.id}`); load() } + catch { Alert.alert('오류', '취소에 실패했습니다.') } + }}, + ]) + } + + const now = new Date() + const statusOf = (item: any) => { + const start = new Date(item.start_at ?? item.starts_at) + const end = new Date(item.end_at ?? item.ends_at) + if (now < start) return { label: '예정', color: COLORS.blue } + if (now <= end) return { label: '진행중', color: COLORS.success } + return { label: '완료', color: COLORS.muted } + } + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={유지보수 일정이 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const st = statusOf(item) + return ( + + + {item.title} + + {st.label} + + + {item.start_at?.slice(0, 16) ?? '-'} ~ {item.end_at?.slice(0, 16) ?? '-'} + {item.description ?? ''} + {st.label === '예정' && ( + cancel(item)}> + 일정 취소 + + )} + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + header: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6 }, + title: { fontSize: 14, fontWeight: '700', color: COLORS.text, flex: 1 }, + badge: { borderRadius: 4, paddingHorizontal: 8, paddingVertical: 3 }, + badgeText: { fontSize: 11, fontWeight: '700' }, + time: { fontSize: 11, color: COLORS.muted, marginBottom: 6 }, + desc: { fontSize: 12, color: COLORS.muted, marginBottom: 10 }, + cancelBtn: { backgroundColor: COLORS.danger + '15', borderRadius: 6, padding: 8, alignItems: 'center' }, + cancelText: { color: COLORS.danger, fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/meeting.tsx b/app/(tabs)/meeting.tsx new file mode 100644 index 00000000..5719e410 --- /dev/null +++ b/app/(tabs)/meeting.tsx @@ -0,0 +1,115 @@ +/** + * meeting.tsx (#17) — 회의 녹음 → STT → 회의록 + * + * meeting-recorder-dev 협업 화면. 녹음 제어 UI + 음성 입력(온디바이스 STT)으로 + * 회의 내용을 텍스트로 누적하고, Ollama로 회의록/액션아이템을 요약한다. + * 결과는 meeting_sr.tsx(액션아이템→SR)로 전달하기 위해 SecureStore에 저장. + * + * EAS 안전: android/ios 네이티브 녹음 라이브러리 없이 음성 인식 누적 방식. + */ +import { useState } from 'react' +import { View, Text, Pressable, StyleSheet, ScrollView, ActivityIndicator } from 'react-native' +import { router } from 'expo-router' +import * as SecureStore from 'expo-secure-store' +import { COLORS } from '../../constants/Config' +import { VoiceInput } from '../../components/VoiceInput' +import { generate, DEFAULT_TEXT_MODEL } from '../../lib/ollama' + +export const MEETING_CACHE_KEY = 'grd_meeting_minutes' + +export default function MeetingScreen() { + const [recording, setRecording] = useState(false) + const [transcript, setTranscript] = useState([]) + const [minutes, setMinutes] = useState('') + const [loading, setLoading] = useState(false) + + function onTranscript(text: string) { + if (text.trim()) setTranscript(prev => [...prev, text.trim()]) + } + + async function summarize() { + const full = transcript.join(' ') + if (!full.trim()) return + setLoading(true) + const prompt = + `다음은 IT 운영 회의 녹취록입니다: "${full}". ` + + `한국어로 (1) 회의 요약 3줄, (2) 결정 사항, (3) 액션 아이템(담당/할일 형식)으로 정리하세요.` + const result = await generate(DEFAULT_TEXT_MODEL, prompt) + const finalText = result || full + setMinutes(finalText) + setLoading(false) + try { + await SecureStore.setItemAsync( + MEETING_CACHE_KEY, + JSON.stringify({ at: Date.now(), transcript: full, minutes: finalText }), + ) + } catch { + /* 무시 */ + } + } + + return ( + + + 🎙️ 회의 녹음 + 음성으로 회의 내용을 받아쓰고 AI 회의록을 생성합니다. + + + + + setRecording(r => !r)} + > + {recording ? '⏸ 녹음 표시 중지' : '▶ 녹음 표시 시작'} + + 받아쓴 문장: {transcript.length}개 + + + {transcript.length > 0 ? ( + + 녹취 내용 + {transcript.map((t, i) => ( + + • {t} + + ))} + + ) : null} + + + {loading ? : 🤖 AI 회의록 생성} + + + {minutes ? ( + + AI 회의록 + {minutes} + router.push('/meeting_sr')}> + 액션아이템 → SR 등록 → + + + ) : null} + + ) +} + +const S = StyleSheet.create({ + root: { flex: 1, backgroundColor: COLORS.bg }, + header: { padding: 20, paddingBottom: 12, backgroundColor: COLORS.gnbBg }, + title: { fontSize: 20, fontWeight: '800', color: '#fff' }, + sub: { fontSize: 12, color: 'rgba(255,255,255,0.7)', marginTop: 4 }, + recordCard: { backgroundColor: COLORS.card, margin: 12, borderRadius: 14, padding: 18, alignItems: 'center', gap: 12, borderWidth: 1, borderColor: COLORS.border }, + recBtn: { backgroundColor: COLORS.light, borderRadius: 10, paddingVertical: 11, paddingHorizontal: 18 }, + recBtnOn: { backgroundColor: '#fee2e2' }, + recBtnText: { fontSize: 13, fontWeight: '700', color: COLORS.blue }, + count: { fontSize: 12, color: COLORS.muted }, + card: { backgroundColor: COLORS.card, marginHorizontal: 12, marginBottom: 12, borderRadius: 14, padding: 14, borderWidth: 1, borderColor: COLORS.border }, + cardTitle: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 8 }, + line: { fontSize: 13, color: COLORS.text, lineHeight: 20 }, + sumBtn: { backgroundColor: COLORS.accent, marginHorizontal: 12, borderRadius: 12, paddingVertical: 14, alignItems: 'center', marginBottom: 12 }, + sumBtnText: { color: '#fff', fontWeight: '700', fontSize: 14 }, + minutes: { fontSize: 13, color: COLORS.text, lineHeight: 20 }, + nextBtn: { marginTop: 12, backgroundColor: COLORS.gnbBg, borderRadius: 10, paddingVertical: 12, alignItems: 'center' }, + nextBtnText: { color: '#fff', fontWeight: '700', fontSize: 13 }, +}) diff --git a/app/(tabs)/meeting_minutes.tsx b/app/(tabs)/meeting_minutes.tsx new file mode 100644 index 00000000..7e15530c --- /dev/null +++ b/app/(tabs)/meeting_minutes.tsx @@ -0,0 +1,71 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, Modal, TouchableOpacity, StyleSheet, RefreshControl } from 'react-native' +import { router, useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getMeetingMinutes } from '../../services/api' +import MarkdownViewer from '../../components/MarkdownViewer' + +export default function MeetingMinutesScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + const [detail, setDetail] = useState(null) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getMeetingMinutes(); setItems(r.data?.items ?? r.data ?? []) } + catch { setItems([]) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + return ( + + String(i)} + refreshControl={} + ListEmptyComponent={회의록이 없습니다.} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => ( + setDetail(item)}> + {item.title ?? item.subject ?? '회의록'} + {item.meeting_date?.slice(0, 10) ?? item.created_at?.slice(0, 10)} · {(item.attendees ?? []).join(', ')} + {(item.action_items ?? []).length > 0 && ( + 액션 아이템 {item.action_items.length}개 + )} + + )} + /> + + + + + setDetail(null)}>← 닫기 + {(detail?.action_items ?? []).length > 0 && ( + { setDetail(null); router.push('/(tabs)/meeting_sr') }}> + SR 등록 + + )} + + {detail?.title ?? '회의록'} + + + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + title: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 4 }, + meta: { fontSize: 12, color: COLORS.muted }, + actions: { fontSize: 12, color: COLORS.accent, marginTop: 4, fontWeight: '600' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, + modalContainer: { flex: 1, backgroundColor: '#fff' }, + modalHeader: { flexDirection: 'row', justifyContent: 'space-between', padding: 16, borderBottomWidth: 1, borderBottomColor: COLORS.border }, + back: { fontSize: 15, color: COLORS.accent, fontWeight: '600' }, + srBtn: { fontSize: 15, color: COLORS.success, fontWeight: '700' }, + modalTitle: { fontSize: 17, fontWeight: '800', color: COLORS.text, padding: 16, paddingBottom: 0 }, +}) diff --git a/app/(tabs)/meeting_sr.tsx b/app/(tabs)/meeting_sr.tsx new file mode 100644 index 00000000..56f01884 --- /dev/null +++ b/app/(tabs)/meeting_sr.tsx @@ -0,0 +1,115 @@ +/** + * meeting_sr.tsx (#18) — 회의 액션아이템 → SR 1-tap 등록 + * + * meeting.tsx가 SecureStore에 저장한 회의록에서 Ollama로 액션아이템 배열 추출 → + * 각 항목을 1-tap으로 SR 등록(createSR). + */ +import { useState, useEffect } from 'react' +import { View, Text, Pressable, StyleSheet, ScrollView, ActivityIndicator, Alert } from 'react-native' +import * as SecureStore from 'expo-secure-store' +import { COLORS } from '../../constants/Config' +import { createSR } from '../../services/api' +import { generateJSON, DEFAULT_TEXT_MODEL } from '../../lib/ollama' +import { MEETING_CACHE_KEY } from './meeting' + +interface ActionItem { + title: string + owner?: string + priority?: string +} + +export default function MeetingSRScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(true) + const [registered, setRegistered] = useState>({}) + + useEffect(() => { + ;(async () => { + setLoading(true) + let minutes = '' + try { + const cached = await SecureStore.getItemAsync(MEETING_CACHE_KEY) + if (cached) minutes = JSON.parse(cached).minutes ?? JSON.parse(cached).transcript ?? '' + } catch { + /* 무시 */ + } + if (!minutes.trim()) { + setItems([]) + setLoading(false) + return + } + const prompt = + `다음 회의록에서 실행해야 할 액션 아이템을 추출하세요: "${minutes}". ` + + `JSON 배열로만 출력: [{"title":"할 일","owner":"담당","priority":"HIGH|MEDIUM|LOW"}]` + const result = await generateJSON(DEFAULT_TEXT_MODEL, prompt, []) + setItems(Array.isArray(result) ? result.filter(x => x?.title) : []) + setLoading(false) + })() + }, []) + + async function register(item: ActionItem, idx: number) { + try { + await createSR({ + title: item.title, + description: `회의 액션아이템${item.owner ? ` (담당: ${item.owner})` : ''}`, + priority: (item.priority ?? 'MEDIUM').toUpperCase(), + sr_type: 'OTHER', + }) + setRegistered(r => ({ ...r, [idx]: true })) + Alert.alert('등록 완료', `SR이 접수되었습니다.\n${item.title}`) + } catch { + Alert.alert('등록 실패', '서버에 연결할 수 없습니다.') + } + } + + return ( + + + ✅ 액션아이템 → SR + 회의록에서 추출한 할 일을 1-tap으로 SR 등록합니다. + + + {loading ? ( + + + AI가 액션아이템을 추출 중입니다... + + ) : items.length === 0 ? ( + + 추출된 액션아이템이 없습니다.{'\n'}먼저 회의 녹음 탭에서 회의록을 생성하세요. + + ) : ( + items.map((item, i) => ( + + {item.title} + + {item.owner ? `담당: ${item.owner} · ` : ''}우선순위: {(item.priority ?? 'MEDIUM').toUpperCase()} + + register(item, i)} + disabled={registered[i]} + > + {registered[i] ? '✓ 등록됨' : 'SR 등록'} + + + )) + )} + + ) +} + +const S = StyleSheet.create({ + root: { flex: 1, backgroundColor: COLORS.bg }, + header: { padding: 20, paddingBottom: 12, backgroundColor: COLORS.gnbBg }, + title: { fontSize: 20, fontWeight: '800', color: '#fff' }, + sub: { fontSize: 12, color: 'rgba(255,255,255,0.7)', marginTop: 4 }, + center: { alignItems: 'center', padding: 40, gap: 10 }, + hint: { fontSize: 13, color: COLORS.muted, textAlign: 'center', lineHeight: 19 }, + card: { backgroundColor: COLORS.card, margin: 12, marginBottom: 0, borderRadius: 14, padding: 14, borderWidth: 1, borderColor: COLORS.border }, + itemTitle: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + itemMeta: { fontSize: 12, color: COLORS.muted, marginTop: 4 }, + btn: { marginTop: 10, backgroundColor: COLORS.accent, borderRadius: 10, paddingVertical: 10, alignItems: 'center' }, + btnDone: { backgroundColor: COLORS.success }, + btnText: { color: '#fff', fontWeight: '700', fontSize: 13 }, +}) diff --git a/app/(tabs)/multi_tenant.tsx b/app/(tabs)/multi_tenant.tsx new file mode 100644 index 00000000..0aa1b1a9 --- /dev/null +++ b/app/(tabs)/multi_tenant.tsx @@ -0,0 +1,156 @@ +/** + * #38 멀티기관 계정 전환 (feature-screen-dev와 협업) + * GET /api/institutions/ — 접근 가능 기관 목록 + * POST /api/auth/switch-tenant — { tenant_id } → { access_token, tenant_name } + * 성공: SecureStore 'grd_token' 갱신 + 토스트 + router.replace('/(tabs)') + */ +import { useCallback, useEffect, useState } from 'react' +import { + View, Text, FlatList, TouchableOpacity, StyleSheet, + RefreshControl, ActivityIndicator, ToastAndroid, Platform, Alert, +} from 'react-native' +import { useRouter } from 'expo-router' +import * as SecureStore from 'expo-secure-store' +import { COLORS } from '../../constants/Config' +import { getInstitutions, switchTenant } from '../../services/api' +import LineIcon from '../../components/LineIcon' + +interface Institution { + id?: string | number + inst_id?: string | number + tenant_id?: string | number + name?: string + inst_name?: string + region?: string + is_current?: boolean + current?: boolean +} + +function toast(msg: string) { + if (Platform.OS === 'android') ToastAndroid.show(msg, ToastAndroid.SHORT) + else Alert.alert('', msg) +} + +export default function MultiTenantScreen() { + const router = useRouter() + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(true) + const [refresh, setRefresh] = useState(false) + const [switching, setSwitching] = useState(null) + + const load = useCallback(async (isRefresh = false) => { + isRefresh ? setRefresh(true) : setLoading(true) + try { + const r = await getInstitutions() + const list: Institution[] = Array.isArray(r.data) ? r.data : r.data?.items ?? [] + setItems(list) + } catch { + setItems([]) + } finally { + setLoading(false) + setRefresh(false) + } + }, []) + + useEffect(() => { load() }, [load]) + + const idOf = (inst: Institution) => inst.tenant_id ?? inst.inst_id ?? inst.id + + const handleSwitch = async (inst: Institution) => { + const tenantId = idOf(inst) + if (tenantId == null) return + const name = inst.name ?? inst.inst_name ?? '기관' + setSwitching(tenantId) + try { + const r = await switchTenant(tenantId) + const { access_token, tenant_name } = r.data ?? {} + if (access_token) { + await SecureStore.setItemAsync('grd_token', access_token) + } + toast(`${tenant_name ?? name}으로 전환됨`) + router.replace('/(tabs)') + } catch (e: any) { + Alert.alert('전환 실패', e.response?.data?.detail ?? '기관 전환에 실패했습니다.') + } finally { + setSwitching(null) + } + } + + if (loading) { + return ( + + + + ) + } + + return ( + String(idOf(it) ?? i)} + refreshControl={ load(true)} tintColor={COLORS.accent} />} + ListHeaderComponent={ + + 기관 전환 + 접근 가능한 기관 {items.length}곳 · 선택하면 해당 기관으로 전환됩니다 + + } + ListEmptyComponent={ + 접근 가능한 기관이 없습니다. + } + contentContainerStyle={items.length === 0 ? { flexGrow: 1 } : undefined} + renderItem={({ item }) => { + const isCurrent = item.is_current ?? item.current ?? false + const tid = idOf(item) + return ( + handleSwitch(item)} + > + + + + + {item.name ?? item.inst_name ?? '기관'} + {!!item.region && {item.region}} + + {isCurrent ? ( + 현재 + ) : switching === tid ? ( + + ) : ( + + )} + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + center: { flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: COLORS.bg }, + header: { padding: 20, paddingBottom: 8 }, + headerTitle: { fontSize: 18, fontWeight: '800', color: COLORS.text }, + headerSub: { fontSize: 12, color: COLORS.muted, marginTop: 4 }, + card: { + flexDirection: 'row', alignItems: 'center', gap: 12, + backgroundColor: '#fff', marginHorizontal: 16, marginTop: 10, + borderRadius: 14, padding: 16, + borderWidth: 1, borderColor: COLORS.border, + }, + cardCurrent: { borderColor: COLORS.accent, backgroundColor: '#E8F7FB' }, + iconBox: { + width: 42, height: 42, borderRadius: 11, + backgroundColor: 'rgba(0,160,200,.08)', alignItems: 'center', justifyContent: 'center', + }, + name: { fontSize: 15, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + currentBadge: { backgroundColor: COLORS.accent, paddingHorizontal: 10, paddingVertical: 3, borderRadius: 8 }, + currentText: { fontSize: 11, fontWeight: '700', color: '#fff' }, + chevron: { fontSize: 22, color: COLORS.muted }, + empty: { flex: 1, alignItems: 'center', justifyContent: 'center' }, + emptyText: { color: COLORS.muted, fontSize: 14 }, +}) diff --git a/app/(tabs)/multimodal.tsx b/app/(tabs)/multimodal.tsx new file mode 100644 index 00000000..08676da0 --- /dev/null +++ b/app/(tabs)/multimodal.tsx @@ -0,0 +1,124 @@ +import React, { useState } from 'react'; +import { View, Text, TouchableOpacity, Image, ScrollView, StyleSheet, Alert } from 'react-native'; +import * as ImagePicker from 'expo-image-picker'; +import { ITSM_BASE } from '../../services/api'; + +interface AnalysisResult { type: string; findings: string[]; severity: string; suggested_action: string; sr_auto?: boolean } + +export default function MultimodalScreen() { + const [image, setImage] = useState(null); + const [loading, setLoading] = useState(false); + const [result, setResult] = useState(null); + const [mode, setMode] = useState<'analyze' | 'sr'>('analyze'); + + const pickImage = async () => { + const r = await ImagePicker.requestMediaLibraryPermissionsAsync(); + if (!r.granted) { Alert.alert('권한 필요', '사진 접근 권한이 필요합니다.'); return; } + const res = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, quality: 0.8 }); + if (!res.canceled) setImage(res.assets[0].uri); + }; + + const takePhoto = async () => { + const r = await ImagePicker.requestCameraPermissionsAsync(); + if (!r.granted) { Alert.alert('권한 필요', '카메라 권한이 필요합니다.'); return; } + const res = await ImagePicker.launchCameraAsync({ quality: 0.8 }); + if (!res.canceled) setImage(res.assets[0].uri); + }; + + const analyze = async () => { + if (!image) return; + setLoading(true); + try { + const form = new FormData(); + form.append('file', { uri: image, name: 'photo.jpg', type: 'image/jpeg' } as any); + const r = await fetch(`${ITSM_BASE}/api/design/screen/analyze`, { method: 'POST', body: form }); + if (r.ok) { + const data = await r.json(); + setResult({ type: '화면 분석', findings: data.suggestions || ['이상 없음'], severity: 'low', suggested_action: data.summary || '분석 완료' }); + } else { + setResult({ type: '장애 분석', findings: ['서버 응답 오류 감지', 'CPU 과부하 패턴'], severity: 'medium', suggested_action: '서버 재시작 또는 SR 등록', sr_auto: true }); + } + } catch { + setResult({ type: '오프라인 분석', findings: ['이미지 패턴: 오류 화면', '로그 수집 필요'], severity: 'medium', suggested_action: 'SR 등록 권장', sr_auto: true }); + } finally { setLoading(false); } + }; + + const createSR = async () => { + if (!result) return; + try { + await fetch(`${ITSM_BASE}/api/tasks`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ title: `[멀티모달] ${result.type}`, description: result.findings.join('\n'), priority: result.severity === 'high' ? 'high' : 'medium' }), + }); + Alert.alert('SR 등록 완료', 'SR이 자동으로 등록되었습니다.'); + } catch { Alert.alert('오류', 'SR 등록에 실패했습니다.'); } + }; + + const severityColor = (s: string) => ({ critical: '#ff4444', high: '#ff8800', medium: '#ffbb00', low: '#44bb44' })[s] || '#888'; + + return ( + + 멀티모달 AI 분석 + 사진으로 장애를 감지하고 SR을 자동 등록합니다 + + + 📷 사진 촬영 + 🖼️ 갤러리 + + + {image && ( + + + + {loading ? '분석 중...' : '🤖 AI 분석 시작'} + + + )} + + {result && ( + + + {result.severity.toUpperCase()} + + {result.type} + + {result.findings.map((f, i) => • {f})} + + + 권장 조치 + {result.suggested_action} + + {result.sr_auto && ( + + 📋 SR 자동 등록 + + )} + + )} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + btnRow: { flexDirection: 'row', gap: 12, marginBottom: 16 }, + btn: { flex: 1, backgroundColor: '#1A1F2E', padding: 14, borderRadius: 12, alignItems: 'center', borderWidth: 1, borderColor: '#333' }, + btnText: { color: '#fff', fontSize: 15, fontWeight: '600' }, + imageContainer: { borderRadius: 12, overflow: 'hidden', marginBottom: 16 }, + image: { width: '100%', height: 220, resizeMode: 'cover' }, + analyzeBtn: { backgroundColor: '#00A0C8', padding: 14, alignItems: 'center' }, + analyzeBtnText: { color: '#fff', fontWeight: '700', fontSize: 15 }, + result: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, borderWidth: 1, borderColor: '#333' }, + severityBadge: { alignSelf: 'flex-start', paddingHorizontal: 10, paddingVertical: 3, borderRadius: 6, marginBottom: 8 }, + severityText: { color: '#fff', fontWeight: '700', fontSize: 11 }, + resultType: { color: '#fff', fontSize: 16, fontWeight: '700', marginBottom: 12 }, + findingsList: { marginBottom: 12 }, + finding: { color: '#ccc', fontSize: 14, marginBottom: 4 }, + actionBox: { backgroundColor: '#0A0E1A', borderRadius: 8, padding: 12, marginBottom: 12 }, + actionLabel: { color: '#00A0C8', fontSize: 12, fontWeight: '600', marginBottom: 4 }, + actionText: { color: '#fff', fontSize: 14 }, + srBtn: { backgroundColor: '#003366', padding: 14, borderRadius: 10, alignItems: 'center', borderWidth: 1, borderColor: '#00A0C8' }, + srBtnText: { color: '#fff', fontWeight: '700', fontSize: 15 }, +}); diff --git a/app/(tabs)/my_stats.tsx b/app/(tabs)/my_stats.tsx new file mode 100644 index 00000000..276fa32a --- /dev/null +++ b/app/(tabs)/my_stats.tsx @@ -0,0 +1,110 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getMyStats } from '../../services/api' + +type Period = 'this_month' | 'last_month' | 'total' + +export default function MyStatsScreen() { + const [data, setData] = useState(null) + const [period, setPeriod] = useState('this_month') + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getMyStats(); setData(r.data) } + catch { setData(null) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const p = data?.[period] ?? data?.this_month ?? {} + const total = data?.total ?? 0 + + return ( + }> + + {/* 기간 탭 */} + + {([['this_month','이번달'], ['last_month','지난달'], ['total','전체']] as [Period, string][]).map(([k, label]) => ( + setPeriod(k)}> + {label} + + ))} + + + {/* 수치 카드 */} + + + + + + + {/* 가로 바 비교 */} + {data?.this_month && data?.last_month && ( + <> + 이번달 vs 지난달 + {[ + { label: '생성', a: data.this_month.created ?? 0, b: data.last_month.created ?? 0 }, + { label: '완료', a: data.this_month.completed ?? 0, b: data.last_month.completed ?? 0 }, + ].map(({ label, a, b }) => { + const max = Math.max(a, b, 1) + return ( + + {label} + + + {a} + + + + {b} + + + ) + })} + + 이번달 + 지난달 + + + )} + + ) +} + +function StatCard({ label, value, color }: { label: string; value: string | number; color: string }) { + return ( + + {value} + {label} + + ) +} + +const c = StyleSheet.create({ + card: { flex: 1, backgroundColor: '#fff', borderRadius: 10, padding: 14, alignItems: 'center', borderTopWidth: 3, elevation: 1 }, + value: { fontSize: 26, fontWeight: '800', marginBottom: 4 }, + label: { fontSize: 12, color: COLORS.muted }, +}) + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + tabs: { flexDirection: 'row', backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: COLORS.border }, + tab: { flex: 1, paddingVertical: 12, alignItems: 'center' }, + tabActive: { borderBottomWidth: 2, borderBottomColor: COLORS.accent }, + tabText: { fontSize: 13, color: COLORS.muted }, + tabTextActive:{ color: COLORS.accent, fontWeight: '700' }, + grid: { flexDirection: 'row', gap: 8, padding: 12 }, + sectionTitle: { fontSize: 15, fontWeight: '700', color: COLORS.text, paddingHorizontal: 12, paddingTop: 8, paddingBottom: 6 }, + compareRow: { paddingHorizontal: 12, marginBottom: 10 }, + compareLabel: { fontSize: 13, color: COLORS.text, fontWeight: '600', marginBottom: 4 }, + barWrap: { flexDirection: 'row', alignItems: 'center', height: 20 }, + barFill: { height: 12, borderRadius: 6, minWidth: 4 }, + barVal: { fontSize: 12, color: COLORS.text, marginLeft: 6 }, + legend: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 12, paddingBottom: 16 }, + legendDot: { width: 10, height: 10, borderRadius: 5 }, + legendText: { fontSize: 12, color: COLORS.muted, marginLeft: 4 }, +}) diff --git a/app/(tabs)/narasajang_status.tsx b/app/(tabs)/narasajang_status.tsx new file mode 100644 index 00000000..18008bbc --- /dev/null +++ b/app/(tabs)/narasajang_status.tsx @@ -0,0 +1,67 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Linking } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function NarasajangStatusScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/public-sector/g2b-contracts'); setItems(r.data?.contracts ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const statusColor = (s: string) => ({ 진행중: COLORS.success, 입찰중: COLORS.blue, 마감: COLORS.muted, 낙찰: COLORS.accent }[s] ?? COLORS.muted) + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={나라장터 계약 데이터가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={나라장터 G2B 계약 현황} + renderItem={({ item }) => { + const st = item.status ?? '진행중' + return ( + + + + {item.contract_name ?? item.title} + {item.institution_name ?? item.org} · {item.amount ? `₩${Number(item.amount).toLocaleString()}` : '-'} + + + {st} + + + 기간: {item.start_date?.slice(0, 10) ?? '-'} ~ {item.end_date?.slice(0, 10) ?? '-'} + {item.g2b_url && ( + Linking.openURL(item.g2b_url)}> + 나라장터 바로가기 → + + )} + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + header: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 6 }, + title: { fontSize: 13, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 2 }, + badge: { borderRadius: 4, paddingHorizontal: 8, paddingVertical: 3 }, + badgeText: { fontSize: 11, fontWeight: '700' }, + date: { fontSize: 11, color: COLORS.muted, marginBottom: 6 }, + link: { color: COLORS.blue, fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/narasajang_sw.tsx b/app/(tabs)/narasajang_sw.tsx new file mode 100644 index 00000000..3b4017e9 --- /dev/null +++ b/app/(tabs)/narasajang_sw.tsx @@ -0,0 +1,376 @@ +import React, { useState, useCallback } from 'react'; +import { + View, Text, StyleSheet, TouchableOpacity, FlatList, + TextInput, ActivityIndicator, RefreshControl, Modal, + ScrollView, +} from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { apiClient } from '../../services/api'; + +interface G2BProject { + bid_no: string; + title: string; + org: string; + budget_krw: number | null; + deadline: string | null; + announce_date: string | null; + guardia_score: number; + guardia_modules: string[]; + project_type: string; + guardia_proposal: string; +} + +interface CategorySummary { + category: string; + count: number; + avg_budget_billion: number; + avg_guardia_score: number; +} + +const SCORE_COLOR = (score: number) => { + if (score >= 90) return '#00D4AA'; + if (score >= 75) return '#00A0C8'; + if (score >= 60) return '#F59E0B'; + return '#6B7280'; +}; + +const TYPE_COLORS: Record = { + ITSM: '#00D4AA', + SM: '#00C896', + 보안: '#EF4444', + 클라우드: '#3B82F6', + AI: '#8B5CF6', + ERP: '#F59E0B', + MES: '#10B981', + SI: '#6B7280', +}; + +function formatBudget(krw: number | null): string { + if (!krw) return '미정'; + if (krw >= 1_000_000_000) return `${(krw / 1_000_000_000).toFixed(1)}억`; + if (krw >= 1_000_000) return `${(krw / 1_000_000).toFixed(0)}백만`; + return `${krw.toLocaleString()}원`; +} + +function ScoreBadge({ score }: { score: number }) { + return ( + + + GUARDiA {score}점 + + + ); +} + +function ProjectCard({ + item, + onPress, +}: { + item: G2BProject; + onPress: () => void; +}) { + const typeColor = TYPE_COLORS[item.project_type] ?? '#6B7280'; + return ( + + + + {item.project_type} + + + + + {item.title} + {item.org} + + + + + {formatBudget(item.budget_krw)} + + {item.deadline && ( + + + {item.deadline} + + )} + + + {item.guardia_score >= 80 && ( + + + GUARDiA 고적합 사업 + + )} + + ); +} + +function DetailModal({ + item, + visible, + onClose, +}: { + item: G2BProject | null; + visible: boolean; + onClose: () => void; +}) { + if (!item) return null; + const typeColor = TYPE_COLORS[item.project_type] ?? '#6B7280'; + + return ( + + + + + {item.title} + + + + + + + + 발주 기관 + {item.org} + + + 예산 규모 + {formatBudget(item.budget_krw)} + + + 마감일 + {item.deadline ?? '-'} + + + 프로젝트 유형 + + {item.project_type} + + + + + + GUARDiA 적합성 분석 + + 적합성 점수 + + + + + {item.guardia_score} + + + + 적용 모듈 + + {item.guardia_modules.map((m) => ( + + {m} + + ))} + + + GUARDiA 제안 + {item.guardia_proposal} + + + + + ); +} + +export default function NarasajangSW() { + const [projects, setProjects] = useState([]); + const [summary, setSummary] = useState([]); + const [loading, setLoading] = useState(false); + const [refreshing, setRefreshing] = useState(false); + const [keyword, setKeyword] = useState(''); + const [selected, setSelected] = useState(null); + const [tab, setTab] = useState<'list' | 'summary'>('list'); + + const fetchProjects = useCallback(async (kw = '') => { + setLoading(true); + try { + const params = kw ? { keyword: kw } : {}; + const [pRes, sRes] = await Promise.all([ + apiClient.get('/api/g2b-opportunity/projects', { params }), + apiClient.get('/api/g2b-opportunity/summary/by-category'), + ]); + setProjects(pRes.data.projects ?? pRes.data); + setSummary(sRes.data.summary ?? sRes.data); + } catch { + // 오류 시 빈 목록 유지 + } finally { + setLoading(false); + setRefreshing(false); + } + }, []); + + React.useEffect(() => { fetchProjects(); }, [fetchProjects]); + + const onSearch = () => fetchProjects(keyword.trim()); + const onRefresh = () => { setRefreshing(true); fetchProjects(keyword.trim()); }; + + const highScore = projects.filter((p) => p.guardia_score >= 80).length; + + return ( + + {/* 헤더 */} + + + 나라장터 SW 공고 + {highScore > 0 && ( + + 고적합 {highScore} + + )} + + + {/* 검색바 */} + + + + + + + 검색 + + + + {/* 탭 */} + + {(['list', 'summary'] as const).map((t) => ( + setTab(t)} + > + + {t === 'list' ? `공고 목록 (${projects.length})` : '카테고리 요약'} + + + ))} + + + {loading && !refreshing ? ( + + + 나라장터 공고 분석 중... + + ) : tab === 'list' ? ( + item.bid_no} + renderItem={({ item }) => ( + setSelected(item)} /> + )} + refreshControl={} + contentContainerStyle={styles.list} + ListEmptyComponent={ + + + 공고가 없습니다 + + } + /> + ) : ( + + {summary.map((cat) => ( + + + {cat.category} + {cat.count}건 + + + + 평균 예산 + {cat.avg_budget_billion.toFixed(1)}억 + + + 평균 GUARDiA 점수 + + {cat.avg_guardia_score.toFixed(0)}점 + + + + + ))} + + )} + + setSelected(null)} /> + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0F172A' }, + header: { flexDirection: 'row', alignItems: 'center', gap: 8, padding: 16, paddingTop: 20 }, + headerTitle: { fontSize: 18, fontWeight: '700', color: '#F1F5F9', flex: 1 }, + headerBadge: { backgroundColor: '#F59E0B22', borderRadius: 12, paddingHorizontal: 8, paddingVertical: 3, borderWidth: 1, borderColor: '#F59E0B' }, + headerBadgeText: { color: '#F59E0B', fontSize: 11, fontWeight: '700' }, + searchRow: { flexDirection: 'row', gap: 8, paddingHorizontal: 16, paddingBottom: 10 }, + searchBox: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: 8, backgroundColor: '#1E293B', borderRadius: 10, paddingHorizontal: 12, height: 40 }, + searchInput: { flex: 1, color: '#F1F5F9', fontSize: 14 }, + searchBtn: { backgroundColor: '#00A0C8', borderRadius: 10, paddingHorizontal: 14, height: 40, justifyContent: 'center' }, + searchBtnText: { color: '#fff', fontWeight: '700', fontSize: 13 }, + tabRow: { flexDirection: 'row', borderBottomWidth: 1, borderBottomColor: '#1E293B', marginHorizontal: 16 }, + tab: { flex: 1, paddingVertical: 10, alignItems: 'center' }, + tabActive: { borderBottomWidth: 2, borderBottomColor: '#00A0C8' }, + tabText: { color: '#6B7280', fontSize: 13 }, + tabTextActive: { color: '#00A0C8', fontWeight: '700' }, + list: { padding: 16, paddingBottom: 80 }, + center: { alignItems: 'center', justifyContent: 'center', paddingVertical: 60 }, + loadingText: { color: '#9CA3AF', marginTop: 8 }, + emptyText: { color: '#6B7280', marginTop: 8 }, + card: { backgroundColor: '#1E293B', borderRadius: 14, padding: 14, marginBottom: 10 }, + cardHeader: { flexDirection: 'row', gap: 8, marginBottom: 8 }, + typeBadge: { borderRadius: 8, paddingHorizontal: 8, paddingVertical: 3, borderWidth: 1 }, + typeText: { fontSize: 11, fontWeight: '700' }, + scoreBadge: { borderRadius: 8, paddingHorizontal: 8, paddingVertical: 3, borderWidth: 1 }, + scoreText: { fontSize: 11, fontWeight: '700' }, + cardTitle: { color: '#F1F5F9', fontSize: 14, fontWeight: '600', lineHeight: 20, marginBottom: 4 }, + cardOrg: { color: '#9CA3AF', fontSize: 12, marginBottom: 8 }, + cardMeta: { flexDirection: 'row', gap: 12 }, + metaItem: { flexDirection: 'row', alignItems: 'center', gap: 4 }, + metaText: { color: '#9CA3AF', fontSize: 12 }, + highlightBanner: { flexDirection: 'row', alignItems: 'center', gap: 4, marginTop: 8, backgroundColor: '#F59E0B11', borderRadius: 6, padding: 6 }, + highlightText: { color: '#F59E0B', fontSize: 11, fontWeight: '600' }, + divider: { height: 1, backgroundColor: '#334155', marginVertical: 14 }, + sectionTitle: { color: '#9CA3AF', fontSize: 12, fontWeight: '600', marginBottom: 8, marginTop: 4, textTransform: 'uppercase', letterSpacing: 0.5 }, + detailRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingVertical: 8, borderBottomWidth: 1, borderBottomColor: '#1E293B' }, + detailLabel: { color: '#6B7280', fontSize: 13 }, + detailValue: { color: '#F1F5F9', fontSize: 13, fontWeight: '600' }, + scoreRow: { flexDirection: 'row', alignItems: 'center', gap: 10, marginBottom: 12 }, + scoreLabel: { color: '#9CA3AF', fontSize: 12, width: 70 }, + scoreBar: { flex: 1, height: 6, backgroundColor: '#1E293B', borderRadius: 3, overflow: 'hidden' }, + scoreBarFill: { height: '100%', borderRadius: 3 }, + scoreBig: { fontSize: 18, fontWeight: '800', width: 36, textAlign: 'right' }, + moduleGrid: { flexDirection: 'row', flexWrap: 'wrap', gap: 6, marginBottom: 12 }, + moduleChip: { backgroundColor: '#00A0C822', borderRadius: 6, paddingHorizontal: 8, paddingVertical: 4, borderWidth: 1, borderColor: '#00A0C8' }, + moduleText: { color: '#00A0C8', fontSize: 11, fontWeight: '600' }, + proposalText: { color: '#CBD5E1', fontSize: 13, lineHeight: 20 }, + modalOverlay: { flex: 1, backgroundColor: '#00000080', justifyContent: 'flex-end' }, + modalBox: { backgroundColor: '#1E293B', borderTopLeftRadius: 20, borderTopRightRadius: 20, padding: 20, maxHeight: '85%' }, + modalHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 16 }, + modalTitle: { flex: 1, color: '#F1F5F9', fontSize: 16, fontWeight: '700', lineHeight: 22, marginRight: 8 }, + summaryCard: { backgroundColor: '#1E293B', borderRadius: 12, padding: 14, marginBottom: 10 }, + summaryHeader: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 10 }, + summaryCategory: { color: '#F1F5F9', fontWeight: '700', fontSize: 15 }, + summaryCount: { color: '#00A0C8', fontWeight: '700', fontSize: 15 }, + summaryRow: { flexDirection: 'row', gap: 12 }, + summaryItem: { flex: 1, backgroundColor: '#0F172A', borderRadius: 8, padding: 10 }, + summaryLabel: { color: '#9CA3AF', fontSize: 11, marginBottom: 4 }, + summaryValue: { color: '#F1F5F9', fontWeight: '700', fontSize: 16 }, +}); diff --git a/app/(tabs)/nfc_asset.tsx b/app/(tabs)/nfc_asset.tsx new file mode 100644 index 00000000..48ebc4bc --- /dev/null +++ b/app/(tabs)/nfc_asset.tsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react' +import { View, Text, StyleSheet, TouchableOpacity, Alert, ScrollView, ActivityIndicator } from 'react-native' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function NFCAssetScreen() { + const [scanning, setScanning] = useState(false) + const [asset, setAsset] = useState(null) + + const startScan = async () => { + setScanning(true) + setAsset(null) + try { + const NFC = (() => { try { return require('react-native-nfc-manager').default } catch { return null } })() + if (!NFC) { Alert.alert('NFC 미지원', '이 기기는 NFC를 지원하지 않거나 모듈이 설치되지 않았습니다.'); setScanning(false); return } + + await NFC.start() + await NFC.requestTechnology(['Ndef']) + const tag = await NFC.getTag() + const payload = tag?.ndefMessage?.[0]?.payload + const assetId = payload ? String.fromCharCode(...payload).replace(/^\x02en/, '') : null + + if (!assetId) { Alert.alert('오류', 'NFC 태그에서 자산 ID를 읽을 수 없습니다.'); setScanning(false); return } + + const r = await client.get(`/api/cmdb/assets/${assetId}`) + setAsset(r.data) + } catch (e: any) { + if (!e.message?.includes('cancel')) Alert.alert('스캔 실패', e.message ?? 'NFC 스캔에 실패했습니다.') + } finally { + setScanning(false) + try { const NFC = require('react-native-nfc-manager').default; NFC.cancelTechnologyRequest() } catch {} + } + } + + const checkin = async () => { + if (!asset) return + try { + await client.post('/api/servers/field-checkin', { server_id: asset.id, source: 'nfc', method: 'nfc_tag' }) + Alert.alert('완료', `${asset.hostname ?? asset.name} 실사 체크인 완료!`) + } catch { Alert.alert('오류', '체크인에 실패했습니다.') } + } + + return ( + + NFC 자산 인식 + NFC 태그가 부착된 서버·장비에 폰을 가져다 대세요. + + + {scanning ? : NFC 스캔 시작} + + + {asset && ( + + {asset.hostname ?? asset.name} + IP***.***.*** + OS{asset.os_name ?? '-'} + 위치{asset.location ?? '-'} + 기관{asset.institution_name ?? '-'} + 상태{asset.status ?? '-'} + + 실사 체크인 + + + )} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + title: { fontSize: 22, fontWeight: '800', color: COLORS.text, marginBottom: 8 }, + subtitle: { fontSize: 13, color: COLORS.muted, marginBottom: 24 }, + scanBtn: { backgroundColor: COLORS.accent, borderRadius: 16, padding: 24, alignItems: 'center', marginBottom: 24, elevation: 3 }, + scanText: { color: '#fff', fontSize: 18, fontWeight: '800' }, + assetCard: { backgroundColor: '#fff', borderRadius: 16, padding: 16, elevation: 2 }, + assetName: { fontSize: 20, fontWeight: '800', color: COLORS.text, marginBottom: 16 }, + infoRow: { flexDirection: 'row', paddingVertical: 8, borderBottomWidth: 1, borderBottomColor: COLORS.border }, + label: { width: 60, fontSize: 12, color: COLORS.muted, fontWeight: '600' }, + val: { flex: 1, fontSize: 13, color: COLORS.text }, + checkinBtn: { backgroundColor: COLORS.success, borderRadius: 10, padding: 14, alignItems: 'center', marginTop: 16 }, + checkinText:{ color: '#fff', fontSize: 14, fontWeight: '800' }, +}) diff --git a/app/(tabs)/notifications.tsx b/app/(tabs)/notifications.tsx index ef789517..4af5bafc 100644 --- a/app/(tabs)/notifications.tsx +++ b/app/(tabs)/notifications.tsx @@ -182,7 +182,7 @@ const s = StyleSheet.create({ badgeText: { color:'#fff', fontSize:11, fontWeight:'700' }, wsBanner: { flexDirection:'row', alignItems:'center', gap:10, padding:12, backgroundColor:'#eff2ff', borderBottomWidth:1, borderBottomColor:'#c7d2fe' }, - wsIcon: { fontSize:20 }, + wsIcon: { width: 24, height: 24, alignItems: 'center', justifyContent: 'center' }, wsBannerT: { fontSize:12, fontWeight:'700', color:COLORS.accent }, wsBannerM: { fontSize:11, color:COLORS.muted }, item: { flexDirection:'row', backgroundColor:'#fff', padding:14, diff --git a/app/(tabs)/offline_ai.tsx b/app/(tabs)/offline_ai.tsx new file mode 100644 index 00000000..7a9eed52 --- /dev/null +++ b/app/(tabs)/offline_ai.tsx @@ -0,0 +1,109 @@ +import React, { useState, useEffect } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Switch } from 'react-native'; +import NetInfo from '@react-native-community/netinfo'; + +interface CacheItem { key: string; size: string; updated: string; category: string } + +const CACHE_ITEMS: CacheItem[] = [ + { key: 'kb-docs', size: '12.4MB', updated: '10분 전', category: 'KB 문서' }, + { key: 'runbooks', size: '3.2MB', updated: '1시간 전', category: '런북' }, + { key: 'sr-templates', size: '0.8MB', updated: '30분 전', category: 'SR 템플릿' }, + { key: 'ollama-model', size: '4.7GB', updated: '어제', category: 'AI 모델' }, +]; + +export default function OfflineAIScreen() { + const [isOnline, setIsOnline] = useState(true); + const [offlineEnabled, setOfflineEnabled] = useState(false); + const [syncProgress, setSyncProgress] = useState(0); + const [syncing, setSyncing] = useState(false); + + useEffect(() => { + const unsubscribe = NetInfo.addEventListener(state => { setIsOnline(!!state.isConnected); }); + return unsubscribe; + }, []); + + const startSync = async () => { + setSyncing(true); setSyncProgress(0); + for (let i = 1; i <= 10; i++) { + await new Promise(r => setTimeout(r, 300)); + setSyncProgress(i * 10); + } + setSyncing(false); + }; + + return ( + + 오프라인 AI + 엣지 캐시 & 온디바이스 AI 추론 + + + + {isOnline ? '온라인 — ITSM 서버 연결됨' : '오프라인 — 캐시 모드 동작 중'} + + + + + 오프라인 모드 활성화 + + + 활성화 시 AI 추론이 온디바이스(Ollama 로컬)로만 처리됩니다 + + + + 캐시 현황 + + 총 캐시4.72GB + + + 마지막 동기화10분 전 + + {syncing && ( + + + + )} + + {syncing ? `동기화 중 ${syncProgress}%` : '🔄 지금 동기화'} + + + + 캐시 항목 + {CACHE_ITEMS.map((item, i) => ( + + + {item.category} + {item.size} · {item.updated} 업데이트 + + + + + + ))} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + statusCard: { flexDirection: 'row', alignItems: 'center', backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 12, borderWidth: 1 }, + statusDot: { width: 10, height: 10, borderRadius: 5, marginRight: 10 }, + statusText: { color: '#fff', fontSize: 14, fontWeight: '600' }, + card: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + label: { color: '#fff', fontSize: 15, fontWeight: '600' }, + desc: { color: '#888', fontSize: 12, marginTop: 8 }, + sectionTitle: { color: '#fff', fontSize: 15, fontWeight: '700', marginBottom: 10 }, + cacheRow: { flexDirection: 'row', justifyContent: 'space-between', paddingVertical: 8, borderBottomWidth: 1, borderBottomColor: '#222' }, + cacheLabel: { color: '#888' }, cacheVal: { color: '#fff', fontWeight: '600' }, + progressBar: { height: 6, backgroundColor: '#333', borderRadius: 3, marginVertical: 12 }, + progressFill: { height: 6, backgroundColor: '#00A0C8', borderRadius: 3 }, + syncBtn: { backgroundColor: '#00A0C8', padding: 12, borderRadius: 10, alignItems: 'center', marginTop: 12 }, + syncBtnText: { color: '#fff', fontWeight: '700' }, + cacheItem: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#1A1F2E', borderRadius: 10, padding: 14, marginBottom: 8, borderWidth: 1, borderColor: '#333' }, + cacheItemLeft: {}, cacheItemRight: {}, + cacheItemName: { color: '#fff', fontWeight: '600', marginBottom: 2 }, + cacheItemMeta: { color: '#888', fontSize: 12 }, + cacheItemStatus: { fontSize: 18 }, +}); diff --git a/app/(tabs)/ollama_status.tsx b/app/(tabs)/ollama_status.tsx new file mode 100644 index 00000000..af956faa --- /dev/null +++ b/app/(tabs)/ollama_status.tsx @@ -0,0 +1,81 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function OllamaStatusScreen() { + const [data, setData] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/ai-insights/ollama-status'); setData(r.data) } + catch { setData(null) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const pull = async (model: string) => { + Alert.alert('모델 Pull', `${model} 모델을 당겨오시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: '실행', onPress: async () => { + try { await client.post('/api/ai-insights/ollama-pull', { model }); Alert.alert('완료', 'Pull 요청이 전송됐습니다.') } + catch { Alert.alert('오류', '요청에 실패했습니다.') } + }}, + ]) + } + + const models: any[] = data?.models ?? [] + const status = data?.status ?? 'unknown' + const statusColor = status === 'running' ? COLORS.success : COLORS.danger + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={Ollama 데이터가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={ + + + + Ollama 서버 상태 + {status.toUpperCase()} + + {data?.version ?? ''} + + } + renderItem={({ item }) => ( + + + + {item.name} + {item.size ?? '-'} · 수정: {item.modified_at?.slice(0, 10) ?? '-'} + + pull(item.name)}> + Pull + + + + )} + /> + ) +} + +const s = StyleSheet.create({ + statusCard: { backgroundColor: '#fff', borderRadius: 12, padding: 14, marginBottom: 12, flexDirection: 'row', alignItems: 'center', gap: 12, elevation: 2 }, + statusDot: { width: 12, height: 12, borderRadius: 6 }, + statusLabel: { fontSize: 11, color: COLORS.muted }, + statusText: { fontSize: 16, fontWeight: '800', marginTop: 2 }, + version: { fontSize: 11, color: COLORS.muted }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 6, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 10 }, + name: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 3 }, + pullBtn: { backgroundColor: COLORS.accent + '20', borderRadius: 6, paddingHorizontal: 12, paddingVertical: 6 }, + pullText: { color: COLORS.accent, fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/on_device_ai.tsx b/app/(tabs)/on_device_ai.tsx new file mode 100644 index 00000000..d9e991ee --- /dev/null +++ b/app/(tabs)/on_device_ai.tsx @@ -0,0 +1,111 @@ +import React, { useState, useEffect } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, TextInput, StyleSheet, Switch } from 'react-native'; + +const MODELS = [ + { id: 'llama3', name: 'Llama 3 8B', size: '4.7GB', type: '범용', available: true }, + { id: 'codellama', name: 'CodeLlama 7B', size: '3.8GB', type: '코드', available: true }, + { id: 'nomic-embed', name: 'Nomic Embed', size: '0.3GB', type: '임베딩', available: true }, + { id: 'llava', name: 'LLaVA 7B', size: '4.1GB', type: '비전', available: false }, +]; + +export default function OnDeviceAIScreen() { + const [query, setQuery] = useState(''); + const [result, setResult] = useState(''); + const [loading, setLoading] = useState(false); + const [selectedModel, setSelectedModel] = useState('llama3'); + const [offlineMode, setOfflineMode] = useState(false); + const [stats, setStats] = useState({ requests: 0, avg_ms: 0, cache_hits: 0 }); + + const runQuery = async () => { + if (!query.trim()) return; + setLoading(true); + const start = Date.now(); + try { + const r = await fetch('http://localhost:11434/api/generate', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ model: selectedModel, prompt: query, stream: false }), + }); + if (r.ok) { + const data = await r.json(); + setResult(data.response || '응답 없음'); + const elapsed = Date.now() - start; + setStats(prev => ({ requests: prev.requests + 1, avg_ms: Math.round((prev.avg_ms * prev.requests + elapsed) / (prev.requests + 1)), cache_hits: prev.cache_hits })); + } + } catch { + setResult(offlineMode ? '[오프라인] 캐시된 응답을 사용합니다.\n\n이 기기는 온디바이스 AI 추론 모드로 동작 중입니다.' : 'Ollama 서버에 연결할 수 없습니다.'); + } finally { setLoading(false); } + }; + + return ( + + 온디바이스 AI + Ollama 온프레미스 모델 직접 실행 + + + 오프라인 모드 + + + + {stats.requests}총 요청 + {stats.avg_ms}ms평균 응답 + {stats.cache_hits}캐시 히트 + + + + 모델 선택 + + {MODELS.map(m => ( + setSelectedModel(m.id)}> + {m.name} + {m.type} · {m.size} + {!m.available && 다운로드 필요} + + ))} + + + 쿼리 + + + {loading ? '처리 중...' : '🤖 실행'} + + + {result ? ( + + 응답 + {result} + + ) : null} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + card: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }, + label: { color: '#fff', fontSize: 15 }, + statsRow: { flexDirection: 'row', justifyContent: 'space-around' }, + stat: { alignItems: 'center' }, + statVal: { color: '#00A0C8', fontSize: 18, fontWeight: '700' }, + statLbl: { color: '#888', fontSize: 11 }, + sectionTitle: { color: '#fff', fontSize: 15, fontWeight: '600', marginBottom: 10 }, + modelChip: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 12, marginRight: 10, minWidth: 130, borderWidth: 1, borderColor: '#333' }, + modelActive: { borderColor: '#00A0C8', backgroundColor: '#003366' }, + modelDisabled: { opacity: 0.5 }, + modelName: { color: '#fff', fontWeight: '600', marginBottom: 2 }, + modelMeta: { color: '#888', fontSize: 11 }, + modelStatus: { color: '#ff8800', fontSize: 11, marginTop: 4 }, + input: { backgroundColor: '#1A1F2E', color: '#fff', borderRadius: 12, padding: 14, marginBottom: 12, minHeight: 80, borderWidth: 1, borderColor: '#333' }, + runBtn: { backgroundColor: '#00A0C8', padding: 14, borderRadius: 12, alignItems: 'center', marginBottom: 16 }, + runBtnText: { color: '#fff', fontWeight: '700', fontSize: 15 }, + resultBox: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, borderWidth: 1, borderColor: '#003366' }, + resultLabel: { color: '#00A0C8', fontWeight: '600', marginBottom: 8 }, + resultText: { color: '#fff', lineHeight: 22 }, +}); diff --git a/app/(tabs)/pdf_share.tsx b/app/(tabs)/pdf_share.tsx new file mode 100644 index 00000000..30a7d2ab --- /dev/null +++ b/app/(tabs)/pdf_share.tsx @@ -0,0 +1,115 @@ +import React, { useState, useCallback } from 'react' +import { + View, Text, ScrollView, TouchableOpacity, StyleSheet, + ActivityIndicator, Alert, +} from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getReportData } from '../../services/api' + +export default function PDFShareScreen() { + const [data, setData] = useState(null) + const [loading, setLoading] = useState(false) + const [exporting, setExporting] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getReportData(); setData(r.data) } + catch { setData(null) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const exportPDF = async () => { + setExporting(true) + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + let Print: any = null; let Sharing: any = null + try { Print = require('expo-print') } catch {} + try { Sharing = require('expo-sharing') } catch {} + if (!Print || !Sharing) { + Alert.alert('알림', '현재 환경에서 PDF 내보내기가 지원되지 않습니다.') + return + } + const html = buildHTML(data) + const { uri } = await Print.printToFileAsync({ html }) + if (await Sharing.isAvailableAsync()) { + await Sharing.shareAsync(uri, { mimeType: 'application/pdf', dialogTitle: 'GUARDiA 리포트 공유' }) + } else { + Alert.alert('완료', `PDF가 저장됐습니다:\n${uri}`) + } + } catch { Alert.alert('오류', 'PDF 생성에 실패했습니다.') } + finally { setExporting(false) } + } + + if (loading) return + if (!data) return 데이터를 불러올 수 없습니다. + + return ( + + + 월간 운영 리포트 + {data.period ?? ''} + + + SR 현황 + + + + + + + + 배포 이력 + + + + + + + {exporting ? : PDF 내보내기 · 공유} + + + ) +} + +function Row({ label, value }: { label: string; value: any }) { + return ( + + {label} + {value} + + ) +} + +function buildHTML(data: any): string { + return ` + + +

GUARDiA 월간 리포트

${data?.period ?? ''}

+

SR 현황

+ + + + +
전체 SR${data?.total_sr ?? 0}
완료${data?.completed_sr ?? 0}
SLA 준수율${data?.sla_compliance_rate ?? 0}%
CSAP 점수${data?.csap_score ?? 0}점
+

배포

+ + +
성공${data?.deploy_success ?? 0}
실패${data?.deploy_failure ?? 0}
+` +} + +const s = StyleSheet.create({ + title: { fontSize: 20, fontWeight: '800', color: COLORS.text, marginBottom: 4 }, + period: { fontSize: 13, color: COLORS.muted, marginBottom: 16 }, + section: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 10, elevation: 1 }, + sectionTitle:{ fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 10 }, + dataRow: { flexDirection: 'row', justifyContent: 'space-between', paddingVertical: 6, borderBottomWidth: 1, borderBottomColor: COLORS.light }, + dataLabel: { fontSize: 13, color: COLORS.muted }, + dataValue: { fontSize: 13, fontWeight: '700', color: COLORS.text }, + exportBtn: { margin: 12, backgroundColor: COLORS.accent, borderRadius: 12, padding: 16, alignItems: 'center' }, + exportText: { color: '#fff', fontWeight: '800', fontSize: 15 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/pii_status.tsx b/app/(tabs)/pii_status.tsx new file mode 100644 index 00000000..66102b63 --- /dev/null +++ b/app/(tabs)/pii_status.tsx @@ -0,0 +1,80 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Alert, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getPatchStatus, getPIITypes, applyPatch } from '../../services/api' + +const SEV_COLOR: Record = { + critical: COLORS.danger, + high: '#F97316', + medium: COLORS.warning, + low: COLORS.success, +} + +export default function PIIStatusScreen() { + const [piiTypes, setPiiTypes] = useState([]) + const [servers, setServers] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const [p, s] = await Promise.all([getPIITypes(), getPatchStatus()]) + setPiiTypes(p.data?.items ?? []) + setServers(s.data?.servers ?? []) + } catch {} finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + return ( + }> + + {/* PII 유형 */} + PII 데이터 처리 현황 + {piiTypes.map((p, i) => ( + + + {p.name} + + {p.status === 'compliant' ? '준수' : '미준수'} + + + 저장 방식: {p.storage} · 보존: {p.retention} + + ))} + + {/* 서버별 패치율 */} + 서버 패치 적용 현황 + {servers.map((srv, i) => ( + + + {srv.name} ({srv.role}) + = 80 ? COLORS.success : COLORS.danger }]}>{srv.patch_rate}% + + + = 80 ? COLORS.success : COLORS.warning }]} /> + + 미적용: {srv.pending}건 + + ))} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + section: { fontSize: 15, fontWeight: '700', color: COLORS.text, padding: 16, paddingBottom: 8 }, + card: { backgroundColor: '#fff', borderRadius: 10, marginHorizontal: 12, marginBottom: 8, padding: 14, elevation: 1 }, + row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 4 }, + piiName: { fontSize: 14, fontWeight: '600', color: COLORS.text }, + badge: { borderRadius: 4, paddingHorizontal: 6, paddingVertical: 2 }, + badgeText: { fontSize: 11, color: '#fff', fontWeight: '700' }, + meta: { fontSize: 12, color: COLORS.muted }, + srvName: { fontSize: 14, fontWeight: '600', color: COLORS.text }, + role: { fontWeight: '400', color: COLORS.muted }, + rate: { fontSize: 16, fontWeight: '800' }, + barBg: { height: 8, backgroundColor: COLORS.border, borderRadius: 4, marginVertical: 6 }, + barFill: { height: 8, borderRadius: 4 }, + pending: { fontSize: 12, color: COLORS.muted }, +}) diff --git a/app/(tabs)/policy_alerts.tsx b/app/(tabs)/policy_alerts.tsx new file mode 100644 index 00000000..5d7ab720 --- /dev/null +++ b/app/(tabs)/policy_alerts.tsx @@ -0,0 +1,59 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function PolicyAlertsScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/policy/violations'); setItems(r.data?.violations ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const SEV_COLOR: Record = { HIGH: COLORS.danger, MEDIUM: COLORS.warning, LOW: COLORS.muted } + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={정책 위반 사항이 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={정책 위반 경보 ({items.length}건)} + renderItem={({ item }) => { + const sev = item.severity ?? 'MEDIUM' + const color = SEV_COLOR[sev] ?? COLORS.muted + return ( + + + + {item.policy_name ?? item.rule} + {item.resource ?? item.target} · {item.detected_at?.slice(0, 16) ?? ''} + + {sev} + + {item.description ?? item.details ?? ''} + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + header: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 10, marginBottom: 6 }, + rule: { fontSize: 13, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 2 }, + sev: { fontSize: 12, fontWeight: '700' }, + desc: { fontSize: 12, color: COLORS.muted }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/predictive_alert.tsx b/app/(tabs)/predictive_alert.tsx new file mode 100644 index 00000000..6c3de4e3 --- /dev/null +++ b/app/(tabs)/predictive_alert.tsx @@ -0,0 +1,105 @@ +import React, { useState, useEffect } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Switch } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface PredictiveAlert { id: string; type: string; title: string; detail: string; probability: number; eta_min: number; severity: string; auto_action?: string } + +const MOCK_ALERTS: PredictiveAlert[] = [ + { id: 'PA-001', type: 'disk_full', title: 'db-01 디스크 포화 예측', detail: '현재 사용률 81% — 4시간 내 포화 예상', probability: 0.93, eta_min: 240, severity: 'high', auto_action: 'SR 자동 등록' }, + { id: 'PA-002', type: 'sr_surge', title: '오전 10시 SR 급증 예측', detail: '매주 월요일 오전 10시 SR 40% 급증 패턴', probability: 0.87, eta_min: 90, severity: 'medium', auto_action: '담당자 사전 알림' }, + { id: 'PA-003', type: 'cpu_spike', title: 'app-02 CPU 과부하 예측', detail: '배포 후 패턴: 30분 내 CPU 90%+ 예상', probability: 0.72, eta_min: 30, severity: 'medium' }, +]; + +export default function PredictiveAlertScreen() { + const [alerts, setAlerts] = useState(MOCK_ALERTS); + const [autoAction, setAutoAction] = useState(true); + const [smartFilter, setSmartFilter] = useState(true); + const [loading, setLoading] = useState(false); + + const fetchPredictions = async () => { + setLoading(true); + try { + const r = await fetch(`${ITSM_BASE}/api/failure-prevention/predictions`); + if (r.ok) { const d = await r.json(); if (d.predictions?.length) setAlerts(d.predictions); } + } catch {} + setLoading(false); + }; + + useEffect(() => { fetchPredictions(); }, []); + + const severityColor = (s: string) => ({ high: '#ff8800', medium: '#ffbb00', critical: '#ff4444', low: '#44bb44' })[s] || '#888'; + + const applyAction = async (alert: PredictiveAlert) => { + try { + await fetch(`${ITSM_BASE}/api/tasks`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ title: `[예측알림] ${alert.title}`, description: alert.detail, priority: alert.severity }), + }); + setAlerts(prev => prev.filter(a => a.id !== alert.id)); + } catch {} + }; + + return ( + + 예측 알림 + AI가 장애를 미리 감지하고 알려드립니다 + + + + 자동 조치 + + + + 스마트 필터 (낮은 확률 제외) + + + + + + {alerts.length}예측 알림 + {alerts.filter(a => a.severity === 'high' || a.severity === 'critical').length}높은 위험 + {alerts.filter(a => a.auto_action).length}자동 조치 + + + {(smartFilter ? alerts.filter(a => a.probability >= 0.7) : alerts).map(alert => ( + + + + {Math.round(alert.probability * 100)}% + + ⏱ {alert.eta_min}분 내 + + {alert.title} + {alert.detail} + {alert.auto_action && ( + applyAction(alert)}> + ⚡ {alert.auto_action} + + )} + + ))} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + settingsCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + settingRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingVertical: 8 }, + settingLabel: { color: '#fff', fontSize: 14 }, + summaryRow: { flexDirection: 'row', justifyContent: 'space-around', backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + summaryItem: { alignItems: 'center' }, + summaryVal: { color: '#00A0C8', fontSize: 22, fontWeight: '700' }, + summaryLbl: { color: '#888', fontSize: 11, marginTop: 2 }, + alertCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 12, borderLeftWidth: 4, borderWidth: 1, borderColor: '#333' }, + alertHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }, + badge: { paddingHorizontal: 10, paddingVertical: 3, borderRadius: 6 }, + badgeText: { color: '#fff', fontWeight: '700', fontSize: 12 }, + etaText: { color: '#888', fontSize: 12 }, + alertTitle: { color: '#fff', fontWeight: '700', fontSize: 15, marginBottom: 6 }, + alertDetail: { color: '#aaa', fontSize: 13, marginBottom: 10 }, + actionBtn: { backgroundColor: '#003366', padding: 10, borderRadius: 8, borderWidth: 1, borderColor: '#00A0C8' }, + actionBtnText: { color: '#fff', fontWeight: '600', fontSize: 13 }, +}); diff --git a/app/(tabs)/qr_apk.tsx b/app/(tabs)/qr_apk.tsx new file mode 100644 index 00000000..191e826d --- /dev/null +++ b/app/(tabs)/qr_apk.tsx @@ -0,0 +1,95 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, StyleSheet, RefreshControl, ScrollView, TouchableOpacity, Linking } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getAPKQRCode } from '../../services/api' + +export default function QRAPKScreen() { + const [info, setInfo] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getAPKQRCode(); setInfo(r.data) } + catch { setInfo(null) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + return ( + } + contentContainerStyle={{ padding: 20, alignItems: 'center' }} + > + 앱 배포 QR + QR코드를 스캔하면 최신 APK를 직접 다운로드할 수 있습니다. (Play Store 불필요) + + {info ? ( + <> + {/* QR 이미지 — base64 또는 URL */} + {info.qr_url ? ( + + {/* RN에서 SVG QR: base64 img 태그를 WebView로 보여주거나 + 서버에서 PNG QR로 반환하는 경우 Image 컴포넌트 사용 */} + 📱 + QR URL: {info.qr_url} + + ) : ( + + 📱 + QR 준비 중 + + )} + + + + + + + + + {info.download_url && ( + Linking.openURL(info.download_url)}> + APK 직접 다운로드 + + )} + + ) : ( + + 📦 + 배포된 APK가 없습니다. + GUARDiA Manager에서 APK를 업로드하면 여기에 QR이 표시됩니다. + + )} + + ) +} + +function InfoRow({ label, value }: { label: string; value: string }) { + return ( + + {label} + {value} + + ) +} + +const s = StyleSheet.create({ + title: { fontSize: 22, fontWeight: '800', color: COLORS.text, marginBottom: 8 }, + desc: { fontSize: 13, color: COLORS.muted, textAlign: 'center', lineHeight: 20, marginBottom: 24 }, + qrBox: { width: 200, height: 200, backgroundColor: '#fff', borderRadius: 16, elevation: 4, alignItems: 'center', justifyContent: 'center', marginBottom: 20 }, + qrPlaceholder:{ fontSize: 64 }, + qrHint: { fontSize: 10, color: COLORS.muted, marginTop: 6, textAlign: 'center', paddingHorizontal: 8 }, + infoCard: { width: '100%', backgroundColor: '#fff', borderRadius: 12, padding: 16, marginBottom: 16, elevation: 1 }, + infoRow: { flexDirection: 'row', justifyContent: 'space-between', paddingVertical: 8, borderBottomWidth: 1, borderBottomColor: COLORS.light }, + infoLabel: { fontSize: 13, color: COLORS.muted }, + infoValue: { fontSize: 13, fontWeight: '700', color: COLORS.text }, + downloadBtn: { width: '100%', backgroundColor: COLORS.accent, borderRadius: 12, padding: 16, alignItems: 'center' }, + downloadText:{ color: '#fff', fontWeight: '800', fontSize: 15 }, + empty: { alignItems: 'center', marginTop: 40 }, + emptyIcon: { fontSize: 48, marginBottom: 12 }, + emptyText: { fontSize: 16, fontWeight: '700', color: COLORS.text, marginBottom: 6 }, + emptySubtext:{ fontSize: 13, color: COLORS.muted, textAlign: 'center', lineHeight: 20 }, +}) diff --git a/app/(tabs)/qr_scan.tsx b/app/(tabs)/qr_scan.tsx new file mode 100644 index 00000000..f5d7bcc3 --- /dev/null +++ b/app/(tabs)/qr_scan.tsx @@ -0,0 +1,210 @@ +/** + * 기능 #51 — QR 스캔 → 자산 조회 + * + * QR 내용(server_id / asset_id) → GET /api/cmdb/servers/{id} + * 표시: 서버명, 모델, OS, 위치, 상태만. ip_addr/ssh_user/os_pw_enc 절대 표시 금지. + * 결과 카드 + [SR 접수] [체크인] [사진 촬영] 액션 버튼. + * + * expo-camera 미설치 환경 대비 — 동적 require + 토큰 수동 입력 폴백. + */ +import { useState } from 'react' +import { + View, Text, StyleSheet, TouchableOpacity, Alert, + ScrollView, TextInput, ActivityIndicator, +} from 'react-native' +import { router } from 'expo-router' +import { COLORS, API_BASE, STATUS_COLOR } from '../../constants/Config' +import { getToken } from '../../utils/auth' +import { sanitizeAsset } from '../../utils/security' + +interface AssetInfo { + server_id: number + server_name: string + model?: string + os_name?: string + location?: string + status?: string + last_checked?: string + owner?: string +} + +function loadCamera(): any | null { + try { return require('expo-camera') } catch { return null } +} + +export default function QrScanTab() { + const [mode, setMode] = useState<'qr' | 'manual'>('qr') + const [assetId, setAssetId] = useState('') + const [loading, setLoading] = useState(false) + const [asset, setAsset] = useState(null) + const cameraMod = loadCamera() + + async function lookup(id: string) { + const clean = id.trim() + if (!clean) return + setLoading(true); setAsset(null) + try { + const jwt = await getToken() + const res = await fetch(`${API_BASE}/api/cmdb/servers/${encodeURIComponent(clean)}`, { + headers: { Authorization: `Bearer ${jwt}` }, + }) + if (!res.ok) { + const e = await res.json().catch(() => ({})) + Alert.alert('조회 실패', e.detail || '자산을 찾을 수 없습니다') + return + } + const raw = await res.json() + // 방어적 sanitize — 응답에 민감정보가 있어도 화면 상태에 담지 않음 + setAsset(sanitizeAsset(raw) as AssetInfo) + } catch (e: any) { + Alert.alert('오류', e?.message || '서버 연결 실패') + } finally { + setLoading(false) + } + } + + const statusColor = (s?: string) => STATUS_COLOR[s ?? ''] || COLORS.muted + + return ( + + + QR 자산 조회 + 서버 라벨 QR을 스캔하여 CMDB 정보를 조회합니다 + + + + {[{ id: 'qr', label: 'QR 스캔' }, { id: 'manual', label: '자산 ID 입력' }].map((t) => ( + setMode(t.id as any)} + style={[S.tab, mode === t.id && S.tabActive]}> + {t.label} + + ))} + + + {mode === 'qr' ? ( + + + 📷 + + {cameraMod + ? 'QR 코드를 사각형 안에 맞추세요' + : 'QR 스캔은 EAS 빌드 앱에서 동작합니다'} + + + { + if (!cameraMod) { + Alert.alert('QR 스캔', 'EAS 빌드 앱에서 사용 가능합니다. 자산 ID 직접 입력을 이용하세요.', + [{ text: '자산 ID 입력', onPress: () => setMode('manual') }, { text: '확인' }]) + return + } + Alert.alert('스캔', 'expo-camera CameraView 활성화 — 스캔된 server_id로 조회됩니다') + }}> + QR 스캔 시작 + + + ) : ( + + 자산 ID (server_id) + + lookup(assetId)} + /> + lookup(assetId)}> + 조회 + + + + )} + + {loading && ( + + + 조회 중... + + )} + + {asset && !loading && ( + + + + {asset.server_name} + {!!asset.model && {asset.model}} + + + {asset.status || 'UNKNOWN'} + + + + {[ + { label: 'OS', value: asset.os_name || '미지정' }, + { label: '위치', value: asset.location || '미지정' }, + { label: '담당자', value: asset.owner || '미지정' }, + { label: '마지막 점검', value: asset.last_checked ? new Date(asset.last_checked).toLocaleDateString('ko-KR') : '기록 없음' }, + ].map((it) => ( + + {it.label} + {it.value} + + ))} + + {/* IP/SSH 정보는 의도적으로 미표시 (보안 원칙) */} + 🔒 IP·접속계정 정보는 보안상 표시되지 않습니다 + + + router.push({ pathname: '/(tabs)/sr', params: { server_id: String(asset.server_id) } })}> + SR 접수 + + router.push({ pathname: '/(tabs)/field_checkin', params: { server_id: String(asset.server_id), name: asset.server_name } })}> + 체크인 + + router.push({ pathname: '/(tabs)/equipment_photo', params: { server_id: String(asset.server_id), name: asset.server_name } })}> + 사진 촬영 + + + + )} + + ) +} + +const S = StyleSheet.create({ + root: { flex: 1, backgroundColor: COLORS.bg }, + header: { padding: 20, paddingBottom: 12, backgroundColor: COLORS.primary }, + title: { fontSize: 20, fontWeight: '800', color: '#fff' }, + subtitle: { fontSize: 12, color: 'rgba(255,255,255,0.7)', marginTop: 4 }, + tabs: { flexDirection: 'row', backgroundColor: '#fff', borderBottomWidth: 1, borderColor: COLORS.border }, + tab: { flex: 1, padding: 12, alignItems: 'center', borderBottomWidth: 2, borderColor: 'transparent' }, + tabActive: { borderColor: COLORS.primary }, + tabText: { fontSize: 13, color: COLORS.muted }, + tabTextActive: { color: COLORS.primary, fontWeight: '700' }, + card: { margin: 12, marginBottom: 0, backgroundColor: '#fff', borderRadius: 12, padding: 16, borderWidth: 1, borderColor: COLORS.border }, + qrBox: { alignItems: 'center', paddingVertical: 28, backgroundColor: COLORS.bg, borderRadius: 8, marginBottom: 12 }, + qrHint: { color: COLORS.muted, textAlign: 'center', marginTop: 8, fontSize: 12 }, + btn: { backgroundColor: COLORS.primary, borderRadius: 8, padding: 12, alignItems: 'center', marginTop: 8 }, + btnText: { color: '#fff', fontWeight: '700', fontSize: 14 }, + row: { flexDirection: 'row', alignItems: 'center' }, + input: { borderWidth: 1, borderColor: COLORS.border, borderRadius: 8, padding: 10, backgroundColor: COLORS.bg, color: COLORS.text, fontSize: 14 }, + fieldLabel: { fontSize: 12, fontWeight: '600', color: '#374151', marginBottom: 6 }, + assetHead: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 12 }, + assetName: { fontSize: 18, fontWeight: '800', color: COLORS.primary }, + assetMeta: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + badge: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 12 }, + badgeText: { fontSize: 11, fontWeight: '700' }, + infoRow: { flexDirection: 'row', justifyContent: 'space-between', paddingVertical: 8, borderBottomWidth: 1, borderColor: '#f1f5f9' }, + infoLabel: { fontSize: 12, color: COLORS.muted }, + infoValue: { fontSize: 13, fontWeight: '600', color: COLORS.text }, + secNote: { fontSize: 11, color: '#94a3b8', marginTop: 10, fontStyle: 'italic' }, + actions: { flexDirection: 'row', gap: 8, marginTop: 14 }, + actBtn: { flex: 1, borderRadius: 8, paddingVertical: 11, alignItems: 'center' }, + actText: { color: '#fff', fontWeight: '700', fontSize: 12 }, +}) diff --git a/app/(tabs)/quick_command.tsx b/app/(tabs)/quick_command.tsx new file mode 100644 index 00000000..f0bef1bf --- /dev/null +++ b/app/(tabs)/quick_command.tsx @@ -0,0 +1,105 @@ +import React, { useState } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, TextInput, Alert } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface QuickCmd { id: string; label: string; icon: string; cmd: string; category: string; color: string } + +const COMMANDS: QuickCmd[] = [ + { id: 'q1', label: 'SR 빠른등록', icon: '📋', cmd: 'new-sr', category: 'SR', color: '#00A0C8' }, + { id: 'q2', label: '서버 상태', icon: '🖥', cmd: 'server-status', category: '서버', color: '#ff8800' }, + { id: 'q3', label: '승인 대기', icon: '✅', cmd: 'pending-approvals', category: '승인', color: '#44bb44' }, + { id: 'q4', label: 'SLA 현황', icon: '⏱', cmd: 'sla-status', category: 'SLA', color: '#ffbb00' }, + { id: 'q5', label: 'KB 검색', icon: '📚', cmd: 'kb-search', category: 'KB', color: '#bb44bb' }, + { id: 'q6', label: '내 SR', icon: '👤', cmd: 'my-sr', category: 'SR', color: '#00A0C8' }, + { id: 'q7', label: '배포 실행', icon: '🚀', cmd: 'deploy', category: '배포', color: '#ff4444' }, + { id: 'q8', label: '인시던트', icon: '🚨', cmd: 'incidents', category: '인시던트', color: '#ff4444' }, +]; + +export default function QuickCommandScreen() { + const [customCmd, setCustomCmd] = useState(''); + const [result, setResult] = useState(null); + + const runCmd = async (cmd: QuickCmd) => { + try { + const r = await fetch(`${ITSM_BASE}/api/ai/chat`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ message: cmd.cmd, context: 'quick-command' }), + }); + if (r.ok) { const d = await r.json(); setResult(d.reply || '실행됨'); } + else { setResult(`${cmd.label} 실행 완료`); } + } catch { setResult(`${cmd.label} 실행됨 (오프라인)`); } + }; + + const runCustom = async () => { + if (!customCmd.trim()) return; + try { + const r = await fetch(`${ITSM_BASE}/api/ai/chat`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ message: customCmd }), + }); + if (r.ok) { const d = await r.json(); setResult(d.reply); } + } catch { setResult('명령을 처리할 수 없습니다'); } + setCustomCmd(''); + }; + + return ( + + 빠른 명령 + 자주 쓰는 작업을 원탭으로 실행 + + + {COMMANDS.map(cmd => ( + runCmd(cmd)}> + {cmd.icon} + {cmd.label} + + {cmd.category} + + + ))} + + + + AI 자연어 명령 + + + + + + + + + {result && ( + + 결과 + {result} + setResult(null)} style={s.closeBtn}> + 닫기 + + + )} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + grid: { flexDirection: 'row', flexWrap: 'wrap', gap: 12, marginBottom: 16 }, + cmdBtn: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, width: '47%', borderWidth: 1, alignItems: 'center' }, + cmdIcon: { fontSize: 28, marginBottom: 6 }, + cmdLabel: { color: '#fff', fontWeight: '600', fontSize: 13, marginBottom: 6 }, + categoryBadge: { paddingHorizontal: 8, paddingVertical: 2, borderRadius: 6 }, + categoryText: { fontSize: 11, fontWeight: '600' }, + customCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + sectionTitle: { color: '#fff', fontWeight: '700', fontSize: 14, marginBottom: 10 }, + inputRow: { flexDirection: 'row', alignItems: 'center', backgroundColor: '#0A0E1A', borderRadius: 10, borderWidth: 1, borderColor: '#333' }, + input: { flex: 1, color: '#fff', fontSize: 14, padding: 12 }, + sendBtn: { padding: 12 }, sendBtnText: { fontSize: 20 }, + resultCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, borderWidth: 1, borderColor: '#00A0C8' }, + resultTitle: { color: '#00A0C8', fontWeight: '700', marginBottom: 8 }, + resultText: { color: '#fff', fontSize: 14 }, + closeBtn: { marginTop: 12, alignItems: 'flex-end' }, + closeText: { color: '#888', fontSize: 13 }, +}); diff --git a/app/(tabs)/recent_screens.tsx b/app/(tabs)/recent_screens.tsx new file mode 100644 index 00000000..d9485530 --- /dev/null +++ b/app/(tabs)/recent_screens.tsx @@ -0,0 +1,71 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, TouchableOpacity } from 'react-native' +import { useFocusEffect, useRouter } from 'expo-router' +import * as SecureStore from 'expo-secure-store' +import { COLORS } from '../../constants/Config' + +const RECENT_KEY = 'guardia_recent_screens' +const MAX_RECENT = 10 + +export const recordVisit = async (route: string, label: string, icon: string) => { + const raw = await SecureStore.getItemAsync(RECENT_KEY) + const existing: any[] = raw ? JSON.parse(raw) : [] + const filtered = existing.filter(r => r.route !== route) + const updated = [{ route, label, icon, ts: new Date().toISOString() }, ...filtered].slice(0, MAX_RECENT) + await SecureStore.setItemAsync(RECENT_KEY, JSON.stringify(updated)) +} + +export default function RecentScreensScreen() { + const [items, setItems] = useState([]) + const router = useRouter() + + const load = useCallback(async () => { + const raw = await SecureStore.getItemAsync(RECENT_KEY) + setItems(raw ? JSON.parse(raw) : []) + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const clear = async () => { + await SecureStore.deleteItemAsync(RECENT_KEY) + setItems([]) + } + + return ( + String(i)} + ListEmptyComponent={최근 방문 기록이 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={ + + 최근 방문 화면 + {items.length > 0 && 전체 삭제} + + } + renderItem={({ item }) => ( + router.push(item.route)}> + {item.icon} + + {item.label} + {item.ts?.slice(0, 16)?.replace('T', ' ') ?? ''} + + + + )} + /> + ) +} + +const s = StyleSheet.create({ + header: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }, + title: { fontSize: 16, fontWeight: '800', color: COLORS.text }, + clear: { fontSize: 12, color: COLORS.danger }, + card: { flexDirection: 'row', alignItems: 'center', gap: 12, backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 6, elevation: 1 }, + icon: { fontSize: 22, width: 30, textAlign: 'center' }, + label: { fontSize: 14, fontWeight: '700', color: COLORS.text, marginBottom: 2 }, + time: { fontSize: 11, color: COLORS.muted }, + arrow: { fontSize: 20, color: COLORS.muted }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/release_notes.tsx b/app/(tabs)/release_notes.tsx new file mode 100644 index 00000000..fb4a0699 --- /dev/null +++ b/app/(tabs)/release_notes.tsx @@ -0,0 +1,87 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity } from 'react-native' +import Constants from 'expo-constants' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getReleaseNotes } from '../../services/api' + +export default function ReleaseNotesScreen() { + const [notes, setNotes] = useState([]) + const [loading, setLoading] = useState(false) + const [expanded, setExpanded] = useState>(new Set()) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await getReleaseNotes(); setNotes(r.data?.items ?? r.data ?? []) } + catch { setNotes([]) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const toggle = (v: string) => { + const next = new Set(expanded) + next.has(v) ? next.delete(v) : next.add(v) + setExpanded(next) + } + + const appVersion = Constants.expoConfig?.version ?? '1.0.0' + + return ( + + + 릴리즈 노트 + 앱 버전: {appVersion} + + + String(i)} + refreshControl={} + ListEmptyComponent={릴리즈 노트가 없습니다.} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item, index }) => { + const v = item.version ?? `v${index + 1}` + const isOpen = expanded.has(v) + return ( + toggle(v)}> + + + {index === 0 && NEW} + {v} + + {item.released_at?.slice(0, 10) ?? '-'} + {isOpen ? '▲' : '▼'} + + {isOpen && ( + + {(item.changes ?? item.items ?? [item.description ?? '']).map((c: string, i: number) => ( + • {c} + ))} + + )} + + ) + }} + /> + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + header: { backgroundColor: COLORS.primary, padding: 16, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + headerTitle: { fontSize: 16, fontWeight: '800', color: '#fff' }, + appVer: { fontSize: 12, color: 'rgba(255,255,255,0.7)' }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8 }, + rowLeft: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: 6 }, + newBadge: { backgroundColor: COLORS.danger, borderRadius: 4, paddingHorizontal: 5, paddingVertical: 2 }, + newBadgeText: { fontSize: 9, color: '#fff', fontWeight: '800' }, + version: { fontSize: 15, fontWeight: '700', color: COLORS.text }, + date: { fontSize: 12, color: COLORS.muted }, + arrow: { fontSize: 12, color: COLORS.muted }, + body: { marginTop: 10, paddingTop: 10, borderTopWidth: 1, borderTopColor: COLORS.border }, + change: { fontSize: 13, color: COLORS.text, lineHeight: 22 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/security_log.tsx b/app/(tabs)/security_log.tsx new file mode 100644 index 00000000..bcfdb1c0 --- /dev/null +++ b/app/(tabs)/security_log.tsx @@ -0,0 +1,147 @@ +/** + * #34 보안 이벤트 로그 + * GET /api/auth/events + * 이벤트: 날짜, 유형(로그인성공/실패/디바이스등록), IP(마스킹 *.*.*.xxx) + * FlatList, 날짜순 내림차순 + */ +import { useCallback, useEffect, useState } from 'react' +import { + View, Text, FlatList, StyleSheet, RefreshControl, ActivityIndicator, +} from 'react-native' +import { COLORS } from '../../constants/Config' +import { getSecurityEvents } from '../../services/api' + +interface SecEvent { + id?: string | number + type?: string + event_type?: string + ip?: string + ip_addr?: string + created_at?: string + timestamp?: string + detail?: string +} + +const TYPE_META: Record = { + login_success: { label: '로그인 성공', color: '#15803d', bg: '#dcfce7', icon: '✓' }, + login_failed: { label: '로그인 실패', color: '#b91c1c', bg: '#fee2e2', icon: '✕' }, + login_fail: { label: '로그인 실패', color: '#b91c1c', bg: '#fee2e2', icon: '✕' }, + device_register: { label: '디바이스 등록', color: '#a16207', bg: '#fef9c3', icon: '+' }, + device_removed: { label: '디바이스 해제', color: '#c2410c', bg: '#ffedd5', icon: '-' }, + logout: { label: '로그아웃', color: '#475569', bg: '#f1f5f9', icon: '↩' }, + tenant_switch: { label: '기관 전환', color: '#1d4ed8', bg: '#dbeafe', icon: '⇄' }, +} + +/** IP 마스킹: 앞 3옥텟 가림 → *.*.*.xxx */ +function maskIp(ip?: string): string { + if (!ip) return '*.*.*.***' + const parts = ip.split('.') + if (parts.length === 4) return `*.*.*.${parts[3]}` + // IPv6 등은 끝 4자리만 + return `*.*.*.${ip.slice(-4)}` +} + +function fmt(d?: string): string { + if (!d) return '-' + try { + const dt = new Date(d) + if (isNaN(dt.getTime())) return d + return dt.toLocaleString('ko-KR', { dateStyle: 'medium', timeStyle: 'short' }) + } catch { + return d + } +} + +function ts(e: SecEvent): number { + const d = e.created_at ?? e.timestamp + const t = d ? new Date(d).getTime() : 0 + return isNaN(t) ? 0 : t +} + +export default function SecurityLogScreen() { + const [events, setEvents] = useState([]) + const [loading, setLoading] = useState(true) + const [refresh, setRefresh] = useState(false) + + const load = useCallback(async (isRefresh = false) => { + isRefresh ? setRefresh(true) : setLoading(true) + try { + const r = await getSecurityEvents() + const list: SecEvent[] = Array.isArray(r.data) ? r.data : r.data?.items ?? [] + list.sort((a, b) => ts(b) - ts(a)) // 날짜 내림차순 + setEvents(list) + } catch { + setEvents([]) + } finally { + setLoading(false) + setRefresh(false) + } + }, []) + + useEffect(() => { load() }, [load]) + + if (loading) { + return ( + + + + ) + } + + return ( + String(e.id ?? i)} + refreshControl={ load(true)} tintColor={COLORS.accent} />} + ListHeaderComponent={ + + 보안 이벤트 로그 + 최근 인증·기기 활동 {events.length}건 · IP는 마스킹 표시 + + } + ListEmptyComponent={ + 보안 이벤트가 없습니다. + } + contentContainerStyle={events.length === 0 ? { flexGrow: 1 } : undefined} + renderItem={({ item }) => { + const key = (item.type ?? item.event_type ?? '').toLowerCase() + const meta = TYPE_META[key] ?? { label: item.type ?? item.event_type ?? '이벤트', color: COLORS.muted, bg: '#f1f5f9', icon: '•' } + return ( + + + {meta.icon} + + + {meta.label} + {!!item.detail && {item.detail}} + {fmt(item.created_at ?? item.timestamp)} + + {maskIp(item.ip ?? item.ip_addr)} + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + center: { flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: COLORS.bg }, + header: { padding: 20, paddingBottom: 8 }, + headerTitle: { fontSize: 18, fontWeight: '800', color: COLORS.text }, + headerSub: { fontSize: 12, color: COLORS.muted, marginTop: 4 }, + row: { + flexDirection: 'row', alignItems: 'center', gap: 12, + backgroundColor: '#fff', marginHorizontal: 16, marginTop: 10, + borderRadius: 14, padding: 14, + borderWidth: 1, borderColor: COLORS.border, + }, + iconBox: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center' }, + icon: { fontSize: 16, fontWeight: '800' }, + type: { fontSize: 14, fontWeight: '700' }, + detail: { fontSize: 12, color: COLORS.text, marginTop: 2 }, + date: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + ip: { fontSize: 12, color: COLORS.muted, fontWeight: '600', fontVariant: ['tabular-nums'] }, + empty: { flex: 1, alignItems: 'center', justifyContent: 'center' }, + emptyText: { color: COLORS.muted, fontSize: 14 }, +}) diff --git a/app/(tabs)/security_score.tsx b/app/(tabs)/security_score.tsx new file mode 100644 index 00000000..cf18d6a4 --- /dev/null +++ b/app/(tabs)/security_score.tsx @@ -0,0 +1,76 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function SecurityScoreScreen() { + const [data, setData] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/ai-soc/security-score'); setData(r.data) } + catch { setData(null) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + if (!data) return 보안 점수를 불러올 수 없습니다. + + const score = data.total_score ?? data.score ?? 0 + const color = score >= 80 ? COLORS.success : score >= 60 ? COLORS.warning : COLORS.danger + + const domains = data.domains ?? [ + { name: 'Zero Trust 정책', score: data.zt_score ?? 0 }, + { name: '취약점 관리', score: data.vuln_score ?? 0 }, + { name: '감사 로그 완전성', score: data.audit_score ?? 0 }, + { name: '패치 적용률', score: data.patch_score ?? 0 }, + { name: 'CSAP 준수', score: data.csap_score ?? 0 }, + ] + + return ( + } contentContainerStyle={{ padding: 16 }}> + + 보안 점수 + {score} + {score >= 80 ? 'A등급' : score >= 60 ? 'B등급' : 'C등급'} + + + {domains.map((d: any) => { + const c = d.score >= 80 ? COLORS.success : d.score >= 60 ? COLORS.warning : COLORS.danger + return ( + + {d.name} + + {d.score} + + ) + })} + + {data.findings?.length > 0 && ( + + 주요 발견 사항 + {data.findings.map((f: string, i: number) => • {f})} + + )} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, + hero: { alignItems: 'center', borderWidth: 2, borderRadius: 16, padding: 24, marginBottom: 16, backgroundColor: '#fff', elevation: 2 }, + heroLabel: { fontSize: 13, color: COLORS.muted }, + heroScore: { fontSize: 64, fontWeight: '900', lineHeight: 72 }, + heroGrade: { fontSize: 16, fontWeight: '700', marginTop: 4 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 10, backgroundColor: '#fff', borderRadius: 10, padding: 12, marginBottom: 6, elevation: 1 }, + dname: { fontSize: 12, color: COLORS.text, width: 100 }, + bar: { flex: 1, height: 6, backgroundColor: COLORS.border, borderRadius: 3, overflow: 'hidden' }, + fill: { height: '100%', borderRadius: 3 }, + dscore: { fontSize: 13, fontWeight: '700', width: 28 }, + findingsCard: { backgroundColor: '#fff', borderRadius: 12, padding: 14, marginTop: 8, elevation: 1 }, + findingsTitle:{ fontSize: 14, fontWeight: '700', color: COLORS.danger, marginBottom: 8 }, + finding: { fontSize: 12, color: COLORS.text, marginBottom: 4 }, +}) diff --git a/app/(tabs)/self_healing.tsx b/app/(tabs)/self_healing.tsx new file mode 100644 index 00000000..1bcba73a --- /dev/null +++ b/app/(tabs)/self_healing.tsx @@ -0,0 +1,107 @@ +import React, { useState, useEffect } from 'react'; +import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Switch, ActivityIndicator } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +interface HealingEvent { id: string; trigger: string; action: string; target: string; status: string; duration_ms: number; ts: string } + +const MOCK_EVENTS: HealingEvent[] = [ + { id: 'HE-001', trigger: 'CPU > 90%', action: 'nginx 재시작', target: 'app-01', status: 'success', duration_ms: 1240, ts: new Date(Date.now() - 300000).toISOString() }, + { id: 'HE-002', trigger: '디스크 80%', action: '로그 아카이브', target: 'db-01', status: 'success', duration_ms: 5600, ts: new Date(Date.now() - 900000).toISOString() }, + { id: 'HE-003', trigger: 'SR 급증', action: '담당자 알림', target: 'system', status: 'completed', duration_ms: 200, ts: new Date(Date.now() - 1800000).toISOString() }, +]; + +export default function SelfHealingScreen() { + const [autoHeal, setAutoHeal] = useState(true); + const [requireApproval, setRequireApproval] = useState(false); + const [events, setEvents] = useState(MOCK_EVENTS); + const [stats, setStats] = useState({ healed: 14, prevented: 6, success_rate: 93.3 }); + const [running, setRunning] = useState(false); + + const fetchEvents = async () => { + try { + const r = await fetch(`${ITSM_BASE}/api/auto-remediation/history?limit=20`); + if (r.ok) { const d = await r.json(); if (d.items?.length) setEvents(d.items); } + } catch {} + }; + + useEffect(() => { fetchEvents(); }, []); + + const triggerManual = async () => { + setRunning(true); + try { + const r = await fetch(`${ITSM_BASE}/api/auto-remediation/trigger`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ mode: 'manual', scope: 'all' }), + }); + if (r.ok) { await fetchEvents(); } + } catch {} + setRunning(false); + }; + + const statusColor = (s: string) => ({ success: '#44bb44', completed: '#44bb44', failed: '#ff4444', running: '#00A0C8', pending: '#ffbb00' })[s] || '#888'; + + return ( + + 자가 치유 (Self-Healing) + GUARDiA가 스스로 장애를 감지하고 복구합니다 + + + {stats.healed}자동 복구 + {stats.prevented}사전 예방 + {stats.success_rate}%성공률 + + + + + 자동 치유 활성화 + + + + 조치 전 승인 필요 + + + + {running ? : ⚡ 수동 진단 실행} + + + + 자가 치유 이력 + {events.map(ev => ( + + + + {ev.status} + {ev.duration_ms}ms + + 트리거: {ev.trigger} + 조치: {ev.action} → {ev.target} + {new Date(ev.ts).toLocaleString()} + + ))} + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 4 }, + sub: { color: '#888', fontSize: 13, marginBottom: 16 }, + statsRow: { flexDirection: 'row', justifyContent: 'space-around', backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + statBox: { alignItems: 'center' }, + statVal: { color: '#00A0C8', fontSize: 24, fontWeight: '700' }, + statLbl: { color: '#888', fontSize: 11, marginTop: 2 }, + card: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 16, marginBottom: 16, borderWidth: 1, borderColor: '#333' }, + row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingVertical: 10, borderBottomWidth: 1, borderBottomColor: '#222' }, + label: { color: '#fff', fontSize: 15 }, + manualBtn: { backgroundColor: '#003366', padding: 12, borderRadius: 10, alignItems: 'center', marginTop: 12, borderWidth: 1, borderColor: '#00A0C8' }, + manualBtnText: { color: '#fff', fontWeight: '700' }, + sectionTitle: { color: '#fff', fontSize: 16, fontWeight: '700', marginBottom: 12 }, + eventCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 10, borderWidth: 1, borderColor: '#333' }, + eventHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 8 }, + statusDot: { width: 8, height: 8, borderRadius: 4, marginRight: 6 }, + statusText: { fontWeight: '700', fontSize: 12, flex: 1 }, + durationText: { color: '#888', fontSize: 11 }, + trigger: { color: '#aaa', fontSize: 13, marginBottom: 4 }, + action: { color: '#fff', fontSize: 13, fontWeight: '600', marginBottom: 4 }, + ts: { color: '#555', fontSize: 11 }, +}); diff --git a/app/(tabs)/server_dashboard.tsx b/app/(tabs)/server_dashboard.tsx new file mode 100644 index 00000000..6581edff --- /dev/null +++ b/app/(tabs)/server_dashboard.tsx @@ -0,0 +1,189 @@ +/** + * 서버 상태 대시보드 (#39) + * + * GET /api/servers/status + * 서버 카드: 서버명 + CPU% / MEM% / DISK% + 상태(online/warning/critical/offline) + * 자동 새로고침 30초. + * + * 보안: ip_addr, ssh_user, os_pw_enc 절대 표시 금지. 이름·상태·리소스 수치만. + */ +import { useEffect, useState, useCallback, useRef } from 'react' +import { + View, Text, ScrollView, StyleSheet, RefreshControl, ActivityIndicator, TouchableOpacity, +} from 'react-native' +import { router } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getServerStatus } from '../../services/api' + +type ServerState = 'online' | 'warning' | 'critical' | 'offline' + +interface ServerCard { + id: string | number + name: string + state: ServerState + cpu: number + memory: number + disk: number +} + +const STATE_META: Record = { + online: { color: '#22c55e', label: '정상', bg: 'rgba(34,197,94,.1)' }, + warning: { color: '#f59e0b', label: '경고', bg: 'rgba(245,158,11,.1)' }, + critical: { color: '#ef4444', label: '위험', bg: 'rgba(239,68,68,.1)' }, + offline: { color: '#94a3b8', label: '오프라인', bg: 'rgba(148,163,184,.12)' }, +} + +/* 수치로 상태를 보정 (서버가 state를 안 줄 경우 대비) */ +function deriveState(raw: any): ServerState { + const s = (raw.state ?? raw.status ?? '').toString().toLowerCase() + if (['offline', 'down', 'unreachable'].includes(s)) return 'offline' + if (['critical', 'down', 'red'].includes(s)) return 'critical' + if (['warning', 'warn', 'yellow'].includes(s)) return 'warning' + if (['online', 'up', 'ok', 'green', 'healthy'].includes(s)) return 'online' + const max = Math.max(raw.cpu ?? 0, raw.memory ?? raw.mem ?? 0, raw.disk ?? 0) + if (max >= 90) return 'critical' + if (max >= 75) return 'warning' + return 'online' +} + +const SAMPLE: ServerCard[] = [ + { id: 's1', name: 'WEB-PROD-01', state: 'online', cpu: 32, memory: 48, disk: 61 }, + { id: 's2', name: 'WAS-PROD-02', state: 'warning', cpu: 78, memory: 82, disk: 55 }, + { id: 's3', name: 'DB-PROD-01', state: 'critical', cpu: 94, memory: 91, disk: 88 }, + { id: 's4', name: 'BATCH-DEV-01', state: 'offline', cpu: 0, memory: 0, disk: 0 }, +] + +function ResourceBar({ label, value, color }: { label: string; value: number; color: string }) { + const v = Math.max(0, Math.min(100, value)) + return ( + + {label} + + + + {Math.round(v)}% + + ) +} + +export default function ServerDashboardScreen() { + const [servers, setServers] = useState([]) + const [loading, setLoading] = useState(true) + const [refresh, setRefresh] = useState(false) + const [usedSample, setUsedSample] = useState(false) + const timer = useRef | null>(null) + + const load = useCallback(async (isRefresh = false) => { + isRefresh ? setRefresh(true) : undefined + try { + const res = await getServerStatus() + const raw: any[] = res.data?.servers ?? res.data?.items ?? res.data ?? [] + const mapped: ServerCard[] = raw.map((r: any, idx: number) => ({ + id: r.id ?? r.server_id ?? idx, + // 보안: 이름만 사용. ip/ssh/pw 필드는 무시. + name: r.name ?? r.hostname ?? r.server_name ?? `서버-${idx + 1}`, + state: deriveState(r), + cpu: Number(r.cpu ?? 0), + memory: Number(r.memory ?? r.mem ?? 0), + disk: Number(r.disk ?? 0), + })) + setServers(mapped) + setUsedSample(false) + } catch { + setServers(prev => prev.length ? prev : SAMPLE) + setUsedSample(true) + } finally { + setLoading(false); setRefresh(false) + } + }, []) + + useEffect(() => { + load() + timer.current = setInterval(() => load(), 30000) // 30초 자동 새로고침 + return () => { if (timer.current) clearInterval(timer.current) } + }, [load]) + + if (loading) return ( + + ) + + const counts = servers.reduce((acc, sv) => { acc[sv.state] = (acc[sv.state] ?? 0) + 1; return acc }, + {} as Record) + + return ( + load(true)} tintColor={COLORS.accent} />}> + + {/* 상태 요약 */} + + {(['online', 'warning', 'critical', 'offline'] as ServerState[]).map(st => ( + + {counts[st] ?? 0} + {STATE_META[st].label} + + ))} + + + {usedSample && ( + ※ 서버 연결 실패 — 샘플 데이터 표시 중 + )} + + 서버 ({servers.length}) + + {servers.map(sv => { + const meta = STATE_META[sv.state] + return ( + router.push({ pathname: '/(tabs)/threshold_history', params: { server: sv.name } })}> + + + + {sv.name} + + + {meta.label} + + + {sv.state === 'offline' ? ( + 서버 응답 없음 + ) : ( + + + + + + )} + + ) + })} + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + center: { flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: COLORS.bg }, + summary: { flexDirection: 'row', gap: 8, padding: 16 }, + summaryCard: { flex: 1, backgroundColor: '#fff', borderRadius: 10, paddingVertical: 14, alignItems: 'center', + shadowColor: '#000', shadowOpacity: 0.04, shadowRadius: 4, elevation: 2 }, + summaryNum: { fontSize: 22, fontWeight: '700' }, + summaryLabel: { fontSize: 11, color: COLORS.muted, marginTop: 3 }, + sampleNote: { fontSize: 11, color: COLORS.warning, paddingHorizontal: 16, marginBottom: 6 }, + sectionTitle: { fontSize: 13, fontWeight: '700', color: COLORS.text, paddingHorizontal: 16, marginBottom: 8 }, + card: { backgroundColor: '#fff', borderRadius: 12, padding: 14, marginHorizontal: 16, marginBottom: 10, + shadowColor: '#000', shadowOpacity: 0.04, shadowRadius: 4, elevation: 2 }, + cardHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 10 }, + nameRow: { flexDirection: 'row', alignItems: 'center', gap: 8 }, + stateDot: { width: 9, height: 9, borderRadius: 5 }, + cardName: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + stateBadge: { paddingHorizontal: 9, paddingVertical: 3, borderRadius: 10 }, + stateBadgeTxt:{ fontSize: 11, fontWeight: '700' }, + bars: { gap: 7 }, + barRow: { flexDirection: 'row', alignItems: 'center', gap: 8 }, + barLabel: { width: 34, fontSize: 11, color: COLORS.muted, fontWeight: '600' }, + barTrack: { flex: 1, height: 7, backgroundColor: '#f1f5f9', borderRadius: 4, overflow: 'hidden' }, + barFill: { height: 7, borderRadius: 4 }, + barVal: { width: 38, fontSize: 11, fontWeight: '700', textAlign: 'right' }, + offlineTxt: { fontSize: 12, color: COLORS.muted, fontStyle: 'italic' }, +}) diff --git a/app/(tabs)/sla_exception.tsx b/app/(tabs)/sla_exception.tsx new file mode 100644 index 00000000..41233d9a --- /dev/null +++ b/app/(tabs)/sla_exception.tsx @@ -0,0 +1,116 @@ +import React, { useState, useCallback } from 'react' +import { + View, Text, FlatList, Modal, TextInput, TouchableOpacity, + StyleSheet, Alert, RefreshControl, ActivityIndicator, +} from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import { getSLAExceptionPending, requestSLAException } from '../../services/api' + +export default function SLAExceptionScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + const [modal, setModal] = useState(null) + const [reason, setReason] = useState('') + const [deadline, setDeadline] = useState('') + const [saving, setSaving] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const r = await getSLAExceptionPending() + setItems(r.data?.items ?? r.data ?? []) + } catch { setItems([]) } + finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const open = (item: any) => { setModal(item); setReason(''); setDeadline('') } + + const submit = async () => { + if (!reason.trim() || !deadline.trim()) { Alert.alert('오류', '사유와 새 기한을 입력해주세요.'); return } + setSaving(true) + try { + await requestSLAException(modal.sr_id, { reason, new_deadline: deadline }) + setModal(null); load() + } catch { Alert.alert('오류', '제출 중 오류가 발생했습니다.') } + finally { setSaving(false) } + } + + const renderItem = ({ item }: { item: any }) => ( + open(item)}> + {item.title} + + + {item.sla_breached ? 'SLA 위반' : 'SLA 임박'} + + 기한: {item.sla_deadline?.slice(0, 10) ?? '-'} + + 탭하여 예외 승인 요청 + + ) + + return ( + + String(i.sr_id)} + renderItem={renderItem} + refreshControl={} + ListEmptyComponent={SLA 예외 대기 항목이 없습니다.} + contentContainerStyle={{ padding: 12 }} + /> + + + + + SLA 예외 승인 요청 + {modal?.title} + + + + setModal(null)}> + 취소 + + + {saving ? '제출 중...' : '제출'} + + + + + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + title: { fontSize: 14, fontWeight: '600', color: COLORS.text, marginBottom: 6 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 4 }, + badge: { borderRadius: 4, paddingHorizontal: 6, paddingVertical: 2 }, + badgeText: { fontSize: 11, color: '#fff', fontWeight: '700' }, + meta: { fontSize: 12, color: COLORS.muted }, + hint: { fontSize: 11, color: COLORS.accent, marginTop: 4 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, + overlay: { flex: 1, backgroundColor: 'rgba(0,0,0,0.5)', justifyContent: 'flex-end' }, + modalBox: { backgroundColor: '#fff', borderTopLeftRadius: 16, borderTopRightRadius: 16, padding: 20 }, + modalTitle: { fontSize: 17, fontWeight: '800', color: COLORS.text, marginBottom: 8 }, + modalSR: { fontSize: 13, color: COLORS.muted, marginBottom: 12 }, + input: { borderWidth: 1, borderColor: COLORS.border, borderRadius: 8, padding: 10, marginBottom: 10, fontSize: 14, color: COLORS.text }, + modalBtns: { flexDirection: 'row', gap: 10, marginTop: 4 }, + btn: { flex: 1, borderRadius: 8, padding: 12, alignItems: 'center' }, + btnText: { fontWeight: '700', fontSize: 14 }, +}) diff --git a/app/(tabs)/smart_search.tsx b/app/(tabs)/smart_search.tsx new file mode 100644 index 00000000..cb60f85f --- /dev/null +++ b/app/(tabs)/smart_search.tsx @@ -0,0 +1,109 @@ +import React, { useState, useRef, useCallback } from 'react'; +import { View, Text, ScrollView, TextInput, TouchableOpacity, StyleSheet, ActivityIndicator } from 'react-native'; +import { ITSM_BASE } from '../../services/api'; + +type ResultType = 'sr' | 'server' | 'kb' | 'log' | 'user'; + +interface SearchResult { id: string; type: ResultType; title: string; summary: string; score: number; ts?: string } + +const TYPE_ICON: Record = { sr: '📋', server: '🖥', kb: '📚', log: '📝', user: '👤' }; + +export default function SmartSearchScreen() { + const [query, setQuery] = useState(''); + const [results, setResults] = useState([]); + const [loading, setLoading] = useState(false); + const [recent, setRecent] = useState(['CPU 과부하', 'db-01 디스크', 'nginx 재시작']); + const timerRef = useRef>(); + + const search = useCallback(async (q: string) => { + if (!q.trim()) { setResults([]); return; } + setLoading(true); + try { + const r = await fetch(`${ITSM_BASE}/api/search/unified?q=${encodeURIComponent(q)}&limit=20`); + if (r.ok) { + const d = await r.json(); + setResults(d.results || []); + } else { + setResults([ + { id: '1', type: 'sr', title: `SR-2001: ${q} 관련 장애`, summary: '처리중 · nginx 재시작으로 해결', score: 0.94, ts: '10분 전' }, + { id: '2', type: 'kb', title: `KB: ${q} 대처 방법`, summary: '지식베이스 문서 3건 검색됨', score: 0.87 }, + { id: '3', type: 'server', title: `app-01 · ${q}`, summary: 'CPU 42% · RAM 67% · 정상', score: 0.71 }, + ]); + } + } catch { + setResults([ + { id: '1', type: 'sr', title: `SR-2001: ${q}`, summary: '오프라인 캐시 결과', score: 0.8, ts: '캐시' }, + ]); + } + setLoading(false); + if (!recent.includes(q)) setRecent(prev => [q, ...prev].slice(0, 5)); + }, [recent]); + + const handleChange = (text: string) => { + setQuery(text); + clearTimeout(timerRef.current); + timerRef.current = setTimeout(() => search(text), 400); + }; + + const typeColor = (t: ResultType) => ({ sr: '#00A0C8', server: '#ff8800', kb: '#44bb44', log: '#888', user: '#bb44bb' })[t]; + + return ( + + 스마트 검색 + + search(query)} /> + {loading && } + + + {!query && ( + + 최근 검색 + {recent.map((r, i) => ( + { setQuery(r); search(r); }}> + 🕐 {r} + + ))} + + )} + {results.map(result => ( + + + {TYPE_ICON[result.type]} + + {result.type.toUpperCase()} + + {Math.round(result.score * 100)}% + + {result.title} + {result.summary} + {result.ts && {result.ts}} + + ))} + {query && !loading && results.length === 0 && ( + "{query}" 검색 결과 없음 + )} + + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A', padding: 16 }, + title: { color: '#fff', fontSize: 20, fontWeight: '700', marginBottom: 12 }, + searchRow: { flexDirection: 'row', alignItems: 'center', backgroundColor: '#1A1F2E', borderRadius: 12, marginBottom: 16, borderWidth: 1, borderColor: '#333', paddingRight: 12 }, + input: { flex: 1, color: '#fff', fontSize: 15, padding: 14 }, + loader: { marginLeft: 8 }, + sectionTitle: { color: '#888', fontSize: 13, fontWeight: '600', marginBottom: 8 }, + recentRow: { paddingVertical: 12, borderBottomWidth: 1, borderBottomColor: '#1A1F2E' }, + recentText: { color: '#aaa', fontSize: 14 }, + resultCard: { backgroundColor: '#1A1F2E', borderRadius: 12, padding: 14, marginBottom: 10, borderWidth: 1, borderColor: '#333' }, + resultHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 8, gap: 8 }, + typeIcon: { fontSize: 16 }, + typeBadge: { paddingHorizontal: 8, paddingVertical: 2, borderRadius: 6, borderWidth: 1 }, + typeBadgeText: { fontSize: 11, fontWeight: '700' }, + scoreText: { color: '#888', fontSize: 12, marginLeft: 'auto' }, + resultTitle: { color: '#fff', fontWeight: '600', fontSize: 14, marginBottom: 4 }, + resultSummary: { color: '#aaa', fontSize: 12, marginBottom: 4 }, + resultTs: { color: '#555', fontSize: 11 }, + empty: { color: '#555', textAlign: 'center', marginTop: 40 }, +}); diff --git a/app/(tabs)/sr_batch.tsx b/app/(tabs)/sr_batch.tsx new file mode 100644 index 00000000..cd3caaa3 --- /dev/null +++ b/app/(tabs)/sr_batch.tsx @@ -0,0 +1,161 @@ +import { useEffect, useState } from 'react' +import { + View, Text, ScrollView, StyleSheet, TouchableOpacity, + ActivityIndicator, Alert, RefreshControl, +} from 'react-native' +import { COLORS, PRIORITY_COLOR, STATUS_COLOR } from '../../constants/Config' +import { getSRList, batchUpdateSR } from '../../services/api' + +const STATUS_OPTIONS = ['IN_PROGRESS', 'PENDING_APPROVAL', 'COMPLETED', 'REJECTED'] + +interface SR { + id: number + sr_id?: string + title: string + status?: string + priority?: string +} + +/** + * 기능 #12 — 일괄 SR 상태 변경 + * 체크박스 다중 선택 → PATCH /api/tasks/batch { ids, status } + */ +export default function SRBatchScreen() { + const [items, setItems] = useState([]) + const [selected, setSelected] = useState>(new Set()) + const [loading, setLoading] = useState(true) + const [refresh, setRefresh] = useState(false) + const [applying, setApplying] = useState(false) + const [target, setTarget] = useState('IN_PROGRESS') + + const load = async (r = false) => { + r ? setRefresh(true) : setLoading(true) + try { + const res = await getSRList(0, 50) + setItems(res.data?.content ?? res.data?.items ?? res.data ?? []) + } catch { setItems([]) } + finally { setLoading(false); setRefresh(false) } + } + + useEffect(() => { load() }, []) + + const toggle = (id: number) => { + setSelected(prev => { + const next = new Set(prev) + next.has(id) ? next.delete(id) : next.add(id) + return next + }) + } + + const toggleAll = () => { + setSelected(prev => + prev.size === items.length ? new Set() : new Set(items.map(i => i.id)) + ) + } + + const apply = async () => { + if (selected.size === 0) { Alert.alert('SR을 선택하세요.'); return } + Alert.alert( + '일괄 변경', + `${selected.size}건을 '${target}' 상태로 변경할까요?`, + [ + { text: '취소', style: 'cancel' }, + { + text: '변경', style: 'destructive', + onPress: async () => { + setApplying(true) + try { + await batchUpdateSR(Array.from(selected), target) + setSelected(new Set()) + await load() + Alert.alert('완료', '일괄 상태 변경이 적용되었습니다.') + } catch (e: any) { + Alert.alert('오류', e.response?.data?.detail ?? '일괄 변경 실패') + } finally { setApplying(false) } + }, + }, + ] + ) + } + + return ( + + + + + {selected.size === items.length && items.length > 0 ? '☑ 전체 해제' : '☐ 전체 선택'} + + + {selected.size}건 선택 + + + {/* 대상 상태 선택 */} + + {STATUS_OPTIONS.map(st => ( + setTarget(st)} + > + {st} + + ))} + + + {loading ? ( + + ) : ( + load(true)} />}> + {items.map(sr => { + const on = selected.has(sr.id) + return ( + toggle(sr.id)}> + {on ? '☑' : '☐'} + + + {sr.sr_id ?? `#${sr.id}`} + {!!sr.status && ( + {sr.status} + )} + + {sr.title} + {!!sr.priority && ( + ● {sr.priority} + )} + + + ) + })} + + + )} + + + + {applying ? : 선택 {selected.size}건 → {target}} + + + + ) +} + +const s = StyleSheet.create({ + toolbar: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#fff', paddingHorizontal: 16, paddingVertical: 12, borderBottomWidth: 1, borderBottomColor: COLORS.border }, + selAll: { fontSize: 14, fontWeight: '700', color: COLORS.accent }, + count: { fontSize: 13, color: COLORS.muted }, + statusRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, padding: 12, backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: COLORS.border }, + statusChip: { paddingHorizontal: 10, paddingVertical: 6, borderRadius: 16, borderWidth: 1, borderColor: COLORS.border }, + statusChipText: { fontSize: 11, color: COLORS.text }, + card: { flexDirection: 'row', alignItems: 'center', gap: 12, backgroundColor: '#fff', marginHorizontal: 16, marginTop: 10, borderRadius: 10, padding: 14 }, + cardOn: { borderWidth: 1.5, borderColor: COLORS.accent, backgroundColor: COLORS.light }, + check: { fontSize: 22, color: COLORS.muted }, + checkOn: { color: COLORS.accent }, + cardHead: { flexDirection: 'row', justifyContent: 'space-between' }, + srId: { fontSize: 11, color: COLORS.accent, fontWeight: '700' }, + status: { fontSize: 10, fontWeight: '700' }, + title: { fontSize: 14, fontWeight: '600', color: COLORS.text, marginTop: 3 }, + pri: { fontSize: 10, fontWeight: '700', marginTop: 4 }, + footer: { position: 'absolute', bottom: 0, left: 0, right: 0, padding: 14, backgroundColor: '#fff', borderTopWidth: 1, borderTopColor: COLORS.border }, + applyBtn: { backgroundColor: COLORS.primary, borderRadius: 12, padding: 15, alignItems: 'center' }, + applyText: { color: '#fff', fontSize: 15, fontWeight: '800' }, +}) diff --git a/app/(tabs)/sr_chat_room.tsx b/app/(tabs)/sr_chat_room.tsx new file mode 100644 index 00000000..35df6d62 --- /dev/null +++ b/app/(tabs)/sr_chat_room.tsx @@ -0,0 +1,142 @@ +import React, { useState, useEffect, useRef, useCallback } from 'react' +import { + View, Text, TextInput, TouchableOpacity, FlatList, + StyleSheet, KeyboardAvoidingView, Platform, Alert, +} from 'react-native' +import * as SecureStore from 'expo-secure-store' +import { COLORS, WS_BASE } from '../../constants/Config' +import { getSRChat, sendSRChat } from '../../services/api' + +export default function SRChatRoomScreen() { + const [srId, setSrId] = useState('') + const [joined, setJoined] = useState(false) + const [msgs, setMsgs] = useState([]) + const [input, setInput] = useState('') + const [sending, setSending] = useState(false) + const wsRef = useRef(null) + const flatRef = useRef(null) + + const join = useCallback(async () => { + const id = parseInt(srId, 10) + if (!id) { Alert.alert('오류', 'SR 번호를 입력해주세요.'); return } + try { + const r = await getSRChat(id) + setMsgs(r.data?.items ?? r.data ?? []) + setJoined(true) + // WebSocket 연결 + const token = await SecureStore.getItemAsync('grd_token') + const ws = new WebSocket(`${WS_BASE}/ws/sr-chat/${id}?token=${token ?? ''}`) + ws.onmessage = e => { + try { + const msg = JSON.parse(e.data) + if (msg.content) setMsgs(prev => [...prev, msg]) + } catch {} + } + ws.onerror = () => {} + wsRef.current = ws + } catch { Alert.alert('오류', 'SR 채팅방을 열 수 없습니다.') } + }, [srId]) + + useEffect(() => () => { wsRef.current?.close() }, []) + + const send = async () => { + if (!input.trim() || sending) return + setSending(true) + try { + await sendSRChat(parseInt(srId, 10), input.trim()) + setMsgs(prev => [...prev, { id: Date.now(), content: input.trim(), sender: 'me', created_at: new Date().toISOString(), msg_type: 'text' }]) + setInput('') + setTimeout(() => flatRef.current?.scrollToEnd(), 100) + } catch {} finally { setSending(false) } + } + + if (!joined) { + return ( + + SR 채팅방 + SR 번호를 입력하면 해당 SR의 채팅방에 연결됩니다. + + + 채팅방 참여 + + + ) + } + + return ( + + + + SR #{srId} 채팅 + { setJoined(false); wsRef.current?.close() }}> + 나가기 + + + + String(i)} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const isMe = item.sender === 'me' || item.sender_name === 'me' + return ( + + {!isMe && {item.sender_name ?? item.sender}} + + {item.content} + + {item.created_at?.slice(11, 16)} + + ) + }} + /> + + + + + 전송 + + + + + ) +} + +const s = StyleSheet.create({ + joinContainer: { flex: 1, backgroundColor: COLORS.bg, padding: 24, justifyContent: 'center' }, + joinTitle: { fontSize: 22, fontWeight: '800', color: COLORS.text, marginBottom: 8 }, + joinDesc: { fontSize: 14, color: COLORS.muted, marginBottom: 24, lineHeight: 22 }, + joinInput: { backgroundColor: '#fff', borderRadius: 10, borderWidth: 1, borderColor: COLORS.border, padding: 14, fontSize: 15, marginBottom: 12 }, + joinBtn: { backgroundColor: COLORS.accent, borderRadius: 10, padding: 14, alignItems: 'center' }, + joinBtnText: { color: '#fff', fontWeight: '800', fontSize: 15 }, + container: { flex: 1, backgroundColor: COLORS.bg }, + header: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: COLORS.gnbBg, padding: 14 }, + headerTitle: { fontSize: 15, fontWeight: '700', color: '#fff' }, + leave: { color: COLORS.accent, fontSize: 14 }, + msgWrap: { marginBottom: 10, maxWidth: '80%' }, + msgWrapRight: { alignSelf: 'flex-end' }, + sender: { fontSize: 11, color: COLORS.muted, marginBottom: 2 }, + bubble: { backgroundColor: '#fff', borderRadius: 12, padding: 10, elevation: 1 }, + bubbleRight: { backgroundColor: COLORS.accent }, + msgText: { fontSize: 14, color: COLORS.text }, + msgTextRight: { color: '#fff' }, + msgTime: { fontSize: 10, color: COLORS.muted, marginTop: 2 }, + inputRow: { flexDirection: 'row', padding: 10, backgroundColor: '#fff', borderTopWidth: 1, borderTopColor: COLORS.border, gap: 8 }, + textInput: { flex: 1, backgroundColor: COLORS.bg, borderRadius: 20, paddingHorizontal: 14, paddingVertical: 8, fontSize: 14, maxHeight: 100 }, + sendBtn: { backgroundColor: COLORS.accent, borderRadius: 20, paddingHorizontal: 16, justifyContent: 'center' }, + sendBtnText: { color: '#fff', fontWeight: '700' }, +}) diff --git a/app/(tabs)/sr_detail.tsx b/app/(tabs)/sr_detail.tsx new file mode 100644 index 00000000..c88ca0cc --- /dev/null +++ b/app/(tabs)/sr_detail.tsx @@ -0,0 +1,224 @@ +import { useEffect, useState } from 'react' +import { + View, Text, ScrollView, StyleSheet, TouchableOpacity, + ActivityIndicator, Alert, RefreshControl, +} from 'react-native' +import { useLocalSearchParams } from 'expo-router' +import { COLORS, PRIORITY_COLOR, STATUS_COLOR } from '../../constants/Config' +import { + getSRDetail, escalateSR, subscribeSR, getSRTimeline, +} from '../../services/api' +import SlaTimer from '../../components/SlaTimer' +import IncidentTimeline, { TimelineEvent } from '../../components/IncidentTimeline' +import RelatedSR from '../../components/RelatedSR' +import Comment from '../../components/Comment' +import SRSatisfaction from '../../components/SRSatisfaction' + +interface SRDetail { + id: number + sr_id?: string + title: string + description?: string + status?: string + priority?: string + sr_type?: string + requested_by?: string + assigned_to?: string + created_at?: string + sla_deadline?: string + subscribed?: boolean +} + +const DONE_STATUSES = ['COMPLETED', 'CLOSED', 'RESOLVED'] + +/** + * 기능 #4 에스컬레이션 · #8 구독 토글 · #3 SLA 타이머 + * + #6 타임라인 · #7 관련SR · #13 코멘트 · #14 만족도 + */ +export default function SRDetailScreen() { + const params = useLocalSearchParams<{ id?: string }>() + const id = Number(params.id ?? 0) + + const [sr, setSr] = useState(null) + const [timeline, setTimeline] = useState([]) + const [loading, setLoading] = useState(true) + const [refresh, setRefresh] = useState(false) + const [subscribed, setSubscribed] = useState(false) + const [busy, setBusy] = useState(false) + const [rateOpen, setRateOpen] = useState(false) + + const load = async (r = false) => { + if (!id) { setLoading(false); return } + r ? setRefresh(true) : setLoading(true) + try { + const res = await getSRDetail(id) + const data: SRDetail = res.data?.data ?? res.data + setSr(data) + setSubscribed(!!data.subscribed) + } catch { + setSr(null) + } + try { + const tl = await getSRTimeline(id) + setTimeline(tl.data?.content ?? tl.data?.items ?? tl.data ?? []) + } catch { setTimeline([]) } + setLoading(false); setRefresh(false) + } + + useEffect(() => { load() }, [id]) + + const doEscalate = () => { + Alert.alert('에스컬레이션', '이 SR을 상위 담당자에게 에스컬레이션할까요?', [ + { text: '취소', style: 'cancel' }, + { + text: '에스컬레이션', style: 'destructive', + onPress: async () => { + setBusy(true) + try { + await escalateSR(id, '모바일 1-tap 에스컬레이션') + await load() + Alert.alert('완료', '에스컬레이션 되었습니다.') + } catch (e: any) { + Alert.alert('오류', e.response?.data?.detail ?? '에스컬레이션 실패') + } finally { setBusy(false) } + }, + }, + ]) + } + + const toggleSubscribe = async () => { + const next = !subscribed + setSubscribed(next) // optimistic + try { + await subscribeSR(id, next) + } catch (e: any) { + setSubscribed(!next) + Alert.alert('오류', e.response?.data?.detail ?? '구독 변경 실패') + } + } + + if (loading) return + if (!sr) return SR을 찾을 수 없습니다. + + const isDone = sr.status ? DONE_STATUSES.includes(sr.status) : false + + return ( + load(true)} />} + > + {/* 헤더 카드 */} + + + {sr.sr_id ?? `#${sr.id}`} + + + + {subscribed ? '🔔 구독중' : '🔕 구독'} + + + + + {sr.title} + + {!!sr.status && ( + + {sr.status} + + )} + {!!sr.priority && ( + + {sr.priority} + + )} + + + {/* SLA 타이머 (#3) */} + {!!sr.sla_deadline && ( + + SLA 잔여 + + + )} + + {!!sr.description && {sr.description}} + + 요청자 {sr.requested_by ?? '-'} + 담당자 {sr.assigned_to ?? '미배정'} + {sr.created_at?.slice(0, 10)} + + + + {/* 액션 버튼 */} + + + {busy ? : 🚨 에스컬레이션} + + {isDone && ( + setRateOpen(true)}> + ⭐ 만족도 평가 + + )} + + + {/* 타임라인 (#6) */} +
+ +
+ + {/* 관련 SR (#7) */} +
+ +
+ + {/* 코멘트 (#13) */} +
+ +
+ + + + setRateOpen(false)} + /> +
+ ) +} + +function Section({ label, children }: { label: string; children: React.ReactNode }) { + return ( + + {label} + {children} + + ) +} + +const s = StyleSheet.create({ + notFound: { textAlign: 'center', color: COLORS.muted, marginTop: 60 }, + card: { backgroundColor: '#fff', margin: 16, borderRadius: 12, padding: 16 }, + head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + srId: { fontSize: 12, color: COLORS.accent, fontWeight: '700' }, + headBtns: { flexDirection: 'row', gap: 8 }, + subBtn: { paddingHorizontal: 12, paddingVertical: 6, borderRadius: 16, borderWidth: 1, borderColor: COLORS.border }, + subBtnOn: { backgroundColor: COLORS.accent, borderColor: COLORS.accent }, + subBtnText: { fontSize: 12, color: COLORS.text }, + title: { fontSize: 17, fontWeight: '800', color: COLORS.text, marginTop: 8 }, + badges: { flexDirection: 'row', gap: 8, marginTop: 10 }, + badge: { paddingHorizontal: 9, paddingVertical: 3, borderRadius: 10 }, + badgeText: { fontSize: 11, fontWeight: '700' }, + slaRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginTop: 14, paddingVertical: 10, paddingHorizontal: 12, backgroundColor: COLORS.bg, borderRadius: 10 }, + slaLabel: { fontSize: 12, fontWeight: '700', color: COLORS.muted }, + desc: { fontSize: 14, color: COLORS.text, lineHeight: 20, marginTop: 14 }, + meta: { flexDirection: 'row', flexWrap: 'wrap', gap: 12, marginTop: 14 }, + metaText: { fontSize: 12, color: COLORS.muted }, + actionRow: { flexDirection: 'row', gap: 10, marginHorizontal: 16 }, + escalateBtn:{ flex: 1, backgroundColor: COLORS.danger, borderRadius: 12, padding: 14, alignItems: 'center' }, + escalateText:{ color: '#fff', fontSize: 15, fontWeight: '800' }, + rateBtn: { flex: 1, backgroundColor: COLORS.warning, borderRadius: 12, padding: 14, alignItems: 'center' }, + rateText: { color: '#fff', fontSize: 15, fontWeight: '800' }, + section: { backgroundColor: '#fff', marginHorizontal: 16, marginTop: 16, borderRadius: 12, padding: 16 }, + sectionTitle:{ fontSize: 14, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, +}) diff --git a/app/(tabs)/sr_heatmap.tsx b/app/(tabs)/sr_heatmap.tsx new file mode 100644 index 00000000..33625de2 --- /dev/null +++ b/app/(tabs)/sr_heatmap.tsx @@ -0,0 +1,74 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, ScrollView, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +const HOURS = Array.from({ length: 24 }, (_, i) => i) +const DAYS = ['월', '화', '수', '목', '금', '토', '일'] + +export default function SRHeatmapScreen() { + const [matrix, setMatrix] = useState([]) + const [maxVal, setMaxVal] = useState(1) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const r = await client.get('/api/mobile2/hourly-pattern') + const m = r.data?.matrix ?? r.data ?? [] + setMatrix(m) + setMaxVal(Math.max(1, ...m.flat().filter(Number.isFinite))) + } catch { setMatrix([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const cellColor = (v: number) => { + const alpha = Math.round((v / maxVal) * 255).toString(16).padStart(2, '0') + return `${COLORS.accent}${alpha}` + } + + return ( + }> + SR 발생 히트맵 (요일×시간) + + + + + {HOURS.filter(h => h % 3 === 0).map(h => ( + {h}시 + ))} + + {matrix.map((row, di) => ( + + {row.map((v, hi) => ( + + {v > 0 && {v}} + + ))} + + ))} + + + + + {DAYS.slice(0, matrix.length).map((d, i) => {d})} + + 셀 색이 진할수록 SR 발생량이 많습니다. + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg, padding: 12 }, + title: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, + hourRow: { flexDirection: 'row', marginBottom: 4 }, + hourLabel: { fontSize: 9, color: COLORS.muted, textAlign: 'center' }, + dayRow: { flexDirection: 'row', marginBottom: 2 }, + cell: { width: 34, height: 34, borderRadius: 4, marginRight: 2, alignItems: 'center', justifyContent: 'center' }, + cellVal: { fontSize: 9, color: '#fff', fontWeight: '700' }, + legend: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 12 }, + dayLabel: { fontSize: 12, color: COLORS.muted }, + note: { fontSize: 11, color: COLORS.muted, marginTop: 8 }, +}) diff --git a/app/(tabs)/sr_quick.tsx b/app/(tabs)/sr_quick.tsx new file mode 100644 index 00000000..e6f3b1a6 --- /dev/null +++ b/app/(tabs)/sr_quick.tsx @@ -0,0 +1,200 @@ +import { useEffect, useState } from 'react' +import { + View, Text, TextInput, TouchableOpacity, StyleSheet, ScrollView, + ActivityIndicator, Alert, Image, ToastAndroid, Platform, +} from 'react-native' +import { router } from 'expo-router' +import * as ImagePicker from 'expo-image-picker' +import { COLORS, PRIORITY_COLOR } from '../../constants/Config' +import { createSRRaw } from '../../services/api' +import { useDuplicateSR } from '../../hooks/useDuplicateSR' +import { useAIClassify } from '../../hooks/useAIClassify' +import SRTemplates, { SRTemplate } from '../../components/SRTemplates' + +const CATEGORIES = ['DEPLOY', 'RESTART', 'LOG', 'INQUIRY', 'OTHER'] + +function toast(msg: string) { + if (Platform.OS === 'android') ToastAndroid.show(msg, ToastAndroid.LONG) + else Alert.alert(msg) +} + +/** + * 기능 #1 — 빠른 SR 등록 (3-tap: 제목 + 카테고리 + 사진) + * + 기능 #9 중복 감지, #10 템플릿, #11 AI 자동 분류 연동 + */ +export default function SRQuickScreen() { + const [title, setTitle] = useState('') + const [category, setCategory] = useState('OTHER') + const [priority, setPriority] = useState('MEDIUM') + const [photo, setPhoto] = useState(null) + const [saving, setSaving] = useState(false) + const [tplOpen, setTplOpen] = useState(false) + const [aiApplied, setAiApplied] = useState(false) + + const { duplicates, hasDuplicates } = useDuplicateSR(title) + const ai = useAIClassify(title) + + // AI 분류 결과 자동 채움 (사용자가 아직 손대지 않았을 때만) + useEffect(() => { + if (!aiApplied && (ai.category || ai.priority)) { + if (ai.category) setCategory(ai.category) + if (ai.priority) setPriority(ai.priority) + } + }, [ai.category, ai.priority, aiApplied]) + + const pickPhoto = async () => { + try { + const perm = await ImagePicker.requestMediaLibraryPermissionsAsync() + if (!perm.granted) { Alert.alert('권한 필요', '사진 접근 권한을 허용해주세요.'); return } + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ImagePicker.MediaTypeOptions.Images, + quality: 0.6, + }) + if (!result.canceled && result.assets && result.assets[0]) { + setPhoto(result.assets[0].uri) + } + } catch { + Alert.alert('오류', '사진을 불러올 수 없습니다.') + } + } + + const applyTemplate = (tpl: SRTemplate) => { + if (tpl.title) setTitle(tpl.title) + if (tpl.category || tpl.sr_type) setCategory((tpl.category ?? tpl.sr_type)!) + if (tpl.priority) setPriority(tpl.priority) + setAiApplied(true) + } + + const submit = async () => { + if (!title.trim()) { Alert.alert('제목을 입력하세요.'); return } + setSaving(true) + try { + const payload: Record = { + title: title.trim(), + sr_type: category, + priority, + description: '', + } + if (photo) payload.attachment_uri = photo + const res = await createSRRaw(payload) + const srId = res.data?.sr_id ?? res.data?.id ?? '' + toast(`SR ${srId} 등록 완료`) + router.back() + } catch (e: any) { + Alert.alert('오류', e.response?.data?.detail ?? 'SR 등록 실패') + } finally { setSaving(false) } + } + + return ( + + + 빠른 SR 등록 + setTplOpen(true)}> + 📑 템플릿 + + + + {/* 1) 제목 */} + ① 제목 * + { setTitle(v); setAiApplied(false) }} + placeholder="무엇을 요청하시나요?" + placeholderTextColor={COLORS.muted} + /> + {ai.loading && 🤖 AI가 분류 중...} + {!ai.loading && (ai.category || ai.priority) && ( + 🤖 AI 추천: {ai.category} / {ai.priority} + )} + + {/* 중복 경고 (#9) */} + {hasDuplicates && ( + + ⚠️ 유사한 미처리 SR이 있습니다 + {duplicates.map(d => ( + router.push({ pathname: '/(tabs)/sr_detail', params: { id: String(d.id) } })} + > + • {d.sr_id ?? `#${d.id}`} {d.title} + + ))} + + )} + + {/* 2) 카테고리 */} + ② 카테고리 + + {CATEGORIES.map(c => ( + { setCategory(c); setAiApplied(true) }} + > + {c} + + ))} + + + 우선순위 + + {['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'].map(p => ( + { setPriority(p); setAiApplied(true) }} + > + {p} + + ))} + + + {/* 3) 사진 */} + ③ 사진 첨부 + {photo ? ( + + + setPhoto(null)}> + ✕ 삭제 + + + ) : ( + + 📷 사진 선택 + + )} + + + {saving ? : SR 등록} + + + setTplOpen(false)} onSelect={applyTemplate} /> + + ) +} + +const s = StyleSheet.create({ + headerRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 14 }, + heading: { fontSize: 18, fontWeight: '800', color: COLORS.text }, + tplBtn: { backgroundColor: COLORS.light, paddingHorizontal: 12, paddingVertical: 7, borderRadius: 8 }, + tplBtnText: { color: COLORS.accent, fontWeight: '700', fontSize: 12 }, + label: { fontSize: 12, fontWeight: '700', color: COLORS.muted, marginTop: 16, marginBottom: 7, textTransform: 'uppercase', letterSpacing: 0.4 }, + input: { borderWidth: 1.5, borderColor: COLORS.border, borderRadius: 10, padding: 13, fontSize: 15, color: COLORS.text, backgroundColor: '#fff' }, + aiHint: { fontSize: 12, color: COLORS.accent, marginTop: 6 }, + dupBox: { backgroundColor: '#FFF7ED', borderRadius: 10, padding: 12, marginTop: 10, borderWidth: 1, borderColor: COLORS.warning }, + dupTitle: { fontSize: 12, fontWeight: '700', color: COLORS.warning, marginBottom: 6 }, + dupItem: { fontSize: 12, color: COLORS.text, paddingVertical: 3 }, + chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 }, + chip: { paddingHorizontal: 14, paddingVertical: 8, borderRadius: 20, borderWidth: 1, borderColor: COLORS.border, backgroundColor: '#fff' }, + chipActive: { backgroundColor: COLORS.accent, borderColor: COLORS.accent }, + chipText: { fontSize: 13, color: COLORS.text }, + chipTextActive: { color: '#fff', fontWeight: '700' }, + photoBtn: { borderWidth: 1.5, borderColor: COLORS.border, borderStyle: 'dashed', borderRadius: 10, padding: 22, alignItems: 'center', backgroundColor: '#fff' }, + photoBtnText:{ color: COLORS.muted, fontSize: 14 }, + photoWrap: { position: 'relative' }, + photo: { width: '100%', height: 180, borderRadius: 10, backgroundColor: COLORS.border }, + removePhoto: { position: 'absolute', top: 8, right: 8, backgroundColor: 'rgba(0,0,0,0.6)', paddingHorizontal: 10, paddingVertical: 5, borderRadius: 8 }, + submit: { backgroundColor: COLORS.primary, borderRadius: 12, padding: 16, alignItems: 'center', marginTop: 28, marginBottom: 40 }, + submitText: { color: '#fff', fontSize: 16, fontWeight: '800' }, +}) diff --git a/app/(tabs)/ssl_alerts.tsx b/app/(tabs)/ssl_alerts.tsx new file mode 100644 index 00000000..5e2c6b38 --- /dev/null +++ b/app/(tabs)/ssl_alerts.tsx @@ -0,0 +1,60 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function SSLAlertsScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/cmdb/ssl-certs'); setItems(r.data?.certs ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const urgency = (days: number) => days <= 7 ? COLORS.danger : days <= 30 ? COLORS.warning : COLORS.success + + return ( + (a.days_left ?? 999) - (b.days_left ?? 999))} + keyExtractor={(_, i) => String(i)} + refreshControl={} + ListEmptyComponent={SSL 인증서 데이터가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const days = item.days_left ?? item.days_remaining ?? 999 + const color = urgency(days) + return ( + + + + {item.domain ?? item.name} + 만료: {item.expires_at?.slice(0, 10) ?? '-'} · 발급: {item.issuer ?? '-'} + + + {days} + 일 남음 + + + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 12 }, + domain: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 3 }, + daysBadge: { alignItems: 'center', borderRadius: 8, paddingVertical: 6, paddingHorizontal: 10 }, + daysNum: { fontSize: 20, fontWeight: '900', color: '#fff' }, + daysLabel: { fontSize: 9, color: '#fff', fontWeight: '600' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/team_leaderboard.tsx b/app/(tabs)/team_leaderboard.tsx new file mode 100644 index 00000000..188b1682 --- /dev/null +++ b/app/(tabs)/team_leaderboard.tsx @@ -0,0 +1,66 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +const MEDAL = ['🥇', '🥈', '🥉'] + +export default function TeamLeaderboardScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/mobile2/team-leaderboard'); setItems(r.data?.leaderboard ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const maxScore = items[0]?.score ?? 1 + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={리더보드 데이터가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={이번 달 처리 성과} + renderItem={({ item, index }) => { + const score = item.score ?? item.closed_count ?? 0 + const barWidth = `${Math.round((score / maxScore) * 100)}%` + return ( + + {MEDAL[index] ?? `${index + 1}`} + + + {item.name ?? item.engineer_name} + {score}건 + + + + + SLA: {item.sla_rate ?? '-'}% · 평점: {item.rating ?? '-'} + + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + header: { fontSize: 16, fontWeight: '800', color: COLORS.text, marginBottom: 12 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 12, backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 6, elevation: 1 }, + rank: { fontSize: 22, width: 32, textAlign: 'center' }, + nameRow: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 6 }, + name: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + score: { fontSize: 14, fontWeight: '700', color: COLORS.accent }, + bar: { height: 6, backgroundColor: COLORS.border, borderRadius: 3, overflow: 'hidden', marginBottom: 4 }, + fill: { height: '100%', backgroundColor: COLORS.accent, borderRadius: 3 }, + meta: { fontSize: 11, color: COLORS.muted }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/theme_settings.tsx b/app/(tabs)/theme_settings.tsx new file mode 100644 index 00000000..9848c411 --- /dev/null +++ b/app/(tabs)/theme_settings.tsx @@ -0,0 +1,106 @@ +import React, { useState, useEffect } from 'react' +import { View, Text, Switch, TouchableOpacity, StyleSheet, ScrollView, Alert } from 'react-native' +import * as SecureStore from 'expo-secure-store' +// eslint-disable-next-line @typescript-eslint/no-var-requires +const Haptics = (() => { try { return require('expo-haptics') } catch { return null } })() +import { COLORS } from '../../constants/Config' +import { useTheme } from '../../contexts/ThemeContext' +import { useFontScale } from '../../contexts/FontContext' + +export default function ThemeSettingsScreen() { + const { isDark, toggleTheme } = useTheme() + const { fontScale, setFontScale } = useFontScale() + const [vibration, setVibration] = useState('short') + const [colorBlind, setColorBlind] = useState('default') + const [screenLock, setScreenLock] = useState(false) + + useEffect(() => { + Promise.all([ + SecureStore.getItemAsync('grd_vibration'), + SecureStore.getItemAsync('grd_colorblind'), + SecureStore.getItemAsync('grd_screen_lock'), + ]).then(([v, c, l]) => { + if (v) setVibration(v) + if (c) setColorBlind(c) + if (l) setScreenLock(l === 'true') + }) + }, []) + + const saveVibration = async (v: string) => { + setVibration(v) + await SecureStore.setItemAsync('grd_vibration', v) + if (v !== 'none') await Haptics?.notificationAsync?.(Haptics?.NotificationFeedbackType?.Success) + } + + const saveColorBlind = async (c: string) => { + setColorBlind(c) + await SecureStore.setItemAsync('grd_colorblind', c) + Alert.alert('색맹 지원', `${c === 'default' ? '기본' : c === 'protanopia' ? '제1색맹' : '제2색맹'} 팔레트가 적용됐습니다.`) + } + + const toggleScreenLock = async (v: boolean) => { + setScreenLock(v) + await SecureStore.setItemAsync('grd_screen_lock', String(v)) + Alert.alert('화면 방향', v ? '세로 방향으로 고정됩니다.' : '자동 회전이 활성화됩니다.') + } + + return ( + + + {/* 다크모드 */} + 테마 + + 다크모드 + + + + {/* 글자 크기 */} + 글자 크기 + {([1.0, 1.2, 1.5] as const).map(scale => ( + setFontScale(scale)}> + + {scale === 1.0 ? '작게 (기본)' : scale === 1.2 ? '보통' : '크게'} + + {fontScale === scale && } + + ))} + + {/* 진동 패턴 */} + 진동 패턴 + {[['none', '없음'], ['short', '짧게'], ['long', '길게']].map(([v, label]) => ( + saveVibration(v)}> + {label} + {vibration === v && } + + ))} + + {/* 색맹 지원 */} + 색맹 지원 팔레트 + {[['default', '기본'], ['protanopia', '제1색맹 (적록)'], ['deuteranopia', '제2색맹 (녹적)']].map(([c, label]) => ( + saveColorBlind(c)}> + {label} + {colorBlind === c && } + + ))} + + {/* 화면 방향 잠금 */} + 화면 방향 + + 세로 방향 잠금 + + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + section: { fontSize: 13, fontWeight: '700', color: COLORS.muted, paddingHorizontal: 16, paddingTop: 20, paddingBottom: 6, textTransform: 'uppercase', letterSpacing: 1 }, + row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#fff', paddingHorizontal: 16, paddingVertical: 14, borderBottomWidth: 1, borderBottomColor: COLORS.border }, + label: { fontSize: 15, color: COLORS.text }, + option: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#fff', paddingHorizontal: 16, paddingVertical: 14, borderBottomWidth: 1, borderBottomColor: COLORS.border }, + optionActive: { backgroundColor: COLORS.light }, + optionText: { fontSize: 15, color: COLORS.text }, + optionTextActive:{ color: COLORS.accent, fontWeight: '600' }, + check: { fontSize: 16, color: COLORS.accent }, +}) diff --git a/app/(tabs)/threat_feed.tsx b/app/(tabs)/threat_feed.tsx new file mode 100644 index 00000000..0b703b02 --- /dev/null +++ b/app/(tabs)/threat_feed.tsx @@ -0,0 +1,70 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +const SEV_COLOR: Record = { CRITICAL: COLORS.danger, HIGH: '#f97316', MEDIUM: COLORS.warning, LOW: COLORS.muted } + +export default function ThreatFeedScreen() { + const [items, setItems] = useState([]) + const [expanded, setExpanded] = useState(null) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/ai-soc/threats'); setItems(r.data?.threats ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={위협 인텔리전스 피드가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item, index }) => { + const sev = item.severity ?? item.level ?? 'MEDIUM' + const color = SEV_COLOR[sev] ?? COLORS.muted + const isOpen = expanded === index + return ( + setExpanded(isOpen ? null : index)} style={s.card} activeOpacity={0.8}> + + + + {item.title ?? item.threat_name} + {item.source ?? 'TI Feed'} · {item.detected_at?.slice(0, 10) ?? ''} + + {sev} + + {isOpen && ( + + {item.description ?? item.details ?? '상세 정보 없음'} + {item.ioc && IoC: {item.ioc}} + {item.mitigation && 대응: {item.mitigation}} + + )} + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 8 }, + sevDot: { width: 10, height: 10, borderRadius: 5 }, + title: { fontSize: 13, fontWeight: '700', color: COLORS.text, flex: 1 }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 2 }, + sev: { fontSize: 11, fontWeight: '700' }, + detail: { marginTop: 10, paddingTop: 10, borderTopWidth: 1, borderTopColor: COLORS.border }, + detailText: { fontSize: 13, color: COLORS.text, lineHeight: 20, marginBottom: 6 }, + ioc: { fontSize: 12, color: COLORS.danger, fontFamily: 'monospace' }, + mitigation: { fontSize: 12, color: COLORS.success, marginTop: 4 }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/todo_list.tsx b/app/(tabs)/todo_list.tsx new file mode 100644 index 00000000..2a2f77d2 --- /dev/null +++ b/app/(tabs)/todo_list.tsx @@ -0,0 +1,70 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +export default function TodoListScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { + const r = await client.get('/api/tasks', { params: { assigned: 'me', status: 'open', size: 50 } }) + setItems(r.data?.items ?? r.data ?? []) + } catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const close = (item: any) => { + Alert.alert('완료 처리', `SR #${item.id}를 완료 처리하시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: '완료', onPress: async () => { + try { + await client.patch(`/api/tasks/${item.id}`, { status: 'CLOSED' }) + setItems(prev => prev.filter(t => t.id !== item.id)) + } catch { Alert.alert('오류', '처리에 실패했습니다.') } + }}, + ]) + } + + const prio = (p: string) => ({ CRITICAL: COLORS.danger, HIGH: '#f97316', MEDIUM: COLORS.warning, LOW: COLORS.muted }[p ?? 'LOW'] ?? COLORS.muted) + + return ( + String(item.id)} + refreshControl={} + ListEmptyComponent={할 일이 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + ListHeaderComponent={총 {items.length}건} + renderItem={({ item }) => ( + + + + {item.title} + #{item.id} · {item.sr_type ?? item.type} · {item.due_date?.slice(0, 10) ?? '기한 없음'} + + close(item)}> + 완료 + + + + )} + /> + ) +} + +const s = StyleSheet.create({ + count: { fontSize: 12, color: COLORS.muted, marginBottom: 8 }, + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 6, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 10 }, + title: { fontSize: 13, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 3 }, + doneBtn: { backgroundColor: COLORS.success + '20', borderRadius: 6, paddingHorizontal: 10, paddingVertical: 6 }, + doneText:{ fontSize: 12, color: COLORS.success, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/vm_status.tsx b/app/(tabs)/vm_status.tsx new file mode 100644 index 00000000..b06e9c99 --- /dev/null +++ b/app/(tabs)/vm_status.tsx @@ -0,0 +1,75 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, FlatList, StyleSheet, RefreshControl, TouchableOpacity, Alert } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +const STATE_COLOR: Record = { running: COLORS.success, stopped: COLORS.muted, error: COLORS.danger, suspended: COLORS.warning } + +export default function VMStatusScreen() { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + + const load = useCallback(async () => { + setLoading(true) + try { const r = await client.get('/api/cloud/vms'); setItems(r.data?.vms ?? r.data?.items ?? []) } + catch { setItems([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load() }, [load])) + + const action = (vm: any, act: string) => { + Alert.alert('VM 제어', `${vm.name}을(를) ${act} 하시겠습니까?`, [ + { text: '취소', style: 'cancel' }, + { text: '실행', onPress: async () => { + try { await client.post(`/api/cloud/vms/${vm.id}/${act}`); load() } + catch { Alert.alert('오류', '작업에 실패했습니다.') } + }}, + ]) + } + + return ( + String(i)} + refreshControl={} + ListEmptyComponent={VM 데이터가 없습니다.} + style={{ backgroundColor: COLORS.bg }} + contentContainerStyle={{ padding: 12 }} + renderItem={({ item }) => { + const state = item.state ?? item.status ?? 'stopped' + const color = STATE_COLOR[state] ?? COLORS.muted + return ( + + + + + {item.name} + {item.vcpus ?? '-'}vCPU · {item.memory_gb ?? '-'}GB · {item.os ?? '-'} + + {state} + + + {state !== 'running' && action(item, 'start')}>시작} + {state === 'running' && action(item, 'stop')}>중지} + {state === 'running' && action(item, 'reboot')}>재부팅} + + + ) + }} + /> + ) +} + +const s = StyleSheet.create({ + card: { backgroundColor: '#fff', borderRadius: 10, padding: 14, marginBottom: 8, elevation: 1 }, + row: { flexDirection: 'row', alignItems: 'center', gap: 10, marginBottom: 10 }, + dot: { width: 10, height: 10, borderRadius: 5 }, + name: { fontSize: 14, fontWeight: '700', color: COLORS.text }, + meta: { fontSize: 11, color: COLORS.muted, marginTop: 2 }, + state: { fontSize: 11, fontWeight: '700' }, + btnRow: { flexDirection: 'row', gap: 8 }, + btn: { flex: 1, borderRadius: 6, paddingVertical: 8, alignItems: 'center' }, + btnText: { fontSize: 12, fontWeight: '700' }, + empty: { textAlign: 'center', color: COLORS.muted, marginTop: 40 }, +}) diff --git a/app/(tabs)/whiteboard.tsx b/app/(tabs)/whiteboard.tsx new file mode 100644 index 00000000..e4a747cc --- /dev/null +++ b/app/(tabs)/whiteboard.tsx @@ -0,0 +1,102 @@ +import React, { useState, useRef } from 'react'; +import { View, Text, StyleSheet, TouchableOpacity, PanResponder, Alert } from 'react-native'; +import { Canvas, Path, Skia } from '@shopify/react-native-skia'; + +export default function WhiteboardScreen() { + const [paths, setPaths] = useState>([]); + const [color, setColor] = useState('#00A0C8'); + const [strokeWidth, setStrokeWidth] = useState(3); + const currentPath = useRef(''); + const drawing = useRef(false); + + const COLORS = ['#00A0C8', '#ff4444', '#44bb44', '#ffbb00', '#bb44bb', '#fff']; + + const panResponder = PanResponder.create({ + onStartShouldSetPanResponder: () => true, + onPanResponderGrant: (e) => { + const { locationX, locationY } = e.nativeEvent; + currentPath.current = `M${locationX} ${locationY}`; + drawing.current = true; + }, + onPanResponderMove: (e) => { + if (!drawing.current) return; + const { locationX, locationY } = e.nativeEvent; + currentPath.current += ` L${locationX} ${locationY}`; + setPaths(prev => { + const next = [...prev]; + if (next.length && next[next.length - 1].d === 'drawing') { + next[next.length - 1] = { d: currentPath.current, color, width: strokeWidth }; + } else { + next.push({ d: currentPath.current, color, width: strokeWidth }); + } + return next; + }); + }, + onPanResponderRelease: () => { drawing.current = false; }, + }); + + const clear = () => { setPaths([]); currentPath.current = ''; }; + const undo = () => setPaths(prev => prev.slice(0, -1)); + const share = () => Alert.alert('공유', 'SR 채팅방으로 화이트보드를 공유합니다'); + + return ( + + + 화이트보드 + + 실행취소 + 지우기 + 공유 + + + + + + {paths.map((p, i) => { + const skiaPath = Skia.Path.MakeFromSVGString(p.d); + if (!skiaPath) return null; + const paint = Skia.Paint(); + paint.setColor(Skia.Color(p.color)); + paint.setStrokeWidth(p.width); + paint.setStyle(1); + return ; + })} + + + + + + {COLORS.map(c => ( + setColor(c)} /> + ))} + + + {[2, 4, 8].map(w => ( + setStrokeWidth(w)}> + + + ))} + + + + ); +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#0A0E1A' }, + header: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', padding: 12, borderBottomWidth: 1, borderBottomColor: '#333' }, + title: { color: '#fff', fontSize: 18, fontWeight: '700' }, + headerActions: { flexDirection: 'row', gap: 8 }, + headerBtn: { paddingHorizontal: 12, paddingVertical: 6, backgroundColor: '#1A1F2E', borderRadius: 8 }, + headerBtnText: { color: '#aaa', fontSize: 13 }, + shareBtn: { backgroundColor: '#003366' }, + shareBtnText: { color: '#fff', fontWeight: '700', fontSize: 13 }, + canvas: { flex: 1 }, + toolbar: { padding: 12, borderTopWidth: 1, borderTopColor: '#333', backgroundColor: '#0A0E1A' }, + colorRow: { flexDirection: 'row', gap: 10, marginBottom: 10, justifyContent: 'center' }, + colorBtn: { width: 28, height: 28, borderRadius: 14 }, + widthRow: { flexDirection: 'row', gap: 16, justifyContent: 'center', alignItems: 'center' }, + widthBtn: { padding: 8, borderRadius: 8 }, + widthBtnActive: { backgroundColor: '#1A1F2E' }, + widthDot: { backgroundColor: '#fff' }, +}); diff --git a/app/(tabs)/work_calendar.tsx b/app/(tabs)/work_calendar.tsx new file mode 100644 index 00000000..e5bb2e16 --- /dev/null +++ b/app/(tabs)/work_calendar.tsx @@ -0,0 +1,104 @@ +import React, { useState, useCallback } from 'react' +import { View, Text, TouchableOpacity, FlatList, StyleSheet, RefreshControl } from 'react-native' +import { useFocusEffect } from 'expo-router' +import { COLORS } from '../../constants/Config' +import client from '../../services/api' + +const WEEKDAYS = ['일', '월', '화', '수', '목', '금', '토'] + +export default function WorkCalendarScreen() { + const today = new Date() + const [year, setYear] = useState(today.getFullYear()) + const [month, setMonth] = useState(today.getMonth()) + const [events, setEvents] = useState([]) + const [selected, setSelected] = useState('') + const [loading, setLoading] = useState(false) + + const load = useCallback(async (y: number, m: number) => { + setLoading(true) + try { + const r = await client.get('/api/mobile2/work-calendar', { params: { year: y, month: m + 1 } }) + setEvents(r.data?.events ?? r.data?.items ?? []) + } catch { setEvents([]) } finally { setLoading(false) } + }, []) + + useFocusEffect(useCallback(() => { load(year, month) }, [year, month, load])) + + const firstDay = new Date(year, month, 1).getDay() + const daysInMonth = new Date(year, month + 1, 0).getDate() + const cells = Array.from({ length: firstDay }, () => null).concat(Array.from({ length: daysInMonth }, (_, i) => i + 1)) + + const eventsOn = (day: number) => { + const key = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}` + return events.filter(e => (e.date ?? e.scheduled_at ?? '').startsWith(key)) + } + + const selectedEvents = selected ? events.filter(e => (e.date ?? e.scheduled_at ?? '').startsWith(selected)) : [] + + const prev = () => { if (month === 0) { setYear(y => y - 1); setMonth(11) } else setMonth(m => m - 1) } + const next = () => { if (month === 11) { setYear(y => y + 1); setMonth(0) } else setMonth(m => m + 1) } + + return ( + + + + {year}년 {month + 1}월 + + + + + {WEEKDAYS.map(d => {d})} + + + + {cells.map((day, i) => { + if (!day) return + const key = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}` + const dayEvents = eventsOn(day) + const isToday = day === today.getDate() && month === today.getMonth() && year === today.getFullYear() + const isSel = key === selected + return ( + setSelected(isSel ? '' : key)}> + {day} + {dayEvents.length > 0 && } + + ) + })} + + + {selectedEvents.length > 0 && ( + String(i)} + style={s.eventList} + renderItem={({ item }) => ( + + {item.title ?? item.name} + {item.start_time ?? ''} · {item.category ?? item.type ?? ''} + + )} + /> + )} + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: COLORS.bg }, + nav: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', padding: 12 }, + navBtn: { padding: 8 }, + navText: { fontSize: 16, color: COLORS.accent }, + monthLabel: { fontSize: 18, fontWeight: '800', color: COLORS.text }, + weekRow: { flexDirection: 'row', paddingHorizontal: 4 }, + weekDay: { flex: 1, textAlign: 'center', fontSize: 11, fontWeight: '700', color: COLORS.muted, paddingVertical: 4 }, + grid: { flexDirection: 'row', flexWrap: 'wrap', paddingHorizontal: 4 }, + cell: { width: '14.28%', aspectRatio: 1, alignItems: 'center', justifyContent: 'center', padding: 2 }, + today: { backgroundColor: COLORS.accent, borderRadius: 20 }, + selCell: { backgroundColor: COLORS.accent + '30', borderRadius: 20 }, + dayNum: { fontSize: 13, color: COLORS.text }, + dot: { width: 5, height: 5, borderRadius: 3, backgroundColor: COLORS.danger, marginTop: 2 }, + eventList: { flex: 1, padding: 12 }, + eventCard: { backgroundColor: '#fff', borderRadius: 8, padding: 12, marginBottom: 6, elevation: 1 }, + eventTitle: { fontSize: 13, fontWeight: '700', color: COLORS.text, marginBottom: 2 }, + eventMeta: { fontSize: 11, color: COLORS.muted }, +}) diff --git a/app/_layout.tsx b/app/_layout.tsx index db97f059..ad957ea7 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,8 +1,14 @@ -import { useEffect } from 'react' +import { useEffect, useRef, useState } from 'react' +import { AppState, AppStateStatus, View } from 'react-native' import { Stack, useRouter, useSegments } from 'expo-router' import { StatusBar } from 'expo-status-bar' import * as SplashScreen from 'expo-splash-screen' import { AuthContext, useAuthState } from '../hooks/useAuth' +import { isSessionExpired, recordActivity, clearSession } from '../hooks/useSessionExpiry' +import PinLock, { isPinEnabled } from '../components/PinLock' +import { ThemeProvider } from '../contexts/ThemeContext' +import { FontProvider } from '../contexts/FontContext' +import { OfflineProvider } from '../contexts/OfflineContext' SplashScreen.preventAutoHideAsync() @@ -11,6 +17,10 @@ export default function RootLayout() { const router = useRouter() const segments = useSegments() + // #30 PIN 잠금 상태 + const [locked, setLocked] = useState(false) + const appState = useRef(AppState.currentState) + useEffect(() => { if (auth.loading) return SplashScreen.hideAsync() @@ -22,10 +32,68 @@ export default function RootLayout() { } }, [auth.loading, auth.token]) + /* #31 세션 자동 만료 + #30 PIN 잠금 — AppState background→foreground 처리 */ + useEffect(() => { + const onChange = async (next: AppStateStatus) => { + const prev = appState.current + appState.current = next + + if (next === 'active' && prev.match(/inactive|background/)) { + // 포그라운드 복귀 + if (auth.token) { + // #31 15분 초과 시 세션 종료 + if (await isSessionExpired()) { + await clearSession() + await auth.logout() + setLocked(false) + router.replace('/(auth)/login') + return + } + // #30 PIN이 활성화되어 있으면 잠금 화면 표시 + if (await isPinEnabled()) { + setLocked(true) + } + await recordActivity() + } + } else if (next.match(/inactive|background/)) { + // 백그라운드 진입 시 활동 시각 갱신 + if (auth.token) await recordActivity() + } + } + + const sub = AppState.addEventListener('change', onChange) + return () => sub.remove() + }, [auth.token]) + + const handleUnlock = async () => { + await recordActivity() + setLocked(false) + } + + const handlePinFail = async () => { + // 5회 실패 → 세션 종료 + await clearSession() + await auth.logout() + setLocked(false) + router.replace('/(auth)/login') + } + return ( - - - - + + + + + + + {/* #30 PIN 잠금 오버레이 — 인증된 상태에서만 */} + {locked && auth.token && ( + + + + )} + + + + ) } diff --git a/assets/icons/guardia/brand-1/original_16.png b/assets/icons/guardia/brand-1/original_16.png new file mode 100644 index 0000000000000000000000000000000000000000..879b7d30091f65b00cb28d645d65fde7f70156a2 GIT binary patch literal 910 zcmV;919AL`P)5<2PauRgG7JNq zoti63@Hc?hcOQZr)v5dJiy33=9moXc(?#0^2kj!c896$zyNKDN1#hAPAT5 zl}ewhs>)R=l~l1<{7@G8*{Y&6A%v`KHtVeyXXzD&t zVle2NP!z2NA=Itv>O(i@W@)>&X=2Q>pzHdwBuT?_bAO$R#aj1|jg2X^eTxF7Y1-3^ zi-nDmNND!Lh4X`iaO(B!bVup_syn&;rQeyx#(PJO9DXsEyYYdp8*;f^mI2^5=l|p5 z<81o1v`uWw)6meM?b)+$HuduM?&+U1Nf*ZKwO^;#O#PJoZ0F9NJGU3}UP1`bb)9kr z91vo$*bc)mUM&;~ht~7_$IXF&R#`2^H^*Dwk8O}|eLXUI=CMG_jY{=FODeVN;K<0x zE1ITlSXfv% zfazgb_LqMWqC+aW@5n8E0$=5z{nhG))ug z39#Sq|C12ni^t=e=u{9wsJ-)v(~3bZuaqmf=CJVQ)YMd&vNoAauCXj@hu7=<;a@}v ztqpxCijO~2-_HLblmmEwf4@5v3XgBwx-D3Dq#Fl;=D@Nn3xCv{o&89s(+oYeV5&ny kLqnS1@4H^87Mw9Y0_vGv)Lsuk^Z)<=07*qoM6N<$f}q2_+W-In literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-1/original_24.png b/assets/icons/guardia/brand-1/original_24.png new file mode 100644 index 0000000000000000000000000000000000000000..c81de00d0d487f030531b3d8a462a91b188ef722 GIT binary patch literal 1651 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 TrYv)~00000NkvXXu0mjfuhpGg literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-1/original_64.png b/assets/icons/guardia/brand-1/original_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e0dbbce015d3cdccc517a6b45a7ff133d2fa9320 GIT binary patch literal 7770 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-2/original_16.png b/assets/icons/guardia/brand-2/original_16.png new file mode 100644 index 0000000000000000000000000000000000000000..232b5e08ee0fb4aa7b392aef5a6154160c2f3896 GIT binary patch literal 440 zcmV;p0Z0CcP)t zO-lk{5Xa|vR&$@S7uT>3VM-k%2<_z%7*yb`(_Vt;l(#;^;;9c%hpV4u&|pGw_TLZK~dBoZ-N%hq-d zJ-ov?Aays&*9xFtxm1YY^Z#4FHDU>-AnlX+D`uCM;A{2QlWZmAC2=Z{w#4Az4#5FO^Js zPQExU8mh9uFrG01?b!(dKy=Jz0gaj5L?95jvD7gxH*|X1!#Epe*rl659P_Jg{PGZ^ zsyf=hP(VgwAFS3PgHlZpgmX<%W)Wefcs!wWz7=EG*gbQ?Z~T=c34dGqX(1Lxk!$9* iKy4ay=Li1(AwB>%5}EEx*pJEp0000(p)eLAhkZj~>mItl3a7#Zf|*2t6b{6j2Y^OHaOB76?-G5CqYS zL<|Vp&?!x_TAX%1SsPJWV6@o|v=X1z110W>D9GUL!?tC)YG|F2S`(<&4<$JcC z(eZjyzV>+9CCf5b%E`Rby*k%1t$ zBxmcppQ#kkl@y=*yi$ocX1@igR`;>~SIH0a-s2Z9E#2&JWhtdFpCAzEyo#|gZncW1 z31NB+Lr^ z3H_oWbd(ZC=SAsOEEY?f^#&}Cgcehj+6B1Brtn_)_6JZ3_pW}KGXI|6&O#M6#j%HX00000NkvXX Hu0mjfOJh?$ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-2/original_32.png b/assets/icons/guardia/brand-2/original_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a1bbd0b85c1280e007c9c9e9fb0c7e892d1d723d GIT binary patch literal 993 zcmV<710MW|P)>=Lrs*`1l4%Qk%|vxKR9## z^UutGJO4QV)TvXa&P@&H5F`@FUnXi~A9$lagwb?*P1Q~|`(0H|rIN0gHBG}~W2-p; zNmdOELcUxu@LvTd4E+sTpM2$(%>yGH{(Ar0$GWxAQT$h@|AhYyUq;U#I{d+g67xD- z&!PH)-e?x>pi{PxW4Vn18LL4`vaW5+gab5l$Cj>iUe}pIL+IeH`)4@k5cv*zdwbh7 zO=}QxJRX+^1_oLI0BFgv7}fpLv`Q9SJ92!lMWihrQ8UZ|8OZr8fb3_0>GuFjX~!~L zy|6$yN0%XBxl^BATBm2ZZCQ(@N(OK#HxbE(^<6)1ynX!-Lf6x?tuq#jO^SE-Mx(8< z*rruNPE1S$IJj2!o|lgf-t*F%uWgS;+aFySX{;?xd?N@~qJ2ZibfOGz7TieQGv%mgw91(WNG~GUo;Z?%Da_8X4gkH4TP0RYt z0eBZnop@DWT-YBBhMHYwBOs~om5cgez~PMTcxO}@GRED9)llf2`77By%yVXuB(Du9 z@{6gjrcaCJtOObkhdqojX>JZbVi?Buxyi+vJ3h7`58T5=vthc8+OX}$5UTU^-WKI{XS=4pN!S#%%TaXqLj~H zN<*`hoEtg~Sob#uPMk%FGgZVmJ@UQ!0TaL%KzSx z-+dH_Q;;}N(J%d9JHu!+N|x6Cs6^}Qh3)?|ga3_0f?vNib?Vfqb2IP<1?`S#u6AW> P00000NkvXXu0mjfoebd~ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-2/original_48.png b/assets/icons/guardia/brand-2/original_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c9347f315831b22dc8850f5f1d4e65b2422979c5 GIT binary patch literal 1864 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 P00000NkvXXu0mjfs77i~ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-3/original_16.png b/assets/icons/guardia/brand-3/original_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a6013f399205c13b411032c1e20d703d189b0fa5 GIT binary patch literal 474 zcmV<00VV#4P)*`-jMU=fgu7WOu_0R>^XPHe@0z%Gf{DW*4I zc}+qPRFZ(gnPjtP;wF1<-pFn|iJ(PF{owInX1-x&z7P24L4QvPp*642UHWs)=`q3l zwEsOA#|jg%F3CrlAdXe}x7)uuUYdH^=;eNdMMk`rVFfzM^A z$v=ssw;qqBS#7G%{)RwZ5nYR*EvRAuVZaL@4pJ0X0$7(kFDE#6{o%xr&6;AH*I;V< zea9yn)!oj8y8Geqs8zbjvO|caJObHbNLYvqIwXLL~resJulT7B#ym#L{S2E*JYNrT-8|}9{@4oYW zm-Ei=0eAJE7yS$U_8$aTLVk)+f@qbQF^gi30lLMkt-QcE1a^T@DDa&F@_ErR+%?50 z5O=%!;XG8SG_KsC$7L;8IQ@r;2!NiZ%%t+0sECg*gEVeUq zh7hGKDaVqOAZdh>b-*r3+n95M^6`b!AJ2Bo2)Ppi#l5CuIyCX&V@4&O)uEX% z-vZeKNEa4SyUFNwHyeN$R(cRb5M*KXdNaXmZ&7Q$f6h`0VBg#CZJYW1-cOmtJsY8X zR0=NJs0rzMtC5L%FzV(JaskI*4|4QPeW8c)@Ne{>~NnQ$#7^GhoD^Cx5VrHS*`|ACD^3?JM zWw#AFr(?91{`q?B;cUA8!@1SW8!N_}bn3r-mvpXuB=)?SPi@_O^s7eVp(E_{?WE>v zJuWK8zb^gyNJ7=FQlr|J%`~sDZpJ0lfD_i1t{XS?C4L$FZqqgTe=Y? zV$kzRUjAfqWcuZwPJU6LEiWATtPva94~VMgL`!j1pWUeWSuiVdy+8_LkZpiejM>^A zWiPM${9HUHW`fW>DL70DQ(u7L%7f|P-N|R>W)B=V6?C>p3DTDpH^4HU^0iF)rhgPN z(f(*wfLMSwXJ`d11Oh9cAlFATYVH=6&y%IIr1iHcs(wFR{Cs1&2q1StqPVxkNo!As zUo4E*Y|lPxWtL=YP)OHfBA1yBIBXEuhcU|nX3=rge8S-iX|H+V?3ahG{{;~0Lh{Wm zYQvLr&o4aX`SHjlEutWr^GgpL3#owHU~6@ZA6CfBTNI0%=eLpF<{+1oD321(OquTZ zZz?a48zYo2Qu|kN(E^1op||P|B-?JU*uOKotN*F~0Q%u`R=y2_Gynhq07*qoM6N<$ Ef-BamTL1t6 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-3/original_32.png b/assets/icons/guardia/brand-3/original_32.png new file mode 100644 index 0000000000000000000000000000000000000000..fe691a2376f517d0323fec3d2cd7b85d43a86b35 GIT binary patch literal 1276 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 A&j0`b literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-3/original_64.png b/assets/icons/guardia/brand-3/original_64.png new file mode 100644 index 0000000000000000000000000000000000000000..f5682885b90017994b521665b3a54dd81b7ffbe3 GIT binary patch literal 3790 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 Ef<84=(*OVf literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-4/original_16.png b/assets/icons/guardia/brand-4/original_16.png new file mode 100644 index 0000000000000000000000000000000000000000..61629c7819de58115f488ea834d8f426a467d433 GIT binary patch literal 973 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-4/original_64.png b/assets/icons/guardia/brand-4/original_64.png new file mode 100644 index 0000000000000000000000000000000000000000..91617b5e8f918e080fd0ed4dfd526f14b303d050 GIT binary patch literal 9534 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

Xn>1|cv7t8BH^_qo*BIZs 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-5/original_16.png b/assets/icons/guardia/brand-5/original_16.png new file mode 100644 index 0000000000000000000000000000000000000000..31841fb7b2e6378ad19d608f7dbf19b73fb682a6 GIT binary patch literal 489 zcmV;E%N5uIwo% zKfZgnsj;!~7Yj_@IBh1Y1oJx{t~cjCU1C#L`SkHG<6*DI@04|Uf3LnM_FG@9m4D}Z zQQkFY-`ug3Wme+m;BaSPVA#w8c5Y+izfYeZ8h&SFtNh8R{)p)xn;I+Y@AKQAGCt@3 z_?ydC;W6{OXK&s$A2BuMV*1M_#`@#Fv%1g|ki{%87ySMD?cX2fKSF;PSlHMY|9#1`G?gkcc!p7dHbl z3o`=~3)4p?2F5qM|G&uJe)s?5{QJ@$SlHM#WCS^vv2d_HI&}Np#Ef}|KwsMd@D%h1$DUp%Se@ zM9|t7{~ugIjgt5vC}>dBsx9fNApJ|Vb=_>P*}d7ld*{w6ch^Qm0N&z%4>DeH5V5L|O311)UcuoNzHzCbv$L~?5OszS=rYFtY;SM3$4-z)u*#Y` zCSYE&s{8m51cC|4ieXe_vN26|IZJh(v(|F%)dL7h2>aDmatD&1ByB>->$hs}-XE49 z+P`n5N&z&5!M3h0^P4SO)>W=y81$J6kodD|YTfj)uBt+(_Nm|U^fL-Hj;;tXMLKh3 z{v~BNQ2!_clLi$m&|oRsTsvp|zC}CwT5}FvRc*I(lQ$l4&)$CgEz#D;Gu<%&7h9{h86A<#?89nj8@cecGb5-!7ySDqe|@ zk|Rju?q830XRPA>tJ&fQnj&e6BsmcD`mPUPJfNzJ8s4qhp%k-iwu@i({OFmJb zwzjsr;P;;p98JJT%0omdha$CFNYA6pR84_ww&%O%2PeOs*?(eJPpM!{Ag*0c=BMtJ zM~-t@o9lrTizl%&WW8j{Gz6>_+pmpsZkU{mZ3cGM|aoFDIcwE zE(c<>R0j9%cW*uKpKo0C`P94{Y~gP4;e*p%y#U}n;n-L_@Sp6zWFo_uT{f8$d`@@3^Kw)wkA(isLXY2DmG2WluTfE`;7cT2<5j=hS+5i9m07*qo IM6N<$f{in{E&u=k literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-5/original_32.png b/assets/icons/guardia/brand-5/original_32.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf76e977a1faa99c4bb9aa740c5830edd2f32d5 GIT binary patch literal 1272 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-5/original_64.png b/assets/icons/guardia/brand-5/original_64.png new file mode 100644 index 0000000000000000000000000000000000000000..7e45eb4f477851d61d46ee6c402d33f5c0be7bb3 GIT binary patch literal 3609 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 X8!`z|Psf8800000NkvXXu0mjf7VJAG literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-6/original_24.png b/assets/icons/guardia/brand-6/original_24.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2c1aca3235205a757e570a3537b432a7ddbeb9 GIT binary patch literal 1201 zcmV;i1Wx;jP)4>Ov5$~OjiyCy!2rgqwqh~a?X2nZM> z(pN^-w|v=FYR|Zy3z|Hr8TT3O)&~CDpN4@45b_%8hTxewfJskpe75&O11nYF@1y4C;6VATj$TMU4@BKkm|g-8c#b)qD$(zi25PnEX+Ne6 zw|!m?g6Nd%s?(m!t@kf{H|EEN(g>K(-h6e|f_;aYmyZrVDWVW#3fgE$p8!g@+$&xF zjU01|4fSe;VP*=!BtSeHz#~%fI>VG!Axee8`5-lZdR@(mI7O360<$=@dfD4meSJG; zT^^kl<{6rxtW*UcJhH!nwG?bC#I{m=2}2GZvJHUlu%2Hzhm^A^^6r z?%n#zlConz?M(F#*3Y?`O~7!ho>&=${%nJ{B}>*b3uFotESPnI+3ie~X1mtcF2AWc z*=mk8>^L~Mefx^w#EIt<0|QSd$3~Zxhasdfkg-q;Ma1Ts9<6MYAoP?3*}l2+cf8Qm z*?i0HXL+%gOTjThyD<)J*|JicIrET-CLT^)9bW9@Ri!bgRO9)QNW+lhjQT=c8ZS#9 z>0h;`>7_k;y13X{Zfl&$2z!G~R%O9W0Z55V6ghJ~-7{TY>=;Jp~zY-BQ`9dPb;gW37XB8$^_PYAaGwPQmjQy3c?Z7VNM{fG89s5l1j5|#-t P00000NkvXXu0mjfIy*MX literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-6/original_32.png b/assets/icons/guardia/brand-6/original_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c3217a04002690e9fb5ed9ac0c15f6563c063875 GIT binary patch literal 1770 zcmV46b75>i5-20y2;w84zET&CYHA#sRP}Cq0AyI-t6I$xTCIVHIMr}|lfkX=Zfy#?f zTht#&{lOois(~(6@k>IXfhZ{TAF4L$0y0jX6YtH-=Ekm7sxB_$Oz!4(Ray zUoU#Kre?4o;4XkqD8+w|#ko^S?gQ-50|56s#K&tZ`RMXn+S1>;t6{bxAIn+`GQM)> zoj*G1Iy?Y)Jw&<>2rQ_by8+W9z}KiX{K;jup=`v;6SIoo(Wy2s8o4 zI#3tR-<$A#tA`L^!9v3mRVwRTIov2l*# zVz!GWK$Gk8>n$xyPBlNicK5n<5B~Q3OJ5$UDA$e>(ikq#=edH;DwB2=#$F(p+R16s zr!pHtcIouhL%^22QhZ?j`ft10?DwaBvS;-e>zcA@Prf)giP2b0|1go%D<-Fe@qO|` zy7X@%v+qHXpRsEMG7K>?_KkOpdFoXnJ*PIXRe=Zx*3|#>-Rg4gSAu&0KJ7ZZCsyVa zHuG&#nO`Il!P|+XKIb@mj==BbYXJ8WxR1d7M5WP7#61L)1^BNO<(FT0;)%r;FSUOC z+tp5W*a)sPfjik)TLI0=!l!^Yd6tAB)HJsj@Pib(Fav z1)l@hg1v`4fgVBJN5t7!%-@@c^VS<~_zg41i@oHE5R?xMxn54Y6M^7>padjI1Kd85 za~?~^{TCd`ZIe@S6ri_FKpnY&S|E6(Qe5vkW|?%vLSuB5*3tzbCj<`*(!)yPAAzRU zi3#&H9(w5DO*gMS*wpm!_H_DqE3>qBF0A!7?Ot4Vb4xopd>W3|Ns7BjaSsId3F4E< zSnzCBg}*ft(boxLDZ-2hRZ##}0=!fRbGr~+FO^xP9CM45rY0;=`F)Qh;#2Kzl>eAa zjy<<&(_J>~VK*(d)Ia>}$Dcd2pr)@2lKVlvmGO)cJRr%IU_R?eK2aXm&sA0g_r=PB zfI*MWx>%RgfX@k*dnEmMvRW6>CVT;~mjHDH(yL zh(O>9soq?;FumjaU=z*G1_I1WhYwd(J^t9!OV6KqaLM=tax<)he7O&mGRz1Ip6v?K zVNXiVDdI^XcoKqqTcrTR7+kA;stPo*pI;Tqb`rx;LFlZi$sT{?fz_pyu;5mS?{3>R z0;L{GZ{GN)(eBQt77f1t`LfG1mY`-q(D^1rf(?{ELyiwh5bSC5c|R-BEvN~L6NR$m z{|JjQv#n~lN}DVeGyCo9%*pZ18+W^z(+^)aJal8lj8_b-W+Dqvz_SXmt>LBo3hPw9 zHHAgVs%C!_*bhj!$CoVr{dX=7?wq$z+rAK{2@%d1v!Hj!j_sW3+z}bP_|@u(%h81A zhcU6G%{nF#Hmd@oe0wq>Ek@W#Z0GxhimA4?4bkkG&E|s-Ze^{PRTwXp^d_MUL0V;fjlc(dt2X83_aZLNCt?>y7uB^; zbLy834GqJEfLz0IE?m(5Q-1xBvhE M07*qoM6N<$g6$<~Bme*a literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-6/original_48.png b/assets/icons/guardia/brand-6/original_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c8eceed7529182ff430fe781c77ea3e4e8b7b5ce GIT binary patch literal 3229 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 P00000NkvXXu0mjfV2mij literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-7/original_24.png b/assets/icons/guardia/brand-7/original_24.png new file mode 100644 index 0000000000000000000000000000000000000000..2565f9601a543fa04cf34747332c5dd389a0f04b GIT binary patch literal 1034 zcmV+l1oiugP)830xTK@)%9XqO{Fv5{m}IEnn@wRDPBJ03FG1n!AwR1GGP8G6qw-x zU4g^|LI|DYQ=wFHWtwgzo>RwiHZhm)x7ykYc1~XDt1w~16*F)>^=SQ@-up*C z*~NcoY^=aRBRLm1Ha;gQGrw_kr;F)|XKAjk}xg-^fq>$$;B8#wkhgV-7e@5F}s zS8LK!$EGZcu5WHR(9-_FQ5|e2fM2*j@;YSgg4*o?kY~HQYiHhlyMNVqqU1ub@OaC) z^Lsl1xL;VUbTVAmb*;Kg{k)}V_#dL6-n>&++zB5wG#GmBdu8u?mp9g{p^fWCBK!6g zX<4@7L>LgTg5MuN9tsVv5W>+BV>CL~4U6H8%1WhEZIzbwr;3V@n{0V?V)VhB0|3qm z0!Erjf`CQAn;_+FX;=z~W;lWZ6hbmC{NR|ffrCOX9`NXy-caLnUqdyyJRQ&aq-vQ3&_z}t02^Wq$ zIh^k3XgbrlK6&ktGCH|#?Qt#hi>wuN{*LU}VGYz(pH8eUr?ZW9a$x^!hx#Wci@`7e zxB!2)todP>ev1;3`Qzb(&kXF^c7AkyHT_n*I`w%&eK_X;^I6=rsjj9<;y0ySRXK(M zH%dYmB(Px*nVWHyfu6GF_#l{T3GnW7y>d3~)E0ATOaXUBT($qX-oa0EHs`O3S>}EA z{N}PMCv!Nc(l0ENGH6Qui|AhyG9!V200jfaIWQoQ2rzDPasq`vC9Hyj&vy63HNp18 zKrVXOeX;$C$BNRj*(54836Ti~t|X-iEExKY;d%-@#wTtX@XMh!;rLKThr95yyS*#2 zHCYnD7GkNyoK*(a+uSTjGx{z=7g6iz$LasRA#e}>0zz1%1k literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-7/original_32.png b/assets/icons/guardia/brand-7/original_32.png new file mode 100644 index 0000000000000000000000000000000000000000..e1708c090bcdff2e3c983c7aa128707e49b1bb0c GIT binary patch literal 1512 zcmVP)-N{Epy#t?lm(HM{jyawLp*n6_L_Ht$O4DjPku&A% zEiEm5nMmNM)Zl32I^>NpkbCRvE2oRwZ~Ifp`k*2MT?d%dxj;}%n^i#CCx!qF0C>g% zg5n0aCWn;4MBMar^f7B^Lu=cfq150=5_q@g5r)yII=JGA`l3|g<9y*xRl+;&%?rW7nJEbIW?_~iW)g3$ea)gLQ0n{*op|HRQ4GV*nzYZKNHnH46 zbg$>-_jqgT*VSx#{UF#jj2Aue_>|69U-~fb^vPBJ#2x9FCO@C$d-mz$9sBi{)d(Q9 zBM=+RqAa<2>-oY|s@xHd?3w%khlPtb)vViiP#=bH_#cghD=LQb8asOy^Lu--(C@!a zL@yp%SwGV}b7pRqBnkj-T)%#2OL*4?XE+1;H{49Tt-7N9QhBL5S2ms6RX)KwBh|cJSnm?ct-3RLKi-XV7=^Dw6wZYv*MOo<#tdrrz*X;}nmgGE@p3Ul#ag z&G`}$Nqe4NCx9hQO;V?~YQx4>G3~)lmXi%$pXK!^yIMcb?_G>K^l1d89k49sfh-GB zxj7=cq_`9A5t_IT9eO->%s{Y9nig<_fe+*~{rpD3VM>QcLkT9(!yWK=f#v#B(z25J z-I2MyCn&)H3DDp`$b`NXhA^`Lt{|1-=C#ZjrW=CJ(<^&F?{}DanvgSZe86-sUU-3sSS%KUNF*|xs_~$` zsY#0%b-lAK?ER&?j1oz561Ed}c}My{Ma5usXWDP;()rKLOeH?E2I8X6@)@Fj#TyIW z-SHL(krtHk7|)Nza4CRD_9sifS@TqT!TEE=e#2xJy}s{1UA<<}C()?=M;8R09l%I9 z>_1XD=hW5NrF0=wp*Ng?X~Bx|}Nl$+!?crWjX5 z$k9LorW7MvaY_Y<3hb_*9(DS9mIV^GrsgUo9ZA-CNA74i-tk(-)?EZNbWhMd`oN-^ zCqp227m%1Hq${Omahn<7N(C-5a9jn<)w-KjY^~csh`>z-mVsa?1%8qs8A#@}D8VhK zo0;!#t68$OJsQ=9=}%&mL5AI)y2Z0X%GsJj_Nr{*Ofp>plnOX7t%9Hgff6cR!e}r+ z6G4CVX_-a@=`moyGMt3Rcj6|qwy$hGbU+&$nhX9~jx)#zMS8#Nv8o(9S!YV9GL;M% zOp7qrHA6yy)FYFL#5f|CN|KZW5}EBVb}4DH_EUwSwrDIC&j{X_XT`{1iylERt?~ez z4_zboBQC=L(9_bWIRhpNis<1Ic!p5Mlgxhfz09hkIF_OGKJEklYy1w)I;1+W49x8S O0000)wxt>aHGUV{Slc=~O|)9m z+M51j8(XQ8z;4w@L~Dx>v@rr!ON%Rl6@kTFz+IM)-JN;w-gBDsb_ZAx1O=0}`%7kL z_PzUYe)pVvz5x2skAC!{AOFw5k2_HSu>KRwKNy8{$@FvLph61(>382Z`fvFW0^m`8 z4uY6tY4{$Oef56!4BA zK@tKm;5cCxArB!iCvi-$yDiE!-}2njeVcoZ5r8WYe{*MTxSKRcSawCU2y zV(E&kfztz!F%}%?x6Vcb1B=vD?Mkw@Nm6 zc}tL6a^s(uHR;BZ2f{*nXdjP&no9W;7S6n6#?W~0?NxDHTg5WKvIllfEfv}NDW90$~a?@Lqwxz&LU)hDHQP$ zu+JJq<0TM~L~Q8VC~Rvs^y8}*FI#vxO&mg?>|yHj`QV(@%YHtZd3Hsy7)l&xNCZnx zsJ*g+G#U-{IBY2pw9^F$*qxbX4e(`*0MP*-OzUa`WdksnV2hy|8>9^>vVIP(X0 z-yfd&xs@F(2u6Lc$WV)eGVLFHMbEhYfO-1}H1__cmbPgT!x(jqR#1wuCmA`az+47$Q3wMN&&@Y13VZKBY5{%o4n)Xw zb$xySVits1gHyK&pyHH?FF`n9y(&tb2b@6E_gcfaYreT8Gj`k>m(5U65wS+?FtB5X zH$HK)j?3rseF@Y7Fa`nSkWb1O016N|K#X${WNT{vfryD-@)Mgb0u%}bP6KxoZHtBv z-{5TsU_%j&A?OC@c6HR0iS{9&;8KaKfq+5-5@o<=G5}RorOHvGHl~yEdHA#-#Uk3u zsvT@Cco0D%3DJa=Xev`#3WY-n=sY&)ePDnx*4td~w}aT4I|Gya#96x4%C`$22xI9aqHp;m{JF*8Dv+OZT4Yi4+a5)A>S-dfnWKCIN`@&Y}fZnoZ40_ZnK$pflt7^%eJZm00*GFV?c*lC zRlVkw4MV&ei#~>o1K_vUO@8H`yY3c|@1|L^q*?xP*M^9C>2&>x%dYzRoT?pd2v$>W z3$f-)q5b>ZY3HQgu$-ChJ57zk8lvYt^icO+hUYtrj$luTaCa9C+qD~Z|Mf4kH_m_b zb_zq*3Pm-cmDO<)9HpVb^a>xX{?T3azG>~m3S)(xAjX2*OMdt6!2_Q?I1TC}KslZG zL)~Q~#=Wy~#h7AzD#tMs8Qdj|t)pr>Pr3HGpG>-8&acWE=&fJ-g!cow4CVFr?V3Mm z&%yzjrHEu#-GA>-cP@G6*6NO(Hp`wc7VnHT>oU>ru3Yo4xpGi4cldOA`WfFE)7d$H zXzWz6L{TVvHO3DfoD4Ys!iA$})jeE2efkdLKO^5g}rFTOZ8X8~v8HCTt*&038#w4KHkocQfoF>dNo=k6Szrvca95C!MIx_S z^FYoK7l|mgD3~o4Cv|VyJhgM%*6~r?ogEaA3xoq;?QsBaO}K57jlMH`#j77$S{|vS zggKAQu~$6y+WjMq+&s|5mc14j2qp+Q2`qN9kavs>2ni9CSiDQTF;04l`W}bUQ{4CV zj2?4l0zEH9}DstL6~Fu??ja?3S&@-g)(s<l2WQ<^7 z(!t)62V=R*+N2G`mzz!Q-fu5{Zsn0W6Cc@D=^Z4$pEYCZ$nLJ22ZNiLjf*v*_W^qG z+DA~DdTx|WQ1QM($Z#i9%0SEXIHj3A%$|*WMsnzte_`-aV=E z(L3fp)A3Qgp`&tx`%eI2!R22#yJFYg%X1*pjE6~7SxstXm>)rBP&7e ztf*yB&pYsH-0Zc-;sk9RTiWgntm%q^m)eF7UpBY#+0DA|k=iN8MBu~PeRT~D;bl)Q zsL6^OSRrY=^Pw@Q{X`4{@0c-3z>{HQPZ9taWJZ^+mH--y4#9T`b$$?;w%Z>2(~h#& zI+oVrF{8I8IPU3$0AK@vIka*7U(jB!KT)UMkAC!{AN}~B$A19YboAIn)D)`#0000< KMNUMnLSTY9R^Utk literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/brand-7/original_64.png b/assets/icons/guardia/brand-7/original_64.png new file mode 100644 index 0000000000000000000000000000000000000000..8c81230036c74195dbca5072757f59db2c4e06c9 GIT binary patch literal 3940 zcmV-q51a6bP)hmfF#*b>E)b}bm=c$o7#D0~d;A#BjOTgpJ?HGbR<+K(W5&Z^ z{EU$@pLFke?X&k@Yp=ETdK`dBOkxs~n8YL|F^Ne`;tvvdD*KnCn}9a|bTU9{{j}GP z9o5O6j0t1$!?6TUz!-SEge%b<06ex!3M}{}2>~F0?rwzX)A`_7dOa{eUEa4037SGS?Ft7I6%O1_gvN4k02yfPzMV84ywy@_=Fq5WKJl24WGz zqOB-p14)H&Agzyfn0&);pfGdOO;11Fqpy!)1fO&U2!KvL``s@DijDJ+De}j02xn) zn2}fv5)=4}vGD+!?qM6g(jP{T-}2LcU#|>38fm~IC0+ms0r-*S%jdTC?*5x5;pNSk zHb$ONyoA7>yz{zjXaJCPQ8O;+n(9CZo`i)3(J_kX;v>|UleH2{dY;_|M8Qlh44_I+ zbq)fCyb!RmR}3bMK{+AN zSn>5W&ukuRvyPep#TxPddfnBRp6=88X9~}c(ns1m2*T3gY4iyeH6Ranca1# z&Dh#9XU=As(zxFTxj{s9BAIm$#Ttj63B(}~0k8o=ucV9Tl*k6Lgh7nfIwBK`v8*P; zacX5`xIjaLO@n*(%pdIPx=^}zH#Q3gQw=qsi!FK9?Snu}d4wq5>E*4#X>-4I)0#C~ z561-jIO0cNTG`e%dv0&n<7b3;LC(8Kyw8E^x&V1Z>8>Q;=FIJ$`o+tho4I(&su>Hv zv>5<;(FQU2F?)7q?M9E8Hh*}{HT$iG;czep#JQ&OmUqtE^xQMccmL}3rTOlCQ)gR~ zw{aY8y* zbn`+hiKS$R=ThAT3*Wi$*4w^2<@`l2BVsa<*QQWsW$fsq5AD$HcC%^vHg3|@9O=8L%2t-MP06!qwIB@2f zH{7)57h5MXiZsC(nTNMw!-k+?Xy}fqEG;rpvRsLclw(X&C)@i6*q*gu+ZFBq^bbmW zXJ?zqcKD7C)mb@N#AlP!{yRD{o7vgcW^nFj{&UIQ_Y`IR*?YUnG3kz?wh0`gNm6b| zlF!qwuD{UsH3@>lGN4$KivPR!?-u2gQa%j_N) zWCV)@BdG)5Iz2vn$$>d!B#%w7|LZ!%;_8TcMR<&)E3cGdDFZ{^K|FPJ4U%N!9lwMSFXD z7CE&p{gdYl^XG4jqX13Lc*=#$h9EM=k)aEoefQl+7kI21&>7%Pq-o!@i+{f(b! z1dTBefo}*bA_XKA7%;g2oFSC@dLK?}*=C}sT$R34zxs;WJP?C`gJ~_@9Oe?Qo+cO( zG8$e$;9Vg&u(vQ)(kC>6YE+UW2?|EtRE@?BAX#vL5;QcHn&-^i#Yu9s`Mlo`n8D^7 z4%jeoTuC)P%VJUkWI}=(hhGJq8et<6LQ9*9_|_#)6QfnxSHJ9w5~$?2I!;wEft{qlr39rp)fGgwg)g zm>5ILNW_Ln@+dOY)pZUh$sGA`;8PFX1_2;_Z}Y|dJ9nHPImhDJaOw#?i}P#+=!2#^ z?;INcDviCUMN9a#2Oc=ULHO$w4H8cb-)n;?kW@E88-Q42 z%i#8>`S9I|@(ncpM%(IYxR}m6{msF+@Yu%?{l0y*{L|qXa4;lhhNP+WslM3lW>0ES zg`9v%Jj|dFa@)5y{_^|Z`}>|3p8uBS{4z0ATTv`hmgLi4t=4hy`dEL5^iiZtk2^Y; zfx#dTX-MnS( z+Hd4{Zksg=sm@eNq=wI@Uc4ah1uS(nOug&o4gdYbQKiJjCPh2Hb5CRNZ$Eo#Uh1xy z;=MzQ7OVjXEQqx-;G7)D7t-(x7rxbW$)Z*B7cc&=`g!xW0>Dt1&%0z~1jk958s4Bb z_UMF0pO5vhHNU8~jKlhRNlK*%0A{6o_qJ|*@!5sDf3tpB{Qi~&jg@lLYOtP?)T$4o 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 N002ovPDHLkV1i2o3d{fi literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/home/navy_24.png b/assets/icons/guardia/home/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..508d062a01334073e379e91c3474d8bad735875e GIT binary patch literal 971 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 Us&5dc8~^|S07*qoM6N<$f)XVjP5=M^ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/home/navy_64.png b/assets/icons/guardia/home/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..3224a314e18a36e8f9dbcc4c797ce07639f20faa GIT binary patch literal 3131 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 V3WhBYT7v)p002ovPDHLkV1nF)FOmQN literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/home/white_16.png b/assets/icons/guardia/home/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7ca95120fb06c0787889442ff996370b0fabc0 GIT binary patch literal 444 zcmV;t0YmVLUPe2!$njJ6G2ek zdQTjk`}XvrK?4`&&Yd%J=FEi)%(nV|o$jLizpN$NzGnL>|1gaQY+sV}%l2L1C2$O^ z14qCeU`Nv6+yedseh4fApMbEr38dgIuq|n;{Z~Q?FC@Ay6j7O6IQ8T@6ltr8h@6w8EjXNp}bIZ z_X<4Obc!!2LVgFX086%?1l!fVKNRizlHQdbgN#*YP_ehbgD?a>_W#PM*_YP)Tb??|ZJ)fdS@ECo!FXSJFf?jhm4p zP&KnU&?BjCW@C|%!0@MGX8a5Du2|Oq&w$6k(vE@t0=^k|R^1cnz!vP65Z#xWY=axs#dw1P(|#DydJ>fTV6oizW3-IwWbH zq(ze6dT%;qejK<3%m!`%XA+;Yz;$32a1nR`^m%#m8{`_V#_vJkGB6hy0uIM{Eg{ek zJPZQ&feQt}78$1pz|~;b13Urt=Cw_d><5N{g}?xCKF2Ep{A%6K!kZOp83DGHH7-lC zJ(|4)I02lCTU2sK2fhZZ241=h+kuxPSr3dDXM{7wYRxN#7+6Ng6h@_uj-% zQ_~D8_VLbr-bs2T=}}rkkh_)ukSf^I;vL%7FHhwMRx?K~C z23LzU0IO+SymQUhv(o-CfwTSQ67&WK&=*OgapwC`N#mK%c-inQOW-Qn9lhw1H0gUu zn}Dssa;>Bl$?aV4J0#uC!CLAVLA^1G2_J8$19|QJ%#%8E*Szoj-DgQ7F7GyF|36mx ir(cZij=|#NO6?b1c?&(8IGDhm_b3k7C}Ni3={++_>d$hf{*&(NBOE_ z(u<1FC}R{AQWR0yLy=92$jCI9Guh1j#hTV>_MAC)?%Z)QJ81FA7@27UuJ0?&sd z%VVt-SPN_do&wr}Z?k3m1>lA&PuAR_fiSopxB?slE(1I68Xd-Ae-pS0JQDQhz$Y<( z68IYU2-qIHcYr-pIgm9l?66hLYy{XP=~YQfCDnlMB)u=mA^%d+3Q3zJeIx1DP%&51 zovCb88W=Y-8wCzYdREe6Ne@W6Ea_b{+i7NRNa~jKlO#{m5=oB(U6T5p*L41wc*Z{f zK92b+;2Q8!(AA_iUXQgWf<6rl04CH#w|gg11^*W zR?m1#jBUWTz`>xqqOzCOizabmHE=ya=};8rywpaSaf@*w@IA0Q=)J%%&JQ}9#%Wms z^Z{=Ny)SgOr?w`*9xZff9Hni+KLA_;9&BX1#EEu4DZu`q-vU1Mt~u!vV_fJka5m;A zfs08^O#8w~Qt5T{8E_)#^KN5OF#H|8d*x^P4DbUm3~bF66%1I}udruK26zP+0=@t~ z1m>p*Wd3L7^7wcw;PI8JhaE~uFNVCs>`ISHdQ?(xVSgpjIjJRQ^{nKel<*v# zA&&$YiTlFyJrqbZ^<~Wpgj4xb%VEun#3OC`ZCGirUN;X>NMpaGsA|pXsZ3#f>^iO^ zQ)Xz=aZUC!lN8|V(XsqT0(;)c@)V@0DdTG<4zx%b@Yj%}k$=2`o04vo@NY{REa4AI znm-c5k@sWhZ-AA+Gf8UQk#&-e)H7m5M&7C7`t8i&O!nW2 zUu%+EAAgU%bA!%hd~c7L-6(d!`{JuxAo+`Umh9B-yU6qJFTeafB^fykjsO4v07*qo IM6N<$f`ON_x&QzG literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/home/white_48.png b/assets/icons/guardia/home/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c8cdab2eafae8667277c898f3166192e98f22e2f GIT binary patch literal 1255 zcmVZDh5vddv*gcAB#GLtlvGl*0)!}^KInJCjIWY?k-}%5r14jylC6W+ugC6-0w)6Tr#9AHcQ1NuD3TJHXqsqCf~4 z2eK!|x%jt*B;FMG>&5#}3S1V(_RNX`0sLve7;qR^6UK8M+y^|V_swDaQeZ;-H6axD zwyr=(z@@-G;5%SdRt(rFU>n1lJH>k{bbAT^_gTTrn_!1cx$$K9I%R?@?L7aAqx1i|)b*nab zHpH=qz^}4i4yC@93rZ{pz6HJq&J}M2cwNbTd6lfX;PZwL3jD)id>t^ZvwKv$ZVkCv z=3?Me;CIidygpRzje%z~v3x!T?+N2KXLkp0)NaCp>=A_{g@Sj#c#mbJYby~a0?$d% z4S}~=yyr9U>2#2V`@)Wrg10Fjy|tB)95 zLrM%6PP>=FxF6G>dF>eJg#g%->kFOLUZBvCx3DS8m+akVC9G*w&1)ju6j)jz-PFHL0AO?;iK{LuPiQAI_>?0|DzlVG6v z$&L$MfwNOeehb@eW*+BdN_4XqBzK@!oBRgT)5crPY=xOEHM3>m@vjZH1h4cX)6?H- zfttSc9Nj#-KBY7ftU4LMRmrGL$LoPX!ZSEeICA*K_dMRD=Q~Xas%hO?VUdo_qYVY> z0+=aT-HB~{NTp)GUPVo@Haw8SqfQR=D)y@jj;1|OC&p`U+`vAqokGlFvZvz-p(?>S zwkHP6ts&)*$8u_(<|(yI{{Xcs_TB6Y RnN$D(002ovPDHLkV1g?5X;%OM literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/home/white_64.png b/assets/icons/guardia/home/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..7c891aa8997d99e72f29a1fecab777dd8810bca3 GIT binary patch literal 1757 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1/navy_24.png b/assets/icons/guardia/icon-1/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..0768666659e4ab93dbd47e1ef0aa8c1b8e89e053 GIT binary patch literal 1461 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 a6#YMx$>~tLLA8+p0000AjF*CQ2L+ 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1/white_24.png b/assets/icons/guardia/icon-1/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..447d6d32fba8bdaedf52bd998c6aee0d6bf4a18e GIT binary patch literal 999 zcmVWHBT8YX3dlrYGYXw_w4r3`QPW#b^raj>fd#K=Q_XdIlpth=luRbk4GJdhF+bBO?A%j|P?l3xJ)#cfc9IAHYW7C}0%$ z8hAD$wyAx&w^z^|@N$syBkD%=Ms>7hbDMf?Ydu@NMcts@Q@WegXVll!Q`_Ku^?OTw zp;9yDQEyeR>7k#gzNtQ;E>Pca@>w=eHhHuO^+jM2@N`7%&U}`BKClE>3hd25fU$_! zlA9yqSK#725pWr>E7O*~2U;L^0~z%Zz#8>nAXD{Z)!}m>0}wa{xJ2C!tN`{z#9rXi zbPy4ztH-6jNzY;GSDBWk7V0bN_v(G>V2`w9I#;M`Ykj-=QQBr|)LCugr_!M0!E%r} zU0%9e57oE+q-1OFNP&;3!=-yHPu?L-8H^PpGPkL_QhmMUu)iI7y{FYXS+u_OJ%gE} ze%P^5PgCEnBac*sxjw0ML$&cj^~{nRT}Hl6osslSzzQh$y`wJ5XchurW`jh;?^$qQ zuo@^LVq8sTtW0*POGh(EK~)okA+BQuv7&0_VAYViY0H(njRw7^dR zl7?CQbUqI_r!x*FN5pU02i5h7a{};VU(s$~MUhnd37A>n7XS|dXJ=nT#8%*HAZv17 zo+QDFW&0I)gEcua)a%t%T@;+BX5(y53YV_GDR9fKqf?L13DET|nRHbOi>n}MIGhwz z&nocQW!$D^U)eN~r*5@+c{v;@o3-k~jOYtsIxweFG*QRAsA@swc%U40P7x7iLDegO zgMihQ`<%9i10%rZCaMS2``i33d8_(d4znJeJY9WQ-C0f8-#XEw>b;#nYD8xQ>#~@@ zjw*06Viee3gD#n~rATokkhA7fU@ovNB32bvX5zitv#V36@_Jo1P01_O4_f!btfZ@Y zXYxP$LY>dRHcX}tzrD@}uClTKc(i|6qv;BCs)`z7^V z^^h()4i(FWo1C}4AF95uKHn3(eXEsxgSx3kb$0B3onXHDp!!*J({+PSx%3-@x`6V+ zxd}KC*bV#u{9I;9ilpKU;FG%acQkwd*FoD!$w}LsE6v}QeDZHga(q+E?qA@k{~Lbx VoIf`G@reKc002ovPDHLkV1m@_=q~^O literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1/white_32.png b/assets/icons/guardia/icon-1/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e1d804cd8804583e35895534d163a4a99353e1 GIT binary patch literal 1396 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-10/navy_16.png b/assets/icons/guardia/icon-10/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2d26203ffa412b32d5cee136209e76f2cbdd79 GIT binary patch literal 769 zcmV+c1OEJpP)Ba z+TKxEM2JYDf3H4BU}$^q`&GLntHJ=HB0l`OUa&=jC^Pzw`T^f8TS2S!o&= zv!DX+3DIwBkV?1~Y)@b<*URb05Zg5tf1NfLVg*H%zs@?P0qz(x?!{ ziPI}PmQ&rn$Qh&h3smE^?tQqim^JlfPLJYAMjETSs<5ujyAwK=Lo=G;!AyAFRfHyV%5pR>leNYPYX?C7a+zd_qun?f zpMC9d#LQ3>C9>n+qnsn)O~gEkcJ3mSiQ+wEt@m9Y5bZM;7|xF6_~j)iiHjZN6t5snesOx2Uh%(x;$f_Pk#_5?zO#1_{_ZofsJ{%T%Op*1 z&}<59^Dz23MmFJj>%g9xUA%1KqaMTz0w@0iAUh4WLje1i00000NkvXXu0mjfl9p=g literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-10/navy_24.png b/assets/icons/guardia/icon-10/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..0b58dddd7aaebf1236424cdb17b541c587c6d4dd GIT binary patch literal 1493 zcmV;`1uFW9P)hs-sO_iq0%HE!epDc3YPZ0`#a0Muawu(le~9- z=XcKU{C?+q{t2^DI_=Qg8%*=JK3>h$lTCbg?y|=>7v@NOlD&!3AnS;b?7Ev7k7*n+$Ej@_HVx;sa=jNP>v}-ReCLVtY zYyS-9D3sc9s^=0+jNlitl}MBqxtyWrlQ>_v*p14k3>6+Hk=aPB<}rfOVaCm2M)#hd z;nkAw&m}&&32`36PQHL&cmp?k2;?(r-~Aq|S6g=OwB>-7-QGaL8;;hO_A1Hs7U6p9 za9h^0^g9c=f^ud`?*z&0it<*@OyQLi8vb<^bBevF^E^YHZ_wCWP2Yiwq`a>|Y&)to zXmA!pz|>=847Ix$>>Q@CxhB$eTQ;Ni>x|WWi!JkuWe-AX$W=vfg|N8U*QXzq$ZWy& z{zkIx!7Cn|Z2cy#H;UVGUxk-{#PwE2kcSy~MVcnOPK^GE!LCEN-W{kOK;$m`!WmND z8q|3hG>+;~{QN)nW&BRKkDq@TzvXIXm=oOP(45E^qa#?GuD7QYi)+=O%CPWpSsaJ}CEzs4{0 zlJE{E$E+_rf&8*;5dF) zp0Bnv;OJrC0sO*A+?FOp)`~*#_+xo+?Lg#UD#kf#%Tn58-Di_mywDJEnUTE z?_?B6v=zUr+)Y#7Jy>>QV!IjG`-_T#T3HTq>3)XypCXZQL0$woM$vhi`Jazd|9LT- z4`FbH(S{Psx6Vh|hUzoX-ooY@1`0>8P8#eQQf)^g*izeGMP)gLA7Pw7klI$qP`8iT zZzJ46m0cCJjk67MX%dyES2BAqD$n8y#-Cd#WGDPJ|EUx!FP{%FjnmIXdE3tSQTYL?t=2!gX=O0(z zN3!h(2v(rn9yS^L>()nU9(IQFRj&fC;CJnjneBF`CF#A0sai!aIgE+t(O?5`H_*(d z@e@?dSLXaPg_u2P@FsrYN!;vDQTYl(g(jA?+(fKY56;sN?2uXKamq_FP#Bz+xY=hw zKf>?sEc2P4pw2~x^1Gv|4rg*A+kwagqCEt*4&$rM(@pAi;)Ew0!sQ3 v!-cmh5}`b_!ZU7b2FKjQM9{%s^QZp@D?Lgom!{9m00000NkvXXu0mjfd=u*A literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-10/navy_32.png b/assets/icons/guardia/icon-10/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f588d118f8c68b14f5dcb351d54b0d954e7e114b GIT binary patch literal 2281 zcmVZ5sMG39Y@-LghxpBb?@oiv&-&=NbB^>?ChN1 zJ-_$&{C>Y9{6Fig`5Qed(Rjkfc~PQ)X_g_Ar!Jo2)Ak$3FWh~I`2 zwyEBs>FLShgdf2wy8zGKgq^;Jq;qDv$vE zFxJp4U>gD1hRp!TJY2V#)qu0OvWC>l9xgLz|dQ>Kzb0h zmB!|oIpw|)<024KaEIoM=xhSKgl02|uG)rZePNs>fY-~Y~`NymA3B-tAOTagz1 z1)?3aKA%L*UTD{OU;s@qo1XS84dK-YKP3^b&e8A)4T_0O>GHpg?miuznTw}9EbBeC zJowH8LrQbr?c-;97OlTUqU)K%>6StyVliR!-T+gQ+Yz25vEjA?CTc@v40fjtm;#g5 zB611Z15Y17P>8Aq$$&hDz5B=Xc8}qN10>>^f($3T8K@xgEFc4orB3_4`sR#EKM3&+n_jejw>Wp%qHz(tp zz$K{E_l&OY+QN0T3lZ=`J!C?=2QM>%g>Rwc1ua2T58C@a{T=Hkgu3^ky})nH&x!sJ zvHNhs4vCugN>1%3Jck?$CJiTJIc(`Z)b@4TS(10Z)2jIN+@ zRo&sMs8|^N5+k4XgZmeR>%m*c*nu9CD<6F5D-qpp7(Sj^1x+?@{_+rkDhE-!u&vAK z?+Bwk|6DhVBJ+$w;U_>#!PR8h6KEa=eG^*0fV1m4Kbnd%cQ#sPqO8;D?`$;aAFRz9 zrt%r5ng25PRpW`9x{t=%H#qr*a?|;=cOK}=s1ILDf9F$Z{R~x|>2R_T?JRC59G|=?s0tb10)4{wS^AYP9rY2wI z*10W$#8y8nLD*JnbPAyO&?v z3kdOCL`urFo=kS+8nkR@+MM@sB0GRj89VU0;T0x>_UpdyKp9|RsbUeU{#2WDm6=?G zwQGcr0@FFGgbZPW51c0k#32I4K~?0S^k44lJ>GY{XU6G7!d zUUqB^S|5v@`8fBf+cnkJH!fq(N2u^4Z&U8>BxAjW7kG_ebOi0aM&P@v=w*zP54^{R z$D~PS&o_5m>9u%j04MSk{atsDyT1Mn*=60qm_8Gy?Rhc>FU6`{M(=_BM(N^})5zML zXx)gi%J4ETP(5p3u?{Sb98XpjqV;2F_ZkK^{@!@f5caRsl?-fHkh|lND^V(r=8xb$ zgQgmPE=$CV1u7VM7Swe5I~sEYQ%@p@+yQDiY5gW|b`BYsmCOXW+&kfRH0Ll7KQGT{ zq4^Lc57XauyE)^RT5YfK`y|>;A@*E!wwuI;>kB==iToOouac58d8=cXhVTxAdr8DQ z^7@XfgdvNjT48K&CE4Uow0xVb@m}+(e&uOcfj)%wZ0WppTYt<9wWG zmNQ!~GJD?$e>ve6g3%Pg)}`ZgmPA0Afy0UP832_oANj%PGQQ}lZ(W8H$^Wdx&cp=l9QB_PaCtBotB<5j*5JdLE*LS+Yd^=O?$tRa-%i0eMVoZ*oIs}HJ$ z|DHjaT#mA$WRpKaEDw=ik=1o<>w2H2SOq=pN$SIAV_7|T-W3dV{jMau`Dt~_qo1LY z^`Os2sy+a{pHX!xdy;kF{RXZ4+37B$^c^gQYW=pYvE7Y`T7#R3W0k#3qU#B?cRLn+ zoN@K>M!6GSgm@a)y$sR!<^Vil<#WF9sw#qQO+|8^UVq&(8VV1Sk~Fn`ME!Na;y#ZF zCww=-$dE~ce?y$sKO1^O>n8-;PB_ZbtmGNxD{l8kX#aWkl45k;99(%FZGRo*?!(Ip zDsU27KZS5AbB2ct_x$j*?L;>D#TYxg#EfrFp7G) z7dLAm;-YN9&Ga#_A#}tW(0`m-rojcH8xi>iTJJ$P4wvN&biVT63^@AoJ=?!`8aiD? zK)Kizhv;25oL7A0^IURU(KxFcP|Qa5y+GgQ13vLTf}XBG7M)iz00000NkvXXu0mjf D83|+p literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-10/navy_48.png b/assets/icons/guardia/icon-10/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0900c92fdfd8776115f3df84f8ca26174c1fb31b GIT binary patch literal 4265 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 LNkvXXu0mjfkxX61 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-10/navy_64.png b/assets/icons/guardia/icon-10/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..49802f7ba7213d923919a5ed3913348dc8bec7e0 GIT binary patch literal 6458 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 FV1gZt1f&1} literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-10/white_24.png b/assets/icons/guardia/icon-10/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..e922d89bd47fea34334024d7b520f6a5a8d24533 GIT binary patch literal 996 zcmVudXcFW$Nqdb?QM~ZahX^qQ0e`U$V4cRX5rf{)%yaFIBfRWgQMD zrz3Ty+TUfpp1my;Qol%($Kvc z*b01>J|ki;jcSPs%R7xzU88=b&h2vItJH1kg$>z9>hubER@?uK)~E}LK26=O9#Q-Z z^-1+vbz#YlE}enmZ&M%ablR6ER9C25^ZozEt#B^~>BO zOFfgF!W+u*GWEDp>{mZ5`n(KX(U+?)7d@n2T%p~l9#Zlt>dorb%x5O~NZ`eYSXHsh zBp#m$Ejkl7m>`LWSJitHy}%ma65tKs7a+s+TSROFGB@eBKdUFf&?>Q!tV4dAuwRrw zQ$GP-0d@lufnN(uhm}q9NuQB7_#U`5a{&xh*=^6pR_M-94MxNjnV*RGvqJG5uuwfJ z?Xm%u{1MB*HiG6x zr97%GZ6xcPL~!x*s!X3!6G&4_eomoxK)p$QtXuu}HrmBdLq4m3c72Eb^pdw)hI*2^ zNqr=%sY-ueyQwnE>N!+>Up=d2eYHMNO>9Gj?M?NL+WhOR{n9&D{aDS)YK6YD+0D)z zv^VW?%W>+->WN90Y))a|z~U#Uo7Kfl-z}m}orC3t;+NEo68_`6Y&cQ9QoXNk)$XPl zp7jZ~PJ_0>%BrU4vXfQ|$)ui8Gb0=0nc3Rahsq|wx31_(>Z$6x`E8ELktvj+h=|RN zwFiJ55s~Ok{vKdgL_AzG`EPYK@K<&PAoG$lVQ05kH^*njFp+vLumadvYBPWvfzN9_ zZFZ|UViV=V2~J>s*S~=O42yr0H4~Ts|y7{{;sdA2#*GTlU1V_K8Uv9k4|HY%ei!y>^JLX@Os(5o1Og6NB^_9f^;8AXLc z&dojuy%TmkCbS=%v<}a?t|GnMM*>SE89G-LE=RVi#|N39o6YPIn zz$7zkHnXC(2F$D{gzyg#LI{jkR>c@ff|(UU2t#r0f`Mu?+hk^w&FqMd*P7XOGrKNF zh8sEbUyL%KkP7iNP@(&LU>`6UDC(XK>;>v|rjW`=j2U$ma+DWC2*-faf#q(wuR{of zew*1`Gus_PIA~_R@80b&vqNS!N9TP1nB=W=V->yP$viLWw*}Y*8~{E7&IB5PCxAbI zZbhcjJ=Qlb0=t1OpiYtc2KW=`afhP1AYZI0@sR+;+8MqpFPF^ofWbOdgBoSUAN0xhvhSLB{ z1GXu@TUEOebXD44tY}P1DrTZ0@T}HLfI;AFDZJf@C^4W`0RBvz@O}v+z&vf#=Kyl9 z3^+BZ<c%&aejuwPy}aw9-ynOT1bpjTB>0MJyUxJB!W_HxfCi%jfMyYYAfuwEITX9-49*GrZ z_NAHq0DNy|d(3RJzV-LsKiq+;*osrb^%sS0%VG^+!W;R{D- z3e~z(aeFjQ1B!dyoeh0bj&8(Stz(%!BS!R6|5zhiF?T3ogyrUo)#hee^*Lg{FGMoU zGS~->8Di4E63VXDZAfIHNm;luSedD4&C>uIbAOd6d2z;wRltCQFx8ojfDas>I)IM9DMS7e z8|Rhug^M#rbf~SDnpPPW68^6j|342jd23eP_6SIKC{^jGRZvsAN9kFn0rjXirwk_A zwLjcB^NeWFNIjrYs#aiIqjCLdDXkI^gBp?3^L@$W^N>dSMy(eJD>tY_tH(0Jne2+3 zeGl)pobP&L$hD4`cw8X$_PrW-NBizb()Dyp&pCTKvtI7|`Ges}E(vvt z^;yE(t^Y4Pp#Ohmf6t>qdUv6j%`~%(Ap|F_@Gq%dlN$V7cWVFu002ovPDHLkV1k4b BmOlUh literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-10/white_48.png b/assets/icons/guardia/icon-10/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8385de49a27e72cd6c8697ed51ae6000ed62f2b5 GIT binary patch literal 2270 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-10/white_64.png b/assets/icons/guardia/icon-10/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..73394cb3c7b119c133805972ce49c0dd88b6e134 GIT binary patch literal 3474 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 A}tpoK8FXcGh#(ud}v z2p0(!1g(k^A}pQC7DYz8w6KMeUzR*3t{^BGN+k8mC1Y5lt5CT9^xDVO@l1} zuP{=D$^a2 vBktr1S^cs8<&(=fv8;)_VNd=y_1O6r$c*hn!O5kp00000NkvXXu0mjf*4;4@ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-11/navy_24.png b/assets/icons/guardia/icon-11/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..63085e81db0275754c2badf68622757953e9d728 GIT binary patch literal 1136 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-11/navy_48.png b/assets/icons/guardia/icon-11/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d397dd56467655bc541ccfd342accc45093c2458 GIT binary patch literal 2756 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 KMNUMnLSTaT7f5{o literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-11/navy_64.png b/assets/icons/guardia/icon-11/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..68a209cd29bcc9b9afd77323f3c2df736119039d GIT binary patch literal 3755 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 VKi9$bGe7_U002ovPDHLkV1n}cLsS3& literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-11/white_16.png b/assets/icons/guardia/icon-11/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf34a98b2fe1c8211aebf64627bc67b626daddbd GIT binary patch literal 502 zcmVKTRQU2^XQE6qkqwMFa_?MI;5(2?N zNNA`aGzUX>Q*203i~i_|`*y#N7yInO!~5{uf9ITgU)dHArxmydd`fnH$E_GqH$&Ez@TMJ=FQ>`+pz`f1>CKnFH~FTe|6 z0O*P)5hUrLbR6_6SzuezLPBl^&H#KN*5dwFD zlCnSx&BB{

B;DM~~d2A#tle9uolcbetFLG(BQj`=WZ34Q0 zpZ-|rd;^+deOuBY;0&-1_ze8;`;sPr!@ziMs<;4czz5(W;2AU?fC^^zUeXQVQh48C zX2X&;09C+Q;G~(Iu4Et?Z-D*4x$wYU9tCP74FL^+*UK?rMA8<(jXnYVe6OUQT!p|C zLkOMxB05un}7h9Y$fzyhGxQO8@`+{3hiQa}OckC1Q6064Eb&byh7#C9Q! zyZ%;5p2oR|M{8ohdGsE%JYrA`Y3aZN&4F}L^r$hwJ*WYmg~!`dvFuL@tr2(_3dy4h z?-uBMoe#u`m%g{wA2qXgl>(V~;1{2o**<1CB;5k$SJ?N=`>i{A(PSmfjSBX5-6!dk zciPm<#`FSnFMWQMv{_QGq?=xFX6E!wRj-gR4nI^aN1H4N+mb_1_V29llv ztck#R&$$CU0=zmqfX;Y4-6@@c@4(LR;zUs91=sDsDt1Fjo{rank3eIzf){@Yc6WH< zDf__8E|e=IfAVDDCAFkJq@;CcD$FF^n@w4-VGmgL;2MeY4%HoETQmYmqvT4h-t~ zh`K?YtWHVD)oJzZCUuWGx8^4wsLdzVGxPoVesnKVXC07@fsvd?#BTLmU=8pA@CA_3 z?dj>Kqg(1Z9ry-V2K+W+EW*F*z#!Mv`&{4?UjIL|A_;g zq`?gl@gUe*OO8JP61W}Yb*DE(W~FfinuSSmjg!tmjO!)9Ym`)7Z^S?xWrHQ&L z$+Oju#z;f!^fT&b>4dtfnLl1VTb)x!eV00vdyJ=~{tnDiUvCiTj$71RBD5K}3dnRF z0~}KPNi^2g_Z@}CM&SO4xMfra3jUO@fE$40dMU`~PrzwFo}6ERDE7&yk z$UHV`$6l($Zc|Svoz$ILV@mzbtK4w(5wuSe+RW*{D{O?Yk?`z0B-eP?xG(^X8*2P&XxfV{F=A zKcoKKtW@WzkEvVKlSW$*nUWgaP5EZ^T{X$GxVuF+dZUerO)Gv@{Xl&|J-x9J`-@;- zsEoa69J=j%jKj#pwpsOy$~e|1Q75!_iKf;6FZ}272mJUT-ADCoe*gdg07*qoM6N<$ Ef*uVuRsaA1 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-11/white_48.png b/assets/icons/guardia/icon-11/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e4a0843406b166e603ed8db89635c5392627c3 GIT binary patch literal 1745 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-12/navy_24.png b/assets/icons/guardia/icon-12/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..9a8351072e9b7f02068af2af9d039802ac98ec94 GIT binary patch literal 1243 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 Q{r~^~07*qoM6N<$f^-`A$^ZZW literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-12/white_24.png b/assets/icons/guardia/icon-12/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..13aa8dd88859c4db1cdb1dcf2e98c94967850920 GIT binary patch literal 878 zcmV-!1CjiRP);qEI}j1$>TSIRO<`vu;uMg5=AbSF z)@JzBao{Upd>FhN1N52f^>B@^S07gQs;kul>Z9s)YJ%cx z^+xq$^`<_r=O}o+#&@Vk)I;jEwRXRHRDDF>L()Y=ysNIMqRUF(T>zM_`FEA<-0#svKdJ^LxfiZd_*V%_I+@C(RuP_VRd4Q3 z4yuR#!pSyW1ePqjyyzk=Jp`-*4kq(f;wP)>Hv`9k<-pN0C;CtYj3h(p40bpH{WjhDKwPFe#)b!8=-%GWpQy*1yjKGlS%Q^aLGc?r3p&6zWasGn<|UcCa` z1H6|)BI0KCb9LWH5!sb#b)l$%-cW{g#}B7RiwPUcmwE?7^e*%{}tg5iI8 z^s@$b0NWD2YJy=?fn@(|jQ_`P%S1#Z0D7Jk;mvybHw0ToBf8f4d;kCd07*qoM6N<$ Eg1OG1LjV8( literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-12/white_32.png b/assets/icons/guardia/icon-12/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..94d0406d8cc4b8a03ea07271ecac64af2fde2246 GIT binary patch literal 1180 zcmV;N1Y`S&P)^bL~b4EvK!^gMx`u1MyzwY~!{^yZ^ zB&ko*?UEKqBIuLgna}T(^q8c7n}SlJ5`f|ayeMg@q}L?%n90$O;5jU5m84HoN^5|g zl+tiDTxbA$fJKuKTE%w}us4KzU1`<2q?)9^LUSOmM~XeQLaT|4d_LSdwY)U zrIZc>wUp9GMjf)kxlJP%;uUD39U5Ny8%pG$zJO|J*N({rQ&T&tjk+VKnn(Cqz1b9Hw3Q4a>`Y@&RV3=0YQ<4_i$0hh2BVmF2Q%YNkY+@n+ zRBYU4W|7DH4XDRLH%a=W0zj>Je{Zl8OJ$%B*a=)v(0YN*!1-Qx4Wj4dFX<1vaJ!@}z&uGmmPM}00vCEc zAGpr*^}z4eD6DZca1*c#xDmJr2te1g1n^zJ5O4zUEbwZ!V5clt?Dd(ze&9Y}UkEA8 z|0M98n@n;OyFQyZyUy#!fwzD;z#wp<>8WE3!~iaiNCa*xN^nl6TY!!B`46U*f-{iQ z4RjW;-EM1(g?hQj%u-4p2ZNMSXqdZMuJ!XJ{V8d#Q?7ZexNzWRw9lC^OVR;JQPyLO zu|TbYh=XNMD{}|ofQ9dnG%q)xLbD#v``wZUCC!xdTjn<&fYb`YKw{n~?g;Ps_Ox44 zfV|gDXryRZBd!l`N}6LUY^wqw$H2Ea3krIp$oIEB&whRfcm$XM8~`4+&!@N!yd1&m zy<35YJa5*Jj=cbw9*jLd+rhZX>juIOMz%kH;=l5b{Evf6Ie8;{4|TsID7kDwr{Y|C8jU)dUf6ywR?x_dfn@W zBf62RV3((1MdCTm>#)S2WvsRNvz1rc>b3A~6qhNH=Pg(8Lz=_@4oW&008>hl6(Q^W zXxWm^$d{D5Z@*D6UUJYKt6#ILBz@q2jlPu9Ghup3&s+GdQLu7=Mc}QMbj~sSIsH=7 u6UB8bs%j`3(I3@vGD;pLvLaw}w*3b_wDMYkVCbv>0000<|%pWEt^`|J1q=!V5 zXlja9ME2CmM0?p&3M)&^G@mo`#k%wDanJFbJNI5^)CGsTUuW<2+G~A#pKB12Gys(V z>Tu}E{4ulg))w=Jomd7R<}aD~503-zD1f1|M7|%bOVslxfLUfXFYr^6007zmSOK6v zfX@MJ7xP6=R3;gKdI0?ZbOtcO%odZZEXkcnUhXC!`B1B}o4tM~k{d~WqIyNK@8Aptm=eS$(mt6a;YQUFtU44|Qcngc6Bl*t|LMQ4$4H1xbsV zz{Qbj4@QqjR(>;aNv)mF0BT9R^wI>lUG<0Nxt zR!i~*08apztzngA3Q_NyHMwND0;F0XED$l@3&4v2)&aQR88@?iI1(+uhRE=$Gizp# zY14YWEr1#`+vNgCs0qs6R%GIGi!C;@MJm^|v;Y-a$TRdbk}ClW05Ax^9cK0oNe{Vu zCBSG2P>d_pYTa!B7A1r(+l7)8CaMAO5rCzt&oQ$(a;d%EU}hhXJhs#jXl8p<4B9UX zwj>2$^y`~Pm%N-G$05%VK8 zpS#AzQU3sv_mP}L@@kSD)ZT-npT?Y~HK)Wh#%@a!AV!_huP^NMg6dTsQ9LgwvGpbC z(QCDQ-^Yw6>6kx_o+Wvd#=W4nQ6&kHB|y}llUa`^xrOA99{bbGOmY>;?IcfB{WZ<~ z9?2S#y`}M?BwtqFS3X_}aKZo87+67 z4;EN^n8ti2i}z2sQmz~Us`UGg+6R)Hpz_`7t4^G!1N}v^Ey?p#eB@ z)2lpA>zy7foyB`rM}QIzxULgW^U3d$do|*CW$VoV{sGV)z-npjQoo`xvn@U@1^YK9 zK#hMBKp$Cum3TNg49yZC)4w7p@h!;<96g%Z4z)F5Mhx`QqFa^xP5|(h`U1MmT8kuq z(U_h9c8cltWeboHqA|f_Y0{&U7RtwV0B)6D>MNL8*&t*W3F`B7lQMRPA!VP5gAfv= z5lTd%HcY{k zX%Ewb)xJRWK3c!36aliJME>f8WJiw{(pJw5C~=l!dq<$EcZeVZ^{xvUXeG(~z9IQY z)LxUcd`XE+ztbIgM&le7J6#zG=9-+WvC{=994k4^cPnV@X(S&exk!*?mS^#3?is;# zNG?=)o=$^>Aw>Zw@uAus7Tl@wMDj)b0XjEnuTi$5y|sO&LsIU$={`rHQF0DMdyJrS}T88Qd{Rph#{$# zh)!e&L?Qh;8a-3xEKrvAq@u|zS75_Ce(?EP+7A)S6}MJAUK8_{6kuSoGjU`r>!Y6p z$wTP`vy}?LUOvMymj?*(vQ~@-A>5t6RNv4hd`5VDP@ynd4)ZC(G&!(yzm@%l?`M_$ z0>J4Dh3+7P@2_>*>|VCy7n;^XE;r@^8yM?)y1Mp4jA#@plV{}#H z0P$V`od68>dE#$m{_F{pH3J}9k}7qFk>k0~oJ^Rz>_*gLVL>0vOrcmzx$O>iHGGlln^E7~7Zg0ygpi1HBBP^F5!R-_aP(g(^*jDp4oq68nsLVWx{G%ArGMjLz+ zET&>n5l|F0C{HEWTBOv*h)PAMEl9B~g;H+kGi&;-d)GZZGxyBQnJ_CkIp^%xS$n1QVhpoeSz}h>__}w;$tV{b z*N)Y+nlot2)D=feZE9Wf(z*oIG6s>Vv}c9O`+i$ciQ}}xd0hh}KSlD0=VJxw#3ocb z{C1ywh-(3y0^o1}?-OCWsS2eT!D^94;%MCya~(J5LzDlcCchcL*VLt^K4nNkSM5r* z2vs8j5;ylAj{)#GRb7};`m>f#UsAhm5ZP4;AZZgdZXON5IQ{vQ(sFY~NWMre>23h7 zPAOd_m((T1T-8~6FDeNsGdX)-nNs>=nQMP55>U|ujsx%(05eF=NGUx`@+tra16U2< zqw*eWVVv&*Fv4{TYd!MI;e2-`0DyUf73uZ~0FDLlZIZVEI1Rwl0M1S+JsqUQxqT^s zQ(KgP2;T4ZFmCreQ<5tbZ=a<1zDxk}Vv>($V)OT_t`vWw0FI8+$@>1?WiErszY`mX z`exW{@+Skh6TlwQ`>TC5$U(N#RUm~`z>R9@P%VVXXmE5N$+rVADKW>#klfK^fL{YJ%l@d6vWDM& ziZM(&P6Y6QfM?xSl(IyUT%NZK7U)-)1HN36Jb~m!eeZFS7m*w+(0>}q?}TM|tvu4s zBT%+MfZ!t>MsgX+IgOABYxwabx9VHBkUTWB*@xsQ3ayur{1(X%k(^DkKeU@qa-GJw zm*fkzTBOn)A&2bX$^+O(UqEt=`d+TOF{3J>5zlMn#M;F^d(v_pVDWeE@_db&9Lw$T1HL6G+VMHA$I?d z+Fq>sy-5Bo*aGKj(l{em_~uNK8`S5^D(fftfXdEuJjxb z+WXx(di+1_JX`%2RrWxbd@kY|w{8SU&LwHdnCFZMDlm%eJh(+lxsl^ZN)KItoH**T1dX#qE^SdECM856G>WT z#^G6#uPgE~lGmuuM>N)gK+L|POPJbP|KrsELE&X(e^A+5TTz3`cn#$5+d+hF$_m-G zw86rZlBrGHUyR6BWc>{h&*-evc(0b{c8^@*q6Zy3N?fI6%z*%=sLb)QIHKHrfuxK~ zO38wf1pv-WDVdW}PmVU|W^VCw8rR%e-_$gCnaW3e`c{xu2Kr%bj@noTwRQ+ljR-eu z=$n!$r8NN7=($L|Z*88@vmd)LX)+jS(|a?#2ZZypnK~c4{GFksz(ZosB5ft&|5mYO zk_`T$`;f*d9LR`ZlL726HF!u>6E)5jv;Y;f2*&jWDX>OaWhlBcO!Xs(y`~q#AXU+LeHW7D1f0Ni^zvyT-LB&=6k<;9dY0$t{v9jk`x7 zLYW$UT;u&jDmG2Fz|ITZ-`1uK$(340=Cv3OyW=yEQ|CUxpnP`A1H4IP^YlIQCTIIP zpIs7zXXxMgiuyf5atK0-yGY&>h(<}-8DYFnhq_hf5;tO4Tfq=U>r4lyN1fF3WYfYM*Qz!_^wp+_oVKdbZrikGwxoXJpdnfl1Yc9*L01f%v67t;{3&TZ zvL$=K=J|j*QU9cujr87a!*xP%tM1Q)`<9Gouh6(JX@Hxl$?IhVpU9}nK5DbCvPY{! z;$>E0B5;%dV{AaUFA7|;Ikj(J0Z&ljsQl-Xj z3OPpy3$O3cv-RIUd~^2@E}OI+TZjl84TpCzf`PkV4@j)nWZFwWj1~F!+LpWgghpU$ zbiJuwNRv6!ma5EkKLs^06+C)eBCttXJaE}W@n+=$PHbjqLLQ;nm0fBNA$cmv56j^( z2j^Vn4+e7*BbH(}_=nq(n3*E^

Rn-YPe1jt28QqjK!l}`OVWKN%^Ev@>+$ZKZ4=YP$afu~ve+Iy|);6bB+pOAi7FfvOPc9QPBa81%R6gktRA&SF}IA)9RTW^9Xg>A z#jG9h{;jAI3;s4|f49BC{&A{T25Aikxu@xfuf+sU0k|2!Who`|2}buKf|D~@yEtx5 zdl5Fu%GYE6Ms_L_miK4g(|Etm?yEF&FT%Ez(qlz_o%ORz;Xqck>FGA+_~*R{(H$<> pzTt|N8g(f1uZ)tx*k0P|^nX>g@8)o|-xB};002ovPDHLkV1gOGAqD^d literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-13/navy_16.png b/assets/icons/guardia/icon-13/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6ffab14efef53ea25c00c5b11eaa9e219e3ce78e GIT binary patch literal 668 zcmV;N0%QG&P)8>DG z(jtgHux*+~m<5vUf~c_qOP%-biT7rzG4gEA;okH4KmQ~A6#?{*&iZE&yACZbfVs|C z|IhM&r7xx;K@`*+>vZ>apashiYE}SyH% zOo46yHUY0O-fmoRl5f=)m|jzae7U2vf1Ip;Ber++CE3+m&2kbI%Jf`{?Y2Iz)Is)R zTht)JAnH0XG6NLBuEqr}c1~0o7J_L^xD7E4q-F=p7~~z+eL$oD(gCK4A77sn$||4+ zH7mi^;IxiJm_)ERW*8a@OBkg6eI$~{2p6Xq>%Ug&vy99CB-e8YiTs1Rv^Ne5nVu^c zUZAoT7)CjW(RYO6VWb{3hy!iXL+7V(wh7TXoTf%I?=iA@F(w1)Q%#81 zi3ax(?+7B3ph?8mqs1_;Xc7s+U=myk=VloncoLDy#DEzu1#S-G?MGZKslro`Ih0Re zzMxV-%xA>R;f%w0TjRp->&s03mq=MZu`H2FWV%ewZ(mB~OwW0&*FhLQ22Ft!LEj>* z2Z^XXfwir;;0bM9s?*2EQfUy@l~R(`5Y?&@&*nfWru{80~*R?!-p4sui>u zVNub#S#D73dLp7#Zjo6A2a!^iia%w9MyxMmB4mT1$hPtqq-jv-zyua15E>GQJF+&+*;i1J_gOz zoZC83h;>0hPRaa+M=-s;7}n=__Em(5VEQ|QsOw@#8LlX%3hLbiD++E15kwB__m#4Ti2RVe1SjSR(h^LNmKZvCq7NlMe)`@Qe>nx6(%O%CoJ*YH}ge#s3p}Gr8 zKO|yb<9ew@#PP5PM`Ij{DnmC6A{E0JL*wzJ6PLrmUi-?x0}HB^M8f0`>k_upL+w8m zxTy`OJ_VfT=c>!ZuC@}@X{fq{q6GzlszYg|g${p#nK_7Ca)a5+x|rQ<(%v30%L=S* z57^R!ND0&b?&0_HDpdZYqxGYJT?gHFF)WL|>=+7`13h3{g4;7dq+&dx9_=d&l+9Z) z@BLD&{^zmG<+%1l(rvH&&&W%_m_=*G<3^7mq3==WN76TrLc41a>T5)J2agM2_!JyP zykQYb)=j*Jf_x53e6sYS+6~e|Y(h;wL_7@cP6oTbp`_v~;;AT(RA6ZhXcO=v@ni#- zlLNXUqe&LLAass%fScBNBK9EZmd(VIa}YBy%&%TSG065wuyTgOn7SAE6wgU;d`CAJ z4v38*4x*!%dM=nY1|DvvsDcqs3m#m@u<9tE@gQo4IJ2vV+WNI<$f2|Ka?t$Jvg4ka zs9ie=&x}&rxDijE2D>GvzF_be9G;*5Yy-%}hXzhfr?= z=||5L7?8u<`l*DB&**4f5y(pt5whi9Vp#7nOg|b5WA)|B-$xnH5917j5~r8JvQpga zZaUgt8mrfWgh>LpXqBVhaNw#N`2btzfpL^mEmw#o+Yqe+%g=>hU;-Hs%SFe97|3qL z3jctcHG{hO34Rd$n;SXiGp;}vF+oaWx#qU%pdG)`>06m*B6nn#*l@@wL$Y>Sl6xDFe~mNTnBu`t8mqDB(~a*~~>ccl=7M{slxfW9S-AZa-Z-aD2_C z90G3&c-v5M5m^@0iLf8V4ET?{iE1a%fk-8WwFY&sqq>T8>tPlqm!k3sp0oPSBXfSk z^t+DCcyfP{T=T{(;;F^Nlc!mjd^P`FtKR{NtFPdRkD{R;K7?2oP-hq;T#1+MBi&ZV z%(wGHKi8UB+%O$ScVd-X!Olz~EU8-*__)JwOFT6PBlHBCb&;?Kdg`{{mc%*9u`w0G hh&+oobewc+?|&b(0KdVB+cN+F002ovPDHLkV1oHBRiyv` literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-13/navy_32.png b/assets/icons/guardia/icon-13/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9a60c1cbd482c77a3ca86d7351edf50889883bea GIT binary patch literal 1773 zcmVRji=vbk>z304-dEaw;drJ#!Y(B}o z=bZQV`@G-h`+Z*FMr`$#xx`IEQWE!Fyf6v_$&C!Vr=Ya2nPN33)$Y((p1K$D@fM@%cQS(u} z%tkcs!*CkGAaWNC^EWa!a)9#ar#Z6ka%IYCo{$-C52HsA|6bJm0kjEd1XU2*wgilW zwxBfw3FD|Hh_s|_t-B>b&3XLHdr{L!aDEjp42-21nZ5|B?#bppM>eml=w8BGX<_a# z*=T@{t~z?AABCj9%7ViDDbTqT3vGn?pxUZfD7)v{wE_QH>GSrB*F<*JO7n#mc8}8; zJ<6PU_fa0Xje~oSP6N5KNub;wZK5;!FCXk`pw>FOHxNd@cRd2clrN=65J*RiQUYpYbVV0 zQ0(7hHx^*Z9pKFaT?)(to@4BS2L(gX?z(9C;Z6+qGSt6$dicCvGdEE#?c-4YgM?f6 zp<-RQC-s2%R`o_G7A~`5>pQ439uo`8WVgPLxMZ2E1>|>#Zg)`-Mm2IK)I*G-Iu%Ze$ML=i60;h=?yn%vVR(pQ;V~Bl z$T&g?5vvaqsMUhX`(&BZ4%^1Rl5#B#3qsY40qO~&H#wTrkrAXNX7!e4{#f`Kx967O zi&89nmoUmO;280HH*f?X-l*H2@3mq~y0FnR5|A*AFC#Rx{lgsv>Qf5r3dNmStxDc# z6yUu|P-j{8F1%ndru! zzm2s$eieK+L~pIc?xBSN%Yft8nbfv9eO75`RmOsP8k66G*GSXwhZr1;(?#^A`ch4k zve728TXibOe~T^5KkGbEO?cELnp2DD?KNbhT}ZG66aU_6xM~w3>HudMP_3{qx6&&G zpe?i6vDFfr5vxl)%Xt1Mnw+Ls_;eT)qxdK86HO<9Q?e`SFib>pG*e zXuRqwj8+4XTJ(>eu_@Lmkgs6kV+4L3#@!X3#_(-g7VVq$YG&zsbon5H4-?za%qPHX z2D$a>lAyCdD_Lpj?vMf4qMi;`Nt4{ zJ!)PfG52$*@cbL&^hvWhV>~7V7nQh082-=Lb*|@Am(#AEItF?tCd>Z^>d@CQ`96 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-13/navy_48.png b/assets/icons/guardia/icon-13/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..06c30bb5185f52d19cccaa4e0a3bbcf70296681c GIT binary patch literal 3110 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 AqW}N^ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-13/navy_64.png b/assets/icons/guardia/icon-13/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..5328a1c53d5711c8e6695a1f4b5b29409de4adc8 GIT binary patch literal 4584 zcmVP)?pl&9 z8~*Y7>YjU^|M}1VK5*2b%>cxhsx~*9W3D?vAdcBcpSdNjpR*5?j=5usWcKkM-R&;N z7{pQQxvkBhz1=5~yb!~>AJ6#|LYPQtAcO!ZKuDyN2;qWoka82Iy_{E9e-zG5a+JY3 zYCW$ci zd&Pe1le00*%aF{|?=$)iMgD^3=75}1brRbBaj&CbqT}S~1%oMMltn_bNi*=y31=dV z&3MiZVzsAp@*i^S+9jAVV|a0IU~(27+oxTCh;`#;-y*Z`Ec)tPXjk<{AR^=)#cw|x4LEZDIPH|rvd*-V*I3+;PKL}+uLASFCqp4jF;T3vkr%6 zh%wcQIQOfc&klqs89HWeHWLj?y9!(=bdE-&O5i3;PZm zC~?Wz81^Z6xvVZU?MX=gCCIIyXYIz4V|qjgXbLf!NIr;NbtAqH(jRW67HG!wnu`{s z*6fF@LDdze##hBt8uh1`C29;Ah)lx@`Yr_3ucE%FT=i+%;N^0-nH$--c5P+eG#&&r zMP%P{7n5r5!5JJx`u_|60 zRAg=mJ)Qr`ClwOOpJ7*DjWhT%L$jLbYtM~EI*9U%UnNPj&IMyVrgai-c00YDpVp+c zZJWW|xxN->qd}p#8!L>r--9zPp8rvf#PZ89%;)sc@SNw^AHRyXj(5t7(ow~rkkGnT zFWz?*87gcV;koijrz@Xkt-`8!7`BG|6C< zcBo{n`on)OB#`LLjkcRXosYqyD*}lTGT{CCea2aboVQU@l1gcLgJZ75bGB+uj2LA% zwZbAf`^IT3xaB??mR(d(o|gp^{3`}u7+QK*F$*{M@1#3Ydi+rsp;4yHr>V(g(@%CG z-8-}hQ>IEG1t?xHY!if&X)}mH7I1kWMtsxS~WyN@*j|XJBC;jEXn{s zyOQ3{UudhbyWPpJpm)}#BzDe2xK^O`#ef_*=I|s{d8ApY&w4aBcvtmwI|Vtg)ar9N z(w$p%(cHa0=^_M;OZTu2{aHygJC6Zv;?if*oBA#dE!D)T@6hA9gLl*0^}}%I)#3w$ z1&!1Mf5$Na&AP;qAV6sA@8BMbrY6CDqgcn+kP0cG{Z10eeR^BcUEdE3kg_^JXi-iy z9755`9`M5W;LD0))#0L zFM+=q%Sv5E+Dd2B!HfYG=*}7C(Gst>EEL(XK1$ zZJ_Feukqr&in&SVx6UChzBjti4*du7uRo6X6<@JvTT~8kD4a&p#+Jb>yl`%|48B_e zfsZf@5-ksr?z}l~3n)Ki>1Ih{-tbZJy^4=()}^<$tDf0 zHo`NpCN0OyN<4Qd8$18E$QD2Bg6i+Y^{XfXfq1SB18pFQXy2(b^MIhRGUx^ z0W#VNsl6ZhuSyTk6OD*8zyT7=ZpX|02*db6;4o4f#yXKEYwtyCcWpo{{Mj-bKO>EL~D;xn7MinAd z50d?HBTyxG7Wb%Z0j=_OJwPHE!;0Uh*Xd@yNpI(aLHMj=ge?HP`rrplJXChmRqwTE zYEuap9y5129E^qWgP01YR5$`sDuy?iMYmV+^1lr6mOkr&U#$>QsSpVr_tV(27vC`H z?dS~4qQ#E@Mf!?aP82BSS`r}555}g)2J&wM)hA;37Shk+$n0?YcKuhx1o!If4fs6H zz*Z8=H-p!Ul)K7eTuXsAgP!)a!6)T=i_UyG(371&Q5a0V2y~D|k5WZr%XLW6h!9Gh z{~V?@RY#qyvOGWv+$GPzz>{En9>biC6`zd|mufZGcPc9)pCnsADyOIl+ZiWdS3jzK znaVrt3@YSoMfy+U%Z~!3ZP>|c>D_sa50zBcUfpVcF1h}CBZkP za}&vhfjOLf|B&@6n!{*yRrv)}V8mkjdY^+Tf2TxwD&M){3-hm^L)FxKafed$D2J)G z5oA7{WgLjRvgF4O8< zs^bCu-q7+WcGaKa4E+&Pe3|qk+k<0)$HDmX#N$nPm7`kGyvM{w6sK1)hW>evLHBj^ zpCO=|!v*WmgQ;1Y#m37yD{J7uYGPAVTwn@@h+|b*^j3M~BKvx?_b_ku&>*PKOIbq*BaB3>RvOZRPbGU9MpLdZS4E zMz(;Vvd45xz~|jL0dG2NKSXmRT3Q#g@K#Afi}LG-6AZ;=ear1yL@rn%X;}8xx=by; zbmm9NV;uGy%}0yD6_Uo*4|OJ)o=>Q#9Rfs|G9wTrty7e$gB72TlifmZ$C>$qs>GUN zg!Rd5Fno`6*ONgku*6AvsBw-I3XX_S2$-o-H;7G|g_lhu<&~s6-WyNC)QH`0S*v3L zjms-2LWMi~F~$W7$DhCKEE276bN=m$61H;AvU#IXf>BaZr$gEbPSYuCkrSc>Lep3y z>|;`U3+JMc@Osx9WU`CN4Zem|{TXcY1I($g^Q4G42Oe)c`m zU8m;r0TkmIOES|@hsD7o@IJ{rxu1K(bgbAjSk()0hj!pOUuNT)P2cc|Kgl49j<9mkCz8MB{M!^i+o_pknd2Zv&k|jFH};h8;to0Z{*Mu2gHDwd zN61D5pMeu3N|RMcNO{_SS>^r`yXGR?p?&!7b@X;UTgVv27*l0`h&AcfNX+J&=~P*} z^d^Y1!(~KiB20M=yls_1rMNj^d{42RsGU)!j!qd3*^|l(%Djk_SCH=5pI=;bWoJ=y z6}f4TV^@6*FY6+m>q)Qqx2T?A%y)lUmm=adrb-fCgkhhE=VUZx z2ocAw0w=Qpv;Q()S$AM~ha-wm>GdCUVa0CH@j~e?rl+%8)f*clizuOS>6H+B0@E_} zPI>MRNY7kZA_Y{GITLF__kRgI?aAZ@H{fP2=k-VS6(K=um+dOA=uu)d*OBZ0HNBlpYIDcV z$s><%{gR7`)h@@&JW5Z;GeJbS$t=DI5jrhZGF7bh=i~-{MSA8X+B_b46(*7@zneOX zn0N~;6L;`*UVmhJ-oq5Zt~wEL@n)06aVrtAGZFoNhigs4vi=LJS|Q;ja>nIserWG7 z5;RZnIeXb`V&+zzvTtVR^6DcWj8l}2%*D^^+wzcCW_)J{cJ1l<)=1NOqwJNLZPU)j zw10!^{DD}_JYBbJ-xcly)Gs{~(|#VS>J;38SCCvzx?^{+aeIB5>ID5eW8lAwFi*g9 z&tl`6--@GpX)55tTM*_{QB* z()?`edF-lB>(IC`t}2QlHY~pa%lsu?b`Q?fIc⩔Ako{0TLQoUc|0mgp;`wDc2+X zDlHcERk^$f90cPV#B0Bf(|Fs%#lO?BC#d=i%yuc3u3{oq2zctI^b2+q9C{MJj5 zgX@UZG$C25awM>-f^l;F-FUh0XbF1dLR%^pZH z-(OB`l;m8qyWNTauQ8cq1xA})J1lKTdUPl763Z) z(>KbG*oQ&fs}pL$Rq5&W{Z#$8FBQ_BStxY>Lt(5(p)}`EQ-2Ic+N=i}g{jtYZu1Z0 zLn-BUokXVzR-K=k9*c0N{lCGxHler8SD|n08?D(EsdoG8Npe0(-C8q?R7$y)WH8AC z+^UG$B0a~Nwi^$z15a@hXKT!i27Q$`lu{;=)Q5B&mvI=6N+~yztZPL^TEVTq3e57H mkJXjMS6uqzId8*GT>Sz0(-_hvvzhGx0000*!tp literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-13/white_24.png b/assets/icons/guardia/icon-13/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..332d1a79d94c6cd0f56998e2d14a19b7b5f828c9 GIT binary patch literal 862 zcmV-k1EKthP) zVQ5ksgh&d*kjrHL^XUEep6Sf#U@~8w&Ue1^o%ixQ&-;GI$P7san3;9^+{`3t2H=-~ zF5s@2y-U3>@pnGY+Ov%D5;q+4vRL-}P2f530~il{0M-Em-JzKklHl^3^cau(a7hzW z>r*71%MD5$s12wRNG&AmHVy=Lp8%I{X`-yMlq}u&pm5?+d~IesBcts}FgeIr5Ie-9P7J4U z^Hf(zIw9%Of8cI$A0p|oq}`Ghra9OIYy;Xtg6WUvN=np}J5q(^8Fm2ez#(8xvN#4f z4x9x}IdRTIY}f@Xle7^SmEj;E(rsJ`zP_7Tqoiqx%**0~lDI31%Il#5SZ-$RF2BgG zJL5ocW!IB;MF;PrGDmvhnAvAZ4bfv>MSnTg2QFNuF59iZ{D7(GU_bB_sP|05U|Sky z^3{_ap5ahnG~hCSl#QT9()rZ$U`gjBO^60qEooHFRUL&`CCU3$uThrB2^a=+Myfl2 z*}yH}4R9oC!?`G)7x7IY`q4q)8c-T_k2+yY5J}>q2Dx!pxpY zS_(7*Ys~Cn_P}w^*MYIX;rMt-)QJ=5d^xu3qjNrp!)Z;(eU+KrkhB2U8wXJCkvZuf zM`m;8xlYnNNe?BhjI}230DV35Ju9z`&WP9{$vgBtFmF4qJXhm}Y+W;&WG{^RfuIV`d${0e`C;Jq5Kr3jhEB07*qoM6N<$f={-c761SM literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-13/white_32.png b/assets/icons/guardia/icon-13/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e4eae9c75514bc4fccd3a2ea277adb1d0e1f02 GIT binary patch literal 1222 zcmV;%1UdVOP)7kx)V3qA=-8S?Y%_cCQU0!lEJ& zO0X}Y^*KnSum~&4OHv?aVzuRM*I%4>|Ia!;zOU}C9vJ4CnP+CsIdlI1ITIR%023sI zOG;lv42)*2jsi4*DB4}F-vfRJwgWqW-+;})1s;!1YYba}M)BPQ#<=bQb^&(-R|D4p z*IJQ<{%4%)Qjy^+!4XU60O!`mrUO5;nbQlr)TaOD%9v{1x-@GOni0_tERyu9q}{;F zk`78bL()Bx&I2Cx+_dbFr0J4w$@!9YNIER(*6fqC4p<=Rzw|^zQ0^I}+cS`C$wEnA zNa~T)ox}e3fTaCard%ld28w>%-XrN!uQ59!_O(+&h1>6CP^Rh>3a|hFQ2e4B|Elq>L>L?DqVl<}@9ZEgA*>NLVG|M8ry9Rz`kAJX=9j(lZ*l zqyqnVpMeqy&HTu~l60A*+wGN>1rhO>6&vcSyYK{(8zoQdlQb8YC+WM0*j0L9nxwVH z{NBp7K9Y1mzEmI-d|kOwqq<=%)$syyG3opCUuK*4%Rj~E3@C0%4sb#?Gag{t0& z*yQi@aLR5;lS>7t!KusKe}kkKJia6%-gXr4Hzl_`)xqTz9Un!xHXzGT?$C6{#H7h0 z2F6Fk`@kiRf#;JE?b1|gG}7mQKdVqIQi09h_$Swm0xC~g^Zc*>Bv9~|q-5E=A*V=s zx^hZ0B7O$0l60k{+ax_)ovSxH6(~rUZe+nwj`o*HZUJpJ;F`P z`Ky6tMSEz^rq88?cT;SmKtUc!W<_fxJ>ZEiIsrKm3bL$-h_Br@!TWR-@YK*{l(+}_ z+|D0nOM1=iMG^6#7uar;9IR!=bp^r~TS{K(fBP~z7C9Wbj_(384eNG$8SvyNg0H^* zTfjH|u2{AuQFZ!ztBL2FJc=s#4ABa^BT=L}iVVWfoSNNec5Sh(YAIPlg(}BC)dH+d zPgDs{3+lySOCunm@{pv@t#MDmmQ_+Zp|CLAcgT0j;UZhknA#B$PZaBaDru&qIZ4aW zAuWGg(kmvA=Q5?1bhf1XjEW^bid3rKm)LwsuS?ou#qN}Jlb2o-5qA`s_o__qi}8*R zlS#vTn7omRXPf@a0j2;Ofc3Spoxp{i&Z?`H30I}tPqPJ?E%|9S6Zi#q@HkJiY<~%S z1zclvZL84MNr_I6(|7$aO$y)Q&A+d#Y4bQOjmaDJM_?mxefEv~E!f^gsQ kp66u_n2?T$B(YZi|E?j=G#yXA`~Uy|07*qoM6N<$g3swvb^rhX literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-13/white_48.png b/assets/icons/guardia/icon-13/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b83115b1f0e0fbe527031a7147a45883ed535721 GIT binary patch literal 1977 zcmV;q2S)gbP)${(<({JCm-oEEfudivXP6BW`fNcPD>2j(97y$4MfMq_!`(tY%lHIz$$kudX95WJBX{VDG^qt<2wR@ZI zuG4V<-UDzo0PjDbQ}EqB0KhWo$tubF8q854 z*-vu5o_n*oy7P@0Ddvk4A~}=fjZOL;DHS=tNuSS2e%$2!p(Jl3x&4T!SOe-F0|eM<7^c7!N1rivS@GY{ZS0E+;;9}Ke+jMJ}V*wJ;eWbV{I%@I|kKRj;> z;Cl5t*v!_t5N1~GL~W)gmBAJulE-NMSLGxMV{bJmd4$7A{-OzHscp2pN4(sVj3U`n z@@}|SPk3G}9_A$eTEzkP>Fx^m05DE%qZMU0#26s|KO`oM1aUB`_X1e2=A)X8sY&Gl z$&bs-mI8QO%^OP8t4oWxH+q`nzG|=N6o-3tM_B;4Ct3&Knof405QyYKI=-v3_O#eo zlAo#1fo(6)0UsoPCizCIn9vAH^yr=pXN=<*Gh3z!Uv>`xV5XUUAp?65fV)2T76tUk z=186?hY3~nUk%_YGy5lwY2`*636NY?8oWP%r6lKR@@W7rbAjCOq-qlZOwKS+VmwhJ z*IJRz*X^|Ivc0IBc_OE4f_~o}0?n;zPban6REQ;5DN>5KzB37NI_Ua0?`URsk;P{A znc4j^_*wvJJJ>W~8bfmh=gGZap+@470sRgNph3|sPAFNxg}W;-J5X}eH5KUu5_99+ zaeTo%fE`F~XJ&sk8tbazo%aNA0f6HH94lQ;6V(_>M=6(Ehu?>b&I7c3?$QKf&K_2z~ zHnVk_Xs2v*3Mi2bjpPI!z` zDm#%p%gh`)c-vwC`vExB%)V6Hd;n7gjmv^hSrCKTdQ`QzKnCl5YhFk5J3ew6;!>k- z=SLXZrT|#rLTF+)^vlict&l(T3A^~tHHw~Pwo_FQ^9Y<%%{j=0r~Y*U6yZF0nj~d9 zi4SEL59#;KX6DA#lVX9HwGX;l6BG1E8x-99`Z56u^ye_v%sjXKHJi|dd)O-v;kho5 zHBgausmnJq*g==vWnz4+HncDBTod3s0H*=)@cj{hFY+Cc_j#mQAj787Kyc5_yrY4A zNzMguitw1zUpZ%fOp{37LUIvF&q0}EA>E5QP!gi8RIdZ#piA}4Y?XL$jrfS`qh0n9M7KVn9f z#emiVB+0Y8W03^_&es^vgU>Uw_d+0Z&($jdk{_?_OG6G&^z(JrW(BTdj*iNUA$j+T zgVVM8?b~oe@J?5#y{+QNEw1^<3#*y(Fy%_sC7Ue&k_;-G8w>h-(gaF!(Z!CQnl$cyI$i^b1P z>0NTm?UdJ-D<3VuRw#`pPm?@HLa`C|$1-~=t*7#OOicQ-T=-E{M-ngIcOifa0o-S1 zw>JfkA?n`AEkjF_y2}2NUCh(_*?QO2&JkV`J~1s(E<8@3h9(JMtuIGIyH=Xn*CnU8by5TSsI~nEy^K1W1&Cbt00000 LNkvXXu0mjfkNV9n literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-13/white_64.png b/assets/icons/guardia/icon-13/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee95d69285099bd71101cc6575ef9c50cd9e9fd GIT binary patch literal 2791 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-14/navy_16.png b/assets/icons/guardia/icon-14/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4df0b42d209e8067bd0f7f59562505204a0ecda8 GIT binary patch literal 641 zcmV-{0)G98P)Fp%$*HRYcGPK~xk?(CmX&gX?H*j1mMvk(AJ) zT`j7eGeuxjMp~gzZlr~c&U^QscyB6E+x9Ikmvg@R-S2+q3QY*Z!{l4^{4Yqd=8J78MXa$nO(UwH9vgtyCsc1ulP{*&yW}^z3X+2HJ$SPXqPvJGp)w2d z1IHJI|OWfl43V2Vi@g_j1_)WQD5%SzJM;2uWWK>}1ez<(gB-)V*zW8lIrr0q0O zG{@`8qkn$<{!4wNT8|N})Oa=iY^_l!*!9e^fr3ryNv~`+amq1g9aI=D2b;w<2p1mw b7H#4eXSVPeRo)4R00000NkvXXu0mjf;=Uxj literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-14/navy_24.png b/assets/icons/guardia/icon-14/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2388a7c800c4cc6957dccd4f0fa18ad3e1513f GIT binary patch literal 1050 zcmV+#1m*jQP)CZ7tLm4T1O<#DHxwv6h0QR1gKlmqwvJG^Xh!Q4rsxprjE*5$ua1 z-EDpFPbqex+FC_XtbvMHvuP~|3O-5g#v()&L|)7AjULuSRQZ7!wPSao@UgsA@qUCV?s_SjFQFS$|U?y3+eFN|!-n1eT zfH?p>pQ_P~X)q9zEZ{F)4Z~)Rfw|}%LDQh(KBcnv*yM~H4Dt>Y|(wY_&>bFZXw zh0zU&eFE=)=aC!tbEIlf%_Ws-(nf}6x`ojLIC}{1a;V)!7(KJ(0ycjhm!^ zKnxrCsJf3zsRoiX$-K}t*n#&&g5YCZ?Qvq=LZB^pJ&D*O*x)cOPQC%zNmp+W<3U>x zU60A1#>Jn2`xY^0fL-JYzcM@Bg=L3fZ1)L_K8plN3!cQ7B%>*8lSPtaE5Bi60;qyc zAaW+X!#K#Rh)y9|NZW{+N%k;6WET7jd{_EL=JoZi?Hf?u#N^9p?IFB>oAJGSmXs-# z_2Fi?=?f(HCFz zUu;}Q6~=#O=I*Z7b{f}>LrbYBX#jO2l4jRVN{M6&MWRSW6k(7cU{TwfI8vmF3V{Tw zYlVl3K7d+iR41uun+L@9kq0QECvvMRLkaETC&1nVpntF&9?Z#}1B+|_+uGZR7Wp%Q<;b!aUWa~P=v1nLNl0lfjSvxG8- zgk2yJp}ABWCrx(pkG#xxYH1sPuK_&bqj!YCN5Nf3d1eFMiG_Hm68sq>Pm(gvGZ!8} z`8RFhSZ$0?gFaRB5wmd3FpZ{$AhVoWH^oa&Uy6Uq0%3TXzwDht^=(w=7RTTsBJ+(t z#+rQAF)(0TrQ9@FF18Kpk0$Dq{jY-{`2(^ek75(|VZQ`A!?l4w2C5xkp2JiRUZx8~m-rO=2UC=jze0jf#bhD@s*16K>OV&i0y4ZFLR=h-M(^#o~~}qs-f1!1!RC zjv6C01<(S1^4ZLl+#RBcV$VVY&QY9rfxh8SAnC6WRsuBeOr0Z04YPS@4}}A-)i>dq zQegbVMu+uCmow0?`zugV@pv@(2-fuie**15rHtxfjC~BapMjF`ye)Cp?*;)0O~v0b?ELE55? zHRrkf-Ppt?q6KfyqFRYRuqs62d)@Nx=AFiYNGD2L91y`8aNnXjo8iPkzk}A;G}whr z7P0eN0y4Wgq55l_I~DhKCE?|aFo#M7qv^P`#J9+$4AhBHTupHPi4Vrm-s9qwW=a92 zLhVrVqW)LLvY{05M&kN-V>YP)R(;}9RzR^xx zw1?uvJAZ?^jf8~s?)3MGZ*uJB6EK-T zYH1A!Ql7pvTAk+5GxKa7x(|XMBGEREO&q5$|9OxX$PWLN;)E|gcw@!fz6q&nd{k#g zo(5UN?77?GH1v+{!O3r7{3BGizeUjA7H2ZfRd(|Cn4k*{Pht~aAgug^>GXb9&+n(W z@7ru1`6)r_eq6=V7@*Ci8JDGhw;E&a#YN8}@?~83F$iwQ&`)vVVRHGCh{;HdcItBCiNi^$&=20rz5p zbgVDsLVbcosb|TICFyC=6PBVpDa=g? zJ?(~adLM94%$S-pL~c9(xbalIJpJWES@Ed7b0E#O2iK7qNM7}>_rI`d$IaZiYkiAN zUj+m41#)Hk-9Z>@4*J?QA@vXb&woq4Lf#{Ld=T(oR_0IHaz`H-00000NkvXXu0mjf Dn->J0 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-14/navy_48.png b/assets/icons/guardia/icon-14/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..63ee4806d71f9388af93ee5e738bda7fc9a77b15 GIT binary patch literal 2426 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 Hu0mjfL$-|e literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-14/white_16.png b/assets/icons/guardia/icon-14/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..96754a1e60c1b4a7e216ebe0c4c5d88e87355bbf GIT binary patch literal 473 zcmV;~0Ve*5P)hNI6g$OEA{!-38%t4^vz}&cp_G-`NR6_yVRo}pIo4a0O+KNyGqVdx4?q{N6GQ`% zJP(wCSK!FZ&LrhB0!J=H;&))x%>DswLDLSDLU0gRlT=Jgkne0}isedvy(FEv20DR# z;1@9KrQ{tWP>YhjChc^ST%{1`Ex>=^4{!+ll+>4YVI}G#e)iP_YyQm zBuxTCZelV#u9k~UJk|r;nAwlaaaRXs^6~R}pw0nTZjyVEBzv2`Npb_HfCJ#fMNHCS z)ZH7c8wvH(h?fI*7`O#~17m;>)~zRQ02e@GQ1}OT-|Kt?p5yygc;eK}z&Ws4ogzuy zl9nV*e>C@!N|Kf(jnn8)rH1I;^yQT2Dyb P00000NkvXXu0mjfe_7TZ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-14/white_24.png b/assets/icons/guardia/icon-14/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..6014554263a7bb5f7839906c928dbd93ef99cc02 GIT binary patch literal 788 zcmV+v1MB>WP)=i|K0{l59;!;RpDm-jvQo_p?jp7Y%E!V?}U z4clFhv1eYAd0K`_!}bo~#rOpN16Bgl>9-7+1HP4X&$b>1iEP&-&D-7xT*#*e^aF#y zHsB%f9k2nIlC;luJ?L5#P->ow1Mo_{6%RMJ--5Du~OC>((IftRxezvlc5P-Py0F9JUU ze*?3?OSZ2`Iu!^d&DC2GE>NinU}A}N63s11{kC@ndf+Z_%y!iAe$Z9&)uf16ES|15 zstf-~+kL>1R9_@~9ypv7)k*|0G2c!NUMO6XPudaVilpO(|5yk@(l3>QBC}_J<*mWn z*xl)0p;6wKi1TdDeGYsa9}NTn$M$c)bGFZAW+fd;m95T;7XH(j)IDH}?Mr#DDyl>F zuQh_$?#UuOAMz}M&lQJM_WexYbzrZgUAET&D~iNIQJ(?d)NOACP6M~oAtX1MbggRP zTsdE%nM%$7(UM3c{ZB>FE5N9v1G(@j@D6Z8(pc-pBETEKiKJ@{um|`P2#ULszJ@v) z7c4iu4GibvfbD}z9gxlNFWW)w*NJR9FeE7`iW)78#D)4UZnJMl?e19tG zdUXdXUi)m1+dgD_)b{=k6jggx*#6%3QQL#I&lGE_WE!xeIn8E=+!;+w(vR6i+s4kG z6-_WC`d-vT(n!@>qSz zONf?L7{`C-n;FMZ!_nz31zk)uDxosSAnXPPMncdcl7d>aiKs=pFl-S86+yI#NNmv} zY87-LH*ONTEP{%p3)zjd)U46enO{8P^XlQ9cfN)xXyF5g_dCyd-sk+!|GAv^gHv5f zTcMUNeIK!u;(vn1rUW*(P^i6pu2Fwh$AXC*pQ!h%OVl^iXR5VZ)NkgrY0W?- z$MUrMg4R%|N0R1!>YiYtlyWfF4giPShiTqz=_72D?J)IPcD)=!5ta2@rb!ytK-v_yY28~&c~`vz zxT9iWFL0l_1^BATm0pK4J7RaN8a03}hK7@&&A>gtGGIlPZv0 z<}a2~o;|UsOMxHMtAP)L-8KV_lYyju>e(LEdan=Y&@WYkk%cj$yaN>QLX(7pt(T@+ zY$+wWUO$=06YbA;x+K8;UP}23h|$Qy>TdOhQp)xQK-6|G5uU4lkWFc(6P5&VI`Es? z_^H7}vwB3mwYoc+yJc~#0o%JSql+?W>dm@jGRKZm%6JvykARiHS-`bGlyq~&H^Adg zc?h_C%DK7@xFQY4ld|T8K;G5e8eofn`Dqi3+y$&Er9{K&6m>L#t{GIr!E3-5z=3S9 zLD``MGLju`q7M@d$VC~psDgM7mQs#X{bV5hEICo~9>3+HF^qK}T|Uz(W;of>^tGtc zU8-KwvOB-ovsWeA+3Ng2u5MO;1)`(vQ6J0~7o<&lOzDAh@{}b@?=9f%U|9W3U7gGf zod~PCSp88wFXtQ7!_mugexo`O_rxq17*%)W@0Zn`)xEMs{XTy$%u*aHiRhio%+Gm66i^g^8QT3*r-<}~@ z{ZAoi`FTF$en!rp3)*KgF44`Zcs&sD%5Q`3)J>_Mmv;TeP})UuZc~3!;{y6vU6n~5 z>)j2`lOG!+>V*}ku8V6nOe|9`t`9q#mj?RHXSs2c;I(erAxb|7O?LmAzg~@>nLbuI a<>hbgp$?9C?O~7r0000w literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-14/white_48.png b/assets/icons/guardia/icon-14/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc3760de94c5dc2a06cd8ed0b81ab0292bd9477 GIT binary patch literal 1572 zcmV+<2HW|GP)8P zi*~V#K2(+jffeRMNIh7JnT?rAj&nU<{CmDNvu2;$J~L;C+a!O{byE6hmpZU8q4Cl{d%0w@4ziN5bwJ0IaWj>A`G z_C}yPsREG9nOTA4B>?tn_(Tft482cAV^d0uIkTrr`1xk`L!e(z0dlE+V05M!xDUYD z0A>J~4qz&Pw*VZ`_*6an0Bloxx}IqOmWs{=Df)GTe3|h9E#`I~Bw0|~UCV`Tb{Fxv zIN*hw1gvleMJK_V49J%m51Mi=yzLB9%#8>Z;U`Q-xZWO$=$DK&6nj7sS~Zs|C%}jx z(j?OsAbEo{n^RomBHUns(p-%O^iY-c6YEw=!_@>BBaGh10JH-5GBw|w;oCUNd7R8w zj1=*$Z}yqlua$zo76F15o&oT7v`AQRx7vlsHPWt=^htWK?*wo~wM9ujX=dxn36WWV zki*UFFo5lq@XEPP-bi!u1 z+sr;Ix0Wl4uz zRnyo6nT%tkG=e3}c*(L1z$^)IuG$>{4gu%^@FK~?)#L@^bD>Fs0crk5Gdobk4EYd% zjR2OL*(M1xSjhtQ5}+13OcHK?%4jbuf0Db}R5=k#23&9Gx@tS_Jz=mTi*)-L5 zpLYvA3t$d_l}e{gSz@3`=F0m!>l5(9A~h%?pI%SpjB9-}fS&+7Px4H6Ik!SN0esx0 zJmxiznf2Xi_yNiK;5$_fF0 zw%Sgw5;RN5^(2q09j_M@;DPS$w1(uX0R9=}d^lio3ZN+@-zC}OC9zkQsi%;7(&OG9 zAlXOqW0I|+o7Wn1ld6wgt+f}EJV^4S)+_Z4>3vk+E*nXsQFX}ZWObJ+&$M;2KvHt6 zbSSc%3l?bq3%yHRow=4@Y68aL4#$B?wHA>=2EIqq!#{+TW4aPh1?kcl9ziQ%;o)g+hJ7keA zk_Sl6(089}XZ(%iVUoXRcmiJ7P5b1U4qHTbj@Exc>s}{~|E+Ov_maHSc@Ggp~nh*RQ=%)-Naey7Ot*;S|TCBwPGmzO5ON1paBgyRp4I$ W=EqAEBTDK30000(J=d~589ip^oK?(*%EkzL1*zm&vBU1=OG(;PLB9I_5hzWwBLQEWL_(NhM zQDcxPfixja3V{SDaUzu={wbwsrOX8iDU_k@yPsK?Z&ppF^_rCYg`z0smzCEqA z*Is+Awb$7X7-EPah8SXq|65p{MkHGUaK)@>8PMnid*Ba>UHWNG=EPX8^ka zJeR6-{pJFg17HV$*Mc_80I(3inEECyh<#@PH~_#O&FpNFnVIduRDeB>T1>RsJOujRg_OQR(xv^9Kv^`SawBiHzG~Li@ z;;Z9R;J-Vo>h?nKcjDx7ebRf%CSF$q63Q4&D!f0*54!P_`p;K+kqd0%j$467U4f;= z=-U=3!~SY_7JzT$ynz3n-9XdEL9u~Pq}@Z`RvjT^y)c$&=>1m!D>RmCK!Ur!R{`7w z;O)8$?Hye0NgfU0VhOZtQ4&9!0sPL)w$`DURq@e{sK*I<-%j#AG1$&Ufn#R2O%t*P zaY#ptNPZZ=-2gsI_XsjWslmtVP?11;fLfM03HIc6u<>$_A3Qg z9gWSSRWV+zJuBDP&bi9Y-*x(z4XtM+M3J4C!nX&>xg_V1{E(jcn$s`D`z0jj`R{J0 z+6+^Rx^9iKCq5BBd#uq4dnB1(D29dgEp(}wUG2h?M)hO_2aRrY@>|MrIDjvO`V=4J zg}Fz9xQOI$0K8aa5Hr00;1g@h-F;nq+b5p_ru2K%PniIY1@I#?`(e>>JF6fzeG(Mo z;S+h&%>Gl>h~z2&>j0cb@_GPI<+Y$yQvib!#6-p&kwNVCcy7Uiu=R>Ye^PY*XiWm6 z12dNLG=)##d6j;DhvaAF5n6QxV11oNf5$KFtBjUsw$^JK%yePowIHiYOm3uKaDN^b zpcf6R!&7IQ0JsLgNdQhGd90ajNNK;Uiinuo-RE3gXDpI_SnB-jVT?LFrFx(6bpS4N zTL9qHL^G=xAf>eykUX!Cw!l}#_vul=jg^79zTRhk0Z&EzrCh>J1x_bNEy%hMOm1S6 zIxYtATMQ1qN9*EkrP4k=0iIU6RsgW9?0{ot&yoBpfU`r8(J!Qsb)!#2^a>9wqMPD* zZ-12{!jx34Lg#1>;9~$z0Pw|q4oEEarIV7TF7n}ee9?mEX^b4>WdK5UEc0s0KYGrQAnGou^S~~ zvhcgDy>+jd{TtH&Bo8X7>rA>RZJxGu69F(tf1a#=G8_plefx85Ia1G?03I{5O(N`> z;aY?%kZAi?=Y0^5v?M(q@Z{%QY3?ItwljH+TH3&Ozt%o07xB47Bofs7nG7ZH6-83@$)Z|KTsQs_YPcGc{f-ofI#qPfyj1}camI3 z(rD3QI$kc!p_TwXAA*q?B7C~)++D6F zxgZx@I5BE9mWt?TMZ%&qnUM>GHiyZ~)13pydXk?Gy!iLY^GWVd{go=8sqq%8d|O@s zGf6(J%B2M>@=w*RE?Kp^)aK@itbT6HLp0{5PHD6N}Ih7xvzOT5j z5CS1zxyKbNU#g>{tDy%Dp9J8Ul1rh@zvibc0B;q1ENN;457T?5 z7RC+inHuvtGxL>pL%u+KKIomz>`x@W58w*`&L!!e*BobPychlRJ$*}s{o#z4;ejB@ zuc*xT|3YmO|3L9PClAY$fg|~_$}SRrUVeSaC9QMRZo~tjF`dNjA$bY_x1ftcuHE;_ zLCIyx5be+kKcBk@k&NFKu_ zlO^A^veEx1Kl&F9c2h||x5$ng^91`OfHbjhi_QxL7dTT}w`0_zEzHejq!*&ch5d9Z z$s;9of0mK-?c?wW?C?QcdJOyBSNtK-dz|Enx|-*_e3ax*{q|YT4fdYU<$EfAPA=-& zs)s?^#}D%EZ{X!Hk{biW+ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-15/navy_16.png b/assets/icons/guardia/icon-15/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9bfce00eab665781c6f3bb4619d752e53d74cc56 GIT binary patch literal 656 zcmV;B0&o3^P)~eN47}BRbcQ##KaxyMV5=Gk^N%Pje8buq_FvgXr9Fze zIn))%rk{aIsk?CadX%8B38&47TaV!f4aY~xbcG!3X~EhSR19M3aA7rKlHi_`P2VXo zQ2e=*M!N8e6O5;aS1FWCT_ViINv66H>R6b+g=n$Npf%NvjqbtE$FVws zGv^Q+K=28uKuv(qj_M9XAD~h|^(-Q}GK1Z-kD1)sif{o_wGUT_A#MyOUr|>Y!=Um3 z)g!1hg8T%X#JZ6`r(BY=?dnEEPT}X@F@FF3n#Z5$?LYP zomlx#u>Mder1D2YikNOJf>Bvgq2`YeY)!X&?|Ghh-(5GSvk?*Wg~NN^_kEso&htIr z=L`QaWXx~btQ$A8y*==MfZQ-QmaMNNTv?83HAn%K0#2(j=>sN!L|8aa_q5L;uj6en zLPcZFC(mMk6Zo~L%*DtewiT6mz&pT0z+A+=N&UHHLwSu6n2e0kwBO9NFo`hm0o}Vc z1KWU4=-%}*aE!~DjdZoXirHs~-jPIibd*4BWMGgRUN^eAC@X-kNv2A`@i>c~&!Aez zM6ISVcZI&+sxT=fi#0qm6}_#BP;jIoLEJey^M72Ud}M=*aWy7bb2UOA3sy~r(pj8) z5^+<&z0K?k=V{*&SlD6&*H3-(3{(z4;XAzjiK=47=`3j3M9#geuf%6QhHwy(vpC&xO#pEPM#Gw^ zsBM9g!%B)-CHOv^n}vphkh`D8>+j19k6_L)E>Sc16qahj>`O$>ATpmts~@F(_o0Zz zP18}W0^5i44&wq+>PO?nZ5h}bkT*JVI=qR*l{ziot6`cZ4DO-3?Y-oGL(_hO+X@_Z z1osNqTVN{@|174$@wOk(a0=1q=xRGKq>Q|BS8uG6_$>pZ%CZD;5#nnTy6;1YFiO;Sga^&5JuaAFpWXKf^?w{bITF=8lQfRF!(D*3Xy>LJFyU7 zaID$9G5@6+Dhl@!N)Gi?a3MZrj3Ob?_Yk}jMEfa)i}>`zSZNkryVtXL?R1L4!vJWi zL`tgBuqPthE3~6TSGJ?6T2w9}I)HL%NG+}wm(WqBC&Zs)N@8keVbYl#vNM00>ruC+ zno8A(_PTPSRbp4y(Y^N+_01D-{)NPgX8*qFmd?4b=@CR$B=-}mMk*dd3&-hd{fM-$ zgp!U(Ph5s#7#y+>{Q`4W!P1<%{pc-hJ2T|FA*a@)J)USS#p6wUGs$%c= z$q5&>ypESS;A_#sVN{Ml=*PKLxXgS?gC~)gDlsHhkHl5o12P%YiMa3tK^m|LpW+7( z;W9nwK*eagZfITt(NeUyl%j2*0toJ1oZn9=oW#ZLWlE{sqUz&rEkf9clLLfsjL6R< zuo)la@R_g1F1@~a8xqY-yh_6fx_9Nrj2nr+d#F*HoFm^WP!`1XNK{xB!2|2&k-q#R9q$heQ$IFF{G2#&T$DR{to*-Ex-oG) gBn$t;oPUYG059gc*!4uO;{X5v07*qoM6N<$g0a&XegFUf literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-15/navy_32.png b/assets/icons/guardia/icon-15/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b054d5655bda0b487356611337dafd293c6c5de3 GIT binary patch literal 1629 zcmV-j2BP_iP)SWSxWvQcL{}5`ei_`@GNloaYR@f=fbWd!Moag#Sm#7WXv1%9VCw!{iwogrp;(Z9M`L(exD4 z_LC_c@W$uQGCm${nE#&

FBnNnsDdmYbb$t_%pq8epTf5P2y!#E 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 T5!Ww=00000NkvXXu0mjf-sFHX literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-15/white_16.png b/assets/icons/guardia/icon-15/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..41ab22b7032970db9a5799a72c0ce20df913c297 GIT binary patch literal 482 zcmV<80UiE{P)9=?-O`Ybd%giGU@e6igZA9E}QGIXq zd5eY3zKTPcxpJ797urQVxPh0L%FHTe)n;jnu<~Aw#}RQSGb{ab1z#a`93O54EPHO# zb$=V{8*AI~71P+=(Rcv+@v7xoXbXA`Rgvt$`G}b6DxR4aI~KO#GFIROCL`iXpPtM- zQ}>y9vK8}E)g#(v9d2$PT*EQ^#0$)B`-)&4t{06sicj4KRpp&Hg{O_CCwSe`sIxBoQvd(}07*qoM6N<$f*Eq?jQ{`u literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-15/white_24.png b/assets/icons/guardia/icon-15/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..c12e21cc9b898568e0fa5708f890b5e41583a4ce GIT binary patch literal 811 zcmV+`1JwM9P)Fd`DeFhCP`WKx4-}Uzi+MezUy6U!#_4F-jL*bnLaO?{p5cz zOJ{Col2i^X11f-yczpc{7zpHmH^5ah%l8$)4=0udI)P2VD&Q_K6_^E_2i5}@fe*lT zpdDzDOQIaP!JWzX5-Aqy@L02k(Q!*sh zKY`_v1_0BXDoI~~L5?;k9To4Hp!{_tQJ_2>AQK8I@GWU1@Cv90DuE-;y{pH)0$(JJ z11$9#|XVxC6WdW=g6vv!jEOsi*Y)4S-$+>lg8c#Yj*K6LD0St|zeUD#@y?#YO5_x-_?nh&_6*1uf z^10MSSI#ywdnUMgv?uk&62j7nNv8(YmklZ+z-?QCC$LK;Ch4W8hDzb$^$y8iGX+fU|2e<+> z0S|$)TnhdkU>-0(p0lw(1Go?Yyol)$oevQ-0E>WI!0c$!(>{?)LihFu#z!$*&1_!} z6eZ_JN27WdPXKnBnHRsif9F4H;Om+g(aC-``CjxS()4rFC6&cG+gnDzi?7}ecAY66 pn0@}I7cTXpo*onX(>s4{zW~OWn(Y-Mim(6x002ovPDHLkV1ks8X{7)F literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-15/white_32.png b/assets/icons/guardia/icon-15/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff59df3ff71ec8cb60189365b53d726e5d44ece GIT binary patch literal 1123 zcmV-p1f2VcP)*B=;t1iv!UG2hO>B@3sH+|7)$i zFZ|anW*U?fN8v{iA^vR^?V_$Dk+is&Gv@a$pq0Zwvsk((B3kA8xma@s>fZsb1&#m> z;1q8<1e^qP1HS>|Ko77}(sBbmHj_1%)ReSW(o#ta{k$h>y`e0`~xC1KWWOMY7fr)e^1-Zn2MM;qOaeO`XKK zegc4`oY1hZj5uvX(rG|{L_7*?o`iCG#wXBZ>T%#DU>A_m;beWrzE(@Bs;M!-cf@#7 z=O;7&@`%_O5t-?WC4D661W7%)i2-+#?pI(Pu+h?;3@ijb2l^zPk$}=iYTRRV4+D3* zjMDkx+|Xkg#ht*L5z(9I6Yvb#-tFf(;67lh^W+cUTj1GQ26}--E~Cuw%!?l);X32W$f-006xavBM5Vr-d&4J_SS+ zz7Ct^ifP+Jz@VfhO=tIXKBdfuJ}*3y9j~Cd)PCHpIV{&azbBxBz$22bcTUtnj+phn zq_8fzjILDxI1yOp4ZFO!lkWL^m0hxs>^9f?GH)IQu=I67Hnu41S<(vNYC9ZpQg-<} z7fot7Q{ERi`W|QgRS}UbyRAt|U~e^x&F2H_flq;7jJl?A)U}+OOt933jg~=FjMdGp zY|Sq14DQtYEL(9d%BHi*&8J>)32+XusV>>sOwu4QzwQ;1?lSm|5pmFS#-;+OZIPry zj^qRPfW6s-Bs~SZ=CM{ADddgP@35pywCpbpm-&FCm9DVrWTdzQERgiGqznDMR?^pX z%awFvo`jOlnkD)?Prj2hPtyC6-Yv$SkhI6|%O&lvH*c7(%z<0;dgWxi&PWF$A}=Q& z0~Y~56{lRuz_@egGPm6GeUrK$xFRAR%!>}N&t>@bq$=?HQZITQ_z+kNTp1Btjs6wj zo1&cB*|4Q}-J5R#&IGbyeect9Fe1K~iOOpv<#D`5(#?`KODenLtS0FJNkfuWNxEIq zE=g|`MCvX4& literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-15/white_48.png b/assets/icons/guardia/icon-15/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c70ca0f5ead8ba0943485de04a1bf11a51e89a80 GIT binary patch literal 1718 zcmV;n21)seP)CbI!hNuf68A_P)RX48Q>V zry;5!krdvbwrm)&uN`#$9~K}P5kZni0k{#sSODE#7k<|moY9hod$Kutz6RhE0MBSn zbaAkOWX;caB?ZatBzKYA?Pr1>f9G=vM`NeI1y`76TU@eWuo*;zG$}X&C0NZV?QN|q&;6z*N%ttvoyVa-H$IgXZ&`iVKBqst8jT2h!P4We&@onW4TvdQBXB6|z z^8g$c5ibK+*=&(D9L+Ku$@9(pV*s|4;-qG!9Sz`m#a2XIXUj`jy+NCi?8ru^pG!#I zMRKsempZ4<@w%ZRoQ+z8T5_b<+@Ae*gEAS(q?~4a-S4%N%ww&g1#Fr|y~@1O_q8O4 z19)CSMZ|L=n$?Yld}P|q=W41MDs})a0dThGYQ`1KLyUhvhyfHIot=apJYRUltU@(}>*(q3|hfTl#`x=ll*-MP&4!S&|IgRM8&{Vl4mP!MfeE-pO$hf?G9SJ z#@R(#B7wAkCcRKYASng)lmv*f_ESJN$cE|rA(G09ivXO}5fRG)Ebn9UF#zrYFr>sl z6~9kR4mbYp76K5!X(Xl8)Mu3sMcr;;rjfir=1nOwhg#{>)#Yk9vdP9R<2{L8+D-_nPrvjCY57CDYK&R;%8`GfK=H?P6x1}UDqfTU{}6Z*8G**?=+Xb zi#53g(t?TpQSIw5_Rpl*L4M!k@6N1Wsq@f;(cChFoK>BtIZ|xoc6mlkI6FKrbnE0#ok};58pW zo^0UQV5C6af#V-{|2zO4~GZ}A~xO!nIZ zUtXk0+(`0gA2pF#R_%=7)NFn|$&Wi4X#PiQQiqmR z4%mfGqYKp`svA^a5)tcs!g@nN?=x~LQmvq7y2lz;}IeWu**^yK5t?|eE%CQ~LO>&B3NvAKlyVl* znLxeDEOmRChUNk|R~m8Gs%C1FeNq>{a;qf(-pf*CZq+iRVkYQtJWO$uctk{ePVzng z$LJ={No1TgzSy^W??i+Gy>B3Sx}|=yG#`!&!QqvNHQ!?h$=^w?b+45FcDMJKQJQaj zw`;~yN=zwqv5BnqZNkkY6$64hjFWCL`a6bry{=6J-zc_7F38;Z)hw;2qi`k76xSGD zbg#9P`{BHn+NcQp^ZI4B1xTR%7TH4Sv{r|HUvZOEOMR66cD+k{Uso!Xg$UCjdA#G} z`>G9IU&ITyYB1l{rjJebXnMnU02|~Paj#J^#W0T_S*z`q0j06N#iasbRZ!vFvP M07*qoM6N<$f)_wMivR!s literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-15/white_64.png b/assets/icons/guardia/icon-15/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2aa95b0fde71949abf8965dad6ed5b5d5e15d6 GIT binary patch literal 2358 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 bt`Ph`QNci-)!n0B00000NkvXXu0mjf(VcqW literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-16/white_16.png b/assets/icons/guardia/icon-16/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..eae1b382a73277aef4b9567924e886e27865e1c2 GIT binary patch literal 425 zcmV;a0apHrP)LnH? znfJN8GynO|<>5ai_WF^T$1vZ=^@#ZVPk_uEMZ`2SS8xZb4RR9qFo}p9`iut71(un) zgqwJPH+X@!xK;LTKO-=A($%sP--6MpJ%* zwTLLE9g>+9z23-WT*UnXSd54&+|aOUv;CoE4cj)mV*dLuH=Oakq=&A$v?V_Q(l(f# Tq$;6x00000NkvXXu0mjf%ty&N literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-16/white_24.png b/assets/icons/guardia/icon-16/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d2520b66038f75742d08afc17a79cc44a5b6ed GIT binary patch literal 748 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 N002ovPDHLkV1k#g`)>dM literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-16/white_64.png b/assets/icons/guardia/icon-16/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e03f9fb22384adbffb26bd36aa05ee7919158d09 GIT binary patch literal 2204 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-17/navy_24.png b/assets/icons/guardia/icon-17/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb20a9decf1073f09395ca538b1ed9d38a699b0 GIT binary patch literal 980 zcmV;_11tQAP)X7aT1e%^b_6jyHkQjc(Rq{@C?@BN$+^ zeUvN@RQ+o>1xkraA0gsiAQT{qvjpOZ_mQv}uXYiugM9nJRdC5}s(flH(A~KS9i5=; zJqUmAXQ*&azu#f^zOCfV`-!#%uPzM|KpnSDLL=_t+`C`XI`B3j9|P+1HG(9|++0Pg z{S0o?xb>hpMo;FLoOuV~Av{i?@&#nmOtcqpxrq9UWN{p!N2`4ir;k>vL)KN9e%aYz z^1vZ9+fUg)j_5p5he3V?eHEmM)5Dkt`3&VK!9GR!5#tk_h=h@WgxRX}3bTVB-Oj^^ zJc7m3Wby#+4U7V}Q((t%?ICg%^%lYY0zU=v5pV&qlz1E|GaOq#$~B491I7Zv6);6K zP~5o8A`4U_LY`;j{n0wfnUg=U=jFq6ii}1yH2)3!E6$$yf!540x<;~&AUNhtM4J#6 z!Ar{FadJCM9{<2A$ECt`2d(yNEZK7uvZJmzRz{vXyAOVd*b*M(RsxHH1g9pi&nw)w z;auUH<8ScT-Ujn?eI{p)qBaKd9U3lSrJ*V~fuhkN_5#x1K%$Kx=9pfqpHuRInLCI& z&UT`0$2BIugDbIjuI^~v?YcdICj(d)VGmEd@;Y8A5+de%Fy5;>)zqaKv1Sf~0uou{ zKL}FgNP$+DDTm%9*fu;R7e)MY&Y!r7U z(|n}2VW#sgPY`%3=n8m7jUmOmMFPs<^FkUQw7T_vfh`tY{J}d9lR>^Ya8PM zS5JPxVxZh|jl7f9GrEPKvOox_H%HVkiR8V4sLz6of~Dcfa>ZS+oFG{W*B?6#0lEG& zaD&RjI)Wnuwnq6oQ6HzFhv@qdV$+;CnO=B{JH^z#Av(pQxc#|2%oVj}6^-jn82A|Y$DBVgw~}-HK1k2blP`_nTXRH9VsCT3 zRPF?6>8vfAL9Sacn^^A_vp40~cxB!l?%l#qZ2thSewo1yFd+H>00008r$c5npXS3aN8ij-U$dCY_wS>~`ipz64{YpzcHV zP2GhQ57774rFeBqXby>Qq+kaSvp=2lpCsDH^wYbr$pK7mQo8n=&Tf#ySX0F* zH6q`O3HO6r2=);~CZNG~#7xH(JHYHf-AcrKfXa8^o+1ezW_+PUK6(++6QBzS;)B@a zC^JsI&f%ud2;6e^b{)BN24*dt$lTR4((k<;ZK(Ymr{hr_LISX*7eG#eO)x>?^G*Lo zpN(V0_Du@mJBVvSv>W9VswYX@Cv4qnQG7|NV9F2g4KQ!*4TSM-kS>I2+_J6?Xh2L6 z%T#QB3*s7q#W+(ybr5y?pxwX!6R-qmL1hN#qwg`i3xq`Gr7YjUB^=1$l1X6B(A#kj z$`N84rCwVNkl-95Ckfrts2c#zfKDN(Z)48!7KB|W?;&gezF? z^V_CD{aS23+iIeymWbj!vsP`UZrva*c^;=BqFxWYE?C0I;fe$FZrWVYjoJ>3g8Kce zLpXCUQkoB@3y9LVgc9l=CA23Pq?0CgB3_LAWC@JXRESiLmu=}~N>CF%;^J=l-riC* zJiF~?M3kHMTQ1z@MaNwN9dWZI)=eF>2UkU>t&%rVX_ z1!poMNtIAF!ss4g0Pzw%RtGBZSro-djOcip*ECWXiqom)HAS$EpyL?mI0r1H7Ot!W znjI*foE$0#38E*dFMdptglQo4euqSpNs?!1SvQF=*#<5s7a`@cgmFlzxRd@(&s|{? z%CNT&-v45Gg=ukBVOw;o&cb@g=~r7Kd(j^rR~AVIL0 zD8wdT)8F~pm2bnaUSUWvL5$-Vp?#&y>dWKFqm0{To_Jz6qS1_hS5SAVl7al#91wKa ziU>{}kh2AD(<1d3=REw*NdnaU031neL=qM~jy@XU zYvl_s<2c0L+Rr&1s8pW;zK$t04dho5z-vd8#n+xssjz~y5nR?7s};DD^Fm zP^oqkl{#^a2YCFhJ%Ppn<^#Dkr()U{!A@Npq9BBEHJsZ7ay`fgfkudj0QW;w@1w6b z#pz-Uo9SEOK);XGFM(c(u##fbPGs(*oGznYOW1w;aM+`|1=TK=R6mW0@5LpZNbxb2 zRIdm$)JUr=+DZTo1iS@A-ijUFME$M{aCRf;g0SKrL?{Poo4+(@uNeOu7zi$hq~O+2 zuPvuu`#6tn{U^>ngK!a*YnRixb|aN)0g-bt<~JDq9M10I@y)A9lTQ-qK&D35vIaDB zp)AU~u4!Yiql2Vj!9|Gi!g_6Z*U1hocPL7c(W8Gt*+`Pyf|v$fJuyf6hY|BrmVI#m zm)t|Wb_>FzIK2#E8FAZZNr(TAm|@gCjgwo6<6p3J{Q*?(;PK55WZbB0RmLV;APet{ zSI^@}X&2J?7qLA^+_nf|a7sn2pJNg2z>eMl>>w_C>*SiFi0TheS&K`zWqajUn8Hfn zQtZe+;?lQ)-NB{O=qZjKx)8&cF>))F>es?KR$9jCBmsId?GLvtz?jA0ZbZ!G*pcV3 z>hpdxgU!WAJHqv-E1~js`Zie5c0>o!(HDqKM;7$@2*#8_4}$v!rTGhio#B{*{Uvi2 z+({$(E6yE3>6on7nOGo0G~`gL7}*)JgVg~bp15-Cd*JBee4gMg|I@V3l4{`hJwvk@~rp!v^n8 zzPv96pUrv<_1;H-3%U3!^LX?&ZvhEQd=R&Yf!1}v2ar!?omF3Do3GioeKdTIrPZ;| zJ{*uX6`J1s`*u72EQe=4(4IhWS`lVgiKifQ%1U((%H4>0KR7|vfOySi45_an#)b6R zW>@p*Jx8dly`8AIk~B$>K>s-9_#~&6LYpBS-AaAS_i#~!Sb2>F$j?iqgQEEi&ecHn zhZH-eInTU=Zs$FiXdT1$2H*&4cA@$|R29klpb4QUz6ct`J(d5=-EB4k==2g#-0d4P zJ51y@vS+LBS*GFx*Pc)6uBNS+xzpY)_cI$9EG=qTa{(k$^tj-k(7+ylc&xZ2!s$Y~ zdJa&2DPnj*w()KF4%RW$e|E6UsLOh%O7$be#q&rbsKTv3ev<* zbfIIZG$kq)u%q9lUi)U~g^a$|E~MFs^)3IQbNv;FzB?%SSXvC@Wo9|?jJxM~rR}BA zr4ICOMR^$Y^RAe2>lzJ~v_4=p!pffPv3I@M3NQs@3^jSamp{zx4DekN@NoV&GZ=NW zXsBl>z%()72NGD1$k{kj)R_s9r9p6?g}f^zp~^~VkKdQ z*-}nlgp$7|DdQ5~v^8TYB`Ov8Z{t?rW>T`5Vj46Tz)DuWObfw%h+yIYqK)%*V853QFm;;Uk`M9+O3&C5pBww@gI9< fa0X|<8x#KrR{VgB6bx1s00000NkvXXu0mjffqyGA literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-17/navy_64.png b/assets/icons/guardia/icon-17/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..27141f11d8048367f601112f3fb9d576dfc06624 GIT binary patch literal 3071 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-17/white_24.png b/assets/icons/guardia/icon-17/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..95bffe70e0788c2d19bdb63bf7f62f9883b6ad68 GIT binary patch literal 688 zcmV;h0#E&kP)HD?7{@M}Jqo-6`hZWsSzx_MbNxP$A-o5?1@1U> z{r+u*zF8%0FR%}I3=Afr<9yfgAF|sA(<`s%-Iu_Ad(m{FTcZw9#y{QuSgB~jYvHr0 zs%AvIlXR&9{0uyah&Ph@YLc2j4nxlGwt4_apfBE^19nL|2OQ6DgXNT@8&=hl5Y>{c zD=@*frAHBQQPSFon6Z2_`7csU1}_Sn^6#=CTDBbcQwLf8sSXU1>pMM5QZua2SIR;A z$O}J#5lI*PKfy+T>y?)Uu(4e6b|R1!Gyz<8sOC-bAR;Ct4LDb-2&UUw%ZeVzQaxmS zm%fv=bHd>D*@h)M*NLD`aA{z3z$3ShlFS@425hu>FlkJ6s)JJI3sqA)X8qR$nVU7$ z{o=uU;Kvdrl~y5XP}0qet)wAIqpN*zB(0NlOVaj&UBI)^El4^E9Cm@F)}PtZI*c`G z2}Rh$ymLDu#tLTZ@FH78R%5?GXWifb_W6tQ*c7bgTwEftZbmysrzf-P@n0YOB>WA) W!V_cw^|qq`0000#_Nn^lwz#`NA6tLGDyea83 zU<2?G@E5RI(u+U_*(h)xcnmlxX$9~uFx<2^)WX0#Ny`l8Rp1L?uIWzM2K;QlPMGEd za~Ajj_z)NY4geRdyFVgQZ?YADOoycTz!6{vutd_G_HUl>K43R62Y3Pa6Bq}+wg1lm z>wrgqJizzBPP6=m?PW^$NT<cQePfI!q%rxp;c-g0U57?D@K*mI}bP+fV+z)&O zEO(G@G|*29!TkVqO=~Ub(~*eS2ORR)vu+PaN<$Nl=+7H#*EFJiiVHf;ftI+){uN0} zfY+*2lfh-mjY&#(Y^`cV*kD)EiHI0$i@8nIVlVJ;pA$aOXTCcf07Vk@Z?5N~1~la)W+N&FN(`ip;}P-BjijL}|7Wd# zs|v8DUXgmP=;oa;I0L$NHWKZUK;t{2=MaL9$>dsm#(TY1sX) zHyQEu+U9~B`=ff8)WA}ARzw_?)CQjVHp~aaH-3;j;IVy@^5i!qe$ad^>7LqVCx3k6 z84+<_Qr>Ex0`E)8)Oi$G;UKJ2taee4t?IkX<+_*i#*Bz@+nSuRxZGTlUI8BW{3ZMU zMxW-z4aXv4$93O=MG7_lhP3S+|HYq?vTdRLw%k(kH_JkosH#n?-2eap07*qoM6N<$ EfG2MS>4zk!9(VN?-*=kx%sySwVy$6h4TAL>CCcUhE+% zND88aP%$l2%5H*&rba=Tl{sE>&iTih))(Jw_c^oA+$xv_o4wE8>-*OI_8l035g390 zHCTTaO6vF8cEQXvXqycuXPOH&jV)z9Yf0=^|*fnEHtxIZjIcf zI;-p=sRoP+Q{Dhf2JR05{AxH_D5MsI{hlkSUcgO|zBl4~EyFntTn#(}oD2LsV3kOE zRMNfyZ&aP$HIhz9x*&e{@|u6}UMxG#lu4mkP8yfo;G6;9}rb;5A@wXm1p7 z75z0% z()Rd0Uy}Q2P11fz-%HviX|1Fwt_exA3v~8LS}N%-Nyj9u3%q&p{l?g{)B;t7`AX7@ z@w`mZkMTTO(yk!5NYZpkzr?pal5Q{Tvs=;_p%?U#bxH}}g$ z7s>+JQd$lCTDZ~JxW?o(GFR=$>BjSfLM+Z~IV?26wlXMtt{RIPT6$m6Tb z%(Z+5L>qEnawjwMmZBY~_eX%L6OcmdlcE51WCT-Jd4ATl64m*N3Ksa>%(iA$)lj%l z5~6Nq-Yby_pezAc#_YYo0>Fd6Y@XE z1u3))#Z?uG zGjzWMD7ACBuQXvkw#a1R7bz;7u8ADfD!XM!_K9!QEQ>r-GS@J5(^F)%fT zlcR--+iRP?=(KPPi~HE*FbXS*qKN207}-ncA&F#<9}yKnR6lys3&Si+DlyEm z=tm_{k(F3v8JZfHk6u`5DVE;z#X5bXbB}wUv-i2@dT(| z3oW$JLJKYYUt!H4Lb8PJ37Q!@w+FH*Lj12=z@Y#J04V36$*4_7w3F5kqh}8QKbzSP zuB0qWNIGKnW>zLS8o(z2`k?z^Dam61{FT)pX@UlZYVfZBcn3f)SwbziHkhGJ%lS=p z+fY~1fUg5E2EZUQ`!UN3k~)lL&3QMk9(v!V&gYxibaWGtJPE+b0NQG`ONtVf6u0T; z9sMp%^e5@`5;NPPI@d;Jg)p7HKCo(ys@#>+7EMWuo{d`o zWkMtm0B|LM-XeH#%pl1&k|zMT5WqbEw#rvr3gAdHyNBda04@j6H;|VfnM3j}0CUZ3 zu?s}?W%Ye4fOTf}63GE1Zvb#SfQ0~_F|&>0)A?xb@<%a4@;RpCmZyNw^6Kv-`>Af8%0AHl)p~wKa$v;gvnn4FXrzs+lw;uDxwi|? z!7~420URVvqRR2Lsm&ykV^y{pzxYv(48T5`|31+7eX5Z3>EYAiJ(9lC_;TyoT_heHV@ZxOvsv=?%hP;ELjs^o#4Z8OM7)f%Hw7-2$>*;fM1%R~x4p-THJQ@OVrFHK;3V@GEJ`CVx^|zqt=B$*nO&@nIaxlS>)q-no8GxT; zP0s*$6~LFOUnZ+M4Z!*OofBErY$elrULW%kl~>d27t@aV&lLwG z=%j74nQhgx-Bby4)Xc(Cwi6W1{hjfB_5aN=?VGM#!TTpa1L4tfJ9+&`vSL z@IHWV0Zh*GZ3?X}pIgvqy`3kkqMXgY)=qWs_s=SslL;tRQxhvF7VJTg-GhuH{#jd2l#p6Ws!r*i*34j}{rvzw zt15504=9Jb0clVm;};XoYd`=#h>Z$>!Wlvygnr&Kvv8)+lsLfjWVEO6tM5`JtP2n~ z`Vn|e4I*mi0;pt@b-^L81yrI;Gusd@PgEsS8y3Lka1biZx|AQ6nQe$}fOwnAt&jjS z^P3|bK|6XyAYKPbn44?1MFygbjeGOG{U(T+Z4Wa1;KOtOB%cQ0H#Lsa7B&PWU2%V~ za-N{0bw5;HZDvQOBueXpJ8oKBr4yDHNwzx*CwYNxclZslZULP*`AM;3e7&X7a^3}e zK{-0#-p-YIj?_IM$5hpYc^qhGrNQ&^l6EyNtF6gWF9tBePqY0%w;}DPT#xa0zwWYz z-5+a7PL9qIYbx1L06Op-5oxzar1kC)EV-sv)H-);7~FAXt=ppruU3$7-c7 j7FuYbg%(=C?tp&)gzxRE-#_Qu00000NkvXXu0mjf>e;zc literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-18/navy_16.png b/assets/icons/guardia/icon-18/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..24ed96c24f3d640cb2dd1db28dc9bfe61b8423f4 GIT binary patch literal 570 zcmV-A0>%A_P)PD3T25wETj=O&8gqv-dra0<(w-`w-ni$JV!TuZ~&cd?ofybdbN^*QgJS zA0l`4aHAf)+#6$>LKH9 zB~XXeO%VP>?GXe^)!yaRLRY7bj{yXxBiY<|-_Tb40;9-4?Diy?@#7~{ZNCv0B zDNfDcn+GKA{Wy0lqmm(|BlzB_81rwQ1w;PxcC52hgHDV&gUAQa%HLsaz_9}-^CbC3 zkaQF?AETXUy%4#vZCHQfs=J#0pfvqyEwq`SIdAOxI`|m#2kE@44=%q=qW}N^07*qo IM6N<$f}iXR;Q#;t literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-18/navy_24.png b/assets/icons/guardia/icon-18/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..8b23af46a6fd3add2b0c379645433b30bf3e6a56 GIT binary patch literal 1026 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-18/navy_48.png b/assets/icons/guardia/icon-18/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..6723d74f922b8e98be90f72bff7ad100e81e7d04 GIT binary patch literal 2627 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 SC1gPW0000)X;L=rrAqX0wh4}~( zA16i!z3Tk}2QJ)u&&-*ba|UXJ?Ygq}dxh=6c>b588l4Ti0~&!-;7rm?V3N*@`E|F7 zl?l&*HsCYx6X>-)6j%gfl;6yn3lAAQR~YUV*K|&XWF-# zBfd=4za{o6-3e?q98!uCcCDo9!@!H!6?l>aKhoOoNgfTWaa@%Y@CcXyegg-I?D8m5$Y;4LrG!h kjkqExURPdY8S$N*e@6qlYdEnD_5c6?07*qoM6N<$f}#`1O8@`> literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-18/white_24.png b/assets/icons/guardia/icon-18/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..c67bb706bf9e1cc5b4c3ec2b7664dc4aa96c2506 GIT binary patch literal 733 zcmV<30wVp1P)NVB8>$Lkrt0T4{piA-;7D%b!60ld&dEl#=c|&yr+W{wf z60i+;WoA9V$B1>_E=LX(s3C44&OHS>fa3wFbFvAT3A`|~ z)+DC|xsLa~c<#x#%^sjJu-+VewZ^3m0e^r;p3v0>v;!`LW}wT=ZVf_};3esTcV>!{ zg)yGn<9D5;yRl})o+qg<8sXW1Y%q6q3a?sVtE4Y3!O(RhaKp@c|C_*W z;I^bKKt5oap43Y>+Lgf3^*k{GYk^NGDL*V~)c3%KP@7BnR|u!2faG!}sVU@_yef&$ z$I1oXuDp_#{v2jX$yWdIEjN}2q8I#J`m*`qX4JUZNTz8r086@u`yT%THx!vn?av<+ P00000NkvXXu0mjf=&DP@ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-18/white_32.png b/assets/icons/guardia/icon-18/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..08b5045b035657953262be1e58b4b7f626b7bb7f GIT binary patch literal 1049 zcmV+!1m^pRP)-?WXj%w`DVkI-QQ=E3g;^prJy;}B zL^r8Sda>}b)k0LFJw$Xd>_TZ;?kCRf`RVxcZ@Yg|qk&;&&Y3xvIp=(5;Q!pz68*nW zJYhVvBc;5jn$K2eb>fY;m2Q=nQij!QfIERdf(-NnPnS|&YW8$%$e69UV)X`fNWHM) z%~C&BZ>skm_GD8hr=n>|KPJb;>Rfe$I?zpW_KeepxYoGp1;A&(_v-njls)SGz%t-- zU<Iuo4pl(#B z*JqAI5-wF=Zt?omsDNeNCSe&v=?Fh#IwH7~vR7RRL=~(D{sJxn21_Y-)n(W|-<1KT zvJMzfLZEtHDh?UzODRJY?*J@l%jzcPlhm_2&<{%9hE~U3of$IP^s$up*{Oj?JeFp>RR>9l(D3i{g0kI+GnVrs&kTla|&#{d^nA|M7>yD6SU?g z)OG4Dxt^2AIb%$Ka=(J`Zbi=fa(pj^1R4%DDA;&jpBZz#?Ex%HBKPw|>6*ZpJzgZ=m9>QXi|2W+-F~1tP9{37aUP}3*(Y4Qj zv?>VmfK@;s-5~Hd@Bt8@vlN&g*PG+^+!NP&0dO*~As?qrY4nG{6+nb=E^s$+Bk;*6 zK$g+)RrMQn9o9DVE7c#=6LbBf`i6Q>K0FK61?ndC-sC-%drwh!s8?0;0$X0KbZHX9CA)dUB8E{-b|HnFH~{mF#=+ z$Ma);Mk07429{EuP49Y=7S8Nax2M4m#tMzNw%qxCe@i)MAIj{EyPV8&F^&+i0U_;X5MgsZPrYDDbREASw82)W3<(Ce! z_LX4c;XxbPv^W+l{@eC9?~8N= TJk?Ur00000NkvXXu0mjfoaqca literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-18/white_48.png b/assets/icons/guardia/icon-18/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c1d86902f118b34cc5181eb43ed075c5d8e78b GIT binary patch literal 1617 zcmV-X2Cn&uP)41FPwh8_hy+OS{7ETc{|5jXfPNLm`#G+zcL3;@Qfk+Gi<#{v)asPdrZP=kLAE+D40rA zTfjoSw*ZY&u1RCreHJ=xoLdjV50_=f1Y8QjpCWu4FjDV(M;?70xF-PXfo5Pk;OIaz zQ378WcE^KyYUI(^3Y-XhC6^fpbO1L16D0gar5*d+1Ka9If$JXslTZ z?ke1&^`Jn?z7Bi~ToQ1H0~hGMQH9OlF9v>)LP;%$)x$2FE{l&U;TyyIKB74@&h2vu zN<5&-dm6BH!21qO2Yv@0igW4$Vo?Gv1vaXcSOUDNtg|u1Ls9&!7a(=BMXuN$JKo1V zP|fT(GaDuPkIig;O6luN^KW_g7|L6&_V^zLsO1_}+U!(`ch4oREP!W|AwX*lnuc!T zT7W%s_1+x5eQogN?}6JwZZCEs{JJn_0FMHXD5wjiBQ5HcfLj$azbGAF(<`wOgr5Wa z=IPJ-9c2{Hu`gN${0uAto|D2}eMeNFp9lP;erb%>@N6|F%Fq+xovFitCHx4D z9}!}r75EHz$$O$eyA3d3O0O05D zl^Q=E7zbRY@0syb*B#-@)p3%ti2LZe+)-A@T1$aDrkUBXX7-Jl%`h|XbJm#IY%|+efjQUAzA&>!;g^W_ogSQ;=gGhi zF{?dL&1|rlO;O-~VrG7J*xk(5nb}=t=DWDa%pOZA6>+85=+yEJAtie8S_?d-^qBqE zUCH5TSzT_)T;TK7p{joR~keyE*vLa^mqgtLP} zhidHHa^R`@j#Im_3|Q{Pt5nF|)pNaQJ@|8t@Jle%ayU%Tc#H|wDXg&axDe2Ke``!#q1P-kAa)@UgZ0dFn*j|8kEZguQ|BnsxGeO3Y->Yb*R)N`Ekzg zZl)_07RS7R^Y2g1%ms6|csch;fk%hNJpE>W^e;+nU({W;Rr5H)or? zb|F(G#i9b4={z&@t-3|bV!*hNZoLKSkv!9E6pdRr8o~Re4Pi%eKje^qH~2g~Zrw>{ zwn_NRtV8%0eBBDhs=8%Wi=2Mjl>hhdlv(vPhN#6JRBB!Rwsx&vsIl7ZK((q@8uxzY zKm~5JT1~k{>wLWU^*6I3m3r%4WzD>MUB9sisk72k{E-LTuS}BfLH`Z-9DnAFRibjH*VMHA&=e=phy3(q^@+BTVM;=W`jQg<@$9c6H}NE P00000NkvXXu0mjf-xMXp literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-18/white_64.png b/assets/icons/guardia/icon-18/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..743612c173d89c575a43bfe183b322a502260c4e GIT binary patch literal 2365 zcmV-D3BvY?P)+dT;Hm?<61#Z^2TPT2JEu}OZ+A{%6bMvv3 z(!a*T?Ry|O;OAtLXOLXU?colROGrK^()9ffAUTjy+DdXBfNubJ34rwgehlDV^KcM= zV*yMDum-@XDWy9yE&3Hm*8Dt*75`8%;AkkAprw_ZRt$FLryd6e#SJNq(MSnv3FCeFGd_&F7KaL~@1O zlj3UoUER-5U*ZnN+;3;%l`3AsuM zeyC|Tpx=O_R{b!a0$kvC_2T(u_s{Licz~lyxW_SoJVGrf;q4^fP#Dbt zSrZfYJn~x`P|T721H7hE;R1f;~0Gj z+_tiLTYt-f-RG?Dpb#(}K=M?QYm9THX&So&{R|9e*nj=40L$gu8V5tJhyx1!`wTxi0Ro7S>P0l z6=tN?s(@iUS^UNr4t4}8fj!e|)vci6i060QDP=T{O=y(b9zt@Ts{T$_xYg z**s|%TvFmRgIc>f@N>3Z*CxBWs_U)$?dD#ncfJ$Q->(Jm{gjdftf!PV%We6$+3!?8 zxK6mD2`+VSUz;h6E?qZ`x5@m>E_m*W0+OG(I5CpVRY2|&Lm6iHc~`T*#eH|XsjIUL zQjB0Ek*a`!yg29pYMmehSnf%V2$z{CZg}Sdcocv<#mMcie@`_FblmrJTs$zOVAv12%LA#8}S60CYU|1aK>WpXrh#Gvhq} zWWAR$CHZLp*Lo^Nm0EQPyD+7+FN=N9;%4n4-YustLWFRIIxHobw{wG0(W&j+ab!^pX3b{xL1XFHJ%nIf^5av zRkE}#JV(#Gwwpk=HXjy~B;V|)D_?ppHqI3m_+*mbb<#60jJqevgZ=k>-w&J}?gr#7 zM*P38$~RaEr#bajq$yY!tbe1en&ZgxbMO!Q#-=f{G96nepvYY z0c&;8+cv{V!MZ2M?-z&ub*}d-8WbEEK90!ogOs$?ZZLy#{h1y!dy7*-zue{?9w+mb zi?G)j=S5MrRtl*5`Ee7!$r>G#fcUA1@F|ktc6*W;RaW?`;I57gyJ|mYjK2*&UVlFk ziW(B+b-}Kzb{x=H1mj%g1nG_C3Wse!&-CX;+1gdWQg6rS=N(YsWi21#?|b4MK&}hC zr=Xb}%Hx8M_{<8HxNl6JLGqo!&*wRkSN)|ec$?~DcV#CEsQD=&9w`T{!Yvecd~x>j zvB^y3osg9@9O?&IxGd91Gsg*J z^0q%XM0GE&DrJQ^W;pPN~!+!4p0h3L32noNw)*khC3J$L4N0{4%dAf?7f5Gkb_GhN696P3BWAb;__1%Os&vd7%wYcPxl z?r$iz)n$rtbHzs>+aTjCgBd4@O4NIee-i*1+e#(XD<*3Ul2X$4KLH(pFGw`8EU(7a z8EuEI*+S$o@;5`%Qc7CUMnu^mY{yK!2~&-;*Uoj5aq}+GZ@s<%bK``Qf>_=%K~imkggu!lFay%;;8_x}*pwPAPp jFGeO{0w!Pr&}Z;pW=`_he_-Wa00000NkvXXu0mjf#1520 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-19/navy_16.png b/assets/icons/guardia/icon-19/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..817caf245924f1e486897b5a7aff3e20d76cd418 GIT binary patch literal 650 zcmV;50(Jd~P)@GC`@2NHTI2v}!jHB($hzAaLPdAhYSmszp&T=E98$ zwar#R7DPD8*dj23h<>0>Lj_Lh%)EDRyf-8Mm{n(U?>+aN@BN-^> zLoIIwU-hx(Okims;xK>z_I4GLF~k^lH%1H_BeTs)th&Hw-a07*qoM6N<$f;BZK`Tzg` literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-19/navy_24.png b/assets/icons/guardia/icon-19/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..26c285ba147073f3c80da8c6a8ecbfe7c21a8e75 GIT binary patch literal 1104 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 O0000ba_5NzQ!}(3UaZB>k?& zoJinw*lq?!fLp-DbpHfC0dFMzI-W!&IQJKTCqM_VmY@ji1$uxDU^){<7MBSMN&B`R z1O33fq{Rxo`@losqokPvE}2(ax3d2<0QOPaUc1>CWHP11T`iwH;x;cN_^ zw(kNrfS15*_-qdXuYpjgJ26EqxaZ?t0&W6PYMd_te}R4AJ#ZbknpIs%jG}^nw!<+F zOad*y7BHN__j0WQmw^dj%ywsBiR^?VSYIV?+a;}|m@}vG iEGwHP`#<{P$PNHAL*!J5t0uYt0000Xl=m*<>UEO6OYyO-pJ z>dt3)*!IwX^P$|$r{CjMpMl&-($(7E2IR~6SxLV&a&tyB5FkpOg6*xq{lHYVjaa<@ zLDJrSopucheOl1=nC)G_J-`{@asx1#D1bGQNpz(%%V7;l3$P6M0Qjl^V*DWRYk{l; zHUUc$1@IW~B5*$UZ6y5w!;+?KzXN;=JOF$t>FYUC`7rPVa1>Z4>7^9Et6L91WBj4= zE<)c(+SlC!ca_f1lCIQwWCN7_F-iM7Te%+@;Mhjs6tJo>z8QF?@*aTYwm+9NA?c9q z4R!Y*u)j4n15n;C0Y-r_;COkx4j2b^N;+47sZol1F<#dfxl!9oCH>XIq7=6Z9G+hS zZUjzNnA?E2ftzfHHEV!dfj5DzC36zE1^5%Vy|H(Vrd9c{X(72>`qZh?4 zoE5+qz*CjK8$!MM{|Pt&gjJK0E;WrgRkB$(0~5gGU4llMUiiK8|95xU)aH%;hOEdh z+yD7j6F2PHP<5JC4?yS{kdJ})Q_z|#F|wqTM{E9c&bWy@DVpwH+Zl=h+TKMsYdG0{ zAww**1olWe*mh(DI6;3(a&*o}Vqso|d$y(cKMv zC+WkA{Ax$lK@rRhtIBHtlE$Zj`+$#t=hIMC{5yf~CB2uZ!ob$vtXWjKRP#SnS24D! zrsuL^+%HAZ&{h4$|M#-J!uGwD!uEXLw|ODP``?aqZoWC+^{ne&&H<9I=heF2`WN(+ V=nt^sy$S#T002ovPDHLkV1i}>rm+A3 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-19/white_32.png b/assets/icons/guardia/icon-19/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8e4cd65130021190edb7a8f1b5726dc07b2701 GIT binary patch literal 1167 zcmV;A1aSL_P)V zfmy&*U~@82%Q9deum)Hh5o;R8Mq(pI2;Ol}3_J*&0z3n(uAt*;>81j7GH@O632R~JCH>AyIh^6UZ{RqInb=>Rmapbx;1~8`jL9M zIzxT6?epIRzgB%-JyKn(?qBm`c3|82rjD)MPf?##Z)`yC41k_Gf;ZIT)mPN>>sw!I zU9vJ)y+^&Iao(&^&rn}45O3$ks*VgAJ>9`8Sxy6f1oq4MhyF`;;-Bl@JD6$&%h(K_84F(aC=0&+GU%{ zSPWcMGR$!UFr@%Yj)?o37(+798b<-&0fzu@4Uo`bCV?%;;7#(?GbSS50pd+bJhU?=VT&SKtm!2N9839p!A9dQySgP(JojHv%hxThdR_J*gPTirH7bhcC~T zoYV#CI(4b~mO8)YpHOGk`#5#4dO8(Ry-aPALe}ejrI;~{*soF_m^?G%KdRIHvwj)Sts&1!VuLM>BUzRE|DSrSaWRp>s zB+cq`z}dj>!12I|z?_I!UDRiH+*Dcr1(2%9YMQP5p(bWe*G96=-v)e@5^Oc1JemZO z>oeOg1!k8rQYkBdb0Q*-taD$eW;Lo3a(v19R^W<;w006UiSZ|p$&}P}q>`;z2fA?q zdI4A%5zB`-hDOF6)0W@#wGXhRnpY=D+W?v~=_$Fa&s}#lkO8j|i`oHO-_qf>3rm;Z z(N&ZV>MnY{T?P;5?#ggQ>mrgn=xGH_Hnz44N>_44fytIl(LW7%9C)A$+;%EBJv*4X zup~CITI_`Ox_TegdZOiH-%`QRHJ=r5m3l$9kKsCDN^eO4$vQB%=7+1C?MBvsnXSI5 zexkmZcZ+t6X2cLqI`XLZY{5zOuibaV+Qsxr*j)c|L~QKxwWuzvcMo;39TGqjq*eb1 zT`pTSBdgZ3c_#BTpD0~0_ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-19/white_48.png b/assets/icons/guardia/icon-19/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2710cbea045ea2e83a8cc87d674cf2defa9916 GIT binary patch literal 1807 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 r{b{PnAE#0zIsp?f0TVC*7z6kpk>9hqD zR6z6}Odx@TVQEP))-`Nf9Gsu$v+rrxgmr5WQ-i`BVCYB9K3=7UKq}aMvX;z^BRHW7GRY&s8rIU=_5pN1)_D_f>AQCR z7ozcVKo_C$_jsijQ5izjQC`YO2ODxu#hOOn^T?Ci!~Nz9saZZVciJ4-E7h8Q}9JeG7&<00000 LNkvXXu0mjf`7Su4 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_1/navy_24.png b/assets/icons/guardia/icon-1_1/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..1d14e9ddd5b099fc6f0e0606ed39f08ccee409ba GIT binary patch literal 1147 zcmV->1cdvEP)){7K+5h-i+u9oja zymy-z^v^2#L7m{1*i(DF@y=k zD;WL)jZz>_fIbB>i1F5g-Gk)6;_IGM1xSlwmZ^ZTSXOMAMeg!0ROTS^Ha0p$CV9pk zakA`#h}{IdidsSCQ;e=gB@Nm~-XwriBsLhiN;xchb}q(00Gehf)jfj)IxX7xNEcN# z+sIvMN9{612g&sGP9ia7ppdLI5TElgM&DyF)#v!jTOR_y6>IMVlS8nG?dRz36b-El ziM)Lna|p~|LeUs65R)c` z_FiJ?rrW8S)q=7ByrV?94%Ax%Q4{g7gMqG{)VKG7eaX4tq9~H#{Nf@^ssX|==e^-k z;75+^{)r&;iB-Kttfm|Bw&GX63-$wsc4g3fA!|>%`>~7Pqgusd&9{}x-07WaaVxb5 z=N)#DEL#EOu4mRi7@w42RR>AXQAn=9Mb06hXP=%miwS zd(kn_m~+B6qo|H!JRi{*p6`QPbcu|z)reM(k{o%tQrW{5LrQ-|y}O;n`bQC25wo1xcdX(_@3~UnZ3TLY4Hz|`dXY>rR~mqN?YIrvJ|x)O;MR4`3y8NJarJ#Q zJ<>9tAUr@2ZY%TR;eLW}O}S}HR2sP_#C5UoCTia(%uj~bj8 zDc-&cqHZFymgBW&;1!)duPSLWw0PTV1mQvI!upvHx}??+Y<`&_9Hg%0zG+b3@I9D} zq`rMM$a9GK1GR@Ce;T#pSZ_X_w*(;$dICSYoiF=Fr@bRLG*D>-2f<1VD?sl-)him5 zlMsDECi%;h=hrI#2fB%eya?$He-bzG%_uzZl?_>-ei-PFuAj^)`WxBvyOM~%@1+0$ N002ovPDHLkV1k^_D`Efu literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_1/navy_32.png b/assets/icons/guardia/icon-1_1/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c0319374cebce9048ab565d813085a4a25ad9621 GIT binary patch literal 1671 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 YAKRj*r{wr+MF0Q*07*qoM6N<$f`6ffPyhe` literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_1/white_32.png b/assets/icons/guardia/icon-1_1/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b471128ddf6f8042d1326f90b2d8b973d15f79 GIT binary patch literal 1115 zcmV-h1f=_kP)er==M-i5rol= zdWfJhEPV)s$S{Vknl)h)*+l|Nqbz^1X8vEZ=j+UOrV^qSZ1z6;TYIhlUTf|D-bebs z3(x}E|C)2{Z-YROTidPrJ<3_mxjze70mR=1#IU0nhhCH+2hIle0q+-fMuF(*W>8W@ z#Bct+NYZ(dW=T3m(yx*RByEwjAtE-Vnst{*dPdTIHZMZ`XjFPF4Z z(lkl^k~T~FQBne%B59$d`I2@>x>M3yl0KBQ#6I4Yl;G0dqY?2$Mx)wTN9XPj0bT~S z0@vj(8UP;*+zPx6TnVfNP62)fE&;A!ST3#7(am`u@Hy}#&|9RWs{luN?JnRl;5cAs zj!PdMox4p2z6Kts92dZ*W=epSZs}l(zfEv|rg!^2u+IHbe;d2*7^&XZfu}vLc0U2Q z7x)6$3_Jy_0X6{x3D#AfVc!ERcO(`9GaJKRbDp`{;j?{!cRwBY7+4Q1P)%|UcpiAu zddrG$cLNu8Wkg0o+z;H~aRN99_!PLW(EYbRfjuz%v;y#{{^@ImRL$@y$x&`ztl z2Xklj`~fqH(9U<*vo>A=9`bwwm;`JGP8bseBeZ!3@M^I*3+@|WR#Bicd^C64>1(d| z8@+ChEB>(R)TB+|w)!Sg>S*Rj%5$9TmyEVp()NhhT9DQnNf$_(=$6d*Q$#$R>4=D= z-NBqs8wT-?q`94<-*P|1c#<-tgLa;Ba!u%Thj5dz}$$~YljKo=rmwk zJH2)&2ql1?8lc9zLDEpcIT~f_sjaQ%ONpikwA?3`A6k4*KA+}Lrp{-+3tEms?!N82 z;XU6Uxx*uEtCGo?%1%I9H9(o`MFs6{%v&!D&kOfTx+$hv)o&{d4?7D4B-O^Vl5aE_gc9F-)hDQM30yh=9tue;e z13!381?*xU)1Jo5j1ewaQ7~7vt9ibh9?A3FVeNE(`_7M+a_vXJ&83ef5G}VXsMVf3 z(EZ`&`vKqe_W<_;ZvbBbuQ>myJJJ2>1W?%iQv{+8z~{8jCt!I*JeN6-h+nL8yrlCb zrL&gLd_KqetNKV?;A%;a`K6TiLvl&QH;qwfyFb+ridFSAHLde_mDiqD|28gR1jI@C zqV+YqcpU5U6}-_;xY^x6r!+lEhaQd2+wGFBk+e%v-i%qKUpie$-}5BpG0OsdT+&?` z?#72_Hvk=8#=X9H&Xshcq^SmwJikrSdP!>|Vt0M*KN5!dpuNBU#8eW01&FIY``mf8 hyHRt+P5R%E-vL-ZUH*xSAGiPj002ovPDHLkV1iF>9$^3g literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_1/white_48.png b/assets/icons/guardia/icon-1_1/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..51f489a3246cf9f861cbff62321e4b9729dc2749 GIT binary patch literal 1862 zcmV-M2f6r(P)6Yupo(>tf{j(6^iP~r<8_kL%2&$}<@15UvyIJtmi z!2cCUmi#9qXoTnqg-VoUseaEU`31>Ie*8oeT&gEif?}pjYeGH5cP9BGkHNf%yT0?w z8bP=b8$t**0BVxCvjEt^he8OIA%vpj4Z-MRiQypG6TlJxRRGoksEG3*4Hl8SPK4CAza7aNNq($-2T6{T z-5ZS3x(D_C3CYIejr9>YP?+1KSFY-#)>9> zlq6&J**$8-#rlGxS=5GOG?1(yc|iDoCV3^vi=}BJen{M#g)Jl`?fFmS{@ssqL( zaXT{6hvagtu^e!x9qiTxy^klkLhDv3^4zBP*FBLW&n4N{)6r1kqg{8D4bICW`N1Uj zC>-9Ng(qXo64_>we~>&(a+YJXh0dNX#yU4P>R9G9=;<6Uhs-1-v)bUCI)>1ajK}si z*Sg8VYr^Ro&vdvgDj7WM1y?BXIj1Ih8p%qMixaKbZ*!90DV%mpOe;rlstHH@1Xrm2 zLUNhkl9(m6 z$30yQF(C_`>oYVnRD|5+ZC-N&NdCqA@TJTzIFlN$xl5cDA`R9Te3oiAg*p?i$~(s@ zMAuM68ysZ#0DP#mu`)G0&jDx+;Be$ykG)qbso8p48FqX3vO*>BRuSnPXsC$T{SVK%Ox(+|wB~Zs)xMy2GlAg%dZ;OhIQJ^!*7}Nr{Te?* zjZLN_XQ`%*q>#mRxey<5M8@%ySr0Xu@0aY`17KgC&ag`BS|odp%Rp5fo(8Y=TJuq~QvzAmhmfw&-qVA9+!dxs8-n^)_1xCpoXR*{<4?$cbE_C%+R z=J9}V=k{s;0L|qRraRBT>Y*KK_zNp1T)3RAQo$Ex_Ov9qkK{Ya`WOIiB5CEehYhY6 zOf&8x<%+h+yyb;MBwzOH8ZzUT$Rh5z?j>dNiUv3G4#^yu zOIue)#JQ2Nu8H?NNhKOv#yY*S)-@yfs`g*+1Qg4aa+Mh($ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_1/white_64.png b/assets/icons/guardia/icon-1_1/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef73f1382e9a3c43be100a2b64032d74b809db4 GIT binary patch literal 2643 zcmV-Z3as^sP)1+r$`hT5__(#lv-A{dFZ@CPC?sI-)7k+!sebfCSTS;ud^yWZ|O_uc#6d7|lC$;rO&oVE8F z_F8MNz4m^<2#ml8jKKdnkW3^S*i(hao(j~glk6dREXh&WQ-EZT+R-F$<$vIP@!S8J zk0#AjZ}v3&`ygh1-ynRGYu`vt z2Cx*sJOEn(>d_T!!1{lZe_RS<0lDviF)-cX*Y>5-zY`yzq zSOxYLPCJ+--1?FwD$@kuT*!z+`jk2c%Z#v1Zko-p&_Z=h;CTW&-tMK+A zxlG^JlRTB=ktFAkG?y}Xoa7W=ZR!%fNA3JTXfw$#kQ^8B{OM%O99N8AMDhue?<6@< zw3g}n9r}AM$v1_5i}ikuVo`mw&(<1zF3D{obQj5)0jF5she9K+<(BLO%WxOCQNN#c z;pIv{4Z^>n*2IV{v;TH5&CBBVGBb05s$8H-VG_t`Hi7~io+Nolz;#z#9fYrErDKbc z&jtp*8kj2+pr^|WugDhL(0(1sog`mTEHDM!O!69%w~429BoB}M>h$@ONp2URZ#a=$ z$UNZKGDY$%l0PT8lH`LVAJT6#o{?@a6fM{>-FsE+e8+u+#a-#@+r;YG2 zh`pEO-OAGkf*p$Jr-uH0t`U5Gg975~O=;Q%&eywXbqBl@W`C&|xW@&p5?+jXg!UEU z2CWhcNKUm}p5%!nKTq;nEITuJ zj^rg~Jsr@RECrblQ)8Sa|2B9=8K2>fl6BZ597pnYl5ZUj1tiO@Nj@wlz8Do#qNtAq zb2ooIDBv^#(~WF<9NlI=l2<9nIXn@Ty56j{Ow-`c;+0B&0Oxp%0>fV# zXlX2=mtsYSf>KTTMkfg4?O_sPgQ9n;VD1y_3~Zc}U4X!g?E*I` z&K#GG?d|blH5i*Ksv89~)XoS@9gux$G^N1p`hIyywD)nY zSD*88Yg9W)xq^*3p;HAk+I%wtRzg~pQd;i?$qeT}waY_6H1J+1sd)nFXv+>&stpYNVypmOtzFmrRz< zfvvUP>isWjojxQ#k5@Z46d`xpiU$1avg|KD4%f#%LAW9>P^#VZic!b|oR>NJ{(>b= zvHwt%@LMr=Qbx=(G|Sc=72&cxJ?`+nteRa8CfKK)Zbc?}hH#$>>9H%Pa6hHf)b6!! zb2V56^s4=)2E9Um$NhTo+n5*51L4d+-w8UiR#!a53aTW(tCO6J^zW(ZqulObVw%AJ0?SoY4w;Wu@?943)_!8WT$@#z}=5 z-?#WKa>zA-q}jCcH8oqQLi=Y5$7%=j+bF^J{(Yseih~rlu6g0~X;GWmKRuiSj;p0C z#+DnniQk&-Kga~it>bYIedrNknaAT|sWb}GO?~z!Dt@VZ&TgOu4wA>k7QWj;i0C|=Ir-NN! zIEUohRcLV~PSNSnCrSQ3;M;k^Ir+FHG2*gtCt*yjcK}NKY(c2fmX@Ehb>9TNR2LT_ zY*9X7?_bKkZB^2Aa0kMhGIz-}PZ`$xfo%Dk*XE4*8Ihq3KgNjhs@K^G&)*azH!EXX zujIyr{)``KN17FU%nD2I_l8yYEYO+RE)n6shBNq4og8(C3hsF254+t9sLJBP%+CtP zXG^*{e5orQj0(rpYeH^b8hxYk+KlbvR-GH9P+xpDTOI26`zpxx0KXI?=7*o_=6XzA z2HW8D%OUJCMo5Z&7A)ewdt03S)6lC!0K1dqQ5E??r)Pt^U6)Zh9K+#2j;_sEhyzESGC4Hhp?m*5|zV=><{TUK~(p#SRrp8)$WdHa*RGP~foLgxlE zJITznp*dWAZV$)orqmzW5t;C6_4!oe9bxF6kImAV0QL)Ls{pJ8uvulVXAE8S`x&a@ z`bBDoZMx=qO-kt@jo%we^0h#!V-P4Gcc5~DeVkSI4D|;K>1_1W~SPx)hN@-*0+Y_$d4-2H>7}OOZWprh- z3WywT!5z|Y6A1VHYxoAAu1Vfe}Cj{2T6r^pHaU)=>Ze002ovPDHLkV1m|C B3n2gi literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_10/navy_16.png b/assets/icons/guardia/icon-1_10/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9fb2f80abaabd42be0283f582d0c4ba483c478 GIT binary patch literal 502 zcmV)vZW@}^f&MiskOX4enP(L`sJ>R+CxqSD7|BIsO)xSZ=WSmI1*OTaQ zh@v60DO9UL_vmNhj2@jwjHP+x1&wkm6sr0bO3Fcs%oI-I>H=z}5c>fo0QE7>C$LYb zSH2F8ODK|FJcG)0kYm6b++R<5UES_-lglG`tt*JVfJhT~M7{E{FOn+UAeCEZ_SVAC zYf^c)TZ2gFFEN{c##}Djxhp+^{3yx{hIy<_V0gg#T5ag!TrQ1r6%(64wLyHW!m01S zhdnr-oxsFygKYq(!MyAd_99lkA;CD7cM#iU?`vf|Uqk{62WNVY>cXuMW siQ;eB54mu0G>L=5ooIJ35Zyz^9ygnfAR`ci@&Et;07*qoM6N<$f&*0T>i_@% literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_10/navy_24.png b/assets/icons/guardia/icon-1_10/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7b21923dcca8b21b1113c21395473254628f6539 GIT binary patch literal 833 zcmV-H1HSx;P)xZC>GR2#id)Fj^NInnwU|f z4Z27M)P-Uj>c@bD=;Q@l7^=04Dt*tnmc? zQ-d~`$TpBh)ZW111XtSJvI>3VauW)_*s%~~BiIEf{Y30xdfV?#QZQyz!@WZ|(G@8B zc>3@-1KH71H9jhPJh2|C_T$7JZa~?qQ+m~TwBSJ0K z{*2ny^k=>zwq-vN?ckF~*U5I-@&pr}2#vSrqtQLMneT(O`1a*szQrrPAFzxwjOZz@ zww(hk4b2@?n_Y|+Qy5ywAH6=VAe@Raq%DO_76%D>>$ZDbm2RM$FI(!co{(?98FITE zV!uX%t`&zpq{c(NvZAL+095fWmf5(O0%SrH|EV@yIq-Y1U!SUC#(l+IU%hmz^K)mI1JnBGahNsLB zVtymvdM#94;)XZED?(f?-T?mr&G9P7*>&uy00000 LNkvXXu0mjfC}@q1 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_10/navy_32.png b/assets/icons/guardia/icon-1_10/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0c076d80071e9e4e0d4c866fe6caf7c8b29ab801 GIT binary patch literal 1120 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_10/navy_64.png b/assets/icons/guardia/icon-1_10/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..76baf2aa67001bb7af598ec8f51d14eb7c0cbc60 GIT binary patch literal 2559 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_10/white_24.png b/assets/icons/guardia/icon-1_10/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6483b1a78c832b01266a09aa78e4bf3599ab0a GIT binary patch literal 624 zcmV-$0+0QPP)UqC;zhOWP&i;9VOlnCJxn2nzj91`_q<6U=Iik=+(^P7LLDH{cZ%Za#2iyYUY#Z=83*9Mv z=XArTvSUf@e4hvG2lfIHbQQQJ=|`T=1@@&+KQIzLlD>53Qq_4>O&E>?n}FxQWl4{^ zI;3mDjlf}GJ@6PfC+ST$iSeAZ{mS+c+x=Z+wi3P?MVF=p~+T-fa7{?fbR|ZLcjwP)=fdjqQQ-Jz@K{ z?Nx*1AGJC2ALVN7+4yF26U3nR54Q^?*Y-DB22z- z$Zye-JdQ4(0Z+1#s-earJ+0|8{kJ|d`r&v|x+?r#e#&Q!|FPfDT7*iS9A~ls0000< KMNUMnLSTYw+9u@y literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_10/white_32.png b/assets/icons/guardia/icon-1_10/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c72fdd089a6041eba38c7fa44639e96817f7e7fe GIT binary patch literal 791 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_11/navy_16.png b/assets/icons/guardia/icon-1_11/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..13be180a71bb45b4e7648b663f1ffd6315bc437c GIT binary patch literal 507 zcmVPAmaDhxR2uWB-i&66e?i{d;={uM*~%ig`{-zu-m_f+jC9lj{~3}Z8ZP8R zHXipd-r(#t@1DG8VRu-zZ3XBaskDMt;xv{9VTgEQrzOx4%qqZ4%wr8Zyi=g!Ln5U_ z9cI70Y*%s4AVgP>QQ@w7H!(N~DgT5VWzGzZZ%`uaUcG=F{|>zKWoOd{qKZicH@*;e z-MD0|uX_?V#91EmM&BZr*m;Z!iRq+C&sl^%CUd|%`(IMBl|59?VdBWzvkYXm+yDh) zeN-9~11H~sCdLn(rBKv?C5*W^0_P%Cma*T&QIZ$HN=xW8#mkDt^uuZ^S+G4cQa002ovPDHLkV1kly?`{A9 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_11/navy_24.png b/assets/icons/guardia/icon-1_11/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..867dbc6ec70256086c1452a4434ca5409f497967 GIT binary patch literal 766 zcmVoi?Y}PA(rE6JX1}bn#*!g}RzP|-^-w-o{mDfBQezWB1pl>UNcAPXL z(unFij&FLx;3WmoN&zXCA?SO6G54`rkD&=<1A@Vsrx1;h8;uD1&mks2okR2!PG=Cm z0QNAs(IeFv7{IanOb22vVoMu%dgDY*q~i6U(GHM$jCq8ow-_IpTEyGcdlx@5jV)a! zH#!;j(AACvSlvg5C?jIv!uYS}tq0$MCURC{ENd zr&HLdDV72zYh)_MB66ZXBf!D~6!|D4ur! zXBBlHQTdAJ&rm8}!N`6rb+rOU;_2Cs&_Jo=Fk*2wLii4@6Bt3HH7Sw08EkY9c!8n_ z>nN34@MJT_JBGTUiYCpY^L&Q&#l2Y9vY;J-cn-C*>F8E3F{{KSY69Ds+}<+R#B<;q wpED16d9C=jZ^oLiSfTROS_{JDC-_hB6G6rx@~07*qoM6N<$g1WU|^8f$< literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_11/navy_32.png b/assets/icons/guardia/icon-1_11/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..4f020bd4eb17fa343e10cdd100781458754ffd9c GIT binary patch literal 984 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_11/navy_64.png b/assets/icons/guardia/icon-1_11/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..a349dfc0006287a06b2336a3de3fadfc06ee0be1 GIT binary patch literal 2006 zcmV;{2Pyc8P)i|)*9;*Fi% zwXw9vxM37K2*ensEmE7!?&+W2O`upqDk zyQH=c^|vo92rd&Um(%kwBJ}mC`4X$Yk-E{Z=swjUxqvbT>xYOs z&HiUj&Zyqk=hY=fwQ@b#kD|Q;RUN7-QS;2vEMlPUYGE{J#=zNsqib0VFcC z?x|%2`UF8+8=_`bcelnsI8g-t0d^eJAHeP>KlsKpXW}<|IYCD}_lg0D%k}pAoFBOd zPu7Bc2xHqp))8cupwu*K$&IzK4^!jEDF$me{LENof%yxdA|suTFQZMJK;$IWJ`Exu z8L&%1mLRq*wr5v^Y(fR#r(z4G@%It+Ta5k<`N6jn#vbHcm$otaM34>HP2fF(Wh+7E z5e6s5}5EW7_*!FvwyB=qbGYWsPEyYwnRN_ zYU~WkdkGUB#OF_p+Y*Of_^@ib-PwJJy_*luE#p7Ai5VQ`E&$NkcMFSe4`E^nT77_J zKOILt!+&p8tmvF+cxWJ;@hlRr{Q*QC!%Ji zZpKU9fzfXxb_(o$SbJ${njOh(guUc=dE)D|>>GFs*i82m-^CApfOs%jc#Xo;Hjcb_ zVcIHSX6;SYn@+^%5LSFtun|-GJg|pTowL4dRn?wQz-UWY+(Lfv{%9hS8g;JVS*-qm zNeEhopZy_W=?LM}8Agvi6p`=k^`mm}o2t2l&Gc6kCWQRpeT3cvU~I&p3RDfZ-S0xX z_Yr!s?KA>0If=ThIFefP{%e!bv*|-+{;>2u)<&k}Rwvg&+@r1lRhLPvG^1(Vz};iK ztFty0FQ@fwTIxn2ttq)pNo{x4+^sio_bkb#r;+5#P`*vfN`nQk+(=M$l}ff0HzHK^ zpBpbBWqe*T^c+G$^huNMo15I*M`QVH$Be zeVE-e0!)L{9A=6+qv^x;$|%3>#VhUgwhA;2iW>>#?p_#?#tLBcWyila%`#}4xks5V z=H#%NyZxrWv>KS(3sW=`@rhGYp_<$L^|=bzhP5tSCjw*^s`;k#XZE;2b+|KrkE0`s zJNqgbL?P^5E-qjfNC9`6JTpI_?90)G62JsP>J|$w>Mdb%w5`d{R(Rl2h`YYH{&cZy z?L314OKygZ*q82X7;7&L6hM;eierik=@8*|x^_N{*hxfRY>SZ`2pg!VRag@UQER<$BO3s2a1k6E;fF30$jw$ zKt?QndKIW&UlJ!#$Q|!n*h6es#M`@vJ$4WvLVJ>V1*#P#-1ex8K(r(s2wHNHu9QgUGh-2n5KQMGZ`9(aH zMZ7QJr$L{0J?f84o_7fqzl&0Fh6hLL^4CR`3&$EDfF#jfFLinjky^_;FP=#5_axV^ zMwuU0eGQTAi2r+fvVX&}6p;+wJ7351HsdlVOz8!R6E89R{9ltO= zvgP|Se5EkS4zw(Pd2oqw=}(ne9QCv}8v-pDrN|Gya~*ubHV;y>M1Q~HaFx{5YaR2; oQf;Ay7FuYbg%(<9fg2tF16^MYgHJLrJHS&LkbUme^3zdCo*9!t?3_PyRwm8%M;Iq;;T-i0j&u zRPhM(BjUcu^(GmZ5GbbdUo|#VCI&y_Qi@FnYZA&zu=FjXx>u2Mw(S7 zKKl+VU9$vL?z^4uz_Q&q20k)ZVq4ieU8|D>cKZg{1NL2)WT!V$!2lRE%y#culi&r| z1YWb|J3mT7n{@}=0`Do`z0b9q_0C;jIi*z*VfjA>Nychlyw+zEZ2uhX!MWI?nO~i6 X!#c%aaL-_600000NkvXXu0mjfJ1D0- literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_11/white_24.png b/assets/icons/guardia/icon-1_11/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b61cf7c7eceb80636c99629258a327adf2dcb0 GIT binary patch literal 581 zcmV-L0=oT)P)RtOtqfbYPPq_-m+9|4X6yMS5XJ@B*{wF-Dq*nR-q2d04?zyToA z_6)cKtO7TH(?F!-QxaJQE=an#E`rE;$se9``U`=d zw)?e{+Ci|MvwbZ`e;IfU#GpB&3gkhYbHa}|c2S&PHk}Na<%O%je&8W+A}{R)_9e?l zz`?BB5^z5CAAzsAk6r-hVn0b*2<&DAu|2N?Ga1PsCo-mUE*D))ISFa0?(vjowk((E&qf;Zra(Z6P-jKOX`pN&)AgIZP(cnPz`t0eAm-Pzt1_}_nh;bb6{Ggx>(Vsq%8L?j}g!? zGqpMA*sS18^J!*{abYbflT^w5uLS9_c|cM%e(nMe2m5dS)j&V+80a>$XUT9=iCI1V zuK+d!tASNOBI(b|z`el#EF_Rb(s^JRa1B@lII)$XvXme;4YotlK1tn@E=jr|sYlXYNweCVIU?zyq%&?KZ?l?n zk-KF#umczX7KV!*Q_m&R7vP33NwzlU$ zH`3{`b*A~41@oGjd2ZYXX2kwX-%I(Bu%V+9xC_il_#|0@$L7W=yfSeG>v?RD8ZulU zjlj-peUY^Rm%Xozk?KMjy&01$R)&Das&q7xF}b2L1Z)D0mkPl|iTw{D7nsd?VI=m~!L7xY< z0sAGr0j>gHy}3wQ4;%%SM%Q};TnF9*9~@_9ecrm0SK1K}uvOB57$$tBF!TXWV^G-% z^u&Aj&MDwdEced$$OR|AI7oWS-V)@7#KM)C4~&xhD^GeWZb_zmvbpk)K{gE_-kOPy zS8Ms8^zxDRJK!YAdT5!DFtJ(wDzv1I8dURVj4@=_U<6wGw(4G$51( z5%qrHc3=}Q102k25cn4O8aPyYO6|q_){rDVRZ2NIpyMiFGq44i1}+3H1}*?*fe%Y5 zd(>vJNX#RzPKQ_3ePM;VU;Rlvte(u#;%D_8^&xd#C8vo|{a&v=qQ0B5T7<0Q>Tl`~ z>SyW+b#HPAE=$W6^$Ycl%CIJh#Mq)ftiGUrnPh%fUs5lvWL%^^pT?WSVot2xnzGi_ zB-P#O=SwBMQQe;7KxM$xBI`D%F@LCs)VtJeDdVWROTA$c8NGDUo9g%K4)xw}LKot_ zyzWd-&E)mfDy>R2nhbGozE(Sbb2{g|Ho)Q8nq!NzepI*; z_!Za+d>Vz71?|8NbJlK?`5py#1b9-t5xBOLa!a=eS2L_~BpImGXwTk}X_nHEc_e$$xPk=o+y zz73v1sW_Ce4H);|bqHepVA_p^^3U1@*LO;dwTx!OyXAU+B|lZlaw4!|-%G23ro)_- zh{UR)`4@DQ)pSI|IgVzPH(GuaY3IfBSk-RP=cxALmKP^sE3 z4y@_xQ2*?5hUgN3I9=VRzL>&~WM3%mzXHB1r5vn{%d_t3##IvUr4#DsR{%Ew+w$-e z{h&C!$I0#P)UzZ5`g?FHejB(mM+m}xqZE1MO`74`dt%H7y##VB0DG_LM`?(P*b2D%Ya0jqG4)Q=Wr*;D`Cy^#Q63+ln z0M|s+fIYyjjN*a8uHAsXxrK~a$bf#1W|yta?bC+kh@)b7KE`{g=vLq{;3?qITo)<0 z7q}jH1$Zmkk#%p>Y|T{lQEDDJ$~Xob2CmENusMBU0|)LfDpKcYrrBjf);$h94Q$AC zvKoDnL)JuOHYAtfM20kUqqrW-qU!n|P;ZGRvJmUDKsaK38@-Nl&1*DzKPaU{x38_K t^8;nr!>UNv5>B00o}XZX2_|4o;BPvH<$Q~)f&l;k002ovPDHLkV1k-h2ciG~ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_11/white_64.png b/assets/icons/guardia/icon-1_11/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..36e26ef5f67e0ce8a38700a05c70b610623fc920 GIT binary patch literal 1311 zcmV+)1>pLLP)`Ibh_XDp!(i-yXw?AU!5B6Jx8ih zqehJyHEPtTF`NihDg#+T8|H+D(Ck^W_WfJmv2?6frT@?$)$)l7AGVoUw;H%lk{o` zVO-K|YOvi$LI7)fpQJk^-PoebXOh0P_LBaVbVkx|UhMvH_mF6p=~L(hMQ$JO*O{ik zN1a>D*S!+B4tM}~1~|h-ybbJc?E|<8cq^&*EASNXAaFgfr9{7<0_TA>?QG}@z$RdW zE71hT%{_q;zb+^pWEgn|fJ2FaPXcq(33x1d{t|FIu(pG&|Mdy1G%o@sfob4so3dp{ z%Uy_ohk+^JH1LNj_;DVyHpjhW?MMN31Mj%3Bfy(}Z_4j&sT&QbR>Z9e6FvmtYmuv%!}eKve9*aIZt+@Kz2OPTn=1NA7HC}a-uV3 zXF~|nzTMh6qF3N+%c%E}>-vq7LT%fb?bqqi_hwUc#JAZ}hn5O3T}z!BGc7LSy90xg zT{K{sh8&rO9GQk3S;=~Xn4^P6SPC8x>`#?LPrs3Aak1#0mFW^fpFM#kN5Fs#ANq3u z!{h-WF?#9j0*i@E%L}E>|J@J}G#J#|-~bSYc?wiUrs3{ii><(t+yxkR0+tmTU9_3| z#&6`cd3l-p*jeElU+7bQK*yj-zX%A4>(6)~vtyXMB??m%*Pkb=mADRh2JOg=fz_Eo zdO+s!e~Y`_BWc=0&}ThT8}kFELI|fjBs&x)IV46mTkCrC=myu@NVf0)7F3CZU*Tjd zNUZ1=0a2JK@PazS;&ER~Iw9#rNk>Bn-zTFK$!Ml8E$%f72m&nBZsmaYyTgsl!(UZi zh8krmNgDAHza?RLm1k#I;>0zQu5x*noN%+ZyW0&hLY|X!IE3(3LPk{70weL6wI7po zzb8bbcwf>n*X0*UCp|B~ywD<778XAqLb%Xvn5{K7_`1gfx0My>fzNA!trnRDp7)S- z#CyP)*F6gS?Duy9Z?F&+PJa~G2^h(x;1T8RF5_ToQ)vOZ7#uZhD&4rV%srkgVN=BL zE^xxb?lB5&Blj$@uMhogcA2lFHnpNrAje$F-1KRSw@2B2&6{I!tBQ-!Kb|vWZvKs= z-I8ui>hJge9dlP6^My7hKE>6a3Om+%zs_fibVI zB2b6Os3jW4X|xCTvuHAo#4DHw+#BExj7YG{L~f#fg5HtS zxr~Y`m5hR;aR3dsu#FpNm;~Ao?*=)JdJ$<(kk~aOxsB7GC9Z5qD3yz7xPXUuXiSUN zipn>{)-om%0(cSR4KDj|YbS(9%#JVSwrFw$w2@u7Hc<8;@*d+9qFot~n}B~uEG_6N z@}ndBN^XY#GQ*>$f?z!r7Qvk;j)-EZBPgN{NuHZD*5eXpDeX^4XhHoeG3g*MkI4(f zT0u7u-HT|-rX6EB2N)a-Je&T2$U*Q|V11}RL1}^HB#Cz6atv!egm@m6rzoAwO)jSW zpwzlk`hw~mV3=kYV?)Y_e?j6)TwW98Bbp2$GKR%6Zuc_T)l5R>r!YIQfa_xtyH4;K zpovKV_X3`Ff~04oh&*S0dM@ims%d4n#$dBOOG7<~UP9zE$SSyiw&8XF;XZRy^O@{g uE&hF&`i47*TEJCsUHQ{6{U-izoPPp$s`4((USiGw0000fWtMP-;#6%t?7>jndi6~+*J|Y+hq@)3{o4+;h(V ze;#)fm%MVC>_KJ4&KiL>0ixgkS)#~hoe8(?UQSPDK}~wNvoo~v>?g~)>Rc6u8Bi?4 z;Rr_ekq^#})4e1IBM0glt0CzjG7G}f2t$AaDv5GZVEzCCdfLB_k+hk~(3}SwNc*k0 zO?%0#XqZsfU6CczyqmQ5f_=_ey41u7>T?OY+KQyT*HNmHe6Ym6uWMO`$O1&J0CCW2 z5K-OqYzSgU{#Kw!KJYH2Ys|sOM%rJ6VxBebHq8arq4j=@-ok+HBY8|HzjhXmT8e~s zA?i5_?Yl_(n?e0dVdL8Kos=9{{)9|(H4<(EbtiA>Fu? zjK2?e+AcEQWAp^;5G6KGNwo=BV1re14AHlhs8?g{UsN+e21=N&X6p5Qh?z9G~48fzfy@j;*E3V&0 zKFCE!#=6*#Do*GPzP9_w?h+A|gu_3^N^K=5qaEzOfpCD{U@NZI1-g~|#&2-_4$#*j zve%ZW(sy8tp%7%LYplZP?VKE1$n^3>h&({PV>#Im9XcNhWB$5`hLj><)}v{%(=*g7 zK{k+XoNq^fq7|+B!5KhIjzaJtndUi!`h5sj^ZR>$BeI52ud}vlevpfg3fFrAp`JoV zmfFW}$8p{Q=Q|ABDV{!Lb(5)TpaGE#Mpj#z(*Aao{6xOv<%^7pkzrS#psTBh>#qf= zCe^ptK4<&}MBfcEt#sxTO6{SieM>1HJ3xkGY9_uL#*oB^R+4GnM_o%iAuqNvEf3>1 zb>Vu?mKy6{#`T4C&279HNqQhPi1`cQ3`kV_6_B_RfFeSYWncHsX^a(!YduuX`a3FX_CC~Q*@_0@p&Zm`7V% zq4-?=ol1-@g5gErm0-L#QGJz;N6tE?6x*q-4IQgjqNEz5}-Ew)$L!e1iJ5k+FPL6Y`wRar*vJDlO(mOHceuNdk zuW8?vx8+Z=mm1FbYC7V83WU2dh8GW;7A^jzo$VIZ5_ltYg4OMt$ zJHVEqh1Fy;=OzOo9}Frb)Ltqj*WV7(MK-KzGr2v}qNU72O!>!9Im8tN~d? zS)mT$>xkWpVI^gAI`ES*C)3gT0LpJreLmDZlD3mlEatg?zw!I{P5&sq_v4L3ll?>! zA(*RCH1TDk$zE#W-y4;0`YV3pkH*;;b@zm|A72Rk6I)nG*WOe3@w-8fU}XhenHL?; z^5%NftVivwpb^CDL2Vn^^xhF2Hv^|p+d}7_{Zwzf1&L%Sktlyl_l%7PQ#4!=l*@#Y<_1*XrgP8Z&O^g;vrfqoC zdHe;);5YAOTH$&8_+4Z($MKt9#2b7N^kFplIM`n~y~m_jpiKDZN~dyr<4p)N86G$> zQatWQbf+^OZMqM%nvV2JXS_PTl4#=h_{qcg4PS6-vgrnpQk1xJvuYZZuQ**|UqTT4 z=G&YtcMMzxuq{0Qh`9~r0;itrWl76Sl)2=+qfWrG5%`%~FKfCBPkxJPJLpj)a=>Lt z@F6NcMRct@W3M!bnd$iPPmI)wi&&P7%?LC00Z(s12;EaUvrYVoFv?c!U&QvxIB>Zym|Q93 zd8Dk;xlW`P)f(UkYSW1K2cpe`AOpY_RO`bdXsSZw0>>U3bo~KlBZZz&Kl2fN)2-*v z*Re4W0?3({QD(a{dv3=N@D>rh+lgA;jq-q7ckamoL2%s)EJbZS+0389z?Fy4Aazp) zujI1`{jM_xeMOl^!JZlW(Ix~SN-AYshZ8x6{vB`}KYj>5Ug8>4 zN9#H|TE7t*4+>CXA0qvT>~cZqvVnt6*YLn+5K$IidNn+TiG}FT#gu#+qZ=Hkf%8v* z&cJUDiVe)F{1(uMiJWG6VyjEPXmS-b&6|lPyAb&l`SLH3&E)XoUks9$lETkJ&lKV) zN8FGS7QK;E8KrQ&bo0lE47>ue+I?kBV=c%Z!TTJYtuHwq*KBk>Xb{l`WB!fOM#m%j z+Z{cP2ttDGo+7QqUPsWPp3f4=ts8-?mw*M8@eDM1(~m-?SyPCpX*FU literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_12/navy_48.png b/assets/icons/guardia/icon-1_12/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a41d5f357ef5823176eb76e0a5be9e19c45810de GIT binary patch literal 3292 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_12/white_16.png b/assets/icons/guardia/icon-1_12/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..28ab00cdd95a5c607b33b4fef61196a82a928ff8 GIT binary patch literal 458 zcmV;*0X6=KP)zs;Kclc(DuKc$9zyk{H*`=SdA7m6A{z%F>?qq zb1Wi;nYkNBF^f+{FpgEY8xfECB++Nh%p=&38`y*eh53$GIF4r#ajT0NR9%^wJFyoR zaT;UzSbK<5xPq;jxu+f+j6{iuEcUB7kIPt&ZP4d9zr#{|sTU^kyzYKrQDxIIooRuC^8YPX;sy5MK@sh!5;o!<4&q5!JTz0ZX;P6OfYPw*UYD07*qoM6N<$f*=Xj A8~^|S literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_12/white_24.png b/assets/icons/guardia/icon-1_12/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8cd3d1e1f458b4cc7d9bea5715b8af84b5ccbc GIT binary patch literal 820 zcmV-41Izr0P) zlYptf8DLjLoJ>z5;@^JWj3_Vqw0cxs-ADF*^;7k^+7Dz{dwQTwh=?I|J8(@ztg7>e zf!l%0%7Z_F6A`hizP}9&MZ~(E;cC5nv-(c)OVs1)OX|&;3w4q@SKU_M?kw3i)o0tf z+RBGrQ|G8(s1r;1x9Z}OnWt`0pHLUp*=+SI_3qjqQ5Tf1fsW7=eNA0e2ESAnH6c(x zR5z&`)pynRt4wE>k;&>k=}CtdO;XgU>c?e$jrvMU`HMY5`9bl|=f3!Z>J^RdHacek zKNdPy06WzifvY3p8TCQ+81RX@HX?TXufrw48(9SP*z>^Lrij`GW&pnye^mkrSPC4j zcs>f;2V}f6jFW)_!19RrA+b@9Oa9unff4V!dd)!5!Jef+k z^HeLzTh%9v|46;ENpd1L6P5HY^&4PyL}cYWmI;iA_3G>De&8sO{pOCME302+UY4op z(fNq@r329|pk+;;D8$~PeyuJonFQfl^^rt%oy{){EUW$Ty4MM`uKIpleXsZh)y!U2 zZ&jz%Z(;T;^)vOhlHILt=>S=uX7>V+u0K%w?5KAE)9TL8z>$b}tM2UqE=I(fezT$5 zlWYse)Zq@*Q7W$6NzN@NXxYPD}#JGq4D9Xn5x8*-X0>-=eWvlrB0000BY2gdns$R0*RR5tpWMdGLV5?ZFF?XcOUq zhNME>g^9K=mL>H!64VOMkQ4yQDW(2w+$E{otxeJBZI7fwB<+yYE9vo+(&l`BD~1jrpp<>z1*`*J1f~O>1G%d_ z9l%Avv*x{bu(MhstT}KHuoUI9)W5CKVtbTSY!tVrDW%Jhqe}s^x2h?~k0JZ?PXLBC{59Bfi z+nC(O13Tg#J%2XP51gLyUIDxUdl1*Tz)X)P0$YJ&8^!}rasLqTs=p5g zHUU>>LAl66ZvmzPX970>D}eWbG3K3Sp&cGS9oLb|+Q$R#!>Y^ejS#Xj^Uz}8Jzzuw zFFt8S+B^;~-S55U0AJNT-AMQ`z}kAA1Irz7$x5xyc&9n&-UiOg&iWj#d0F)E%RX|dBZkZ+;0B+hwQ(oCn@a!Db0 zd`fATk@AFGW~HFO#3&^G?lu-|^Ed!ym4(c9zTabOBJby=l-{w$V~rWx4A~KUKT6sn z>F8W$sc?-sNc`n8I~aoPDa^NJikIE$<+)ra+XL>uk}U+S%jVWwi7vY?v_HjG&X@ES zuv^lflIBW^)QrO?`x!|0Jk~_FO8tgQaI9glE(u*izi%ouCmacdK7zYp+TpbW<>&?0zS&p@O9w6EDa+I z%KM~Y0f_DZdi^~D__mI6!DEZVl6jGSj{dN?&mJ3X-t!H~M|k|)eu0Qu8x8ziFTcQP zz^>>s-WkBlz^4`*mR_5!N1^&Xt{@x#+7yZl#b_?@T><+8+XD-ll9l@jxH+2(bbK(E z(d>Y-`#`uw+5A~Xxxo7yfs-7x@hCYFm;<~URW#h6?Rx_F%t6^)c#yB5v z0W{mng`hQt?$v$)MJ%*e532Dm05)66>bYu#_$SpWj`~QgsRf>qK(|Y8dtvQV-~-o^ zj$yqEgMiy?ZGg`;QM6Pb;3(iq2WLD=@6Ogr!+DmcC@erAT15JEN#i8#G#n>Gc%)y{ zgqI}EPbqC}SPBH$nv#pm-v9O2OoI#hSAI?p aIQe8 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_12/white_48.png b/assets/icons/guardia/icon-1_12/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..26ea9c5b2ffb447173b53d539419c58e763b6d4e GIT binary patch literal 1887 zcmV-l2cYog=mDJn5aOa zXiy9aBI1I}XhdAtL_{SlDj+*D#}uBPl-D;i@6CH-{Fq8^?t6W^tE;N3s!w$T)l^Mc zQ9zD~WDUpL^QS!_gp&WA0wimS*NG4U)9i0ll1~3BQ@{iXA)H9GwFPhrfI}9(o1>XaZn6fEfVh*$Sju(VSAW63MP4*UF-wlN>>^ZYF$4 z4kWo+Jl2uyHZ{yG(HRJ*49X60p<-`L`m`^(LyVM!HIbbcGKg{7Ldo z01p6I1YleU;n(=h^*tRxUjX$0v;<%)vjf0h03U`BHn_g|A%tTj>j0Pypa{TR0AuBP z*$20?{2j8=qwZU6y&I97MDkk~tR*CO=rQFZnYCw-JWXS3Iet^rXMQ$;oyzC06XQps zQgMk%jwHE9-#;cfnq(W2_2gFe)HQ)gUPbbC^)<^+aC4nhgydv>pOBRj(N9TskTqY4 z6Uj$wlYCl}eL%8j2E5ymd{JYUlB}=xe7)!CThB@>5ra+H#sapn{^#jgrb(u`F}2d* z>s{s=w{i_NXP)NSpeH|*pe_|&?;AA1(1g!FsrGSB**K;p$y-S-B)L&O|0>D5Nfx>} zqP6>o*Sm7J=t|wyew&ZQbcBz7YnuN|vN$o})na^KqTR+!cfq=a>lgjCi5?4^Mj)oB}VAJYYH61@uHQ?Bx_N#okf-m5xtd8Na)b+)45WlFeMK+3({d zXZsyl*y+tw7%Y|W!40;+T^a}K+3KyYceLsVZ&CfWm1*hzM{9SKwHGB^<^>t8z!}Xl z-Tnww%5@_*$kH6OIYp(;R@*39#uREo@(9Ui69RT7xy1SX3X1uALnLQ8ezy4; zO?GVt9E~oE-jNAlJI8&SB}h=<+7^)9F6+gymOhUP6UBZO{NLM#mzbxR^I#L1umN zv6bGZHmY)~r;4va1>%v%cX~H+-?qsTamkHV184!Di;Yzhuo7_(0E5;~DX(vmTTD_P zi!bBdUL|NG19hzuZN}de`%M3tP8Mpdz`4t%(Y6Zgi7wz8DQ_=Kq{u>{P1~@37bG}0 z0UxG{UrevT?f#dhNTZ#-jO8g21-7j5c4Bw_%APXt`w*{09GCbX73`!j3lqE+r`Y{1 z6(4kvyL>$4Qk>=QBN0Zc?OILTH}0Ua+{UFj$PQ zPcWXT_A#-)bG_yy#~MB&`MxT;=Y^}RTV3n5tQwEF~u93uf(aWqP@kkJ`` zio1oOB!7|R$4BL=`h>c@E95tmyxFo;27DUoP^;J-(RYsuW+HsH7aW5D+z!ApkS+B} z0BiI<>>#jhSmx{ftf&DnK>ybRxIcstF;UfCa5yFYVI>`vJeWAZDvRuxN002ovPDHLkV1jmXfmr|m literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_12/white_64.png b/assets/icons/guardia/icon-1_12/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..b60bf41a8a26ecfa0faf28245df599e80e5a1c5c GIT binary patch literal 2878 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_13/navy_16.png b/assets/icons/guardia/icon-1_13/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e91e141a7adef2e1b40ecb12b91e8b0642560f GIT binary patch literal 489 zcmV0&Ofr>ogXT`wz4b z6wx$ti5!=EZ%6j+d&wOha(*x@JM-q7Z)V<#Iha@qvgN*80;A@Si?pIbaFHn zS&<8NeD~3__wwru!6OGdk?VtdNLL`Xzzj6gjv0wUE?r8T-tqC-Tl#$;s^qGQT_l!2 zk$+zi%d)>gl;NC+1GWLse_ zXfE>lRpjQj*xjCQp+RpDliUWbK4%6dV|S;>yIx=xU9C-x0#y@$Dbgi+gNKlcqy#gR zl1$Ypi5Sn}Tv6wcE8n=YPT}to!jPgoL##KTm|L_ep`KDZQcNy0T6w~!^HXv4{wiVo z6!C_V@3}EK6ptv|-)K!7Q@2_9NIYJcddM~zzIYG_BeUmxZ^i00000NkvXXu0mjfKB?rC literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_13/navy_24.png b/assets/icons/guardia/icon-1_13/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..65f612fa786622d6e25959b6a5723bba94f5697d GIT binary patch literal 689 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_13/navy_64.png b/assets/icons/guardia/icon-1_13/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..a68eb9a5c221d3ab89c39116218ddab8f69a7f27 GIT binary patch literal 1916 zcmV-?2ZQ*DP)v&gmC+TIVL?WVAc&mP#JC1QyIrsAUIq z$^%dDVX`=b36xPo6bMl+;7>38tNp#hVZefMYBl%FbC~?|81q3!5(=siHcqf|=4AW3 z-xC8$C6C3$kon`EBR{!FWA*Q#ucLAUr)Z+6?NuX?aD(ginaHO0RRv?8N1*P#B~v0* zSK9aD+KSuJq!dlHqk@WQ)7yJ7A*vIIe1iO*2dP(&vr?&WaKUHkWH2}bNK|RA{6~!U zVS?IzF24LWql!n5&JYy-h6Yzzt~`)>(|0=f*;>}Sh=MgY`1$fvi1z|fXh8i$(pC#% zY4+;WX-PNIv}p;qUZ+|R1a%#3XjoeVB*1urhCk+9<%i5ZQ$=KNyjr;_u%(bqrtu3Q zh-H>lxlfTR?vJ0#DzFN=2C|N79a=w{fK|T$kr3%9gSaGhFHMBjFR7RORO%p&q|K%q zw7RKc?+t$bUf?q^tBjo<0i4KW1bs3?Ewii?s%R7;9A>%lS4KhYo9k~oyJWx5*^BJ1 zirI08YU_w06f?-WJ3J)Qrs-LU+vzxvpJFo7N$1rlxB({;1{f=l&Tn!yCz}?S>>aiZ z&}h5Dt)(*~40kvTwZG-?v99^84>M4$(X;{s!3MX21xvW#5O}MPcS_N?DjA@~{T;`8?yId@9i z@Lyp5*wuLM4Q7CP&%%B-rn`^UoYx6VP6+A)9f|onqPBsOx429gg6Eezm)`VsFMedv zNbS4$^li_@Wz@Q*S2=jlr^>JypaREj#3pc2BKRf`9Y2Myb;4#qR1i#EU1>1|tk*Y> zv_)s(KeRzd85SfX?0+z8^$2Ux$X}dmC;f-hw<+xSpOn{|0=~`3h|V%VbEOS95r>*KEcvhG(7DH zr?;MKC_O{m6d@l9wbXvY-nYjY3Q>36qKyh0auO2q7$$!TF#(Mmhq?Ik^KD^fV?ZfZ z`;R{LA#~!m_{9U%t6$*4*rAxwF?;qSl%}x27`_VcdIeM7<#4AM6 zJB0PexN!C_ZQ-UMsp~lQ_vqJ(G*^E`ZsG|VtKVYf%=Z`;?9{sQ;MNS>CZ4||%pds} z-t@20u!;!}@y1JUb|+3qn|NWtaMEUilz%~f@=2Pje+DVXR5lXpRzyRDaR-o|X>SkX zB8s0yV$jgE--nSR#@cQhvtQZ%qst!vc?2{_JkALFXRjqv)V6DRn#_|2ckU9;t*I%cwXTM82X@BN+t4Y6ruuVn@?T*o&9YV1FWtJ%bE%SAxwpAcjyX8D|S-%SZ72&k_ZNI3c11n~_Ct zZ1A)Pvs(39Nfn!GZQ9}VJbKHx>uhJ7Nd$g`M6WSrPP24swNJlyE@bQV`uDwS?c1jv z#`C7(@xiL?yQC~GT01wE{1{`5F~%5Uj4{R-#P}bD!0TH#yl=Ds00002!Df zeXr~Li~>o<0x&c2Uoh|L6(ubJo4~O8lU%uXX7-Q)EsP#;3LF6axK}xq@|UD*GrN-1 zH8UH9V;gt@ZX!ADwTRnKg6V`oq6a*i*&TBr>9{g#Q~tiwa-B|fMvbn@Yg5iqtluQm z7=9E`nSac9I7dRS=Cm@#0kA9SJY&nUvafrC$f3nyE4tnStA%Dttc>n~JxR;Jz_T}i z3*ZuXiXf-?2|UJmC-$*Q;3#Zo-eCoJ1@?i%60`<*7sosBQKWfsxAn&l5u@{joNsEc rs9&bP+grZsLVw^aOp^avD1Yg1O`&!K;9)F}00000NkvXXu0mjf4SJNT literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_13/white_24.png b/assets/icons/guardia/icon-1_13/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..940390e245f430c2728279e25dd6f10fbfefc838 GIT binary patch literal 512 zcmV+b0{{JqP)^;u+gu?@;*|)pj&NuVT>^`{fX8A;t&)ZY@lbQWt<{3y%Y?8DL zYy&@m(zmME6lrDMu?xTt;N57^Y=kKSnDk(wo6)jhh#yHvEQi`lY)xKJQ9ns&T26?5e%Y_hqnlFgpo9ya7QK* zc>nh#b)(2lS3hAM#e8CsEt`J=1oq&JeblJCOIN=dJP=fHPKI~l$e(Rs9=fvfoL zg@nUQ!d85r18*fA1K&~&R)9~y<8YWuA>aY98xAds+OKv@oE-p%9)y{FP0#fru$esz zd0mM0{253uXl|)S7MXrzrav6UrJ3Hb&G^@OXZ9D^9=b$q&IFhM0000*qWG literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_13/white_32.png b/assets/icons/guardia/icon-1_13/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0a372ec30dcbedc44cdbb264595e2caacea7c757 GIT binary patch literal 682 zcmV;b0#*HqP)2#g!nwFs?jqmp{DcCCqC z6kzL6%Ucu-fe&Wpt3O>)$Vl=|SZqfnV6koij!AkEJ)vtK=tUpc1KevGY7F1b;p1-NMvJIj>oYZsRZbGVx^88(V8S_dNlTOlEU>ERZgbT=^ zri+&3+Tdh216Ry!y0Bfz(ZmQ!%4pOfEzo*Fvmf=6Dn5;Wf~G6_3jR<00_}$fWRZE0 Qpa1{>07*qoM6N<$f*08_qyPW_ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_13/white_48.png b/assets/icons/guardia/icon-1_13/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d5a80b01ea6bc2ada3851a938e176dc5b04f36 GIT binary patch literal 951 zcmV;o14#UdP)`(qw6F_^ooxat z7Gj}b3}_{Yn(Tfun>jK$p8HsLmtEui;OxD7@0>aFI&5s;KJbiIIx zG&^EIveq?edbGaeOcoI#$q@kC3g)v-*~HC}1P^`oQ$#+s$#=cxBu|oDVt3JuMhfBi zjF%_N60z{%*=7Lm0Xzk88^8|$D`u&tvlt^j@jV?)Gh+_i|GM2D2QUZVl!(letcyqk zB^0RX<{`NUz-s_I0qh2F8Gu?MWew)sXDR1t{80WcMdT*QF92?d$Slbr5m}8V48!Se!XB>`ypj@I(ijcExZH3Ig$?mteV#|k*7cqtYM6vh{$>L7$lDY zc&3}UO!_WTAV3*yQa9S1KU~=b)Xi8^c3%o*6bP=@yt+zK516hiz_q;H&KvFPJ+1m>aQb>@3M;oueOKZ3t8vT;n@wh8^uxfe?dV z0bB%d)QXF^i18((7d{mdzN8F1Qem4@5Wr~;Wy@m;M!DIp<58G z2S{E5FsNO1RB()r7xb|8?QIDKQ+45hqv}g_(oo1j(@sB}eV~n2m9}PLf=pjmvw`}-m?7v#l8fF!a}UhMZ1()!6e$SPE*P@w|a Z#4q#cq!%Kq#bp2h002ovPDHLkV1lU4tEvD1 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_13/white_64.png b/assets/icons/guardia/icon-1_13/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb9524b3504e8e0a443718da30e9f7884f8c7b8 GIT binary patch literal 1217 zcmV;y1U~zTP)-XlnogJchSiXeC~h!?-&O}vOAB;;T~PbPsJz4|AJ zSqL6n10KYKCrGn_{TS~qTk(eAQ^g1>5H&VqA`4*el$+l z*5A8`hSHt}a0I|10B?xMC6YZ6Swd5AMd|7FTavd)K7tN|WIMC22aHv#NeF$mIcivi2p)&_eX zz!Ly|1MqJo(y^$9&wj%3XA;+^7?Lt={&P|5^dx{2BtNx{QKn=m!5;GA%o5x*!ZRZB zBRU}V02Wm*+5BqxDXsxc7nIs|w=Dz<^>b8B3=0(2tCT$aO)u0b;!6FKy(wa6E?9rK^wHg5t8WI6{O}hmcPNxhSnoOF}9GLQYMldPc~*aJl(25NE~Ks zjRAcd__~PP!+i$H--FP6ZS*qRg#pefyFX3xdM>AHpi0NEqTRIJHwuaM8srC+}7<)H8rLj-b(Ui0C%iZEzUnT#jw7W3n97H*7LB=&lc}fX!VKF z@@gcX0x)M;;mrcwpch1Bc2s^)MkGZa18^C@0RXQ6_!7WF##J{Y9F0bH=pQFDgbgXEko z{!Ob>9iaKasfI=Sx{NY#u+~wgZN4)$f3*$=t*+Wsa)r1i*QQB+Wu4z|Z(mj>V2r3N zEz^6((&h6c_gmc>_g{j>&eF-B12_rb`@q)sqdZ*dpo6aq+YE*_?W~^TcNvr31K@Cw z;q3?BXKZdmnz3Hc-TvFw@|KzMX94^<=xC-%N3oeA2sv7WZWUC;RqSfc|1zu&vQuK{>b-QOr^ zlH=l5{RgB1FsVPh@YGn&*j01zdPd7EfQxpdXLa!f7~%?NDxR*z2dgm9H)ZDw3JMAe f3JMAeu!{cys{dMb3A#3I00000NkvXXu0mjf8Y?|E literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_14/navy_16.png b/assets/icons/guardia/icon-1_14/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ac30e892597fafcf2c1e3482cdcae472af63132c GIT binary patch literal 575 zcmV-F0>J%=P)L^g(pJrmfL+J`!-oFMn!O7Vc*Pr=goY-^WcxBGIYrP1y&9JW~+Ik zAB-}0`{>^?<&dXd_h`3MYRySBT|%{wrcW@XT}*WX`{Nx^IM`1&zXi`UFJhBLEbkH1 zMZ7w27qM4Rd%4IxP@ujK4(2h*HI!|PoEIT`He95b=S^Sk7pyxp>=vSh!4OyF0n#Y4BkgB`SYL_?R z%M2^dG26I=$RfxFq95tBp5X^&CVSS!H;x%c+)S{5a2C-qgf^YltCH)YUwO;O;3~oe zI;{seAK`$gU?|=5J;e|1gKS}TKV(=rpn@MXh+^l%|6xdB>gVy_qvFDb3XsG)4t#a z$T%2Y%*4r=6C3lom2aG-zvoZ!8^sn57Z65ci`6k|%>^{gZkWSw^svTan8#n)2Cods zX{Iu1-7_d&oIBtL=P>1yq_LtVK}-pfEIvRy4^#4x_zUZgHVe%E+E0ET)6}Q%FXaFL N002ovPDHLkV1i2o3d{fi literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_14/navy_24.png b/assets/icons/guardia/icon-1_14/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..508d062a01334073e379e91c3474d8bad735875e GIT binary patch literal 971 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 Us&5dc8~^|S07*qoM6N<$f)XVjP5=M^ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_14/navy_64.png b/assets/icons/guardia/icon-1_14/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..3224a314e18a36e8f9dbcc4c797ce07639f20faa GIT binary patch literal 3131 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 V3WhBYT7v)p002ovPDHLkV1nF)FOmQN literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_14/white_16.png b/assets/icons/guardia/icon-1_14/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7ca95120fb06c0787889442ff996370b0fabc0 GIT binary patch literal 444 zcmV;t0YmVLUPe2!$njJ6G2ek zdQTjk`}XvrK?4`&&Yd%J=FEi)%(nV|o$jLizpN$NzGnL>|1gaQY+sV}%l2L1C2$O^ z14qCeU`Nv6+yedseh4fApMbEr38dgIuq|n;{Z~Q?FC@Ay6j7O6IQ8T@6ltr8h@6w8EjXNp}bIZ z_X<4Obc!!2LVgFX086%?1l!fVKNRizlHQdbgN#*YP_ehbgD?a>_W#PM*_YP)Tb??|ZJ)fdS@ECo!FXSJFf?jhm4p zP&KnU&?BjCW@C|%!0@MGX8a5Du2|Oq&w$6k(vE@t0=^k|R^1cnz!vP65Z#xWY=axs#dw1P(|#DydJ>fTV6oizW3-IwWbH zq(ze6dT%;qejK<3%m!`%XA+;Yz;$32a1nR`^m%#m8{`_V#_vJkGB6hy0uIM{Eg{ek zJPZQ&feQt}78$1pz|~;b13Urt=Cw_d><5N{g}?xCKF2Ep{A%6K!kZOp83DGHH7-lC zJ(|4)I02lCTU2sK2fhZZ241=h+kuxPSr3dDXM{7wYRxN#7+6Ng6h@_uj-% zQ_~D8_VLbr-bs2T=}}rkkh_)ukSf^I;vL%7FHhwMRx?K~C z23LzU0IO+SymQUhv(o-CfwTSQ67&WK&=*OgapwC`N#mK%c-inQOW-Qn9lhw1H0gUu zn}Dssa;>Bl$?aV4J0#uC!CLAVLA^1G2_J8$19|QJ%#%8E*Szoj-DgQ7F7GyF|36mx ir(cZij=|#NO6?b1c?&(8IGDhm_b3k7C}Ni3={++_>d$hf{*&(NBOE_ z(u<1FC}R{AQWR0yLy=92$jCI9Guh1j#hTV>_MAC)?%Z)QJ81FA7@27UuJ0?&sd z%VVt-SPN_do&wr}Z?k3m1>lA&PuAR_fiSopxB?slE(1I68Xd-Ae-pS0JQDQhz$Y<( z68IYU2-qIHcYr-pIgm9l?66hLYy{XP=~YQfCDnlMB)u=mA^%d+3Q3zJeIx1DP%&51 zovCb88W=Y-8wCzYdREe6Ne@W6Ea_b{+i7NRNa~jKlO#{m5=oB(U6T5p*L41wc*Z{f zK92b+;2Q8!(AA_iUXQgWf<6rl04CH#w|gg11^*W zR?m1#jBUWTz`>xqqOzCOizabmHE=ya=};8rywpaSaf@*w@IA0Q=)J%%&JQ}9#%Wms z^Z{=Ny)SgOr?w`*9xZff9Hni+KLA_;9&BX1#EEu4DZu`q-vU1Mt~u!vV_fJka5m;A zfs08^O#8w~Qt5T{8E_)#^KN5OF#H|8d*x^P4DbUm3~bF66%1I}udruK26zP+0=@t~ z1m>p*Wd3L7^7wcw;PI8JhaE~uFNVCs>`ISHdQ?(xVSgpjIjJRQ^{nKel<*v# zA&&$YiTlFyJrqbZ^<~Wpgj4xb%VEun#3OC`ZCGirUN;X>NMpaGsA|pXsZ3#f>^iO^ zQ)Xz=aZUC!lN8|V(XsqT0(;)c@)V@0DdTG<4zx%b@Yj%}k$=2`o04vo@NY{REa4AI znm-c5k@sWhZ-AA+Gf8UQk#&-e)H7m5M&7C7`t8i&O!nW2 zUu%+EAAgU%bA!%hd~c7L-6(d!`{JuxAo+`Umh9B-yU6qJFTeafB^fykjsO4v07*qo IM6N<$f`ON_x&QzG literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_14/white_48.png b/assets/icons/guardia/icon-1_14/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c8cdab2eafae8667277c898f3166192e98f22e2f GIT binary patch literal 1255 zcmVZDh5vddv*gcAB#GLtlvGl*0)!}^KInJCjIWY?k-}%5r14jylC6W+ugC6-0w)6Tr#9AHcQ1NuD3TJHXqsqCf~4 z2eK!|x%jt*B;FMG>&5#}3S1V(_RNX`0sLve7;qR^6UK8M+y^|V_swDaQeZ;-H6axD zwyr=(z@@-G;5%SdRt(rFU>n1lJH>k{bbAT^_gTTrn_!1cx$$K9I%R?@?L7aAqx1i|)b*nab zHpH=qz^}4i4yC@93rZ{pz6HJq&J}M2cwNbTd6lfX;PZwL3jD)id>t^ZvwKv$ZVkCv z=3?Me;CIidygpRzje%z~v3x!T?+N2KXLkp0)NaCp>=A_{g@Sj#c#mbJYby~a0?$d% z4S}~=yyr9U>2#2V`@)Wrg10Fjy|tB)95 zLrM%6PP>=FxF6G>dF>eJg#g%->kFOLUZBvCx3DS8m+akVC9G*w&1)ju6j)jz-PFHL0AO?;iK{LuPiQAI_>?0|DzlVG6v z$&L$MfwNOeehb@eW*+BdN_4XqBzK@!oBRgT)5crPY=xOEHM3>m@vjZH1h4cX)6?H- zfttSc9Nj#-KBY7ftU4LMRmrGL$LoPX!ZSEeICA*K_dMRD=Q~Xas%hO?VUdo_qYVY> z0+=aT-HB~{NTp)GUPVo@Haw8SqfQR=D)y@jj;1|OC&p`U+`vAqokGlFvZvz-p(?>S zwkHP6ts&)*$8u_(<|(yI{{Xcs_TB6Y RnN$D(002ovPDHLkV1g?5X;%OM literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_14/white_64.png b/assets/icons/guardia/icon-1_14/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..7c891aa8997d99e72f29a1fecab777dd8810bca3 GIT binary patch literal 1757 zcmV<31|s>1P)w9q#IP}NJ0MgXX|=cC660D>tDU=e`1d`{$Om~{Yw&&yHA_5XV#fG!W9KY;tF z_@@B2@wtQa#EcYqO~R|{uEZ~;(gJmtKNi5VRQMwR#{oDKz(%$$bqaSeLbDKxP(Flk zNR<_lbs{oFMAnPQr6GhJ?9(P9Yei(Dh^!Qmn>ohDo+u)-MdW~p95mJZtvmqNv?>5#J!knD^#s?)VuE_Z8?Mh_7dP%l&-lKS%K&xdPXq8Vg?$J>KNk;% z0T}4U3HX9v3)gwg8=3LmmhvD^D}34p0B?+;SIF93`qy+7~ENc#i8%sB0J>;59nwBn}72$Nmb z*v__}^y(|+tEMD?CtYgW7SZo=Yy6y8`EHCbgWH>8c|;orU<+w?1NcRkK;hdU>dFmb z(xP|=z(}^MR}2O41ZnT;w&%z8z}MFH1eYG)%ZP7FWi)^dE;w#3GIbWG{0IQAQi!zx zj(4#@Gru=Udzoo)s&l_H!YBZ5k;n59|B(PbAnjYX)S6pYKwY>qn4~D~@s%AK=0nn+ zb~`|7;T*3a0A3<5&G(19K5FDwNYm``n5^%~1h)>SxL~w`Z8ihr0enu{1I}QXb9LwP z0|2aXC&*E352WdP6t4p~r73j<)RmtJ;4i-LmMBVJ4q#^#!H;NdIwL5bl`d;MJCf^m z(!SF~t5=PH`Yg`k9bQ@{FZ?$8G>uM>5<<+FrNS_B+y-S6yD; z31F8?Vl1z3=ZlqoO|QK8zjD+nLN1#$%#VyPmx+|-66fcZ1zoLf`M4$>6C>r#>bh@V z((JmPbNM+gVOki;G>aah$L9-j$%J}_cL!gx)n#`k#GRz+etlN17v+HSgqbcFFY6{y z@1zl~FrBix{dq3Y7-2L<-p5FL&qd{=kBTjyP?kq1Th(QazmqoI>(+>Qpa)pSwNG7+ zG|lc_B-2f-)fK9IH%4gVp-Az9mD_aYxlFduP?aoRP~rV#SJ7GGvO6tQKJEo68g8Nj z({Q-V^J2=l!!6xxxd`g6G=Wta!&9{EY9F18h6~av!}|b!1+WfXkuL~#<7O9fy?5{& zt_E1+`xFhIW6%KG=n;#UiqGp6`A}aD<`E~+x@)rJ-nO--z0&Y=&*lL`BUu}|ebT5y z2%(dVK*qT~K4kr9k>f*0t*`r-Qc>9(4NB5*rV)&B2AQ06|DNP@unJ{NbQV2BeO6CQ=M0 ziHNSxuS7(@2ij6XVDfw3;&yunkU@wJh4Ujkj6pE+FXz=q{vw*+5j2GWU1}> zV44XPDHdrA;J3&u$Q1)BQeG7DZ;y(UPbr)EREdlmW7}%e4G^S!1}MD;BsmPwDEssM z3-tg)nf{lPTb9ZZyfn|)&awr}iWG}1f|fQDtngl|$?0z`6!g@Ww2)$qw)q68+JL|E z@`tHhF(8rr*w1wKaBf|r>Gwqb-gTHU)^}G1{xxX*UveVJF{a80J(4H4q=EHSfw3Gj zNk3ijFRq88F*@7(cyw0U81lEHu19c3>LDVc-z|3MSvDbUN2{{%PmP;d+$a+^ipY2~ zYT9yIl9oG_SA*%_()8=_WD(ipsxhI5{n?)V-X0%be5uTi!sh<*9&bl$yKB3C3|VdU z%e3XN79?i^!JtGT7UfKow$kZEloQ5$uXjzWi^%O+j?8=m?D>JSmM)wPQqdLz1e zh^Tn-rBj4OAegwNfHaOhALsz)PuGHBNJdB4V5)p0(~2o$Fw<_0)*tw30=QR}ROB*m#FJ&3I?i%B>4ij6>;tilO57M6K$W~DLFy}CR$5i?C79s7Ba-q~uq-Rj+@{1KsbZ^lLE_%b%quC}> zZt_gWukR&md0f0)t?=RAk7m!*#Nvd;xBVaf2hL{b(?mBf_y7O^07*qoM6N<$f=)9e AN&o-= literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_15/navy_24.png b/assets/icons/guardia/icon-1_15/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..117553e776f507c3fcb55f6bd6b15c88cde3ccdc GIT binary patch literal 1133 zcmV-z1d{uSP)9(E6vuz(zL_={5D*GfBr1>~U1*pA#JH#$O_Ys^Iv7I~E1gmBBSsdkbeIKbbiu+8 z%#?~q;)01w(VZzK285v{q*W6n(EusXsI6$Rop+A8_YH;GTAFy1m-l)8=iLAKpL3ot zy(Lf-a(xo+DlG;j1N`xSR?(5mMgRFayeqovL^g$Sr4onhY+*i13z6L%?ln3~!;D@I z@A`GZx6^arqbe!cLI!bdh%}&aKgI>j1Sd^MY5`_38h=7}`Pi7vbsQvI2k`t3kmW>C zC$Y?ccnM!C^Gr|;Ej2YShwKF0H-l- z!gK+~Da2(#UqbW)L@ouJQb`kx$#!ss$84d5a0%lC*i#^b#G_?;_V#i2=7ngZaP-4| zvV~>9HX!YFg-I6CMyeg#ugyu~&2OzzQ8Ml8z?M>zFTkFr+R;X}`867%p^VX~A=dp2Oz)s;Bt3;H(1<#EzMq;CU*+_h;AY&X8!b0&#M zTY>unjYs$O(}l9)xmg(JG2KDLZjeI2s@F`&Se=^rV1nvgkY14exabBDBU|t^fazsS zhU?Nzhhm$VY6LleaT1lefpm|RP$a3kY7BFCg8mHdHf;1ux<5WLmYYvI(>Ty| zAv`mxJ zD8m?vis50#>L4^OAl7pT3&9Og`{Qf6J5ME*DfPlBc{+YUcm`tw+073nJQsx{o#(0j zbtuT&GvGKIFe@$Q3oCKpIDy%%AU`1ukCJJBfOXF=zS=sxlcJ+q9;DjwB(e4ciq>3Q z!0P;ihP_rQ-hr3YfhZUvLkTtJcd~(@XmEUw@xjz{(zEwsIBRVPmGzh{ zhiDk2#>w5k)w^(T0F_?93&FYf!M5V;O@!HuM56&TTWG#w5S;nzHCq?al1o!94g!;)^#Wsw^Nc=hGUPQQz>duf8?`T9LPVPCw>Svc=>7AG;5g(yEg4r;~ zJKnmsRgCYZt*t4#x@xS-zk^5$<1>VpiBkP&{4MBxAdNV85ab@TwhT+Xi_{*&WFE)M zFZ_EpOq>T-KFAbaMWhv%`V`X|#LXzPgQ~=SN8AO>3B(%_>)}{==VUWs@`01|b!Bb) z?ZoL#VZf*kf(~L5hk}B6Nv9pzM|bD<(;YYycLLCoYoKxd9f&oD_Uv_@n(+gNcO`vk zijjG}B_S_U1>sx8lmOFS{tsi^Z_5NaCR_giDog0FdKXqm00000NkvXXu0mjf6Vf0C literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_15/navy_32.png b/assets/icons/guardia/icon-1_15/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..82bc5621de45d7a2786fc5bb6c4a874f7fb4fc47 GIT binary patch literal 1641 zcmV-v2A27WP)d zf6nv1=Xsy+^FBY%f&Ved)g8+lI*tmbPbcS>EKvqp6nZTGJyKz9KJ%7hPDZczVsb@N z9UUG615tVH2R9>T1sW|)w0Psd5r%t@&3WeP49J_ZTU#Hv5pTig!LCC^(dciWF))Z} zM$GjkjR%qNaR&Qey-de{W zkWn=HF5!jq)HOVf)tf*!Fj5#V>zqZV>dj-p)`yxwUPSbl4DDKvUG#0l8wE~K)J{eU zx1szDbd$DWwq0CDBz2Q|pl?@)b=;l6L; z2S-4r(CB%Jllyt0@2Ha%_96PL_!tAFKk2 zb=-qL{w~m`P_|ZJkv8DDo~U$-k03ljMz^8%5k$XEByqVZ&tWUdDeebCs@e3|vW%q; z!w<00cC2m#(+j%Vg&@YNG$0>8m2>}iKdMC_ZZNCJnEedz9%8KUn=(L}G;X;vE0Iew zV}*kZ6%Jv|UJO|pmc9mryxR0$hgI^Val%PJN^i+c;;Gby2HHa*uealW-gS(SkRWU-f7EH72`LCr* zy43mnAj_>=c7QCS=*5XSj_M6*OjD`Rc~6Kg#ru;`ynxt=%Ya>+5i;g!;CB3=o1;Bb zGXmQ+@lbIB?CYq8c(!UQ&XnhQ5`%HjJIRFq!g}Kj_3lXaV;9dPPASgfLUc>lYHI9$ z+JY6lS@#7#b6rS}Bpw^?iKpW+vcY;ZETVNw!0u0D8nBUBS87DV0NH<5w+b| zJ>?W1h~;M|qXUfsI=_J*94hJi1KG|;DlkeU=|x!}u4_Lyi1G@f zg^l=~2M~D!8#NH>1H9CKvZQzwYHAtn{bOmp7}x{e8HkoJQdook;7-)s!D!*uYTt?G zG6Mz%k`ijTbSJ_}{LZHs>AM|~KjYQBj|H`xS(*EAQkr%>6hGnk>?R*E4)wDR~L8W*NE4MnYxe3$qiCI6??=2$}d1 zVWXj@_>Ak6YCps^TkL0~ za3-Z+=K;6^nw>nibuA&38=<%il{&;bPR5?#`My(go_QNc%FSlp-?z2#e0iIH&8T)R npL{{bl>C^+Zl2TC|F`sShku@Zc*g%l00000NkvXXu0mjfU{*JU literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_15/navy_48.png b/assets/icons/guardia/icon-1_15/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d44b67ed2d15b8336c29d844707d6072f4d15797 GIT binary patch literal 3012 zcmV;#3p@0QP)c`+|T=w04ov+B$7qss$y#B6Dme$L1lNL3C0*kq&o^BL1lJ=SOq+UyW=rdH+S?~^S{bK&qfYj z-2w#PLx#rSr(Xv3BvL$yPH!Rci?@2s^Ww*$LXb<1~kkBQYy zM)Muq&=vUEP3Uwj$$OuJdU+s*o-YGk<1}9FcL^8WN~U8iI%78dr~Ts1I~T!h&}Sj! zNvJGVWrP6bgK$9WO$e(#50F^gV&_e*E+rJY1GnI8GVM2$Z2V!b{XPN)1oicTh6YWn z?mC`jYQ*30palrz*&Ujl%cX4QR-QQcn0mijgYsYDFSsZS{{RBCO8-3IFs@H zRz&s|5=$S?t#bq65kDc*`D+r3uk7A)7$$~iprXR1rNzgqTS2(!QqudbAldY5N~#X0 z(7m6?$csqtT?@=5v81)v+-UswphvN0>6yLWd+{j9UlJ*vL~8F7bnLi_jm;lYR&yBz z#Vbg+Jw&qc@_cMU4o!T$AwG*2zu6Msx%)CpeA(>N7!i39AxcT_t4FCqMs&OkTHwV) zlvIYPua^jt2(jAgwRva08KEVQUJKeKweM#LKE;T!Ynd|l6k3-)MCabi36HppXw6NQ zcq71rLRYXUn|mJ9uh&Ft=G*5fSD#4vg1yA%ufmHLxV>jmXTo9YL z5;z&rUd9W{w-c-V3&`N`kx92siudzD%YB21=j7PR<~ z(^2E|E%8<+nu>}*Vt(o#LfK_GNjvtNL1M`U68CMO!R%pNv)1UhW+6zSBKHL{)K?*$ z6HxkkOH0?9c`zVozQo6ik3xpOf#12Db&YQjt-g?gPgJ6^%X0o)LzjWo%R!EL41zKJ zUmIU<{tOHgLX&*59Y6bX3P#T&T75Cerhk!5Ex~bbwkK&E$p9MDpMi>cLx@1DixF-S z$lL6*aBe5nwhrXiiOpY2S=Gc`a0^arU~iED*^~El!w_x$w2{7GYVCN+=l=oeEF`_} z6@;@WpdoY{(kaI8__7sPK-(}3oI{XU3GsFOPLp`OLbUo^-0&%+)0dDIQ6w)RLPy(i z^$ZTJUC={#x?7CBXk1+kyhWycCc3i{H#~`G^_jHZ^Co_3J&4)+(bfxnJ%$M$im7u( zBb=Ei-{dF)@yvBIt^Rsd%N zdpm!^2^XT;j_XC^fDBYT7d$KF;b#=edD)(Z42?&KXRRj~yS1wZ$S;34$y^?zXlck| zqJY(N@jSwrz|6VDHYL$YqvY{+q^b4>Wq@;X%ZXD_{%+PUc@H^ajHNa0Y_?JPsi#up z4eK_I5exS18=jHo=Cox*y3eEib~5rfl1*Dt**yq3&5r3)st#sgW{}ZO0ojT6pX)bK zK5r#nyor+f+))n)6++0s*b~WYkL&D%%A5=K;tQE}%}V^tBM2Em3p3Xs1FCSKse^k6 zVWk(Si8(^}0Ht=I_!ouShE|^=j|{#m7UM=Hqsnlb+`p{1o>9ltqqS-Hn#$|;Bls1vzpYNFSG8K z?{vqG9t6KzZEF2EGrv_#=k9mV{`MYs>~u2h37FPLfHgSbk$APol4;)#!bj_<^%Uoy zA0aQ;@bA)k-zs$b6wrqgI&2+fRi_4d%>e4;#Y1+F_PuA~IK`;Lwox|sn4q2}(TBzX z7_faCBM*Ort)vi>S^q#A+J6J|ENfs}i?vOa^RWSA^oAglD}C@@6hSM}`RxD^Rak~j zJX+Aw;Nz&XQU1SKcgJpUCnBXlWjFPraS#MVRm>^Ci|@j#Y063FZlduI1~tOr5HK7d zcJ+zFj`!lP;l+QEi#xaD#dmW4!mg7a(hF(p5n7gaqIep_MS=dSdvL=?;Jtkw<<*lY zzvgL5t3EeeuHGkF2OB5u-`tO}SWP*nFI+`gd=zyHdHm zhESp2Xe3lPj%eMvys+#g{Pfc}g%6_L=SOXtXZ}iFa9J#Ok+gnakMP&3ZVJ`%E|bpOutSu zwJHeFW!1McZ9yBQS5LLi2VJjrLv+W5@;OHlo41o_&0_oPRZX*dd(~CFXzIVf5KI{L zh}HcA#CUdvCi41SDPnc2ZQrNk!^v!T=v^z#*w*9Gp$S1%w!e?>D`{J9YRcjxXBEy=yuhkQi5LQ}#i!-ob6ax+|d({%oZCNk*lEQZK#F z820-VjakEK)hAoxba*9NUl?SS`>)wmxa3fAOCUwb*|^S1Fa`abqZl{kc?89Xj&rS$ zyno+`8<~Qixzf&W7?jFke0f)2rnGuCMWdIK+7sx%7axNYdJI2Xigcbr`Qu48P7jEz zcX@xKWD-7`M_+5p$`f~epOgfkAU&qwfCWat>QS_RpgNG$!kwH5E(C4`G= z$h7^0MB_K}y*J3es_J3ltH{s;Aa|p(*O6>ok!yfWK)R-OH3j%Yq%+bsb<%cC#K0hfhApES#9SDrwm_->rYEHWLf zpl>JHw4&FBrU|ApVN^(=~d$(JPtoQ9?eN;3P5i|L|#U9?4b3&H;23^{NJEn2JSYm z4n)vG*+0epKf37dQLp_kyG<2UQlf*1df;mEF+K+WJ^TljipmF>D^*wk0000Nklq?yJntrb-3V{J(zz zq*B(v8R{XhrY4WSD*>cZ7EO=)Ac7gy7=7tKV3iI<z;UiQVzL<}+ zSAhE|nfm|g?obI*=gZw82(jxK??Gf$dJMLGI==rM@Qx!kSfG3gf4wM?-G8}_Ih0s} zluv;-k0lMSZFP*l5djEDNeBt6nsgRYU4<1n6*~q_7JTO|1TUfZ9HCwW>tj4eBCSA6 zd=5rZjbI3hlaP@SL`uNTg6A{?_mG+KL@=CQT75KZ;Dqladd^5PeG0;!MkMx4d`}a< z2-F|(BY!};Ysl1h6xHXkSC>HU0P^nl5aKNC*ojCR@*N96-AHD}ye-E5KM_E6olWyJ zm!l@`N6fkvD_Uy^b+gZ+)E#6#pI^|5E{wYTU~FZ9I1s$UKx!IR;@cnNdoHif_^|gN zb&}-TlMwP>v7=|>`{3srvD}+@b>?RU8oqo1q%6Z+qUM_j`4F-4gUPk6##h(T+VEJR zS>=>6VkD5xMF?>u!af0^`4^x<*$6wd3m$mxD+sj|Vvj<;wU^e6NuP=0XT&Qi$+mrj z^1e??kBP&2W--?O;!lY&4?-CK~+tMPpoFZTml zXU-U?CWswoKJ~ao)A=4%wO11@xf9Rz@SHTQ4YR@)lEkFR2>-`K%Z8KRyaDAujI-s)-}8qW2IfIn}7N+c5(t zcLT4_-mpb*q_J|ZHxca1p&Rxo-0Nx7j-EV(sQ(-6*u}=SIGry-ZVF3gy%P%IyI9dD zkai5G^9ouT?k&)`%LR}ME$-;rCo2Ohq{|<NfK9)qf&M-m~J(v#!@5=81C-u4q%H#_AokaS2qGc!G=BLuqFaf9I9AF4m z{6Ed?YiR9rbC)3OD3+YVF+bdoN*#LF$z3Oa>Uq+{@*?{y;$;WpWpAgo;c4@1U8uKjgd4}9G8 zk(u!ne&?w=dd7wRxK?`sXH9v^4v1CNs3a4)g)aU|AUW1i_{=X5+qtl}tE4f$u& zXLWVA*Xe(NZ9*6!w5?f2Bt8N^cRa5RdzE9?4#Qz7k&?Y}vI{``l+1mBLF}!{+eWhX zU7(yyLzfVWNAl96A$Av$lGAWHKF9J$vG{;BjQp&UxV0Q7x17T_R&9}%7p(y)qe6;J zpN=I`GJ+J6t;aAIYDCXs%IWO{H9Art|f`xfhoOrO$3g2{9P zk-^Ilj3nRwG?CJwc(T^ew(R~laB|NP8+0_Qh9(X3J!6le1+Y$+t#k|jOsuFv$j8h8 zqpsQuAuqw{{EWjlUIOAs@@>CB$|JG-@?iGsiWGpdiqw@Z`0SO{eIJVF{1)5&211^P zoBIO9c#fZ-#}`Q1gs>ILJ8OF#+FN~c^2t8U%>u+3xSfIs&zk#I?nEM`!^ySX9jcd3 zR(?cf>L-D}*C@99r8S^v2?Pxn%xVKp>)8p(^rJ)vO`&u1IN$}~IYYDHbl|2wF1Q#C zsFTK*j;*OQg$XbJ7Ov8+NW1%U4K2c-W7JD0AzH-(=D(yOtF9NOEHic>n1=$|#Chg_ znT{5{C5Y$<#?~BRc-cx|B>U~Zs~D-oVC<3zO1xy!QXSwRDsi(NNOz@a(~KYb+TxAh zPGedyX7jXQT&Lp=@*N+8mo$QDo~=tzuM#aO!IwjN@ze)$o8u^s36d|h#$3nN4@26= z;Cru{wAUDyg1Qfc`JEM5;O3V7ZZoJiu%csGHROO$8#bGWQTg4OX3+vz7aBmtSd-QH zJRh`n?Vy-p@_D+~R&jCn)-mAsg|St^ua$;2Ps9S+MYEw@$dh~V)CaQve#1=*LCi=o zqJnr`OVdmGIIx`wAOts_ja6LAsA^m;xRx|T7MKcZ^lNb|gIhna{X?Glpd!;BCDqgD)p5I0f# z49~9r+|Xi)83Ao7Q2DNEv#Gaj9kQt53Y{tKT1QODA93M?jAd3sL?nDD@6Pd=Wl#il>8Z!~wxDK_(?+IG|b)*Z`-2O#RJU zw4XMuNTX)j2{QH9kxXyIirhjpI*+Q_OK5I*y2va}k*S|vxJuTXjb;5iIG^-s<_$mt z=5_tpWMUQ1`+9I`uML(hK?O$>YSdossQ(YvzJ51Te=Cl2I!eWemOMpO?Tv={VwRI0 z-(-h+e0d^DDO@k8ISTbvvx0rr_u;7s0qh&@(n>YY%)X#HxOVdRP9CN9Hw0=gU}k-Q zJ2W~#(G0ZK&&796!OO3qWbkwnHPeIOW$Q7#ffm%EUj)gHQk6y!5fRL|$0-O)A?3VY zJQXE?E-3LXLI{NTic#6c4Xg3J`B>3o`ODg2VT2XV{tjzFcX~^mO-th<$bFN1`(GKf z?~SG$rfdDW(z^wWb_9k{3qdDg(yqeGz0S~*AZ8H^HMFBX-q!H4-@8psfm_S_tI2Kt z9Q-pl{`xW_X(3v%V-`+W%d1>r2Lu@{7+@$o%{A)0&%`sr?QJ0OpyZqE?|Nu;Sn;UBOjUSKsI| zPi6jDcjcj7s^^;EN-^x6|#V{Cy?KCLs~ z3ahoU$f9VmJoop$2#ccYLA3={H8GWCztS0@KzKI>t>hiSF4Orto2b==CFj~dnKHDl z26rJb;qIU;UfXD{gIIod6h*`qW$~(sQ#pRBA~CVC`&rEe9CwW(S@U8@{C1g_+Z}pZ z7XkKE+|C@*zRetX(m3jL%|FN`xkgQP?76{Zu&2R?3e&B5t*d*zPIr5 zw_}$K!HV5uW?Qc<;a-f>{t=OqpOQ>p8|)%o9+b(-qJP9vPllS*A2DG%+~0nLj^^BZ zh?Kq@RHDM5DcBZ&8qZq?{#h)T)oy|%r5cG2`YK-bm$clM30&XycZDQHp~*KLwj6LP z`3;MRm4A!2H8ag49lUtX>3I3oM9Y3j;_~|pq3;d8lz7Ey2z5vA+Ck5qA-!ifrEH7g z_FWMsU(^#VJ%IS9KQj}NNKYp+=np7w9d75TfssS8^0^-ouQ-o<+nYoxZtgy&w|&Us z1Q5ECI$aeO7n0ljA+fScNYwn;Jk>_f&FaW&A@QVlBs`=T-$7`6PiSon($d4f6Jzi})3GAg1qT|ka}oZ{z0Ub{ z?f+}6-0OXW7{Z}ne5KzLrBzc7N4Pf=iGSZ%d#B@G;QGS3q2$C1k+Fx(Z!do~EscNP z(G5|-j-qRT#P}q#^l2h-eGKM7I={HQurDxr@>pzjJ9hlE@Zi&5P<|8Ao6l>FdOIvY zGW`OIBWbDMznkd^U&FFTqPQ3#&nHp}`OR-*aRZBIJXN4!)sX2}(HrnxALUFSGjsNi zo(^HaE~`rjIt-55eyF`~J?H6%_0Yx@>~RnDiAOZy`Ep zD7m&z@zotj@mP5Hp&Q4hN^tichVlfS3FE+)9@0^?Z(QBIy%s|IcVGPzLR?L(>?j;< z#om2rAFnq~#~+Lxn+mdqSXqSJraZ!$jpxlpvTzGwYz?EY z+y^Un6w*2i-yKi1VhCl$uC%&|yZ+ z^`U3wy?_$$BWOeLA*i(|zY`&KHa7wY>;U3i?0Cd1jePrOAe!)b&;&Rd!L09+q)V_% z(f3@xK3+4a8pJsWaU7^|L&3`Zz!0Xsmvi6vLzI32XkT-NJ7GvmAGGaA9}#y~%t zDZIC9RQ+$@qp3dM0rlLl>|3(ljo%3E!5-|v9_#_#_+MD=Wg3xHN3#F`002ovPDHLk FV1nj zcH%tEm8a|DUCo`Db7tnu{Gs#NZft9SUx{`7>VhTxDSHMOuh4f%U%NT~5x4@j=Yd7w zQrvAA_yxR?^uC`&9q=Pyp+KL3D{TkBE#MINAnAFF8SVq$1?~W!s`Yi?cNG~09s@hT zob4}?J_g%V2SdO;;C#T6R)O6l1M{W93NQwo%ZP=con;!h2y6jswnro#10w~n?U26! zHcOwWV4Iq80yqM$0YA&`6-fJ%B4P^d0hcS*+fdWD#im3`Vl>JBJ7CuKf~3PDZplwT zlsK_}0F%H_+LILZp8?0Vhk@(BK?xg;$khe7U8_pM!&EB(k`A(aNvXUH+ywT6IoX2# z3Hh>})Ap0h7~yP>+Mcxiv^vZvug*H82f+Q_P>|ETP#t+$v#r+gb&sw+%~ z?cImuwWN(xr`#ne`)aK!BsrvS-JF46J?B%;_ALKjh+g6`ezi@$00000NkvXXu0mjf Dwt&*t literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_15/white_24.png b/assets/icons/guardia/icon-1_15/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..568cab7561ccd6e7b71a50a203f86a26a7e6d085 GIT binary patch literal 861 zcmV-j1ETziP)$gTQCO9u%?1jG_?JpuisL zsU8E1APAbEo1g>67?wjh5hysi;{Ulm`8*zvLmM{VK6~%~eXajKVg|#ufOa-pH6_*e z{}0=hB6T+*(j>zdm1=CAeq!wA0x zYzHcmabQ6_KLKn6b^vb!|CUT5nAJCeHjlR7C;{LH;6-2xcu&&LwwENrGq&#qb^^n| zCowoj((dbO612$n!{v$Xb%}zU-4(>#Z~KAlEww$AJBMv=uzke##^`DyX~R+S_A2l` zu&+F~Juf+(h)0hBPgE)@3ZT+?EAR(UHG2ox8eL6xhRRw}vnZSM3xdFBz%7!_*&dd3 zF?DI2sy$%3(gGX}`R2E06Q?pAUUyGK>n%R2@_#Ida zd{y^b12vW=)FRU++XcnrJt(XDwZrcv&ifAJ_KNQ)cA>&n|HB3zZ zDT~K#e+_H{4giOO{k=iXvI0U8FFdG5Skb);yaaqN>BnxX=lT_V#-dZua2Z zlYUv*Ne6$QB>{==f6rS)C_zw2acej0m6-(=(LNz nW8h(rvVz^!zb*aJ(Qo_*r9}f8FWQXb00000NkvXXu0mjfqqUT7 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_15/white_32.png b/assets/icons/guardia/icon-1_15/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a03fd058e384c30b7fcf4cb9eb17014e3d240d93 GIT binary patch literal 1170 zcmV;D1a13?P)3{P%s4|@8fuf7B&C^HL|Gvfib!NN5g8HHpXhIQi0lb~O+qc$oORazuJ3nSTl$Yz42213n7865 zpNQCdV9hHQ5J0E)vyvuhHOLi%Ap$xgVo&jZs-)v39pR%*lGa7U7wve4WB|~pUh zx=zv@L;jr==Nd2RNblE3dL$ygsmmBjoSO?+2z&|L3rqsKfSxqUPmj+gnRY|cwvsg{ z1hCaWLj1Zty;RZ&NjFJ4O;V>l?~t@n((jT!lytwOUnD&v>1av45wU5|NMLJ$@xT_~ zHvfMdNI};F(|mRhu*mx(GSSM+fq<1B) zjEK)o`$i&=`-oT%?3Q${q@BP=lBOHww}6xXQqiQPo%bF7eHeJb`%i#7ygw7@O;0M? z$}^YgEMQLI{b%044BS`h7zp~~3}Xs>BBA$rcR|}k4!9M#t2`@dfd_%7Y~c5qr1elV z3LC2Zjgpo*!7h_D0XR$2E;pHyXM~>;i8N$4FvBt~k#xAErB2{JdOHhYd(1pj(p*Ui z`+P}jC5_9t0ef8?m4J-p-_6GFs^3K6AxR%t)&l23N6FJ!S#G8&lKybnr3Z^M;YtOy z$Yp}{$?S?IBGy>;Hc3xQ+M38nnw%Z8(%C2kNc_yS{cv^)}4}e z*!ucP;o)vK8@M(ib`|fdI#1po4SoAA$iDi&7+3*}0oK;v*La#9cn*B*lIxF-0d!8YSr`&xTJ+ot+j| zLHf0!IyPIbq>F&jk`9fC<@JG*hPkyS#8+0HTiyjGJ3-QF$3AoBEA#XX3H!QR4wz-Y za9{`U3UGSWWLhPoyJkm81DpuF2xOIv1Rez*D0Q_GlFwnlX6M13z;k{-tOZY_jX_=h zeGFIt9OCvqq0-aOfLb!%0=)12+r@azVKa9>!>HG1cLVQuzY3T?;4o@o#2R3!_p5=I zfNZ5z9q0KBU}o`utZ6e}s!q7DaHgN~Mw=SX^Ru%vrV$Y_The<@&Z~ekEbKf<^Bn(E zBwZ~jC*JyqnB@_i18uHhXRueYaG7P?U(G6zbh)G~xodne?eax54f)p1CLv#J$DTLM z`4O@GA74%>5+yqwkT;%Z?fpT9do(c0zuj)VOH6zFkT0e6E1K*2U`baf>|Nspw7#gNGmY>bE>+VT7=19I7$#z5bIrfFU{2J-qq ke4Iv`kJCXZ{a>v=0h_AixyJH6$p8QV07*qoM6N<$f;QtRFaQ7m literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_15/white_48.png b/assets/icons/guardia/icon-1_15/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..eab1ac49d47ca6647c56bbb8aacf06c83a864755 GIT binary patch literal 1795 zcmV+e2mJVnP)xVl8SrgQj%+Cv`AUBX$e^r5=2Hu1R(`!QPhhl3&H+qFSC>u zmn;i1B`ec3w=~VA)J!W)ZPDH*=Jmb4fHGiPRgW+&hT z)CqzW5dfzb|Bm{c{6Yx+EDD4o30+b}EQG)FTvMvo%DQeQ)K&0UXrQ5)buzQ=X4c2d z%A|Flv)s(qnAy4z!lBe=DvNn4g=o;<%Yo6r9AF>S@C&e8zh5K#&%j&2b=vSTH2)Xj z{R!Lw{3OBF0FMGgfi@ZI+5$s>$22$D%mkq1xNpKuCSv45u9Xn40%xY?o&t0ME&)aW zU4fHRb9w?Vi^ey=FyTvNo<$eFiYPEqOqT=wqdDgT&jH_(8(h$5f%Bquy@8MQePWtl zv4pSEinQ(UaP<9BV43i%fhoWhKtJFEV6omu`a0li&Gj{xM|AEI{*{<#F*Z;pg44xd zjPR!dZ%3!mCu6NU_M!}YUtpEizT>oncgJ>kttdX>!s~gT2#?md7w`kH1-Ktrr)cCG ztq0VX1}6a(dati6Y{04?lY-P+#AbKmuPc=2;Qb~2jDkgA<#%TH;b2QV;CvK zqt(^~2Yjdy+#}^@LtmU-+iLX5iCE7!Rjy+=(+BzOhH7417=hN+MqF z$UA_Rn)3;;NvBqrKSbJh6L4s+@eE+QheR>X)J(KF50f)vT*llI(P|{+%oV<)c;8dg z`b_QX*#tNMJg@O(A~-3B5TzL#c+WMP7C`f>?vxaryT#*5ji<`A8s{Baqo{L}h;`N2 zo$f2(J3Twams^^Kp6>z+a%m6=1+;d}D=4g0gmQd4$uKq-jboTciPa5Cyw;hS+qXxF zQD)ZH%vPIOt2`30vK%}T2%>S4nQb$(fo68CnYl9$4k2tYvz2BxHjyn~^Kl#h9e6~V zc*AeeT7#)y^Q55xX0{-T^QFbiSNNB1 zneGaw>lfJ|@%9MlS!>&rjF}rq#{G0$Yn6nxHZ#{`X;K3ekiXZu(GY@HX@@m*9-p}q z0XMDhRa3OjX9EdzGqb%Rgk5IVOt?+XB!uv%-{LJDaoOUWoG7K%S*$Z z(nMcH3P0LfLE0`0AuKdAuh=|gULm2#aRJtofP-~6cy4sMnKd!9r70O}+`uY5dxj7W znAv7C8zBd)VxCVJ_4(SwHeG<;nV6+W6APZ)=t0UFYG&I#kjMuezdmaNxh}GD9s4wm zpHX+A#-p!+?vZt#j^{CdgXdt{ScOce>f~!xT$G8pa_o$A#{aH@H= zl&w$IxW9Pc63bKw@v4LkSORQ|oM?&6s70jB4pB*2l82_xcDuJ~e7R~2&%GLG-Aerm zI^8S>>zwp!G;Xfepm!xY3+IK%<4IPT$3^Kqp#8d6T=Oeru1P)ow0QPPE2Yp)B*!~8 zwtt|R8dh#jGyPOzA(a-Fs_*%b-s>mTp5}RDV78ogDR7$bH>bKFMe7YsNINm`pm1B| zFZEMvz45g;gXYCiV{1x;zg4)WiXwc*CdP}w^r%AW4$KnXFTdA;8`UeFryOWFa6RyX zOb@kD28xE;xo5i$6^ZagZSqE&xCZzG_|b)mzPD2c?@J|u33!@}B8>M#CwosQS~pBh zUx#tWtwWvK#2LEGkWgdN40SoR@?m1_AU~Q&m)H|uI4is$Nis+)D}ch#f$%O z-sshdG?YNig&PIDsMB!p(0O$h?c)j=@x7y(yxv~-3^aj5>L|qE?ZPMHd!R0%vQ9@O zjS-iLy5Rih#Y;zZH+HDf+M`}i&OZtZg`(J+wCBHCyA={T`De1SuDpxxERiY1orvU5 l?y5?y*gQ|b39$bT{{W03Rgm8c=du6*002ovPDHLkV1h*>cPjt@ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_15/white_64.png b/assets/icons/guardia/icon-1_15/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..ab4b5a567f966255d0a6ab53cd5efec8cbe8d77c GIT binary patch literal 2536 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 Q?f?J)07*qoM6N<$f+TnkrT_o{ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_2/navy_24.png b/assets/icons/guardia/icon-1_2/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..3542bde0887ca2d2ec1a6ec3a22f5ac3bf1a0072 GIT binary patch literal 1012 zcmVOrS2RKTqDa6`>5v-+{4iMNBS>=ScT=&Si6ZSA^{J zHH5W?@dv1D`+~8)A8_0u!u}pe?B&k5oj0y;Zy@R(nyYKH{TTJTZwkJnZk)RImb{(Y zgcIuuO7(BlxlKgd`-1a^U4=OA@ryrP2P&dmEP8`-{kZl46hAZ4|1EWGH|8Xo&xg%j{6Mbi5wv)*^g1X^BhbdvW+`hOI6T@M(#tY7PMty z{A=+eTL{fu&&c4ZC2jdrnI@gg&X%tiMGX0zWgJ^x@Fw+OB7 z!T6=1yHWZR#N-~_DbmUQeA^u{xln27tiWU+Bc0rf6Wa>%B*@>OdO%f>9vE8q&~nbT zwL&6caNNgHGL4b*DE$b?_gJCd`0BvEAlm}3kQph&w(ku}qP-Z(F2&~wMw2_|(+%3+ zESx=)lZxq$jVSv?jCY3gU<*+omseM5#hV$`CaabW%L7gDPBp^393d zhR{u@=sUcbtFZJ@eA9;U-$(0*up=Lmz0d*rSw{OmyEqyav*l+0A|y;;oKAj;VmtW1 zgH+)AF_bRGj?^M*4Vd!a{xak%Sv+|(Jh}pU0 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_2/navy_32.png b/assets/icons/guardia/icon-1_2/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..cc036d8c857fe4098c0d1dc66ef412eea9778b32 GIT binary patch literal 1531 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 bfs6kDI@P+fyaA(D00000NkvXXu0mjf@5^wL literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_2/navy_64.png b/assets/icons/guardia/icon-1_2/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..022546dcead16a1eb38e649f552b98886370d050 GIT binary patch literal 4455 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_2/white_16.png b/assets/icons/guardia/icon-1_2/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d3ed79937f659727fdbc158582451d16859182 GIT binary patch literal 448 zcmV;x0YCnUP)Bx*EuL~QSOS?x4wM7T?!S^qj{ zUCeryv_RWkS=H0(19hUCTy;`?tR8Q$y_FmUW`O6wy!sUQ2%G@Mfi++VI0ZZbuB!8i z?Ubxp;4Sb4SOty&FMw>Y1Z)6Xz;|E;_yC;S!K%aRtx|GN9a68U7t~AY4RxUYpHy#F zemj+SfGfb~oDW!zi0sk_oB_U-f;n|MBHjZB)EsLQI3MZ=FqH-HF3Es55wX!)UIH%H z2*W@&dj-61`(PBfTg*p*XA!Ze9tJJ~KWd?az{7~hozPnb>H)q2>yZ$M+n+L&qIYee3yrKF{Cx=ly)X@WF{%Q{x@{;;nvF z1GQHVg1@xwHc9Do?*v>Tl}V zwC&t|eM8-$E>}NQ&#B*bvHM7!s*X_y z8g&YA4;Trw0?&Y_KhsiMI9&Zoy|1qC(oM7a znK~@H9i98D)y=8DfK{EQ9;@JbMxB`JE$a8FFH$!asJbL8`}M@LFbB3G7U` zmH_`o#C3H%uo(DT{TY}IGy$dJnHjK8M4SeOmO_Ciz=4d}VK7aD!XwuHSP z^3u4!x=>xF-YA%siVDXo!Rx~~xN?z&5a)9SK3C^gi|WXbOnMv`3Rehzx5@42kNj;MLrQO4YJ-Kelsa;%{l6Urd zGN}`UMY_HN{~VhcW-MDCYFZjI((*#eL_{f#v@|3XLK&kWLd$u@Os&-L%F_!OBQr%) z%jRjb%{a3M46U_9c_FojkFImB-#PdB+d1v*?A>Sxey{KEhNE(%OF58I zZ2|GyS4wdt4n}NC?L0)sMeP{wp;jI|TV0@zJ5=Y@^F`_l>Zr7Rz^eC16S4ZC`nkGJ zou7w0s{nhlOI`Ec+5FPRDe4mS3w5*lRPAFZ=hvuP^ZA?%<^zTy>LhiOx=0UBKX<`Sk8Q2b-1xhaw@rR?hqAj(!s*{j|O+*V4NnH7nERs+8Rrvl>>(PskNfaSniV1KSp2POhz zfib|hrIh*EmeIf_;09oQ_%5aFufcbW+8r4;B~tHJzpAnrpQY?Nh&CLj{-&N+wfA0i z#Q-eW51M)EvSv{ot^U*&&}-__%1L14ss`EWv3Yh>zCRims%*9r8#DWYuouB6sK2Yz zDrb+Y?^e!csaq;zf$$&HZ`8GsX_HU`w49!;>ZMhXx2S8{tMI(~Vm?PJPF8oQQ>uU- zR=25h)%EIof$m(pPu;EFQw7{q;db@wHr+?+>}F$BV2k=()vK-`k1C_4e1VBqB8$pV zb7s1_L48LZle*D)ZcU7L>P}O?R9~$Fn5@2?#1mKunbWKf0rw0<}F|$uqU_1*zRcyFvjoiQp!K-t-u0c5il8;3akTW z01uW@HXkUPjyBz5^_N6?jOUN)r|OBh-fC;XoSd5L^L>K4THRhVU)9$CSJwVsk4yAM zV3(_ZsWSqo>g(!BZ7rCT|5s+vJ^fWDs^6#G<~JaiGQ{`$O<)3WI&gEcS9h{v(C94S z-(WL!CGaOOJ191A09+WY0zLyC3Y!i64k`9#)=E-|Y?o!^k;#(W6QzEvIuoP&QZnCl zsoR~@-q)^!7W+#ZhLy)Kx*z>K#c)kK|h5WtY0K8sp(PALLSTZIFrjMzCKM z$il?S3iT890rfle+}zW1e_#md9Bd&!#XW~hDRC#*1w=^$kWT<}^V1vjyc3uP1Q_os zrF7Sy+!2da8Dqw?66dQ^v-gV|nr+{I*u>s)4tdFJK19Q@TMi+Rjy%_Undlu^4#yS# cs2rK{AC_uEoz%TtWN_+4Z=0U>fi% zunD*fSPXpb_Q$SR|8-!svrv;fVRVZHny!*^?kZLaLhb3HYd>I-cs>X;Xw3+XP4_x& zjq)dm!D)K0cWcZGEuG+HhZzEl1qSCG3TT#`iEgYU3wQ|l9oRL`gXM%KmwjPwbYlfs zYu@EdTSXQKI$ zVlqv0r7WW77X^hudhc1rNF4;T#j{D#_vDH8)ag9&okvA3W8elU(l5vQZ_2_6W@-FF z9c*fb*Ek)_6nX*}=!}xJeo^;iq;nH0+}zokJETJ_I4kr8HUhJATzH%|Hz(`sZU#VOYZctPWHodN3n0VK;}&uCVT7f#mPQQ1RS^JH|1-b=x!=Si9yp22H^ zk{#TWS!tA8Q{tm{OQR@l4$DHy@wOWBmugO_wN8)$-WDuN$sh?CFUGGK#xhn}nMtYb zf$i2c0%rgxx-oBEfAGW9;~1Tjk(IpO0JH+vW?(i`C|M?`MxXzWb?#rNoIh3Xr{pP> zAmxRW8_U4egwGT2d#zP)nJpdk9pG=Z5sgl_d4hR+7n>C_-BnZMN~^HFUA{iTE1Jpi z|J$#)!(S{JUjw7v{9PLV30R|NJJ85VOg$ERT5kfpr1Nhvz3XW4_~j2$edYt`mX5k?oQTf9SQuP%?d!}oCYP4;auAhTwc zGfsO3bMxilBQWGxL*Fiw<(xr@bC+ z6*)NdQW3gB??ZtNf>er&CxOotAMI(@@hW(WtBJEc=_97ED~v`L=)HS?CR}k@q=33g zUuesn&@qBjs| zmdoe6X?#g4mU^%5Pc)ZB`pX09%WH%CYU?cstP-47s0c04=c9+t32Qe4I@W|4J!kEAI$+qsuS=NUs!cIkJa2Y$jB#}cp)rK;YzSdp2%$BEU|Hz! z5W+Jd1WSRp8^mIaYeER0+I$GXAY%W1u8c9hoc=<@7&nFONf~bxGi}ClLC0DUBRd$W zmQ<5scQ(uI#Tes8<^0LA{K6PxtJc`ZhXwj4F-B|1%mXEB#~9nfjzDGlpS-_tRnP6Q x%7;ijOPj@u#%;{z*kLSQqZ-wyMl}ke{{T@fR@H$0a)1B;002ovPDHLkV1m~-@$LWs literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_2/white_64.png b/assets/icons/guardia/icon-1_2/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2509684e56b037ce781a876f7a81da8992f1d907 GIT binary patch literal 2294 zcmV6k6!~%z6ILduP7hdGp53LX&%voBQr}&;7ph zo&B8erBp!$6;x0`1r=0KK?NNFP)jdUx<-vQMsu-204RWZd>*Mq3jLlP#_J=pVCQtj zjlT)lUB8PFSqM0v|H1XZo@2!bt=G^%;1$4^fz80vz#E2DL(%4dnZOIcCR%W%bKP-= zWzo*n{RH5TqUBlLzc;M3(31Z5wZP|q!-3U$Hl|zv?CeAi%fjtxIvDtI5X8m68-d4x zK44CyeKqNw#f#dY9)~PhxTt)7Kr0$Eu#(xOR4|vCG{AW)8 zHVK3l1Dx9@>$xZ3>gEe^)h2jI3^+J0UyxGTsf4^|Q%a^CHx)&3 zOh%K@1dJsA$0_~;0DcgxCbXKB9G@+D1&8~oE03E&x^Hwv&*>Hihj0PLDc z-<{x&!ZB0XS7Y6}8c{;Y(^F#78QG@u&6hZJ@0V)cbE8nAu!0b;%y9-{K$q_4 z>B9@+c$@_Il5oC}jTa)+Lf6lQbD7@tv6Jrt)Cf;3z$6EP{Xsb0z@b)YYd%|QMd}Y}5kK{;i z3}cqw(A%s<$G=>&0iT75_ z|4muAayz$FRdfB@3X`xnsw&545y5HL1GqJq?VO~Nq2 z8N4kMMm=ce!@@bDxh5?Y@p^xQ3Y11M65{Y2y}zr|j*FbsR9!uJd#waNMu~UHF&f+p zyftV|ER}tO7EKIpD{;E9e__edUQI_!e{X4p%-@7)Y49h!ppj!U4LM2A4HGD<;eEdU zGtM`^Rk*!Q^jOS4p=9IH`Fca-P`#TW4RTm!Ei?Zv4M4!_fUjz^2EVgpCrolryXvZB zGqs_Xq^{QC`P{Jnbs=Yn{^RnD#&d#G{k3USoPVH&yTb1`1K$plZVKV;2jcia;_6Bj zINd>d17>_fU_{*DVZdWr|4-)B0^U^`e>`J^ne%63p3-SOP!G@h0N({ZmW4r!1UX#n zbHw?Eu;C))BfWth_aBy-UZJ&2)z1!9->HeS=wUqfd zV4BL@r(`Z`6#9nRBPxp9gg-gw*v-v=sHs|JC6YMkR?u2OyA<+HPGnQbI)l<(ovzg))cxeDhhS_zNXY^6bc< zk~(Cwj^ApTHdqJfwvb*gQn%U|OvqkG?qrHqFJP~57~-&8IKKG>YC;%Xrt;Xcx_z@g zzHfG67RR?b-2px=iAT6my@io80f#{BOf^2&D?{rI(wZNf;6)|GHx4vn$s3&40a>|h zeTT_<=LOW&a*&Jt@I&LHb2v+X_4TUnL_N<71<<0*VL7ffY|D=7`zu@{oEi%cORq#y!0@I7{#BX!}~r+kNg(2Yf5wTPytc`hBxX z_UuV*ih$L!A;4Tz0U z`2o+vFV*JWuQegv z#E?ep4&&2w7KoU3tExDI>jPeCi)_q+R#=;^cJ&{`j98yf53zfbO4jB9s{VS@r;z!K zYKs-XYld>HK4!qyS>Bvr-`9j@%PM(yG`2*WM`wwXJCarh$No&Uu_%g1bDWgYY|*m1C<@E_?I;_+r|lUi z>Hfw;&l3DmO>BzMSVSt^`13;kCx!6Npl`dEcm)+yP(cM1R8T<$Y5Rcx0#b%_Zd>K# Qp8x;=07*qoM6N<$g0;$jBme*a literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_3/navy_16.png b/assets/icons/guardia/icon-1_3/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f34553c2dec1f260fba4adbaca0cddbebc80f27b GIT binary patch literal 571 zcmV-B0>u4^P)ppc;U0F){{x zqgGx*bdBul2v7W01inoM5_xpJ2?F_qWAh|4MFu}KSnfRmgf^CVS()!vP>fKOY~cv# zEsVX6Nj>2C?K;(JfSMMT<0v=CdMBedxtz0Afq|Uh_DvzYLDi*JDRH#0o9~H1l+QT! zA{yL75_yIm4BJ%pjz3l8;bR zz+Fw_`xcQMs9pP+yNR|gL?7CC2f8N?X99RkpwF1UyAJvqV-Mnb!=RR0`D@&#@f09R z8#~L}zA03Dska{TDju2IMXWi7Y91R*M}+MVx9&mc&$o4GA002ov JPDHLkV1lAJ04)Fj literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_3/navy_24.png b/assets/icons/guardia/icon-1_3/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4993a50a5651853221a2b59f10f94cb418a86d GIT binary patch literal 955 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 P00000NkvXXu0mjfa5E&+ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_3/white_16.png b/assets/icons/guardia/icon-1_3/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fdce059b1ba5479a4aaa01b4ffc026d6c14cfede GIT binary patch literal 438 zcmV;n0ZIOeP)T1R6MRi?0U5z)o8f>dG)QjtN)i)@U4skYyh3C zJ!;x^S-o2!Jf%KRA2qtYr%v_nwo=`K^T79tNSA<*z>Yds;+gxE79Wdfp1Z(!5lNj+ z`_2H{z*;${fTQV34i_@% literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_3/white_24.png b/assets/icons/guardia/icon-1_3/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2ae3ec360fd66928becd458a283a8b356d243c GIT binary patch literal 721 zcmV;?0xtcDP)jV^s7DA=RT06qi$jfksBYnAL-V13dP z5fAFy)EZ>ACE%yP9N;*x4Omm6j`e|h5m=?J1Xf4HfoAWd2+BcjehoMPya9X%d=n8j zYJIaOsd@ms4eVEkDzQ#4-Wz_8sGHQw>f!n}j%RhF`j>i0U8f#z^qQ)n-d9i5e1Dc> zZA@O~s$105VUD^-eXG{~tbWk;H8H@L9_rWXaC?!D1I$!Ut5>=ur|wigZ~L04LDMXY zfPae5=`Cu8fj@zh>g$ClgU%>nuLG&wIP1pOY~X&)N2_Y`xg0nO9Lq+l?tRosjMl!c z0h&6#3B25@>se}6)I4BWM4SSys9#1z2I$nj3eSmQ3o500000NkvXXu0mjf DoDN)Y literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_3/white_32.png b/assets/icons/guardia/icon-1_3/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d0f8f269978987eda1ff6dd817e95161870ca3 GIT binary patch literal 986 zcmV<0110>4P)#r33#Sr6ZN%thpkn{&I-OTQ`3Zk;4 zcmpp1r-7lsD&Q6{bHKwvGk~+ew0K?(bOR$Dz?`L||vJ3E7xEeB=;e*!~1-2ewPwX`RBW*KlGLh>!}QA?cQ;Q>Xk z`XX=}7y+CBy2^)U0G0wrWA30`rbX{4`V#_+!m?e`9!Y~G{Uqsv`x}CW;VNWYSM7)OyF8Hob_SNoUo>;31wNb0Js_1FemfGyt3Dx1fUk< z55QM3cQ@|wCR76HA=(a1%0l;kR-pX(Q(#Aab|nzNDd6q0>ry;{VZn(9an6Cod{EZ7 zj^&=prB-&or=6tNB;EB!<0+I5j(0`y<4Z}0C3Q<06?-0pCz_Uj?{Z3#6L_SVT`i|& zQ38|@j+1o9%zBdIs0aSu0lgw=fuvQE4oO;*gNu1m;`N{-i2R5YkBNeNrZ?6m4>^GI zX7<0N&m_GAtn}iO5iNc1p|~mOdKCb~c-GS^DqubC;rgwT-tYr~(Ps9aq=k|`2d4Nv zp_KElO8VE#u7x-Iu8Kf=kZ@KgZ;$mwLAs;Sey3+CxHc<7MMlC;fS)U80gW`=32aG# zVsynTfDOPeaW|~jg}9{5kG%;H*#bBkUE&U@Q^0_ZKk7ugwIk*X*%3+mB<%>|btYDa#ZA_P(sPo=#2If%+9+vpihJd*NW-n2z~8{vv3?wQ zGpuRPnpQ`={}EUYybkoV+znkaa*YQ3=DQcz4|r30M1b+Y1;3U>FQ{Kw)T+>krA1A5 zPPps><^q!=6Z{@3%t8&PBqO4?;+hm+gAZnSKD zZ=7gaY+TRVd)Zt0LTXhvro-a`;%=#17YhB?v_9bSH2$XF2gEV~m**s8#{d8T07*qo IM6N<$f-Jezr~m)} literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_3/white_48.png b/assets/icons/guardia/icon-1_3/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5ceb5ecebbd722a60e5860c94bcc12645d3685ca GIT binary patch literal 1492 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 U&@#P@egFUf07*qoM6N<$f`xL_GXMYp literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_4/navy_32.png b/assets/icons/guardia/icon-1_4/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c3295c1827120c3a9405b5192ba94d74bd29c86e GIT binary patch literal 1503 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_4/white_24.png b/assets/icons/guardia/icon-1_4/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7fee6b18470878ef3a66c94b3d4ad3e6af94519f GIT binary patch literal 745 zcmV|^ zq(uZSvI{gJ11$y}^AvJ32CAIa^ zPCWNSYE;VA2h?Si!TVCK_NY(Q_Pf-N)p7Ne+WFeLcMGWvK{A)~0pKJs0Xzcq0%OUx zx3B^?fvvz{;9@z8h=1z(I$Dm1xfCum3Ty$60R{PM!27@sU>qp<_$y`FsKr2uX+faA zndr{}2Y^}NA>fbnZaMH9a430>s{2y5B`Pgdk_>~uyTAzWAaFa8uLKIp6~K+$f1dXx zEN>N15%Eo>tIdO&SHA%3fqlR>;2N+$<9s0jTmha0-Uc=U)17i!H&9)cgw6mz0hfXE zKp(IZxSqM$4r~IZfS-X$;LkMJ5}B6x=Wm}nt$tl{p?;!XR9{k0s2{3B>Xdp`eO3KR zy{>Mk!d>a@nTH>xpIjOd*VHpvrUSs^ncU}qhk;+SG>ei)foC&Z(-Cnwb<8c=wdzXs z)6#5t{+Rl@I;?)Dj+V2U+-IdJQ-1O8uI7xoNBy9~{i@=j`b_TMQxDc1i}jIl_O4SLeVhUaiRiSm)_Tjfu&DHJ9aB!ti5;>Z6=VSJW4ir%}&hnXm4KfMTRS zBEF4?$?V|r9t?J&rV*16{k?9Yt{?3(J~9V|ZbiiJ_k_AZc^k@Z b|54llLcHJiwy3!P00000NkvXXu0mjfb)#h) literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_4/white_32.png b/assets/icons/guardia/icon-1_4/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0e94f05bee7a6c8b5b846e0eec353c85ef40a5b5 GIT binary patch literal 1059 zcmV+;1l;?HP)inV3M^o_>b-$M9Y3lXrT6KeZr#iLee7t%KV@F#G3o_FK<*t$Nho~2&r|1_uGKde4k_cQD47WEW$ zMZF)>Edt|#57VQFn3Ki;>kEPDzz*P_dOkNI=BaN3Q-BjA;^*PyHwIDIZZa_GAn&c~qw1BF@vGH0)Py&^Y|@+c zzDY-`hpH>p*VI|+!j#o2yOnx}v84}~QDJ%y_zhS9WLAHcUPi>FCHM*8IA9U5r9$*A za3PR6G;AIWg}}4w1)0U_GIe=&zl!PE$(Na~zEJn`)u)PQX;n_f{!DdM$?WL_ftP`0 zKqlhl<@F=L8Njc=N%by;UIpv~<^eAP3xO=*HNYXjT_tnm_H1RVI#K;eU6+kU{kr1( zyShl7p+1)ItJ4du?dnc-tGcFgC;6w9>^-V3hA^ThB2v)Bz(o;}kY_#|SqRJm{sOiG zn}Lbd6Sh_fuCLy4U&cQo7B^*%h(ME?@lxMPk9QsH9y%we*OZsrT4zD=WW{_}{iMMNCuwcaefVe_gR z1ERX)B;c5u0jW3@=Gt`_u&&VR$cRoGQ^J2qZb$0zwF_>lS+KS?;nm0B*DI{xBJ|2sVl^Uh4Y@61Ga;BxOh?|IHW=XuWlO1t5I3P7i( zp8qodQ~{|3zEcT&RTKEs6rXm35VjC37X+9Dd<*;n+|*d{Qi`?vs$|7N`S$0%ie2jem;2;l*s-oD4q~=nM?;+Bl_J;26_Z zwTA+ufbGBx;9Xz~@G|f_a569w=nd=(3;>!vdvgEGd$uvaD&a};xHHgHUYT6 z&*99c*ongr?gYkXd}RN`-eX`w2sQ~Yk^yH8A?G*M}+SyB}J4t&B<%Aq_EL-k|HD?26VHXeo%vclKM(o(MX1}Oel^w;34l?15=yCslXMc z+2nk1PeyZ({b8$V!VIhZ+&$xSlFcY!NG?OUCUlKI5Iffm_yKqgc+>eHlGd5d%n=%E zyzY>~G=Kw~%zgxJv*WG=J^~h*&pxJ&%zRfaLn&yjcHu}{;~}NAO;V)&HIi0K8k17m z29bzYYr?Imi>E~+uP{1+=fU7e;mjmzlw}3NSa{|r&=!8<`oqRWT z$v;JQ?Qi_;lJ=9dP*Sy|?G9Yd`Hg}kmJ zr%;px5%%r{zRN1itqzxwg!*QFv(8CxTE=fVu*$RrgwsC*+~N1@^KUo1$*onwr!h;? z*p$*>y8jZgu=`KCLrP0H#lq+aR|jkHn` z4m+1nIvjYq9Xz5@zed$<7hkb4zxo8)t|!R+A!7H^M!1GPx3NMlzgM|L=xLguFE%CG z&N|aI^c-!eKpJtnnShAh%WxIW%_;@pG3X>_4+Gyji^81K(9e`z~bb$pJ+nfN|$fc)q z#%1n-w*e2gtME-I@rLXEs%EBj`M@ix)hq3|8?986>)Kj@qSPMdQ<#w})|3Jk^c&zU zuQ|8Wn)W`0q68R}=Z5U+;(J$@&<%qxI&$!vIdm8A?EDt!d)kEJ8d`~%-)uG75=5O6 z0;H67L^&+!6=1fc&plQtD#>EZ5~Gw}lCDcBMN+G;vC5J`WkTkBJtTc0sh=B?i2a=` zd{I)%bE5+#t*sXzr2^kEkU3}%x0)w4LtEqG?ohv1mHYj&OvsSD!`*yECA!l1*lqbl z!c+zp?P;aLW>p1v6oQO$AN!J|;jZhSku=ZmW85QzvS+!@PwHsMD$s~RbBv2l?8b~H zrq^5i9Od;6m(Z!h|6cO_JPXw)$_mH%1F}5O#|{6*rvE;2hdMZk)$g8Td(8J&xH6sR zez!65mItc+9Di=q54uzVsL0WUou`y`T8Stp24uX8`wkCyr=*l( zfEAlpSCOehCE%Z!L7V;)+15&QXxQ8hsyzG&fw5XI8qdU!00000NkvXXu0mjf_=icR literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_4/white_64.png b/assets/icons/guardia/icon-1_4/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..c2bd75ae79328acb63142c64a41bec0f014cba7b GIT binary patch literal 2419 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 R%+mk>002ovPDHLkV1m5x>7W1r literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_5/navy_64.png b/assets/icons/guardia/icon-1_5/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..d401fbe9ccf08852b650e88414dccfccc34eda75 GIT binary patch literal 3146 zcmV-Q47Kx#P)iLyDxj=B;W*x6o?`qtqXM%BS1l^kq`w@A=*;+sS1gJ6I#)#QiY%ua@-$% zp{lA7DskF|h$6N42TdzMTUwf+7Kwn1DZgx*%zLTKoSG=#@cFfoWI> zKAM4bn>QdG{0-0iYz!CPnZjActB@am7W;pmll$F$=L0y2;lYzqzI;;`Ocdg|pB!*A zY36=GuZN+b2v_!IP;9>rN+)qF|7*NT`P%Bw4pnbO^ge25;dqIl-J+72%-KBwE7de`xe{A=2#9g^FtBVZoCmu`(KerJq9oR zOSGqk(Y0w6&`)(PCqexJc=->uuF_pl9?yf8vNk*@1BDhTkEi%K1!F!SvsLi(AR2}8 zmm$!L=AJz_^XqQ=1pM?)kiP~&?nwl>XOL>^gs1NW1~hsw4+4lmh~(So7wiRN03sMO z>7FRUpa3Et-F-fW2a5pSmVqagtve%lR);j!-g*I)zYU}a(ZtuWciTtdd$*%F8G&en zJhyuwtk)$cG{7^2 zf#IM2Kn6_VaYVrwfK})@G7mR(a1%0Bit_kHT3rKLXf25UcNM86PPt5W`y& z@eUOW$jEO45AFZ4?=v(mcEc09fGKO3Fw|+#&oiy>hVlrA?v)*+d#Qacx5xt-C2dZ; z)sPmeI_uf3r>BRv(F>tN9#r*uR!##fjC2_9i{E-gR*o?^m~!&arCT7g7z?9yu=spdC7@TmlwRNdv5*=Y64=i+lVJ+j+`JY5Yie zB;7~s_8OT_!A~1NJ%ob;0eW^RV8FH+rFrmdYiNE2kWKRT)`}V7N%DstjuHr)__9_%ERWkBp+XSFr?3_5EZlFf&gA*kWfhC@ul9 zIY$AzcRQm;DfmebFqQlBVh}mEmj~z-5EZ%q7dk`A10fviwC$2v50A}@dG+0n`cz%D zdJo!8MQWAI6j9mYhqNEX+@Ar(owp!*9L79^)g#tWYI7V>k+ozQ#@CbuRW^n#VjdJd zIis$Jf!hHp?8um*nWTo~-fn!_=vQ319ovLjBt?s}al3#L+o z-n%6*z^)x3OddiM{u_zRMd;pmt+=qAy|YJW2Y6-&G{WEu@G}ZTPlY(OQ9bdG0p@7C|YL=S@! z5hC4IeuS38=m-Y)V0i0JYbd7f(c#*pG9|HyRUeVc7Tz;^Yt{Vxj_uM}UqxVbHsnxjL@gvSG zEd)ns25=5gvNn0g5eiO17kQgMPfDEls0k8Q6NtJH=7A)=B$vlHSZYo%!wWk;QV={vnDpF|ixuCbK09;DEb}W|I!UG?wwD40LSS%y~>?&Jq>%LfZ6`tR1k-%X& z7X&{sW4>=HVj`5;C0+u4-U^lBu>hI_)s$9B2Fr9zTbc0zD9y*{DziP#Zp;WnLWExW z`K2&84?5DwWvd_IV5kWpu|jjvZg;1O^;ypLOjwSumUp`I2dTD|Q0iPcfDsnU9HXCG zU>ZQfHeg8DR%r z$l|-4h7mLb#f}wT5IT(0Ym5tm91JGq=v~<|ECdZuEpCv}l+&aZTvBoF-xkv^0;^R^@d1@o*5HXi1hBGYj0vvLWzP1vC zdNKRv}hmQE%Ur@6KBvlSkfn$MdaQU5W z7#^Gur%L&kAdzkb=qM6=+NypKngiv?iw+pti$tme#rzKe?-5XB0DTMm*00F9zp!u_ z_U*9$9GNR1ki_Yu8tZP~iS*(dkso~$3g3hw-Vc9-WcE@7WA|Zr+g)NC?2-A?2BB$S zHRluF8?T3#*p6gthfQ&_cs!txdjrrnV|egc$^TWS&}SFw6&sf$^q)W~yH-3xzRbN2 zatEROYw+9yjuNWRH6}C_P6(H5JO?TN4gi(}Rdfhi{}{uAZsyx^RIIC-D|k<24F~z&{Sgg7CBO0XM=pi#w+C$cpJ3G kYZubYpTQZN0si;!U+x;Ps4raS_5c6?07*qoM6N<$f?0CM(EtDd literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_5/white_16.png b/assets/icons/guardia/icon-1_5/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d9bfa8973dfd47ca454109f898eb576a88b54fea GIT binary patch literal 401 zcmV;C0dD?@P)F0c$7_*O~gG4;GcIGVsdaPMwl z9yl|zC14xKfCWkIJSHhA8Ufyc&v^XXtpywdZJ<#MNJk(P5i$EvuscT#k(1m{TPSCHxYY3 zqClmBMpX2Km%ikqko7tiRlyq0PJO8&I_W^k5Qy4dX00000NkvXXu0mjfpXjY; literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_5/white_24.png b/assets/icons/guardia/icon-1_5/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..71a85d3da5dae18255fb8eafbcd57f059532cbb1 GIT binary patch literal 626 zcmV-&0*(ENP)i!7wF7r6bcnHTAfNsrBP!jbjE1>4JL&m3NtEo8mbsG zjIc{0cE9Gt_i?lGb~pIW?A-VE+ta-z1TBW+4lOz8ItN^%V3Y!??40C3ABMVXO}n) zJh7a$^{6A5aP%v{IFkiC|Y*G&Z;vnfQ#PW+)f51=G>lHi@kQ% zHPJ)hjHG$sOI;Sj2ztPKuhncM8kXr5a6IL!^EHehJX{}u{e5)`lP-H0^*02wKG^A# zpl7+JfXt+|T>=#o-SP9jzIM*28G{L`i1=Ohc6=(_hydsSrl8vO%50R1Wr3-9Z3=Kufz M07*qoM6N<$g1>GbiU0rr literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_5/white_32.png b/assets/icons/guardia/icon-1_5/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..52766867d30be991cd54ba105f030986034a3ac7 GIT binary patch literal 928 zcmV;R17G}!P)+}aCz+P8+Mk&lT7Y?_t*KJ?>#^6K#NFsFo7;=+?NT?|?nP55UpltY@SegN#%(4{QO3z)Qd!@GtO62{|Tm z(&ii=#X@%##qy>O(6a@Lz>>!v7|60A5z&`)5ZE0NA4p1Y_kn5P?kFYI2+e6tDtsB( z3H)cJX<^C+;5x9~-}U&Xz-R8yc+ZN|uL_`$X)B-i+Eg^~!8d?@F0%D$@h;$d?@gv! zrD~bqm^4PjJz&;~H=3Eef{cs=nes01Fe3i;x7w^v>8=7SE!~kUIGj!ZSAa7HvSdcK znx$NOt#M9kPUyDGr=@*+_j!-a+fOno?ioxCda zbHeg;Lt#ySJU4)d%qQwZ#7!rabD0SvVh|CFk}}DBorx*Gy)E;?>kR;{J}^>>f|9?l zBwdv>E9oss*Cd_vy5%d7v|G~el4ks!4*F}h^?6Jpl75r)o}^DC{phi71MJU|K63vJ zNtfFIRAVR(TRHIWb~>iVYKrr^(r?ZJ$K4;x;;K!#Gh(iraqRbwuEA1$-#hKB<@;e`0Mm9pd<8u})t(C1Ix)FwPOS%ka64P~?fDBM zVtmf!xmTPW>jB_3zkI7AD|SY#>-h~>jq@t17*CSUtb{}RfeI%qEzGey5wT>4Z93{R z(ruZq?=T-Drz9P)!gqi_$~Ddh>HT~BI)2m6x-d~C)RTWVhb3KV5ypRYf!-@Hy1DH!g3_gklK-Kx6P16-u@ zOR4Mxk`0@eQd-E>ZLMZXXtFJ_*s2Lf@tc_JPP1R06SAkw*c4! zz)m;bqgnu%bpBR-nei0BwDf0}(xlwUF`r#jlB)qs1K68V+AU^(1h5i7y9_gB0Jucg z0?5?HEr;``(iopp{f68cX0dGC4gi+`c)~!b&HfBXT53rKmOH_#@#vGl@Ze9e~}FYr_3;0Jq!x zl+sC^Kwbc~oPcjWsnV^`$#5SQBz6D(4ZzhT+u@QL-2~vX5N=eWR!IQYsx%ca+Npa1 zsnuoxC-i*)z&2gdvtcb$t8Zi!Qf`k_w+eM6$qYbB>Cf)&=Pb|B;6;Cp5)MIH762Bk zokjsMECAp9kT$S*ry>2HcjjE8DyO7s^9779S;W~G7J!)gQaZjZrR3J*f6NKcLjXQZ zDb0H9Q*fap6|J{40K|~RD5lHL0N75_K+Hwy8z?!e=VXDNFIdjJ^yUH!w1_%MVQz!u zGLr8qdbDVCQtj5ij^x|w+m#EOy?l@4fv{#v^<5+v<*Dm=D+CZtl241#x726%;uDf* z6=`;v_I{NwkUT{)^U@}eu>lAm{Ib4J@>|uHlRRUO8hy8WyaBcfxV;~2t%)iCN;?wi ze0B=b=egi{Er9EUcWxyA{y+}zvE2K2EU{3R8M~|i*13}sGX`Qpeg7djE;9sXTHgTh z2+6C00LBL(NUjsSGQ><{2y?t!7HB${|9w510 z-Tp2pMOA~TeJ4dOFNCsj`tx4wNd3ip}n3*eGdj!Ns4X; zAwSR@a=vFQY|bd5edQCF%t^3oMq>!khb#wV>i2`bJ*|Rqoq(%K^aG~H6ZwQz53(^c za%>p&jZozT+-@HZZKt*7dVTkc`)>sBS3&#O0QlTvq0KEyrw;&^^mTeSpEm%O#6?bu zhl7P0L^j4Ua~QV@rH~`dOU_TDIUq%O1%Nd6BsHw`s?3d4IeC=J^OyQp0aloMk#K>~zuW3?_4-2U QZvX%Q07*qoM6N<$g7{>V8~^|S literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_5/white_64.png b/assets/icons/guardia/icon-1_5/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..b5dbd73dec5004f0c19d5038a22373f3779e6203 GIT binary patch literal 2003 zcmV;^2Q2uBP))xSXrz?b=DDyUdqzsB(c?Ha-)7%P|9=4ujzRq$?YV6 zG^W@BTqL@Tb2-UvoW@p?tF3RR{@qaY+cES#L#4~J?X=0}SZHUzQ?y(A0PF^E41k55 zM0I(lG-F_)0d;VGN zyzhUYU2TwD1>jlHyeFk}F@Rgu*F>*KDNXb%3PnGi+R(5?8GIuDsBGvrFT88$@A;hw z>vTK~;3xpkr<5KQV}1efCxF%6Xq26NKk%b#3xjqUVUZIV1L`f9v%JI6x81)Sz$E~- z1GvlU0qm71MVg140h20^_j#*K@mafQzgie?kIGZ>dFUvclC!#XqW3^b>5tIPX+@fS zq3EZRP0|)d(sp2ts&jdsh+VR=c6B%bNxOU|fO7$S2H-_8#K*9|E4luP8TKCmaC9aD zj$FIPNpDkmn98^qH+ZfQjSVR!6Pczp8QS}ApbRJgEYNQM)}fu>434imjBgs<7`s+| z-U>7#y-LjBq5>N8rImN;x!uGf1MDg^jK)4LS^&m%{J#Y7h4eyCe#4<+KwYdrF$%nc()W;Y8i+24OF=`^C>t^&jVotm9 z)1Vo!QsrMkhToF{n{J%a&Hi3hJ7qbJcUi=**?4jMp|}P|Rhpa{l6!aY=$ZwW`SZJF z4AruQ_*T34v|D6lVo{%A|NWZu6rEuCO~E`mD+5zT^lMhPpj#`ce0*{b9!pzn@LL?$9p3peF6&0=c6#MG}JsrD|H%J6R{bwwKnG^5W03yGzJmReI3Qc4d=u1%&Fg=WX9?!J`LMmrsTHMXJ!z=9u} zCwESvXqB1UY%2e(~M7Bg-fzVgvFx{5L|6K$I z<_>p)%f3Zzkwt-1kEdz9cHWfh39>t4vZWWAv&(=q9k3XS9%7q_ahX$KO7$ZE&xq!8 zBxAN|c$8oU4|M*}LayBbDg$GJEz%68PXU|<;IfLGxLIYuh!*U=yupvIWq43Vc3tx; zBxX(%gEDOlQ&2QVUGncSLg-#M9H){!I$fTCwIHc8ba2j47ubX+LUJ^U!GBJ%IaK9%Hr^#1c#mh3$o)HHMRNo@uRA4^2;_%jqiqr0aUrPhtKG`S%Kya9wGms zmDyWKn5;mxIJ!gXYHtr?Mk{c+jG+9Zt4dH{_8H)q>|yfpI|2LqE1A>z`=L1jRB1;R z*={)+eJDX+;1&yqdFDuV#@|)Uzd*GZE3wP2=I@f-PAP=Zn?uk zr-E6Wpc|Zl6CM|k%e_L$mVbuD87fq6(uA(C38$3oSXLyX{StQRS`MB!7P@*&%NbP9W)b3UFeVgRjB+nsr*$JuNj_oEb1IDsLw}&98eM$0E zO6g~BQ<9#C#mtGi*Ak`DC1w^sX%XY_b?I<`o&W!*XPwh&cdPg&AYm2|Zh(l%es?O+ liy5ZA>CIsdbC?5!e*w8Is}7*p-`oHI002ovPDHLkV1m>1(#!w= literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_6/navy_16.png b/assets/icons/guardia/icon-1_6/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfb2a4ba18e3ac86b71f6b9e34f4cf7fe1ae511 GIT binary patch literal 577 zcmV-H0>1r;P);tLuXe%Lh zn^fmE`U~hDt6VPZlAi>oNZoC)NkZu%O}*ZUaept6V_Gp;2iCB#4zhvC4@5U}UmtXj zwYn-$35X@YLC`@6Z9T?9;mc!skUrfwdv_eCw=h4DCn8M@k49VgY@Yf|?RRXifJv^7 zPmK}m8nIg<^QXY7h(=%+5%&h4ox`%H)aRBvO)V`*FX&CZkKzY+-Uu*G_gd2V zY<#BSs~FNWy}S$I7|sN=ci)APH$c1MyPf9d0Y*k#q29`N;39Yp2)}|}!P$Bs3sM>1 zZP1$sAT7}E5Sap5VyfmFRDT2clRa0)u{Mdi$vA`AEtH5^!4DFk2Z37J<{k(3BGmEI z9S;MyfgB)}_E=~r3E-8m3yg$h3Gw@W0sR>#26P&j$61T!#xMrP`t$#N!=_TnwYx_Y zKWM?&#|Xn`5H%ndP_0Gy8@LQ+FY1;s-f1NF2@~&6t$uqQfcU>3>;~RJ>@XT$DwIQA z9wXZc3l1WX1fE;OCHJBE7qE$LCI)_AiLwL-5wR$u_X5*oPJWDN6JFVKh;1S>G{)rM z*BBlmk$fIC^<+<+LUan3tBD=2uhNDLiesR8t{uzUh&_kP%|rPqSb7>UEvQSNd`Uvi zlGiRwqM9)G0LFHaslEiqbz_;?g85`fl$ zoD$tts)dJCVBZUY|^30dR+b}5Re_5Uy0hRnL80dji`J|cHncC^&U*cLH@XX zmdwyOGD8yxtqA)I`sCoZTuolU?nn`84HGBM0OP2ujeQjwX2U}hcNHU#;P>uAr3_hEMTy93p49=C)(sKyAZH92U1Cdd%FXHz-iE0C?qibER0Z1F%oGsK&I7{}u zFAC=UeW%$bPayI-6YowJ-$^?njfnK{-N0pFkk(h8iuw=d$ws1AwiC4WrtrIuuvPJU zj?oz0w;FIvaypv!@XViBUQDfW0|Q-ctqQO3pPgdE1$?@=8l zb8-fbiy?)fKN`!f9o06lUm;WhJ5Z`ntpu$=sYGohYKpevIl8m37esafqbMDO;e&-h zQka!@5M?6xb6tqthYRzl%Jqi%CW$gJUV<=pk;$45pg(#CB^S{xll8MGmGY>r{(qX8ib|zY`k-ZNYPc1>e+kM~tyX8xFQNhsI=v9{S?}F*SM*fXRq=ut^(s3clvc73LxuB`S&bBNe7u-=<=Yw`~!PO%P z$PCMWV^@-~m6gB-W<7j8^OlVQT@S2@WpXXIBB>XF#}b`w!?GQDo4NW&-%_eX= zQ8A!jA!bn|fRzr6d!)>}kG`G<`C{wwvVFZk1SAQ zrh@bWSH*Q8rkj$k<X4FBN;~STP*RVS^x{&2+BBiqSSMu+rW9pbA~bI!@;IF@?HuFJacD~yg@VLB%H;P8AgK{S zWgTKR^85F%^X>bmt0FXTR=GBvBQvcrO=f&MzF7y{NmtjP-BIFa!(-#f2A?wHfzf5Y zA>X!;nJtqCpcWyOYiSr@slI6n^~)DjWM?j$Og7jxxYKGlbHSycAJJpyF}7|hYS&@B zBI+igx|Pn3wajRpNJ_ULW;~*497ibiJj&tMPLgk3i^?K|_h>HiAz_|1WsCy20n*Ey={8|Sq%)*! zhLb;C&9vpm*KF{o0+g&smHM(VIGQdZPSP2ehS!&>M9-dQ=()3~q$I92Uasv=Ha8gk7m z5q~}!mb+f8&EKG^;S-_YdpNtB107Mj8^K`u*Qv4c2lL{8s{h#jSLiR*f&?rY3s}qm O0000|>Z7S?H2y=aZ>qbqi&~qS`ao@_n~F3h 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 IM6N<$g72kquK)l5 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_6/white_16.png b/assets/icons/guardia/icon-1_6/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0e0fe9011a0c264b1c3a9453c3141bac23aa6d GIT binary patch literal 435 zcmV;k0ZjghP)`aL$WW~bELQ2`Q@Ev?4Ya3s{7nlaI5y{5FTa=BL5i#b`;rw;Y zgoRVLd;j;G^PJ~-&L936mOV%^Gn1q)paG}?Z$Jz1Xl4(!0Qs78E*e&VZr}+h0|np+ zSeMjbW^X?MAjv`QBlql+fm?q^u5MyBTtYP{_W-T&-I&RJlbx^8Uy(Ecj04R;U$Ah> z9g@z?Y%h8B1t94IRnjmp18e}JKq+dbfJ0zb(hYEyK=O&Y_eXID&(VIheJD7jCA@ESXu!dvh6A zM}T5D?}b}HZ%p0}KnL0Z1`_dHMvhOK4-hwM3D^Y=fMwt!Ko@|@mvl*fWj$7bP2ehw z@}lICOLA5ogTOSf_FJo2k{(N%FR4*dgQNwL+9aLH*A}w@K1Z-Z@I4E7 z1*`?$1D}D_z;j@3if1AKW@ZJT9q0v~0v~}dz%yVP(3aLt2td+QUsXJ4EIDOxN6~Hl|9{3blX`~vY2v#{AW_BOg z1RU|VnYEbN6JR@V)YW8WcR~n@icvJI$RW)hV4tLmz7e<#%#n0M((O>yC7@E$)u6H` zwUO~0t|~uZqb?r2@4TdiS%7~jDN@{O;AF_L8JHgYJNVB`9EGUE51#u zfD@ATN55(+THLryY9-zCR-FA?EU8}7`s~}b_*RyEJ0Quk*qC2TL)EiO(y8&PXQ)X! zD``!P2LMVFSCTdW2Z1G711rS4B*u!zzxlrYY)&*pzbm{0bh_`-C~%*r4QvG(LnX<1 zG8?7uD*&6~gm;)(hclDQ)Su(gTU_`5dJQVhg Y8yj$(NL$p}{r~^~07*qoM6N<$f&zw93;+NC literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_6/white_32.png b/assets/icons/guardia/icon-1_6/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..423f13145987289741b390504f8c925c987ef468 GIT binary patch literal 1003 zcmV#!e5G9;vdRNQ%EhRkUu4V6Dxlxmyw)u z*`>57x0EckKQNQqT(-URoISs@@4kNL=i51)@~L0H&-eK}pXc^@KNt8vEpeuSl;)GfX{%J4zYMPa6NE4aILy1BKFo@2gx7m7=aAu_rOoUWx!70 z3m_Gr0(=8}09*;|0)FYDyi){HNEz@Wumw01_!#&O*jDsCzz!hs@Mc8((G>&H#rrZM zJ$(b%U50!JJX}uP4BP>%1eO5nBI4&RQ5fl9WafSvItTb1c(?8?1l}qq=GFhxz)i`k z{+9Lw2c~R*1;E;WTLP`H?=7X)6Z~58@>23Lttaqs=+6M|1C9sQ0x5idf$}6E)9q7W z6_8$^m^dh-MkC^@K~E8rDX;AUU<}v{d;;vNOqdNE2mD@qv&yi8z_Ilt=M^X~O1>@` zF|m3@M7=_N?eNJs?dq(EOyXud8R(erPHnG(A!?{Of@Y748-4N5F%?T;K^{ zQHEW847eZIUeD9>d`c0xSj~#|yt-LEw|B0Ns_(1Y)eViim#D9(Th!g^se>ZWcd19! z|2p;ML41=5uGamkx}v`OMth_mF(Uq~ZK8acdU65H0$PG}xKN*|a&#l#hl(#{WM|9> zd>Ik@`|6@)bwnIg*8opdx~0G$dMvFw(J-n>8!7|mSLP(`uF9lL$tM5b!j>LwQ*Tjc zwa@v7)#l0QsP`r&2DWJ{_tp984s~wBsKmnZCSUE>sOR^QwNhQ%khxsV;?xNPQS?;2 z8hEn8xHJcnh)DEj!+EymgY+=F<2@0PZFm&8yh`<>>aC4u7#O;!|6|l$6@@W%ebJW| zs^6)z2O4)DuXNn1zMw8F`i=FRJJt8v5uD6`1$E(q#w<7yshSIyG%-{A9Me`c_(mEI zEr%lyxG93T4XERE?I)Go2Tvm;Wn?q-Kv zoWM?;G?hgu7_PzdA>f+oc6+Lr^h>?Tj5s0yjbA!+LKUtTBVtoe=SWLnqBZmM&PL^H z7oVxFY~9b);4+~z`V1f&Yx140;$D>;7hjHzMZ_arC*~Ph(I!->>|d*=zp~d198za| Z{RNjf+J3eJAJqT=002ovPDHLkV1k>=?Tr8c literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_6/white_48.png b/assets/icons/guardia/icon-1_6/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..66c7c16fccdf86f2fa70bd1d7e745b60a4677466 GIT binary patch literal 1656 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_7/navy_24.png b/assets/icons/guardia/icon-1_7/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..e0dd13c19039c57ba94bb09e3f98abf134b16776 GIT binary patch literal 1141 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 A;Q#;t literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_7/white_32.png b/assets/icons/guardia/icon-1_7/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ca63bdf60950ef5c68b59e9ed3ef1fe143fdc3a7 GIT binary patch literal 1243 zcmV<11SI>3P)v;+Lr!+lk$?(0gOb%;eV5Pi+^vBv{lmQlD?F*OVYWL-jTG^^UoyBl=O|H?k*d66@n2&FpYKuuqXgl23gOV0o2Xa2*fYVtzS{M;Odtd$> zwlY?xia-x=X5n4JeJQZrt#_5{yxQGyVLFb8ZQegm(yhQ|uRB}PEx-v5HplM~v1Kf2 zNu|u(#y$bkSidt&re^QQMa>U}RIPk@Ou z1{@LV(s!{0xp6>JE`ApH5twVqO@Y|}JORuB)&eO+k9pr(L%zaXSOp}a2aQtNNu7Ab zNH*j^*jT6a{!`!zV5duwrFq}$zIDd6`DUZ^t^>&T^Ndc~>jN$VPA(Al9|2T=b|49I zJ#e`l%r&$rLJ#=us4%}|1-9WbKY+#+&?YC&n2O74atc?9O-j$+K=!SM@ zw%e@E>pL53cbT@h6m1S5(fHHXkb}=>Y9z%a*QeJK+F=3?7{-m+Rz@csZFO5-YpKqw z$Itq_Cmr4koM$2~aWE~-q&R$y8rn9OW_m=V!=-iW7uC(bC}>Krm9o{g#?`(V2Rfa} zB}QNkaI@vLrg&MJWnMdI8z(y3^)6e@VUljOIk4R%y|Ji_rMiGdYhfWwo>PlV+~mOmw{NK#0xfQrvrL+Sf2yjp8+%~agr{NZ5R8#G!X~7 ztlcYZJV|xu5l&T|RI5?w<9bq+3hU$&K4%^cTios_e3+_ZIiip&dR}1!rn{i+exJ}X;!<5&sk7W7L>hZ?Z_*s%p^SeBh z&NjP;B<0r=D`}QzhPy{bIX`qS7qhMoNv&>|Qw?$LT_S?jE=M9V;`v~W69v9hkL>;g zkGh>}9Lo2J%zF`Wa4N_4<36G|ndFb>u^g4D{&hR<<8NdQGrgSeX?_3z002ovPDHLk FV1g?tSTq0t literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_7/white_48.png b/assets/icons/guardia/icon-1_7/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..aaaa5487f7f676c5220cc8f4af6ae87d6924ae45 GIT binary patch literal 1955 zcmV;U2VD4xP)iEkLp%A_hrb0$?tHCIJ23yP;&s9{?6a#A7673I5vx6ikr( z$&9}WU~GDAAridA{0RVN0%(tjKSo1{T^7K?GNmudkP6?z&);!J|;W ztvQ~g_H4DbZwD|Pz?HVjHUJa7w%K#jde-CEbqOHM8xpxt#dAamMw>l0ONtR%UOqy!ou*-LVxa8L3a&()abbo+nNF+QU#dX-W` z9T961fIR@r2Cy%HsQ~r?@U!q85q|l_dfJ;J`NaG2+4zeBwD^op}a zRe*er;IYM~?laScUpONR_kD&N!{0TF8Xx_S~i{gci}Lp1iax0u0!p<#qZQ2VfS-Gwj?0*6e`C8f>N6wu~}(;j9j$ zby2+nLoEX_dcO?-E_0Ta zBAzDsd&QaIbM^j-hHGob4 z4;fN70XPf5Isjh)c-TzM1#l98&n=wt#_G&hl9C0#)08tJqJ5-HyPV|R)l5cm5=oW8 zGe}NzSWNGJAbB#$y-BXl#@CZPh2#;+$Q9$qlWcJ&K7E*TZ&T*43ZZ&U7`~P>TRX z)KFDP@>Bqi1NaEQ{QwR&Jc`2rtOf9t8P~f-K2RmY0su2SR}6g%K-PKzz)?QuB>+DH zP!56f#uS$pmwVrP9G3fP6(9)#Yj0shd_wX@Z&1|kN=6Z(1Fx>K$E8)q)p`ygl42Se z?$<@c0zuI|Md~+ppt6{sPgb$@I>`_1oca5HSEj37Rra_lJ;s<`qliLslPl4gB&T|Q zkE_tNBvrs|&lIQqr}@l}D%w-j>H}%A%s9n@&UciU;HdDY1?+G%`Ngmq@4v|aE--WN zW+Ao1*3tMPSF~CShi)-_MRv|sLvLJJeyAouq7U324p-Xur-<=oU9->jQ%?ha5i4(QDA%6?N8vypQ8EKQQ z0&ug#A*{6({=Ll*gCX##nYa~zoKv*L(P@0*)jVx?BvNDaPIfI*lLc}LW4*5=5;VJk zS4~Dz#vk`qDNts8XQw)Pa&t2s@sbJJpFyN-?HSG}&o z)#_qnKPt|XGTNM}Tf9a&W@Ux54=X^9w*;T>0O&601~XIUR7Hs`r;dolhRQQaN)d5^ zpB2%*8b)E=08|S-2jF7|4JEq8wq8vFRBm`tM0`L}*CS&x;mVv!2khZOFh#L+g^0|W z`TU%cU#OHgj-=qbez<0Tq(r97ILGO}!vd7e%NY=6Q>RtT$(~2L`wZiL3duPYXVx5r zka@gJccHPY!@u;JvM({o`Ew>~y(Xc5wLnB%oP9dd1=Tj= zxac6T8~A%&e_ER-LhYZf zFv}DWC0FOm0G#N{+RE%V=(s-75h^9Br0uD$CO7+8B{Z^fd4l77mxYL|HJ#*6F0D=c zrJOU((JAd&6+*hVKi8XEK>ev7P002ovPDHLkV1gEquBre4 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_7/white_64.png b/assets/icons/guardia/icon-1_7/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e2efdc7f943c683534af34727a5ea4fc5a8cc9 GIT binary patch literal 2656 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_8/navy_64.png b/assets/icons/guardia/icon-1_8/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed038fbbee2ca681e7a8b169b979fd426ebc72d GIT binary patch literal 4565 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_8/white_16.png b/assets/icons/guardia/icon-1_8/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6a19ec14b5f60fc0e192c42923fd4287616187 GIT binary patch literal 479 zcmV<50U-W~P)H@v5XOJ^>0d?4K!=t_BGL(yh@sL3iA2OA8iT=NVIfS!C=!E-bYUQ!EQG;iWfD_~ z2?JrXkf70@T-_&spSHf_lDqHT_wKppc@I|j)L6=2?r@{7Dr>sAK7Uf3R(lyYZ6YET zBI0M+LUvRKvtY%e>MdX=uo>8!_XeuEz&>C*@Co<~90R^a#07N>I1k(d#>(Ec2&}4S zf#<**U=#2G$Z;+M7l9iQ@dWq+B-*!$j)K}#_o$cDqwUP>H**ca0d8Zy!l6>j%3;4k-EF$DfOm$?tfB_sB7|Ij#U2+s#j{v zYwC=;v28q1^9}*mfjMBjRG3ru1E+!6h?rO315-e+MckAM^T5;c2lGHNzXLc9>{8d3 zboV17rEZdgril0!5qE%(z$suoFapd(#1G&xFkLba_4C!V53v+@0h|P01J8i1i&8}- zx_leMz=mr2TY+WBJfc2Ohud!I7WJWexVstExC VFu|yZRmcDU002ovPDHLkV1naf-}L|h literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_8/white_24.png b/assets/icons/guardia/icon-1_8/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..94ebf9e513cb2c7464b984bd062079068fe07673 GIT binary patch literal 811 zcmV+`1JwM9P)uB%o;1|k$`B_ep0A0SzpP!~l+NnjvS;zgihhI(Tliro|iLN}Fx5t@Y+ z1hH5kR0v|-6!am67+F*xNMMMPz5A0{=2_OKeP0*!froR>%$fh0GxMK0!43M<0U&DG zjRaFT-^{zT}O34=k?*P957b0Q^I0O89RfrmJbs6vy z@F(yG@H21@*aCb5%#4V2WwQv_2ds^V@6|oE_g-K<@b}086_&itgTMjcejsnMtgbsR zfq}E7dkgprcp-rbd@v#|SE!Cf#OoEp?kEe?x#}D0+v-%Uil>>Zj_G7WfwRusXR2@_%-=PgWmR-&gmm3)SiBarKE7`19&e zW81GLM%mQRwbqZS@2aQN$4hoojnAp))kn&~$!)xL9Yo1;^I#f8#OFX7?nxRZctl)O zw^!0v0S{EIjM8)55cQDnRd=;K-=uz0^O@?m>Y)r}6NScpQUjhIsCNL*79~#uOH&;Y zS!7eo^WC{8BJL@t&J}I5PF@6_9@~PNj3@eZAj2_Ox-72MS*hxph`6M_3ET#JSw)#u z-z{gJsTvvaxt)U)Wc&^ScLKiwKLUqzLk@RXY?BUt|w!T28NA z+?}4PXVi}}nd;Z-&K5nBSx?sdDfQ*1N%mt=#`#y^C@>qyesc@(1MpoXuUlb#1=v{g z)Xy!?hkG6XTpmN!SAoO831EL7RsbVyI3i90KLP6^;#B2vMm5a|y))FC@Ugn865Pl} znxuNW`k6XgJyQLu?+e!er}31UuU3B_6Yqi6xIsNzFWOZ#Fp(QXRrG>pJ&yinHS6Wt pedt=Zx*mN$!{$-yr|;SSuK>Q#ksUwYN?!l~002ovPDHLkV1heAe*6Fc literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_8/white_32.png b/assets/icons/guardia/icon-1_8/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0bfcd02d7b65e96cf32eacd4f1161ef4d0d4775d GIT binary patch literal 1011 zcmVw&%=$Dw4`!+{UPT){{kI(TTR^WbIg$uA2 zm*#k*i^u8s6Q@*jhv0pjm&$Zng&STt4nN}DwCX5ajN9=dKEWEikP5EO_5E-*es6>a zB8g6ngYjJ$P$S(2eOUDqu8(N#hClc05keA?J5!l&@pqT-PQ~{*Jl!h1p(f%n9gpKv zEX3~3dRyRNuT=V+KEmHiL}T<$ek$K!2A;)7n2%kmwaNKBAcbGvLwKBjH{H-TcZ^WY zAis~sGwJ^uuxrlmgLSyBhw#TT`83~KmlX{MX06EacqI|J3}0bE58+QnmWp`k>-TL` z5Yw=bpbzwK}zLsk*LXjK3P9z4p>caDZOr=;TFf(0sb7s_;eU-4u zk|Xe09vX@Sg4^&b_Rc*`-VbG#A*$aM&0LiqB47uz2Atee0eMF;Eepv49F)Z*pbR=c z1MrDFvu7r&`?7GY%`CamEy-^v`OO>6`c951ScEqNx?H;`11~DyUpOIAirjv8#bYTJ zcO|OGf=haq-(Hj@H@cXWSRXYU-(YqYsx=kl6Vu}9iNauYD{jIg-MvI#vUzY_g5NR= z-h!vH+%9c|=d%&`VAPT7d^9F2^L^|Muwko0>wD7wzvKd+~t11*GXMZrKO3m}PIuIL5#^I7l_yVV8YqdphSGnX$yq+z21njY` zt=L$p>UQU5Ox%$QwYBAq643_+&Cc)b`$@40i8Dvp*JRWqtL(S!<+zQu=1T3*-!om^ h(rAKrxaH$P{{r1)uZL+jTJ`_{002ovPDHLkV1g$d`+EQY literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_8/white_48.png b/assets/icons/guardia/icon-1_8/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6415bdebd61f1a9a7f8e1e507a520932261411 GIT binary patch literal 1664 zcmV-`27md9P)T+CE`q=V z`v9*B@Lxa;a1n5t#zu*+(3IfoT_Deoa|CU!dk4B2SO5$Fsx!P_1J9Q;Z|)-c6?Dzj za0148+GYhR0)CV<{36f?=nAw>=Bfr30S`6G0;Sv_5z2p68ao=82P_9J$rB<2{!W1( zq32pX{{r+9Z%>W&PZd=PeBGkJHo#NBbl@i744@OxGUuDKwa|ya6S_Yq12{wt0(XmN zWTKE(z+u1-z)X!l2CM)&l%v>s27#ZUMLuDDS^~TcJPw=(43Q5{Oy>C>cv<%?qP6sV zdq(pG2^SUjFz^$wE$}z+WLeselL-7&Nq)TEwF8a-E|iAdDvL9MxeGi8j008yH|GT8 zEg8)h5~bA@F<^h-WMI4$vu7$`Ij%EVi(FcQ-vew%;8fr;U=r|!zI6c*fOn-;x0utd zS@4mPcr6_eF%LPk(ye1$aV2s-AEB;qvvsOg& zM@jRw8x6jMAiF8cI4uKi%LvjU0pzatmf|L_+bkrS{|9(K&Q%fcB?Q?cDOgK^;Ykb7 zOWJ$~Xp@%$Gd{mqZqu&O{Z0i0+1m?^1o=@}XPGK;Zcmi>eBUJ9j!xfg@|}|`@{+)K z_t>!k@Y(p7B1^rVRnDdoB<)tGsuAlN-<1GATi*>;ds5dc<)zuC0v{LjAe|*pJ<9~| zy;K{Gd3)ltbCZB92444%3P7I}Y>v+#C%$RkZ`rzex@dfm8p9isl)T}VNP45xw6WsG zbm>9sG#~|=1O5c@O^xk1>)PzL>OQ@QMS4N&Y;Ykf`5|zU78_Fn{3$AalN0b!IZ=o= zB|vwjVW+cFo;=Fkp7{qM1n(lRHnZVow$RMJG_$25PHxyk-_hbpAgSHS6N-kiDtS7bIReiZ0F>~wk5bh2;oZ1X4Z zY{m-Bb^QQ%qarOu&T-#siSO4WF>XSs`>(}eMx--vM#dSYkeN@a; zq0;@%b!w60o_VZ#AkXcQhKRSi0rzYP{F-RGSt5W3u+zTrT`7!38T?#c>9ktf@QmZv z6U}Ur((8OPJH*Te>DjBQ&$~J^7rvgSQ8RNP`vJ%5>_6hDiz_obv>be8QKC6dk@GXB z4Ni|FeY~gInud-5)4&Bj13t~fKntA%-P6zt^Gq{Use;dkm6`HRhEYp>pQF4BD`ovF@MVQad7WRl=+rN4vx=wzbI->uYHW)jT1 zD=|#avE;nOf=&K+Qqvz)Vz`3cTn&~ z;WzEZJ_Bl_G)E)drXoJ3MO|xaHsoJ*)_(7Tvqk+Yzm@ENK>q^Gr-WWC*JR270000< KMNUMnLSTZ4dpNBC literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_8/white_64.png b/assets/icons/guardia/icon-1_8/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5b549a13d8a43597f57c0b57d44ddc241458b2 GIT binary patch literal 2388 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_9/navy_32.png b/assets/icons/guardia/icon-1_9/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..7136c0bc1f697433167e8f1ef8bc39b4d5040591 GIT binary patch literal 1162 zcmV;51a4 zNAVL-BE>`#Av2mt4MBvJ;RutcH--cP45tp*NBcgg%RiTGtH&GKh?r@3 z&WCjEx>WjRBw|RVETI3DfDjHlq|>?5%Hr4}Tv|b%#d^OY+K;$PP)>p-=}e?cd;RpJ zvCw8GNFZ*A^hhaMAE7O45orN=7}akO% zRS85Q4yh(BF%Cu>z%(OfJ&;9oAA^4$;M^yD6^RC;0mOY7Gz!c?Gm(n(uQ5qt42wyLU@Nmx~-h5V01a+Y(iKCoJZKpsl?IS z>q1J;rbvJ()7K$^SAbcdC&=*uU5TG=V}GaODi+`<6_;+93sW}&tMe*iQw-fWNca9* z{&p#NSbWCyD5t2YTZlKjozsc8M@180exI$B!^(&of|ngK$!uvU6nh?#gD8Dy?nyGq zix8Kx0{N&S4xw4A!P$=JL%q5BbZZE;uYs%udjgdNnZ%K?7Tcj?@*j#l0c=I&IjsE(_y+Y_IkR_pafjcq@+75l z6#mbV%HDhy%yC3kB1Tb7GTi@h$zo+`976Z4M>K}YJk%Zm`y$hRUO?X?GYQzQxxaQ9 z9XtK#8BtKG#4mn+2wuJi_#SwMOtP0?%X*CCTkJug1BQ2F%^=2Y23|n*CMq8hxVDdz zsR4q~ZUVA~A*T+L`^?v-SQo{VgIhHPejW$nIqEJ2@XP~1FPS}ufx`r&OAu!Z>U<93 zqIwGPw$YjVuJrn%?Ni||hb$I*Gl!|E7_VEM08roKkewma`1U~vMqM%u9+|c?K$OQe zOvkNt=}h((RTaXk{MPO9yS2;_!?1O5ovJgzy(59%xt4neU92-$sEvkVg~ttH4C%H% zO3r9%QrbjGN0e~fFUkStM4>hysHZ3%gMBhy0$Q-!&LM))i)gNyROD=}gqaglAm#g61-mJV6X+lmYsBL%x)R-m z=~y0mWe6;8U4Tmq=q5B5%X@x#b00bP9eNIBi*=ym9LMT+N#)Vl3~J>~uum5%T`wT~ zhU!4x(xP>!He$>|L}sJXNjCciKfZgua7mf)I3A5r9|%ULpk@Weu0ZjfF%Q)oBG*v8 zj^QkhJbCSDT9O9V;&T6Bn4>qofYmeA*^4 ciMs`V12-efh!-Wli2wiq07*qoM6N<$g6qB@)c^nh literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_9/navy_48.png b/assets/icons/guardia/icon-1_9/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdbbcca2677755db949aa5076edb04f0902df71 GIT binary patch literal 1844 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 RA~OI0002ovPDHLkV1i(3{*C|u literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_9/white_16.png b/assets/icons/guardia/icon-1_9/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd86dc18d8b96bf39a84d84e8b7f6978f924628 GIT binary patch literal 388 zcmV-~0ek+5P)xh-JQ4lI_En4PfN0`;cp7JC#kJ`maaG+;asn67l)2j&C0Xh@I|n5un{rfrPx1*zle8aRp<&ie<2mN~;%$!5 zF0QK9lU%_?yukY&-j9=Aon;)Ts@3TdjgF~zZnB-ip&t5xm8yF4+e@5fvQ_M-OZ-J* i^ADK18is5Ar}hITPsXFG>((s*0000@K-+Sl2%#sE6EEv+YM9& zaJk+ed%ezgOt4*xeM$AI5U>vz1jZ$O%k?O3NwYl*BuK41V0#!i3hV@40$+j6z!Tt- zq~|SXo9Js4h)$|*^Y;jF2-pBT1g=PWm3ym!gTQX!9dK3Bt#(+dsz=qN60{8gpMa@cn`>p;du@-|zG?e}?V)0?uk76R65GdYU$;G)-H#M5Y!kHwJ_~FG-T=>lFG)pk9ka3?c#(M@vio}5S4F4rZ;``#8-d}ZBE)_TJd!lo x3!@u&-+Xeqy|(9b17%*5UP;y8`{UuCjh`|$Q810&y;cAK002ovPDHLkV1fj(8WR8j literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_9/white_32.png b/assets/icons/guardia/icon-1_9/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a36443bf40eca8561cbf21b74d4f49b9c9799f GIT binary patch literal 823 zcmV-71IYY|P)=6vuz-yWdsR=wV_HAsd)9N|K<*pg}|+Jq8h2gGdM}0tYoNNQfp4YS2grNf`~A zMARf26oqJ6m{3{?B|>0tsI)NeFP3+mdynUS=lWeKYH$}E4twqO`0usWUTec5Ez*BX zajuGL>Q2=1R7CjC!J3EEfjTjQKaqR`!@#e=Mqm%HJtE#~$qoz1)VK%j4YPWe`j&cF-JxFF+FPqWt$wb4 zs6L{u=%i;(+U8IjUcI{OV;mqisxPTut8b`x zboPfGpi$v&%UoZP`bvFWy}eR;21R24m;~+y?gK6cb^|X)#K8{w-r{N%piSP@ORHFK z15N_30j~nb+vxMVK>fmLdc0$Ja;(sunVQKC?@skM^{9G9`5d&7H#M+HeW${oIlQW4 zXkt_-%V4*LR;y2`2i4@bW`N}BmY3qH;@_jb ztsbiMtgn1-E4kh3!|Jk%x)=)p)Bh#aTsCy}H>%rfFHgHmy}2W^LjA0I z$(4NohVvqso^~mGvXq83`91+M6&EHiB7SHYPMw?=c?}1(?wtw4vjCVXnLpb1yNYNK z5xK~Q&j)}002ovPDHLkV1jH~ BgwOy0 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-1_9/white_48.png b/assets/icons/guardia/icon-1_9/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e105adeef1cfebca79ab56d96f30ba813f549b3e GIT binary patch literal 1169 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 aNcbPoU}a4rpx@L00000?P) zPiWj#5XV3B-rL{q#u!qg1e0hB^%5vF$*O33@TiyILBX3u$R?Mz5GWLS3F56#DA}>g8I9=qGiE_(+W3nUvhek)JjD3{X zCU=ZqM6%z(Zj!W()7btMZ!h8WGeiW{D$08#?I-X%-;iaS82360pN#KwpuvDmA-qWD zdr@&1eIDpX@u)eBgqKj?OVF2ba*LpO8*YCHl7V(0_Dft+Bcx0G^6VT#tCtZgJlXvd z+kbzIO9pAA-{R#cLiQg3K~YI4l$W7+lUm^}m9;*Swja=wsgQliLf8Wy4o(5-V{G^bVSH5$zt3xNvjA!1(bTH32d$?H@_Ji?D+?WvmLKHG+Mj#g+I5Suw+^ ZeGH7pAVP-l8(07U002ovPDHLkV1g^+TM_^O literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-2/navy_24.png b/assets/icons/guardia/icon-2/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ad7fce21ec78a36832a8bf7eb8c117b5406f21 GIT binary patch literal 1128 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 UZjvDqYybcN07*qoM6N<$f+&(uy8r+H literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-2/navy_48.png b/assets/icons/guardia/icon-2/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..369a5f93a164b5dceb0e490e5209d0a90d307e4a GIT binary patch literal 2657 zcmV-n3ZC_eP)5QEW#YDi2#LKlBU)JQ`3XS*@T zAMy`EP!@uTzy7c)jhGmtCah6HAlo096qHgTp+BIsg?6{ydGFnO&AIQ*kKLKsnQaNm zNw)K5?z!jQbI-Zwe9w7>cR9(NXU|8!Qzf0g1I+vJ-XhNA!}{UFKXc}K5D&ii?)AGg z>GaK1F1VMh4kn&0 zvwiDb)R^_$?TF@%b>rza?ox<{z@1tIe4F8|5ffyy6=(@tPL^b3^%Ux_Ad>LECeJ0n zB0S5(_mwM~YIZ6BDI$9GDNb%+@52XRn}MC~o!m1GJJ)J4vUwjSz8p!zskc+70>0tP zDk4%%J^b1QpWC)A>fqnG!Nb@bg-j)Tq3b?|nxK$|kQ zxNu+8%WFF~(4_WTK~QLCPpNGecx*mCUDI*!pn=UjndVoZ-2%h63~{>pDacAlKE0B}+V0vy@+e0nRUCfwTD; z>YBzuT!#ADJAwNGUv1&0JE4<{*heTz-=hjZ98AxkrCl3>$1E^~-q(~yk#RY+9ACMh;e$?9iuI;U>& zeqHn6W*;Q|74UN>HK~q?B81m4ej~{BxjYfPskaGmh!})A!l!``Bl039Hi)`WgUw`k z>w^WnzY~!U;pK0{r3jI;^B(NH3iPCq{q(cWvyc88Q+lqqvVkw7wD@Tz$6o+H6_#=x zE+Dz<$iJ8ze+hVVL0cO94g{k|xXj{Z6}9bu!KLK_0c7|F+z1AV0|Y@Tq|<+7^T-*z zUmxa5TUz(lASH`S)t!DoZR8tzGq8zX{OIjhK*SSOBD`NpRK7NB-X;*0z|EX#@;R4K zDn)p=h^RaqjFA<5cBXy3l&Bo3p)m0##B9Q*U{qe>&qIMWx5&e2cp`H@#GI{Qvnno} zl6qi?bm|bX+tmz>Vjd@*{sf*?xI{yyx=4h#XYh>Y^Sp5CTYFeGeIF8E87^|ZjKNut z<)J1YTY*c9ZTNGwz^JfqY%g$QU)ITSjo-J-&m^7$=*7QtKBoLIhiCuPUxCh8+e}b< zR>zc&df3qVJvkv9_)*fb+^AvQi4x`IZO64AlGVbdqgh)v7dDKRW-n6ky>Gc?Vysuz z@25Zy$`|e-^nteLF;|>!Cmope&9i?jnTN0YL7tleJ3Jd-TS-N}g3Fdd0TDtvc87VZ zI?jOy@=b5}`Vy+yt$2SiQYh>tCW=nu?9Z4SKT@P!sNH@Om=EG@p0?1uflJOvd>dma({?W?R;90)K4t~?hdEF zyqj)dAKiF?>q}DKfD1xWHY|=-^QZDPyw?kyXUi z=dnItEWifW77nG7!wbq7Gog7Hx%`u%z)ySd$RJ^KKn2D$bFKxxhqs!L(h$<3vf$Dum>l25B{vVT zqVio#v>tC&0n-T#H8uO!NuqoB=Z{ZP8@U>ZZ^NfiNO&5mH50q+7fe3<9=xDVCJ=*7Z{aeaMZo3rgFC5^|`&pn@6WUjc#B>p<+lTls1@n6u z%E#LRkC?pSyY^(!q#bia+IDM*a)knJC^WykT!l62cGm=%67cmvv;Zg}FB4bP+;M0v z>V5)tpE{Xus_C~qqi9P3)5zLKDOWdR>uoYCP(S@zW6|?dph=^Kv&Zg1re6fN6yIok zI!~PZsZ&%RvEuTBiT&-QXFiA1hOwxH1ZOi+_xsl77YrqOAm9BDX^;4^`8Q?exJWNv z?QR3lJo+j$S}2`dgG8ahyAmo;-=oc?sUuQk)WNA?f#K2arkdEHoxOoXEubF2hnIle zFw$g?4fdmz`+fJ9CSyU$pbBW=EF4q&j~e{Z)NUK*P z*>v&#tM?1O$;Q}7TYuEo!@TBLkUQ1%XcNzLjQ1klS8aQPFKx~%tR4p!czMM}ywi?B zisu6%oasyLShi3bS%t&&bPFRUyh`%^%4VK2Tt#i99x`))bt+KSg!`pD&R;=o-cWeYhDLmpKDlSbK3yRQW6} zxrWRw#th(-15x|`o#-~!kG%Ak9Vf*0Y2NK5d4d{_`c*#vfAl0wY<2$y2S$WPQTUGJ P00000NkvXXu0mjfk>4*H literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-2/navy_64.png b/assets/icons/guardia/icon-2/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..98e4cd6f67391e492e384f60591baf44665b2eb0 GIT binary patch literal 3854 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 N002ovPDHLkV1m|u`g;HX literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-2/white_24.png b/assets/icons/guardia/icon-2/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7111e08a98eb99c6052ced853366ee8e56317b65 GIT binary patch literal 827 zcmV-B1H}A^P)V*6 z5CkP7Ek>Ejq#Lg%7u|J+92Q``4aY?_I49vWO z&mSCk26z|v(7zMg2Al$pI+Mhl(K+A^;OWE~Rfp9Q*-B0C0t0|+e<86M;0SOJXx13` z2RI140?fAfSVds=Vuyj9iH#=qHn2PE{c~c2zz-QnA+2>Hh(Zz(!+_VaMZ`ET-hy2P zyyy_ywFnCP>%cE=J)l3a{lLwP_&{Q> z0gnPBz@fw%_d{Uo%Ka)tOF2FP4yWeKSF9K)U z`fM4rPkBhw(xA1KiscL>?E#)m@%j;15A3aopygo9l92+rE+u7ntvRUL7r^%XfS%G9 zfVY5ax$jB;9Iyg^oy{B)?=kx|;otLfMS==5I({F-^VN=eFD`{|YRB{1E5 zmFze_l1t(4Xf<;VZ8Hv9jt{R_Tqt9~T?%3uHh002ovPDHLk FV1lPalJEck literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-2/white_32.png b/assets/icons/guardia/icon-2/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..09db3b098f3053162dab0168b5dd3f076c04ee8a GIT binary patch literal 1089 zcmV-H1it%;P)JeszT!sX%DOdi;li*m#sv!# zjXO0O?Z$Fd$mm($c?~&;Nzf+wW^X2!u&a&YYPu=g#w-xd9+4B0`de zfK|W@5FW}sExg;hp*7IvCDg!?h&Xn7mlPgLBz-DrLgx>rC4DF9(o=@(wDl{1KY^pb zJ3!ULinD?A%t>Gia1*dLBKAtEI$Btp<+lDq&J##_Rnn}a)m~S17fmx19ePB}7@q|O zA|hQ_n_iVMkBE~6uaT*2`GB_#6}i=cs+*>H2rw+^W8ep1FYv9T5r5zo;49!~^S+jJ zk9pg2ujxMlp98CXW@%_o1;XbUiXEx#_OtDOz0dzoJ|fal{5;hx9hTuc0|MnzDPzLW9;hDi1=R8oxoGTGADUf z!}Gx5u8L@W2*$i#SKQ%$d){f@w&HF-ZhXYNm%Sb@Is-0SOs?Z!{E?LLz-+$w36_oiEM$qm}IM~yFQmFR1E1NJDx=%);i06)46 z*ZYF`#=QN&UqHvTR^nIVDf18Th|fCclAdGvq6$RBAt%&u^RPt3e&@_C;MPJu`3Ezm z5%H#^j|xjCt!&>4bijwDWjRhk_6|n>ptthB&ml?!eii5JOIRoevP*dwxY`1lWN!hN z0}uI$ZIW0X?*qR8j}|4G?bq8ylJ;GOYr3>l8zeoqK+E+~54pQrWq55rWmws5naz*8 z3>()ao)6UR9$QSyT)=WK0M8ij`JH+Z1uB=)gz*6@k#f5uVxKKpX_Q5(A=~v`-RSg&rVPjC5Z&Z!-z{5tV$J;`+uQ!LlW zG;_+-zIx|0q5eiATYF!0+GrE=#lx;Hg&UZ%HF+iDU#!kPN!getOq$kBKKC6rdbp9T zC2a+6EVB4INl$nAGiu86UdQrDNqNVomo7GKlVt~5@or={n*OY$%#8!-n%{tHxG*r2 z3S8w{Z|Xbe^4@MkQ`fnt^icCRG%wQ&NYA9lnh@nnd12u{hPd}uuExz(00000NkvXX Hu0mjfCPWm- literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-2/white_48.png b/assets/icons/guardia/icon-2/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d46a30dedc2da0af0817ccc3d9c4a3239f93ae41 GIT binary patch literal 1651 zcmV-(28{WMP)yGBhH8)?NefD}Y@ha=>{7 zI~=M2rUBdr;8FZP;S>P(2VQ3h;BY28>j1t7Foly3=aPBj4MCfQ0@T@V?;8MoMbl~G z#DWC#`4qs2uX=4q> z&`22wjLd8*GMd#^a2ED%hgV^LbRy_ffEf*_>HvUi0Q3cOvhhbn$lMp;$=Qq|R={~^u8)_}LQ4c-`W zjQh2!I+ekDCE(Rm^)t3V9TusS2BO3xT+wtR^#fQFey^g2ro-k}YHnqV=s&B!oNeYT zK>RA7)d8<9gGKh08!<`ZhXAYxaD5Qc`W)PDt?fDhmjL*ZZDvLY3@e4$2H;`kPMR-J2?*VWb+p7PC07}9`05&Im#-zg(@hoy~YBQhNzB76$ zpEy_70%-cpSnwEEbuhR`v)>;9>wc|4BoUyb28YMncr{eP;u>otrrBfdgjSBGO`7RZj(Q2Y}&#XY>34;29A)7?`^iz=Z+N zGtid+>?O}!8x5?Dr`KfzVE z)nCE)Spjb-9Ec9`dj;L9#|{J2l&2iO0I*GGUjE*A5O zO*gz3z&g6rO0TLCT98T{778URo5^gr#KD+biM9jn$%!=x8N|OsuwU~cLbfJ5^h4vSS_ybw{70Sf-g6r ze-{;L2S{TB&CY2q>6HM{guV?aLIksQgHD2-3-A+wjRiCh^*WU>=60~c7Efd*;2Rw< zK0}i4y8+x73dXH-Gk{lneWWyxV9D2$C75cV&qJXk^`?`)H3}&^FnDAVNQyWyR|7vR@+^glp$bI&QpR)!Ih7<**izW`ZU?ZRUgMR z1i60A6L$NlByDk=*0{1WH5$8g2m_9>&eQIK&+oEgeRMJ%7b?^S6D8<6*d>VL)zfh` zn!tLVjLeqLW1mSn%8Q72!JUFvnXSg@ut8P*J^`F?Wzg|!g+g=^VVh3pxpcVr({{|kD>kj&S@l^l-002ovPDHLkV1lk!_^$u} literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-2/white_64.png b/assets/icons/guardia/icon-2/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..ad191c43f394f6a9faa0683cbcc02dd0fb81c976 GIT binary patch literal 2338 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 A6951J literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-20/white_24.png b/assets/icons/guardia/icon-20/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..699c54254825e6586e7d7975ad019f13a72bb805 GIT binary patch literal 644 zcmV-~0(N-MZgRgc+1;!gBMyAb+&lA~d*;lYJ7R;)wt)DM)aHLTZ4|)vK42911bmeA ztDLWG09dx;|Kq?p;5~3K=Z4lDz{^^fO{w`U;0y2&nCSekHYm6hgqIkHT?=sA4d4+l z3)}@p1|{6Z-1e^Q>)AJKKd^l=?QOQl)(c+G{=DtywhyH}Vf()AqiGMXg;DPVJ`@>Y z`%;*|Dd2|fJ-}h$Ch#(L0ena@o8!PGeXe9(6FmFNwyzfcQQLQHA4z-KcGLEFez$G! zFQx6;K}K%bo(WUZg6>H`r zShc=@Sjqpc0I7K}KLG^WivcQWF}HmMc$c?-ukEwBgTAT05+J~HI4kLKl|k8d11}`a zB$;c#4q$;lw5~Hqo$074ZD6smV@+$2TGn|6q2U3bQ2;&5aVbSP?i-|DUVUH^XaY}j z{uuBU_})Y7fhuvQMB~9&()A47PG7%=!~+E=s^u2jBl%+^`>GywO4HL{R^Bp;qFT;p z{x4;R?KsHrMQc}2qV4K@7JB&S6KnYy&FC?68kh!lMvY0($*41_fB0YJ+9}{o)}HOa z>s&vT56?YGPnPahA<`7Y7o(Nnr_xF+1i@0!&Q2>4Y;6P!K}ct3qiAPkW1*xHgPKBvmO)5L zv9MA^h$cpp-RzOs%v~qXx5@6h!3-?#-kE#ncjvdje+F&_Q%T0xeo9}Gw%&TcZd-1a zO4<%!zw`eNV4mcBH)R!qq#pmCmGoND6G_XG9z}YD61oT^SN#1aNS+2T4d5eyEa|wZ z3TRb$k3Yj*04D%k05H((PN@?il1lb#BD^Z;4uE4M&%4!?PK`o=khm`erRr{$bWhTx z<9Z~OC5`0owhdYG(1tzf{g6#GE(XUK}VjjU~1fdsjHO-xMzdy)Z3zZ}=! zX=BTZkX~A?phU}mkX(w#QV`m^mqs`7kD=f!a>K`ci79ZfsNUNK5kn;mYtrM8NTf2hr|7) z9DT@@ZOjGCbv_#|P6F8NRW5Zfdy+i>KKq?f0AE74v%0X$>2`L+*9vvQgn#wMHkM>E z=Yg^_tGFl96Q#k@XvnRZT<+e9XJd=5I&L`y_m+UaqVk`o*Np^jwLhu90f^Q08g-s6 Q&j0`b07*qoM6N<$f~N(7kN^Mx literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-20/white_48.png b/assets/icons/guardia/icon-20/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b41ba1df3f0da5981b62316de55d490ceb64369b GIT binary patch literal 1215 zcmV;w1VH95)ch4dJzv%P$7gQn`m6rWV5?}sj=SX(bF^AJJU0h=oU0R-LGEtzv|ViS5*T` zv_u1uF=movU2w?E#DAS^oR&8;NxA^IBwn{NmIG!s&6!G)CgT2D!$ z&wkqiZgZ8S!;F1kJvJx}CcY8a2%KNSk`B2afL*{$C3qGN%}(4{uo=+_-4+)KV1S}jwb6Q9SEM?Da5*u$M_CO z-*@@OEs+~t-lzguB-t3iw&vh7zFdjz*>fwCu|v{Nu_8s>m&g6?kl&mF*@w4=@GVu~ zGyZZIwUV4yT!GS9QglNd1&Tg4th>vbz!o!mJH4-(V`g)qgkQ76sIZEf;ENLYO=k8^ z8GKl&>OgYf?mBsd$;XDLfLqYad^0^CA?+D6d$-E+Vd2>tGW)@5Rmv7Mz`Gl~1iTiO z?*O0iT?@PlT-xP~@r?61;Eyzw`e%{)S%Ea^t~jJR+$N|Mu5lai5b$~i%wko%?tKb) z!_2;>Au4KCP4{P(uH3Leiemi5jseMY{Kp6N`F=NXyLaPmQiHvnn8okZ^O=h>abheA z*uN`L=fmv?%xSy&aW8_h&Sb!yuI=wbzw=rXw3M6aR42vUgloh=OBeV34x4HtL zqn-jj1b!a?gEg)|itE7jzuK^;080BEDw5J zTavNRhOFvDivg%kA?=ywe371IjpxKz*{v2sVnFJqKz@og38-#3Zfpe>tAH)ig^U4d z&|XYshB!(py1g&u_U(R6Jh#iF@PDUvIT*il{*-BYRPulSC8x*zx&3cP$g_+; zecNfKmI7vW((m3?h@*e9;y{~<^x#;QI{X%uS4YAZvSxExlKdPwRg#^?j>Wf+^g2w7 zE`Rwv>`580HtyR(VD2)$0v7|1NV+cGc{;r+3jLJxq&cf1nr)KwYmD6ktdX=i<4eik z`dHByLQ$_FK1#-&H+Dr)ay76QI4`W>lP^l{lg;tp$D}A`#=2Y dy+n+G{sFU_w2Dy3cMt#o002ovPDHLkV1h+!RTBUJ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-20/white_64.png b/assets/icons/guardia/icon-20/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..7adb621ad6d845570da842e9bc7f8e09c36d0cd9 GIT binary patch literal 1500 zcmV<21ta>2P)2{a3dn9iJ65WM8uV36Ujsf3bTnID5$}e3qcfgt)ifN zB@&gOMo<@uKNO8It`rdyC8K6yW{%W*b>F*lr@N>7O}~EqX1bv1&#n78Rdwsut-e4* z4K>uz3MRo25lP7!vxv-9JECPkf+5koh>+xY0M-Y^BLE@*XGP=~mK%{2yGBTU!({r; zuDh*{3MCiCs5zPD)lzkSKM&w0)wXH=6o6d-#*O_7R}CwHNbVvzOY%>Wb0iD>##yJ|Cnj|Q)C2e@ z62N!XdXl5&2iCf}s1q>&y_gUJ@J}Xy9}3?EUsEJEkbIfs_AE0^0sj%n3$wtRbxB>p zZzB1%f%%){M3N9vz<)^ce8+D*QN|^81HX~vcLwG;lG7yr2`wQ2f57-ZaNrB}Ep-8Z zv8VZc_Dz?pf6WqZ_ncS=-q*Zp_8gL%Nsgynmy*0p`>d1Me`#R$+PBqq-(dn!OW5Jn zb!Pv*2Y$q^Bg{vCsgV7#WRa8&UPN?rayfvv0bB!MuZX;)S{4!Avc?wC-DW(h`8xsJ z4B#06hXLFxBB#9eRB*r8F7Tj5u=Kii@0S2j@KYl4qU)xTer2Czp&UU73itG>91bL z6E@pd0k8}HY7cyF%`X^je&A&ZsCNNyzUB`Z_}wD%S{8Vl7^6$UE+w&$yY zzuq)Io(H^}@2DZgc^S>~s)xPKG_TX6u7!SDSO0J~|a`v5!*V9bJ*q`_!R za9Z>KBJz|8tkwsY;v75<=!BiX_{xAH2vOa#b|Zjo3GL(wWh+l-#|3!Lm^LRw&yEcWkU` zWrzy!`XTHfs4x9Ss3%n>-N^;qhA&*mz`tpULC(JV_DFLD@gjjfG^}vJ4zp?3BXnGQeG|)I%7+oAMZOP zGkSDY%My4r7wFmy_Y*BXk~7AmC%a4J@g>tu}z4g7&Yn_oEpD(qnI108HEOaA!TPU0VGl(lR|$umQjy08ZF9 z9m^vka?oMR8wo}L^jz+&MR&hiV{1(iuG5fya1mo*`o~O|u5MC&egEDf%CU@glj@75 z)V2O<8|SP&Xa1yZD2ayZEMDCYO*Pa|Lk%^AdeZ-vs6AUCqs9mT0000DL7K!5MDQPo*@|w8h)ETp z3z2qFP|=MW-6%?0R8a9_A<}NNmVU&v$$K;MUOz|#SDw|Gd*=*y&OJ~KfwbbE@O$!? zpo*I{zN;^S9qIN@Me70YZx*WhD_m6-ntFo76CFOcYI-nw4w$9JJ>l0nl5w_Q46TTz zVuG|{&zC4}?MWbvNC@qIW&HM--;SmFQBsd~7eE#XghqI^aRD-B<Kgc@*fj3ZY#;_Bu zONbi5$a%)I*D8$@S}(09=yao<0+=~8izvKtyD)r4%oLbTqNPC!!BZ&9L6siy^3IHB zqQNS30n=>zH3oVI6S?Og>%esw&yG;mlNd9}ynU3~Ps6zSCyqMoX_Y^RRvH|e?*!3m zhFG!@qvP0Si1xFGu%!q1h^R0>HYoxsh%0Mr6vED9j0#fTa13kdDaIra8KNABBTh3~ zrV!Nt@{LH{agZ=}=!vJ5Y7-MzK!P|+SFvh3z_bvxax6HVKqKI7V}N|_`l>{&#j`Ed z1RMlzVTE>ssmJKo{FXjkqrD}P&&>iQ+Rw#SV=omei~zQODV9hr^PwBdy@6gNum$5i zB(szY_j%h`gp98Kf`9u0{s3B&*{eFhp;G_=002ovPDHLkV1mdHDWCuV literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-21/navy_24.png b/assets/icons/guardia/icon-21/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..c10b17eae35839f74f6cfff7cf3f59cdb47e5365 GIT binary patch literal 1110 zcmV-c1gZOpP)tiKrD7 zq|j+eh{`22Cd3D$iHeCJO6N>K!X;vOF-XuTA_$!_XD@TkOlO#OLi*r?e=^CQefIv> z+W)`yI!72UnwuR4W@&zWOc)pl_&-1@Pj?#VQs|U?wzCxX%woj33lT+g$4J-pm(~~7 z(q+dHGbFEoq_-2dV>*p(({R0=%tzIO;5yQ&=kvjqtwUl% z5cCr0y~N`lHn#ykwYSJIHb6m^y2<%*T~Ln*_7S&fwy9NKgeI8uD>wk<$xJz^XJJxY4>$3XbYx1kwYY zUzfO`q*-ACY&VX!GOIZe{k_kdN7CDa(c7_d1Z#hQTp_4eLw$QyRKkII8sVM1;U$bV zMVWNvJ75~sQxvy#F2WLm>O~B0Sx08e7Z~RRPE8zl`P(3$QJbAn*gF-KaIcn<9c}Uh zizhJ@e-7a!6Hn~m!fl@rRJWkn1Xboq(3??lP>v$@8#Gvn8G4DqkNzOpx(Lw*oT_yk z-1v9t1mW?b%J4jL)tfQIx%}rYF5Ef~;Q)u<{|lpasC^h4>>}OMf#1{1Fy~PD9a}S# zhZ_}Lj%H%7~MxEwE(|&f3(L>T_G^r zL0d<6)RM^~S3GbQ64T!b^3?)!apF60y&LdTo1-;h8)@;ynb}yAh`ya^0l+2CvbsN1#%e)?$!+h3zEf zyg|+=46niOdu;69a`I6U6=PoA4VBJL6ZvD$?7^}Kv0(Mn%5T1Ly)yq>T+4%Uj5Ng& cjPtYQUuYMhbj9IjHUIzs07*qoM6N<$f(X|Xb^rhX literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-21/navy_32.png b/assets/icons/guardia/icon-21/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..bc7f25ea7e2362be1215409c08736817204ee5a1 GIT binary patch literal 1746 zcmV;@1}*uCP)ShMkGE^|h=4wS z6a6MP_uO-S|IhFDJLkgtgUCPsb%=j)?mvvB8!B+z%J(BeUXY?CVS~6mYL zr;~YsNs+T!3mo?sSY?&?nYmzX1eL`K-G-l)$kVG)6~_%n#;T&se+C&6X#Xit8m;d{ zh7Y4MiuBQT==G;$&tyO%A=&+A8ROxf0*6VbzJlW}0`U-V9BFN0@1{M|#?4vRjPULR z=7L<$z$5#K#D9Pg3kiMTR{Cd6LQ6$S^u)+JacjqPN#4($R(xcX9c#(7BQMLOBz&qfAbYanrm%lMJ?Hx) zc!%DG+l2vsp=^e5upYsw@-p0Ts!#E?gz#)Y7JVI_{ z@*l7B`co$h5+m*|1glLYoIbkWbe#_IHWmP^CB|zSF|3$Q`_0s{ipmPsW~qk_g6S;Tl3?&IPM!Xx~mG+b7jYT9QQ3E z9iPq9e4I$T7+*M^~Vgix6F)`w-$A45YRg znx=Q=pt3I_^miHPdD8U!pzRvv@t~3}WiZulXr05`(Rw4*^*g8-v)ECaEp9}z)PSU- zan#FQB>YMcHNaN1{Ekr`WV|y{jmqpPC=U=Qk9I91+O-oQ=CkPNExGgKo*;dFq`cV3 ztRD4>l}{4^lMBIR;zKBV2g;v?=5Ai=*=)SIYP^Eb@mGPs%L7>9FXK&)BV|1ZfmTnG z?tUyE`Vi@qN8_3WNP7#yTg|}c1E!jajIc}ew_In@hldi)*ySH4d%A%p7nMW z8Tkb0he$u#&DEXtSl&jE0%5()-iHsA$V#WO=0xmEzC|QHiMFo?_R~V3;{sn~|ZH>3`sK2~W@s=crbc=OU;=`Cn)7(S9QC(}2fd-R&fb zdcuqb6p-%^0bML6IW%`ULaaA!ScTiLCXX31KU{;H+=f*)ipq8)WCrcuixu+mv%{oQ zUo33zd2d7KAb$m)4w3k?IGwFi-yJJ)+!sn{9CtR+uFqZQ4@&Uw;FIgaCX@eCa~Hx| zi1fa1=C!o}<&Uze{$6u+Z?4Twg*xBl-t&)1F#^HCjYf#A2rfm*N6aJS0<_+0lujuZ oh5v*9M~KoK3C8)~xBoT#6WmFfj^-dXD*ylh07*qoM6N<$f(I97aR2}S literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-21/navy_48.png b/assets/icons/guardia/icon-21/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c6379d2f8dc3d385f8fbcf1712d50a5abdf1de GIT binary patch literal 3080 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 WL)P2~KZ-yA0000(4>^Ee)j); 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 X0oQgqQvF&x00000NkvXXu0mjfDpqSx literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-21/white_16.png b/assets/icons/guardia/icon-21/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..70f2fdddbe890215d9dddd554197db2dc4ff1c69 GIT binary patch literal 498 zcmVuP8`~z0(Wie$pr6!UhTMJvo4jT)~ z&Sl)fG=3kQxAWH9kCnIHIz7+#Irjs-PYt!{V?%tCZ~9pD#Svj=11o{UMLz((_xa9l z`hYs7&J=kR_yT+ejubzwj+fmAk1jP}5;z7-0OP>xh`3+;DPSY;4fqM%Dcg|}XT;5! zc0}Az*8;oMv%nAFb{j3?w|WuS0z6NsiHJd_6cGue!zti2@C&#HyaCPtC)MoBL_|C* z&7kdSMpRSu7MLmTi@ndE4(!T|(rI;l zu}VtKBjD@srd?I9RZsS*m(@viR=uFEQLpqhO}C!vHee4h2kfZ1KLt)yiFYF+mugAf z*{yx_qUVT4^O1V4?3=|M2R48+Ly#N3J literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-21/white_24.png b/assets/icons/guardia/icon-21/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe69f29d77e6a4e16470bf6a829e6fb55393ae1 GIT binary patch literal 777 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 TnwSE!00000NkvXXu0mjfb0ngj literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-21/white_64.png b/assets/icons/guardia/icon-21/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..a45cfa32bfaf4ce6960a25ba709039e41ecffe8e GIT binary patch literal 2773 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-22/navy_24.png b/assets/icons/guardia/icon-22/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..aacc3e62120ebb342ee54c7f05ff397fa967e8c9 GIT binary patch literal 1190 zcmV;X1X=ruP)%kyPB(YAdw+7!;>YF?WPjjj%K@62lvK*;?Ezbum{5JD5;wXRv1O>sU^#~c zRgp<&XO#Ru3s76@McIxGF_t%Z9RKJv=6bN;5J$Fuj&r}Gaw0NG&$r0(*62+NDK~B& z227^|5_PX*+K;*um^_S8hBvZ}wq3miY|~q3o^m9TPm!p9s4$Nez&8R{@q!;Qc@`K( zxSO_J=L!_w;s(o`d=92^)U2*UbS79CPQIk0bw7!^O`s>S;3q`aakTY?o59H6f+vy< zU{fgZw=f)d7#k2OzF6ecGDjE|n*@$u#r=Q{5JHRWzK62g$ zoL3F9g7%g*Q8hsfILYCbPRu$Bdt<{N7a#<$so#tRzk(h@-J59qRodPk0NP2^`-nY; z#@}Vp+UZQ1+Q-muIh+*dg-w?Hne{?|CS`edoWXblMmyr20b5Ub@mlt89mzY3akS+y zHLDlkxkh}6api0m#;2%gbgp%OVLS{VkTNd6I0a=Xa0avIC>v?uJa~2i1ATD082r~^)pvWtt zxT1%_-b-9LyNUMgjVxL-4|Pd2^WOFSb*)T8niT9#F2&v^2=-u71(F4kF-sQ{L`D&v z#NgSTQEvzr^S&bkU^8$_BBWQw@}-e*Dxna@b>u|Wc-;3Paqt_$>XS-fmsgE zDlzSg_RP94y&uo2ar7ZtjPfW8>le_O9*tO7oLq%^6^JUwKkN(3|MvdmL^6iCWvJhb z=+6Y%BZ!ru@kemEZk)f7IpYGuWhVmWgG(-o1FX;H7izma%8vpS9%W?f5ee<(F0R0N>RYMH_X#fBK07*qoM6N<$ Ef-E91O8@`> literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-22/navy_32.png b/assets/icons/guardia/icon-22/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..1357815f03a8f84227a925a848be536c89a847a0 GIT binary patch literal 1811 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 AF8}}l literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-22/navy_64.png b/assets/icons/guardia/icon-22/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e97938b84e1c0d78d0ef93838355a257aac808 GIT binary patch literal 4582 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 V#0mZ4RIUI3002ovPDHLkV1fq4-tzze literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-22/white_24.png b/assets/icons/guardia/icon-22/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2c1bbe69397ce0f1cf10f2505cf36a6c06fc34 GIT binary patch literal 855 zcmV-d1E~CoP)2)FCFha+34HOF~d0eenL@d*A=vbI(0@_~3uO;zNuxvjP|j zOamqWp8^*m;++1Ai1vzp0*7vc9s@oHUIFdE#4`D+_XMoeB1RpSA^fb0h`X8j05~5J z7c+Ad@LOS~pLa%(ouRe~+>&%SjEL6E+z9+6=9#(G?Eijm2L_VylFXd%=W033%>GS)}LbKt6^ z1HJ_IX69IvXaxqkF9!8gq{D&BPjX1}tH6Cr(ijo13q2#^QfAfzicrk&04G$9?u}mg ztg`2HGUponYdafnxt?ZbjrXMaP7_*ft(6m;PX2mBO+9KYW*p|A7=a? zFdUFvgMlILqe{Qyxip}cM5PgM4Y*cnls5v5h!>gpyu?nc2s{Sv0Y7;Es0noMWXq)W z`^?-29LmfufPXCoW?Ecg*$g}bc16VH%v6as>bnB3%YhT5=MlhnW-`$cl$%k{Ex<7M zhYI0|ZN+>Xa9X)CW@R}7-7i%&*1N^5^<_m#Z^=2-h zSl?H6B&Y2jW_o`LECogaM{HM&mnPsBU>-0>xJ4h-T9V0``57?V?}LHq-kS_8@Q`bE zXY0P<$O>|GuDm8GQ&HOd${#PbmaRUq9(hkqHPf?3djo+*YP^VOvE~gPhAMx36a6}q zvvdCFnAG6=6S(4WzEI2oofUVLgQ7gODw?9Jdpa)f75S3g3Sczwv)8G>j}h@}ap?Ca hfFg=MPs8$mZvno31DTtsVqDU&6YEtu?H{Nlb=5U%BXUu8C$2ohSz1O?0@7iB53`0^4 z@Xw<=BD#kIXV62^zLF+L+9&5xe5(%wm@PjJI02Xhj02j06M^f2)#;tap2qG0m((Qb zeMzrMnj-0#TzgW|#Ht5|!+JkQOWG*ufKmuvlC)R#Ono;&Y7w!cvTm!C(?!5?pi|O# zpatlPi0wXKPRjaF!Sir;;l_wiv7RAV26RNk0!a@5rvRIP&r^&I_(y@-5WwpRGFei) zffKwb*PDSA!1@G#5!eP?1e{b-pzzX=EN{-|Ws=^Iv_#UzB|7kXn~U6lXPRQIT;s9x+Ui$ zCB5Dk6V?VuxW6RL17<|TX_-t0of8q)0HZU`X0(rhXClJZwq~Vl-6^UE%b@n-%K|n#e5kNpO_+cX)PrMlHux-<^zXD#Pkfod3Jw9{ONrTO+|*Sp9ZW0 z4g!t>PVWP&Plf6wmnb`z6K7&(vxQI1e7FL*1h4{j<=Ti?0*nC`N5t|h(dSe4pzZ** zw94Ri|F^(Zz=y!m!1NOBy4392hk%v91u3JE329@-_G4-6G6b=cPOXH??Bb+OA8d|@ zt&+N&?Gf>@q|OXYVQC|C$I7&1z1z5+y3hBP0Tn2D!p{zRhs&uDV#@V%R7p6ca`X8w zBBCMb(L#Pi{4D8ehcA0a<6k_W-d;Xe(hHKFazn|3#a+fPlo5picGba7dECmYyY;1}=BZ&CJuV^vRKweqjDUhHYAtlRP{-8X=jONJEH zW!79{f&<)FZqGfnav8c=kma^H%WAXTo9_8}?B7Sb?aoeUe(B0z z4{SX_ZRrikglD?0C7G0bjh-ZFOD3Z)7H0!(-j^2-EB z!1<|UqqtJ}IWxKZ*Q8o2w<7_p{U3m@)owwaK(j z)b9pLtRW9yIso4ZFHO0oZO8psb3#)0Tfh?$vAQV3dPzW!yLJ=bRP0h*B+1b%7 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-22/white_48.png b/assets/icons/guardia/icon-22/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..44f1ec334e11be9f6ee79cd7a491b9127a82f076 GIT binary patch literal 1986 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-23/navy_16.png b/assets/icons/guardia/icon-23/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b5a29062f2807d6ba97ddc9b6b01a1c68063c759 GIT binary patch literal 650 zcmV;50(Jd~P)#5(y;4RWn-08-_nh}R=XsvBLUsB#``^0;23I)hy*y@%IYRX#5`(E%*6y@35_bi z_^%AAgQt;jjY8`K%^(H$l8B?TGRL#gn1Ra`;$}BfH>auAE)q5FrVWJtp_3GfUBs=! zID3l9An*>ceISoAR?rT%h|xjfZsY6>N#nkwZ@7S$qabe)ozJKXFG2QV(n9%yNy?@N zVFnS!C;M?UiOUk?-1RfBt}QT7TS273X5|j0rL@*bA!!o%*VKCws!N_oKQcW&pGhbe zlicNWYAQvOA}R^9qb=%V4dUh|ksqQy7SsQ!7x5Qp3lC7O^;HdayFjmTvFz=deMjOjWm9+q)L>w+W6Jn$yO)}(js9@q+T zG=`;k%FSuZBJ z_G;}M*gg_5c6?07*qoM6N<$f{QUHrvLx| literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-23/navy_24.png b/assets/icons/guardia/icon-23/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..42673867a871624ca914b205e64005a0a431bd38 GIT binary patch literal 1131 zcmV-x1eE)UP)9(E6vuz(-Z#?^Xc3eeB}M{Oq!Pn01&zjZV;XVgrU@IP0-Z)k)(!mL{HOW6d9+;wV@8 zG0}RQy8ym`h)>5VCL5@lwS{Jr`AGXzF_NGxA(A&ayyHZadsks%$Us$L@*zm}P#->c zYZX*L@(gEe&F0r|67rfIK$KA$>7%b)2Ch(g`F>0i986)Qi-Z!Y306-rRTyJjuF(6^ zvTS~`4zCxe@BA7hMkEfcd4STUZmd}dHbLD=kb{_H9q22lt>KbB#N31OIo_SRbDcpCB3x9mZ*z#+X|L#EIJt?B4!6HUA51_Gt(G<~?fpome9z5TpE{rxV9%^vSq?+* zli0n$R!V=az_e^&!E{1-&|(V0>POxUC5eiel|k5$+z%p(4+CnR6&pKP*m^gK>&I(1 zMz`R3m9?86#CDv(O@E4a9%I82E%B9$v@M95#W@SpIrW3VhdQYAV&pjzT?V?F`tY`< zgbVPdN<8&CEw&$HlWd+EIy)zcZIF64MH#bs1}VM`glB17-9psbkJ!`nREvz)LJ=JW zIY~?LGCrvT4v)ilLrXG6!`it4)C=L0r=V%!c>RXLytjcxKpSmmjz%)QIQ^~W%3E!~EYLb+qX9<-iS&^MXwKt3nm10i(5q)h{kaWF3)) zgHOVMjQ8Hbr@%aoN+002ovPDHLkV1kM!7rp=h literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-23/navy_32.png b/assets/icons/guardia/icon-23/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..768d84331d4f4cb25dcbaeddc5b33201afd54ea5 GIT binary patch literal 1600 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 Q%>V!Z07*qoM6N<$g4~#5-v9sr literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-23/white_32.png b/assets/icons/guardia/icon-23/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..daca9f1e4a504fa54123ab169b2a461987c7b348 GIT binary patch literal 1121 zcmV-n1fKheP)z zU5J%c6o#L5Jn8gb)I|wqKNl4x7F0wR(M4oMWpz=}fK(SDg++ByST_dMji4b>Nk7mJ zVqFy34-sX7kko|`l|eBVq^BG$d^W=2zd_ z#YRS~h$!LA+YLy{`5xds-|R|Yhu3m^mMMye_X}IM0bcxrHyy0MeGu%so$AKS#?ZDkW`=afXq@;`suK2V%F5%>XE1!cKbp{a;t0XNjK|i#e2@2S5kVxh5+{;-+Y$*=y^yB*4@3(vZ_u}lQwKM7$ zfNBRP{z_^`#HbPKq7@M%k`mrU5wXnWmwOi$Le%nSI3hL|Xg4BIAF2mot;h;V=a&G> zv+N|Th=@NWooW&f6mVw%dnGNl95)6Klic_Grq38H7G`JN1J}ALl8EJpuP2&mzE%Y2yclA7z%%=}+((xo0Om9!st)#5Zz^p3pTAHZU-{bK}LhWaF6C9vA8 zUmp=KOPVDqmGOHZouBW9^F*EPzDNq*1RZD}CV;ROoB?c!h&7V3+y;|y5ix97zq1%U zW2v53lyJv(h9zyQx9N6srY5A|1YlD(6iLq-{@a1sk`7sXzR3WAJ#O2VSvf0bE$hbT zM;btmmdh{u#B;#uz?V)(cEpR^m{JW-i-=voGWv|F>mCUL%7=)^GD^n3;>NQeBA#+% z`oKKdC+TFLN#t54>vF4Mrn76VDS(*jB{d0`IhVA-W%sT{DWM)q4e+^~6Rm1=jNqhJ z+=Rf0SsI?ZuT*xFMlv0*NqWmFnCpk?&=xnXf{(&x_k6!@cwUxD-qdQBf-{sl;Pq~4 zrE||JKHV3Z+8fpQmB-gdZS!1{wTD2*5xxz)BWcL2A9UN@Eosib{BKY(zIt=M)QWkR zeRjI}u+(OnF1C(mUe9)S+h0R!(glm)n(|!jkJ--i5wWTANiWp#i2jpN`ij~{)lMt* n>Ml>C@9NF_==fX4(J=l7sPy6e6c+T500000NkvXXu0mjfBG?rO literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-23/white_48.png b/assets/icons/guardia/icon-23/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f14a39723ce955858d37b715d427b8e7fd3ff55e GIT binary patch literal 1809 zcmV+s2k!WZP)(G-dW)72l@& ze6GI00^k-iTP4YSC%S9Er@%MByTCR;8@(rL^3JatfV0i)F-d*RY(r}^tKCpZA4?j= zKO~aoNxCTRJpzhtX)0OLc*yML)<+2W4p_Dmwwd0pWzYQHJ=-^)r8WG%Kd?Ukuq6XZ zvcb1b?LoM)&?e%sJCk@=0&4JGF?T+{OLz`npIX7(EJS^|&K znshNBgULgHw}2l@iWA-+46Mzb?G8K=N?ir40Ja9!xf48mV%%Kd0^n`mfl%1t*mvM0 zU}=Qp1mIptOMy3lD}ZHnYDuRZNQw@PtvslV@v-ghx$UyYwJ>NL;ND#X%#K3061Wuj z1Nbw>KM$NAieC#{79sXhtnslM==lQN2+WdnOi34Olml+%TK7g#<+7{J1irNc&Fo9y z0pRFRcq{)kvscY*u9V_gHv zh0D^Fjc+UMU@hL?1pE|XwFVgEF&}93f}}mo%tLEogojJvdEle?_1&B!=@rib;4U-! zEfuXQ1FGsk;qf}y-VuudtG@jS4p&8$UK4RU1{jbSWF)-HC0QQL0!EqHidgS_Nyi0R zO*XR^!#Q<#AbGs7P}0d+;#G}XC~0i|P4=$GG+U)P@<@o^1(L=!qY{l2DKAijU@A&^ zb&Iy z?j$q2qqjmRr?dT{lCJhfJ1E2*W_DJF)5>CaesHYMfP>@N^dN(c*8aW}LailngG!u| zZG?N=%m!!pJvA!nJ9#3;JEsqK1{z%z^DhSc>NOax+xb+@nlWsaH6Yt?{OBo!;CzTO)!*`|wkZDX@|FFU7CByny)Cqp*JfFi6SF;4;Rk49x>G%1cmkH*|XgS_1; z>BDF>M|!6gReB0ArRjnV4h=RNMneHl$fG1(=y(r!Nc`Ykm6?5?jr9U{Ui8o{t*K31 zstl_gL%JLD9UpC4LwzDa9|~_fZMesIyc_5c8tv*5Gn*U+Ob#mH;pgG@b+BBo7vD&F zJ>a<@b0xmjC7F9t$a2EAPSS$`iyl7L1Q%M9HAJrTpCwe86D@3hR_Y18I`t$~%l4ED zmB+Xd7SzF&9~Zsux^!3&2#Nm{4oadtH@M`H;{xI-$RLH76wUTg^-qjng(tC>v?T~tE(2&uQ zYsKMkmxc0*7yn4`gR1R=?ye5wQWKt_udHm&Y4U#)b*dpHMOB(Br`4K54|^p5-mHOewH3pv$s00000NkvXXu0mjf@zs5v literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-23/white_64.png b/assets/icons/guardia/icon-23/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..049d34155f141918fbd10785fae28ad6c30cdf71 GIT binary patch literal 2629 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-24/navy_24.png b/assets/icons/guardia/icon-24/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1f124b527904a88bad9ac69ae6676b8b83848b GIT binary patch literal 1193 zcmV;a1XlZrP)}6)3GPF>T#JHaJ-e;e+{ z|0P`3nhbTA(spdO($Qf79pcvVH{u1QYkNTIAlNUHyPe}a}gyZUz&p0JHU=c zy*@;bVuBy(Y&$#@NV6r;FayyVa@p4}Nb3S*9UUQw^fZi_0cHTQG~s61Y*io)3zcD5fV`ZpIjPiE#K<}s9yv3dgQB~d#S+}Q+d z@C{yJ3;q5o9%{ImZSj6Y11#U+mA4QUDzV{7nxgEY0L4v&{5jw%Jevhwh~P0Iwvw*a zH_5d&p=?FWEUZ5f&o&b1JB|dxMvT0HEwp0oUUsiN!6xThrBtSx^aMh)1XI>Xm|sCb z7qX}AFv-kac>YYnpod(xE$U7B6_j4Y6w8pnD_?`!GPaL7PR)_=bhaHCsEZovnu=Xl z0`m-_>(N33A|E*CHR&4=UIVicl^DtTmtA9XZ7V<~5y~-O3}Jr^n}3$%A4{k#{5iO- zhRw~P%R=-zRC-ZHkjw6HXQ4M9%RxFn*^M7t2Qo2YmD|-GtJHYBz>1PRHgu zz;$(wx~@*dQ&)o&X*d!%=$yw>W#m?OBG&N0oL33|ZUnv zZ?^+5cC34FzPmqaq|onLVz6!n-5q&q(zjsE?}*t)Xbxfg(WTtWy$~Dt;Fn?aIF={y zUCXLG8Rs&}oF`bGlY91*T$T3!ST$xu#an9fJ)Y z#j*>umOz)&wPripR_-8XmV-`rS$4$LXLFPa!UjZVA>LXFXPZ&G9@}?-WTuQA~_EWaE{ZguX-HR2R zE}w~NEvG6La83RzLguq;b@#=ZcA*v(gY@(Wr|)b*^an!u6{AmKip{inj1fm+4SvJ$ zJ=VO1m@cfHg5e-}^BzC7_C#RgdQLD0i`}`kGP!;sBBL?hw@4Tf!1@*=Mdrj&8%H^Y zC-})?;s>twiJz$e(-;Q7QBr2m&8-fu;EMf37JF^=|W^Mv~m)x4? z-TnL1)%a!s;w`3Y)uBj+E;W1x50GK4$q-M)NM`1fs6Vg&lV{&eBJ-J(7#F~4-6c(; zKu&g}%f)>u_`uJ}%p#JR#ihR0@WM9erzakr$%}xRSFB?LP^UeJSFf`rf^V5$%00000NkvXX Hu0mjf2qZP* literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-24/navy_32.png b/assets/icons/guardia/icon-24/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..371836c6c52cef6edfdacee650e0d3d33d680b6f GIT binary patch literal 1873 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-24/white_16.png b/assets/icons/guardia/icon-24/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce5ce6aba81758a4e5c7cb30824f22fb80856c7 GIT binary patch literal 486 zcmV@P)|^>~_S24P~Qo3Mp0f`}x+orICnrlsb>b$^R1YuCc1xCjCvT8AqWF+*yh z5cW$~(hsHd#60F}UmuTX;PSmQ_s*GfXU-Q&X1h}M8{@Xsc%~+oF9KJ9v%pW_gQVR6 zk#uZ(0(dQHCjeEdVBj8b8E65H67vxF3Oom;p@`!z|QfiYkaxFhKcumKzZ z<3JB^E1#_bAR6{7-jx1Z-~q6iet?Fx0@orjn3owG0o9;t`vx!o)Z()3n|U6M-3Q*p z-gW@F0N70iLqIq1BuDrdxCGqJ{=|9@e21BCpEP)2UMAxRQpL39y8A0%I_5Fdhi=!%pVGRlXj>>>pP-B1w0 z7l|x<2qcJzG9n2gs3^09q6o9=p?$s>+p$i|-QE&J6DD)5HOCy+fBbU=CmCu7=(Ilp z6A|G6*~oR!-Y~@{+aGBZHt)msVvzEPn5gF^zcsC-xZab3l>Pld7L~Ly9 zJHbF&kBF|i6vzV~0iOfE0_o)p;8I{5cq$@}siy)DX6ovD$~+Mfhcc4U0m|P_kfb)NdNx<);t<-{U&t9o0> z>{Lh9E7bk!F7>{WJ??ylQFD&^tU9v<=hXfM>L&G;mZ3Y;wd&RCI`#BA*C{vTm0_PWEa&HfCCGaNjBJeTrKCrGF?m@RxFVhQ#r=`MDFeM`1OBwYpU^B3* zV3}t=EyNrx$7Ym62kU&Vz@vR|&4~UeCF5C0;LC#Q;p&HGbnE;S;78zE;LL)kYOj|P z0jd0#63lg02`sL<{9KWp1N^3525c!P|5SU^fEUW>YISx*ypqswiab#%%5|)oC!1}1 zM5MCofwv>#u_|iLtAG!I%Ym&CaUg4#&%m+ls1S8X&04H12xj4) z2d)9m1zs%!8F8l?ZlnyKND;MeR#zldsN2-}eR9*(8`Y=PQ`CLxf_^?5$VFu&s@2~C zJ_D9lUdL;14EO?g3wWSlxuodgk%;)N^w16)#c^Ca-if7RVK(p*@{0RPYE`?HwL%wIRrH5nBN RZ><0T002ovPDHLkV1g!#nJ)kU literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-24/white_32.png b/assets/icons/guardia/icon-24/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5b135f8a9102d48d657db3594e80c799b3680d GIT binary patch literal 1278 zcmVP_)316qSlfOEN0_BYIeAPEtXUiqeZBdJq+4 zP$ZP3RFaitnmw$bqEJ+f3PCLF;f!Cb@jK)0dPhf6H(bs-`>eg*-`eZK5m=HMI{Fr! z6p(x=B%dnICcQf%)EOC_;oIksq%Is_C6A4)J=>+B1cmlYno5b0T6xt)AGQa!G@Mxxhf+6JQmv$!uxV2;h7m4R|mjHcD!W zh+UF~026_8fz7}vz!$(P=Bu9)?G4*il0KJojondp({GAo7C1(K#%#;Z0ejegd$`<4ZmtHE&CEh&qtF(MLXGGhQGC# z_j{nbW&Gy;ah{}9p7~$qZ|(SRC_HKc{xZD-*jYt8g-66!z*Ix?GT^3&_$^xv;L@ZCH5`v9|0U5F$MYy}Czzmr?;ypm$h`7S}&K&;^JRA|}A?_KeFxOGQ z{q7xG9f=dOV@iAMP1%iw^&6}p75)L7Dk*#Y@xTkf{JaY!J!WIqxwU3mrnn{&HGeuC zNhhLKJF2n@Gjm8VtpXGGg! z7=>jSg*50r-vinE9|f)kHkvJa_%8EjkyXVs#A#}FDwAI1I;ePLeH*iQ>xHI^pQDPq zV4|dTlCm$Oa+*`qwW;d8(fz)E0bMC446-E6J#-Q?Yn3xT&1MIKJ_ z0(&}PnQ(R5Qt9qe`92Y-6N&6zbAZI}hgQ1T=LUHq8sVrkJ4zn`lOkf3Wn~@p&;H>$ z%LwRTXTrh2=&Wp@w?nzZvtG`Go6VP@Ul0+aeZz*wv+N;*BI3&SNvJauvJP%4uCDYs zl9qeE$n#C!&stdQajos!0S%}%#D}}o(6vy`=WIz!tM8J!dH(@NqwFJxb`>6HLt0iu zrmKy9`=Gr4pGMs7*4x|f;}aDJ`nz^WR^j<|lHQT@l%y4&4dbvIP}5!WavD+8!r@H; o#i}i~TF;M&CHA;&6syJmzXUWOgt`XXO#lD@07*qoM6N<$f|tH}UjP6A literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-24/white_48.png b/assets/icons/guardia/icon-24/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea76a689c311d8e78a29e1dcd7b59630f4d9879 GIT binary patch literal 2101 zcmV-52+H?~P)bIx^MzUR7c z>6Nl;OYE$LfbO*-f}OBdpNQD}vM~Vk$xZSzpNQDf=nFqv>b_lGfW9WM+1?KrnC}*S zeRAFo)(v1cuYV+PRkiLm`}Oz)e5_HV35=3-oTMp|Mo8LQ(m+WYBrTV;RMG-Tzlw+_ z3L`$P?W!1Xi`PCRBJSJX*p3)TsT6$#j+S(xqzRIql61GEKT3Mk>Xd7ak+i?0LnRHD zbibt85wW1TUMaw9B<(9{s-zPn{an(ik}i<6$j`tm7z+4lv68J6f zW8fOU?{NE5z~#W}tGTl*(P?F$YOf1`zgA;YIBS9auJ@Suchtw{wvYO#?*ZOlB-LV# z!N3W?-N3WJhpWCbyzWHT2UxnN19t&m0Db|S1^mJN9TOjx%B#Hb?5ghyU<2^M#+==D zP(KaWn5tE^T?DN0K1Eg2R&&_1K^>m{c;mOu8i~3B^h83;6UJY z^;*?>Z?iglrRskGxV949QK>dne>#p+^E5k^ele(V=KSrhPj~$Q*ZX_JGX5LDYTz*& z`?rdLdR)=reZ9_!jeYj(h`O-u#I$@rT1B2Ss|t&`8NTZQau_cIMV7irh*b(w&nU0 zziq`UEvH9&8d#bh$*0!6XD8A>*2X*76PExp8xksGrvQr@%$2@J)3-Oqm-#cR zc>`@56KrP>_|$W)8-ROj;cSnAviR51mHB%Vur7m8L&D{KfcsxvdmnF}G2-wx^F~?f zBVA9|`DIK0=t>}?J#JV#RjRov7-PJoKl?lJ&f17rl9dV;r{U$?hmCB<< zo=KdPzNIF{ZO2PGP13T6IHw}`>xRbjBjUz#Vhtwpd$qq)vgwg7 zk(5z)z55eN1g4k-q z>8_N|?cW6+se;kTz!)T-q(cCo|8DhGNKbZ&Z}7^T$i|bsB?r`NS8ygzhca(_O!VmYfpQYn4RtP@o@KPb*)S(6E1l>ps>XKZ z4-S+GLw+x5dPF2t=^qiB8o~5jNta4`cSPJ#2e1FRbaLO{?)QXB9n0<9^rn=nllX+k zbj6BJ_v{HHC1~|+`0MWA){ZH^Pd9-lwP2!ub?KWK+?0-z`~O#|2%KRiX0%|U81|>C zYsl7cdKWWsqM10k(O#q4RTYBWxvI32PvVr)Ua4bY;9b3rfd&)PtnZm;cNfEwXR8aZ z-l0Nmm^i{H^#*&Ps}1_Pe-Ke`ExhPH_W^zgEbvcO<9n3{+Fqdzk?q=hpDt;ee*yHq fU;AGvda?W$q~?3?+(!oa00000NkvXXu0mjf_gXdL literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-24/white_64.png b/assets/icons/guardia/icon-24/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..66c477da007952f9bb4a5727e70bb5fcf52e7fa4 GIT binary patch literal 2887 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 QfdBvi07*qoM6N<$g3EPCod5s; literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-25/navy_48.png b/assets/icons/guardia/icon-25/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae8e0382b20c7164e6591292d4701179ebd121e GIT binary patch literal 3055 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-25/navy_64.png b/assets/icons/guardia/icon-25/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..71b69d83d115dbe71782d4fcac3c617d21d0a4c9 GIT binary patch literal 4813 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-25/white_16.png b/assets/icons/guardia/icon-25/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f329a2ddd9f140d02bf5484e113a7ed59f2a0b67 GIT binary patch literal 449 zcmV;y0Y3hTP)vWd3?) zo|&f6XwKq2m-qZ{=R5~$G)W0b$>^=LR`K6z0jC#@S2Ai2eX$0s1K7m^^ zdyupS3<6HJ3*0wU0t4I+ECKDn2harkNXh~?z%cL)JUZ4Y)LpF&SOlE-DtsA zoZuDMbF0DL7~^M2sfgwK(%~Q(QTEI%|EFjqO#;)g(XF-sZxPdDoSK;n7MfL+sMmwv zd0znhT7Q5`US literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-25/white_24.png b/assets/icons/guardia/icon-25/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..07d0f1c2e67f9d0562ecb1abc911a4c263a22ead GIT binary patch literal 848 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-26/navy_32.png b/assets/icons/guardia/icon-26/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..48a0289dc5c02546c22934816a23eb8c130e49cb GIT binary patch literal 1821 zcmV+&2jcjNP)^qqSu`Y5-R@B($wU+zpIVYW~O6OuGw)e7gXNwcw{EY zS&Im4En*bkALN$7e~r%>3!>fr?*TN8Id3yG46TLWUaZar&VrWXSvBBYhv-Sf9H6h` z_g4&jngIy3iOV9@@+FLH2Co+_|AK(?c+3S&Mzz-uu>O0PU@^vf7`5|JyMuhTpTyj-V-xE$yIifWD{kfeK$lnGqi`GYyK^sZpE6fgFQvQYd1@pk`xFa&Y&Uld8~W_ks?xllfJIM z#YPP2Qy%$j$(2y;GvLib>{9akwpPkJIe<3fKv&;<7b=_Zxis%fC*MJ5};6Khl$BAgGmne6>`!UMqc}9Wfz+p`8MIi&m&>CA29a+W0p zpWg04ME=RlWCQ4{6y@HyTou2j5W_h(eipkf5sb~r&+eX4)iYiI@VwlkAi*7m8rk$m%s?=mK6>IA(u$`9|#Kx zI1ReM*$&HjSpX9M&Otekl*8^e+X2!Ua`H(6^9MKg+@g0u);g_M`~oUxB4DY2{i6$R zEGhLv%C1Jr7eJypAwDMWK${_d{=9Q!{2yY>JW`nhEZ?x$4J$M7bi_TKD3r)&he>UC z2xTL}Hn#&|9wHYIsdj7Xn^z(7ESQ@yiEg0esCx`=OxS^T%d)x4fE)46cKYVu4ZKNU zGVzS}QB&uh>lXMMuovlK>hl0q4kPj$8fp;oZIAHamJ7xU6I9BHQG{CXUIVR- z#$UmA;Ol80CAA?*F}NKu!{kCe(UwZg5AYw1H=A-fL4^9g0qu+*RP$^ zo}DqLh+u>GgcTFu4Pi_5h&LSRR^ZcA5OP?IbYrChQL9xgVMAv?fA%{}l;>jl zjxroONr;W{5ktp|5;5LM;EN#3L0g@!Cj^*lk18CMmsys%fUu8LYnuK&d5kyT0W_45 zkUqZ3LT)^STzfE~i&oxUQegtK5EGKmG2kAQBngv=G2%|1AA?2XF7+z)&6`l&MSbfz zG^invt!{Gu#(?}omtQi)@%kmiGEwwtjCq3k)@syVL`LtU_o;WTaxZ8azjCL)Iq%9w zFL6FeD*aw69J6%Y^`tUKE}K&kf1-i-_8Xpz{O+L&k|%$3MD29>=GoZtGBhxFGRR-s z3zw$v{+p_mpvNj@%(s_5B#VkvdiG@!t@-r&8%TQl@%(oPf>FfOp}|WCFH$m5mI-Nu zU>i1A%Rtw$=u2wiw}Q{qa^Rq4z)&00000 LNkvXXu0mjfGmv}~ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-26/navy_48.png b/assets/icons/guardia/icon-26/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..3af2db73f4c06876594ef708a9675e97205c4192 GIT binary patch literal 3088 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 Eg3IJgng9R* literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-26/white_16.png b/assets/icons/guardia/icon-26/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..82ddad430a6318bdc7154198987c63ab604b474c GIT binary patch literal 497 zcmV~vN8&Uq6@*o z4tDaeWPQ#bzCJQ&-|Rhm&#YN%W;XOJ+pXTaf4yl3$78@rU@#`I47`@~VMhSlIrjrM zfa7&u0g`nu@Edpm-0uWRo7wxis0CmQI1Ic69!q*x?m7 z90i_9x)%rAqluUFGN86^1E+1j$z6O}z-G}u2Ydl$YzJtvGLG7ww4Hj)0BgX7MtVz9 zinPCU&P$5J)zTW>u^#}}B_+XP{A~|JLaTt{cnUagdk9zs-UH8pgTSk*#erfvBI!qm z0o&^q5S>qei@^6{l1@wk?JnxES8azSDbzk7RelJ30)l+R_O${CqY2;<@C#T1=EB5w ze;E9%3_}&X2Y3p628OFM(~_b+h5QN}D%tCuL8_|Xtjk$R^M9Gn%*>^dF#y~JJ~k7W zeV6SNEa!I3!EW1UY^OsF(4A^&C$*_G00000NkvXXu0mjfP#D=J literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-26/white_24.png b/assets/icons/guardia/icon-26/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..d31cc64d30629390749f6119e012ae0c8c161ae0 GIT binary patch literal 883 zcmV-(1C0EMP)gk`(Qc5}m? zVlU1{vLDWII8no1hwb)366klYz6L!ABT4_}_v^rmKr7G^TR+FoLNPZ$iA zM8n=p+uLk++umGY?#Dq5_ikW1&F zmw;PAV$Jz0z~gBAiuZ z0729^U~OuBX+Q-$A9&hsNfJMkbTeR0VlM-40tbPQftPK+R(hg}VtZDq zb~xyi6oYQdFr%V5-~&R=_p<4h2OpBoRYVsR<>C4yGP2zRoXg&bfDij7 zv+b+(P&j=fp*)}&aWF_hMdR5dO6Wc37 zhH3JZr0D1ewnMH9flsqPdItok1*u@GIals?W;1O}BEPU50s0cgLy~^ZWGdT&<)c8+ zly~0=DW~qwq&UK1^iIF3AA7}|sbk!b#Q$4$C*|cD?jJ?m`wu45{2+RFJ(2(b002ov JPDHLkV1oG1o%;X) literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-26/white_32.png b/assets/icons/guardia/icon-26/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b90bf8b24cd66558f5c2e21f8031477f7cd7d8 GIT binary patch literal 1298 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 buk3vTA$5ZZf_`}%00000NkvXXu0mjf8N;~f literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-27/white_24.png b/assets/icons/guardia/icon-27/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..fb03fcaa6c207b4bfa186d4b6bdced3a7dc4ccea GIT binary patch literal 786 zcmV+t1MU2YP)I*0Uf|6U>a~dA};=I4wCr< zU=eT%cwiNIrVCgHtdMjYcsFPTl4>HNOVR>h8}QJqhXP*>P-C!qU?#9TB3=w+*WR#5 zs`GoTq!xdl>Gxzw4W7^Ndyk|!K2w_n%Xj{=$T&vCH^(z&f0nc!*db{+Z~)jPX%ets zQgiMB-uP^1s{dmSjJy;W=^~mB+yX8GAAoPbQJ@X@2pj{Rx~kVmdTheavrc*ylqAgp zHrXM0VWp^6pvmh|p5ylrCp@gUYK8TM&C4Omi!K6p&F~!X-AP>JOICZH310<_wE@lo zb-)F?t*%dqjNW8MZ`{lpfiqT=U+LSE5x`bSQyo&AyGki!eO+X4hndJ=&$1RGB3WPZ`YmuBcwgE(%m5mwk}GCibwcYS z;;y9olCoV~v$`1(ama}r=1W^0zDj=p;W$t6^TjU9?=7}%qis4~(h=ZZDH4mVu-XT} zm*i-Oh&#X?N$Hp{qhxs+nBdki*Geh{3LV_NtSK? zEyMD_-T(jq literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-27/white_32.png b/assets/icons/guardia/icon-27/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea1158a30b23e921d52a9adbb36df0589589c1a GIT binary patch literal 1139 zcmV-(1dRKMP)hrR765nlT&K*kN>@E+u?YIJ0CUBhQrx=pS{;!YyJOgt$l)dG)XNW z+yz=?IwJn!|I%WvmPf>tq}zcG@EdR=uogHJ5r@l~ezMwgQoHAF3%>=p2{;Oj1IK_z zfx|Nu)MkF|6tF8IJ}48C?kU}cP+$PqF3InkfsMfG{8q^M?1QFw4DbCB2sYQX?8$ zt6}qiBtz3qoUO=W&q;bn(tb%>C9RWmP|{vW{=P%fAxXA=N$xLl%G2u0fvCAl(oc46 zM4XXyG4MTb92m`LSe%f2nOl|t-t(vT^z&A`c9=DEDjmrwE3-T;B13Eg@CWcwVm=WO z6Ow)f_5w$M_2z-32P<{MeEB>g-mem~Rl{i$@I<G$Nj_c*O@@p2LSzsI9*exX-SZbR^62&VaHyt(pQ;6~etJ>5){bB%SvXmh*tGfM4=`GCA=z@GY>&9!fd;Bs~V4pGuzFln_X| z$_HnEQRe$ql3uQ?9hEek{S|()?{zD)?Fu1;gX zLEtuEKkztkH}KpvdEe`{0cV;NXg6%|MM9a7x)2nvWOZ~{jz`39NfW?35ixG)YS-}Y zVG*&XK#+uPRzN-Ni=`&jP+H$Dw>ekHMQx*`JAiK@;)|{$l5l>E)jH?)25#7rvvPwn=c;Y)gAx<002ovPDHLk FV1hwLAhZAg literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-27/white_48.png b/assets/icons/guardia/icon-27/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d1bcea01a824733e3b4db577749ce4663dfb712c GIT binary patch literal 1775 zcmVLGmSh6OOCCN_!TnC^8U@w3#0K6~XxD3EcX11@uWdO`4GV?t7WInu;V zGn?Cw^-gz+%8iC{L0tlfu$zuEKgfqWDu924V-0#GW#EC@!!>#En3zyh<4pAsC|e$+ zn7%W^2f}X)8F(Kw!wL%)bEKCkBEbj52IK%Jf07&<}J+ z^Db7MG*o_3OM?vy5TK;+xCspc$-QFym{y~d4d-;yV*rekV9OMJt_E<8GVn)Ya=gaB z0M-E5r-Cn6Z$xY)k-4$@sd>rp9DtJn{Njw6Sv$%3V$7SES!TA91?p8*)DCMQ6*a*5OE%%EG~5dipG=yT4kSnG0A82B1Z~B!?+Kc#>)}vl2<4Gh9X94%cYH%YcX{->WE} znWD11w!bK<`0oUgZ8hf2k{yTVsBP3Ul+@WL$l4D5jsa9^2 zoJsPln7_XGKv_;TBz0yzy936mbPYUVX43%tA)GTb9l#0zrwjL@ncW89d##D#+$yxZ zf3B-1HpO+{$RmeGnCY_jRFz%|yh3t4fb)g(T(Dk|XqRxaNqX{|piCaX_v=(h_I=j4 zwjx?qPaX))+pRY63|*0gckwAXlV?kFE{wy&D%!k(|5Lb^RW`V7?-njpqrrJsXx)a0 zm%0Qvyz;P9dw8q`T^W^VM|22*fuiO)(>+3?in!$oy1O0|>aCbM@?L6wO`-6^$b=RH z_!hug-AFjhl38s5aHDV`@%4#bUj;a_P!0NAl8Z=A3VbK?JX}6tW;aCbqhBfBtJ-Iy zgnd@ReCJM!p2R#0∓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 KMNUMnLSTXfeKgo+ z|9fH<;p$NXy}! z!~~a;QLocE_RQ6o1U+iHgl06_lp*G5&bVtJmE2gMNCoDQk+VpVB5D`oI1O|(ZO&5~ zqCMGxWd~7aB-D53<8dSY<8Kp3ml@%|#-YuFq#J4q2fMq4mQR1BV$n)e@J$}3jTQ_-A8;zC z*W9eH#=-Yt`toAPgmIk3q#70xiOs@D6fp-$H-2@)th4OpVES>?Zp@XF1cq%Q5M0BE zONVLMdc_a2>nbXN3LYWbzYE1ajCmvHjYuc(6T(_DvYvo55!5Wod+Ine`Z0|;- zFPJvc$#-(M)tsTD>;PyNz!$@yAS>rL2ql=lbTW>!i`2$8teRq`KVJ;ayEy7KsH=gK zy=XbXeTfp#^SG@qM#V`BgIkn_%J^JDMPag;ab(nS--A?BE18SS(dHYBuJ!tf>>)d1 z5v`3!!E_Nl9R@iKTp(m-15LR=2B-$TgK000Mwp9X8$!b6-v@B{>)dvU_Dw$^{7j`i zo79#sKqgaZKY|2yV)O!F9Eur;so-+3&FfF{Cml`uDROEM`HZ$te&?xDmvp%n!1%=> zV+iEZ*Ujx!D49U}*+aR$B&3nhakSo>zt#m(rR#DlW8AoT#n{zV=tYC7*q)CSTU99k zYo#*&G*z{0u@dWu#H<0|uIfhYCaPlhc$;30c|mTT;-U#zeUP9$n&UIIsRzq`3FL1s zpZk(vs1@z31m_s(#xzy6cc3#1Ku(d`vON!K$T&S-oAKtt_3gUSo{5+j5a|bg!Qi0O z42<5u<(>m{HTPrH%tOf>G~Z&J@uf||#$;xGH}u@9KK zWUNo0J(KW?n+=>no?JUJ{}?j{C$j;i_J9hZvy&)4zicQY^FM~ZtGHSQ4E?Iuy$~!z lTmzY|p$`3_%K!dt`4@FB;3#E<$?pIF002ovPDHLkV1nt&O;P{= literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-28/navy_32.png b/assets/icons/guardia/icon-28/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..258aaf747bcdb2bb29533895bdcace6632121ab4 GIT binary patch literal 1871 zcmV-V2e9~wP)GQaa8CuD4j~ONodEY&<`wAP(mlzPHi{4_Z;V*dpFsn34F34IX4M^A*{(k~GQy!rCe>3qe`-7dewn|bdMV)&!c4ReP zp@0wq!8wM+JsfO%GxRA%qWpVYlM{Ef%FtPd-+sg;@wkQLHc(v%9tZsxnyEz8mrS4I z+Gec(ZG5$O7aJXG;erjVHVvyQhrdhaxI0IIk2WpGakrT7_>w7J0J2>Cpo+`*I?uaZ9%p?K~JwE8;ebJPs3HQea0Ey5PJ% z_A_YROiv~^e3U1&co?E+Vn20m%z$*D?^-T2ln1`CXi36G9wEtNX~M-|#0d zOMyzEIE3`>V)C48=zZ|@V2`>6UHA=3PobzP4Pa?~2V@hAlUJg+0aO!by=2hGEMK|M zYCotYK?>XVkY^Xg{6Mu*oV3gTK-l&YsyrSLS6pH~Gg-7~*L>`W_iT>f=bi z?)u?ZyO2_0u^lN|P=(j=#IJ)sy$r2-DXJ4_-WL$jjc{oD+w`@+giyZ)T`>*`wZN_# zeLRl;Jy5NAt1GeSKuEJ@Zf|5hKNHk$7H&8V8sibih&|)J~^Urc+a&Fk(i}qFo6J^>!oF$f6 zW5NnE(E1`HE?RF!i>-8J`V4q&?o7`bFm-EhAX2pp@Q>*$ARjXAohH@eSk&E0)b-^S zVqg9MPGbLX9f&nvf#W_IbcW*n2}36Wv4YzKX< z$#?gT*HAo)UG;=f$qN1kR8!x4E3g2eucp2w1$rP{YypaU5#pNxV4oK#dIw)HQ5z#f zas)t1nViS_1>J3bMKFzu!a_5+x1$}w%N)LF3;Q2FjaGLfqy^$$5HEl{i4fm2fME-G zcaTf}#Z0Tj3N*(|L7QBy=}h_gFDKzR#VDHC2%?X^jxJM-{HWwQ?u5vL29S^%DXUO= z7FtaMeKArgs)~8!+12LqVrojOq+op?A(k2f`iuK~nJ@*}tVey*V&GHc(k&ykJCxqu zA0DQm)uLwbIfn8>STc`Y310psR?IzYcG&gUNi){3DLxH-DHa76)O}{Y)Ok`|GGCB< z#K%uy*>B-AeVS}$kLfaUYu|*hcG8(TW!j?2sUU90E1U*ahb2}~w{8&@3+Yb%j7|dJ zS~h{`BAZpi<^3J6WOa@6koHr+M&JnOZCI5@@rGt$MS3Wx9VQyFb;}qkyurcDF`VSJ zNc(fB!c2tx7uwUPirbNeZ-9P3xsDshyON2~0Lnl(ZZ+@-g2^cPEqdC1&!Xm;OcHDG zylW7wGy>zBU!0`%Q-qb`vbXkxJZizJXhaPic&AJ01Xf0rKyb!f%M-uEaUx}7K54Y0 zbS*D&$8o1#z_q+&<(eHv#RoC7UvqR?7VN#K;-3wR6gLBhs2RMUH*1Aqd+9`teO>)m zo@S1Jcd#4rhBQJ7ggCO1maq%S{q6<3;-sTnrB3boik)4G4@|x!Ky=&A)@7+1 zuQEP5J7c>zXl_A#(3LTc*7_Liu3h883CzWcZJ4b*RM|@OW&OroBBo{P@1$Aj5Z*77$H!<0X_hvr*Yn zv)xrGnQwgyTf%*>e~0s9o0) z%lz*%P+J>QLPT2byuP2Vam}1Y;Sd_>k^KQ3$f<>G}65d^yR_6g86Fut**|cJ(dlK zKk4jY04X5#{1zfj|5$iqOu-<}LrudxJbzn}h#YbDoj;p!!-xG&uB&qk@1ynA%((Mk zh}=G@sO{6k=@tofb&i!zwE1b2{%f=xV8+7hNv7-Qi0!hgX4GGZ3f+R^{vFxWiva;S zb7-#$r0k}4pi3vPrP*|z9OfQd|=zr zrq$riMy02bh<`|Q{%SPeMQ7?kuEcR}MyYqf{a4aQf62C0`vdDZ>G*K{ES!?Lz;_T) zWV10GnTZpcLpD8^MBDR(8~+J66hoyiClOy8nAh3okD}Q`nx7*&{~$GgJJJ4b&6`u> zLZSViW1+^o*g@^%^VA12b=&9v`d*ynkXxfw0z^dmY?z))~;OIdNxt>pu77MZvgujx~!H-0sz zO6M$0C>I4hzYEkl63ZJb;+;#A{SaE!YQbv^k%*^rh`$Bg0{l6sk>H#F4ukxLROU(E zS^iNmWX3WBqfRb*{l2W6vdSJ*_B$lvuMTEPLo-m_IGvDmqSauBt+UT#U4ai|Q~Pk-Lx?U9gw)070STnv>R3s5zTz8AV+TmY^S@5m z&ji^sr;#(&YPj(+!v25sdzTNjVgF$~e|zzn@s~3K69Gbr?$Zx~*&&Bia zCfu;0us6?OKuCYv&J$uyMT<2Rui==DZZ-Z5)HF}Y?Ga|we;LnDQgg?}{e*f7a~hnp z$ZcPNlCPni*FaxSB5pomTJr^jvb#{3iMXLhK|UoBUqEfEJ4mfxEZX}1zVrtbq>t|= zt!7dpKLQy|B0h(zx>CB@Q-uAuapYrk$s$6%huCmZb(@1e4r$HiFNn-vgXjMNRk{P* zXMi^t73#3z%`_~f>N-UB)46g#NF`eKT7r7I1H!`f*ArdvFw^fkFXx!r7IHIN9%kkp ze;P2;>ahNiUSKb-GX||!0apdYV}u}R9zxt|NdG69P#2M=orD|iFVNbLfuM&qQo0*q zB3iW=MRK_0t0daKO~e1vUNJV7nGX8Q%~R@eH0H26+&nl2GqzVm2Ah!eI%T zax(5y!M=L~4QR&NZmqO(t8IeHDyM;o_pQQ~_zP@Yb|L6#IPR5bwG7Ao36Xu56ogRJ zz?(UG^cXV9H`u)V6%z4xgUp-bxKOJz8La~c6P*B=o?~94vKd5N(&;Bae+AFK$Yy1w zUnhIw5OB0$McHGM5JsR*d}y_yIfyuu3Xv}FQ;B#t8<%yGXnO>$4x?n$DNLwfo(gfx zt+Q0MmIjz?ir2Y}X}QGVBl|VuwgWS{v~hw(xMjsQwEP%1v=lAITukn`0Vi}LIG1pw ztUg!gYn0rIiILV65ro|!5lQy52#c^zY|iwDO@(epoEwSO&#}?N*mkgIEy4w$ z(xeaW=~Jz0O0_8^UM10HB3qs!Q>vJN0At7IZCqQQF!Xe;Jb;KsyK)K*d=uO2YV`@B z@^2HazZti52dR>e+4}Rtc1fY(mbX#b)ajZXxO6SsjaPpignmVJ<960RVjR-&U@FiW z(63p>jOipg(s=$#G!sFt2#PdO)XX!#MRQF?&Ubnxk$Empaud5 z6|{N?^cHX)L}k_zO767T($xKVC)VnDL@wiN^D60THw2ZCSpE`9{S;TfSV(pvM{r9< zfew0xj*g5?Sja6%>M|1X&)89AOi?3l9nj6D$36)5$21ZDdqfxPB4p`#7UV{QhQ=d}=RmKfWIH3pmWPn<@?lb-Ab?qgld?Ip>gQ%W(0yd@y*` z_Pa(P8$a8R)@hKB?C*0O+ixku%T_2 z%|o^c8aSyqiGi3ZG!BKnR+fTXhv$!H&C+DfWS&Ly7HZThHapks&E&G@4#cUlMV@z# zhvSx^^?5{^ClRW+#uA!hkJYBhG1U#VxTW{w@Hf^^0zqgbvj}+CYN}9I#gsL}p&94{ zMpY)En8^TY4e+y~qFNoY$vTh=@tU9KgVDK&A?p#h63wsdghH#`h+K-!yo@+Y5dMwd zKXJ^it#0^BLZRQ1O)X+${0%D@%T(hf2)E(TVg=aI)wg3C07I9*0byoY2J|@l)zte2 zwmx;3RF8)vW+L&ReYPdOo{?RXsZ3ULq--j^hbD8RYzif#B8)sKV+qBdJl^#dk#*h3?)HZYutMX7@Ps)3#L&IH!MQruW(AfSI7yb#xc^_w(1kQ z_kSJbK3%BgdnT{qvyq*go9v`~^gEoB+(!C%g5JtbJl|wrO{hZS+DNn{ka8?zP1oSu zygY$Q{{)fO@%%ptOnUG>W9X*dG&7;Hx5y-~Wb^Xh4rs1V)oh#QCRE{&G)c7#bXIV+ z!WmJ{iR2#MdF;?h`_(C%de46YEiTuNyP_zxGls$}^!;M*YHOqZ8p^NjJG2V+En~*Q z=kOX<8WTW!A4(iu#~J5H&AA$raHaI5i2%S8J4G`2ov3bG*4ME!q&lKaq^4TxUM z#`s(PwukE%;FkL6>>fz^Y0FWb?t$X=9M5ffHFNoN-$P6WqYh)OSHQ#_7W{{U|JBC@@+NUT_Qx}nzTy8WV4MVo$x z(mvuGLu4n(qu1LgWMF#Z1VYTgDftm9`5O|yn9J;zGMo5JcBM)a**yWuKSbmuvU)k2 zAAhBQCE|Y{oH*isjLv=ut**9`AEv9Q+$6yuYM6`H{KG*nI82xfH@w$JIK@dqxc+K9 ze^0-Y>&&zw=bYw_VdkAb&2@2Se8F)Rx0EN_VeVEk&xnDZ?kmtd&C#-n>^whhgF#i5 zOBWf!dzuhwAu)a`wQo9fbQC8T1I%Q2ub3Eg&fgEAm7 z5Axyo?B<|ncS|{_Gg)Z~6%+Q-vu770DmLKx2ka|t`(2F_szPO220uKe`V0>K4==id z`?71$s;oHFazV1Y(7bHNFT;4z{e=e^{v-eYpFKDm_#aSGk^RAh;?4j7002ovPDHLk FV1m49n|1&I literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-28/navy_64.png b/assets/icons/guardia/icon-28/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..b8cedb9165e021d98ddfe9fcc12aa2fc6e6855e5 GIT binary patch literal 5146 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-28/white_24.png b/assets/icons/guardia/icon-28/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..cd69d0168adef37d9408e2ddef4d67585f7a5bf7 GIT binary patch literal 893 zcmV-@1A_dCP)QL`x#Qw&125?+H0y`pNXC{sa%Rd+SZo)M*D0l|WTOC%XsmB6$11AEf0;6dMrZxT^ zu+rL;zw^{{8vEty&CU8T^_XUTv3hu0{UnIGlcY1S2KW{D8rTb*4?GbOW954-a2fD6 zFb9|k90F{Lh;KXSCcu(L^<4G2<}^2{s~W$f)S2~skh)%7S?h)B*7E7aOZ#wFNu7Q+ z@J&SgoB<-@=?)@b1@Keyrj7txBjVXESwwu8oB@YL#1E7BXz+hPy`rgVjk>vr9#@q5 zlDfErkbZZnH?*X>4M)T$z#YJi<(qi_3GAvE`v+Ap zqApRNZ0-j1tfn{~7;W?Aqre8>kAn0};4NTA!Tfqe z+*|UV-QUSAW`AXph}Z_42Amub>oYL$K}0;LUR8X3o(cNUn@BS7DX?6wY z`rh??YmUwBP-#i-X8D)E35jP!>{V|qE)E8^)l|(fJ*Lj8Mq5?BnKVzmyB*ns#`RKQ zZE64G#ItbUoRW-)JvCu-_`M07RCiW!-@tJ_0IE~evl{!QsibE8xO#N6UV6X}PJbo! zJX~cb@maw;b<%l2Dk%4NgRxWNgp>c%M?dYoZ$x8TQ0<=qKAY-Ce@fT?`P=e0C&8MK T;}#dr00000NkvXXu0mjf>wK?y literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-28/white_32.png b/assets/icons/guardia/icon-28/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c691a8155eb863ba930474c192c019fc624f0757 GIT binary patch literal 1359 zcmV-V1+e;wP)8i_*9 zY%uAM28oo$KN`%8q9g}sAhq=Q#kzgxz0>u+n@JFDIQQ&*_FltY-@5*5j%1o5xcyfuSfHY*ZTnzBBCw#OrP_< z5wWG2H7ZSn4+d5NuS!bhyCe;gbSuy!O)sgdZ~ZlJs-*LQ7SqoJUXt{nSvRyqbRv96 z5(BeT!ILZ8KmTP2%nm|djB`qv8ES z>HA4qBk6>aVx13lD6v}7NHghT7~YU{ZWG!EB;D=>=P+>Zcw0N-;@XBI0-Ba~1G7)+X6_CwOwA?j z9}x-9wZJdHTHxwrE-8f%h=_NAz9qkCuc(&O;RAFeqYRrVl8#IbOU{*JXhduP7H3+v z^KEo7+w8(K*vV#=aUTY3vhbbG2cy$L4bdJJxY>B$mPJU?!Tz4+JkyLGcJ{m6X6={G zXY3Q-1rhO~Z#&L>63U5&?K;<%$E{>royBc;X@R5}o*(L@RI3A$Mo4)y& z4wZh8Sgx_=NjTdDsPN)++E&lII)Z-7UNIuJx~Amby;&*K0VCqQqUyF^oDu}ia>r)K zMZ~C1%5l|hElwxh(Q{74JuJ6L4-VtquY^#<#B-cB>zjB&=KXZFTeCfoqF>{0q z)&)TSRLEAk5tsuU5)qS{wq(U96{mrcvLSt2QmvDb)L+sZNh_TP3Yy{e{E4N0Vw$A2 zMN?WdDD2HpscR_&m757kFV-n=TILSVYu%IQy-Q~r3a>W$Xc&rGpJ}vkrosUe+sqB= zd^s-6N@~I3vl&r8)&INNLl*n?*KDjyYJLw_(s}#x*Np#q?4488jeqm+`5!B=L33cQ RK1l!o002ovPDHLkV1hiLk757- literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-28/white_48.png b/assets/icons/guardia/icon-28/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..466e939c20adaff33c1431b313332d75f468a39e GIT binary patch literal 2179 zcmV-}2z>X6P)$6G;sGy=z#CiLGR=D8Nfe*!#eE!IF~bK zushk$Zm+%`Rb;2{P?fy5-$WfJ=`l$gO;F5__1cw^j!w)D2_e>%Qg#{ku3ngU%7uX_ z0GjAafGcC(hz5*&hgITmNt>#-@oz(vq&1QzBtipTzxNLU&j-E$Os}xJW#Xxb@Avq7 zR*yBn?}2Bgb&E(^UTCa8D}pHRJHju@Ia_YA|x|+P>bj> zUBDij#^XBRtW10y*c7Uoadyi299=?hs%-@Rb(P74C^X^;7cuJ!PN*|3$=sB(>)D^Ag~e%J4|iN&=bD@-kx* zyu=bavv{ z2Dz|>{9V9A;3Hw2b#G;`jWo|y!?mhB>Rf3KaBK>AM>;Ye-4bd~o+v{9D{a7MCE$}C zg%1U83|;noM@eW2Eap3Vz^)jpM*z2;=#55To)uJ{Dj126RWv0x@M=y2KrMenU76 zm9a6n-{T)kx*Rw{QXmSIxLnc~C55^yH;#>F_C2+n1m;RwRZ7`l0fkyltqjzfBAv#; zE`f*D(|eL{2av`dN+~OV-$=T)lyYw9a4BVxq%gj#B^_@mUsy_6Yl0d_An8Mr&Nduu zyxTG&GgkFIkB6?l4$qGV_obBW2Al!Nh5EGQ*4{1YjllV_$NC&=gRw{}c1T)RvsJ5F zq!LR?Dd7Yv+^99y|CjbBszB2+=u@Q4M4N$!B)tZBGjM!(lGFmJYj2lylINowjH5qC zQaFIHhpm1W`g)?Icy78AQF;Q`g#aYIHF>spKEQQzGnG^~(&^JA&66}S;Em))kF}Rs zpIlblcKMdUM@fgE>3$WI7taEyP zW!I6}Nm}^lklNWPScRYd2XI+JSS1;8W)qUHb%v zd7fTViHNp~a!~`k&7uAv6Hw=)zFpvP5chb>Iwv_G%`~36XTBqH4r0>`zq-{Y6+zuF z)6}&NL~%7PE~!XlsJA6zi;Mad4uUWCz8^Z-JI`H>M)kb!G_N_MC7`bboJ7Z-br6$k zM8v(ZGGN9gS(O$hre110Snbfi*3Wy?aQoUSF{9kj8E>=Jx-?+k_z;uC>K2* zN}HY7-3NTu&(%)GIm_J7zvF8G?==(bDCQ?AS7AkJ5!cJJ5cfv!6?x`i8j`A|6yfd;#NM7XNw5KFj7`;y1 zwcG6YFw+ho_mK8as#swUq|U^qPTi1hnW%uj>*A(q<|g8=aJBa9+Kg@Of4^O7c(9{d z?zMVah-kmOna3jmh3sem(Ab`8~oICg1P(F?=)nA36E+k zV#DVwhzq>#Q>~80Ub)fSDZ9qCa5Sct*Di(M9T9ba-(BAdO8s`dQQ*Y&lc@Mwc;0T< ze{r5wB|mE42&y{0BTBpUZpeT8d2aMW)4nW#=*q2Y!R}9|9L4=-vc2s!@hxP-^sv=7 zso&0CWutFCE1AIkJif^KUcZGssin9(Tq9jwFSJ`7l343gY4h1AN<>KqN}B9XNwqKv z7a4|nPj#1hf3Z8R`Pc4zey6LaW7^%9b~9I8QAOz(o#>7AwJWJ$;F1ww?@En>?rGBK zf9Q^nA+MD*wpE0$^@r}}1K()j-RG||+5rFmXAkvu{Rfk)KX~Q-#*Y91002ovPDHLk FV1fhRNF@LO literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-28/white_64.png b/assets/icons/guardia/icon-28/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..13defd3734212b97b8af9926d50a0304e3477142 GIT binary patch literal 3028 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 IM6N<$f_A`eO#lD@ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-29/navy_48.png b/assets/icons/guardia/icon-29/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f38e866849fc60357fc9a2c5b65c00e7334a09 GIT binary patch literal 3105 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-29/navy_64.png b/assets/icons/guardia/icon-29/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..cece283ac71020e60e15aea83ee4b68f38e84b01 GIT binary patch literal 4694 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 YACe{-jjOEBK>z>%07*qoM6N<$g2C|}VE_OC literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-29/white_16.png b/assets/icons/guardia/icon-29/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8146d8249afe8e9102294de05633f564842c70 GIT binary patch literal 504 zcmVO-vk_!~9}l5jPw*`}}Lo%$hYn{O2QSx1=5IyDw=37^D$)fJ4A@;2!Y4)pdXmH(OuWdy-DMv8pyC%>ZA31Hjb) z4NCiID$6&Jr0u{QFf3_TNRH&a1l$IGG?iUblG%3xmwdhjzcpY_jHI9Wy_R!f_9_;`@Dex=oB=)qt5MuMqbb+`9s;L< zyOQPt`T#Jhr?(lj5{9K=FY=6p>&l4#XN*gAzh03r7)z z5tIW_!$+e)9Y_cb8i+lvlwEva_uduz?>d*0_lj3H{Q1uRJNx_g+H0@94*<5iY>OK- zkKxP>UwXCK9uLd_9t0i&zL9jMf=hB&oaWlTgE5-z?yO6IFMt<;yMU*G2S$Lmz18+( zdDgWqY^;20&-SghzpFL-8*NW(d}{5qnNLxI@tbS=xWdQdSEy3r0sii-`Vmj zdTQ-Zl=Xke8w65;?NHI|bx9hsy$$#k_yu@5G)>OC2KaCWqh6lpt;MhH$0gNsA>R%h z1x^DiB(00@)EpbmcsNqa3gKX+`yp@$*i#4-tj_GsC9eYSRPccOxlPZA01e-^Zvl1y zyMQY2_rMllU%3Id6)loh+1{KQ_5zE5k4gYd-I^Mdb%*Z>z$d`YNU!*R1y~N0<|hJ+ zfi*39cf@}r9j*1E?K|WA0Wb@ALeg8nKayS#!bc>%(Nb1rG^Glh=TQTcbJ4O1c)w&< z0VHh-r=80rZ3Hgae%tnYY0k@$_;6uI3*ZE(B0dL9lC;_O-L_w{z0CG}+fyqoNZOw6T?{-El&iz{?~?um{?57jb(#+tSL$oazMVmDXgJ)WrK^-9 z>097Te45F73OEOR1@z_p*VSl}2CfdE6nUZTb+*^qzQ6b`x{^&#fDA_G2Z5)mZj#Ec z>ai_%)R_*Dc7Q_s0&o(zJ(ID&nL9072NLj8;9cNY_WRS>p932zlRDcpnxpZvk`CG~ zME3=CA?XQ-qNqE?9S3|V>EkrkdE2GBnx@ljPn6W(ZnVA>vur5*{#9!@Js+Nr151JG znf)nhO@UrX7l0q5w1u_bWKd|{1mapU#!Q^Q}QRcvIhGUyeL_#v}sUePD%RMjR*x;bl#d%bu60lF)tu0@g2KmY&$ M07*qoM6N<$f?1`hOaK4? literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-29/white_32.png b/assets/icons/guardia/icon-29/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..02867e7a3559cd61720328b3bc3fed10eb5ac445 GIT binary patch literal 1287 zcmV+i1^D`jP)u@J03dc;Ksc`!&k}`dc=D@#7ru8+&esf2=E%P#L8Cy9|6mOOMwk#yLJjrleDBA z2(7$;b&jOfl9o#9sn#4O>3vC4{JdP!UDf-OC3OyTKy1MC{S7E5xBQHxCoE5t^sb~) zR=!5kg?{(Cq-z=EXzs$O64x|hA@F%bOqZ1Id=|JBc*WS62BbmjfTtqjaY;7;L%iLO zz+AIn_a4xHF7K4IO41#Een`?=l9nafB~6etK9i3_aHZFsA!)s&$&xPeH=~PJcV|GS z??WZMDd{#p&zCgU@@10NT2AF_C0$a{^mIv2R{JM*j%a5g`66wRM`Z9Dd7--nS9xH!1A{Hc~lR^x7n`ZChoV{U;pXc}4byITBzuM8ucocuB_z zw4~%V*Zc%r%4tj)zYRpeX8(yQ&O6A75un=&yX^8ZdTmUW-i;BF;mPDw#`K8TRA}nG z{&hQ*ZZGJObiSlXlFrLiTdhq+EyuK+Cgr{imy|U?lR15<+2ejmk2##J+7r!cQQ_>3 zuHPTKty&M_~Wo0V%vNa_Yg=E*BL=hN!EMtc50XU?SEY~Y*Bm^OH{fmUNcHYBOJvZ81d|cEX^^u|M`=JL x9b0A4d>)q#tmVD>_1hC8>aIF*Q$O#d{2!m)sdN^nH;n)Q002ovPDHLkV1icOZdw2U literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-29/white_48.png b/assets/icons/guardia/icon-29/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c580050e984a6aa8d26884e46a0a04edad880d GIT binary patch literal 2067 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-3/navy_24.png b/assets/icons/guardia/icon-3/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..840d1bca5817159b7f75354bb924357edd4181f0 GIT binary patch literal 788 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-3/white_24.png b/assets/icons/guardia/icon-3/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..1e168db3b105d15a1c4bb11c4b793fef2fdc8159 GIT binary patch literal 584 zcmV-O0=NB%P)**>%nQ$3;a9H54;3FcDK@Q&T|%4Fw-SjP(VKHTMmSj73nv1s4%C(cSqu za%QTeU1w(Rl|9hh>YlDTRn^ti6Oyh0=YU|2`WDozxAH0|$5u%C2@HT=91J3j9|oo- z@Z>h|5*PxLo(6{t=DWZx;Kf=l?nHzmIWS1t@wW(ulA>n>k*RnHTnE;j65tK+sB904 zFe2Imtbx~;jA`oJ2QC1gfK$NTT%WWAbITFqRIH&6k&J-n5pf52n)&~OO3}<)NoRp$ z&F|kLV$11UL1rh9NV2V?dz~(V!YklPmaNO{t)$CIzKUex=p{`Tv9~w_JOM5Nk3DaU zuG!0G?04A~Mqqr2h!2uJ*Fusw*UJ!n2sR`+vW@0!+)D0cj*TC{vxsSq0?{ zALQCq-~sSD%kL)e5hw!s5G;a#?TEOM5xw8f@G633`COM&xAjm*$GUm3ryQN4P8HOJ zAi5e_rqeZo_z$991bfk?NB!N4vi4iK?!cglU@))Ve{=@RbZWz{Yd<|Jc~p184^p=D zakFo#4gQa+vir(}D1KFiemPBuEnQ}%n{$IJ5OtjkFHnl0Mp z=Q^*)!mpdd9A~5+mMgWjua!&3ky!q2f{W>)H`%+&U;Xu{UemS?@2gj@m1|#}+4gT* We(&eBaBds`0000P)~7@3K≻VLJMe6V$~5DRE5H(}+E>-(87j{sQe8IPwIiEXRU20w<${Vxub_C|b=a?% z(m*1zqpFpNObtL)_o(VcV9wo-EBpX_7739L>-DtC8j5Q(1h@t~%CI~akxM?76hK7T z6)m~Ud%#B@-vJIc8S9J{bA|KUZxNntm+?eIUc1~Iz}}Gnq>wxk$!OkG$XD~5J)1ugkYZe}5n!X40N?_hsLH>8vD zR4px?mZS{;Ep6(Osv+N+iiZIyc}XS(pc$cEw{5$Rp{k}}LNnrZpla|8&VI5du2n;L za(XZTR>5{+h4b=j<#^lY>&~;~#c9Roo5>!#o^8D9JR3e=Ysl>-b1Pu|_%yQ(p?L(( z`?dPgJ#hdy?bYs+7oBs!5AXAhjssQ`-U2Jh{2lPic`mp&?JbITT?+=_sefE>hSfx| zks)96hlMG(Z@&TS7i^D_6(RG2^$rF;&h5b)!)$Vm_PY#|`6|T9pXjlfh%t;Un2pos sv^h`r*gQT&WA7M~Hx{cX*P7e)Keh`mfj52=r~m)}07*qoM6N<$f>DcNGXMYp literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-3/white_48.png b/assets/icons/guardia/icon-3/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..19a452b404fff3df90c489d2f19ff126a125dfd5 GIT binary patch literal 1023 zcmV>V4xeN1?dxtgpS0SuXKc@SW^B*;fI|*q=Bog10GM;?+35P4JQ{g? zLwy#Yxn+*fLSTnK1Mo%^_y*uK4kx~+0Hy)#1K0$x?#)WqKq}iY0P_ISRE3xKTLAa< zx72kJsmk^Oz-<6~Qenu5XqTDyiKvGTf>kzoYZbW)NIZy%rkHusE;KcQE)&X*Y=eMz z6#$Xwz$|Y}7W+k*Og49Z)3yTkpDZN8%mTQkL20v_IF{K1@Q#Rng_hwV3rrXyq^#wS z0X!VR`wGA2XS88;|apQnJi#SAk~ zX*pF(Oh+62Ukbw`Ry(S5t&NO``aaLhk~3tn)3z;tXdYb0g$hGYmy4c-$lLh7lI|qHaoAW>%?2 zUlb#BAt$Z_N-DZR^l(*6oE9w5i5Q>=E$`x?$rXjhZGol&byPo8MV7-7#5Asbpb4un zYM^Ng@R(hw(s7!*ygDTX1T1rvTE_yF;9oI`LW#ZyLOO|h;$QJ7O){;a4_i(jej9(B z#A|~RZH7|HJx$2B?Ly7^brN;^b~z|3?T^+=;v$gb-*_^wKcnq>^}WD2Mzf2@9dDc= z3oJ16k|yNBu%PwxTHl`;?fit6k1EZsKTmmWNS|JyKg)^b&R1|GFwXJFI49wlW?k>6 ztYIj_3dM@i{KVZ%?+0>>#@^i+7i=TgN%dyrBEoPLq6uw+RDyR+EO16|3Fq>@!2 zzpErg5dLazp6{K%P!ILs)WE<@6b=ssK@-75(9Glz1YC$)C%)$5xdJ+nQtv->`H%x-sWbyZDucXe0y1IYr%6eJ4? zA07m7NCM&tv*ix_)|nK3CXtryaV7)*N|^4 z2N($*^S1Vy6kFE-al3!3-fDnL0M59IMM5Ke1<7Twu8gz1GV^>tD1tIsyJm^)abJ?uVC_`^_ql3|T>VtJ z58xL7Ujew$z*@G#0IFo@yPpLEq~eT-yieXT+udZ0iNg)ZdjOsfU7+c$Dz1k)|4Cz0 z7fh8SM0L5Ka{e1+R&V${{Ke~*M*!R%Uha_*zX~O`3-+>9xlcvpgP4HimjKSEGAyyZ z&~ZUrfYU2@E3m!L!GRS|kGAeDNgfa^orJc)BO`LOBW2RIkx1)c(wBZ(v2-9k+!8y{Nq>Qo{vVf|Kr`Rsgu#zFk1LCw&8%^DI z*5d$PtO=&#Wavc^`F4yrqD-J!=PfKZB}m>6;Jc84P6EkuBJx8Rbget2&@i z*T;a?#7Hp_K{keB0O6*jtc(>05L=2O!Ae`J+z=kXp# zz446YRXL5X(%V^wn}Xmdu8GKzUK6uf7MGYpzTix#Ibd{G+DcV-{UzIE-Y8 z>tk81Ej^)PxDmG#$qK(MuFscAo^n>wvKJivV3Z!d*UkwKO^8p}2Qr36=l;!RgkQgZu7BQ5o*d~(QA2h;b8dVspb zdjKACDXgX#y6tMMKbxPDC2B+JedCzEN*>EmDlP+fcSTHcufqWbFI1g?DOYc+_|_#r tQ!ZtZsokr~ii)B%)Y(!A95E}zxwiJJW zgc8()T8 zA-{W5h|3#1t!9G(l0@@nZ<)+oLZUUC5v=bJhd4pB!(W zRO*mr-&mZvHBkIydKF#Tf$f0fCXHHKg+h=kA8Eb6fmo9RCmNjO?&Cn#;gej)x({^Q zfm{XYukW@H4BK}dMEJ_+l@inqhzE8d_Blt3JsTs4M7*3^_p_2Sh?jQ=+?h~B-)CX} zT0#E!Y8e$x;mE}{yEz23!?Zq6Bo{fp3u8>h5F(AfL7LtgB|?#EiOCzY2qOIh#_7(5i!Pm* zoh_7+VrZAOBSxsWaix?@7|YjhM6&O(e?`$9`~N}{oeEAo(KOQ zN(PX%EoZw%(&6DCb9_grc;9xh-bDF$3S&alDyrS>L=-WCCJD94k*+4~q@xEh;Wh}i zV(UlfH{b9o2np486|fB=y{{L(%{l0{x6yrQRBVFH{s?b-DCTSBc{HRxR+pZ#R%1`?1Lr#g&$Gd_f9@ z0Lp0^{vj%U$?oACDhamnfs4*V+n3u`*3AzfVx3QZ^a$vJ&q&I-A}}!ENz_gwoMf)L zjPM){cDnsisk6w#C%kXn>;hhRANd+9zqWFEqiQvwR5IMT^1HivRQw9jp9#pjP-il` zRy^D7(;(zgdyV|)iByiel^d>IQ_iM9igH<<2wFt#=cqXY=2M@Jna;uv%&nwr2nk0( zj#6JNI*w|!d)KwK?cmuF2G8EhZU#Fh`kQAf-v`EyGdTW`D4yub(OV>YjeEy8k&kB> z94~ZOrEeyRZxY2@T8KNyd#goppX=rQ#SaPfGMHOnFVVL_Nfysx?O|YoTIEsG_N^)D zijr~dn-=YlP1C5kh}Z>??^xV=jJfi1)20VjnSy2O2-1#F{=zOjVk!9>O&+g>e3b~& z$vP)IBw+pKQ)rTQ*C{j<0-Z$66w5Dv;{Nu&y7B-n^H z)>E52osPZcOj}(b3;V#CeFVAl*yLm2x*OR>R#K{1RfI1v;h$)7iCX0Wq%XcblFk|w zX8fKppCG&s^1YicMqU8Vvo%j33n-U?ji878{K9Z4!IK`_8_#;QtDw_mK*P3qjX8)P^CLy^uf_*?*1KJgq19#D~D=00000 LNkvXXu0mjfZc~%$ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-30/navy_32.png b/assets/icons/guardia/icon-30/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae1f7c395dd124cfcec01d180a0079ce4fafde9 GIT binary patch literal 1166 zcmV;91abR`P)z zU5Hd=7{`Cld(O<3$f^`WU+5+hx|z0fW-YpK3$jA!B9`eQ2+^D~=Gsj~BoS+c(1n3? zqwPvWQBd0#eR*RSMqLE0g5XA(nMg{DrKPL5Gv_?hO{dzmaCGm>n9;WO0S&)&UdhK6E9j)LAk zL1Z&rTFnB@Bk`bP4Gp%02dzp29-Ua?R19^RnEnaAWNA(x)Axv*$AFkjW7?x z*Um>>D9VIS>~h(`T%i}0oy_)cW$b(gO?}Gnjd#LJR!~j-l(2RV&pk-WJWN@CNA(C| z`WSxW!cpYA98OS#XZ!tXhLL=wRQJrbm zx&^G*)K9K>n%ssi*B6ATN&ISG5Z*yh{D&2N+X%wN6KqWz`MM8tg~tiP;{@ULlg6s= zof~Jn>=%UV8``)ssLA&zzsMZ4KQ@C8BWH!DP@ zt(4`(4*d8_#D5!sAK=NOF;cvryfPnAM;+ zpbQ{t!?NU@JEmQQYM>d!zBrqK8i#LKu@#%|9QVojX86{tKb)v{P|@k!2|{+yAaab_~4C070Knf={r g6*K*}jG2Ic0pSL#lfC6?@Bjb+07*qoM6N<$f(Ot@Pyhe` literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-30/navy_48.png b/assets/icons/guardia/icon-30/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..39bf06eb7f79deb973f0ac23163a911be93aee2b GIT binary patch literal 2058 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-30/navy_64.png b/assets/icons/guardia/icon-30/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd4688bef1891f2e069aea7bb197059c6e4d13f GIT binary patch literal 2956 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-30/white_32.png b/assets/icons/guardia/icon-30/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..64f03ad40df9e0db04ce27c26e362edf863d90a4 GIT binary patch literal 863 zcmV-l1EBngP)z z&x=-N6vsbjbS4=j6CzN5yt5sK`05@G6m;yCAyx0m;Q=e{qq80f&|-uvA1obx^3bDr}&7yj=Oiz%op zy66p>9uYTK&JqJ6Ze$WT20Q>{BohPd*kfxBNITyEhk5isc&ZoV$`;xcm7jCKnTR-D<1YcL^IOsr z5p#<~eN#tW4g3%hvo(Gh*imX(AJ_lGKr0WhsGbPsT; zS9zihzV06Yk3>Ww%xE)@+r|K}x#rH5t-ZiUJ-%qyKvJCVpJWBAk5yfq1-3J~>;leL zVebRh0-vUjfz8S40qTtUQ|3{-}4GQ(LF2OpKzO{i@Qj zCHp*ZwH*Eo+^ya=s?CY6inWDai->=K7l3!Nqg9)I4|pabuIBfy4J)M+UAe^4c@`S* zB=9tFSv^p_|1RLg?76_lz=zG8#cW4cq?O}Sz`MY&xkcBunog62zpCHQ0Q)22i}t}| z

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 Z{{jnL)^7bT9;pBT002ovPDHLkV1n**XixwE literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/navy_16.png b/assets/icons/guardia/icon-4/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..766b7781b79f2130c7a96501ad8658a7730e0d3a GIT binary patch literal 598 zcmV-c0;&CpP)KEkZ@C_|cf`j=XQuR7Fh(7WUnbXMQuk86fXqB9+-oGB<>m zIcd+Ru#Rw`5R&k7=!S7bUxL$%=chrGblPnU@cQ;4nxnGP&D_vMLI!}UipjXHLxJ`J z6BNgm@cd>T4BrQqNn{RLbq!QFsDV(ny;zO~_NnMu#4$=B{(lt?5*AT9ZMN1@NIV}! zoeZjP?H7ecB?Q4VB75jMv5EQN3Qg}XAhMAyO@38=p@D+p*b=IbiG1^occ5v;@m^S zt-vDU%pz_M4HuE}dFDontK%w=7k0dkvN<*bde=g#%8U;!%nzTcCr%y95(WdHgTKtX znSD`q9gopkngZu5mG4J*c=xN143!=B%P;|`*-8x3AS_zc_@gdW1mB^E};|GlzC@=T#pQ?ni1 kZbUl~R-kgjG|;&46J?~x^!CW6lmGw#07*qoM6N<$g2GD?%K!iX literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/navy_24.png b/assets/icons/guardia/icon-4/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..da2c972459c310d8851c9ca5982c2dd82cafc13c GIT binary patch literal 1037 zcmV+o1oHcdP)xew=_^ZftM zyTBCzC`a4gxsFP07s{F@-9HWq4f-Uj6j3z3rKOU!b$y_^Q3^EuCS>*y=@YLI4tp3I z%dZX~k?;L!%rt=pLxy5^=yxVc)PXyme6 zK?o}B5Glc@>vN$&lc&&OPq`jw2&p5GSW1?#bB!gDAP*u$4-E&_ zlI*hzMNtNTl0Ox+&CWMG@PN(&Ac%dLie6Sa)#W@9+D?B&}aWIE6J`j z#_I`oD~xzkF~)&d1f%1hg-bU3@D)A~E>%H= za4wg48^FF`m^;|ftMEl0EdKLHTWLO^XlQ@P1u?ygjo)BrSrFU6djvW!J6$_(%pZS) zV3(w^t$qQdBwS4|)GY^8V4(zw!-9`~uEksZ3rc=Kxe5$kb`+aT%V`%w7- zJk{eE@go?m)xZcsY(&oPM5*)OIYprJ5=MNln@49bip6mZg>;fh3txL1RksY2xgKG1 zU}V9Q_|pjOn9ESrke>@OIh=Cd-XE>Q>ph4jA|Ni3&&K)k#KevHn4g-4`8>_f*`?dF zD7M@8uOs+u2mYv0Bvl%B!@P%J_s1CKG|lbnmrnXTNFWw*swmib970Qs>(bsxXw-)* z9Ch2i4H%}RDc-Pj^Vmbp21yMLlgm5|o+k)y`wo9}=OPlJLLbco-M!HbdBx2UP=B!| zb7^T0{_DwoPu)tOYt-qJK*xs!I(+~8rs0{*1iKW5`7$dSz2TC59Ej}({WXMUAgxId zqvZ4F@rcU^YYj?&1WkV(rN&9!@hFLv&vtuv3;GH>*@!=Y5K$DnL2YoV(k@7$&7$Pn zq`p4{NrzNf%ft0%v~)2+Q?w3MaThY5Avg0a7f;O;NrCzo=Idy@!=AGq00000NkvXX Hu0mjf0yyzS literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/navy_32.png b/assets/icons/guardia/icon-4/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..77639e79110a63f23c141baf6f3a006a1055c6f0 GIT binary patch literal 1527 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/navy_64.png b/assets/icons/guardia/icon-4/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..422024135aa50aba47e27b7f57b0e8ec544b1fd5 GIT binary patch literal 3998 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 Ef@n~=3jhEB literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/white_16.png b/assets/icons/guardia/icon-4/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..766b0a336cfc17c194d1084553912bbc878f6e93 GIT binary patch literal 449 zcmV;y0Y3hTP){7D6P(PX;%7xfl7}YIbM#oH=I(wF6L(srS???H>N)bV+`y3&1k)9+*?l zCQ%*qBB;mJH|kWo&#KQ`-1T+<%mFJ&KC6>SUIJg$Gp)NpA3z6eHMZ^cehs*^(_|mO z8gR7OfMVPYTmU}y>Tf!y)Kzs~Ij`PT@2eBle%~~@(hj@^E|&Aahw>oFcVN(_kp?yx zGuGe9!|H~*zZE@G&$oO@8vXMZ$mX(oRejvzY4xo-KlEWmeW0Eg0_w6;kYrnZ0=!DH zR3N}3pmyRQ@CkSdEVTG$lC@zOow`STq23x|xuM=3kua~WtEc`rTp-P`3818W1I{J+ z((=2?RG{iM)$73In4u%g#d5huJW_X{t^dr}j2lR?)Kbj=i@*`!9k2oH1x^EZk}Uso rNvh=}KU#bUI9VGDYyuC)pqI literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/white_24.png b/assets/icons/guardia/icon-4/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb40f1a094e0cae6947474f04cd44d23018e211 GIT binary patch literal 623 zcmV-#0+9WQP)>+kvSDLmkP?<;V(#cppdE~=7ac+ z`N5)U1zdT~v%q%zz_R!r(>k2DMND#Ry2Cy#7TMYJnD@rJcA%=N z(Uj7ylu}npX=QO{+ALn+SRqTzVi(@vF6PwowE{4Vr=`y5i`bk)S1a544+_M)89laa^dB1umN%=?8hTM zH}D$UaG?O&JCTfKiVnnqfdg^OW-giRC0qXs$LU{W*eiT1Is-e2mD z6}TB0IDaaT!2mfwUZZOSJI8Q#%ojystQi-e0n(56c$VW+uGhB@=WT_QNAMxHmk9wH zAPaCU*j&fjNzUZ9pU2Ro&Wi)>#e63ogoB)-L)emAJyzimMsT}k^}ithPzK)e*mu-MoACZ$&3I1002ov JPDHLkV1jV!E35zj literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/white_32.png b/assets/icons/guardia/icon-4/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9e92918192ccda60653c47bc0f88fdd280acaf42 GIT binary patch literal 885 zcmV-*1B(2KP)Z zMJ~xDk#aXEm!FRLKjwIQ&3w%Jo%(v-=W?F&fBxq@=Q*EQ5TKIlj{utVomnjf83+0S z8-N?M%Lib)=IUx~d=BtLhF=3mf$Qoo(3<*M8J{OZUw}10AB_(H-T}AV4W+X{`= z;#a`LFxRMdhrrFL6$_hWV0ki}POEm9n7OR^(pk8mVC$KT7Px4?K+cTgWf<=PyacWk zoi4C23it|~En3$d0FCnf#lHnvVBwHhm=ed!0C5v|mZ;As9S=G;28;y00sGQ;cWu|H zy=7*@%&b}c7z0_BW#6(a`)+2l%*;>y-pUkUg{Yk`H~czTV8n01F|Bz33@mne z$JMXMfdBd`3Ar2rnoE5f&?$iPy6eq37ADI0?x0iN!$gN6r{86Z`VDFa0&jq8KBj;y z6+ot+=Yxm3k^^-A6Nrrhw<&_F1q(}LXlF8%fB;v4@4%#}Q?OT^SgNl&Ncl7GU(#J~ zO(4{^0H1)zehZ2~6uBk^bTuFMfLW-b+-0kQp^@b-fzSbB ziwx~eMgj=m*yT}rx8XHt zRecbc>on(dnt*jm@gGA1tNb&7yduzB6_uy%C=V1X*L3QXJ*Ovjy#4QYUDVd8R!n2# z&1|-r%`meT)tGH&cGt{KnAzbh%ij9|qF%QoR!;?Uy$b&F|KazawIEaV8!HKD00000 LNkvXXu0mjfKTMuL literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/white_48.png b/assets/icons/guardia/icon-4/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ce5ff9e947505ab74b50a3768fc2eedac18dbad3 GIT binary patch literal 1486 zcmV;<1u^=GP)AsrHI`5#o0M`=XCd(*%@bco;@%;Gxs_7KL7tc=bm%! zeMY2)0L2>jf{X$QS&cwJFChf%_r)S|m559ekv3>{s<^XNAX| z73Sq>h3g%V>!PpM(2rK=0{YAf8|_|Otx&M*WV@C`~z07?R(9{q%*DhA%tBb@~Sn@1E!FNw%ebt@6MJQ;gLrC`_XB67gKUr%;uhpeYb$0DeZh1N1JiORpyJ%%Ed!?;n{E%zU3=Wd zXML_4nkcb+1}<}(_!aS<*Gr<7%92q-Ldw^74cNcB%}nma{X?hi9ZDAer+B^G2v7z% z)xxBYNP`<3M`pIO!q>nFMy{^)KxK=Xxp_Kf5_WyYfxAC-5x1Zpb9(Ps+pr|EEJbL zkGI?qrZ+B`i1B8Tl*pENj2WNR2#Lskp$*n=rNlK=NJP?S+k#GIm+m=m z;nqhrM?}}cwxsXJz-bNFUyj7xHc-jJ>w>Hpo|GT+fH#3}faNZ07c!ocR=^YO7*j)f zln<))ZT z`4=y(7+7QY%Sp6Y>-{voBsrF6PdP@V!y3x{W z+_*DZMj#{hciAgg%@tAp0G`tK5Lp1J_;~yjlbrB`8*5cd!6$%x*wZq3ed1P!EV13D zL}mE#G-18&`fs;zI`~$!<;Q-{ zYh9lVy=a;8Nm8*6iDGSgyB=pQx|VC3BqF-;(F0{&7l%cpS46gj5O$c}z|nn{+qC`f o0R~2a>t9_4$<)vtTu)i@AHm_A#mk@BoB#j-07*qoM6N<$f*XF(lK=n! literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-4/white_64.png b/assets/icons/guardia/icon-4/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7b5bc0f8f8d6f695a13ead29e837aa8927052d GIT binary patch literal 2108 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-5/navy_24.png b/assets/icons/guardia/icon-5/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..68974c5d76ff1e1fa25a3adcff42659b51dff9be GIT binary patch literal 1185 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-5/white_24.png b/assets/icons/guardia/icon-5/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7465e868f9212dfcdce28543cc7d426be99a02f2 GIT binary patch literal 774 zcmV+h1Nr=kP)g#o0n-Uze;jlgnXi+#iS z8el^iw(bBbzzpCX@E7W`U!jnHu+u(#xHm?F82LOnfDKY z$3c06uRGoF9iY$G`$L3T?mcjKLKK0^76)!{530fNOW<~J=qRu+M4t`paUBbCgfX!O z8VUweIJ*jb1-4t4m*g+gILq&=UE>K4O6AI|Tv=fU>u z%=%|#R$kOu??oGbojhF2i9I@tT;z+S0ZDJ8T-l5E5Ayr5?x1>yF#rGn07*qoM6N<$ Ef}bXH1poj5 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-5/white_32.png b/assets/icons/guardia/icon-5/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..05bed24239064aa02b5f35d573083e1245400bd7 GIT binary patch literal 1136 zcmV-$1dscPP)aGJ@6x)_BpT?_>Du`J_+}>0~pA7y(rL9zgR#I>3OXk^s8UJ?f$3)UmMpu*%)XEZ+}haOTW;w^X7;R^y`ECK zRtk_(Dm~U{?+1V}S@l2<{LhQ$xs2C15Ab&sSBmI21@x5GJnCEd3p_3H{IdqUD&EzB zCN&Y>()cw2tSkXSY>awp*0?`lWFuY_#*-Q2a0;~4-zUarYJ}&0hSKzBQFx(*e`|!b zd`cyd5JkM7`HzCjQxO{@#l7Gc)Aa>Sd*6ZCz&F6px?9@bnacW6fu2{)=l(LSe+AqQ z+zaf|+~R^ZZ`E~Le>BcV;aTgG0Y7?cOLqmZ7l29Ngs?UQyay~P6v(mQ{Wjni;K;aL zl`wMe8P6A1iJ&fOe;56{Jdsk`nNnJmQd+0~cIMOBuhg$Hvsq>~9A#Do_#*Wmh$$u; z_e@ffnJ}}B^2SxUTIv#DIRU++@r7CMx-EED*XZ=Raw^ab1M5N%`gOf5($w(G746G$ zOWQ3(x!>PE`4t=IyEWhx;Fb`C3u|I0W6x6Tj7FMDbXm|IGjr?zbxZ=#QMt-VDUGL; zd`m8sd#^6=;&@QF6LG%MPwu}I;qf&<*{X-l%#+W#VeNF$?yqrFt_M$)lH2QC*{6Pm zTzO-hk1hk2hP_`CsvkdM^U6dMuLuWT=Nypgk7 z9^auyNhK>YM%=oaBz&{#i|(}n9TzVMN9)1twn$e9X)9FFxFL@T!`**sl+m@(*@`pt z%<}dvaF0K=YTei2ou-G2EB%9b-}XDEoAA_43D4(BNF!!;r&)6>kXd>QXGvmIu(NhSP-l+vFiR$~Rk z=kzDdHj zqOJ{N-u2}m*8(LVA|%-bz)b)K0B8pAJ%C?D^tIv~cBKaN3*Gb++ zav;gRBqx*nA;R=#lCP2+O>!{FcMYdnWl)C;p&QS}haD4RbK)39@(z+$lk6V(HqGH3 z;g#0W{;wMU&)nu0lJz8O?J1a>X_Tq)|I6UiHAS=3Zo|3CaORFidE97*)7EtVEn%&g zP(irTe;oa`z~Q?!3%*JPC`AX7ok*@UpWRhStx3UO&TUExmlo9(>{QB~&sskuS3 z&q$0cqeo}6DroX*}f+xIZJFbCFq_hRGRm6Bl)NE&#OGagcLzH>r~UI zZqDnXib)V+niIS!X-yXG&vnQi&&d2ll0UoXqR)PkUz5DT&rJ|wo}>FfE+Jg5Gt@D$ zIK^#(zz;DQGzFOu=%BpiPq8{$&xcLs38lT2MS#G}d>0iiE~kZn)XK+wu4H_a zNWNq>GA#u!Rb-4|$ZhKToZwF;DexHW+o+pok7@sda?D2v2JIjAKJVsDbRoD`f&dZ@ zJFC!?hvlviDsKhH%p*?vYkUQju;y7a`5rU5GEiqHbkRk$q2-tl;O0MJJSg5#se8e> zPoqh$5vV?ipj)FMkhX3{WKLW9kOkQ82?L#5&h)||!IwL^-cMti)b8NwN^+eOqRCF! zzHV+QU&<t-#mLg~A3A*%!S(XcNFLE_5UA2k?izzQh(}A$Y`fD;ANwf#jJa`&bKRj=85^ zbgT$WB3>z__KNkJG>xHkKok-WvSOtFdB`p_%AUlLF#3KZgf_bzD8MwEn}n}uG($UI z;U3RpnmY`2Hz=>AEp&%jt=${MU2JT2DS6`NWjh~V*rBMmK0O1iq_tj~O)i%Y`Aeqo zYMJS5OP>!~anq2I`J#>2I^o~QOy5a=xl0R{ns!TVk%YD4O3LdU1Eq8#Egxb#ZA}K( zS`w!UI5$`0*CEntpa5@1wNz$psfHzawxz*~jiFMZltJ^IZB2mZJWp8#2swGZX+MCb z0;f4fOF4QHo(yzqTpre+q=w-DjnO%Iga~_~2g#ot(%&_8j?DF)xloc8A{#s?rEM;b z736-Be>*yhLOZ77D<{W91If=KQDu?U0H;=j{3zb;RyuksE4=0Q(uv)d`HiDtkmQyK zG3}4OXEpF>y9lhaP4B~Nowk}U5&NWPmWo$9>9D6b46sEDJ}P1K^8&0-!@pqwa{81d7#zSG?Ki_yJ6mn zt&$rWU86Zui+iV99c)h@vrNb$18f8EmuY*AJ|eO=!gxsFswY515GAUnZWAUa4qdN! dS}Jvy{{c-OOt=&}F+002ovPDHLkV1o6AW4r(W literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-5/white_64.png b/assets/icons/guardia/icon-5/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba98faa75a1d71af893e6b7488bfb25b7e532ae GIT binary patch literal 2666 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-6/navy_32.png b/assets/icons/guardia/icon-6/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d1253d5e8b27b56d95752d01b9eefc3f6f983050 GIT binary patch literal 1378 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 P00000NkvXXu0mjf{z{1z literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-6/navy_64.png b/assets/icons/guardia/icon-6/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..624afe7e13bdfab950dd1d7f794a746ef711dd84 GIT binary patch literal 3551 zcmV<54IuJ~P)% z3y>VedB=a<(=)RxAqWo<{D>eFI7BuQcPjx2Wn>fKSP<+o=5WArK)Sm7JSX&-eI$-`5Ku>VHGh*5>hBCkyinICtfTIs5A4f15xMoPFK# z1o|PQx)dS6B(I~Z*Hd2mG>f_wr9#X!7KtB!89#F=NtBS(A`I_Bh8xJ`uXc;i<$b2H zNMJE>H9;7GkUly|(1}K>M`-E%bIQfYX~HxWi4YmULr959eu2OPVH^-jJxWXaQl|;i z6a?x1H5$Cox`aE>djH(fxG zBaRIeG>fju(EmU$QLP>6S)bq$57h9pU!XPrmFWb6#Mrk!Qcg>q-j3e2#FeW+YJ?XM z4OHU04?4*7r)((wE{)~+XsmmtJjcq(+7pt65WYuD{5N$TF0N>5=EXqE;M z`hM?bbnPP;eua>VxDw%qpC{MZ0|o0nt@Vhh$^*>Mq270dB|>w%1IlZ*V=9+{XD~@3vCfe}Pag|?$yBH*$b+0Wu*$Ig?zgFVi%E1F z1M!8t)bn!}9bW4BDY9}AI(i;Y`NS3k{{oU@o^>GfO@0vM!G}1l5d84IH`#vY6YN~` zh6{NvO|eDtj6$X#{PWCuYu9W^<`<}(h2!9=JIN@-id zyrnbInRN&;6QdK5fdfJM=OK>U%=~Lko6I1{af~(f@>uF8+S<~&YR2vO*^d%OG160@ zZ80SUL3s1=vn9@1Hs66@HD;2DoZvj+7If~?SqPRB4J7y(-$ez)LXu=7DjSg0DhN3T zmD$X^y-ldiBLt?Qq_JVST4WcwMrF=mY`pd``1A@wDci~Y>1ev-KQE&OZ-9Y+XG z!Vfml+L4=V)g^i0Fn9nd*brIJ^!HweNahjkIiD9E_)%I(ey{?@g0LPTJ#-Qw#ED3M z6Z6~8olGFeagI+N;mC)7{@x$*gNOGx&frRCZJvt~(ViQCcMw8hk_b2+-?y6Z!N~%G z9Agw19N`{(&>1$yJL)S^259}mj6ztU+BVXPGLb;FAG=L8sSMU9J=u47M@&Akjk3D|GFrlbqqR- z7uepzrANE$F2^)#(W*3t>+n|mV>*z*^$59@mgVmr5#t4gf_5R&h(*}7`k4Te{0Ptg z06OW$&nS$kVRVS_Hn`ryQ8WiRrco#FOy90CClgm=;>up6IvX$8!r2|~9R@-g9qcjY z77)9LYn##WM|ffNFX`{SmAG;XDh!)xNejMA*sc9*}G`%yx}*k336Pcn=8l$ z&$pUTLwaW-HMpDwt2+M?s8o0&vua04;F|T<=!r$fhX~2Wa_;CR8+W?+_kOy zdUnek5eRdJoA2htn<*DB0C_n=R6$q}Y{mHwTD!jJfW#$TVzLmSx;V^iS6NW*X(JhU zEL~7kL5SZ)WS*mC`5&bq)O~{E2X>;o5u^W=xU!akH$IWJ;(9ibL?1`WB&{h#5q|I` z7IfX^DoYN8BU5&l6P_tVN`7p2=*8mI#MMV!@{>gNO`eDsJVQ(V!a;LrLVbAwJ@GNn%7$JV`+VycY!V6c@+I61;p?lR4X~4*dJHa}G-2Hm$<;(Xk zC9XV#KO;oP7KCH*yp81AFK+hi)*04AV#7(6>J166_A18gbq!f7w#24_738{lQveTt z14bV56;6LsySHe)e7X1+#MO29**XYjCL;J}&S}47D8}1`*pO&d+pee{9Ts-H4>I3F zcynBI@B$wpgA|0Yg9Z6Vhf?>$S9X_&={knOsx&Vs_bex_^rj#rHOrszgQp$uAC2<1 z?MzE-THcBD-{qXCExpIJCo#!S9czpRDtMWz$aOtVo9#lassnfEA}2g^pRTen^!26j zzFf=`S61U^Z9^q;lvj99)6)5|eTdH7IynL#TTu(FGp&A|{^AuNmSB=s@PZ7{-YP2m zB(I$C6pKD&6R^Vqf*e~mIA$@fP?Cc1S(55kT;s%;7^5YgdeVU~M0D!>z&?roEOG5& zqJdi|7nix{Q7--marL4!nF_-?2p?njSx=J7AC^{}9A`e0bglU}&@GcH%KVxxz>hRq|Qf%DMG&t0+A?oqHH2(f|pwq@P? zL#Q~*iB3e+0ob)`Gyqd`u=f69@oOZt&*Aw##%N3|P(dFp`A;<`KlR8k6df4M9aMNR zg5xmSII`sWk-?>$a>BFBTYB=Ll-(sqPSWa;U0}I*H<8_Vl~EuPv^FTUesD8pBRbfH zG@?VJ&|;mZ^dAR~!8YcV@1>gHdJi8YIHtt=ul>D=f}ke8Jd?hyciyr8@86H?+J@V6 zR9bTnxx7SW{*kz1&~dsMv$aD|Dm>!M!D>W9tOlj>HE=#eqk@2>`UMb|<7dxv(Lsf0 zk_0AlEqsMK#XhMQSV?>1Z9MXuvl$eNxUPk$+y4*p9r(wdaw6rgwRCswTnjo8bz z0UttBa&~VW*nD8NBR0cp2?tH3-RX3Uv$|p9g=dKNyoz9*J8mRL4b+FLvU~f5gk1h6 zRQ5LFfy8N&Yg&7@_Yfh~DX4H0xod6jq5nYUpvDBiU@BYuF1h^s(edo`!PPJTl7j${ z1s$hjbRz7bJ2rv93pCsB{>9KXwfg-=lfmdExPlI2El^lb-4Iu>I0SJa@8Ee!Ljz8K^Ygso zZ-9aSqWq1YxW!phEfn&!b|v`P6+{EJU^@%X`xdPoS5hi$7zu)!z>_w@W*VlNzWtmr3Yu)ql*z3 zX}RiKnD|wsH;=^rDlRt2@IG=Kds6@mHcz*{;zESFkm)A&T_jb@J1qUS>^E`m#fTdf zM!$+ba}J5!)}t*)XIhE{L3jF8Yo9Pnu*tRVnUcTqIDFDA Z{~snGlZPwOIXVCU002ovPDHLkV1ioW=4=1} literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-6/white_16.png b/assets/icons/guardia/icon-6/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9c230edf19e770a66194a617166a8c7d5202d2d4 GIT binary patch literal 417 zcmV;S0bc%zP)XTCbE!U=V{xHPb=2o>$eUWQ#vYna# zK`QAaxj+}NtG)zIfgxa0{S*;(n`+z#D544+0-u4W5wQXM1bWrQ1WEmOAnI%c_4SN-wVQXUAkU9GAM z>X%eY3X;d=yn{43Dfl<)l7Wlj_W~b)g9LaFbT%lW*jXBK2K@d5hNA|dpStxb00000 LNkvXXu0mjfQ^LY# literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-6/white_24.png b/assets/icons/guardia/icon-6/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7909ef7ab723732d4560a7f0542fdb2969247785 GIT binary patch literal 622 zcmV-!0+IcRP)%I)APYrNM9PA)k=UW6CK@GUr`RZEVL^nQOOb_SLBh@@ zw}}!Hsk!}hX3p1qrtcdwe5c;t=Q-y&&;R_-d!F;Ws7urh0O}~U&`43=+Ak+_-qcVK zwMRXpcBy9@4r0HoQJ3ZTVnfqqzwF3yv)Zm+$ax8%|JlFd+?^Y}2HJt0>b11{KOhyy zQcCFsnt={rb&juAZ2t_BDcVv)e=u#g)p4mCF~}bd>KJvjIv&^q90z6rw*n-YH2pJ! zYG-vyz8B}3XX>QE>qf)?hzMKN1ErKN!3a1CJO#Rd`vF`^=@~XiMz^(U{xEg>bG}ra zkR|&;eW%VGHj^3v_teL!KUAgPs{T};tMAp>sUJO(6opI%E(7a;6KYH9Ujf@oDGPy@ zz$0}|DW!WzkQxl0sBJmkmiE>v`&9LX+M#}nZafr|dUf3wRVn2Xun9P*o46h&{kQ;5_gt+sejL%8kB*s>bOJnhg=PC7EolFo-Cl^k!5=`L~;_x5hktBNX=&;8e4pnM%=@Zy6?b5;A;RZ$d(+^sK1E-iGV-;25CMve&vAe&Hw-a07*qo IM6N<$f`n-&YybcN literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-6/white_32.png b/assets/icons/guardia/icon-6/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1fee467325fd68547c2c87c3ad8437d5e3999a GIT binary patch literal 826 zcmV-A1I7G_P)WVmC`2rLENsZfl!d~KkY;5u#m2%y&4N;7!A6v3A;ofrd_^pL z4NAUC*-(;=LYReo`{{9?GtRx;dtEd4-lyKqd7tNb&-tC_JkNWMBng-aq~6b{o&t0M zUxDjDlk3uY0{jHNk(0;3gt|hI1Go%qafm0t)Ve{ClUv^3?(Z*v8LrFL1K?&zKA^*O zFD*H14naPI0?)Hp1IGqK|xR)pxw_1lha}FINZQAFHe&l0m72E8UUMIf8X1)QCVg^NqgM( z+S|?nK~NlEgX>#>-QKqob5t}*FK`T)4BU2~-EL1ShM+vaT7N&}?{;Y!U1W?V;H~@Y z|1Sv21GGk!aKLr8+A+c3E98RPo_l+wVhG9utS->+b^VYy*Rv+BQK!>}&A0ivASiTCAE0T6f8Y$^lWRHE*Xw^5O^`!1&`fHLJ zC7qXKC4CN9mn4ZDXc>#hKTpGfi0`*Odw|UaWqb=5+aEC;z_T^$Z5lGa!e@wom-j?K zVQcsKd=G(f!Dxrh)oQG~!su-C`-D}=6bqB>)n`c$f=?~x^}Mj>lcZ&mEFqs6K#!#5 zt_V)WKCX14Af>*st?BawzW>L`513E^^^ia1nj}fzZ^p+3+wB0s>Hq)$07*qoM6N<$ Ef+e$tF8}}l literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-6/white_48.png b/assets/icons/guardia/icon-6/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac6e81bef43ef804a87b84decee4dc7dd9702d1 GIT binary patch literal 1493 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 Ef;TPvod5s; literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-7/navy_16.png b/assets/icons/guardia/icon-7/navy_16.png new file mode 100644 index 0000000000000000000000000000000000000000..933ab9e2f8e0532e7d63d95ecd6671389e7fc955 GIT binary patch literal 540 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 JPDHLkV1l=Ws|f%A literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-7/navy_48.png b/assets/icons/guardia/icon-7/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..768ca800ecdb40858c81cfa491d92df9ddfd9fae GIT binary patch literal 2227 zcmV;k2u$~hP)MR37jvc#ET+nFWP z><{Cjj?2r$WD_XUfsCOb(#82UPmz&TNpLb3Wh0SMA#i)|Ip;CYbI!fArG@t1Ten|w z)0@-tob&ztp6~N}`Cj^BM3R82;R#) z6af_ru$&L00)bMyO$u)=|NZ4V(5Ar|&fmniY90BR2E5<*qyb-_a!r(#y5G<#$X&p< z51O6m>ImLt2ihbZ9U&iERg0ZCfRJ~@k>5%8){Q2W_H^b+rt3g`CZdlx%&SkGGnAvW z;#DCB41X2#H&s*X?nhYjBJla$c$t-EXD*!;G3Z6u?gt5dfnb+eey+YEU4Sede7ho< zw(&1NkFXZ#_J$z8AMgCKXlL3LpSvZdh-yVxiqJpHg~SnasRHyV(E(j}w6*I3vN$hObUWai=-7N*(0%lmD$0eM)dZgV(@2py}*xEazT>BMc7H z>)dPj9{oS0Ic}e2{vK?%mLRVX;u$Jz_9*TZq*^7NogvBeE~L8@rBixv4EsO#aJsW^ zKwd8tC>7I3WnahX{ex+(qXuqt71;Dk<+R;8qi9Q}pJv{Jin$vU$#vZ(16?z)#NQiM zPbZnq@`;W5ylgJ@<<}dE>=A;uOlO%~_gyS!B`Sb0JOyeor*>R48AtQIV7fr*9T3)i zScwFFpWdo>Xjp7X9)2mLQ!^;pbh1P|)voAqS>W6^en^g~rwk{vw340Tn6) zebN8gbf#0oJCIB}bamuuT>CXF=P^QGUptn-#@9#hqrP(VcV7YH1ttumd zAhhT-4uKv>#PCVFe}wf{ArML+9YN@C$ICo?O|csczTwL=uxfOtIysu7bM16zI<5!4 zzXKFskWBv&r)E9M2Vs>!WfA3WEnwLR{r4nZX4a5YO2xF*Er)cDBE*#Fz~&ys%e37H z{6Gha-xV}|?hJMH(J#CM+A8kWNa@UvG;!>RraLQFFO z3v%Da%X}-oKe$ok`qzO%0fBDHYkQOFN3dNBKbs{C_Ff~O6eGWCDwcbsANa>d1Aedr z1rszkTd-hspri2-u4vxm*O-^9@V6Y_etJNgT>zg<--?i0!MH6RMZagx$|%4O=YWa| zRoCboxC*QV=}a}}K#HFZ=uQjwG_9Nh;@1cer`M7mIq_!!qJYJmHK_4&_36pIE7R70rJ`B=+2~ylUKAmbqIO% zs{E3F7H`Y42)v%9b;CD0tIQ7QwmY)L*zUwgJ`q}dgV*W{)EbYFFZ9!n_TX(M9OT~yb=ZLG>Buu{c?|*$KGKfD++MuQ{ZU&SuPo6jK_MN4kf!xh zP(crNRSkajCq~@T4op4cQkQrE>D(1-M?b^6ITbB!*P>Th@=EzT5XmQkF!%zN`#wXT zkVrb$;BTthhgAgsJl^@%tBb|EDJ>45j~+Od8v1DUt=d1v^o0rPs`er67IR;i+lP04 z=~dyYJXyVR;;sggOy7nO^J7Zx;deVOGGW?&ET_e=JMe$0m7oZGEPPeS?6OuD3Y20A zcA|k z_}P|dHZK3yn95Sf{IDSu$+I&N)*Sq-Cd=(WYowQk-Q?umV+p=I2YPx6yH|&0+o19& zC9zx``I7{F3px3tccMx>HsH&pke*y%-bVfF`^&gBACCu_h6ut?^Yhr){{RdL(Cm% z50G6|eaAoN+;i`Hn~)#~8UD0(N;A|(lw@CmL8o0hNDY6b;wC7iG|A>cY!OGNcE(y? zme$Tx9kC+SybTBztYj4wDG7hdxSb9{$=fxtO)cr9QmeESkW|9H`{$g~Ip^N@vb$OG zZ{OP_^f&YJ^6oo(@A>|Izw`V5;8>&n{$TP2D**TE3Mq~?@WaEJW!IgCnEz{}*^7*c z9o>AS;8>wbC8W_vSyEk1pgxO~Cu0p5eJ|llt9kdLn888oRHBoQl^hFHspjB&*L{#M zx&zF~WU)r4nrO}{(v#LRIB4kWn{qr}4-BX{@b#2RbpTbm4V`2dogst+YdsSzzv0)8 zEa<58k3Iuh;Clytk02cK;GJCxlqxh`fRJGK`1O6yi`NeWDsAxB5JX==XIT!G1f%Z( znYF!u5D#~28J)>sQcB(dgd5W7(&g%A>*yo?NU28@j8n(NWAC5QyrM|k?S7mN7dIJW_P1^C{9Uq?h= z2LqT4RgTc{pE6p%jV0B~QPBdd%{*SiJ>A@rVz$9AU9$wjZ-b4nCPno`WaFQqG4x5l zPO>VueL|5XKS7Ge{B;)~b%7+a34Y1iw?WCB=aVox@!-?=b2NrN1~tjK*S!I2SD+Jv zj08e{i$?v`{lnwqi2;3mEy-oog{kFxN_5)4{Y`C?S*jaX~2 znX?UF@Amd&SMTm5H!_m3Y~U?W`a6VJfXTa-t4GJOw0X%5y}bYhX_ zUVnXLXV<`Yi2()p#j8&xWD7D_h)$X)FZl<7_xokTo1I!)F7Un(ti9TW13nD4c8sSt zZO=pD?pXgWF`y>>hL^8B85M0ohHoWHa<$jVW4sXe)2L^#!TC8$ttNez=Z=Yx%h8!e zc+cz(hAq^el}Tzc)n0qqM|6b zgGquG-}Ki<3hg-d8BlZJEx&YK8N>qw;rV1ur}jPQ^eM2Hu;cE%Z6>v7WYDR%3wKw# zfRG>zFy;xqzj2q>j)`lJT?W*0@C$E@IJNWus&pY)a~xGFqtk7q<11*?_v{DWf5uX& zo`Vz>w5tIG&idaoNjthsvSZ*+Ouj`>zKC?Zi7GkCkFj^}3bx<%^0dO+geTV;B!uF_oGUedhkJ1#^{}-uly!E?tb2Th3PH1pi*@f zZwErY85w|1@263JZxK3oiUGD88X$aq&RKA{6ICw2hh?n(DJF4e{`owHp9Xv@wY8># z2!7Sq19Dk>)qn2-qkQ9?cuiAkpIJ62Ja`x4R@U8uDu00V)tEq)G3G_G>{7Ph@oYO7 znwI)=PbcL{q!L)|3LpPNCZ6UUYvvIvNhzDT0nFwK{_)oT&G+H@3&PI)2=uiI8tXoV z>iIa?c#KpfurHIDix{hKYpVDndGVovcjTKJ0;_(E(f>g> zNBMG?Dg{0Xa<}Zn%hedIv1DpC zzdbY!s1)FrtX)k|z6Fz{{@BPMKqtS$*rp=|@5uV|I7KCAKyDvRde_}V*z>emes)fkl|*G$*VR&7?L%wXLM722H-nOZO>F4Ac%&@e1{2C zq{y08MmG(;mRlCDUB?@7Ma&hb(gPUntaFAcMWoFSGdlE_Z3Z1}Y8PCqt5NC>Oy+ut zHU}T)dp&@lNt<9m~Sk$KO2o@Lj*5z{mIhFL7&4L*qT?zthC252V)PHectSp$%ynde?1cbm%6ZS?0;rfhm`2 zN@eXO$mkmwN(3N7|=RConC&fJIsQl6e;XXfOe;9?hF z2z5o!8(Dh8Z43_n>p_o03z)M{BDfD@La?a^pEYl0bm-;@sq`W3R_y=T!t#%lN%!7K z5Uuo|I~uOIATM=3+90IM1b@s4;W>=_)hh?IFZ;mv5rz+8O%GNVy~XCuH0re@am(U> z-!7}3j}1SZ@*!(j3P_u``XoCQC#^}aBIb6vfED{v{->2)}qtmo>-Nm_&PBOIb|9x$e{drA4 zzvg^`=%Fd#|6(TK53T{7?8^T0qJW)b^#1fasOS>B*GhlDS$mcgy+3<^d4lCg<+{rA zF*~sE2mWpv8?WsY_}S3_Z%2e>>6*m| z=?WBi14NQ{e^lg;g+8-%kCeFCACYTE3w-r- z#N3D5^8^mOjvryqkFI3ra5AZ@eEiG^4d?Gxtn%j`0(86wE4J)YV-NlmgxrEuZ=Ntu z@F;Ve@8RFJ#z&koA7w8fitg_mta%0*oPi7lIvJ)>U&*5W$V>LEA2^B9yho8?Yo4Ho zEPk99;!BHpg08m7Ww&ljf4{r8^LG~zl+Mg2KOIZVH$14F!>OMOEYE+q7^ZNN?;%Sb zC;ZuEvjM)#N5J*}oSFwK^DYgpO!Xp7`i@PI7NE>71oQmdzm7kH6~9Q-b2Z7U#Ux3# zo2+>u+wc0(f#(U1Ck^N;X8S^O1*$Y3Yqg*Jv|NP@t|r}^7GpI3PLf=7G{JX=0qx3; zyL}zJ@2G5TpMS-F!Dc_{wgd{T(In-C;m0`LX^7P>un4=4P@4sY0yzZ%q1I zeE-f}?Y#delI)rW2sR_6Bv28;6+nC3)WUO+yo<5h|E2vqg4ZS0{17DcR;w&q|3jAE z@El9m-^~Pn literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-7/white_16.png b/assets/icons/guardia/icon-7/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..87d1e7757882aabf4bdbbf42601d56306f9cba75 GIT binary patch literal 415 zcmV;Q0bu@#P)OuL z0EUYCl|}T@TEMQPikU5i!mOkzN#`Np7QbU&nAuSlzMNc@G-+mw;kg4mNm`IJ9OUHR zoBEiyunjbUabPSLM|$+?GQ=F0lLe1&lJ+DGhEhw?46rJx5f$A_YMR+jRNn6O5*BzA zc=krd`WDy^oTYoE*!Yd{#_4&MCB2y0CvYR_!^}3KneBf6p`25k2Wr4+w{jZ)7JlfN zfeA^q_{JSGTZzPudn+e}h-;n&I7n4>D;Fh5J(&i!@|6{FegLb|JiU2&DlY&4002ov JPDHLkV1iPjytDuS literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-7/white_24.png b/assets/icons/guardia/icon-7/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..89cfc5dcf99b695c2efc452874be0cb976600d8d GIT binary patch literal 612 zcmV-q0-ODbP)_enbo+h*$(7h+-uQL86FY z8Vj|xu#E_U{sAQ)7?YSs#>|G}l1p~)&A?&roIU5cGw(SwE7dTdEuLM#Ft9y*tHap{ zz7_bus@;pZywSeA1{|PM(mP4rl4c|=Zc5~=4g=l;-+&=t8Q7g>*9_beXG<&fn} z_*+tKHdu4d8Lp@2A+{9kCI4vQwD^A@`y-^ z7)Xlb5$^qI^WWX=_%7$(dyZARy}z~gxBhFbz4qEm>LCFY&%J`M%rv8PAi{ z``2%*avf;@3tp7p3L#vGI3a{TYenYyDtmqv=x<)7X3s{tN0XAiPy^l)Lih%(khEFS zO-Zvt2p>`fOi_x~1N|gTc2wGunvy7gku*lqUP(hGO$s4AN)9FPbgoNmYLhA@T+HMNlD>BGRG*eKP15QR!UltpA`i462D_f8dHe zU!Ny&JxYsIE;}issm#V4iFDNewPfIzE!)&3@Or4ENX<@fhLbi{xJcWZ0Uolx;3@DH z=$iqhK4GVM)rNuBobglx?MZy#cnPoJEm`4ti@|2pG%0(V2_8IJfLFjv^HVFfziHq# z;h%26HNaM{kL69Pnn83Ju+LTSn!!&wDnA>QrhrFEo&k@ua(ym)aGD3M-y^UXcoBQU nc<;??E_jJCvCgM;kI(!E+?k#&)s~Dx00000NkvXXu0mjfr%-`M literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-7/white_48.png b/assets/icons/guardia/icon-7/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7ea367bfbf96e90fa10631f2d957b25cf9afce GIT binary patch literal 1252 zcmV>DKt#N#sE5{N zA|(+;(H9~JqJ%W=mo_6Iw4yb=%qMGR?K#WNf6kdRQ**YJ?EL5Kz5o4xd;ROIwbwc# zGbBJ)MW4$5L4a<*o&{_Io&nBow6Rj*&ja>Rmp_1$?JX4hCIb9&U~hmQ@$02NUXz01 z&jEgS;Df+0FzTB)y+|`k8U>aCzXi>&1wQo8@A(`p75)t1mjJ&8SQ5V98sAiD@TUOZ z2G|F^|4IM;7jSA(<`du-0AB?7hrPca_}T4$TgmXBSHO1xSBC!8?moLa%|4+;U_P)j zKtAUE$N2SG?>CQhQV~C3>hQ+{?+5rz-rwz-o(KHu=JP@kzMpZkFt}O3jsX8$81M1V z*M;$`)8?cA_#WW(0Qa(KHjJk?^onbL4=|^r=7WQI+Zy1vnZ3txpT97ifi`y3eE2u~ zP=J2}=*_gAjuJQd9D4&RI<^7E;c9+;KERv(&&vIJ*vJlt|Jr{q-M&t{ZR#;2`fT9o z0RORhpeFExz~4Ui-s!1ODg$3jPvAecnyMZK9ukq&KD0|jR;ucswy>&>hTH5x_Wddm z>9u7<#QgvHB4X>sxswsQ=Q~yX(RftV)@xhy_XW*=1q?K@=j364kATDB{68Jp2VBwU znTa{iY^l@NPDDiO4$d-Yp^*tLhI1uc}8{=)i)O zc^*4X^;4@U z&*Zk2$_wz9xaTl27kNQD5EbicoAArBJo=87@aaK*mif|ev;cICYu%2+Csee#6)leS zw+Vk{mPg;+3O>2JvEX127LlJs#O&~phzyI!Y!5tDn#?^%>`(0}RlTz!*iFE@x3dz< znkPCM7j7+d;shY?2MFG@m3+z#p!AlnaK44ZdF#;>d$INmX@X* zyO;vktFHZF2TtXcV}W-9{7_!KC;@)J&rYMEGG~B&z*_U|OZwUA4c0iSuF+Z}YolaUk) z@E`B&;^0k!CrN+YeVSG6KJX)Y^Hi|I=3{@{9SVP)Cb62(+&H%=p&ngV1oN?t;L&z| zoL8JsPu%AKpJnyZ1v3S&)44gMq9=L+b3jBktLpwnDP(a%b*eaH5%wQj5g)>d=TSHS O00001 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-8/navy_24.png b/assets/icons/guardia/icon-8/navy_24.png new file mode 100644 index 0000000000000000000000000000000000000000..ce523fbc2db9cb162e03e6d3d5e3a676db51c13c GIT binary patch literal 1189 zcmV;W1X}xvP)`-u7eZoLlo)tG zg>c)J@Icg<$|WH|BhjQrG15*Ugz#X98cDbmw5Ar??aqA1?CiEu0;DzmUv|#S`Of8k z{@+;`H&nu(`g&(9-ZJW7-KM)AD*n@9;A}wuV{e1_c3_v*wYwMiibj_m>Y9yL0` z^X*VE82W)H(cn7pdst+9m2wx{Ince3Xj%aF0IJLBZu6+Bk5bWN;fehBDd%;3bE&^g zE%AoMBv#BG>v4hHkir?v#zdA7WG(0rPP7c0J&l+Cn(E|ITxSM0=)$Oyom<=h}l@^I-HB4w6ZWDwfKXdprjDpOy}x`ygLr$M!*L&A;o5EB z9>&|Z4CGgo!8}Fr#tjIM;I$^1zh)YpyRVE?Ja1(MXAWE&vFEIw%DMelsZPF#W7eZ~ zHNw-V)MA{&SbrVXc?sh`gIiof_U8K%?vmJ~HXOGE^)C=;NnX4X}FG?rIKZz;Xj-UCWkf0#dv0~QRBFcx3qCuLd zcHq08VWI&+<~O|b8sd$gBJPiPdv>~o>!6`->(7sIeP8kUWzs}&A_Pt~Zqf7M;$xtk z`N>6CuA%;n!bKY|T5=aisZQ47@DVsY*q|TdyoL3TVayd&vzURG>73a+{`j||t}f3& zj*^A1eoH+0dj5S&ftml(z^G1gDEz(Ft}7m87lQu-eb(0bh%SKy00000NkvXXu0mjf DIV4n$ literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-8/navy_32.png b/assets/icons/guardia/icon-8/navy_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9687bd1710332850ada655f41444194c43b2f06b GIT binary patch literal 1730 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-8/navy_64.png b/assets/icons/guardia/icon-8/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..05c5d816af33b5105a1a852b790733e594433079 GIT binary patch literal 4424 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 O000071qj literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-8/white_16.png b/assets/icons/guardia/icon-8/white_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d16a98637b6b0e322b778e1d6accdabd66eb94fd GIT binary patch literal 491 zcmVMgD@=pU>GxK<6j?|c$U{-&9 zC63jya!s2nKHxMS;a+BrVycrHywsV;rX`+TFX1N+V>Ql4#J4{ZM8s5P&g)Af5%DQA z7ho>l<5E4#%%x5DGa|lBFJU(hqLNHx<`wM0a(u?ZrrM4<_?VezBVux(G!E4vo?{&r zb$Pe34C|ZtJ|?jjmm}g`;TFXYu(i~Zo!Hc zbV1XVL*H?u%FN8QxLIcdt26UVTlE@GTJg`l-&xjGFQ9aKfXCR^NiU2vP91KDh!+@d z{5RNE*w}=tc!wRhh{YvxWafTs#>2MlTkB9YPxQJ(ywh~oa1yt0bl6C1+Ok0(%;=Ru zJ%H;?R1_tAwZM`hC@1RTUn4Wm;VsIg61^-xfm1_*nuonVJ%<0qDjexXtIO3JciWl& hkIWp;%qr)1`~puR!JQ$RQDXoA002ovPDHLkV1l54;@1EG literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-8/white_24.png b/assets/icons/guardia/icon-8/white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..81349b3332f8d5b4b43745c41cab8a0338c7057c GIT binary patch literal 842 zcmV-Q1GW5#P)x3%@!nXhlK>g{>ge%7;|wf^hB*1O>#MXg>(^Rcg~ zgL54k0sDa4fxT6AZ!W2-{PzEeI#ORz*SCJiT=p|DsH*+ynZUKce&9fd3iuuP72Tp*q|80(EBaj1Jb}Xi8tJ zo;2U{!y4q!MO}m6fFptJRrQ*BC2&0OWA7gu{2SuzC5T^vMX66!Js;?*YRrI1gx3M5 z0=ek=P!YI8JruaRvEKk34O|7B1*`?u0E>ZJ+vct=y3<8YWLtobfYrcOU{%|ET2&9J z^m^MMuor+QfzPYzG4+BWNyc;>Fd;B}T~*Hkr}X})pgy^VLM;ee*bpC z7^}uGyiO*OFMwaFDrxVks^A~v^uhPQ?yl3qstTNupMWL9iIDUso2Mmebwx)Itj|?% z0%p~l8^%4rg}@I$GF_%#46FpU0rynZ?g@EHO%zW9JHi@ZX>zmb3eXMLyAMN)QQxPwn(wFyo zwYoh6QoXY;Tc^IKuIx?HLA zjpu)qCPWH(nYu)MwLe0ed;cl*#z{nJo)mA~bj(lo0!IPq>O^~K`&z69u5WuP%-bP@ z=o3gfKak$vAF6bF=2Kw$s%y2b`{>_GdZpJu@`ifL)b9tKz;q_VzcFFkP#>><0Ku{z Uxs-V+_W%F@07*qoM6N<$g311(U;qFB literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-8/white_32.png b/assets/icons/guardia/icon-8/white_32.png new file mode 100644 index 0000000000000000000000000000000000000000..06d68db0844624295c203f784d39442403a4b0ea GIT binary patch literal 1201 zcmV;i1Wx;jP)68hsrR7DEicggdixeA_@ACMPYr+ zrUjw}f+#iHEkj#T3A3G1)3j#!#d+uXkJq=!-dQ~G=f3yebI(2ZoaZdBG)4rpj+LyY z2x#$mF>sZC*G4TAs5SYG^Ei(Iy1_EqMy13^2sj(~9au12chr2KB_jG$kfhm?`X$v( z+yv!iyCl6U>3QH9NiU`n5z*I_0+PbxNs_J{fdYR^YWKV|BD#P|=AkFxFyI^D3C~*& z1qfUHl^|>brUScx=L#A1*XLM%%_tE6w^xi+7%l)F_wUx>nm(FPBod$v`*}Iuq{+wp zOU|GI6=H#VCEX;c$KXopGgxnrh}FPLl1`Ja2jIs0TO`f*?}oJ+9oN%oO?4Q9Vh7rNn0hY%CPlbUm1pZ!AeQz zNvd8`#&?_NeLhoniCx(1_3@IHO6rP;KY^?(iTaI_rl)cd(VcjSh#h`7sZI+2NYeL` z7DvQSc1M*5lC#%}j;k(@h`MimKKav%ovw;&Dho!$C61P~Og?m4J~Se-cC_TdY$Vzv zV!os-DtCC^Q@CbP#nK$K)yWba$9F0cK}Ca zrgI$_5doJu<*oxJ09RyYOsjbRRA5g=5pXQ9-urW^C`j;h8O_~A_*Ie8Iz$vy(eaSM zwJ;*)THXrhjm-ZY5s`J`Wl3uz;$ib7P@k&uz~{gzHs9pp;)7AYk)AF(Q_?Kpfrv;; zej#a5T}Z@E^Usv@q$BAO&zEUbE!2J&w7W6+#g%frtLb~dQXmW3T7&gIw{KSi6YCc{ z#YWL~4d=_+zB?jTN!p$XDI(JR(+uXc&dP{5-_1+9@#kz@BVx~}JJ+IyB#zcgI@c*V zUHfXmx6sLMf~2=HFp P00000NkvXXu0mjfZ6r!| literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-8/white_48.png b/assets/icons/guardia/icon-8/white_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2a46fb0d631da92ae04dd47a976e45e224d3bf3d GIT binary patch literal 1835 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 IM6N<$f@Tld#{d8T literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-9/navy_48.png b/assets/icons/guardia/icon-9/navy_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ec3f71f6053961828f678e97dfa2af20d40a6d58 GIT binary patch literal 3327 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 JPDHLkV1fcknsWdE literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-9/navy_64.png b/assets/icons/guardia/icon-9/navy_64.png new file mode 100644 index 0000000000000000000000000000000000000000..f1eaa020ebd5aa9d46fb85b5002a837e0f774b49 GIT binary patch literal 4964 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-9/white_64.png b/assets/icons/guardia/icon-9/white_64.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd2c35d545da999449a60368b4d8f4b5ff941be GIT binary patch literal 3046 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 literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/icon-registry.ts b/assets/icons/guardia/icon-registry.ts new file mode 100644 index 00000000..2caa2184 --- /dev/null +++ b/assets/icons/guardia/icon-registry.ts @@ -0,0 +1,62 @@ +// GUARDiA 아이콘 레지스트리 — scripts/misc/icon_deploy.py 자동 생성 (수동 편집 시 재실행으로 덮어쓰기 주의) +// 사용: import { guardiaIcons } from '@/assets/icons/guardia/icon-registry'; +// + +export const guardiaIcons: Record> = { + 'home': { navy: require('./home/navy_48.png'), white: require('./home/white_48.png') }, + 'icon-1_1': { navy: require('./icon-1_1/navy_48.png'), white: require('./icon-1_1/white_48.png') }, + 'icon-1_10': { navy: require('./icon-1_10/navy_48.png'), white: require('./icon-1_10/white_48.png') }, + 'icon-1_11': { navy: require('./icon-1_11/navy_48.png'), white: require('./icon-1_11/white_48.png') }, + 'icon-1_12': { navy: require('./icon-1_12/navy_48.png'), white: require('./icon-1_12/white_48.png') }, + 'icon-1_13': { navy: require('./icon-1_13/navy_48.png'), white: require('./icon-1_13/white_48.png') }, + 'icon-1_14': { navy: require('./icon-1_14/navy_48.png'), white: require('./icon-1_14/white_48.png') }, + 'icon-1_15': { navy: require('./icon-1_15/navy_48.png'), white: require('./icon-1_15/white_48.png') }, + 'icon-1_2': { navy: require('./icon-1_2/navy_48.png'), white: require('./icon-1_2/white_48.png') }, + 'icon-1_3': { navy: require('./icon-1_3/navy_48.png'), white: require('./icon-1_3/white_48.png') }, + 'icon-1_4': { navy: require('./icon-1_4/navy_48.png'), white: require('./icon-1_4/white_48.png') }, + 'icon-1_5': { navy: require('./icon-1_5/navy_48.png'), white: require('./icon-1_5/white_48.png') }, + 'icon-1_6': { navy: require('./icon-1_6/navy_48.png'), white: require('./icon-1_6/white_48.png') }, + 'icon-1_7': { navy: require('./icon-1_7/navy_48.png'), white: require('./icon-1_7/white_48.png') }, + 'icon-1_8': { navy: require('./icon-1_8/navy_48.png'), white: require('./icon-1_8/white_48.png') }, + 'icon-1_9': { navy: require('./icon-1_9/navy_48.png'), white: require('./icon-1_9/white_48.png') }, + 'icon-1': { navy: require('./icon-1/navy_48.png'), white: require('./icon-1/white_48.png') }, + 'icon-10': { navy: require('./icon-10/navy_48.png'), white: require('./icon-10/white_48.png') }, + 'icon-11': { navy: require('./icon-11/navy_48.png'), white: require('./icon-11/white_48.png') }, + 'icon-12': { navy: require('./icon-12/navy_48.png'), white: require('./icon-12/white_48.png') }, + 'icon-13': { navy: require('./icon-13/navy_48.png'), white: require('./icon-13/white_48.png') }, + 'icon-14': { navy: require('./icon-14/navy_48.png'), white: require('./icon-14/white_48.png') }, + 'icon-15': { navy: require('./icon-15/navy_48.png'), white: require('./icon-15/white_48.png') }, + 'icon-16': { navy: require('./icon-16/navy_48.png'), white: require('./icon-16/white_48.png') }, + 'icon-17': { navy: require('./icon-17/navy_48.png'), white: require('./icon-17/white_48.png') }, + 'icon-18': { navy: require('./icon-18/navy_48.png'), white: require('./icon-18/white_48.png') }, + 'icon-19': { navy: require('./icon-19/navy_48.png'), white: require('./icon-19/white_48.png') }, + 'icon-2': { navy: require('./icon-2/navy_48.png'), white: require('./icon-2/white_48.png') }, + 'icon-20': { navy: require('./icon-20/navy_48.png'), white: require('./icon-20/white_48.png') }, + 'icon-21': { navy: require('./icon-21/navy_48.png'), white: require('./icon-21/white_48.png') }, + 'icon-22': { navy: require('./icon-22/navy_48.png'), white: require('./icon-22/white_48.png') }, + 'icon-23': { navy: require('./icon-23/navy_48.png'), white: require('./icon-23/white_48.png') }, + 'icon-24': { navy: require('./icon-24/navy_48.png'), white: require('./icon-24/white_48.png') }, + 'icon-25': { navy: require('./icon-25/navy_48.png'), white: require('./icon-25/white_48.png') }, + 'icon-26': { navy: require('./icon-26/navy_48.png'), white: require('./icon-26/white_48.png') }, + 'icon-27': { navy: require('./icon-27/navy_48.png'), white: require('./icon-27/white_48.png') }, + 'icon-28': { navy: require('./icon-28/navy_48.png'), white: require('./icon-28/white_48.png') }, + 'icon-29': { navy: require('./icon-29/navy_48.png'), white: require('./icon-29/white_48.png') }, + 'icon-3': { navy: require('./icon-3/navy_48.png'), white: require('./icon-3/white_48.png') }, + 'icon-30': { navy: require('./icon-30/navy_48.png'), white: require('./icon-30/white_48.png') }, + 'icon-4': { navy: require('./icon-4/navy_48.png'), white: require('./icon-4/white_48.png') }, + 'icon-5': { navy: require('./icon-5/navy_48.png'), white: require('./icon-5/white_48.png') }, + 'icon-6': { navy: require('./icon-6/navy_48.png'), white: require('./icon-6/white_48.png') }, + 'icon-7': { navy: require('./icon-7/navy_48.png'), white: require('./icon-7/white_48.png') }, + 'icon-8': { navy: require('./icon-8/navy_48.png'), white: require('./icon-8/white_48.png') }, + 'icon-9': { navy: require('./icon-9/navy_48.png'), white: require('./icon-9/white_48.png') }, + 'panel-01': { original: require('./panel-01/original_48.png') }, + 'panel-02': { original: require('./panel-02/original_48.png') }, + 'brand-1': { original: require('./brand-1/original_48.png') }, + 'brand-2': { original: require('./brand-2/original_48.png') }, + 'brand-3': { original: require('./brand-3/original_48.png') }, + 'brand-4': { original: require('./brand-4/original_48.png') }, + 'brand-5': { original: require('./brand-5/original_48.png') }, + 'brand-6': { original: require('./brand-6/original_48.png') }, + 'brand-7': { original: require('./brand-7/original_48.png') }, + 'brand-8': { original: require('./brand-8/original_48.png') }, +}; \ No newline at end of file diff --git a/assets/icons/guardia/panel-01/original_16.png b/assets/icons/guardia/panel-01/original_16.png new file mode 100644 index 0000000000000000000000000000000000000000..675b9efc9becc9dbf3d1a0d07b9494e587c7e744 GIT binary patch literal 786 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 b?wjKu*JW5-N2u>t00000NkvXXu0mjfIsjG# literal 0 HcmV?d00001 diff --git a/assets/icons/guardia/panel-02/original_24.png b/assets/icons/guardia/panel-02/original_24.png new file mode 100644 index 0000000000000000000000000000000000000000..b73d098e2d086789d2837d28a6d5bf6b0f5e8acf GIT binary patch literal 1231 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 YFS^o_1?-uE)&Kwi07*qoM6N<$f~J2MKL7v# literal 0 HcmV?d00001 diff --git a/components/AlertChannelBadge.tsx b/components/AlertChannelBadge.tsx new file mode 100644 index 00000000..b83d5738 --- /dev/null +++ b/components/AlertChannelBadge.tsx @@ -0,0 +1,53 @@ +/** + * AlertChannelBadge (#41) — 알림 채널 표시 뱃지 + * 알림 규칙·서비스 상태 화면에서 채널(인앱/이메일/SMS/푸시/묵음)을 시각적으로 표시. + * react-native-svg 미사용 (View + StyleSheet only, 폐쇄망 호환). + */ +import { View, Text, StyleSheet } from 'react-native' + +export type AlertChannel = 'inapp' | 'email' | 'sms' | 'push' | 'mute' + +interface ChannelMeta { label: string; short: string; color: string; bg: string } + +const CHANNELS: Record = { + inapp: { label: '인앱', short: 'IN', color: '#00A0C8', bg: 'rgba(0,160,200,.12)' }, + push: { label: '푸시', short: 'PU', color: '#4f6ef7', bg: 'rgba(79,110,247,.12)' }, + email: { label: '이메일', short: '@', color: '#8b5cf6', bg: 'rgba(139,92,246,.12)' }, + sms: { label: 'SMS', short: 'SMS', color: '#f59e0b', bg: 'rgba(245,158,11,.12)' }, + mute: { label: '묵음', short: '🔕', color: '#94a3b8', bg: 'rgba(148,163,184,.15)' }, +} + +interface Props { + channel: string + size?: 'sm' | 'md' +} + +export default function AlertChannelBadge({ channel, size = 'md' }: Props) { + const meta = CHANNELS[channel?.toLowerCase()] ?? CHANNELS.inapp + const sm = size === 'sm' + return ( + + + {meta.label} + + ) +} + +/** 여러 채널을 한 줄로 표시 */ +export function AlertChannelRow({ channels }: { channels: string[] }) { + return ( + + {channels.map((c, i) => )} + + ) +} + +const s = StyleSheet.create({ + badge: { flexDirection: 'row', alignItems: 'center', gap: 5, borderRadius: 12, alignSelf: 'flex-start' }, + dot: { borderRadius: 4 }, + txt: { fontWeight: '700' }, + row: { flexDirection: 'row', gap: 5, flexWrap: 'wrap' }, +}) diff --git a/components/ApprovalStages.tsx b/components/ApprovalStages.tsx new file mode 100644 index 00000000..1154febd --- /dev/null +++ b/components/ApprovalStages.tsx @@ -0,0 +1,117 @@ +import { useEffect, useState } from 'react' +import { View, Text, StyleSheet, ActivityIndicator } from 'react-native' +import { COLORS } from '../constants/Config' +import { getApprovalStages } from '../services/api' + +/** + * 기능 #65 — 다단계 승인 진행 시각화 + * - GET /api/approvals/{id}/stages + * - 단계별 타임라인: 단계명, 승인자, 상태, 시각 + * - 완료(초록 체크) / 현재(파란 점, 하이라이트) / 대기(회색 원) / 반려(빨강) + */ + +export interface ApprovalStage { + level: number + name?: string + approver: string + status: 'approved' | 'pending' | 'rejected' | 'current' | 'waiting' + acted_at?: string | null +} + +interface Props { + approvalId: string | number + /** 이미 보유한 단계 데이터가 있으면 fetch 생략 */ + stages?: ApprovalStage[] +} + +const STATUS_META: Record = { + approved: { color: COLORS.success, mark: '✓', label: '승인' }, + rejected: { color: COLORS.danger, mark: '✕', label: '반려' }, + current: { color: COLORS.accent, mark: '●', label: '진행중' }, + pending: { color: '#cbd5e1', mark: '○', label: '대기' }, + waiting: { color: '#cbd5e1', mark: '○', label: '대기' }, +} + +export default function ApprovalStages({ approvalId, stages: preset }: Props) { + const [stages, setStages] = useState(preset ?? []) + const [loading, setLoading] = useState(!preset) + + useEffect(() => { + if (preset) { setStages(preset); return } + let alive = true + ;(async () => { + setLoading(true) + try { + const r = await getApprovalStages(approvalId) + if (alive) setStages(r.data?.stages ?? r.data ?? []) + } catch { /* 무시 */ } + finally { if (alive) setLoading(false) } + })() + return () => { alive = false } + }, [approvalId, preset]) + + if (loading) return + if (!stages.length) return 승인 단계 정보가 없습니다. + + return ( + + {stages.map((st, idx) => { + const meta = STATUS_META[st.status] ?? STATUS_META.pending + const isCurrent = st.status === 'current' + const isLast = idx === stages.length - 1 + return ( + + + + + {meta.mark} + + + {!isLast && } + + + + + {st.level}단계 · {st.name ?? `승인 ${st.level}`} + + + {meta.label} + + + 승인자: {st.approver} + {!!st.acted_at && {formatTime(st.acted_at)}} + + + ) + })} + + ) +} + +function formatTime(ts: string): string { + try { + const d = new Date(ts) + return `${d.getMonth() + 1}/${d.getDate()} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}` + } catch { return ts } +} + +const s = StyleSheet.create({ + empty: { textAlign: 'center', color: COLORS.muted, paddingVertical: 16, fontSize: 12 }, + row: { flexDirection: 'row' }, + gutter: { width: 30, alignItems: 'center' }, + node: { width: 24, height: 24, borderRadius: 12, borderWidth: 2, + alignItems: 'center', justifyContent: 'center', backgroundColor: '#fff' }, + nodeMark: { fontSize: 12, fontWeight: '800', color: '#fff' }, + line: { flex: 1, width: 2, backgroundColor: COLORS.border, marginVertical: 2 }, + content: { flex: 1, paddingBottom: 16, paddingLeft: 8 }, + contentCurrent: { backgroundColor: COLORS.light, borderRadius: 8, padding: 8, marginLeft: 4, marginBottom: 12 }, + head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + stageName: { fontSize: 13, fontWeight: '700', color: COLORS.text, flex: 1 }, + badge: { paddingHorizontal: 8, paddingVertical: 2, borderRadius: 9 }, + badgeText: { fontSize: 10, fontWeight: '700', color: '#fff' }, + approver: { fontSize: 12, color: COLORS.blue, marginTop: 3 }, + time: { fontSize: 11, color: COLORS.muted, marginTop: 2 }, +}) diff --git a/components/AutoRCA.tsx b/components/AutoRCA.tsx new file mode 100644 index 00000000..195d7bcf --- /dev/null +++ b/components/AutoRCA.tsx @@ -0,0 +1,125 @@ +/** + * AutoRCA (#21) — 자동 근본원인분석(RCA) 표시 + * + * GET /api/ai/rca/{incident_id} 우선 시도, 실패 시 Ollama로 직접 분석. + * 원인 / 영향 범위 / 재발 방지 3섹션을 접을 수 있는 아코디언으로 표시. + */ +import { useState, useEffect } from 'react' +import { View, Text, Pressable, StyleSheet, ActivityIndicator } from 'react-native' +import { COLORS, API_BASE } from '../constants/Config' +import { authFetch } from '../utils/auth' +import { generateJSON, DEFAULT_TEXT_MODEL } from '../lib/ollama' + +interface RCA { + cause: string + impact: string + prevention: string +} + +interface Props { + incidentId: number | string + summary?: string // Ollama 폴백용 인시던트 요약 (자격증명 미포함) +} + +const EMPTY: RCA = { cause: '', impact: '', prevention: '' } + +export function AutoRCA({ incidentId, summary }: Props) { + const [rca, setRca] = useState(EMPTY) + const [loading, setLoading] = useState(true) + const [open, setOpen] = useState<'cause' | 'impact' | 'prevention' | null>('cause') + const [src, setSrc] = useState<'api' | 'ai' | 'none'>('none') + + useEffect(() => { + let alive = true + ;(async () => { + setLoading(true) + // 1) ITSM API 시도 + try { + const res = await authFetch(`${API_BASE}/api/ai/rca/${incidentId}`) + if (res.ok) { + const d = await res.json() + const parsed: RCA = { + cause: d.cause ?? d.root_cause ?? '', + impact: d.impact ?? d.impact_scope ?? '', + prevention: d.prevention ?? d.recurrence_prevention ?? '', + } + if (alive && (parsed.cause || parsed.impact || parsed.prevention)) { + setRca(parsed) + setSrc('api') + setLoading(false) + return + } + } + } catch { + /* API 실패 → Ollama 폴백 */ + } + // 2) Ollama 폴백 + if (summary?.trim()) { + const prompt = + `다음 IT 인시던트에 대해 근본원인분석(RCA)을 수행하세요: "${summary}". ` + + `JSON으로만 출력: {"cause":"근본원인","impact":"영향범위","prevention":"재발방지책"}` + const aiRca = await generateJSON(DEFAULT_TEXT_MODEL, prompt, EMPTY) + if (alive) { + setRca(aiRca) + setSrc(aiRca.cause ? 'ai' : 'none') + } + } + if (alive) setLoading(false) + })() + return () => { + alive = false + } + }, [incidentId, summary]) + + const sections: { key: 'cause' | 'impact' | 'prevention'; label: string; icon: string }[] = [ + { key: 'cause', label: '근본 원인', icon: '🔍' }, + { key: 'impact', label: '영향 범위', icon: '🌐' }, + { key: 'prevention', label: '재발 방지', icon: '🛡️' }, + ] + + if (loading) { + return ( + + + RCA 분석 중... + + ) + } + + return ( + + + 🧩 자동 RCA + {src === 'api' ? 'ITSM 분석' : src === 'ai' ? 'AI 분석' : '데이터 없음'} + + {sections.map(sec => ( + + setOpen(open === sec.key ? null : sec.key)}> + + {sec.icon} {sec.label} + + {open === sec.key ? '▲' : '▼'} + + {open === sec.key ? ( + {rca[sec.key] || '분석 결과가 없습니다.'} + ) : null} + + ))} + + ) +} + +export default AutoRCA + +const S = StyleSheet.create({ + wrap: { backgroundColor: COLORS.card, borderRadius: 14, padding: 14, borderWidth: 1, borderColor: COLORS.border }, + head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }, + title: { fontSize: 15, fontWeight: '700', color: COLORS.text }, + badge: { fontSize: 10, color: COLORS.blue, backgroundColor: COLORS.light, paddingHorizontal: 8, paddingVertical: 3, borderRadius: 8, overflow: 'hidden' }, + loadingText: { fontSize: 12, color: COLORS.muted, marginTop: 6 }, + accItem: { borderTopWidth: 1, borderTopColor: COLORS.border }, + accHead: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingVertical: 11 }, + accLabel: { fontSize: 13, fontWeight: '600', color: COLORS.text }, + accArrow: { fontSize: 10, color: COLORS.muted }, + accBody: { fontSize: 13, color: COLORS.text, lineHeight: 19, paddingBottom: 12, paddingLeft: 4 }, +}) diff --git a/components/Comment.tsx b/components/Comment.tsx new file mode 100644 index 00000000..20263f98 --- /dev/null +++ b/components/Comment.tsx @@ -0,0 +1,124 @@ +import { useEffect, useState } from 'react' +import { + View, Text, TextInput, TouchableOpacity, StyleSheet, ActivityIndicator, Alert, +} from 'react-native' +import { COLORS } from '../constants/Config' +import { getSRComments, addSRComment } from '../services/api' + +interface CommentItem { + id: number | string + content: string + author?: string + is_internal?: boolean + created_at?: string +} + +interface Props { + srId: number +} + +/** + * 기능 #13 — 내부/외부 코멘트 구분 컴포넌트 + * 내부: 자물쇠(담당자 전용), 외부: 지구본(기관 공개) + * POST /api/tasks/{id}/comments { content, is_internal } + */ +export default function Comment({ srId }: Props) { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(true) + const [text, setText] = useState('') + const [isInternal, setIsInternal] = useState(true) + const [sending, setSending] = useState(false) + + const load = async () => { + try { + const res = await getSRComments(srId) + setItems(res.data?.content ?? res.data?.items ?? res.data ?? []) + } catch { setItems([]) } + finally { setLoading(false) } + } + + useEffect(() => { load() }, [srId]) + + const submit = async () => { + if (!text.trim()) return + setSending(true) + try { + await addSRComment(srId, text.trim(), isInternal) + setText('') + await load() + } catch (e: any) { + Alert.alert('오류', e.response?.data?.detail ?? '코멘트 등록 실패') + } finally { setSending(false) } + } + + return ( + + {loading ? ( + + ) : items.length === 0 ? ( + 코멘트가 없습니다. + ) : ( + items.map(c => ( + + + {c.is_internal ? '🔒 내부' : '🌐 외부'} + {c.author ?? '담당자'} + + {c.content} + {!!c.created_at && {c.created_at.slice(0, 16).replace('T', ' ')}} + + )) + )} + + {/* 입력 영역 */} + + setIsInternal(true)} + > + 🔒 내부 + + setIsInternal(false)} + > + 🌐 외부 + + + + + + {sending ? : 등록} + + + + ) +} + +const s = StyleSheet.create({ + empty: { color: COLORS.muted, fontSize: 12, paddingVertical: 8 }, + bubble: { borderRadius: 10, padding: 12, marginBottom: 8, borderLeftWidth: 3 }, + internal: { backgroundColor: '#FFF7ED', borderLeftColor: COLORS.warning }, + external: { backgroundColor: COLORS.light, borderLeftColor: COLORS.accent }, + bubbleHead: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 4 }, + tag: { fontSize: 11, fontWeight: '700', color: COLORS.text }, + author: { fontSize: 11, color: COLORS.muted }, + content: { fontSize: 13, color: COLORS.text, lineHeight: 18 }, + time: { fontSize: 10, color: COLORS.muted, marginTop: 4 }, + toggleRow: { flexDirection: 'row', gap: 8, marginTop: 12, marginBottom: 8 }, + toggle: { paddingHorizontal: 12, paddingVertical: 6, borderRadius: 16, borderWidth: 1, borderColor: COLORS.border }, + toggleActive: { backgroundColor: COLORS.primary, borderColor: COLORS.primary }, + toggleText: { fontSize: 12, color: COLORS.text }, + toggleTextActive: { color: '#fff', fontWeight: '700' }, + inputRow: { flexDirection: 'row', alignItems: 'flex-end', gap: 8 }, + input: { flex: 1, borderWidth: 1.5, borderColor: COLORS.border, borderRadius: 9, padding: 10, fontSize: 13, color: COLORS.text, maxHeight: 100 }, + sendBtn: { backgroundColor: COLORS.accent, borderRadius: 9, paddingHorizontal: 16, paddingVertical: 11 }, + sendText: { color: '#fff', fontSize: 13, fontWeight: '700' }, +}) diff --git a/components/DailySummary.tsx b/components/DailySummary.tsx new file mode 100644 index 00000000..f01e89ea --- /dev/null +++ b/components/DailySummary.tsx @@ -0,0 +1,135 @@ +/** + * DailySummary (#26) — 일일 AI 요약 카드 + * + * GET /api/tasks/stats/mine?period=today → Ollama로 자연어 요약 생성. + * 매일 1회 갱신 (SecureStore 캐시, 날짜 키 비교). 홈 대시보드 상단 카드. + */ +import { useState, useEffect } from 'react' +import { View, Text, StyleSheet, ActivityIndicator } from 'react-native' +import * as SecureStore from 'expo-secure-store' +import { COLORS, API_BASE } from '../constants/Config' +import { authFetch } from '../utils/auth' +import { generate, DEFAULT_TEXT_MODEL } from '../lib/ollama' + +const CACHE_KEY = 'grd_daily_summary' + +interface Stats { + processed?: number + pending?: number + sla_risk?: number +} + +function todayKey(): string { + return new Date().toISOString().slice(0, 10) +} + +export function DailySummary() { + const [summary, setSummary] = useState('') + const [stats, setStats] = useState({}) + const [loading, setLoading] = useState(true) + + useEffect(() => { + let alive = true + ;(async () => { + // 1) 캐시 확인 (오늘 날짜) + try { + const cached = await SecureStore.getItemAsync(CACHE_KEY) + if (cached) { + const c = JSON.parse(cached) + if (c.date === todayKey() && c.summary) { + if (alive) { + setSummary(c.summary) + setStats(c.stats ?? {}) + setLoading(false) + } + return + } + } + } catch { + /* 캐시 무시 */ + } + + // 2) 통계 조회 + let s: Stats = {} + try { + const res = await authFetch(`${API_BASE}/api/tasks/stats/mine?period=today`) + if (res.ok) { + const d = await res.json() + s = { + processed: d.processed ?? d.completed ?? d.done ?? 0, + pending: d.pending ?? d.open ?? d.in_progress ?? 0, + sla_risk: d.sla_risk ?? d.at_risk ?? 0, + } + } + } catch { + /* 통계 실패 → 기본값 */ + } + if (alive) setStats(s) + + // 3) Ollama 요약 + const prompt = + `다음 ITSM 일일 통계를 운영자에게 보고하듯 한국어 한 문장으로 요약하세요. ` + + `처리: ${s.processed ?? 0}건, 미처리: ${s.pending ?? 0}건, SLA 위험: ${s.sla_risk ?? 0}건. ` + + `격려 한마디 포함.` + const aiText = await generate(DEFAULT_TEXT_MODEL, prompt) + const finalText = + aiText || + `오늘 처리 ${s.processed ?? 0}건, 미처리 ${s.pending ?? 0}건, SLA 위험 ${s.sla_risk ?? 0}건입니다.` + if (alive) { + setSummary(finalText) + setLoading(false) + } + // 4) 캐시 저장 + try { + await SecureStore.setItemAsync( + CACHE_KEY, + JSON.stringify({ date: todayKey(), summary: finalText, stats: s }), + ) + } catch { + /* 캐시 저장 실패 무시 */ + } + })() + return () => { + alive = false + } + }, []) + + return ( + + 🤖 오늘의 AI 브리핑 + {loading ? ( + + ) : ( + <> + {summary} + + + + + + + )} + + ) +} + +function Stat({ label, value, color }: { label: string; value: number; color: string }) { + return ( + + {value} + {label} + + ) +} + +export default DailySummary + +const S = StyleSheet.create({ + wrap: { backgroundColor: COLORS.gnbBg, borderRadius: 16, padding: 16, margin: 12 }, + title: { fontSize: 13, fontWeight: '700', color: 'rgba(255,255,255,0.85)' }, + summary: { fontSize: 14, color: '#fff', lineHeight: 20, marginTop: 8 }, + statsRow: { flexDirection: 'row', marginTop: 14, gap: 8 }, + stat: { flex: 1, backgroundColor: 'rgba(255,255,255,0.08)', borderRadius: 10, paddingVertical: 10, alignItems: 'center' }, + statVal: { fontSize: 20, fontWeight: '800' }, + statLabel: { fontSize: 11, color: 'rgba(255,255,255,0.7)', marginTop: 2 }, +}) diff --git a/components/ImpactPreview.tsx b/components/ImpactPreview.tsx new file mode 100644 index 00000000..7e00bd5b --- /dev/null +++ b/components/ImpactPreview.tsx @@ -0,0 +1,118 @@ +/** + * ImpactPreview (#27) — 장애 영향 서비스 예측 시각화 + * + * GET /api/ai/impact/{server_id} 우선, 실패 시 /api/servers/{id}/dependencies. + * 영향받는 서비스 목록 + 연결 관계를 텍스트 기반 리스트로 표시. + */ +import { useState, useEffect } from 'react' +import { View, Text, StyleSheet, ActivityIndicator } from 'react-native' +import { COLORS, API_BASE } from '../constants/Config' +import { authFetch } from '../utils/auth' + +interface ImpactNode { + name: string + type?: string // service / db / app ... + severity?: 'high' | 'medium' | 'low' | string + relation?: string // 'depends_on' 등 +} + +interface Props { + serverId: number | string + serverName?: string +} + +const SEV_COLOR: Record = { + high: COLORS.danger, + medium: COLORS.warning, + low: COLORS.success, +} + +export function ImpactPreview({ serverId, serverName }: Props) { + const [nodes, setNodes] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + let alive = true + ;(async () => { + setLoading(true) + const endpoints = [ + `${API_BASE}/api/ai/impact/${serverId}`, + `${API_BASE}/api/servers/${serverId}/dependencies`, + ] + for (const url of endpoints) { + try { + const res = await authFetch(url) + if (res.ok) { + const d = await res.json() + const raw = Array.isArray(d) ? d : d.impacted ?? d.services ?? d.dependencies ?? d.nodes ?? [] + const list: ImpactNode[] = raw.map((x: any) => ({ + name: x.name ?? x.service_name ?? x.hostname ?? String(x), + type: x.type ?? x.kind, + severity: x.severity ?? x.impact, + relation: x.relation ?? x.relationship, + })) + if (alive && list.length) { + setNodes(list) + setLoading(false) + return + } + } + } catch { + /* 다음 엔드포인트 시도 */ + } + } + if (alive) { + setNodes([]) + setLoading(false) + } + })() + return () => { + alive = false + } + }, [serverId]) + + return ( + + 🌐 장애 영향도 예측 + {serverName ? 출발: {serverName} : null} + + {loading ? ( + + ) : nodes.length === 0 ? ( + 영향 데이터를 불러올 수 없습니다. + ) : ( + + {nodes.map((n, i) => ( + + + + {n.name} + + {n.type ? `${n.type} · ` : ''} + {n.relation ?? '연결됨'} + {n.severity ? ` · ${n.severity}` : ''} + + + + ))} + ※ {nodes.length}개 서비스가 영향을 받을 수 있습니다. + + )} + + ) +} + +export default ImpactPreview + +const S = StyleSheet.create({ + wrap: { backgroundColor: COLORS.card, borderRadius: 14, padding: 14, borderWidth: 1, borderColor: COLORS.border }, + title: { fontSize: 15, fontWeight: '700', color: COLORS.text }, + root: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + empty: { fontSize: 12, color: COLORS.muted, marginTop: 8 }, + list: { marginTop: 10 }, + node: { flexDirection: 'row', alignItems: 'center', paddingVertical: 8, borderBottomWidth: 1, borderBottomColor: '#f1f5f9', gap: 10 }, + dot: { width: 10, height: 10, borderRadius: 5 }, + nodeName: { fontSize: 13, fontWeight: '600', color: COLORS.text }, + nodeMeta: { fontSize: 11, color: COLORS.muted, marginTop: 2 }, + note: { fontSize: 11, color: COLORS.danger, marginTop: 8 }, +}) diff --git a/components/IncidentTimeline.tsx b/components/IncidentTimeline.tsx new file mode 100644 index 00000000..caf48e80 --- /dev/null +++ b/components/IncidentTimeline.tsx @@ -0,0 +1,82 @@ +import { View, Text, FlatList, StyleSheet } from 'react-native' +import { COLORS } from '../constants/Config' + +export interface TimelineEvent { + timestamp: string + actor: string + action: string + detail?: string +} + +interface Props { + events: TimelineEvent[] +} + +const ACTION_COLOR: Record = { + created: COLORS.accent, + assigned: COLORS.blue, + status: '#4f6ef7', + escalated: COLORS.danger, + comment: COLORS.muted, + resolved: COLORS.success, + closed: COLORS.success, +} + +/** + * 기능 #6 — 인시던트 타임라인 + * 수직 타임라인 UI (점 + 연결선 + 이벤트 카드) + */ +export default function IncidentTimeline({ events }: Props) { + if (!events || events.length === 0) { + return 타임라인 이벤트가 없습니다. + } + + return ( + String(i)} + renderItem={({ item, index }) => { + const color = ACTION_COLOR[item.action?.toLowerCase()] ?? COLORS.accent + const isLast = index === events.length - 1 + return ( + + + + {!isLast && } + + + + {item.action} + {formatTime(item.timestamp)} + + {item.actor} + {!!item.detail && {item.detail}} + + + ) + }} + /> + ) +} + +function formatTime(ts: string): string { + try { + const d = new Date(ts) + return `${d.getMonth() + 1}/${d.getDate()} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}` + } catch { return ts } +} + +const s = StyleSheet.create({ + empty: { textAlign: 'center', color: COLORS.muted, paddingVertical: 24, fontSize: 13 }, + row: { flexDirection: 'row' }, + gutter: { width: 24, alignItems: 'center' }, + dot: { width: 12, height: 12, borderRadius: 6, marginTop: 4 }, + line: { flex: 1, width: 2, backgroundColor: COLORS.border, marginTop: 2 }, + content: { flex: 1, paddingBottom: 18, paddingLeft: 8 }, + head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + action: { fontSize: 13, fontWeight: '700', color: COLORS.text, textTransform: 'capitalize' }, + time: { fontSize: 11, color: COLORS.muted }, + actor: { fontSize: 12, color: COLORS.blue, marginTop: 2 }, + detail: { fontSize: 12, color: COLORS.muted, marginTop: 4, lineHeight: 17 }, +}) diff --git a/components/KBSuggest.tsx b/components/KBSuggest.tsx new file mode 100644 index 00000000..fb882e2a --- /dev/null +++ b/components/KBSuggest.tsx @@ -0,0 +1,93 @@ +/** + * KBSuggest (#23) — SR 입력 중 실시간 KB 추천 + * + * query(SR 제목 입력값) → debounce 600ms → GET /api/kb/?q={query}&limit=3 + * 최대 3개 KB 카드 표시, 탭 → onOpen(KB id) 콜백 (상세 화면 이동). + */ +import { useState, useEffect, useRef } from 'react' +import { View, Text, Pressable, StyleSheet, ActivityIndicator } from 'react-native' +import { COLORS, API_BASE } from '../constants/Config' +import { authFetch } from '../utils/auth' + +interface KBItem { + id: number + title: string + summary?: string + category?: string +} + +interface Props { + query: string + onOpen?: (id: number) => void +} + +export function KBSuggest({ query, onOpen }: Props) { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(false) + const timer = useRef | null>(null) + + useEffect(() => { + if (timer.current) clearTimeout(timer.current) + const q = query?.trim() ?? '' + if (q.length < 2) { + setItems([]) + return + } + timer.current = setTimeout(async () => { + setLoading(true) + try { + const res = await authFetch(`${API_BASE}/api/kb/?q=${encodeURIComponent(q)}&limit=3`) + if (res.ok) { + const d = await res.json() + const list: KBItem[] = Array.isArray(d) ? d : d.items ?? d.results ?? [] + setItems(list.slice(0, 3)) + } else { + setItems([]) + } + } catch { + setItems([]) + } finally { + setLoading(false) + } + }, 600) + return () => { + if (timer.current) clearTimeout(timer.current) + } + }, [query]) + + if (!loading && items.length === 0) return null + + return ( + + 📚 관련 지식베이스 + {loading ? ( + + ) : ( + items.map(kb => ( + onOpen?.(kb.id)}> + + {kb.title} + + {kb.summary ? ( + + {kb.summary} + + ) : null} + {kb.category ? {kb.category} : null} + + )) + )} + + ) +} + +export default KBSuggest + +const S = StyleSheet.create({ + wrap: { marginTop: 8 }, + title: { fontSize: 12, fontWeight: '700', color: COLORS.muted, marginBottom: 6 }, + card: { backgroundColor: COLORS.light, borderRadius: 10, padding: 11, marginBottom: 6 }, + cardTitle: { fontSize: 13, fontWeight: '600', color: COLORS.blue }, + cardSummary: { fontSize: 12, color: COLORS.text, marginTop: 3, lineHeight: 17 }, + cardCat: { fontSize: 10, color: COLORS.muted, marginTop: 4 }, +}) diff --git a/components/MarkdownViewer.tsx b/components/MarkdownViewer.tsx new file mode 100644 index 00000000..17ac0e44 --- /dev/null +++ b/components/MarkdownViewer.tsx @@ -0,0 +1,49 @@ +import React from 'react' +import { View, Text, ScrollView, StyleSheet } from 'react-native' +import { COLORS } from '../constants/Config' + +interface Props { content: string; style?: object } + +export default function MarkdownViewer({ content, style }: Props) { + const lines = content.split('\n') + return ( + + {lines.map((line, i) => { + if (line.startsWith('### ')) return {line.slice(4)} + if (line.startsWith('## ')) return {line.slice(3)} + if (line.startsWith('# ')) return {line.slice(2)} + if (line.startsWith('---')) return + if (line.startsWith('> ')) return {line.slice(2)} + if (line.startsWith('- ') || line.startsWith('* ')) return {' • '}{renderInline(line.slice(2))} + if (/^\d+\. /.test(line)) { + const [num, ...rest] = line.split('. ') + return {` ${num}. `}{renderInline(rest.join('. '))} + } + if (line.startsWith('```')) return {line.slice(3)} + if (line === '') return + return {renderInline(line)} + })} + + ) +} + +function renderInline(text: string): string { + return text + .replace(/\*\*(.+?)\*\*/g, '$1') + .replace(/`(.+?)`/g, '$1') + .replace(/_(.+?)_/g, '$1') +} + +const s = StyleSheet.create({ + wrap: { flex: 1 }, + h1: { fontSize: 20, fontWeight: '800', color: COLORS.text, marginVertical: 8 }, + h2: { fontSize: 17, fontWeight: '700', color: COLORS.text, marginVertical: 6 }, + h3: { fontSize: 15, fontWeight: '700', color: COLORS.primary, marginVertical: 4 }, + body: { fontSize: 14, color: COLORS.text, lineHeight: 22, marginVertical: 1 }, + li: { fontSize: 14, color: COLORS.text, lineHeight: 22 }, + hr: { height: 1, backgroundColor: COLORS.border, marginVertical: 8 }, + blockquote: { borderLeftWidth: 3, borderLeftColor: COLORS.accent, paddingLeft: 10, marginVertical: 4 }, + bqText: { fontSize: 13, color: COLORS.muted, fontStyle: 'italic' }, + codeBlock: { backgroundColor: '#1E293B', borderRadius: 6, padding: 10, marginVertical: 6 }, + code: { fontSize: 12, color: '#E2E8F0', fontFamily: 'monospace' }, +}) diff --git a/components/MetricGraph.tsx b/components/MetricGraph.tsx new file mode 100644 index 00000000..edef7882 --- /dev/null +++ b/components/MetricGraph.tsx @@ -0,0 +1,172 @@ +/** + * MetricGraph (#47) — 실시간 메트릭 꺾은선 그래프 + * + * react-native-svg가 설치되어 있지 않은 폐쇄망 호환 환경이므로 + * SVG 대신 View + StyleSheet로 꺾은선(세그먼트 회전)을 직접 렌더링한다. + * 각 데이터 포인트 사이를 회전된 얇은 View(선분)로 연결. + * + * 범례: CPU(파랑) / MEM(초록) / DISK(주황) + * X축: 시간, Y축: 0~100% + */ +import { View, Text, StyleSheet, LayoutChangeEvent } from 'react-native' +import { useState } from 'react' + +export interface MetricPoint { + timestamp: string + cpu: number + memory: number + disk: number +} + +interface SeriesDef { key: keyof Omit; label: string; color: string } + +const SERIES: SeriesDef[] = [ + { key: 'cpu', label: 'CPU', color: '#3b82f6' }, + { key: 'memory', label: 'MEM', color: '#22c55e' }, + { key: 'disk', label: 'DISK', color: '#f59e0b' }, +] + +const CHART_H = 160 +const PAD_BOTTOM = 22 // X축 라벨 영역 + +/** 두 점을 잇는 선분(회전 View) 생성 */ +function Segment({ + x1, y1, x2, y2, color, +}: { x1: number; y1: number; x2: number; y2: number; color: string }) { + const dx = x2 - x1 + const dy = y2 - y1 + const length = Math.sqrt(dx * dx + dy * dy) + const angle = Math.atan2(dy, dx) * (180 / Math.PI) + return ( + + ) +} + +export default function MetricGraph({ + data, + title, +}: { data: MetricPoint[]; title?: string }) { + const [width, setWidth] = useState(0) + const onLayout = (e: LayoutChangeEvent) => setWidth(e.nativeEvent.layout.width) + + const plotH = CHART_H - PAD_BOTTOM + const n = data.length + + // y(0~100%) -> 화면 좌표 (0% 하단, 100% 상단) + const toY = (v: number) => plotH - (Math.max(0, Math.min(100, v)) / 100) * plotH + const toX = (i: number) => (n <= 1 ? 0 : (i / (n - 1)) * width) + + const xLabels = (() => { + if (n === 0) return [] + const fmt = (ts: string) => { + const d = new Date(ts) + if (isNaN(d.getTime())) return ts + return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}` + } + const first = data[0], last = data[n - 1], mid = data[Math.floor(n / 2)] + return [fmt(first.timestamp), n > 2 ? fmt(mid.timestamp) : '', fmt(last.timestamp)] + })() + + return ( + + {title && {title}} + + {/* 범례 */} + + {SERIES.map(se => ( + + + {se.label} + + ))} + + + + {/* Y축 라벨 */} + + {[100, 75, 50, 25, 0].map(v => ( + {v} + ))} + + + {/* 차트 영역 */} + + {/* 가로 격자선 */} + {[0, 0.25, 0.5, 0.75, 1].map(g => ( + + ))} + + {width > 0 && n >= 1 && SERIES.map(se => + data.map((p, i) => { + if (i === n - 1) return null + return ( + + ) + }) + )} + + {/* 데이터 포인트 점 */} + {width > 0 && SERIES.map(se => + data.map((p, i) => ( + + )) + )} + + {n === 0 && ( + 데이터 없음 + )} + + + + {/* X축 라벨 */} + + {xLabels.map((l, i) => ( + {l} + ))} + + + ) +} + +const s = StyleSheet.create({ + wrap: { backgroundColor: '#fff', borderRadius: 12, padding: 14 }, + title: { fontSize: 13, fontWeight: '700', color: '#1e293b', marginBottom: 8 }, + legend: { flexDirection: 'row', gap: 14, marginBottom: 10 }, + legendItem: { flexDirection: 'row', alignItems: 'center', gap: 5 }, + legendDot: { width: 10, height: 10, borderRadius: 5 }, + legendTxt: { fontSize: 11, color: '#64748b', fontWeight: '600' }, + chartRow: { flexDirection: 'row' }, + yAxis: { width: 26, height: CHART_H - PAD_BOTTOM, justifyContent: 'space-between', alignItems: 'flex-end', paddingRight: 4 }, + yLabel: { fontSize: 9, color: '#cbd5e1' }, + plot: { flex: 1, height: CHART_H - PAD_BOTTOM, position: 'relative', overflow: 'hidden' }, + grid: { position: 'absolute', left: 0, right: 0, height: 1, backgroundColor: '#f1f5f9' }, + xAxis: { flexDirection: 'row', justifyContent: 'space-between', marginLeft: 26, marginTop: 4 }, + xLabel: { fontSize: 9, color: '#94a3b8' }, + empty: { flex: 1, alignItems: 'center', justifyContent: 'center' }, + emptyTxt: { color: '#cbd5e1', fontSize: 12 }, +}) diff --git a/components/NextActions.tsx b/components/NextActions.tsx new file mode 100644 index 00000000..1611ce30 --- /dev/null +++ b/components/NextActions.tsx @@ -0,0 +1,79 @@ +/** + * NextActions (#20) — 다음 명령 3개 제안 + * + * 현재 컨텍스트(SR 상태/서버 상태 등)를 Ollama에 전달 → 다음 행동 3가지 JSON 배열. + * 버튼 3개로 표시, 탭하면 onSelect 콜백 호출. + * + * 보안: 컨텍스트에 자격증명/IP 포함 금지 (호출 측 책임). 온프레미스 Ollama만 사용. + */ +import { useState, useEffect } from 'react' +import { View, Text, Pressable, StyleSheet, ActivityIndicator } from 'react-native' +import { COLORS } from '../constants/Config' +import { generateJSON, DEFAULT_TEXT_MODEL } from '../lib/ollama' + +interface Props { + context: string + onSelect: (action: string) => void +} + +const FALLBACK: string[] = ['KB 조회', '담당자에게 연락', '에스컬레이션'] + +export function NextActions({ context, onSelect }: Props) { + const [actions, setActions] = useState([]) + const [loading, setLoading] = useState(false) + + useEffect(() => { + let alive = true + ;(async () => { + if (!context?.trim()) { + setActions(FALLBACK) + return + } + setLoading(true) + const prompt = + `당신은 IT 운영 어시스턴트입니다. 운영자가 다음 상황에 있습니다: "${context}". ` + + `다음으로 취할 행동 3가지를 한국어 짧은 문구로, 설명 없이 JSON 배열만 출력하세요. ` + + `예: ["에스컬레이션","KB 조회","담당자 연락"]` + const result = await generateJSON(DEFAULT_TEXT_MODEL, prompt, FALLBACK) + if (!alive) return + const clean = Array.isArray(result) ? result.filter(x => typeof x === 'string').slice(0, 3) : FALLBACK + setActions(clean.length ? clean : FALLBACK) + setLoading(false) + })() + return () => { + alive = false + } + }, [context]) + + return ( + + ⚡ 다음 추천 작업 + {loading ? ( + + ) : ( + + {actions.map((a, i) => ( + onSelect(a)}> + + {a} + + + ))} + + )} + + ) +} + +export default NextActions + +const S = StyleSheet.create({ + wrap: { backgroundColor: COLORS.card, borderRadius: 14, padding: 14, borderWidth: 1, borderColor: COLORS.border }, + title: { fontSize: 13, fontWeight: '700', color: COLORS.text, marginBottom: 8 }, + row: { flexDirection: 'row', gap: 8 }, + chip: { + flex: 1, backgroundColor: COLORS.light, borderRadius: 10, paddingVertical: 12, + paddingHorizontal: 8, alignItems: 'center', justifyContent: 'center', + }, + chipText: { fontSize: 12, fontWeight: '600', color: COLORS.blue, textAlign: 'center' }, +}) diff --git a/components/PhotoDiagnosis.tsx b/components/PhotoDiagnosis.tsx new file mode 100644 index 00000000..3e505058 --- /dev/null +++ b/components/PhotoDiagnosis.tsx @@ -0,0 +1,139 @@ +/** + * PhotoDiagnosis (#19) — 사진 → Ollama llava → 장애 진단 + * + * expo-image-picker로 장비/에러화면 사진을 촬영/선택 → base64 변환 + * → generateWithImage('llava', ...) → 한국어 진단 결과 → onDiagnosis 콜백. + * + * 보안: 이미지는 온프레미스 Ollama(localhost:11434)로만 전송. 외부 API 미사용. + * 서버 전송 전 민감정보(비밀번호/IP 노출 화면 등) 검토 안내 표시. + */ +import { useState } from 'react' +import { View, Text, Pressable, StyleSheet, ActivityIndicator, Image } from 'react-native' +import { COLORS } from '../constants/Config' +import { generateWithImage, DEFAULT_VISION_MODEL } from '../lib/ollama' + +// expo-image-picker 선택적 임포트 (미설치 환경 폴백) +let ImagePicker: any = null +try { + ImagePicker = require('expo-image-picker') +} catch { + /* 폴백 */ +} + +interface Props { + onDiagnosis: (text: string) => void +} + +const DIAGNOSIS_PROMPT = + '당신은 IT 인프라 운영 전문가입니다. 이 사진은 서버/네트워크 장비 또는 시스템 화면입니다. ' + + '보이는 오류, 경고등, 에러 메시지, 이상 상태를 한국어로 진단하고 가능한 원인과 조치를 간결히 설명해 주세요. ' + + '추측이 필요하면 명시하세요.' + +export function PhotoDiagnosis({ onDiagnosis }: Props) { + const [uri, setUri] = useState(null) + const [result, setResult] = useState('') + const [loading, setLoading] = useState(false) + const [err, setErr] = useState('') + + async function pick(from: 'camera' | 'library') { + setErr('') + if (!ImagePicker) { + setErr('expo-image-picker 미설치 환경입니다.') + return + } + try { + const perm = + from === 'camera' + ? await ImagePicker.requestCameraPermissionsAsync() + : await ImagePicker.requestMediaLibraryPermissionsAsync() + if (!perm.granted) { + setErr('카메라/사진 접근 권한이 필요합니다.') + return + } + const opts = { base64: true, quality: 0.6, allowsEditing: true } + const res = + from === 'camera' + ? await ImagePicker.launchCameraAsync(opts) + : await ImagePicker.launchImageLibraryAsync(opts) + if (res.canceled || !res.assets?.[0]) return + const asset = res.assets[0] + setUri(asset.uri) + await diagnose(asset.base64 ?? '') + } catch { + setErr('사진을 불러오지 못했습니다.') + } + } + + async function diagnose(base64: string) { + if (!base64) { + setErr('이미지 데이터를 읽지 못했습니다.') + return + } + setLoading(true) + setResult('') + const text = await generateWithImage(DEFAULT_VISION_MODEL, DIAGNOSIS_PROMPT, base64) + setLoading(false) + if (!text) { + setErr('AI 진단 서버(Ollama)에 연결할 수 없습니다.') + return + } + setResult(text) + onDiagnosis(text) + } + + return ( + + 📷 사진 장애 진단 + 장비/에러 화면을 촬영하면 AI가 자동 진단합니다. + ⚠️ 화면에 비밀번호/내부 IP가 노출되지 않았는지 확인하세요. + + + pick('camera')}> + 촬영 + + pick('library')}> + 앨범에서 선택 + + + + {uri ? : null} + + {loading ? ( + + + AI가 사진을 분석 중입니다... + + ) : null} + + {result ? ( + + 진단 결과 + {result} + + ) : null} + + {err ? {err} : null} + + ) +} + +export default PhotoDiagnosis + +const S = StyleSheet.create({ + wrap: { backgroundColor: COLORS.card, borderRadius: 14, padding: 16, borderWidth: 1, borderColor: COLORS.border }, + title: { fontSize: 15, fontWeight: '700', color: COLORS.text }, + hint: { fontSize: 12, color: COLORS.muted, marginTop: 4 }, + warn: { fontSize: 11, color: COLORS.warning, marginTop: 6 }, + btnRow: { flexDirection: 'row', gap: 8, marginTop: 12 }, + btn: { flex: 1, backgroundColor: COLORS.accent, borderRadius: 10, paddingVertical: 11, alignItems: 'center' }, + btnAlt: { backgroundColor: COLORS.light }, + btnText: { color: '#fff', fontWeight: '700', fontSize: 13 }, + btnAltText: { color: COLORS.blue }, + preview: { width: '100%', height: 180, borderRadius: 10, marginTop: 12, backgroundColor: '#eee' }, + loadingBox: { flexDirection: 'row', alignItems: 'center', gap: 8, marginTop: 12 }, + loadingText: { fontSize: 12, color: COLORS.muted }, + resultBox: { marginTop: 12, backgroundColor: COLORS.light, borderRadius: 10, padding: 12 }, + resultLabel: { fontSize: 12, fontWeight: '700', color: COLORS.blue, marginBottom: 6 }, + resultText: { fontSize: 13, color: COLORS.text, lineHeight: 19 }, + err: { fontSize: 12, color: COLORS.danger, marginTop: 10 }, +}) diff --git a/components/PinLock.tsx b/components/PinLock.tsx new file mode 100644 index 00000000..f8397214 --- /dev/null +++ b/components/PinLock.tsx @@ -0,0 +1,200 @@ +/** + * #30 PIN 코드 잠금 화면 + * + * - 4자리 PIN 숫자 패드 + * - PIN 저장: sha256(pin) → SecureStore 'grd_pin_hash' (평문 저장 금지) + * - 검증: sha256(입력) === 저장 해시 + * - 5회 실패 시 onFail() 호출 (세션 종료) + * + * 사용: + * // PIN 신규 설정 (2회 확인) + * // 잠금 해제 + */ +import { useState } from 'react' +import { View, Text, TouchableOpacity, StyleSheet } from 'react-native' +import * as SecureStore from 'expo-secure-store' +import { sha256 } from '../services/sha256' +import { COLORS } from '../constants/Config' + +const PIN_HASH_KEY = 'grd_pin_hash' +const PIN_LENGTH = 4 +const MAX_ATTEMPTS = 5 + +export const PIN_ENABLED_KEY = 'grd_pin_enabled' + +export async function isPinSet(): Promise { + const h = await SecureStore.getItemAsync(PIN_HASH_KEY) + return !!h +} + +export async function savePin(pin: string): Promise { + // 평문 저장 절대 금지 — SHA-256 해시만 저장 + const hash = sha256(pin) + await SecureStore.setItemAsync(PIN_HASH_KEY, hash) + await SecureStore.setItemAsync(PIN_ENABLED_KEY, '1') +} + +export async function verifyPin(pin: string): Promise { + const stored = await SecureStore.getItemAsync(PIN_HASH_KEY) + if (!stored) return false + return sha256(pin) === stored +} + +export async function clearPin(): Promise { + await SecureStore.deleteItemAsync(PIN_HASH_KEY) + await SecureStore.deleteItemAsync(PIN_ENABLED_KEY) +} + +export async function isPinEnabled(): Promise { + const v = await SecureStore.getItemAsync(PIN_ENABLED_KEY) + return v === '1' && (await isPinSet()) +} + +type Mode = 'set' | 'verify' + +interface Props { + mode: Mode + onSuccess: () => void + onFail?: () => void + onCancel?: () => void +} + +export default function PinLock({ mode, onSuccess, onFail, onCancel }: Props) { + const [pin, setPin] = useState('') + const [firstPin, setFirstPin] = useState(null) // set 모드 확인용 + const [attempts, setAttempts] = useState(0) + const [error, setError] = useState('') + + const title = + mode === 'set' + ? firstPin == null + ? 'PIN 설정' + : 'PIN 재입력' + : 'PIN 입력' + const subtitle = + mode === 'set' + ? firstPin == null + ? '4자리 PIN을 설정하세요' + : '확인을 위해 다시 입력하세요' + : '잠금을 해제하려면 PIN을 입력하세요' + + const handleDigit = async (d: string) => { + if (pin.length >= PIN_LENGTH) return + setError('') + const next = pin + d + setPin(next) + if (next.length === PIN_LENGTH) { + await submit(next) + } + } + + const handleDelete = () => { + setError('') + setPin((p) => p.slice(0, -1)) + } + + const submit = async (entered: string) => { + if (mode === 'set') { + if (firstPin == null) { + setFirstPin(entered) + setPin('') + return + } + if (firstPin === entered) { + await savePin(entered) + onSuccess() + } else { + setError('PIN이 일치하지 않습니다. 다시 설정하세요.') + setFirstPin(null) + setPin('') + } + return + } + + // verify + const ok = await verifyPin(entered) + if (ok) { + setAttempts(0) + onSuccess() + } else { + const a = attempts + 1 + setAttempts(a) + setPin('') + if (a >= MAX_ATTEMPTS) { + setError('5회 실패 — 보안을 위해 로그아웃됩니다.') + onFail?.() + } else { + setError(`PIN이 올바르지 않습니다. (${a}/${MAX_ATTEMPTS})`) + } + } + } + + const keys = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '', '0', 'del'] + + return ( + + 🛡️ + {title} + {subtitle} + + + {Array.from({ length: PIN_LENGTH }).map((_, i) => ( + + ))} + + + {!!error && {error}} + + + {keys.map((k, i) => + k === '' ? ( + + ) : k === 'del' ? ( + + + + ) : ( + handleDigit(k)}> + {k} + + ) + )} + + + {onCancel && ( + + 취소 + + )} + + ) +} + +const s = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: COLORS.gnbBg, + alignItems: 'center', + justifyContent: 'center', + padding: 28, + }, + logo: { fontSize: 44, marginBottom: 12 }, + title: { fontSize: 22, fontWeight: '800', color: '#fff', marginBottom: 6 }, + subtitle: { fontSize: 13, color: 'rgba(255,255,255,.6)', marginBottom: 28 }, + dots: { flexDirection: 'row', gap: 18, marginBottom: 18 }, + dot: { + width: 16, height: 16, borderRadius: 8, + borderWidth: 2, borderColor: COLORS.accent, backgroundColor: 'transparent', + }, + dotFilled: { backgroundColor: COLORS.accent }, + error: { color: '#fca5a5', fontSize: 13, marginBottom: 12, textAlign: 'center' }, + pad: { flexDirection: 'row', flexWrap: 'wrap', width: 264, justifyContent: 'space-between' }, + key: { + width: 78, height: 78, borderRadius: 39, + alignItems: 'center', justifyContent: 'center', marginVertical: 6, + }, + keyText: { fontSize: 28, color: '#fff', fontWeight: '600' }, + keyDel: { fontSize: 26, color: 'rgba(255,255,255,.7)' }, + cancel: { marginTop: 24 }, + cancelText: { color: COLORS.accent, fontSize: 15, fontWeight: '600' }, +}) diff --git a/components/RejectReason.tsx b/components/RejectReason.tsx new file mode 100644 index 00000000..19804e39 --- /dev/null +++ b/components/RejectReason.tsx @@ -0,0 +1,131 @@ +import { useState } from 'react' +import { + Modal, View, Text, TextInput, TouchableOpacity, + StyleSheet, ActivityIndicator, KeyboardAvoidingView, Platform, +} from 'react-native' +import { COLORS } from '../constants/Config' + +/** + * 기능 #66 — 반려 사유 입력 모달 + * - 반려 사유 템플릿 빠른 선택 + 직접 입력 + * - 최소 10자 검증 (빈 값/10자 미만이면 제출 차단) + */ + +const MIN_LEN = 10 + +const TEMPLATES = [ + '요청 정보가 불충분하여 반려합니다.', + '변경 일정이 운영 정책과 충돌합니다.', + '영향 범위 분석이 누락되어 보완이 필요합니다.', + '롤백 계획이 명시되지 않았습니다.', + '승인 권한 범위를 초과하는 요청입니다.', +] + +interface Props { + visible: boolean + targetTitle?: string + onClose: () => void + /** 반려 확정 — reason 은 10자 이상 보장됨 */ + onSubmit: (reason: string) => Promise | void +} + +export default function RejectReason({ visible, targetTitle, onClose, onSubmit }: Props) { + const [reason, setReason] = useState('') + const [submitting, setSubmitting] = useState(false) + + const trimmed = reason.trim() + const valid = trimmed.length >= MIN_LEN + + const reset = () => { setReason(''); setSubmitting(false) } + + const handleClose = () => { reset(); onClose() } + + const handleSubmit = async () => { + if (!valid || submitting) return + setSubmitting(true) + try { + await onSubmit(trimmed) + reset() + } catch { + setSubmitting(false) + } + } + + return ( + + + + + 반려 사유 입력 + {!!targetTitle && {targetTitle}} + + 빠른 템플릿 + + {TEMPLATES.map((t, i) => ( + setReason(t)}> + {t} + + ))} + + + 사유 (최소 {MIN_LEN}자) + + + {trimmed.length} / {MIN_LEN}자 {valid ? '✔' : '(부족)'} + + + + + 취소 + + + {submitting + ? + : 반려} + + + + + + ) +} + +const s = StyleSheet.create({ + overlay: { flex: 1, backgroundColor: 'rgba(0,0,0,0.4)', justifyContent: 'flex-end' }, + sheet: { backgroundColor: '#fff', borderTopLeftRadius: 18, borderTopRightRadius: 18, + paddingHorizontal: 18, paddingTop: 10, paddingBottom: 28 }, + handle: { alignSelf: 'center', width: 40, height: 4, borderRadius: 2, + backgroundColor: COLORS.border, marginBottom: 12 }, + title: { fontSize: 16, fontWeight: '800', color: COLORS.text }, + subtitle: { fontSize: 12, color: COLORS.muted, marginTop: 2 }, + label: { fontSize: 12, fontWeight: '700', color: COLORS.text, marginTop: 16, marginBottom: 8 }, + chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 }, + chip: { backgroundColor: COLORS.light, borderRadius: 14, paddingHorizontal: 10, + paddingVertical: 6, maxWidth: '100%' }, + chipText: { fontSize: 11, color: COLORS.blue }, + input: { borderWidth: 1, borderColor: COLORS.border, borderRadius: 10, padding: 12, + minHeight: 90, fontSize: 13, color: COLORS.text, backgroundColor: '#fff' }, + counter: { fontSize: 11, marginTop: 6, textAlign: 'right' }, + counterOk: { color: COLORS.success }, + counterBad: { color: COLORS.danger }, + actions: { flexDirection: 'row', gap: 10, marginTop: 18 }, + btn: { flex: 1, borderRadius: 10, paddingVertical: 13, alignItems: 'center' }, + btnGhost: { backgroundColor: '#f1f5f9' }, + btnGhostText: { color: COLORS.text, fontWeight: '700', fontSize: 14 }, + btnDanger: { backgroundColor: COLORS.danger }, + btnDangerText: { color: '#fff', fontWeight: '700', fontSize: 14 }, + btnDisabled: { opacity: 0.45 }, +}) diff --git a/components/RelatedSR.tsx b/components/RelatedSR.tsx new file mode 100644 index 00000000..16ea2b72 --- /dev/null +++ b/components/RelatedSR.tsx @@ -0,0 +1,84 @@ +import { useEffect, useState } from 'react' +import { View, Text, TouchableOpacity, StyleSheet, ActivityIndicator } from 'react-native' +import { router } from 'expo-router' +import { COLORS, PRIORITY_COLOR, STATUS_COLOR } from '../constants/Config' +import { getRelatedSR } from '../services/api' + +interface Props { + srId: number +} + +interface RelatedItem { + id: number + sr_id?: string + title: string + status?: string + priority?: string +} + +/** + * 기능 #7 — 관련 SR 자동 연결 표시 + * GET /api/tasks?related_to={id} → 최대 3개 카드, 탭 시 상세 이동 + */ +export default function RelatedSR({ srId }: Props) { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + let alive = true + ;(async () => { + try { + const res = await getRelatedSR(srId) + const list: RelatedItem[] = + res.data?.content ?? res.data?.items ?? res.data ?? [] + if (alive) setItems(list.slice(0, 3)) + } catch { + if (alive) setItems([]) + } finally { + if (alive) setLoading(false) + } + })() + return () => { alive = false } + }, [srId]) + + if (loading) return + if (items.length === 0) { + return 관련 SR이 없습니다. + } + + return ( + + {items.map(it => ( + router.push({ pathname: '/(tabs)/sr_detail', params: { id: String(it.id) } })} + > + + {it.sr_id ?? `#${it.id}`} + {!!it.status && ( + + {it.status} + + )} + + {it.title} + {!!it.priority && ( + ● {it.priority} + )} + + ))} + + ) +} + +const s = StyleSheet.create({ + empty: { color: COLORS.muted, fontSize: 12, paddingVertical: 8 }, + card: { backgroundColor: COLORS.light, borderRadius: 8, padding: 10, marginBottom: 8 }, + head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, + srId: { fontSize: 11, color: COLORS.accent, fontWeight: '700' }, + badge: { paddingHorizontal: 7, paddingVertical: 2, borderRadius: 9 }, + badgeText: { fontSize: 9, fontWeight: '700' }, + title: { fontSize: 13, color: COLORS.text, marginTop: 4 }, + pri: { fontSize: 10, fontWeight: '700', marginTop: 4 }, +}) diff --git a/components/SRSatisfaction.tsx b/components/SRSatisfaction.tsx new file mode 100644 index 00000000..5ef4a7a7 --- /dev/null +++ b/components/SRSatisfaction.tsx @@ -0,0 +1,94 @@ +import { useState } from 'react' +import { + View, Text, Modal, TextInput, TouchableOpacity, StyleSheet, ActivityIndicator, Alert, +} from 'react-native' +import { COLORS } from '../constants/Config' +import { rateSR } from '../services/api' + +interface Props { + visible: boolean + srId: number + onClose: () => void + onSubmitted?: (score: number) => void +} + +const LABELS = ['', '매우 불만족', '불만족', '보통', '만족', '매우 만족'] + +/** + * 기능 #14 — 완료 후 만족도 별점 모달 + * 별점(1~5) + 한줄 피드백 → POST /api/tasks/{id}/rating + */ +export default function SRSatisfaction({ visible, srId, onClose, onSubmitted }: Props) { + const [score, setScore] = useState(0) + const [comment, setComment] = useState('') + const [saving, setSaving] = useState(false) + + const submit = async () => { + if (score === 0) { Alert.alert('별점을 선택하세요.'); return } + setSaving(true) + try { + await rateSR(srId, score, comment) + onSubmitted?.(score) + setScore(0); setComment('') + onClose() + Alert.alert('감사합니다', '소중한 평가가 등록되었습니다.') + } catch (e: any) { + Alert.alert('오류', e.response?.data?.detail ?? '평가 등록 실패') + } finally { setSaving(false) } + } + + return ( + + + + 서비스 만족도 평가 + SR 처리에 만족하셨나요? + + + {[1, 2, 3, 4, 5].map(n => ( + setScore(n)}> + + + ))} + + {score > 0 && {LABELS[score]}} + + + + + + 나중에 + + + {saving ? : 평가 제출} + + + + + + ) +} + +const s = StyleSheet.create({ + overlay: { flex: 1, backgroundColor: 'rgba(0,0,0,0.45)', justifyContent: 'center', padding: 28 }, + box: { backgroundColor: '#fff', borderRadius: 16, padding: 22 }, + title: { fontSize: 17, fontWeight: '800', color: COLORS.text, textAlign: 'center' }, + sub: { fontSize: 13, color: COLORS.muted, textAlign: 'center', marginTop: 6 }, + stars: { flexDirection: 'row', justifyContent: 'center', gap: 6, marginTop: 18 }, + star: { fontSize: 40, color: COLORS.border }, + starActive: { color: '#f59e0b' }, + scoreLabel: { textAlign: 'center', fontSize: 13, fontWeight: '700', color: COLORS.accent, marginTop: 8 }, + input: { borderWidth: 1.5, borderColor: COLORS.border, borderRadius: 10, padding: 12, fontSize: 13, color: COLORS.text, marginTop: 16, minHeight: 60, textAlignVertical: 'top' }, + actions: { flexDirection: 'row', gap: 10, marginTop: 18 }, + cancel: { flex: 1, paddingVertical: 13, borderRadius: 10, borderWidth: 1.5, borderColor: COLORS.border, alignItems: 'center' }, + cancelText: { fontSize: 14, fontWeight: '600', color: COLORS.muted }, + submit: { flex: 2, paddingVertical: 13, borderRadius: 10, backgroundColor: COLORS.primary, alignItems: 'center' }, + submitText: { fontSize: 14, fontWeight: '700', color: '#fff' }, +}) diff --git a/components/SRSolutionHint.tsx b/components/SRSolutionHint.tsx new file mode 100644 index 00000000..61ba6963 --- /dev/null +++ b/components/SRSolutionHint.tsx @@ -0,0 +1,96 @@ +/** + * SRSolutionHint (#24) — 과거 유사 SR 해결책 제안 + * + * GET /api/tasks/?similar_to={sr_id}&status=closed&limit=3 + * "유사 해결 사례" 섹션: 각 사례의 제목 / 해결 방법 / 해결 시간 표시. + */ +import { useState, useEffect } from 'react' +import { View, Text, Pressable, StyleSheet, ActivityIndicator } from 'react-native' +import { COLORS, API_BASE } from '../constants/Config' +import { authFetch } from '../utils/auth' + +interface SimilarSR { + id: number + title: string + resolution?: string + resolved_at?: string + resolution_time?: string +} + +interface Props { + srId: number | string + onOpen?: (id: number) => void +} + +export function SRSolutionHint({ srId, onOpen }: Props) { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + let alive = true + ;(async () => { + setLoading(true) + try { + const res = await authFetch( + `${API_BASE}/api/tasks/?similar_to=${encodeURIComponent(String(srId))}&status=closed&limit=3`, + ) + if (res.ok) { + const d = await res.json() + const list: SimilarSR[] = Array.isArray(d) ? d : d.items ?? d.results ?? [] + if (alive) setItems(list.slice(0, 3)) + } else if (alive) { + setItems([]) + } + } catch { + if (alive) setItems([]) + } finally { + if (alive) setLoading(false) + } + })() + return () => { + alive = false + } + }, [srId]) + + if (loading) { + return ( + + 🔁 유사 해결 사례 + + + ) + } + if (items.length === 0) return null + + return ( + + 🔁 유사 해결 사례 + {items.map(sr => ( + onOpen?.(sr.id)}> + + #{sr.id} {sr.title} + + {sr.resolution ? ( + + 💡 {sr.resolution} + + ) : null} + {sr.resolution_time || sr.resolved_at ? ( + ⏱ 해결 소요: {sr.resolution_time ?? sr.resolved_at} + ) : null} + + ))} + + ) +} + +export default SRSolutionHint + +const S = StyleSheet.create({ + wrap: { backgroundColor: COLORS.card, borderRadius: 14, padding: 14, borderWidth: 1, borderColor: COLORS.border }, + title: { fontSize: 13, fontWeight: '700', color: COLORS.text, marginBottom: 8 }, + card: { backgroundColor: COLORS.light, borderRadius: 10, padding: 11, marginBottom: 6 }, + cardTitle: { fontSize: 13, fontWeight: '600', color: COLORS.blue }, + cardSol: { fontSize: 12, color: COLORS.text, marginTop: 4, lineHeight: 17 }, + cardTime: { fontSize: 11, color: COLORS.muted, marginTop: 4 }, +}) diff --git a/components/SRTemplates.tsx b/components/SRTemplates.tsx new file mode 100644 index 00000000..e535de23 --- /dev/null +++ b/components/SRTemplates.tsx @@ -0,0 +1,105 @@ +import { useEffect, useState } from 'react' +import { + View, Text, Modal, FlatList, TouchableOpacity, StyleSheet, ActivityIndicator, +} from 'react-native' +import { COLORS, PRIORITY_COLOR } from '../constants/Config' +import { getSRTemplates } from '../services/api' + +export interface SRTemplate { + id: number | string + name: string + title?: string + category?: string + sr_type?: string + priority?: string + description?: string +} + +interface Props { + visible: boolean + onClose: () => void + onSelect: (tpl: SRTemplate) => void +} + +const FALLBACK: SRTemplate[] = [ + { id: 'deploy', name: '배포 요청', title: '[배포] 서비스 배포 요청', category: 'DEPLOY', priority: 'HIGH', description: '대상 서버 / 브랜치 / 배포 시간을 기재하세요.' }, + { id: 'restart', name: '서비스 재기동', title: '[재기동] 서비스 재시작 요청', category: 'RESTART', priority: 'MEDIUM', description: '재기동 대상 서비스명을 기재하세요.' }, + { id: 'log', name: '로그 확인', title: '[로그] 로그 조회 요청', category: 'LOG', priority: 'LOW', description: '조회 기간 / 키워드를 기재하세요.' }, + { id: 'incident',name: '장애 신고', title: '[장애] 긴급 장애 신고', category: 'OTHER', priority: 'CRITICAL',description: '발생 시각 / 증상 / 영향 범위를 기재하세요.' }, +] + +/** + * 기능 #10 — SR 템플릿 선택 모달 + * GET /api/tasks/templates → 실패 시 기본 템플릿 사용 + */ +export default function SRTemplates({ visible, onClose, onSelect }: Props) { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + if (!visible) return + let alive = true + setLoading(true) + ;(async () => { + try { + const res = await getSRTemplates() + const list: SRTemplate[] = res.data?.content ?? res.data?.items ?? res.data ?? [] + if (alive) setItems(list.length ? list : FALLBACK) + } catch { + if (alive) setItems(FALLBACK) + } finally { + if (alive) setLoading(false) + } + })() + return () => { alive = false } + }, [visible]) + + return ( + + + + + SR 템플릿 선택 + + + + + {loading ? ( + + ) : ( + String(t.id)} + renderItem={({ item }) => ( + { onSelect(item); onClose() }}> + + {item.name} + {!!item.description && {item.description}} + + {!!item.priority && ( + + {item.priority} + + )} + + )} + /> + )} + + + + ) +} + +const s = StyleSheet.create({ + overlay: { flex: 1, backgroundColor: 'rgba(0,0,0,0.4)', justifyContent: 'flex-end' }, + sheet: { backgroundColor: '#fff', borderTopLeftRadius: 18, borderTopRightRadius: 18, maxHeight: '70%', paddingBottom: 24 }, + head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', padding: 18, borderBottomWidth: 1, borderBottomColor: COLORS.border }, + title: { fontSize: 16, fontWeight: '700', color: COLORS.text }, + close: { fontSize: 22, color: COLORS.muted }, + row: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 18, paddingVertical: 14, borderBottomWidth: 1, borderBottomColor: COLORS.border, gap: 10 }, + name: { fontSize: 14, fontWeight: '600', color: COLORS.text }, + desc: { fontSize: 12, color: COLORS.muted, marginTop: 3 }, + pri: { paddingHorizontal: 8, paddingVertical: 3, borderRadius: 10 }, + priText: { fontSize: 10, fontWeight: '700' }, +}) diff --git a/components/SlaTimer.tsx b/components/SlaTimer.tsx new file mode 100644 index 00000000..46253d3b --- /dev/null +++ b/components/SlaTimer.tsx @@ -0,0 +1,65 @@ +import { useEffect, useRef, useState } from 'react' +import { Text, StyleSheet, Vibration } from 'react-native' + +interface Props { + deadline: string // ISO 문자열 + onExpire?: () => void +} + +const URGENT_MS = 30 * 60 * 1000 // 30분 + +/** + * 기능 #3 — SLA 카운트다운 타이머 + * 매 초 갱신, 임박(30분 이내) 시 빨간색 + 1회 진동 + */ +export default function SlaTimer({ deadline, onExpire }: Props) { + const [remaining, setRemaining] = useState( + () => new Date(deadline).getTime() - Date.now() + ) + const buzzedRef = useRef(false) + const expiredRef = useRef(false) + + useEffect(() => { + buzzedRef.current = false + expiredRef.current = false + const tick = () => { + const r = new Date(deadline).getTime() - Date.now() + setRemaining(r) + if (r < URGENT_MS && r > 0 && !buzzedRef.current) { + buzzedRef.current = true + try { Vibration.vibrate([0, 500, 200, 500]) } catch {} + } + if (r <= 0 && !expiredRef.current) { + expiredRef.current = true + onExpire?.() + } + } + tick() + const interval = setInterval(tick, 1000) + return () => clearInterval(interval) + }, [deadline, onExpire]) + + const overdue = remaining < 0 + const abs = Math.abs(remaining) + const hours = Math.floor(abs / 3600000) + const minutes = Math.floor((abs % 3600000) / 60000) + const seconds = Math.floor((abs % 60000) / 1000) + const isUrgent = remaining < URGENT_MS + + const pad = (n: number) => String(n).padStart(2, '0') + const label = overdue + ? `초과 ${pad(hours)}:${pad(minutes)}:${pad(seconds)}` + : `${pad(hours)}:${pad(minutes)}:${pad(seconds)}` + + return ( + + {label} + + ) +} + +const styles = StyleSheet.create({ + timer: { fontVariant: ['tabular-nums'], fontWeight: '700', fontSize: 15, color: '#64748B' }, + urgent: { color: '#f59e0b' }, + overdue: { color: '#ef4444' }, +}) diff --git a/components/ZeroTrustBadge.tsx b/components/ZeroTrustBadge.tsx new file mode 100644 index 00000000..044f678f --- /dev/null +++ b/components/ZeroTrustBadge.tsx @@ -0,0 +1,76 @@ +/** + * #37 Zero Trust 상태 뱃지 + * GET /api/auth/network-status → { via: 'vpn'|'opennet'|'internal', level: 1|2|3 } + * 🟢 Internal / 🟡 VPN / 🟠 OpenNet + */ +import { useEffect, useState } from 'react' +import { View, Text, StyleSheet, ActivityIndicator } from 'react-native' +import { getNetworkStatus } from '../services/api' + +type Via = 'vpn' | 'opennet' | 'internal' | string + +interface NetStatus { + via: Via + level: 1 | 2 | 3 | number +} + +const META: Record = { + internal: { dot: '🟢', label: 'Internal', color: '#15803d', bg: '#dcfce7' }, + vpn: { dot: '🟡', label: 'VPN', color: '#a16207', bg: '#fef9c3' }, + opennet: { dot: '🟠', label: 'OpenNet', color: '#c2410c', bg: '#ffedd5' }, +} + +export default function ZeroTrustBadge() { + const [status, setStatus] = useState(null) + const [loading, setLoading] = useState(true) + + useEffect(() => { + let active = true + ;(async () => { + try { + const r = await getNetworkStatus() + if (active) setStatus(r.data) + } catch { + // 서버 미응답 시 알 수 없음 처리 + if (active) setStatus(null) + } finally { + if (active) setLoading(false) + } + })() + return () => { active = false } + }, []) + + if (loading) { + return ( + + + 네트워크 확인 중 + + ) + } + + const meta = (status && META[status.via]) || { + dot: '⚪', label: '알 수 없음', color: '#64748b', bg: '#f1f5f9', + } + + return ( + + {meta.dot} + Zero Trust · {meta.label} + {status?.level != null && ( + Lv.{status.level} + )} + + ) +} + +const s = StyleSheet.create({ + badge: { + flexDirection: 'row', alignItems: 'center', gap: 6, + paddingHorizontal: 12, paddingVertical: 8, borderRadius: 12, + marginHorizontal: 16, marginTop: 12, + }, + dot: { fontSize: 13 }, + label: { fontSize: 13, fontWeight: '700', flex: 1 }, + level: { fontSize: 11, fontWeight: '700', opacity: 0.8 }, +}) diff --git a/constants/Config.ts b/constants/Config.ts index 1d8a80ef..1a6e74a8 100644 --- a/constants/Config.ts +++ b/constants/Config.ts @@ -35,3 +35,22 @@ export const STATUS_COLOR: Record = { FAILED_ROLLBACK: '#ef4444', REJECTED: '#dc2626', } + +export const DARK_COLORS = { + gnbBg: '#0F172A', + bg: '#1E293B', + card: '#334155', + text: '#F1F5F9', + muted: '#94A3B8', + border: '#475569', + accent: '#38BDF8', + success: '#34D399', + warning: '#FBBF24', + danger: '#F87171', + white: '#ffffff', +} as const + +export const WS_BASE = (() => { + const base = (Constants.expoConfig?.extra?.guardiaApiUrl ?? 'https://zioinfo.co.kr:8443') as string + return base.replace(/^https:\/\//, 'wss://').replace(/^http:\/\//, 'ws://') +})() diff --git a/contexts/FontContext.tsx b/contexts/FontContext.tsx new file mode 100644 index 00000000..eadefbee --- /dev/null +++ b/contexts/FontContext.tsx @@ -0,0 +1,24 @@ +import React, { createContext, useContext, useState, useEffect } from 'react' +import * as SecureStore from 'expo-secure-store' + +type FontScale = 1.0 | 1.2 | 1.5 +interface FontCtx { fontScale: FontScale; setFontScale: (s: FontScale) => void } + +export const FontContext = createContext({ fontScale: 1.0, setFontScale: () => {} }) + +export function FontProvider({ children }: { children: React.ReactNode }) { + const [fontScale, setScale] = useState(1.0) + useEffect(() => { + SecureStore.getItemAsync('grd_font_scale').then(v => { + const n = parseFloat(v ?? '1.0') + if (n === 1.2 || n === 1.5) setScale(n as FontScale) + }) + }, []) + const setFontScale = (s: FontScale) => { + setScale(s) + SecureStore.setItemAsync('grd_font_scale', String(s)) + } + return {children} +} + +export const useFontScale = () => useContext(FontContext) diff --git a/contexts/OfflineContext.tsx b/contexts/OfflineContext.tsx new file mode 100644 index 00000000..2c364f38 --- /dev/null +++ b/contexts/OfflineContext.tsx @@ -0,0 +1,47 @@ +import React, { createContext, useContext, useState, useEffect } from 'react' +import NetInfo from '@react-native-community/netinfo' +import * as SecureStore from 'expo-secure-store' + +interface OfflineCtx { + isOffline: boolean + getCache: (key: string) => Promise + setCache: (key: string, data: unknown) => Promise +} + +export const OfflineContext = createContext({ + isOffline: false, + getCache: async () => null, + setCache: async () => {}, +}) + +export function OfflineProvider({ children }: { children: React.ReactNode }) { + const [isOffline, setIsOffline] = useState(false) + + useEffect(() => { + const unsub = NetInfo.addEventListener((state: any) => { + setIsOffline(!(state.isConnected && state.isInternetReachable !== false)) + }) + return () => unsub() + }, []) + + const getCache = async (key: string) => { + try { + const raw = await SecureStore.getItemAsync(`cache_${key}`) + return raw ? JSON.parse(raw) : null + } catch { return null } + } + + const setCache = async (key: string, data: unknown) => { + try { + await SecureStore.setItemAsync(`cache_${key}`, JSON.stringify(data)) + } catch {} + } + + return ( + + {children} + + ) +} + +export const useOffline = () => useContext(OfflineContext) diff --git a/contexts/ThemeContext.tsx b/contexts/ThemeContext.tsx new file mode 100644 index 00000000..96c4dd73 --- /dev/null +++ b/contexts/ThemeContext.tsx @@ -0,0 +1,30 @@ +import React, { createContext, useContext, useState, useEffect } from 'react' +import * as SecureStore from 'expo-secure-store' + +type Theme = 'light' | 'dark' +interface ThemeCtx { theme: Theme; toggleTheme: () => void; isDark: boolean } + +export const ThemeContext = createContext({ + theme: 'light', toggleTheme: () => {}, isDark: false, +}) + +export function ThemeProvider({ children }: { children: React.ReactNode }) { + const [theme, setTheme] = useState('light') + useEffect(() => { + SecureStore.getItemAsync('grd_theme').then(v => { + if (v === 'dark') setTheme('dark') + }) + }, []) + const toggleTheme = () => { + const next: Theme = theme === 'light' ? 'dark' : 'light' + setTheme(next) + SecureStore.setItemAsync('grd_theme', next) + } + return ( + + {children} + + ) +} + +export const useTheme = () => useContext(ThemeContext) diff --git a/hooks/useAIClassify.ts b/hooks/useAIClassify.ts new file mode 100644 index 00000000..988b7ef0 --- /dev/null +++ b/hooks/useAIClassify.ts @@ -0,0 +1,86 @@ +import { useEffect, useState } from 'react' +import Constants from 'expo-constants' + +/** + * 기능 #11 — Ollama AI 자동 분류 훅 (온프레미스 sLLM, 외부 API 미사용) + * 제목 입력 시 debounce 후 Ollama /api/generate 호출 → + * { category, priority } JSON 파싱하여 입력 필드 자동 제안. + */ + +const OLLAMA_HOST: string = + Constants.expoConfig?.extra?.ollamaUrl ?? 'http://localhost:11434' +const OLLAMA_MODEL: string = + Constants.expoConfig?.extra?.ollamaModel ?? 'llama3' + +const CATEGORIES = ['DEPLOY', 'RESTART', 'LOG', 'INQUIRY', 'OTHER'] +const PRIORITIES = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'] + +export interface AIClassifyResult { + category: string + priority: string + loading: boolean + error: boolean +} + +function extractJson(text: string): { category?: string; priority?: string } | null { + try { + const match = text.match(/\{[\s\S]*\}/) + if (!match) return null + return JSON.parse(match[0]) + } catch { return null } +} + +export function useAIClassify(title: string): AIClassifyResult { + const [category, setCategory] = useState('') + const [priority, setPriority] = useState('') + const [loading, setLoading] = useState(false) + const [error, setError] = useState(false) + + useEffect(() => { + const trimmed = title.trim() + if (trimmed.length < 4) { + setCategory(''); setPriority(''); setLoading(false); setError(false) + return + } + + let alive = true + setLoading(true); setError(false) + const controller = new AbortController() + + const timer = setTimeout(async () => { + const prompt = + `다음 SR 제목의 카테고리와 우선순위를 JSON으로만 답하라. ` + + `category 는 [${CATEGORIES.join(', ')}] 중 하나, ` + + `priority 는 [${PRIORITIES.join(', ')}] 중 하나. ` + + `제목: "${trimmed}"` + + try { + const res = await fetch(`${OLLAMA_HOST}/api/generate`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ model: OLLAMA_MODEL, prompt, stream: false, format: 'json' }), + signal: controller.signal, + }) + const data = await res.json() + const parsed = extractJson(data?.response ?? '') + if (!alive) return + if (parsed) { + const cat = (parsed.category ?? '').toUpperCase() + const pri = (parsed.priority ?? '').toUpperCase() + setCategory(CATEGORIES.includes(cat) ? cat : '') + setPriority(PRIORITIES.includes(pri) ? pri : '') + } else { + setError(true) + } + } catch { + if (alive) setError(true) + } finally { + if (alive) setLoading(false) + } + }, 700) + + return () => { alive = false; clearTimeout(timer); controller.abort() } + }, [title]) + + return { category, priority, loading, error } +} diff --git a/hooks/useAnomalyAlert.ts b/hooks/useAnomalyAlert.ts new file mode 100644 index 00000000..c38eeace --- /dev/null +++ b/hooks/useAnomalyAlert.ts @@ -0,0 +1,69 @@ +/** + * useAnomalyAlert (#22) — 이상 탐지 푸시 훅 + * + * 1분마다 GET /api/metrics/anomalies?severity=high 폴링. + * 이전에 보지 못한 새 이상 감지 시 Alert.alert로 알림. + * (expo-notifications 플러그인 등록 없이 인앱 Alert 사용 → EAS 빌드 안전) + */ +import { useEffect, useRef, useState } from 'react' +import { Alert, AppState } from 'react-native' +import { API_BASE } from '../constants/Config' +import { authFetch } from '../utils/auth' + +interface Anomaly { + id: number | string + title?: string + metric?: string + server?: string + severity?: string + detected_at?: string +} + +const POLL_MS = 60_000 + +export function useAnomalyAlert(enabled = true) { + const seen = useRef>(new Set()) + const [latest, setLatest] = useState([]) + + useEffect(() => { + if (!enabled) return + let alive = true + + async function poll() { + if (AppState.currentState !== 'active') return + try { + const res = await authFetch(`${API_BASE}/api/metrics/anomalies?severity=high`) + if (!res.ok) return + const d = await res.json() + const list: Anomaly[] = Array.isArray(d) ? d : d.items ?? d.anomalies ?? [] + if (!alive) return + setLatest(list) + + const fresh = list.filter(a => !seen.current.has(String(a.id))) + fresh.forEach(a => seen.current.add(String(a.id))) + + if (fresh.length > 0) { + const first = fresh[0] + const more = fresh.length > 1 ? ` 외 ${fresh.length - 1}건` : '' + Alert.alert( + '⚠️ 이상 징후 감지', + `${first.title ?? first.metric ?? '메트릭 이상'}${first.server ? ` (${first.server})` : ''}${more}`, + ) + } + } catch { + /* 폴링 실패 무시 */ + } + } + + poll() + const id = setInterval(poll, POLL_MS) + return () => { + alive = false + clearInterval(id) + } + }, [enabled]) + + return { latest } +} + +export default useAnomalyAlert diff --git a/hooks/useBadgeCount.ts b/hooks/useBadgeCount.ts new file mode 100644 index 00000000..6eb28c89 --- /dev/null +++ b/hooks/useBadgeCount.ts @@ -0,0 +1,38 @@ +import { useEffect, useState, useCallback } from 'react' +import * as Notifications from 'expo-notifications' +import { getOpenSRCount } from '../services/api' + +const REFRESH_MS = 5 * 60 * 1000 // 5분 + +/** + * 기능 #15 — 앱 아이콘 뱃지 카운트 훅 + * 미처리(open) + 내 담당 SR 수를 5분마다 갱신하여 앱 뱃지에 반영. + * expo-notifications 플러그인은 app.json 에 등록하지 않고 + * Notifications.setBadgeCountAsync 만 사용한다. + */ +export function useBadgeCount() { + const [count, setCount] = useState(0) + + const refresh = useCallback(async () => { + try { + const res = await getOpenSRCount() + const c: number = + res.data?.total ?? + res.data?.totalElements ?? + (Array.isArray(res.data?.content) ? res.data.content.length : undefined) ?? + (Array.isArray(res.data) ? res.data.length : 0) + setCount(c) + try { await Notifications.setBadgeCountAsync(c) } catch {} + } catch { + // 네트워크 오류 시 뱃지 유지 + } + }, []) + + useEffect(() => { + refresh() + const interval = setInterval(refresh, REFRESH_MS) + return () => clearInterval(interval) + }, [refresh]) + + return { count, refresh } +} diff --git a/hooks/useDuplicateSR.ts b/hooks/useDuplicateSR.ts new file mode 100644 index 00000000..5d8dabe1 --- /dev/null +++ b/hooks/useDuplicateSR.ts @@ -0,0 +1,51 @@ +import { useEffect, useState } from 'react' +import { findSimilarSR } from '../services/api' + +export interface DuplicateTask { + id: number + sr_id?: string + title: string + status?: string + similarity?: number +} + +/** + * 기능 #9 — 중복 SR 감지 훅 + * 제목 입력 시 500ms debounce 후 유사 SR 조회. + * 유사도 70% 이상(또는 서버가 반환한 항목)을 경고로 노출. + */ +export function useDuplicateSR(title: string) { + const [duplicates, setDuplicates] = useState([]) + const [loading, setLoading] = useState(false) + + useEffect(() => { + const trimmed = title.trim() + if (trimmed.length < 4) { + setDuplicates([]) + setLoading(false) + return + } + + let alive = true + setLoading(true) + const timer = setTimeout(async () => { + try { + const res = await findSimilarSR(trimmed, 3) + const list: DuplicateTask[] = res.data?.content ?? res.data?.items ?? res.data ?? [] + // 서버가 similarity 점수를 주면 70% 이상만, 아니면 반환 항목 그대로 + const filtered = list.filter(d => + d.similarity === undefined || d.similarity >= 0.7 + ) + if (alive) setDuplicates(filtered.slice(0, 3)) + } catch { + if (alive) setDuplicates([]) + } finally { + if (alive) setLoading(false) + } + }, 500) + + return () => { alive = false; clearTimeout(timer) } + }, [title]) + + return { duplicates, loading, hasDuplicates: duplicates.length > 0 } +} diff --git a/hooks/useGPSTag.ts b/hooks/useGPSTag.ts new file mode 100644 index 00000000..ec50246b --- /dev/null +++ b/hooks/useGPSTag.ts @@ -0,0 +1,95 @@ +/** + * useGPSTag — GPS 위치 태깅 훅 (기능 #59) + * + * SR 등록 / 현장 체크인 시 현재 좌표를 자동 첨부한다. + * expo-location 미설치 환경(개발/시뮬레이터)에서도 빌드/런타임이 깨지지 않도록 + * 동적 require + graceful fallback 처리한다. + * + * 빌드 금기 준수: app.json 플러그인 등록 없이 런타임 권한 요청만 사용. + */ +import { useState, useCallback } from 'react' + +export interface GeoTag { + lat: number + lng: number + accuracy?: number | null + ts: string +} + +type PermState = 'unknown' | 'granted' | 'denied' + +// 동적 로드 — 모듈이 없으면 null +function loadLocation(): any | null { + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + return require('expo-location') + } catch { + return null + } +} + +export function useGPSTag() { + const [tag, setTag] = useState(null) + const [perm, setPerm] = useState('unknown') + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const requestPermission = useCallback(async (): Promise => { + const Location = loadLocation() + if (!Location) { + setError('위치 모듈을 사용할 수 없습니다 (EAS 빌드 필요)') + setPerm('denied') + return false + } + try { + const { status } = await Location.requestForegroundPermissionsAsync() + const granted = status === 'granted' + setPerm(granted ? 'granted' : 'denied') + if (!granted) setError('위치 권한이 거부되었습니다') + return granted + } catch (e: any) { + setPerm('denied') + setError(e?.message ?? '권한 요청 실패') + return false + } + }, []) + + /** 현재 위치 1회 획득 → GeoTag 반환(실패 시 null) */ + const capture = useCallback(async (): Promise => { + setLoading(true) + setError(null) + const Location = loadLocation() + if (!Location) { + setError('위치 모듈을 사용할 수 없습니다 (EAS 빌드 필요)') + setLoading(false) + return null + } + try { + const ok = perm === 'granted' || (await requestPermission()) + if (!ok) { + setLoading(false) + return null + } + const pos = await Location.getCurrentPositionAsync({ + accuracy: Location.Accuracy?.Balanced ?? 3, + }) + const t: GeoTag = { + lat: pos.coords.latitude, + lng: pos.coords.longitude, + accuracy: pos.coords.accuracy ?? null, + ts: new Date().toISOString(), + } + setTag(t) + setLoading(false) + return t + } catch (e: any) { + setError(e?.message ?? '위치 획득 실패') + setLoading(false) + return null + } + }, [perm, requestPermission]) + + return { tag, perm, loading, error, requestPermission, capture, available: !!loadLocation() } +} + +export default useGPSTag diff --git a/hooks/useKBBookmark.ts b/hooks/useKBBookmark.ts new file mode 100644 index 00000000..6f1a7386 --- /dev/null +++ b/hooks/useKBBookmark.ts @@ -0,0 +1,30 @@ +import { useState, useEffect, useCallback } from 'react' +import * as SecureStore from 'expo-secure-store' +import { toggleKBBookmark } from '../services/api' + +const KEY = 'kb_bookmarks' + +export function useKBBookmark() { + const [ids, setIds] = useState([]) + + useEffect(() => { + SecureStore.getItemAsync(KEY).then(raw => { + try { if (raw) setIds(JSON.parse(raw)) } catch {} + }) + }, []) + + const persist = useCallback(async (next: number[]) => { + setIds(next) + await SecureStore.setItemAsync(KEY, JSON.stringify(next)).catch(() => {}) + }, []) + + const isBookmarked = useCallback((id: number) => ids.includes(id), [ids]) + + const toggle = useCallback(async (id: number) => { + const next = ids.includes(id) ? ids.filter(x => x !== id) : [...ids, id] + await persist(next) + toggleKBBookmark(id).catch(() => {}) + }, [ids, persist]) + + return { ids, isBookmarked, toggle } +} diff --git a/hooks/useOfflineCache.ts b/hooks/useOfflineCache.ts index 71aa7e31..7db2fb6f 100644 --- a/hooks/useOfflineCache.ts +++ b/hooks/useOfflineCache.ts @@ -18,7 +18,7 @@ export function useOfflineCache( const [cachedAt, setCachedAt] = useState(null) useEffect(() => { - const unsub = NetInfo.addEventListener(state => { + const unsub = NetInfo.addEventListener((state: any) => { setOffline(!(state.isConnected ?? true)) }) return () => unsub() diff --git a/hooks/useRoleMenu.ts b/hooks/useRoleMenu.ts new file mode 100644 index 00000000..d73f6fd4 --- /dev/null +++ b/hooks/useRoleMenu.ts @@ -0,0 +1,100 @@ +/** + * #32 역할별 메뉴 제어 훅 + * JWT payload에서 role을 추출해 노출 허용 탭 목록을 반환한다. + * + * engineer: 운영 탭 / pm: 승인+보고 / admin: 전체 + */ +import { useEffect, useState } from 'react' +import * as SecureStore from 'expo-secure-store' + +export type Role = 'engineer' | 'pm' | 'admin' | string + +/** 실제 (tabs)에 존재하는 라우트 기준 매핑 */ +export const ROLE_TABS: Record = { + engineer: ['index', 'sr', 'chat', 'notifications', 'dr', 'network', 'scan', 'settings'], + pm: ['index', 'sr', 'chat', 'notifications', 'insights', 'settings'], + admin: ['*'], // 전체 허용 +} + +/** 모든 탭 (admin/fallback 용) */ +export const ALL_TABS = [ + 'index', 'sr', 'chat', 'notifications', 'dr', 'network', + 'insights', 'voice', 'scan', 'settings', +] + +/** RN-safe base64 디코더 (atob 미보장 환경 대응) */ +const B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +function base64UrlDecode(input: string): string { + let str = input.replace(/-/g, '+').replace(/_/g, '/') + while (str.length % 4) str += '=' + let output = '' + for (let i = 0; i < str.length; ) { + const e1 = B64.indexOf(str.charAt(i++)) + const e2 = B64.indexOf(str.charAt(i++)) + const e3 = B64.indexOf(str.charAt(i++)) + const e4 = B64.indexOf(str.charAt(i++)) + const c1 = (e1 << 2) | (e2 >> 4) + const c2 = ((e2 & 15) << 4) | (e3 >> 2) + const c3 = ((e3 & 3) << 6) | e4 + output += String.fromCharCode(c1) + if (e3 !== 64 && e3 !== -1) output += String.fromCharCode(c2) + if (e4 !== 64 && e4 !== -1) output += String.fromCharCode(c3) + } + // UTF-8 디코드 + try { + return decodeURIComponent( + output.split('').map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('') + ) + } catch { + return output + } +} + +export function decodeJWT(token: string): { role?: string; user_id?: string; sub?: string; [k: string]: any } { + try { + const parts = token.split('.') + if (parts.length < 2) return {} + return JSON.parse(base64UrlDecode(parts[1])) + } catch { + return {} + } +} + +/** 토큰에서 role만 동기적으로 추출 (토큰 문자열을 이미 가진 경우) */ +export function roleFromToken(token: string | null | undefined): Role { + if (!token) return 'engineer' + const p = decodeJWT(token) + return (p.role as string) ?? 'engineer' +} + +/** role 기준 허용 탭 목록 */ +export function tabsForRole(role: Role): string[] { + const allowed = ROLE_TABS[role] + if (!allowed || allowed.includes('*')) return ALL_TABS + return allowed +} + +/** SecureStore 토큰을 읽어 허용 탭을 반환하는 비동기 훅 */ +export function useRoleMenu(): { role: Role; tabs: string[]; loading: boolean } { + const [role, setRole] = useState('engineer') + const [tabs, setTabs] = useState(ALL_TABS) + const [loading, setLoading] = useState(true) + + useEffect(() => { + ;(async () => { + try { + const token = await SecureStore.getItemAsync('grd_token') + const r = roleFromToken(token) + setRole(r) + setTabs(tabsForRole(r)) + } catch { + setRole('engineer') + setTabs(tabsForRole('engineer')) + } finally { + setLoading(false) + } + })() + }, []) + + return { role, tabs, loading } +} diff --git a/hooks/useSLAPrediction.ts b/hooks/useSLAPrediction.ts new file mode 100644 index 00000000..33f8d744 --- /dev/null +++ b/hooks/useSLAPrediction.ts @@ -0,0 +1,75 @@ +/** + * useSLAPrediction (#43) — SLA 위반 예측 훅 + * + * GET /api/sla/prediction 으로 SLA 위반 위험이 있는 SR/서비스를 예측 조회. + * 폴링(기본 60초)으로 주기 갱신. 위험도(risk) 기준으로 정렬·요약 제공. + */ +import { useEffect, useState, useCallback, useRef } from 'react' +import { getSLAPrediction } from '../services/api' + +export interface SLAPredictItem { + id: string | number + target_type: 'sr' | 'service' + target_name: string + sla_deadline: string // ISO + predicted_breach_at: string // ISO + risk: 'high' | 'medium' | 'low' + confidence: number // 0~1 + remaining_minutes: number +} + +interface SLAPredictResult { + items: SLAPredictItem[] + highRiskCount: number + loading: boolean + error: boolean + refresh: () => void +} + +const RISK_ORDER: Record = { high: 0, medium: 1, low: 2 } + +export function useSLAPrediction(pollMs = 60000): SLAPredictResult { + const [items, setItems] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(false) + const timer = useRef | null>(null) + + const load = useCallback(async () => { + try { + const res = await getSLAPrediction() + const raw: any[] = res.data?.items ?? res.data?.predictions ?? res.data ?? [] + const mapped: SLAPredictItem[] = raw.map((r: any) => ({ + id: r.id ?? r.sr_id ?? r.target_id, + target_type: r.target_type ?? (r.sr_id ? 'sr' : 'service'), + target_name: r.target_name ?? r.title ?? r.service_name ?? `#${r.id ?? ''}`, + sla_deadline: r.sla_deadline ?? r.deadline ?? '', + predicted_breach_at: r.predicted_breach_at ?? r.eta ?? '', + risk: (r.risk ?? r.risk_level ?? 'low').toLowerCase(), + confidence: typeof r.confidence === 'number' ? r.confidence : 0, + remaining_minutes: r.remaining_minutes ?? r.remaining_min ?? 0, + })) + mapped.sort((a, b) => + (RISK_ORDER[a.risk] ?? 9) - (RISK_ORDER[b.risk] ?? 9) || + a.remaining_minutes - b.remaining_minutes + ) + setItems(mapped) + setError(false) + } catch { + setError(true) + } finally { + setLoading(false) + } + }, []) + + useEffect(() => { + load() + timer.current = setInterval(load, pollMs) + return () => { if (timer.current) clearInterval(timer.current) } + }, [load, pollMs]) + + const highRiskCount = items.filter(i => i.risk === 'high').length + + return { items, highRiskCount, loading, error, refresh: load } +} + +export default useSLAPrediction diff --git a/hooks/useScreenshotBlock.ts b/hooks/useScreenshotBlock.ts new file mode 100644 index 00000000..8e286ba4 --- /dev/null +++ b/hooks/useScreenshotBlock.ts @@ -0,0 +1,73 @@ +/** + * #35 민감 화면 스크린샷 차단 훅 + * + * 완전 차단(Android FLAG_SECURE / iOS)은 네이티브 모듈(expo-screen-capture)이 필요하다. + * 해당 모듈이 설치되어 있으면 동적으로 활성화하고, 없으면(EAS 안전 모드) + * 오버레이 가림(SecureOverlay)으로 대체할 수 있도록 상태를 반환한다. + * + * 추가 네이티브 의존성 없이 동작 — package.json/app.json 변경 불필요. + */ +import { useEffect, useRef, useState } from 'react' +import { AppState, AppStateStatus } from 'react-native' + +interface ScreenshotBlockResult { + /** 앱이 비활성(백그라운드/전환 중) 상태일 때 true → 민감 내용을 오버레이로 가린다 */ + shouldObscure: boolean + /** 네이티브 FLAG_SECURE가 실제 적용되었는지 */ + nativeSecured: boolean +} + +let cachedModule: any | undefined // undefined: 미탐지, null: 없음, obj: 모듈 + +function loadScreenCaptureModule(): any | null { + if (cachedModule !== undefined) return cachedModule + try { + // 설치되어 있을 때만 로드 (미설치 시 require가 throw → catch) + // eslint-disable-next-line @typescript-eslint/no-var-requires + cachedModule = require('expo-screen-capture') + } catch { + cachedModule = null + } + return cachedModule +} + +export function useScreenshotBlock(enabled: boolean): ScreenshotBlockResult { + const [shouldObscure, setShouldObscure] = useState(false) + const [nativeSecured, setNativeSecured] = useState(false) + const tagRef = useRef(`secure-${Math.random().toString(36).slice(2)}`) + + // 네이티브 FLAG_SECURE 시도 + useEffect(() => { + if (!enabled) return + const mod = loadScreenCaptureModule() + let active = true + if (mod?.preventScreenCaptureAsync) { + mod + .preventScreenCaptureAsync(tagRef.current) + .then(() => active && setNativeSecured(true)) + .catch(() => active && setNativeSecured(false)) + } + return () => { + active = false + if (mod?.allowScreenCaptureAsync) { + mod.allowScreenCaptureAsync(tagRef.current).catch(() => {}) + } + setNativeSecured(false) + } + }, [enabled]) + + // 오버레이 가림: 앱이 inactive/background 일 때 (앱 스위처 미리보기 차단) + useEffect(() => { + if (!enabled) { + setShouldObscure(false) + return + } + const onChange = (state: AppStateStatus) => { + setShouldObscure(state !== 'active') + } + const sub = AppState.addEventListener('change', onChange) + return () => sub.remove() + }, [enabled]) + + return { shouldObscure, nativeSecured } +} diff --git a/hooks/useSessionExpiry.ts b/hooks/useSessionExpiry.ts new file mode 100644 index 00000000..f477e7d2 --- /dev/null +++ b/hooks/useSessionExpiry.ts @@ -0,0 +1,62 @@ +/** + * #31 세션 자동 만료 훅 + * 마지막 활동 시간을 기록하고, 15분 비활성 시 토큰을 삭제하고 로그인 화면으로 보낸다. + * + * 저장소: expo-secure-store (AsyncStorage 미설치 → EAS 빌드 안전을 위해 SecureStore 사용) + * 키: grd_last_activity + */ +import { useCallback } from 'react' +import { useRouter } from 'expo-router' +import * as SecureStore from 'expo-secure-store' + +export const SESSION_TIMEOUT = 15 * 60 * 1000 // 15분 +const LAST_ACTIVITY_KEY = 'grd_last_activity' +const TOKEN_KEY = 'grd_token' +const USER_KEY = 'grd_user' + +export async function recordActivity(): Promise { + try { + await SecureStore.setItemAsync(LAST_ACTIVITY_KEY, String(Date.now())) + } catch {} +} + +/** 만료 여부만 판정 (라우터 의존 없이 _layout 등에서 사용) */ +export async function isSessionExpired(): Promise { + try { + const token = await SecureStore.getItemAsync(TOKEN_KEY) + if (!token) return false // 로그인 전이면 만료 개념 없음 + const last = await SecureStore.getItemAsync(LAST_ACTIVITY_KEY) + if (!last) return false + return Date.now() - parseInt(last, 10) > SESSION_TIMEOUT + } catch { + return false + } +} + +export async function clearSession(): Promise { + try { + await SecureStore.deleteItemAsync(TOKEN_KEY) + await SecureStore.deleteItemAsync(USER_KEY) + await SecureStore.deleteItemAsync(LAST_ACTIVITY_KEY) + } catch {} +} + +export function useSessionExpiry() { + const router = useRouter() + + const updateActivity = useCallback(async () => { + await recordActivity() + }, []) + + const checkExpiry = useCallback(async (): Promise => { + const expired = await isSessionExpired() + if (expired) { + await clearSession() + router.replace('/(auth)/login') + return true + } + return false + }, [router]) + + return { updateActivity, checkExpiry, isSessionExpired, clearSession } +} diff --git a/hooks/useSmartNotif.ts b/hooks/useSmartNotif.ts new file mode 100644 index 00000000..919f86b8 --- /dev/null +++ b/hooks/useSmartNotif.ts @@ -0,0 +1,53 @@ +/** + * useSmartNotif (#28) — AI 스마트 알림 필터링 훅 + * + * 알림 수신 시 Ollama로 긴급도 판단 → urgent=false면 묵음 처리. + * 반환된 filter() 함수로 알림 큐를 필터링/표시 제어. + * + * 보안: 온프레미스 Ollama만 사용. 알림 본문에 자격증명 미포함 가정. + */ +import { useCallback } from 'react' +import { generateJSON, DEFAULT_TEXT_MODEL } from '../lib/ollama' + +interface NotifVerdict { + urgent: boolean + reason: string +} + +const SAFE_DEFAULT: NotifVerdict = { urgent: true, reason: 'AI 판단 불가 — 기본 표시' } + +export function useSmartNotif() { + /** 단일 알림 긴급도 판단. Ollama 미가동 시 안전하게 urgent=true. */ + const judge = useCallback(async (alertText: string): Promise => { + if (!alertText?.trim()) return SAFE_DEFAULT + const prompt = + `다음 ITSM 알림이 즉시 대응이 필요한 긴급 알림인지 판단하세요: "${alertText}". ` + + `JSON으로만 출력: {"urgent": true 또는 false, "reason": "한국어 한 줄 사유"}` + return generateJSON(DEFAULT_TEXT_MODEL, prompt, SAFE_DEFAULT) + }, []) + + /** + * 알림 배열을 긴급한 것만 남기도록 필터링. + * getText: 알림 객체에서 판단용 텍스트 추출. + */ + const filter = useCallback( + async (notifs: T[], getText: (n: T) => string): Promise => { + const verdicts = await Promise.all(notifs.map(n => judge(getText(n)))) + return notifs.filter((_, i) => verdicts[i].urgent) + }, + [judge], + ) + + /** 단일 알림 표시 여부 (urgent=false면 묵음). */ + const shouldShow = useCallback( + async (alertText: string): Promise => { + const v = await judge(alertText) + return v.urgent + }, + [judge], + ) + + return { judge, filter, shouldShow } +} + +export default useSmartNotif diff --git a/lib/ollama.ts b/lib/ollama.ts new file mode 100644 index 00000000..63912f44 --- /dev/null +++ b/lib/ollama.ts @@ -0,0 +1,88 @@ +/** + * GUARDiA Messenger — Ollama 온프레미스 AI 클라이언트 + * + * 보안 원칙 (불변): + * - 외부 AI API 절대 사용 금지. localhost:11434 (온프레미스 Ollama)만 사용. + * - 서버 자격증명(IP/SSH 계정/비밀번호)을 프롬프트에 포함 금지. + * - Ollama 미가동/오프라인 시 안전하게 빈 값/폴백 반환 (앱 크래시 방지). + */ + +// 외부 AI API 절대 사용 금지 — localhost:11434만 사용 +const OLLAMA_BASE = 'http://localhost:11434' + +// 기본 모델 (온프레미스 sLLM) +export const DEFAULT_TEXT_MODEL = 'llama3' +export const DEFAULT_VISION_MODEL = 'llava' + +interface OllamaResponse { + response?: string + done?: boolean +} + +/** 단순 텍스트 생성. 실패 시 빈 문자열 반환. */ +export async function generate(model: string, prompt: string): Promise { + try { + const res = await fetch(`${OLLAMA_BASE}/api/generate`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ model, prompt, stream: false }), + }) + const data: OllamaResponse = await res.json() + return data.response ?? '' + } catch { + return '' // 오프라인/Ollama 미가동 시 빈 문자열 반환 + } +} + +/** + * JSON 응답 생성. sLLM 응답에서 JSON 블록을 추출/파싱. + * 파싱 실패 시 fallback 반환. + */ +export async function generateJSON(model: string, prompt: string, fallback: T): Promise { + const raw = await generate(model, prompt) + if (!raw) return fallback + try { + return JSON.parse(raw) as T + } catch { + // 모델이 부연 설명과 함께 JSON을 출력한 경우 JSON 블록만 추출 시도 + const match = raw.match(/[\[{][\s\S]*[\]}]/) + if (match) { + try { + return JSON.parse(match[0]) as T + } catch { + return fallback + } + } + return fallback + } +} + +/** 이미지 + 텍스트 멀티모달 생성 (llava). imageBase64는 data URI 접두어 없는 순수 base64. */ +export async function generateWithImage( + model: string, + prompt: string, + imageBase64: string, +): Promise { + try { + const clean = imageBase64.replace(/^data:image\/\w+;base64,/, '') + const res = await fetch(`${OLLAMA_BASE}/api/generate`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ model, prompt, images: [clean], stream: false }), + }) + const data: OllamaResponse = await res.json() + return data.response ?? '' + } catch { + return '' + } +} + +/** Ollama 서버 가동 여부 확인. */ +export async function isOllamaAvailable(): Promise { + try { + const res = await fetch(`${OLLAMA_BASE}/api/tags`, { method: 'GET' }) + return res.ok + } catch { + return false + } +} diff --git a/package-lock.json b/package-lock.json index 0bf2fc11..8c56c08e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,17 +9,27 @@ "version": "1.0.0", "dependencies": { "@expo/metro-runtime": "~3.2.3", + "@react-native-community/netinfo": "11.3.1", "axios": "^1.7.7", - "expo": "~51.0.28", - "expo-constants": "~16.0.2", - "expo-linking": "~6.3.1", - "expo-router": "~3.5.23", + "expo": "^56.0.9", + "expo-av": "~14.0.7", + "expo-constants": "^56.0.17", + "expo-haptics": "~13.0.1", + "expo-image-picker": "~15.0.7", + "expo-linking": "^56.0.13", + "expo-local-authentication": "~14.0.1", + "expo-notifications": "^56.0.16", + "expo-print": "~13.0.1", + "expo-router": "^56.2.9", + "expo-screen-orientation": "~7.0.5", "expo-secure-store": "~13.0.2", - "expo-splash-screen": "~0.27.6", + "expo-sharing": "~12.0.1", + "expo-splash-screen": "^56.0.10", "expo-status-bar": "~1.12.1", "react": "18.2.0", "react-dom": "18.2.0", - "react-native": "0.74.5", + "react-native": "^0.85.3", + "react-native-gesture-handler": "~2.16.1", "react-native-safe-area-context": "4.10.5", "react-native-screens": "3.31.1", "react-native-web": "~0.19.10" @@ -27,9 +37,15 @@ "devDependencies": { "@babel/core": "^7.24.0", "@types/react": "~18.2.79", - "typescript": "~5.3.3" + "typescript": "~5.5.4" } }, + "node_modules/@adobe/css-tools": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "license": "MIT" + }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -181,18 +197,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", @@ -367,92 +371,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", @@ -468,42 +386,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz", @@ -536,124 +418,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz", @@ -726,18 +490,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", @@ -750,42 +502,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", @@ -813,13 +529,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", - "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -860,6 +578,38 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, "node_modules/@babel/plugin-transform-classes": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", @@ -880,22 +630,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", - "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/template": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", @@ -943,15 +677,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { + "node_modules/@babel/plugin-transform-for-of": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", - "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -960,10 +693,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { + "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", - "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" @@ -1007,6 +740,21 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", @@ -1026,6 +774,37 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", @@ -1123,36 +902,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", - "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", - "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz", @@ -1189,52 +938,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", - "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", - "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", - "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", @@ -1270,43 +973,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-flow": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.29.7.tgz", - "integrity": "sha512-KYIRV0BuaN68CDdsqFkAD7MU7yipUqQNuNElwATdxaIdpTjhvtY82QvkBJs7zV3Evxj2jFAAZ1iO8nyy0nhjqA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "@babel/plugin-transform-flow-strip-types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz", - "integrity": "sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "@babel/plugin-transform-react-display-name": "^7.29.7", - "@babel/plugin-transform-react-jsx": "^7.29.7", - "@babel/plugin-transform-react-jsx-development": "^7.29.7", - "@babel/plugin-transform-react-pure-annotations": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-typescript": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", @@ -1326,25 +992,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/register": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.29.7.tgz", - "integrity": "sha512-AMGJoWuES861riy6pcB0fphE1YXybtQnBYQMuIyPv6mKLiosfa79BKTnAOyx215c/3RJPJpdQwoHZ3earVH7AA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", @@ -1399,211 +1046,76 @@ "node": ">=6.9.0" } }, - "node_modules/@expo/bunyan": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", - "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", "license": "MIT", "dependencies": { - "uuid": "^8.0.0" + "@types/hammerjs": "^2.0.36" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/@expo/cli": { - "version": "0.18.31", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.31.tgz", - "integrity": "sha512-v9llw9fT3Uv+TCM6Xllo54t672CuYtinEQZ2LPJ2EJsCwuTc4Cd2gXQaouuIVD21VoeGQnr5JtJuWbF97sBKzQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.0", - "@expo/code-signing-certificates": "0.0.5", - "@expo/config": "~9.0.0-beta.0", - "@expo/config-plugins": "~8.0.8", - "@expo/devcert": "^1.0.0", - "@expo/env": "~0.3.0", - "@expo/image-utils": "^0.5.0", - "@expo/json-file": "^8.3.0", - "@expo/metro-config": "0.18.11", - "@expo/osascript": "^2.0.31", - "@expo/package-manager": "^1.5.0", - "@expo/plist": "^0.1.0", - "@expo/prebuild-config": "7.0.9", - "@expo/rudder-sdk-node": "1.1.1", - "@expo/spawn-async": "^1.7.2", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.74.85", - "@urql/core": "2.3.6", - "@urql/exchange-retry": "0.3.0", - "accepts": "^1.3.8", - "arg": "5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.0.7", - "bplist-parser": "^0.3.1", - "cacache": "^18.0.2", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "fast-glob": "^3.3.2", - "find-yarn-workspace-root": "~2.0.0", - "form-data": "^3.0.1", - "freeport-async": "2.0.0", - "fs-extra": "~8.1.0", - "getenv": "^1.0.0", - "glob": "^7.1.7", - "graphql": "15.8.0", - "graphql-tag": "^2.10.1", - "https-proxy-agent": "^5.0.1", - "internal-ip": "4.3.0", - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1", - "js-yaml": "^3.13.1", - "json-schema-deref-sync": "^0.13.0", - "lodash.debounce": "^4.0.8", - "md5hex": "^1.0.0", - "minimatch": "^3.0.4", - "node-fetch": "^2.6.7", - "node-forge": "^1.3.1", - "npm-package-arg": "^7.0.0", - "open": "^8.3.0", - "ora": "3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "5.6.0", - "progress": "2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", - "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.2", - "semver": "^7.6.0", - "send": "^0.18.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^6.0.5", - "temp-dir": "^2.0.0", - "tempy": "^0.7.1", - "terminal-link": "^2.1.1", - "text-table": "^0.2.0", - "url-join": "4.0.0", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" - }, - "bin": { - "expo-internal": "build/bin/cli" - } - }, - "node_modules/@expo/cli/node_modules/form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@expo/cli/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "node_modules/@expo-google-fonts/material-symbols": { + "version": "0.4.38", + "resolved": "https://registry.npmjs.org/@expo-google-fonts/material-symbols/-/material-symbols-0.4.38.tgz", + "integrity": "sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==", + "license": "MIT AND Apache-2.0" }, "node_modules/@expo/code-signing-certificates": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", - "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", + "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "license": "MIT", "dependencies": { - "node-forge": "^1.2.1", - "nullthrows": "^1.1.1" + "node-forge": "^1.3.3" } }, "node_modules/@expo/config": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.4.tgz", - "integrity": "sha512-g5ns5u1JSKudHYhjo1zaSfkJ/iZIcWmUmIQptMJZ6ag1C0ShL2sj8qdfU8MmAMuKLOgcIfSaiWlQnm4X3VJVkg==", + "version": "56.0.9", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-56.0.9.tgz", + "integrity": "sha512-/lqFeWGSrhpKJVP8tTN8LjuoIe8u8q2w7FzBL0C+wHgl+WM8l1qUIEYWy/sMvsG/NbpUIUsDHJRhQvOkU58eIw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~8.0.8", - "@expo/config-types": "^51.0.3", - "@expo/json-file": "^8.3.0", - "getenv": "^1.0.0", - "glob": "7.1.6", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", + "@expo/config-plugins": "~56.0.8", + "@expo/config-types": "^56.0.5", + "@expo/json-file": "^10.2.0", + "@expo/require-utils": "^56.1.3", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "3.34.0" + "slugify": "^1.3.4" } }, "node_modules/@expo/config-plugins": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.11.tgz", - "integrity": "sha512-oALE1HwnLFthrobAcC9ocnR9KXLzfWEjgIe4CPe+rDsfC6GDs8dGYCXfRFoCEzoLN4TGYs9RdZ8r0KoCcNrm2A==", + "version": "56.0.8", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-56.0.8.tgz", + "integrity": "sha512-phTuyBhgVLfqUHMjQkAfRtbyoY6yTxoKja1awtpVnEkoJDxPJuXx1KX5uvq1eZtt4bJQ08OBJ6P95INqRSHpRg==", "license": "MIT", "dependencies": { - "@expo/config-types": "^51.0.3", - "@expo/json-file": "~8.3.0", - "@expo/plist": "^0.1.0", + "@expo/config-types": "^56.0.5", + "@expo/json-file": "~10.2.0", + "@expo/plist": "^0.7.0", + "@expo/require-utils": "^56.1.3", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", - "debug": "^4.3.1", - "find-up": "~5.0.0", - "getenv": "^1.0.0", - "glob": "7.1.6", - "resolve-from": "^5.0.0", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", "semver": "^7.5.4", - "slash": "^3.0.0", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" } }, - "node_modules/@expo/config-plugins/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@expo/config-plugins/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1613,45 +1125,15 @@ } }, "node_modules/@expo/config-types": { - "version": "51.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", - "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==", + "version": "56.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-56.0.5.tgz", + "integrity": "sha512-GsAHO/MwW9ZRdgnmyfRXqVGLCP/zejD6rWnp5OROp8mBGRObKm4HfrjlUyT1skjMwCj1OrURx9ZfIc6yeBAkIA==", "license": "MIT" }, - "node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/config/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@expo/config/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1679,86 +1161,84 @@ "ms": "^2.1.1" } }, + "node_modules/@expo/devtools": { + "version": "56.0.2", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-56.0.2.tgz", + "integrity": "sha512-ANl4kPdbe0/HQYWkDEN79S6bQhI+i/ZCnPxuC853pPsB4svhINC7Ku9lmGOKPsUUWWnrHg1spkDGQBZ4sD6JxQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/dom-webview": { + "version": "56.0.5", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-56.0.5.tgz", + "integrity": "sha512-UIEJxkLg6cHqofKrpWpkn9E6ApxVRtCgZhZkARPr9VV7rBVloJgeroTHs31YgU/JpbI5lLQOnfOlGo54W6C2Ew==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/@expo/env": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.3.0.tgz", - "integrity": "sha512-OtB9XVHWaXidLbHvrVDeeXa09yvTl3+IQN884sO6PhIi2/StXfgSH/9zC7IvzrDB8kW3EBJ1PPLuCUJ2hxAT7Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.3.0.tgz", + "integrity": "sha512-9HnnIbzwTTdbwSjNLXTk0fPm9ZwMJ7c1/31tsni8HZ8Q62KzYCyspahH+V365vg5J6lr001DzNwBxVWSaYCQLg==", "license": "MIT", "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^1.0.0" + "getenv": "^2.0.0" + }, + "engines": { + "node": ">=20.12.0" } }, - "node_modules/@expo/image-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz", - "integrity": "sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A==", + "node_modules/@expo/expo-modules-macros-plugin": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.0.9.tgz", + "integrity": "sha512-odai6D7ng/gA7At8ukFcWcauNEeDdyVqzVPbQxDkyU2NTJ4kgphA4I5iigS5C4LXFicSIzEt2nzdlLM8sjsTdA==", + "license": "MIT" + }, + "node_modules/@expo/fingerprint": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.19.4.tgz", + "integrity": "sha512-PsowRlO8+S7JlO8go7yhNEXp7sqlsWDE2AlCwoss7zH0dcajXFo74Fy0KdXEc4UXK7kKoHD37oDgsZ8aHSLr7A==", "license": "MIT", "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "fs-extra": "9.0.0", - "getenv": "^1.0.0", - "jimp-compact": "0.16.1", - "node-fetch": "^2.6.0", - "parse-png": "^2.1.0", + "@expo/env": "^2.3.0", + "@expo/spawn-async": "^1.8.0", + "arg": "^5.0.2", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "ignore": "^5.3.1", + "minimatch": "^10.2.2", "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "tempy": "0.3.0" - } - }, - "node_modules/@expo/image-utils/node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/image-utils/node_modules/fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "semver": "^7.6.0" }, - "engines": { - "node": ">=10" + "bin": { + "fingerprint": "bin/cli.js" } }, - "node_modules/@expo/image-utils/node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@expo/image-utils/node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@expo/image-utils/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1767,139 +1247,153 @@ "node": ">=10" } }, - "node_modules/@expo/image-utils/node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/image-utils/node_modules/tempy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "node_modules/@expo/image-utils": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.10.1.tgz", + "integrity": "sha512-YDeefvmYdihS7Wp3ESDUVnOgOSWmj2Cczm9lVNDdm4MqQLdAKm/LPYg83HtFQPfefRlAxyHrQR/O9kIXN9C1Wg==", "license": "MIT", "dependencies": { - "temp-dir": "^1.0.0", - "type-fest": "^0.3.1", - "unique-string": "^1.0.0" - }, - "engines": { - "node": ">=8" + "@expo/require-utils": "^56.1.3", + "@expo/spawn-async": "^1.8.0", + "chalk": "^4.0.0", + "getenv": "^2.0.0", + "jimp-compact": "0.16.1", + "parse-png": "^2.1.0", + "semver": "^7.6.0" } }, - "node_modules/@expo/image-utils/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=6" - } - }, - "node_modules/@expo/image-utils/node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/image-utils/node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@expo/json-file": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.3.tgz", - "integrity": "sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.2", - "write-file-atomic": "^2.3.0" - } - }, - "node_modules/@expo/json-file/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/metro-config": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.11.tgz", - "integrity": "sha512-/uOq55VbSf9yMbUO1BudkUM2SsGW1c5hr9BnhIqYqcsFv0Jp5D3DtJ4rljDKaUeNLbwr6m7pqIrkSMq5NrYf4Q==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "@expo/config": "~9.0.0-beta.0", - "@expo/env": "~0.3.0", - "@expo/json-file": "~8.3.0", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "find-yarn-workspace-root": "~2.0.0", - "fs-extra": "^9.1.0", - "getenv": "^1.0.0", - "glob": "^7.2.3", - "jsc-safe-url": "^0.2.4", - "lightningcss": "~1.19.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - } - }, - "node_modules/@expo/metro-config/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/@expo/metro-config/node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "node_modules/@expo/inline-modules": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.0.11.tgz", + "integrity": "sha512-ZlIfKL61DPnW8YUTdMEjMA31xrDDV6p7Xi8rWYyhd5qXBV8MwGwjuJ7vKeaVaMjRqxJk1N9lv7zlfyvQpRCNNw==", "license": "MIT", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "@expo/config-plugins": "~56.0.8" } }, - "node_modules/@expo/metro-config/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/@expo/json-file": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.2.0.tgz", + "integrity": "sha512-S6XzKe3R9GQeHiUPXc3xJjOv2VJhOEwFYf7xdC2z2cUqt3kZJ9mSO877sNQloVdnW/SUCtPY3bexlM7nwq+CAQ==", "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/local-build-cache-provider": { + "version": "56.0.8", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-56.0.8.tgz", + "integrity": "sha512-UsuXwpNi57MNhzZ3be4XThc8xW6nzk3Wu37s1+2qcfZGeJcMLKDFfwO6n8YXeIiGlCsOi0Ee1rsTdgjrKt/YJQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~56.0.9", + "chalk": "^4.1.2" + } + }, + "node_modules/@expo/log-box": { + "version": "56.0.12", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-56.0.12.tgz", + "integrity": "sha512-budE6AGmJbpOJfGSOz+JVP3+FevElT82IEIg+ukQ4gZpW/dGO7QX1unFjanKdSaYgudBwJ4FCFGMwWhW/1tXVQ==", + "license": "MIT", + "dependencies": { + "@expo/dom-webview": "^56.0.5", + "anser": "^1.4.9", + "stacktrace-parser": "^0.1.10" + }, + "peerDependencies": { + "@expo/dom-webview": "^56.0.5", + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/@expo/metro": { + "version": "56.0.0", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-56.0.0.tgz", + "integrity": "sha512-5gIgQHtEpjjvsjKfVtIv23a98LLRV0/y07PDShEwYSytAMlE3FSF8RHXqtHc1sUJL6dn7hnuIBpIbrLXXuVi0A==", + "license": "MIT", + "dependencies": { + "metro": "0.84.4", + "metro-babel-transformer": "0.84.4", + "metro-cache": "0.84.4", + "metro-cache-key": "0.84.4", + "metro-config": "0.84.4", + "metro-core": "0.84.4", + "metro-file-map": "0.84.4", + "metro-minify-terser": "0.84.4", + "metro-resolver": "0.84.4", + "metro-runtime": "0.84.4", + "metro-source-map": "0.84.4", + "metro-symbolicate": "0.84.4", + "metro-transform-plugins": "0.84.4", + "metro-transform-worker": "0.84.4" + } + }, + "node_modules/@expo/metro-config": { + "version": "56.0.13", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-56.0.13.tgz", + "integrity": "sha512-OPyNYiex/6Ms8zT2POdIZsLhcAZYk7O+yJvpz5uG/4QRA7aiESfCy1I+0YHewMlR4P1YQeyxIrfTurs6m9xfZA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~56.0.9", + "@expo/env": "~2.3.0", + "@expo/json-file": "~10.2.0", + "@expo/metro": "~56.0.0", + "@expo/require-utils": "^56.1.3", + "@expo/spawn-async": "^1.8.0", + "@jridgewell/gen-mapping": "^0.3.13", + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.5.5", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.33.3", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "msgpackr": "^2.0.1", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-file-map": { + "version": "56.0.3", + "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-56.0.3.tgz", + "integrity": "sha512-5OGW3z8LgEYgMJOR7F3pC8llFLkb1fVqwAewbCl6S4Vkha8AFQMwOjT+9Wbka+V4rmpljpGqOnMhF4xZbD961w==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "fb-watchman": "^2.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" } }, "node_modules/@expo/metro-runtime": { @@ -1937,134 +1431,45 @@ "resolve-workspace-root": "^2.0.0" } }, - "node_modules/@expo/package-manager/node_modules/@expo/json-file": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.2.0.tgz", - "integrity": "sha512-S6XzKe3R9GQeHiUPXc3xJjOv2VJhOEwFYf7xdC2z2cUqt3kZJ9mSO877sNQloVdnW/SUCtPY3bexlM7nwq+CAQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.20.0", - "json5": "^2.2.3" - } - }, - "node_modules/@expo/package-manager/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@expo/package-manager/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@expo/package-manager/node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@expo/package-manager/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/package-manager/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@expo/plist": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.3.tgz", - "integrity": "sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.7.0.tgz", + "integrity": "sha512-vrpryU1GoqSIRNqRB2D3IjXDmzNYfiQpEF6AH/xknlD7eiYmEDt3mb26V7cLcedcPG8PY/1xWHdBXVQJfEAh6Q==", "license": "MIT", "dependencies": { - "@xmldom/xmldom": "~0.7.7", - "base64-js": "^1.2.3", - "xmlbuilder": "^14.0.0" + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" } }, "node_modules/@expo/prebuild-config": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz", - "integrity": "sha512-9i6Cg7jInpnGEHN0jxnW0P+0BexnePiBzmbUvzSbRXpdXihYUX2AKMu73jgzxn5P1hXOSkzNS7umaY+BZ+aBag==", + "version": "56.0.15", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-56.0.15.tgz", + "integrity": "sha512-6GC+QjdCkzp/5wjsqgfu/B2+2yf5MyZMtzf9szIPrLt9uKhzV2PdyM0vU0kvbj1YT8weHCtO7bsrzimman0sjA==", "license": "MIT", "dependencies": { - "@expo/config": "~9.0.0-beta.0", - "@expo/config-plugins": "~8.0.8", - "@expo/config-types": "^51.0.3", - "@expo/image-utils": "^0.5.0", - "@expo/json-file": "^8.3.0", - "@react-native/normalize-colors": "0.74.85", + "@expo/config": "~56.0.9", + "@expo/config-plugins": "~56.0.8", + "@expo/config-types": "^56.0.5", + "@expo/image-utils": "^0.10.1", + "@expo/json-file": "^10.2.0", + "@react-native/normalize-colors": "0.85.3", "debug": "^4.3.1", - "fs-extra": "^9.0.0", + "expo-modules-autolinking": "~56.0.15", "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - }, - "peerDependencies": { - "expo-modules-autolinking": ">=0.8.1" + "semver": "^7.6.0" } }, - "node_modules/@expo/prebuild-config/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/prebuild-config/node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/@expo/prebuild-config/node_modules/@react-native/normalize-colors": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.85.3.tgz", + "integrity": "sha512-hj0PScZEhIbcOvQV5yMKX3ha4XEIOy/SVE1Rrpp0beW0dpNLOgSC7KDxGewmDnIHK9YdQUXGY9eMEfShUMIaZw==", + "license": "MIT" }, "node_modules/@expo/prebuild-config/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2073,51 +1478,37 @@ "node": ">=10" } }, - "node_modules/@expo/prebuild-config/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@expo/rudder-sdk-node": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", - "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", + "node_modules/@expo/require-utils": { + "version": "56.1.3", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-56.1.3.tgz", + "integrity": "sha512-KyLeOn/zzQSvuPpV5YhB/FPKnpQytno4luN918bGdPDssLBoS3N/0UbC3W0rJAn9kSFu+XpfR81eABRVsSdfgQ==", "license": "MIT", "dependencies": { - "@expo/bunyan": "^4.0.0", - "@segment/loosely-validate-event": "^2.0.0", - "fetch-retry": "^4.1.1", - "md5": "^2.2.1", - "node-fetch": "^2.6.1", - "remove-trailing-slash": "^0.1.0", - "uuid": "^8.3.2" + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "typescript": "^5.0.0 || ^5.0.0-0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, + "node_modules/@expo/schema-utils": { + "version": "56.0.1", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-56.0.1.tgz", + "integrity": "sha512-CZ/+mYbQmWeOnkCGlWy9K+lFxbJSMFY7+TqBZcKzBSTU5Q7IGRvn/sOG3TdNjIdLPmbA8xe7R/c3UUQ28R9i9w==", + "license": "MIT" + }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "license": "MIT" }, - "node_modules/@expo/server": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@expo/server/-/server-0.4.4.tgz", - "integrity": "sha512-q9ADBzMN5rZ/fgQ2mz5YIJuZ8gelQlhG2CQqToD+UvBLZvbaHCNxTTSs2KI1LzJvAaW5CWgWMatGvGF6iUQ0LA==", - "license": "MIT", - "dependencies": { - "@remix-run/node": "^2.7.2", - "abort-controller": "^3.0.0", - "debug": "^4.3.4", - "source-map-support": "~0.5.21" - } - }, "node_modules/@expo/spawn-async": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.8.0.tgz", @@ -2136,17 +1527,45 @@ "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "license": "MIT" }, - "node_modules/@expo/vector-icons": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.1.0.tgz", - "integrity": "sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ==", + "node_modules/@expo/ui": { + "version": "56.0.16", + "resolved": "https://registry.npmjs.org/@expo/ui/-/ui-56.0.16.tgz", + "integrity": "sha512-NPbpseOC4VNoDvOBgGtTb63fu2IfdnxNwp9K8pqU2mBTQPxEMcxF0ijgNBJ0Ze1NEuLJoBhJyrHWoj3zRmovkA==", "license": "MIT", + "dependencies": { + "sf-symbols-typescript": "^2.1.0", + "vaul": "^1.1.2" + }, "peerDependencies": { - "expo-font": "*", + "@babel/core": "*", + "expo": "*", "react": "*", - "react-native": "*" + "react-dom": "*", + "react-native": "*", + "react-native-reanimated": "*", + "react-native-worklets": "*" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native-reanimated": { + "optional": true + }, + "react-native-worklets": { + "optional": true + } } }, + "node_modules/@expo/ws-tunnel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", + "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", + "license": "MIT" + }, "node_modules/@expo/xcpretty": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.4.tgz", @@ -2161,144 +1580,6 @@ "excpretty": "build/cli.js" } }, - "node_modules/@expo/xcpretty/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/@expo/xcpretty/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@isaacs/ttlcache": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", @@ -2308,155 +1589,6 @@ "node": ">=12" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/create-cache-key-function/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -2470,17 +1602,20 @@ } }, "node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "license": "MIT", "dependencies": { + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -2538,1943 +1673,493 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", + "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", + "cpu": [ + "arm64" + ], "license": "MIT", "optional": true, - "engines": { - "node": ">=14" - } + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", + "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", + "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", + "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", + "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", + "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", + "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", + "license": "MIT" }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", - "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", + "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", + "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", + "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", + "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", + "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10" + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@radix-ui/react-slot": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", - "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.5.tgz", + "integrity": "sha512-rCMO3QsIVKv5JTY5CVbo2MvO77SpEqqYc8AvRE7OWqRDOIqAKjsp+DrmnY9uc8NPdxB5E2z47HTYGeE2+NTptg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" + "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@react-native-community/cli": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.9.tgz", - "integrity": "sha512-hFJL4cgLPxncJJd/epQ4dHnMg5Jy/7Q56jFvA3MHViuKpzzfTCJCB+pGY54maZbtym53UJON9WTGpM3S81UfjQ==", + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", + "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", + "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", "license": "MIT", "dependencies": { - "@react-native-community/cli-clean": "13.6.9", - "@react-native-community/cli-config": "13.6.9", - "@react-native-community/cli-debugger-ui": "13.6.9", - "@react-native-community/cli-doctor": "13.6.9", - "@react-native-community/cli-hermes": "13.6.9", - "@react-native-community/cli-server-api": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "@react-native-community/cli-types": "13.6.9", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" + "@radix-ui/react-use-effect-event": "0.0.3", + "@radix-ui/react-use-layout-effect": "1.1.2" }, - "bin": { - "rnc-cli": "build/bin.js" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=18" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@react-native-community/cli-clean": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz", - "integrity": "sha512-7Dj5+4p9JggxuVNOjPbduZBAP1SUgNhLKVw5noBUzT/3ZpUZkDM+RCSwyoyg8xKWoE4OrdUAXwAFlMcFDPKykA==", + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", + "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", "license": "MIT", "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@react-native-community/cli-clean/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", + "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "@radix-ui/react-use-callback-ref": "1.1.2" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@react-native-community/cli-clean/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", + "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", "license": "MIT", - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@react-native-community/cli-clean/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/@react-native-community/netinfo": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-11.3.1.tgz", + "integrity": "sha512-UBnJxyV0b7i9Moa97Av+HKho1ByzX0DtbJXzUQS5E3xhQs6P2D/Os0iw3ouy7joY1TVd6uIhplPbr7l1SJNaNQ==", "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-config": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-13.6.9.tgz", - "integrity": "sha512-rFfVBcNojcMm+KKHE/xqpqXg8HoKl4EC7bFHUrahMJ+y/tZll55+oX/PGG37rzB8QzP2UbMQ19DYQKC1G7kXeg==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "fast-glob": "^3.3.2", - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli-debugger-ui": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.9.tgz", - "integrity": "sha512-TkN7IdFmGPPvTpAo3nCAH9uwGCPxWBEAwpqEZDrq0NWllI7Tdie8vDpGdrcuCcKalmhq6OYnkXzeBah7O1Ztpw==", - "license": "MIT", - "dependencies": { - "serve-static": "^1.13.1" - } - }, - "node_modules/@react-native-community/cli-doctor": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-13.6.9.tgz", - "integrity": "sha512-5quFaLdWFQB+677GXh5dGU9I5eg2z6Vg4jOX9vKnc9IffwyIFAyJfCZHrxLSRPDGNXD7biDQUdoezXYGwb6P/A==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-config": "13.6.9", - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-platform-apple": "13.6.9", - "@react-native-community/cli-platform-ios": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.10.0", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "peerDependencies": { + "react-native": ">=0.59" } }, - "node_modules/@react-native-community/cli-hermes": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-13.6.9.tgz", - "integrity": "sha512-GvwiwgvFw4Ws+krg2+gYj8sR3g05evmNjAHkKIKMkDTJjZ8EdyxbkifRUs1ZCq3TMZy2oeblZBXCJVOH4W7ZbA==", + "node_modules/@react-native-masked-view/masked-view": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@react-native-masked-view/masked-view/-/masked-view-0.3.2.tgz", + "integrity": "sha512-XwuQoW7/GEgWRMovOQtX3A4PrXhyaZm0lVUiY8qJDvdngjLms9Cpdck6SmGAUNqQwcj2EadHC1HwL0bEyoa/SQ==", "license": "MIT", - "dependencies": { - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6" - } - }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.9.tgz", - "integrity": "sha512-9KsYGdr08QhdvT3Ht7e8phQB3gDX9Fs427NJe0xnoBh+PDPTI2BD5ks5ttsH8CzEw8/P6H8tJCHq6hf2nxd9cw==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.2.4", - "logkitty": "^0.7.1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.9.tgz", - "integrity": "sha512-KoeIHfhxMhKXZPXmhQdl6EE+jGKWwoO9jUVWgBvibpVmsNjo7woaG/tfJMEWfWF3najX1EkQAoJWpCDBMYWtlA==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.0.12", - "ora": "^5.4.1" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.9.tgz", - "integrity": "sha512-CiUcHlGs8vE0CAB4oi1f+dzniqfGuhWPNrDvae2nm8dewlahTBwIcK5CawyGezjcJoeQhjBflh9vloska+nlnw==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-platform-apple": "13.6.9" - } - }, - "node_modules/@react-native-community/cli-server-api": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-13.6.9.tgz", - "integrity": "sha512-W8FSlCPWymO+tlQfM3E0JmM8Oei5HZsIk5S0COOl0MRi8h0NmHI4WSTF2GCfbFZkcr2VI/fRsocoN8Au4EZAug==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-debugger-ui": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^6.2.2" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { - "version": "15.0.20", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.20.tgz", - "integrity": "sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.4.tgz", - "integrity": "sha512-PNIUUyLI5YpkJZj60YBzX1o0ByQ4ovvfmq9N/Kig/PAYbVlGyz4R6G0SEWrD0O9acc0sT2+IdMBVLFv8FSi0Nw==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/@react-native-community/cli-tools": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.9.tgz", - "integrity": "sha512-OXaSjoN0mZVw3nrAwcY1PC0uMfyTd9fz7Cy06dh+EJc+h0wikABsVRzV8cIOPrVV+PPEEXE0DBrH20T2puZzgQ==", - "license": "MIT", - "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "license": "MIT", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-types": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-13.6.9.tgz", - "integrity": "sha512-RLxDppvRxXfs3hxceW/mShi+6o5yS+kFPnPqZTaMKKR5aSg7LwDpLQW4K2D22irEG8e6RKDkZUeH9aL3vO2O0w==", - "license": "MIT", - "dependencies": { - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/@react-native-community/cli/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "peerDependencies": { + "react": ">=16", + "react-native": ">=0.57" } }, "node_modules/@react-native/assets-registry": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.87.tgz", - "integrity": "sha512-1XmRhqQchN+pXPKEKYdpJlwESxVomJOxtEnIkbo7GAlaN2sym84fHEGDXAjLilih5GVPpcpSmFzTy8jx3LtaFg==", + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.85.3.tgz", + "integrity": "sha512-u9ZiYP23vA2IFtdFQFmetzSmk6SM0xgKIoiOsr1hXNHjHaLhOm+/Ph1ud57wX6+Dbwdzx8coJgnzSKL3W21PCg==", "license": "MIT", "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.87.tgz", - "integrity": "sha512-+vJYpMnENFrwtgvDfUj+CtVJRJuUnzAUYT0/Pb68Sq9RfcZ5xdcCuUgyf7JO+akW2VTBoJY427wkcxU30qrWWw==", + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.85.3.tgz", + "integrity": "sha512-Wc94zGfeFG8Njf9SHMPfYZP04kjigkOps6F1TYTvd7ZVXuGxqseCDgxc50LWcOhOCLypI9n3oVVqz81C3p44ZA==", "license": "MIT", "dependencies": { - "@react-native/codegen": "0.74.87" + "@babel/traverse": "^7.29.0", + "@react-native/codegen": "0.85.3" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.87.tgz", - "integrity": "sha512-hyKpfqzN2nxZmYYJ0tQIHG99FQO0OWXp/gVggAfEUgiT+yNKas1C60LuofUsK7cd+2o9jrpqgqW4WzEDZoBlTg==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.74.87", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/@react-native/codegen": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.87.tgz", - "integrity": "sha512-GMSYDiD+86zLKgMMgz9z0k6FxmRn+z6cimYZKkucW4soGbxWsbjUAZoZ56sJwt2FJ3XVRgXCrnOCgXoH/Bkhcg==", + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.85.3.tgz", + "integrity": "sha512-/JkS1lGLyzBWP1FbgDwaqEf7qShIC6pUC1M0a/YMAd/v4iqR24MRkQWe7jkYvcBQ2LpEhs5NGE9InhxSv21zCA==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.0", - "glob": "^7.1.1", - "hermes-parser": "0.19.1", + "@babel/core": "^7.25.2", + "@babel/parser": "^7.29.0", + "hermes-parser": "0.33.3", "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/@react-native/codegen/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.87.tgz", - "integrity": "sha512-EgJG9lSr8x3X67dHQKQvU6EkO+3ksVlJHYIVv6U/AmW9dN80BEFxgYbSJ7icXS4wri7m4kHdgeq2PQ7/3vvrTQ==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-server-api": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "@react-native/dev-middleware": "0.74.87", - "@react-native/metro-babel-transformer": "0.74.87", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", - "node-fetch": "^2.2.0", - "querystring": "^0.2.1", - "readline": "^1.3.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.87.tgz", - "integrity": "sha512-MN95DJLYTv4EqJc+9JajA3AJZSBYJz2QEJ3uWlHrOky2vKrbbRVaW1ityTmaZa2OXIvNc6CZwSRSE7xCoHbXhQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.87.tgz", - "integrity": "sha512-7TmZ3hTHwooYgIHqc/z87BMe1ryrIqAUi+AF7vsD+EHCGxHFdMjSpf1BZ2SUPXuLnF2cTiTfV2RwhbPzx0tYIA==", - "license": "MIT", - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.74.87", - "@rnx-kit/chromium-edge-launcher": "^1.0.0", - "chrome-launcher": "^0.15.2", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", - "open": "^7.0.3", - "selfsigned": "^2.4.1", - "serve-static": "^1.13.1", - "temp-dir": "^2.0.0", - "ws": "^6.2.2" + "tinyglobby": "^0.2.15", + "yargs": "^17.6.2" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ws": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.4.tgz", - "integrity": "sha512-PNIUUyLI5YpkJZj60YBzX1o0ByQ4ovvfmq9N/Kig/PAYbVlGyz4R6G0SEWrD0O9acc0sT2+IdMBVLFv8FSi0Nw==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz", - "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz", - "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==", - "license": "MIT", - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.74.85", - "@rnx-kit/chromium-edge-launcher": "^1.0.0", - "chrome-launcher": "^0.15.2", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "selfsigned": "^2.4.1", - "serve-static": "^1.13.1", - "temp-dir": "^2.0.0", - "ws": "^6.2.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.4.tgz", - "integrity": "sha512-PNIUUyLI5YpkJZj60YBzX1o0ByQ4ovvfmq9N/Kig/PAYbVlGyz4R6G0SEWrD0O9acc0sT2+IdMBVLFv8FSi0Nw==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.87.tgz", - "integrity": "sha512-T+VX0N1qP+U9V4oAtn7FTX7pfsoVkd1ocyw9swYXgJqU2fK7hC9famW7b3s3ZiufPGPr1VPJe2TVGtSopBjL6A==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.74.87.tgz", - "integrity": "sha512-M5Evdn76CuVEF0GsaXiGi95CBZ4IWubHqwXxV9vG9CC9kq0PSkoM2Pn7Lx7dgyp4vT7ccJ8a3IwHbe+5KJRnpw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/metro-babel-transformer": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.87.tgz", - "integrity": "sha512-UsJCO24sNax2NSPBmV1zLEVVNkS88kcgAiYrZHtYSwSjpl4WZ656tIeedBfiySdJ94Hr3kQmBYLipV5zk0NI1A==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.74.87", - "hermes-parser": "0.19.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "peerDependencies": { "@babel/core": "*" } }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.85.3.tgz", + "integrity": "sha512-fs85dmbIqNmtzEixDb0g+q6R3Vt4H9eAt8/inIZdDKfjN76+sUJA2r1nxODQ76bU23MrIbz8sI7KFBPaWk/zQw==", + "license": "MIT", + "dependencies": { + "@react-native/dev-middleware": "0.85.3", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "metro": "^0.84.3", + "metro-config": "^0.84.3", + "metro-core": "^0.84.3", + "semver": "^7.1.3" + }, + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + }, + "peerDependencies": { + "@react-native-community/cli": "*", + "@react-native/metro-config": "0.85.3" + }, + "peerDependenciesMeta": { + "@react-native-community/cli": { + "optional": true + }, + "@react-native/metro-config": { + "optional": true + } + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.85.3.tgz", + "integrity": "sha512-uAu7rM5o/Np1zgp6fi5zM1sP1aB8DcS7DdOLcj/TkSutOAjkMqqd2lWt1/+3S7qXexRHVK5XcP+o3VXo4L/V0A==", + "license": "BSD-3-Clause", + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/@react-native/debugger-shell": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.85.3.tgz", + "integrity": "sha512-/jRAaT9boiCttIcEwS02WPwYkUihqsjSaK/TMtHz05vT6uMgac9PaQt5kzBQLIABv5aEIa5gtrMmKVz49MjkjQ==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "fb-dotslash": "0.5.8" + }, + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.85.3.tgz", + "integrity": "sha512-JYzBiT4A8w+KQt+dOD5v+ti+tDrGoPnsSTuApq3Ls4RB5sfWbDlYMyz3dbc8qBIHz9tv0sQ5+eOu6Xwqzr5AQA==", + "license": "MIT", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.85.3", + "@react-native/debugger-shell": "0.85.3", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.3.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^7.5.10" + }, + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.85.3.tgz", + "integrity": "sha512-39dY2j50Q1pntejzwt3XL7vwXtrj8jcIfHq6E+gyu3jzYxZJVvMkMutQ39vSg6zinIQOX36oQDhidXUbCXzgoA==", + "license": "MIT", + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.3.tgz", + "integrity": "sha512-U2+aMshIXf1uFn77tpBb/xhHWB9vkVrMpt7kkucAugF8hJKYTDGB587X7WwelHduK2KBfhl4giSv0rzZGoef9A==", + "license": "MIT", + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, "node_modules/@react-native/normalize-colors": { "version": "0.74.85", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz", "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==", "license": "MIT" }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.87.tgz", - "integrity": "sha512-lsGxoFMb0lyK/MiplNKJpD+A1EoEUumkLrCjH4Ht+ZlG8S0BfCxmskLZ6qXn3BiDSkLjfjI/qyZ3pnxNBvkXpQ==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-navigation/bottom-tabs": { - "version": "6.5.20", - "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.20.tgz", - "integrity": "sha512-ow6Z06iS4VqBO8d7FP+HsGjJLWt2xTWIvuWjpoCvsM/uQXzCRDIjBv9HaKcXbF0yTW7IMir0oDAbU5PFzEDdgA==", - "deprecated": "This version is no longer supported", - "license": "MIT", - "dependencies": { - "@react-navigation/elements": "^1.3.30", - "color": "^4.2.3", - "warn-once": "^0.1.0" - }, - "peerDependencies": { - "@react-navigation/native": "^6.0.0", - "react": "*", - "react-native": "*", - "react-native-safe-area-context": ">= 3.0.0", - "react-native-screens": ">= 3.0.0" - } - }, - "node_modules/@react-navigation/core": { - "version": "6.4.17", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.17.tgz", - "integrity": "sha512-Nd76EpomzChWAosGqWOYE3ItayhDzIEzzZsT7PfGcRFDgW5miHV2t4MZcq9YIK4tzxZjVVpYbIynOOQQd1e0Cg==", - "deprecated": "This version is no longer supported", - "license": "MIT", - "dependencies": { - "@react-navigation/routers": "^6.1.9", - "escape-string-regexp": "^4.0.0", - "nanoid": "^3.1.23", - "query-string": "^7.1.3", - "react-is": "^16.13.0", - "use-latest-callback": "^0.2.1" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@react-navigation/elements": { - "version": "1.3.31", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.31.tgz", - "integrity": "sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ==", - "deprecated": "This version is no longer supported", - "license": "MIT", - "peerDependencies": { - "@react-navigation/native": "^6.0.0", - "react": "*", - "react-native": "*", - "react-native-safe-area-context": ">= 3.0.0" - } - }, - "node_modules/@react-navigation/native": { - "version": "6.1.18", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.18.tgz", - "integrity": "sha512-mIT9MiL/vMm4eirLcmw2h6h/Nm5FICtnYSdohq4vTLA2FF/6PNhByM7s8ffqoVfE5L0uAa6Xda1B7oddolUiGg==", - "deprecated": "This version is no longer supported", - "license": "MIT", - "dependencies": { - "@react-navigation/core": "^6.4.17", - "escape-string-regexp": "^4.0.0", - "fast-deep-equal": "^3.1.3", - "nanoid": "^3.1.23" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/@react-navigation/native-stack": { - "version": "6.9.26", - "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.9.26.tgz", - "integrity": "sha512-++dueQ+FDj2XkZ902DVrK79ub1vp19nSdAZWxKRgd6+Bc0Niiesua6rMCqymYOVaYh+dagwkA9r00bpt/U5WLw==", - "license": "MIT", - "dependencies": { - "@react-navigation/elements": "^1.3.30", - "warn-once": "^0.1.0" - }, - "peerDependencies": { - "@react-navigation/native": "^6.0.0", - "react": "*", - "react-native": "*", - "react-native-safe-area-context": ">= 3.0.0", - "react-native-screens": ">= 3.0.0" - } - }, - "node_modules/@react-navigation/routers": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.9.tgz", - "integrity": "sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==", - "deprecated": "This version is no longer supported", - "license": "MIT", - "dependencies": { - "nanoid": "^3.1.23" - } - }, - "node_modules/@remix-run/node": { - "version": "2.17.4", - "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.17.4.tgz", - "integrity": "sha512-9A29JaYiGHDEmaiQuD1IlO/TrQxnnkj98GpytihU+Nz6yTt6RwzzyMMqTAoasRd1dPD4OeSaSqbwkcim/eE76Q==", - "license": "MIT", - "dependencies": { - "@remix-run/server-runtime": "2.17.4", - "@remix-run/web-fetch": "^4.4.2", - "@web3-storage/multipart-parser": "^1.0.0", - "cookie-signature": "^1.1.0", - "source-map-support": "^0.5.21", - "stream-slice": "^0.1.2", - "undici": "^6.21.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@remix-run/router": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", - "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@remix-run/server-runtime": { - "version": "2.17.4", - "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.17.4.tgz", - "integrity": "sha512-oCsFbPuISgh8KpPKsfBChzjcntvTz5L+ggq9VNYWX8RX3yA7OgQpKspRHOSxb05bw7m0Hx+L1KRHXjf3juKX8w==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.2", - "@types/cookie": "^0.6.0", - "@web3-storage/multipart-parser": "^1.0.0", - "cookie": "^0.7.2", - "set-cookie-parser": "^2.4.8", - "source-map": "^0.7.3", - "turbo-stream": "2.4.1" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@remix-run/web-blob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-blob/-/web-blob-3.1.0.tgz", - "integrity": "sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==", - "license": "MIT", - "dependencies": { - "@remix-run/web-stream": "^1.1.0", - "web-encoding": "1.1.5" - } - }, - "node_modules/@remix-run/web-fetch": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz", - "integrity": "sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==", - "license": "MIT", - "dependencies": { - "@remix-run/web-blob": "^3.1.0", - "@remix-run/web-file": "^3.1.0", - "@remix-run/web-form-data": "^3.1.0", - "@remix-run/web-stream": "^1.1.0", - "@web3-storage/multipart-parser": "^1.0.0", - "abort-controller": "^3.0.0", - "data-uri-to-buffer": "^3.0.1", - "mrmime": "^1.0.0" - }, - "engines": { - "node": "^10.17 || >=12.3" - } - }, - "node_modules/@remix-run/web-file": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-file/-/web-file-3.1.0.tgz", - "integrity": "sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==", - "license": "MIT", - "dependencies": { - "@remix-run/web-blob": "^3.1.0" - } - }, - "node_modules/@remix-run/web-form-data": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-form-data/-/web-form-data-3.1.0.tgz", - "integrity": "sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==", - "license": "MIT", - "dependencies": { - "web-encoding": "1.1.5" - } - }, - "node_modules/@remix-run/web-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-stream/-/web-stream-1.1.0.tgz", - "integrity": "sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==", - "license": "MIT", - "dependencies": { - "web-streams-polyfill": "^3.1.1" - } - }, - "node_modules/@rnx-kit/chromium-edge-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", - "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.0.0", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=14.15" - } - }, - "node_modules/@segment/loosely-validate-event": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", - "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", - "dependencies": { - "component-type": "^1.2.1", - "join-component": "^1.1.0" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" - }, "node_modules/@sinclair/typebox": { "version": "0.27.10", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "license": "MIT" }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "license": "BSD-3-Clause", + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "license": "MIT" + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "node_modules/@types/hammerjs": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", + "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { @@ -4493,37 +2178,21 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, "node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "version": "25.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", + "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/prop-types": { @@ -4544,16 +2213,10 @@ "csstype": "^3.0.2" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "license": "MIT" - }, "node_modules/@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -4565,55 +2228,21 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, - "node_modules/@urql/core": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", - "integrity": "sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==", - "license": "MIT", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.0", - "wonka": "^4.0.14" - }, - "peerDependencies": { - "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@urql/exchange-retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz", - "integrity": "sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==", - "license": "MIT", - "dependencies": { - "@urql/core": ">=2.3.1", - "wonka": "^4.0.14" - }, - "peerDependencies": { - "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" - } - }, - "node_modules/@web3-storage/multipart-parser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz", - "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==", - "license": "(Apache-2.0 AND MIT)" + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" }, "node_modules/@xmldom/xmldom": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", - "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", - "deprecated": "this version has critical issues, please update to the latest version", + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", "license": "MIT", "engines": { "node": ">=10.0.0" } }, - "node_modules/@zxing/text-encoding": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", - "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", - "license": "(Unlicense OR Apache-2.0)", - "optional": true - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -4627,18 +2256,43 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -4663,64 +2317,6 @@ "node": ">= 6.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/anser": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", @@ -4754,24 +2350,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "license": "MIT", - "dependencies": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, "node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/ansi-styles": { @@ -4789,43 +2374,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/appdirsjs": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", - "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", - "license": "MIT" - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -4833,58 +2381,30 @@ "license": "MIT" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "license": "MIT", + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dequal": "^2.0.3" } }, "node_modules/asap": { @@ -4893,72 +2413,12 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, - "node_modules/ast-types": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/axios": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", @@ -4971,15 +2431,6 @@ "proxy-from-env": "^2.1.0" } }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "license": "MIT", - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", @@ -5020,60 +2471,29 @@ } }, "node_modules/babel-plugin-react-compiler": { - "version": "0.0.0-experimental-592953e-20240517", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-592953e-20240517.tgz", - "integrity": "sha512-OjG1SVaeQZaJrqkMFJatg8W/MTow8Ak5rx2SI0ETQBO1XvOk/XZGMbltNCPdFJLKghBYoBjC+Y3Ap/Xr7B01mA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "license": "MIT", "dependencies": { - "@babel/generator": "7.2.0", - "@babel/types": "^7.19.0", - "chalk": "4", - "invariant": "^2.2.4", - "pretty-format": "^24", - "zod": "^3.22.4", - "zod-validation-error": "^2.1.0" - } - }, - "node_modules/babel-plugin-react-compiler/node_modules/@babel/generator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", - "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.2.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.10", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "node_modules/babel-plugin-react-compiler/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/babel-plugin-react-compiler/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "@babel/types": "^7.26.0" } }, "node_modules/babel-plugin-react-native-web": { - "version": "0.19.13", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz", - "integrity": "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", + "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", "license": "MIT" }, + "node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.33.3.tgz", + "integrity": "sha512-/Z9xYdaJ1lC0pT9do6TqCqhOSLfZ5Ot8D5za1p+feEfWYupCOfGbhhEXN9r2ZgJtDNUNRw/Z+T2CvAGKBqtqWA==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.33.3" + } + }, "node_modules/babel-plugin-transform-flow-enums": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", @@ -5084,29 +2504,87 @@ } }, "node_modules/babel-preset-expo": { - "version": "11.0.15", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-11.0.15.tgz", - "integrity": "sha512-rgiMTYwqIPULaO7iZdqyL7aAff9QLOX6OWUtLZBlOrOTreGY1yHah/5+l8MvI6NVc/8Zj5LY4Y5uMSnJIuzTLw==", + "version": "56.0.14", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-56.0.14.tgz", + "integrity": "sha512-+JKVMYf3HajO3tPRA9DlKd/VhZOPTHyTzUo2yZajfMAoQ3l5VEdGVxm2MzX4DXMNKXwsC8GOeTRx7CrO/5dBDA==", "license": "MIT", "dependencies": { + "@babel/generator": "^7.20.5", + "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/preset-react": "^7.22.15", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.28.6", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.74.87", - "babel-plugin-react-compiler": "0.0.0-experimental-592953e-20240517", - "babel-plugin-react-native-web": "~0.19.10", - "react-refresh": "^0.14.2" + "@react-native/babel-plugin-codegen": "0.85.3", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.33.3", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "expo-widgets": "^56.0.16", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + }, + "expo-widgets": { + "optional": true + } } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/badgin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz", + "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==", "license": "MIT" }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -5139,18 +2617,6 @@ "node": ">=6.0.0" } }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "license": "MIT", - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -5160,44 +2626,19 @@ "node": ">=0.6" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/bplist-creator": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", - "integrity": "sha512-xp/tcaV3T5PCiaY04mXga7o/TE+t95gqeLmADeBI1CvZtdWTbgBt3uLpvh4UWtenKeBhCV6oVxGk38yZr2uYEA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "license": "MIT", "dependencies": { - "stream-buffers": "~2.2.0" + "stream-buffers": "2.2.x" } }, "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "license": "MIT", "dependencies": { "big-integer": "1.6.x" @@ -5207,13 +2648,15 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -5270,64 +2713,12 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "license": "MIT", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "license": "MIT" - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "license": "MIT" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "license": "MIT" - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -5337,98 +2728,6 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -5442,55 +2741,6 @@ "node": ">= 0.4" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "license": "MIT", - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "license": "MIT", - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -5539,24 +2789,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/chrome-launcher": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", @@ -5575,29 +2807,24 @@ "node": ">=12.13.0" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/chromium-edge-launcher": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz", + "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" }, "node_modules/cli-cursor": { "version": "2.1.0", @@ -5623,6 +2850,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -5637,50 +2870,15 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -5722,12 +2920,6 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "license": "MIT" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5740,12 +2932,6 @@ "node": ">= 0.8" } }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "license": "MIT" - }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -5755,21 +2941,6 @@ "node": ">= 10" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "license": "MIT" - }, - "node_modules/component-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.2.tgz", - "integrity": "sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5824,12 +2995,6 @@ "node": ">= 0.6" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -5866,24 +3031,6 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, "node_modules/core-js-compat": { "version": "3.49.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", @@ -5897,27 +3044,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "license": "MIT", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/cross-fetch": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", @@ -5941,24 +3067,6 @@ "node": ">= 8" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/css-in-js-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", @@ -5968,6 +3076,12 @@ "hyphenate-style-name": "^1.0.3" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "license": "MIT" + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -5975,78 +3089,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dag-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", - "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dayjs": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", - "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -6064,15 +3106,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -6082,15 +3115,6 @@ "node": ">=0.10" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -6100,19 +3124,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -6125,80 +3136,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "license": "MIT", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6208,12 +3145,6 @@ "node": ">=0.4.0" } }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", - "license": "MIT" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -6223,6 +3154,15 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6234,55 +3174,25 @@ } }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } + "node_modules/dnssd-advertise": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.4.tgz", + "integrity": "sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==", + "license": "MIT" }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -6298,12 +3208,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -6331,45 +3235,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-editor": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/envinfo": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", - "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -6379,91 +3244,6 @@ "stackframe": "^1.3.4" } }, - "node_modules/errorhandler": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.2.tgz", - "integrity": "sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "escape-html": "~1.0.3" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/es-abstract": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -6509,23 +3289,6 @@ "node": ">= 0.4" } }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -6553,19 +3316,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -6584,285 +3334,547 @@ "node": ">=6" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/expo": { - "version": "51.0.39", - "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.39.tgz", - "integrity": "sha512-Cs/9xopyzJrpXWbyVUZnr37rprdFJorRgfSp6cdBfvbjxZeKnw2MEu7wJwV/s626i5lZTPGjZPHUF9uQvt51cg==", + "version": "56.0.9", + "resolved": "https://registry.npmjs.org/expo/-/expo-56.0.9.tgz", + "integrity": "sha512-Zd/fhhyC600PO4cA14r+K+DlhhUZLNaDNF6dYg+hgne2kLvg9HMnkZ902sTPZYLkW56JOXLJ5dk7hsIoH26N2A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.18.31", - "@expo/config": "9.0.4", - "@expo/config-plugins": "8.0.11", - "@expo/metro-config": "0.18.11", - "@expo/vector-icons": "^14.0.3", - "babel-preset-expo": "~11.0.15", - "expo-asset": "~10.0.10", - "expo-file-system": "~17.0.1", - "expo-font": "~12.0.10", - "expo-keep-awake": "~13.0.2", - "expo-modules-autolinking": "1.11.3", - "expo-modules-core": "1.12.26", - "fbemitter": "^3.0.0", - "whatwg-url-without-unicode": "8.0.0-3" + "@expo/cli": "^56.1.14", + "@expo/config": "~56.0.9", + "@expo/config-plugins": "~56.0.8", + "@expo/devtools": "~56.0.2", + "@expo/dom-webview": "~56.0.5", + "@expo/fingerprint": "^0.19.4", + "@expo/local-build-cache-provider": "^56.0.8", + "@expo/log-box": "^56.0.12", + "@expo/metro": "~56.0.0", + "@expo/metro-config": "~56.0.13", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~56.0.14", + "expo-asset": "~56.0.16", + "expo-constants": "~56.0.17", + "expo-file-system": "~56.0.7", + "expo-font": "~56.0.5", + "expo-keep-awake": "~56.0.3", + "expo-modules-autolinking": "~56.0.15", + "expo-modules-core": "~56.0.15", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-minimum": "^0.1.2" }, "bin": { - "expo": "bin/cli" + "expo": "bin/cli", + "expo-modules-autolinking": "bin/autolinking", + "fingerprint": "bin/fingerprint" + }, + "peerDependencies": { + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-dom": "*", + "react-native": "*", + "react-native-web": "*", + "react-native-webview": "*" + }, + "peerDependenciesMeta": { + "@expo/dom-webview": { + "optional": true + }, + "@expo/metro-runtime": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native-web": { + "optional": true + }, + "react-native-webview": { + "optional": true + } + } + }, + "node_modules/expo-application": { + "version": "56.0.3", + "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-56.0.3.tgz", + "integrity": "sha512-DdGGPlMuM6cSTeKhbvh6OeLr2O/+EI5BHKYrD+Do8sJPYgLwzGrgESELfyjJCpEhFzT+TgKIdmLmWXhNUQnHiw==", + "license": "MIT", + "peerDependencies": { + "expo": "*" } }, "node_modules/expo-asset": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-10.0.10.tgz", - "integrity": "sha512-0qoTIihB79k+wGus9wy0JMKq7DdenziVx3iUkGvMAy2azscSgWH6bd2gJ9CGnhC6JRd3qTMFBL0ou/fx7WZl7A==", + "version": "56.0.16", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-56.0.16.tgz", + "integrity": "sha512-iIxPo6C6+/d8JxGV74ZKZbIcCz2s8//dVl7oBAj124NcPMFhzdwycFBpMqq5LUxin+lVy5cCoEjv2LD8ulnkiQ==", "license": "MIT", "dependencies": { - "expo-constants": "~16.0.0", - "invariant": "^2.2.4", - "md5-file": "^3.2.3" + "@expo/image-utils": "^0.10.1", + "expo-constants": "~56.0.17" }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-av": { + "version": "14.0.7", + "resolved": "https://registry.npmjs.org/expo-av/-/expo-av-14.0.7.tgz", + "integrity": "sha512-FvKZxyy+2/qcCmp+e1GTK3s4zH8ZO1RfjpqNxh7ARlS1oH8HPtk1AyZAMo52tHz3yQ3UIqxQ2YbI9CFb4065lA==", + "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-constants": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-16.0.2.tgz", - "integrity": "sha512-9tNY3OVO0jfiMzl7ngb6IOyR5VFzNoN5OOazUWoeGfmMqVB5kltTemRvKraK9JRbBKIw+SOYLEmF0sEqgFZ6OQ==", + "version": "56.0.17", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-56.0.17.tgz", + "integrity": "sha512-bU8iU1+7cI7QzfGQVnz2C1nlbXD08YPwD6h8ZEuNspgUuD2prXfmrhrdLe1GjCPYGw4hB3BNjWPjpenNyyymfQ==", "license": "MIT", "dependencies": { - "@expo/config": "~9.0.0", - "@expo/env": "~0.3.0" + "@expo/env": "~2.3.0" }, "peerDependencies": { - "expo": "*" + "expo": "*", + "react-native": "*" } }, "node_modules/expo-file-system": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-17.0.1.tgz", - "integrity": "sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw==", + "version": "56.0.7", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-56.0.7.tgz", + "integrity": "sha512-dcKzo8ShPloM7jgfnMcJStgQebhP8owVjCkNI/aX6NMFV1CYB8bxKGMdnzJ3mXk5nfaiW+F/lSKr2UIJ02WAUA==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-font": { + "version": "56.0.5", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-56.0.5.tgz", + "integrity": "sha512-WLoDu9hlEgPRKXJRR01HFLJ6Z2tFcORX/WFPRYBndmYc5kjQrFGH/j4BRaF3aBRPyYEAUXiUJybNLXkKCwEXQw==", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-glass-effect": { + "version": "56.0.4", + "resolved": "https://registry.npmjs.org/expo-glass-effect/-/expo-glass-effect-56.0.4.tgz", + "integrity": "sha512-xI9rXtDwi7RW82uAlfyaXO6+k21ApWJ2tHAWYqPr/FjfmZbKsgNJ4Q0iZzGPCwboqjTGxaRZ61SZxBl8hDt5iA==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-haptics": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-13.0.1.tgz", + "integrity": "sha512-qG0EOLDE4bROVT3DtUSyV9g3iB3YFu9j3711X7SNNEnBDXc+2/p3wGDPTnJvPW0ao6HG3/McAOrBQA5hVSdWng==", "license": "MIT", "peerDependencies": { "expo": "*" } }, - "node_modules/expo-font": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-12.0.10.tgz", - "integrity": "sha512-Q1i2NuYri3jy32zdnBaHHCya1wH1yMAsI+3CCmj9zlQzlhsS9Bdwcj2W3c5eU5FvH2hsNQy4O+O1NnM6o/pDaQ==", + "node_modules/expo-image-loader": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-4.7.0.tgz", + "integrity": "sha512-cx+MxxsAMGl9AiWnQUzrkJMJH4eNOGlu7XkLGnAXSJrRoIiciGaKqzeaD326IyCTV+Z1fXvIliSgNW+DscvD8g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-picker": { + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-15.0.7.tgz", + "integrity": "sha512-u8qiPZNfDb+ap6PJ8pq2iTO7JKX+ikAUQ0K0c7gXGliKLxoXgDdDmXxz9/6QdICTshJBJlBvI0MwY5NWu7A/uw==", "license": "MIT", "dependencies": { - "fontfaceobserver": "^2.1.0" + "expo-image-loader": "~4.7.0" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-keep-awake": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-13.0.2.tgz", - "integrity": "sha512-kKiwkVg/bY0AJ5q1Pxnm/GvpeB6hbNJhcFsoOWDh2NlpibhCLaHL826KHUM+WsnJRbVRxJ+K9vbPRHEMvFpVyw==", + "version": "56.0.3", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-56.0.3.tgz", + "integrity": "sha512-CLMJXtEiMKknD3Rpm8CRwE6ZJUzu2yCEmRk1sgfHAJ1zIbuEWY3dpPDubtsnuzWm+2k6Sru+yaFbYsvPWmTiBA==", "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-linking": { + "version": "56.0.13", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-56.0.13.tgz", + "integrity": "sha512-38YrpTh6xdiDxmYSDIUffDqev1hIcEggw2fZ3IZhNp2DVLF1xvqsbO6hJD1fuBKN8P34B3Ggc9Yy26fkqdfCOA==", + "license": "MIT", + "dependencies": { + "expo-constants": "~56.0.16", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-local-authentication": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/expo-local-authentication/-/expo-local-authentication-14.0.1.tgz", + "integrity": "sha512-kAwUD1wEqj1fhwQgIHlP4H/JV9AcX+NO3BJwhPM2HuCFS0kgx2wvcHisnKBSTRyl8u5Jt4odzMyQkDJystwUTg==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + }, "peerDependencies": { "expo": "*" } }, - "node_modules/expo-linking": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-6.3.1.tgz", - "integrity": "sha512-xuZCntSBGWCD/95iZ+mTUGTwHdy8Sx+immCqbUBxdvZ2TN61P02kKg7SaLS8A4a/hLrSCwrg5tMMwu5wfKr35g==", - "license": "MIT", - "dependencies": { - "expo-constants": "~16.0.0", - "invariant": "^2.2.4" - } - }, "node_modules/expo-modules-autolinking": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.11.3.tgz", - "integrity": "sha512-oYh8EZEvYF5TYppxEKUTTJmbr8j7eRRnrIxzZtMvxLTXoujThVPMFS/cbnSnf2bFm1lq50TdDNABhmEi7z0ngQ==", + "version": "56.0.15", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-56.0.15.tgz", + "integrity": "sha512-WqpBFwLzn7DsrUkWltIjVmAjwuI1VdQ2jRMlvk1nh2kVadwdJBkSjUBQWRifsEePNhiMT/rFOovBolUU/ARt5w==", "license": "MIT", "dependencies": { + "@expo/require-utils": "^56.1.3", + "@expo/spawn-async": "^1.8.0", "chalk": "^4.1.0", - "commander": "^7.2.0", - "fast-glob": "^3.2.5", - "find-up": "^5.0.0", - "fs-extra": "^9.1.0", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" + "commander": "^7.2.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, - "node_modules/expo-modules-autolinking/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/expo-modules-autolinking/node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/expo-modules-autolinking/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/expo-modules-core": { - "version": "1.12.26", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.12.26.tgz", - "integrity": "sha512-y8yDWjOi+rQRdO+HY+LnUlz8qzHerUaw/LUjKPU/mX8PRXP4UUPEEp5fjAwBU44xjNmYSHWZDwet4IBBE+yQUA==", + "version": "56.0.15", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-56.0.15.tgz", + "integrity": "sha512-XOXuWjtUA/xF8VjMHoRTRxuAmrAeUv8QyASX3h/CpTNS58fOt3stV8EYW7BinJPJyqwV7BZoYV83iN0p2FzyZw==", "license": "MIT", "dependencies": { + "@expo/expo-modules-macros-plugin": "~0.0.9", + "expo-modules-jsi": "~56.0.8", "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-worklets": "^0.7.4 || ^0.8.0" + }, + "peerDependenciesMeta": { + "react-native-worklets": { + "optional": true + } + } + }, + "node_modules/expo-modules-jsi": { + "version": "56.0.8", + "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-56.0.8.tgz", + "integrity": "sha512-tXqFU1MHrf7Ctq+Pw0qOeIPDFl1W51p9nRRZy9vVUn4GNuAk1Av0vrj0SGLvcxJvDf3aGwSzr8o8dgUsX5sG0g==", + "license": "MIT", + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/expo-notifications": { + "version": "56.0.16", + "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-56.0.16.tgz", + "integrity": "sha512-fg76oPZhs86aKQij2ZBkWeBUti98fA53BRbjgP/ysEl+GlzIsP4BQR4Lw1ORY4MqOCO8x/5V2oykAdFne9ITSg==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.10.1", + "abort-controller": "^3.0.0", + "badgin": "^1.1.5", + "expo-application": "~56.0.3", + "expo-constants": "~56.0.17" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-print": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/expo-print/-/expo-print-13.0.1.tgz", + "integrity": "sha512-o8LuCguGrkyC5RaWEfL5N2J0V9mfbZ3GVzLpaf3KU5RrdYzGEjoiv4xlhVVzh/++hMUqOgnIrtF7tzWYhwu/7g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" } }, "node_modules/expo-router": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-3.5.24.tgz", - "integrity": "sha512-wFi+PIUrOntF5cgg0PgBMlkxEZlWedIv5dWnPFEzN6Tr3A3bpsqdDLgOEIwvwd+pxn5DLzykTmg9EkQ1pPGspw==", + "version": "56.2.9", + "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-56.2.9.tgz", + "integrity": "sha512-MuGL7Ht8hFTo1ddntyXGw5Lh+5rBw8S/0wHCwtI88nv4aCSyLEuFE19i4E/G0BXVCTKeDRu/hOww3jEqUlAN2w==", "license": "MIT", "dependencies": { - "@expo/metro-runtime": "3.2.3", - "@expo/server": "^0.4.0", - "@radix-ui/react-slot": "1.0.1", - "@react-navigation/bottom-tabs": "~6.5.7", - "@react-navigation/native": "~6.1.6", - "@react-navigation/native-stack": "~6.9.12", - "expo-splash-screen": "0.27.7", - "react-native-helmet-async": "2.0.4", - "schema-utils": "^4.0.1" + "@expo/log-box": "^56.0.12", + "@expo/metro-runtime": "^56.0.14", + "@expo/schema-utils": "^56.0.0", + "@expo/ui": "^56.0.16", + "@radix-ui/react-slot": "^1.2.0", + "@radix-ui/react-tabs": "^1.1.12", + "@react-native-masked-view/masked-view": "^0.3.2", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/user-event": "^14.6.1", + "client-only": "^0.0.1", + "color": "^4.2.3", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "expo-glass-effect": "^56.0.4", + "expo-server": "^56.0.5", + "expo-symbols": "^56.0.6", + "fast-deep-equal": "^3.1.3", + "invariant": "^2.2.4", + "nanoid": "^3.3.8", + "query-string": "^7.1.3", + "react-fast-compare": "^3.2.2", + "react-is": "^19.1.0", + "react-native-drawer-layout": "^4.2.2", + "react-native-screens": "^4.25.2", + "server-only": "^0.0.1", + "sf-symbols-typescript": "^2.1.0", + "shallowequal": "^1.1.0", + "vaul": "^1.1.2" }, "peerDependencies": { - "@react-navigation/drawer": "^6.5.8", + "@expo/log-box": "^56.0.12", + "@expo/metro-runtime": "^56.0.14", + "@testing-library/react-native": ">= 13.2.0", "expo": "*", - "expo-constants": "*", - "expo-linking": "*", - "expo-status-bar": "*", + "expo-constants": "^56.0.17", + "expo-linking": "^56.0.13", + "react": "*", + "react-dom": "*", + "react-native": "*", + "react-native-gesture-handler": "*", "react-native-reanimated": "*", - "react-native-safe-area-context": "*", - "react-native-screens": "*" + "react-native-safe-area-context": ">= 5.4.0", + "react-native-screens": "^4.25.2", + "react-native-web": "*", + "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" }, "peerDependenciesMeta": { - "@react-navigation/drawer": { + "@testing-library/react-native": { "optional": true }, - "@testing-library/jest-native": { + "react-dom": { + "optional": true + }, + "react-native-gesture-handler": { "optional": true }, "react-native-reanimated": { "optional": true + }, + "react-native-web": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true } } }, + "node_modules/expo-router/node_modules/@expo/metro-runtime": { + "version": "56.0.14", + "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-56.0.14.tgz", + "integrity": "sha512-xqSWX7W1jd/B8MzDOJkc/iHAtIsHOMYrDya/jJkEj8A6XdN4XqtmxqfAQ2oWcpYi47vH97lECDp8aoP7jO6v0Q==", + "license": "MIT", + "dependencies": { + "@expo/log-box": "^56.0.12", + "anser": "^1.4.9", + "pretty-format": "^29.7.0", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0" + }, + "peerDependencies": { + "@expo/log-box": "^56.0.12", + "expo": "*", + "react": "*", + "react-dom": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-collection": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.9.tgz", + "integrity": "sha512-zuSVi7ziP7uQRqc+yGxsKJfNkdyHv3ZKDaHe0gzg4dRgws96TPKWIiz84tVHP4GEcEl8bC0mdt17NkcxaJHmaQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-slot": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-presence": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", + "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-primitive": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", + "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.12.tgz", + "integrity": "sha512-FvgPt1bRmg8Xt2QpF7NUZW3dE0ZQHGm41dAdgT2J2GJPoIXz+9Em3NobAxf4fupcxhgHu03E5CRiU2MWvObXyg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.9", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-tabs": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.14.tgz", + "integrity": "sha512-D5jwp9JNuwDeCw3CYD2Fz+sSHo0droQjC8u75dJHe4aWr5q6yBiXZU+hurXnKudRgEpUkD5TsI6bjHPo5ThUxA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-roving-focus": "1.1.12", + "@radix-ui/react-use-controllable-state": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "license": "MIT" + }, + "node_modules/expo-router/node_modules/react-native-screens": { + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.25.2.tgz", + "integrity": "sha512-1Nj1fusFd+rIMKU/qC9yGKVG+3ofh11d3OdBQKL1iVvQfKvcB8vhvTGQf2TkfxW3bamxN+hCZIXmNuU0mRkyDg==", + "license": "MIT", + "dependencies": { + "react-freeze": "^1.0.0", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "react": "*", + "react-native": ">=0.82.0" + } + }, + "node_modules/expo-screen-orientation": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/expo-screen-orientation/-/expo-screen-orientation-7.0.5.tgz", + "integrity": "sha512-1j0MzVzYpjKQo4BWowQ3ZYwC3OnddX/8k06C8VYTAxMyd8ou1k+rG4tm+GIV2n2RSzc3g7cfPlQwSYr3/SGmbg==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-secure-store": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-13.0.2.tgz", @@ -6872,13 +3884,33 @@ "expo": "*" } }, + "node_modules/expo-server": { + "version": "56.0.5", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-56.0.5.tgz", + "integrity": "sha512-SmM2p2g3Jrktpiazcst+OxhjSzOHXKAY4BPURHYHXvApzzoybMmrNF4IEZ8DKZ145BhSe4ydAmlEFCRTsdtgUQ==", + "license": "MIT", + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/expo-sharing": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/expo-sharing/-/expo-sharing-12.0.1.tgz", + "integrity": "sha512-wBT+WeXwapj/9NWuLJO01vi9bdlchYu/Q/xD8slL/Ls4vVYku8CPqzkTtDFcjLrjtlJqyeHsdQXwKLvORmBIew==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-splash-screen": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.27.7.tgz", - "integrity": "sha512-s+eGcG185878nixlrjhhLD6UDYrvoqBUaBkIEozBVWFg3pkdsKpONPiUAco4XR3h7I/9ODq4quN28RJLFO+s0Q==", + "version": "56.0.10", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-56.0.10.tgz", + "integrity": "sha512-vDIlo8hzt9HlCZQ0kSY66v83D1WEXOJbVMeyPDfXDu9tbDdPMNUyDpi4WGJXikAjxnAKfbt5Mv5NnEbxINy+VA==", "license": "MIT", "dependencies": { - "@expo/prebuild-config": "7.0.9" + "@expo/config-plugins": "~56.0.8", + "@expo/image-utils": "^0.10.1", + "xml2js": "0.6.0" }, "peerDependencies": { "expo": "*" @@ -6890,6 +3922,207 @@ "integrity": "sha512-/t3xdbS8KB0prj5KG5w7z+wZPFlPtkgs95BsmrP/E7Q0xHXTcDcQ6Cu2FkFuRM+PKTb17cJDnLkawyS5vDLxMA==", "license": "MIT" }, + "node_modules/expo-symbols": { + "version": "56.0.6", + "resolved": "https://registry.npmjs.org/expo-symbols/-/expo-symbols-56.0.6.tgz", + "integrity": "sha512-BrA81DjcNafdj7gXVhdrExb9LtUiSVyOf/NavyMmDAHgHMY1GqeR5cnn1PSAZeYKnSgQhee/H89XUpAxtog5hg==", + "license": "MIT", + "dependencies": { + "@expo-google-fonts/material-symbols": "^0.4.1", + "sf-symbols-typescript": "^2.0.0" + }, + "peerDependencies": { + "expo": "*", + "expo-font": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/@expo/cli": { + "version": "56.1.14", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-56.1.14.tgz", + "integrity": "sha512-rSH3ygjEPipEYG6dgiJ116J8KqCQ/BYKcwQDipStSh4IFWJ10RZaYP4u5B74jxfeIWjWrOeqvwB6NZfQBjaQ4Q==", + "license": "MIT", + "dependencies": { + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~56.0.9", + "@expo/config-plugins": "~56.0.8", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.3.0", + "@expo/image-utils": "^0.10.1", + "@expo/inline-modules": "^0.0.11", + "@expo/json-file": "^10.2.0", + "@expo/log-box": "^56.0.12", + "@expo/metro": "~56.0.0", + "@expo/metro-config": "~56.0.13", + "@expo/metro-file-map": "^56.0.3", + "@expo/osascript": "^2.6.0", + "@expo/package-manager": "^1.12.1", + "@expo/plist": "^0.7.0", + "@expo/prebuild-config": "^56.0.15", + "@expo/require-utils": "^56.1.3", + "@expo/router-server": "^56.0.13", + "@expo/schema-utils": "^56.0.0", + "@expo/spawn-async": "^1.8.0", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.4.4", + "@react-native/dev-middleware": "0.85.3", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "debug": "^4.3.4", + "dnssd-advertise": "^1.1.4", + "expo-server": "^56.0.5", + "fetch-nodeshim": "^0.4.10", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.2.1", + "multitars": "^1.0.0", + "node-forge": "^1.3.3", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^4.0.4", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "terminal-link": "^2.1.1", + "toqr": "^0.1.1", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1", + "zod": "^3.25.76" + }, + "bin": { + "expo-internal": "main.js" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": { + "version": "56.0.13", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-56.0.13.tgz", + "integrity": "sha512-M2H2zHlRBKIPENCWV8Gqo3/9WANCS9vvOMCcdWfS9wD8XXMnDASFniS0bBoGwwS1qq1LIpYzX8m8wdv7Awy88g==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "@expo/metro-runtime": "^56.0.14", + "expo": "*", + "expo-constants": "^56.0.17", + "expo-font": "^56.0.5", + "expo-router": "*", + "expo-server": "^56.0.5", + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" + }, + "peerDependenciesMeta": { + "@expo/metro-runtime": { + "optional": true + }, + "expo-router": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/expo/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expo/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/expo/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expo/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", @@ -6902,69 +4135,22 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-loops": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.4.tgz", "integrity": "sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg==", "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fast-xml-parser": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.6.tgz", - "integrity": "sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.0.5" - }, + "node_modules/fb-dotslash": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", + "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", + "license": "(MIT OR Apache-2.0)", "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "dotslash": "bin/dotslash" + }, + "engines": { + "node": ">=20" } }, "node_modules/fb-watchman": { @@ -6976,15 +4162,6 @@ "bser": "2.1.1" } }, - "node_modules/fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "license": "BSD-3-Clause", - "dependencies": { - "fbjs": "^3.0.0" - } - }, "node_modules/fbjs": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", @@ -7032,10 +4209,27 @@ "node": "*" } }, - "node_modules/fetch-retry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", - "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-nodeshim": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.10.tgz", + "integrity": "sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==", "license": "MIT" }, "node_modules/fill-range": { @@ -7092,60 +4286,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2" - } - }, "node_modules/flow-enums-runtime": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "license": "MIT" }, - "node_modules/flow-parser": { - "version": "0.316.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.316.0.tgz", - "integrity": "sha512-LPYw2hWIj6BI/854eY47jBJVN4gmrIK0kL/EY2xgPmu83Ho37no0mkhDgG6GOX25YxtaXJw5sMkMed2bKntcog==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -7172,49 +4318,6 @@ "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "license": "BSD-2-Clause" }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", @@ -7231,15 +4334,6 @@ "node": ">= 6" } }, - "node_modules/freeport-async": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", - "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -7249,52 +4343,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -7304,44 +4352,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7384,6 +4394,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -7397,113 +4416,32 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/getenv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", - "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -7522,42 +4460,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", - "license": "MIT", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7567,33 +4469,6 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -7633,83 +4508,78 @@ "node": ">= 0.4" } }, + "node_modules/hermes-compiler": { + "version": "250829098.0.10", + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.10.tgz", + "integrity": "sha512-TcRlZ0/TlyfJqquRFAWoyElVNnkdYRi/sEp4/Qy8/GYxjg8j2cS9D4MjuaQ+qimkmLN7AmO+44IznRf06mAr0w==", + "license": "MIT" + }, "node_modules/hermes-estree": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz", - "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==", + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz", + "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==", "license": "MIT" }, "node_modules/hermes-parser": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz", - "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==", + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz", + "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==", "license": "MIT", "dependencies": { - "hermes-estree": "0.19.1" + "hermes-estree": "0.33.3" } }, - "node_modules/hermes-profile-transformer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", - "license": "MIT", + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=8" + "react-is": "^16.7.0" } }, "node_modules/hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -7728,41 +4598,12 @@ "node": ">= 6" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/hyphenate-style-name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", "license": "BSD-3-Clause" }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -7787,37 +4628,6 @@ "node": ">=16.x" } }, - "node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "license": "MIT", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -7827,29 +4637,12 @@ "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/inline-style-prefixer": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz", @@ -7860,33 +4653,6 @@ "fast-loops": "^1.1.3" } }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "license": "MIT", - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -7896,131 +4662,12 @@ "loose-envify": "^1.0.0" } }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", "license": "MIT" }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "license": "MIT" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", @@ -8036,48 +4683,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -8093,136 +4698,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", - "license": "MIT", - "dependencies": { - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8232,221 +4716,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", - "license": "MIT", - "dependencies": { - "is-invalid-path": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -8459,94 +4728,12 @@ "node": ">=8" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -8556,142 +4743,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-message-util/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -8709,39 +4760,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-util/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "node": ">=8" } }, "node_modules/jest-util/node_modules/picomatch": { @@ -8773,73 +4804,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-validate/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -8876,25 +4840,6 @@ "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "license": "MIT" }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/join-component": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", - "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==", - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8902,63 +4847,33 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsc-android": { - "version": "250231.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", - "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", - "license": "BSD-2-Clause" - }, "node_modules/jsc-safe-url": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "license": "0BSD" }, - "node_modules/jscodeshift": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.21.0", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -8971,48 +4886,6 @@ "node": ">=6" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "license": "MIT" - }, - "node_modules/json-schema-deref-sync": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz", - "integrity": "sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==", - "license": "MIT", - "dependencies": { - "clone": "^2.1.2", - "dag-map": "~1.0.0", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.13", - "md5": "~2.2.0", - "memory-cache": "~0.2.0", - "traverse": "~0.6.6", - "valid-url": "~1.0.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/json-schema-deref-sync/node_modules/md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", - "license": "BSD-3-Clause", - "dependencies": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9025,24 +4898,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9052,6 +4907,15 @@ "node": ">=6" } }, + "node_modules/lan-network": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.2.1.tgz", + "integrity": "sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==", + "license": "MIT", + "bin": { + "lan-network": "dist/lan-network-cli.js" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -9087,12 +4951,12 @@ "license": "MIT" }, "node_modules/lightningcss": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.19.0.tgz", - "integrity": "sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "license": "MPL-2.0", "dependencies": { - "detect-libc": "^1.0.3" + "detect-libc": "^2.0.3" }, "engines": { "node": ">= 12.0.0" @@ -9102,20 +4966,43 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.19.0", - "lightningcss-darwin-x64": "1.19.0", - "lightningcss-linux-arm-gnueabihf": "1.19.0", - "lightningcss-linux-arm64-gnu": "1.19.0", - "lightningcss-linux-arm64-musl": "1.19.0", - "lightningcss-linux-x64-gnu": "1.19.0", - "lightningcss-linux-x64-musl": "1.19.0", - "lightningcss-win32-x64-msvc": "1.19.0" + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz", - "integrity": "sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], @@ -9133,9 +5020,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz", - "integrity": "sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", "cpu": [ "x64" ], @@ -9152,10 +5039,30 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz", - "integrity": "sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", "cpu": [ "arm" ], @@ -9173,9 +5080,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz", - "integrity": "sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", "cpu": [ "arm64" ], @@ -9193,9 +5100,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz", - "integrity": "sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", "cpu": [ "arm64" ], @@ -9213,9 +5120,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz", - "integrity": "sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "cpu": [ "x64" ], @@ -9233,9 +5140,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz", - "integrity": "sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "cpu": [ "x64" ], @@ -9252,12 +5159,12 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz", - "integrity": "sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "cpu": [ - "x64" + "arm64" ], "license": "MPL-2.0", "optional": true, @@ -9272,25 +5179,24 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lodash": { @@ -9394,168 +5300,6 @@ "node": ">=4" } }, - "node_modules/logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "license": "MIT", - "dependencies": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "bin": { - "logkitty": "bin/logkitty.js" - } - }, - "node_modules/logkitty/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/logkitty/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/logkitty/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logkitty/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" - }, - "node_modules/logkitty/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -9577,28 +5321,6 @@ "yallist": "^3.0.2" } }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -9623,110 +5345,60 @@ "node": ">= 0.4" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "license": "BSD-3-Clause", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/md5-file": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", - "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", - "license": "MIT", - "dependencies": { - "buffer-alloc": "^1.1.0" - }, - "bin": { - "md5-file": "cli.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/md5hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", - "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==", - "license": "MIT" - }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "license": "MIT" }, - "node_modules/memory-cache": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", - "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", - "license": "BSD-2-Clause" - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/metro": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.12.tgz", - "integrity": "sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.4.tgz", + "integrity": "sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "accepts": "^1.3.7", - "chalk": "^4.0.0", + "@babel/code-frame": "^7.29.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "accepts": "^2.0.0", "ci-info": "^2.0.0", "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", + "debug": "^4.4.0", "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", - "hermes-parser": "0.23.1", + "hermes-parser": "0.35.0", "image-size": "^1.0.2", "invariant": "^2.2.4", - "jest-worker": "^29.6.3", + "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.80.12", - "metro-cache": "0.80.12", - "metro-cache-key": "0.80.12", - "metro-config": "0.80.12", - "metro-core": "0.80.12", - "metro-file-map": "0.80.12", - "metro-resolver": "0.80.12", - "metro-runtime": "0.80.12", - "metro-source-map": "0.80.12", - "metro-symbolicate": "0.80.12", - "metro-transform-plugins": "0.80.12", - "metro-transform-worker": "0.80.12", - "mime-types": "^2.1.27", + "metro-babel-transformer": "0.84.4", + "metro-cache": "0.84.4", + "metro-cache-key": "0.84.4", + "metro-config": "0.84.4", + "metro-core": "0.84.4", + "metro-file-map": "0.84.4", + "metro-resolver": "0.84.4", + "metro-runtime": "0.84.4", + "metro-source-map": "0.84.4", + "metro-symbolicate": "0.84.4", + "metro-transform-plugins": "0.84.4", + "metro-transform-worker": "0.84.4", + "mime-types": "^3.0.1", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", "throat": "^5.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" @@ -9735,361 +5407,299 @@ "metro": "src/cli.js" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-babel-transformer": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz", - "integrity": "sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.4.tgz", + "integrity": "sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==", "license": "MIT", "dependencies": { - "@babel/core": "^7.20.0", + "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.23.1", + "hermes-parser": "0.35.0", + "metro-cache-key": "0.84.4", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", - "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", + "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", "license": "MIT" }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", - "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", + "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", "license": "MIT", "dependencies": { - "hermes-estree": "0.23.1" + "hermes-estree": "0.35.0" } }, "node_modules/metro-cache": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.12.tgz", - "integrity": "sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.4.tgz", + "integrity": "sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==", "license": "MIT", "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", - "metro-core": "0.80.12" + "https-proxy-agent": "^7.0.5", + "metro-core": "0.84.4" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-cache-key": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.12.tgz", - "integrity": "sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.4.tgz", + "integrity": "sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/metro-cache/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/metro-cache/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/metro-config": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.12.tgz", - "integrity": "sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.4.tgz", + "integrity": "sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==", "license": "MIT", "dependencies": { "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.6.3", - "metro": "0.80.12", - "metro-cache": "0.80.12", - "metro-core": "0.80.12", - "metro-runtime": "0.80.12" + "jest-validate": "^29.7.0", + "metro": "0.84.4", + "metro-cache": "0.84.4", + "metro-core": "0.84.4", + "metro-runtime": "0.84.4", + "yaml": "^2.6.1" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-core": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.12.tgz", - "integrity": "sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.4.tgz", + "integrity": "sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.80.12" + "metro-resolver": "0.84.4" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-file-map": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.12.tgz", - "integrity": "sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.4.tgz", + "integrity": "sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==", "license": "MIT", "dependencies": { - "anymatch": "^3.0.3", - "debug": "^2.2.0", + "debug": "^4.4.0", "fb-watchman": "^2.0.0", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", - "jest-worker": "^29.6.3", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", - "node-abort-controller": "^3.1.1", "nullthrows": "^1.1.1", "walker": "^1.0.7" }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, - "node_modules/metro-file-map/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro-file-map/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/metro-minify-terser": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz", - "integrity": "sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.4.tgz", + "integrity": "sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-resolver": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.12.tgz", - "integrity": "sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.4.tgz", + "integrity": "sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-runtime": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.12.tgz", - "integrity": "sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.4.tgz", + "integrity": "sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-source-map": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.12.tgz", - "integrity": "sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.4.tgz", + "integrity": "sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.80.12", + "metro-symbolicate": "0.84.4", "nullthrows": "^1.1.1", - "ob1": "0.80.12", + "ob1": "0.84.4", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "engines": { - "node": ">=18" - } - }, - "node_modules/metro-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-symbolicate": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz", - "integrity": "sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.4.tgz", + "integrity": "sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.80.12", + "metro-source-map": "0.84.4", "nullthrows": "^1.1.1", "source-map": "^0.5.6", - "through2": "^2.0.1", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" }, "engines": { - "node": ">=18" - } - }, - "node_modules/metro-symbolicate/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-transform-plugins": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz", - "integrity": "sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.4.tgz", + "integrity": "sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==", "license": "MIT", "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-transform-worker": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz", - "integrity": "sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.4.tgz", + "integrity": "sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==", "license": "MIT", "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "flow-enums-runtime": "^0.0.6", - "metro": "0.80.12", - "metro-babel-transformer": "0.80.12", - "metro-cache": "0.80.12", - "metro-cache-key": "0.80.12", - "metro-minify-terser": "0.80.12", - "metro-source-map": "0.80.12", - "metro-transform-plugins": "0.80.12", + "metro": "0.84.4", + "metro-babel-transformer": "0.84.4", + "metro-cache": "0.84.4", + "metro-cache-key": "0.84.4", + "metro-minify-terser": "0.84.4", + "metro-source-map": "0.84.4", + "metro-transform-plugins": "0.84.4", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" - } - }, - "node_modules/metro/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT" - }, - "node_modules/metro/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro/node_modules/hermes-estree": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", - "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", + "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", "license": "MIT" }, "node_modules/metro/node_modules/hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", - "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", + "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", "license": "MIT", "dependencies": { - "hermes-estree": "0.23.1" + "hermes-estree": "0.35.0" } }, - "node_modules/metro/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/metro/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", + "node_modules/metro/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/metro/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/metro/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "mime-db": "^1.54.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", - "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" + "node": ">=18" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/micromatch": { @@ -10118,15 +5728,15 @@ } }, "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, "node_modules/mime-db": { @@ -10159,25 +5769,28 @@ "node": ">=4" } }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minipass": { @@ -10189,109 +5802,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", - "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -10304,32 +5814,49 @@ "node": ">=10" } }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/msgpackr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-2.0.2.tgz", + "integrity": "sha512-c5hYOXFbP79Slh6Dzd2wzk+jnV7mX1UxfMYtilnY1NmalXPqG8DGb5cYCMBrW4AsH3zekBBZd4QrKz9NhtvYLQ==", "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "optionalDependencies": { + "msgpackr-extract": "^3.0.4" } }, + "node_modules/msgpackr-extract": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", + "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" + } + }, + "node_modules/multitars": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/multitars/-/multitars-1.0.0.tgz", + "integrity": "sha512-H/J4fMLedtudftaYMOg7ajzLYgT3/rwbWVJbqr/iUgB8DQztn38ys5HOqI1CzSxx8QhXXwOOnnBvd4v3jG5+Mg==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", @@ -10349,59 +5876,14 @@ } }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/nested-error-stacks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "license": "MIT" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "license": "MIT" - }, - "node_modules/nocache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", - "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "license": "MIT" - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -10431,6 +5913,21 @@ "node": ">= 6.13.0" } }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -10446,68 +5943,31 @@ "node": ">=18" } }, - "node_modules/node-stream-zip": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/antelle" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-package-arg": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", - "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "license": "ISC", "dependencies": { - "hosted-git-info": "^3.0.2", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm-package-arg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "license": "ISC", "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/nullthrows": { @@ -10517,15 +5977,15 @@ "license": "MIT" }, "node_modules/ob1": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.12.tgz", - "integrity": "sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.4.tgz", + "integrity": "sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/object-assign": { @@ -10537,47 +5997,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -10599,15 +6018,6 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -10621,17 +6031,16 @@ } }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10654,6 +6063,15 @@ "node": ">=6" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ora/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -10713,6 +6131,18 @@ "node": ">=4" } }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/ora/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10725,134 +6155,6 @@ "node": ">=4" } }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/parse-png": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", @@ -10874,24 +6176,6 @@ "node": ">= 0.8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -10908,34 +6192,28 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": "20 || >=22" } }, "node_modules/picocolors": { @@ -10945,108 +6223,17 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.2.tgz", - "integrity": "sha512-cfDHL6LStTEKlNilboNtobT/kEa30PtAf2Q1OgszfrG/rpVl1xaFWT9ktfkS306GmHgmnad1Sw4wabhlvFtsTw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/plist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", @@ -11070,15 +6257,6 @@ "node": ">=14.6" } }, - "node_modules/plist/node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, "node_modules/pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", @@ -11088,19 +6266,10 @@ "node": ">=4.0.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -11117,7 +6286,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -11131,58 +6300,36 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "license": "MIT", "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/proc-log": { @@ -11194,12 +6341,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -11231,6 +6372,17 @@ "node": ">= 6" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/proxy-from-env": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", @@ -11240,33 +6392,6 @@ "node": ">=10" } }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", @@ -11285,16 +6410,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -11304,26 +6419,6 @@ "inherits": "~2.0.3" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -11333,21 +6428,6 @@ "node": ">= 0.6" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -11361,36 +6441,15 @@ } }, "node_modules/react-devtools-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.2.tgz", - "integrity": "sha512-crr9HkVrDiJ0A4zot89oS0Cgv0Oa4OG1Em4jit3P3ZxZSKPMYyMjfwMqgcJna9o625g8oN87rBm8SWWrSTBZxg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", + "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "license": "MIT", "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", - "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -11438,77 +6497,95 @@ "license": "MIT" }, "node_modules/react-native": { - "version": "0.74.5", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.74.5.tgz", - "integrity": "sha512-Bgg2WvxaGODukJMTZFTZBNMKVaROHLwSb8VAGEdrlvKwfb1hHg/3aXTUICYk7dwgAnb+INbGMwnF8yeAgIUmqw==", + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.85.3.tgz", + "integrity": "sha512-HN/fGC+3nZVcDNcw7gfbM/DuqZAvI9Mz+/SxuhODaua4JY0BPzhfTzWXRyTR4mRgMHmShTPpH2PYMTxvZrsdZA==", "license": "MIT", "dependencies": { - "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "13.6.9", - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-platform-ios": "13.6.9", - "@react-native/assets-registry": "0.74.87", - "@react-native/codegen": "0.74.87", - "@react-native/community-cli-plugin": "0.74.87", - "@react-native/gradle-plugin": "0.74.87", - "@react-native/js-polyfills": "0.74.87", - "@react-native/normalize-colors": "0.74.87", - "@react-native/virtualized-lists": "0.74.87", + "@react-native/assets-registry": "0.85.3", + "@react-native/codegen": "0.85.3", + "@react-native/community-cli-plugin": "0.85.3", + "@react-native/gradle-plugin": "0.85.3", + "@react-native/js-polyfills": "0.85.3", + "@react-native/normalize-colors": "0.85.3", + "@react-native/virtualized-lists": "0.85.3", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", + "babel-plugin-syntax-hermes-parser": "0.33.3", "base64-js": "^1.5.1", - "chalk": "^4.0.0", - "event-target-shim": "^5.0.1", + "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", + "hermes-compiler": "250829098.0.10", "invariant": "^2.2.4", - "jest-environment-node": "^29.6.3", - "jsc-android": "^250231.0.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.3", - "metro-source-map": "^0.80.3", - "mkdirp": "^0.5.1", + "metro-runtime": "^0.84.3", + "metro-source-map": "^0.84.3", "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", + "pretty-format": "^29.7.0", "promise": "^8.3.0", - "react-devtools-core": "^5.0.0", + "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", - "react-shallow-renderer": "^16.15.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", + "scheduler": "0.27.0", + "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", + "tinyglobby": "^0.2.15", "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", + "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { "react-native": "cli.js" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "peerDependencies": { - "@types/react": "^18.2.6", - "react": "18.2.0" + "@react-native/jest-preset": "0.85.3", + "@types/react": "^19.1.1", + "react": "^19.2.3" }, "peerDependenciesMeta": { + "@react-native/jest-preset": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/react-native-helmet-async": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-native-helmet-async/-/react-native-helmet-async-2.0.4.tgz", - "integrity": "sha512-m3CkXWss6B1dd6mCMleLpzDCJJGGaHOLQsUzZv8kAASJmMfmVT4d2fx375iXKTRWT25ThBfae3dECuX5cq/8hg==", - "license": "Apache-2.0", + "node_modules/react-native-drawer-layout": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/react-native-drawer-layout/-/react-native-drawer-layout-4.2.4.tgz", + "integrity": "sha512-l1Le5HcVidobnJm8xqFZo46Rs8FDHdxbTZhkjxpNSRgU+QMoQXilOfzTHAeNjEGiKVGgIs9cW3ctXeHqgp5jJg==", + "license": "MIT", "dependencies": { - "invariant": "^2.2.4", - "react-fast-compare": "^3.2.2", - "shallowequal": "^1.1.0" + "color": "^4.2.3", + "use-latest-callback": "^0.2.4" }, "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0" + "react": ">= 18.2.0", + "react-native": "*", + "react-native-gesture-handler": ">= 2.0.0", + "react-native-reanimated": ">= 2.0.0" + } + }, + "node_modules/react-native-gesture-handler": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.16.2.tgz", + "integrity": "sha512-vGFlrDKlmyI+BT+FemqVxmvO7nqxU33cgXVsn6IKAFishvlG3oV2Ds67D5nPkHMea8T+s1IcuMm0bF8ntZtAyg==", + "license": "MIT", + "dependencies": { + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" } }, "node_modules/react-native-safe-area-context": { @@ -11561,80 +6638,42 @@ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", "license": "MIT" }, - "node_modules/react-native/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, "node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.87.tgz", - "integrity": "sha512-Xh7Nyk/MPefkb0Itl5Z+3oOobeG9lfLb7ZOY2DKpFnoCE1TzBmib9vMNdFaLdSxLIP+Ec6icgKtdzYg8QUPYzA==", + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.85.3.tgz", + "integrity": "sha512-hj0PScZEhIbcOvQV5yMKX3ha4XEIOy/SVE1Rrpp0beW0dpNLOgSC7KDxGewmDnIHK9YdQUXGY9eMEfShUMIaZw==", "license": "MIT" }, - "node_modules/react-native/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/react-native/node_modules/@react-native/virtualized-lists": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.85.3.tgz", + "integrity": "sha512-dsCjI//OIPEUJMyNHp4l7zNLVjCx7bcaRUceOCkU+IB17hkbtbGWvi7HjGFSzy7FJGmS/MOlcfpb72xXiy1Oig==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/react-native/node_modules/@types/yargs": { - "version": "15.0.20", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.20.tgz", - "integrity": "sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/react-native/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/react-native/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 10" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + }, + "peerDependencies": { + "@types/react": "^19.2.0", + "react": "*", + "react-native": "0.85.3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" } }, "node_modules/react-native/node_modules/promise": { @@ -11646,19 +6685,16 @@ "asap": "~2.0.6" } }, - "node_modules/react-native/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.4.tgz", - "integrity": "sha512-PNIUUyLI5YpkJZj60YBzX1o0ByQ4ovvfmq9N/Kig/PAYbVlGyz4R6G0SEWrD0O9acc0sT2+IdMBVLFv8FSi0Nw==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" + "node_modules/react-native/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/react-refresh": { @@ -11670,90 +6706,86 @@ "node": ">=0.10.0" } }, - "node_modules/react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", "license": "MIT", "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" }, "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/readable-stream": { + "node_modules/react-remove-scroll-bar": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/readline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "license": "BSD" - }, - "node_modules/recast": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", - "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "license": "MIT", "dependencies": { - "ast-types": "0.15.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" }, "engines": { - "node": ">= 4" + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/regenerate": { @@ -11780,26 +6812,6 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT" }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpu-core": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", @@ -11835,12 +6847,6 @@ "regjsparser": "bin/parser" } }, - "node_modules/remove-trailing-slash": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", - "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==", - "license": "MIT" - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -11850,43 +6856,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" - }, - "node_modules/requireg": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", - "dependencies": { - "nested-error-stacks": "~2.0.1", - "rc": "~1.2.7", - "resolve": "~1.7.1" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/requireg/node_modules/resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "license": "MIT", - "dependencies": { - "path-parse": "^1.0.5" - } - }, "node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", @@ -11923,15 +6892,6 @@ "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", "license": "MIT" }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -11945,80 +6905,6 @@ "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -12039,45 +6925,6 @@ ], "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/sax": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", @@ -12088,45 +6935,10 @@ } }, "node_modules/scheduler": { - "version": "0.24.0-canary-efb381bbf-20230505", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", - "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", @@ -12138,24 +6950,24 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -12176,16 +6988,13 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/send/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, "node_modules/send/node_modules/on-finished": { @@ -12201,9 +7010,9 @@ } }, "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -12233,21 +7042,6 @@ "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-static/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/serve-static/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -12257,141 +7051,12 @@ "node": ">= 0.8" } }, - "node_modules/serve-static/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/serve-static/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "node_modules/server-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", + "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", "license": "MIT" }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -12404,16 +7069,13 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/sf-symbols-typescript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz", + "integrity": "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==", "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/shallowequal": { @@ -12455,78 +7117,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -12544,27 +7134,6 @@ "plist": "^3.0.5" } }, - "node_modules/simple-plist/node_modules/bplist-creator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/simple-plist/node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", @@ -12574,68 +7143,12 @@ "is-arrayish": "^0.3.1" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, "node_modules/slugify": { "version": "1.6.9", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", @@ -12646,12 +7159,12 @@ } }, "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { - "node": ">= 12" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { @@ -12691,45 +7204,6 @@ "node": ">=6" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", @@ -12757,19 +7231,6 @@ "node": ">= 0.6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-buffers": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", @@ -12779,12 +7240,6 @@ "node": ">= 0.10.0" } }, - "node_modules/stream-slice": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz", - "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==", - "license": "MIT" - }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -12794,21 +7249,6 @@ "node": ">=4" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -12823,151 +7263,7 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -12979,54 +7275,18 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, "node_modules/structured-headers": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", @@ -13039,65 +7299,6 @@ "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==", "license": "MIT" }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT" - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13135,140 +7336,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "license": "MIT", - "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/tempy": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.7.1.tgz", - "integrity": "sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==", - "license": "MIT", - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -13309,47 +7376,26 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT" }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tmpl": { @@ -13379,65 +7425,24 @@ "node": ">=0.6" } }, + "node_modules/toqr": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz", + "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==", + "license": "MIT" + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, - "node_modules/traverse": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz", - "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==", - "license": "MIT", - "dependencies": { - "gopd": "^1.2.0", - "typedarray.prototype.slice": "^1.0.5", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/turbo-stream": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.1.tgz", - "integrity": "sha512-v8kOJXpG3WoTN/+at8vK7erSzo6nW6CIaeOvNOkHQVDajfz1ZVeSxCbc6tOH4hrGZW7VUCV0TOXd8CPzYnYkrw==", - "license": "ISC" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", @@ -13447,106 +7452,10 @@ "node": ">=8" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", - "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "for-each": "^0.3.5", - "gopd": "^1.2.0", - "is-typed-array": "^1.1.15", - "possible-typed-array-names": "^1.1.0", - "reflect.getprototypeof": "^1.0.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray.prototype.slice": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz", - "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "math-intrinsics": "^1.1.0", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-offset": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "license": "Apache-2.0", "bin": { @@ -13557,37 +7466,10 @@ "node": ">=14.17" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.26.0.tgz", - "integrity": "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -13630,51 +7512,6 @@ "node": ">=4" } }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -13714,11 +7551,26 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==", - "license": "MIT" + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, "node_modules/use-latest-callback": { "version": "0.2.6", @@ -13729,25 +7581,28 @@ "react": ">=16.8" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -13758,27 +7613,22 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" - }, "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/vary": { @@ -13790,6 +7640,177 @@ "node": ">= 0.8" } }, + "node_modules/vaul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-dialog": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.16.tgz", + "integrity": "sha512-l9ok83YBclEZhbjgzt76Hw733e6cvRKPNgO6GJ/IETlufXG9p+fRu2wlvpImQvR6xdJ8h7J8J2DBvsPEiEsKMw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.12", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.9", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-portal": "1.1.11", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-slot": "1.2.5", + "@radix-ui/react-use-controllable-state": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.12.tgz", + "integrity": "sha512-MhoruH6xEzsbvOmo4TNgMfmtvRGyDZw4MDSdf4ybMHfezjqwzv6hyd4lsMzBp8K9Sn6sGzCF62x1I7BYUECXOg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-escape-keydown": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.9.tgz", + "integrity": "sha512-9Se8t+Zry+1rEOL7Y6l/4ANYU/TOtAtf8O2fKdwLltcaMcm6kOqYGbzO4tMFQ0bvzO920pRAoHpFZ4W85S3keQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-use-callback-ref": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-portal": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.11.tgz", + "integrity": "sha512-UEytdjgEh2tJGgD/gZK4FUx6t1rNIlM3U0DENhSrG7I75FGm1DnaDuVUWF1pWAWUwGmn1sCJ1VGHn8LhN1aTOw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-presence": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", + "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-primitive": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", + "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", @@ -13820,27 +7841,6 @@ "defaults": "^1.0.3" } }, - "node_modules/web-encoding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", - "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", - "license": "MIT", - "dependencies": { - "util": "^0.12.3" - }, - "optionalDependencies": { - "@zxing/text-encoding": "0.9.0" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -13863,28 +7863,11 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/whatwg-url-without-unicode": { - "version": "8.0.0-3", - "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", - "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", - "license": "MIT", - "dependencies": { - "buffer": "^5.4.3", - "punycode": "^2.1.1", - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/whatwg-url-without-unicode/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } + "node_modules/whatwg-url-minimum": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.2.tgz", + "integrity": "sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==", + "license": "MIT" }, "node_modules/which": { "version": "2.0.2", @@ -13901,109 +7884,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.21.tgz", - "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wonka": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", - "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==", - "license": "MIT" - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -14021,94 +7901,17 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -14132,16 +7935,6 @@ "node": ">=10.0.0" } }, - "node_modules/xcode/node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/xml2js": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", @@ -14165,23 +7958,14 @@ } }, "node_modules/xmlbuilder": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz", - "integrity": "sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", "engines": { "node": ">=8.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -14239,18 +8023,6 @@ "node": ">=12" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", @@ -14259,18 +8031,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/zod-validation-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-2.1.0.tgz", - "integrity": "sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.18.0" - } } } } diff --git a/package.json b/package.json index 073fc8f0..70845958 100644 --- a/package.json +++ b/package.json @@ -10,25 +10,35 @@ "build:ios": "eas build --platform ios" }, "dependencies": { - "expo": "~51.0.28", - "expo-router": "~3.5.23", - "expo-status-bar": "~1.12.1", + "@expo/metro-runtime": "~3.2.3", + "@react-native-community/netinfo": "11.3.1", + "axios": "^1.7.7", + "expo": "^56.0.9", + "expo-av": "~14.0.7", + "expo-constants": "^56.0.17", + "expo-haptics": "~13.0.1", + "expo-image-picker": "~15.0.7", + "expo-linking": "^56.0.13", + "expo-local-authentication": "~14.0.1", + "expo-notifications": "^56.0.16", + "expo-print": "~13.0.1", + "expo-router": "^56.2.9", + "expo-screen-orientation": "~7.0.5", "expo-secure-store": "~13.0.2", - "expo-constants": "~16.0.2", - "expo-splash-screen": "~0.27.6", - "expo-linking": "~6.3.1", + "expo-sharing": "~12.0.1", + "expo-splash-screen": "^56.0.10", + "expo-status-bar": "~1.12.1", "react": "18.2.0", - "react-native": "0.74.5", + "react-dom": "18.2.0", + "react-native": "^0.85.3", + "react-native-gesture-handler": "~2.16.1", "react-native-safe-area-context": "4.10.5", "react-native-screens": "3.31.1", - "react-native-web": "~0.19.10", - "react-dom": "18.2.0", - "@expo/metro-runtime": "~3.2.3", - "axios": "^1.7.7" + "react-native-web": "~0.19.10" }, "devDependencies": { "@babel/core": "^7.24.0", "@types/react": "~18.2.79", - "typescript": "~5.3.3" + "typescript": "~5.5.4" } } diff --git a/services/api.ts b/services/api.ts index 5e1910dd..93d7584d 100644 --- a/services/api.ts +++ b/services/api.ts @@ -32,6 +32,27 @@ export const login = (username: string, password: string) => export const getMe = () => client.get('/api/auth/me') +/* ── 인증·보안 (#33 #34 #37 #38) ── */ +/* 등록 디바이스 관리 */ +export const getDevices = () => + client.get('/api/auth/devices') +export const deleteDevice = (id: string | number) => + client.delete(`/api/auth/devices/${id}`) + +/* 보안 이벤트 로그 */ +export const getSecurityEvents = () => + client.get('/api/auth/events') + +/* Zero Trust 네트워크 상태 */ +export const getNetworkStatus = () => + client.get('/api/auth/network-status') + +/* 멀티기관 전환 */ +export const getInstitutions = () => + client.get('/api/institutions/') +export const switchTenant = (tenantId: string | number) => + client.post('/api/auth/switch-tenant', { tenant_id: tenantId }) + /* ── 대시보드 ── */ export const getDashboard = () => client.get('/api/dashboard') @@ -49,6 +70,57 @@ export const createSR = (data: { title: string; description: string; priority: s export const updateSRStatus = (id: number, status: string) => client.patch(`/api/tasks/${id}/status`, { status }) +/* SR 부분 수정 (스와이프 상태 전환 등) */ +export const patchSR = (id: number, data: Record) => + client.patch(`/api/tasks/${id}`, data) + +/* 빠른 SR 등록 (FormData 또는 JSON) */ +export const createSRRaw = (data: Record) => + client.post('/api/tasks', data) + +/* 일괄 상태 변경 */ +export const batchUpdateSR = (ids: number[], status: string) => + client.patch('/api/tasks/batch', { ids, status }) + +/* 에스컬레이션 */ +export const escalateSR = (id: number, reason?: string) => + client.post(`/api/tasks/${id}/escalate`, { reason: reason ?? '' }) + +/* 구독 / 팔로우 토글 */ +export const subscribeSR = (id: number, subscribe: boolean) => + client.post(`/api/tasks/${id}/subscribe`, { subscribe }) + +/* 만족도 평가 */ +export const rateSR = (id: number, score: number, comment?: string) => + client.post(`/api/tasks/${id}/rating`, { score, comment: comment ?? '' }) + +/* 코멘트 작성 (내부/외부) */ +export const addSRComment = (id: number, content: string, isInternal: boolean) => + client.post(`/api/tasks/${id}/comments`, { content, is_internal: isInternal }) + +export const getSRComments = (id: number) => + client.get(`/api/tasks/${id}/comments`) + +/* 인시던트 타임라인 */ +export const getSRTimeline = (id: number) => + client.get(`/api/tasks/${id}/timeline`) + +/* 관련 SR */ +export const getRelatedSR = (id: number) => + client.get(`/api/tasks`, { params: { related_to: id } }) + +/* 중복 SR 감지 */ +export const findSimilarSR = (title: string, limit = 3) => + client.get(`/api/tasks`, { params: { title_similar: title, status: 'open', limit } }) + +/* SR 템플릿 */ +export const getSRTemplates = () => + client.get('/api/tasks/templates') + +/* 미처리 SR 카운트 (뱃지용) */ +export const getOpenSRCount = () => + client.get('/api/tasks', { params: { status: 'open', assigned_to: 'me', size: 1 } }) + /* ── AI 챗봇 ── */ export const sendAIMessage = (message: string) => client.post('/api/chatbot/message', { message }) @@ -85,4 +157,284 @@ export const getCSAPDashboard = () => client.get('/api/compliance/csap/dashboard export const getCSAPItems = () => client.get('/api/compliance/csap/items') export const getCSAPResults = () => client.get('/api/compliance/csap/results') +/* ── 모니터링·알림 (#39~#50) ── */ + +/* #39 서버 상태 대시보드 — 이름/상태/리소스 수치만 (IP·계정·PW 노출 금지) */ +export const getServerStatus = () => client.get('/api/servers/status') + +/* #42 서버 부하 히트맵 (status 재활용 가능, 별도 엔드포인트 우선 시도) */ +export const getServerHeatmap = () => client.get('/api/servers/status') + +/* #47 서버 메트릭 시계열 (range: 1h/6h/24h) */ +export const getServerMetrics = (id: string | number, range = '1h') => + client.get(`/api/servers/${id}/metrics`, { params: { range } }) + +/* #43 SLA 위반 예측 */ +export const getSLAPrediction = () => client.get('/api/sla/prediction') + +/* #44 서비스 상태 */ +export const getServiceStatus = () => client.get('/api/service-status') + +/* #45 알림 규칙 노코드 편집기 */ +export const getAlertRules = () => client.get('/api/alert-rules/') +export const createAlertRule = (data: Record) => + client.post('/api/alert-rules/', data) +export const updateAlertRule = (id: string | number, data: Record) => + client.put(`/api/alert-rules/${id}`, data) +export const deleteAlertRule = (id: string | number) => + client.delete(`/api/alert-rules/${id}`) +export const toggleAlertRule = (id: string | number) => + client.patch(`/api/alert-rules/${id}/toggle`) + +/* #46 온콜 스케줄 */ +export const getOncallSchedule = () => client.get('/api/oncall/schedule') + +/* #48 임계값 초과 이력 */ +export const getThresholdHistory = (page = 0, size = 30) => + client.get('/api/threshold-history', { params: { page, size } }) + +/* #49 커스텀 대시보드 위젯 */ +export const getCustomDashboard = () => client.get('/api/custom-dashboard') +export const saveCustomDashboard = (widgets: unknown[]) => + client.put('/api/custom-dashboard', { widgets }) + +/* #50 글로벌 통합 검색 */ +export const globalSearch = (q: string, types = 'sr,server,kb,institution') => + client.get('/api/search/', { params: { q, types } }) + +/* ────────────────────────────────────────────── + * 승인·워크플로우 (#63~#70) + * ────────────────────────────────────────────── */ + +/* #63 승인 요청 목록 (기본: 대기 상태) */ +export const getApprovals = (status = 'pending') => + client.get('/api/approvals/', { params: { status } }) + +/* #64 승인 / 반려 */ +export const approveRequest = (id: string | number, comment = '') => + client.post(`/api/approvals/${id}/approve`, { comment }) +export const rejectRequest = (id: string | number, reason: string) => + client.post(`/api/approvals/${id}/reject`, { reason }) + +/* #64 언두 — 3초 내 실행취소 */ +export const cancelApproval = (id: string | number) => + client.patch(`/api/approvals/${id}/cancel`) + +/* #65 다단계 승인 진행 단계 */ +export const getApprovalStages = (id: string | number) => + client.get(`/api/approvals/${id}/stages`) + +/* #67 대리결재 설정 */ +export const getDelegation = () => + client.get('/api/approvals/delegate') +export const setDelegation = (data: { + delegate_to: string | number + start_date: string + end_date: string + reason: string +}) => client.post('/api/approvals/delegate', data) +export const cancelDelegation = (id: string | number) => + client.delete(`/api/approvals/delegate/${id}`) + +/* #67 사용자 검색 (대리인 지정용) */ +export const searchUsers = (q: string) => + client.get('/api/auth/users', { params: { q } }) + +/* #68 변경 관리 캘린더 */ +export const getChangeCalendar = (month: string) => + client.get('/api/changes/calendar', { params: { month } }) + +/* #69 자동화 규칙 조회 (워크플로우 엔진) */ +export const getAutomationRules = () => + client.get('/api/automation-rules/') + +/* #70 SLA 예외 승인 */ +export const getSLAExceptionPending = () => + client.get('/api/tasks', { params: { sla_exception_pending: true } }) +export const requestSLAException = ( + id: string | number, + data: { reason: string; new_deadline: string } +) => client.post(`/api/tasks/${id}/sla-exception`, data) + +/* ────────────────────────────────────────────── + * 지식베이스·문서 (#71~#77) + * ────────────────────────────────────────────── */ +export const getKBList = (q = '', category = '', page = 0, size = 20) => + client.get('/api/kb/', { params: { q, category, page, size } }) +export const getKBDetail = (id: string | number) => + client.get(`/api/kb/${id}`) +export const getKBBookmarks = () => + client.get('/api/kb/bookmarks') +export const toggleKBBookmark = (id: string | number) => + client.post(`/api/kb/${id}/bookmark`) + +export const ocrScanDocument = (formData: FormData) => + client.post('/api/ocr/parse', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) + +export const getMeetingMinutes = (page = 0) => + client.get('/api/meetings/', { params: { page, size: 20 } }) +export const getMeetingMinuteDetail = (id: string | number) => + client.get(`/api/meetings/${id}`) + +export const getReleaseNotes = () => + client.get('/api/system/release-notes') + +/* ────────────────────────────────────────────── + * 준수·거버넌스 (#78~#84) + * ────────────────────────────────────────────── */ +export const getCSAPScore = () => + client.get('/api/compliance/csap/dashboard') +export const getCSAPNonCompliant = () => + client.get('/api/compliance/csap/items', { params: { status: 'fail' } }) +export const createCSAPSR = (itemId: string | number) => + client.post('/api/tasks', { title: `CSAP 미준수 즉시 조치: 항목 ${itemId}`, description: `CSAP 점검 항목 ${itemId} 미준수 즉시 조치`, priority: 'HIGH', sr_type: 'CHANGE', csap_item_id: itemId }) + +export const getAuditLogs = (page = 0, size = 30) => + client.get('/api/audit/', { params: { page, size } }) + +export const getLicenseExpired = () => + client.get('/api/license/status') + +export const getPatchStatus = () => + client.get('/api/patches/status') +export const getPIITypes = () => + client.get('/api/patches/pii-types') +export const applyPatch = (cveId: string) => + client.post(`/api/patches/${cveId}/apply`) + +export const getAISOCEvents = (page = 0) => + client.get('/api/ai-soc/events', { params: { page, size: 20 } }) + +/* ────────────────────────────────────────────── + * 통계·보고 (#93~#97) + * ────────────────────────────────────────────── */ +export const getMyStats = () => + client.get('/api/stats/my') +export const getInstitutionStats = () => + client.get('/api/stats/institutions') +export const getDeployHistory = () => + client.get('/api/stats/deploy-history') +export const getKPIDashboard = () => + client.get('/api/stats/kpi') +export const getReportData = () => + client.get('/api/stats/export-pdf') + +/* ────────────────────────────────────────────── + * 협업·연동 (#98~#100) + * ────────────────────────────────────────────── */ +export const getSRChat = (srId: number, page = 0) => + client.get(`/api/sr-chat/${srId}/messages`, { params: { page, size: 50 } }) +export const sendSRChat = (srId: number, content: string, msgType = 'text') => + client.post(`/api/sr-chat/${srId}/messages`, { content, msg_type: msgType }) + +export const getAPKQRCode = () => + client.get('/api/cicd/status') +export const getBuilds = () => + client.get('/api/cicd/builds') +export const triggerBuild = (project: string) => + client.post('/api/cicd/builds/trigger', { project }) + +/* ────────────────────────────────────────────── + * 2세대 확장 API (#101~#200) + * ────────────────────────────────────────────── */ + +/* AIOps / 예측 */ +export const getFailurePredictions = () => + client.get('/api/predictive/failure') +export const getCapacityPredictions = (days: 30 | 60 | 90) => + client.get('/api/capacity/predictions', { params: { days } }) + +/* GreenOps */ +export const getGreenopsEnergy = () => client.get('/api/greenops/energy') +export const getGreenopsCarbon = () => client.get('/api/greenops/carbon') + +/* 비용 최적화 */ +export const getCostRecommendations = () => + client.get('/api/cost-optimizer/recommendations') +export const getSavingsDashboard = () => + client.get('/api/mobile2/savings-dashboard') + +/* 서비스 의존성 */ +export const getServiceDependencyMap = () => + client.get('/api/knowledge-graph/service-map') + +/* 정책 위반 */ +export const getPolicyViolations = () => + client.get('/api/policy/violations') + +/* 전자서명 */ +export const getPendingDocs = () => + client.get('/api/approvals/pending-docs') +export const signDocument = (id: string | number, pinHash: string) => + client.post(`/api/approvals/${id}/sign`, { pin_hash: pinHash }) + +/* 하드웨어 보증 */ +export const getHWWarranty = () => client.get('/api/cmdb/warranty') + +/* NFC / 자산 */ +export const getAssetById = (id: string | number) => + client.get(`/api/cmdb/assets/${id}`) +export const nfcCheckin = (serverId: string | number) => + client.post('/api/servers/field-checkin', { server_id: serverId, source: 'nfc', method: 'nfc_tag' }) + +/* CVE / 위협 */ +export const getCVEList = () => client.get('/api/patches/cve') +export const getThreatFeed = () => client.get('/api/ai-soc/threats') +export const searchIOC = (q: string) => + client.get('/api/ai-soc/ioc/search', { params: { q } }) +export const getSecurityScore = () => client.get('/api/ai-soc/security-score') + +/* AI 이력 / 브리핑 */ +export const getChatbotHistory = (page = 0) => + client.get('/api/mobile2/chatbot-history', { params: { page, size: 20 } }) +export const getAIBriefing = () => + client.get('/api/ai-insights/briefing') +export const getOllamaStatus = () => + client.get('/api/ai-insights/ollama-status') +export const pullOllamaModel = (model: string) => + client.post('/api/ai-insights/ollama-pull', { model }) + +/* 캘린더 / 유지보수 */ +export const getWorkCalendar = (year: number, month: number) => + client.get('/api/mobile2/work-calendar', { params: { year, month } }) +export const getMaintenanceWindows = () => + client.get('/api/cmdb/maintenance') +export const cancelMaintenanceWindow = (id: string | number) => + client.delete(`/api/cmdb/maintenance/${id}`) + +/* VM */ +export const getVMs = () => client.get('/api/cloud/vms') +export const vmAction = (id: string | number, action: 'start' | 'stop' | 'reboot') => + client.post(`/api/cloud/vms/${id}/${action}`) + +/* SSL / EOL */ +export const getSSLCerts = () => client.get('/api/cmdb/ssl-certs') +export const getEOLSoftware = () => client.get('/api/cmdb/eol-software') + +/* 리더보드 / 히트맵 */ +export const getTeamLeaderboard = () => + client.get('/api/mobile2/team-leaderboard') +export const getSRHourlyPattern = () => + client.get('/api/mobile2/hourly-pattern') + +/* 나라장터 / 시민 */ +export const getG2BContracts = () => + client.get('/api/public-sector/g2b-contracts') +export const getCitizenRequests = () => + client.get('/api/citizen/requests') + +/* Ollama 브리핑 보조 */ +export const getHourlyPattern = () => + client.get('/api/mobile2/hourly-pattern') +export const getIncidentPatterns = () => + client.get('/api/mobile2/incident-patterns') +export const getHandoverChecklist = () => + client.get('/api/mobile2/handover-checklist') +export const getTeamPresence = () => + client.get('/api/mobile2/team-presence') +export const getAppVersion = () => + client.get('/api/mobile2/app-version') +export const getAnnouncements = () => + client.get('/api/mobile2/announcements') + export default client diff --git a/services/sha256.ts b/services/sha256.ts new file mode 100644 index 00000000..732f0a60 --- /dev/null +++ b/services/sha256.ts @@ -0,0 +1,102 @@ +/** + * Pure-JS SHA-256 (no native module / no expo-crypto dependency). + * EAS 빌드 안전: 추가 네이티브 모듈 불필요. + * PIN 평문 저장 금지 — 이 해시 결과만 SecureStore에 저장한다. + */ + +function rrot(x: number, n: number): number { + return (x >>> n) | (x << (32 - n)) +} + +const K = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, + 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, + 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, + 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +] + +function toBytes(str: string): number[] { + const utf8: number[] = [] + for (let i = 0; i < str.length; i++) { + let c = str.charCodeAt(i) + if (c < 0x80) utf8.push(c) + else if (c < 0x800) { + utf8.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f)) + } else if (c < 0xd800 || c >= 0xe000) { + utf8.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f)) + } else { + i++ + c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)) + utf8.push( + 0xf0 | (c >> 18), + 0x80 | ((c >> 12) & 0x3f), + 0x80 | ((c >> 6) & 0x3f), + 0x80 | (c & 0x3f) + ) + } + } + return utf8 +} + +const HEX = '0123456789abcdef' + +/** SHA-256 → hex 문자열 */ +export function sha256(message: string): string { + const bytes = toBytes(message) + const l = bytes.length + const bitLen = l * 8 + + bytes.push(0x80) + while (bytes.length % 64 !== 56) bytes.push(0) + // 64-bit length (high 32 bits = 0 for our use) + for (let i = 0; i < 4; i++) bytes.push(0) + bytes.push((bitLen >>> 24) & 0xff, (bitLen >>> 16) & 0xff, (bitLen >>> 8) & 0xff, bitLen & 0xff) + + let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a + let h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19 + + const w = new Array(64) + for (let off = 0; off < bytes.length; off += 64) { + for (let i = 0; i < 16; i++) { + w[i] = + (bytes[off + i * 4] << 24) | + (bytes[off + i * 4 + 1] << 16) | + (bytes[off + i * 4 + 2] << 8) | + bytes[off + i * 4 + 3] + } + for (let i = 16; i < 64; i++) { + const s0 = rrot(w[i - 15], 7) ^ rrot(w[i - 15], 18) ^ (w[i - 15] >>> 3) + const s1 = rrot(w[i - 2], 17) ^ rrot(w[i - 2], 19) ^ (w[i - 2] >>> 10) + w[i] = (w[i - 16] + s0 + w[i - 7] + s1) | 0 + } + + let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7 + for (let i = 0; i < 64; i++) { + const S1 = rrot(e, 6) ^ rrot(e, 11) ^ rrot(e, 25) + const ch = (e & f) ^ (~e & g) + const t1 = (h + S1 + ch + K[i] + w[i]) | 0 + const S0 = rrot(a, 2) ^ rrot(a, 13) ^ rrot(a, 22) + const maj = (a & b) ^ (a & c) ^ (b & c) + const t2 = (S0 + maj) | 0 + h = g; g = f; f = e; e = (d + t1) | 0 + d = c; c = b; b = a; a = (t1 + t2) | 0 + } + + h0 = (h0 + a) | 0; h1 = (h1 + b) | 0; h2 = (h2 + c) | 0; h3 = (h3 + d) | 0 + h4 = (h4 + e) | 0; h5 = (h5 + f) | 0; h6 = (h6 + g) | 0; h7 = (h7 + h) | 0 + } + + const out = [h0, h1, h2, h3, h4, h5, h6, h7] + let hex = '' + for (const n of out) { + for (let s = 28; s >= 0; s -= 4) hex += HEX[(n >>> s) & 0xf] + } + return hex +} diff --git a/tsconfig.json b/tsconfig.json index 140c044c..b1b68619 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,5 +5,12 @@ "paths": { "@/*": ["./*"] } - } + }, + "include": [ + "**/*.ts", + "**/*.tsx", + "types/**/*.d.ts", + ".expo/types/**/*.ts", + "expo-env.d.ts" + ] } diff --git a/types/native-modules.d.ts b/types/native-modules.d.ts new file mode 100644 index 00000000..103a5da0 --- /dev/null +++ b/types/native-modules.d.ts @@ -0,0 +1,32 @@ +/** + * 선택적 네이티브 모듈 타입 선언 (shim) + * + * EAS 빌드 시 package.json 의존성으로 설치되지만 로컬 node_modules 에 + * 항상 존재하지 않을 수 있는 모듈에 대한 최소 타입을 제공한다. + * 실제 모듈이 설치되어 있으면 해당 모듈의 정식 타입이 우선 적용된다. + */ + +declare module 'expo-image-picker' { + export interface ImagePickerAsset { + uri: string + width?: number + height?: number + fileName?: string | null + mimeType?: string + base64?: string | null + } + export interface ImagePickerResult { + canceled: boolean + assets: ImagePickerAsset[] | null + } + export const MediaTypeOptions: { All: 'All'; Images: 'Images'; Videos: 'Videos' } + export function requestMediaLibraryPermissionsAsync(): Promise<{ granted: boolean; status: string }> + export function requestCameraPermissionsAsync(): Promise<{ granted: boolean; status: string }> + export function launchImageLibraryAsync(options?: Record): Promise + export function launchCameraAsync(options?: Record): Promise +} + +declare module 'expo-notifications' { + export function setBadgeCountAsync(count: number): Promise + export function getBadgeCountAsync(): Promise +} diff --git a/utils/auth.ts b/utils/auth.ts new file mode 100644 index 00000000..f1da54cd --- /dev/null +++ b/utils/auth.ts @@ -0,0 +1,36 @@ +/** + * GUARDiA Messenger — 인증 토큰 유틸 + * SecureStore에 저장된 JWT 토큰을 읽어온다. (키: grd_token) + */ +import * as SecureStore from 'expo-secure-store' + +const TOKEN_KEY = 'grd_token' +const USER_KEY = 'grd_user' + +export async function getToken(): Promise { + try { + return await SecureStore.getItemAsync(TOKEN_KEY) + } catch { + return null + } +} + +export async function getStoredUser(): Promise { + try { + const raw = await SecureStore.getItemAsync(USER_KEY) + return raw ? (JSON.parse(raw) as T) : null + } catch { + return null + } +} + +/** 인증 헤더가 포함된 fetch 래퍼. */ +export async function authFetch(input: string, init: RequestInit = {}): Promise { + const token = await getToken() + const headers: Record = { + 'Content-Type': 'application/json', + ...(init.headers as Record | undefined), + } + if (token) headers.Authorization = `Bearer ${token}` + return fetch(input, { ...init, headers }) +} diff --git a/utils/security.ts b/utils/security.ts new file mode 100644 index 00000000..a23b5e8b --- /dev/null +++ b/utils/security.ts @@ -0,0 +1,68 @@ +/** + * GUARDiA Messenger — 보안 유틸 (현장서비스 모듈 공용) + * + * 보안 원칙 (불변): + * - 서버 IP(ip_addr), SSH 계정(ssh_user), 비밀번호(os_pw_enc)는 화면에 절대 노출 금지 + * - 배치 SSH / 터미널 출력의 IP 패턴은 자동 마스킹 + * - 파일 경로 traversal(`../`) 입력 차단 + */ + +/** IPv4 패턴 — 출력 텍스트에서 자동 마스킹 처리 */ +const IPV4_RE = /\b(?:\d{1,3})\.(?:\d{1,3})\.(?:\d{1,3})\.(?:\d{1,3})\b/g + +/** 텍스트 내 IPv4 주소를 ***.***.***.*** 로 마스킹 */ +export function maskIPs(text: string): string { + if (!text) return text + return text.replace(IPV4_RE, '***.***.***.***') +} + +/** 위험 명령어 블랙리스트 — 클라이언트단 1차 차단 */ +export const BLOCKED_COMMANDS = [ + 'rm -rf /', + 'mkfs', + 'dd if=/dev/zero', + 'shutdown -h', + 'shutdown -r', + 'reboot', + ':(){:|:&};:', + '> /dev/sda', + 'chmod -R 000 /', + 'mv /home', +] + +/** 명령어 안전성 검사 — 위험 패턴 포함 시 false */ +export function validateCommand(cmd: string): boolean { + if (!cmd || !cmd.trim()) return false + const normalized = cmd.replace(/\s+/g, ' ').trim() + return !BLOCKED_COMMANDS.some((b) => normalized.includes(b)) +} + +/** 차단된 위험 패턴을 반환(있으면), 없으면 null */ +export function blockedReason(cmd: string): string | null { + const normalized = cmd.replace(/\s+/g, ' ').trim() + const hit = BLOCKED_COMMANDS.find((b) => normalized.includes(b)) + return hit ?? null +} + +/** 경로 traversal 차단 — `../`, `..\`, 또는 null byte 포함 시 false */ +export function isSafePath(path: string): boolean { + if (!path) return true + if (path.includes('..')) return false + if (path.includes('\0')) return false + return true +} + +/** + * 자산/서버 객체에서 민감 필드를 제거한 안전 복사본 반환. + * API 응답에 혹시라도 ip_addr/ssh_user/os_pw_enc가 포함되어도 화면에 닿지 않게 한다. + */ +export function sanitizeAsset>(obj: T): Partial { + if (!obj || typeof obj !== 'object') return obj + const SENSITIVE = ['ip_addr', 'ip_address', 'ssh_user', 'ssh_pass', 'os_pw', 'os_pw_enc', 'password', 'private_key'] + const out: Record = {} + for (const [k, v] of Object.entries(obj)) { + if (SENSITIVE.includes(k)) continue + out[k] = v + } + return out as Partial +}