ksaa 2025.11__py3-none-any.whl → 2025.11b3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. kaa/application/{services → core}/feedback_service.py +1 -1
  2. kaa/config/schema.py +0 -2
  3. kaa/main/gr.py +2733 -71
  4. kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  5. kaa/resources/game.db +0 -0
  6. kaa/resources/game_ver.txt +0 -0
  7. kaa/sprites/__pycache__/__init__.cpython-310.pyc +0 -0
  8. kaa/tasks/R.py +128 -136
  9. kaa/tasks/daily/purchase.py +1 -33
  10. kaa/tasks/daily/upgrade_support_card.py +2 -12
  11. kaa/tasks/produce/common.py +0 -1
  12. kaa/tasks/produce/in_purodyuusu.py +7 -21
  13. {ksaa-2025.11.dist-info → ksaa-2025.11b3.dist-info}/METADATA +21 -21
  14. {ksaa-2025.11.dist-info → ksaa-2025.11b3.dist-info}/RECORD +275 -299
  15. kaa/__init__.py +0 -0
  16. kaa/application/__init__.py +0 -0
  17. kaa/application/services/__init__.py +0 -0
  18. kaa/application/services/config_service.py +0 -101
  19. kaa/application/services/produce_solution_service.py +0 -83
  20. kaa/application/services/task_service.py +0 -145
  21. kaa/application/ui/__init__.py +0 -0
  22. kaa/application/ui/common.py +0 -123
  23. kaa/application/ui/components/alert.py +0 -251
  24. kaa/application/ui/components/alert.pyi +0 -257
  25. kaa/application/ui/components/categorized_select.pyi +0 -697
  26. kaa/application/ui/facade.py +0 -189
  27. kaa/application/ui/gradio_view.py +0 -135
  28. kaa/application/ui/views/__init__.py +0 -0
  29. kaa/application/ui/views/feedback_view.py +0 -65
  30. kaa/application/ui/views/produce_view.py +0 -251
  31. kaa/application/ui/views/settings_view.py +0 -581
  32. kaa/application/ui/views/status_view.py +0 -171
  33. kaa/application/ui/views/task_view.py +0 -102
  34. kaa/application/ui/views/update_view.py +0 -106
  35. kaa/sprites/41904062-e218-4b28-972a-b5cfcd058d2c.png +0 -0
  36. kaa/sprites/5c49d3b3-656e-4c8c-ae1a-9b0209b9dcc3.png +0 -0
  37. kaa/sprites/ae4742aa-acda-442d-bf73-b3fe7b66e85c.png +0 -0
  38. kaa/util/reactive.py +0 -182
  39. /kaa/application/{services → core}/update_service.py +0 -0
  40. /kaa/sprites/{a32fa779-2fb9-488e-9153-0b99e4352281.png → 03d0acec-15fd-4c21-82ce-122764def185.png} +0 -0
  41. /kaa/sprites/{0a019c0d-26fa-4441-b281-b73060722bc9.png → 03d22cb3-0193-4dcb-8a0d-98b7ca9c2b4c.png} +0 -0
  42. /kaa/sprites/{1d560b06-feac-413d-bf90-07ac045f11fb.png → 0455e229-75c9-44ba-8729-745799746979.png} +0 -0
  43. /kaa/sprites/{98a68736-c4ec-4af1-ac64-40eb48f9c000.png → 049ecbf6-d434-46fa-a42c-a447475269bb.png} +0 -0
  44. /kaa/sprites/{307fcb37-7a90-4a3e-bd3a-64a691aeb5d5.png → 04ea8503-cdd5-4b3e-a33b-63893b92f6ba.png} +0 -0
  45. /kaa/sprites/{2927cceb-29dc-4c35-8614-1df42fc0733b.png → 05251a85-2883-4098-842e-6544391de919.png} +0 -0
  46. /kaa/sprites/{c344b05d-2707-43b0-9e3e-4ec433558dcb.png → 054db45e-1434-4604-91ec-7ac586ca11b5.png} +0 -0
  47. /kaa/sprites/{3fd694ea-8396-4cf3-9ba6-eaf95b61e8c8.png → 06cf74aa-635f-48ab-b965-36981f2063d3.png} +0 -0
  48. /kaa/sprites/{827cec52-d883-46d1-b24b-c11c82b1b459.png → 0814c0fd-6f89-47d3-8089-e8cfde569750.png} +0 -0
  49. /kaa/sprites/{91dbaa9c-7881-4687-bd64-8f25c201d98c.png → 08bde3ff-7554-4bdb-a7f0-193323489d5b.png} +0 -0
  50. /kaa/sprites/{491bd489-7a08-47b4-b1b7-5d0f44cedbca.png → 09222fb0-78a6-4663-8c1f-1d44e881513d.png} +0 -0
  51. /kaa/sprites/{36f11c55-e110-44b7-a800-85f4d7584560.png → 0b436edb-8f6a-429d-87b7-5d4250f651ac.png} +0 -0
  52. /kaa/sprites/{8f5081e4-ed3d-445b-bcf6-2e40c7d08298.png → 0c266b0e-de7a-49c1-9709-b01fb5086f75.png} +0 -0
  53. /kaa/sprites/{0e63e0b7-6874-46e9-86de-8c23e6491f24.png → 0db579bf-d555-4468-8104-c2d2e68d33b1.png} +0 -0
  54. /kaa/sprites/{ccac6d8e-bca2-4ab6-b88b-c0f5ba83df84.png → 114730f6-eddd-4381-b723-aee18cde0d90.png} +0 -0
  55. /kaa/sprites/{4e3a9fd3-86aa-4e14-ae48-46e53a553da2.png → 11870372-dc78-4a80-8320-15bb24da6f25.png} +0 -0
  56. /kaa/sprites/{bdbed86f-553c-458e-9435-d587005b367d.png → 11bc7d35-e58d-4301-a0b0-f557dbd73c7b.png} +0 -0
  57. /kaa/sprites/{546cb160-f99b-4cda-9719-02b38a5393a0.png → 12455dbd-7d70-4435-a3ba-f40654e75c37.png} +0 -0
  58. /kaa/sprites/{3114b2d5-0a96-4eba-9143-b09eabb63612.png → 12f330a6-4eab-4015-b0e3-4e1a35a7b676.png} +0 -0
  59. /kaa/sprites/{58de1cf0-4270-4987-9dc7-3f584f1119d1.png → 14a697d4-0b58-4644-bb2d-8823d2fefcb8.png} +0 -0
  60. /kaa/sprites/{2f7f70ea-f3f0-4d14-8885-1a735ff00545.png → 15605f7a-2206-436c-8a71-011d9f95cf4e.png} +0 -0
  61. /kaa/sprites/{138a527b-2191-4f0f-9e36-1d08bbf6ffb1.png → 15dd89cc-53ed-4c77-a355-62e3bd7a15dd.png} +0 -0
  62. /kaa/sprites/{0343a3b8-8cd6-47af-b956-760dd2c79711.png → 18b13508-c46f-4134-b991-975c0a1b9a74.png} +0 -0
  63. /kaa/sprites/{e82b9645-ee3f-4f63-922e-c1d703344baf.png → 19513e9f-2cbb-4f66-84b7-2ad2faed252d.png} +0 -0
  64. /kaa/sprites/{284a19c3-2c06-48a5-8f78-b4682e8ae19e.png → 1a5c147b-e28e-42ad-893a-7430d8f4fc35.png} +0 -0
  65. /kaa/sprites/{af5a6ae7-a355-492e-86a8-62fa2b06bb54.png → 1b3c84c5-16d1-43a7-8513-719bd7a10450.png} +0 -0
  66. /kaa/sprites/{072b167f-a2f6-4458-815e-a92ca2e6c9eb.png → 1b847790-90e2-44f8-b6d9-4814812006bd.png} +0 -0
  67. /kaa/sprites/{81553259-3b0a-42f7-b7b9-2c6e1dfec6c4.png → 1e57ab88-9962-4024-81df-746529a758f9.png} +0 -0
  68. /kaa/sprites/{78868e34-1c2a-40ee-b08c-c89e6a3aea54.png → 1ef5fa52-b6e1-42d0-947a-ce970eba057d.png} +0 -0
  69. /kaa/sprites/{2dfa926c-83c5-4f40-adfe-ff04ce448264.png → 205e03de-46d9-4983-a2ea-a7f7500d508f.png} +0 -0
  70. /kaa/sprites/{5cb4deb9-2ec5-4452-aba4-390eae2071c7.png → 20bd834e-c99c-4e80-92db-0740e5bbe746.png} +0 -0
  71. /kaa/sprites/{a8ca6a10-ba0a-4416-a27b-3323d38040ab.png → 218a6ab3-93f6-4bb1-9848-8c97ff695945.png} +0 -0
  72. /kaa/sprites/{04c287ed-9ab1-4cd1-af07-8ab61f7f49bc.png → 22071c63-a1bc-4163-8d5a-973b3d579c76.png} +0 -0
  73. /kaa/sprites/{4516d0e4-9280-4f91-ba7d-fc8af83a9996.png → 2460d0c9-50e2-451b-b609-ad466b574395.png} +0 -0
  74. /kaa/sprites/{0899a6e7-6617-4f11-a7a2-9ba377ad6cba.png → 264d021a-b322-4472-8a7b-5f1322aba993.png} +0 -0
  75. /kaa/sprites/{0240342e-b6f3-4ed6-8da5-a64092e6fcde.png → 28335ba3-9a0f-46cd-b66d-047781773264.png} +0 -0
  76. /kaa/sprites/{31b025df-ed25-4bc4-a94a-d05388e9156e.png → 28df544b-72f2-4ed8-8bf3-609ff99633d9.png} +0 -0
  77. /kaa/sprites/{9b91dc78-49e8-41b2-9500-c27cb46023c4.png → 2a82e2d6-0722-433a-87fa-f1752ce0b9b7.png} +0 -0
  78. /kaa/sprites/{97f3fb5a-fce2-4cc5-9da5-f0496e9dd294.png → 2abce6a4-111f-42bb-9255-f98d544108de.png} +0 -0
  79. /kaa/sprites/{0c192ca4-dd10-49b4-b0be-9b1fb4637910.png → 2d8e6464-aceb-41fd-9e78-7523738d5720.png} +0 -0
  80. /kaa/sprites/{14875449-7478-4969-a2d5-91ce34c9d1e4.png → 2f9e2dbb-66a1-4b13-9b9e-d62e10efa6d3.png} +0 -0
  81. /kaa/sprites/{5a337f99-8554-48bf-acb7-364259fbf1b7.png → 307b58f0-20c1-41bd-9eaa-1337fd0e6563.png} +0 -0
  82. /kaa/sprites/{cd601176-0336-41c7-8d3f-31ddf8cf708d.png → 318abb8a-5950-4d22-ac42-77219b5bc1a0.png} +0 -0
  83. /kaa/sprites/{0afb71f5-0752-47af-9ba2-85bdbe4fcbf7.png → 3192a62f-224d-44b1-a0b9-b1fc22de8ec1.png} +0 -0
  84. /kaa/sprites/{4dc5f817-86bc-4433-aeb5-b02c7b63fa8c.png → 31b4c370-696f-4dfc-a918-839495520266.png} +0 -0
  85. /kaa/sprites/{ca258eea-e69a-43c3-ad4c-ac7da0099011.png → 321b7040-87d7-4f87-9b44-ad2972584a11.png} +0 -0
  86. /kaa/sprites/{43d3fe01-27c0-4d3f-a908-aebd00ab219d.png → 330c2207-af32-453b-8db7-889cda83e7cc.png} +0 -0
  87. /kaa/sprites/{861bd6b8-cca7-46b1-9346-83af080e211b.png → 38186efc-850c-4d83-97bc-9417f1494b94.png} +0 -0
  88. /kaa/sprites/{0950d760-6d88-4265-b28c-0790a782a749.png → 38426696-ff13-4f20-9f74-b05855990153.png} +0 -0
  89. /kaa/sprites/{4055dbef-1523-43b7-9183-6b2721b4307b.png → 3a211792-1243-496a-b41e-0e3fd121cd5b.png} +0 -0
  90. /kaa/sprites/{56bc2743-5dd9-4d09-a681-af9d1fec568b.png → 3a4e2d8a-deca-4980-b6c2-37bfc17d2720.png} +0 -0
  91. /kaa/sprites/{3c224540-1571-435a-b8e6-2317e4411438.png → 3a4ec054-2c48-4359-afb9-fa5ea8191d16.png} +0 -0
  92. /kaa/sprites/{9a8bfa87-0e37-4d54-888f-b79f8778d232.png → 3ae72684-1d40-43cf-9508-511c010de64f.png} +0 -0
  93. /kaa/sprites/{16113270-3f35-498a-a29a-52f190d77cc1.png → 3c490171-6810-44f0-b28d-c6b664347a3c.png} +0 -0
  94. /kaa/sprites/{771d1e17-8ef4-417a-b482-26db514e17c6.png → 3cda578a-fa75-4bbd-9cff-be4bc4355a58.png} +0 -0
  95. /kaa/sprites/{b70b958a-9480-4b9b-86a4-5ea099535c36.png → 3e669188-5933-4502-b039-38f4d4649664.png} +0 -0
  96. /kaa/sprites/{0cae32b3-0248-49ad-98dd-d06a89308797.png → 3ea03db7-4de9-45c4-a07b-a9bbc2c63e70.png} +0 -0
  97. /kaa/sprites/{943cde40-f190-40b6-9235-4439fbb4ae50.png → 3ea8e354-2684-46f3-9f5a-43f094717c95.png} +0 -0
  98. /kaa/sprites/{20d01fc0-9a54-4ef5-9983-2bb8414dd94d.png → 3eb9b21b-abbe-49fd-a3a9-6e1c1a6e91d9.png} +0 -0
  99. /kaa/sprites/{0a27a783-0ef8-4f99-8c26-cf89768b5146.png → 3fb84a71-ed15-4989-9598-34e7342f38f5.png} +0 -0
  100. /kaa/sprites/{3658a26d-98d3-462a-abf4-4d8b74aeb134.png → 3ffd2992-fa55-499c-8c3b-193518ebbe07.png} +0 -0
  101. /kaa/sprites/{0d1fd6f0-3a6f-4008-a31a-8189dd09be50.png → 41ff9641-d200-4caa-bcfa-d8389a3438eb.png} +0 -0
  102. /kaa/sprites/{dcbeb7cd-cd57-4daf-b023-ff2c7ef1621a.png → 4370013d-f052-4314-94ff-a342d70754c3.png} +0 -0
  103. /kaa/sprites/{34e50d77-7b95-4bb7-8c62-ad6801dc0e55.png → 455dcf19-63f5-4b0a-99e6-b23d3876d199.png} +0 -0
  104. /kaa/sprites/{5701ecbe-7fed-435c-b409-75f8b0f2df51.png → 45f09e08-53ea-4e08-97dc-70f689bab002.png} +0 -0
  105. /kaa/sprites/{4b88639e-1f17-4e11-90b6-bb122f8cb5ab.png → 4729b509-0f4a-4e96-b186-ec56c680c9e6.png} +0 -0
  106. /kaa/sprites/{20cbf6b8-01db-45fe-a790-dbb7dd639b1d.png → 4eb665ef-7741-40f9-8174-7b6ca66d045b.png} +0 -0
  107. /kaa/sprites/{130cd7fd-767e-4177-9087-71f418f154dd.png → 4f370ff6-61d1-405a-b29e-e6d0b3072194.png} +0 -0
  108. /kaa/sprites/{e4be69f6-6030-4fd8-8a36-fd3938d1734b.png → 4fb1d36c-5fb6-4fe5-9ba3-07e056eb1dfc.png} +0 -0
  109. /kaa/sprites/{45bdb006-bea5-4a1f-bf1a-c3bcb2e99abd.png → 504e4927-bfeb-43ee-aa5c-35cec664a4c8.png} +0 -0
  110. /kaa/sprites/{0f4ac9ae-5e4d-4f3f-b9e0-b76570f2b040.png → 51eb4be2-22fa-4683-82c7-513f5934f7b9.png} +0 -0
  111. /kaa/sprites/{527c3803-1ddd-4f6b-a896-815d3c2e4caa.png → 5247b052-5b45-4e64-b7fc-d566f5d4bc82.png} +0 -0
  112. /kaa/sprites/{a1251011-00a9-402b-82da-1d2744db26cf.png → 545a9032-a676-4d9d-ac74-2b2c9b330d1a.png} +0 -0
  113. /kaa/sprites/{0f8026e8-62a9-49e5-97a6-0d78f33dcfcf.png → 568608bd-a1fa-4faf-ae15-179563a7e84f.png} +0 -0
  114. /kaa/sprites/{1617c180-ce9f-461a-bfdc-390337ecb205.png → 56ac84af-4c85-4b69-b449-98981c1df292.png} +0 -0
  115. /kaa/sprites/{6d302c9d-72cd-49b5-bb11-c39140ffbdd1.png → 57741798-65dd-47eb-b4b1-b3f0e3c3e318.png} +0 -0
  116. /kaa/sprites/{1d92cb8e-49a7-4166-9682-a5807e0c7912.png → 5a49b6d2-2bcb-49bc-a28f-b8bd1441f60a.png} +0 -0
  117. /kaa/sprites/{0f80ac6f-bdf8-4927-8393-c554209f517a.png → 5a677634-99cf-45b5-bc0c-94120872a518.png} +0 -0
  118. /kaa/sprites/{ec0d03db-7c66-46b7-86cc-4acaa6eba1c9.png → 5e2b4bb9-f200-4723-96ac-5f907e28eaaa.png} +0 -0
  119. /kaa/sprites/{791b3367-fb7c-48b5-9a0f-877908e51c4a.png → 5ec51718-1403-4a79-bd85-46e1fe04d8c9.png} +0 -0
  120. /kaa/sprites/{05d7740b-c6ea-453a-b805-7d0a5fe18184.png → 5f2d0b2b-8425-4dd8-8b85-d62f4b75286c.png} +0 -0
  121. /kaa/sprites/{0af981f5-bcc9-48eb-a392-50f79ec5149a.png → 5f4abae0-a1f0-4c8c-9d93-a8525caa9dd0.png} +0 -0
  122. /kaa/sprites/{20ca6d42-c19e-4c3e-b82c-f6642bbe5069.png → 5f6fafd9-43aa-443e-994e-f2688af5e238.png} +0 -0
  123. /kaa/sprites/{6c5698a4-b211-4f38-83a7-51b5f3a36911.png → 6005bf30-fd7c-401e-8efd-050fa97ad7f3.png} +0 -0
  124. /kaa/sprites/{116d3f3a-0255-47ed-b656-c26b41a5cfa8.png → 6069f8bc-2a06-45a4-95ca-1ac9d8fa3b04.png} +0 -0
  125. /kaa/sprites/{02df555c-b19c-4776-8f1b-d1a7e2ed2f82.png → 60896822-de58-4e07-b2d9-86a7f4068de1.png} +0 -0
  126. /kaa/sprites/{bd176e60-3bb2-453f-b2ef-45305b7f21c1.png → 61229c71-303b-4dc9-ba4e-6a14e5ab161e.png} +0 -0
  127. /kaa/sprites/{b406baf0-fa0b-4125-adc6-d370582a6104.png → 622d700e-0fd8-4a92-a286-1e8143c70570.png} +0 -0
  128. /kaa/sprites/{fc86085c-d708-498a-bfa6-92e1a1364c60.png → 62f93327-5946-4a48-aff8-a203483b0562.png} +0 -0
  129. /kaa/sprites/{93f3f6a9-e9d2-45b7-a2b3-1e8b64d10e9b.png → 63b74752-73ce-4020-a7c8-0a71a9f67415.png} +0 -0
  130. /kaa/sprites/{84797a78-97f3-44fa-b3c0-132c914f534a.png → 648d43f6-b251-4d6f-a808-ae7325c91a59.png} +0 -0
  131. /kaa/sprites/{f5e1e7ed-fd35-42c3-97ed-5e9214a50733.png → 64dfeb35-61ad-4e9b-9847-a18530f02584.png} +0 -0
  132. /kaa/sprites/{92f7ef0b-7931-4cd3-afda-c553232eb443.png → 64f8ef99-4766-471b-aeb0-b109704d9615.png} +0 -0
  133. /kaa/sprites/{23922edd-22aa-4514-ba99-65bcd72c2ad1.png → 65f79941-1c78-496a-a67c-c50f4227bd34.png} +0 -0
  134. /kaa/sprites/{9934f05f-ee5f-4131-b08d-aa61d5f3505a.png → 677933e9-1481-4f01-95b4-d55bea51db8c.png} +0 -0
  135. /kaa/sprites/{7c8e37b7-173f-4c03-8f11-bbd47f2a02c2.png → 67edcd91-d2c1-418b-987a-e60263626f56.png} +0 -0
  136. /kaa/sprites/{a4723b5b-2466-4ea4-b7ef-4185bb4dda74.png → 6c032aa7-20e3-4e2e-b1a4-1585141ba22b.png} +0 -0
  137. /kaa/sprites/{1b485aa9-f0c0-4b49-ba75-363a8d6e292c.png → 6f50cd3b-6e46-46c5-99ed-26728d3212ad.png} +0 -0
  138. /kaa/sprites/{06a7097c-fef6-4f2c-bece-26eed414708e.png → 6f6d7af3-8380-439b-9d26-3fbd5a103b49.png} +0 -0
  139. /kaa/sprites/{cea2d5c4-6e79-425e-9e98-7e7dbdee960b.png → 6fadb00b-e32e-4c45-a738-f21b8f48c139.png} +0 -0
  140. /kaa/sprites/{47186b16-f478-4a53-8e49-a132ee4c78db.png → 71913fde-c3db-463d-800d-e1b35fa2c8b4.png} +0 -0
  141. /kaa/sprites/{5588396d-dd38-4ef1-8c37-3041a750b1cc.png → 719297ec-82be-4820-8ecf-8bf6322b81fe.png} +0 -0
  142. /kaa/sprites/{ba1983ce-bf63-4022-9ef3-dcf97030e6c5.png → 71976c1a-5df9-44a5-b4ea-08b5d617d813.png} +0 -0
  143. /kaa/sprites/{0be5a84d-eb1e-4bb3-afcd-923e104190f4.png → 72a8bcd2-3f32-4ee5-8295-eedf441d6a1a.png} +0 -0
  144. /kaa/sprites/{20e1e948-6920-44cd-965e-9e1e37b3fbf2.png → 73b6f3aa-5179-41d6-a82e-22e14aa8cd6a.png} +0 -0
  145. /kaa/sprites/{ba7676fe-4982-4e92-822d-9c1a623420ac.png → 76970b91-7864-4413-bfc7-79c04a48dce7.png} +0 -0
  146. /kaa/sprites/{458b8bbe-9fa5-48d4-907b-66d36baf16a1.png → 7a74b5f5-7a04-4678-8e6e-57b5de127182.png} +0 -0
  147. /kaa/sprites/{45062c9b-a31d-457b-83a2-9b6891384a15.png → 7b4c3a81-8f09-4a00-90ee-d4df3f57e863.png} +0 -0
  148. /kaa/sprites/{31168fe2-8601-4de6-aa40-81e7ce452391.png → 7c4ca388-5167-478a-a32b-0e108edad888.png} +0 -0
  149. /kaa/sprites/{c95e8a90-dd6e-4cca-b74b-85ee90dbd5c1.png → 7c62081d-097a-4514-a69d-69e96201e816.png} +0 -0
  150. /kaa/sprites/{001486b2-f627-4ece-8c93-4dfec47da9b3.png → 7d4709f8-6d0d-493f-819e-74cb0f7c166b.png} +0 -0
  151. /kaa/sprites/{d0d9f650-bb30-4743-81f3-cd7ea8211d5c.png → 7e16af89-bb51-4889-8a7e-25715ff5faa1.png} +0 -0
  152. /kaa/sprites/{9af13381-661d-41cf-b704-e4a9c3691e14.png → 7e8904fd-5863-471f-8e9a-d69d9ca72f8f.png} +0 -0
  153. /kaa/sprites/{7ddaa9db-2287-43ba-8531-065e618ac8ef.png → 7efce7bc-12a5-4a53-9a0a-9fa755649ebd.png} +0 -0
  154. /kaa/sprites/{8b6a1eed-341d-4be1-b0ae-9adc52ed4543.png → 803fb770-6982-4460-8fe0-f9ccd67367c2.png} +0 -0
  155. /kaa/sprites/{3d9a9493-7616-4b2b-867e-44e776d831c0.png → 80800c2e-417d-4118-b726-93aaabfc08bd.png} +0 -0
  156. /kaa/sprites/{4e7f7b91-344c-4fb2-95fe-004831e81b11.png → 81b1b160-2d0f-42ad-924a-9572a54f343a.png} +0 -0
  157. /kaa/sprites/{8e024c75-c872-4e18-bb80-0c5894612815.png → 82200c8c-0916-4601-839a-945f96cc4ebc.png} +0 -0
  158. /kaa/sprites/{acaea032-45b8-4ad8-8b54-ff011750af80.png → 82259f79-2bef-442b-bf16-78cb4f22e3be.png} +0 -0
  159. /kaa/sprites/{46cb87f6-26f7-45f0-b10c-6491f115077e.png → 8299e3e2-cfd5-4380-adce-a46c93b1be4d.png} +0 -0
  160. /kaa/sprites/{9803a197-d873-43cc-9656-d63513e92fad.png → 83c27159-36d2-4ccf-ace7-e5d2169e7e52.png} +0 -0
  161. /kaa/sprites/{16cf9d8b-4f8e-47ce-a63d-fe9bfc3f31e8.png → 861a4faa-2522-41e9-8e20-7bd9180bea5a.png} +0 -0
  162. /kaa/sprites/{f31531b4-79ea-41dc-b23f-e445b818139c.png → 8661bc83-9b0a-4555-8b21-2258b31c7f57.png} +0 -0
  163. /kaa/sprites/{7bb874a3-3fac-4138-83bd-d6461c5793d3.png → 87ed135a-2eb1-4e21-8928-d0307a22ea66.png} +0 -0
  164. /kaa/sprites/{f72e9d65-68e7-4bb6-be44-4b5ed71f0bce.png → 8805fead-f7e2-4905-a42e-05ebba2fbe21.png} +0 -0
  165. /kaa/sprites/{7833fa1e-c842-4efd-a696-c67150a1dfa8.png → 88be2dcc-68ca-4596-9b2c-544a196cab64.png} +0 -0
  166. /kaa/sprites/{c68f1282-4d86-4b1a-b76b-dcf42f3f906b.png → 89437aca-7339-4795-b848-ec529b1e5e8d.png} +0 -0
  167. /kaa/sprites/{c3c495a2-1530-439f-a10e-76ca5d929cce.png → 89841ff0-e834-4a7e-b9d5-00a9490b6b7f.png} +0 -0
  168. /kaa/sprites/{b33bb89c-cabb-4fe0-822f-d911e8b42f82.png → 8a0260f5-b32e-430e-bc98-7b5a77cab6ab.png} +0 -0
  169. /kaa/sprites/{a6269fe5-e719-43ad-b674-ea728e43066b.png → 8bf08bab-7c55-45e1-8433-c2213a323480.png} +0 -0
  170. /kaa/sprites/{f7246b84-e70b-47d3-8166-90f0dc4f2bb6.png → 8c3bc157-022a-4bb1-be74-af1ad254e67f.png} +0 -0
  171. /kaa/sprites/{6b63fca9-a1ec-490e-96e9-fc0beeeb8851.png → 8d09178a-251e-4f74-b023-12233417621b.png} +0 -0
  172. /kaa/sprites/{ce7cec02-4039-4171-87ed-37eccc4ac832.png → 8d416e23-04ef-47bd-8cc8-7f18d1bab736.png} +0 -0
  173. /kaa/sprites/{1dadf765-ddd0-4768-9e91-6d3d08d0ca0d.png → 8f9dd0f0-f9af-4eec-a89e-8f2c92f88a98.png} +0 -0
  174. /kaa/sprites/{a408cdfd-e394-4ada-9f0e-5878e41b8e52.png → 8fbee6fe-9409-407e-8f55-d2d36ab37f6a.png} +0 -0
  175. /kaa/sprites/{5933f6ab-7af4-4731-aac8-d95939a3fbbf.png → 8fdc102b-d8f3-4d16-b8ef-1d804f5aff07.png} +0 -0
  176. /kaa/sprites/{0dbb752b-e60a-459d-80fa-f5b49e8b8e4d.png → 9088f8c0-59f8-41c6-994c-ae283ac94c24.png} +0 -0
  177. /kaa/sprites/{24c2db22-24e2-484e-8c16-8b1c9fe3ed14.png → 922af7d1-75e9-4ac8-a4e7-2dad8bb1ca87.png} +0 -0
  178. /kaa/sprites/{9bc6607d-ce44-467e-a5f4-b3cf30210c13.png → 93e91dd0-0050-48b4-8bf8-c732cd76f0e3.png} +0 -0
  179. /kaa/sprites/{27bcc513-9bab-468a-97b8-ed16f918e2a4.png → 94ed55fe-3ef8-46bc-855a-a7b1dedab801.png} +0 -0
  180. /kaa/sprites/{26683d54-74a9-4e7b-a839-c2e0850d1458.png → 95d715c3-d569-48b5-be7b-c21cd2a160db.png} +0 -0
  181. /kaa/sprites/{1539fcff-8842-478f-98a8-0d1a885d1b43.png → 97a3791d-fa9d-453d-8081-c574fe88b823.png} +0 -0
  182. /kaa/sprites/{d5407f49-fecc-404e-915a-22c9fa16a79a.png → 993a33ac-994b-4eb0-9c1e-b9412d499d67.png} +0 -0
  183. /kaa/sprites/{affc5006-4b67-4490-9fa7-557a7fecb133.png → 99a27ff1-bc1c-48a2-9f9b-0803338d1bd8.png} +0 -0
  184. /kaa/sprites/{7469d458-d308-4469-8bf1-b63e1ddc6a3c.png → 9a9a1f40-d308-4aa5-8d91-60342bc6a4e0.png} +0 -0
  185. /kaa/sprites/{4280fa1d-4223-4fc4-85f9-caf6157cb004.png → 9acd9a59-004f-4e1d-a208-0c293f2702d5.png} +0 -0
  186. /kaa/sprites/{b62f9c30-1faf-47fc-be8f-36db3806c5dc.png → 9f3bfe36-8462-404f-94da-9bc324b1beed.png} +0 -0
  187. /kaa/sprites/{32af48d2-fb5b-4288-930f-eb36edfe2116.png → 9f46f543-d7dc-4836-a210-125d686475f9.png} +0 -0
  188. /kaa/sprites/{dab08e98-9053-4e2a-9e74-cf30298fea22.png → 9f573ac2-9d28-4d92-8e3f-1b78031220dd.png} +0 -0
  189. /kaa/sprites/{f9697f23-07cf-4a14-8b22-d1fc95386c16.png → a2545c5c-b5cc-4fd2-93c1-04c74c17ee16.png} +0 -0
  190. /kaa/sprites/{7def2661-0847-4459-88c6-5270c2e8a32c.png → a2dd125b-9868-4e01-9a46-3b552c2ebdc9.png} +0 -0
  191. /kaa/sprites/{38bb2a90-b2a9-4f85-9025-662e83ab1ed1.png → a34502b4-10bd-42ca-9ada-a9cdb57097dc.png} +0 -0
  192. /kaa/sprites/{8473bc42-1909-4d70-b80d-7eba085c9978.png → a3fe5859-62ba-403e-9367-65db0ad15943.png} +0 -0
  193. /kaa/sprites/{0b83c2e5-ebb4-4a69-8b5f-658774d4c5a6.png → a42ac612-acbd-45cc-88fb-104ff9b7d2d8.png} +0 -0
  194. /kaa/sprites/{38f70a7e-5f7e-4ee6-a7c5-5f8014734719.png → a4c6d967-0251-4b33-acb3-81d24f82d5a4.png} +0 -0
  195. /kaa/sprites/{511232f6-01d6-482a-81a3-2bf79a6e88ed.png → a6ed21f0-4da4-4065-bb59-062a70e132ca.png} +0 -0
  196. /kaa/sprites/{aff3d8ac-d648-434c-9adb-6c1a10aa04b9.png → a7f25aeb-d91b-47e0-ba1a-0c6382380102.png} +0 -0
  197. /kaa/sprites/{459f532f-115c-4527-a897-affa7ddcbd76.png → a888e87e-49fe-405d-b074-3dda30304808.png} +0 -0
  198. /kaa/sprites/{ae5a051e-37f5-4e54-bfc7-64c445ad6fcc.png → a97e2840-1575-4f2c-97df-6a720c644969.png} +0 -0
  199. /kaa/sprites/{cb8d5df6-300b-48e5-ae0b-2b4750c9c092.png → a9ba2741-38da-4448-ab80-f0e5b3c3847f.png} +0 -0
  200. /kaa/sprites/{cda022d1-7898-4006-95c5-b55eceda9d95.png → a9c5aeb0-c0c9-47da-8793-ffe8d172bea0.png} +0 -0
  201. /kaa/sprites/{eab111a6-80bf-45c1-9a74-b44ca76508b7.png → aba47934-f264-49f9-a72c-6ed90b112701.png} +0 -0
  202. /kaa/sprites/{c98d6bc7-45ca-4877-8cd1-6f36d6a86a02.png → abe2757f-84f3-4967-bd05-79c17cb1f32c.png} +0 -0
  203. /kaa/sprites/{a5ba613c-46f4-4442-88e1-fbda4dd65a55.png → acd741da-d4ab-4b76-a6a3-4a2fd25870ef.png} +0 -0
  204. /kaa/sprites/{a88e3da2-98d3-4a64-b7ac-040847028a83.png → ad17ae00-f6ce-4f32-9386-9a8073b5e79a.png} +0 -0
  205. /kaa/sprites/{4059ec2d-cd20-4dd3-8586-e49a4cfa8717.png → ae0ce964-eb8f-45a1-aa4d-f47a5c8c720f.png} +0 -0
  206. /kaa/sprites/{2c5784df-e89b-4b95-a4b9-bac083c0ec08.png → ae106b38-da4f-4b0d-b9c3-541fd58f4de7.png} +0 -0
  207. /kaa/sprites/{e70ce43b-9b3b-4aa0-8b9c-1d5cc4a1d5b0.png → ae73d26b-2d47-4921-a6ec-5bbea32773a3.png} +0 -0
  208. /kaa/sprites/{7d4d06a8-7903-4803-a20b-7f45ffbe9ca7.png → aeab8f9a-fe61-4c2d-a494-ffc19a9cae91.png} +0 -0
  209. /kaa/sprites/{4876c6f3-17a5-4858-b1d1-ebb5619516c5.png → affc87db-2f63-4e4a-855e-6ff608226f1e.png} +0 -0
  210. /kaa/sprites/{3aceddce-09db-422a-8023-e08d41070cc8.png → b02c15b5-04b4-40d9-bb13-267786e8e049.png} +0 -0
  211. /kaa/sprites/{6c82d28f-913c-4444-baa6-2e37c7e24bc6.png → b10281ae-cfaf-4400-b2fb-c8c2b432c8e7.png} +0 -0
  212. /kaa/sprites/{6e603eb6-2336-46d2-ad01-2ba2fc3d4cbd.png → b40bebbf-2800-40fb-b7a2-1c2d5995e747.png} +0 -0
  213. /kaa/sprites/{b5f80604-d7d3-49e0-9934-58f75c393ffb.png → b76add75-2187-428c-9ede-fb43086bacb6.png} +0 -0
  214. /kaa/sprites/{6baaecdd-2817-4ba3-a2da-346ef9ef92fd.png → b77a7e97-dc59-493d-9d76-4ea9c2876978.png} +0 -0
  215. /kaa/sprites/{4a853ac5-24d5-44ac-8ddf-9f501c60a9be.png → b7f62cab-cc24-480e-bf4c-25c43a1e801e.png} +0 -0
  216. /kaa/sprites/{821c86c1-bc35-40bc-95db-f66935a92299.png → b9770cd2-b55f-44dc-965f-f29686fba7da.png} +0 -0
  217. /kaa/sprites/{c295af98-0b43-4f18-bbc3-e59d23055f1b.png → ba8ee2cd-f662-440c-90b3-1e4bfe7bab6b.png} +0 -0
  218. /kaa/sprites/{6a27faad-df3b-49d9-a20f-64ae8e8f9e22.png → bb3990c8-4618-4d96-9365-a4d1213b59f7.png} +0 -0
  219. /kaa/sprites/{e7c00f25-b15a-4403-a201-07b9b168e9f5.png → bbe59f62-c3e7-404c-a313-b50db70de7b5.png} +0 -0
  220. /kaa/sprites/{1472da80-4cbb-41e1-94e8-3ea3defd3b6f.png → bd4cd421-f702-47c0-9f8b-77914973108c.png} +0 -0
  221. /kaa/sprites/{a9f020e9-0e4b-4ddc-b8b8-386009578c15.png → bdb1460e-c5db-494a-a58a-688f72b6bdba.png} +0 -0
  222. /kaa/sprites/{e9fad64b-e4e2-46cb-a820-b2860b38da03.png → bdb72f31-5808-4451-827f-fffc3b616083.png} +0 -0
  223. /kaa/sprites/{8448237d-2db5-49ca-8d55-9fc0e56639a7.png → bf3ff37e-d4fc-42ee-87d6-db1e2040aed5.png} +0 -0
  224. /kaa/sprites/{d8485972-4e67-4190-8d95-60fd3c68b2ce.png → bff753bb-b02e-441b-89e5-14845f18c6f6.png} +0 -0
  225. /kaa/sprites/{bb953e97-7185-4c2c-b177-48d743e90d96.png → c035ac76-39e9-466b-a606-28bc52bc73e8.png} +0 -0
  226. /kaa/sprites/{b93b3c36-79a3-4c1a-944a-20fe6a88c46d.png → c05a600a-d79e-432d-a49f-5b2443d67bd4.png} +0 -0
  227. /kaa/sprites/{4b7426e9-395a-410c-bb99-c6f0a7b81208.png → c0801be3-f07a-4afc-ab0d-7f5d3c4afbd3.png} +0 -0
  228. /kaa/sprites/{b2a04604-15d4-4ff6-86f7-0823e642103f.png → c2100faf-1234-49db-b6d4-5a08a4b08272.png} +0 -0
  229. /kaa/sprites/{011e352f-6e8b-4225-b104-d1b2ccf0761c.png → c4505a31-74c5-4b3d-bfcf-a67c3ef0039e.png} +0 -0
  230. /kaa/sprites/{32de6ba0-859f-4f40-a57e-92bed913e3a7.png → c6b0f9ba-a976-474b-b22d-6fe4391d9373.png} +0 -0
  231. /kaa/sprites/{45af668c-2324-4fe4-83e0-11d65cfaa086.png → c6b6b77b-2ec7-4fb7-8033-f4d061f4e9c8.png} +0 -0
  232. /kaa/sprites/{ba971684-1fe3-47e1-8bdb-d20a0011ea68.png → c76c6ccb-d099-4c3c-9eda-13be33aa48ae.png} +0 -0
  233. /kaa/sprites/{d277a9c3-2b2c-42fc-9fbb-a836413c8cf4.png → c78fb143-18e3-4697-a0c1-6151514f2a7c.png} +0 -0
  234. /kaa/sprites/{7db2d761-ab44-4b3b-85aa-9b9758f97d5d.png → c8c17304-e949-4dfc-b07d-9e7133483e31.png} +0 -0
  235. /kaa/sprites/{aad1ac7d-cfa1-4459-9d46-d39c080bd78e.png → c91874f4-363f-4997-a38e-3e486dfd8043.png} +0 -0
  236. /kaa/sprites/{276c0178-65af-4b69-a3c3-d04253b9ed91.png → c9245201-4d29-4088-a5e0-f4e93d4494b5.png} +0 -0
  237. /kaa/sprites/{b002896d-5093-48e5-9e01-d18bfb240961.png → cb0bbf0f-a25b-4ec4-99bd-f5742270a062.png} +0 -0
  238. /kaa/sprites/{0d2143fa-7e81-4e7a-8a94-c3839719de5b.png → cb15d9a3-78fe-4f03-bd23-90ba6169ddff.png} +0 -0
  239. /kaa/sprites/{7ce3a2d5-efa7-4091-b012-f2870d9df422.png → ccfab3e2-7b6d-4ae3-998b-4e5c1863884a.png} +0 -0
  240. /kaa/sprites/{c05baa1e-02c3-4d02-904f-76086edbb97f.png → cdf310f0-b917-4f92-95a9-893af76e3c3a.png} +0 -0
  241. /kaa/sprites/{89663a2f-c6d3-4bb7-9935-a54d11d0a382.png → cea8f98d-ba68-498f-bd3d-cc10f0d4575b.png} +0 -0
  242. /kaa/sprites/{7156a1b5-cdd7-446e-9caf-d9f6b313ef4d.png → cec36685-85a7-4e84-bbbc-4df70b4f7bac.png} +0 -0
  243. /kaa/sprites/{f35e19ca-7de7-4721-af53-b5f95c5e74fe.png → cf49878d-a1c5-4b9f-9502-1e0d9eaadc49.png} +0 -0
  244. /kaa/sprites/{5d42f16f-3475-4ffb-ac85-3c86fa8fba46.png → d1bdfa3b-34df-488d-9f9b-8c7b04dd4ab3.png} +0 -0
  245. /kaa/sprites/{ef0db31a-fc44-4972-af7e-21c50f0b139c.png → d23a600a-7002-4268-96a4-18dc54928ec6.png} +0 -0
  246. /kaa/sprites/{e5196344-d61a-48ff-bc48-63f8f63c3788.png → d57f792a-f086-4fbe-b4d9-5db629a78d42.png} +0 -0
  247. /kaa/sprites/{16f04ca1-05a3-49c7-88ae-a0d02c1ec2ec.png → d6dd92b3-310f-4f5d-a8ef-b941c3659c0c.png} +0 -0
  248. /kaa/sprites/{c424f4a1-d032-478d-ac82-b1127a429e52.png → d8967770-c64a-4609-a0a5-f46ba81edceb.png} +0 -0
  249. /kaa/sprites/{9d0bf64a-2684-43fa-b9bf-552e60c717b4.png → d8ba1932-978c-451c-a717-d7d2b6db35d9.png} +0 -0
  250. /kaa/sprites/{de047f08-cef2-4b22-846e-fba2a06f8996.png → d91483a2-83fa-4664-8eda-52498c0e77bc.png} +0 -0
  251. /kaa/sprites/{f7e8e937-1eda-4bd3-a3cf-d306cb1973e2.png → d9a636be-a017-4ef5-a70c-c374827008a0.png} +0 -0
  252. /kaa/sprites/{cf302432-c592-4b6f-a6de-53c3e1bef23e.png → dae37bd7-6a34-4eb4-8cd0-3c0c03b4575a.png} +0 -0
  253. /kaa/sprites/{fad8b65b-7d9e-49d8-9f71-6d078aa672ca.png → dc51eccf-9470-495a-9e38-59d4481adbd4.png} +0 -0
  254. /kaa/sprites/{0cdd57aa-9bdd-4c83-9565-de7c229b34e3.png → dcea5aae-322e-4cd4-b218-0eac48690755.png} +0 -0
  255. /kaa/sprites/{c7cad813-2326-4662-9f55-0a15e1dad3dc.png → dcf465c6-ad64-48e7-9c3c-7bc7cfc13a44.png} +0 -0
  256. /kaa/sprites/{9db5de82-8fba-4b69-8faf-ffe7fcea32f8.png → ddb59f04-91a0-4fbd-8921-be13acdab291.png} +0 -0
  257. /kaa/sprites/{f1fa2fc3-c3d4-4040-90f1-7941b98dcee5.png → de81f919-4d01-4a4e-bdc1-ffe6e23a5c22.png} +0 -0
  258. /kaa/sprites/{d73e9e03-b910-42c0-9953-34980bff09f5.png → e05f2c16-926f-48be-bdd0-16182e879394.png} +0 -0
  259. /kaa/sprites/{678073ec-6700-4d94-af41-b392af11201b.png → e2a0c1a6-c0cf-400e-99be-1ed0d35c6ed8.png} +0 -0
  260. /kaa/sprites/{d963e76b-3c25-4bc7-a307-78d97728a819.png → e30922ed-a02f-4ede-9968-1656be5a05b2.png} +0 -0
  261. /kaa/sprites/{e4d0719b-d127-41a0-a250-492f79bf5625.png → e388db01-0870-412d-b8bc-5a512ec997c8.png} +0 -0
  262. /kaa/sprites/{f8babf59-d55e-40c2-a0b7-5d743ab71799.png → e392856d-ac59-4414-8fb8-df93a1a99be4.png} +0 -0
  263. /kaa/sprites/{c71f900b-9689-4800-89a0-e3371d33f47a.png → e57db8c2-c050-43fb-8205-339aeb5875e8.png} +0 -0
  264. /kaa/sprites/{38613745-1cf2-4bf1-9f58-0474b1e46895.png → e687c2ba-2c30-4fc8-804f-fea5815f6765.png} +0 -0
  265. /kaa/sprites/{4b02f8d4-7847-47a5-8f01-7ab5123709e5.png → e6e66204-8a2f-4377-8674-b7d663ff0081.png} +0 -0
  266. /kaa/sprites/{43bc2116-7fe3-4b20-8c8b-3ab2a2b5dd7d.png → e7630ccb-6824-49e3-986f-2a65a2c4a948.png} +0 -0
  267. /kaa/sprites/{b26ac4ff-42a0-45aa-b818-7d7603b52f12.png → e79a2a08-3b58-4ab0-8c2b-769f30cc8591.png} +0 -0
  268. /kaa/sprites/{df11b01f-2ab1-4bfb-831f-bb8dae6a092b.png → ebe22aea-0318-49d8-ab07-ce2eef34265f.png} +0 -0
  269. /kaa/sprites/{bee41ab5-c62e-4a79-a8d0-40f9efbc7e40.png → ec35a0b8-1afa-48ff-ae66-9c1ef966348d.png} +0 -0
  270. /kaa/sprites/{d50d4438-65bc-4849-9a11-7e8b796e1b9d.png → ed6df33a-c7aa-4542-a87b-9cc9cae0465c.png} +0 -0
  271. /kaa/sprites/{ce22506b-7410-4039-94de-dc1bdba8ac00.png → ed854df1-878c-4e0b-8138-9b28d314ede6.png} +0 -0
  272. /kaa/sprites/{e2f64c10-4db0-47c8-b23d-94802493d6fb.png → ed98a341-5dff-4af7-a194-d28232d481a4.png} +0 -0
  273. /kaa/sprites/{fb017237-bac6-4b73-9437-4518e764ef45.png → f0ed1dd3-b227-48c1-8c8c-858dbd84fcc7.png} +0 -0
  274. /kaa/sprites/{aa369159-cc3b-40f2-9fca-bca5b579cf97.png → f1eb4089-8cd1-4830-b00e-40535ddcd116.png} +0 -0
  275. /kaa/sprites/{a31e08c1-d3c3-4a99-a882-4a10de9ba815.png → f237d88e-92ac-4ebf-85e1-80a696b5203a.png} +0 -0
  276. /kaa/sprites/{db25f60d-4772-44f9-85dc-aba4b20cffa2.png → f2f818c9-b0cf-436d-9d3e-6544c5399063.png} +0 -0
  277. /kaa/sprites/{5c735cc5-7801-44e9-a8f1-2d44df4fa919.png → f333118a-81c2-417f-b54f-64dc4e8df613.png} +0 -0
  278. /kaa/sprites/{54d67100-70c7-4a00-afaa-a80771d34893.png → f34e8026-bdfc-47e6-a0ed-49e587ef0f40.png} +0 -0
  279. /kaa/sprites/{ab9e39ae-0856-4254-a6b6-585e82f8bf3b.png → f3a5992b-dabf-4c2b-83e9-4c91c3b7aac8.png} +0 -0
  280. /kaa/sprites/{993f2140-77be-4fe2-8e11-f71c4531bc9a.png → f4195ceb-586a-4a8c-9424-4962239d2120.png} +0 -0
  281. /kaa/sprites/{a408adaa-bfab-4aaf-acf7-08a4a3ebdd4c.png → f485db66-2159-4d31-ba53-0fbb726e7f64.png} +0 -0
  282. /kaa/sprites/{dd6f31d1-510d-4425-a160-958e7e984382.png → f7264cee-fea6-47b5-9f9b-8f3f31c03ea0.png} +0 -0
  283. /kaa/sprites/{eeff3d53-5a40-44c2-9d09-8f246157c72b.png → f7e34403-a53c-4d3f-935b-25b4acb7f7a5.png} +0 -0
  284. /kaa/sprites/{a9868db0-b355-470e-9bbe-033c5efa4b5e.png → f8d8c943-1b36-4391-a7fc-2a49f8966d53.png} +0 -0
  285. /kaa/sprites/{edd2d38d-9071-4094-8931-1a68b6ebe1b8.png → f9157db8-d70b-4d46-9800-5a833ce7eda8.png} +0 -0
  286. /kaa/sprites/{c0478a52-d6c5-4029-848f-e3e22b2de858.png → f9a353b2-958d-4aae-ade4-66bdc6481e35.png} +0 -0
  287. /kaa/sprites/{c54d4b7e-887c-4753-8a9e-6914fc408232.png → fa5b5b92-9c60-4811-a44c-8e897c9632c3.png} +0 -0
  288. /kaa/sprites/{e6f8f2a8-39e3-45e1-8a52-f2dc250bcd95.png → fac7b90a-1174-477b-803b-28798647c307.png} +0 -0
  289. /kaa/sprites/{b00b5890-3743-4064-8311-c5e35b3afbe6.png → fbbb73f9-880e-4c7f-9ec9-276bdab4b394.png} +0 -0
  290. /kaa/sprites/{d14a1c6c-339a-4dfe-9078-950d3518bc3b.png → fce4a481-e71c-4dab-aeac-59ff8b18201b.png} +0 -0
  291. /kaa/sprites/{4c243ed4-9ac2-42ba-89c6-946ffef84120.png → fd8a7a5d-f021-4bfd-83f7-a2dd33325837.png} +0 -0
  292. /kaa/sprites/{9b7eaa4c-2b67-4426-80da-b7538a87ed96.png → fda4b3eb-e31a-448b-8cb3-9126e1ab7deb.png} +0 -0
  293. /kaa/sprites/{8a312cf5-c670-4a52-a03b-fe55e78f8f07.png → fda78372-04b4-4d55-92b1-aedec20d0913.png} +0 -0
  294. /kaa/sprites/{cc727107-139b-4092-bafb-4bc9787bcdfd.png → fe993a91-1a49-488e-b7ff-c1b05b8f2b5f.png} +0 -0
  295. /kaa/sprites/{b5584de5-650e-4fde-b743-ccbd02eab196.png → ff8efb8f-e1a4-4202-a6e1-680eb44f58da.png} +0 -0
  296. {ksaa-2025.11.dist-info → ksaa-2025.11b3.dist-info}/WHEEL +0 -0
  297. {ksaa-2025.11.dist-info → ksaa-2025.11b3.dist-info}/entry_points.txt +0 -0
  298. {ksaa-2025.11.dist-info → ksaa-2025.11b3.dist-info}/licenses/LICENSE +0 -0
  299. {ksaa-2025.11.dist-info → ksaa-2025.11b3.dist-info}/top_level.txt +0 -0
@@ -1,171 +0,0 @@
1
- import gradio as gr
2
- from kaa.application.ui.facade import KaaFacade, ConfigValidationError
3
- from kaa.application.ui.common import GradioComponents
4
-
5
- class StatusView:
6
- def __init__(self, facade: KaaFacade, components: GradioComponents):
7
- self.facade = facade
8
- self.components = components
9
-
10
- def create_ui(self):
11
- """Creates the content for the 'Status' tab."""
12
- gr.Markdown("## 状态")
13
-
14
- def _get_end_action_value() -> str:
15
- end_game_opts = self.facade.config_service.get_options().end_game
16
- if end_game_opts.shutdown:
17
- return "完成后关机"
18
- if end_game_opts.hibernate:
19
- return "完成后休眠"
20
- return "完成后什么都不做"
21
-
22
- with gr.Row():
23
- run_btn = gr.Button("启动", scale=0, variant='primary', min_width=300)
24
- pause_btn = gr.Button("暂停", scale=0)
25
- with gr.Column(scale=0):
26
- end_action_dropdown = gr.Dropdown(
27
- show_label=False,
28
- choices=["完成后什么都不做", "完成后关机", "完成后休眠"],
29
- value=_get_end_action_value(),
30
- interactive=True,
31
- elem_classes="no-padding-dropdown",
32
- )
33
-
34
- self.components.run_btn = run_btn
35
- self.components.pause_btn = pause_btn
36
- self.components.end_action_dropdown = end_action_dropdown
37
-
38
- gr.Markdown("### 快速设置")
39
-
40
- with gr.Row():
41
- select_all_btn = gr.Button("全选", scale=0)
42
- unselect_all_btn = gr.Button("清空", scale=0)
43
- select_produce_only_btn = gr.Button("只选培育", scale=0)
44
- unselect_produce_only_btn = gr.Button("只不选培育", scale=0)
45
-
46
- with gr.Row(elem_classes=["quick-controls-row"]):
47
- opts = self.facade.config_service.get_options()
48
- purchase_quick = gr.Checkbox(label="商店", value=opts.purchase.enabled, interactive=True)
49
- assignment_quick = gr.Checkbox(label="工作", value=opts.assignment.enabled, interactive=True)
50
- contest_quick = gr.Checkbox(label="竞赛", value=opts.contest.enabled, interactive=True)
51
- produce_quick = gr.Checkbox(label="培育", value=opts.produce.enabled, interactive=True)
52
- mission_reward_quick = gr.Checkbox(label="任务", value=opts.mission_reward.enabled, interactive=True)
53
- club_reward_quick = gr.Checkbox(label="社团", value=opts.club_reward.enabled, interactive=True)
54
- activity_funds_quick = gr.Checkbox(label="活动费", value=opts.activity_funds.enabled, interactive=True)
55
- presents_quick = gr.Checkbox(label="礼物", value=opts.presents.enabled, interactive=True)
56
- capsule_toys_quick = gr.Checkbox(label="扭蛋", value=opts.capsule_toys.enabled, interactive=True)
57
- upgrade_support_card_quick = gr.Checkbox(label="支援卡", value=opts.upgrade_support_card.enabled, interactive=True)
58
-
59
- self.components.quick_checkboxes = [
60
- purchase_quick, assignment_quick, contest_quick, produce_quick,
61
- mission_reward_quick, club_reward_quick, activity_funds_quick, presents_quick,
62
- capsule_toys_quick, upgrade_support_card_quick
63
- ]
64
-
65
- if self.facade._kaa.upgrade_msg:
66
- gr.Markdown('### 配置升级报告')
67
- gr.Markdown(self.facade._kaa.upgrade_msg)
68
- gr.Markdown('脚本报错或者卡住?前往"反馈"选项卡可以快速导出报告!')
69
-
70
- if self.facade.config_service.get_current_user_config().keep_screenshots:
71
- gr.Markdown(
72
- '<div style="color: red; font-size: larger;">当前启用了调试功能「保留截图数据」,调试结束后正常使用时建议关闭此选项!</div>'
73
- )
74
-
75
- with gr.Row():
76
- task_runtime_text = gr.Textbox(
77
- label="任务运行时间",
78
- value="未运行",
79
- interactive=False,
80
- scale=1
81
- )
82
- self.components.task_runtime_text = task_runtime_text
83
-
84
- task_status_df = gr.Dataframe(headers=["任务", "状态"], label="任务状态")
85
- self.components.task_status_df = task_status_df
86
-
87
- # --- Event Handlers ---
88
-
89
- def on_run_click():
90
- if self.facade.task_service.is_running_all:
91
- self.facade.stop_all_tasks()
92
- else:
93
- self.facade.start_all_tasks()
94
-
95
- def on_pause_click():
96
- self.facade.toggle_pause()
97
-
98
- def save_quick_setting(success_msg: str, failed_msg: str):
99
- """保存快速设置并立即应用"""
100
- try:
101
- # 保存配置
102
- msg = self.facade.save_configs()
103
- # 尝试热重载配置
104
- gr.Success(success_msg)
105
- except (ConfigValidationError, RuntimeError) as e:
106
- gr.Warning(str(e))
107
- except Exception as e:
108
- gr.Error(f"保存失败: {e}")
109
-
110
- def update_and_save_quick_setting(field_name: str, value: bool, display_name: str):
111
- """更新字段,并保存快速设置并立即应用"""
112
- # 更新配置
113
- options = self.facade.config_service.get_options()
114
- parts = field_name.split('.')
115
- obj = options
116
- for part in parts[:-1]:
117
- obj = getattr(obj, part)
118
- setattr(obj, parts[-1], value)
119
- save_quick_setting(
120
- f"✓ {display_name} 已{'启用' if value else '禁用'}",
121
- f"⚠ {display_name} 设置已保存但重载失败"
122
- )
123
-
124
- def batch_select(default: bool, produce_only: bool, success_msg: str):
125
- opts = self.facade.config_service.get_options()
126
- opts.purchase.enabled = default
127
- opts.assignment.enabled = default
128
- opts.contest.enabled = default
129
- opts.produce.enabled = produce_only
130
- opts.mission_reward.enabled = default
131
- opts.club_reward.enabled = default
132
- opts.activity_funds.enabled = default
133
- opts.presents.enabled = default
134
- opts.capsule_toys.enabled = default
135
- opts.upgrade_support_card.enabled = default
136
- save_quick_setting(success_msg, "⚠ 数据已保存,但重新加载失败")
137
-
138
- def save_quick_end_action(action: str):
139
- opts = self.facade.config_service.get_options().end_game
140
- if action == "完成后关机":
141
- opts.shutdown = True
142
- opts.hibernate = False
143
- elif action == "完成后休眠":
144
- opts.shutdown = False
145
- opts.hibernate = True
146
- else: # This covers "完成后什么都不做"
147
- opts.shutdown = False
148
- opts.hibernate = False
149
- save_quick_setting(f"✓ 完成后操作已设置为 {action}", "⚠ 设置已保存,但重新加载失败")
150
-
151
- # --- UI Callbacks ---
152
- run_btn.click(fn=on_run_click, outputs=None)
153
- pause_btn.click(fn=on_pause_click, outputs=None)
154
-
155
- select_all_btn.click(fn=lambda: batch_select(True, True, "✓ 全选成功"), outputs=None)
156
- unselect_all_btn.click(fn=lambda: batch_select(False, False, "✓ 清空成功"), outputs=None)
157
- select_produce_only_btn.click(fn=lambda: batch_select(False, True, "✓ 只选培育成功"), outputs=None)
158
- unselect_produce_only_btn.click(fn=lambda: batch_select(True, False, "✓ 只不选培育成功"), outputs=None)
159
-
160
- # .input is used to only trigger on user interaction
161
- purchase_quick.input(fn=lambda x: update_and_save_quick_setting('purchase.enabled', x, '商店'), inputs=[purchase_quick])
162
- assignment_quick.input(fn=lambda x: update_and_save_quick_setting('assignment.enabled', x, '工作'), inputs=[assignment_quick])
163
- contest_quick.input(fn=lambda x: update_and_save_quick_setting('contest.enabled', x, '竞赛'), inputs=[contest_quick])
164
- produce_quick.input(fn=lambda x: update_and_save_quick_setting('produce.enabled', x, '培育'), inputs=[produce_quick])
165
- mission_reward_quick.input(fn=lambda x: update_and_save_quick_setting('mission_reward.enabled', x, '任务奖励'), inputs=[mission_reward_quick])
166
- club_reward_quick.input(fn=lambda x: update_and_save_quick_setting('club_reward.enabled', x, '社团奖励'), inputs=[club_reward_quick])
167
- activity_funds_quick.input(fn=lambda x: update_and_save_quick_setting('activity_funds.enabled', x, '活动费'), inputs=[activity_funds_quick])
168
- presents_quick.input(fn=lambda x: update_and_save_quick_setting('presents.enabled', x, '礼物'), inputs=[presents_quick])
169
- capsule_toys_quick.input(fn=lambda x: update_and_save_quick_setting('capsule_toys.enabled', x, '扭蛋'), inputs=[capsule_toys_quick])
170
- upgrade_support_card_quick.input(fn=lambda x: update_and_save_quick_setting('upgrade_support_card.enabled', x, '支援卡升级'), inputs=[upgrade_support_card_quick])
171
- end_action_dropdown.change(fn=save_quick_end_action, inputs=[end_action_dropdown])
@@ -1,102 +0,0 @@
1
- import gradio as gr
2
- from kaa.application.ui.facade import KaaFacade
3
- from kaa.application.ui.common import GradioComponents
4
-
5
- class TaskView:
6
- def __init__(self, facade: KaaFacade, components: GradioComponents):
7
- self.facade = facade
8
- self.components = components
9
-
10
- def create_ui(self):
11
- """Creates the content for the 'Task' tab for running single tasks."""
12
- gr.Markdown("## 执行任务")
13
-
14
- # Get all tasks from the facade
15
- task_names = self.facade.task_service.get_all_task_names()
16
-
17
- with gr.Row():
18
- stop_all_btn = gr.Button("停止任务", variant="stop", scale=1)
19
- pause_btn = gr.Button("暂停", scale=1)
20
-
21
- task_result = gr.Markdown("")
22
-
23
- task_buttons = []
24
- for task_name in task_names:
25
- with gr.Row():
26
- with gr.Column(scale=1, min_width=50):
27
- task_btn = gr.Button("启动", variant="primary", size="sm")
28
- task_buttons.append(task_btn)
29
- with gr.Column(scale=7):
30
- gr.Markdown(f"### {task_name}")
31
-
32
- def start_single_task_by_name(task_name: str):
33
- """Event handler to start a single task."""
34
- try:
35
- self.facade.task_service.start_single_task(task_name)
36
- gr.Info(f"任务 {task_name} 开始执行")
37
- except ValueError as e:
38
- gr.Warning(str(e))
39
- except Exception as e:
40
- gr.Error(f"启动任务失败: {e}")
41
-
42
- def stop_all_tasks():
43
- """Event handler to stop the running single task."""
44
- self.facade.task_service.stop_tasks()
45
- self.facade.idle_mgr.notify_on_stop()
46
-
47
- def on_pause_click():
48
- self.facade.toggle_pause()
49
-
50
- # Bind click events
51
- for i, task_name in enumerate(task_names):
52
- # Use a closure/factory function to capture the correct task_name
53
- def create_handler(name):
54
- return lambda: start_single_task_by_name(name)
55
- task_buttons[i].click(fn=create_handler(task_name), outputs=None)
56
-
57
- stop_all_btn.click(fn=stop_all_tasks, outputs=None)
58
- pause_btn.click(fn=on_pause_click, outputs=None)
59
-
60
- # --- Timers for status updates ---
61
-
62
- def update_task_ui_status():
63
- tcs = self.facade.task_service
64
- is_running = tcs.is_running_single
65
- is_stopping = tcs.is_stopping
66
-
67
- # Update buttons
68
- btn_updates = {}
69
- if is_running or is_stopping:
70
- btn_text = "停止中" if is_stopping else "运行中"
71
- for btn in task_buttons:
72
- btn_updates[btn] = gr.Button(value=btn_text, interactive=False)
73
- else:
74
- for btn in task_buttons:
75
- btn_updates[btn] = gr.Button(value="启动", interactive=True)
76
-
77
- # Update status message
78
- status_msg = ""
79
- if is_running:
80
- for name, status in tcs.get_task_statuses():
81
- if status == 'running':
82
- status_msg = f"正在执行任务: {name}"
83
- break
84
- elif not tcs.run_status or not tcs.run_status.running:
85
- # Task finished, find final status
86
- if tcs.run_status and tcs.run_status.tasks:
87
- final_status = tcs.run_status.tasks[0]
88
- status_map = {'finished': '已完成', 'error': '出错', 'cancelled': '已取消'}
89
- status_msg = f"任务 {final_status.task.name} {status_map.get(final_status.status, '已结束')}"
90
-
91
- btn_updates[task_result] = gr.Markdown(value=status_msg)
92
-
93
- # Update pause button
94
- pause_status = self.facade.get_pause_button_status()
95
- btn_updates[pause_btn] = gr.Button(value=pause_status['text'], interactive=pause_status['interactive'])
96
-
97
- return btn_updates
98
-
99
- gr.Timer(1.0).tick(
100
- fn=update_task_ui_status,
101
- outputs=task_buttons + [task_result, pause_btn]
102
- )
@@ -1,106 +0,0 @@
1
- import gradio as gr
2
- import logging
3
- from typing import Generator, Tuple
4
- from kaa.application.ui.facade import KaaFacade
5
- from kaa.application.ui.common import GradioComponents
6
- from kaa.errors import UpdateServiceError, UpdateFetchListError
7
-
8
- logger = logging.getLogger(__name__)
9
-
10
- class UpdateView:
11
- def __init__(self, facade: KaaFacade, components: GradioComponents):
12
- self.facade = facade
13
- self.components = components
14
-
15
- def create_ui(self):
16
- """Creates the content for the 'Update' tab."""
17
- with gr.Tab("更新"):
18
- gr.Markdown("## 版本管理")
19
-
20
- with gr.Accordion("更新日志", open=False):
21
- try:
22
- from kaa.metadata import WHATS_NEW
23
- gr.Markdown(WHATS_NEW)
24
- except ImportError:
25
- gr.Markdown("更新日志不可用")
26
-
27
- load_info_btn = gr.Button("载入信息", variant="primary")
28
- status_text = gr.Markdown("")
29
- version_dropdown = gr.Dropdown(
30
- label="选择要安装的版本",
31
- choices=[],
32
- value=None,
33
- visible=False,
34
- interactive=True
35
- )
36
- install_selected_btn = gr.Button("安装选定版本", visible=False)
37
-
38
- # Store components for later access
39
- self.components.update_status_text = status_text
40
- self.components.update_version_dropdown = version_dropdown
41
- self.components.update_install_btn = install_selected_btn
42
-
43
- def on_load_info():
44
- """使用 UpdateService 加载版本信息。"""
45
- yield (
46
- "正在载入版本信息...",
47
- gr.Button(value="载入中...", interactive=False),
48
- gr.Dropdown(visible=False),
49
- gr.Button(visible=False)
50
- )
51
- try:
52
- versions_data = self.facade.update_service.list_remote_versions()
53
- except UpdateFetchListError as e:
54
- gr.Error(str(e))
55
- yield (
56
- str(e),
57
- gr.Button(value="载入信息", interactive=True),
58
- gr.Dropdown(visible=False),
59
- gr.Button(visible=False)
60
- )
61
- return
62
-
63
- status_info = [
64
- f"**当前安装版本:** {versions_data.installed_version or '未知'}",
65
- f"**最新版本:** {versions_data.latest or '未知'}",
66
- ]
67
- if versions_data.launcher_version:
68
- if versions_data.launcher_version == "0.4.x":
69
- status_info.append("**启动器版本:** < v0.5.0 (旧版本)")
70
- else:
71
- status_info.append(f"**启动器版本:** v{versions_data.launcher_version}")
72
- else:
73
- status_info.append("**启动器版本:** 未知")
74
-
75
- status_info.append(f"**找到 {len(versions_data.versions)} 个可用版本**")
76
- status_message = "\n\n".join(status_info)
77
-
78
- yield (
79
- status_message,
80
- gr.Button(value="载入信息", interactive=True),
81
- gr.Dropdown(choices=versions_data.versions, value=versions_data.versions[0] if versions_data.versions else None, visible=True),
82
- gr.Button(visible=True)
83
- )
84
-
85
- def on_install_selected(selected_version: str):
86
- """使用 UpdateService 安装所选版本。"""
87
- if not selected_version:
88
- gr.Warning("请先选择一个版本。")
89
- return
90
-
91
- try:
92
- self.facade.update_service.install_version(selected_version)
93
- gr.Info(f"正在启动器中安装版本 {selected_version},程序将自动重启...")
94
- except UpdateServiceError as e:
95
- gr.Error(str(e))
96
-
97
- load_info_btn.click(
98
- fn=on_load_info,
99
- outputs=[status_text, load_info_btn, version_dropdown, install_selected_btn]
100
- )
101
-
102
- install_selected_btn.click(
103
- fn=on_install_selected,
104
- inputs=[version_dropdown],
105
- outputs=[]
106
- )
kaa/util/reactive.py DELETED
@@ -1,182 +0,0 @@
1
- from typing import TypeVar, Generic, Any, Callable, Optional, cast
2
-
3
- # T: 原始对象的类型 (Root)
4
- # V: 属性值的类型 (Leaf)
5
- T = TypeVar("T")
6
- V = TypeVar("V")
7
-
8
- class PathRecorder(Generic[T]):
9
- """
10
- 记录路径操作(属性访问 或 索引访问)
11
- """
12
- # FIX: 显式声明 path 可以为 None
13
- def __init__(self, root: Any = None, path: Optional[list[tuple[str, Any]]] = None):
14
- self._root = root
15
- # path 存储操作记录: ('attr', 'name') 或 ('item', 'key')
16
- self._path: list[tuple[str, Any]] = path if path is not None else []
17
-
18
- def __getattr__(self, name: str) -> "PathRecorder":
19
- # 记录 .attr 操作
20
- return PathRecorder(self._root, self._path + [('attr', name)])
21
-
22
- def __getitem__(self, key: Any) -> "PathRecorder":
23
- # 记录 [key] 操作
24
- return PathRecorder(self._root, self._path + [('item', key)])
25
-
26
- # 内部接口
27
- def _get_recorder_info(self) -> tuple[Any, list[tuple[str, Any]]]:
28
- return self._root, self._path
29
-
30
- def of(obj: T) -> T:
31
- """
32
- Proxy 入口。类型标记返回 T 以获得 IDE 提示,运行时返回 Recorder。
33
- """
34
- return cast(T, PathRecorder(root=obj))
35
-
36
- def _traverse(target: Any, path: list[tuple[str, Any]]) -> tuple[Any, str, Any]:
37
- """
38
- 辅助函数:遍历路径,返回 (parent_container, last_op_type, last_key)
39
- """
40
- current = target
41
-
42
- # 遍历直到倒数第二个节点(获取父容器)
43
- for op_type, key in path[:-1]:
44
- if op_type == 'attr':
45
- current = getattr(current, key)
46
- elif op_type == 'item':
47
- current = current[key]
48
-
49
- # 获取最后一个操作的信息
50
- last_op, last_key = path[-1]
51
- return current, last_op, last_key
52
-
53
- def getter(proxy: V) -> Callable[[], V]:
54
- """
55
- 创建一个 getter 函数。
56
- """
57
- # 运行时检查
58
- if not isinstance(proxy, PathRecorder):
59
- raise TypeError("getter argument must be a proxy object created by of()")
60
-
61
- # 显式转换类型以通过静态检查
62
- recorder = cast(PathRecorder, proxy)
63
- root, path = recorder._get_recorder_info()
64
-
65
- if not path:
66
- return lambda: cast(V, root)
67
-
68
- def _getter_impl() -> V:
69
- parent, last_op, last_key = _traverse(root, path)
70
-
71
- if last_op == 'attr':
72
- return getattr(parent, last_key)
73
- elif last_op == 'item':
74
- return parent[last_key]
75
-
76
- # FIX: 抛出异常而不是返回 None,以满足返回类型 V
77
- raise ValueError(f"Unknown operation type: {last_op}")
78
-
79
- return _getter_impl
80
-
81
- def setter(proxy: V) -> Callable[[V], None]:
82
- """
83
- 创建一个 setter 函数。
84
- """
85
- if not isinstance(proxy, PathRecorder):
86
- raise TypeError("setter argument must be a proxy object created by of()")
87
-
88
- recorder = cast(PathRecorder, proxy)
89
- root, path = recorder._get_recorder_info()
90
-
91
- if not path:
92
- raise ValueError("Cannot set root object directly")
93
-
94
- def _setter_impl(value: V) -> None:
95
- parent, last_op, last_key = _traverse(root, path)
96
-
97
- if last_op == 'attr':
98
- setattr(parent, last_key, value)
99
- elif last_op == 'item':
100
- parent[last_key] = value
101
- else:
102
- raise ValueError(f"Unknown operation type: {last_op}")
103
-
104
- return _setter_impl
105
-
106
- class Ref(Generic[T]):
107
- """
108
- 持有对特定数据路径的引用,支持读写。
109
- Ref 接收一个 path recorder 代理对象。
110
- """
111
- def __init__(self, proxy: T):
112
- self._getter_fn = getter(proxy)
113
- self._setter_fn = setter(proxy)
114
-
115
- @property
116
- def value(self) -> T:
117
- return self._getter_fn()
118
-
119
- @value.setter
120
- def value(self, new_value: T) -> None:
121
- self._setter_fn(new_value)
122
-
123
- def ref(proxy: T) -> Ref[T]:
124
- """
125
- 创建一个引用对象 (Ref),用于直接读写路径记录器的目标值。
126
-
127
- Example:
128
- name_ref = ref(of(user).name)
129
- name_ref.value = "Bob"
130
- """
131
- return Ref(proxy)
132
-
133
- if __name__ == "__main__":
134
- class Address:
135
- def __init__(self, city):
136
- self.city = city
137
- def __repr__(self):
138
- return f"Address(city='{self.city}')"
139
-
140
- class User:
141
- def __init__(self, name, city):
142
- self.name = name
143
- self.addresses = {"home": Address(city)}
144
- def __repr__(self):
145
- return f"User(name='{self.name}', addresses={self.addresses})"
146
-
147
- data = User("Alice", "New York")
148
- print(f"Original Data: {data}")
149
-
150
- # 1. 测试 Getter (混合 属性 和 字典索引)
151
- get_city = getter(of(data).addresses["home"].city)
152
- print(f"Getter result: {get_city()}") # Output: New York
153
-
154
- # 2. 测试 Setter
155
- set_city = setter(of(data).addresses["home"].city)
156
- set_city("San Francisco")
157
- print(f"After Setter: {data.addresses['home'].city}") # Output: San Francisco
158
-
159
- # 3. 测试 Ref (引用)
160
- print("-" * 30)
161
- print("Testing Ref...")
162
-
163
- # 创建一个指向 user.name 的 Ref
164
- name_ref = ref(of(data).name)
165
-
166
- print(f"Ref initial value: {name_ref.value}") # Alice
167
-
168
- # 修改 Ref,应该影响原始对象
169
- name_ref.value = "Bob"
170
- print(f"Ref value set to 'Bob'.")
171
- print(f"Original object name: {data.name}") # Bob
172
-
173
- # 修改原始对象,Ref 应该能感知
174
- data.name = "Charlie"
175
- print(f"Original object name set to 'Charlie'.")
176
- print(f"Ref value: {name_ref.value}") # Charlie
177
-
178
- # 复杂路径 Ref
179
- city_ref = ref(of(data).addresses["home"].city)
180
- print(f"City Ref value: {city_ref.value}") # San Francisco
181
- city_ref.value = "Tokyo"
182
- print(f"City Ref set to 'Tokyo'. Original: {data.addresses['home'].city}")
File without changes