From e157aee7c9d7c4e78f34cec7171d4e4f3adc82b6 Mon Sep 17 00:00:00 2001 From: Anthony Donlon Date: Wed, 19 Nov 2025 20:11:28 +0800 Subject: [PATCH] add simple error page generator --- .gitignore | 10 ++ LICENSE.txt | 9 ++ README.md | 123 ++++++++++++++++++ cloudflare_error_page/__init__.py | 33 +++++ .../resources/images/cf-icon-browser.png | Bin 0 -> 484 bytes .../resources/images/cf-icon-cloud.png | Bin 0 -> 1484 bytes .../resources/images/cf-icon-error.png | Bin 0 -> 854 bytes .../resources/images/cf-icon-ok.png | Bin 0 -> 946 bytes .../resources/images/cf-icon-server.png | Bin 0 -> 1384 bytes .../resources/styles/main.css | 1 + cloudflare_error_page/templates/error.html | 107 +++++++++++++++ doc/example.png | Bin 0 -> 76698 bytes examples/example.py | 29 +++++ pyproject.toml | 25 ++++ 14 files changed, 337 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 cloudflare_error_page/__init__.py create mode 100644 cloudflare_error_page/resources/images/cf-icon-browser.png create mode 100644 cloudflare_error_page/resources/images/cf-icon-cloud.png create mode 100644 cloudflare_error_page/resources/images/cf-icon-error.png create mode 100644 cloudflare_error_page/resources/images/cf-icon-ok.png create mode 100644 cloudflare_error_page/resources/images/cf-icon-server.png create mode 100644 cloudflare_error_page/resources/styles/main.css create mode 100644 cloudflare_error_page/templates/error.html create mode 100644 doc/example.png create mode 100644 examples/example.py create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..74f6beb --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.vscode/ + +build/ +*.egg-info/ +__pycache__/ +dist/ + +.venv/ +venv/ +ttt/ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8b201ea --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2025 Anthony Donlon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..534a95b --- /dev/null +++ b/README.md @@ -0,0 +1,123 @@ +# Customizable Cloudflare error page generator + +## QuickStart Guide (Python) + +``` Bash +pip install git+https://github.com/donlon/cloudflare-error-page.git +``` + +``` Python +import webbrowser +from cloudflare_error_page import render as render_cf_error_page + +error_page = render_cf_error_page({ + 'browser_status': { + "status": 'ok', + }, + 'cloudflare_status': { + "status": 'error', + "status_text": 'Not Working', + }, + 'host_status': { + "status": 'ok', + "location": 'example.com', + }, + 'error_source': 'cloudflare', # 'browser', 'cloudflare', or 'host' + + 'what_happened': '

There is an internal server error on Cloudflare\'s network.

', + 'what_can_i_do': '

Please try again in a few minutes.

', +}) + +with open('error.html', 'w') as f: + f.write(error_page) + +webbrowser.open('error.html') +``` + +## Examples + +``` Python +params = { + 'title': 'Catastrophic infrastructure failure', + 'more_information': { + "text": "cloudflare.com", + "link": "https://youtube.com/watch?v=dQw4w9WgXcQ", + }, + 'browser_status': { + 'status': 'error', + 'status_text': 'Out of Memory', + }, + 'cloudflare_status': { + 'status': 'error', + 'location': 'Everywhere', + 'status_text': 'Not Working', + }, + 'host_status': { + 'status': 'error', + 'location': 'example.com', + 'status_text': 'On Fire', + }, + 'error_source': 'cloudflare', + 'what_happened': '

There is a catastrophic failure.

', + 'what_can_i_do': '

Please try again in a few years.

', + 'perf_sec_by': { + "text": "Cloudflare", + "link": "https://youtube.com/watch?v=dQw4w9WgXcQ", + }, +} +``` + +![Catastrophic infrastructure failure](doc/example.png) + +## Full Parameter Reference +``` JavaScript +{ + "html_title": "cloudflare.com | 500: Internal server error", + "title": "Internal server error", + "error_code": 999, + "time": "2025-11-18 12:34:56 UTC", // if not set, current UTC time is shown + + // Configuration for "Visit ... for more information" line + "more_information": { + "hidden": false, + "text": "cloudflare.com", + "link": "https://youtube.com/watch?v=dQw4w9WgXcQ", + }, + + // Configuration for the Browser/Cloudflare/Host status + "browser_status": { + "status": "ok", // "ok" or "error" + "location": "You", + "name": "Browser", + "status_text": "Working", + "status_text_color": "#9bca3e", + }, + "cloudflare_status": { + "status": "error", + "location": "Cloud", + "name": "Cloudflare", + "status_text": "Not Working", + "status_text_color": "#bd2426", + }, + "host_status": { + "status": "ok", + "location": "The Site", + "name": "Host", + "status_text": "Working", + "status_text_color": "#9bca3e", + }, + "error_source": "host", // Position of the error indicator, can be "browser", "cloudflare", or "host" + + "what_happened": "

There is an internal server error on Cloudflare's network.

", + "what_can_i_do": "

Please try again in a few minutes.

", + + "ray_id": '0123456789abcdef', // if not set, random hex string is shown + "client_ip": '1.1.1.1', + + // Configuration for 'Performance & security by ...' in the footer + "perf_sec_by": { + "text": "Cloudflare", + "link": "https://youtube.com/watch?v=dQw4w9WgXcQ", + }, +} +``` \ No newline at end of file diff --git a/cloudflare_error_page/__init__.py b/cloudflare_error_page/__init__.py new file mode 100644 index 0000000..7b6a96e --- /dev/null +++ b/cloudflare_error_page/__init__.py @@ -0,0 +1,33 @@ +import os +import secrets +from datetime import datetime, timezone + +from jinja2 import Environment, PackageLoader, select_autoescape + +env = Environment( + loader=PackageLoader("cloudflare_error_page"), + autoescape=select_autoescape() +) + + +def get_resources_folder() -> str: + """ + Get resources folder that contains stylesheet and icons for the error page. + If you pass resources_use_cdn=True to render(), local resources are not used. + """ + return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'resources') + + +def render(params: dict, use_cdn: bool=True) -> str: + """ + Render a customized Cloudflare error page. + """ + params = {**params} + if not params.get('time'): + utc_now = datetime.now(timezone.utc) + params['time'] = utc_now.strftime("%Y-%m-%d %H:%M:%S UTC") + if not params.get('ray_id'): + params['ray_id'] = secrets.token_hex(8) + + template = env.get_template("error.html") + return template.render(params=params, resources_use_cdn=use_cdn) diff --git a/cloudflare_error_page/resources/images/cf-icon-browser.png b/cloudflare_error_page/resources/images/cf-icon-browser.png new file mode 100644 index 0000000000000000000000000000000000000000..de231042d9dccfb8badd6bd9a2aae7638e9f6d2d GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>+!3-pCTvxaYq$&b@LR^9Le=wLibLOg5tLDs^ zGYbr6&z=pWfh15ILIN2;5eNxkAhT!8m;vMx5B{rFY5?t4FA4GsW?*DuW%Kn53FFJfJr(!ScR=;+$J+YZ~<+U!%;FZ|K- zeaWq@PwvfSv0rj`h1kt&?zi7Pk?nl7c!l*}^-DENe9J%evFxnS{GPe1zQ(_fiBmwy z#YsVIUUH{^qEicpppr`mobiV@=*9oeB8%1)W=&H}HVc$aKDo8`4ntuBmp}x&hVjMg yYf@8h=FdADu|A>i*6~a=uF##kQ#@m*+B0ei+H61ZS(gdue+ExiKbLh*2~7Z?+2vgT literal 0 HcmV?d00001 diff --git a/cloudflare_error_page/resources/images/cf-icon-cloud.png b/cloudflare_error_page/resources/images/cf-icon-cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ed395c01e1cd0d79f3731f19af572ad6572c6a GIT binary patch literal 1484 zcmeAS@N?(olHy`uVBq!ia0vp^Gl1BagBeKXzK`u^U|?bi@Ck7Ra{q(Ds#UA@@83Uj z=1d@C+qP}<=g$W+fZRok76BP^=gwWSWC@T96rVF^4n%zR?AbsrkPVatvLUiSHc-K= zS+juLdGqE$6axi;A`mqY5g;3)49I{0pn9MhxFCd$EHz`s42U5>5(t3m;UW;dKrVy< zCm{@oVh9NofdG&ZU_*dh2m?-{iNkb2mBG1i2Bt=2mq3(3)S!t&xIhJ1#erJj3gC9p zf?>XMZ#pm?tS$-i3ua(sVrF4wW9Q)H;^yJy;};MT5fhh?l#-ECP*PFT(9+S>H!wE0 zwz0LdcW`obbNBG{^6?D{2@MO6h>VVnPfSWqNli=7$jr*l$;~e)DlRRnsH~}PXl!b3 zY3u0h>g}62dD`?DGiT48w`lRQ6)RV-S-WoihK-xHY~8kF=dRs*_U=1)=e8$toF(l*O z*<0b^!j2N{AI$|sS*;@k4l-%AX)I!!+7bI^k&x?@2nR;*0HC0Tm;k2+OW?+ZjT8Rt zUm`A2?4{N>*0cBF%0HCy9I7(+}on$^fj~j?ewQk0k_}OYx1_4 z=&nXs{wZ z?1$Ex4bnMUe7Ch*vk@ zKbNvLJrjY8!F?Ob7EMubpD}%ffKQ^RPGYW$u1@0jjy*bwdh0gmy2#4J{&QLMTPAU< zOUNO?Y2Gf<61#Tkx`>z`;5RGFI`n?K%>9h`FLP(UzI|loNyoT#6X%@#yr#-;-Nn0! z`ST2Ro%~haX5Xw|clzkn`H~-}-O3ePlkl`jbGD}C`>W^I?b;gHUs7zVCI7f-uIkE- q{s)cc9-Y2U>%`XcW>43?*{`xcO42ugH4T^@89ZJ6T-G@yGywqQcls;< literal 0 HcmV?d00001 diff --git a/cloudflare_error_page/resources/images/cf-icon-error.png b/cloudflare_error_page/resources/images/cf-icon-error.png new file mode 100644 index 0000000000000000000000000000000000000000..3a7c8be5ef2cd8583aa265e090c8d2886c56a007 GIT binary patch literal 854 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U{nb332_B-|2H)J4-LJdrL|v0 z@1Ty(VJ)q_nwkgI)q&(b4UPTk>IXD5_5v9y8he0(K%}C+PhEY#n%W*U&AqA``#=nh zeX8m}v{zMauL=+W8DO@m+CCU}4^#vsz6Yobq!MHlhyi7T7$9XJEnoza0&({MxiB_R zWS_d`eogHIy7~tVjZgUnoDK=QT2y?kto(Xa_4VqS>ov8vT3Tpgp4@7?=)-@bRpj(@yx;p4?ipDtbgeB! zo8KQl{{8jq|G$6#|NnQ|6ZH%jMph+3e!&b(%xp5Ua`K8s#wM0l4vtQtVc`*xMa89M zlO``(x@`H1Rjb#m-L!ejp1u1{o;rK(>9ZFvU%h_w;p3-Y;j!nB0YiMXr;B5V$ML0M znZbt~cz9h~t}(N)=vEYHEN@Z>NftaREtv1h`sx4wR(T7yUEaH8?@d3qXWw<7NqL(X ziVrKcFWTuOy1F&SM8|r~lTA^FJg0=*^m%tyse4WNv^#s-Yu@bM`OB0y-SPA0B2QQ2 z6_Xs__bj%2bnfN*_lrc6f(=8qv{^0uzL+uIDNua zAW(RtWrf5B=7IwgbQjevzNlVhmwZo_Nyc!=KesEd1#7R|Si{Y*TqpXyfMDsXIYx6C zKCCKtbSXKht7CrX=kiDvKfd+NGWSaJ_|!tP6xVy*c6&FkLyo<6$K$VwhfmbFJ_x8aB@MvF);EOJYD@<);T3K0RTk{hV1|V literal 0 HcmV?d00001 diff --git a/cloudflare_error_page/resources/images/cf-icon-ok.png b/cloudflare_error_page/resources/images/cf-icon-ok.png new file mode 100644 index 0000000000000000000000000000000000000000..df246dbd53dccfb7c14badb79b9b8e6e477fbe02 GIT binary patch literal 946 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_V2lj#32_B-|Nn1T^*?mgmC)H2 z9p;^KTX@E0&N-*q7wzVqahiSBaqc;XxhL)CopPFe+F|Y)``Ksh=A5ygd&+M1DTg_y z9cG`l2g=R{a!=dOIc*OjPuk6ah@7;aa|$Fi3rK?4KrKK76tSOm8p4LDgi1jLL26DS zv4QG=3Sc5YOXr?;T5!gF!C8+5XFV66^Idi!XxW9}WfwwLTnt-vDQeZF==E1p)?ZEC za5a6)^}KC2i+A3t*mbLF*X`=vx2yNut~>s4((#8=&ODiW?&*R{&zE0%zVh;m)mL7u zz4~(P^;a8jzTS54-GTe>4m|*(_lF<8Kl=E?$)_LBJpX*@#pg?}zub8J_2!$ex8Hw% z_~qxzFF#*>`T6?$@Ap6deEId~>#x7x{{8#=|Np=L|Nn1W==cp7xK<@We!&b(%xp5U za`K8s#wM0l4vtQtVc`*xMa89MlO``(x@`H1Rjb#m-L!ejp1u1{o;rK(>9ZFvU%h_w z;p3-Y;j!nB0i)`ir;B5V$ML1po(3Ow5IDNsQ8

v+z0-D^v8HyLa!F{{PP(!<~A< zvq<*d^fP;Y?#-#Xe%qEIj&ZZi9YM(>2R+;^GT08dFT2}be>Ht}T!o``SC)Rj!$@C^ z@ZxDx^os&imq#4omEM~oEi*r?|K2M9;{E%@{)RkXmAH8S8~Yl=S1X=O_b=bVxEPQ-K=FOh(vVL>2 ze-5{p3aip1t+$)X@5^62KixBI<*dzac^V6s2Szr$b!L6teP0GjdWS zXU*0Byghtc2CG-_n|q4aYgT;DUvq4~TEHvgzLi&!yQXpg5WovMyvcTp3sg!dNtMh%B-o&^-`A2m|f_xI5tr;CkuCXtdTU z0Y?9dk|4ie21X`k7FITPPA+a9UVZ@~5m7O52}vm#Ie7&|B^6b54IN!QePa_-GfOLL z8(TXECubLTPhbDQpx}_u@QCP`*!aZc)U=Guti1e!!jjVRit3u$`iAD#w)XCx-iec@ zOrJS>{(?n|mn>brV&$r}>o;!MwrlsEz55OxI(+2lvEwICojG^@!o^FMuiw0V_x{62 zkDok!_WZ@G*Kgjwd;j6%=PzHsegE7Wsl?O8F(l&f+nd+Jg#!iH zK4dGggwH1K@hGGsOIyX8Km_?&SMjANTWZf1WO&A^rAm)|C3I`^>j2{PTWWZi(E%O-Ik!cYa=f`@_BM7W>z0 z+>ZA-@aDufWsm)u-RG;@zf5lQske08tbWav`6?e99U(&M}SqQCB$ ze=f*v@t?f5j^o^A#?|$#@9j5#XubczF4FCy5!<}JKi}3D{wO@!|Lfqx%Q=_z(;vRv z@zVUm4}Dv<_(@MbX6}3VKIPHNDG%>I{A9gH%HHhg)5}3;`8R(oar-R);ivqk7772J zNVOwoe*aqpO0#m_H@V&oJKtKNEC0QkMK3$m-Md%d(}#WH7mhqxKTqk2v-Gv~6LSg< zq<^Z_{`PKO_R4Pax3{hMp6h2^zn7(B_`4#1!&m>NSFW(oV z|M~34-R2D+cl+!Q(-&XWCw%CK?aR|Ws;Bf1|Jd%c-b=sxN{0dO^WW$7pPzpD#`XHT*8bpo zM~o-d6t;h1ezdQ~E2i&&&|8!K`RrRmww_=AE__zPm*)$nJ^N<4UjJKC%%90lk3V&O z`p}!zy_YF4vcNpU;OXk;vd$@?2>?jN B_6h(1 literal 0 HcmV?d00001 diff --git a/cloudflare_error_page/resources/styles/main.css b/cloudflare_error_page/resources/styles/main.css new file mode 100644 index 0000000..9d6b19a --- /dev/null +++ b/cloudflare_error_page/resources/styles/main.css @@ -0,0 +1 @@ +.container{width:100%}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.border-gray-300{--border-opacity:1;border-color:#ebebeb;border-color:rgba(235,235,235,var(--border-opacity))}.rounded{border-radius:.25rem}.border-solid{border-style:solid}.border-0{border-width:0}.border{border-width:1px}.border-t{border-top-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.table{display:table}.hidden{display:none}.float-left{float:left}.clearfix:after{content:"";display:table;clear:both}.font-mono{font-family:monaco,courier,monospace}.font-light{font-weight:300}.font-normal{font-weight:400}.font-semibold{font-weight:600}.h-12{height:3rem}.h-20{height:5rem}.text-13{font-size:13px}.text-15{font-size:15px}.text-60{font-size:60px}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-1\.3{line-height:1.3}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.mt-3{margin-top:.75rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.ml-10{margin-left:2.5rem}.mb-15{margin-bottom:3.75rem}.-ml-6{margin-left:-1.5rem}.overflow-hidden{overflow:hidden}.p-0{padding:0}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-15{padding-top:3.75rem;padding-bottom:3.75rem}.pr-6{padding-right:1.5rem}.pt-10{padding-top:2.5rem}.absolute{position:absolute}.relative{position:relative}.left-1\/2{left:50%}.-bottom-4{bottom:-1rem}.resize{resize:both}.text-center{text-align:center}.text-black-dark{--text-opacity:1;color:#404040;color:rgba(64,64,64,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#999;color:rgba(153,153,153,var(--text-opacity))}.text-red-error{--text-opacity:1;color:#bd2426;color:rgba(189,36,38,var(--text-opacity))}.text-green-success{--text-opacity:1;color:#9bca3e;color:rgba(155,202,62,var(--text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-12{width:3rem}.w-240{width:60rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-full{width:100%}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-transform}body,html{--text-opacity:1;color:#404040;color:rgba(64,64,64,var(--text-opacity));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:16px}*,body,html{margin:0;padding:0}*{box-sizing:border-box}a{--text-opacity:1;color:#2f7bbf;color:rgba(47,123,191,var(--text-opacity));text-decoration:none;-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.15s;transition-duration:.15s;-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}a:hover{--text-opacity:1;color:#f68b1f;color:rgba(246,139,31,var(--text-opacity))}img{display:block;width:100%;height:auto}#what-happened-section p{font-size:15px;line-height:1.5}strong{font-weight:600}.bg-gradient-gray{background-image:-webkit-linear-gradient(top,#dedede,#ebebeb 3%,#ebebeb 97%,#dedede)}.cf-error-source:after{position:absolute;--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));width:2.5rem;height:2.5rem;--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));-ms-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-rotate:45deg;content:"";bottom:-1.75rem;left:50%;margin-left:-1.25rem;box-shadow:0 0 4px 4px #dedede}@media screen and (max-width:720px){.cf-error-source:after{display:none}}.cf-icon-browser{background-image:url(/cdn-cgi/images/cf-icon-browser.png)}.cf-icon-cloud{background-image:url(/cdn-cgi/images/cf-icon-cloud.png)}.cf-icon-server{background-image:url(/cdn-cgi/images/cf-icon-server.png)}.cf-icon-ok{background-image:url(/cdn-cgi/images/cf-icon-ok.png)}.cf-icon-error{background-image:url(/cdn-cgi/images/cf-icon-error.png)}#cf-wrapper .feedback-hidden{display:none}#cf-wrapper .feedback-success{min-height:33px;line-height:33px}#cf-wrapper .cf-button{color:#0051c3;font-size:13px;border-color:#0045a6;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color,border-color,color;transition-property:background-color,border-color,color}#cf-wrapper .cf-button:hover{color:#fff;background-color:#003681}.cf-error-footer .hidden{display:none}.cf-error-footer .cf-footer-ip-reveal-btn{-webkit-appearance:button;-moz-appearance:button;appearance:button;text-decoration:none;background:none;color:inherit;border:none;padding:0;font:inherit;cursor:pointer;color:#0051c3;-webkit-transition:color .15s ease;transition:color .15s ease}.cf-error-footer .cf-footer-ip-reveal-btn:hover{color:#ee730a}.code-label{background-color:#d9d9d9;color:#313131;font-weight:500;border-radius:1.25rem;font-size:.75rem;line-height:4.5rem;padding:.25rem .5rem;height:4.5rem;white-space:nowrap;vertical-align:middle}@media (max-width:639px){.sm\:block{display:block}.sm\:hidden{display:none}.sm\:mb-1{margin-bottom:.25rem}.sm\:mb-2{margin-bottom:.5rem}.sm\:py-4{padding-top:1rem;padding-bottom:1rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:text-left{text-align:left}}@media (max-width:720px){.md\:border-gray-400{--border-opacity:1;border-color:#dedede;border-color:rgba(222,222,222,var(--border-opacity))}.md\:border-solid{border-style:solid}.md\:border-0{border-width:0}.md\:border-b{border-bottom-width:1px}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:hidden{display:none}.md\:float-none{float:none}.md\:text-3xl{font-size:1.875rem}.md\:m-0{margin:0}.md\:mt-0{margin-top:0}.md\:mb-2{margin-bottom:.5rem}.md\:p-0{padding:0}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:pr-0{padding-right:0}.md\:pb-10{padding-bottom:2.5rem}.md\:top-0{top:0}.md\:right-0{right:0}.md\:left-auto{left:auto}.md\:text-left{text-align:left}.md\:w-full{width:100%}}@media (max-width:1023px){.lg\:text-sm{font-size:.875rem}.lg\:text-2xl{font-size:1.5rem}.lg\:text-4xl{font-size:2.25rem}.lg\:leading-relaxed{line-height:1.625}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-6{padding-top:1.5rem}.lg\:w-full{width:100%}} diff --git a/cloudflare_error_page/templates/error.html b/cloudflare_error_page/templates/error.html new file mode 100644 index 0000000..e27f070 --- /dev/null +++ b/cloudflare_error_page/templates/error.html @@ -0,0 +1,107 @@ +{% set resources_cdn = 'https://cloudflare.com' if resources_use_cdn else '' %} + + + + + + + +{% set error_code = params.error_code or 500 %} +{% set title = params.title or 'Internal server error' %} +{{ params.html_title or ((error_code | string) + ': ' + title) }} + + + + + + + + +

+
+
+

+ {{ title }} + Error code {{ error_code }} +

+ {% set more_info = params.more_information or {} %} + {% if not more_info.hidden or false %} +
+ Visit {{more_info.text or 'cloudflare.com'}} for more information. +
+ {% endif %} +
{{ params.time }}
+
+
+
+
+ {% for item_id in ['browser', 'cloudflare', 'host'] %} + {% if item_id == 'browser' %} + {% set icon = 'browser' -%} + {% set default_location = 'You' -%} + {% set default_name = 'Browser' -%} + {% elif item_id == 'cloudflare' %} + {% set icon = 'cloud' -%} + {% set default_location = 'San Francisco' -%} + {% set default_name = 'Cloudflare' -%} + {% else %} + {% set icon = 'server' -%} + {% set default_location = 'example.com' -%} + {% set default_name = 'Host' -%} + {% endif %} + {% set item = params.get(item_id + '_status', {}) -%} + {% set status = item.get('status', 'ok') -%} + {% if item.status_text_color %} + {% set text_color = item.status_text_color -%} + {% elif status == 'ok' %} + {% set text_color = '#9bca3e' -%} {# text-green-success #} + {% elif status == 'error' %} + {% set text_color = '#bd2426' -%} {# text-red-error #} + {% endif %} + {% set status_text = item.get('status_text', 'Working' if status == 'ok' else 'Not Working') -%} +
+
+ + +
+ {{item.location or default_location}} +

{{item.name or default_name}}

+ {{status_text}} +
+ {% endfor %} +
+
+
+ +
+
+
+

What happened?

+ {{ (params.what_happened or '

There is an internal server error on Cloudflare\'s network.

') | safe }} +
+
+

What can I do?

+ {{ (params.what_can_i_do or '

Please try again in a few minutes.

') | safe }} +
+
+
+ + +
+
+ + + \ No newline at end of file diff --git a/doc/example.png b/doc/example.png new file mode 100644 index 0000000000000000000000000000000000000000..d56c193a291538c038f62c7393b89949005efb73 GIT binary patch literal 76698 zcmeFZc{tR2_&%;xEA5KVCY4axvJ90XWZ(Cs>`P%RgVA#0l%zNa*+Q7HB*s3bl2o!Y zlRepItTDzme4m$dKHuy2@9(eQ?~jk`>N=CtyqDMVJoj_o_w#z9qoulY8}Bv_4vw8_ z*RSevaBRBI!LdPm%VzkEt&%?${BHkQp$A0N z*Xg#Jk<5zEYlx=OSB@-IYF&t3 zS~~vi&X8UFiOAa*{4j#y3Y#a$1>N!ztS%OY<>?Y^b8tO84f@%5xE%XGpO2i|#j)Yv zUthX^j03$C{M_fb#@em5&}hO0DKd zx+|A}{zv8VAC2+$0@eNd_eZ4VT9(s|DT`6Lm5WZ;$)0YU49ETW!a_;cpYJZ;yLaz< zeZ6!BH=p#47z>Xl^@>X_?Jm;cONFWn3kw}ZuJLEioN3K5mkHyQQvdkzBiw^yYAY=8 zOCP@f_|aJC~-)`D|z~R$h zTdChTIMhr{O>xuJJWMvLmzb;E+M*?|8G1le&&1>v)~LL|XVMBY^P;e{JOW@O{+F>05*lZgDh& zu`_5L2ey+EM42e*=L%$X`xI8M<8W9v%c1hYqtrtE#*NmXl^ManRW?h`W8iNKu^4PV z@0fSF*2TV!>_0J-*7@mvDW}#`Vuv_8P6sj8xf~3h8*5J$ubjWaUSzho2Q8UD4hb>m z*?#@WlP8O_E!u7A8a$TX?RQ+u_yelX?O?MfgJ|#X)ZRWA3|AE^8#%`A;||iH;Muo} zjT7y~&z@~Hwhl~xuz}O*$E)+ykahRDM1_Q|!80XAy?%XGjZVu;aw9X1!uVwB$96M3 zO7{s0=1o>EX~DNhSCo}S!<)SibA?E|b!8^V`>f6EmvBM%l@(fuzz2@|)Trq|RyA$??I#LRzhiG|o5JG;0?3mlj9*(}PcRF$;C}3J$Fh zoPNdE#mo4gZRxp~pv9)FvQ`cB^p2@5!Zc~mZ|4Y`ooP^VW>9k?(lRqoVdj558b7%l zmDbf|F~c>3 zqXDNf@+i3>0=TdJ?oDs5;b57O+`8p*EX$3wmDq)NHp806yJf>Aeb^d)%Ssn7mMB}8 z>X?gX!ZtM%CW)v%KimW_Af$%D%{IE@XZSu@b2y|i8MJue=6d-_1?FULZ`t401??_U z-!Xp$2UE*>H*h42?&e6f^enYNx5M@ZvPOUA+YZgb8lyiEPHc>ma`u8>I*v4^Sjl`o zcI=qfT)REvn{ZOAeNy0C$_g`&SIWsC>`MX#F3~~uFHZEIkacZ;UoFSC^J{HwO9#mr z&79wB1CF@<_qAd(Bki*c>s7N-;$yF1mb=XBZuFgpVV==j>EQ9Vtdua zNf9lXo5e&$+g{6hdeJO>9J|Y~b`9HnhdbRVZTpQaQev!dYJelGb_#6qwH^5S(v0L3 zb>OT?GWvbE;-W*y$hxj#cWZX&K*J` zN8?aj%=2}wX}AxMVP9tA4p;S6g)nl8dzv5fSp6LPRZNDFKYT+<`P#L|3#ID=a?Fd} z;?CJTR0$X8PQeq)yhh&?)XQnuCt!^({goaY8#_eNhIke3=U_QD(;+xlpkv7Wi{8@< zudN>=W|G9I=fHri{bXL@c;@}F@9xMWZpCvNO3S}_D2>;6 zEN@%>hrsUh#p_}s4*aU|p6JSgEq7f=NN5`u7xm$$?P!IY^UOGFW$3G^sV&ZRx|4!d z@%#$DI{%Xsomw+>7u)ji>AI;Zr%#;tjAN;s789ew3z9sCwbYv7B9b+Ypctv~(un?W0;!8%2HtNcohRmzC1gW z+M=yQ*8HBi@4x}4&LUS7{~%u3;@wU-etmItv05CT;#n`N3ajFMXFNU^-bvr58ynNy z+}xU>EhuXG{wf*Ad@puV4RA$EaW9_e+F8^#k59zWvv`&86uJmur(=ZA)!2@mDikcb(wuk;+Qmt(f- zOSyGjOu$l26_+Z+ElPCwq+MQ^P01J;c6!YW)uHIK5IfdOp`5(&D*5uG&EM<_Oegik zL#k39adOkqc1}?aQNYXl!!7e|Yv^5`4Q*3>Rr?Pg9=q2&1WBnWTGX7r+>_+{`w0v; zwPUz+hUq!K+zKZtx#{N$;_rDr~FbIXty@9!Ife`xUON zK%8>?`Obz{!tNO)*F43*MU%;nw{sKSL{0(UOV_Sl6a6FWP*>!mUpTwO5)QUGB_(Cp z8?;KEo9uPh5ZC5iP3>bZ7O7=$%04o(E}c(h0ZiF@=U#aM`d7n`=e4t8ylOll|=@&&Cpot z=RuOdth6CSL@VFEO$h;izEMp{Xx=yl1Ck+Ih$t!b%9U>}@6Mg>uVGA-Pa1i76#@=` zoLT+l3mqblo|#!3);ni2*Wpal0y{^*X9AoV6P(F)=kI*q2N|8+b7+$6_S9MU_KmDsb9 z(PvHH%+LFVFHuiQN*c&?-F*ZQmVS~f;Fq7sTibWnp(=Ri;!^Kwu5Hb8Q+ryLH3eTb z+pK|I7>tpTb8&dOSh=0)=nz<4Q{xQS5Wq-Mt4`z>w_*mQs1_IjdYk*pJiM)8t+V?` zL2P1TZj3eF6lO6nXOdX7)LK32MK7PMY=J*S_7cmV-CaIj)akXdFf7CHxokK&h{893 zvcWb_A9|}AkCkuATkWKY>6HKyhTb_$YW2Rix=br>aM)%Yk`-*@0Gj}%1{$S};6%9r zV2oxRMBcpP;1SX%JXMh997w@dc1@OBhy^Z<7o&e^ydq`N4nbJ^4VOZiD-K{9x4kbYAO$XY&#Vq7_$2m*P#_vXj4916qo3*a zpCos@zY}V_Q^%11S0#I{GY;cl6cHJjQ_%U$=Ahi&U-#W8Y;S~d8*2oE#ti3)gfH_D z$0P$6y`aQMp+2&6zkTP9WBqGcvy!_hw7$F({IVWbVW|Wp>})8~F)_(pm>Fio+9zhs z9BDL%y=7M6o1aUbGYedvuCWTC5IS;~Sd%o!0hzGIZlH~|7m%0+^i>RS=K6EnIsmYVI4627*#`< z)#aJ6Z9zf^Et!#V*ihG*=%Kq83vYkh(~V=~pz_C^d{k4{@5Y_gNw7p2MV)RfP*1gG_Bt7otf@KX89#rTFwV~VQj#Jf-jq+2 zX@q0uUeT7s4PATTrK}N}R99EeF6bm(a`7+r3AP!j;#O*PE$*g{Nte_PHls+u=U$=f zOwFD?vutQsJ`Us2T}`Vujtty%hE3slP2uh+wCT(3j!MgR{WrAoxU-Mdo` zN!U3Ievev&yA;~h@p^Vc>^Gg9fP(rmVS(pJZoeHO+8 z9+(8RiH#z4g}sFBbS;(=Nz1E4p8?r9wY=55utOQe?BzeTBv?{V0#N%&fe=4%u)$H3 z@}J!(3-!uG<&ql|OyBzR0n4-FVl-a-LHuN9|AS~mpm!u@@(&2GEmDg5Xyo>4E2Kd7eue3QS_cxewj*nzn;J5w)9dcy;E-8rp-jndYHG4# zo#`xej6{R?=FKqxyJ3eURM09^TpT$LfK>~M)LaDcuE{h$@~e5yA9vn1I9kk-eorqG zLNoeX4}QrN4S+z>OK!#af+|%@H@hDUPNA%_Cs7&tV*^tFgL9x}o1%gS zqnKokUr0B~F-wO`g~B{Fc}Kkzl|vi!yB?tK2|rJ42zs(^|CR})!nxS%Ke$7)mC$Na{8Y?9y8lsQ=phK zE3gYwTpE+eu_)Dp`#QX{)yBpThspGuV+l{Vek&`=!BSR#+J;Mw9^A;Wev{CVUo4|+ zlaweCWA%t&Zoyn0>j2%|yLVHomxGxXiV?1YG~6nVpAI$S%b5VeLUDOY8AY=((mB9V zq9*S?Fs3e%EKWL;XG`+C#9j5<9@L5!cfHvzR`P+UQNx0wRX8a?Z*+7tA`J>G22`rE z4qmj3ckgrna!FM6j*K{9R_6N=I?D;A>gegcAvx3Nt57XxKy0SrzU4)Ui{}+sZIg5D zkVKFKr6(8Zc(KxfJ!l-UxvCj0ruI4j$ha_bKW*(M6##i?h?QO~u&euXu_Ra9H73;? zk|ZJ(r0#tGN5%4(S!enpLG8YrHnBU6flID`3K2p#%JiIf2k= zoP_=JH+)-qc2wzDSiD9BF%%AJ5s(~8LZW~%#XH(wL(2Ms`LaWO9VVP} zhr$_ci{`_%?8>DlTMVO0;$++tVG;KH@&*#F8F3jwt4qB@-jyS7LcQQEX$t|OIVsKS zdYl*lLMVJaW8v|CR^k^+XM@ExE}b}W0$yK0PgnP4Fc&`o7LUlulV5PgS&6-xZ61F< z!<29b%|CK0=?j*lD7WpXYJ^0`T%Ku&uQ?Lts#>%!rZ#mS=|~ zfYf4V^)O9nm)l{pVLq+xEDTw;jjQmWo&qKBrk~VjDg%Sm)Fh27ge7y0-bSXgAs^akhy5|x7&Ma)-Q=jJ?y zPYVx-cT2TSo4`DnAvU-y~nQ<`j2*1Kr+OsthVfGOB4Fxc@+Wc|Lr~wXF#wDPT zIXmmMf8V~$?CfV#G*t-WP)Hl-=={o0Bx8m)uD7i6zm~icR{p8u$E%iuoM-iB9wW}D zHb$HV3x@0zPzI!5*&?0DthHXzBRHLcqE8r574@3A;bafF?tWAJyB|&vF5?sf%i2FI z!2%`|FlK;1oE= z{dDi%y-Yxa(x(fTXq1(7APHV!F4bdL7K~#%5u+tm@@sw883jn>nnVi~^S~nmJ$qN$ z?UUM|G&W>Bh?IHw@F8zS*UzM}?s8*7^dAxpt)Cumhx~LWVUYCV#V+=Q4@H9eReyg! zALc`(IEX%$4KM=*>s8d^F5Y`nb7&r>#e^rT59%H{+-#=7e!b^{N{1*-sn zf%b4xP^IiRq)~S-hZv}-0U#P&zI?fCX`&npQOBHTTK(?bcexdR)MqXoJAXdEDKGsr zHP@23x;(5DVXi$7aL0say91i}KQlAfdfDNTGDfbmS7sKWp+zXh;td2wbwke0K#;-! z(UH;xduD_{%ynv36C>7&mEZ6j`r+txX&~3WA+c;ALgU9Ou$C=ED}DHiRFDktIlb9z z8*{`82~ST?;|8OQe_Y^~>Gq0*dY5oAFi%I`dYq-SGH*NcJ^bZyRTOw!nr*Y9Bjo}5 zwLv(|TeTYqz&^zh;O@LQ`G|G7f3-#)$jmg{TD zUIX$WhOmB{yExf(D`;?a+jbKmHaUWNG_+dm(%$?_NY>HO(ayDFuhzwnwvF%S>|mdM z2i`u)*s6UX@({e_(;Qx#Zo2}<#o5t1r(Nb~ouwMzadB};RXLak6s(+Vf|jNKI7!hj z5bl8B!H-Afpn-%Z_Vt|Gp$toFjVe`(JZWk#0}|RZ0HfB|4UNw%14M&z{EVz@d&Sjq zp(20(J}nAn~X_ zAir1p`gJ64q!FZtvP}zk4@(k{QX}O-BQzvhd~4QQ+j&r=4j1)C^It}S>Y2OQ}S-Qt*$U}u@827B;u0Umed%0tLv4wh+ETU(2KoCy;pGv&SP+;0?E^QY~0 z4k1(&=bY>4U9K4&NdYfky!qQ|5%^pAimTpiWQ|9lt%Y7#Z+lZyddPL5Ga;9*^aqQc( zFL#x8A)TPj*m}HRH>EQksDXr_l?BDo^q+awN;5ODNlBBs?v#dZOJtZkB>Q1!%7PvlWJ0p=t zZWv+*LU!_FmkLff$SU=j=%G9F!=hFc?b$J!-tRSC|z^fi3&} z+qZnN-yjS`HoQoJIN>rqB{-$J@xy&V&pbvPMAqNGZ-p<6>jJGQ+a;aan4smUA-CD^z6`9Vme)l zTR`FGvemx*`$r*$7m4ZR>1$)!?E4TIPfOAbJcD>B$^0@a^COO_@k z8`5$u>ond&YUSM_ZQk+W!G`#NC%zhHo{Q75jyx9Ok73hgE z25seT^wumz*{p|gapk?epx65y3h-2xBL4byv*4eXgir6@wk~r^KKME3<_b~4-Gh?@ zqU|IFWq&}-j25m-8#uWnJBvjF|H#P8$H!6d-v>RKB>4FEtULFsrpuqQd0TuPHB*lZ zw8_R_A0MR?%!rUyU5jn5z?flwKM^()_IHJkLm%6L2Qx1e@Id2NJI2qYn#w85cj5Nm zI41p0LYIqWxwjN!ChKL4eTPfYN$zDMK33!*t&Du+YXWPzeHv)W%1?(RKaGv@+I zi{kdFaumL;{6s&-2nz?~LlRIH&7T2jl|(-JN}-`S1F=ulwe zb!#U}3L6k>L9+dM#`t}q@Y=gi4EFGfNJz9OG#wNWm}rR$9M0}SppEZQ~rY(A)o^r#r(4*?RS*}8Hy;l z@6;g7|_Fxl9~J?h)^rHn+JQ=~Gf?5c`N+!FoAj~lr1%?_RAQjZ@$c5F<(469Y+#tlh- zyE%GWZN^fdAt}8}JFT!a>Tz2?_5&q9p|J@`i>JiIxV~ygL4EG#mg_y)lY=M=SQssk z2fTo2q=Wb*!}-zK9mKdb??~mMdeBm5FH*uszl-Fx0+jDmp~aT}dbr&SLfmyj`_^8- zj6ma3y2lF`<>$VLOj?hQdsEo_kxQ7brV`>fI()LC3yNkIR4o z#)22dd1ZNlTFqz!n@zWOr|Zz9<*i$9>>3htN=iz+v483Xi$e4E^YHlpHT~e=-KD(% zP98magvrHEMw41oICq)%ct_@Q0V5#EhwyJ?dy^JRiiLoz#|$kz z^&yWIkG3&#Td>g-<6^TIXVs$0jse!Y@tj54wTabe$BFFkqXk1}jmFLw%kzxWGQ@jQ z`SQxOXx$ezW{k(9WqNN-7VX`2am)Qa8V*KB`i97vGZhn~!{IOoDk{O?NEzAvw^rt44dP8YB8ZUQ z<>BEG=QSmG_;5B_w-o`s=XM|f9W-AhSO~k)yI|(|vu7?IlL=6G8X6c}7ww8{vt;^c z8}{kgibXnU^;6O%i;GeRXMev?ZlhY2*9)1o`5xm)%^U`hrnm4#rs1LFI2A zFYe9l1=JjO;m%V$&>ak@Wf~)dGzx91HbY@8L;oCJ4zisyXc!Q)A`P(bho)-;X{dxn zG04%nvBS)>yzl@^BeANgDzK-VD>1I1S6oz-dGTW@kjfaKmlWClY$mOaXv|xlaq{-WaI4a+RJ1rzZ=^Ig)cNnpaxC#9CTjys2)+3x+vU23>ecBnT!YX48U z#0zTVhNd58)N2dc?oJbc#P$j{hc+}&zy7Ynd49Ywp7$cnD{wJp!7T9RJGX$vYZz}e z_wiMhzF9>|-=4!^9a@(-9IRD8joiI*<;ssoHIPXP>@5BJKypL`9x#E6b?*37=iE{i z#3vX(Z~z-bD@X$;1uqt+f#Hh`dL62;y}k*>pt`RS0uHQDWXbZpeUI4KsB=wKHNLa( zJdiacho)ofxnhbGP3_*je4tkWs+XxlRm*aaTudGM>rH!myWOszW*F1dH*bE_9${mT z>+;8`zCM!q#Yr&q1Y YPIWzVD)*RGQM?$=jYM#%v9Lt#DHkqo;yL$uV?vZiC1)x94d zabgk+gd_hWhHD;3qs0P<5CWH3-r4Z5*3OT?hhq8NkpQB;IyB;h;q=r2I5 zahm8VU91vZNrrFdQD1t>W9ey?flE%H{vv6abo1kSGE{1dKm#DxlBjiM#kZK(-lNUe z(5Qn8Z1~>k0GLL^#Y0jt69*10!A2$7Aty20yS#gn`yn{g%nJ{An0vavg0BfB_lg8G zfP(}4TTM`oWC6eC44gkHF&QjZ@mh)tw=F%s2`#oHt)vNQL_2_!r{kT?BSk2_x`S5P z)N)_fv7h;zIlVw?o=z00Sa1zxM6Nlrmn_9MB8{w#~p zUh$S?bNB3kXMB@QOPmC|JML6Er7O===CC+U;M?gr$hbA1estIS-5~% z58cZgYu5*>T~meM%xrkjvNBRdkUj-kfC0DC^1HRr1$BuIfEsh5F6SM?1Q@Ku0gDq+0oNKSO8u#1pP5eO*=2R2DG`AGIeEY0HFIHTav4XEj%sz9_)3mB^u zHXEN77pDPwgYl#}f(NekE`uYkvt{EJ11JGdiBIyKzBRMQ9li&(=w&E;OIN^BiG)c> z<#34imfQ+c_r=P`E&ySt2kr<~`_|;Csk?Qt5~}DXK+TNjhs%Q|hJ0Q~?FEG(x4>SY z@g;Mj+Z@@zK>MgVuw-89kq)AmT_D~2=&sJ57rF34yh-}jt4OY6Kc&7v%_6cx)?ll%K0w`S;eZr#EW@Vk%p z5OO~*^h-^Rh_G;t?V+FuP>1~|N>u^77E_% z1lkXIZ$Wk-R8&}iLkwi0_bU)1=miamEub}KLquW80R}WD)m*)P{cp7E0;fK5n!UUE z00@1jdJ*v0(c6epopN(WHTZ>bC9hSPXL4O(@n1X>hLtPgq=9MRx4T$|! zQp^e2IE8oRZ&a;_u{?i?uxfvr;f}HzU-1o%q|^wsD6{HXTN6h+mRSpC@6Q{b5heIs zDjq64#7j!J&(Vm>!6!e_k{_2WU^##t2fwml&p3upDJd~Q@OjVPy+UeG`p~{diC{r` zA!;WnQme^e-02v?Br47S+JID7Fdre_Ut#($EB|q+1pMNt<~A1E-3K%VOe~j zDe%J|b~X>xlWpQ+Vrp*gchCVQJJE0G(BO~}7ybfF>6(55)oWLpS*6p^M?+UAFjLWL zM0B1Mh=mecz|4b;1IQ#IbmD}`BsF)Tmg6}ji!L7^Bno_d{RhPvB%!NUufFOHqjpRd z%Rms%1zzX+r4S=>7u~Kr{83|%B>lT8%=PiM)%j9g=5r5?N6t6o38_yaf(6CHj;M9} z&*h%Y`bD)T6xF;uac7LSa?Ek+>q|MsS~=~YjE6b)yjtz?9?yn1 zxur!$9x}rHs~;jQc1=H|o&v9dEARXXVPOVnQ_(gD5xSh9tm4_QC*7!bK7wlvND=C{ zIy+!BJO-|lAxY!r`$Fm@7J)zn(fc{t>XflMdd}Z}Zz*`GXJkY@vmvRJ`!keuZ<3Rb zgfF;Ov+pOv%BfpaSS(++Ve_k1vD2qhSQ7L*2ZLdU+9sYj1Vx(we%|Jqii#PJ>pvZI z^3oMBmf6+CrGq9-M}!rn7WtBw7iOX&B5sj2$_E9U3e%zbh!dUx6{CaAadYLpmH9*e zMq^#wz8Kfuq62@sP6k7Px7o{KzW`n#_^gPCbFnLnI{LcNnr(Z6|7Tv6o4#j(#EG5M zUByqgV(H!1$`8}3Lbz(>u3TDOc_hT&h-Yy&)awMNeSEYiQs%SzeOE`$?Q4Uc#!m$< zUe)u_Ojru;@vUOJzs28M7GpBbsNHM(E|J+&&{QA*GhsdP!V82<*<}!h9 zkOOKfjeva>N2hi;9R(k;`!v||@^m>5i?%tZ!cGTHS+Ln=>gJ?V00~A<*Uls|E{;wU zy4yIXr>8dy9F>|OrxesjEH&nd&?=T0{?O` zkexCn^Q5HcpPj$Bxvt=6rYXL~x!KI8)KYyF^(^OEy1BIj>!la}3Z8Tz=cjmBh0d^% zfVAYzXD6*2Ef-e|>nzQf2l-+g>$FZU8uK{a)+wV_{CQjXGtgjkI-a!n_)dqQq#jS= z-kg=xn$u<>q{XPVj>AC)Ar$Kz86^)s@9}|qaa|Z=>uj8L=lj|dQKwlM+RPR0YXseA z$NKq1&6$sjss-Enk}4bDm*&y=u(Z~#wr6^WHyux}B9eUDr1_t(UJ318RN=)v#{0id zYvOTo@)?aUKEMc_uj(jr$~O|6$o&?RNR(T|#IMEQOJFay`7`ish}#PU71#_dLp%5R zeEaszE}RI9n+{p3SgiTP#5xOS5hz`s^UMEOO#%z8V(GxyLmb0c`dMuN&jr0o#ajsjzc_i>)sE6#28S?Q$Oww8F@U|E6 z@ts5DB&dgNt*U8>+5w&8-XIU@ESub!%rIO2^SeKYQ6c`IHSoIy*`wFsu{&N>8{->3 zv?6Mh&=8+$Jf!7zZaG`}_ZJ>!W7P39_n6Tv&dDa*Af>a{uG3{rJ*{7-X7$B0>-AZT zL{%$8mqvp+zk9hSS^r4Rn~9bL5jJN85~{<0wEcE3V?1T32nPLXJRisQ8f3>{Ji^_| z#|1DX>B~*RhXp@$wyJ$+uLNS2zOv)W9bzl94yHP4S7gQ-DzC#PT~OWbb}-|&cv4%J zYEM&NUrXVyrrtAV5f4=yhFUx&NyBcU{oYs^MndE@4Oq1~tY+xH#_9rz`2{>1v8x z9pE%?cM7Y8nu!jL5E83Fzdo!3Uy9$^mc-YVJn>QUNqs;#Nc8utXZ z_(27r=pXdp2!P|ByGrLRK>F9sC6+GtolpiNF!;4kt3l%z73_al_P7@OYrZW9Yeptm zJuUuJihRv=;bo)H9)Imnv7Cx+m-NP4TGg5;aao((4WrBbClk`m&N;t+Lo8@8o3!1% zFZVo6;Vn;$k>aYnyJ+Kn!@3nM;b$#BGNS1T=z5dn)O78-){?!?If>mtvihOXM)m%K zE4@yi)5@8UzD6e`2nR++@vE#tuW8$|-vee3+b4z{>YX*}uz^A*&^klv}pid@XLFcCmkw{y^%%^S71OCqB3XCus==>8DShMx2O>i9yC+ zyuM%~*~b8sCOIFsl92%At_>wcFA@@5rL&>(58QL&;^F5;;#KFM=WB*EJUB?|OxzeD z>GJbj!LSkd4PnL|EkD~AxwPNfoTD7VC8d1b9XO$-3ZAg4zD8smSPAMXxu>{bu~-1w zYxtgv2#K3UZ+hn;PX0~o$b{~YS;r5JFQC0BT!brtE#GVe z117_3hCul1uZ`m!q*{<-`?LWSz4rKidT2@Bcj{(2S5<)M+H8vV>lqjf6eQ9i{vfIh z>p?`dwCYxwApWIlKB$EiJ9(;#fh8M^6fu7=7tC>R{0pegUO+#^V~#`u?*%EnNL}^; z6*?P0fbKo^D4mp!gh!ma7;Bw7NQdS*ta}FHp?Yw1%lB)^ba0#W1ZZa2$cLh z`EkUww5!NSt1YhSwYm(c9%r$C*H>r~a1NG&5Q@4Fu)CA5p{6So6Pb_PSs%GO^)dB} zAS1UaJQ%L+CJxEc_k)&1*~M2{boQ zpRE7tg^~qXln>QIYeJp4m9ahquY|<6__v_-_QVWxtlt6cDp5!TM!L|#DrngZ$e^w- zcV(aN;%xs`TZ@_|YL>sKgKh{i2gv;d#DRVE1uJcwr5tKD0T-4t^W)(zRnH0VU8HWl zFe3xEMaJoNJ_iWB0+)00K37*e_ErW)q#>IQ*vSjTen){_H_1}n6rzStk6+F5GFXAW zq@MIR68hvxQy!ivl11lW3a-wFG~h~)zAFh&OpK1EjwL(5+%1A(B0JLjwSTxRi`AM4 z^EwKBQ{4jtz4RLbo4ii+)BcC|6x?@w2S)S<8|D>??g`?8a z)Gnp9kUtkpdR7a~WbxgHzJPZH0H`Zd8fS?Lj+qmNczmTIw7b~_<#pNXh~$OaRlHci|d|ud=9l*Jf|K2LPsOVZ6JUQ*2aj)$QUDO zmalt8FZyL_+h+j-=wH(T+Axjq2(>|&^EmzkHWYOrS63x{r+yjjoao|AKUWp( zw&>_+!kagr%C5)Dj;2K-lf8za%`c$%n#NrF#bjkoHDbi1RNGd%C-L^tR*s04Co`$$ zbt`VX!70$x@$;nJgJe7Bk*Q-jcL%=iMl6=4;Et3#B{aGs_=5`Q zf5A3)guVta=z?%lT<>-sfHpW*B~~Xj+4ro+X3VP4j3v!EEg>chVBAUe0dQHhBMsRA zi~RwH&$jF$4ci3|CC1u51;^l!&@_Z-Tz{BM9N8Lce=t~^v%y((g*xY^IdR7Vq|={c z5jVkuVCdqK4JMZ#kvmC&GgEjaz z^%Xw`SBTnP8MmxT!TOBaV_kbIEs^#TN8(=vGyEvxgDCpQndhhGqIw>-JbQ&jkqP1k z_J4J412#|YSRdnms`0hQQJ9)M@?0FW*5m;TCQay4_pC|-59m19WC(KY{Z`y1ign$? zq|MHGMTpk?MhQc{QYe~Hb2NwxpXJIg1A|;P`ZiucQ9Q@gs5WNF6m6Omn2j~B1MxjH z0i_^4;@f0X0)%zc&xTrusiyb_K@e+!I#sd#^6Vv{;~TO=#xHkkf>jR`0sv@8!dcRs z$K3mU6}mLc2y$vnkeBAiiUVOgAtSvxxyBPjR4It!-?0_%2K0R4rC~wOk2LaA}3rpGrAP3d-EdrviJ?qb}u1*H6mN&&z$|q={)&hW4s&F4Rw0uN_{SuJ|;sjz|9liQ-VD!a}<<}rts6H5A@ceV} zZV(tf#`CI~t)?pa9W;ucQ_b_b8HA z(M%jacpXp+&~|bK8=u=8L<}!T104gqJ`8#|0u^}X)Twv%SL6|fw&H~r>>ij6m88SS z^$t`O5p`p~eEBj?*3&Lkeb^xBx|4eB9tcH9J{n>Lf;GnO9qq-?#Eh9TsMFYwn|NO3 z%|JOvg_z$n!lpwALv-ih@US!Bf4l3=CdXBux57Q_H-~l>yVIZxFrG94x>Xdk@FiG0 z5@!{x6j_;nLcQV89+gEeCj&iBp6hVd6ng+!6h`L_YLNnqy^|gvF=xTHvz&x%XJA~E zrj$donq%{ma4-NOaYY>(CXrj;vH1k!nCr>2XK#Q@`a)+}X=y1ARB2vvST`7M9H)O* zBTAKz>^>U>+Y{A&pu9tWg*4~6H2Zh%KLNT=beV!vT!7JTojbzO!Ap^JD26hR`DwfO z2sFk?@v)I-dcHp#^^A=I|E>#ZE|r_Z0LuZX*9_Qp4QNwn0k0dw^>8OZCun20%Ns!U z(m!91FCqsaZUtJfy8VU|ka1c}4Q---+akj*07UY9@i**5prLZ>X<+)*Wemn-BzVW2 z)OvlYbdwfhn2k9Pw}oXRTP_e8&}RG(B7#th1y7E#qhrUG?F^wfQ9xF z$d{<~B5s`rY&YiDz^e zE``HX%q%9?@hnwP?}EbRH|yjNI(DH;`-Qy95TJXK0{%RiAhWE}GcsiSD0H{xw6*E@ z;oS;8V=SZtMyPn@6fTHJh&UR`BTfb1CIM!LF~%D}PGS}_>CSDG)i&X#omFcc;a~}r zq_cWqzrkanOoCeZ+f%#L{rkgRC#hav4%v@9+%EQ_OKV=#tne#Q>l}D`U?Ll#8wv|$ z&rBMH(q>Uygl%bQLG+|Eu(ei!#Y9+g$i$2E!MLuh&or=FgRwFf$xKtfKJrStyaF2X zqqW2;5cqFFJwx5c&>JlOQSRnPnf2pla9Thj93fDbAa4w7duSHi3OS|)DkwT5SfD@=k7*0y)_NWy_c_FU5Djyzh=$B<%-#Fx~Y_Lt90;B^g zS#$g6i3>;k+f;8`vv;{a-lg2Ie2Z^7Y}od_mIuOANXGNI0IyvMlfl{@9#o+ z3+1V`XM_mS0WGhp{m=+{$KD=j1}&ttZQxe8Id_Su_-aP_x=!22+t~3=m`Uh)Fh`38 zNVqqk+1|N*8?`{LDS@!#O(uKJoYag<1AE2yinOf4LIY$S28lZtL^lTb-u2zw+`<~} zLfad6MgqAWo!2leK0%3O{ z&O)?AO;gB?jGXLHX=xY^%7e+f)b4TfgJie>>h)92%K+~p1MNOAWjI;p5juuYY6fWb z7XBC^aiFetY_~}^Sx#S1&kI_pM!|&N3<=O_+071K53ouZG+q9*pb~KFqgJ0alnfc)#p~VgT6Q)CikL={voQu#6wO6;FC;%07g@`D)%(#* zk>H3EU>8w)3;_9T&hDOhbMU@wf?NSNVmYL`!?7#~8Cl^M?m%Cl|Lm6B6|!}?cMfXX zM2jEN1UixfQWU!=5G4@|oW>y_RRtUn0dlJz?CaMs!Me8c#>K+jK}n$1-Vp=1r_}A$ zqB&&voTE|q=MLu!9EHf?jv9GD1T4VSN=X{Q&O_ZMqtNI(d*)IXbbX?<4J)1|N3?>y zh_X8dCpihuY^38sk^Mhi>|tdmDF1d7wLra*Q=sryNC*S$Z;f!sgiC^uA@grMR1drX zhehDUMRH57AW711D;z(QkCZ+*$V7U+g1|d432qFhW@(V`kre|qGNh?k0bWL;gT!Ci zwf~&fmvrw@VBA(~mY=Lh1=dzA0uWFZDiq4D7eHi$3}ii5M$>Rb9Ujo0g!+WOVJ;mI zv&aN5;PnVN^x@`Q+P8)V8hDiRkfPX>*YKZZ90;hQlde?|RgjDhoSlA>Vj$`UP1?!P zxALmr_FmA~mx_}Mzp$hM z`H#Z}?afvQP^w{Op2?X0XqqIhBJx zhMWT4fzUuJ4L2SikXTV;Q~bWG;m|mOnn4dGmboXrE!?<*3ic)^`&aDWa}lHJ*nwEt&AI-zhk$Hr|qj^j7c z)B~_0NQZE+ z>U^gO+H8>fVXar-g5+}utjBOFj+@@Rh#-Qrz&tSN#5^3?I;!(X38Z>yWp!&*nnK@W zma2eXnr^3-p)ePUdx0PpK@YXl19rAjuCX<7h3&51iGnEr;Y!pZfiSEq@5*9?5{YbX zj&d)Kej3{UwZSu-U!Q9T@e@UVRBYSLGbWLE3u2ZGt`{}i07;GT&LRMZEIzlA6w?|Z zjz(yGKDe$9h!pT#BI6&Ipkg-2U0{L#VH*ppAdVD+d>^o+(sXUq1A$dyLT+_{_1{ro zAHL9q+$;drkYWt=R0rd3sqCLWe`aBgI03A)8?S=G(+N;JQdTP5mVuuFGovx;L;&+! zI(WC$^mKGypd&ZJ_++%8zBfjPxcImh(Z@~Mid~FN!04Gmk|e<4Dmid+$HMH9dH_M- z!A3=IulsO)0+VRXR)bz}-Lb9Va5VoM#ue}S@B~qJhpc(LQErsc; zVS-9lkjrPv8_q%{Z4_O(FvN#W;OUn~XGetb%Ny-Id86^~-N!4oY4KJ8RcJcC%oN+{S`Opy1igVMv|!-` z5-EQ#X7ta7#eNVBAfutu2Mhp8;oh-?IU@2+qszhpDX8goe36W+O6uszsXMm=per1f zlB;5#48+^o$s$ko3e(~I3OCv$rLrikt3v^XukCck>)!?aavTnm==3|qKF$Bm&NDN< znY8|YPSoRqb1?or?}g+4>tpm3@4iy63ppwcOSp& zW;ur7j;C^0u}&nBI{oP)4}`3*S< z(S5HEV|`nH4tACoCSkjYj=UaqC)kB|BYMh@d@tMR6j^8{@m9R;-KPAfps75Kzm=_# zytrh>wsgrZc^s#(nrxSoZBa9G(uBvs{deJuNOS@u2Zxd}$gmPNzxS!}&0;Orx$3>9 z3SU1TdGf3AON-xxLz>+A%UwRB6@gYwOWv3+>@Gl=hxNwrw~P(kGR@y?BPsl^x3H$OD&;;7=*)VU-4E6@4#hL@QoVNb@3Xh+chG)#9xg%t&1RbU=>p z6<0L#P#O`NDzsD@R;@`{MpcxcCoaALZB)CHb*Hw<-- z68sG-s^VuFOES~@haa@e5sTw2GtJ7Z2by|4+BbC=Ry;L0OvAUFa9a+453MFe4IiW6 zaG6WU<>`!FS4Dl{p|||goOKT@zh7@ymJOwF__`}*ayOcP=rQ}^`ng??ra7^maRT$& zgmX|`BYQXJMxbqwN^k?cLrI0wfMw=gYs5S^xUT#b<*f$2CwHe;BHr6UNEEe zdszl=?Dc#zT^#o4&(1<=Re6_aLs5@OiLHQ)sHMl3euK8fEoLw3sD`HcxMua?wxzu9 z!~Oy?JUb1gJ=;aJMb&XlYi2G6fzia8OW%iuJ>&Z)dW&}m@gooV@GFnzzT4jDi51Fe z#t{oNw#y3d?k=c>T5fz%xWYDcW9Y5T21Re$?=m(QcX9%=!)D8TeD^NBk^+9C3OBbw zU@n-LbT7YL)nHaN<58vr9~GE4jA>eP`Qtg^_Q>!yW~6MITQt7gbp-FsI8)#sJ9OIW8OP8vds}bs z?$e!eEt5^*7VD%7CeLShgX2D7a@g^~299o`lZp&Uf#Era=lgXFgyzdS z@dmg1+jLZ$|LmL&>J14^#WHyIeEkv1D$A~PV|qP5z0q7TtWbzsU4GDDp$rhTpPPEk zu78mo4s^RMf5LM0)4NNy&rK<1yE-rtNvwzJ_?!Ey3KcI$uY6pLt2$v5ol48f^=OK; zgb9Db@kdL%^&yaFKiR~8!?!tQkh4;%$?CQv--Ag9l;71}Sm#k_l`xh3%Xxgx-kkO<}iM$P%x&uEL0WJ-spf z;EO^5zqG$j_1A5TLi-JQYGRZ1BV~W4wz-!L@8g@|J~Wm%2c-?&ke1WRDU}fy+S{3M zfD@M(vBl=lTE7-PrMIVS)!2HNarG2*Y^)c%gPsd;9~A2SN8x@ywIgWU`O1CzCr(H1 z>@ABXJ`s7hg2K-b4Ek?A%yC?t76?FaUh&Grlm^)??cSCF+}9;ROGk{b-!p!BZ-#DZ zsT*wSRdJl@xa!8`Y!Ozu{uqs^%SHWZj2o)z)Cw8ruZfqRzwJhR>oq?O(4|*`kDqnM zuEcZ>$(!A>Fkk35u!|2zcXZ}UciaK)7 z7F{GnSD)}9ukYF%CY}T%$gY(AC+5Anzg*YYW+yS4e%sShThKJuDEjx{-qNX`MSOSZ z`6VZ*-w3L+*7!5@a;vCyN$hYdyiNZWUU0JDz9+`JAUEQ}&uF%@S($I17)5-)n%No6 znWfb|e$Rtlg}M!vCud?x$XTgF=?MFD`g1AAJnUuJ8O8~^WsRyhEVKH7#%?d0qQ_P^ z9loAM`_R`D2B*IZ*K2B!l)Y<#Rv0MTvgn=_vrZ*xQ!mr zFjU+u@O{|+=krxdJP3=0L zYQ)QS&9FysJ!&Eysaz2B65qQau(WMaCM+5*nmdVUvm~98s?$vc24vQ?e)mdgpK(zJha~N)#>28MSrHVl@cmhDshY27KW& zy1kU)!RDMk^8M{ zgv;&*8g6S42A_UTHr$z7^m5+jyC&<9^c&k-$t+sisz7koprSHceVvtk=v{(e3rSOc z;mi=|G|!SIl7X~aa&9LaW492i>z-ZuaYtOO@5Hx8e_sMgjqY8dUhjwo6_ayS(S%)dVA=F%JkxlbiS+kVt++F1T8Shh?&h^Oc;1HK zQaeT6%Gk4`6E_$x?yKldw7*nH87+*DN91yS?57_jHI3#4*^ZFxxtJ{$G`=CYWa^EeBMM5KS$RM8}FIuIN?ARI4 zX7Ty+MtO6V%)CCG$8uk79#fUqmfc}1t3^a`c&9sZWQ2;XZSnV#irs&3Wb9!$)? z;@EanNHLLIP#3d}8gOgsV8wPL*)7u#Ryv0~F0A!lwM~v#_Rlc+Rbh$EJk7XpOrKc3 zBcd)Jt%|Q@H{!R}&OCLuFJZ%`$bPc1t>ds^7=?M#p(UfD@1`#9^JW*B)Ar|4y3Z?| z;OBFCZfap+vOO?UJ?>K_GW}f*BT!l7?%T-nuKs<`Sg2oGOnn=pX32n z@?_FA3qUigQGa6<9J8qRSmYOkM^Ga#FE2n}SpG7@gw^lbYi;`pwIlbB;3ER{6F3DT z2oz2xyeA0z)s7cAZc=0^+UsUEoh%vW+O?$Km^q#PJXBPwUWYZSC+KqoOW~X2nl0_d zYsg^ImBDvO`!Ne<^(_YkyzJ)|s+?A;BhjeF@W`v2oPV8FJds9LE}(NvmV2;gkyJre z3r}}dvv)%*=@{A#B%o{SV$UNgJ#-=@_&iwH9k&C9EF3BDU zHz$AgXw%h)-y|v3YyO#kgq`zKwyvq#>vw$o?)b~vSUgZoqT-VA$x<5RkQI5SJQVo& z$;@n__KIGChQ^9baqHSmqgu%V_UV8a;^Su@>*O*Q0uuTPqV^ur}r$A&?5HzgJ7%RV&8w-{Ha0%C9< zA9I>2ODWBdyDi>CrE^fZ&mZoq>r#E!@BHJMqS>j@sSH*gJeaDCtZ_;D<7-8N<^h?L z)cw9*&%f@e9~L{bTlU2ktjbS!gI2yUk5q($AI=cdy^A2GpJ7PTi^Ec4>h`~wEwawtSidCdJx>5jha<#RjZ@S007 zU!jwmpj~fRUq}FODj! zx*IVHm~&fYx%Ng0P(niw3l%p znE~M4h32X+ymh&UDI-~{jyU{cXkW+7FDJ}{_>A8xyo`mlJl~iyQx#k@ebvQ!|4?3z zF6s#M?mKT6kIP|K>iPM((T$5Ba#v%C_+7(yw8MA2$J#_V;~tgZl<*6dy~UAmgQ*hY zr$99jTtj>Mud7E$j^Q!kNUoy3fK=$Dt@4)^gRa&rLDcVMyn9V7VerP9L2X{%u(-wp zZMO@J4VKd9ecE*noFW_+J`q{{<5;nve1~NVj;be1)T8Q(Wj}VG9uKvA~rDI5)xC>bTc9|{fD!+Wk7+ITS>-SR{Yv*j- zU-Wxo_Ky`UKg*^NwmQ-l!(x-jrWxL4Za_OP_Si5L{&-1uCG%A%HPkJSTj?)g|8b+;=L+sH{r%Q+h;Ma(Zjrjbl&OWZ#}gy{MD1>G zok=BpxfvQou_$OOYw~?})nX>-XV6pRMCg1%9q_y!l4W`V7cMrxCX3uwt?a;>0C8Po z2eea0{%PlASNh&FZ?mtEjj#|K8wuE}_mk2%RER=4y_py4r-_siB;*VylP!dl-UxnK z!>RqX(0lnWDGW(}%gVEARmMc^cc)rM5@<^#>(EdGQXJ)ZPj2u&>b}{=l=|0avS`Yb zA$z%FQmYUy5X9`9vldgR6U?_pAr*6xQ;~SWh@Y6Y$;|mE+$?yg^m)&41z4kk2zwfX z41DuL&x79!+e4BxsP3A%#9~q}34U=VT-PhIF|v7|_XK-YQfT;0^2hP37oW^6u6=Ev z%mO7|_w+Ak<@eX7KJ9~+L@V#G8`V&me8yc2~QV4GyfI+iLd}&8uBxhz?!DeXw zrH)WhB{gxfjmu`txFtAeYo%**6SM2~_eOC?{>z{gIf=h7BL6dB<^R2rFnxfIq9oq> z*A8x(U3Xu<^q_R-#LjW&XWuA?Ry0K4kYg@yqz z2Gl2^b<~)ae9V?RgUSV1O982T642DZU_wcINdoG)XhnF17a8pZ)(_~K%FoXa0}vHJ z27%iUNIUs0MvlY#p{X1FViW|ft{w&>M~q7x9x=if|Dgt@Q2i!6JQXlRC~ZEVTmhQX zBi$|o_f}h5i_RjTJaY}Mt@+|+5{!p^6fC=({Ww2}97Ru4!tT1|4)TPaz8~>unnf0LSNke(-rY^f3VP z-UVX-h(<_zHfY~pM}X=J(2*!DJ|I7`3dY#c9xg`4EC5hL^Z9@X1JWM`WR8G^1!i?X zJf#B$9o8S30tL8#t@sYvXaZ~y{S2Uv0VDvJB6;YkP=}6tSn*%n0G1bO*wihfY8}|FpZ7Sukb>tqNVx zZidqRhxs6*r=j;UEGh~mmjlpU1^{rNh6~V9V1#@Qj5V;`@Zcxu=rW-71mzBZ%6e*q z2vQ9Ln&6X;zeXit@zIYdrgxTW`KjvfTm;f==s4B{EKz14B2fX=xr7$RYjzR<1Ovgy zZ+#k%Qjwx$6VU2Nyoi|7bSFwfy&4$g!(pNS#oA@929$X4PECM7!wsb}iMn!}JNJ}@ zRwCvqg%nhe`+@HXHV2+d|^p_IGwq(ZW4+KrB{JCg`6>$lKFk$qHSTOviuz zY#)7i8(=-?JRqpsf8{2XAaHYY!&f~)cLdnu1_uWPiE~6A02u)r84d*&f=s~sC1YVd z@vxpijDte=Mq+O)oknNQ07e0QlIPE!9VOjoUSj@;)Lac3!QffX{joNK20H*bg+)hO z#_mUW8piE2py>rAu!3$bv{~E4#AL%`ox5bD1)!nOw<8ajR25H8PrvFedWiv`2Llo> z6|jS2wxY1(C<_s66^IT>y>l|+CC6O9q`W3XTVe}*;o0~R71 zplmB{4n^^w072^q0x{qMPDU>i9$qwsV3B(m=r{pR7Qi#=ntiApv*Unn3E0;^8t^=D z#0xWk8J~323EC@ef|7tCT%!)qGY%>Pt@Z={avxjn9R-DMK%C=X>#rW<^454j>kF`q z@HcPn$37P^Ha5nUmcB)3B`P3FNl*|z^GZe_1;ymR$%uspC3MgO^ytrI)_22!0&YRg z^mq0FD8?h!uJ#a&GI5A)PJRUH0`R`rE692nkkg|8Y#46=kjIi{gX$GdpcO!0g6CDl zlYmfRyXd_8++cm7OD%2gNWzfO(QAmcB_Ng!_SZl=4myepdYVw-hA!s}%cEtm1OS&K zR8|hUXM(ty1CtcG`OpCm#9wCU;l6tpJ-i#=^vfN;!clD5b#??S9Xi24b7d4oqnCa^ zjBbEn-6eGmjWjsC96US0x zw*VOr?VT#1?y#qjby4&L&p=mqu_7J=xD_nGt}>tv+cbf@!~h3yXSA0dgo5VOsWeze zN`NOpj{;M$nvM=0gb9vFROC@-AlwA_@QPOUd3l)a0gZ}P^J8|v4XDFTB2fUdJmAwa z0A`j`P?)-cEkUk0Slg zK{bH>X*mxA0;s#-&~ShTfP)co0hB5ba^q#zxn%*91z5L8(Bhc|2;y0Di2~FO3Ze$` zQ1fK@{Y7T*J7|;+pgF`YPkr^~b|y)f0|7;K3p`1Wwz)TGPESuUB9%nNEf6AoVALZV z+bKUnO)WI(_v{%UlDf)Yz!;ue00k^oBu5G_19u4!2ciQ804ooKwLQ|Lac~hQr(%># zHz+8`o7asbVFhK>O-S%QaaTdv<7s|wZo9}4P^rGd+Txs$QeN2t7~a-zyiRX z!@Lz(NKP=6V4?-~`GAH66!Kk=JvE8=KcF;t8gTR*NcOKD0D)Q z{x1ODdl;+E4vG}|RG}G32M}popliXV!lPiI%m2|mJ<)4=0FVU6Kvr4U{eLW{D5+vh zi-xVo*sC;=duu(=bYKxnhP(^`5WmyMpGzKS5SzGn;Zmq~K*H%Ebs_p?n&jHHQv(J_M0(2QM)tF~*&<|)|k ziBEv(1U4f@JqN^NiK?y6e98L0xL0s#Y5rMKv(MMrJ?+Ku@56_3*1xx<2qL>NrJ5 zH;qam^gPf^4ov1EbPB*Fngj?o&_cg-_hJci4BQfEa}oFTTrh;RgJ0xPrTFQSvZW;# zkwPNb*wpkmvZV|OE&$10dvYjY2*eaYBnTiLC~FY7KSMZ4b`|Zz=Rk&F%i*q+eeTnu zlC7e0thz)D#_&L^^Ow<7q@NO$7Jz5yLG+;I8P1;STFD{s3E|SH{J4_rGk<-b)^y{5 z=T&zYz@r?=xM#*-+Ly);yK7-UN?BQXqxJ4sZk$FCZihmnfEUHg~%p z3hKTbnDNpDN@iFh=yXy59DYxq`7`hU(T-7|7U$TKL5jee1oPbiBWSMO@48uASGUKP z4W1~@VdMa^;|+!^=C>dMOjrfbtxA9nd9a&}u!|_h4-Y6s5rPI;jl?~e$To3L2#hW? z9lZg~19bf0d;nS$bvd!1nNgNM=qd(T&ZIt%S&2Yr4+6GO_UPBU(6t8#W^*OSD+^k8 zo*qC1!XhJ4eSlJ5!h&K2-C01{LF+=dEPL$7&({!7Xu90HFDgpPZgjHA9{TJgYr3mEU?v_M9Mo-xW>GMNI50Y> z_J&u!*j?e~mWPh?0yx82O8zp?T#oXf@_B8@gNs|y+RiA^h`JNdHVZ^QFQbV(z}SyY zbwTHUp*Y!CO2pGgO&x^f^&t5XwEGwyI0KrN0gng*hYnzay$3B62@3|Z?D|f88?(a| z7IvLECJJr|3jRm^4CrNm2SPm(SYFVb1!6qWU{!#~kAs!FSvAk6 zaeGc^ZG_{NX|}gcP=)j%WS=Or9T9^&Rf29~)XxGic`|tkOgi{`h=G0`%wjhB?n$E z8fXciN6VWEU+$*`pE-W~I2`qkbN3~o9T`p+Fzpz}J~xHdB2erG)PsjuenFD}@SUQ( z(H9GmCLrvi-cuza31Aei{sD33IFL1`rKku4`Vh3K8Q8)&%Q^$#aIybD{`Ga>vO*-J z1hgX>mX?-*%bU_fm|OR{Zj9yQ0Tx*hY!xRb!RomzptJC4XY?M~n{zyM59W(PcIS}S zzGuzjSETMCj4@zZxVTi&S)!+Ow4je9FkF??d*YwBqkVFqbtNqkxcF$t0|W#>6C@Mx zw7{KQicVCJ{P&NJkM>J-xdKg~VS;NWO5F;WNlJEG4*# zg~ESVtrifce{I({N}vi{iDu**9ob+6c!qq z3_iruT0~t(hbz5Pb_#L42Vw;_2A(Fr^(Hs?ovCcsk!rBLu-_!$7=QrCiIbtmH$VRh z?-sd8E_?wv8NaT#H{eV5A?qjp-ck+7fT(Efa5YI2gyFG@AiG*-BvUM~4G*0&2{l2(4#*=Kc%dk07@6!cvQ2BkRC+f zc~C74VL2?iHb@lsCf2&V>}atknNG=4yP zZ_#OL#kM2a(1>jX;BnNLpjI5{|KU^czhA;6{fRTf)!pn*+MU2QxpYt>f1acIxpVv9 z&Hzg5h_VUKbfyPmPq_mvtOE4Uu9WxI{agBA&5oe1n|V)0JRY>d5sdIh~pg?3jq&Y(t4BO;Qu$sJh2D2J!r=p8QA>v zx;Ho};OYxy^b|CYtAa;@MnuqSsBztSUL6(D%ZMiqbPG85AmMp%xeVTluD2&1A?+c1 zvO%hc71bguhJ)n5QkvGaj0KDFS7IUIm;~;XIm}adCg&Xw?N}P%{v|8@Nf<}HZ5o=d z=NY_5_AKlaLOXS27>o@lyuV>y5_%tSZ%uxPC)dABx^*Tv18}Hk-ALB=|06m!C2E~C zFI9(p=1>BDh(A=-)TU*r*6BcG(NyECADDU&UWmSH`1YodJ0jqde`h(V0Lg=Fh!cS% zCRcXlIZ5F=5Gx1*?Cl$@GtP8wnFq#d+_Pzm+shZH-h71TuU=z;EmQ2o#o z67dgfU%me77}Vi_NFI9zt*VlhLOg|??s(2rV_pp31e{$Qe0;&tz&riv%NJCqW9=!y zyrJBF%>0%H=n#-k@Twq^lmI({ zTCe8ubAO(DfIdVPQt{Rx6z;30KYdPe6f8EcAIzhbIE`qf#M z5ng$P@bhOSQ~jt3H&`*_baePnZINRfp@c&9;@7SD&!2HzJ9qN~unUy79XkAyE`_(w zFT-Kvy{af>L$L()y@YLeI#|^w!k5tAT(FEpihUx{qkr6=8=GXPX+(&Ok8_viDnr^R zKm580H(%sePOa?Gdu2Co{+#W{jK3LDA1?4~N^)!N%ZkwoTsZ=+44Nu3`goAnn!Nvx zhqVO+6wpm!3FCWFsxz!p%;B(A2heb6Plhes3rHKr0?h*Sx4~EhZw)m4q|n`Kj-6B@ z$t6_kjW@o^_>~^7o^Mssq^dgpr5Piw@+L^tkHSwX`?vk)@emc2v-|gdHZ5sBb>^b( zWb5I>M?ys}-j#fFY~~DOR<2=?`Zt`)VLJXhtFMm|JBvg}?x`;5QMU3uzb z;y9lfpcwme<~Tm!#li4ZBH{baHfFdWJ!teEu>kuR&I`2De1&$1Byh7J`(wU;r6_fq z6QSx_y$Z3*>QhuA@i|{-TA4{l18Q%EGl`_sW{KmC7sSFDujBK(_{-$vQbfpyagi-- zx_4gO1a{5X%@s`KvGXUzOoM6_=@S#6$wj_|p7dVLE+m@J%msx0kUhy>N+?Lqy?$oq z-J3*S+1n?hBeE4;$__U*M^;tp6{lq~#3;ZPVs6RcGj&s%HkVaC*F3QYy4(E%XGDRN z&m4wEqlA!I1xVr3&Hj#^qsRf*tthx(w_|9-@Wvsi0h#llP9;_~3#79fIt{@)?iL}` z)0voXiP}lH~Jz-@Rz2_$uhPea5SXIL&v8!VV4?rwiJzQqFUUJKY@@ z7S8XpK0H6HUo1HFNCWH>)Na7I5;JwsL=%iA)=>sm2iylopr)WQ^y)THNqikdfgSRa zIOev-`KSHt^RzTBT&dP-z+r(&()%&ZsR<#+v8|smlkd)8Tbo0xO11Jcu8^h0rKw{E zu0W?2q=K_b$l1IjR19_dO$#!hPniD3V>?1GGS4wL2}9i=Lq|Z90nKQ(7>yXuT7Ofc zL%@&}W^B@D&G&O5PNpUVJL0MF%q=|^q7d$J8&g?8U{>J9GeXKOliR^fZ|t;MGcU@j z+8IB4T3eSDSj+*tW)r*nz52E!61XD<|e=U_^H2(#s?gZ zyy@y_tG-p1nRypNQ8ZM5&OV4dV27%7pgRKTKLXas8vkB~P@zHXO(|u<$=MVbsJ43B zO1*T$3y({`KPjIbay*=sQN`ls(}y2E9G?HGFL~@(R!;$hA-@d4UqiEB5I4`2hn0O*f5vE8EcsiBoK}7i#6mIyt zcbQ;hA>aW23oUy<5HkZ|RaG#WP_4RGYJlWk;^I<=VDt<1ZpLyrH>T1on1ZiP+3+$% zO4r=Arnxn^wqv`w#9a%2+Y2L%z`Ho%ZJV9er9eT(8!19_3O^7$(Dh?$fhIbdOP4$6 zNX&hlgGPj_`&yOj!<~4M$%!TnmHYacQfQF@++6GxZ>o>X{cZMTC&S{h^S!pkSt}RQ znnFUy@jsegqau`+W(moCw4oGo|3DZIW1k=ubOT=J5)*qr-2WcB=D^N-GbAV7q=C3) zW5BA(V9Wnql(m~bR{DOT{ce?F?ESXmtGjlV}dc6B1Be-UW zyIl5-iu+G%L>QTKJNZc+yY8H!Ior^5v~=GAGVprAv_bM$nUt5Cc6u zv#mZz8G{hQN}?I1gD#YH$`I;;GDIg2flGM|660$i?g`QNKShP7hG`mLJO|U7zWQ%_ zgWLIZ!Ap6DVVC`O?brlmG)ck`YR|xZ5t)$0-N>%5$x^QD6TcmB00w=9plea^yPM z%AW-`Z0nbq_Ug8A&wK@>@QS##ICyfOBeLXNwp-}u%)niS;tFhWPlXcpZx$VTO{VqB+B``Smp8$D;gfFll9`;vG9cok9E{b+{GWU2<>luDF3V zr;0U|J03nY@Q`EMIZOxyA<1{8uRC*@4NY1b6l9)leRpQueI-0#r$jotLzVatA>q1y zy+Ud=w@{e-r2R6ke7=8ZLcojRxVm2Euk9_GxVIN{4{-b4E9j%ANdpvWzr&U=Xbo6N z5W#$29UpMUjg2oz-P4{(}O{op)8cq;$$2~{HG-0Jq% zfEeqCgq)0UyjASV_ce0=X^=n1;6E`w?k3==zho4^HVZ=A5K>PgQNX0BnSzgQ;o8RQep(hD#3mfROX= z8Ixh5{`^Hf^5<^b@OI;E4CDH)7j-Db#^ookkKQ?W!JBO3EZ03sty*doZS4$ovOv`* z`Kj1ujfenh>kXsS!cFaq+&sFv&KcqX9Z!`rvw1DaDE1pkD^r~N@cPh4G9zE+LuBN> z8#|B8LZV`#jE^6`%bIKQr;yr$B!6*)Slvn{J>_L0M(Q+k}_8_G#v3`Wb2y|DeWtp5jreMJ#R=h`S zpYM^zV1nt$q{yV*+d$;jTi6uB%mx0_b~A+)fZmKRLAW2 zP56=AdJBIDT*xa<9?Wvas=%^O)XEo&dYaoi)Q%9(sY5-}xJai(8aa1#&I~b+2X&@b z)H=I;H~aUhs9MF=`XLNZia3V9q&%z#%mHrgvX8`_1*hediz+HH>QiFdgXS@Z(GA7qG6R@6EgfvVBrHqT;v#a z?zt~M1X0a7o8ryU!ay3pH^x5d}~4MH=aU5%EqUZ1pNqXt-jfjg%gK$0L$* zgk9;*X};*d=*;F%Z)R4NPIP&6Tu2>q3qF3^IOep<_ZJUWN}U5#*@seXfY2tz*0Zzn zPQhbdgRre-i`c%kva*8`WI*g52#M{-m}Syp4}DHzAHB8?OJQlqO2G{#tX)}GUgn_Q z@yif)p<4u$1#s_rY^MTKKQOJI<}-Mhcl7P5gPl!D#fP?p#4AXt-nre2q{!22ntB)4 zraLG6VkVPrN8mX6%Gn6=s|Qnu9DZ)I06HJu^D>`$iU=1~dQMrrkPn$0 z6z-lKvGt^tAoBnxj$KHJ?(k^IdtCLCgrG?-`mHt;FRzOZo?$*TFWIQ7y01mqef zl3s-T+L#Ow);KGFgo5NzJ<%*sI$xS#schUGdMZ#FQlXIRJzXb`Xnupyb&m6c!Y((T zB{K!zhE)@B`JDnaoE0E%BS0-vyJTi?4V(AvY*EdlDY@P@CRqWS60XhFjFR}VL9|!_ z)nFn}7Ic-7dlt^NC;9+i1<-+2zm^n5^r#}BFg|+wFj7hZb6>Q!xLu_n>x|Yk-o7FaG9lDi55`v7aF=CuO7zh zS~B#(GJLXjf9&9r|EtR75U%0o@bu?#njtqBFP76X5TtfDUzg!98x8MbfcOf|AU8T_ z0Se;djv_76$9y)+tckDzP`QP|Ck2p7MF*1TnSxIT90RIYES6A`o)I6DjTU%;PXHZb zxp$M7LCc}aQ}d@ij%u>4F3*3H% zTMpM;S()JB>3@PxXa*pScNC7|==zggoaUg!Hu01t>`Z6hCSW6DWzGG~pk@-n|>d-#@?N@EGVs zx?urO+zp({2_vNRoOu;VX%gi6XqcJ3`jps2zkdB)XuPk-NaefG`$VSBv?ejTgrAF_ z9LApBIL&*9DR_1}TctnDE$s1Gm=+D%2f=1Y2pZU9bBNg~04EP{GDuP>3uo%N;p5kev z1?S)-0|Nodz0)woPX$1fxT_?EbUn9$Y-@7j0LiGm|EpI$KqZCI*UwtYxWg3V$o>{&kl#O-&&p2l;nA6_-qD$C zYHo=!e@~^MUpRpMeWjK63``CJv1ThovX2JVp9A7`06+lUT{EaXpv)@&b`#qlerwx( z97tYJ#yb>L2B#Tn3OzHC5&KH{LGeL`1@fFgj2qS(FP?+4pOL?Ylrk>1rlhQ7ec$tA zn&O(2%m%jNG4|+50`+HH&}W&`UIr{>P~yF{ek4KREJAKq4~Gk%mL?-0AYfmzOh$e7 zBa>LB`Q#&PsonGguX=rlm##2RBfDgnOSjip|C)ZdXG?p*fN z$6I|NAtre`7&X^hlfleFws@DMBuCyd0-l`uN@U?-!{A(CLpy#D(R>ZN0pbd%HNAl& z-<+Q=EI!up5M1xMx$SNOfD+gq4fL@<08yM5@PeWsj{HKqw(Ce%I_M-++yPu-uev7j=j{sh-?c|X-h236;9N|L=_0xnbhB=mN<*#mDhxk8pOgLdP2{feuzG=B z&`XtWZxVc|b!8c@9wrFlQ2B&&44KfDdL%m+Mp2_UIjF;Sfi1-Twb$NpAFM@b=PNz@ zW|JBR4$ULWAFDc69MmTjDnIn67tS|;PJ}a9Y!pZi27;8Sk(<; z4q-}Mlk8!7*`QO!yOBz1_8ev-UdziMrKkcKuBt%wL|B-y0ht7Y!|JRy?64fjn~2+L zCa*!|H~fmF{Nn7U)@j4t7@+^3NMft#SSet=tim|I6A^Z`NzYMw!!@|Ep#gFS2Jl%t zr4I>9SZGYi)YNWfM_)1NQ1BLyzCklqoMx@>AasdB>l|0j zTG8WWUophvDO}JptzM$Az>&60@b)!zxG?M(s>(i+g;R`GUu?ZDvbwta`2l@XZAYSy zs!g>%=PtkG{MB^K`$cT*dgE=9W`0=wCH>==oh(_A$Pgo5Yr&CHRBfX&30@l-Dnvx2 z0n^^ncck5@Rrrj^@2*af?df4BLviQXZZ$f2uf%Ve7acf}!s}gaNV_N0&CDHcFa?7? zL*;xLEtGivDTM)S$#A%fwGKXf)3x2Qi}~|`&!j9Uw5^CgxEmkMB&zN-(se2(yiX`m z8b+$4VG$^_45(8DnURnF{`FY>_s2FYmu(EMf$!NTI)UJ7Jd*OAiXO>+{r2ENi3xJniU#k z(GBKbs+$WC$OxPj8hPkRi}VZ3K(G;mzSjdvrFPvjZ=*84S><5V?eoiU`Y&b%wez;O zxL2d!qt^tb{qJj{chKCCm;Bw23UjyG6Wo{&Jq78L+rYf|GjI1 zuxke!z*5-fKNRgaIaF3~A$YL6yIf1{fkA$~GLTUE}j`Jb4m=Zz{-V~5q2f8=xE zbDT%P_nc}2*u6?xq$Us*oxQc!g|%n7ds;D0y=5|<*fml@m{{5_AIynNs}MdWXrM!d}B~H`c#PyFhRXe?=TG@k%ZUYF+>KP}Q+8^HE-aoT5gpg3xE+ z!44=(%Mtn55FJm29NoK3^vI1i!IATpA6uLnd~;r;!mGOV3`bX)k)NK4;q;%y6Tjby z5&~h^$y>Xkc9A`R`p#O(Yy2ld`Kah)H1(2P2LhOf>G1_ z86!`@oZa4)u~hVAmD8J`HEp#7a}c{&N@xzNxRJtAmQuiyCS0CgGavJq?kJ9xycwiw zz1}RCI#Qy%mJ-v9j9Olm3(nL{$C8xzgnw|r7tzXY;4 z=~AcHLUz!LBHqP*u&cEpS#AsRn$v~`OT_)N#BDdessZ$05s4TSQF0&Od*qt=g5iVO z!@G-oEuosUKa9!gPK4$?Be|9PhepjuDP@Au%%k4V6KH`>Q0WBk82iY1JSbF(&7rjQ z%a-zJ+jh$B9Ub!B5dN)6#;`S{-q_1coqxA#bC|<$F>y`!%Rt5u`$EefR}z+IzB7u3 zQC|Ao;g)quq(r(UK?qe+8Th?s+^soQvaRsc`+x(Ky|*W;C5sqc6gOS8Sv9P~oNfNN z+K0(4C}uG(I_`XC?|vi_ZP0kuGH~Sa?e}s%D?8hE&(jn=Wc=oV26ndDEM49!%CP#) zAw)B3_Dyn12z8jPSmN;F6FC97^EQI>lR0nk8(!0DLJ_$oOaccAI}Yd+>*buS>l*7`Uv{w)yhM&L^B|R+Mda zom`RW&J~L%&SlS&Q>@#}ca$cqJg1jsdRBVUi&oY|vUJy8$b>&r=@lTn`qCQ!vL@5H zy-Gax^0%Q;y}E+F)1A)vtbqlyh0vZaLI);R47bk1b($xv;6lV-9%cLJ#^+`0uN^A zRYy5i;d55o~f|uYgtO7F)?U~8yVwqIB&Z72(Yp=I|otJEU&DZia+izd7?U~#BGsmhM zJF#s~r{(yxlY76MB}3MqX*-*WKO_rnHsBVh9j*=|&rW_Qs>eX?#$4uH-hsW7n&$Md zhU}Bj2w|E|)k2n8^!t`1!D-04-y*wOZqwYgX33a1X2w7uMr+=l$ayR?a3zhXy|lDp zU^Y#j)fbUH-6qCxDbXRfW>7b2+Ov`A0kb?NdTh5m=!eR$Ln)xW_sqj(ddGp{DA(PH z38GJk<4Yzw<13{sPxc|V(p0cjZSE!gmssvdSmCeBJG&=z1WlIGQxgXKahK?nFkqtI4`}`dLxYd&HuJ`eiqTVxPJ0eTW%-?c zr3%NtGk~VeTvy`lOrzJeXB$@PcvVI!+|w`C!;YzDIL|7&Cfu==$u{%MY%2{$i>~JB z^92ek_KZKO2!_?%UE$mlCRJ^QIf@6o1yNjA^e6MXG4$_;iBbD>k{cfmeO`Xk zp}L@aB+cMsbMgL%w+|oVPcgG{^ewdZ6EdRu{X=i{6Rb$S*kFb=U2=G=4Ov}->u`JN zlNuIWhbm)8p>@=B5vUab)`{n-VsvR)kxUvHAocHEw#`l&FOVc?gwC|aF!!8KF18pb zRw1dvvL*}7{>e}iz($e!hM24Bf76LpyX{IGcU{SfKR=P(^4C-)u%@gXu6Xp2>=R-~ zbNHY+aqaC~R2;9#dT{5I*OAH_LZyyF4u<+Q425Qzt~vcjMZ6k|`xAPnrZM;qmc&O| zl~pw|-LDkr@a&EUr>nxUm%T4@Y}=C59U<|KXX}my&3<*DBRnoop^Yp^MHf%m+>3MU zIZSFfncG-v;GIZ^E}u|J`iAOpWY3PaAMfbwX79R0%{<>F=ny>S8hM35k_@>e zSnVzN=~~4!oyUx!&49X4a65-}XDfBp58Y@#<6pk*esY4eb>izY6Uzp2d>axQ*Qt7` zU)C8>tSAp`m1fY3yh0@Q)#hAZDl+QZGaYTbm)P<%g+535Uw-9!hjrfVjXI_U@*A|LPZZzD9vpsAqS9Jfm%kgu_uM?(2(=kV_$Ev1_ zLO)vTPUtpXf0g5PO}AXKd8dQEC^%y+ucRtdrIVqw<9ww^{&LYqvhh-$9Z5tnB@4$~Sw-Z9*qI=1wS4rza- z4XDu@kO~9y??iC)nP}UUNRA)>$%yoafHhwUVzS_$-H#MrbVYzhiY4i1b#YqMk9E{v zc!PQi@V{h7uzQec9D!fF34gu8{^}0OhSHhgyk6#Pp$!K37dxyG#Xa~x`sao6f2c

wb{VL%THWX^CA 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 OMKz!4K1DsT4f|hj#8MFe literal 0 HcmV?d00001 diff --git a/examples/example.py b/examples/example.py new file mode 100644 index 0000000..f59eb1d --- /dev/null +++ b/examples/example.py @@ -0,0 +1,29 @@ +import os +import sys +import webbrowser + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from cloudflare_error_page import render as render_cf_error_page + +error_page = render_cf_error_page({ + 'browser_status': { + "status": 'ok', + }, + 'cloudflare_status': { + "status": 'error', + "status_text": 'Not Working', + }, + 'host_status': { + "status": 'ok', + "location": 'example.com', + }, + 'error_source': 'cloudflare', # 'browser', 'cloudflare', or 'host' + + 'what_happened': '

There is an internal server error on Cloudflare\'s network.

', + 'what_can_i_do': '

Please try again in a few minutes.

', +}) + +with open('error.html', 'w') as f: + f.write(error_page) + +webbrowser.open('error.html') \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b837fdf --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,25 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "cloudflare-error-page" +version = "0.0.1" +description = "A customizable Cloudflare error page generator" +authors = [{ name = "Anthony Donlon" }] +license = { text = "MIT" } +readme = "README.md" +requires-python = ">=3.8" +dependencies = [ + "jinja2>=3.0" +] + +[project.urls] +Homepage = "https://github.com/donlon/cloudflare-error-page" + +[tool.hatch.build] +include = [ + "cloudflare_error_page/*.py", + "cloudflare_error_page/resources/*", + "cloudflare_error_page/templates/*", +]