diff --git a/.noai b/.noai new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rare/components/tabs/library/details/cloud_saves.py b/rare/components/tabs/library/details/cloud_saves.py index a2315d103f..cc98e73c8f 100644 --- a/rare/components/tabs/library/details/cloud_saves.py +++ b/rare/components/tabs/library/details/cloud_saves.py @@ -96,12 +96,12 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): def edit_save_path(self, text: str) -> Tuple[bool, str, int]: # Validate against raw_save_path (usefull when the user types the path manually) - path = os.path.normpath(text.lower()).split("/") - spec = os.path.normpath(self.save_path_spec.lower()).split("/") - depth = min((len(spec) - 1), (len(path) - 1)) - depth = depth if depth > 0 else 1 - if path[-depth:] != spec[-depth:]: - return False, text, IndicatorReasonsCommon.INVALID + # path = os.path.normpath(text.lower()).split("/") + # spec = os.path.normpath(self.save_path_spec.lower()).split("/") + # depth = min((len(spec) - 1), (len(path) - 1)) + # depth = depth if depth > 0 else 1 + # if path[-depth:] != spec[-depth:]: + # return False, text, IndicatorReasonsCommon.INVALID if platform.system() != "Windows": if os.path.exists(text): return True, text, IndicatorReasonsCommon.VALID diff --git a/rare/components/tabs/settings/widgets/overlay.py b/rare/components/tabs/settings/widgets/overlay.py index cbf1c00dfb..c13810a58e 100644 --- a/rare/components/tabs/settings/widgets/overlay.py +++ b/rare/components/tabs/settings/widgets/overlay.py @@ -297,6 +297,7 @@ def __init__(self, parent=None): OverlayCheckBox("compiler", self.tr("Compiler activity")), OverlayCheckBox("devinfo", self.tr("GPU driver and version")), OverlayCheckBox("drawcalls", self.tr("Draw calls per frame")), + OverlayCheckBox("full", self.tr("All HUD elements")), ] left_form = [ (OverlayNumberInput("scale", 1.0), self.tr("Scale")), @@ -324,13 +325,17 @@ class DxvkConfigSettings(OverlaySettings): def __init__(self, parent=None): super(DxvkConfigSettings, self).__init__(parent=parent) self.setTitle(self.tr("DXVK Config")) - dxvk_config_trinary = (("Auto", "Auto"), ("True", "True"), ("False", "False")) + dxvk_config_boolean = (("Default", ""), ("True", "True"), ("False", "False")) + dxvk_config_tristate = (("Default", ""), ("Auto", "Auto"), ("True", "True"), ("False", "False")) # fmt: off grid = [] left_form = [ (OverlayLineEdit("dxvk.deviceFilter", ""), "dxvk.deviceFilter"), (OverlayNumberInput("dxvk.numCompilerThreads", 0), "dxvk.numCompilerThreads"), - (OverlaySelectInput("dxvk.tearFree", dxvk_config_trinary), "dxvk.tearFree"), + (OverlaySelectInput("dxvk.tearFree", dxvk_config_tristate), "dxvk.tearFree"), + (OverlaySelectInput("dxvk.enableGraphicsPipelineLibrary", dxvk_config_tristate), + "dxvk.enableGraphicsPipelineLibrary"), + (OverlaySelectInput("dxvk.enableAsync", dxvk_config_boolean), "dxvk.enableAsync"), ] right_form = [ (OverlayNumberInput("dxgi.syncInterval", -1), "dxgi.syncInterval"), diff --git a/rare/resources/images/Rare.icns b/rare/resources/images/Rare.icns index 2baf46f05a..0f529b5016 100644 Binary files a/rare/resources/images/Rare.icns and b/rare/resources/images/Rare.icns differ diff --git a/rare/resources/images/Rare.ico b/rare/resources/images/Rare.ico index 82bc76f3f6..62766d0b18 100644 Binary files a/rare/resources/images/Rare.ico and b/rare/resources/images/Rare.ico differ diff --git a/rare/resources/images/Rare.png b/rare/resources/images/Rare.png index 50b04958d7..a36ec4c943 100644 Binary files a/rare/resources/images/Rare.png and b/rare/resources/images/Rare.png differ diff --git a/rare/resources/images/Rare.svg b/rare/resources/images/Rare.svg index 56707864fb..a88b8d8913 100644 --- a/rare/resources/images/Rare.svg +++ b/rare/resources/images/Rare.svg @@ -1,468 +1,57 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rare/resources/images/icon.png b/rare/resources/images/icon.png index 3c62036d6a..4dca77d5ba 100644 Binary files a/rare/resources/images/icon.png and b/rare/resources/images/icon.png differ diff --git a/rare/resources/resources.py b/rare/resources/resources.py index cb40fb7605..3a4f1188d5 100644 --- a/rare/resources/resources.py +++ b/rare/resources/resources.py @@ -35161,285 +35161,328 @@ \xef\xea\x93\xd4\xd2?$\xc2\xc8i,2\xa2\xbf\x06\xae\ \x0a\xdf\xe0\xf8\x1as<\xf4\x7f\xe7\xce\xbf\x01\xce\xf1\xef\ \x96\ -\x00\x00\x11J\ +\x00\x00\x13\xf2\ \x00\ -\x00\x11@x\x9cUWy8\xd4_\x17\xffZG\xf6\ -\x8c=\xb2\x84\xecke\x8f\x99\xc4\x18;!K\x96l\ -![\x8c}\x19c\x10)k\xf6\xa2P\x11C\x881\ -\xf6%BvE\xd6A\xd9\x97ad\x1d\xbc~\x7f\xbe\ -\xf7\x9es\xcf=\xe7\xfcs\x9e\xe7\x9e\xe7s?'\xc1\ -\xd8P\x87\x81\x96\x9b\x16\x00\x00\x06]\x98\x96\xe9\xa5\xd5\ -\xfcOi\xa8/\xcf2w\xbf\xb9KC\xe6o\xaa\x03\ -%\xfb\xdd+\x19u\xe9P\xbaA\x0c \x00\xf0%\x99\ -\x8e\xe4Hu\xe9\xf3;\xc1L\x0d\x00 T\x04\x00\x90\ -h\x008\xb9\x0c!W\x01\x00!\x0b\x00\xeb\x0e\x00\xa0\ -\x92\x0d\x00\x1c\xbe\xf98\x13\xb5\xcb\x04\xf5c=\x1d-\ -\xe0\xe2\xbf]\xd8\xfc1\xfd2r\xc5\x17f\xe5\x0f\x00\ -t\xe0\xff\x94\x0c\xc8\xcd\xe7\xbc\x0c\x82\x02t\x0d\xee\x83\ -\xd6\xe8iX\xae\xb0\xf7\xf8\xd8\x92\x03\x003ZW\x0b\ -\xf2 xj\xcb:\xcc\xf7\xc1\x0a\xe2\x22\x22\xf9t\xe6\ -u-\x0c\x06\x93\xb8B\x15\xc3\x0cE\x02\x02\xb2\x0eU\ -~\xf0\xcd\xec.w\xa8\xb5\xea\x97+u6a\x9b\x93\ -9\xa5=c\xb7\xc6\x02\xf2w\xf9\xbco\x0e\x0cc\x0d\ -x\xeb\x9d\xea\xf5\x9f\xf6\x04~\x14\xdeV\xea>@s\ -?\x8diG\x06\xd3\xf4>\x8f\x97\xcb\x84\x18\xa5\xd4\xb2\ -L5\x86\xd9\xcfOhl\xdf\xad\x1d\xdd\x934t\xb3\ -~\x93\xa3\x1av\x18y87\x1f4\xa8\xbe\x12\xbe\xa2\ -\xba\x02\xa4\xdf\xd2\xfd?\xd9\xbfH\xfd\xfez6P\xc3\ -\xaa\xbaKS\xf4\xcf\xd5\x89\xd7hS(\x90\x05Dz\ -\xe4\x93\x19\x970C\x9f\x19\x16\xbb\x88U\x97|#\xaf\ -\xb2\xb2+p\x8f\xf4;\xcabm\xdb\xfc\xcd\x94\xbe\xf7\ -\x8cY\xec\xd1\xfa\xe9ub\x84,T\x88B\xb3\x84\x92\ -\x97\xd8$DI\x8e\x04\x9e\x1b\x89\x85wc\x8d\x9e\x0b\ -\x86\x86%\xa8\xf9-6x\xb2hm\x95\x83t\xadb\ -\xb5!\xea\x823B\xe0\x16\x074\x1e\xb7\xb8\xc2\xd6\x96\ -\xc4\x15\x05/+Sb\x13\x84\xa83\xd1\xf2\xb3\x01\xd6\ -\xeb\xc6f \x90\xa6Y2\x0dp\x9d\xc6O\xb8\xa4\xce\ -y<5\x7f:\xcd\x9f\x03\xb7|\x82\xdb>\xcc\xbf\xf1\ -~\xa7\xf9c%\x8cYx\x9e$&\x95\x8c\xcc5\xcc\ -\xefGw&x}\xee\xf2{\xa0\x84\xa1\x1e2\x13@\ -C\xd1\x0e`\x02\xd9M\xc4d;\xc4vpA\xde\xf5\ -\xb9\x82\x9b\x9a\xdf\xc9>\xdd\x9e<\xf9\x91\x8aUKS\ -\x9c,\xbb\x1bF\x82U\xd3\x03\xd0\x07\x1c\x01\xaa\xd2y\ -f\x80\x02I\x0b\x0f\x01d\xc2uK\xef\xd1\xe8\xa2\xe4\ -\xe8h\xeb\x0b\xcb\x8a\x8c\xbfb\xc7\x7fb\xc7\xf7\xd1\xe3\ -\xe6a\x0f\xb3\xe7z\xa3\xbd\xa3/Hy$\x14\xf6\xb4\ -\x12v6\x0eg\xcf\xbc\x13\xbf\xb1^\xe5\x05\xae\xe3\x85\ -\x8e2\x82\xa7\x19;\x03\xf5\x17\x1b\xa8\xd5\xecc3\xc4\ -i8\x85\x84\xd00\x85\x02\x80\x19$K\x8b\x87\xaeO\ -\x90;H\xd0\xfa\xc7\xd2\x1c7\x06\x15\xa4\xb5M?C\ -\x01\x89\x89wRb\xe9:\xc7\xfd$\xa5\xd1\xe3\xa6I\ -\xda\x00+\x85h\xea\xed\x11x\xbd\xbb_\x8d\xa84&\ -\xeb\x83\x95T\x03\x0bY\x896\x1c\xb8\xb2\xd8\xd0\xd9U\ -=8\xdc\xde\x9e\xde\xb4\xb5t\x83\x93{-\x1dw\x87\ -\xd2\x80\x0f\xf9\x81\x11j\xe2\xa4e\xa6\x1d\xfb~\xaa\xe2\ -F\xe6N3\x01\xcd\xd9\xaf\x1a\xf5\x04\xfc\xe8\xc1\xc3\xb6\ -\xe2\x95U\xdffr\xec6\xeb\x1a\xce,\xc1+\x8be\ -Z:\xd3\xb1\xe6G\x81\xaa\x1bFT\xfa\xad0C\x8d\ -\xa98|D\x89\xf4\x90\xb6\xf5\x9e\xb2\xaf\xaf\xc6\xda\xe6\ -6\xb9,\xe0\xc0\xacI\xaf\x99o\xfa\xf8s\xd9\x1a\xef\ -]5\xf1\xb8x\xfb4.\xb2\x8c\xac\xa8\xac\x1f9N\ -\xa3Z\x1d\xe6\x80;\xb9(\xb91m\xe1\x8c\xfd\x94\xd2\ -\xbc\x97\xed\x11\xc2\x84\xd5\x8a\x1e\x9a!!o'\xa6\xce\ -\xfd\x02Ax\xe5\xd4\x08\x9bo\x00\x9b\x8e\xe1\x0aE\xdd\ -\x12\xde\xef\xc3c\x99\xfc0B*\x92\xfd\xbc!\x07C\ -\x94\x00k\xe4\xc5J\xed]VS\xb5y\x85\x85\x103\ -\xfc)\x9bo\xf3Z\x97\xdf\x87\x17\xa5\xdfj\xcepS\ -\x7f\xdf\x8b\x9a\xe6\x8d`\xfb\x97\x1a\x03\x94\x02a\xee\xea\ -$\xea\xe9\x89)\xeaB\x8e6e\xa0\x13\x90|d9\ -\xbb\xd4#52}\x9a(\x94\xfa\xbd\xb9\xf8\xcbHa\ -\xaf\xb3)\x15L\xf4\xdf\xb7\xa2\xea\x80>\x86\xc1\x89m\ -\xec\x84L\x0e\x8e\x1b]\x95\x7fx\x13\xcc\xbcK\x97\xd2\ -\xabU\xa8\x8d#\xe3\x16\x07F^\xee\x82\xaf\xee\x93\x8e\ -\x8bH\x84\xd4\xad\x14%i\xb6\xbf\xe0\xf7\x04\xc3\xde\xe3\ -\x10ss\x1d\xd5\xc5\x16\x1d@\xb9\xc79qC\xc51\ -\xd8\xaet\x9f\xc4\xbd\xd8P\x03\x815\xd7\x17.\xb0\xcb\ -}\xadeD\x0f{v\x1d\xfen;f\x1a\xaf\xf0i\ -\xd5?\x01iP\x0d\x83\x9f\xc4&m\xe0\xb6k\xeb\xac\ -Q\xe5\xd6\xffd\xfdy\xf4t\x7f\x07\x89!\xc5[C\ - 55\x8f\xff2\x15\x97\xbd\xfe8/\xac\xad\x83\x7f\ -\xfb$~b\x8a\xdco/\xd8\xae}l\xea7\xfe\xe5\ -\x80\xb1\xeb\x10\x05\x03\x87+\xefK\xafdB\xdd\x81\x97\ -\xd0\x9dj{\x8fu\x93\xf7\xa2\x1f\xd1\x1f\xfeM\xdb~\ -\xa1\xe17\x9f\xb8b2-\x96\x8eQM\xc7\x1a\xc6H\ -\x8a?=`\xffa#a^\x81\xc7\xe1U\x03+q\ -\xa7\x9d\xf6Ug:\x07\x14J\x14x5\x01Ns\xd6\ -1\x97\x91'1\xb9\xd5\x87\xa5@Y\xf3\xcf~\x0b\xd5\ -~\xcbs\xe6D\xd3\xfc\xcc\xbaf7P\x9a\xcc\x99\x02\ -\xe9\xc0\xe2{{\xf4\x0b\xcf9<@*\xf2\xf2=l\ -\x02\xf5rM\xd6\x8a\xd2X\x02\x83\xb7\xe5\xbc\xac\xa5\xbe\ -\x80\xd1v\xcfUQ\x0aF\xe23.\xb9\xd2\x5cn\xd4\ -j\x95\x19\xd89\xc9E\x1c\x9d\x96{\xaf\xb8O;i\ -\xbaPt\x19\xd1\xe9\xa6\xb6ii\xd4\x9a*Z\x1c\x1f\ -\x18\xf8\x0d\xc0\x02\xb6\x02j\x05\x926\x07\xcdP@\x18\ -\xf0 -SIl\x9a+^\x08s\xd2\x91!\xe7'\ -b\xbbZ\xbd\xe26\xb7z\xe15\xd5,\xe1\xed,U\ -\xd5\xb4\xcc\xb3\xfa\xa5\xc5T\x17\xb62M\xbf\xd8\xbfc\ -j~\x87\xf5K8\xcc 4&k\xfb\xca\xe1\x91\xa1\ -\xa1\x1c[[\xd3\xd2\x065or]\xeb\xd1\xe8Z\x16\ -\x93\xc7V\x0c\xd5\xe5\x01/\x15\x89q?\x0b3\x22\x04\ -\x8eZ\xf8&\x02[.&\x9e^\xa4\xce\x02*d\xf4\ -).\xfd-\x96d\x85\xd6\x99\x069Y\xa4\xc1Y\xa3\ -\x8f?\xe76\xd4b\xbb\x96\xa3(yn\x1aW\x9eP\ -?\xf1\xdc\x06\x92\x0dAO\x1c\xd2\x04\xd9\xc3\x19\xb8\xc5\ -t\xe5D\xf1\x88\x08\xc6\xd3\xe6z\x81Wu\xa0\x89\x07\ -l\xddg\xc9\xa8\x89\x1fp:H\xf5\xdc\x5cs\xf1G\ -\x9f<\xfa\x1c7\x01\x81\x04\x17\xf3~\xf7\x12\xfb\x83\xa2\ -\x91kc\x07\xdb\x88HT\xd7\xb2\x9bL\x82\x86\x09\x95\ -t\xdc\x05g\xf0\xc0\x8f$\xe5\xd5\xca\x96\x03\xa7Q\x8d\ -qF<\xfd\xe72\x8frj\xe3%\xd2\xeeI\xbc\x16\ -d\x81\x94\xf4\xa7 J\x84\x02\x83i\x05u[\xb6\x90\ -Y?\xa0gNs\xbc\xdb\xb2&\x86\x0d\x9b\x8b\xaf\x0e\ -v'\xdc\xa6!\x93J\xd2|S\xcf\x99mJ\x7f\xf1\ -P\x15\x7fJ\x98bD\x0d\xe5\xf0M\x0a\x0bh\xb1\xb3\ ->\x80L\xc0W\xbf\x7f\x122\xd5\xbe\xef\xb2oq\xf9\ -*\x0a0\xc2\xb3\xd6CI\x16\x19\xd2\x99\xf0.1\x1e\ -\xc1\xd1\xa9\x01\xd8\x15t\xb8\xa9I~\x16\xa7;^\xa8\ -\x0b\x04\xd8\xff+\x80\x98uG\xda\x7fce\x0e\x04\xfd\ -\xa4/\xe2\xd0|\xa4\xe7\x10\xcc\x09\x14\xce\x1f\xd2\x8c\x1f\ -\x1bhbn\xc4Ea\x98\xe6Z\x98\xc8\xc4\xda9n\ -E\xb3\x1bp)\x5c\xa5\xbd^A]Q\x8e\x9a\x08\xe5\ -\xcf\xee\xba\xa9\xd3~\x8d\xddU\xed\xeb\xad$\xf9\xd2\x0d\ -\xb6\xea*\x87\xcc|\x96\xd2\x01\xa5\xc6I~\x96\xbc(\ -\xb2\xae%\xb2\xf3\xee\xf8w\x83\xf6i12q\x83\xf7\ -\x92\xe8!\xdd2\x94\xf1o(o\xdf\x03\xef~\xf6\xc4\ -\x7f\xddf\x22\xa8jD\x8fN\xd2w\xb0\xc1:\xf3\x0d\ -\x9b\xff\x98L\xfd\x9c\xe8)+\xe3\xe6P\x0e\x9a9/\ -\xbc\x95\xe4\x01T\x1dn\x22\xa3\xb0\xc27B\x10\x91f\ -v\x8e/R9\x9b2g\x01\xa0$\xe4>\x06\x18\xb5\ -\xc9(\x1dCvt\xe0\xf5\x84X\x08Co\xe3F\x87\ -i\xde\x7fjg\xc8\xb5\x06\x0c\xfa\xb1\x9e\xee/;B\ -\x8f\x0b\xf8OO\xc8I>\xf3`Y\x0d\xf6\xa0\x00\xca\ -\xdd\xa8`\xeem\x0c\xaf\xef\xe16\xba1\xe8\xe6\xe4f\ -\xe80JPIJu\xa1\xe0\x8c\xbe\xbc\x96\x1c\xed_\ -\x95&\xcf/O\x15\xa9sMV\x85\xd6\x9d;Z\x8c\ -\x19\xea\x22\xc4\xb2\x08\xb2a2\xb6\x02W\xb0\xdeO\xbd\ -\x9fS\xe2:\x9d\x17=0\xf0\x06\xe45RmK\x98\ -\xd4\xec\xde&\xd2\x0a\x0fa\x7f\xd5\x92\xd7\xb6\x08p\xee\ -\xa8\xbd\xec\xda\x90\xb9\x87\x1b\xd4\x22\x22\x9e>\xb4\xb1C\ -\xab\x11C\xf8\xc7+\xcbc\xea\x9e\x1c\xa3O7\xd5U\ -\x91Z\x82\x8d\xfb?\x155K\xbd\x90\xfe\xab7\x94|\ -H:\xbe<'\xa2/Z\x9fXQ\xcf\xcf\xd6\xb1=\ -\x0e\x10\xca\xd63q\xfeR\x9e`az\x89\xdd\xfe*\ -\x1d\xfeF\xb5\x14vU\xdf\xc6\xbd\x8f\xc55\xad\x18\xfd\ -w\x0d\x8c\x04Z\xd6J\x9b\xa0\xd8U%\x97\xe1_3\ -\xa9\xb7\xdf\x1c\xdc\x80\xb5\xd4P1\x9fs\x86\xed\xa5\x06\ -o\xcc\x0b\xa8\xdce\xecX\xfc\xfb\xb9\xb0\xb2E\xaa\xb5\ -9\xcc\x1b\xf3\xdb\x9f\x91Y\xf3\xc4\xce\x22\xdbi\xd0\x9f\ -\xa0.\x83\x97#p$N\xd7~\xcaI\x5c\x5c<\xf9\ -\xd1hcc\xaag`\x8e\xf7\xea\x91\x0fv\xa4$D\ -\xb4\x1d\xc6\x10w\xc9\xb1]J\x97\x9d_Z\xce\xed\x0f\ -\x19\xf0\xbeW\xac\xb5\xd7\x5c\x8f\xdf\x99\x06g\x0f\x90\xb4\ -W\xeb\xa3$t\x8e\x94\xb9\x11c|@n\xe6\xebG\ -6\x123f=\x85\xb7+\xd0\xd5\x81\xbc\x19_7.\ -oM\xa2\x91\xb9:\x00\xf37\xe1\x7f\xb6\xb9\xae\x08\x91\ -&\xfd\xfb\x0f\x9b\xfcz\xbfe\xe5z\x0a\xc0/[\xa8\ -}K\x85\xae\xae\xea\xca\xc9\x94\xaa\xc2N\xbdM`{\ -\xc4\xe1\x1b|\x1d\x97b\xdbQgX\xcd]\xc1\x81?\ -\x9a\x1a\xc5N \xff<\xf6\xd8\xe3\xef\x05\xf7\xa6z\xcb\ -\xd9?q?\xf7\xd6l=\xbe\x13\x1c1K\x88\x1f\x8c\ -\xf9d\x8d\xa7\xe8^x\x91\xde#\x90~\x85y\x16y\ -k\xc0C\xfa\xf2k\x03\xae\xb6\xa6 \xecJ\xfe\x82-\ -9\x0d(<\xads\x95\xb3\xea\x22\xcc\xe5\x1d\x5c\xd8\x08\ -n?;\xb0DUH\x00u\x9br(\xe7\xe0F%\ -\xd5\x8e\xa4T\x8c\xdfD\x01\x92sYi\x80;\xee\xdf\ -\xa6Q\xb4s[U\xdd\x02\xe4\xd3?:\xe2c\xa5\x9e\ -i\x87\xd6\xfdp\x82\xce\xc4\xd5P\x92\xee0\xea=}\ -\xe4T\xb0\x16\x89<\xdb[\xf3\x990t\xcc\xa6o\xbf\ -[p\xd26;\x84\xf3y\x87m\xeb\xd5\xe5\x93\x97\x0e\ -.#\x9f-Q\xef\xc5d\xcfW\xcf\x7f\xc8\xaf\x22\xde\ -\xa2\xce\xfaZ)c\xde1'10\xc5\xb0k\x8b\xa8\ -4\xcfN+\xfc\xa0@\x12\x973\xf3\x1b^\xcd\xf2+\ -\xdb\xd4;\xcb\x08\xa5\xb7\xd7\x84\x04\xf7\xa9\x19\x95\xb6\xef\ -\x86\x09Z\xbc\xfdG\x16\x19\xc5\xc4\x22s\x17DC\xe6\ -\xcb\xe8\xb4t\x18#\xac\xf0\xb5\xa9\xef\x88\xaa*q}\ -\xbe\xbfI\x14\x0d+\xae\xcf\xb0\xbab\x05\xf6\xde?m\ -t\xf4:f+\x97jE\xcd\xcfG\x0c \x1f\x07\xd3\ -$d\xbd\xed\x97t9\x89\x8bo\xfb\xdc\xc2\x8a\x17Y\ -\x845\x1d\x90w\xc1$7\xf6-fhWC\x97[\ -O\xbe\xfe\x03\xd77\x97\x1e\x7f\xde\xf8\xe5&\xb3\x1aJ\ -xz\xfd\xad\xfc\x10]*\xbe\xcb\xdf)\xed\x0b3\x03\ -[\x92c\x1d\x07|\x96d\xcbV\xe3u\x04:\xa0Z\ -\xd1\xb3\xb4\x07\x13\xdd\xa9\xffjV\xe9{\x04y\xa1M\ -\xaf\x95\x8f\x8c\x22R\x82\xcf\x5c\x9e\x0f\x19vV\x0e-\ -\x8e\xa1\x04\xb3\x93\xcf\xef\xbf\x02\xef\x9f\x86=\xcbw\xc0\ -g\x05|B\x10!Q\x84\xa2$'\xfd\xe9(\xeb\x0d\ -y{\xf5o\x12\xbb3\x9c73\x11\xda\x1e\xa1\xc2#\ -\x0c\xc3S*\xcf\xd3{\x16x\xdd\xc9,\x22\x8fq\x18\ -J.jU\x0d:\xf27\xd3;h\x5c\xa12\x18$\ -4?G\xdez\x06\xc3\xf3u/\xb85\x85\xf4i\x95\ -\xafDR'\x05u\xe4\xc6\x0d/\x19\xa1V\x14x\x05\ -\xf0\xbc\xca)}\x5c\xe3.\xb7\x90\x0f\x7fq\xc1A \ -\x15\xf9\x0d\x17'\xe6\xc0>L\x0d\x01\xa71\xf4\xf55\ -\x0a\x8a\x94C~\xc1\x877I=\xf2\xb0=\x82\xb5\x10\ -\xf3\xe8c\xc2\xff\x0e\x0c\xfbX\xe7\x81Wa9\x06W\ -\x97;\x87\x94\xbe1]x\x0a\x12\x01\x87\xe9\xf6\x87\xd7\ -\xf7p\xaa\x0a\xd3\x7fn%\x03\x9a \xd0+\xd3\xbfm\ -\xef\xceRF\xa9\x00\x97\x035$(rdn\xd7\xc2\ -\xb0V\xfb\x860\x8d\xfa.\x18\xfd\xf6H7\xf0T\xd5\ -\x02\xe0\xb8\x96\xc5\xd2\xcb\x14\x09\xf2\x19\x1a\xc4{\xde\x91\ -FEN+\xfa\x7f}!\xc7i\x7fvgu&\xc4\ -*\xf2\xb2\xf4\xa2\x5c\xbdba\xe2\xcb+|\x07\xaf\xea\ -\xcd\x96\xd4\xf0r\xaf\x15\x1f0\xf2x\xbc+\xaei|\ -\xc1\xd8\xc3H\x0e0p@\xad\x1a\xa5\x831KN\x93\ -\xf1\x07\x86\x0e\xf2|\xc4,\xeez\xa6\xed\xe8\xd3\xc6\xf1\ -\xf3\xc58+\xd9\x96\xddY}\x9e\x14\xa7\xce2j\xa2\ -\xcd5\xcd\x8fFC\x8b|3\x0ar,\xb6-\xd4\xb2\ -\x22*\x10Nm\xd9;vr\x8c[\x03\xe8\xc9\xbe)\ -D\xce\x03.\xdeW\xbcBof\x1f\xf1\xb4!GC\ -\x8f\xea\x0f\xd6m2\x91\xcc\x1fnW\xa2\x82\x9e\xf09\ -\xfb0\xe5K\xb5RK\x89\xfe\x80o\x89\xf7\xaa\xcfQ\ -\xbb\xf5W\xf6P\xaa0\xfd)\xefq\x0e\xa8\x05\xb1\xa4\ -P-\xd0\x02\xfc\xae\x9c\xdd\xb3L\x1d\xa1\xe7;\xfc\xf1\ -qx\xd2\xb2\xf9e\xaf\xf3\xc4\xebw\xc6\xd2\xa8\x1f\x14\ -%\x99\xf1H\xb4}\x09i\xdb\x9f\xeb\xfe\xbd\x07\x17Q\ --\xbe]\xd9\xe7\xfc!\xe3Wg+\x95l\xdb%:\ -w\xd6~\x1e\x02#j\xc4\x8b\xb9r!X\xf2\x83\x92\ -\x1c_\xa6-\x86\x83\x91x\x1b$\x8c\xb2\xa9I^\xf1\ -&?\xd5L\xf2]@46\xb0\xdf\xab\xa1=\x9d\xe0\ -\xc8G\xa29\xf8\x9c\xa7`\xc5E\x8c\xeeiK\xd4\xab\ -I\xa2\xffv\xd7uvvz\xed\xfbw]\xdf\x0f\xf0\ -NQ=\x19\x93\xa7\xcbO\xb1\xf1\x07TG\x15\xe0\xdd\ -\x04GT\x1c\x9d\xff\xab|\x1a\xf9\x98\x8bJ+\xd2\xe9\ -u\xaa\x97\xac vE\xdfsu\x97\x8d:E \xe0\ -KY\x996\x15\xe04\xeb\x16v\xd6\xf0\xaf\xbf-8\ -;\x8e\xae\xddu\xbc\xc3\x93.\x8d\xeb\x12\xbb\x9b\xde\x0e\ -A\xf4>\xa0\xe2^\x00P\xcd\x00p\xdfb\x89\xb1\xe5\ -L\x9ay\x98\x00\x1e\x81\x10\xdc\xed\xf6$\xdc\x0dVT\ -\x146\xb7JOg)r\xc3\xd5\xc1\x0d\xd4\xa9\xa18\ -\xf7\x8bco\xc1\x12\x91\xce\x0583\x14C\xa9\x11\x95\ -\xe2\x17\x12\xbe8\xd9<\x959Q `\xb1g\x06\x9c\ --\xa5\xbf\xef\xdf\xba$'G\xb9i\xef\xcf\xd4\x09\xaf\ -x\xb0\xe1\xa6\xfb\xfbk\x8fj?\xfa4\xd2\xe7lu\ -\xddj\x14 s\xb7\xba\xe4\x1cD\xad\xe3Z\x9b\xb3k\ -\xae3\x19\x98{\xb6A\xa4p\xdd\x91k>3\x9ft\ -\xc5\xc6\xdcw\xb9\xa3~V\xff\x0c$\x8e\xf6\x8cAS\ -z)7\xcfT\x17\xbc\xa7i\x83\xe7^si\xac\xb4\ -\xd7\xd5\x86\x98\xdfY\xdf\x8b\xc8\xe2S\xad{s\xc0\xb4\ -\xc9\x82\xfb%\xc2p\xc6\x9a4\xcc\xcf\x1f\x8d6\xd7g\ -\xe9\xcd\xb9\xe5.\xc3\xec\x22\xac\x18\xe2\xbf\x5cN\xe6\xd4\ -\x87\xe8N\xf6<=<\xcb\xdf\x9a9\x85$\x1e\x13\xd1\ -)JyrN\xcah\x02%\xeaq\xa3\x8e\xc6N\xa2\ -\x89L\x08\x5c\xab\x88\xc1AM\x1fKn\xa7\x00\x86\x13\ -\xe1)\xeel)\x98\x88\x91\x19\xb5\x8a\x8a\x98g\x1b[\ -\xc3;M\xd7\xe0[3I\xf57\xeb\xd4\xcby\xbc#\ -\xd2\xdf\xf2MI\xb1\x95\xbc|\x16H\x9bt\xa8\x9cf\ -K\x88-\xf8\xd3RU\xba3\xcd2\xfa\xae\x93CR\ -E\x8d'KXx\xac=;\xf4\x11\x81\xb7\xd1\xf2\xd4\ -wE\xa4n\x05\xff\xf6\x81\xa33\x92\x99\xc5\x92\xb5\xf3\ -F\xeaw\xf5K&M\x22\xd7sZ\x99:j\xff\x15\ -$\xe0gZ\xb6~S\xcbd\x10&l\xce]\x13\xce\ -\x84.\x9csP\xfbxk\x19\x87(\xac\x9d\xcb\xd38\ -t\x95C\xac#D_6\xff\x93_\xe3;a\xd5\x0c\ -2\x96\xe45\xe3\xd6\xe3\xd0\xd9X\xd7\xcf\xd5W\x81\x97\ -\xf1\x9ckH\xbe\xa2\xcd\xea\x8eK\xde+\xe2\xddI\xdf\ -n\xf9o\x14xW\xfaH\xcb\xe4\xa4\xa4\xc3\xc9\xd6\x04\ -\xcck\xd1\xc1{\xec\x82S:\xa1\xaf`\xcaI\xbcI\ -*TZ?6\xc1nO.\xae\xca\x9b\xb0\xe6\x9c\xc5\ -\xb2\xeaTb\xd4Z\x9e$\x88J\xe7H0\xd4X\x8b\ -\x83\xfb\x96\xe4<\xac\xdc\xd6\xf0x\xbf_S\xbf\xe0\xd4\ -\x8f\x9bM\xc7\xe2\x0a\xddc\x86k!\xa5\xa5\x9dZ\xe6\ -R\xf6?7o\xdc\xf3\x9b\x0f\xdb\x8do\xf8\xbb\x0bR\ -\x1c\xb9\x9f\x0a\x95V\xd7\xb9fv]FX7\xcc\xc3\ -\xf8\xba\x22\xa6J\xed\xee\xf0;\x1e\xa5\x00\xc4\xdf]\xc9\ -\x8a\x1b\x12\x16?\xf83\xec\x1cc(\xf5\x22\xae\xda\x1f\ -\xf1w\xa5\xa2\x85hJ\xd89_\xdc[(2\xbe\x9c\ -\xf4j\xb1\xc6?\x85\xa08\x85\xcd\xbc\xb9^\xcc\xf5\xe8\ -\xa0\xa8\xccV\xc8\xe3\xce\xf4bG8\x95\x02z a\ -i\xcd\xf7)XW5\xc9Y^\xff\xa9j\xc6G\x08\ -\xea\x03Af\x8c\x1f\xf2\xd4\xbc\x04\xb3\x13O\x9am\xd4\ -Ho\xcb\xdb\xa3\xb5vf\x15G#\x10R\xf2\xc8t\ -\x16\xada\x91N\xec\xbd\xdb\xcb\xd19\xe79f\x99\xab\ -\x0d\x1dv\xef\x16\xffE\xe9\x15\xdd/\x8c\xbb\xb6\x22\xef\ -\xedf\xe3lk\x19\x13&%%\xefZv\x7f\xf9\xb8\ -\xff\xeb\xf7$\x9f\xb4\xd0\x8c\x8c\xacS\x0e\xf74A\xd6\ -\x14pnF\xb1\xd0]\xa7\xdf\x22%\xfe+\xd9\x9b\xab\ -\xc1\x07\xb9\xb9\xc5\xae\x83\xe1\xe8\x0cK?Z%-\xac\ -a\x99\xee\xfa\xc9\xa2\xbdc\xde\x0c\x85s/\x0b\xc5\x87\ -\xb5\xabCz\xf5\xa5\xca!S\xe3\xc5\xceI\xdf\xb5P\ -\xf6+w\x1a.\xbcH\xba\xb9\xc5\xff''\xad\xda\x17\ -\x0c\x19\x14\x06\x7f\x82W)\x13\x80\xcb\xa5{\xdfP\x0b\ -\x03u@\xfd\x0f\xc6`\x5c&\ +\x00\x13\xe3x\x9c\x01\xe3\x13\x1c\xec\x89PNG\x0d\x0a\ +\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x00@\x00\x00\ +\x00@\x08\x06\x00\x00\x00\xaaiq\xde\x00\x00\x00\x06b\ +KGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x13\ +\x98IDATx\x9c\xedZYt]\xd5y\xfe\xf6\ +p\xce\xb9\xa3\x86+\xcb\xb2dY\x9ed\x1b[\x1e%\ +l0\xb6A6\x84\xa9\x81\x0c\x8d\xa1u\x80f\x80\x84\ +4\x856i\xe8K\x1fr\xd3\xae\xae4i\x9b\xd5\x05\ +\x19\x9a\x904i\x08\x94b2\x14\x07\x08\x84\xe1\x1a\x17\ +\ +\x0b\xed\xba\xa0E\xc5 \xb1\x22`r\x15\x90\x91\xcc0\ +?y\xf2\xd7zp\xe4E\x126Z\x84iv\xcc\xad\ +\x99?\xf2\xfc\xe0\x01\xbf@B2IoI$\x8c\xae\ +\xf6\x92b&Gj\x98-V\x8b9\x89O\xc8E\xb5\ +[\x11\x09\x87&\x09\x14\x02:\x9b\x86J\x8f\x80X\x16\ +H$\x06\x12/\x9a\xacS\x08\x9f\x9d>\xb3\x87\xbe\xf0\ +\xf2\xbf\xd0\xbc\xdbB\x88>?8\xd8\x97mm\xbd\xca\ +\x9f:\x12\xa6\x10\x90\xa4\xb5\xb5\x03F<\x9e-bL\ +V\x93\xf9s\xb7x\xb7~\xe8\xafUq\xc9\xec\xc0c\ +\x0dy\xa2\x19\xfe\xd1\xc3\x10\xc7\x8fB\xe7\xb3\x93\x15S\ +\x02:\x7f1\xf8\xf2\xd50\xea\xaf\x02\x89\xc4\x0a\xdf\xd8\ +\xf9\xbev\xd6\xd2\xf2\x880\x22\xfbJ\xe7\x9a\xadn\xcf\ +\xd0\xc8\xde\xce\xbd\x1e\x004\xd6\xddj\x00(\x19\x1a\xca\ +\xd72\xe1o\x14+\xaex@W\xcc\x9eW :\x9f\ +\x85\x7fh?\xc4\xb1\xb7\xa1\xce\xb5A\xab\xc9S\x9aD\ +b\xe0\xcbW\x81\xd7\xad\x05_V\x07\x90\xc0-\x92N\ +\xf7\x99\xbfy\xe9\xeb8\xdd\x9e\x0a\x87YgOO,\ +\xdd\xdaZ6\x89\x84\x09\x04hRWw\x87\x11\x8d\x86\ +\xe3J\xa1F\xad^\xf6\x11\xb1\xed\xfa\x87t\xc8\x8c\x00\ +\x80<\xd3\x0a\xf7\xf9_Bv\x9e\xc5\xe5\x80\x84\xc20\ +\xaf\xfd\x10\xcc\xcd\xd7\x17F\x05\xc9d3\xfc\xe0\xe1\x7f\ +R\x11\xba\x9b\xc4p\xd2\x03M\x03@\xc8\xe0q\xd5/\ +\x97B\xa8-\xaa~\xf5C*\x1e\x0b\xbaT\x08\xb8\xff\ +\xf5\x12\xfc\xd7^\x82v\xec\xcb\xd2\xcb\xe6-\x80u\xcb\ +\xc7\xc1\x16,\x0e\x0al7o\xbc\x9c\xfa\xa6u\xe2\xd8\ +3R\xa2=\x97\xb33\xcd\xcdO\xf9\x00\xd1\x00\xc0\xc6\ +\xecml$\x8c\xd2\x910\xa5\xa4R\xcd\xad\xba\xd6\xbf\ +\xf5\xe6\xaf\xea\xb0\x15\x85\xd6\xf0v\xbf\x08\xe7\xe9\xc7\xa0\ +\xd3CA\xe5p\x14\xc6\xaaz\x98\x9b\xb6\xc2\xb8j3\ +\xcc\x0d[\xc0\x97,\x07\x9d]\x09\xed\xd8\xd0\xd94 \ +\x04d\xdb\x09\xc8S\xc7\xc1\x96\xad\x04\xb1B\x80eZ\ +z\xf6\xac+\xd17t\x1ef<\xe3\x95\x15\xf9F\x84\ +E\xe5Hx\x11U\xe2:\xb1v\xe5Wt,p^\ +\xa5G`\xff\xf8;\x10\x87\x0f\x00B\x00\x00he5\ +\x8c\xab\xb6\xc0\xbc\xfaZ\x98\x9b\xb6\x82\xafZ\x07\xbex\ +\x19\x10\x0aA\x8f\x0c\x03\xc2\x87N\x0f\xc3?\xb4\x1f\x84\ +\xf3\x80\x04\x83\x1bj\xde\xbc\x0d\xac\xfb\xfcI\x9a\x19\xe9\ +5Mj/Y\xf2\x8e<{6\xa5'\x8c\x80$m\ +hh\x0a\x01\xa5\xb3X\xccjp\xee\xde\xf1]]R\ +<\x07\x00\x9c_=\x01\xff\xc0\xeb\xa3\xbd\x1a\x81\xb5\xf5\ +&\x18\x1b\x1b\x0b\xbd*[\x8fCvw\xc0\xbcf\xeb\ +x\xd9\xb9\xb6`\xb4\xb4\x9f\x09\xc4S\x86\xf0\xbd\x0f\x82\ +/\xa8\x0d\xe4\xd8\xf9,=\xdb\xf1\x88\x1f\x0d\xef\xb5\xb8\ +\x80\x1e\xf1\xd7\x8b\x9a\x9a\xbf@4\x1c\x07\x00q\xe6\x14\ +\x9c\x7f}\x04Z\xca\xa0Wk\x16\xc1\xba\xf5c`5\ +\x8b.\xde\xf5B\xc0{\xe3Ux\xbb_\x80\xb6\x83\xd1\ +bl\xd8\x8c\xd0G\xff80ah\xb8\xc7z\xfc\xc9\ +?\x95\x19\xe7\x90i\xda}{\xf7\xd6\xb9@R1\x00\ +\xa4\xa1a)g\xcc\x88\x01\xa8\xf1o\xda\xf6%U3\ +\xaf\x1e\x00\xbc=/\xc3\xdb\xfdb `V\x05\x22\xf7\ +>\x08\xbe|50\x16\x8c\xb5B\xfe\xe1\xafC\x9cl\ +\x06M\xcc\x02\xab\x0a\xa6--I\xc0h\xd8\x08\xb8\x0e\ +d\xc7\x19@k\x88\xb7\xde\x84Y\xbf\x01$\x14\x01\x0c\ +\xc3\xd4\xc5\xf1zf{J\x80]\x81\xb9\x95\xf7\x22\x1c\ +8\xaf\x87\x06\x91\xff\xde?\x00R\x02\x84\xc0X\xbf\x09\ +\xe1\xbb\xee\x03-I\x5c\xc4s\x1d\xf4#\xa5`\xf3\x17\ +\x83\xaf\xba\x12\xaa\xed8t.\x0b\xd5\xd5\x0e\x12\x8a\x80\ +\xd5,\x84\x0e\x87\xe2\x88\x84#\xf4\xd4\xe9\xc3\x8cE2\ +\x15\x159\xbf\xa7\xa7I3 I\xab\xaa2\x16\xe7*\ +\x81\xb2\x92\x06\xff\xfa\xc6?\x07c\x5cvw\xc0}\xf2\ +\x87\x80\x06hy\x05\x22_x\x08\xb4\xb8d\x8an\x05\ +\xf7\xa5_\x07\xbd\xb4h\x09X\xcd\xc2\xf1o\x84\x80/\ +]\x01y\xb6\x0dzh\x00\xd0\x0a\xfe\x917a\x5c}\ +\x1d\x08c\x00\xe3\xa6\x8eFV\x91hl5L3\x0c\ +\x00\xdaw\x91\xfb\xe7\xbf\x03\x5c\x07\x00\x10\xbe\xe3S0\ +\xb7\xde\x5c\x08j\xd0\x1a\xce\xb3O\xc3\x7fs\x1f\xc4\x9b\ +o@\xb4\x1c\x011M\xd0\xd2Y\xd0\xc2\x07!\x14$\ +\x1c\x06_\xb3\x01\xa2\xe5\x08t>\x07\xd5v\x0c|\xf9\ +\x1a\x90x\x11Ti\xe9\x02\xb3\xb5u/\xb1\xed\xf3J\ +1\xa7\xa7\xe76I\x1b\x1bSTJ\xcf\x04D\xc2\xdf\ +t\xd5\x0em\x18\x16\x00\xb8/\xfc'\xb4\xd2 \xa6\x89\ +\xf0\xdd\x9f\x07\x09\x87/>\xfc.\x81\xc8g\x1e\x00I\ +\xcc\x0a\xec\xcff`\xff\xdbw\xa0\xd5h\x10f\x8c\x83\ +3#\xe0R\xc3\xfe\xe9\xf7\xa1s\x19\x00\x80\xb9\xf5&\ +\xf0\xb5\xeb'\xc9\xf2\x8f\xbc\x09\xff\x8d\x14\xc4\xd1C\x10\ +\xa7\x8eA\x9e\xef\x02_\xb2\x1c\xf6\xe3?@6\xf9e\ +8O\xfe\x08\x80\x06\x09\x87\x11\xbe\xe7\xf3 \x86\x01\xad\ +4\xdc\xdf\xfc2\x10`\x18\x96\x7f\xcd\xc6;\x09Q\xa5\ +Rzfcc\x8a\xd2\xce\xce03\x0c\x84\x00\x9aP\ +\x95\x95\xf5\x00 ;\xcfB\x9e:\x16\x18r\xcd6\xd0\ +Y\x15\x05#\xe4\xf1\xa3\xc8\x7f\xfb\xef!\x9a\xdf\x9a\xe6\ +\xac\xb6m\xe4\x7f\xfcm8;\x7f\x0ahU\x18\x09\xe1\ +O\xffY\xa1\x17\xe5\xe9Sp\x9fyrZ[o\xd7\ +S\x90m'\x02^\x96\xaf\x82u\xc3\xed\xd3\xea\xf8\xfb\ +\xf7L\xfaon\xd8\x02\x9dIC\x1c?\x1a|o>\ +\x02\x9d\xcf\x03\x08\xa6\xacq\xcdV\x00\x808u\x0c\xaa\ +\xab=\xd0?g\xf6\x95\x00I\x18\x06B}}\xe5\x94\ +\x16\x17sF\x88\x0c\xab\x9ay\xb5\xaa\xa8\xa8\x1c\x00D\ +\xf3\x91@\x03e0\xae\xbd~\x92R\xf7\xc0\x1e\xc8\xee\ +\x0exS\x8c\x01\x00y\xf6\x14\xe4\xa9c\xf0\x0f\xef\x87\ +\x1a\x1e*\x94\xb3\xb2r\x18k\xc6{\xd3?4\xf9\xbb\ +\xfb\xcas\xf0\xf6\xbf\x16\xd4\xad^\x80\xc8\x8e{/\x98\ +\xa2\x99\x9b\x03[\xc6\xb2\x00\x7f\xdfk \xb1\x22\xf0\x95\ +\xeb\x00\x00|\xcd\x95@82^\x7f\xcb\x0d\x00\x0d\x16\ +\xba1\x9ftI\xf1lQ=o)c\x08\x15\x15\x81\ +\xf1P\xa8\x9c\x09\xe1\x86\xfdE\x8b\xd7\x8f\xf5\xd2\x18\xa3\ +l\xf1\xd2 hM\x00\x19KB\xd4\x05R\xeb\x09e\ +d\xcaw\xbej\x1d\xfc\xb7\x0e\x00\x84\x22|\xc7\x9f\x80\ +\x96\x94\x06M\xfaz\xe1\xbd\xf4l\xd0\xa6\xac\x1c\xe1{\ +\xee\x07\xd8\x84lR\x08h\xe1\x052V\xac\x82\xb9\xed\ +f\xe8l\x06\xc8\xe7\x81p\x04\xe2\xf4q\x84w\xdc\x0b\ +\xed\xfb\x80\xf4\x01\xd7\x05F\xa7+\x89D\xc1\x17\xd6B\ +\xb4\x9d\x80\x7f\xe2\x1d\x987\xde\x06\x10\x02\xb1h~\x03\ +\xeb8\x97\xa24\xcey8\xcc\xe9\xc8\x882U<:\ +\x9ey\x0d\x0e\x04\x04\xcc\x9b\x10\xd4\xc6\x1c3\xad \x1e\ +\x18\xc6t\x02.\x811Y\xd6\xad\x1f\x07_Y\x1f\xf8\ +v\xb2\x05\xf6c\xdf\x07\x00\xd0\xd22D>\xf5E\x90\ +X|R\xbb\xfc\x13\x8fB\x8ev\x88u\xfb\x9d\xb0n\ +\xb8m\x9al\xad4\xf2\xdf\xfd&To7\x00 \xfc\ +\xa9/\x82/]\x11\xc8\x9d\xbf\x10h;\x015\xd0?\ +\xeeC<>OJf\xf9>\xa7\xdcq\xb2\x94R\x83\ +\x11\xd3\x08\xf2V\xd7\x81\xf6\xdd\xa0qQ\xf14e\xa1\ +\x1d\x9f\x0d\x94\x0e\x0fN*W\x03\xfd\x97X\xaa\x00\x12\ +\x8d\x05\x99\xe1\xa6`^\xca\xeev\xd8O\xfc\x10\x90\x02\ +\xb0,\x84>y\x1fHY\xf9\xa8G\x1a $\xc81\ +F\x9d\x07\x00\xef\xb7\xbf\x86\xb1\xba\x01$2y/&\ +\xf6\xbfVp\x1e\x00\xdc\xe7~\x0e^\xbb\x0c\xa0\x0c$\ +>\xea\x83\xe7\x06\xab\x8b\x15\x82\xb6x\x8cR\xcd,+\ +\x1b,\xe8Z+\xa2\xf4\xe8Q\x8a\x9e0t\xc9{\x1c\ +\x17\xe8\x099\xb9\xf0/]\x17\x80uS\x10\xd8\xd4P\ +?\xec\x9f|/0\x8a2\x84w\xdcW\xc8!\xfc\xd7\ +_)\xe8U\xb9\xf4d\x01\xd2\x07y\xea\ +\x01\x10o7!\xf2\xc5\xbf\x02\x9b2:\xb4\xefB\xb6\ +\x06\xf9\x0c_\xb2\xa2PN\xcfu\x1c\xd6\x9a\xda\x8e\xc3\ +%\x1d\x19\xb1\xa4R\xd4f'O7\x93lv\x08\x00\ +\xf8\xf25\x81\x00\xcf\x83\x7f`\xf2z\xcf\xeb\xd6\x00\xa6\ +\x05V\xb7n\x9a\xffl\xdeB\xd0\xd22\xb0\x9a\x85\xa0\ +\xa5\x93\x8dq\x9e\xfdy!y\xe2\xcbW\xc1\xba\xfd\x8f\ +\xc6y\x8b\x17\x81-XR\xf8\xef\x1f|=\xe8\xe5)\ +p_\xd85\xcdy\x00\x90\xdd\x1d\x10-oO+\x17\ +\xfb\xf6\x04\xcb#\x00^\xb7:\xd0\x95\xce\x0c\xf2\xb63\ +-Z3{d\xa4C\xd2\xea\xea2\x19\x0e+Gk\ +5H{z\xdf\x06\x00\xbeh\x09XU\x0d\x00\xc0K\ +\xbd\x10\xac\xbb\xa30\xae\xdc\x84x\xf2[0\xaf\xbev\ +\x9aB\x12/B\xf4\xa1\xbfA\xe4\xfe\xaf\x14\x12\x10\x00\ +\xf0\x9b\xf6\xc1\x7f\xfdU\x00A\xac\x08\xdd\xf9\x19\x10:\ +a|\x10\x82\xd0\x9d\x9f\x1e\x8f#R ?\xba\xb6\xdc\xc1\xf3|\xd6\xd9\xf9C\x10\xec\x22R\x1d\ +\xa5\xfd\x03\x83\x88\xc5\xd6\x821F\x8aKA\x13\x09\x88\ +cG\x01h\x88\xe3\xef@\xf7\xf7\x83U\xd7\x80\x84.\ +\xb1#\xd5\x1a~\xf3\x118Oq\x0f\x08! \xb9\xdc\xb0\xf1\xcc\x8b\x7fK\xdc\ +\xfcq\xad\xa3\xc3MMU>\x90\xd2\xa3\x135\x85e\ +\xcbn\xd3\x86\x91V:\x97w\xc8P\xa6_.^\xb4\ +\x85p\xc6\x8cU\xf5\xd0\x994Tw\x07\xb4\x9d\x87x\ +\xe7P\xb0\xb1\x18\xdd\xb6\xb29s\xc1\x97\xac\x80\x1a\x19\ +\x84l=\x0e\xff\xd5\xe7\xe1\xec\xda\x095\xba\x84\xd2\x92\ +2D\xee}`\xdcy\xd7\xf5\x8d\xe6\x93\xdf\xa5!\xb2\ +KK\xf3\x18\xe1\xe8\xa1n\xfe]\xdas~X%\xca\ +\xea\xc1\x18c\x95\xd50\xea\xd6@\x9el\x81vl\xa8\ +\xde.x\xfb\xf7@\xf7tB\x0b\x01(\x0dB\x08\x90\ +MC\xf5vC\x1c\xda\x07g\xd7N\xf8\xfbv\x8f\x9f\ +\x06]\xb9\x09\xe1;\xee\x01a\x0cD\x08\xdfx\xf1\xe5\ +o\xa0\xbd\xfd\xb5X\x8c\xf7Z\xd6<\xfb\xec\xd9\xe0`\ +t\xd2\xa1\xe8-\xb7\xdcjf\xb3s\x8a\xa4\xd4\x0b\x9c\ +\xf5\xf5\xf7\x88M\x1b\xef\xd74\xd8\x99\xf8\x87\xf6\xc1{\ +q\x17Tz\xf8\xe2\xbd0\x01\x84\x12\xf0\xfa\x8d\xb0n\ +\xfa\x08H4\x98\x9f\xc4\xf5<\xe3\xf0[\x0f\x83\x18\xbf\ +u\xa8q\x5c,-\x0eV\x9d\x93\xe7KC\x8a_\x01\ +\xe5\xdd\xe87\xac{@\x9bA \xd0\xb9,\xdc\xdf\xfc\ +\x0a\xe2\xf0\xbei'\xc1\x17\xd5[\x5c\x8a\xd0\x8d\xb7\x83\ +\xaf\xdb\x10\xfc\x97B\x18{\xf6~\x8f\xeck\xfa\x99\x94\ +\xec\xcc\x9c9\xb1\xf4\xf3\xcf?\xecM=\x14\x05\xf05\ +\xdcu\xd7]\xba\xbd}Xz\x1ew\x8d\xee\x8es\x18\ +\x1e\xee\x95\xd5\xd5\xf50\x0c\x8bUV\xc3\xd8\xb0%\xd8\ +\xac\xb8.\x90\x19\xbe\xe0\x85\x13).\x85\xb9v\x03\xac\ +?\xbc\x1b\xe6\xfak\x0aA\x8d\xa63C\xe6\xfe\x83\xff\ +H-\xf2\x0a\x91\xf2\x04\x8b\xa9\x81w\xf6\x1a\xce@\xab\ +\xf4k\xaa\x1c\x8f:^Nj>lv\x9d\xedT\xa5\ +\x89u\xda\xb2,b\x9aAl\xa9[\x07\x02@e\xd3\ +\x85\xd3\xa2\xa9d\xb3\xf9\x8bam\xbe\x01\xa1O\xdc=\ +\x1e3\x1c'g\xbe\x92\xfa\x16\x0e\x1ey\x9as\xeb\x5c\ +\x7f\xbfJ\x7f\xf8\xc3U~*\xb5\xb5`\xf9\xd4t\x86\ +\x00I\xd2\xd8x\xd6\xf4~\x1b\xa4u\x90\x89\x8e\ +\x0c\x03\xe9\x11\xc0\xb4@\xe2q\xd0Y\x15S7H\x9a\ +vu\x1d5_\xde\xfd\x08z\xfa\x0f\xba\xae\xecN$\ +X:\x95Z\xe0M\xbd\x1d\xba\xe8\xd5Xm\xed~\xa3\ +\xbc\xbc*\xaa\x94]\x06\xf0j\xb1rE\xa3\xa8_\xbb\ +C\xcd\x9a\xb5\xe8\xbd\xae\xa8\x00\x80f\xb2#\xf4\xdc\xb9\ +7xs\xf3\xaf\x84i\xb6Q#\xd4\x951\xcd\xfe*\ +/\x9bM-\x80w\xa1\xab\xb1F\xc0\x1c<_Qd\ +p\xbb\x828\xde\x22\x08\xb9T,Z\xf8\x07j~M\ +\xbd\x8eF\xe2\x17\xd23\xc9p\xa5$\xed\xeb?\xcd\x9b\ +\x0e?\xce[N\xec&Dt\x02\xd6`__$7\ +z!r9Wc\xe3$44t\xb3x|\xc8\xca\ +\xe5\xa21\xceQ\x22\xa5(\xd7\x89\x92\xf9b\xf5\x9aF\ +]Q\xb1V\xc7\x22\x15\xda0\x22\xa0\x84\xc1\x17.\xb1\ +\xedA2\x9c9m\xb6\xb6\xbd\x86\x8esG\xa9\x11\xee\ +wLsPP#=\xab\xda\xcceD\xa5\xdb\xf4\x83\ +\x1ey\xa9\xcb\xd1\xed\x00o\x1fH\x84\x9c\x11\x11\xe74\ +\x9b Y\xaf\x0c9{\x16\x99S\xb1B,\xac\xb9F\ +\x95\x14/\xd0Q\xab\x14\x8c[PZ\x12\xdf\xcf\x93l\ +\xbe\x97\xf4\xf6\xbe\xc5\xdfj~\x95\x0c\xf7\xb73\xc6\xfb\ +\x94\xe2C\xe1\xf0H.\x93)u/u]\xfe\x9e\xd7\ +\xe3\xdb\xb7o\xa7\x87\x0fgyEE\xa5I\xa9\x0eI\ +\xe9F\xa4\xb4\xa2J\xe9(!\x22D\x08\xe5Zk\xc2\ +\x18\xa4R\xcc\xd5Z\xd8,b\xe5\x1c_\xe7=U\xec\ +\xb0x\xbfk,\xd8\xec5\x0d\x95*\xec\xbcC]\xc8\ +\x88)\xa0\xd8\xfe\x14\xb9e\xcey\x9e\xceu\x9a\xf9\x1e\ +\x16\xa2~>\x1c\x92^\xd8u\xbc\x08\x81\x0as\x08C\ +J0B\x88\xd6Z\x09\xad\xb9C)\xc91\xe6\xe6\x18\ +\xb3\xf2J\x11\xa7\xb7\xb7\xc7[\xb7.&v\xee\xdcy\ +I\x9d\x97\xf3@\x82\x00\x1a\xdb\xb7\xdfA[Z\xc0\x8a\ +\x8a\xc0(\x8dsB\x1cn\xdb1fY6\x05\x00\xc6\ +\xb8v]\xa9\xa4\x0c\x09\xdf\xb7E>_\x22\xaa\xab\xdf\ +\x91\xa9T\xa3\xfa\xc0\x0f$\xb6?E\x1bJ_\xa2\x03\ +'\xabX\xb4\xef]\x1e\x0a\x09\xc6\x98\xc3-\x8bQ)\ +\x05\x01\x00\xd7\x0d\xabp8+\xb5\x0e\x89\xc9\x0f3\x9e\ +R\x97\xf3Z\xe4\xfd<\x91\x99\xf2T%x\x1e\xe38\ +C\x04\x00B\xa1R\x0d\x04\xcfd\x1a\x1b\x1b\xd5\x07y\ +\xaerq\xbd\xc1\xb3\x9cT*E\xc7\x9e\xc7L\xd4;\ +\xf6L\xe6\x83<\xcd\xf9\xa0\x8f\xa4\xde\xab\xdd\xef\xeb\xa1\ +\xd4\xff\x96\xde\x19\xcc`\x063\x98\xc1\x0cf0\x83\x19\ +\xcc`\x063\xf8\xbf\x85\xff\x06\xf2\xb7;\xcf8S&\ +\x0a\x00\x00\x00\x00IEND\xaeB`\x82Mp\x95\ +\xa5\ \x00\x00\x01\x11\ \x00\ \x00\x02\xa9x\x9cu\x91\xcbN\xc30\x10E\xf7\xfd\x0d\ @@ -35674,37 +35717,34 @@ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x03\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00n\x00\x01\x00\x00\x00\x01\x00\x08\xa7i\ +\x00\x00\x00n\x00\x01\x00\x00\x00\x01\x00\x08\xaa\x11\ \x00\x00\x01\x8f\xdd\xb9\xe7\xc6\ -\x00\x00\x00\xe2\x00\x01\x00\x00\x00\x01\x00\x08\xac\xab\ +\x00\x00\x00\xe2\x00\x01\x00\x00\x00\x01\x00\x08\xafS\ \x00\x00\x01\x8f\xdd\xb9\xe7\xc6\ -\x00\x00\x00\xf0\x00\x01\x00\x00\x00\x01\x00\x08\xad\x9c\ +\x00\x00\x00\xf0\x00\x01\x00\x00\x00\x01\x00\x08\xb0D\ \x00\x00\x01\x94\x0a\x06\xda.\ -\x00\x00\x00\xb4\x00\x01\x00\x00\x00\x01\x00\x08\xaa\xbb\ +\x00\x00\x00\xb4\x00\x01\x00\x00\x00\x01\x00\x08\xadc\ \x00\x00\x01\x8f\xdd\xb9\xe7\xc6\ -\x00\x00\x00|\x00\x01\x00\x00\x00\x01\x00\x08\xa8\xa8\ +\x00\x00\x00|\x00\x01\x00\x00\x00\x01\x00\x08\xabP\ \x00\x00\x01\x8f\xdd\xb9\xe7\xc6\ -\x00\x00\x00\xce\x00\x01\x00\x00\x00\x01\x00\x08\xab\xb8\ +\x00\x00\x00\xce\x00\x01\x00\x00\x00\x01\x00\x08\xae`\ \x00\x00\x01\x8f\xdd\xb9\xe7\xc6\ -\x00\x00\x00\xfe\x00\x01\x00\x00\x00\x01\x00\x08\xae\xa3\ +\x00\x00\x00\xfe\x00\x01\x00\x00\x00\x01\x00\x08\xb1K\ \x00\x00\x01\x8f\xdd\xb9\xe7\xc6\ -\x00\x00\x00X\x00\x01\x00\x00\x00\x01\x00\x08\xa6T\ +\x00\x00\x00X\x00\x01\x00\x00\x00\x01\x00\x08\xa8\xfc\ \x00\x00\x01\x8f\xdd\xb9\xe7\xc6\ -\x00\x00\x00\x96\x00\x01\x00\x00\x00\x01\x00\x08\xa9\xae\ +\x00\x00\x00\x96\x00\x01\x00\x00\x00\x01\x00\x08\xacV\ \x00\x00\x01\x8f\xdd\xb9\xe7\xc6\ \x00\x00\x00B\x00\x01\x00\x00\x00\x01\x00\x08\x95\x06\ -\x00\x00\x01\x9a\xff'c\x8a\ +\x00\x00\x01\x9c\xc3\x1e\xdd\x86\ \x00\x00\x00&\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01\x905 \x19\x03\ " - 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/rare/resources/static_css/__init__.py b/rare/resources/static_css/__init__.py index 5dc5c7590c..ee46889d01 100644 --- a/rare/resources/static_css/__init__.py +++ b/rare/resources/static_css/__init__.py @@ -84,16 +84,13 @@ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x1a\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x9c]]\x00Y\ +\x00\x00\x01\x9c]y\xf9\xe9\ " - 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/rare/resources/stylesheets/ChildOfMetropolis/__init__.py b/rare/resources/stylesheets/ChildOfMetropolis/__init__.py index 42f6e672ef..6c0baf9768 100644 --- a/rare/resources/stylesheets/ChildOfMetropolis/__init__.py +++ b/rare/resources/stylesheets/ChildOfMetropolis/__init__.py @@ -1,6 +1,6 @@ # Resource object code (Python 3) # Created by: object code -# Created by: The Resource Compiler for Qt version 6.8.1 +# Created by: The Resource Compiler for Qt version 6.10.1 # WARNING! All changes made in this file will be lost! from PySide6 import QtCore @@ -31,210 +31,211 @@ H\x14W\x1e\x95::\xb3\xb2C\xf2\x13\x912\x91\x5c\ \x9c\xce|\x11^~\x1c\x0d^\xec\xcdZ\xdb\xa2l\xb2\ \xfa\xff\xb7\xf9\x01KT3\xaf\ -\x00\x00\x0c\x98\ +\x00\x00\x0c\xa7\ \x00\ -\x00Dcx\x9c\xcd\x1c]s\xda\xb8\xf6\x9d_\xa1\x1b\ -\xa63M.4\x80!$\xee\xf4!\x84fwg\xb6\ -\xb3\xed\xa6\xb3\xfb\xd0\xe9\x83\x01\x01\x9e\x1a\x8b\xfa\xa3i\ -v'\xff\xfd\x1eI\x96-\xc9\x92\x8c\x13\xda\xb9t\x92\ -\x80t\xa4\xf3\xa1\xf3m\xd1\xf3\xb3\xce\xa7\x8f\xf8{\xf6\ -\xb9\x13\x93d\x17D>\x82W\x17\xb3\x17\xeaz\x17\xde\ -\x95wK\x87P\xbf\x8fvA\x18\xa35\x893\xb4$\ -\x11I:\xab0\x0d\x16\x11^\xc1\x9a\xee\xd8\x1bO\xc7\ -+\xd4\x9d^L\xa7\xd3K\xb1B@\xc8\xabP\xed\x95\ -l\x16\xc1Kt1\xed!4\x1d\xd2_\xf0n2y\ -q\x8a\xde\xbcA\xdd\xf9\xf5|>\x7f{\xe0\xaa\x91X\ -u}y}}=\xeb|\x9a\x05\xcb/\x9b\x84\xe4\xf1\ -Jep4\x18\x8dF\x13\xd4\xbd\x19\xdd\x8co&\x0a\ -\x83\x8brIA0^\x85\x19\xe5\x82\xb2\xe9\xc1k<\ -\x16T\x89u\xfa\x12`7A\x09\x0e\x96Y\xf8\x0d\x9f\ -\x8b\xf5\xe8>\x5cmp\x96\xa2\x97T\xe0oa4\xed\ -\xa1\xf7\x09\xd9$8MgA\x92\x22\x9c-O;[\ -\xf2\x0d'\x8cJ \x13^\x9e\x87\xba\xb3\xd1\xdcs\xa0\ -\xbb\xdf\xe2\x18\xb1ua\xbcA\xf4o\x89\xbdB:\xcb\ -\xb3\x8c\xc4\x80\xf2W\x1c\xacp\x92\x9evR\x1ca\x00\ -\x22\xb1\x0f\x98\xd6c\xf8\x07\xe77\x9c_O\xdd\x8c\xf1\ -e2G\x9d \xcap\x12\x07\x19\xa6;]\x8e\x82\x11\ -\xe8\xce\xecf\xf6vv\xeb\xdcI,\xa3T'\xe4>\ -E \xfe\xdf\xc34;\xff\x98`|\xfe\x91\xa2\xf8+\ -\xc40\x1e\xc4+\xb6\xe0n\x99\x90(\xa2\xb2\xea\xc0\xd9\ -\x92\x04\xf8P\xcfu|\xe9\xad.\x17\xa8;\xb9\x99{\ -\xb7\x15r\x06)!\xde\x914+\x89\xb7\xa9\xd6t\x04\ -Zu\x01\xaa5\xf4\xae$\xd5\xe2g\xa1h\x85Ex\ -:\xd6\xb6\x8a\x10n\xb6\x11\xfcd \xd4\xc9h|\x11\ -\x0c\x1a\xf9Z%d\xbf\x22\xf7\xb1\xc0\xd0C\x01Z\x84\ -\x19b\xdb\x00d\xb6\x0db\xb1\x8a\xcb!\xc1p\x9e\xfb\ - \x09\xa8\x1e\x1c`\xd1\xd2\xe2\xd2\xb8MZ\xe0-\xbd\ -\xf5x\x08\x86\xe8\xcd\xc1\x12\xad\x04o\x92`\x15b\xf0\ -\x0d\x95~\xa4\x88\x94\xf4\x03\xe1_0\x02E\xe0*\xf0\ -\x9e\xec\xf3==\xfa\xbb=^\x86A\xf4\xb9\x13\xc6i\ -\x16DQ_\xd2\x01\xd4\x1dLAR\xb7W\xd7S&\ -)@[@\x95\xd0\x92\x89\x01\xf4\x04\xa0g\xb3\xe9|\ -f\x81\x96\x84\x02\xd0#\x80\x9e\xce'\xde\xe5@\x85\xce\ -\xe3:-\xdd\xe9\x80Rr;\x1b\x5cN8t\x09%\ -\xc1W\xd4t'\x14~v{9\xbe\x18\xdb\xe1+z\ -\xc0\x8d\x01\xfc\xe5`r9\xf6t\xf8\xceok\xf4@\ -rt\x1f\x80t3\x02\x0ea\x83c\x0c\xe7\x8cA\x0b\ -0Z\x87L\x0f\xb3-\xc93\x90\xed\x03Z\x82jl\ -p\x0f\xf8Y\x82\xefH\x0b(\xb06rO\xcd\xf3[\ -\x10\xe5\xb8\xf3\x17\xf8\x0d\xd0\x13\x14ft'\x02T\x0f\ -;g\xe7\x9d\xce\x19\xfa\x97\x99\x11;X_\xc4\x8d\xd7\ -l\x8c\x9fy_Lq\x0d.\xa6\xcaC/\xa7\xb9C\ -~\xddy\xec\x9c\xf9\x82\xd1\x1e\xbc/\xcd\xad\xd4:\x15\ -#\xd7R#Fe\xca\x85\xb1\xf3\xe1\xf7`\x81\xa3^\ -\xf1WGUl\x0b\xaa\x99m}4\xd8\x7f\xb7m\x99\ -%A\x9c\x82M\x81^s\x90}\xb0Z\x81\x10\xa5E\ -\xa5\xeb\xed\x1b(\xe2n\x84S\xf4\x0e\xc79%\x08\xbc\ -\x22u\x85\xd2[\xdf\x87S\xd8\xc1\x00u\x96\xc5\x9cx\ -[\xcd\x09\x1f*\xbf/gy$\xe0C)\xa7G\x86\ -C\xfc\xed\x0dI@qx\xf8\x90\xe1n\x93`\x87?\ -\xad\xe9\xef\xbbm\xb0\xc7oN.N>\xc3\xf8/\xc0\ -\xcd~F\xbe3ZcL\xfd\x1b\xdd\xb5pu\xf4m\ -\xb8\x13\xa3s\xd0G\xe9\xad4\xf3\x91\x90\x88orC\ -v\x0b\xa2\xbe-\xd5A\x1aC\x1f\xae\x17)\x88~\x99\ -\xfd\x06\xdc\x15<\xdf\xed\xc3\x98/\x9d\x93\x1c\xe0\xab\xcf\ -\x92\xbf\xa5p\x22\xb0\x18\xcfzX\x9e5\x1fN\xb3\x07\ -\xea\xf8S\x12\x85+e\x82z\xb3<\xf5\xd1H,(\ -O\x9e\x8d\xd0\x03}\x9e\xcc\x9f!\xd0\x9f-;]\x9b\ --\xe6\xc73\xa9\x96VQW\xbd\xc1\xc9g\xbb\x99>\ -Z\x94U]!\x0eo\x5c,)\x85\xf3o\x13\xed\x12\ -p\xcdi\xd4W\xf1\xdcT]\xf5\x9f\xd2\xbf\xb1h`\ -_\xcc\xb3\x0f\xee\x1f\x99\x19\xfb\x5ch\xd4K:\x8e\xb3\ -\xd8\xf0@\x01\xc3\xd64\x93\xe8\xd3T\xa2\xa7|\x92\x94\ -\x07\x86\xf3}\x7f\xc1T\x94\x03\xc1|\xf1Y\xa0\xcb\x17\ -KH\xfcA=\xfa$\x097!$\x9a\x5c\xd6\xaf\x8f\ -jd\xc5x\x064Fx\x9d\x95\x00\x03\x0d`A\x80\ -\xb6\x9d\x01F\xe5X\x89;\x06\xd6\xd5\xf9R\x06\xda\xb2\ -J\x18\x968rXxRb\x89Jg]\xc8{\x92\ -\x86<\x9f\x07Y\xa0\x84&}\xcd1\x98O1\xa1h\ -\xf3\xe8\xfc\xac\xcc8E\x06\x09\xd1\xfe\xf1\x19\x1a\xd1\xce\ -7\xf0\xe4\xf1@\x8d,0\x08m\x1a\x8b\xc3\x0fw\xc1\ -\x06\xf4(O\xa2\x97'\xfe9\xd3\xaat\x8b!\xb9<\ -\xbf\xd9\x86\xd1\xea\x8f\xf5;\x0c\xc2\xdb\x83\x9a\xa5\xe7\xe5\ -\xae\xaf\xd2o\x9b\x93\xd3\x02s\x13S2J*\xb3\xe1\ -\x05\xfa/\x1a\x9d\x81B+*\x8e\xde\xa0\xe1\x04\xc6\x8a\ -\x98\x000\x1e\xfb\x94\xb0\xfc\x97g\xc6B\xbc%\xca\xc3\ -\x0e\x99b\x15\xe3(\xc8X\xeeV\xceB\x8eD\x83\x09\ -\xdd\xbbn\x0c\x82\xf6\xf6\xb2JI\x92\xf5\xf3\xbd\x22)\ -\xa7\x0b\xa8\x08\xe7\xb8-\xb4\xcb\x93f\xd2\xa9\xa1?\x93\ -n\xf5\x8c\x95\x88V\x10^\xcf\xd92\x08\xb8\xfd\x00\x0c\ -\x018X\xc2\x99Q7\xf6\xa8,\xf5\xfd\xe56\x8f\xbf\ -Xw\xb0d\x90\xc5\xe7\xd1\x0b\xfeq\x17$\xccU:\ -2L%\x18Z\xe2\xaf\x12\xce\x14z\x86\x8e\x8dy\xd5\ -\xce\x18+\xf7\xf5!\x22e\xe12\x884}\x1f\x16\x81\ -\xb2\x02\xdc\x82\x9b\xff\x07\x8e\xbb\x04\xddb^\xc0\x1a`\ -} \xa7\x1fA>Sn\xdfS\xa6As\x5c\xd3\xe5\ -\xea\x0a\xa7e}\x8d(. \x1f\xc5$\xc6\xaf\x152\ -\x0d\x22\xaf\xb9`'\x0b\x0d\xe6\xfa\xda\x16\x16\xf9\x99\xeb\ -\xdb\xd7D\xd0lT-1\x18\xa4\xe8\xc2!\x85\x94\xf6\ -L\x1c\x86\x82\x06\xa2\x96\x18\xa0r]\x95\xfe\xff\x89I\ -\xc5\x81\xe5\xa9\x9c\xad\xda\xd2\x91]\x18\xf7\x85By\x03\ -y\xb4 \xca\x1b\xd4\x8b\x01\xa3\xcfx4\x96\x0buA\ -\xd6=\x0d\x17\x14\x8b\xea\xf5\xd1\xa4\xb0I\x07\x0aM\xe1\ -\xac\x08@\xa7\xeb\x83\x5c\x13\xdd\x08*\x1e\xfcu\x98\xa4\ -Y\x81H\xa1\xfb\x10\x02M\xab\x19Qb\xb1T9\xcb\ -\x85rYo\xf1\x95$\xcf\x98\x8e\xa2\x01\xe7d\x93\x84\ -+:P\xf3\x8bL1\xb7\xe4\xbe\xbf\xc2\x10\x9bX\xd7\ -\xac/2\xf0r\xb5+\xcd\xae5\x07\x1c-\x09:]\ -6\xd5L){\xe5\xad+F\x91R$\x16,\xab\x83\ -U\xb1)F-\xea\xe7\xe86\xf0\x01U\xf0\xaabA\ -\x5c\xff\xc8:M\xf4\x80@\x22;\x9a\xe7\x84)\xc4\xf8\ -,Xni\x06\x94\x11\x96\xa9\xc8f\x00\x91\xfe\xfcL\ -\x22\xf1\xd32O\xa8\xacnH\x94\xefbV\xe7\x990\ -\xab\x0aS[\xfd'\xb9\xb7.\x95\xb5\x05\xb0k\x1c\xf3\ -z\xac\xc6w5\xac6U\xd4\xf2\xad\x95k\xa9*;\ -\x9d\x04\xa9\xc2\xd3\xa8\x90g4B\xc4\xd4\x93h\x91\xd3\ -\x8b\xf7y\xba\x9d\x15\xe9/\xef\xca(\x09\xbd\xb3*\xae\ -\xd6J\xd5\x91\xb4I\xbbjY\xda\xad\x14\x7f\xb5\x95\x18\ -2{\x9b\x03\x8b\xea&n\x8f\xdd\x16\xf2\xb4\x91B\x91\ -/\xf4\xe1\xc2\xb2.\x84e)\xc2\xf0\xc1\xb2\xf2~\x18\ -\xaf\xc0!fD\x13\x8b6\xd9\x18\xdd\xcb\xd4\xd6\x12\x82\ -\x0b\x8a\xf8<\xa7\xb6\xafW\xe2\x85 x~\xc5\xacJ\ -\xe9\x0a\xdel\xf1\xf2\x0b\x7f\xfb'H\x864(\x94\x9e\ -\x7f\x89\x9d@\xd1%\x96\xc5\xa6\xea\xa8\xb4\xbf:!\x99\ -\x98,\xb7\xca\xbc\xe4Q\xc9\xb449\xba\xea\xd9\xb6\xba\ -\xe2jM\xff_1\xad\xe4\xff\xc6,\xdf@\xad-\xc1\ -1\x80\xca\xbe\xc2\xc0\xa1\xddm\xa3\x99M2\xb1\x027\xea\ -j\x93|\xec\xc0\x8d\xda\xfb\x1cYI\xeaj\x12\x98[\ -o\x9f\x83\x98k\xaa\x01guJ\xc5\xae\xf4\xc6S\xff\ -\xbe\x08\x8c\x0b\x12\x15Q\x1e\x8a\x22\xb56\x7f5\xc1;\ -\xd6\x03\xfdc\xbdNq&j\x22:\xab\xb5=\x9f\x9a\ -u\xea\x0d\xc0\xa2\xe2y5\x02\xc4\xb2z}b\xf2\xa1\ -|\xbd9\xc9\x92\x1c\x97\xcf\xc7\x94Z\x9f\xd1\xcb\x8a,\ -\xfe\x80\xd6\xcdn-\xdc\x17\xab|?\x0b\x16=Y\xb5\ -\xb30+{8\x0d\xcf\x8d\xac\xcdp\xd6;\xb2\xf5\xc2\ -\x8f \xd1\xda\x13\xa6\xb1\xb6\xb2h\xaa\xb3D\xda\x0ad\ -\xaa\xc1\xea\xbdY\xc8\xf1\xd5\xac\xd0G_iG\x02\xce\ -\xa2\xb83\xf3\x92\x01\xd0\xd7\xf7!M\xc2{\xe8\x01\xfe\ -\x0ez\xd5\xf0\xc8Gh\x08\xc3\xf0wX\x0d\xa7\xfc \ -\x05\x01\xfa\xc4P\xe4\x9d\xa7\x9c\x10!2g\xd9$\x1f\ -\xab\xec\x06\xb4\xf3}\xd6\xa30\xa9\x14\xec|\xb8\x0b\xff\ -\xc1\xbf$\xe1^\xb5\xe1\xaa\xa3[\x1c\xedXOQ\xc7\ -\xa2\xb1\x01\x0e\xeaov\xc9\xc8\xf7\xf7AL5\xefQ\ -\x19\x04F\xfa\x0b\xd6S\xe7\xe3U\x7f\xfd\xeb\x1e\xbc\x01\ -N\xb2\x87\xfe*\x09\xeegA\xca\xdbF%\x18[\xab\ -\x98\x8e\xf5\x11@\xdb\xf6\xa4\xfdf\xc9\xb8j}\x08\x12\ -|8\xce\x9e:R<[QRq\xd1;\xd1\x8b\xd3\ -\xb2\x9b32o-\xb7@4\x04\x07wA\xea\xcf\x1e\ -\xeb\xed\xb1\xc2\x991\x93\xb2T\x84\x1ae*b\xe9i\ -\x91\xa7\x89\x9bN\xe9\xcf\x1a\xeb\xd6\xec\xee\x994\x98\xe5\ -\x80[e\x7f\xa8\x9a\xe5\x80[\xa5\xd1,9%.\xb3\ -|t\x9c\xaa\xf1\xf1\x9e\x8bq\xc3\x81h\x8c+\xa2i\ -\xc9\xf8\xc8\xc8\xf7\xe0\x18l\x97:X\xeb\x1c\x1c\xffL\ -\x9a]\xa5\xf1L\x9eE\xdf\xe1\xa2kM\x1d\x9do\xd1\ - 4i\x85\xa3\x8f\xadv.\x0cRi\x8dZ\xd2\xd7\ -'\xe1\xa5\xfc\x9aC\x8fE\xd5\xcdt\x9b\xb70y\x11\ -\x87\xbc\x1bb`\xa3\x1fr9?M\xbe\xedQ\xd9\x04\ -\xad\xe1\xa1\x1e[\xf3\xfc\xbcy\xa8F\x16\xa6\x86\xb5\xb8\ -\x22\x1e\x0f\x99\xe2\x0a\x8bE\xa6\xc0\xc2\x83Q\xbb\xb8\xe2\ -\xd4\x9a\xb6\xa2e\xe9\xa3\x82\x99\x85-\x8b\x83U\xae\xd3\ -\x18\xe4\xac\x84\xb3\xa7E\x96\xfe\xd0\x99\xf0\x1d\xc5\xc5\xca\ -\x87\xaaPna[e\xcb\xc0\xb7\xe9\x9aQ;\xb6\xcd\ -i\xee1\xe3J\xa5\x83m\x1d\xf7\x13\x8e\xa4\xb5\xeb6\ -\x18\xc2\x0f\x13]k\xe2\x98\xe8Z{w{n\xa7\xb3\ -g\xf3\xef\x5c(\xad\x11\xbb\x13\xcf\x03\xf02~\xcdN\ -\xd6l\x0aF\xba\xcd\x1b\x18]\x88K\xde\xed\xbd\xfd\xc1\ -I\xb5*\xdf\xf6\x88\xac\x82f\xa5\x5c\x16d\xb9t\xf3\ -\xea\xc8%\xd2OOy\xbd\xa3\xba&^[\x7f\x0c\xf7\ -G\x91\x8e\xd1\xfc\x9a/\x8a\x91}\xb0\x0c\xb3\x07p!\ -\x83\x01'j\x16D\x11!qE\x97\xf1\xab\x1f\xee\xab\ -\x0d?\x9d\x15 \xfc\xfc\x0c\xbd\xa3\xdf\xf2\xa3%:-\ -\xef)\x16z\x15\x81>\xf9\xe7\x1a\xdf\xa5\xf3J\xc1\xff\ -c\x14\xd2Q]\xb6\xed\xfd\x88\x82\xc6\xacyO,2\ -\xe9(\xbb\x8eZ\x97\x8b\xdb\x01\x1c\xc8p\xcd\xa5\xc9\x08\ -j-\x94\xa2KQ&\x1c\xea\x8d\x13G}\xfb\x04\xf1\ -\xcbO\xe7\xd1\x84)Nq'\xc5@%\xcb\xed\xd9\x1d\ -\x97\x9e\x15\xa4\xc8x\xad\x17\x9d\xf4\xee\x10\x1f5;d\ -#\xfe(8\x00=\x052\xde\xd7\xd1\xd1\x17\xc3*~\ -\xa3\x81X\x0aq\xbb\xc7u\xb3\xf1\xcc\x92T\xf9*W\ -u?\xa2K\xd1\xb0w\xbc\xb7\xa7\xdc\x8f\xd0'\x8d\xa8\ -\x93\xcd\xe2%\x9a@\x167\x19\xc3\xcf\xd5\xa9vSD\ -\xdf\xc3|\xd7\xc5\x0aeG9\x06\x94c\x0f~\xa6\xa7\ -\xc2y\xdd\x85+\xecr^t\xfe'8/{\xfd\xd2\ -\xbao\xed\xfd\x802\xa6\xe6\xbb*\xb1<\xcdw5d\ -s\xf2\xfeu\xd7\xc5\xc8\xd3=\x97\xa8\x82=\xdd\xbfh\ -[\xf1\x1cOs0:\x0c\xb7X\xdbUH\xdd\xbe\xd9\ -\xa0\xc5\xbb\x18\xb1\xab\xee\xc5\x8c\xbc\xee]\x04\x87\xe6\xaf\ -\xe18\xfc\x8b\x8e\xc0\xfc\x95O\xdbQ\x1d~\xcfR\xcf\ -D\xa9y\x81\x9e.\xb75\xe3\x12\xd7$\xbb|\xdez\ -\xd7~\xe2\xb8Y_]\x8b\xa3\x88\xfeN\x82\xfd\x1e\xd3\ -/\xd3g\xf4\xeb\xef\xa9\x82Nr-\x05\x1cw\x19\x86\ -\x8bi&\x80\xa6\xef\x1f8/\xea\x996\xb484\x17\ -\xa4\xa54\xa8.\xf3\xf1\xfb\xdb\xd7\x09\x0e\xc4>w\x85\ -(\xf8\xcc\x93\xbe0d\xfa\xf6\x82y{\xe9\x08]\xdb\ -P\xbbd_\x06\xd6wa\x83?\xf4\xcb\xa2\x92\xaaw\ -\xaf\xae\xae\x8c'x\xb88\xecL\x1c\x10\x87\xe4\xffd\ -\xe3\xd4\x86\x8dAz\xf4\xffL\xf0\xc6\xf4\x17\x8fY\xa0\ -\xce\xff\x03\x19\xdf\x9di\ +\x00D\xaax\x9c\xcd\x1c\xdbn\xdb8\xf6\xdd_\xc1\x8d\ +Q\xa0\xc9\xda\x13\xdb\xb2\xe3DE\x1f\xe2\xb8\x99)0\ +\xc5\xb4\x93b\xe6\xa1\xe8\x83l\xd3\xb6PYrui\ +\x9a\x19\xe4\xdf\xf7\xf0&\x91\x14IY\x89[l\x8a$\ +\x0ey\xc8s\xe1\xb9\x8b\xea\xf9Y\xe7\xd3G\xfc=\xff\ +\xdc\x89\x93t\x17D>\x82\xaf.\xa6_\xa8\xeb]x\ +W\xde-\x19B\xfd>\xda\x05a\x8c\xd6I\x9c\xa3e\ +\x12%ig\x15f\xc1\x22\xc2+X\xd3\x1d{\xe3\xe9\ +x\x85\xba\xd3\x8b\xe9tz)V\x08\x08y\x15\xaa}\ +\xa5\x9bE\xf0\x12]L{\x08M\x87\xe4\x07|\x9aL\ +^\x9c\xa2\xd7\xafQw~=\x9f\xcf\xdf\x1c\xb8j$\ +V]_^__\xcf:\x9ff\xc1\xf2\xcb&M\x8a\ +x\xa528\x1a\x8cF\xa3\x09\xea\xde\x8cn\xc67\x13\ +\x85\xc1E\xb9\x84\x13\x8cWaN\xb8 lz\xf05\ +\x1e\x0b\xaa\xc4:}\x09\xb0\x9b\xa2\x14\x07\xcb<\xfc\x86\ +\xcf\xc5zt\x1f\xae68\xcf\xd0K\x22\xf070\x9a\ +\xf5\xd0\xfb4\xd9\xa48\xcbfA\x9a!\x9c/O;\ +\xdb\xe4\x1bN)\x95@&|y\x1e\xea\xceFs\xcf\ +\x81\xee~\x8bcD\xd7\x85\xf1\x06\x91\xdf%\xf6\x0a\xe9\ +\xac\xc8\xf3$\x06\x94\xbf\xe1`\x85\xd3\xec\xb4\x93\xe1\x08\ +\x03P\x12\xfb\x80i=\x86\x7fp~\xc3\xf9\xf5\xd4\xcd\ +\x18[&s\xd4\x09\xa2\x1c\xa7q\x90c\xb2\xd3\xe5(\ +\x18\x81\xee\xccnfof\xb7\xce\x9d\xc42Bu\x9a\ +\xdcg\x08\xc4\xff{\x98\xe5\xe7\x1fS\x8c\xcf?\x12\x14\ +\x7f\x85\x18\xc6\x83xE\x17\xdc-\xd3$\x8a\x88\xac:\ +p\xb6I\x0a|\xa8\xe7:\xbe\xf4V\x97\x0b\xd4\x9d\xdc\ +\xcc\xbd\xdb\x0a9\x85\x94\x10\xef\x92,/\x89\xb7\xa9\xd6\ +t\x04Zu\x01\xaa5\xf4\xae$\xd5bg\xa1h\x85\ +Ex:\xd6\xb6\x8a\x10n\xb6\x11|\xe7 \xd4\xc9h\ +|\x11\x0c\x1a\xf9Z\xa5\xc9~\x95\xdc\xc7\x02C\x0f\x05\ +h\x11\xe6\x88n\x03\x90\xf96\x88\xc5*&\x87\x14\xc3\ +y\xee\x834 zp\x80EK\x8bK\xe36i\x81\ +\xb7\xf4\xd6\xe3!\x18\xa27\x07K\xb4\x12\xbcI\x83U\ +\x88\xc17T\xfa\x91\xa1\xa4\xa4\x1f\x08\xff\x82\x11(\x02\ +S\x81\xf7\xc9\xbe\xd8\x93\xa3\xbf\xdb\xe3e\x18D\x9f;\ +a\x9c\xe5A\x14\xf5%\x1d@\xdd\xc1\x14$u{u\ +=\xa5\x92\x02\xb4\x1c\xaa\x84\x96L\x0c\xa0'\x00=\x9b\ +M\xe73\x0b\xb4$\x14\x80\x1e\x01\xf4t>\xf1.\x07\ +*t\x11\xd7i\xe9N\x07\x84\x92\xdb\xd9\xe0r\xc2\xa0\ +K(\x09\xbe\xa2\xa6;!\xf0\xb3\xdb\xcb\xf1\xc5\xd8\x0e\ +_\xd1\x03n\x0c\xe0/\x07\x93\xcb\xb1\xa7\xc3w\xde\xae\ +\xd1CR\xa0\xfb\x00\xa4\x9b'\xe0\x1068\xc6p\xce\ +\x18\xb4\x00\xa3uH\xf50\xdf&E\x0e\xb2}@K\ +P\x8d\x0d\xee\x01?K\xf0\x1d\x19\x87\x02kK\xee\x89\ +y~\x0b\xa2\x02w\xfe\x02\xbf\x01z\x82\xc2\x9c\xec\x94\ +\x00\xd5\xc3\xce\xd9y\xa7s\x86\xfe\xa5fD\x0f\xd6\x17\ +q\xe3\x15\x1dcg\xde\x17SL\x83\xf9Ty\xe8\xe5\ +4s\xc8\xaf:\x8f\x9d3_0\xda\x83\xcf\xa5\xb9\x95\ +Z\xa7bdZj\xc4\xa8L\xb90v>\xfc\x1e,\ +p\xd4\xe3\xbfuT|[P\xcd|\xeb\xa3\xc1\xfe\xbb\ +m\xcb<\x0d\xe2\x0cl\x0a\xf4\x9a\x81\xec\x83\xd5\x0a\x84\ +(-*]o\xdf@\x11s#\x8c\xa2w8.\x08\ +A\xe0\x15\x89+\x94>\xfa>\x9c\xc2\x0e\x06\x88\xb3\xe4\ +s\xe2c5'|\xa8\xfc\xb9\x9ce\x91\x80\x0de\x8c\ +\x1e\x19\x0e\xb1\x8f7I\x0a\x8a\xc3\xc2\x87\x0cw\x9b\x06\ +;\xfciM~\xdem\x83=~}rq\xf2\x19\xc6\ +\x7f\x05n\xf6\xb3\xe4;\xa55\xc6\xc4\xbf\x91]\xb9\xab\ +#\x1f\xc3\x9d\x18\x9d\x83>J\x1f\xa5\x99\x8fI\x12\xb1\ +Mn\x92\xdd\x22Q?\x96\xea \x8d\xa1\x0f\xd7\x8b\x0c\ +D\xbf\xcc\xdf\x02w\x9c\xe7\xbb}\x18\xb3\xa5\xf3\xa4\x00\ +\xf8\xeao\xc9\xdf\x128\x11X\x8cg=,\xcf\x9a\x0d\ +g\xf9\x03q\xfcY\x12\x85+e\x82x\xb3\x22\xf3\xd1\ +H,(O\x9e\x8e\x90\x03}\x9e\xcc\x9f!\xd0\x9f-\ +;]\x9b-\xe6\xc72\xa9\x96VQW\xbd\xc1\xc9g\ +\xbb\x99>Z\x94U]!\x0eo\xcc\x97\x94\xc2\xf9\xb7\ +\x89v\x09\xb8\xe64\xea\xabXn\xaa\xae\xfaO\xe9\xdf\ +h4\xb0/f\xd9\x07\xf3\x8f\xd4\x8c}&4\xe2%\ +\x1d\xc7\xc97\x0f\xb2@)I\xfa\x9ac0\x9b\ +\xa2B\xd1\xe6\xd1\xf9Y\x99q\x8a\x0c\x12\xa2\xfd\xe33\ +4\xa2\x9do`\xc9\xe3\x81\x1a\xc91\x08m\x1a\x8b\xc3\ +\x0fw\xc1\x06\xf4\xa8H\xa3\x97'\xfe9\xd5\xaal\x8b\ +!\xb9<\xbf\xd9\x86\xd1\xea\x8f\xf5;\x0c\xc2\xdb\x83\x9a\ +e\xe7\xe5\xae\xbfd\xdf6'\xa7\x1cs\x13S2J\ +\x22\xb3\xe1\x05\xfa/\x1a\x9d\x81B+*\x8e^\xa3\xe1\ +\x04\xc6xL\x00\x18\x8f\xfe\x95\xd2\xfc\x97e\xc6B\xbc\ +%\xca\xc3\x0e\x99`\x15\xe3(\xc8i\xeeV\xceB\x8e\ +D\x82\x09\xd9\xbbn\x0c\x82\xf6\xf6\xb2\xca\x924\xef\x17\ +{ERN\x17P\x11\xcep[h\x97'\xcd\xa4\x13\ +C\x7f&\xdd\xea\x19+\x11\x8d\x13^\xcf\xd9r\x08\xb8\ +\xfd\x00\x0c\x018X\xc2\x99\x117\xf6\xa8,\xf5\xfd\xe5\ +\xb6\x88\xbfXw\xb0d\x90\xfc\xef\xd1\x0b\xf6\xe7.H\ +\xa9\xabtd\x98J0\xb4\xc4_%\x9c)\xf4\x0c\x1d\ +\x1b\xb3\xaa\x9d2V\xee\xebCD\xca\xc3e\x10i\xfa\ +>\xe4\x81\xb2\x02\xdc\x82\x9b\xff\x07\x8e\xbb\x04\xddbV\ +\xc0\x1a`} \xa7\x1fA>Sn\xdfS\xa6As\ +\x5c\xd3\xe5\xea\x0a\xa7e}\x8d(& \x1f\xc5I\x8c\ +_)d\x1aD^s\xc1N\x16\x1a\xcc\xf5\x95-,\ +\xb23\xd7\xb7\xaf\x89\xa0\xd9\xa8Zb0H\xd1\x85C\ +\x0a)\xed\x998\x0c\x05\x09D-1@\xe5\xba*\xfd\ +\xff\x13\x93\x8a\x03\xcbS9[\xb5\xa5#\xbb0\xee\x0b\ +\x85\xf2\x06\xf2('\xca\x1b\xd4\x8b\x01\xa3\xcfx4\x96\ +\x0buA\xd6=\x0d\x13\x14\x8d\xea\xf5\xd1\x94\xdb\xa4\x03\ +\x85\xa6pV\x04\xa0\xd3\xf5A\xa6\x89n\x04\x15\x0f\xfe\ +:L\xb3\x9c#R\xe8>\x84@\xd3jJ\x94X,\ +U\xcer\xa1\x5c\xd6[leR\xe4TG\xd1\x80q\ +\xb2I\xc3\x15\x19\xa8\xf9E\xaa\x98\xdb\xe4\xbe\xbf\xc2\x10\ +\x9bh\xd7\xac/2\xf0r\xb5+\xcd\xae5\x07\x1c-\ +\x092]6\xd5L){\xe5\xad+F\x91R$r\ +\x96\xd5\xc1\xaa\xd8\x14\xa3\x16\xf5st\x1b\xd8\x80*x\ +U\xb1 \xae\x7f\xa4\x9d&r@ \x91\x1d\xc9s\xc2\ +\x0cb|\x1e,\xb7$\x03\xca\x13\x9a\xa9\xc8f\x00\x91\ +\xfe\xfcL\x22\xf1\xd3\xb2H\x89\xacn\x92\xa8\xd8\xc5\xb4\ +\xce3aV\x15\xa6\xb6\xfa\xcf\xe4\xde\xbaT\xd6\x16\xc0\ +\xaeq\xcc\xea\xb1\x1a\xdf\xd5\xb0\xdaTQ\xcb\xb7V\xae\ +\xa5\xaa\xect\x12\xa4\x0aO\xa3B\x9e\xd1\x08\x11SO\ +\xa2EN/\xde\x17\xd9v\xc6\xd3_\xd6\x95Q\x12z\ +gU\x5c\xad\x95\xaa#i\x93v\xd5\xb2\xb4[)\xfe\ +j+1d\xf66\x07\x16\xd5M\xdc\x1e\xbb-\xe4i\ +#\x5c\x91/\xf4anY\x17\xc2\xb2\x14a\xf8`Y\ +E?\x8cW\xe0\x10\xf3D\x13\x8b6\xd9\x18\xdd\xcb\xd4\ +\xd6\x12\x829El\x9eQ\xdb\xd7+q.\x08\x96_\ +Q\xabR\xba\x827[\xbc\xfc\xc2>\xfe\x09\x92I\x1a\ +\x14J\xcf\xbf\xc4N\xa0\xe8\x12\xcbbSuT\xda_\ +\x9d\x90LL\x96[e^\xf2\xa8dZ\x9a\x1c]\xf5\ +l[]q\xb5\xa6\xff\xaf\x98V\xf2\x7fc\x96o\xa0\ +\xd6\x96\xe0\x18@e_a\xe0P\x9e6\xb3*C\x18\ +xV|Q\x9dye\xda \x85\x03\xfb9\x8f6\xea\ +\xcce\xda\xe4E\xebs>\xae\x0e+N\xcar0K\ +B\x87\xf5\x5c\xaaY\x93\xd0\xabY\x93\xcc\xa5Y\x93\xc8\ +\xf9\xb4\x83b2\xde\xaa\x0d\xf0\xb5\x00\x97R\xf5\x00\x8c\ +\xfc\xc2'\x0c\xce\x10rwH\xc0,\x5c\xeb0&\xde\ +u\x18\x93\x04j0&9(@G\x94\xc66\x88\xd6\ +\xfd\x9aH,\xd6\xe5<\x8c\xc9\x8b\xf6\xd8\x97a\xba\x8c\ +\x9a\xce\x82cmr\x0e\x060\x8766\xb9\x02\x13\x98\ +C?u\xd7\xd0^!\xcb\xa7\xbbm4\xb3I&V\ +\xe0F]m\x92\x8f\x1d\xb8Q{\x9f#+I]M\ +\x02s\xeb\xeds\x103M5\xe0\xacN\x89\xefJn\ +<\xf5\xefy`\x5c$\x11\x8f\xf2P\x14\xa9\xb5\xf9/\ +\x13\xbc\xa3=\xd0?\xd6\xeb\x0c\xe7\xa2&\x22\xb3Z\xdb\ +\xf3\xa9Y\xa7\xde\x00\xe4\x15\xcf/#@,\xab\xd7'\ +*\x1f\xc2\xd7\xeb\x93<-p\xf9|L\xa9\xf5)\xbd\ +\xb4\xc8b\x0fh\xdd\xec\xd6\xc2=_\xe5\xfby\xb0\xe8\ +\xc9\xaa\x9d\x87y\xd9\xc3ixndm\x86\xd3\xde\x91\ +\xad\x17~\x04\x89\xd6\x9e0\x8d\xb5\x95\xbc\xa9N\x13i\ ++\x90\xa9\x06\xab\xf7f!\xc7W\xb3B\x1f}%\x1d\ +\x098\x0b~g\xe6%\x05 _\xdf\x87$\x09\xef\xa1\ +\x07\xf8=\xe8U\xc3#\x1f\xa1!\x0c\xc3\xefa5\x9c\ +\xb1\x83\x14\x04\xe8\x13C\x91w\x9e2B\x84\xc8\x9ce\ +\x93|\xac\xb2\x1b\xd0\xce\xf7Y\x8f\xc2\xa4R\xb0\xf3\xe1\ +.\xfc\x07\xff\x9a\x86{\xd5\x86\xab\x8e.?\xda\xb1\x9e\ +\xa2\x8eEc\x03\x1c\xd4\xdf\xf4\x92\x91\xef\xef\x83\x98h\ +\xde\xa32\x08\x8c\xf4\x17\xb4\xa7\xce\xc6\xab\xfe\xfa\xd7=\ +x\x03\x9c\xe6\x0f\xfdU\x1a\xdc\xcf\x82\x8c\xb5\x8dJ0\ +\xbaV1\x1d\xeb#\x80\xb6\xedI\xfb\xcd\x92q\xd5\xfa\ +\x10$\xf8p\x9c=u\x84?[QRq\xd1;\xd1\ +\x8b\xd3\xb2\x9b32o-\xb7@4\x04\x07wA\xea\ +\xcf\x1e\xeb\xed1\xee\xcc\xa8IY*B\x8d2\x15\xb1\ +\xf4\xb4\xc8\xd3\xc4M\xa6\xf4g\x8dukv\xf7L\x1a\ +\xccr\xc0\xac\xb2?T\xcdr\xc0\xac\xd2h\x96\x8c\x12\ +\x97Y>:N\xd5\xf8x\xcf\xc5\xb8\xe1@4\xc6\x15\ +\xd1\xb4d|d\xe4{p\x0c\xb6K\x1d\xacu\x0e\x8e\ +\x7f&\xcd\xae\xd2x&\xcf\xa2\xefp\xd1\xb5\xa6\x8e\xcc\ +\xb7h\x10\x9a\xb4\xc2\xd1\xc7V;\x17\x06\xa9\xb4F-\ +\xe9\xeb\x93\xf0\x12~\xcd\xa1\xc7\xa2\xeaf\xba\xcd[\x98\ +\xbc\x88C\xde\x0d1\xb0\xd1\x0f\xb9\x9c\x9f&\xdf\xf6\xa8\ +l\x82\xd6\xf0\x10\x8f\xady~\xd6\xac\ +\xe27\x1a\x88\xa5\x10\xb7{\x5c7\x1b\xcf,I\x95W\ +\xb9\xaa\xfb\x11]\x82\x86~b\xbd=\xe5~\x84>i\ +D\x9dn\x16/\xd1\x04\xb2\xb8\xc9\x18\xbe\xafN\xb5\x9b\ +\x22\xfa\x1e\xe6\xbb.V(;\xca1\xa0\x1c{\xf0=\ +=\x15\xce\xeb.\x5ca\x97\xf3\x22\xf3?\xc1y\xd9\xeb\ +\x97\xd6}k\xef\x07\x9415\xdfU\x89\xe5i\xbe\xab\ +!\x9b\x93\xf7\xaf\xbb.J\x9e\xee\xb9D\x15\xec\xe9\xfe\ +E\xdb\x8a\xe5x\x9a\x83\xd1a\x98\xc5\xda\xaeB\xea\xf6\ +M\x07-\xde\xc5\x88]u/f\xe4u\xef\x2284\ +\xbf\x86\xe3\xf0/:\x02\xf3+\x9f\xb6\xa3:\xfc\x9e\xa5\ +\x9e\x89\x12\xf3\x02=]nk\xc6%\xaeIv\xd9\xbc\ +\xf5\xae\xfd\xc4q\xb3\xbe\xba\x16G\x10\xfd\x9d\x06\xfb=\ +&/\xd3\xe7\xe4\xf5\xf7LA'\xb9\x16\x0e\xc7\x5c\x86\ +\xe1b\x9a\x09\xa0\xe9\xfd\x03\xe7E=\xd3\x86\x16\x87\xe6\ +\x82\xb4\x94\x06\xd5e>v\x7f\xfb:\xc5\x81\xd8\xe7\x8e\ +\x8b\x82\xcd<\xe9\x85!\xd3\xdb\x0b\xe6\xed\xa5#tm\ +C\xec\x92\xbe\x0c\xdc}+\x1e#\x0b]P\xde\x15\xd6\ +\x91\xd0\xc1\x1f\xfa.\xa9d\x09\xdd\xab\xab+\xe3\x01\x1f\ +.-\x17\x8f\xca\x85\x01+\xb3\x07\x843\xf9\xff\xea8\ +\xb5QE!=\xf2_/xc\xf2\x83\x85>\xb0\x8a\ +\xff\x01\xfb\xc2\xb7\x05\ \x00\x00\x00\xa8\ \x00\ \x00\x00\xe2x\x9c-N\xdb\x0a\x830\x0c}\xf7+B\ @@ -394,35 +395,32 @@ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x1c\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x03\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x01\x18\x00\x01\x00\x00\x00\x01\x00\x00\x0fH\ -\x00\x00\x01\x85\xf4);\xb8\ -\x00\x00\x01R\x00\x01\x00\x00\x00\x01\x00\x00\x10\xbd\ -\x00\x00\x01\x85\xf4);\xb8\ +\x00\x00\x01\x18\x00\x01\x00\x00\x00\x01\x00\x00\x0fW\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe1\ +\x00\x00\x01R\x00\x01\x00\x00\x00\x01\x00\x00\x10\xcc\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\ \x00\x00\x00\x94\x00\x01\x00\x00\x00\x01\x00\x00\x01M\ -\x00\x00\x01\x91\xe6gCj\ -\x00\x00\x01\x8c\x00\x01\x00\x00\x00\x01\x00\x00\x12\x1b\ -\x00\x00\x01\x85\xf4);\xb8\ -\x00\x00\x018\x00\x01\x00\x00\x00\x01\x00\x00\x10\x07\ -\x00\x00\x01\x85\xf4);\xb8\ -\x00\x00\x00\xb6\x00\x01\x00\x00\x00\x01\x00\x00\x0d\xe9\ -\x00\x00\x01\x85\xf4);\xb8\ -\x00\x00\x01r\x00\x01\x00\x00\x00\x01\x00\x00\x11{\ -\x00\x00\x01\x85\xf4);\xb8\ +\x00\x00\x01\x9aE\x7fE\x8b\ +\x00\x00\x01\x8c\x00\x01\x00\x00\x00\x01\x00\x00\x12*\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\ +\x00\x00\x018\x00\x01\x00\x00\x00\x01\x00\x00\x10\x16\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\ +\x00\x00\x00\xb6\x00\x01\x00\x00\x00\x01\x00\x00\x0d\xf8\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe1\ +\x00\x00\x01r\x00\x01\x00\x00\x00\x01\x00\x00\x11\x8a\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe1\ \x00\x00\x00D\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x85\xf4);\xb8\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\ \x00\x00\x00h\x00\x01\x00\x00\x00\x01\x00\x00\x00\xaf\ -\x00\x00\x01\x85\xf4);\xb8\ -\x00\x00\x00\xec\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x95\ -\x00\x00\x01\x85\xf4);\xb8\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe1\ +\x00\x00\x00\xec\x00\x01\x00\x00\x00\x01\x00\x00\x0e\xa4\ +\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\ " - 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/rare/resources/stylesheets/RareStyle/__init__.py b/rare/resources/stylesheets/RareStyle/__init__.py index 0f0a57f6a4..426e4bbccb 100644 --- a/rare/resources/stylesheets/RareStyle/__init__.py +++ b/rare/resources/stylesheets/RareStyle/__init__.py @@ -1,6 +1,6 @@ # Resource object code (Python 3) # Created by: object code -# Created by: The Resource Compiler for Qt version 6.9.1 +# Created by: The Resource Compiler for Qt version 6.10.1 # WARNING! All changes made in this file will be lost! from PySide6 import QtCore @@ -346,7 +346,7 @@ \x00\x00\x01B\x00\x01\x00\x00\x00\x01\x00\x00\x0d\x83\ \x00\x00\x01\x94\x0a\x06\xda@\ \x00\x00\x00\x84\x00\x01\x00\x00\x00\x01\x00\x00\x01J\ -\x00\x00\x01\x9a\xcb\xe1O>\ +\x00\x00\x01\x9b\x08\x1d\xe9V\ \x00\x00\x01|\x00\x01\x00\x00\x00\x01\x00\x00\x0e\xdb\ \x00\x00\x01\x94\x0a\x06\xda@\ \x00\x00\x01(\x00\x01\x00\x00\x00\x01\x00\x00\x0c\xd0\ @@ -363,13 +363,10 @@ \x00\x00\x01\x8f\xdd\xb9\xe7\xe2\ " - 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/rare/shared/image_manager.py b/rare/shared/image_manager.py index 388414a931..f8718dc1f2 100644 --- a/rare/shared/image_manager.py +++ b/rare/shared/image_manager.py @@ -74,26 +74,26 @@ def run(self): class ImageManager(QObject): def __init__(self, signals: GlobalSignals, core: LegendaryCore): self.logger = getLogger(type(self).__name__) - self.__cache_version = 2 - # lk: the ordering in __img_types matters for the order of fallbacks + self._cache_version = 2 + # lk: the ordering in _img_types matters for the order of fallbacks # {'AndroidIcon', 'DieselGameBox', 'DieselGameBoxLogo', 'DieselGameBoxTall', 'DieselGameBoxWide', # 'ESRB', 'Featured', 'OfferImageTall', 'OfferImageWide', 'Screenshot', 'Thumbnail'} - self.__img_tall_types: Tuple = ( + self._img_tall_types: Tuple = ( "DieselGameBoxTall", "OfferImageTall", "Thumbnail", ) - self.__img_wide_types: Tuple = ( + self._img_wide_types: Tuple = ( "DieselGameBoxWide", "DieselGameBox", "OfferImageWide", "Screenshot", ) - self.__img_logo_types: Tuple = ("DieselGameBoxLogo",) - self.__img_types: Tuple = self.__img_tall_types + self.__img_wide_types + self.__img_logo_types - self.__dl_retries = 1 - self.__worker_lock = threading.Lock() - self.__worker_app_names: Set[str] = set() + self._img_logo_types: Tuple = ("DieselGameBoxLogo",) + self._img_types: Tuple = self._img_tall_types + self._img_wide_types + self._img_logo_types + self._dl_retries = 1 + self._worker_lock = threading.Lock() + self._worker_app_names: Set[str] = set() super(ImageManager, self).__init__() self.signals = signals self.core = core @@ -107,15 +107,15 @@ def __init__(self, signals: GlobalSignals, core: LegendaryCore): self.threadpool.setMaxThreadCount(min(cpu_count() * 2, 16)) @staticmethod - def __img_json(app_name: str) -> Path: + def _img_json(app_name: str) -> Path: return image_dir_game(app_name).joinpath("image.json") @staticmethod - def __img_cache(app_name: str) -> Path: + def _img_cache(app_name: str) -> Path: return image_dir_game(app_name).joinpath("image.cache") @staticmethod - def __img_all(app_name: str) -> Tuple: + def _img_all(app_name: str) -> Tuple: return ( image_tall_path(app_name), image_tall_path(app_name, color=False), @@ -127,21 +127,21 @@ def __img_all(app_name: str) -> Tuple: ) def has_pixmaps(self, app_name: str) -> bool: - return all(file.is_file() for file in self.__img_all(app_name)) + return all(file.is_file() for file in self._img_all(app_name)) - def __prepare_download(self, game: Game, force: bool = False) -> Tuple[List, Dict]: + def _prepare_download(self, game: Game, force: bool = False) -> Tuple[List, Dict]: if force and image_dir_game(game.app_name).exists(): - for file in self.__img_all(game.app_name): + for file in self._img_all(game.app_name): file.unlink(missing_ok=True) if not image_dir_game(game.app_name).is_dir(): image_dir_game(game.app_name).mkdir() # Load image checksums - if not self.__img_json(game.app_name).is_file(): - json_data: Dict = dict(zip(self.__img_types, [None] * len(self.__img_types))) - json_data["version"] = self.__cache_version + if not self._img_json(game.app_name).is_file(): + json_data: Dict = dict(zip(self._img_types, [None] * len(self._img_types))) + json_data["version"] = self._cache_version else: - json_data = json.load(open(self.__img_json(game.app_name), "r")) + json_data = json.load(open(self._img_json(game.app_name), "r")) # Only download the best matching candidate for each image category def best_match(key_images: List, image_types: Tuple) -> Dict: @@ -159,9 +159,9 @@ def best_match(key_images: List, image_types: Tuple) -> Dict: candidates = tuple( image for image in [ - best_match(game.metadata.get("keyImages", []), self.__img_tall_types), - best_match(game.metadata.get("keyImages", []), self.__img_wide_types), - best_match(game.metadata.get("keyImages", []), self.__img_logo_types), + best_match(game.metadata.get("keyImages", []), self._img_tall_types), + best_match(game.metadata.get("keyImages", []), self._img_wide_types), + best_match(game.metadata.get("keyImages", []), self._img_logo_types), ] if bool(image) ) @@ -171,42 +171,42 @@ def best_match(key_images: List, image_types: Tuple) -> Dict: # lk: so everything below it is skipped # TODO: Move this into the thread, maybe, concurrency could help here too updates = [] - if (not self.has_pixmaps(game.app_name)) or game.app_name == EOSOverlayApp.app_name: + if (not self.has_pixmaps(game.app_name)): if not candidates: cover = "epic.png" if game.app_name == EOSOverlayApp.app_name else "cover.png" # lk: fast path for games without images, convert Rare's logo - cache_data: Dict = dict(zip(self.__img_types, [None] * len(self.__img_types))) + cache_data: Dict = dict(zip(self._img_types, [None] * len(self._img_types))) with open(resources_path.joinpath("images", cover), "rb") as fd: cache_data["DieselGameBoxTall"] = fd.read() with open(resources_path.joinpath("images", cover), "rb") as fd: cache_data["DieselGameBoxWide"] = fd.read() # cache_data["DieselGameBoxLogo"] = open( # resources_path.joinpath("images", "logo.png"), "rb").read() - self.__convert(game, cache_data) + self._convert(game, cache_data) json_data["cache"] = None json_data["scale"] = ImageSize.Tall.pixel_ratio json_data["size"] = { "w": ImageSize.Tall.size.width(), "h": ImageSize.Tall.size.height(), } - with open(self.__img_json(game.app_name), "w", encoding="utf-8") as file: + with open(self._img_json(game.app_name), "w", encoding="utf-8") as file: json.dump(json_data, file) else: - updates = [image for image in candidates if image["type"] in self.__img_types] + updates = [image for image in candidates if image["type"] in self._img_types] else: for image in candidates: - if image["type"] in self.__img_types: + if image["type"] in self._img_types: if image["type"] not in json_data.keys() or json_data[image["type"]] != image["md5"]: updates.append(image) return updates, json_data - def __download(self, updates: List, json_data: Dict, game: Game) -> bool: + def _download(self, updates: List, json_data: Dict, game: Game) -> bool: # Decompress existing image.cache - if not self.__img_cache(game.app_name).is_file(): - cache_data: Dict[str, Any] = dict(zip(self.__img_types, [None] * len(self.__img_types))) + if not self._img_cache(game.app_name).is_file(): + cache_data: Dict[str, Any] = dict(zip(self._img_types, [None] * len(self._img_types))) else: - cache_data = self.__decompress(game) + cache_data = self._decompress(game) # lk: filter updates again against the cache now that it is available # images in cache don't need to be downloaded again. @@ -224,13 +224,13 @@ def __download(self, updates: List, json_data: Dict, game: Game) -> bool: game.app_title, ) json_data[image["type"]] = image["md5"] - if image["type"] in self.__img_tall_types: + if image["type"] in self._img_tall_types: payload = { "resize": 1, "w": ImageSize.Tall.size.width(), "h": ImageSize.Tall.size.height(), } - elif image["type"] in self.__img_wide_types: + elif image["type"] in self._img_wide_types: payload = { "resize": 1, "w": ImageSize.Wide.size.width(), @@ -265,15 +265,15 @@ def __download(self, updates: List, json_data: Dict, game: Game) -> bool: ) del image_data - self.__convert(game, cache_data) + self._convert(game, cache_data) # lk: don't keep the cache if there is no logo (kept for me) # if cache_data["DieselGameBoxLogo"] is not None: - # self.__compress(game, cache_data) - self.__compress(game, cache_data) + # self._compress(game, cache_data) + self._compress(game, cache_data) # hash image cache try: - with open(self.__img_cache(game.app_name), "rb") as archive: + with open(self._img_cache(game.app_name), "rb") as archive: archive_hash = hashlib.md5(archive.read()).hexdigest() except FileNotFoundError: archive_hash = None @@ -286,16 +286,16 @@ def __download(self, updates: List, json_data: Dict, game: Game) -> bool: } # write image.json - with open(self.__img_json(game.app_name), "w", encoding="utf-8") as file: + with open(self._img_json(game.app_name), "w", encoding="utf-8") as file: json.dump(json_data, file) return bool(updates) - __icon_overlay: Optional[QPainterPath] = None + _icon_overlay: Optional[QPainterPath] = None - def __generate_icon_overlay(self, rect: QRect) -> QPainterPath: - if self.__icon_overlay is not None: - return self.__icon_overlay + def _generate_icon_overlay(self, rect: QRect) -> QPainterPath: + if self._icon_overlay is not None: + return self._icon_overlay rounded_path = QPainterPath() margin = 0.05 rounded_path.addRoundedRect( @@ -308,10 +308,10 @@ def __generate_icon_overlay(self, rect: QRect) -> QPainterPath: rect.height() * 0.2, rect.height() * 0.2, ) - self.__icon_overlay = rounded_path - return self.__icon_overlay + self._icon_overlay = rounded_path + return self._icon_overlay - def __convert_image(self, image_data, logo_data, preset: ImageSize.Preset) -> QImage: + def _convert_image(self, image_data, logo_data, preset: ImageSize.Preset) -> QImage: image = QImage() image.loadFromData(image_data) image.convertToFormat(QImage.Format.Format_ARGB32_Premultiplied) @@ -351,7 +351,7 @@ def __convert_image(self, image_data, logo_data, preset: ImageSize.Preset) -> QI Qt.TransformationMode.SmoothTransformation, ) - def __convert_icon(self, cover: QImage) -> QImage: + def _convert_icon(self, cover: QImage) -> QImage: icon_size = QSize(128, 128) icon = QImage(icon_size, QImage.Format.Format_ARGB32_Premultiplied) painter = QPainter(icon) @@ -359,7 +359,7 @@ def __convert_icon(self, cover: QImage) -> QImage: painter.setRenderHint(QPainter.RenderHint.Antialiasing, True) painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Source) painter.fillRect(icon.rect(), Qt.GlobalColor.transparent) - overlay = self.__generate_icon_overlay(icon.rect()) + overlay = self._generate_icon_overlay(icon.rect()) brush = QBrush(cover) scale = max(icon.width() / cover.width(), icon.height() / cover.height()) transform = QTransform().scale(scale, scale) @@ -371,7 +371,7 @@ def __convert_icon(self, cover: QImage) -> QImage: painter.end() return icon - def __save_image(self, image: QImage, color_path: Path, gray_path: Path): + def _save_image(self, image: QImage, color_path: Path, gray_path: Path): # this is not required if we ever want to re-apply the alpha channel # image = image.convertToFormat(QImage.Format_Indexed8) # add the alpha channel back to the cover @@ -385,8 +385,8 @@ def __save_image(self, image: QImage, color_path: Path, gray_path: Path): image.setAlphaChannel(alpha) image.save(gray_path.as_posix(), format="PNG") - def __convert(self, game, images, force=False) -> None: - for file in self.__img_all(game.app_name): + def _convert(self, game, images, force=False) -> None: + for file in self._img_all(game.app_name): if force and file.exists(): file.unlink(missing_ok=True) @@ -398,29 +398,34 @@ def find_image_data(image_types: Tuple): break return data - tall_data = find_image_data(self.__img_tall_types) - wide_data = find_image_data(self.__img_wide_types) - logo_data = find_image_data(self.__img_logo_types) + tall_data = find_image_data(self._img_tall_types) + wide_data = find_image_data(self._img_wide_types) + logo_data = find_image_data(self._img_logo_types) - tall = self.__convert_image(tall_data, logo_data, ImageSize.Tall) - self.__save_image( + icon_source = "wide" if tall_data is None else "tall" + + if tall_data is None and wide_data is not None: + tall_data = wide_data + + if wide_data is None and tall_data is not None: + wide_data = tall_data + + tall = self._convert_image(tall_data, logo_data, ImageSize.Tall) + self._save_image( tall, image_tall_path(game.app_name), image_tall_path(game.app_name, color=False), ) - if wide_data is None: - wide_data = tall_data - - wide = self.__convert_image(wide_data, logo_data, ImageSize.Wide) - self.__save_image( + wide = self._convert_image(wide_data, logo_data, ImageSize.Wide) + self._save_image( wide, image_wide_path(game.app_name), image_wide_path(game.app_name, color=False), ) - icon = self.__convert_icon(tall) - self.__save_image( + icon = self._convert_icon(tall if icon_source == "tall" else wide) + self._save_image( icon, image_icon_path(game.app_name), image_icon_path(game.app_name, color=False), @@ -430,51 +435,51 @@ def find_image_data(image_types: Tuple): format=desktop_icon_suffix().upper(), ) - def __compress(self, game: Game, data: Dict) -> None: - archive = open(self.__img_cache(game.app_name), "wb") + def _compress(self, game: Game, data: Dict) -> None: + archive = open(self._img_cache(game.app_name), "wb") cdata = zlib.compress(pickle.dumps(data), level=-1) archive.write(cdata) archive.close() - def __decompress(self, game: Game) -> Dict: - archive = open(self.__img_cache(game.app_name), "rb") + def _decompress(self, game: Game) -> Dict: + archive = open(self._img_cache(game.app_name), "rb") try: data = zlib.decompress(archive.read()) data = pickle.loads(data) except zlib.error: - data = dict(zip(self.__img_types, [None] * len(self.__img_types))) + data = dict(zip(self._img_types, [None] * len(self._img_types))) finally: archive.close() return data - def __append_to_worker_queue(self, game: Game): - self.__worker_lock.acquire() + def _append_to_worker_queue(self, game: Game): + self._worker_lock.acquire() try: - self.__worker_app_names.add(game.app_name) + self._worker_app_names.add(game.app_name) finally: - self.__worker_lock.release() + self._worker_lock.release() @Slot(object) - def __remove_from_worker_queue(self, game: Game): - self.__worker_lock.acquire() + def _remove_from_worker_queue(self, game: Game): + self._worker_lock.acquire() try: - self.__worker_app_names.remove(game.app_name) + self._worker_app_names.remove(game.app_name) finally: - self.__worker_lock.release() + self._worker_lock.release() - def __download_image(self, game, force: bool): - updates, json_data = self.__prepare_download(game, force) + def _download_image(self, game, force: bool): + updates, json_data = self._prepare_download(game, force) if updates: - self.__download(updates, json_data, game) + self._download(updates, json_data, game) self.logger.debug("Emitting singal for %s (%s)", game.app_name, game.app_title) def download_image(self, game: Game, load_callback: Callable[[], None], priority: int, force: bool = False) -> None: - if game.app_name in self.__worker_app_names: + if game.app_name in self._worker_app_names: return - self.__append_to_worker_queue(game) - image_worker = ImageWorker(self.__download_image, game, force) + self._append_to_worker_queue(game) + image_worker = ImageWorker(self._download_image, game, force) image_worker.signals.completed.connect(load_callback) - image_worker.signals.completed.connect(self.__remove_from_worker_queue) + image_worker.signals.completed.connect(self._remove_from_worker_queue) self.threadpool.start(image_worker, priority) def download_image_launch(self, game: Game, callback: Callable[[Game], None], priority: int, force: bool = False) -> None: @@ -487,13 +492,13 @@ def _callback(): self.download_image(game, _callback, priority, force) def download_image_blocking(self, game: Game, load_callback: Callable[[], None], priority: int, force: bool = False) -> None: - self.__append_to_worker_queue(game) - self.__download_image(game, force) + self._append_to_worker_queue(game) + self._download_image(game, force) load_callback() - self.__remove_from_worker_queue(game) + self._remove_from_worker_queue(game) @staticmethod - def __get_cover( + def _get_cover( container: Union[Type[QPixmap], Type[QImage]], app_name: str, preset: ImageSize.Preset, @@ -538,7 +543,7 @@ def get_pixmap(self, app_name: str, preset: ImageSize.Preset, color: bool = True @param color: True to load the colored pixmap, False to load the grayscale @return: QPixmap """ - pixmap: QPixmap = self.__get_cover(QPixmap, app_name, preset, color) + pixmap: QPixmap = self._get_cover(QPixmap, app_name, preset, color) return pixmap def get_image(self, app_name: str, preset: ImageSize.Preset, color: bool = True) -> QImage: @@ -550,5 +555,5 @@ def get_image(self, app_name: str, preset: ImageSize.Preset, color: bool = True) @param color: True to load the colored image, False to load the grayscale @return: QImage """ - image: QImage = self.__get_cover(QImage, app_name, preset, color) + image: QImage = self._get_cover(QImage, app_name, preset, color) return image