// ==UserScript== // @name 🫧404小站 — 学习通阅读助手 // @namespace https://scriptcat.org/users/yyy404 // @version 2.1.0 // @description 超星学习通阅读助手:逐段/整页/像素滚动(随机步长/间隔/停顿);资料页course目录;浮动自嘲熊控件;K/Z/S/R 或点熊操作 // @author yyy404 // @homepage https://scriptcat.org/zh-CN/script-show-page/3990 // @supportURL https://scriptcat.org/zh-CN/script-show-page/3990/comment // @icon https://pan-yz.chaoxing.com/favicon.ico // @icon https://pan-yz.neauce.com/favicon.ico // @match *://*.chaoxing.com/* // @match *://mooc1-*.chaoxing.com/* // @connect s1.aigei.com // @connect aigei.com // @grant GM_getValue // @grant GM_setValue // @grant GM_getResourceURL // @resource bearRun https://s1.aigei.com/src/img/gif/33/332524b9bbe34f029fc0f2744ebcfd27.gif?e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:zufjktQMAvjjC6hhOdGSlI_oXsY= // @resource bearEat https://s1.aigei.com/src/img/gif/ad/adc5c174b4a94e93b67702a76adb63d4.gif?imageMogr2/auto-orient/thumbnail/!282x282r/gravity/Center/crop/282x282/quality/85/%7CimageView2/2/w/282&e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:JhiMrZ_DLfOiBqibRnWMMHtUN6U= // @run-at document-end // ==/UserScript== (function() { 'use strict'; // 全局状态管理(跨页面保持) window.readingAssistantGlobalState = window.readingAssistantGlobalState || { isRunning: false, isPaused: false, scrollPosition: 0, manuallyPaused: false, startTime: 0, chapterElapsed: 0, timerInterval: null }; // 防重复跳转锁 let hasAutoJump = false; // 配置 const BEAR_URL = { run: (typeof GM_getResourceURL === 'function' ? GM_getResourceURL('bearRun') : '') || 'https://s1.aigei.com/src/img/gif/33/332524b9bbe34f029fc0f2744ebcfd27.gif?e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:zufjktQMAvjjC6hhOdGSlI_oXsY=', eat: (typeof GM_getResourceURL === 'function' ? GM_getResourceURL('bearEat') : '') || 'https://s1.aigei.com/src/img/gif/ad/adc5c174b4a94e93b67702a76adb63d4.gif?imageMogr2/auto-orient/thumbnail/!282x282r/gravity/Center/crop/282x282/quality/85/%7CimageView2/2/w/282&e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:JhiMrZ_DLfOiBqibRnWMMHtUN6U=' }; const REWARD_QR = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCACMAIwDAREAAhEBAxEB/8QAHgAAAgIBBQEAAAAAAAAAAAAAAAkHCAYCAwQFCgH/xAA2EAABBAMAAQIFAwMCBAcAAAAFAwQGBwECCAkAERITFBUhFjFRChdBImEYcYGxGSMkM6HB8P/EAB0BAQABBQEBAQAAAAAAAAAAAAAGAQIFBwgDBAn/xAA4EQABAwMDAgQEBQMCBwAAAAABAAIDBAURBhIhEzEHIkFRFDJhgQgVI0JxM6HwkcE0UmJysdHx/9oADAMBAAIRAxEAPwD374xjGMYx+2PxjH8Y/wAY/wCnoi++iI9ER6Ij0RHoixiRTWHRF1G2MqlccjT2ZHUYvEGZ42MDupVJnDVy9bxyONyDpuqbOuGTJ67QEjdXL9VqzdONEMpN1t9CLXMZYEgkQlM5krlRnG4bHDcrPvEm67tVqEjwxyXKuk2jbRVy63QYNF1tG7ZJVwvtphJBNRXbXTJFDPJ3U1P9q891r07Qpgidqi1xL8tFCJcUuEKZ0EHy8WMsSQpztuqxIiJCBLiXyHzFU9XTFXKKyyOyau5FxB/V1Uk+rT/GjVOa5uaNUyKvgrlaEn28E0gRmVrwxjs2nyzXSOPD+5pDOMgGrtUhlp85ynopgeW0HkU2zCbw2vg2ZFO5XG4XH9X4oVsclZwXHQ+pQ6SbBwg3JMw7ZMsPzBZ40GC2fzvqSBB02ZM0lnS6SW5FlHoiPREeiI9ER6Ij0RbW6Cam3xb6++fb2/f/ABj0RbvoiPREeiIznGMZznPtjH5znP7Yx/OfRFpxtrt7/DnGfb+M4z/2zn/59ESexXklsKL+YyUeM+763iELgNkUIDunje1hxp+qdthwDH7b2tEZIweZ+1IHBT8XNXIcYK1QeMo5CFChDJHEnH5GkXZeXnkCsejq35zuuyukR3JrDg/pyuuvf71GBzAgHGia9VcYLR0koUNhGAlM88cg12ZlXchu3KCmDLUSRTIKtVCJlBtjFrvp4yNEm2RmFW7XJJiMkgVygRHFovPI2u3ZGxLtFTds/ZPxRVJ+wcpLbIOkFUlU1MpqY29EVJfEbxJNPHPwBRnHE+nkbsuR1AtaP1ExiYomHCkm0+uOwbOZJINDCqhDKo9tNE2DhZbCWN1m2+iSe6SejhwRTlBNrvd9c3qqZvGoZXz+LgtXDoVRcdCNNbfqmfum5d/J5DYcgQeKuVQ86YKMnsWHv26Puza7bMG7ZJo6dmSKDvJ/490/JNS9VUgStZ/VcWhPSlRXpM8j49pItrBjNZqnl3lbuEdy4fUWkddlmJJseyoQwKIBGauwh/pvtpoRXVuqzR9JU7aNwFAx6RCqpryYWGRj0VHbl5OdHwuOkZC6Dx4Wl7bvzZJAduzFtNc6/PerIp521xtnOCKpfi86T6L6+4qqfo/qGmg1CWTa20oko6twyhn4R9cryYmlWpUk1PrOCjAtIYckKNPG7lbGVsPUn+rMRq9wFHETAsba5znGNtc5x/jGcZz7ft7+2M+/t7/j8/59EWr0RHoiPREeiI9ER6Ij0RbSm6fw50230xnfXOMa53xjOcbYzjHt+cZ/OMZ9vh/OfbPt+ceiJU/jp5Q7I5Pt7tgHeXSxTo3miybdaWjygpP5PI5bbtbspfscJ2NB5MSPNcpNYyIIrgR0THijD8XukOemGouOLmHw3JFTb+os5knJ/nCrfITz0LaqdT+MmzRXSsJefAth0eqoM9GvrhhDvZuu3UchFRIcbMSLP33cuB8UKixnylzjjVwRNspm1ad7/wCMK/t5nEIlZFRdJUwJlDiATtgGlkVLMpQF1UMwSZjCLMiHI6iC+r2MyZk+HLpIEBz5u6ZarN1ENCLIeRS98G+ea8ddJVFX9C3AiOdjZFUlXSlpM4FC2YoyQHRYfHDzFsgzUZLxRqDe4YtktkBCrjdgjnKTbTXUiqJ4uph3fJ9O6RfcoyRoKw3ve/Y1zOdkMRCw9CRcxNXopStXcVbhmTL73Ckm+7vMdkhT7kYIN3KrYibJOWG+yBFinA/HtXVR3N5SeuIN1LH+hZL1Hb1axmwIKGTAqvOb5FSkdkbReq5GXDSY6sQONEJmya6DioiKEI8ECiWLlk8d7vHGSLIucfIlLuiPJ13HxCBq4QjUPF0GqNQ5daMmWXKmLZsocgb3g6sZ3GaNdWKQrJvCRBmUUXGvYg+RIpL5PMkxJFXHyHdwdHaeSPx2eNzjA3gBPLGl6XR3XMqVAR+SMI1yTAH7xEzFSTcyNL6i9bLyMk4xMw02CmWRdhERoUrqvKN8okTLO7uyKs4A5St3qm3V3GIpV0dy9aBR2U8l5fLCbhERD4UE1W21S+6SmRPB4lust7NWCS65J7skxZOVdCJd3gxgHaRSlbV7T7vsudP7a7nnDS44zQkhKmMQ3m2qU0SCNdQyIRYq8cIxV0Xj5Fs/KMWyDF5gQ1iraRpOpWzOPnBE87XbXbHvrnGf3x+M4z7Zxn2zjPtnP7Z/f0RavREeiI9ER6Ij0RbOyumU99tN8be2m22M6bYz74xr7++ufzjP+2cYzj3/ABn+PRF4iYNB6n8mlTSHySeSaQdwXNGLk7eOcrc0cz8qG7DYw/meFtbDe1hCpFI4ZVroa++8avRrwzPrCMvnmHeXodkPCkzRYeLIETXPGFJr253678hniye3JKOhYZzNA6fuTlSwrvLPJJOYnF7qBHXSdR2fNG+uTEnFxGRNxmoQls2yWxHVXuG+EG2BYxgROX52G9Anee4cH7VF0sQvUqALjrhEUyjJCVKkFXxUy2bsI42n6OZA8Eu4kqIbnGh1JZNUsoXQR+oGZbKKkWG17elIxfoUrwLXVeSSDnKmoiLW2xbAKzVi9HCK9Oyd5Dg0aiUgHN2cc0OMn7PdTeMjGaDdBh85Rq4WWHlW7AiVf4yor0bQ3lU8x9HWIJu89QNiWTWXVlC2RPU5MVr5JxbbE07ncLhEoLZ+xatxRZ63joyOR/dX7UKgCg9/o2UFJfPIvQVn29vznGMfjH5z7fvn2xj3/wB85xj/AHzn29EUXxKrqqqXWxpBWdaw2GkLGlBmzbGXg8YDgiNiT4k1RwUlknWENGysjlphNo2Qcmimzsk821T+cupnOfciQp/ThUHbEconrrsnomGymDX3312RcN2H45NI4aiEjCQcfIiQ2HjHsZPoNyAvXEiIT4sJxhLRspGy4LVp8SCCaqpFYzgnx32TRHcXke8iHV8khMlt/pa0iMXpgmBME37GsuPoR9MlA4+QWMDhLcNIDQkNFMS5kh9xZMMQkYo2J/E+KYWImPyNHl/sCim8gJDqZ6moQ18qYhV9cQq4azkr2Ell3DMsHdp7n4qWegJAHcJtnjVdfcaYYLI5UQdtltEyLyJ1TS1TeRDnytvJj5Lph2ldT7srrdSheb6H5Tldiga45Bi5GfyerK9drw+DHWX29qCUg7wzYNmk1XGmixYUg5AFzbhd6RIm/eIuwrkp/rfyJ+Lazbdl/QcH4oJ0ZOOfLdsUxpJLMRqPoeHkZmxq+x5Nlug7kJqvF27dkMOEPjeEWLtzhNIcGahBbQif5qonvnbXTfXbOv42xrtjbOuf4z7Zz7Z/2z6ItfoiPREeiI9ESbOk470h4zeerPtDx+ULYHc8ssHqGV3/AHTUtoXFJz82HQ6wmr0pPmdCJrovX2qQQgHAM4bWwceacN0SJV2OCSUpvhk4IqR19wH2TDjJe4fGf2c14QA9ljg3UVqcCdU0oFtZ/S9k2OOZPbCkEODvTbSSQEoucdajZVGch9gTWRtXDTLxNBmJFCCJnvjq8dqHEre57Ksq6JV051j05Kx0z6L6MmY1tHHcucx1u9YQ6KRWHDnz8RCIBBxL5ywjscYO3KbXVwvrquiORFChREyZgRHlWqb4W+ZkmS3xfJeMHSDxqr8G+ye/y3DfdRLf4FNN9Nvh3z8O+u2ufbbXOMEWJWXYsEp6vpvbFmyMXDa9riLHJvOJaaV2QFRuLRoc4LnDZFXTRRTVoNGtXDpX5SSq+2iWdEEVVdtE9iJGnkD8jlq86dZeGey6kmA2Y8D9yWc4qCynYQCIIjpMRvEBD8c8TlhNnrBwWFjk8yhSbj2AfLPc9H41IkHnzdPkatiKwNQeTk3Y3lk7i8bcjq4VF4rypQtYXZG7d0kjpZ5NWUuitXyCUIFQr0WiPEsBDu02Y0c6aP3PvrGibl78W75NswIk1eLjyzSHkTwKhO8OzJLbHR0qsbrGw4dXYMxKX5ywZ6Ym1pOAjKGxc9LXD5PQZHUgs/kzYfutowZh4uZGiENN0m7PUi9DvT9oKzo5WPKdKdbxzlbrezGoG64kCMQoDYszkNPV9JRTqzwukMOOUBaCZsTl7H9yez/Qi03blyIVF8kCMbtSLDe8nMC6bZyDxbmpHfVXzPr2h7AItrjq6AESUViULjhFg0lIszP10N4wGLSdls4Bbx1+uksYBk3jLD0a7LB93ZFy2URjfjA4Qj9O8b86yvobHPMYhMch/P8AX5sELsaa6SiaMB8pmJJ6QQyw+7kSRyUWZLiyo9NIo90OrpIo/HvsgRLzdeKruDlmU2oZ8Y/f0a5S51uGYmLYk/N180eJuqG0rLZOj9xnxupJGSkOm8ZEPnuq5ZWI7opRhq9xvvh2qnpo69EXTePONhKtpvomdeOG8Kx8nfZ8669hozvjoazpK9ruPyku3Xa6yrESKx0IUA4jFYwI7titY7Cycniem7w3gSVIKtMRvUidbS3LUHpC2OjLkjMttg5Ium5bGplNwU8saQS+FxUnFQSkeZM6wi5ZXcfAxDxpvlYoyF6Z+uVSYIZW0FiQ44eRWa9ER6Ij0RVbmMK6V/4mYrakXu5gjzRG6bl4KX8v61tHXJ+wrbdFEn8VnQ63nxBuXjqAwSmsF/TSaWghy4z9SQ2Wy8TdhiKpXB/k9cdWgr106D5QvXgScc2JjHltjOkmSAit2ocypI1GZ2JXA+ZRyPSYQxGR1QhIHywwK1FJPWiyCxIYqkUWIoR8lXigjPkCOVd2hyd0LIOau56kiGiFAdPVnI3BOIyeJK6GCQaHTlkOWJDTcCJKSY9qkajrZR19vk5VMsymYBTWPbkTC4/ZCvP/ADDT3/iAXPTYWxywKAVVaNhpk04BW05uWVsUAK4+I/flBSqKswNZd/aR6aQ1ddTdZVkMGN9NWjQiVB0r00A8M4Ln/ifjDn6FiqfbwSbSyONpdNJvIm0XWOz6QHn7Np9+k7qVHUnUjKyA4UXKS5VdPBVuzHYSSbJNVNUeIeur1pSpoobRbqKr60bpJRcJHwsc1h87o5Gub5WN5ceQCcngBS3TlhorrHLPWSVjY2v6AFMwPAecYzlrgD35A4H1BXYc593ds9wkk6235Ap2WUpJki0ZuGey8ZKMVKnFjDP6AnHXYKUEiDOarrDnDr7xFkNDOCiDxsEIMh4147kLbGab1xr7VbqSOk0rSUMDZ2PuF1qKlzaVtNu5bSNLD8U94D+GuO3a0H58n7LxYNL2kzO/Na99QGx9GlkcwN3gEvEgAGNxLcdh3/gPII1jWZ4dBBp+uoIaZVkXBSOuWBWJAH7KvpJGRzgVHj8HZvB66MSNR8Y8eDQhMFowfiB7pwyYuEG6yie263fNwDgk7fKQSOSODyOPQ8jsVCHcudtHGSQMdhngfZcxpXdeD5WenjGBw1lOZUGDR2UTRrGQreWySPRzd4pHgJ+SJMdDJkMC3IkNg4si9csRmz55lkgh9Uv8wQQM447/AG9/dee5uS3cMjuM8j+VjqVHUi3h8Ur1CnKsQgEDNipNB4MjAImlDoZJARPc2DkMTjOgjUJHDgYyooXElg7FmQHE1FH7Nwi7U3V2pnjd6e+D6/8A1XDzdgT9iP8AzhZM8gMCIzQHZBCDxF/YkYCl45Gp69jgd1M49HpAs0cHgQOULslDYgOccDx65gYPfN2RRZiyUfIr7tUMp0BB7Ist/wBGdvjzpr8emu3w5/Hvj39vfXXPt+Pi+HX3xj984xnOM+2PVUVPZhT3O3OU76M8hf8AbqQurhI0WmztmRRFWZy2VzOuaUEmZUIjEYrpMw7BOpFqig4bi20dAsTUge4HsXLxzvnG2xFBnCnTU18m/MlrS2/+MLB5iqWxZFO61gkDuI3vvLrmoMzHmovM4kUbai40agGstQMHAy0c2cP8JItMvQkmNjHbQlsRcKQ2d4svCNz0xiDw9SPH9SMcEToSCD3Kq83nJLCaDciXYR5Dc/aNrypzhqyYvji6MmOuNW7JuQI5SapfLIoV448mlmeVAD0iw5m50v7lirW1Ruf+Gztu+IQKzHprZkkamRA4zF6jJY+kkoWFPdg8sS3/AFWYHH2yLkSeaR5RVmkTImvUdHbPiNO1lF7rsJpbNux+ER0PZNnMIsPhDKfTRgMbtpDLGsQFLuBkcQOE03D9IQPV+jZ6LYSbpopY0RTIpU9EWLzeRPIjDpVKh8aOTN9G44bPMohGE2i0llTsQMdEG8bjqL90xYrHTizfQWISevmbRUg6b6OXbZHbddMiRpyH/UI8w9KdDgOQLUoTrHjPqGUldAUZq7pSnCwJKTmVUH7zQcHNg9y641bViwUcKOZ2DhI1XZRJAe+f77bfAROcuOr6ovavJvRNvgAsygNrRM5E5pByjhdDWTxQuz+3GmWdh7tkWQ12bOdNMEBjpq/Hrbt3LN21daN1tSJddbePCZcC8tN+efFRMopXmHV/DLLIo9WFrEuaKgYCYeDdLIhsG1Hl2hsLu7Hh2ekZZrOVmSb1yedEnyZsztJGRFfbodnzppVpOUdVNak2p+t3ouxzRy7m0VVgEMJRJ5o+CTN+9mSagMI/Av8AZJYYaVUQcsnqieGbjVdXTG5FTToLguke8reproeXTj9YVAJqsdrFQtfkmn2myR0hKqy4HI/7hCnS67mFEwxNJyxTi6rdUwi5bkWshaN/hSfQ69aOo7/erfdbhJO+GgglgFEJ8Qy9Vw/Uc3acBo+aLad/JL25wM/btQVVqt1VQ0jQx1RKZjUcPLDtxhsWwZORnPUbk+ncmAfIh2bjjKMBefOchsLg8lawJxIByabVoOEiRbP6jRjHRDJqo2bsCZDRo4W3fOfqFUdVWrnLZ0q5+oTwmqbrLbjHY7E6OhZE1rn9Ngc7HBazG5vJ8wL89x2JU60BpmmvMUuoNQudMdx6EM7djKjbuLyC4uA2EMBGxwAcO+cCrPDfl2mc5tcFW0+LIzyLuhTDSUyRJjhNzE5KSXSaNB7d8i3a6utdVVdV3jN0nu4wy1ysjsnvnCSuMsuorxS3BkdylMtLOY4o3uJa6N2RkbsP3k4De7STk89lKdR6Lsd5oZqzTsAoq2io+vPEHCRjy1odMWj9INaRvLSGktbtxnGCyy6+wn/PtpWOXmcgHLVpEdguxUE/UZC/tIF3Hw7hQmOJqapb7EdizxzlNJ0svoTyukPb6pq/TbJyOu1FW0d+qIKZktdE1sbW0cAa6eQuaHF7GvLWAA8Y3tPBxjlRm1aKs100hQV/Vba6yR0jpblV730u+OQsEDmsDXDIGS4AjHG0lQun5VnNggRM+57rqH2hWpV8WaspHpYKzfD5EQT3Ev1sKIR1z9vcMnrYig7ZPGyy2FGmMJKKY2ztrjK3Xtyoao0xslQ55DS1ks8MTwDyWuAZJh7G92hzgXDb2OVk7R4V2m5ULqiXUMshBeOpDSyPpGlh+bl7d0biPISWHsT7C4Fd9x1fJBxdCcY2gUvjm6DczHMOHEiTVduGbZ4mgGdtRrMi92zh0mhlMgFFOPqNV8JoqoI7uPWbptaUXRDrjBV0U7suZHLCNrwRkbJGuLSC7IDsDJ9AopXeG14iq44LbUUl1hmmMUUsL+m6MAjmaN27psAcHF292ckAEjCk2kuj47eZyaB4/HTotGHph19iZP6TLQmiZUJpIao4brq7t3SOwtbZdup8euqaqO2qud8qpp5izX2mvQqDBHLGIHhuXjIeD65w3ae3HOfcLE6p0hVaVNG2rraOpkq2Of06Zzy6MNOOdzcOHufKRkcHnES9n+SriDx7i4y867v6J1Q6mfzsxGLuGh+VzqTt2rhJq7IA4DCQ8kmBEUzdLotnhdELkU2cKat1nmi+2qW2cURUmQq172lXRclhq9BDRnKmlNQ2eV30ynZwdyVnNhSIjvgvXS9M7B20qjaAYBsgX/UxR9q0X2ygzTbKOnyyIoiqJp4WvHqV67sjt2yKe2vK/rFJpFskL0Ov7Sh0GUSRbJ6IV/Xkny7iIFuhs2SUGbOBRJ3H/iVQjroS2cLoKkVsLc7K5U54p+0bondtwsZVlDSMZX9smIh9TOtq1ljopHwDKGyWOV2wksgDH2z6UR1FxHlA+hEW0LMnzxm1HKfU4IuUw6MkZPqVjz2x58uJxXpGiErnbdUaix+lEZNLyvMeQqDcqq8TMJ2OqN+GVYFqDdfgB76LK6p++dsEVovRF0EklMZh437xLT4WNiMPGDD7ofJMhI7D4o7SHjGeXr9ZBth0RfuG7FihlTCrt64Qat9FF1k09iLlOhoVd0wIvBo5w+G5V+2PnDFus8H7OtMpr/RON0d12eV08ZTW+Run8zT/AEKe+Px6IoPlXLFGzXoqsOrpJDMEL4puHzGBV1N/vR5vkBFZ8mmlKheQTYmjHSWCSemddHZQU8esvmrZYuW+VPwRIlsPxj+bajZTNp1wh5jS9gjJLO5BNWdHdzwhOfRpg3PEXD9WMsbS2YWVIRQUc22QHCAkbhsWDt9tdlGeoLTb4tCKynVXWHWvOXBNHkuzPG4v31ZFqvXkC6+pfkKNq2tXMNji6Zp9iRa15Lwk3LTUA/GNQzMgHJNNouykCz5sRmjRrkCqYInB1eTYG61rg2Lg5qsRZiCxQoNreSgx8YkdfD34Bm7ZwiQRoQ6eio6bijZZMEWBDHrtgJIMHDBk6cN26a29MMB3EN4IJOAT/PY8qoz6d+ccgc49yvFt5xamyV79gsXmRReOBJ0fZzxGa6EtgO5KHjo7s4dQfckgshvr9UTBOw6b3C+irNllxhpu3d/Jxvp68tNNqStlqGNP6THRmTa5pAEnZxyAW7mjGQRn1XR2kKmkuum9K0uxghpZZ21xja1kjidrXtlLcF7ZC1mc7g8BpOS04pLDQcOq68adldGi5DCBEnmKhWcDtNRbQAfZR6MbEfr9EH6r2UJOV3iDrck8e6Iab5b7OVEW75w3Vcx2pvVNVxt6UeZqao7YG3LZNheMgDuSWlpJGBhSyKghiqqqlpC6CKelnjkBJ3BghfiJr2fsxhgaDtLSQOCvRz2OYisiux2vJ1U3oaya4jE02g8oQYmI0aAuI/H1BirpA0CIitNQ5hsq71yk9TxuQZo7KYxlJL4pDcQ6XUcMQc6L4qkopG7S5gLjC0OOQAMk5zkjPOeSopYIzFo1kZw+O2XCshfkgtAdUuLSWk4HmO1uBwBnsljy4cIdXFW8r2q2VwCoIuPahHWsPVbxGPuHTJdszFuEwg9XL0CLW+c51ekGosamrt9Gvujgdrs/Q+2t0lQVFXHPV9bc0YJDuo9zw0lnLdziBJtyDnDQQpNQatuVq0/c7TRvpC6smcYwGBhZE5ocGteWhjMuG352jd5zx5lYFflGs4PY0v6DrYG9jkxtGOlcSkgvJFdEX7ce2UdbHH+xJPdZ6RTw7TwiqNWGNyztkxeyBIo/0YLMMJe/jYqY0Uz45KWJ2YxEwx1LBjaAJiGkHA7B2ck54OT4WCa2svYrtlSJpaeKGaNsjn0shGXP3Rs3MIL3PzkHPJ7E5fb49IA6itEh5QXbvEDU91bk1frFEVl9xDXRRMOqpsgu51+Fxhd6/Tzlwt7pPtd8bY121xjYei6N1LZYJJHO6lV+o9jiSct9XZ43DPcknkrTPijemXbU1ZFThopbbK6lh2AsjJAzJsZgABpI5wAc+UkKp/lF6XjXP9ycp/bvFBbHkSu86WMoVLPYNT0VlYKim70tHBkxdOLaLx2Xk6wPO2ao8tnTUOFDExApR0UmAhmxdqtpctbJh4Qh1mp1YcYGIxSrPi7FGBX8ZkLQzKlOgN+gVpV8ouAMBM6fodGuGcN0VcpPGmcmcm92OE3jtss9aCyLVV3PJitr/wCj7xfX9eVhC7//ALZZE0vPZYiYp+i/7cRl1HXeaVi6Q9ttE9J8q6wenPu7c4Mm27d2rnKyXxeiLKq854oOoHNpr11V0Hhq15WMWty29BQNminYNmH0h6RiaSRFVNVN8bJfbGKrlfbXVNV7ru9+V9e8cLuCLKy9t1NG5UKgZ6ya/ATY0qzQCQ4xLY+Kk5dUgthsPTFR96/QKkNnrjbDZnhm0W+pX90UPjU121wRSNjPv+fRFBvQnNVGdW19mqeh62j1q15mRRyWZikmScKjMyGJkky0fKZ1aOGq+Vxz5PCmmnzvkLJ7Kt3KS7ZZVHcix7pLlGoOrRVShrfaSh2xpS8636JgukWmUkhiqFl1U7evYk6LrRsgPVNhEVSDrL0AR2WHO1NkHXyk3zJk7bkUnW7AnlpVbYVbDp1NKwfzuGSOJsrFrommFn0HcnxLsWjKocWWQdJjZKC3dakQz7dsthoQboL40zsnrnBFtVJBHtV1VXlZEJ1NbSJwOER2IurEsctqan88dR4Q1FqyqZnNEG2hOUH1GuSRshhBLLog5cOM6Y+LOfRF57emePP6iFnbtnTvnjzH8/ROmZHPZNJYRXlv80VQGTgUOJl1n0ar1WRKU3aD0o0jYbdCPqntzDAkcwO2NvNGxF+42QIvQ5XzaXsIDAmFgyALLJ6ziMaZTeUxsTsAjsjlzcM1byU8BBbuyGwUMXMpvSAwRu+ebjmThBnu5X2RyruKcevI9R7hLJ8wvD0M685hMlnAJV1ZVON384gJkTjCEhR2YoZXJCWbpPX5iiDxFLC+Ge/zElHbdHbVP5ufi9QfXNpNbanVVPEHVdJue9wyC+nO0yl23k7AxpaP+p2fRbC8N71Ba7zDQ1kjo6CtJj4+VtQSekCScNDtxHA7AdsZHlDp6lHxtOL7S4hvK1FFwhR8o5GFxGWJBPfGdxTpuWQbuXJkcllQa+WTSXZY9tlEspqOdtEdAyxR9ek+GmdLHVTU73CEhzomSyMcd/BwImuLpM9g1xHsun4YIaaGudKWNc2kqBG8nIzHBIYw05yXSloY3nu8eqel5XetqPqqfU6I3ApFpVChjdofkQZxrlwDZrs9foQyefj2QdNkPnrLKqqL5000WTS12znKu2Niap1LbGXy2UNGOpJQxUjJq2PHSe2NgBG4d8AYd3IOf5OrNGWG5Q6butRcZnMprtXTywUMvlmZ+puDi08gk+VuDjaMkk4xjdTX3ALaBD5OhG2yySiWuNdSDf5iaucpZS3zsjn49Nsbe+dVffXGm/7YznOMepfRajpKiCSdj2uMZJc8+YgNdlxGfYZ78D+yw9ZZLm2eWFu8seAWA5BHUPlbkc4aSBn2xknPNyqb5NPX3Jwk9k7vQPTAn5jURExqmzdqV00Xc6FWyLdPfO6SBBXdRuSWUylndrs6Yt9fkb5xrZbrLPfLgLjVSB1s/qRREDbOMnh2Mnb6DGAMHJ9Fjrrq+DTNu/KKWJ7rsSWzVLWlz4XEYLWnOMtxnzDndgpzo9g0DtR4xg2SYj2DZFmxasktUWrZq1T1TbtU26SeqSKKSemuiWiWqaemmuumuuuPb1sRrGRhrI2CNjRhrG8NaPoFp+aaWeWaaV5fJNM+aRzjklz8ZyTycYHJOeB9cqZ8ndX+VKzJTSQzxydz8/cdjMtJcnZw+2K0iU4ls6IJrhVALqIKTCAWc0cjwzJYkkTGDBEWes3L5k5dGzKJNu0CXLyVBh3iW83s3wxIW9/UK2NHCajxBcsGqDlGFiRmyWqn/q2gssHn9ftmym6ONk0lVoXhugpvhxuPX1SymoRMJ7a8Wkz7UJ1M+V8jXffOLWt6/ShEhC803EnVQa1SGq+q7qcTocBGIM30sI+2yDlfCG41BrnRsPHMk9VsOCKidbf0sXB0NuSt73m9/d3XfPqymsfn4ZS1OgRRFg+kEZLoHRe5F8CrwDMtW+hNo1cq/bJeNeKZQxjD3X41c7kTSLJ8TPj4t7rED3HZHOICWdSxktAzoS0iUssbGzIxWO4xSBlf0U1mTeu3BSNbhRGw8k6iS73Gw1luquruhptgiYv6Iq2dWCurDNU6s+NpJSsVuT9ZwlfcpfgiXm4DmBoyBptP2f0cIcNzf6gdRr63QBv7/R7v8atnK436hMuPIseXr/rR1d93G972gY/n+VVIFj9HQYbVqK9g1Xb+jV6gesOQSogZyLnIfd1u1Ij4s8GtWW3y27BTDXRq8dmCKNQXKfSRKAcajrX7ntOQWlzlNms1u6eVvDYVVQDrbRASfHbw+xoCJbEA4SHqqExS6wwSsuk4yIVeZQSkDgSfjxFE4HxTRQN3a97zc9j96yCULSk1J2FBnegm7nmQUmbjz6O7RhnWbaEs3+YeJQIKuwcfcSlZqweoM1VMudG+qeSJQfnkt3wBzC64VEPIyQty5+lqABuR0c51oFe3N5c5F2EiAk2B5XSKu4pBWr4ix1EE2SpWwIwW2ZudNNHiucIIoEXpuoxtD2dJUq0ruIHK9r1rVtet4JApOFKRyTQiHIxQUnF4fIo8cVXNATkaA6sApYMYWWLCyDFwxJLKvEFt9iKU3jVF80csnKeqzd23WbLpb4xnRRFfTZJXTbGcZxnXfTbONsZxn3xn29vXnKwSwywuaC2aN8Ts4wGvaWuyDnOQeyuY98UkMrM74Z45m4OOYySOeOMnPf0/085dv8rsanuOc4aMVE25N9uVB75+LZvsGfOMq40QTyupr8/DvPyVdk/l/LxlHCvwppt0M6IuenWWq5TxRRBsLRJJC9rWgOLi7DRt5aA1wGDgckHAyD09YtSi82amdK9jnNjhbOOXubIGsyHjBccSZb/yg5OcHKX9cnP4K2zZRxJEdWkgYudFw75zv76G0NstN92ii23yMJ6Kpt3LbbfZPZZLHx742yljXGIM23zVdTOQTFLuJczZ2aOMh2AzB9gc/Q5ypmamFkEDJIw6Ix7g/IbsIceA04cPUkhv8cgrNwleEqIr3VxGArpREkSZC8tnK2/zWmi+26jhVfONNEU/m65UVQ+Tokm33ctWm26+mmyqlah9da7e4sdI5mXteGskaHbnbcEgAHBPvg8enK9LRBb7rcww5a4OjAJcTyzzA4I7eXB9jzwBlemPix26fcyVS5etkGrvcI41cJoaa6abqaE3umVtvg10xuqtjXCiu+ce+++c52znPvn10lpN5k03aHkbS6jZuGMd3Ozkf5xhcsa+hFNq++QtJIjrXgHkftaOPTGMctyM5Ge4FpPUhUPXmB/qCdfDStZnJ4zyv1H0M+TkAaxmFbdCVUOsfWB1eMZkIq4kQafFIJJEHr9ci7ciyAsSKgc7Ki003T90kHYlk1CJEzLleF8MdDwniLqnk+9bAkNJcv1/KqXoVCN2vOx9aygJvF2lSuw9sw+ZaoGJ7KYmxBJNQ7ma6anBxtHBhfLp7o1cJEXaUX45pRSnaln9cN+7+z7NhdoqTwovy/adpIS2iY0anZpsYRXiEewLZIhgkJbI4CQMWghl6ECat2Kht830cpvSK1nT8B6RsOIwwXzHfILnuXi7UgkimMqkNYBLXaSiqxBBVadV22BHXbNuFIS1jsg2bSporkkIwgrow3aLu9SDMi0dDi+sSK1HY5ekdKx9qxvOFvuhv7xipaUXNc7Ipk/1+Fq/EVW01Z2k833Ffpl9IFEgDfZN0oQXzpj6Z0RWWx+2Pf8Af2x7+iLGZtLg8Ah0qnUhy/wAhkcNyo5sLGPzZPAiPDHRYjkcGFN3ZQs+wzaLZaDBrVy/fr/Las26zlVJPYiVJzd5ZxnelN9Qzfh/mboSSzajo6irWwbomEN+fYPfUwNDjjiNgoPODZs0iky3fBdmsgenh4NcAmQFOHrXVu+ys3IrCePeZeRSfVbMJL5GqjoGkbKezh9muoBREmOypETXOwsbsyRnxgnJJYLdy9uayWbqvI0XSEu2KbZfAcYttvoqRTBzFR8g5kq0/Ep70NbPQzpae2RYatj3icZFpIEBS2QvpEwhTQggi1SbRCCDVNRQRBX4UWjRFX6ZMeN+kFDiJanV3Xsx2h9J9F+JvhmtPIhY/VBI9GRXRIArCYxXcFH1+i5GsTdrWYs3YyV4GaEkDgQSJdyCNNG7kKaDoG2xl2JElCJxcCfTYpBIGTssGFjFiEIpHHs8jcbLrSCPR+ZuhLVeTBAR1wzHODQYUZUfMRpVwPYrkGjdF2q1b7rZS1Is29EUYWZUkRtQbqxkbVTDhDOcsijTZNN+0+L3130T33T303S3xn4tklddtc76abYxjfTXbXG11spq2Mtla7O/cXsLQ8AuBcAXMeMBoOPLnHGVlbVeK60Suko5Q0PBDopNzonOwcEta9h3bsc7x7DjhUemXEqbmVr7Y3jytdJBdft2VtH7ia6ybO+m6rzdbOiIRmMxplbTDZsgoqv/AORnfKOdNvjjTtIQCrmfHMwUj4tsbvL1xIT8sjg3pkkAHhgP8cqf0+vpJaCKJ8cpuPUAlDsmDpYwTC0He3nIO6R47+gyoFmtHM4eLzFzT9F1GyOpBdio713yrh4zVbLJoqKq42wmrop8hRqoh8Pwe26eNcp7b4zGLzaY6Shmo3vZMSMsa8Nc8u3AtGQAMZx+3IHGc8iXWG91VTNJU0wkhkp4xJK4EhjWbMgjkuJ9O/fnCbJUUYaw2s4RGWjX6NITGxSGzb3xnKTjdoku6xnOMY99suFVdts/52zn/HraNspxSW2gpgMCGlibg+5G4+g9XH0+h5ytI3uufcbzdKp73SF9ZIA53JIDWep5757qRvX2rFqpdskOmn3RVJQSLUvTU+4+lEYsTbo2bzeTraWBDpIxYtl63aRGCLsXIiShzD/Rdibw5Tdr/C7y7+eD0DJ6SMiqUS5w8fflw4rTq3apZhGecg1xyV8BioeLS/l87HLTrSQyiPv5WBBCWsWeJJ7li8ieIOnQ94HPLklyBBk5IaqfIIrSheapfz1xFnmHjufLAZ3XNQmYPQ1h3w/I2ZsIlejF/tFTlhPVG272QM2RZ0mo70TGLN27FJJq0CrsWqQvci3xss7Cic+5WrQ3VcItSGnq4Pf8WHSAWZsIU0gNmxqJhNwykLqYmgubk4WzpjubRatxzxPSGC9UFiauNUUUHxFmqnVFVp9WJcbbZmGLkWpXa/NMfoSUZgv6B1luYXtnNh/b/wBJayHJrHtiO5JfdPpMZc5RxrnXGxFZD0RfM4xtjOM/tnHt6IovtC7Kdo8aGL3DaFfVWJkUgHROPEbCmEfhrE5KDG+UxUdDupCQHokzZDfXfDQWx2cPV8ab7aIZ10znBFHVZ9IJ2V0F0JQidQXZEM8/IVqsras2gS4CoLXzZMcVkSadOzRR6slNN4fojkTNdUmbTAU0rqx2yrnTO+5FZFdBFykog4S0WRWT3SVSV1xumokprnRRNTTbGdd9N9M51212xnG2uc4zj2zn0RVCjthQijLyq7ierOYZ5Da7I1VKLEj9g1fVgSO8t1wiJkaqLquyJQCqMGxibH3710dHR9gB+U/RfbE91s7rOt0yK2zj/wB1L/nrj/p77Z/+seiLc9ER6IuEQa4dtVUc7Z0ztrn22xj39s/498fj3x/P5/b+PRXxyOjeHADGOffOf/X+ey1+gY7eJi3arBQ+u2E1gqcibu5O/dFWoxqLb6vmeXO5HCuq7h233aJ76paNk9NtF8ZwpndNTOuIHqOhvNVcLe6ihEtPFMx0rsu4bu7ghpB+ucHGeeARtfTF4s9Jpq+mrq3UtzqacxwkBpG0PAwMuaTujy04aeHH2wmZ6Y9tddfbGvw664+HH7a+2uP9OPxj8Y/x/wDsep01pa0bvmIaXY7B20Aj7YwtSA5a05LsgnJ7nLnHJ+p7rV6uVVXdGs7416q3t3PRHx81K0brBNeV81fF9fk3LrN8nc3jrceHWZkpjeH7bwnNd7sv09pnP6h1d/X+6WXZF0gO4aM7Gh/S1T0zdL94Sr2T2RzLb0jrAoUjc6p2024JYNImYM65YNlBc2h+S6BEMfE6kGDI61S3bO3Dke7bo2l7QAQ4OBOMghoHBOSZCwHGMYaXOzyGloLhbu5DcODj+0gAj6kk4/vnkcYUJ+PDje+uKYPYde3F3Db/AG5Hy0tTMVSevQTorY1axXQck1WiRqcKyE8WsJR0+S2IqmiG4VBD2TajwbLXZwqua4PaHNIIOcEOa4HBI4LHOaeR6HjscEEC8gg4PcKt/OXnt8fl63FM+dJtNZTyf0HDJg9h61P9aRrFMyM67QfYZMHUdKliLqKv8m8KNnAoK5OsZO5bum66QNVusm43uVE6NPbRTXCum3xa764zrtjPvrnXOPfGdfb8e2ce2cZx++M+/wDn0RbnoiPREv3pTxf8W9f9FUz090hVG1rWPQYbYPWo2SyeTL10O9ji0iakytbJlEodICzEquq4QdGRTzRf2Z6kUH2BAXI4ilLsftvmXgKmn17dT2WOrKu2hNuAHul2ZAwZkkmfNX74dFopHQrV8ZkB982Gv3CLAezUwg0Zu375VoOaOnaJFhVX2bcFwWjV/R0Tsmr2XAdtcuxuURKCyuIyaL366t6Xlx0pBSp6RMOGggXEc1u71Gu4s7aYNtz+2yiiOyemjlEihDyueSFXx803DsVxVEpv3qToqTuKm5YpeLBypDSZ2Y8aoaoEJEQHtF0GEWjChIaRLtfqW5I3qsgNGqtEVSJsMRSjRc/60o3x9B7Y7ijyt2dXwWpZZY9sQLmeGNSZyTnmqp6VCa0riID3SLCQTEXH1gsI9hLzUbIZMNdPx7pRo+QcKkU2SS4bRP8AIxW9qTpWQlbkPUM4s2refLYWZ1vK3tglINtJYlVVhKv3uWEMPbnFmUbk2rsno1DPcPNFiKCSGzxMioJ1t5Krv5YR8XMJKcqOpHf3e91VdVVm1YKlbguFopsaBAHFwPNJ+AAFBMge1gbk4/DR0sxYgT8eDSk5s/HshmHOCLn1T5PJFaXlc7Y8bA+l2aIrkXn+uLXQtXWVudnk2lU4jtZyrMXXj2sbWZAxi421RbQc+1LkXiTiMmHizZ4kVbMxJEvBr/UEzt54cKv8sIrk6Pnt9+jxdP8AQdbsLIdMhNZQfafmYQ/nwaTrRB6RKLPne0CYDhxMO0RHl5632XckmQffQlXc7BAe5oIIO047jH+f6pweCA4exyRgenfsmJdP+UhPlruzgLnecQMK15r7wjsqCRXpJ5InSH2O7ktRa1f1+4CZFJjE2EwwbjAxkRWMqu3xeYMcaMhzAASdv7QMADJOBjJOT68k+/P+HOX9vYeycBj84xn+fVUVDLHsW4+ebgte3LeteCmOWSsFhoOk6TAQrdnbDG12eXSsyIP5is6+kOCDjXVDZiy2SSRDpJ/GrsnsguqS1z4leJen/DGxOu96m31c7jFaLSziW6TMAMjGyc9IR7mkuIxg/TBk2lNKXLWNzZbLazpsjw+vrn5MVHE4gNc5oGC487Wkjc7jIAc5lAQPZt4zOfmAfP8AXVbwNWaGzEpeihIAIiQOlfodXJuWTWSEVhQ0kX3Fi09yh18kP31aMkUVnK+jdLPriun/ABEeMPiHfnW7Rz7HZ45Q6ojinnhkioaKI4kqa+sq4X09JSse+ON9VLGGNlkhjwDMCuhKjwq0HpOyPrtRS3C6vp3sheHukpWVNRIHBkNP0juD3Br3sa4vzgsO47VN8J8gFnVxOMV/03DxTdLKgzZSRxdNHR0KYk00XDcwugyelg8lDrNHCLpN0BcN1dUMqfI0JuMat/U0sn4mNWaS1M/S3ipaIZI4WRtlvVqhji+G6kTJoqiohYGxyUskMjKiGpia1k9KWVDARICo/c/COyXyyDUGh650W5j5Baq8u2TCMvbMyknPndLFIx8TmSDzTsc3DR3sh1l4+uHPI5XaAfpSjq/t4SYDsloxYCbT7TYYIctnBIc8hVnx9QdMwCOd1/qfpRhpEa+TVVbEmT1k4cNlu26GtprjSU9fRzNqKOughq6SZuMPgmjDm/fkH6ZwcEc88ywT001RS1UZiqaaZ8MsZHyuaTwe/P3+57q0FIU7CueqerKi63QLNYBUcIjlewxsdOFZMYbxqKjG4gOgRPnHT0sWdJMmqKarx86VWVzr++umNdNfrXmpS9ER6Ivmf2z/AMs/v+3/AF9EVHYXxx99DTQN2XMIp26xx0jJb8o9tbtK1ug1oQWrhPSvITFGLcc+ZESdat1jLYRYrtBvKXqRp1oploj7IZIvLJTNUc9eRSqJh5LvJbWfXHZb66e0ZPypQnNtB/r4jG+Qq4CWJIYHFXTyv6sk8IVBMh+w7cjZdim35VfRN3HVkBTo2XdLFyJqnipWk/LHb/kB8Zhu2JdcHO3KUYo6+ObZNbBpvJ5bS0MucPJSEkqM1PCHwvngiLKo6/pBUuvl4zjKLzCqqLdRXTJE2o1WYDpC1OYOo6y6lspKuahzZxJGEUlZQR7z90Y2nsf1h7fa1GwdqVZT5pXr8c5LwzdmaSSBSPJDf4VFts5bkVSJbc/HvdnkC34idIXOZubxwHat7AKSuESN9FafCWAuomPiVfy03GZYi9lp7QZJUTReAyGN/YXDJMkzWIuFB5sRuRWerbuaibh7L6G4fh7WYPrk5YiNeTazC7iON9a/ZJWYx0fAgwiUoknKyslbjXTVYgMejBfxIuXGBrgp9tM6jiJf/CHEfQlU+WjzBdoXTExwSDdMv+bIvzjJx8njp13LIPAYO/CS1w6FDXzg3F1BKgSDD9mUlYCt3jlF1uN1fDWOr/YihTxe+J17W/in6M8e/fVYI5r2a9F3qbTi8fmbEg9P1E9k0XkNdycadgpdZwDMOCEaSNjWKb1qcHqt2ej5m2crKNfRFPsJD+PDzB+NumZqHry1z/OHP8yGSeroc/3KR67YXOOS1icVFjEdRkkLmVpIuKGPAqDVxInL+Rh5Aiq7cokH2ircivF4+fIBQ3kq5tBdL89ryVvFSJ+QxE7FJ0PFh5/BZdGHWrcnGZqFDGD40YX2ZrjTzNNmYIIOwJoQQTXx9XlBK1zdzS3BdnbkDGcbm5POAeM/7cqjskEN4cQdp5wCATzj0wD6HnHryl/eQ43I530fFaxSe40HjRkZEA2iu2dWKRqYvtcvSjjVPTO+uV9FhaC22uqmdEBumEtc7b7Y2/Nn8SFVX6z8ZbVo+Oqlhgg+AttLCQQxtVdpDCyUgF7jE17CZS1rpMBpZHI7hdZeEEFDYdB1uo3QbxWNuEta44Mj4rZGJjHH2HLflD3taZHOyWN5ETMmFXc6lrDUFWGVs2zB4SY1ohGhkDLR4IELnE3cPNlyxws5V+uaC/nvEh6Attvgk8y10y4RS32U9RGmg0n4eO1fSWGv1FqnVtTa7lo3a6zTUVpt0d2pH2W5yzVzzHUNq421RpqCIUr4pq6pp45JIdwcM/VS6g1THY6q7U1q0zYYK2m1FHWz14mmlEMoq7eG0729IsNS2AVBZK6ePaejFI3eRsSwOKtCuXDk4HPxC1KIp6INnzNUmNIAz0UEyRCPpJEhH0rY7FZU3QkDR1uzdvHWqjRFJNRiz2VSV9W6ioLXrXTN3u1zoaq0a20FZNK0lzjNUaiK522jrBZpjUwvdtgu3w9ZTmuhIAjqmVg6pexnUrb6iq0zqGjtdBWQ1+nNU3u6V1vjlo20k1HLtnqd7JYy98lPNNmV4eG4fI5rQ+MteWXeM2YEJFRBEAQXcOMQeYEg47dffKuExJBiOMt2yW++c74TbvXpPXRH3+WijlBNLXRPXXTXr78J9/uF68LIqe41LqySzXWst0E787mUgxJBTtJHMcTTgfLhxIwRgrQ/jVb6e364qJKWNkcNzpIK8gZ6nVI6Upfxt5cMtw53Hcg8JjHrppamR6Ij0RHoiM/tn/l6IkA2B4iOsaduK4LP8W3kSJ8TwzoeYmLHuDn+c0ZDeh6gQsyRpoZk1kVcNmT9svXp2SO2+CJ4cyTcsCDz5WmHDYOxGBmJF3VS+I2pR/OHb/Lr3tS07I6365RjKna/WYyUxVLod1goNR0jsdxDk1DjCsa4IwtM/GovDV2mddoXJTrIcXcN9R644ivxEQHK/iP4MAx52ZWrXl3kus2rQtKyjEvJibYUmR12MSs8ziwZ6WOSSXSs47OndwYHO7+QnXq7Qa3RVwiiRRT40eCKT45jN9W9V84MXJKu4LfN9RTO65cKaDJVLRNhKupRBI3uroig93isWYSUo+BoE9EnupCUyJ+s0YrklGaBFTvwj8w9GQezfKV2L1lXsirO4ux+1pa6iUYleo5U0xoKqfuIuptknI1VXRYKkhJi0bCbK66bPBESHGm+XDUo2euSK1/jM8gE37tk/kFFyiCRqHg+SO67o5RgBKOPST/eaxOrnjcezlJ5R+su31PElM7PHWgrZIZoi6bIIIY2Q3cOSLs/HDRHZ1JSXvFt1raa1qw6ze0rTtHlxYpOzU4MxWhZSkNxHohsiWS0bwgKF1aItx0DCb4FAif31Vojo2fILuSK6VB830Py9DClcc+VpFqohZmYSawCsZiSCjQe8mEwdpPZIeVSVcOFMOiK2jbXbTTfRs1aoNGLNBuybt2+hFANTV9KqJ6lmlZU1yVVdZch2NEJPf08veGSKPg5JLet5hNkB8lBmawYt0irxUxDmLSSP52prsxcOtEhfz9FG+jXNC0uGA7b2OQcZwe3sfqDwQE/2zj7gg/2JCrN39V5KJW1WfRzNk8IRdkTijGbJs0MrqCHEdPJvmD5Xb9tETLFXYYiorsmgi+Ytktt8KP0/biH8RGjqyw6+0p4t0tM+ezWu5WJ+pXQRSSSQfD3BwZUubGMNaI3hzxlkYblz8ZyuivCfUMVx05d9DSSRMrpIqn8oZM+Nkcza6MRVULy75cxt29RwLgDlhDuRVp0VqRrZ0ws+FdTl4YTlZyTlPkJU3Kni7JjJSrgooMcq7v1Gjzdoosjsk5w31+W/aNiTT5Dpu1XS5/+M8Naa+XXUVn19qSz1N2rbxJWiPSMbH0zbrUNkqqV/UqsTRzujbK0zB7ozE0wFg4WxvgNWutNustw0bY6/wDLWU8QNRfgwvdTMLYXRs/LW4ja1zhhg2u3ecuzkx0elNbweCzaHV1KpDZsvtZcM0lcwJRlzGGDQCLMantgwhgQJEDRIocONmKpQi9yimo3baIIp/MzvvvibhddJ0FlqtFaCqb9qS7azuFBLer3cKTo1ctsoqmmnp7XaLRHJU1MxNxpoppXxtklllY6J7zSSGnGRorReqm702p9Vst9jtml4nxUlNDVxVUEElVSiIz1NUYoGwBkLi5jJWMYWODg3yiSR1HC9PGKdo0YwkrTLCSy0o8mJhhvjbDgd9xasGQwe813102TdoCh7RV42zrrlm+cumu3xbJZ2z+iHgPoWp0B4eWq1XBrW3euMl2vDWZ2RVVUR0YWY8mW0rYzM1oHTmLmOa0g55Y8RtTs1XqisuEH/Aw5pKAYaNtPA4sdhwAc9skgMrHvL3FrhtdtGFcv1uVQVHoiPREeiI9EXzbHvrtj+cZx/P749v2z+PREsfx7+M6JcITXra3nlsze+bw7Fugradm2jPE02JBIC3Im3EAr0YKavXzNAXBxx4gy1IIqoaklF8aMhQAGxDgBhFlivkDoeZeQk94wx0bOzu1I/wA/KXpaBhmzBla7gIh4XBjg0Fm+F3+5FvKpGIkIiStB6ghZn9iLB1V1sfdUMYIpU7kvakeauVLcsW/bjN88VZrFt4KRt6IIEFphX5Gxl21fRg7B2wgHJX/6tFnZENdxxVvHyqI8i3bv3rTYe0c7akUj8215tVNA1NXWbXsW8f0pBAIpK37cMN5DZNhN02eirWTzE42HCtSxl+2VR2VfrM9XjhPRJQgs8f5cvXBFGHHnG/PfHgW6EOempFIZ0JftidIWC9IyheV6kbLsdwyzJFRT1bbfViEb7DG7YcIR3UTY6pq/MWXcqrrqEUL8xMaGiHefkGiVcg+nNLgkSvP9lXlJrSczorz+TWPQs3pCh/PBKREHcZbfaxaz1tPRsWZsUWxTVmF3cu0Is3FACLDrYqTudPy6crXrWM1khDhRxzRbNV9IVkvOmQ6Fxqw2j87LK7sVrAHZDVxJJjKSxOPRfU4JEu3QEDFnbZ4SHjyOzZ+RXb6hBdFyajJ4D5On0Aq+/wB+2C617OrRir2awQC6Rkgdyd3Oxoe4bOyOH0VROCx2U1c6Miz5gRXRcoNFGypF3FZzuruhavaSCJT+sLzhpRMlFj0mr8uAmVfHJBHnS8fmQxuqLJSAZjDCQMiTB8GXIvXItdFRg9UUXR32z8lVRwV0M1NWxQ1lHOwsloqmGKamlB7iVr2kuB4IyfKQCBlXwyz08zKimqJqWeI7o5qd5jla7/uHOMe2D6KqMw8Z1DSIgsQBEppCsOFt1dxocoyfCkvmZ+LfRsiaHEHqKeu3v8pP7hsklpnKaaeumNNdOcL9+FHwvvFbLWUcdzsQnOZaO3VO6kzkEljJ9zweMAl7uCQQe42xavGnWVrpBSE0FwAP9auie+fseeo1wdnsBzjGSQTgiS6e4XoynTLWSsBpSWyVj8O7AvMnbYlqNc4+DOHY4W1YsBTd5ptpjZu8UaOHrTP5auUd877bzbQfgT4f+H0/xtotrqq5Fob+Z3IsqatuMYEW5myAAANHSDXYAJJflxj+pfEfVOqYzTVtUyloj81HQ74op8tAPxJc5xm9Q3OMNw0YAVyddca49sY/7/z7/wCc5z7fn8Y9/bGPxj8Y9bja0NAa0YA4AHooIvvqqI9ER6Ij0RHoiPREeiKKI5RVMRC07BvGLVZA49cdsD4wJs20A8XEMJ3PRkLY/bIowlcnbNUy5tqAHapMBiL90to2Zt2jfTHymbXREiVv5mPHRa3kwinG9NRqTxYFSVfdk1xdXTog8WNCi8tqSGCJAxIg4lqKDlWpY65SPEG7ISaVFjsEHI8zkhoqG0RWIm7yl+lHYXISeoMudQBRko+xG42z0eHzCAwYuv8AZADDC7RN0YIJofQCmf1LZNd6s3Q+cjrv8epFT/xqROpIXxFQgai+fbS5WqxePn5DGOfrrbH2Vq1rvMJrJpcfEzVlKTcjPMyr6TnDRxNsRNPFEmBVnhLVm3+UPaEUpCuh3BLrCS8vf2MvQc0jtKibjx0ORhiLfnc84Ky1SKbVeCnuCaiz60mGmv6ifRrYUllCPaOCKjnXTDfDwi19WKdXp1PvtxihSa91fq+Dap6X/vL9K8xBt5QO1sPffMIzg5mRJxPJLeNa6ZwzyWwhl78SOudNyKyHwY20xrv/AKvxj4vf/Ofb2znOMfj8/n3x+359v29EUY0/SVQc+wpCuKOrSE1LAWxY6ebw6v46Mi0cQMycq6OSAmkIEN2rLR4XLPXT98vqljdZdbbbbPtjXGCKUfREeiI9ER6Ij0RHoiPREeiI9ER6Ij0RHoiPRF8xjGMe2MYxj+MeiL77Y9/f2x7/AM/59ER6Ij0RHoiPREeiI9ER6Ij0Rf/Z'; const CONFIG = { scrollSpeed: parseFloat(GM_getValue('scrollSpeed', 1.0)), scrollMode: GM_getValue('scrollMode', 'paragraph'), // paragraph, page, pixel scrollPixel: parseInt(GM_getValue('scrollPixel', 300)), scrollJitter: GM_getValue('scrollJitter', true) !== false, scrollIntervalJitter: GM_getValue('scrollIntervalJitter', true) !== false, randomPauseEnabled: GM_getValue('randomPauseEnabled', true) !== false, randomPauseEveryMin: parseInt(GM_getValue('randomPauseEveryMin', 3), 10) || 3, randomPauseEveryMax: parseInt(GM_getValue('randomPauseEveryMax', 8), 10) || 8, randomPauseMsMin: parseInt(GM_getValue('randomPauseMsMin', 1000), 10) || 1000, randomPauseMsMax: parseInt(GM_getValue('randomPauseMsMax', 5000), 10) || 5000, autoStart: GM_getValue('autoStart', true), showTips: GM_getValue('showTips', true), showFloatBear: GM_getValue('showFloatBear', true) !== false, bearIconSize: parseInt(GM_getValue('bearIconSize', 77), 10) || 77, highlightMode: GM_getValue('highlightMode', true) !== false, loopMode: GM_getValue('loopMode', true), // 循环阅读模式 targetMinutes: parseInt(GM_getValue('readingTargetMinutes', 0), 10) || 0, showChapterTimer: GM_getValue('readingShowChapterTimer', true) !== false }; const TASK_ELAPSED_PREFIX = 'readingTaskSec_'; const GOAL_NOTIFIED_PREFIX = 'readingGoalDone_'; const SESSION_TASK_KEY = 'readingAssistantTabTaskKey'; let resolvedReadingTaskKey = null; // 状态 const STATE = { get isRunning() { return window.readingAssistantGlobalState.isRunning; }, set isRunning(value) { window.readingAssistantGlobalState.isRunning = value; }, get isPaused() { return window.readingAssistantGlobalState.isPaused; }, set isPaused(value) { window.readingAssistantGlobalState.isPaused = value; }, get currentScrollTop() { return window.readingAssistantGlobalState.scrollPosition; }, set currentScrollTop(value) { window.readingAssistantGlobalState.scrollPosition = value; }, get manuallyPaused() { return window.readingAssistantGlobalState.manuallyPaused; }, set manuallyPaused(value) { window.readingAssistantGlobalState.manuallyPaused = value; }, contentElements: [], currentIndex: 0, scrollTimer: null, pixelScrollCount: 0, nextPauseAt: 0 }; let bearClickTimer = null; let bearLongPressTimer = null; let bearLongPressFired = false; let catalogJumpObserver = null; let catalogJumpTimeout = null; const CONTENT_ROOT_SELECTORS = ['.read_content', '.article', '.content', '#content', '.node-content', '.chapter-content', '.ans-cc', 'main']; const CONTENT_EXCLUDE_SELECTOR = '#reading-bear-float,#reading-tips,#reading-settings-modal,#reading-toast,.ztop,.zt_center,.zt_user,.zt_u_abs,header,nav,.header,.nav'; // 日志 function log(msg) { console.log(`[学习通阅读助手] ${msg}`); } // 格式化时间(秒 → 00:00:00) function formatTime(seconds) { const h = String(Math.floor(seconds / 3600)).padStart(2, '0'); const m = String(Math.floor((seconds % 3600) / 60)).padStart(2, '0'); const s = String(seconds % 60).padStart(2, '0'); return `${h}:${m}:${s}`; } // 解析 URL 参数(键名小写) function parseUrlParams(url) { try { const u = new URL(url, location.origin); const p = {}; u.searchParams.forEach(function (v, k) { p[k.toLowerCase()] = v; }); return p; } catch (e) { return {}; } } function sanitizeTaskKeyPart(s) { return String(s || '').replace(/[^\w.-]/g, '_').slice(0, 64); } function readTabTaskKeyHint() { try { return sessionStorage.getItem(SESSION_TASK_KEY) || ''; } catch (e) { return ''; } } function writeTabTaskKeyHint(key) { try { if (key) sessionStorage.setItem(SESSION_TASK_KEY, key); } catch (e) {} } // 阅读任务目录页 → 任务键(含 query,区分同课多任务) function computeCatalogTaskKey(url) { url = url || location.href; let path; try { path = new URL(url, location.origin).pathname; } catch (e) { path = location.pathname; } const m = path.match(/\/course\/(\d+)\.html/i); const params = parseUrlParams(url); if (m) { const qIdx = url.indexOf('?'); const q = qIdx >= 0 ? url.slice(qIdx + 1, qIdx + 81) : ''; return 'rd_c' + m[1] + (q ? '_' + sanitizeTaskKeyPart(q) : ''); } if (path.indexOf('/zt/portal') !== -1) { return 'rd_p' + sanitizeTaskKeyPart(params.id || params.courseid || params.jobid || path.replace(/\W/g, '_')); } const qIdx = url.indexOf('?'); const qs = qIdx >= 0 ? url.slice(qIdx + 1, qIdx + 81) : 'x'; return 'rd_' + sanitizeTaskKeyPart(path.replace(/\W/g, '_')) + '_' + sanitizeTaskKeyPart(qs); } function isReadingChapterFlip() { const ref = document.referrer || ''; return ref.indexOf('/ztnodedetailcontroller/visitnodedetail') !== -1; } // 阅读正文页 → 从 URL 算任务键(仅 cardid/cfid,不含章节级参数) function computeReadingPageTaskKey(url) { url = url || location.href; const p = parseUrlParams(url); const cid = p.courseid || p.coursid || p.clazzid || ''; const taskPart = p.cardid || p.cfid || ''; if (cid && taskPart) { return 'rd_' + sanitizeTaskKeyPart(cid) + '_' + sanitizeTaskKeyPart(taskPart); } if (taskPart) { return 'rd_t_' + sanitizeTaskKeyPart(taskPart); } return ''; } function computeReadingPageWeakKey(url) { url = url || location.href; const qIdx = url.indexOf('?'); const qs = qIdx >= 0 ? url.slice(qIdx + 1) : ''; if (qs) { return 'rd_q_' + sanitizeTaskKeyPart(qs.slice(0, 120)); } try { return 'rd_path_' + sanitizeTaskKeyPart(new URL(url, location.origin).pathname.replace(/\W/g, '_')); } catch (e) { return ''; } } function resolveReadingPageTaskKey() { const tabHint = readTabTaskKeyHint(); // 同任务内翻章:沿用本标签已确定的任务键,避免章节 URL 变化导致计时归零 if (tabHint && isReadingChapterFlip()) { return tabHint; } const fromUrl = computeReadingPageTaskKey(location.href); if (fromUrl) return fromUrl; if (tabHint) return tabHint; const ref = document.referrer || ''; if (ref && (ref.indexOf('/mooc-ans/course/') !== -1 || ref.indexOf('/zt/portal') !== -1)) { return computeCatalogTaskKey(ref); } const weak = computeReadingPageWeakKey(location.href); if (weak) return weak; return 'rd_unknown_' + sanitizeTaskKeyPart(location.href.slice(-120)); } // 当前阅读任务键(按任务隔离;阅读页仅用本页 URL / 本标签 sessionStorage) function getReadingTaskKey() { if (resolvedReadingTaskKey) return resolvedReadingTaskKey; if (isReadingTaskPage()) { resolvedReadingTaskKey = computeCatalogTaskKey(location.href); writeTabTaskKeyHint(resolvedReadingTaskKey); return resolvedReadingTaskKey; } if (isReadingPage()) { resolvedReadingTaskKey = resolveReadingPageTaskKey(); writeTabTaskKeyHint(resolvedReadingTaskKey); return resolvedReadingTaskKey; } resolvedReadingTaskKey = 'rd_unknown'; return resolvedReadingTaskKey; } function getTaskSavedElapsed() { return GM_getValue(TASK_ELAPSED_PREFIX + getReadingTaskKey(), 0); } function saveTaskSavedElapsed(seconds) { GM_setValue(TASK_ELAPSED_PREFIX + getReadingTaskKey(), Math.max(0, Math.floor(seconds))); } function getTaskDisplayElapsed() { return getTaskSavedElapsed() + (window.readingAssistantGlobalState.chapterElapsed || 0); } function formatTarget(minutes) { if (!minutes || minutes <= 0) return '无'; return formatTime(minutes * 60); } function getGoalStatus() { const targetMin = CONFIG.targetMinutes; if (!targetMin || targetMin <= 0) return 'none'; return getTaskDisplayElapsed() >= targetMin * 60 ? 'done' : 'pending'; } function renderGoalBadge() { const status = getGoalStatus(); if (status === 'none') return ''; if (status === 'done') { return ' ✓ 已达标'; } const pct = Math.min(100, Math.floor(getTaskDisplayElapsed() / (CONFIG.targetMinutes * 60) * 100)); return ' ✗ 未达标 ' + pct + '%'; } function ensureReadingTipsStyle() { if (document.getElementById('reading-tips-style')) return; const s = document.createElement('style'); s.id = 'reading-tips-style'; s.textContent = [ '.reading-goal-badge{display:inline-block;margin-left:6px;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:600;vertical-align:middle;}', '.reading-goal-pending{background:rgba(244,67,54,0.22);color:#ffb4ab;}', '.reading-goal-ok{background:rgba(76,175,80,0.28);color:#b9f6ca;}', '.reading-goal-pop{animation:readingGoalPop 0.55s ease;}', '@keyframes readingGoalPop{0%{transform:scale(1)}45%{transform:scale(1.12)}100%{transform:scale(1)}}' ].join(''); document.head.appendChild(s); } function showReadingToast(msg, durationMs) { durationMs = durationMs || 5000; let el = document.getElementById('reading-toast'); if (el) el.remove(); el = document.createElement('div'); el.id = 'reading-toast'; el.textContent = msg; el.style.cssText = 'position:fixed;top:20px;left:50%;transform:translateX(-50%);' + 'background:rgba(40,40,40,0.92);color:#fff;padding:12px 20px;border-radius:8px;' + 'font-size:14px;z-index:10000;max-width:90%;text-align:center;line-height:1.5;'; document.body.appendChild(el); setTimeout(function () { if (el.parentNode) el.remove(); }, durationMs); } function checkReadingGoal() { if (getGoalStatus() !== 'done') return; const notifyKey = GOAL_NOTIFIED_PREFIX + getReadingTaskKey(); if (GM_getValue(notifyKey, false)) return; GM_setValue(notifyKey, true); log('本任务已达目标时长 ' + CONFIG.targetMinutes + ' 分钟'); const badge = document.getElementById('reading-goal-badge'); if (badge) badge.classList.add('reading-goal-pop'); } // 本章时长累加到本任务 function flushChapterToTask() { const ch = window.readingAssistantGlobalState.chapterElapsed || 0; if (ch > 0) { saveTaskSavedElapsed(getTaskSavedElapsed() + ch); window.readingAssistantGlobalState.chapterElapsed = 0; window.readingAssistantGlobalState.startTime = 0; } } // 启动计时(当前章) function startTimer() { if (window.readingAssistantGlobalState.timerInterval) return; window.readingAssistantGlobalState.startTime = Date.now() - window.readingAssistantGlobalState.chapterElapsed * 1000; window.readingAssistantGlobalState.timerInterval = setInterval(function () { window.readingAssistantGlobalState.chapterElapsed = Math.floor((Date.now() - window.readingAssistantGlobalState.startTime) / 1000); updateTips(); }, 1000); } // 停止计时 function stopTimer() { if (window.readingAssistantGlobalState.timerInterval) { clearInterval(window.readingAssistantGlobalState.timerInterval); window.readingAssistantGlobalState.timerInterval = null; } } // 重置当前章时长 function resetChapterTimer() { stopTimer(); window.readingAssistantGlobalState.chapterElapsed = 0; window.readingAssistantGlobalState.startTime = 0; } // R 键:重置当前阅读任务计时 function resetTaskTimer() { const taskKey = getReadingTaskKey(); saveTaskSavedElapsed(0); GM_setValue(GOAL_NOTIFIED_PREFIX + taskKey, false); resetChapterTimer(); updateTips(); log('本任务阅读时长已重置'); showReadingToast('本任务阅读时长已重置'); } // 更新提示栏(本任务 + 目标 + 本章) function updateTips() { const tips = document.getElementById('reading-tips'); if (!tips) return; const taskSec = getTaskDisplayElapsed(); const chapter = window.readingAssistantGlobalState.chapterElapsed; let line2 = '本任务 ' + formatTime(taskSec) + ' / ' + formatTarget(CONFIG.targetMinutes); if (CONFIG.showChapterTimer) { line2 += ' · 本章 ' + formatTime(chapter); } line2 += renderGoalBadge(); tips.innerHTML = 'K开始 Z暂停 S设置 R重置 · 点熊切换/双击设置/长按重置
' + line2; checkReadingGoal(); updateBearIcon(); } function randomBetween(min, max) { const lo = Math.min(min, max); const hi = Math.max(min, max); return lo + Math.floor(Math.random() * (hi - lo + 1)); } function getRandomPixelStep() { const base = CONFIG.scrollPixel; if (!CONFIG.scrollJitter) return base; return Math.max(30, Math.round(base * (0.7 + Math.random() * 0.6))); } function getRandomIntervalMs(baseMs) { if (!CONFIG.scrollIntervalJitter) return baseMs; return Math.max(200, Math.round(baseMs * (0.75 + Math.random() * 0.5))); } function scheduleNextPauseAt() { const min = Math.min(CONFIG.randomPauseEveryMin, CONFIG.randomPauseEveryMax); const max = Math.max(CONFIG.randomPauseEveryMin, CONFIG.randomPauseEveryMax); STATE.nextPauseAt = randomBetween(min, max); STATE.pixelScrollCount = 0; } function isBearRunningVisual() { return STATE.isRunning && !STATE.isPaused; } function updateBearIcon() { const img = document.getElementById('reading-bear-img'); if (!img) return; img.src = isBearRunningVisual() ? BEAR_URL.run : BEAR_URL.eat; img.title = isBearRunningVisual() ? '阅读中(单击暂停)' : '已停止(单击开始)'; } function toggleReadingByBear() { if (!isReadingPage()) { showReadingToast('请先进入阅读章节,再点熊开始'); return; } if (isBearRunningVisual()) { pauseReading(); } else { resumeReading(); } updateBearIcon(); } function bindBearPointer(el) { const clearLongPress = function () { if (bearLongPressTimer) { clearTimeout(bearLongPressTimer); bearLongPressTimer = null; } }; const startLongPress = function () { clearLongPress(); bearLongPressFired = false; bearLongPressTimer = setTimeout(function () { bearLongPressFired = true; if (bearClickTimer) { clearTimeout(bearClickTimer); bearClickTimer = null; } if (!isReadingPage()) { showReadingToast('请在阅读章节页长按重置'); return; } resetTaskTimer(); updateBearIcon(); }, 600); }; el.addEventListener('mousedown', startLongPress); el.addEventListener('mouseup', clearLongPress); el.addEventListener('mouseleave', clearLongPress); el.addEventListener('touchstart', function (e) { startLongPress(); }, { passive: true }); el.addEventListener('touchend', clearLongPress); el.addEventListener('touchcancel', clearLongPress); el.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); if (bearLongPressFired) { bearLongPressFired = false; return; } if (bearClickTimer) { clearTimeout(bearClickTimer); bearClickTimer = null; showSettings(); return; } bearClickTimer = setTimeout(function () { bearClickTimer = null; toggleReadingByBear(); }, 280); }); } function showFloatBear() { if (!CONFIG.showFloatBear) return; if (!isReadingPage() && !isReadingTaskPage()) return; if (document.getElementById('reading-bear-float')) return; const size = Math.max(40, Math.min(96, CONFIG.bearIconSize)); const wrap = document.createElement('div'); wrap.id = 'reading-bear-float'; wrap.style.cssText = 'position:fixed;left:12px;bottom:12px;z-index:9999;' + 'width:' + size + 'px;height:' + size + 'px;cursor:pointer;user-select:none;' + '-webkit-user-select:none;touch-action:manipulation;'; const img = document.createElement('img'); img.id = 'reading-bear-img'; img.draggable = false; img.style.cssText = 'width:100%;height:100%;display:block;object-fit:contain;pointer-events:none;'; wrap.appendChild(img); document.body.appendChild(wrap); bindBearPointer(wrap); updateBearIcon(); } // 页面检测(兼容新旧目录页) function isReadingTaskPage() { if (location.href.includes('/mooc-ans/zt/portal/')) return true; if (location.href.includes('/mooc-ans/course/') && location.href.includes('.html')) return true; try { return /\/course\/\d+\.html/i.test(new URL(location.href, location.origin).pathname); } catch (e) { return /\/course\/\d+\.html/i.test(location.pathname); } } function isReadingPage() { return location.href.includes('/ztnodedetailcontroller/visitnodedetail'); } function disconnectCatalogObserver() { if (catalogJumpObserver) { catalogJumpObserver.disconnect(); catalogJumpObserver = null; } if (catalogJumpTimeout) { clearTimeout(catalogJumpTimeout); catalogJumpTimeout = null; } } function cleanupReadingSession() { clearTimeout(STATE.scrollTimer); STATE.scrollTimer = null; stopTimer(); flushChapterToTask(); disconnectCatalogObserver(); if (bearClickTimer) { clearTimeout(bearClickTimer); bearClickTimer = null; } if (bearLongPressTimer) { clearTimeout(bearLongPressTimer); bearLongPressTimer = null; } } function bindPageLifecycle() { if (window.readingAssistantPageLifecycleBound) return; window.addEventListener('pagehide', cleanupReadingSession); window.readingAssistantPageLifecycleBound = true; } function getContentSearchRoot() { for (let i = 0; i < CONTENT_ROOT_SELECTORS.length; i++) { const el = document.querySelector(CONTENT_ROOT_SELECTORS[i]); if (el && el.querySelector('p, h1, h2, h3, h4, h5, h6')) return el; } return document.body; } function isExcludedContentElement(el) { if (!el || !el.closest) return true; if (el.id === 'reading-bear-img') return true; try { if (el.closest(CONTENT_EXCLUDE_SELECTOR)) return true; } catch (_) { } return false; } // 自动跳转到阅读页面 function autoJumpToReading() { if (hasAutoJump) return; if (!isReadingTaskPage()) return; getReadingTaskKey(); log('检测到阅读任务目录页面,准备跳转'); disconnectCatalogObserver(); catalogJumpObserver = new MutationObserver(function () { const readingLink = document.querySelector( 'a[href*="/ztnodedetailcontroller/visitnodedetail"],.catalog_detail a,.chapter_item a,.nodeItem a,.posCatalog_name a' ); //感谢用户:ᦸᐝSᴗhi꧂的反馈 if (readingLink) { log('找到阅读章节,正在跳转'); readingLink.click(); hasAutoJump = true; disconnectCatalogObserver(); } }); catalogJumpObserver.observe(document.body, { childList: true, subtree: true }); catalogJumpTimeout = setTimeout(function () { disconnectCatalogObserver(); log('目录页等待阅读链接超时,已停止监听'); }, 60000); } // 收集内容元素 function collectContent() { const root = getContentSearchRoot(); const selectors = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img', 'video']; STATE.contentElements = []; selectors.forEach(function (selector) { root.querySelectorAll(selector).forEach(function (el) { if (isExcludedContentElement(el)) return; if (el.offsetHeight <= 20 || el.offsetWidth <= 20) return; if (selector === 'p') { const text = String(el.textContent || '').trim(); if (text.length < 4) return; } STATE.contentElements.push(el); }); }); STATE.contentElements.sort(function (a, b) { return a.getBoundingClientRect().top - b.getBoundingClientRect().top; }); log('找到 ' + STATE.contentElements.length + ' 个内容元素'); } // 清除高亮 function clearHighlight() { document.querySelectorAll('.reading-highlight').forEach(el => { el.classList.remove('reading-highlight'); el.style.outline = ''; }); } // 段落阅读 function scrollToNext() { if (STATE.isPaused || STATE.currentIndex >= STATE.contentElements.length) { completeReading(); return; } const element = STATE.contentElements[STATE.currentIndex]; if (CONFIG.highlightMode) { clearHighlight(); element.classList.add('reading-highlight'); element.style.outline = '4px solid #00FF00'; element.style.transition = 'outline 0.3s ease'; } element.scrollIntoView({ behavior: 'smooth', block: 'center' }); STATE.currentIndex++; const baseMs = CONFIG.scrollSpeed * 1000; STATE.scrollTimer = setTimeout(scrollToNext, getRandomIntervalMs(baseMs)); } // 整页阅读 function pageScroll() { const totalHeight = document.documentElement.scrollHeight - window.innerHeight - 50; const scrollStep = totalHeight / (CONFIG.scrollSpeed * 10); if (!STATE.currentScrollTop) { STATE.currentScrollTop = 0; } const scroll = () => { if (STATE.isPaused) return; STATE.currentScrollTop += scrollStep; if (STATE.currentScrollTop >= totalHeight) { completeReading(); } else { window.scrollTo({ top: STATE.currentScrollTop, behavior: 'smooth' }); STATE.scrollTimer = setTimeout(scroll, getRandomIntervalMs(100)); } }; scroll(); } // 像素滚动 function pixelScroll() { const totalHeight = document.documentElement.scrollHeight - window.innerHeight - 50; if (!STATE.currentScrollTop) { STATE.currentScrollTop = window.pageYOffset || document.documentElement.scrollTop; } if (!STATE.nextPauseAt) scheduleNextPauseAt(); const scroll = () => { if (STATE.isPaused) return; if (CONFIG.randomPauseEnabled) { STATE.pixelScrollCount += 1; if (STATE.pixelScrollCount >= STATE.nextPauseAt) { scheduleNextPauseAt(); const pauseMs = randomBetween(CONFIG.randomPauseMsMin, CONFIG.randomPauseMsMax); STATE.scrollTimer = setTimeout(scroll, pauseMs); return; } } STATE.currentScrollTop += getRandomPixelStep(); if (STATE.currentScrollTop >= totalHeight) { completeReading(); } else { window.scrollTo({ top: STATE.currentScrollTop, behavior: 'smooth' }); STATE.scrollTimer = setTimeout(scroll, getRandomIntervalMs(CONFIG.scrollSpeed * 1000)); } }; scroll(); } // 完成阅读 function completeReading() { STATE.isRunning = false; STATE.isPaused = false; clearHighlight(); clearTimeout(STATE.scrollTimer); flushChapterToTask(); resetChapterTimer(); updateBearIcon(); log('阅读完成'); setTimeout(function () { const nextSelectors = [ '.nodeItem.r a', '.nodeItem.r i', 'a[title="下一章"]', 'a[title="下一节"]', '.next_btn', '.nextBtn', 'a.next', '.pager_next a', '.next_chapter a' ]; let nextBtn = null; for (let i = 0; i < nextSelectors.length; i++) { nextBtn = document.querySelector(nextSelectors[i]); if (nextBtn) break; } if (nextBtn) { log('找到下一章按钮,正在跳转'); nextBtn.click(); } else if (CONFIG.loopMode) { log('未找到下一章按钮,循环模式开启,准备跳转到第一章'); setTimeout(() => { jumpToFirstChapter(); }, 1000); } else { log('未找到下一章按钮,阅读结束'); } }, 2000); } // 跳转到第一章 function jumpToFirstChapter() { log('开始寻找第一章...'); const firstChapterSelectors = [ '.posCatalog_select:first-child a', '.posCatalog_name:first-child a', '.catalog_points_yi:first-child a', '.catalog_title:first-child a', '.nodeItem:first-child a', '.catalogDetail:first-child a', '.catalog_sectionLevel1:first-child a', 'a[href*="/ztnodedetailcontroller/visitnodedetail"]' ]; let firstChapterLink = null; for (const selector of firstChapterSelectors) { const links = document.querySelectorAll(selector); if (links.length > 0) { firstChapterLink = links[0]; log(`通过选择器 ${selector} 找到第一章链接`); break; } } if (firstChapterLink) { log('找到第一章链接,正在跳转...'); firstChapterLink.click(); return; } log('尝试返回上级页面...'); if (window.history.length > 1) { window.history.back(); } else { const currentUrl = location.href; const urlParts = currentUrl.split('/'); if (urlParts.length > 3) { const rootUrl = urlParts.slice(0, 4).join('/'); log(`跳转到根目录: ${rootUrl}`); location.href = rootUrl; } } } // 开始阅读 function startReading() { if (STATE.scrollTimer) clearTimeout(STATE.scrollTimer); if (STATE.isRunning) return; startTimer(); STATE.isRunning = true; STATE.isPaused = false; STATE.currentIndex = 0; log(`开始${CONFIG.scrollMode}阅读`); updateBearIcon(); switch(CONFIG.scrollMode) { case 'paragraph': collectContent(); if (STATE.contentElements.length > 0) { scrollToNext(); } else { log('未找到段落内容,切换整页模式'); pageScroll(); } break; case 'page': pageScroll(); break; case 'pixel': pixelScroll(); break; } } // 暂停阅读 function pauseReading() { if (STATE.isRunning) { stopTimer(); STATE.isPaused = true; STATE.manuallyPaused = true; GM_setValue('manuallyPaused', true); clearTimeout(STATE.scrollTimer); log('阅读已暂停'); updateBearIcon(); } } // 继续阅读 function resumeReading() { if (!STATE.isRunning) { STATE.manuallyPaused = false; GM_setValue('manuallyPaused', false); startTimer(); startReading(); updateBearIcon(); } else { STATE.isPaused = false; STATE.manuallyPaused = false; GM_setValue('manuallyPaused', false); startTimer(); log('继续阅读'); updateBearIcon(); switch(CONFIG.scrollMode) { case 'paragraph': scrollToNext(); break; case 'page': pageScroll(); break; case 'pixel': pixelScroll(); break; } } } // 显示阅读器设置面板 function showSettings() { const existingModal = document.getElementById('reading-settings-modal'); if (existingModal) { existingModal.remove(); return; } const modal = document.createElement('div'); modal.id = 'reading-settings-modal'; modal.style.cssText = ` position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; padding: 20px; border-radius: 8px; box-shadow: 0 4px 20px rgba(0,0,0,0.3); z-index: 9999; font-family: Arial, sans-serif; min-width: 400px; border: 1px solid #ddd; `; modal.innerHTML = `

阅读器设置

仅段落阅读模式
仅像素滚动模式
步长约 70%~130%
仅像素滚动模式
仅像素滚动模式
全部阅读模式
0 = 不提醒
自嘲熊

单击切换
双击设置
长按重置

吃饭饭

小猫 or 小狗

计时按墙钟统计;最小化一般仍继续,自动滚动可能变慢;与学习通平台记录可能不一致
`; document.body.appendChild(modal); document.getElementById('save').onclick = () => { CONFIG.scrollSpeed = parseFloat(document.getElementById('speed').value); CONFIG.scrollMode = document.getElementById('mode').value; CONFIG.scrollPixel = parseInt(document.getElementById('pixel').value); CONFIG.scrollJitter = document.getElementById('scrollJitter').checked; CONFIG.scrollIntervalJitter = document.getElementById('scrollIntervalJitter').checked; CONFIG.randomPauseEnabled = document.getElementById('randomPauseEnabled').checked; CONFIG.bearIconSize = parseInt(document.getElementById('bearIconSize').value, 10) || 77; CONFIG.autoStart = document.getElementById('autoStart').checked; CONFIG.showTips = document.getElementById('showTips').checked; CONFIG.showFloatBear = document.getElementById('showFloatBear').checked; CONFIG.highlightMode = document.getElementById('highlightMode').checked; CONFIG.loopMode = document.getElementById('loopMode').checked; CONFIG.targetMinutes = Math.max(0, parseInt(document.getElementById('targetMinutes').value, 10) || 0); CONFIG.showChapterTimer = document.getElementById('showChapterTimer').checked; GM_setValue('scrollSpeed', CONFIG.scrollSpeed); GM_setValue('scrollMode', CONFIG.scrollMode); GM_setValue('scrollPixel', CONFIG.scrollPixel); GM_setValue('scrollJitter', CONFIG.scrollJitter); GM_setValue('scrollIntervalJitter', CONFIG.scrollIntervalJitter); GM_setValue('randomPauseEnabled', CONFIG.randomPauseEnabled); GM_setValue('bearIconSize', CONFIG.bearIconSize); GM_setValue('autoStart', CONFIG.autoStart); GM_setValue('showTips', CONFIG.showTips); GM_setValue('showFloatBear', CONFIG.showFloatBear); GM_setValue('highlightMode', CONFIG.highlightMode); GM_setValue('loopMode', CONFIG.loopMode); GM_setValue('readingTargetMinutes', CONFIG.targetMinutes); GM_setValue('readingShowChapterTimer', CONFIG.showChapterTimer); if (CONFIG.targetMinutes > 0) { GM_setValue(GOAL_NOTIFIED_PREFIX + getReadingTaskKey(), false); } modal.remove(); log('设置已保存'); const oldBear = document.getElementById('reading-bear-float'); if (oldBear) oldBear.remove(); if (isReadingPage() || isReadingTaskPage()) { const oldTips = document.getElementById('reading-tips'); if (oldTips) oldTips.remove(); showTips(); showFloatBear(); } }; document.getElementById('close').onclick = () => { modal.remove(); }; } // 显示快捷键提示 function showTips() { if (!CONFIG.showTips || !isReadingPage()) return; ensureReadingTipsStyle(); const existingTips = document.getElementById('reading-tips'); if (existingTips) existingTips.remove(); const tips = document.createElement('div'); tips.id = 'reading-tips'; tips.style.cssText = ` position: fixed; bottom: 10px; right: 10px; background: rgba(0,0,0,0.7); color: white; padding: 10px; border-radius: 6px; font-size: 12px; z-index: 9998; font-family: Arial, sans-serif; `; document.body.appendChild(tips); updateTips(); } // 键盘事件 function bindKeys() { if (window.readingAssistantKeysbound) return; document.addEventListener('keydown', (e) => { if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return; switch(e.key.toLowerCase()) { case 'k': e.preventDefault(); resumeReading(); break; case 'z': e.preventDefault(); pauseReading(); break; case 's': e.preventDefault(); showSettings(); break; case 'r': e.preventDefault(); resetTaskTimer(); break; } }); window.readingAssistantKeysbound = true; } // 初始化 function init() { bindPageLifecycle(); bindKeys(); showFloatBear(); if (isReadingTaskPage()) { autoJumpToReading(); } else if (isReadingPage()) { getReadingTaskKey(); if (CONFIG.scrollMode === 'pixel' && window.readingAssistantInitialized) { showTips(); return; } showTips(); const wasManuallyPaused = GM_getValue('manuallyPaused', false); if (CONFIG.autoStart && !wasManuallyPaused) { setTimeout(startReading, 2000); } else if (wasManuallyPaused) { log('检测到手动暂停状态,不自动开始阅读'); } window.readingAssistantInitialized = true; } } // 启动 init(); })();