From 06327f3bfc0fb6406da6b9d75147fe279c055d3d Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Thu, 1 Feb 2024 00:44:45 -0400 Subject: [PATCH] dev 24.01.31 --- .gitignore | 2 +- .python-version | 1 + Pipfile | 14 ++ Pipfile.lock | 218 ++++++++++++++++++++++++++ daily_check.qrc | 6 + daily_check_rc.py | 356 +++++++++++++++++++++++++++++++++++++++++++ images/blank_128.png | Bin 0 -> 440 bytes images/none_128.png | Bin 0 -> 4482 bytes main.py | 44 ++++++ util_func.py | 86 +++++++++++ wg_basic.py | 63 ++++++++ wg_software.py | 93 +++++++++++ 12 files changed, 882 insertions(+), 1 deletion(-) create mode 100644 .python-version create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 daily_check.qrc create mode 100644 daily_check_rc.py create mode 100644 images/blank_128.png create mode 100644 images/none_128.png create mode 100644 main.py create mode 100644 util_func.py create mode 100644 wg_basic.py create mode 100644 wg_software.py diff --git a/.gitignore b/.gitignore index 68bc17f..2dc53ca 100644 --- a/.gitignore +++ b/.gitignore @@ -157,4 +157,4 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..171a6a9 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12.1 diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..99a9094 --- /dev/null +++ b/Pipfile @@ -0,0 +1,14 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +pyside6 = "==6.6.1" +requests = "==2.31.0" +wmi = "==1.5.1" + +[dev-packages] + +[requires] +python_version = "3.12" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..e86faa1 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,218 @@ +{ + "_meta": { + "hash": { + "sha256": "9fb9aefd0be8259a8edb7585a24d4f9480d2ffccf9320d3971b34c4aa306b7ef" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.12" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "certifi": { + "hashes": [ + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" + ], + "markers": "python_version >= '3.6'", + "version": "==2023.11.17" + }, + "charset-normalizer": { + "hashes": [ + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, + "idna": { + "hashes": [ + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + ], + "markers": "python_version >= '3.5'", + "version": "==3.6" + }, + "pyside6": { + "hashes": [ + "sha256:0a67587c088cb80e90d4ce3023b02466ea858c93a6dc9c4e062b13314e03d464", + "sha256:3593d605175e83e6952cf3b428ecc9c146af97effb36de921ecf3da2752de082", + "sha256:3c348948fe3957b18164c9c7b8942fe065bdb39648b326f212bc114326679fa9", + "sha256:ed3822150f0d7a06b68bf4ceebe287515b5e8309bb256e9b49ae405afd062b18" + ], + "index": "pypi", + "markers": "python_version < '3.13' and python_version >= '3.8'", + "version": "==6.6.1" + }, + "pyside6-addons": { + "hashes": [ + "sha256:5a63a8a943724ce5acd2df72e5ab04982b6906963278cbabb216656b9a26ee18", + "sha256:7cb7af1b050c40f7ac891b0e61c758c1923863173932f5b92dc47bdfb4158b42", + "sha256:a0982da4033319667f9df5ed6fa8eff300a88216aec103a1fff6751a172b19a0", + "sha256:a223575c81e9a13173136c044c3447e25f6d656b462b4d71fc3c6bd9c935a709" + ], + "markers": "python_version < '3.13' and python_version >= '3.8'", + "version": "==6.6.1" + }, + "pyside6-essentials": { + "hashes": [ + "sha256:0c8917b15236956957178a8c9854641b12b11dad79ba0caf26147119164c30cf", + "sha256:13da926e9e9ee3e26e3f66883a9d5e43726ddee70cdabddca02a07aa1ccf9484", + "sha256:a383c3d60298392cfb621ec1a0cf24b4799321e6c5bbafc021d4cc8076ea1315", + "sha256:c7185616083eab6f42eaed598d97d49fac4f60ae2e7415194140d54f58c2b42c" + ], + "markers": "python_version < '3.13' and python_version >= '3.8'", + "version": "==6.6.1" + }, + "pywin32": { + "hashes": [ + "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d", + "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65", + "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e", + "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b", + "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4", + "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040", + "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a", + "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36", + "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8", + "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e", + "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802", + "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a", + "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407", + "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0" + ], + "version": "==306" + }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "shiboken6": { + "hashes": [ + "sha256:072c35c4fe46ec13b364d9dc47b055bb2277ee3aeaab18c23650280ec362f62a", + "sha256:a605960e72af5eef915991cee7eef4cc72f5cabe63b9ae1a955ceb3d3b0a00b9", + "sha256:d756fd1fa945b787e8eef142f2eb571da0b4c4dc2f2eec1a7c12a474a2cf84e4", + "sha256:fb102e4bc210006f0cdd0ce38e1aaaaf792bd871f02a2b3f01d07922c5cf4c59" + ], + "markers": "python_version < '3.13' and python_version >= '3.8'", + "version": "==6.6.1" + }, + "urllib3": { + "hashes": [ + "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20", + "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.0" + }, + "wmi": { + "hashes": [ + "sha256:1d6b085e5c445141c475476000b661f60fff1aaa19f76bf82b7abb92e0ff4942", + "sha256:b6a6be5711b1b6c8d55bda7a8befd75c48c12b770b9d227d31c1737dbf0d40a6" + ], + "index": "pypi", + "version": "==1.5.1" + } + }, + "develop": {} +} diff --git a/daily_check.qrc b/daily_check.qrc new file mode 100644 index 0000000..16a56f9 --- /dev/null +++ b/daily_check.qrc @@ -0,0 +1,6 @@ + + + images/none_128.png + images/blank_128.png + + diff --git a/daily_check_rc.py b/daily_check_rc.py new file mode 100644 index 0000000..eadae6f --- /dev/null +++ b/daily_check_rc.py @@ -0,0 +1,356 @@ +# Resource object code (Python 3) +# Created by: object code +# Created by: The Resource Compiler for Qt version 6.6.1 +# WARNING! All changes made in this file will be lost! + +from PySide6 import QtCore + +qt_resource_data = b"\ +\x00\x00\x01\xb8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3>a\xcb\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc1\x00\x00\x0e\xc1\x01\xb8\x91\ +k\xed\x00\x00\x01MIDATx^\xed\xd21\x01\ +\x00 \x0c\xc0\xb0\x81\x7f\xcf\xe3\xc1E\x9a\xa7\x06zv\ +w\xe2\xba\xbfA5\x00\xae\x01p\x0d\x80k\x00\x5c\x03\ +\xe0\x1a\x00\xd7\x00\xb8\x06\xc05\x00\xae\x01p\x0d\x80k\ +\x00\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\x06\xc05\x00\xae\x01p\ +\x0d\x80k\x00\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\x06\xc05\x00\ +\xae\x01p\x0d\x80k\x00\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\x06\ +\xc05\x00\xae\x01p\x0d\x80k\x00\x5c\x03\xe0\x1a\x00\xd7\ +\x00\xb8\x06\xc05\x00\xae\x01p\x0d\x80k\x00\x5c\x03\xe0\ +\x1a\x00\xd7\x00\xb8\x06\xc05\x00\xae\x01p\x0d\x80k\x00\ +\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\x06\xc05\x00\xae\x01p\x0d\ +\x80k\x00\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\x06\xc05\x00\xae\ +\x01p\x0d\x80k\x00\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\x06\xc0\ +5\x00\xae\x01p\x0d\x80k\x00\x5c\x03\xe0\x1a\x00\xd7\x00\ +\xb8\x06\xc05\x00\xae\x01p\x0d\x80k\x00\x5c\x03\xe0\x1a\ +\x00\xd7\x00\xb8\x06\xc05\x00\xae\x01p\x0d\x80k\x00\x5c\ +\x03\xe0\x1a\x00\xd7\x00\xb8\x06\xc05\x00\xae\x01p\x0d\x80\ +k\x00\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\x06\xc05\x00\xae\x01\ +p\x0d\x80k\x00\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\x06\xc05\ +\x00\xae\x01p\x0d\x80k\x00\x5c\x03\xe0\x1a\x00\xd7\x00\xb8\ +\x06\xc05\x00\xae\x01p\x0d\x80k\x00\x5c\x03\xe0\x1a\x80\ +6\xf3\x00\xedw\x03\xfd\xcd\xd11\xb4\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x11\x82\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3>a\xcb\ +\x00\x00\x00\x09pHYs\x00\x00^|\x00\x00^|\ +\x01\x00\xc7|\xb4\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x11\x0fID\ +ATx\x9c\xed\x9d\x7fp\x5c\xd5u\xc7?\xe7I\xf2\ +\xbe]\xd9\x0d\xe0X\xde\x15\xb61\x8e\x81\x00\xa1m\x0c\ +I\x1a0\x04\x13~9\x09?Z\xb7\x04\x08N\x1b\x97\ +I\x93\xd0\xa4\x1dp;\x04\x1ahH\xe2$\xd8PJ\ +:\x19\x06&\x93\x940\x86\xd0P\x87\xf2\xc3.P~\ +\x19(`2L\x0a\x18\x1c\x036\xd8\xd6[\xcb&6\ +\xd8\xd2>E\xbb{\xfa\xc7[\xc9\x92\xd0j\xf7\xde}\ +o\x7fh\xf73\xa3\x19k\xf5\xce=\xd7\xba_\xdd{\ +\xdf\xbd\xe7\x9e+\xaa\xca\xa4BDz]\x0eW\xe5\x98\ +\x1c\x1c.0\x17\x98\x830\x03\x98^\xf8r\x81)@\ +g\xc1\xaa\x0f\xf8=\xe0\x03\xef\x14\xbezQ\xb6)l\ +u\xe0MGx\xb5\xcbg\x0b\x93\xec\x17&\x8d\xfe\xff\ +\xd9\x9e\x90C\xdb\xe1$\x85\x13E\xf9\xb8\xc2G\x80i\ +\x11\xb9\xdb\x07\xbc\x84\xb0A\xe0\xe9A\xe1\xe9\xd9}\xda\ +\x13\x91\xaf\xaa\xd0p\x02x]$\xd6\x19\xe3T\x1c\x16\ +\xa3,\x06\x8e\xacq\x956\xa1\xac\x05\xd6\xf6\x0d\xf0\xc4\ +|\xd5\x81\x1a\xd7\xc7\x88\xc6\x10\x80HG:\xc6\x99*\ +\x5c\x80p\x1e\xca\x07j]\xa5qQ\xf6\x22\xdc+\xca\ +\xdd\xc9\x01\x1eB5[\xeb*\x95\xa2\xae\x05\xd0\x93\x90\ +\xd9\xc0\xc5\xa2\x5c\x06\xcc\xaeu}\x0cI\x0b\xfc\xbb\xa3\ +\xdc\xd6\xe5\xeb\x1b\xb5\xaeL1\xeaR\x00^B\x16\xa2\ +|\x03\xf83\xa0\xad\xd6\xf5\xa9\x10\x05\xfeG\x95\x9b\xbb\ +}\xbd\xaf\xd6\x95\x19K\xfd\x08@Dzb\x9c#p\ +-\xc2\x82ZW'\x22^P\xe5\xbaz\x12B]\x08\ +\xa0\xc7\x953D\xf8\x1e\xf0\xb1Z\xd7\xa5J<\xafp\ +uwF\x1f\xa9uEj*\x80m\x9d\xd2\xdd\x9e\xe7\ +\x07\xc0\xd2\x9aU\xa2\x86\xa8p\xbf\xc0e\xa9~}\xbb\ +Vu\xa8\x8d\x00D\xda\xbd\x18\x97!|\x87\xe8\xde\xd9\ +\x1b\x85~\x85\x95{}V\x1c\xa3\xfa\xfbj;\xaf\xba\ +\x00\xbc\xb8\x9c\x02\xfc\x188\xb6\xaa\x8e\xeb\x1d\xe1%\xe0\ +k\xa9~}\xaa\x9an\x9d\xaay\x12i\xef\x89\xcb?\ +\x03\x8f\xd1j\xfc\xf7\xa3\x1c\x87\xf2\xa4\x97\x90\x7f}]\ +$V-\xb7U\xe9\x01z\x122[\x94;\x81\x93\x22\ +wV\x9a=\x04\xeb\xfe}\x08\xfb\x00\x07\xa5\x138\x98\ +`o`J-+\x07\x80\xf0\x1br\x5c\x94\x1a\xd0W\ +#w\x15\xb5\x00v\xba\xf2\xb9\xbc\xf03\x82M\x98j\ +\xb1\x1bx\x1exQ\xe1M\x07\xb6\x00[\x92>\xdbK\ +\xae\xce\x89tl\x8f\xd3\xd5\xae\x1c\xa9\xca\x91\xc0Q\x08\ +\x1f&\xd8c\xa8\xe6b\xd4>\x11\x96%\xfb\xf5\x97Q\ +:\x89N\x00\x22N:\xc6\xf7U\xf8\x07@\xa2q2\ +\xccn\xe0\x01\xe0\xe1\x9c\xf2\xdc,__\x8f\xc2\xc9v\ +W\xe6\xb7\x09\x8b`\xf8+\x19\x85\x9f\x11\xa8\xc0\xf5I\ +\x9f\xabP\xcdG\xe1 \x12\x01l\x14\x99r\x88\xcb\xed\ +\x0a\x9f\x0f\xbd\xf0\x03\xecP\xe5N\x11\xeeK\xf9<\x8d\ +j.B_\xe3\xe2u\xca\xf1\xe4\xb8\x04\xe1b\xa0+\ +BW\xab\xf7\xf8|)\x8a\xb7\x84\xd0\x05\xb0Kdj\ +\xd6e\x0dpz\xa8\x05\x07\xe4TXK\x9e\xdb\xba\x07\ +x\xb0n6[D\xdaw\xc68;',\x158\x9f\ +h\xe6\x11\x0f\xb5\xfb,\x99\xa1\xba?\xccBC\x15@\ +z\x9a\xcc\xd0,\x0f\x02'\x84Vh\x80/\xc2my\ +X\xd9\xdd\xaf\xdbB.;T\xbc\x84\xcc\x11X\xae\xca\ +\xa5@<\xe4\xe27H;\x9fM\xee\xd3]a\x15\x18\ +\x9a\x00\xbc\x84\xccAy\x98p\xf7\xe7}\x84[\xb3\xc2\ +\x0f\x1b-\xf0\xa2w\xaa\xcc\xccg\xb9\x5c\x85\xaf\x12\xee\ +b\xd7&\x843\xc3Z=\x0cE\x00\x85\xbf\xfc\xa7\x08\ +\xb3\xf1\x95{p\xb8\xbc\x96\xcb\xa4a\xd0;Uf\xe6\ +r\xac\x04.!\xbc\xc9\xf0&i\xe7\xe40z\x82\x8a\ +\x05\xe0\x89$\xc4\xe5\x11\x85OVZ\x99\x02o\x88\xf2\ +\x8d\xa4\xaf\x0f\x86T^]\xe0\xc5\xe5d\x82\x15\xd0\x8f\ +\x84T\xe4\x0b\xed>\x8b*\x9d\x13T\xb4\x12\xb8Qd\ +\x0a.\xf7\x86\xd4\xf8\xaa\xca\xaa>\x9fc'[\xe3\x03\ +\xa42\xba>\xe5\xb3\x00\xe1\x9b\x04\x0bQ\x95rB\xd6\ +\xe5\x9e\x8d\x22\x15M8\xed{\x00\x11'\xed\xb2:\xa4\ +W\xbd^Q\xbe4\x19\x1b~<\xbcN9\x9e<\xbf\ +\x00>TiY\x02w%}\xbe`\xbbN`\xdd\x03\ +\xa4c|?\xa4\xc6\xdf\xee\xb4s\x5c\xb34>@\xaa\ +O\x7f=\xe0s\x02\xca\x9aJ\xcbR\xb8\xd0s\xf9\xae\ +\xad\xbd\x95\x00\xd2\xae|\xb6\xb0\xc2\x17\x06\xb3\xf2Y\xfe\ +.\xa4\xb2\x1a\x86\xb9\xaa{S\x03,A\xb8\x02\xa8t\ +\x95\xef\xca\xb4+\x8bm\x0c\x8d\x87\x80\x1d\x09\x99\xe5(\ +/\x02\x1f\xb4qX\x0cUVu\xfb\x1a\x96\xa8\x1a\x0a\ +/!\x7f\x8a\xb2\x9a\xe0\xc0\x8a-\xbf\x03\x16\xa42\xfa\ +\x96\x89\x91Y\x0f \xd2\xee\x04\xbbz\xa16~P4\ +\xcb{\x5cY\x19v\xb9\x8d@\xaa_\xd7\x08|\x06x\ +\xaf\x82b\x0eQ\xb8\x0b\x91\x0e\x13##\x01\xa4\x83\xb1\ +f\xa1Q\xb5\x0c\x10a\xb9\x17\x97\xefEU~=\x93\ +\xcc\xe8c8\x9c\x06X\xbf\xdb\x0b\xfc\x89\xe7\xf2m#\ +\x9br\x87\x80B$\xcf\xe3D\xbf\xb3\x07\xb0\x22\x95\xd1\ +\xab\xab\xe0\xa7\xee(\xbc!<\x86\xfd\xeaa\x1e\xe1S\ +\xe5F\x16\x95\xd7\x03\x88\xb4\x8b\xf0#\xaa\xd3\xf8\x00W\ +5\xedp\xd0\xa7\xbf\x168\x0f\xb0=b\xe6\xa0\xdcR\ +\xeePP\x96\x00z\xe2\x5c\xae\xca\x1fZV\xc8\x8af\ +\x9e\x13\x14\x86\x83\x0b\x01\xdb-\xeec\xbd8_/\xe7\ +\xc1\x92C@!\x9ck#0\xd5\xb22\x95\xd2\xb4\xc3\ +A:!W\xa8\xb2\xca\xd2|_N8zV\xbf\xee\ +\x98\xe8\xa1\x92=\x80\xe4\xf9\x17\xec\x1b\x7f\xbb\xa5\xddH\ +\xaej\xde\x89!7\xa2\xfc\xca\xd2|\x9a\xa3\xdcX\xea\ +\xa1\x09\x05\xd0\xe3\xca\x19\x08K,+\x90v\xda9\x1e\ +Xai?\x92\xe6\x14\x81\xaa\x0e\xba,\x03\xb6\xda\x98\ +\x0b\x5c\x90\x8e\xcb\xa2\x89\x9e\x99P\x00\x22\xd6K\x8c*\ +\xca\xa53\xf7io\xa1\xfb\xfe\x8ee9#i\xca\x89\ +\xe1\x9c\xbd\xbaG\x1c.\xc0r\x03I\xe1\x9a\x89~^\ +T\x00=\xae\x9c\x0b|\xdc\xca\xa9rC\xd2\xd7\x07\x86\ +\xbeOe\xf4\x1aB\xe8\x09\x9au\x9d \xd9\xa7\x1b\xc0\ +\xec\xfd~\x04\xa7\xf6$\xa4h8~Q\x01\x88L\xac\ +\x9c\x09\xd8\xdc?\xc0?\x8d\xfd\xb0\xd0\x13\xb4\x86\x03K\ +\xf6\xf8\xac\x02\xac\xce\x09\x88Rt\x12=\xae\x00v\xc6\ +\xe54\xe0xKg\x7f_,MJk8\xb0\xa7\x10\ +\x11\xfc\x15\x82|\x03\xa6,\xf6:e\xdc8\xcdq\x05\ +\x90\x87+,\x9c\x80rO\xa9m\xdd\xc2pP\xb1\x08\ +\x9aq\x9d \x95\xd1'\x81;\xad\x8cs\x5c9\xde\xc7\ +\xef[\x07\xe8u\xe5C9a3\xe6\xab~>\xc2Q\ +\xe5\xc6\xf0\x15\xba\xf1\xab\x0c}\x8cGS\xad\x13\xec\x9a\ +*\xc9l\x8e\xcd\x98\xbf\x9a\xe7\xdb\xe0\x88\xae\x8c\xbe9\ +\xf2\xc3\xf7\xf5\x009\xe1Rl\x96|\x85[M\x028\ +[\xc3\x81\x1d3\xf6kZ\x95[,L\x9d\x1c,\x1b\ +\xfb\xe1\xe8\x1e@\xa4\xddsy\x1bH\x19\x16\xee\xe7\x84\ +\xf9\xa5V\x9d\xc6\xc3\x8b\xcbu\xc0\xb7L\xed\xc6\xd2L\ +\xf1\x04\x85H\xe3-\x98\x9f;H\xa7|\xe6\xa0:8\ +\xf4\xc1\xa8\x1e \x1d\xe3,\xcc\x1b\x1f\x84[m\x1a\x1f\ +Zs\x02\x1b\xba\xf6\xebN\x15~ja\x9a\xf4b\x9c\ +6\xf2\x83Q\x02P\xe1\x02\x8bBs\x8a\xf5z5\xd0\ +Z'\xb0A\x94\xeb\x81\xc1\x92\x0f\x8e\xb5\x93\xd1q\x9c\ +\xc3\x02x]$\x86p\x9ei\x81*\xac\x0d\xe3\xb8V\ +k\x9d\xc0\x8cB\xe8\x97\xf1>\x81\xc2\xf9#C\xc9\x87\ +\x05\xd0\x19c\x91U\x06\xce<\xb7\x19\xdb\x14\xa151\ +4C\x95;,\xcc\x0e>\xc8\xe5\x94\xa1o\x0e\x0c\x01\ +\x0eg[\x14\xe6u\x0f\x10j8wkNP>\x85\ +\xdf\xfdNS;\xd1\x03m}@\x00j!\x00eu\ +\x14G\xb4[s\x822Q\xcd\x8ap\xb7\xb1\x9d0\x1c\ +B\xee@\x90r\x1d8\xca\xa2\xa0{\x8dm\xca\xa45\ +'(\x13\xe1\xe7\x16V\xc7\xec\x9a*I(\x08\xc0\xb1\ +\x8b\xf4}'\xe5\xf3\x8c\x85]\xd9\xb4\xe6\x04\xa5I\xf6\ +\xf3\x02\x16\xc3@6\x1f$\xecr\x00\x04N4-@\ +\xe1\xbej\xa4ei\xcd\x09J\xa0\xaa\x0aO\x18\xdb\x8d\ +\x14\x00j\x9e\xd1C\xa0jyn[s\x82\x89\x11\xe5\ +Qs\xa3 /\xb3\x83\x88`qf\xbd\x0d\xfe\xd7\xd8\ +i\x05\xb4\x86\x83\xe2\xe4\x83\xe4\x9bf\x08\xc7!\x22\xb2\ +\xd3e^\x0eL/4\xd8\x9d\xf2\xe9\xaa\xc5\x05J\xad\ +]\xc4\xf1\xf1\xe2\xb2\x1d8\xd4\xd0l\xae\xa3\xca1\x16\ +\xfe\x9e\xaf\xd5\xedY\xad\xb7\x83\xa2\xbcdl\xa1\x1c\xed\ +\xe4\xe0p\x0bg/Z\xd8\x84FK\x04\xe3 l2\ +7a\x9eS\xb8W\xcf\x085\x1f2B\xa75'\x18\ +\x8d\xe4\xcd\x05\x90\x87\xb9\x0e0\xc7\xd4\xd0\xb1\x8cS\x0f\ +\x9b\xd6\xdb\xc1\x01\xc4\xa2\x07@8\xcc)\xdc\xa8i\xca\ +\x16\x0b\x9bHh\x0d\x07\x01Y\xe1\xb7\xa66\x023\x1c\ +\xcc\xb3x\xe7\x92~(G\xbeB\xa3%\x02\xc8d\xcc\ +\xf3\x0a\x880\xddF\x00}u\x93\xa3w\x04\xcd.\x82\ +B(\xbe\xd1\xe9!U\xa6;\x08\x09C_\xfd\x86\xcf\ +W\x8d\xd6\xc4\x10\xd3\xa4\x91\x09\x075\xcel\xddg\xf8\ +|Ui\xf2\xbd\x83}\x86\xcf\xc7\x1c\x0cS\x9b\x8b\xd4\ +\xb7\x00\xa0\xa9E`%\x00#\xb4zib*\xa2)\ +E \xe6\xc7\xc6\x1cL\x8f\x1dk\xe3\xdc\xf3\xd7t\x22\ +P\xe3\xd3B\x03\x0eb|\xee\xbcV\xa9b\xach2\ +\x11t\x1a>?\xe0\x88\x1a\x8f\xe9\x0d\xd3\x03\x0c\xd1D\ ++\x86\xa6ot}\x8e\x06)FM\x88U\x9a\xa2\xbc\ +\x16L\xfau\x82 -\x9c\x91\x00D\xf8\x9dCp\xe5\ +\x9a\x11\xd3\x12\xe1\xa7\x8a\xad\x06\x93Y\x04\xbd.\xb31\ +\xcc\xfc\x9aWv;\xa8\xb9\x00:\xf2\xa1\xde\x0bTU\ +&\xab\x08\x06\xed\xb6\xf5w;\x80\xf1\x9d<\xaa\x16!\ +\xe4u\xc4d\x5c1t,\x04\xe0([\x1d\xb5\xdb\xd9\ +kh\x01\xc0\xa4\x9c\x18\xda\xf4\x00[\x9d6\x9b\xbd}\ +i|\x01\xc0\xa4\x1b\x0e\x16\x98\x1a(lqD\xd8h\ +\xe1\xec8\x0b\x9b\xbadR\x88 \x88\xec6O\xe9\xe7\ +\xb0\xd1\xe9\xf2\xd9\x82\xf9E\x05\xb3{]\xa9\xf8\xc2\xa3\ +z\xa1\xd1\xe7\x04=1\x8e\x04\x0e12R\xf6\xa62\ +ls\x0a\xd1\xbd/\x9b:\xcd\xc9\xe8L\x13\x8dN#\ +\xcf\x09D,\xfe\xfa\x85\x97QU\xa7\xf0\xcd\x06\x0b\xbf\ +\x13\xe6\xa0mD\x1a\xb8'8\xcb\xd8By\x0e\x0e\x9c\ +\x0d|\xda\xc2\xe9i\x85\xb1gR\xd1p{\x07\x22m\ +`q\xb4\xdf\x09\xda\xdc\x01\x18\x14+\x01\xcc\xf4\x12\xe6\ +3\xcfF\xa0\x91\x86\x83\xb4\xcbB\xcc\xc3\xfahs\x82\ +\x93\xdd\x0e@\xe1f\xee\xd7\x8c\xbd\xe7\xb8\xc4\xd8\xa6A\ +h\x94\xb7\x03U\xce\xb50{\xa5k\xbf\xee\x84\xd1\x19\ +B\xd6\x19\x17#\x5clzMY#Q\xf7s\x82\xe0\ +.\xa7\x0bM\xcdTY;\xf4\xef\x91\x9b\x07\xe6\x02\x80\ +\xaet\x8c3-\xec\x1a\x86z\x9e\x13xq\xceU\xe8\ +6\xb5S9\xd0\xd6\xc3\x02\xe8\x1b\xe0q\x94\xbd\xa6\x85\ +\xe5\x85/\x9a\xda4\x1au;'P\xbela\xb5\xe7\ +]\x9f\xf5C\xdf\x0c\x0b`\xbe\xea\x80M\xce\x1f\x81\xf3\ +\xbd\x84\x18\x1f/k4\xeamN\xd0\x1b\x97y\xc0\x19\ +\xa6v\x02k\x0a\xa9\xe7\x811\xfb\xc7\xa2\xfc\xc2\xa2.\ +S\x04\x96[\xd85\x1c\xf54'\xc8\xc1?bq\xf9\ +w^\xb9k\xe4\xf7\xefK\x16\x9dvy\xcbb\x5c\xf1\ +;\x1c\xe6}\xb0O=\xd3\x0a5\x22\xb5Np]\xb8\ +\xcao3\x1034\xf5\x0a\xc9\xa2\x87Ov\x8dV\x90\ +jV\xe1v\xd3\x0a\x01n6\xdfuh\xbfV5\x99d=\x10\ +\xc5+\xa2\xe7\xcaY\x08k\xb1;\x98\xfbL*\xa3E\ +o\x0e\x9dP\x00=q9]\xe0a\x0b\xa7\x00[\x07\ +c,\x98\xb3W\xf7X\xda7,a\x0e\x07mm\xdc\ +\x9c\xcb\xf1\x1b`\xa6M\x01\x02\x8b\x92\x19}\xbc\xe8\xcf\ +K\xe5{\xf4\xe2r7\xf0\x176\xceQ\xd6\xa4\x06X\ +R\xab\xa4\x92\xb5$D\x11l\x07f\xd9\x18\x0a\xdc\x95\ +\xcc\xe8E\x13>S\xaamv$d\x96\xa3l\xc4\xf6\ +P\xa8pE\xaa_K\xdec?\x19\x09Q\x046\xbc\ +\x97u8\xba\x10\xebQ\x94\x92k\xc9\x87\xf6\xebv\x11\ +\xeb\x09!(\xab\xbc\xb8,\xb5\xb6o`B\x5c'0\ +G\xb8\xb6T\xe3C\x19=@\xf0\x94\xb4{q^@\ +\xf9#\xcb\xea\x0c\xa2\x9c\x93\xf2\xf5\xbf-\xed\x1b\x9a\xb0\ +&\x86\x06\xbc\x9c\xf2YP\xce\xabxy\xbbI\xaaY\ +\x94\xaf\x03y\xcb\x0au \xfc\x87\xd7)V7\x927\ +:a\xc5\x13\x94I^\x85\xaf\x94\xbb\x0eS\xf6vb\ +*\xa3\xebQn\xb2\xaf\x17\xd3\xc8\xb3\xb6\x89E\x10\xd6\ +:A)Vt\xf7k\xd9A\xbe\xe5\x0d\x01\x05^\x17\ +\x89u\xc6x\x16\xe1\x8f\xad\xaa\x16\xd0\x87\xb2\xa45\x1c\ +D\xc2\x93)\x9fO\x9b$\xf24\x0a(\x98\xaf:\x80\ +r1\xe6\xe9\xc8F\xd2\x89\xf0_=\x09\xf9|\xe9G\ +'\x1f\x11\x0e\x07\xbdY\x87\x8bL\xb3\xb8\x1aG\x94\xa4\ +\x06\xf4U\x11\x96\x81yJ\xb2\x11L\x11e\xb5\x97\x90\ +\xcb'\xe3\xe1\x92RD0\x1c\xe4Q\xbeX\xce\xac\x7f\ +,\xc6\x02\x00H\xf6\xeb/\x85\x8a\xb7~\x1d\x94\x1b\xbc\ +\x18\xff\xf9\xf6Arp\x85e5\x1cmm\xdc\x0c\xa1\ +%\xdd^a;\xa4\x1a\xcd\x01F[\x8ax.?\x05\ +\xfe\xd2\xae\x80QlS\xe1\xc2\xee~\x8d\xf4\x1e\xc2z\ +\xa1\xb0\xc4~;\x90\x0a\xa1\xb8\xd5)\x9f\xa5\xa8Z\xbd\ +\xa1Y\xf5\x00\x00\xa8\xea\x1e\x9f/\x03\x0fY\x97q\x80\ +\xd9\xa2<\xee\xc5\xe5\xaa\xc9|\xd0d\xab\x88\xeb\xb9r\ +\xa3\x04\xbf\xb30\x1a\x7f]\xca\xe7\xafl\x1b\x1f*\xe9\ +\x01\x0ax\x22\x09\x5c\x1e\xc6\xe2\xf2\xc9\x22lF\xf9\xdb\ +\x94\xafa\x08\xabn\xd8\x11\x97O;\xf0o\xc0\x87C\ +*rC\xbb\xcfi3TM3\x84\x8f\xa2b\x01\x00\ +\xa4\xa7\xc9\x0c\xcd\xb2\x9eps\x07\xad\xeepX\xde\xe8\ +\x91\xc6\xe9\xb8\xccU\xe1&\xdbH\x9e\x22\xbcF\x07'\ +\xa7\xdeS\xe3\x0coc\x09E\x00\x00^B\xe6\xa0<\ +D\xb8\x22\xd8\xaf\xca-\x1d\xed\xdc0c\xbf\xa6C,\ +7rz\x122\x1b\xb8R\x94\xbf\xc6.\x82\xb7\x18\xaf\ +\xa9pfw\xbfn\x0b\xa3\xb0\xd0\x04\x00\xc3=\xc1\x03\ +\x10\x5cK\x1a\x22\xbe\x0a?\x11ee*\xa3o\x85\x5c\ +v\xa8\xec\x8c\xcb\xe1\xf9\xe0\xd0\xc62\x0cS\xf1\x97\xc1\ +st\xf0\xb90\xfe\xf2\x87\x08U\x00\x00\xbbD\xa6f\ +]\xee\x81H\x0e\x8d\x0e\x02\xbfR\xe5\xe7\xdd\x03\xac\xab\ +\x9b\xb8\xc3`\xb3\xec\x1c\x94\xbf!8\xaee?\xb9.\ +\xce:\xc7\xe7\xcfg\xaa\x86z_C\xe8\x02\x00\xd8(\ +2\xe5`\x97\x9f\x01\x13\x06#T\xc8.\x84;E\xb8\ +#\xd9\xcf\x0bU\x0f:\x09NQ-T\xe5\x1c\x84\x8b\ +\x08gV_\x8c;R>\xcb\xa2\x10|$\x02\x08J\ +\x16\xc7s\xf9.p%\xd1_2\xd1\xab\xf0\xb8(\x8f\ +\xe6\xe0\xd1Y\xben\x0e\xdd\x83\x88\xec\x88q\x84#|\ +\x82\xa0w\xfb\x0c\xa6\x99\xb9\xcc\xc9\x03+R>\xd7D\ +%\xf0\xe8\x04P \xed\xcab\x15n\x87\xaa&\x98\xde\ +\x01\xbc\x84\xb0I\xf2l\x12aSV\xf8m&\xc3\xae\ +\xc2\xedZ\xc5\x11\xe9\xe8u\x99=\x08\x87\x0b\xcc\x95 \ +\x12\xf7\xa3\x04\xc1\xb1Q7\xf8Hv\xa1,\x8dz\xd3\ +,r\x01\xc0pX\xd9j\xe0\xe4\xc8\x9d\x95f\x90\xe0\ +v\xad\xbd\x08\xfb\x09\xd6\xd1\xa7\x11\x5c\x84\xe1\x02\x7fP\ +\xcb\xca\x15x\x22\xebp\xb1\xcd\xda\xbe)U\x11@\xe0\ +I\xdaz\x5c\xbe%\xc1Vh\x14\x93\xa4\xc9\x80\x22\xfc\ +(\x95ay\xb5&\xb8\xd5\x13@\x01/!\x0b\x81\x1f\ +\xa3\x93'\xddl\x18\x88\xf0\x7fy\xf8\x9aI0G(\ +~k\x12\xb1-\xd2\xee\xc5\xb8\x8c \xd8\xb4\x1e\xba\xdc\ +Z\xd2\xa7\xb0j\xaf\xcf\x8a\x91\x99;\xaaEm\x04P\ +`w\xa7\xa4\x06\xf3\xfc\x10h\xca\xa8a\x15\xee'\xf8\ +\xab\x0feU\xcf\x86\x9a\x0a`\x88t\x5cNU\xb8\x16\ +8\xb5\xd6u\xa9\x12\xcf\x08\x5c=\xd1\x89\x9djQ\x17\ +\x02\x18\xa2'!'\x89r5\xb0\xb8\xd6u\x89\x02\x85\ +gE\xf9v\xcaW\x9b\x94|\x91PW\x02\x18\xc2\xeb\ +\x94\x05\xe4\xb8\x1a\xe1|\x1a\xff\x8d!/\xc2\xfd\x0a+\ +S\xfd\xfaT\xad+3\x96\xba\x14\xc0\x10;\x122K\ +\xe0\x0b\xa2|\x158\xac\xd6\xf51\xc4\x13\xb8\xdd\x81[\ +\xbb2\xfaf\xad+S\x8c\xba\x16\xc00\xc1[\xc3\xe9\ +\x22\x5c\xa0p>P\xaf1\x84{\x04\xd6\xa8rwj\ +\x80GP\xcd\xd5\xbaB\xa5h\x0c\x01\x8c`\xa3\xc8\x94\ +\x83\x5cN\x11\xe5l\x84\xc5\xc015\xae\xd2\xcb\xaa\xac\ +Sa\xdd\xbb>\xebk\xf1*W\x09\x0d'\x80\xb1\xec\ +\x9a*\xc9l\x9e\x13\xc9\xb3\x10\xe1c\x08\xc7\xa1| \ +\x12g\xc2\xbb(/\xa1l\xc0a}\x9b\xc33\x8d\x9e\ +\x15\xad\xe1\x050\x1e^\x5c\x0eC9Z`^\x1e\xe6\ +:\xc2\x1c\x85.\x11\xa6\xab2\x9d\xe0\x8a\xd5v\x0e\x1c\ +y\xdf\x07d\x81~\x11\xdeQ\xe5\x1d\x81\x9dye\x9b\ +\x03[\x14\xb6 \xbcZ\xef\xc1(6\xfc?\x14\xfa?\ +\xdce\xbf\xf3&\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +" + +qt_resource_name = b"\ +\x00\x06\ +\x07\x03}\xc3\ +\x00i\ +\x00m\x00a\x00g\x00e\x00s\ +\x00\x0d\ +\x06\x0b\xf4\xa7\ +\x00b\ +\x00l\x00a\x00n\x00k\x00_\x001\x002\x008\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x0a\xf7\xc1\x07\ +\x00n\ +\x00o\x00n\x00e\x00_\x001\x002\x008\x00.\x00p\x00n\x00g\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x8db\xb8\xc9\xc8\ +\x00\x00\x002\x00\x00\x00\x00\x00\x01\x00\x00\x01\xbc\ +\x00\x00\x01\x8da\x99\x15\xcb\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/images/blank_128.png b/images/blank_128.png new file mode 100644 index 0000000000000000000000000000000000000000..7eeafdbedff2e509e9221cb4f141a406abdcca80 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBuf-vKbiP>*~8hkxn978JN-d-|fWKiHau%WU3{NsbJvzD_} zm6bo*wcpW{VI5-uZ$mai4D$mihU*MF*ba;eVGW4}v(F4~%bEY4y=b@v7}^Y;u6{1- HoD!MT9Nt4i| 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..7775d73 --- /dev/null +++ b/main.py @@ -0,0 +1,44 @@ +# coding: utf8 +import sys +from PySide6 import QtWidgets +from wg_basic import WgBasic +from wg_software import WgSoftware + +import daily_check_rc + + +class UiMainWindow(object): + + def __init__(self, window: QtWidgets.QWidget): + window.resize(800, 600) + window.setWindowTitle("日常检查工具") + + self.vly_m = QtWidgets.QVBoxLayout() + window.setLayout(self.vly_m) + + self.tw_m = QtWidgets.QTabWidget(window) + self.vly_m.addWidget(self.tw_m) + + self.wg_basic = WgBasic(window) + self.wg_software = WgSoftware(window) + + # self.tw_m.addTab(self.wg_basic, "基本信息") + self.tw_m.addTab(self.wg_software, "已安装软件") + + +class MainWindow(QtWidgets.QWidget): + + def __init__(self, parent=None): + super().__init__(parent) + self.ui = UiMainWindow(self) + + +def main(): + app = QtWidgets.QApplication(sys.argv) + win = MainWindow() + win.show() + return app.exec() + + +if __name__ == '__main__': + main() diff --git a/util_func.py b/util_func.py new file mode 100644 index 0000000..c3c0acf --- /dev/null +++ b/util_func.py @@ -0,0 +1,86 @@ +# coding: utf8 +import os +import wmi +import json +import win32gui +import requests +import subprocess +from pathlib import Path +from PySide6.QtCore import QDir, QSettings +from PySide6.QtGui import QImage, QIcon, QPixmap + + +def get_isp_name() -> str: + req = requests.get("https://ipinfo.io/") + if req.status_code == 200: + try: + data = json.loads(req.content) + return data.get("org", "[Not found]") + except json.JSONDecodeError: + return "[Decode Error]" + return "[Return Error]" + + +def get_win_manufacturer() -> list[str]: + w = wmi.WMI() + cs_ls = w.Win32_ComputerSystem() + if len(cs_ls) > 0: + cs = cs_ls[0] + return [cs.model, cs.Manufacturer] + return [] + + +def get_win_license() -> str: + temp_out = str(Path(QDir.tempPath(), "lic.txt")) + return_code = subprocess.call( + rf'cscript /Nologo /U "C:\Windows\System32\slmgr.vbs" /dlv >{temp_out}', + shell=True, + ) + if return_code == 0: + with open(temp_out, "r", encoding="utf-16-le") as f: + return f.read() + return "" + + +def get_win_installed_software() -> dict[str, str]: + + def gather_software(path: str, software_dict: dict[str, str]): + reg = QSettings(path, QSettings.Format.NativeFormat) + soft = reg.childGroups() + for s in soft: + c = QSettings(path + "\\" + s.split("/")[0], QSettings.Format.NativeFormat) + name = str(c.value("DisplayName")) + if name == "None": + continue + icon = str(c.value("DisplayIcon")) + software_dict[name] = icon + + all_software = {} + gather_software(r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", all_software) + gather_software(r"HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall", all_software) + gather_software(r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall", all_software) + + return all_software + + +def extract_win_icon_from_file(icon: str, default: QIcon) -> QIcon: + if icon == "None": + return default + if icon.endswith(",0"): + icon = icon[:-2] + icon = icon.replace('"', "") + icon = icon.replace("'", "") + if not os.path.exists(icon): + return default + if not icon.endswith(("exe", "EXE")): + return QIcon(icon) + + large, small = win32gui.ExtractIconEx(icon, 0) + if len(small) > 0: + win32gui.DestroyIcon(small[0]) + if len(large) > 0: + image = QImage.fromHICON(large[0]) + return QIcon(QPixmap(image)) + else: + return default + diff --git a/wg_basic.py b/wg_basic.py new file mode 100644 index 0000000..4780759 --- /dev/null +++ b/wg_basic.py @@ -0,0 +1,63 @@ +# coding: utf8 +from PySide6 import QtWidgets +from util_func import ( + get_isp_name, + get_win_manufacturer, + get_win_license, +) + + +class UiWgBasic(object): + + def __init__(self, window: QtWidgets.QWidget): + self.vly_m = QtWidgets.QVBoxLayout() + window.setLayout(self.vly_m) + + self.gbx_isp = QtWidgets.QGroupBox("网络运营商", window) + self.vly_m.addWidget(self.gbx_isp) + self.vly_gbx_isp = QtWidgets.QVBoxLayout() + self.gbx_isp.setLayout(self.vly_gbx_isp) + + self.lne_isp = QtWidgets.QLineEdit(self.gbx_isp) + self.lne_isp.setReadOnly(True) + self.vly_gbx_isp.addWidget(self.lne_isp) + + self.gbx_manu = QtWidgets.QGroupBox("系统制造商", window) + self.vly_m.addWidget(self.gbx_manu) + self.hly_gbx_manu = QtWidgets.QHBoxLayout() + self.gbx_manu.setLayout(self.hly_gbx_manu) + self.lb_model = QtWidgets.QLabel("型号:", self.gbx_manu) + self.lne_model = QtWidgets.QLineEdit(self.gbx_manu) + self.lne_model.setReadOnly(True) + self.lb_manufacturer = QtWidgets.QLabel("制造商:", self.gbx_manu) + self.lne_manufacturer = QtWidgets.QLineEdit(self.gbx_manu) + self.lne_manufacturer.setReadOnly(True) + self.hly_gbx_manu.addWidget(self.lb_model) + self.hly_gbx_manu.addWidget(self.lne_model) + self.hly_gbx_manu.addWidget(self.lb_manufacturer) + self.hly_gbx_manu.addWidget(self.lne_manufacturer) + + self.gbx_license = QtWidgets.QGroupBox("许可证", window) + self.vly_m.addWidget(self.gbx_license) + self.vly_gbx_license = QtWidgets.QVBoxLayout() + self.gbx_license.setLayout(self.vly_gbx_license) + self.pte_license = QtWidgets.QPlainTextEdit(self.gbx_license) + self.vly_gbx_license.addWidget(self.pte_license) + self.pte_license.setReadOnly(True) + + # self.vly_m.addStretch(1) + + +class WgBasic(QtWidgets.QWidget): + + def __init__(self, parent=None): + super().__init__(parent) + self.ui = UiWgBasic(self) + + self.ui.lne_isp.setText(get_isp_name()) + model, manufacturer = get_win_manufacturer() + self.ui.lne_model.setText(model) + self.ui.lne_manufacturer.setText(manufacturer) + + self.ui.pte_license.setPlainText(get_win_license()) + diff --git a/wg_software.py b/wg_software.py new file mode 100644 index 0000000..31ce898 --- /dev/null +++ b/wg_software.py @@ -0,0 +1,93 @@ +# coding: utf8 +from PySide6 import QtWidgets, QtCore, QtGui +from util_func import ( + get_win_installed_software, + extract_win_icon_from_file, +) + +SoftwareStatusRole = 0x0101 + + +class UiWgSoftware(object): + + def __init__(self, window: QtWidgets.QWidget): + self.vly_m = QtWidgets.QVBoxLayout() + window.setLayout(self.vly_m) + + self.hly_top = QtWidgets.QHBoxLayout() + self.vly_m.addLayout(self.hly_top) + self.cbx_safe = QtWidgets.QCheckBox("安全", window) + self.cbx_unsafe = QtWidgets.QCheckBox("不安全", window) + self.cbx_unknown = QtWidgets.QCheckBox("未知", window) + self.cbx_safe.setChecked(True) + self.cbx_unsafe.setChecked(True) + self.cbx_unknown.setChecked(True) + self.pbn_import_filter = QtWidgets.QPushButton("导入过滤文件", window) + self.pbn_export_unknown = QtWidgets.QPushButton("导出未知", window) + self.hly_top.addWidget(self.cbx_safe) + self.hly_top.addWidget(self.cbx_unsafe) + self.hly_top.addWidget(self.cbx_unknown) + self.hly_top.addStretch(1) + self.hly_top.addWidget(self.pbn_import_filter) + self.hly_top.addWidget(self.pbn_export_unknown) + + self.lv_software = QtWidgets.QListView(window) + self.vly_m.addWidget(self.lv_software) + + +class SoftwareListModel(QtCore.QAbstractListModel): + + def __init__(self, parent=None): + super().__init__(parent) + self.all_software = get_win_installed_software() + self.all_software_wz_qic = {} + for s in self.all_software: + self.all_software_wz_qic[s] = extract_win_icon_from_file( + self.all_software[s], + QtGui.QIcon(":/images/blank_128.png") + ) + self.names = sorted(self.all_software.keys(), key=lambda x: x.lower()) + self.filter_dict = {} + + def rowCount(self, parent: QtCore.QModelIndex = ...): + return len(self.names) + + def data(self, index: QtCore.QModelIndex, role: int = ...): + row = index.row() + name = self.names[row] + + if role == QtCore.Qt.ItemDataRole.DisplayRole: + return name + if role == QtCore.Qt.ItemDataRole.DecorationRole: + return self.all_software_wz_qic[name] + if role == SoftwareStatusRole: + if name not in self.filter_dict: + return -1 + else: + return self.filter_dict[name]["safe"] + + +class WgSoftware(QtWidgets.QWidget): + + def __init__(self, parent=None): + super().__init__(parent) + self.ui = UiWgSoftware(self) + + self.software_list_model = SoftwareListModel(self) + self.ui.lv_software.setModel(self.software_list_model) + + self.ui.pbn_export_unknown.clicked.connect(self.on_pbn_export_unknown_clicked) + + def on_pbn_export_unknown_clicked(self): + unknown_software = {} + sl_model = self.ui.lv_software.model() # type: SoftwareListModel + for r in range(sl_model.rowCount()): + idx = sl_model.index(r) + name = sl_model.data(idx, QtCore.Qt.ItemDataRole.DisplayRole) + safe = sl_model.data(idx, SoftwareStatusRole) + if safe == -1: + unknown_software[name] = {"safe": -1} + + + +