From 085301366563cf623480ff7156b1fbb22c7d9359 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Nov 2025 01:40:24 +0000 Subject: [PATCH 1/3] Add GitHub version checker to Stream-Mapparr plugin Implements automatic version checking that displays update status on the plugin settings page. Features: - Fetches latest release version from GitHub using stdlib (urllib.request) - Displays version status at top of settings page (Update Available / Up to Date) - Caches version check results for 24 hours to minimize API calls - Re-checks automatically when plugin version changes - Fails gracefully if network unavailable or GitHub API errors occur Technical Details: - Uses only Python standard library (no requests dependency) - Version check triggered via fields property (runs when settings opened) - Cache stored in /data/stream_mapparr_version_check.json - Timeout set to 5 seconds for API requests - All errors logged at debug level to avoid cluttering logs --- Stream-Mapparr/plugin.py | 169 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 168 insertions(+), 1 deletion(-) diff --git a/Stream-Mapparr/plugin.py b/Stream-Mapparr/plugin.py index 94d21e8..57a92e4 100644 --- a/Stream-Mapparr/plugin.py +++ b/Stream-Mapparr/plugin.py @@ -9,7 +9,9 @@ import csv import os import re import requests -from datetime import datetime +import urllib.request +import urllib.error +from datetime import datetime, timedelta from django.utils import timezone # Django model imports @@ -37,8 +39,20 @@ class Plugin: @property def fields(self): """Dynamically generate settings fields including channel database selection.""" + # Check for version updates (with caching) + version_info = {'message': f"Current version: {self.version}", 'status': 'unknown'} + try: + version_info = self._check_version_update() + except Exception as e: + LOGGER.debug(f"[Stream-Mapparr] Error checking version update: {e}") + # Static fields that are always present static_fields = [ + { + "id": "version_status", + "type": "info", + "label": version_info['message'], + }, { "id": "overwrite_streams", "label": "🔄 Overwrite Existing Streams", @@ -240,6 +254,7 @@ class Plugin: def __init__(self): self.processed_data_file = "/data/stream_mapparr_processed.json" + self.version_check_cache_file = "/data/stream_mapparr_version_check.json" self.loaded_channels = [] self.loaded_streams = [] self.channel_stream_matches = [] @@ -247,6 +262,158 @@ class Plugin: LOGGER.info(f"[Stream-Mapparr] {self.name} Plugin v{self.version} initialized") + def _get_latest_version(self, owner, repo): + """ + Fetches the latest release tag name from GitHub using only Python's standard library. + + Args: + owner (str): GitHub repository owner + repo (str): GitHub repository name + + Returns: + str: Latest version tag or error message + """ + url = f"https://api.github.com/repos/{owner}/{repo}/releases/latest" + + # Add a user-agent to avoid potential 403 Forbidden errors + headers = { + 'User-Agent': 'Dispatcharr-Plugin-Version-Checker' + } + + try: + # Create a request object with headers + req = urllib.request.Request(url, headers=headers) + + # Make the request and open the URL with a timeout + with urllib.request.urlopen(req, timeout=5) as response: + # Read the response and decode it as UTF-8 + data = response.read().decode('utf-8') + + # Parse the JSON string + json_data = json.loads(data) + + # Get the tag name + latest_version = json_data.get("tag_name") + + if latest_version: + return latest_version + else: + return None + + except urllib.error.HTTPError as http_err: + if http_err.code == 404: + LOGGER.debug(f"[Stream-Mapparr] GitHub repo not found or has no releases: {http_err}") + return None + else: + LOGGER.debug(f"[Stream-Mapparr] HTTP error checking version: {http_err.code}") + return None + except Exception as e: + # Catch other errors like timeouts + LOGGER.debug(f"[Stream-Mapparr] Error checking version: {str(e)}") + return None + + def _check_version_update(self): + """ + Check if a new version is available on GitHub. + Uses caching to limit checks to once per day or when the plugin version changes. + + Returns: + dict: Contains 'message' and 'status' keys for display + """ + current_version = self.version + github_owner = "PiratesIRC" + github_repo = "Stream-Mapparr" + + # Default response + result = { + 'message': f"Current version: {current_version}", + 'status': 'unknown' + } + + try: + # Load cache if it exists + cache_data = {} + should_check = True + + if os.path.exists(self.version_check_cache_file): + try: + with open(self.version_check_cache_file, 'r', encoding='utf-8') as f: + cache_data = json.load(f) + + # Check if we need to recheck: + # 1. Plugin version changed (upgrade/downgrade) + # 2. More than 24 hours since last check + cached_plugin_version = cache_data.get('plugin_version') + last_check_str = cache_data.get('last_check') + + if cached_plugin_version == current_version and last_check_str: + # Parse the last check time + last_check = datetime.fromisoformat(last_check_str) + time_diff = datetime.now() - last_check + + # If less than 24 hours, use cached data + if time_diff < timedelta(hours=24): + should_check = False + latest_version = cache_data.get('latest_version') + + # Compare versions + if latest_version and latest_version != current_version: + result = { + 'message': f"🎉 Update available! Current: {current_version} → Latest: {latest_version}", + 'status': 'update_available' + } + else: + result = { + 'message': f"✅ You are up to date (v{current_version})", + 'status': 'up_to_date' + } + except Exception as e: + LOGGER.debug(f"[Stream-Mapparr] Error reading version cache: {e}") + should_check = True + + # Perform the check if needed + if should_check: + latest_version = self._get_latest_version(github_owner, github_repo) + + # Update cache + cache_data = { + 'plugin_version': current_version, + 'latest_version': latest_version, + 'last_check': datetime.now().isoformat() + } + + try: + with open(self.version_check_cache_file, 'w', encoding='utf-8') as f: + json.dump(cache_data, f, indent=2) + except Exception as e: + LOGGER.debug(f"[Stream-Mapparr] Error writing version cache: {e}") + + # Compare versions + if latest_version and latest_version != current_version: + result = { + 'message': f"🎉 Update available! Current: {current_version} → Latest: {latest_version}", + 'status': 'update_available' + } + elif latest_version: + result = { + 'message': f"✅ You are up to date (v{current_version})", + 'status': 'up_to_date' + } + else: + result = { + 'message': f"Current version: {current_version} (unable to check for updates)", + 'status': 'error' + } + + except Exception as e: + LOGGER.debug(f"[Stream-Mapparr] Error in version check: {e}") + result = { + 'message': f"Current version: {current_version} (update check failed)", + 'status': 'error' + } + + return result + def _get_channel_databases(self): """ Scan for channel database files and return metadata for each. From ad085ebed48d0857e736150a11e406dbf310604c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Nov 2025 01:41:41 +0000 Subject: [PATCH 2/3] Add .gitignore to exclude Python cache files --- .gitignore | 46 ++++++++++++++++++ .../__pycache__/plugin.cpython-311.pyc | Bin 98761 -> 0 bytes 2 files changed, 46 insertions(+) create mode 100644 .gitignore delete mode 100644 Stream-Mapparr/__pycache__/plugin.cpython-311.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2528e57 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +venv/ +ENV/ +env/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Testing +.pytest_cache/ +.coverage +htmlcov/ + +# Data files (cache) +/data/ +*.log diff --git a/Stream-Mapparr/__pycache__/plugin.cpython-311.pyc b/Stream-Mapparr/__pycache__/plugin.cpython-311.pyc deleted file mode 100644 index 0b8b9080cd4628d1fc8ffff3db5169d699107d3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98761 zcmeFa33OandL~vI_5!PbDxeDc!%7qh7Px{UxPn-?gCqcM-~xeo1+Yk zPPZG<=uD$!IbzGy5vGs38*;0sITJhPOuA2~UfCTx^B(54QLYm@jK`fsIg>FvY9}3@ z#FOv8Z>f5Ajv42u(`>Ss0_Lk_T4MOZZy*)l z!oTtxEf17mb!m6uL(I2ZyZ;6*zNOumMl0CcO6>t(lopmJP_g9I-lm=d9-~jQDNw#t zmFh#g4pe0ES*^WIJtJ2&+I{*r7SjO}U;G6VU-AtLa)5v3H(DF0y;`T=)#0vQzpF>? zYSVJukmVVd6qj*VZxPPZqf=ca<8 z;-0z4?96y1I59pweTy6C`7npui7Ua-6c=V+gt^Ephaf_sz;u|qJRT14+-!&ojn4$Q zaBwC#JuUO_JO%*^wu#-X+VfpUT2vJ`;`=r%_w<{ zHnp}-2W|wWDXqRR*V?XM%ml*W@hLo<&`N>MYt);M|A;#DdCUMa8h8 zQsfbv^M!m7UwkKzFX8QcDZhqyusbJT#+UOh-pyC=m3Q)a5AVf&6<>YF#@Fz*xUS>t z`38K)@r}%96W`2yw(za&zKvhY?%R1EyI;qzXZIca2E^m%J1L&2qR|3=Bfp8?%x}44 z<+t+N_%3#}oqvws!LGXbo%}AOayP$+-wQwckb)k5Ki`XIeSE+EY=A$&AH=gm{9*0c zRQ_n;l!-s`HS=f@&PQ=B=8t{BG+M$3`N1!kNA3J^+?Dbt;I83M!gcUNaGm@x+%o`Ezh9_))l({CT(@{sLSte~rHgzg7Gt+*R|_{21>(5!J&3@ z0nM)(9^%K-%K=UZ%pfwJRbe4;eR`ad!xG1u0^F!y_&J2h2g7QhvmrDYp}P<+xj+~sdSNbzFD9mEkprca0%1Sbr=+-> zdv0680m^8t?bw_!Jx9ISpHKIn-;OPHeGE0M_c?#|9lJ2v|_bv@_b zf3;_f~;RtaI*FGuC&M5CM3$r&VT_8LtM6I;o^Mg6Y zXRc2Nx;ZV9&D;GO@wbV^;L8^rNTA>(hq`H@98RKyl|K+-=Y|v#qavU*dQKeT#wR9_7r)Pz zp3clvT^|pJZ_Wz5Rz<#I2wh3l3Dr-cQ1fj_pZ4(6r!OxpeTm{===xk_jCfk1p#8ei zkBu?P5v?D;_q+duQ+qdV5cG_?hp*2Hk#GlhZ1zSlfb(GBW;ptL>(;GHQf43+nC3Zp zv;oW>V100V*hg%l*EO~0)B>m1=)aKwB4)B5C*JXM$57jXU=eyx9W6YJhp0&iUk^+K zCxcY=0}vO`i}T#&TinF#%*=S$pKyc&(}4**9Genm=dOq6T9rKg7ND)(4qd`e5#m;dB%?tPg%#GZ2_c%CI)&aFo}xbs_&T!h;f80RlWuQQ(@ zo)RE;^GYD3x6fLe=jVp6qrFV#kV6HSP^24HK4ESy1j0g!x)LA)hA6Y#Wnp~cS|Aec z1aXn^D`*!%)`}a!a1aglm>R&?G~}zu9LbH3-}}mMQ6^3+K6E-CB_Bc&d_;e1kTrV5 z4eIw4>3BqMmetT%JAZ`;sC5Laz4mKihB>4O91)yF?-PtFC9jHh98tA{@`5}dJ6c9r z%>G0fn#&-`d}HB2g!-lMTm_Q$S9iY1omSs)!|I!8zy64dPZ8n3ZpwFDyT+0oYRPu6 zMgas2f%Ag1p$;w(neh93)@1cdl<8a9_LZU5&rDZqFv6dG^NU0}kav5;3dx2?@yMZ-MSY>#9FBUE zk+4yO7RBD^v5_mmu)>(n5D<+w^aN23X($4IMP&+x<^p?t)7_R=`Ghgd>WDpd;4T_ANrMuLQi_Ge8s6<6UMJ zc}6gMqX$xm@u@>h$$_u%iH-V%Cwb>j9qgmi0G({-6?eGrVzlV|snE61?9I@{C;8`x zr)O_o6ey3r3ZWCHsI7hL5nsZx^@y;MZu8m^jxS+_D{N98AVfTXD{NLipnJ=~z9-i9 zgFa!4@@$x%4b!s$9~|7-C@x_uz0Pl^Yu|*fTfxHu{9Ez=@z>x$_hXKk#&D(lrcAig zeX~1VQ^D@&OZMZ*r=~|TMVPKhd9#$SdNG`MOU!hY;%2|!H}O{77pC0X-pxzbneZkI z-0}va&7J5u#ygctp^f3S_B+7)uZCws(X#Wy20g|_E?T7OGPoO2J9=OAS?FreZTX54 zF17WCph97f5hEoW)RyCkRx1;0)CX#HOjN3G)b>*ue4tG&O&N;>ghc+);|C7(4<&5D z(By2wMzUR^03)+7Iv=PgY><&A!$f87$>z>0vonECl7Tyo=}*5^nA(5+R-$lhj50Ge z7Ii2?TEF(-4-sZ~6wa%rc=N#pn_S4n8ye|c8?Wc+ToZ3=r*m_>jyL{}GHrV1Sd11d-?-ZFL zDSof&*GoDhX@2P((HX*IGBU%wB~p^~8MDO95qt9f1IsrM-naBHQ&~FI-;&ON$!|@> ziss)py=yVXNUF?XQ?n^T!yxt7ViG#%t%eXuz{>dXwwN`0h^Z+%hZyFqFGIyTtX|zT z-!#2wJ!iTJH7v1ybo(KlYgr?mq6)yEj*Y}wpEWfnP=}xmbNz$p_=**d8RLUO!jU#i zPUKI|PEA2U)}2vnk}>ie8$+`pv=*BlMK>4Sn(^(xII0orn3A>45J)%YD;9b|uY_eb zoUma~dslGewT;?i{w>l*Hy zd2j5Uv2UN1>bm5*uEpYqt()QvzIe-)hc%6l3v6xWzcj)56*-GG+1d2B#ilaP+a+(7 zh_zS6b63c%y(&4c$BIKo{f*WSH@EDswSK=g57!fV zrGY2CDo^4HRoT3RhnYW`12Af_m-Id()wfY|y`)$ER6o4cSncLf8JAK$=-0e0J=S?! zPQQ5>e)A$Jl|N>U*o@weEzVh$V8QwFL>87pHIH{!aJ7vf|zB=rY9xkf-j2Y zXRGR|&DB-CM~vmi3i#p=N{r3bd||9G**Eg`Ym8EY2XUq}h{;I#QX|dKRIM2{8NzU= zVKn3n!#2+SMUCuDwss6K31uF0gqaVKVU8@q)Qr4!_$U|nN zXemY3NYcdUZ@ws2w3K|Aa>b|3`^*=|io>}n?aiQc6{wPn7pl{J$BOwf${o6qlvH2U zyRxf#Cx)(N-F!(-%GSh6a?rDuacdn>al(QwrEI?BStB#5{9De=~4 zk5`L_Z^#joHeq5y_`auv&t(rEeA1}A$&o94KG0;kO3F(1`-HqSWsghGOLIzII5kL| zJ|PD!*+WGRTA!8!t)us~MYkRZVB8c+QEg&qcMW=!xiAgi?pJ9ND()cpuU(|2++bKwZ-^io6!Z7|5D&2*iMKkDur zzaH#_;&pZonM;XC*b$pH#L^P?0u^ba$Qqwvf z>E=G7(nP>E66zBLG&Kk%#z$X42NT_u8G152$kyDXB7bavu+Q{O+yulTif?>6Oq4l| zc^fVMq<=refdFPNF;WdoTvPPsTDBO$G@_FRj}4X6sPoZVl)5Z=hpsvh;;+vJLlHJO zo&@!HsA!dlQnQX?>gEQcyGXsA`H7xF3?hP)w=z}#?DOESC>a|wh%`(yD*^|tJ=6%t4XOO5!WJ2E0Z6@uo7O;D)y zfuExZx73CS4Fje5S$+D-64t3eB#{RtLGXGaUr^3gsIHaK3sXR%_-MQ{8;&GOFiRJi z3y)3A@_|GiqhP`*j0eMkG0a#%wLou$3up!t#Zdn#1D|lhk>tgGs>z9h5v6TRI8{za zj*=Wi*S-M7!2Aj$)Tr9okSS59sjr3Oc&hXxq%&YGc*2VL$wa~R@mr+&Amyo2Hi=@^ zZ2>wM;{DJ)hFfZlM9ZxtLE)pZ|)Mg zu6q{AwNrNOTqw-;>=%ym#p6q7mtPcJ&qzURkep%J85W)4xTi*}n-MQuBNvBfMs&{P_{)J?YPQHVTNaK!ay8Jn^^#f7!b!b2kIEa7r^`m0d{(CRL!6Dgu zWqYq^?~S`WNN@EK%YBD(PIKK9lBx8QTpBVzR1-ks@1lq~)zuTwb8lR%>cJt|_sjPE zqJ4kd6&8($9#%UAaf}6|xq3i*?;(`EI3)W%*}hM-??X<+s-q9e;LzbZD%#TzC1e-a zib9@bA#1K4@`3vZ`2Y^deo(d_6zvD&u7GGflz_Yx%0U*2=IWuG6;GWOtIpz(?B`_r zInjQOB~TAtbR7`w=?8@i%>x3(ML2>w{o(GOs)07s54=9OKeTKmcYBW;ryrMk$!&8V z-e~=Ccf)}O>rbl8xc*6lhukjjLAUjRyByaK+UgG#TYqY!w?8eWCqJ$A9_qIKw7V47 zKP#v|yx#h=R(kuh^?7h7*bo(w(@$4*e*ujP)EU+#_Bh@7dsS!T#qxe1iWC~W&F4ce zXrU{@iIGwPss>wjO(5;EPq2Knvp36%u+7xBxT} z0%Q`1X*Nalp%vcRjcHV*z8MOTT>RiBdO=}R44$pxWgikaVFZ8&bwF`cq6(vVkm(VTs5yLCm~E!1fC?(f7oc zHR#MiXE*o6OTlM*lPG{-2#8QP3sLDCjhgC!97*GzSRhrqGhbrZ>vIU>MB&TiOpw!0 zPJo;#a;}g=GOQ3JN0E(zcToXv2^$}rh$L*&fIJG+Dhe}jd?l*9t7QNH04A``l8>b9 zd!24$u%?J>8?5*$M6{1QEUyu3 zyY6m+gF`CcE|+f??b|ik=Q$F6T2byFmh`#%cbI;}Rg$~iOzsZ%z+UT*OE(O3L*~iD z^+akftjj8YhyDSwifswOWd8nMWtDuI%24{q`GPcAr4X`8-ftkQ=#oOLAXXT&@+7Tb zLgicfqzb9*lM^K=(n{V^%EV2QB3Yyr!cVHdEYeD9=t*fMSLm72N^0nt(n@ORNogfl z=((ho)HrfUD@D&ZQBw3Q6D1i^LiVW%k`i*|#l@rqcMd5bHAjjhktroqrb!8&=yRD; z!ik=d-h*1l@~m=#a1;C>ya?xgi*O64s2ysQ2vouwMgYQ%`ZM~%6p_FXBl>s<2D>OE ztI}IsprCchK$xf7m&tjBoL9;DEpn*S6@HtX{|ru+D5+00#+A}-3SXp;s&o0F-m^4k z@0rMB^8h(J(PU@&zS3C=uTeT*C+7unp4wGDrGIpcv51-KhxL$^S`TS_?nU<){?6yz zM;t@NH*u_BVS&cxV!znM;savJ*OnkDcN)CA7wWQUD)n7 zcYkH?TYE)&ld+TAL!F%B=$+iT2km0jIXZwYU>A~oRJMGjS|_&$7atRn?ZcAZb$wl?A9lI>cUgZ_yrF-)^+((DaQ&Y;w*S$5J9--I(wawe5@K(4h92yROVwShtiKd`8bz zmBY)^J1$|8(v@rMm+ZELH{mawb%?fRjAmPsJ&->4V0gUc@4o}ut#?2}4+=%^5Dv*c zEZc`g`>;BFaChzf0`cUq=oyhbBeG}Y|7#u4Zt8#(NAG~nqBmwr=1grf>wtFNGmEu5 zaY*I6b0ptxwLG;Nvz#FDK_w@zDTtn)Tn zeIB!>sqCPn6}DRF4e(x9^&yE-inHU(fLbY;&wn{TRH&SjN;cjO=xAwl%ZLyph$l^-lEkYoQsGEV z0zrBbDx53ajo>(UCUALpmR21Jq?-gnxs2xLG_3RV_^p6|ho$4;TcHVBGD7Esi%+6V z#^$a=$_s>}P7ONkSDx_Et-b0>pyV0~PJKt~g!*ql7S~r$uvH9LgYL5^>kii;Iawxg z2ece%nZV2|Wfi(NLv}`@+cM<)-q|^PJcXsG*@{8t@e+9C}t50m8y zCUQ(G#4$CINeF8$AA{7g{VxddRnuczSS+RlYz zaR)%D#ig~6oZA;m7fWx?$n{;4bGz)^9(Vg5ahv1K=N{)-D=MLgsi^#AUVa%+uW%kS zXN`_}JtH~K%FeT*^DHJI7bA}=5ah4_w$kLRqG{N(n1o8Y)I1EnJ}B0l7Kca3tvM~( z&&c*OV#dLm11o)st49v^!W;v-{&r7skHhq#qqt|M^}{M}PnY$>t~^{14ov738&uKt zEfz)Jl7dQgc7OQ2)sFJ_Km^?%F?(9CibI7BxX*V zr?CMgpWC-B%{LmWm`$AzF^8!GEm zh{adRT;%?lV|_i>+=j6OK!dqv{Oc&_VolRK#8$rRt1%gF2lEm^fsit!KTwzYskK-! zdO>P#Z8e$#wNn<*YwJX5iKJhT;uKbPrY0 zP?C?JSRjTkQr66Nb4RJ?z$#M82*s?tH27C?JT?J@)y(*d-DDSFM3_VBRZ=wdDsP&A z7Yj@VU&LZ{JsDW{N6SYwni8df)CzM=2&u`ZM>B${8J8N5y84u@=}oLLMm`vAxDZ}< z{=)eS?HA8q!s+6L_6xp?cybXZylPSLljon9FFrB1KQa5FRy=-U=Fr{cO->`1Pb?QM zqZ#i7(H|+x2IMdt)inf?yQJcHZB}^Tm-+5*O=UZj1(44pz$Ynq4yCmIui@gh3M_!rQX}4 zw?~(^+-+X&UhclJE6rA7THqe@_MOp+r50LanF70{WCuw zIW3Qji`AE<>dSKV<;8-<0;IR5?oQiM#kb2psJgr5{rV5;rN-^|TBXLl_sg?>@yJp6 z<@wj=Uwh?^SH!}4;RwpWu-ZxQHzq+=<7y|gz{~R%>KD+`7SS3doH64+VKHMi_6-L_ zJbaV+!%_u2|CatPyDwvlHE-puhL%%rqaoZHLcRPh z@>I{!LnG(Ljt}+q4=Hnz-=ZMC4F`rfFyB0JMfm5qfqjgF^b9~gYCM(3pg?Vj5~W&` z#Hu6NlmG%+2*Ci0c9oBhm3pnzYA4pfvfPcSpGG}el}>x{21+*kAMiP*6g@SvXX9g& zqi8L277l=O#p+JcLB}Ik_3dk-%ZDRg)3i89e~+yu_d3+(#`bTPeywzQQsTDB+_qJ2 z=L)w|;&#j2?#0qa?yh&6?)a9DN!6R>>dm6NOF817@;TN))s`<7J}x$KgoG+X8sRJ+ zc<8Bm>(-KIdHo*?e>AVmNkaOoSQ~F>yS+yHdu+v%$5#3(-{f>JL^5k3aTam>$0QMC z)WXe5EmUPB7`?)xq7?a#xAL|xT1bPb{J^=z#KB5^<@0F37&5<660?Tc&=GYPOJ34y z^A@&3FF(2?oiovlD?F)nW7J49TNJwC1lGCxS?4n__|bpFZv-7qRqw%`!NLBcIwOws z98j3im!~kCT^ln{kix$}>H$$04^wB6C}Nm$)^Cs)#`sHNuUehGw9hpT#dp!>bXLpa zi5jHvKS8KqJL)(#JvNmT0Zs@9P)Ri0mtViNaO+WZ!(u_au~kOfYDMd6l^gpoGAOHO z&f+1=)Gi$rJsWYvo7!#{#JzR5^B(7!yqi$WUUUcMvif*U-R;e{H-iJp>K~Q4Z`;MP z794R;^0 zu|}JRVP-{Nd5^KFN+uFiRKrYu!%AvmLb5pX@n6IFJ@eb9*DOo8%KXKki%7DYv3Z_1 z$IQasB7A#QPh|F$au_ziN3xq>Q+L#ss6VVz@c@>S0#Qm0)A%i|6dE>ZYfzr;8xYAd zD3B}ze*7*@!XLv){kx`TVUI4n$4?3h!?*vEc=Wdr{;#q2xw3k-a{Wr> z`sIPUT^|fel{@9ioeKxz4vbW7rQMG$*0Sz+O@mysb+x8@rKbDdcB!UUuIUxsy}y3w zX(UeUPC5^3>TgHnhUcW39dgYM(XAfDqum&J{=!wc7(r7kxi+C@i1tlk2U4+A)ouFM z^*uG#539{^-!~_$*8;b2%BQSh3A$CO(gg~Q!otrq`aG{;OuS<`s1R-V1Tx(vT9C~E z(BiSJpa`(qOy_UQP0q^2DY1F0=-4JXw#kldV&S&TYDN6Sn%YsgZ<`{x)qbDEv5^$+ zH1gj(4Uw&?j?Ok?BfVUXko7^O7Au`0WLb?>cs@_j-lfHZ;qanaz+f1S{GSovGNQxa z5DGvJeBKB7Mj>RIX}&NO_?Wa(5KFUE3CMyq`(!-edxp9S&0hii8Pkkzrli@l$rQHT zv?$BI&8BlEGybrywKz4u+BIJop><#CFFh8BdPO;?n4)jgzNY*eQ<)9s_r@J)E31>= zpp|I_7{I)wg9wxFNHGvAKq^YIg8`tkETF0WH-4;~lRC?s`L!GJn65pBru%GQ!FgGaPvMnNVtX82MAjLb&Hr%725Eo3Q%F`?*|49{2) zmX>nWri-#vE*Rpnd}K_ACTA%G!wRS{77{sy6DVHcBsoLm43o102P+G)9xq|TVzrQh zB($-mF8PqPbrtRd@>obFO_``QLLXlthpBZ{ti*A8aEyFv%G|Jm8>DE2|0?wbGi(q} z=mH!wH)5Vl6fuJbl=7#5DO_WeK%EI#9LZ6C=DY7v^M4!y&a0+hRCwMx^Y+-AV_!cj zRruu!|3Y!xTfI>F*yb)8F+Z|5ipJw%rT49=x2NBnUg{P*_eqsKa%B%X&RXtv-;(F6 z$L<_kIQGa<`%9C(biy2OfgD&+b^$|pau<(2w&Yh_Fh8toT|l6OkPmY2U5zQ5yNz5Lymaf##Sm!6j|1y(PGRxX9a*_WhCG5JzV zc_n#Yk-e{o?D+M=nid+IPzIB3+*|*i{T;j5I(k0_hmJF6l?%yxUiO|BGY(Zzjesbr z`MO^Gl^d0BK`rUfln;bBG@r@H#w+t357r5VDZPefuaGWAfCjPI2sJL|;4+VB)u zdilBjU8WBk%X_;mA8uK<-7Rj?s z_H1L*^Iv}X^_L|_gY0M!3mcU3NfCE3|E!je8-m=IOkc8nsR{!`8_f;9j!9-VM+B`{ zD(BAUzh+v(XPG~&@5zJi4dtD*aRh{}HJ1M@Wp=~#dKE$@Ce8T8@?WzVh0^&#Ab+1R zT)_(gn7A^0kKRUecaXFo51Yv;@7UGwf(x$u|7WjSkO zx%$1ardKcy8=JT1{La96S;MG|RX$5w5vzC>U#eymc_hE3V=Xmf%^!=cp2b!m{QFozj$v+t@k?P9Ep0n|3OstNs&G?wvfTW0N zjHG^#<(!!Yb2!+VB7d3`jv(Jh4;jr|bjoo9%o>vBQ=tO_tSs!^qCfK**pzN{l8~@n;J^fMQ+~wnr$iBd#7AMEH@>a!`G~@Sw2XEY<kiP0>H|hM0W>s4tFjPFVfbjH&cuXPO(6x>&UPO`9Vmnu zZmds3?IH2lKoS~A{Jn6q@HYrqfV#;f{BLl=MjrhQNVl6vcLYHy%-M08m^0PgZ|Sux z_pNsHt#tI=KY9Pg56_7w&WqD8i5-1XM@;UBrTNFV3Wt^sB)7)l+M`7soJPP*;4jC4 zS5t|dWK*5@qHBzPqPsInQQ=<&atG`erthe^(^^m?D`!z%BYbtnFNy49A88>pM%~%` z2=_t1EQ{^cHdMt}LtRdmpTIyZdNf+VFquvO8a1yB@%N9MuP%YF1X^XUFhdP?wLu11 zezA>*wiy7k2@zeNNe`-gSUp>{@Brb?@Z88{a+m zphV=uV#_Y6B_g*(QoSnI3UMp;GmvQ-$43jntBl}2XQGDLL{RAt%gU3pgj$~&qXNKo zPO~=y0_z|Zko^BhGc+J}V+=>9m7!ftryV(*ZYl&4U8!h{|0q{??}3oM70 zWYvFSjrKtKFi}Qy)|Ac)Ce3B^qU7>#k?t@}W&&uy(SOEopMuY*Qi!ePEoHBe`S+w`?L$|E=>zClODZ)0X}rWMmT>XfdQ2pF>Tln8>y-sNG_T&;RnPVn z&-Q!v`!nLH^OEO+?76_+)No6?R-3o2G;fodx694j#p>+~jzs&2qSSe{( zvP&f!aPyoyCQlI;*jiz zWcwk}eh2|`O`^Rv-q7-O;SX-z^-62I<+a^XL-)N?QUi>K)jq0j#X^bF^O&I_cQHR+ z-?DU?z^wqSx+~w>A=YhJe(8Jrzk5t_9hO~(F~?PQ-W+$gth(2)xB+dE+*@S#7SX*W z?yi3O$eTw*?i}Pg?i>!uJu16LMfWJyMF3b;REi8WwyrkrS!vuO?maFwo{$?)EUqDQ zZOktD-1l7fE=fC%$~%sVwU~OMLvr4boi{}1jmNg6B#9Q6o+Y4--S;N%pZ;#>!8P&fEwOdC z)Ebprql<&c{HkaDif6s#*?_5pyA7+G239r=NShAIn+~pc4vL$q~S zxT0_~^%mFrEk~)4@I|VN0;@Pd1qK(-$+Z~-v{Yd&_4-UO1r^GW8V$Fo;o8LFx zN~yAXfCm&Sb_mdpsnYVI=gqf|uGV&})OIXil4^I!wU~CMr*RGsWDW}u>vTpuE%uIx z-qSer#YqUKrj6ibTbYCE+_rADZO=;Eo_ja$Pk#612QP`&qGH<~sqH1X?IqFK{K(a| z>grf=bx1D1?DC772Ua&9UDVn8~<%kktX?&MaTYge3Wm-8iOr|j$$ot?jaRDwCz z0&3~&8dvMOSL#sDk4SY#<+`H_gL*+n{v8 zi*56#iS1d!jpb#eXbVrcC|h(7Qy+v?$#t8=!s>Vh>YAk}XGp7#%`1-0l4Gmv*eX7Ec!kv^ zL$F88#B4giK6PT2vMNWtwM8z-mAZuHFbH1aY9)DstyYhu~-s{ zT{8WYf`ulaevS#`EC^4ef~M8AIMeovn$HVW0jHNTrJ1_QdeQ>qVjggq*7>}1rjSj; zKF3T;`qZozGM!^-p<|LYWxpz1>nXvt9w)B#>0?~$s7qYyQ--|lPCnLqo3S9%EELk3 za>e8pUvLLIMF7Q$`=s^}3lGvJ=o#+2HknrB>joBVCLfq`O#2i@8k3&VC)~45>+smd zdb$i~*yLw9!iHkMJjIiKX>2=;(@rRhyr-pz=)rchD4s8Pxd3n7qstOZd>(p~7HYkxS^Kpnr#)FOfqHPr{0w0EC~=RT0^r zVgU$e=-$gVEJ)oTb4*D{qLv~2)cwk|0bW>pTZz>Psar{E&+Bt+^QgT?W0_-%L(PYm zMvsO)`qVdyB}O6|mOn;>L=i1s3S7p%rHNvwa?uK7#mR)PNFY@=Z3aN}WM#s3Sft&X zm7)0{y)RbYW3YLhVIYM@^g>~(T}oRER~e65LEdPw+T7y$OVq3qOA*Muxv2YLMa{wh zHE00!SW36N+r2dP?TA#f6)=DH;NDqwio5ETJff=|2UZ;|MdgOgiwE&p!`kvFP~qLwEhxi$oW!51LCcg43LMQwzOb zbYNXTX{&;oD=k~KuUoONTZX0Qow9wWXy1v5+SbXf`{TY1vhQ%bd9B>MC%(Q@UOyP$ zuu0x91W6xnAD0$XuYq_{y=LL?W5Vg*hA6NWN4&`=cAb1s35O2P5FO5;N3Pbz?%R`C z(z$d60|?i4*~QEf{(?||wjwNM(42=5iJ3X=!#`@iKmK9c53!c>Fb>InM7AFh?MLGF zS`1E=L-l;SYPD*^O4SCbs#C7&l(pzZyFwfCbVfxT*rt1n<&wA^J?dFgR-6vr8$o zT*%m;T>#(B=b;797q(%doT_`qkDysuTU4xcP^^e#@Ac9bSTdLq_Mc)fnCvlStTf1( z=QLOk@@!s8?eq0q@Fg&xh}gcR$C%x|iLrIZ9$5w9s+<(b+_MU_STu*u@M{3LDac`x zI?d2x1}vvASO3jB0hyz+Lk^SX8Rm-^yr(E5oMOOoO7L%w6+)K2IS(}eU{COO@!Y&4 z=Ey;(@(el=CuaPNbc&Tei@9l48m{7PNQXT;m&Gz@$`&q;#@2)@VkOV|%^NSqN`!Mc z%gx2RbMR`Kx$tcKo-@>noS~+1X|_;76I*C!&af*ZG(V>PVrgJGz=AwEnbTE-l5FJDX0r*|z` zYmeJtgxviU)8;$*x|kdC{`Oe;k}d_OW-;dG>ylD#x?~u0=csY@MxSAGXiLn+*F+&* z&$~h$Y3U<1xB4@-XE42;#VU~R z%9tld{mbB!H);XR(_30Cy>yOc`rRC>6mI3@d@d(vR~mDbtybj>wJ~R?6?_xloVt`c zGZsT#tT4Xko3F9{N3ifMAv15M-p=R)V+5+}Cv&E))ewH#-hQa-Z8_7P;Wx9chbnT$ zyEZ+YIopNy44=7rT_3;B$ffgD81dF6IU-hN3~RoMUmvTQu)Juw1~C|8jC{UBy{Zkt zj6x`PZ@eK^m5m2N1UJmei@cw{;5#!xP^^SDVdPC14fPk{v@4T|jlAn1ZR84hWA?OA zxQ3B>E?I7qkt$D-Yc}&+(kNVwmatlI7^s}Kiz7I*X1*p?!`G<$U*@Lj)>utesuG|w zJ5{%(r~NmkW>>5_TN<93n%mP;1PXnQ9LsbxPvaEQ(X5-VGL*b&sVvD)$*c7GKvMiw zT@NATE~n?RbKFzv`;K&~gm#1D+mdO47G~o-_TtP@&fO7T(r>KR7#ix;&dhp+^`cGl zwJ+CVy(l{;H6J<4V;7&ME1It}^oVtl_GBuIH32+!L!qYrYqC zW?wcg%$f3@&mq3o~7T&8{lc1 z(8Le$1v#Yfv;`K_ht6{`jz7R;A`T02INHG&`m=+dI*dbV7>BhmGI)L#Ja1X5NOD#3 zia+vnp3htyl(Q_3e%g>e%NU#K8d*&PtVxnpMw5{}Dk7#0g zj+R){Hkh=iH{8K7yO223o{wY&7xv85%_RK;SuFOd;ZqoCzWx3=k^=tf-8a}9Sg=>a z>E;G{4jt|9!z3>Bvq zTry(}ITrT&{XzpmWAiF=+tk#ZQ1Z?VV$vifZ2$?WR8b7gfe@2Hwq?BmYDKajLpEN* zg$nju#}*voKJ#ZBAAP41ZA+#nJTdwMSakicf)WK{^fKN9#mm5=1Gvrvi*8XBjyKfO zhn>#|?PjYfV6&lde}=xE+1~(Gl$%nHyDj4ArPWb>Wt5jjC*{#eJYI5tv-)e*|E%^8 zYISdHuJ4JtNHS{#*K_(`*5LBtY#kISTa`h9n2#v;d$ndPm{7i zlUmT^|AbG_WSmY4O%mqopASX;lqf=d4=A#3R5|XQd@w1VJ@??+gKNv1zO(HQx81FL zfAHfhrMhAh4WNtqkV*MPVY!3M>D9X z@g&Rz%r#LQs2IjL)M|m+r6PArwQpd|03gdud)O(}MVqfwS^=sr93n9k-#;|N3+vDb z=tVpA`4sK{grfa;GqQ%FZMv)+cgs+)t7pen&W=fE$K|u*c)Yafo7=y({h#glgB`jz zrI1P0|D?vq?h4U5_g){L3hWlX03Qh(c5aPiCtn-htK7dPmHX2`;trL^8AM#z3R-+V z6nH|+O&kOYw4YXvyDvOw6Gu)xSpQ)Ca@lg%2UT?SU_HyR&e6TtcJ4aZFxi+J zcv>Mw21iFL4BV{vg7M;yXyPks1;@>`;ELEfJ)#W8E>Suw#@2J&b9^-jqsd`xo*SGD zVl77d%^>@mjrLnU@!bnDZ4kW}<_#@=*c{$?)i>QsxiF>I|rNe9DdTL={bC= zw2)HP0fBh&IZB|hJOe^%P7Z~Fv{8F7iXvcJ!|N=<&7Gu=-&y*bdtXj1Uiv;+tVzq> zK|Q1tE+w0}G)JkUM0|7HGlUwgdukX0P3ymJP1qtZa+|Q;3WSASBx%uv^Iv`8Ur~aO zWApW!LJ)#u|BG1VL%q~6GmM5BpD5^OyNP3`W$buJW`23LN+^3f_YWi&rFIj{%HZeI zO!i`iPU|S@pBLG&92Q5;td3k<8M!EpjL9Qocziqj-mQ0Tef6a~FDZWDD$ORf5-Lp( zO~Dp#fE$5@UQ{(V86-yAMH03uSfWo)DFTD{!PyYoBwh6xZPq$%h|IJEYdSzn%@_v) zu|6xngmQ6oV=-o)QC}cyz-BS+P^rA*#xKv_2ymAJnD_<^L71Hg1ZWuGkGA!odDMhO z4y^(kJn$*o+E3qVM95o;i_gu@VHH&f;>t}e2qpftM`4Ym6GF*EARN}(fbd#>q9Cm7 zXrD!5S3n7Be8g;88bA_~z^IALwYRzU6~P~Tl?qUQ4&Mm>k(^a>NIF!EqkcqJZ;WO#w(mQ#uHWO9I=XWLCC zifJvKLV9JJD*7~02EsE-N`%%56JkA4YIp=Qtm?2V;n9~(jv2i;**=+}DeZAMv4$-X z((l=T2X>)pc^j;`Dgh>3;lMQ8P<~A511WYU>H*n+wFt^XZ2b;N22ZdRy85IdnGW_u zT`RCgONHvquB1V|Q}-I6YzhoLQKj}I8ZKmv^&~6})RicR3TmSg4#ikEvk=POH`04T zwuI>lvc%JW3g)dE#iiRH)R;PbO!Uu5Ao?XhQGou}!8{6}YSjzHk8J@<(Heax@RU8O zYZ_K-{3|v7~8TO11lTK;R_zxIiJr={*Qa`zdj;S6>t@M22>#lhwT#ip`mEwBTU^PucJC^`uM zqQQ^{B>MrGZEqdt+P`W4ntl1wy&;L)Cv*E&xq%gKK;jO{95&akd*p(FsOr)oOG^5Z zMwkFBT`c}e@grpf*nMQR`{YXZNpa|u)O}j+K8+!t#7)WE)M6=YQLff(SgF|{`VTy) zAUOQ!^HR;YTr<8{7-z$!`|TJrN$W;s+&RfCZc7_M)Ek=t;wLj)g=N^@3(n%vcx~fi zKen$2ud&Szl2>o{d;{sFduo;lV+D71CD)uC? z>vqYzTlVf2y}K3cdR`f5<8E7ZZ&-0}00y@6q(uzhTn)!o!nCIEWi!LXM$E?v6iX+? zkKzI?TfvqQz{L}|dQhT&`ho4=6#cA7912PYugV9n;t3APJtMnkME4A!(Tj%{4?i-- z{qy0|;+cRnJSh)Prp6@B-CCV{d1dZpJltntX}Y1LiB73LGt-p9I4K<6wCbb?@xW~I_du*}8NG{>Nx2!a75x1Tdhfb4=V{}X$4~o}bkQxQK zQCK|u3s2+Hx^MH6XN&B?R;NW3_4kVIkBZM7#}W57t$KYcUf=S%yXWL}dnNBa*}G5l z?u$40-h26-mth>bVVm5r4aHm4gffqNYnRMlExK*HZF^XSg)x6@ld87KRd{c!s80z@ z@@|v8+eGg+*!F$ot$SRB)IP2?`OcUzD!O+Vj?{iy#u&-jid+FPwI<%sxM+_zfrV{k za~00w;kc(!Z0#1Ym8+*a?rmB1u3z!4Up}m_i@?%|N8Ywo?}iochUKf0cZclVA+iHt zY9P5dW*I|5WTV>$-Th9AWz6|iwBL<-Z*+~ zeB!D!a7`Y#Ci-V^{5(33a9%NwP!unjPf-+f!o#zcQ39*KWFDnEI*Bjbz=50REtkoE z=LESGJbeTgFW_e57! z(%eVMrglPd^0Jc`oqP(D4@&mqvi-PdKOV1d%Yv9IDs3_#=Hf2*ZHI{U4KDu*bCSsS9FluhcF&6JFx28W#0r^EFu zrA-6?RGgF+`vvj&S#jM9IP~=qtm$Ue)Zc{v7=vVACTJzL>$4ZVEeeMeYt1FwLx@kNXd6ZyeNqN2oA|T zC%flFcIf#Q{Zo?ritN53y00*Pc$RFvBtCyjT=xxV>-A8kb$7DZ`Jyse#H zFCHg5$vy=SSyr*?^shMm%dbezy|Qz!=-dm_Yd|fMh49{Fr4{{AG58|6{;1@BNp`;^ zvO^~bmH&QLS$bKS_p&nYwSX?JTBHH#PjyoYTllkK@#N4?Pygv@ah;$Xk~1tj!(zt4 zz>5HLMwku6LQ|uUgaL8GzWXf_cR=P2KmvH^s1mE!e|uPRY?2*l#LT6qVHb1TYRk@* zmYq_|ZnYG-)oZUcgyv=SL=IM>U*X7e!0GX;dtCpk9M;3q&dz;PT1NzR*Ky-SAj;U*_Q`c9fu8S|kq^Ws%YF>GcdX&T3 zq%MISmz*bLCvEnPX2FT2Rt2R!=6H3_{l1?Z`u-tt@Oi0kT<#l}s>fjt-sur*@WF9h zHu>&OiJm=lIQKlN?zHM@2YC4aFIDrZ{~?HWXbLE6 zei2ZynnR0p7?kzIpIIOD{51bh^TnzYI8v5p>I6Uc^OGakXHGhKMm~8)Y&(ZT-|qBL zbz{6{%U%9Yg8woo?i-T2hUKndsb(00qZ`pFPAOewcNm`(AXT^s{}`h5@AR}>@|!+f ze|#rS(%K%^&`#4zw;4ApJJ%2UtpB#ng6n_VZl-IWAJ?+Cr|49Z>F15)>E})BPdlxD zUP_++++n6`rkZzR`W{QO$$Uq08<@_du^QLPy_kDBt}8UVJm zsDS}&_m#n#VFxV;0e}n-Gk-Y%vuuwLArH$yY`ld5T5~Kn;;}n}acVmIl=?RiwP9IO zuJH0cQ+PCag0W8KkI(;1;lWC2j_?YwO&|tLNwDpFVXP34l!9d3>4wKKy3smDn&AU;LDp*^VpOH;G;JH`@aa>mJs5C%pDxV65ZH!ei zFswTV7`BpcdllCpC0K3;ZjG>}rTQlKLIm2o*eodgS9JP9F)^hXY47oium9Y$fDDTTmC3wgi z^PojIHD490O6Ax2>Qq4FRj0;ZIiPIS;Nyl5)){TUKFgvyf+oUVo;ODgOoNP?O>dme zng8{M{HKABQA!;-+mTGrzAdAaXd{lpIpf}tW5J9coRAVUE zTU|IBS*w)_6aoZ}QGc&>EV;Go)U&aLHRjNGH(!s|cVkX^WdZ;<8EBu@R)O}L-_7H< zWN*d!t)NkTdJc{0Ay}9q5rAVGVqS2ppI~A+`mi)uYOD^eS4FHL2aj>axWHqbu?EzO zTHc+IN-!b19^M*@MYTc~&*%@opdP6L}^3FHq z%*`%CZqnLhl-%yjRwHLvd(tV1v^6Vz6u+1HB7Wby*7=rPEnci8Ym3)v=&4$t(o?<0 zH^y2~)?bXZruInlZL#JYJy&LHoU7D(So-%HsFn6L^4Dv4-)y7@-q&W@^fi2u79!uL z%EXm9X`TVN4Bd?-d(q`I+EpjpgS1|BJ|~S@jk!RN^=W97_VwpLqqGn~BaA;V8I+%r z@7#TPCcUVpXNQ0eq~|fnKS>!9yqh~4`iuJ%|Zu%5G`Oc@8S=oE=Eaj5$D(D zjQ4PCZPt-RQ_M6*OUT(T){Hxkb{E;CU18^AU3fG05KAfClJsr#gN0VbF&8YJ*TOP< zQLG91IC7_WzCA)P9Q6lSyT0I`KWgMVY**!r?9_ZBEjqY9)*kcm$37S|$`pXtyXemt z3M9K+TT$iW)#K@9o3q_blMd$B@hA9`hFY81Y7WKL{l1CXV1C%(Gm|Gq$PPSz>Rojl z42bfcBsBob@0(wba_5rIl2`ocNN@5kw%(YdY#f39;mjv}L;WlR6T9ZuzYMS`MvXWp z;rqU`(OopL&w#<0MrM=yDiTQDd?^XDQm2`jUu6>5uk1ubfZikom(4gU24>m3FM&`5 z8ofogpGX1aax*IYCyA5*beZ89R2v2wTEHLmWyJ&OAtV7rId(<-heWFg>yh6~n96n) zy!$i@3fTa>v(R;E0N&aOksZstczSg8^z$pHpO;QwmQP>C-P7HN#MHrlv0iE{R51vd+uDc!W;U6jkon;kwWa z6KEY<3#P($ahGBY=XWh{RKp~cVs@KlDLa-I2DPz0v}#cMQ#Jznhu@^Kp-vcO)4(f7 z3al4!e(~~zI7-Kod8zFWik3Gmk9@FQc>-5y3I3euUZHcYLMq@@u{mCrN}-dM)|hBr z0??DuwB-QWtIlXmMv)E$V3Rm-0~j{!>8I?%r+LSwti|f}SddRtYS(J{m5N6qn?bw6@H0U>4~H6L;YL<#b=ty83<0pY%0}X*yvIS(9IcGgVfV5{D1rp+Gk`( zfPYGM(G9o%fEv6mVt;DzvS*KKI&Bop4A29r9y7mYp@kZ+VJ9j5|kCnF#Oi;=z6AaB@ISFzIlS+np%;`sH5<=2Ge7nI{3FP^(7j=vzDV@LCr zyM1!=4)yNb3u^PuK$Y0+k&ux|;YH8C!B9QGbhpB(zV2e7J-y*T zs!Ut(|1k&Wh{=q`15HPf(sYoJcG~o|8A^v@wk5Y^E+5`F?yp|`8aJ4uc_`X76~J%yLB*QXN^wC{dKq#8#=|1)Y6&?tf>La zF{O5MYoD0cMr$)-MOQ=uELHF5rsU_?U{6~S7r8PE+^hnq)ez7CNn&egYzf+z5ul+B zRQ)Li|B`9t+UG(H>4=?_sd=n5E+0|9QrC|}*R&D(ax4sJ`EFqPqxIS21m(z|y0NKO zw;0~8G@@ac9UKSZT-XT)%_5}?1;()lJI_rMs-6Xe`k5$0N!x=@5!7QJn1R5+%v&u)rbk2ZNzW?lD5pVOxz` zdqOcQ$3W*(f$&-mdvvVr;dyQC0yQ#fjsZx|BFZQ@bjo~+~4KCV_#?saaJZ z<_tQ{aOVB=ED1JWrCSC{{~fye5;+NS7RY%(P9dB`!R+O$0B462`GAK*2uWawP8#4uyBfe?<1#&9O`WnRzUF+MZxf_QWJ$Zz1d671$u4c=Vq=a&EN?f3emSA z4Zohmrwa%1UN}L{IdaaD!-na^lM2@z##O?BeSpc1s9Mrt;X1vib+(C8)*fqbgyZDB zJP9G!znG;jPLeZ3&M^726A)cv=!8qVf~cp5hyK$fJWrlWu}x{p3yvapFr>HM_k89QT0VeJCE1M|4MiD#JrjPLd ztZ8Ip3t;Y9ohKMOdJzpduZD#runm>}dzNyQFk^fWTZxX}QULJ*WHh`1@3~L$Q_SKE zHTX8#{0vgVD2WJbVEhQu)MML8Ytb3=qo*R>&852uBoz=nyXbK4dh`kSa~-3X3udfB zG;>19vH=+517l*#2O|u_~g$<7ce{8ND1 zo|;vUZ^eU!1-I_td}r(wi?WbuDj}Jbu~ZU-fKV@obemU9zX^UdL+p(UtC_QumE;SAt3qA$+&a3J!b2mtK-Dy`($`Xsxyq31UtKU1<*1J-`fh+lsSoXsW-M+TdBDS=ef8TdlB-j8bppd)R(k)tYc7Y*(bF?3&f;iMDsbxe2$sVg%!wN(cCYY z`M=Wa{ReB%31q^ zp;Fx|PA^K+i;6oCrRiLMIViq?hypfR{#civ-WqIWr&xca4v44VjF1E0sQ6M{zX2ka zd89JWQs!npMDe2^J*ukzj=);_Hd^-iTK0)82c(t*V#7hH;hp} z@baw}Z?Td_F&`?cn^vJ|V=s(stKP6R`fQD>*`lpgvb8c>>qncF=;q~W1t4|B`=CUE z?Kv)Xk4W7kii1Mgl^YvZ=6zS@aeGVOPq6E&`T@#6UBZ3hN!EUP019_d*>!le_0Ky0 zxN~h%Y#EkXhMDUy8A~b5CW*|IT`gqIL4_rxXK$8N$d2>tX686g=I}Yi63xR^-cBuF zX^nVQL7(A`IVkE7I}S@7qyqyE;S?!L-%BY2g*(yEC>5q|!cj`ynh#S6#TcfF4z0OZ z5fr?U0W(&4m7Ruwv~J(?bS5qIxgBq zBpXy)j1U8lX24|5#y4DIZikfHv87ATD%=d@g4K14)}4}dC$sJh%f?YP8(b+&=}}~Z z4Nr*s&r18xQpy6(?>+ZBxLpJ@4pMpt{9wolUBdk+cFKvC9gOFM6+x>?os?gUxhCpdhrk|9}}(Pk`;67IEMPiJ5b+SyMk+kD{ow2T?fSWgHroJX1k&o z(R@`hUuEX2G=w>cn*{nJl#kT@6Kr&xog4?1`cL7@RjfQM;Zd-Uk&2tBK@Rb_I_~b3 zpbVm{nXZlxA?d&J{+T~Kd;jc4ahtEWO)Tz^iaTUylU&*$mq2E9ja=SLw0f6p-zFE; zZsn$x0G$qU_t1xhy6n6qLCR}bHHulSQdTSRBy_ClA6cv~rM%LxQo7p1ESTooB}+Rj zB&-_s86c0z_Uqtn=s|>y*g0bP3iYXTqIpU(Pcie^2p-V83;`@eiZ$g9< zJ>F1aW2qlSm2ih3w`8%@M~;okn)h_z!S|CC*2W(uNR^EBaUC=C7pIR3F5Ki`32r8 z!f#Sszfg`4;Wt^Mb|T(8k|N)sJ=q6#ULPkX$wErR8&l`QO3#}*PdjbuPwNvn+SFxi zY(@Y62u|M)It!@~p@(y><)BNrC0h9QVw#W+#J%ovFdek%Eo9CUU$^?ZoD{HW-xUWj z7=hsC@ns3wLJo8(8w4x(3pnl>_;HT77xKL(?#Bk9=ea^b92{Vxwv-VI7ey%)fhQn- zs0bbH2xaH*D)uI;=_(N*rjOg5g!Mq)OT7uovrAcvW}z%jdLqO*3uOx^BlGF!?ewla9Ok=~)qwG|xa0tlmn1l8LW%o{%{Dn>Ni#Js9XC!VlV(*Z{ zF8H<~7Y;Jw*-3t^cs18Xv5;S`?xEEWL)GCFga!0J_YCwKFJzZHm2Cy*sPa~9mZg_F z14$Kdn^iGhUvaIzLU2~>>#7*;syP0!zI-7KF{)|nT5y(QPveO)M~vgs*qk|ZW1)z= z#u1l8sc}Zg!&8A#s6r9jnvBw)uXap6Bu7fyrBnq@K_| zTdv~Hl@bN@JI*P4(N2oJln8AD`qLG!%68TqZ#KNa_{~a_gj9#?*d?R>jzS6j6vY^J zDBe_B^W=rOTa#)KwNVGRs-EO&8%C|UA0smm*g(4KXh&qFVXZ>U-y`MkxoegS-5Z5< zzQQ_IziZtf7WPSneRnhEJl95^+n48FDPA*(c{`-M9e2}YXTyfG+2?F#Ee9U?DPPPN-rmRz)?i`n~JtMdyCWxgRgZ z7jk-)Y~HqPg@irxHW=A_;LH2&5B=ex`$$ZS&kh#)LD9ZXvO}E10T|hAkUGHt$%0$N*9v z65(;HJlmEEC7EvMaN|$o6lv%lA6*KEua=mg8P3IPYA5Bht>TiVQ3z+=x>Hv_} ze?EE9Fpt^~{D>9mLB!;bVbi#e7{Kfe$T_+L-PJSG*Xgid-D!4S zzj^IEq(Es7tSBw~!0I1ip+oVw+SqYa6*?T(PBDx66ok7ROnYorL9ad{l;OGyFu|~i z95BIry)In4RCuhBp(A7y2dCvg`O#H~)?a1x8ef3xq7gcsj28_k(F6s!1YNG`>8?^x zv%7mUNo&#Dh{yAnM7~et2SoUQH3eI>$)iWU{b|qMglwVtJ0#e}pB}iOQ>y1YufhW# zu2f~-PUj2CkYQ0y8I<~(#4*Ui4s}O+k~G=|2eHZXcd$jTcnbmLA_I@o@bNOzgq?1= zuwMrA~QmI~|3ARJL~ zE}(X(Fn)L6Hhd=G*vJev8KWw16Fo z3c_NK=MgJnJWr42e2n|93}xM{En7YCcEm9pr^GU& zN-Wiz2p*yT0sOqW<*=F#tMfF$5*n7lcVf`u%%Mt07l&sgVqNa(f`S`5u8sN$_$JY| zhQ)MmI{2G&yy>+5hq?mYa@bc;C<3oGb*T}tWL&rZrXhjUPl4h-6EIvU-i&U%lCGhW zSk4HgB4qPMD9Zs{>2>h-WD3?r3;wh4pRH*F5o(P?BQ+E4q)_yjj}zfH)jF$D&#I;`qH+QMdFo--H!9Td1#IK-V9KiCcP1=J@C9B zno|d5PP-3LKW{{6s8i9!=6&=+c~7XUz1TSb_k{6}kcV#vr{Oag!4_?c1&f8?jm#HJ z-sEtu5C|;K_d@NW#;uq*1ShVbwWkS%VexBQQ2~@H#croX+7i^1Oay}SAyrxIUk4$*Ra_($Q=~+SSM6@oe?8WY4`&Ba(=+KP$d*UaBKY{4^4sR=%Ljp z)6B^B5|Pp}&1_sM)L<{C_CcLi`59(na4;>0ns?|W5Eu?Vq-<~5gL-Wk@EVrK=3??j zlos*R3k_e>FII$eE`|7(z&%y*V4F6l;47?L4pVRwN|3g`(9%%?6F0%ZRk#*NjBlKV4$@J{jmbzfQ z!dI!DG_5=O>Ht;+dSMVeU)8ZkQDGm#gtY^N+3&4I>LOO7Xmd5{7+Q1h2*%TX^_}*( zF&`jb3xFvi&V$jMio%dE9H)I$Yg>S_8jr!rMqHWBP|byG!XXV;T9kx^Xk{DN-#`3G zVJID(lg+eP_k0~V+4wb#lkLdDU;rq1duH~+Oc095g@d1mY;b`jY6B~%e&NpX-Bn24 zh8X560bn5Tg$h&K$GwWG2!ezm7{Ry{9C8D8M!ED|j!hhjDHRuzc|CLU4P4WO=O-wd zLmvJ~M*vO*ZAWXGk6rOV&S5WYSa3(dJJo!KrI}#5#ABh!nsXsL42P-i=zSa=U0_c$ zutmZlnb@2xrPK}(`4tfwHT(&OM|vjtK@P_rf1DkaxYHjOS4_}uZ2*cLh?c|eNc(}) z{c&nArPT`W3~dj@-jks*Rs|8K5{NjQB?my^G>s(vtB7WfwwcsVW`zl%N&PmCt)Dow zna~~Np!iSd(;wIo4?w~0A;qjdtBB7JI`FUJ5hxcvhqrpx;oEOjGpjH~kk;bs5Ti|* z^JhlxzNV0?RjC#QH#ivxkW7!#sNqiDe1;Ug{5MoIe}$s)e3No~5IJ5bJbq>NnP<>L z+)%U(fzxv;q8EU356zqdG4ST6n;IK=8{z7r6*IF|LRL%!= z_?x3?R!OPT&F4aAQ)6|P=Nif#W53dw!K1g3iWyLym_DQmr9^oC4J;oggO`RMbuMH$ zuaQ9eK-8Q~fgha3;0IOk{OafsHa{YXh4G&O?SBOC^c*E}o0=$fHqS4KaJc;$vi+3E z6p?-+eE0kRBHP~*`4b}l4~X9c{R-FS6j}5Cfg;NyLSqj<#PhsJw{(8zPsYLnBKkdZ zP+ouYn&)La@SC`P2EP%*nm=_fI7d&Cz6K9w1G*{)YW`$?;P#CC|Noq2|hb1u{qCEwl z+ajI=ey=nazgc;rB*>qB;ikuf^Kb?4@6S-u5_qTI3`qSY;PK}spSdva&!qE$Fx0;? z&=@H@NksUpnjHvCEQ{(p1GDzrp{F66iUW)C1&Cp#dWu}LdS1-$l=3_8 z?hBn47p(S*c^y(-$K65M)x6&sl}p;0(*3AY++O z5y(Jx74#au*RuZHTRY#`soW{_y(xiBUlpgWNmJLt-4**|fIqp+U{JV#2Eo>+SRWwP zr(i_$X~}$=nNQGnSkm(Rw4ziTA=_ucD?Djc! zuO~fBd?%9~J*Rfl2 z>|WX@x9w!kJIvX%{2Yj4)>}9FPW$>!vojZ%a9KKYgH|_ZwCT-ioV2*_r9^+xKR#vTMI1&U&R;Z@9Z+M~!A3APgWVT!<#>fYUAO@s;(g zH;83NrLv=3ivEOtO22Vt!FOgsww5pVNY=`gq}9B&qV;Q!jfM$50P#dc%lJ|zD{W&P z2Opk+-0#XZ)^?Bq1lo2`su*IHGPw$Eb%=Eg!$?(!n8k$`I-9q2*;xu%8r-a`UlCrr z1_qDS#0Qyj<6gO@>Gj%g)w1>hv1U-J8GKYrLa=LhOSQXY{;9Ke7+*M|dq{E*k#~2i zTvfZ3lUfE24v?h-TY0)%=Z3Y?XRTa@OzdXK+RUuY9OrJ#?UrpVtIvwI?abB!vuSHz zD-~@!n5|v5)~)Kn(ZH;AFqBRJLd{up3YpdNS)_A<0qp9YP>ftv_sMBSvL8b)KnwH& z1o&}6BGoZk6_nmL|6#`cj1Aj1pKaS}rlOnR?tVFc&uRfvd` z6%HKH;*u;bw5H8sH!3|VpA+cvuok|2_{GC=W83OAsc|o>I<$Oq`Q}5HTv@v^Bvp3G z?)sJMl6xmSu=XLTaagX|_ImZVs#)va^=YwYNU9lmp)4Z**F;Edgi4H*q9zmyFBwiAQyKl5NXRXgjn5J>eC^W* zTfl+!WM%^+$pO)PP%KKt6Bf#jRDQETRzmu~v_RZo4 z#mv&H7#VWO+tDRSI=O5)$U65kP|HEGHw5iRSrb?gj>5>6Y}wMe@|-gK@w*N*;o^+D z!&`;A+`PN}ashO_B&0hySu)8vwpWU!9M1UVSm|Hw{nmk%1M(4ozb{EgX4sXhz9U!J zk*g~v*05W0?_n4*g2waw(jnPex?y$utZuM&t(sP^OO5@C)R%`P%2l+UlB}ng^%OAa zuN?i-fu;VBHZ!YM%6yr1EVB-y>W0PTLp!OMV2%48Hj9nJWaUP*oRutRndK}Br^p2c zqpx(n+POR-7PUx4EfEWb5b$}N1D^vl2z);Ly}5@?Z{2$57ArUmBbtv$<|E8}gae;X z{&}cW<%glVozn$e1Hd0Qfx4fzLOvvi)|=$tK-fxw$><#o++DL?K?hDN%kQmOM^sQ-w5b z%>cNdkK@-2k?Gjz3=`F!t~nG*e}ZVuJc!c28P7}oNF zS;S$U<`5rj1rg8@3qo2#{zJA%(c^%QSmM-Gu8!4iOjLcy*{Zv=<}&x>P1NWzXTL)q{~goc1;U7W+VV!;+FbHGOo5WH#nBkU?h zKuAg!9g9wg1uh1J#H@jflzEH2<_HK$xwj0ZW|;V=#Z0uIlF%D)gsy4tixq&`l|UHw zp8?ABh53e19xmGg_Be<1t_KcnoyIDU1zJaCvJURA}Ffl5(p(%YARVH%GPSKn$-FH|l& zLS+-O2~{|}M{2co9+9V7h=9)LBDCqx1guz3uRC`M%Gh zw>9t**%qU>&BQIm#<->U+m0VkArKkkRlK=FNmmmeMIaDAs%7S>{U&e8aPRwoPwWX* zClLOXiv*u24Y`GELJQAvtG6x|5M*2hJ|Nb|kq`)PIYx?VjQR1>+@>A<(L35{r6qL4 zNWWE0zx7_tlJVYmT0mxMb-Yaxt#NMg(3;5FEz;giPcEti6Mx?Y+ z^S!i9*e&DjFN)uiE;;s7xvy@)z6Szdqbw!0wGu=>U+K z?Kc3K#a`3x^=^y#?T`*2UO(Vi1B>m#ptl_@WgkFd`@K2jTR7m&=huT?E58mY%65cd z0vY3Zo^VKs7q-KfQWrbCHhiHT315jJ&o#(%N9@^6IO=T^j)ewyy#F{{Ml>!bqWj@J z?VK11;60+QrK;n;cT}^kjS8NLITv|kDI6GgHTq0FrN-~cIK19d?M^@VqrgtqT^?Ibl|L>W@~U}B!&;i=2xdK zKv%m~?4)xFz?VzciRV`Zo_Ut(tdfgVSCC^|j9Td6mL`o5hAf<~_p5ZOS006=K=L9I z_Hjz+H2rH7s6HxCh-)_@!N3A|1}F)1ILt9&p087au@|A^kTB0{bo<{Ep(^!!g9v?l ze^bxVATh)QJDta-uR(V`1Pzu&77$PZio{Lz+}2s;nMI8L6!kcCR)8eLgo{_F<{^uj zqfP#Idf{JyXs|zoE}*Z?4?Y7tS*Ln(3PhnQ_ic_&lY=MAQy1pJs2vMe_8LCz=2To+ z*ICBR!>qNYwb3^_l{-)l6#*;QI+DxbG5jDqhFn7`H{PlOQXUmZBfuI?;CezZ3yv`f zmfu1_RBbz*Xe3npMG*l*Xh~<)LT{{aV6|3{y@O4E>MBIx33rs5jC^-^sz`=tC|TAj zr~CR1H8v<8Afd0-3r#Uz3ebr1PSsb$JJPD^oL8o&pP^R2kQ1Xp#c1zfKA*ygJ;#Tt zz?ERiJ~mbXKjMm!kO1~A=yicI5gP~>1FaIo!G*ArH%Nde@E)&I8_!eQcmVaLBy7_2 zAE|}^F_AxsY~};uw*Axghyb)rrVc>~4nW%=X6fAW#q~aLrF$k*Vklo|z^>n1G(=+OulGZ2_XFv3jZspl^# zSL;OHqO29g%?SaWR4kSfHxe5G!1BD!Bg6YR(n_iD?~>a)6nDA;w^BoYd}P3LQV|u3%QP%vD6MmK(w+?_EX*9IYQYxN+g8mx=FXcBoYhM^}F=INyYGgldYdf zJdBs;d*qLcgbg9Qk|@MYdT5MFw7dJZxa=J4bKhDnqT zLBYasTwkGE>c(McvF}r?KOjOFG0#IHKP2)aB7a5XU6AVSVFDrOvm{LJYXlH1?xKQL z)gF?+z*)LOI55xu0=F=*lG<`Tzar<{K>cV@U^b0&IQ}a~L3ydoe3CbFe})q0q&moW zenP2`h`dMSKNHy?!U3d4vITKn9+_@`N`x;0){zZ=Mxb*}Ds_<)yjKTSh^&VIS4C)t zk_g48=Z91Zw2<&;sa`p{l~S*Uob!PiYA?Hf4u`SgIUNn^^?rxh5BgWuxP z|3(mCz)Tg?`U(J25DPk`f=-D442l-{L{L~Pz*Rh?7&86as%HNLuo<(B{>6oL_n%*T z69Q^S6(gEYO6HTyeDX>7vEZ}QY~MJuorV$3XC(6(WE=bYgByox^ zNGUBImvA-cHBMm6p*sB`t+K|I->vo1(glxv#tPZ#4nH?S?XS~zE-?+KrXLY zX@70^($H2yuRiyRUM@mO?JDS!9gV;Z6_>r=v`cCl*k~H|H4U@z3#@5aY!aj*IMWFOXaLhNC&LY5Qdy5`l^2Sdv# z=vi(!>Pzd_#@T@hwv&wPs(asAFFD&boZUWWx4f-WZs>sA<`lyGC)=A=kBatoW^aP%MbLCV>{&D2r*uXAS@S?e&z}UU_LWarztts8T}1oM5Mfp62cKG*4)NZYph`HO?{N z8KT^Xu6fBd&$vOeZr=Sg-7ZuG69#tfD$-CtLGM!Nf?lbQFef~qDmcsQ^DKFVebe5$ zhL+jM?5+RjNADK_r$!?|I3>ZZ=2y+EVwRnlA_{Zyl422UmnGX}rZsTnm@Om4M7X_V zju}@&cT`MRgTfsYVsKXg zO|6CuW|+q&dI#in<@~|H--E!_0nt1tnFpD95RD`~Yr|aQGuNza2d>@REt$KSxf_KY zA1b2>RuqM)KXJ_S@%S8`O(ijTl7 zr9LXKKMhK>qz*NmrI4io6(zbnAX;lBYc1mjsD5~GAbBLWULlXk_Uqtn=s|>ygEj+! z!k)Q;Rdi&1hS`q5h~}e`8A8~OqN;Wuftd6~=IA1GViD8-re!Z{+`~Y*ku5tQv5A3N zcF2|6uFRQo$vwo2cpOv8RfZu_NmaCHGD&yw;%1py65%4- zO>mJ*`zYR@rS){2%{2bpND==$GvRDb($8}!;-BZ~$)4ZWhMT`mPrXoN{OkPA3wg$0 zS@f{~D$fL}!FZD36#9<;AOk3&FSLB2^Avo-8~|gY*oEc?Dt# zpP}?ouKX4gKP7rIF^<5CNc3isH=fUE^d`h%#fdcuO-3!>Y~y^*-#3pF_4=$2O$9UD&HNfZ=Xh_*z4C5a;@ODOgxp)N|k3`vsSOpfiq z{!$3F_=MK!_=NPu=o#0)1q4kHAHq+9zr1Kc3DAjN)DI$_xTu$>F7eVRpVU__ET(ZG zgjrE9fP!hierYO1jKM$ zP}cKV_s#$nglkAJ3V&jG-f|s+#ujl6J&D_b+>zx0By~3L8(&A?&@EeIm58>tYGd#W zAXIFutY&1;hFZ+==6K9PHPDDP;W&ve8y2nCI}u}S0Y{n`y^$i+tsFD`8-?^*z1b>e zI@@dIV;8QWlr4wh4?-mrL)_kLz(?nLvzLPy+mP=_1S=Pyx1Z14)+Y$Vt0mluP^alx z5jYJzua6!%QHr4qgeAip5qdHIZp+=)iw2?L^U2=)sByw3R4f*d`^015x(ma_F@lGo zFnsg}hTHtb7L;Q#+Fwizp0JIh((1fLNONO!n(wvH+!0E)&=j&`t}%bH6?_YX`i_ZN zgeWeGw}sCotsDW~<}JYd8ZlC01hWI9-@aIkyp>$9^%l$(V&+P{f*y^1eJc;&!Ch#T z2Lyz$9r&V7#AHO6uEi4k7hKPTj~yyj)FgDPu_XvQ6`Qxnn+{a>uKUK|d|2XX_U6WE zOA+EKpD@bq=DDo%79+2FVwB-~aeIHyCxrY52*EoTH*~M24Mqr4L|S6ZKEjSghd0;r zkC=t}Fbm~IwJs-G>61obWfpSA8gHMJ8oV{$s$nk|wijzA`g+v({qLVJ6ZL<}nP@;e z0-}CV8WU$0%}+5C5t1`7`*g*geY_4Km1DRa_iCf^QSpR%Xpr~FPnvs9e2Te8w@fgY zs2{IG4PO&hY&$~UE(a0q+LcOdRGF|(Tb_%hK>U@WoDQImmd%Hv4Hu*6408@zg@fL* z2s~uD1|?b=@G2Y>x*iN^{UQ(jf#*8i-4;kXAI3Nu)zTwU>(YFil?#W2PT}x_BU;oa zkfIgnALXI=LpGFVqSpcR_)%>b;F>Fz!`4$_Au6?L;7HM9K#Eq)lej1KceyfP18TqO z!EtSF!L#6A4ikMD@EbX|>2+UhdAd1pVua6tW^h5c<6vUV;ExFZ#;A_7f^QN=w5f#% zy&xZAD5Y58odCvI(-OUAZ!Wkk48kbJ`IEx2`w`#0z_FhA4REZnzgxz<<*~l`!rPHB z{&_0F>hM$t?AqQDIihOoc(Fzk>#5Hu)>=)hr$3`uHEWzNwnpTnK770v&U{AiY!D`d zv*9s&Bi0I3Q^Mqve0UuS(iZ;C(cFS-r!Xa)56m;d1;YE&u7DtT8&umgN3@e$r*Khe z53pUjl(D!Cb7muWb4Df*Z=*WsOBrtU%GK~8^KS2nK$0MuWH+zUME}= zt}iP?Ono0^}W;wtY0kRxEgW>64MKvUC<9R{TS zD)uj9U~Gq{u1{SeG#UrC&60Wx4mb7u9sGMZdU|IRjP3aR^fS(;E@vM>z`~(yB&Ks3 z2@T{JLe3QVmw!*O4Io8;TGGXDR&hrhxwK%9dPPY2QI+SvP+&svEp$ft<4I}ma_%Qp z@v|52P->zI3(4^31Y83+=E+%M!CB>;oeTK~9C!*MvSy%}N-gJws@QLA>2fL+%-@G9 zUN8rO%;9YsXf}ON(MHY()GJg;e(BMORl#uI09k$+K&cvep$$ODA_se&r~Lm70;@Px z4qelLRR0kVgL*}-QI$>yvl*(`$@swSeThI%wIUWM(AF8NRmQRk{%X?<>aC~sS!fo?m0^Xip)1@g8n23Ym@%?l(!_2SK|=mk(2PF+Ia zy=9>}s?0;+Wr{W6Jy_y^P412g(=!h_bwHz`L7-mMHw1$Kxhc%vniZhY1)$A_hK1Bn z$~`p1c&O9|VkA72mWVhN$$ksNQ7PeVw56e~OHt%SDGHPl7Xb*NpI3Rq4ONvQWt6(l z*QxS)qiv?1Pv*iCT^5&k=a+88Sr^g8*jS_9AoYIH;5q!s0^r;=cB-!zbH^Flfljkz60JN z=jIadVyE*3MXin^_%@(P=QnBbze_EC2yuQyO+KLlO+G;6qGCC}Zspi&!hdQaK@(;?k!dF`FCo^{+vylO=B{zSQTXDyGLJS6kK1J50bD^@@i2+6d{}YB- z83h5P#z2bcfs4pP``~4_P!d()PG>(sY@xahZD=90OAW7}I(IH))L}Ramfg;UoI0m6 z*9Z{vr^p!Gxln|Tq0A*QhPxy+Mi0;|3j50lXMI_)gd|xisb8qwd-IvAvlmFSU%hi? z_7aVn0R={Z_8oXVMl>4rdA9tCzy;6UxW3?wk-d|U39JSJEc}lUCdLTtbaHRR0}<%g z0Ff`0Ma9QEUTc@LpC(-1?RfJ=tn>?x%d}6ac7-HmTo&|vEKWvaHjH>o)R4o+UmBG^ z+wu1;YK@IZ2OocHAsx!7l1+Oh#$R{ynxHl~W8ew*qqMln=&XkiuWBQ3#^5#yjb?mg zRhK4#euz@t6&1C1V2ub7HLlh~g%7<_8`i0Cg%qkQg8)}ZXi$72X9(3MFePHTlCMXpN-Iux*Y8ZE&|k|X+M>N{3VS+{*pH0FZpJIGU}nhC_~>N&o;Cb zH2)9a0?hmjRvn%sJm#9OFq|nkXU=5OrQ)1F#b_2_Gx;yneEv0F@sYx30^E<2qklk` zry)3QqyMb0|16sn*u@#Ke^%%YdXd)f1!17v7G&o#%>1%dZM2m3#eBZn5z zWf^FQ@cXE{;QQjTtw5eMU(T#k;V6>>bu7NRA&wRgO)j1ka{B|ak$~leZBfl{6M;(NA)(&B8`CVK+Q$#q+&SzfgIaKO@j`)Lv zO9R&d4!XMcy|XiH_S(kmv%cA9F(}Mo0Ksr_8PG&5A?WfU4JU)-I0>{R9O(j|N*u$6 zqlSOd>4ps_XuzQh9*r6V@;_{tCjWGS<1EyWb1#?aZWwnfQ>rE2C78_U8b_9tkFs7^ z)XCqzh*fRep&?31_buJ)g?!ChOpV{45?l`{V;C)=`4AD^4Sws-wOp!^-FN{l7j#v8 z%nni-B&LIP!aNJi`@A^&IcfHD>=c>hdF2Yq%VohGSe}NaS}>r}Mi2Qct$hi7ywt$C&{Ot8#I?Zv9_iU3K_T{r1mlf3oweG)Ji zHr5CBMCPgyP2l<7z*nQYxmI1b#(6FTma6SCr&W%U{e_o)x-zZ zx^s&BcZL0svl`|ptcH>PJddgK_7ib~EVM>VaS96{uY$0T#jq_Jq@pw`)BrxE!MzA( z#Pd@Zu5_g?ls`p0)%Edt31yU%=M0gb65%6EKiN3nAoZXSKcMFyC_ldj@f*SJ=J~hu zbc6`srutjh{8^LJ&r$m3@kuwu1&@cs$}22~oZIjO`85gC=Wkx}#Nrm@429pP*L^a} zpg&PzN%WMG|1u&@km|PhoP@uiME^ed3^5Uwl3N)OJw4#d7(NagF~j+-v~-?S+c~6~ z-?<8{Ih>8oZwK;fZVvNDA=h zX&*GH55hj~xhVbSXRh9aOn8Mk(VrCz6zGcnoS;*v_j0~Me;St`~U`C5U{X>M7UdS+oeh4N(vuVN2oD3YDKpNICy$c@Tli z|F0o%{%P3_KMiN$C$a^e`Ci|{kG`WLv$RI9LF{sV?M{2=r|=g zPA!=??d8h@_YcdiM#%eZqYcxxY-XugzARdrz+I7*|8m-kY0Q3Utz*6Y&E2rTJoGA8 zP|-3YSpcsm16X<>k;g^zh-8M?<&j4<_1~;`0DitIp3sDJ4-!fg39YRE#+9#KVUQT-*Dn!=klUvi347q-t|+66Snn?e_YuH$Ml9 zVnpk+lJ!|;eU^BH0?C;8UitdWTlMeMGuwn>MDtn6e3qHdZW&6_FYBRXTHPexEU!fY zxU<3A<%W=M5E9d#s>{k%#3#$vBP*Ag^@w61YFW0rxrpz=$7zXK2m!LiNk*{H&i}al z;mi-~->ql%^NJBI7bMFC#?43X=Rk&iCZ!^bLb~_M<`>PZ_yjw4oM`b0(K0GoMww-l zp7Gk42p8P!**#k+FA&l^amm zUMd$?Lh`h|LAJYOdl|A)P>8G)6e24s`RKz8oxOs1gyLJ%Gti9OXeyRpmw3n=V)8Kw07}NZ-|Zo$uR&W3i)87Gv=Pw%dQ@9 z4IO}-edg+cc_rnQlueg=!`1C`b+4UVAANK3;T6$!N^+gzk3LIP3T0sVD2dXO(1mXO zSVuI-)T*|FTMw(5{T2*o*O(PgUY1UxuE_;PwA_{~x0&TO$|#n4gTOvSibmL7x+t|%cG1{ z?_&96sF`HEnt|oLd%&=c`k|{r+0lvcTg8s=rGi2FTmpp)sBCj?mTzAxl*;$6pOwl- zmWJfAI@WlQl^t9TB*}&3&7$Mpk+nX59>} zB)&aI*`A|oIcquWETu8x@=t{X@t^;T zIl^q`6(gE2NahR7d_m?6-J6-ETe?y{-a4tb8v=X3n>F1Sb!(wO00g6M zEizYyQ8%|hk$ErMMpkQ>4H1)(ZN;*!7VQC9!%&rr5Fi+;a`P}qxocVNPO)m2RJ9B2 zfx(GFVEf0JQ&5a(otCWAjGK?%&v$}NjgLMdO5xC;Sm_u$F-o*_Otg+m)^TPX55{>; zv`$IZDQ2BQ1yvC{F&`X>zLL6SNG-tlONwAa7mq>=LxIVx}3{K*Y9yu`1>k)G}#hCq-p;w1k^$Z(5M-&Fb zFSm&HS;;=jqKrEHA|@JBb3;iF&xT@GhF>Zi@>=;DuvPZ0?q~UZiuu%RmFR%M?bvWT z+t#DpqPM~WdMhaGV0?xhG(O{{J*JM1Ps4bbNIE(K1Ufo0o>E7Ld*_C`&*$zF-Tjig zAB#28*8w70T}ua+6R2&G(vHeTj1nuO56rl{p8T!k)sppG(LE@+2j#NLZ@9na#^iKN zEZZ)XZI|oXS=SJ&BeUGL+{TWLZlxuXN)C|6=oL`40Yd#lB}RH_Ey`d^7a)(x_Uqtn z=s|>y8bB;x-ND7y$U}^3)J;Y63CVndnNMJ0UsZ$cUNYNE_R%dI!?evbl;XhD{e~_x0$&ND@xRUa8HbN zAKmC4^L3Aj-KV7PQ_3SW26#YY0ENAl+d;7meFP;TuHB+@kL29L%*Bt&FocG-o+8qz zJVFfEl|pQwu$S{aK~M;$pd~W6Qun-(vpV)4i~kgQMZmbaN45-or+j7RoAnRsS=Rxv z<^Z!m573a7lNFq)cGUWH>i# z_o|y&x?%WT%~o+H=WTWAitKj}$|a4fIjd!>IZ{a*=81HgEYd5MQgJH0k>BXcZ(J=D z^Sh<|?xh4d2W`TTRS~9bgb=ES@mg{^@JZJe>eG|jU68o_l!$>#uaDLdPcII zVb(LU)v??}P5IzQV1s2j6=G(klv%lw?aQoXnYCeju)-Tg);b_I4oZ!K56i?xs5=o9 zBU+{<%QUl0|8p?Hn($o;*$6=@o9$pVR*Y<~P{wM}-YnUh?+ypKWXIk+a-5Bv5RZ&X zM@Ct}7>sBhm(1hLJRbBkympNh48w@#Lz4LrGauqSwCCO%gZixraqO%#c9u1tBa<^l z#vEysah4JX+Z=80e8(}9sCz3tmuOjTuhIBchZ*+o8WVbxlD?Z{Bzvl!>}fqt+`L`a zUyjQUEj^hBoVp)5^tkzvGj%x0_@kPpVT19n?Cv2`!n+B2*xxm!4s|8Hn^`*4mh^6; ziCo%Dr4piH}zKI=4TCkiRbjjU$jxi zHuVYTOi7z2%GhSIp6n@u-MIO?#MH|P#=o=lRL|}<{(Yw&H-Ep|1gc@;C1^0QcYN>? z=*v35d-aRPc{l`qmr>-{NfBYf?3w{I((W!&qFpLNefE!yc#Dzbm$ZH1G`_M_RwZADMhEr z0d0KppEu%7097Uk$(#Wp!E1^GQjN&R6Ifipwi^qec<&{!Hdq5`;LL&*Q2b(8P7Aq( zY(gr zH3?=RD*~ijhU4FoFlQ_BQ3v5=? z*}M=Yp~w|yGF+>;3J&d~lg0lI%>^fm2~8=Zdbz-T_rUu(xi59Ryz9kX%Qa$7y_AE6 zWI}rOW=WOoIE?R58*P7bg1tPmuDAp%0XxY1_LBPtphS_c4xr&KeF94fqD#qgPSHkA zr7x$FRc#k@I;9+Z3?^qy=+|a8b{+QZI?RrYin~rqyG|<3j~u1UNF5h_(}w?F8fIqeqHtA4;blaVu2aieXi!AMOJoGd8YRMB5oDupu4XnTCZgOd#54 zf)*yUvkD!ZdS7NK%Pi%k)*oGJSws4jbVY|ASEH8=FMLgk0mfx z>Dy6;A!#e^E0BxQ4kKDRBufY5hUBX36f;Yu%+lpvUuGrCtPBe>_D0`Yy4X4(wGKSY z7F!RpiZR7NEvIA|XO?j!`{~7{jH0j%XfFy4uJMK*X0d`H7|}c|nTMHqn6L3hpwyi; zkC4eZL56?#gi~H_CW;ZZIqEI{s$w8Vx6dx5^qVIqp9OSSeUdaeDcra)Iq4aofP+L_ zApS(IIDXEbqyVqyJby`#-XL;-$VnnMiQFT?&rJV4+4!;NpOEcMB5xC6M1D!+Z;AXL zM6zf+LEhM`*T1WqVos- zITvbAft4+SYvCOOKB7}n@zo4s(dE?0 zxlOdupI<;vA*W39)FtQEDo^F2Ho4$;w$hU*ERk$oPBo9&E*DI0rI^T_NJhxL&_$0l z5thoi{9GZwKrU*cH$H37#)&s}2i~|{E|}0hb%s5yr{F^o!I7O-9^6JxAuufT_B;AM zeMaI716xN>I4G1lx#&E09Vy*J%xYN_UDP@vL2Yu;1+8Npy{2dy>ZRp^7P;s$p4zYp zOe7_RVkDBM%W05vw<96;A;>0!*EX_0V~FP)iE5OK4s);da*+_z-+p~VW+G}BfV|R+ zdgh!alTf^sm~2nPD6A5eVB4}Lna0r3!)SK8sRrtqHKe4)v=6?*=w-dbguyFFdi4dS zU0b>!X)iEA!E}(cTTQuJx*(~mG~uX0OOEKXO;+dw4iI;S33E}9IMYn+*pUm6!Xi`g zmM%!T5=?_gU>MCvF=1;nNb>d@D7{g1G$EZ{7$nXL6E^6z0wt|bTb7D{xGxb_%Lq&QS_*_(LDXd(esn#-}IXA(^G&91o!DJ>=%oMTgE zFrXozy4=%_;SVdD8<&VLNWp(_Va$B(^KBX{risvpoZl>5p1OYNM#If{h)wq-kdqaw z%ejWY;e7*%2F4@$RP)d(+rx1q^xf&{BSI?`f6Arl`60Y;+T+ ze9gK~x%Vfj5BwRx_kfhaRK?h!O~xj3-0Wx2CW96ZRh(ILwDT zPX}`9*-qI_1R4R^^=B$qpe(SUyM6&G?zL-Xf5!2VWBonDlfyknj`SQm7BQ55oZPKU z5xYDG5G}@9-P~6}As$XoyZ8D8ER;Y}b^6Q~GU!j%rM?0aw(yl zC6vnvsT&EozJ%PROJYKalu*JFN@QK)7c&1<=2Fs2W>Hrx@jPuMj1}vtiN?P?R-XM@ z>*cvFU8?0?F_MZ)!wX524a?oUFWT Date: Mon, 10 Nov 2025 19:45:59 -0600 Subject: [PATCH 3/3] Dbases for AU, BR, DE, ES, FR, MX, UK --- Stream-Mapparr/AU_channels.json | 257 +++++++++++++++++++++++ Stream-Mapparr/BR_channels.json | 242 ++++++++++++++++++++++ Stream-Mapparr/DE_channels.json | 252 +++++++++++++++++++++++ Stream-Mapparr/ES_channels.json | 187 +++++++++++++++++ Stream-Mapparr/FR_channels.json | 202 +++++++++++++++++++ Stream-Mapparr/MX_channels.json | 132 ++++++++++++ Stream-Mapparr/UK_channels.json | 347 ++++++++++++++++++++++++++++++++ 7 files changed, 1619 insertions(+) create mode 100644 Stream-Mapparr/AU_channels.json create mode 100644 Stream-Mapparr/BR_channels.json create mode 100644 Stream-Mapparr/DE_channels.json create mode 100644 Stream-Mapparr/ES_channels.json create mode 100644 Stream-Mapparr/FR_channels.json create mode 100644 Stream-Mapparr/MX_channels.json create mode 100644 Stream-Mapparr/UK_channels.json diff --git a/Stream-Mapparr/AU_channels.json b/Stream-Mapparr/AU_channels.json new file mode 100644 index 0000000..72b81ca --- /dev/null +++ b/Stream-Mapparr/AU_channels.json @@ -0,0 +1,257 @@ +{ + "country_code": "AU", + "country_name": "Australia", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "ABC TV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ABC", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ABC TV Plus", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ABC Family", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ABC Kids", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "ABC Entertains", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "ABC Me", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "ABC News", + "category": "News", + "type": "National" + }, + { + "channel_name": "SBS", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBS One", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBS Viceland", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBS World Movies", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "SBS Food", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "NITV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBS WorldWatch", + "category": "News", + "type": "National" + }, + { + "channel_name": "Seven", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7 Sydney", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "7 Melbourne", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "7two", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7mate", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7flix", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7Bravo", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Nine", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "9", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "9 Sydney", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "9 Melbourne", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "9Gem", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "9Go!", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "9Life", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "9Rush", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "10", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Network 10", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "10 Peach", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "10 Bold", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "10 Shake", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Fox Sports", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Fox Sports News", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Fox Cricket", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Fox League", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Fox Footy", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "beIN Sports", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky News Australia", + "category": "News", + "type": "National" + }, + { + "channel_name": "Racing.com", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Lifestyle", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Arena", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Discovery", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "History", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "BBC Earth", + "category": "Documentary", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/BR_channels.json b/Stream-Mapparr/BR_channels.json new file mode 100644 index 0000000..93ca1d3 --- /dev/null +++ b/Stream-Mapparr/BR_channels.json @@ -0,0 +1,242 @@ +{ + "country_code": "BR", + "country_name": "Brazil", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "Globo", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TV Globo", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Record", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RecordTV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBT", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Band", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Rede Bandeirantes", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RedeTV!", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TV Cultura", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "TV Brasil", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "GloboNews", + "category": "News", + "type": "National" + }, + { + "channel_name": "CNN Brasil", + "category": "News", + "type": "National" + }, + { + "channel_name": "Record News", + "category": "News", + "type": "National" + }, + { + "channel_name": "BandNews TV", + "category": "News", + "type": "National" + }, + { + "channel_name": "Jovem Pan News", + "category": "News", + "type": "National" + }, + { + "channel_name": "SporTV", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "SporTV 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "SporTV 3", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN 3", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN 4", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "BandSports", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Premiere", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Combate", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Multishow", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "GNT", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Viva", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Canal Brasil", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Futura", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Telecine Premium", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Telecine Action", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Telecine Pipoca", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Telecine Fun", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Telecine Cult", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Gloob", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Gloobinho", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Cartoon Network", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Discovery Kids", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Nickelodeon", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Nick Jr.", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Disney Channel", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Discovery Channel", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "National Geographic", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "History", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Arte 1", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Terra Viva", + "category": "Lifestyle", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/DE_channels.json b/Stream-Mapparr/DE_channels.json new file mode 100644 index 0000000..747d0a7 --- /dev/null +++ b/Stream-Mapparr/DE_channels.json @@ -0,0 +1,252 @@ +{ + "country_code": "DE", + "country_name": "Germany", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "Das Erste", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ARD", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ZDF", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Arte", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "3sat", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "KiKA", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Phoenix", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Tagesschau24", + "category": "News", + "type": "National" + }, + { + "channel_name": "One", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ZDFneo", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ZDFinfo", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "BR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "hr-fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "MDR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "NDR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Radio Bremen TV", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "rbb Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "SR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "SWR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "WDR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "RTL", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RTL Zwei", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RTLZWEI", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Vox", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Super RTL", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "n-tv", + "category": "News", + "type": "National" + }, + { + "channel_name": "Nitro", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RTLup", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "VOXup", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ProSieben", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sat.1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Kabel Eins", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sixx", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ProSieben Maxx", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sat.1 Gold", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Kabel Eins Doku", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Welt", + "category": "News", + "type": "National" + }, + { + "channel_name": "N24", + "category": "News", + "type": "National" + }, + { + "channel_name": "Sport1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Bundesliga", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sport DE", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Disney Channel", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Comedy Central", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "DMAX", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "TLC", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Tele 5", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Servus TV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Deluxe Music", + "category": "Music", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/ES_channels.json b/Stream-Mapparr/ES_channels.json new file mode 100644 index 0000000..940efb4 --- /dev/null +++ b/Stream-Mapparr/ES_channels.json @@ -0,0 +1,187 @@ +{ + "country_code": "ES", + "country_name": "Spain", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "La 1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TVE La 1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "La 2", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "TVE La 2", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "24h", + "category": "News", + "type": "National" + }, + { + "channel_name": "TVE 24h", + "category": "News", + "type": "National" + }, + { + "channel_name": "Teledeporte", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TDP", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Clan", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Antena 3", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "laSexta", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Neox", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Nova", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Mega", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Atreseries", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Telecinco", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Cuatro", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "FDF", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Boing", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Divinity", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Energy", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Be Mad", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "DMAX", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Paramount Network", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Trece", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Real Madrid TV", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TV3", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Canal Sur", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ETB 1", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ETB 2", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "TVG", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Telemadrid", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Movistar LaLiga", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Movistar Liga de Campeones", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "DAZN LaLiga", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "DAZN 1", + "category": "Sports", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/FR_channels.json b/Stream-Mapparr/FR_channels.json new file mode 100644 index 0000000..3d38809 --- /dev/null +++ b/Stream-Mapparr/FR_channels.json @@ -0,0 +1,202 @@ +{ + "country_code": "FR", + "country_name": "France", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "TF1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "France 2", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "France 3", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "France 3 Paris", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "France 3 Lyon", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Canal+", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "France 5", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "M6", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Arte", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "C8", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "W9", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TMC", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TFX", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "NRJ 12", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "LCP", + "category": "News", + "type": "National" + }, + { + "channel_name": "France 4", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "BFMTV", + "category": "News", + "type": "National" + }, + { + "channel_name": "CNews", + "category": "News", + "type": "National" + }, + { + "channel_name": "CStar", + "category": "Music", + "type": "National" + }, + { + "channel_name": "Gulli", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "TF1 Séries Films", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "L'Équipe", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "6ter", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RMC Story", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "RMC Découverte", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Chérie 25", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "LCI", + "category": "News", + "type": "National" + }, + { + "channel_name": "Franceinfo", + "category": "News", + "type": "National" + }, + { + "channel_name": "France 24", + "category": "News", + "type": "National" + }, + { + "channel_name": "Euronews", + "category": "News", + "type": "National" + }, + { + "channel_name": "Canal+ Sport", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Canal+ Cinéma", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "beIN Sports 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "beIN Sports 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "RMC Sport 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "RMC Sport 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TV5 Monde", + "category": "Entertainment", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/MX_channels.json b/Stream-Mapparr/MX_channels.json new file mode 100644 index 0000000..80ab5b8 --- /dev/null +++ b/Stream-Mapparr/MX_channels.json @@ -0,0 +1,132 @@ +{ + "country_code": "MX", + "country_name": "Mexico", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "Las Estrellas", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Canal 5", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Nueve", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Nu9ve", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "N+ Foro", + "category": "News", + "type": "National" + }, + { + "channel_name": "Foro TV", + "category": "News", + "type": "National" + }, + { + "channel_name": "TUDN", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Azteca Uno", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Azteca 7", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ADN 40", + "category": "News", + "type": "National" + }, + { + "channel_name": "adn Noticias", + "category": "News", + "type": "National" + }, + { + "channel_name": "a+", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "A Más", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Imagen Televisión", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Excélsior TV", + "category": "News", + "type": "National" + }, + { + "channel_name": "Canal Once", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Canal 22", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Canal Catorce", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "TV UNAM", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Canal del Congreso", + "category": "News", + "type": "National" + }, + { + "channel_name": "Canal 6", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Multimedios", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Distrito Comedia", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Tlnovelas", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "De Película", + "category": "Movies", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/UK_channels.json b/Stream-Mapparr/UK_channels.json new file mode 100644 index 0000000..aed94e6 --- /dev/null +++ b/Stream-Mapparr/UK_channels.json @@ -0,0 +1,347 @@ +{ + "country_code": "UK", + "country_name": "United Kingdom", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "BBC One", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC One London", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "BBC One Scotland", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "BBC One Wales", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "BBC One NI", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "BBC Two", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC2", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC Three", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC3", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC Four", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "BBC4", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "CBBC", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "CBeebies", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "BBC News", + "category": "News", + "type": "National" + }, + { + "channel_name": "BBC Parliament", + "category": "News", + "type": "National" + }, + { + "channel_name": "BBC Alba", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "S4C", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ITV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITV1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITV1 London", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ITV1 Granada", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ITV1 Wales", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "STV", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "UTV", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ITV2", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITV3", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITV4", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITVBe", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Channel 4", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "E4", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "More4", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Film4", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "4seven", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Channel 5", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "5STAR", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "5USA", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "5Action", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "5Select", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Showcase", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Max", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Atlantic", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Witness", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Comedy", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Documentaries", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Sky History", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Sky Nature", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Sky Arts", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky News", + "category": "News", + "type": "National" + }, + { + "channel_name": "Sky Sports Main Event", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports Premier League", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports Football", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports Cricket", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports F1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports Golf", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TNT Sports 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TNT Sports 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TNT Sports 3", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Dave", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Gold", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "W", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Alibi", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Yesterday", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Eden", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "GB News", + "category": "News", + "type": "National" + }, + { + "channel_name": "Talk", + "category": "News", + "type": "National" + } + ] +} \ No newline at end of file