From 8064d5a496a2dc45889244be1040f95d69113484 Mon Sep 17 00:00:00 2001 From: "Amber H. Brown" Date: Tue, 19 Nov 2019 03:41:39 +1100 Subject: [PATCH 1/8] update dockerfile --- docker/Dockerfile | 61 ++++++++++++++++----------------------- synapse/app/homeserver.py | 4 +++ 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e5a0d6d5f662..e158431802ee 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,39 +11,33 @@ # docker build -f docker/Dockerfile --build-arg PYTHON_VERSION=3.6 . # -ARG PYTHON_VERSION=3.7 +ARG PYTHON_VERSION=3.7.5 ### ### Stage 0: builder ### -FROM docker.io/python:${PYTHON_VERSION}-alpine3.10 as builder +FROM docker.io/python:${PYTHON_VERSION}-slim as builder -# install the OS build deps - -RUN apk add \ - build-base \ - libffi-dev \ - libjpeg-turbo-dev \ - libressl-dev \ - libxslt-dev \ - linux-headers \ - postgresql-dev \ - zlib-dev - -# build things which have slow build steps, before we copy synapse, so that -# the layer can be cached. -# -# (we really just care about caching a wheel here, as the "pip install" below -# will install them again.) +RUN apt-get update && apt-get install -y \ + build-essential \ + libpq-dev \ + && rm -rf /var/lib/apt/lists/* +# Build dependencies that are not available as wheels, to speed up rebuilds RUN pip install --prefix="/install" --no-warn-script-location \ - cryptography \ - msgpack-python \ - pillow \ - pynacl + frozendict \ + jaeger-client \ + opentracing \ + prometheus-client \ + psycopg2 \ + pycparser \ + pyrsistent \ + pyyaml \ + simplejson \ + threadloop \ + thrift # now install synapse and all of the python deps to /install. - COPY synapse /synapse/synapse/ COPY scripts /synapse/scripts/ COPY MANIFEST.in README.rst setup.py synctl /synapse/ @@ -55,24 +49,19 @@ RUN pip install --prefix="/install" --no-warn-script-location \ ### Stage 1: runtime ### -FROM docker.io/python:${PYTHON_VERSION}-alpine3.10 +FROM docker.io/python:${PYTHON_VERSION}-slim -# xmlsec is required for saml support -RUN apk add --no-cache --virtual .runtime_deps \ - libffi \ - libjpeg-turbo \ - libressl \ - libxslt \ - libpq \ - zlib \ - su-exec \ - tzdata \ - xmlsec +RUN apt-get update && apt-get install -y \ + libpq5 \ + && rm -rf /var/lib/apt/lists/* COPY --from=builder /install /usr/local COPY ./docker/start.py /start.py COPY ./docker/conf /conf +# Validate that it is able to import +RUN python -m synapse.app.homeserver --version + VOLUME ["/data"] EXPOSE 8008/tcp 8009/tcp 8448/tcp diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 73e2c29d0679..ea930e851ecd 100644 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -329,6 +329,10 @@ def setup(config_options): Returns: HomeServer """ + if "--version" in config_options: + print("Synapse/" + get_version_string(synapse)) + sys.exit(0) + try: config = HomeServerConfig.load_or_generate_config( "Synapse Homeserver", config_options From 94a32876686fbfecce75577cbfd4d53bf225bcf6 Mon Sep 17 00:00:00 2001 From: "Amber H. Brown" Date: Tue, 19 Nov 2019 03:42:52 +1100 Subject: [PATCH 2/8] changelog --- changelog.d/6373.docker | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6373.docker diff --git a/changelog.d/6373.docker b/changelog.d/6373.docker new file mode 100644 index 000000000000..11e56bedf4e5 --- /dev/null +++ b/changelog.d/6373.docker @@ -0,0 +1 @@ +Update base image to be Debian Buster-based rather than Alpine Linux based. From 5d60ff83732121a3387e721350cf95d06d5c70a3 Mon Sep 17 00:00:00 2001 From: "Amber H. Brown" Date: Mon, 25 Nov 2019 18:41:05 +1100 Subject: [PATCH 3/8] add a way of checking if the dependencies work --- synapse/app/homeserver.py | 12 +++++++++++- synapse/python_dependencies.py | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index ea930e851ecd..cc1d55424c4f 100644 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -59,7 +59,7 @@ from synapse.metrics import METRICS_PREFIX, MetricsResource, RegistryProxy from synapse.metrics.background_process_metrics import run_as_background_process from synapse.module_api import ModuleApi -from synapse.python_dependencies import check_requirements +from synapse.python_dependencies import check_functionality, check_requirements from synapse.replication.http import REPLICATION_PREFIX, ReplicationRestResource from synapse.replication.tcp.resource import ReplicationStreamProtocolFactory from synapse.rest import ClientRestResource @@ -330,7 +330,17 @@ def setup(config_options): HomeServer """ if "--version" in config_options: + print("Synapse/" + get_version_string(synapse)) + print("") + + extras = check_functionality() + print("Additional functionality:") + + pad_to = max([len(x) for x in extras.keys()]) + 2 + for extra_name, available in extras.items(): + print(extra_name.ljust(pad_to), "[ OK ]" if available else "[NOT OK]") + sys.exit(0) try: diff --git a/synapse/python_dependencies.py b/synapse/python_dependencies.py index 5871feaafdf9..2acacd7c9bf2 100644 --- a/synapse/python_dependencies.py +++ b/synapse/python_dependencies.py @@ -206,6 +206,31 @@ def _check_requirement(dependency_string): get_provider(req) +def check_functionality(): + """ + Check the functionality of our optional dependencies. + """ + from twisted.python.reflect import requireModule + + feature_availability = {} + feature_availability["matrix-synapse-ldap3"] = bool( + requireModule("ldap_auth_provider") + ) + feature_availability["postgres"] = bool(requireModule("psycopg2")) + feature_availability["resources.consent"] = bool(requireModule("jinja2")) + feature_availability["acme"] = bool(requireModule("txacme")) + feature_availability["saml2"] = bool(requireModule("saml2")) + feature_availability["systemd"] = bool(requireModule("systemd")) + feature_availability["url_preview"] = bool(requireModule("lxml")) + feature_availability["sentry"] = bool(requireModule("sentry_sdk")) + feature_availability["opentracing"] = bool(requireModule("jaeger_client")) and bool( + requireModule("opentracing") + ) + feature_availability["jwt"] = bool(requireModule("jwt")) + + return feature_availability + + if __name__ == "__main__": import sys From f4f1035e9fe9399b09ccd030e0c96cf7b7572743 Mon Sep 17 00:00:00 2001 From: "Amber H. Brown" Date: Mon, 25 Nov 2019 18:48:18 +1100 Subject: [PATCH 4/8] add changelog for --version --- changelog.d/6373.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6373.feature diff --git a/changelog.d/6373.feature b/changelog.d/6373.feature new file mode 100644 index 000000000000..5659ec0926d8 --- /dev/null +++ b/changelog.d/6373.feature @@ -0,0 +1 @@ +`python -m synapse.app.homeserver --version` will now print the Synapse version and the status of optional features. From 9b186b1ee55234ab5312360a3e76ad4d2cddd2c3 Mon Sep 17 00:00:00 2001 From: "Amber H. Brown" Date: Tue, 3 Dec 2019 22:56:34 +1100 Subject: [PATCH 5/8] check that xmlsec exists when doing --version --- synapse/python_dependencies.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/synapse/python_dependencies.py b/synapse/python_dependencies.py index 2acacd7c9bf2..546f3875661d 100644 --- a/synapse/python_dependencies.py +++ b/synapse/python_dependencies.py @@ -219,7 +219,14 @@ def check_functionality(): feature_availability["postgres"] = bool(requireModule("psycopg2")) feature_availability["resources.consent"] = bool(requireModule("jinja2")) feature_availability["acme"] = bool(requireModule("txacme")) - feature_availability["saml2"] = bool(requireModule("saml2")) + + try: + from saml2.sigver import get_xmlsec_binary + + feature_availability["saml2"] = bool(get_xmlsec_binary()) + except ImportError: + feature_availability["saml2"] = False + feature_availability["systemd"] = bool(requireModule("systemd")) feature_availability["url_preview"] = bool(requireModule("lxml")) feature_availability["sentry"] = bool(requireModule("sentry_sdk")) From 033d18e870307c58cfa57469c7e3cda08d0a6b82 Mon Sep 17 00:00:00 2001 From: "Amber H. Brown" Date: Tue, 3 Dec 2019 23:00:17 +1100 Subject: [PATCH 6/8] fix xmlsec1 check and add it to the deps --- docker/Dockerfile | 1 + synapse/python_dependencies.py | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e158431802ee..833bb485de78 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -53,6 +53,7 @@ FROM docker.io/python:${PYTHON_VERSION}-slim RUN apt-get update && apt-get install -y \ libpq5 \ + xmlsec1 \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /install /usr/local diff --git a/synapse/python_dependencies.py b/synapse/python_dependencies.py index 546f3875661d..4de74fe5740c 100644 --- a/synapse/python_dependencies.py +++ b/synapse/python_dependencies.py @@ -221,9 +221,12 @@ def check_functionality(): feature_availability["acme"] = bool(requireModule("txacme")) try: - from saml2.sigver import get_xmlsec_binary + from saml2.sigver import get_xmlsec_binary, SigverError - feature_availability["saml2"] = bool(get_xmlsec_binary()) + try: + feature_availability["saml2"] = bool(get_xmlsec_binary()) + except SigverError: + feature_availability["saml2"] = False except ImportError: feature_availability["saml2"] = False From 19035b1d910a095ebeee9549a858d0d8a58d00ec Mon Sep 17 00:00:00 2001 From: "Amber H. Brown" Date: Fri, 6 Dec 2019 23:45:25 +1100 Subject: [PATCH 7/8] use gosu instead --- docker/Dockerfile | 1 + docker/start.py | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 833bb485de78..1bbe63eeca42 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -54,6 +54,7 @@ FROM docker.io/python:${PYTHON_VERSION}-slim RUN apt-get update && apt-get install -y \ libpq5 \ xmlsec1 \ + gosu \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /install /usr/local diff --git a/docker/start.py b/docker/start.py index 97fd247f8f98..e40024007bf4 100755 --- a/docker/start.py +++ b/docker/start.py @@ -120,7 +120,7 @@ def generate_config_from_template(config_dir, config_path, environ, ownership): if ownership is not None: subprocess.check_output(["chown", "-R", ownership, "/data"]) - args = ["su-exec", ownership] + args + args = ["gosu", ownership] + args subprocess.check_output(args) @@ -172,8 +172,8 @@ def run_generate_config(environ, ownership): # make sure that synapse has perms to write to the data dir. subprocess.check_output(["chown", ownership, data_dir]) - args = ["su-exec", ownership] + args - os.execv("/sbin/su-exec", args) + args = ["gosu", ownership] + args + os.execv("/sbin/gosu", args) else: os.execv("/usr/local/bin/python", args) @@ -194,7 +194,7 @@ def main(args, environ): ) if ownership is None: - log("Will not perform chmod/su-exec as UserID already matches request") + log("Will not perform chmod/gosu as UserID already matches request") # In generate mode, generate a configuration and missing keys, then exit if mode == "generate": @@ -249,8 +249,8 @@ def main(args, environ): args = ["python", "-m", synapse_worker, "--config-path", config_path] if ownership is not None: - args = ["su-exec", ownership] + args - os.execv("/sbin/su-exec", args) + args = ["gosu", ownership] + args + os.execv("/sbin/gosu", args) else: os.execv("/usr/local/bin/python", args) From c8accb1d24a4eb60c03c38f4b5ef6740632b83fd Mon Sep 17 00:00:00 2001 From: "Amber H. Brown" Date: Fri, 17 Jan 2020 00:59:19 +1100 Subject: [PATCH 8/8] this gosu? --- .buildkite/test_db.db | Bin 18825216 -> 19001344 bytes docker/start.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/test_db.db b/.buildkite/test_db.db index f20567ba73e97bf2568a9577efb0f132d66c429c..cc3ef8b3674b649225fc3789528c80bb36022884 100644 GIT binary patch delta 32150 zcma&O2V7Lw);>IE8pF&01E?rNIfEk71UuNkL}S#bsL@1?GAe3}1+c{qHoVb$BWRqJ z*bc;~Q4<-X5i6iZjmCmviK2pCu@Q~Eea|`vNOIrz_kX|Sw{iBf$}VT`wbm}@q^G|& zq?gTe&9r*fSE;-LRVuZoN~Nl+QVH*5MKl4}FuJ7(1|043>}v^ zY{aC7X`nODi19;1Yiop$m~H4pXiXe7Xz#NkRms8^T%y| zP`C6mhp9ZuJhpi(_88?6=i%<=<9^%S#qF~BwfU+!&;3`o{pL)!RqpHE=9nkAe_`(H z_L(`%eUw`V_pU!%EO$+54Yk4mfy?~=)wO){|BLch2iJLGQ%mC(-)uUSSTqn=#K==5ok`ga~yVx?H!UMn;88MulN(g{!tuQ%e|5 zE>5GrRc%#YGIucjY-;Awz&K49&i|_l-8Q=X=0cmqu71?tX>`|WnyKE9r`_-(Z}=wT z2|>8dnag>;TZ}grd~3Jx)G70z!hu?GjirW|k#5RJH)o`~Wu&`jq zcIx(FXx=ly>#SOfDSnU3zCCZ3&MR-1&ij3%S>xfR^7zTa?&0RXBM-D6-D&GC?}R+J zK<__OVjcG4eeZ3xft{#bmhA7+H2bPG->J^ z>VCojp`mIYwaoPXLIXRKYjbJ@A#ZP{w@onCoYld_r+YK?%tlnY)Vt2&=s1_WOG~|n zsPmpI@?Ij))hzF&dGo*WJ}i(odAFzD4)6TDKIGj;L+w_0|1d9grFUNH${I9Nt7~C8 zO=huXeUoXLshK_t6;-*>OsBqSUaDAgx>jvmN73Q>j;5J4X1(v?(aXff>sRVJX*Xz|X@;x6 zb9?9}nzK~hRfo;BO|?ywQ;}R-E9g{H`6+y^F>Vm@Y=!ExLf)5SYsG2v&P=TJs|KB> z$?IWxG)j}Va!RcmLPmP6jC7xj^x7Hebu!X@Gt#XY>3$jM{u${38R>y*(nUM$Fy^2iWv8Dda|ST{qgmmvmci1jnXkPNXwh8UV5hOH69opd<; zhWpO4BSL`ej83^bif-xV>B_>9B9J1H8X`p@MI$vrYK+tbsVP!3q~=I1kYbQxky;|P zLTZiFCQnz^_GKIo`v>v_^vsBk%ZQH8h;Ek={Z2;oyBX2#Gom|WM8B62-7zEj{fy{N z8PT2p#=gj|ou`fOg7g7WSEO!8-H{TIdLZ>g>V@YVdp0=rXo#4nvOIBDGezdX(rMvq}fPwkme#~Ak9Pi7t$Ab z`m*^ia-~J-?t-Wk;D`=}_Ur{n|3>-`(w9gJkus68kQN~=M*0eA36cYekiJIx25BkM zvOInE@)wCaPaY8>Do0O-WkrT%Wrjt{uw<{XNFZAjaZb|CFU+J&?mDIci- zsSs%o(q5!}NWUQMM>>FX5b0N>Lr8~_enUEfbQI|r(s86Bq!W31=gAjQOM33`Q#v6l zL7P!=a!p0?-$zP@{ZxkibcX#*hW%`Y{r3#}xeWXH40}n2{X&NQVutuGs3)`b;)X>d4)K#|=H2D=;oapylC{Ko=* zyQlCXncn$w=^$p8JRAwTz+UDFdYKph@#a4@_)ks#Q;Yxj@Soa{#u#}~K#j}tI-EpdB{uqJK5piuSyNnmtXB2x4sy#X7ekf*c)t2a zV}cZz8s)qAQG5-39V&7f`v}n#zRB1cKHTjql`H(UO4V@IRJyy_7}3`A^~^f6CL??b zR?qA%KgNHA`;|3U7FYZf|4#LML6?_%d-twfdHoMwv3s}54pcb)>IXR=A&yT@NgkCv ze8iAJqY{(HCJh~n^<-$wtVw#GF2PjP$u%IYQgx$$6#IN;%&gB{e1e13vl_{L@^|Xr ze|tXrNALWdBsTc(XDb&~`PeI)BGQJRjUIHdv#XUhws$pA+LT(R&J7ej{5)kDJj{u+ zCc5~vLl=7ftqYa4PGaRhpr_Z{<_UZeClPI^*R2!&gy}`hFM|wtDl7xke6;|fBe zZwKMeo91fN#q8FAYa|5bnG;L_Zh{xt_LcZa*}MD%t9Aq^lI?`2;4c+sy9u7s?s+bP zNr#}=%ZIZ1pYo%^0VY4)PF6sd2bf~C2!FjO^=>OaN6V{TWWRXDs8@Fe=0T}Xw)##5E(dw6D>Ug_QLI;+hVsww{Y`Q^FDK?d4RdD>9%R3X}0NOQ-nz{ zt~YjYEpwgf+6cyfxS_twb(eIPrut+0PxXhtkYJK32yH9}77Th-UiFd5t>-oz)!C z#fDT%R(#8nZ$fNF3jQ6Eo$DF;21n9~Pr|KapX=kHh=!iiShPdx8v4?SKSe)Eoa^IB zqr3XJlIKZHxIQk((APhZHubbwsc@ZG%hD)m#JH4EgC>iO;%xsQ`B2$8jjMKuSf!~j z$j6r^p44RO-w!~+q2$>QN>Vn zUuN^5$w?*=YJOAG9RG$EXXd zZD>_j$*(KXm~^2&)%2YkM58XWR&_q}IP$SIx%+a4`dBG&+80(`ObtU{+mb!Q{Alz- zPY)Wot*=oR;|)xCV(GsA9<=O&#^~C}%h1KfPo8po{Y5Emid8V`8hHYwO`rPIlXgvI zps~f!)kc9Me1d7l^IFJza2^ca(j7?n=^DFN0c82i$4iP-#N4XUG@z9Jnq|$^V42n5 zi!S{r8jX!imDMoNpv$#Fjg5@e`M`}L@~%~RDeIiC0KiZM(213{Kw7y`G`ci$kwMyc zqgI5jkscXJ8I49*lve2&xCDS2=AzFUX*vJF7~}^cZ)~VBvi#roJ&kZD=QV zje(q!%~#6)-4|WaPB4tL(Z7>@n$nX}jeFm4EX+NYdNjop&3FG88w&q+t8Xqe_cQ%z z`qI?ExYziJv4zpg^{nf1*C@k1!%v3U27i}4mmV&)^iF+e-8J0|U2W}8+7C20H0c^& z^%iwE;g&E<@KaHvqFQ~`NrTAqj3z)@I86|&)aH#CLC4>Sfl@q-pC?8Bgh{fB!Deqo zk(}?o^d;A~$S&io*fGdLxvid9Xu?~uKKWb&mhf9|3w7Hp8mVB(H9eKQ6@zKoHPJ@# zeQg#p)xfCibxjPTtIRBJxA{`uHR$Vf9oguwn^8%yAJ?$t$i|=!@$p zqUH@TkTNgXJgM}$*qo-`fYgIHR|~D&f)cymfYfEi0&6w&qr4j^r{hgzvx9e7C@L9K zMdMPgRCxF;Cb~y<-GEvl;Dl1P#2p~AK%5$A2VT4DrTF#T>MfO+o_t%xfmT{y~CpK zSA*Fn*ZS(}b~HrUXyZ7aS`@zx^t$g=<@3I}BaYJQVp~=USZQIP#gpDF@Pn3EfbvAH z2((zJ;WWFEu3Zt2xEKY!s+Vfl5*OQhNtac-jOUG8jf;$9jGc`Qj9S++;eBC&>-VlH zt}(7E!>@)+!^Z~E<)(|%<#U&|E;{`Y{bGGTy-jyZm#dqki___~N3~yR`)h+Vw>3`9 z=bE+}7xgjq67?tQxN{p6QBJJx;E|?45Zc?TP$VyB>R!am9}2w`~^%|tOS0%A;w+< z=-AW%6^L&U>PuN#*oU&;puC&bW)d=GMyeS3fhR3!5o#1vBrG54M``P9UQ`GUn)NF; zrA4S!t@^j3wLwGtUZ4n;Ww-RC?hP8EQS&P+)~ca}c7BhFIm1vf;o40E048qP7qltN z=1=kA@E}=wR4COL&WD9liRwAQYSnfcV+2PY zm4d_NXPFdFjofYiE}JVeg-1kxVG{{^#kwT!5e-5UVo3L*p0-giHCp(dHx(Tb-GpZ} z+GMMzdm_Vws$kuptcK#X4FV|H&1N9Y9x*_8=rG&r(ZwU8f&S3))45Nh_K5X_yOexH ztfwoNbjg)#6 zyxoqWh-(5DQ9?U`2a<*9mbyWpT2)NlkBRkMPgHU=rW|)v zwntnSDA`B(py>-lZIn%*9@|7~p2oxWo0>cmO@3sL!DF$Hj>k|~%2BO9WshiYp}=$f zfIOgfUbYzF9!ySOE2a7RTV%ISxn8yu;f^w(6I#FTNf%FI4&AOC;X%DU>9Ba^YF)*8ejKC!DR}PDRlOvz-C>Hlyw@z zxyTI+V(DwNkesp}kC+0jNN&2X!EmruQY^TK-Nr3Oe%vcF# z`_T`LlzA4avb$oYN4La;KFM7Elwj*_p%u>VD7;8P;`?DXVA^jlrrWD+|F``D?99yhMtb)-0VXN zkiEE@C&d9l!?LELVS&G+hU%7R^YOi~0J~-80}6BcK(yqQjO>>Y$G^IIQrmCehrYea zb0@ue^8paz#?uA`fRJ9?Qvc&}@pzMZ@D`{*N8Aql>C%DeadmSBc= zgG@7jK^s!M+j&xQy@p0t)e2sWg{VFumkP0A*lGP3y^Ahe7ppy~9jVo7mTQ`-kEoM` zSHf39gz6U+*1i1S(3u7j{zT|;=`_69r7)XOIvN=$L`s7j1`0N+Ff|aRR`?kr9hQMA zzu+OQlF`Od%vR+ajFJxdNNK5zCipk?l}0l_i~m66CXQ=hp;zVx7O4baFg^bRMib7$ zmyZ1*M$(Xnh@6rWqdaAQLCqfm`|Tm*vU6bYcZMP2%YKMRtnnjY6)oW~3l=I!6D5u$D z@QDo}>-rch%Q>5p9A=>h9%#qJ$6|fB6Z9RzJ&y(=U3`oPH5~0+x!q3?sml}4C&~ew zqfMxlhW#OiQ_2(Qu%C>uNZr6>A^jhy&)FwXAsQkr^zvGmkv2R*VQroQ%iN8^7Dl2z z-cM1VRg9&qLLEmxMa=5@Obm2%#{i4I9cGjgcK8W;y80CQlAnPuw;=-84$mNVnzNa0 z(Ov7FL369;qA10e`U<|}@f`UapjUI}?e zGbuhO)IyPsgN@Yg1ymHv>`^Fi-3v&^zC^g)Fw`O)I}KrSdkGc^7>Rr9S)|;2ZusPv zsHpB0#+~Td5W65Nd;~3(GC1-TbH)byQrs&Dp5Scyu6h>wa+7G3(!r>w4X?o1;x#Cl zz0nkro;~kv`EPr?x;cPYbesZLAx{IBz)=YYcbqWq0wqXRo|$V zSXR_*wb|6gc-1)7*w*!o>o?euIAj>)^4ulMB~-sh-&gmC?hBnwyItD@G3QK8d-Vmi zq;4U+5Y`GGs_s&PWm-G8gqe*DQNb!*Uzr&IgnQzaA zHv?mMHDk3Q17n!NnE88n2k?Ye^F#;L^K|>mkPV&LfEkBlQz0BfvKgXX7%?MlJ{KNI z@1F-&wj74WpEoz&1T@e~UcJpieadA@wOOOt=fPdO1QjbfAO1e2^RFrsXQtjI;o)?v z1QM1*FwGAdhZ<>T2_zCO0IRZd77D!(9zxp~tMI}^+Eaq8coA7PeDvr7B>u(O!b;O; zQCKQ2qO>aeXQurZQQF6sz-PG=XrUkLVKhfx0#?Xa8DrSAvd}k|!b30!_FM`diVmt% z-9hoe^yTS;PSEY2Af>9Mledd!5t~}3}aiH{fp=; z1>KeshpEEr2x$QFke5Gf2k0u8KOVVI@2K*Oa)Ky8%14fd@+el~N& zchTb9H*Tz2ctlyDaej_3uvX4*5%;dph_Yhi{2jlJvXbx$n~EL>#vpL}b(D#+>c$0- z(}TAmizgWcfovPLA$WW**^3J5#+gWcqZJk^8~S0PoMboB>v30VvKc)_(@4H-~vc6l7t`I6qR?M-?oQ zT~XIylqgKv<3|g#26<877oQm&w^{{|z3WIA-uiJSp{^q53~UA9Mk|vLqyU8}gW>!C z!>VnSEWeFH;PDKNwXf>utGa z>GB2cp|^KIAKMbODyokF&oqWh&?wKKV$UZKYYQ>80;G(wTd}dMWQrCeG`!LflF_lxfH-GkhY zyA5}%VgA9~*Yt-e+ce44-FVZOX7s^fX)=yWB|{6B<1WMXZ}p^)!ftt@_9+f)TWN|l zX&N8(K6QV!iy#SIR97iov^F#KnAzXZNbycIb7IE;hZ?a^T=Om=LO;bMRa`*rd3{4U z&AUVjed&1fF1={b6%G9J=NQ9`lUM|sG#(Z0MfqTk&4@<{0aB%k+o7Eb8rQP65 zyPgHsyEU+K#;TW0w41S>ZGcrQ!>9;p(NKZW?INtP+MRLySw|+<2I0( z&)Fho!P3c0iEY7>b$?4Br42+Av3N4mL13=!t2%@7)eY)VU>qLCyVNnROE2La#rRjP zt>|0ZW>jzr z;!PD?Uc`NH8s#*hDW`!qR`9ANT{8~OdWWjM<_Xc>{et_y+(ow|Zb@zyTojHs-8IcI zMH_!LjyIZJx49-5UKzeJ#Jl|NGRMVF|Eu1vH|xIBC1`J9n=nH2yCy|rP-m-Sgd*Wn z0fz^v`WgXWhh0!^tR_q?+Nr_+KIpnTQ3a59z2TPR&!6xhXNg+~?{$^PFDw|=X>E9iWz}W{QaF_whL!&o< zHlCJk04-I|wBtJlz{~xR)WUUam0~J0VJ~6&4@r?yI~V5Z-Wek~aV(6*b%5rSD#rN6 zF>(#s{D>NO8kjYAER09ak0@mf9sd!fT$bUqP?*lb%dLzwU?XUwXu-y$UcyMl7NvMK zzzI%nQi$oZzclkk6iiEQQUgRsBNWD}?I0u7Yy|W2>EF0z^D?SYmoVI~l~=cARXas= z0=&X7dfNyFW=CU8*32*reQX&S=|7D@N>T){Z{$x;8+Qpe45`#hskwcGEmk?S6`RLdY0*^BqOge<~e}Y(pIGVnWKNy=7*ESz{PzssQo#5-qe50HwCZ5WBzQ zGYpk)`f?v*l+Tjmf9~ri3{`$RhqOn@`Kcy!s7!P& z7>9Uh_dL{k2np^JaA?iv1blWtx~+X<>5BUV#C5~LwXpzVgA_4w3R)GE*B9~Fv+;<6 zDD@ULt+Q#am*a!!CiJJQT)aFC+gJ z3Xr){gK%=H-2~T%4an8P$CR}l10dcc!s$=5n<#TTs*v#Gy9h1gCt*pszE6N-I;y7L z0o>jeXI1&z`yzPdShcW8SA=Na_c4)e0$2ie^!3L%kgTw91y1-W`j*CDc)t>z@wq2$xTP@)9Ti~V*ijbhvH|tI zvXP}eL@*H8X#y(ML8(X4eGd!m+R(>HU+(T3E3_wDGmiOw8)&7m`KU=Y|FZGeJic#~ zztB#hXXf+P>l&`ph4FCjM+TatnP+@CLYswAnu5I0Mq$l9GSDitReqP@HwA4*?`QWx zMWT;_tu+Z7`!siL&Vf>W)iz$VhX(!IrJlYB*9BC%uXWMdU$u5zmCn>OP#3B{7Ak~) z38IR6OuaKyGjtZ>kw39lX1O}jOI{h!=+l!TNquILNcN$2E1l--XJ;m1i5dJE!rhh# z>e`-}6hS8$69;pohDCy-Sx4+WoS6iVaTfSr3k3JG;Qf}d%$Asm6FF=AomsL5AqvK# zfeKmn>RHH+WrA2AeDD1ZzVmYS1_J4goPFmUs0si1%$L%eL&ACv66+a@TGh`&C0KFL zjC0`gI*-a19sbM{>j*R5JU1zvrkn>`#Z^q;IL6XjbktI>^N_y+Le-MOOofc^1dazG zcT0TR5qKJ(+Og1Yfgq5 z1!wiDhK7Ed6iF|>h4Zgk*O=+}w{ZT0R{_hcTG~*vRp2|k3IRc8Fcu?rx1mN_!C2$( zz*p89VTI{CgcVCUD{@FOj;7r57T z+v(QJe8)W7Y&BKwWqG@9z}o~RhH(ZH-mVy?f1`Kk8|n_|25O&Zztq;(4uI8aCHuW3Rk=eh<#&Fk508ejnP4-V9m*L4tF zZ-9{9eL5EN1GO}Tq0}21w5|JeKe}{X6He!lb);dQb-1C4pmsMwthQbBBV+3rE6VrA z16vO>RP!b<&s)F(cfp2C=j>$8$_DK^XD@TMXe^X=y@hP2+f1!AY|UxYZPdwmC&^PW zYyP*vQl}hPwQZw0w>6P8vm9dLZv#bocpLS;%~_Z=k@}TuLXUw2j2@}@X&v8O8-?EJq!JI2V#5gLO1N3NKNh{8+MP2 z;_NccF1p8^SZVJpq`3#|1!M77Qn9c;g2G2KCP(DmKT7qYjYokMGdB1>R9SBEdK*Cj zHM@_79cD}p3s&Ao+Z#VXHsNS0=Enn2mm=$!2&0eCz(V65KuM1im@;L9Q}6_i11ou; z38uUglMp6Xh6ol~bOIC2c9LgmWt3o{7mR&z5)(3E{wO$nmK}T&*dNSinU69`f-nW& z?!`Dd%!Izhn5n;FR>kkbaA{l&V-uxxSk)E~Oc#@u7EcOB?>1C=7su?CTS8_UddbI_Pr)00-ZPcR7?l*&?Ouk;%~m*55*MNBvy@E5rt#QGTaLnPk=&8*PWQ(h1tnJXOYVjH3BpRWz|wxY z6;~7F-|^cZlGq-Ru>t6Vg#Tos z{K*Qf;w4(&rl5w2&y~2O%#|Y%SB*eFB+eb@MXhuzOjydv6%xPj^CfFwa;z|cpC|ft z2M^OBxS3JvixbI;9T=uTt1tkah(TS)Dv?trM@}uJ_=*5QFTJ1bE10F9c6lJYO3|$d zBKybatn8I&|0V4TL?*fwh>zwXAVj*Og^=A-jOHvs_UPo@;d9 zfLfJv*7A6~m3q6bzz&UZh0QUaJ^k)f3+;1-zz#s<{2Z>Kz7YaJCS=nWBktbFEQ^g` zna^0o4m^tcjJ;&+A!8|DfsfZWG|&Xuer90ts}MyW;Ot(`+Ly4Ze26tMLoCdVt5><& z!KDSp7RgxEf`?w4QPCG}kWDyR6H|FIBKTo$&^Oo}SlO#F&{qI`#cq&2%vfO>=FEM@ zTDb#j>;a6|KeWOfs+MxLq6^%si^qy^sgZ`4+JTo5*kB0+>&Z55oCoC88Zg>teTvOw zCKNKE#A8J;eX3c3lh*?%gx5v%<`Rk1|;en`BlSrLMDksLlP zT&cmz9SbE&+Yht50VLigM9W@J#~JH>=<(J9JH*&utEacj-0}+i40aE}T)mEJdjJyO zGT|F0SgvF1dd!RQMw-C{<5du_m54@EudoUZK-E|#j9^0c4aB?hTI($n&NBg9iWopU z5IMwg`0~y*O{KZdT(Ch+S)YG_3mq|8etc_V0)AKA*kYxe-8EpkcQ|kev3P;0@+L>} z)<7A(kw7SHKOA3Al%meFxIG#eu0m zWj)s5*PLKJqR_-iU-$`!mEUD`fApk+R#{kjPKD-_yIcH(LzQf;;bUyH0G9-Eb75un zE3k8m6LIK0)^|Wb;%I{>mbDv!{GwFHNeg-j`^fgq0(8|Bv^l6*7EDYY%F1tpvgFGh zxi#0~NM=>8kpjP2fQ{m|Xt>ZCHBKwa@ux-KpkT`{Yq3O}f%YU%M=J&v=b(&TieBe8 z3#_;!o%NN9Aiv$-w?B$?uq%0l$PG%5P zb~%@0s=R9Qz#lzi`4yfy)erqr`oTOt<3e`qN_39%`d8RB&`rQ-ldqbj)PQ3@3bL?H zQ77srV6^cileBJ-+*y(XXU*Q-ISvD0jZ&v<--f<)O+O)4SgknrK-};bzEgfbXj{|I zb=Ci2``hi!2||3k7W+fL0Py*XG}Rt6zB!PuJ%M`T4EPl+zK4Lt|4De3jAbx3i?QlphSIm7j7PtsjPgUMt@C9% z7AA*Kvz~{ME%SQ^0UyUW`G+98<1iQL{|*Lc>=GElpCKE57_vdXap8|Ks5#c5f}c}$ zw3rF=L2!7Wx8k+}ddbj3=9R;sH!MHoH(>paaHRsFm?I!cW9HwOu$KuO2~qx5FgG~@ zEbJ(1Ca%fyR05*6%)E>ViQ?csY|j)SkI79Q-cm}$&$sQ;ER z4xH#Tvlw*nW!0e*P1LRklP`CKsMg8Rj<=>rvse=@pNdtjb*Y`*`$K)p+3m5o;Fl5n zsM-cn;)5;N68H?`^8+?@NAGWmz)EmX5%&k1!e$S)L@0~E?EG9W#U8GBuq6!YcqOQ) zbJko7vkcp)89F|`hGfXS+1Dg8)yA_oh~*{!S9q)cD$ z$yU=Wv{KmEXwsTu?uAo1u(^j9d9mFzlgBA^h4D0cFmowb(rzx$(bQ9TUSk<6t2CBo z$E^igy2|)@8LzUcRKNmVPJ{5y83 z3K*;VJ22mK81iX&8X3Q%FJ>V}nYGqnbG8t-sYET{ySY?HraY$0Rw8MBPWl!IM1(^JMCGA5hmfh8!r-vyoz-LPhZ zeQtrBFl5<2Q^O0OhFt`6+1&+L=3hXy7jag+hpgrzvM)Gm=j=$%4!*?9oGs?;Va{fA zw$&wM8<(=|ePma0_S;{W%2`usP6%Hd;O(t}_ZI}wxYC@;fTw6}np*H=pWd8yoLn1A zi#YtS6tDFYE>*rHmb4m%_`+(FP^JKdn^#+LO;~<|Ea5uhniA!A`ZfH%NS>$GVxze! zyqUe_MlX8v(MBVk$iv%ag~!y`B{>D}RryYun45>A_K!Cjanz1G0(fsM`G^;VzbQ4U z)o!@`gDTzmcw-B-+Dz^GZG^l2X1|4w=O4u8`iwnT)P40UHaYV1z>RBW%#c!W(3k!= zvlg#Oi0e@4f;?888UfX5lMjP=D_Y^gyilrFWGs1TjZO(_qHAI^Uw(}OyXlbGd%z1f zbWvfg5(X7Iw|hFaL5D`kr?1_QaA)g5)IhBuDNVN{bh>g92(G1Ym}Z%@4;x~A_W@BU zrBuItL2W+S7)vL2qHi+0czcrg-7b^xMiGl2u-DUZ?Ic#Ue997aV>Pa0Y(qi9D}|oC zZX@;(25dA5FBPDIZyeZmLzi;^&JF(f5P#Ctg$NAi?1tDg8pP#T^l-mFoJW(MDnP}l zEr?|XZZy&0lC{{Uud|y&p545>&g%FQDmvst1?W}!Ws+8HX-KO zz1l?Ye2hBBU0myrd+ZR#J?Y)6Ytok&*TxFv7*U8XD-5Xqm~-GAdkM8Is|T&gYjfq= zdh>{@vmMqhAI02O1TrtJwN_sIt|&(zS_(kB!L%6M|7M+z`p|LzJXB_NdFdxvwi|J~ zrC|x!u2!mGhA|9W;pZ12zY;@lOV{eO^;J9Bfz)ZtHv|8-oq2FFjC9ve)^!xDw$iw3CnG5NI*5hWPIkoE8k|QUMQ?Io@9jJk zzJDDG3$AQ|!Mw8?XMH8WoYzkVQ}ER-K~(sCF3y9lY>A|WSGSD4VElz0u8^D3wZ`ImiFChE(oVy=N2bsZSYK}RC~m9S!~FR8CX>03E_9faXGK&XEI zl!~vzWgfqQTE(CJ7O~EaEiI_UO=Ni)MyqasD&1s>8<2Im#p=(lfNjP~jK5H-G;I$YP6tC7( z-#d^`xXU$K0;ii^yc(v4v2Bc{Uqulk_rPxi--QD49xzKyUUb}sf(3WcWB+2T$UYbA z6kfu`pMrwtccGwy3C^|X_lpj6!YB983E0%e+I;hmIN-(VjrQGx0$eS@Zpi&D?B^I>n7W-$VY_ZxISkYL$~(gLTPLu?x0B6TZ3Rh*#Mm_LV#G&5;#Y0syJGS? z#VNZES{>8&;G8k_2yQNcjSV@!4_y708qO(Y)}mR*U>64*gCcL*G`Kj1f>v+C=2z!~ zSesAUV-nt@P2X*c!67tEW?|>c*j;E;jH`RcO8gyDO1&sy^)?f3zkmm}@|YSu^vwk> zO+Hd|uHME+idmE46tYL1@FnM(ZMgoAUxK>wJTZHExu06yR^bt+?6J~MdrM$!PVMue z(lyZCS|OEbPN431RZA{p47k+4fGhpA7vkS$#h|sI ztk<}?SM>s*QRvN0$Lcum5bQ_t2_xCoZ3}cf-D<_zx=cyfea=^{ZmMLmU+eLPV?(?Q z2am-z-(y0FAL`%Z9N$ z-snB4n}-YT%}vA;O8F_z3T5r)xI{a4#Kf)K$qZd zq}(8WQ&AX?zRip&wyM>kWcv{X6vY&y^4RX@OxZ59F))_9p@EDzA`V)XtSB}*CZX_z z2&gRB%%dn+;degXZlMc5ppd!>kp3qWT+$ZHBM8?KDXr6KoRGiTY7+1&Bo|@dauDSO zDRttPC54_!h3(-Oqfz7c7%Al$dcyMaLA>JpCw^7nRdhr>^7wPMD#q5s6ja83exIkK zH5XKQUGkU+j}|D8daJ_RJ^v6~c5m!6t8}rg&RRIWTH2(N+amS>rw<~r`BRY^tv>X2EQrA23>9*2HMA9IrbVX zhZ(C1iCR$Ow~#1{!&a~KrZk+Ea`vx?NcR?65*`AxKhEdf$2=U{ye);HVXP_~!dc7P z(qIaBgbK;Q(t?K&``4pVny5x&lWN-+!Z(w%&x_AhC*M=go}u`ws(1)5T3kIDPMvQ-N5$2X9VziLep$95&MP8zmRLMuj;{qJq=V`REpy%Wrcz zRnd~;3FF#WP_a6Lv76I((wEGtd-X4noi!5Q>5kk8&7Ag)Fg{3Gh9|1==`)>@D}(r%`{C7^$+Uy z!f(P5Rk>Ys7Wo&tft{J>>6zv&T?guOBOTVO* zx2B%s%Io6tTxTF!D@4;)c1* zB>u3?N-mSiBXuEYS{*v^c{%JotSco?DsMy!|17P`)|6Jn7Mp3w)N-u<=LB=yBEKPC zZCfevF(!4j9i=0GVrCzDjLEMUTb6GA7&ExhlTtkC4`I+!wqTAfe_R>~8!J~Oz0+x! z(pPx7T>AvlUQby%1oH~!)kLG8lt$8O`yAOK5lZ7)qe}A_oAn%3sFObmrS>kE_?^b%R;X-tj4zQ>I8miZRH0N?zV(8m!A#q9+4 zlCg)3RR=GW#)Kg+LFo4iS`r2v^QHYSQSM&Omi2^Ed_l!Xk*|P-u>p_Y0=G4KH@b1j ztJ2EbcnPO)8xQX`_dFGYD_g>t;ur)$_y>`|M8qBP%2HZ-6|WnQDVFbPVH3>noEObM ze+BLZ7qyr*#p;R{Of3P@MR9rf&VaAbNBQ=Pc=0i!sf!gjLhOAC8`s0G;Sv2>g5$j5 zkWIe?>ctOFnQ$B_e<~*PS40vsDnA=zxsBCEy&F(GT|u(V4{$XV2wfg?4|~qNPx;{} zQWkvM{JJ0Bn9e#>(j52TWJvTrhk>)~8ssM{h&}k0Cpl$gQYCT*WmEv6tdCH=%)=#C z97-zU&F?^bIg3wF5NY`}D`gHr$?-#r{e*D}I%C8&Pbq((S&)M~Z@eBKSF0T7yen8T zm22cDf3M+f4ZON3X!)+-$EW;pATJKxYPwoi%2dDDbW%wGJ zE)6R-;b@-O9Sv^yI!2-664&6VBn-z>!MQwc<+Zqhm7sKutFUPcZg>awLlL-I%0*b* z@PIagNWuZcf!Q;!U@dj5gl|1^<>>fz(U+{>4vn3Mr{w4YQ4MBz6O%k@_>*(*#|x;&7(>I)MlW&{R< zZAdZRnh7|I(K3mv`f;U>NIdPRQRuu%rMVU7aZ{2dQV*k&3lS(H@|6d1Sx1;HH_5~u zC&v%Lmd;sUw|;52~|zUR^SWBKa`mzbY&s)y=1p;peyV(u*`?&v9CM<;cPw=n!Ez@A|_OK4!vQ*GA6u`38hBF zTP)G`QxG(-K^Xi765=ZZHo?YV9W{dqBbjhmCQRIeoqWcM8EgC&jmchm6-WEb{Dujw z-hhCMSh&bkWt^z(2oP2=VdFG-!0f0SFg7Dj;JVCPV7QHi_t7weDxz-SO7q*tq10_M zoOgCB4ARlxZo})y)8GWRO@7cqLUy;=;g?`J#~={-0O1e) z$-zn0g3?R_)5=5nm?9xWm8J67;PI||iTgNrliMn{VdghxhqB2s-Nze?V2zYE$!NmG3SVi94Akkz zY*o(3DEWaQLP`f3M478DVq@aNQ$}fyjNXz_dr}$fRX3=-E29Z`t8Q^yw@Nkx06QvgbLZrTUy#aM& zU@&MQ^7{^WKnxs~flxRXJfh_Q8iP5c^3{jJn|H7VTYk+VEoD>~FAc&~7`%V9{F+Tt zLncIOoXFLIx3Wq}0I-iVXDr8KI3>bO#1YrLWXEN$d>5k1Z&@T0Fw_7> zY|}#+q4tlUDSkNSiO(bO|G-(X1)d}v8N%!e2-Nr!(_QQbw^Hj5NKE(+YV`)CCRLy4GUAnsRIX*r z3*VKvw%{+N1v7K^7;f@9nMM`17Z}5>pBTxr$@Ktw@ZA#(Kh9bjAzN_u8b0w5iwCks zVJ{l}6yFFMeGmKo<)~&#A_mnMcNggUPGKl~^$J70{H94*#XtPgMS9RC4}T zUUcCX3|U;bn7I)|5v0oH&mIiQaZ)~_8ekf zn5DEQ0WkMho(8}MSB(XWbO&gN)cKi=eus~}VMth{Uf>Fmev;9`t1tr?8Aj=6pplaA zbLOoY9!AL@T#?c&8C6C}8)#SnG(;)~ifC>$hV?y}t>+5{N?+;&rM{qrN;_mA{Vm?Z zZP*ra`+$Z>K`&8;qt$i1QxAHiG@tWiNk;c$_*kUHKtrU5G8%my^}EmLOBwC=ig~L> zl0_NQ7`5#8-LLvg@K`k^o zk}Hfmsu}kJU*2482$51{)cH{f$Eep4m$SeWXbF+d$t1W7l)&f}8EuCs3LdM< zbx>Q}zLGkFHAGq`lj36@Vx4pKCIWLN{Unn-5mX_pmnT~9)Dpa;z}q$0Aw85*zjTMZ*r%pok)r;Euh5dM zScD_Q+n{iS6*9erRED$M04dv86W^+}--DjtS2~z|C9r+$8mz9iEkiy!R3}A}XPjz3%882|aCE z2?4BRxB8+P2fVopFI6hBbbV`)c1=cs(pc8IEd2;-5cmx~K!cXZHztyQdE+G|AC$#P zxKe&n#k*=eBB9$$*zC|Zo>DeMO_DkT50%9CU*hH2-8FEZz1v$)>9>_orB>t8Dhn2V zhl?FjHsS~6vTA^oKHI?E@;)k#+p5fylHm%TOYN0?7Wvw0_OPd3)U6YEa9tHV%j|o( zpYYu>`SWBz@HP~plR{=WQQ2AiMNeUn!XLd4Mn1YTsQ6MD*jG;Hk%xP&_`UQO=(2Z3 zacVU_T?RyY@E+QyR^w7Da?6UCVfSpV^Vk{Ok@26x%y#X9$cL}GN>WEPk2+j!W!dZ~ zH(3MwzpPw-?=uW+!`4sp8*0GAewJ&7FlGy!6NIR(YCK)Cj{dY$N90 zuOM-eZ?GsEiulWhc@rQd>~Z&xQ-*80NuiJf2iN;TK`!tPB0V3QKiU|(sv zj9ihC3N+eRYFmyE5=nP}!|8p`obk1JQ0AlkuF?#d+6(+}eoU?I3!{`T({{=<-*rrL zo;-)?iEzs(y^)D^Ard0Z0#TIv$zPfWBwQ+&ky7-Wzw|&xdaef#i66jLyuHpf>JOF> zX$N4NRME&4BRgp!}{c@u4mz{U(#beq@q3>>dt(7;OSpxJjUa zlBKr`Y`_8_Eu;m7BiOQ2>!r<6H)u z=P}j9$p$=!X5hg0%4FEm6wX)z5H2--$Uc0@1H9bP6u#I6^l)h@gHi%wd3@FkNF-{b ztRJf)dZTn&=A8ORfDq&;!9+q>ZI%Xak)MI{uz#nn|E<0FY>Aoq ztTw9FF{rliCno`@VIcSNa~js=J0Aor2D)-5JlNGIB3-KMxAw)b}<1}oqCbBXVmW_g&`YtG|VzR z?`x}X7`5(dl}(*0Vo{}U#sa#H*n|)!4UwgL3x0Ia;Ee{KQ`if?GWnSLB|k{SHzzyt z&0`AaiAG`6LC40GF0bXNy3vp%0Pnk||rpxeY@Z$gszZCR&I!1iXh|be0 zw3o=wYA~xRh8>>(9+r`vc{~@g07q7uL9Q_3VI__x1jHdDo-pE6;u!moY;HgpGTID8 z@D;Y)CBSaf2kMMdk^dK3csp35k(O! z(s!)l8jIZdZLSZ>4tq($aZ6IuaD}*>Y2~0Ue7Cenu6oVn^0N8D&H%dHIi;#=tcP{= zkLS^6s0&pk!zu0H(Eb3qPOb#*E+s~$XNJJGOBq?3-->fd`vKm|kX&;1#d3+QD$`uK zmCEutls5N7QXN$NmnweysUp6K)Sdc>{IN*-@1kW%QKhRwzIceVnwGPzz#Po+2ebcX zQ0vO+$7oc-43HC&LN_48NK(Wr%hWSXn;Ga+rrn3M{~gl}*#MH`FZ9NjxTnbK1(}2^3OmFJ5tt41& zAzz)xAqDS-cy@Ojv04AMKCJD7#y&C2kiL)Cc;xsaS&gYTOLSpsojCdE`SEn52ibgl ziM1&1ceGs}H=m^NkPfPbHC8G6I(6|i=;F)q*JO2#oYLNHGK^aQn)>#ZRcUKnOSZI_ zyQ%^CVod=Ja79j`ju$a#DLhJ>_KFUP|3UMmMX#HA_&lZrWYTGFAgf5@1au;=rOYH9 zDu;bxl1Am&kdAufpoZnDTS1b2H=n1kLG44%d07IzMXw^4OIKM5VvTH8^6f^l^x%rg z-#?YUHM%Qp+~w_?Y~S)p7VQ0_THz5D@_n4eI^Ngq=g>(umdW1fv^E;|^T++?%hPiI zytN_OQmStLVRoakFsAW!GeEVZ)$ZigW{~8)!}V2?fQ9r6mUtn$N=Lf19RbEL6F zVP8Nc2a&&3Ua!>8BPkt*`7L?JRqZ!aDW3VT744h{d2ei5|JrI8Z^7Gi-6e$u_C1S0qap5vk1yFe2z+fv2u32 z%>$LUk!2MldyTj|wWo_&^N#!kgd&e<2ulx+0i8GoS4zMmGOOI?=e;73(}v%U&g&!% zjvhR1P=-uHU4?SGC7L8ef1?_j;30~8_-$&%3k~0B_&LK1A0Ll~&q1gp%q)f+FzUS>={J0v;UfX0{nWJ&XTVoLYSYzHmvMut?U3M zZ&hoOU5H-4iFCH+a*L4=EK&K)r+P;)#emtCD-VKmw5AD*q~FjvJ_S-wdbeDTSuf(9 zWfWa0+*87NmSxF(C?TcAT-Z^b(xjmcan8)3R&N^CRkhOKtp@)Mn51o+x(NA|j{Rk$ zE$LO5^V-3@qDPSUT8Yi`ik7bPZ_e>$!oU<+rVERzWR6C%gH*|3vv8 z+|JmW*4}vKl4@CgQ;1DetQ9D4+SCFvdqknIY&5C$hQyDm zR2rU686olnEb=(=IXqE0XFQqP)e;sFQe62FNJQ?sQG4PNibApn1RHHv{a!$-gxV}G zDGyh)veC$uDX>rl+!#mGCRZMXF(TJBTbGGzLFtDFCmB;D)uoMF3MHSy8I^U$d07@E zW8lOs8h_Uzov;CNBUk3bdGRDPZ{(W%JDbL zTgyVeZ?S%qv&Am8%wmo;Wm>JFV*1I;vt$JWtLCm8p0>MeqyN{I~w#I z^ey%X+Z)KOs4AjN@#S@a*fvFZ5 N;hVm%H3WSN{tsRwKx+U1 delta 30973 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%0AXP<9TlC9E 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 diff --git a/docker/start.py b/docker/start.py index e40024007bf4..9ac71f3d918a 100755 --- a/docker/start.py +++ b/docker/start.py @@ -173,7 +173,7 @@ def run_generate_config(environ, ownership): subprocess.check_output(["chown", ownership, data_dir]) args = ["gosu", ownership] + args - os.execv("/sbin/gosu", args) + os.execv("/usr/sbin/gosu", args) else: os.execv("/usr/local/bin/python", args) @@ -250,7 +250,7 @@ def main(args, environ): args = ["python", "-m", synapse_worker, "--config-path", config_path] if ownership is not None: args = ["gosu", ownership] + args - os.execv("/sbin/gosu", args) + os.execv("/usr/sbin/gosu", args) else: os.execv("/usr/local/bin/python", args)