From 9eabbf11214f7acfdffb15fa4b290febf4ff03d9 Mon Sep 17 00:00:00 2001 From: untitaker Date: Thu, 12 Dec 2024 16:36:35 +0000 Subject: [PATCH] deploy: e99adee3b9b1eeb8dd268be8c77b4fb0535308fe --- .buildinfo | 4 + .doctrees/architecture.doctree | Bin 0 -> 25729 bytes .doctrees/backpressure.doctree | Bin 0 -> 7799 bytes .doctrees/dlqs.doctree | Bin 0 -> 29691 bytes .doctrees/environment.pickle | Bin 0 -> 646716 bytes .doctrees/getstarted.doctree | Bin 0 -> 23431 bytes .doctrees/index.doctree | Bin 0 -> 5231 bytes .doctrees/intro.doctree | Bin 0 -> 4392 bytes .doctrees/metrics.doctree | Bin 0 -> 44551 bytes .doctrees/offsets.doctree | Bin 0 -> 8000 bytes .doctrees/strategies/batching.doctree | Bin 0 -> 28915 bytes .doctrees/strategies/commit_offsets.doctree | Bin 0 -> 6717 bytes .doctrees/strategies/filter.doctree | Bin 0 -> 15369 bytes .doctrees/strategies/healthcheck.doctree | Bin 0 -> 14329 bytes .doctrees/strategies/index.doctree | Bin 0 -> 109909 bytes .doctrees/strategies/noop.doctree | Bin 0 -> 4585 bytes .doctrees/strategies/produce.doctree | Bin 0 -> 11964 bytes .doctrees/strategies/reduce.doctree | Bin 0 -> 18333 bytes .doctrees/strategies/run_task.doctree | Bin 0 -> 9793 bytes .../strategies/run_task_in_threads.doctree | Bin 0 -> 12803 bytes .../run_task_with_multiprocessing.doctree | Bin 0 -> 47268 bytes .doctrees/strategies/unfold.doctree | Bin 0 -> 11650 bytes .doctrees/what_for.doctree | Bin 0 -> 30633 bytes .nojekyll | 0 _images/arroyo-banner.png | Bin 0 -> 71723 bytes _images/arroyo_processing.png | Bin 0 -> 19166 bytes _images/consumer_groups.png | Bin 0 -> 23512 bytes _images/kafka_producer.png | Bin 0 -> 16532 bytes _sources/architecture.rst.txt | 120 +++ _sources/backpressure.rst.txt | 43 + _sources/dlqs.rst.txt | 21 + _sources/getstarted.rst.txt | 246 +++++ _sources/index.rst.txt | 16 + _sources/intro.rst.txt | 15 + _sources/metrics.rst.txt | 63 ++ _sources/offsets.rst.txt | 37 + _sources/strategies/batching.rst.txt | 10 + _sources/strategies/commit_offsets.rst.txt | 8 + _sources/strategies/filter.rst.txt | 5 + _sources/strategies/healthcheck.rst.txt | 74 ++ _sources/strategies/index.rst.txt | 39 + _sources/strategies/noop.rst.txt | 5 + _sources/strategies/produce.rst.txt | 5 + _sources/strategies/reduce.rst.txt | 7 + _sources/strategies/run_task.rst.txt | 5 + .../strategies/run_task_in_threads.rst.txt | 5 + .../run_task_with_multiprocessing.rst.txt | 5 + _sources/strategies/unfold.rst.txt | 7 + _sources/what_for.rst.txt | 276 ++++++ _static/arroyo-banner.png | Bin 0 -> 71723 bytes _static/arroyo-logo.png | Bin 0 -> 13031 bytes _static/basic.css | 921 ++++++++++++++++++ _static/custom.css | 10 + _static/diagrams/arroyo_processing.png | Bin 0 -> 19166 bytes _static/diagrams/consumer_groups.png | Bin 0 -> 23512 bytes _static/diagrams/kafka_producer.png | Bin 0 -> 16532 bytes _static/doctools.js | 156 +++ _static/documentation_options.js | 14 + _static/file.png | Bin 0 -> 286 bytes _static/language_data.js | 199 ++++ _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/print.css | 42 + _static/pygments.css | 1 + _static/searchtools.js | 566 +++++++++++ _static/shibuya.css | 1 + _static/shibuya.js | 41 + _static/sphinx_highlight.js | 144 +++ architecture.html | 271 ++++++ backpressure.html | 203 ++++ dlqs.html | 233 +++++ genindex.html | 532 ++++++++++ getstarted.html | 397 ++++++++ index.html | 186 ++++ intro.html | 163 ++++ metrics.html | 354 +++++++ objects.inv | Bin 0 -> 1334 bytes offsets.html | 197 ++++ py-modindex.html | 179 ++++ search.html | 115 +++ searchindex.js | 1 + strategies/batching.html | 245 +++++ strategies/commit_offsets.html | 187 ++++ strategies/filter.html | 200 ++++ strategies/healthcheck.html | 243 +++++ strategies/index.html | 527 ++++++++++ strategies/noop.html | 182 ++++ strategies/produce.html | 193 ++++ strategies/reduce.html | 196 ++++ strategies/run_task.html | 184 ++++ strategies/run_task_in_threads.html | 191 ++++ strategies/run_task_with_multiprocessing.html | 306 ++++++ strategies/unfold.html | 190 ++++ what_for.html | 432 ++++++++ 94 files changed, 9218 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/architecture.doctree create mode 100644 .doctrees/backpressure.doctree create mode 100644 .doctrees/dlqs.doctree create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/getstarted.doctree create mode 100644 .doctrees/index.doctree create mode 100644 .doctrees/intro.doctree create mode 100644 .doctrees/metrics.doctree create mode 100644 .doctrees/offsets.doctree create mode 100644 .doctrees/strategies/batching.doctree create mode 100644 .doctrees/strategies/commit_offsets.doctree create mode 100644 .doctrees/strategies/filter.doctree create mode 100644 .doctrees/strategies/healthcheck.doctree create mode 100644 .doctrees/strategies/index.doctree create mode 100644 .doctrees/strategies/noop.doctree create mode 100644 .doctrees/strategies/produce.doctree create mode 100644 .doctrees/strategies/reduce.doctree create mode 100644 .doctrees/strategies/run_task.doctree create mode 100644 .doctrees/strategies/run_task_in_threads.doctree create mode 100644 .doctrees/strategies/run_task_with_multiprocessing.doctree create mode 100644 .doctrees/strategies/unfold.doctree create mode 100644 .doctrees/what_for.doctree create mode 100644 .nojekyll create mode 100644 _images/arroyo-banner.png create mode 100644 _images/arroyo_processing.png create mode 100644 _images/consumer_groups.png create mode 100644 _images/kafka_producer.png create mode 100644 _sources/architecture.rst.txt create mode 100644 _sources/backpressure.rst.txt create mode 100644 _sources/dlqs.rst.txt create mode 100644 _sources/getstarted.rst.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/intro.rst.txt create mode 100644 _sources/metrics.rst.txt create mode 100644 _sources/offsets.rst.txt create mode 100644 _sources/strategies/batching.rst.txt create mode 100644 _sources/strategies/commit_offsets.rst.txt create mode 100644 _sources/strategies/filter.rst.txt create mode 100644 _sources/strategies/healthcheck.rst.txt create mode 100644 _sources/strategies/index.rst.txt create mode 100644 _sources/strategies/noop.rst.txt create mode 100644 _sources/strategies/produce.rst.txt create mode 100644 _sources/strategies/reduce.rst.txt create mode 100644 _sources/strategies/run_task.rst.txt create mode 100644 _sources/strategies/run_task_in_threads.rst.txt create mode 100644 _sources/strategies/run_task_with_multiprocessing.rst.txt create mode 100644 _sources/strategies/unfold.rst.txt create mode 100644 _sources/what_for.rst.txt create mode 100644 _static/arroyo-banner.png create mode 100644 _static/arroyo-logo.png create mode 100644 _static/basic.css create mode 100644 _static/custom.css create mode 100644 _static/diagrams/arroyo_processing.png create mode 100644 _static/diagrams/consumer_groups.png create mode 100644 _static/diagrams/kafka_producer.png create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/print.css create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/shibuya.css create mode 100644 _static/shibuya.js create mode 100644 _static/sphinx_highlight.js create mode 100644 architecture.html create mode 100644 backpressure.html create mode 100644 dlqs.html create mode 100644 genindex.html create mode 100644 getstarted.html create mode 100644 index.html create mode 100644 intro.html create mode 100644 metrics.html create mode 100644 objects.inv create mode 100644 offsets.html create mode 100644 py-modindex.html create mode 100644 search.html create mode 100644 searchindex.js create mode 100644 strategies/batching.html create mode 100644 strategies/commit_offsets.html create mode 100644 strategies/filter.html create mode 100644 strategies/healthcheck.html create mode 100644 strategies/index.html create mode 100644 strategies/noop.html create mode 100644 strategies/produce.html create mode 100644 strategies/reduce.html create mode 100644 strategies/run_task.html create mode 100644 strategies/run_task_in_threads.html create mode 100644 strategies/run_task_with_multiprocessing.html create mode 100644 strategies/unfold.html create mode 100644 what_for.html diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..fc936790 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 9db9da0647afe63ce71f2b065b7306e5 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/architecture.doctree b/.doctrees/architecture.doctree new file mode 100644 index 0000000000000000000000000000000000000000..90a3016abb986181e57a11bf579d448a6eb72fc8 GIT binary patch literal 25729 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 literal 0 HcmV?d00001 diff --git a/.doctrees/backpressure.doctree b/.doctrees/backpressure.doctree new file mode 100644 index 0000000000000000000000000000000000000000..59223eb20d4ecd64a1628a3b2c15e3c64d47ae87 GIT binary patch literal 7799 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 literal 0 HcmV?d00001 diff --git a/.doctrees/dlqs.doctree b/.doctrees/dlqs.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4efc44a2fdd6be8450e58c42b4cde1f38cfe01e7 GIT binary patch literal 29691 zcmeHQdyE~`dH34hr`PKT#^Gf$fQ%PouW18>YywqGkZrb9ZKT?#yK# zwl@kXsCn4RR88oO)HG?-rl7VFQl&PD2vrDeLkd+3DF2Wu|3oyQNmQv-la?w?X@B2& z%$%7!_uTRII%zAA%+Aa`=X{Uzo$ve3_npT>G&d3!n?kDb`Fl%LX_hb^;Zcvc)+q47XsCBT77qwwZq)+xfGvdo8j z9Jh(C2~6Uiy(67&WT@Ml(g}g_Qo7l5e5<#VESu?!8ONcsoWy`alx=ca5m7PO^vo#2 zM?8=FW`{pbwUTcBvTQb2L#s_?l5{dQSLmmnz0JPVp0zKtH`#mA>krvM$2t@yzHfzx zP6pxXAu|kvwLty>g3%$4*rAs9K(r7>K>hL~o04S^JbBU#eaBx>_;b(d*oF=LEHWZH zNW7M@Y#B*pwTzQaY#U7z9TE7385yx{tr^RqWv&_#FfxKReKLZuWrYA>tR!Y=`mtq2 zGXZ`GPdX75YFi;1TV6AMkzs9^e#S}<<+4e&j7nu%wI2Mi}R zI!P20I+5A7jCK$byqT<492l)I=o+R0)<)(EHPJRgtLvF-gb&JlCP_eO9qfid6NT7k zj`rcBckcsUqH1I~k%a`);<*_*z{KiT%K<~dwJd>MOBs2 z^zmabsC~jlg4T9cl90&_S*I>J7A7bs0dqoDW;=h}q>`oOBClea4}Je^L&X1HSI9=>$Zv!>D=ouHL?)#uRin0FK|X zPAQVbClndBeTYp$d4>*i;^))NUDF9MiQp8ywE*c6dtxc>nMA;+BuIM?H+J^#NEtaR za1&hp_tMJ`dk-9SI`C2F+3bSML{8;3z4U_oZ9$gpRU(uwtqW%rD9qq)NH@c>Hv1Sm zZ*Rc74!<-a2eX_w2@AveUWx2{$2`>#Hn_nw-lEa=0yyCxFqYt;8#l8*2Mj7l7TBVx z;t31Si61Y5A*GVnu(3zrw=wXh53|QKse)tr^Y^{&su)wlMPnah?7mwL7;ls4HlnWC zv=)u5h_UaMTi~Ox3Fz*0oYhdq^4Ha|tkTUJQsIsnQZ?WyAB``nEff`2I(8DnrsO6) z4?+8SvOIX)rqic7-Xfy|lkIM3MOJviVlLL#Q1@vL?>xxFkufOK4e2cBJt6`$!BzD6 z7DZqsD+=Foru<+qQ|8kx5GzdcEY^OymB6uXVegj8FZ;XpD>OL2m(y+kBk2c*=rlvL zjOCORPl;mwA;<40I{c;xKaSiKff$U}k1O%o$?&2XWXHm!)^jk)SJ-&hdJh{R-Ez=o zfK{MZ*8`e0#d?Ltf1}Lb9epiHMpyijaooKGKK)>(r(=HKNO3QsDwn#u@Q3yHF2+~F zshjxCIO)?2V~Y|MJmsLT9Rj-B5Biz{=oh3VNUL>#yQqa=f2&Ff2)f*hQ8#OUR@I+b zXUujjzXe0tI0ZjT=~ZEvpw?J5h2$kYLW)X4bkAzHf{y9w%D4Z$#ch}XIZ_6cpt ziU^lMf=aibRMfSaPTOhr&ZN^Y=-k5g5M^WGBjz>lNeeJB2)Plqzr z($i7RSl+n1A9XXvj(s2#jSnb%inQ&!H{$1V-?>6I>XPuV7Q_JA5G358kdSruX0ojc z4Zo=eFrcs9UqLmcuQvtDZm-bO9FC@=-6l1m>)@i1bN8ZrA3KYqe5gcxUQcbcL}V&t zN2Wr8t_7DR2$kWKj@_II$;}FbpVWd($AW(S@dQ=LRM$|Vp3_1YAR~e(xbu$BLfndt z;eE#f>ATai!2G=y8X4ranRsyn!Ii`+(w1Hz;xLVYaQb{g$e1%DO zck<$M_>(NV7vN7eR+(Q}$6w?MvZz5XtaLVIzYh2{w-rAmv{*F1D&(b=;D6?%6xB|( zMH<_vg`!hC9LjLbxlIdVfJg}v3MOeLchd#GE49)l6jR2`6?*XXl#=_aU}-@oF(@Od zq&+~Xj?KA2k9xI+;f>d_Ik#%t*V>%AB;2h9F`)AW36;HDRv`^NfSTR=*>d-ulgZ)u z7d20f0Xuvst?7xa76>tvz6=sG#Wujcd{o=M`wW`svzo%d)YS%`)Pfiw5Q2nnsw8L) z%O7Z=xZf!gGTfSQ6pDR1)SBpvrx$l%+?)oP%tkg>!YgKJ%#h6j&Hj0v(&(31C=A(S zOhw@B(rgjV6Vl$j!sIobsB(yzPO~S{sdnOdY;I-0md-Tdph?KYQO|vrxcJ&f;Eb`a zq6|%gpF)O(O@D#jpOckh(;_}!hrNs`5uQ5%++mzo@+vE!?6B1a;Soid4UfW8lr2Wc zCeJ7%DNDg*WRj7?HT%EA8DJE}NJWcG3c<(-Grc%K zToeg$iYFtwPi-UO-gZvSz*(g4pxsACS!SSk$|ld#FqRP)gu`*q>n#82u{`(UzM)k_ zssf>5MTyHNc+}Z_LDa;^%JPxv?Z+UREWpX+qSC`eY!^vH3T*PRV;Y!X9Hb$Q)d?6& z%Vy+6QY_Z9#hmJIk3{t(<|#SVikj;py>UsJjg+DbzXQt`2Nmy3*SpHEPnr_bS$K%|Em0u{z-7>@c&Fkz@9xR~q~}38Sb+Td z88Zt(dJz;Te9Lvn4H;fl^WS;<-|T-c3~5OdBJ>JP?)B6RkJJBWhQ@RzlyW+*e92L` zRgZ!@2`|Q-!v87}K}fzD5qB%9WVk%~e_>dN`F0^VvM)!R*eS4OJ3sZR{lejLB z{Leq+?0=t@{n`oDyHORvoH`MZ6+IMP1cXBwK86!5hyi0*kWgUTo;r-KoHlP!YAV5z zkLoe2IeYF4j_j`1@4XS@CBI(PoA*i48M{v*=+jz)v>^=vrILNy%Tld?{9`RhRqd)7 zj#AXSKfts{@UYqzt}82fRvN2U#_m_>`ihpW8mugOa5ctjv4YAuq1J2zrG-P^E;%Sq&*h;w@J{-_p~sOCh|(@vEbLzORR(Q$HNaaP{-57Q_JcBSK)KU=J_Dp%ELO4^)SWpj)4sGfB? zi}ZV_TGJu^Q#}-&MdDC~TcoG8AO=X9AfaH9MoS5PLl3^DV(RmH&m|@JJnNs~oO?x& zdbOJ2jn}d}Khn0ZwL5i5*f_5B0<+MT*XX}_M>YHo_5 zRLAbzq-|eocj}UGn-+v#8`QTu$FxvJu{)f;VxJDRJNn}8Q;0t+xxeZFQr?C;2j8A2 z0o}huRrjy(zd|(1{cDP7s|(>o-p_rG%D)};-M^uy1pHyIAL+S&D}NHXzATD{kk$?{ zn}9WW9>ruFODqb@Qx#vM3|f~*uCb1XrTS!IO=i*9x=Gq+f~`yC4JufXPn#hTD56c6 zK{%6ik-TW)BgRx83Di4KzUi^g&gc-TmBEKDr9JtEJN z+?a2Luue6tE{)N%*$y$C)lwo*kC&u$xO?=4QjJoCq1qY}n6gBwLqKL0C|mMJ8G!VB z_3G#;ljkzz&OT+56Xrfk&6H9m?(fq_Iu2oXS{@L&T6sy2K#hb+B^t$q$uF&+9EGEhyfBRNGM3?W^&0G+p0yB|DJR3DLvp(Wt4*%G2!wg>zcC= z(z;y!rk>bpS5R=dPGIB}ZTs55NL>JfeMzQ9POqnNkhehx}(ChLU0O!TnkKr5jt{(pD#n_S&4`Utrw;shFC5wj%5igI&Xj$A;Eixr^glGqMf5j!OUp(CXu5UgS=6|-fv=cDPI6*rE`ip`k9 zRhK%k`-~Th@WiDuCR^$q{JVz;wIUK#E2%5H}hDMkn4+ci4|VWj^9$&+6`K?eW?;dEY}&Z zcKbc+6GiNYHY|>Kx?H7VB{!W(iK79c1#_8nVKZL1OD+hNi@LKSt8|d#LKeAat>;U; zu_eZ7mLrtM=wpA>ab4GDpDqp7;g0;rOEpTvyV}JhFlD(`HGvv!{7?oUJ%7DFdc5(m z4860DH|C_dk5V(Gcw@S~EOb)W_WzKpt3T5tR3rXaiB>WGcmj66w2vVZ?ei%8jQ;uJ z{&aFd1S;8ZD-0)5sW5BIms*Q>ZvG+XQ-VB2mjhbv>4Q?iQUT)e8sXVf|P6~dkjmc&t`nLn)R&g#Y2Tc)%#NnLjeD3xrS zRYh81<;7ZXs!lzth1b`XS-CpcUac!rtCwLP)KaNkk;9oR~7vwtz>e>oTX&yi}!_;Ds6w>hWkN? z`?-XazKHrfr1Tibcj;Azl;~N8l%zX^8Pvo0Tq~sXR_-kwy<1uwId8@pwNak_fju{=a!Xqz*>B32=e zw6$^IvK6xM425tQOJp2l=E@*+Rvh2-^6j5jF5-j$Y{{2tT#D;ZMOm_`>Y&3{l5z2VmPUrRNLre=WkB`{?%t8jm8S_t$? z1|U6eT{8O2d~#aniR(8{=ajh<)J%D1zO5t)QqlE&&sE2TdUR^c%PWy8&dawJBvQDZ z1>ba>l@PxabA0(2# zU%bzCtQ60@4fos77U$wRz5(QO*YVfriC(4aNYB!Bl;aip=^uoCf(&YxX}*WtjK zLYk}WDayXk70G+(L%@R_dm>IPFKJw5(joo6mkCAg_dP5smzPbc+85QNdmxE}dmu?J z>+PZL!KVR|y9b}4C*~for=jiv#~bcJ-oYtOS~gn;`R!2$#qCk7!-)d^Yw2z&Q@ycd z24~r9;@o35m*70D!Tif^l(G+`yAW*mBV1X8^|p;}7_8usZhoT_X4bLk^^Rcizbs?5 z@R|_&$I`iG64HHDjqG-+S^0(EQk702g-4g0;3}>i+1*;m%+cvytzJ6u9y*jW%8vO; zCvX=^H;H>o_O_*Tdd0%cQ|wq%ytI%UjbgLY?JeQVZFYedoqD#4*BSAegdX0u(&=Lq z!=hgSc$^=qlkRK>L5vi)rTlngEZs_1eBoTM#wjERJ3V}vL-xVxvNg-78llNc`4`-? zME5R54Z5MK!Oj5&@_;BRh--A3-~fk`4EeU>YYyK93MPt;DU;P&QZqEYDwHac+)|4fZJuo z9~%}fP{rA9={C-3rIm5kN-y10`lZx_`yxa=o#XB1ILO+U6@MsI zPPY>ckhREW_hr!~Y+F6k#}!^Hbdr7x?;CL!TY5ogHE|qHKnyo)F614!)8I%ivg5cLEgm|A&k?Szz*+=KSnXwS1SCcLd;i9Ym`0X!T51fJY1Wm_p zLk6T`*h#7at2#>MoDK;uoi4>jBi+!q+JnsCsKFM7@ETCCEnHA?CcUtUQmYLM=aYL4 z#2rY{0>9Jg4sp*Qgw<3onNu1Ig$t2VN#Ttmv-N$E@^pp~Yzll~vkVXdk*cjL8^WSZ+)F0+R@J z!;i>=Uft5fA|Lb$OejpwRn{0zzc8dC&--*-Ca5sa$YH+bIuH?scDtF#oDVKp|;|uq0ao-ER-c2*; zY>mUf9j;5=8&FQ`Sd0s!Hz?hzz?waYY>6g2@ zC5??(2n(^6N^nAxK(dg8WXUf#H+MIi$8I*+B%5S&fA=nV-DPjyxr8JnBtQarKOp!2 zecw4%b*j31x_WwKLq_(mrmO1Id3@(P-}`*$otrDwPW-B9A`MKJ>2kwf4Bb(XQ9qGk&H}%QqX2Qz$js{=HMhTE&@aw5nC7 zF?FTZSe&vOjoMO8|3P7IYL4oh%Bl~&w!g(|b0N3kZ#f-xZ2Dvl$yoXT-{#4 zH^z%nwdpjZVB6m>KhSWqQJTwEoJPei71|*%QIp+j)-cw#2Yw-tMR`Ef5NLIj^}?CSdC!Zx`_A zyw?1D=_~h~is=Eh#qaZ; zmzyt@0dDGQzU4J*l`I}o3#0W$sn#epm)d8njoy3l%@}`Et}WEs{>`c?g=CZTG+VC% zF>Y0`&y}i02jAxi{{YPDg4e$8@6&IaOLZq_mrJ%M2$DJDpiq9s#yE=8p1;GXx8`!u z4i@je)~0T3=We)>o^P+VDnQEId=043(WxaxC62)2#g4Cm>g)BeX z+_dKi*rONeFF(rUYXxU=u3XD6;``GjuZiB%o0h-jvR!U*kH?D#insb3v2@!r-`FnR zUVLfs41V~#6~g5rShfxmM!n{ew-sMfJWnM@us~=bw2P0+ry~ug>;NFagU!HVdnvdb zoB0$LLZy5!u1bF|Z zXB)Lz^IG;<{qEYcSg+Sq#nyrYw7uHIyp?NLa`UZco>|H@8+O$L(({VG?vJQ4G*tg3 zk(W8ZWuf5!bWa+qbf^WptIX+)$2Ul z!JDU4V>bb4Jj+-il}fD&#BhkJ;XN;l3@BU9sh2=f^kncO;7{by9tI8ZGY7@z%Qnc1 znwcG-Tot>q1k7Pr`Wxz4L%cM$RlzkuUzzQ;XJ!aVcgeE|U%G}jc(JWwSD6{*S`92+ zsbREQYSv5n#ijOjF0@14=SmCJ8Ys(C^6ftJF{W+-Xsupu5qhQPZ?7U>AX)g8D>!xV zj#KNoz2ed0>!sn_EB4h=1@D33Rl5l)mMfR4xH#1Xlvmx`2?AKmp_)0YC@fRm#%_M@ zJPlB5GO51Us=okL&=AZt%U%xDsWiW&A8n;ad0<_m>FLHYEst7R0G8`VTRlL&`E(2D z8qCL@$g`ZS$nwUgkAu$fr0k2nR~(X9(6~RQ$q>`A4XzFHKg#S9loQZ|M1(m4aV4tM zc3KKjg2Op5*bOMj@s766^9ID8L$OV&6n_jKhml$R%=&4RU(ahd6pT9pOc59{8bBr z6rS+3NWb$W#0UNa-Aw{JZ^%^ZsC1LQ3;%kc!Ns9tAEfE=od;tZh zrCJOdrBVSKJ%%i)R(nv?1H%P`-xqBkbR`E`Kmw(j_I*4~tR;D#yHYC9YFj5?$!M6K zV$BmhE>&rjDagrdU_FEzVpGq_NOp0ZkaY8n5|dAYA%j}pC{dN9$>7ay{^kk_$ozxS?FP;)8d@G*b{jX!91a)@{Tdj-!I~?Wr1e4NX%rG zt!SSZL;2^#a6dFk}{ecyJ;HdO*cF8><@piXY2I;LQMRt!kH1CC$Em zy_f40#z2!;$}^qfPo*Pu(kC$Ii$uTp`9A(8e4gWh`5S)j$5opmOh?gzzf(Z1mmvfT zzFe0IG14Jg zY5H5m!=*#iSnP#V#~ljAS=HHFq(3CSNIUqpLVQ}nXWG(fvG@$w#kXZ!+HBtsx zl!P1=ScQE<1Enib4`M-tg9OC?an? z)OMu%!N-M?2Ohk{EPKOSpQJ)h=|Vw8KnRjS)P(47?}3=u>G`YU&$V)*umf0FB-Xr3 zKPN4SRYLV*n|{$Eu6JEZ@6iuQPtA#Dt{Ba&!K;wCH0=hSk|-kl<7Qoksg~A$$aHYv z(I-xywq}l=Ibl6?;>^*Lryn_b{P_737cM;9mX`O2pNdKc%Yj{K`}GWjTxH4%xNzaywO zi9&1u0KsdJ4HEOg3|6%rv_ax6tqgvCAZ(%GJPi{{GgowM7RWVZcSnne-V7~>zmB|W zmMRXIgr57z8?t?pfPZRp;v>77hipTY>nVhJz<3v!DrNC@gmMkA=b)IPO7SZv$rlMsa! zirz|3EA}GTxvU8?`QTR#JXjUk>tUUg9bwg4R&wtS7|d=Efl_t8MphP<3N?|?eS*gF zQupsr-hbKIszU&Atcav*)#k0h!n*xT$;&%suvW~F7m|uSx{(f)VV8cFTxj}D=XD+Q zJOqnBs!b&d>Gta?su-Ztv`b~I<(7ucE&6S~QG;13u&xAXLQOO^Z1Y7DGyRdnM<(BK z@Kv*l;BV(5Rp$x;2Cp}@sxV~;GuX@T$V?PSB~&#lSJX4ETB+)Wv?A))RoHc58fn4; zt3KM9&y@-}n2y;rjpl$RTy_uHcp)HkdbcZ|6WMyvS;7h_@C5rK5OHBfpaJo(+C2IW z5>>_nVxVQ>4P&G_m8vAt`J-grfYkxo_I71fCM#Y8HuP=HVgpM#$7V*5H15*N^1#eK z3>G)%>vfTiljb0k;$KoSk2U<r3!6RCB}vTh*t*Zb^YJr~0UhIddERzeuj5vY04N}LAtBdR>mj`w4Qf?7D`I%J<}L76sTw(!S-H*5si8{F!G zkfCPWM>ninN0P_B@O8ntOx7>9#cy`1lOPO1v0K7osyS_V@z>uS7TXaP6P+@sAkxm_ z99ftPEpqiJIyxCvu`8?s1=*h0sgj0MAw#SA{^syoR^xJ-n_Lg7I1m=8l&X;28kN8> z7Zi%X433t%EXLy7g7=X=ip3r#py1`sumz={Z&l3V4VbNPptptPNWbu~%0V>976dvH zPEZ8$K`}9+J{8t=Q&<-d99os=6+5R|USn#mRGli8TFp{9{3HUapkDcAckqpV5q@Qb z4FO5X4?{Ey4l=?|5GCMe0Ek^cC_&KBbVv4Ve#p4Fo4B1>1nA4oKX5t48dw?RLLKzs z@Fnqetx9UemC6CN68GH2N-~WbKW3K0#&b zb&`4^FEP2eIrB_2waetm;sQH$0VpV7wsp*byx6Z_D79aC@cfMp`-=K@ zhb{s_Z&#S-nRS9>%+=78Qh{&Qy}x9GPe*!OcCiv;znB5nUp^--3dlt9#cSj~&n@IVsIgMI z>cH4*7So=vh_1l}ZqxOkE^+2Y>Qd54*e&=?VG5~(%Y-7zZe0W67lIz}${!=@#I6k0 zkFQG<0$UEOsyWfN+X#aIhH=k}4-_AiA>5MuR3p=7W_YTJn{+wlmx6l$l%b(Stm11F zgFT>&krT^lT!uGQoP?THwpw%kcEK!mg@dh~TJP^Qo`~QDWcRl~bEP5A6c6}2#2A(h z#O9H6DnvoYP83IrW8~`eM*(i(`|pPexf_s&ao)*ea<4?4v7Nq|&7WCf8XLEKlk2zW(q=Eqvl0u#wPM`@D_R^z@@knvR zo?vdgMHtiJd}7regM($2ln=9JT@=P{GMvyN02cZ?Behj)AP`0uL7~aUrJck6NHCr~ zk?(~2qmws99zw?~H;b(Ew*8kzUg(ZM_C)jq$*&mH=#`=ke+AiV;D~NE5a_Utq%`(q z5&)iW%@v=xhPl|KCQ)<~FPm?l+UVaBe^`Wf9_Z5~)VMkRvZO5Vc&Folg4z(~b85`r z7yCpe808PdUWB43bz^VrEg9iakZu$EZ3B@cEsS=Yrf;{#Z&ta;DrX8iKVbd-myagYy9GAOFWQu@BI=t7KGoS9(n!V?g=gCgIh@zPykQ(wOtYP5w z{!J{wU`C;hLCl6ZkR+%AhQBxJS=CV>q%;;c7T!||m_7KPif{9`@dr8Wzis)W zAhl#0;E8g72jcy|8TriY_~ZKzZE^pU@4ox8-2Eosz2}iv@w-p)-Os&S?*4%9-uW@P z`z+u6{)F!yeDgHDYxxK$Aqyyk4~qTpx5D06#^iE@jK5Ve5*SFE?GIon zkdYZ{0R=Y_srW$qJ?-=DafUTf{a5Npt3t_MAPGo?T#>e;NGu0lJ@3*C&=-5N*(v-l z67Li!K301Bd6y=EULVjEN`c8an<57#cx#NQ9>Te} z3*wx#*xLT>UCZ$M=Utj_s%*k27!GtQLcoP@alQME;w-@O^Q`f_b2YHY(qeA*{ek9< z{6Rk*6;@5fpLYp`X@IGF)=xvi?73fEAo9FRtA;wzr9k?Q-DJQx(uIeoAVeaz6tP_e z(&1P^nL5W7j;U8?AIRSQz|__I@0}`_=B9)b;o%e}4{V`t*otHzuq6^O5Nz)@hR_*J zB637;02Aq1I_Q@ zKIWH%&R!6I-X*?4&7T_x3=ogNSe|o^C0&X*vgLn)1KR4Kn zPxb*gEEm#5sDbBQ;-&l0Q+D}^z2vpu5A#5d;&&-rhjcJ_bSSK~=#W}^i-gnAi^NNj z$YH6FEj!RMt7Kn?0FTn_I)&)2_UVkle5oS4VEh?{1*Hs~v4OLV>#<*E*R`@lFK+W)m zOes)|$tc+JN18T_f7o>3z6*`H-$a*p(B+%yLLG45kBk3Miv3B@c|vOyYccNgsN>Ye z)||j)jEu<8qUyz9vKZ|C4=RwBJj=GAhLK;Jg5oXKvMsG8kP2rtYZe>Np*2`U3#?Ow z%h}9D+8w8u-*wQJ)rW*+z-78qqzjG2_*pJbZt7 ze20)N2V0Yfy`fUa@v?0_)z1-pzN&hzFi&Rtd(i#ZY|rp~5u&-@g1100_XGF~pVSBC z&$r8;56hqLg?QCw_A$yaFsQ?L- z5vgF!Em;aTXl8?HfR-%-(rZJAz~)YZ{4vCoVj~|YuhZ0 zV?%+(maO%9IM%`ZEw5H_FyS67U6_A_2$8*iBGWA5d*K{H3sBUy9z~=Uk$<@D5TRww zHEJ*+GcIWAPb`DtxhzBxfqx)K4m1P8N(Rp%vd8e^Um^euWc(kikBqzeL&i&c5FtnS zm{{uJ{8ug8TS6QnHhLpEE<(*knwZBHC7OQ@=*A9I5q!O@Mb+wC!b>UuuP|x@PSs0w zupPwYUBT8M$8sRaLVV$E#JmKm8KY5>KsX3ms!jBk*9*tH@+u)eQP?(Oqv{#j9Su(B zEWpJGQ3!nt*%Ec1pQuim___uoa)%~iWT5nKu0Bfd?+>N@FPyESvvrb$X;S03!mKS| zkpY?$OM_GdX*Vk95T@8o1fCNr)22_t*H91+7$+-xAf2T}XWBZ9fS1D))?u*}(JwLg z9!9s|JO;vNSo~H*n5z|8iA66&vLONo^$hUtb0%WSph zsQv<9MrHI-jR@vgwy01D16&(74ONm{ZaCpky*W48Z-ut8e#=u6Ap37bzn@s0^{ zCX>mEBP#IAlIrfI^N?1KhUyAaT@n}A6}`M*p*TMHzfw&hEJM(U2{^E~iIfpSQ>i}z zv#@mq#1+Zz!h#Ebm5E3(NPZxSGD+en>0EX4ttMC!HfolwW9Oc*XzK@w*0#kP>WKcM zd8^jIZddE%S$>s4*rg=(P_MJro1oA;aDJnjB@0p4mh#P5Fw1~Vl)MQR&*A*LjE&T0 zOXwge?dXOAN5Dat*sZ~sr(ozXHkQ=GNz5O%!QkaWWz03!VM)D;mK4Vr6F!i!0OEPo z6zv1)nvj^~d?0Kf!E5X%JEC3+k?*lQ5!VT`wRQMhU94lW4?+HeA8i@$hUen;E}&_W0Rp z=&`h(NJNDF*ux$NgmuvX^%L$|5D$gNcJolMR+O~0aDzZ+a@*5A&?mvh_jLlh$Vvhz_BxTV^w3M|qf(vHzJ;%%LhOuCtVp8P74Z?=J{vv)6WF>g-Fu%#?V2mk#iVfI5P z6i7G%Q_08(?N|APhwU(w56biFgCu|1@v-os5a(PbKGITlYC>o8C!lz*0klw-v5)!D2i zIo779t%Oh8W+@>SzM1K=2+dU&TV@-HM!7FVCy~4ldP|9tq)?=;zy7d1_tc<29uS)E zrC%{G*i18tl&?l-GRaK|^bm)hjRE=W%2{Z%-G>99#u%p>@}!_`f_26q z(v^9Bl133SPxm_RHPcihWTts@H1r^f#|9bgg^okwhIeV8=AWiI^uo_1){X|7caEtunUe6LnDFGPv?;$wb@ajCL`qMt(aidd&iM;t{6NEO(sNOGE_T7bw`L4p;$ zfpFIyH~;(B#Q5|AP+ZqqZcrxI+PS$q2Cs@Le{+up)38ZJ;6o1sjYO;R-}0iv!v3K? zB%bmbS@c^ODgyv^aJq5nn_<#pvQHc(SfN*`t@Ne7z-f zsK-}IT!Agp6NB90I(l>%yby^-3c5Ys9!o<&*Z~F1V8;$y)F%-3giOQO3#{#VRfLuD zP?S-R62gGs!NW>>sF3mtsx6!1Jq@Hnh658YlnC`B+k8pf%9LId;{g|*$N%$cwUi&qYq*n5%G^$W&|)} z%NwbwB2qJVLtu5oE=f!jHF`$EoX8JO z8e9<>ppj@Y0PT2{r*{QV+?_xTlXmWmVUF3#o@NNmeFO4@=d_`7#~jB1#`t4AjI>UnAZN>?f}xYO8_4 zMV3OGuRSp6NKMlEpL<~Ksw|VA?a|kO=YI z6w}?jQnQfx7nx#9HKs1~jAT7{C9NWDzNrRYHPLs{ery2YH-?J_omk!JExqn9ElWo8Ptv>290QC9Q2hfZF=(D_V23UKc zUG6i<&i1tDU-}S7uQqV*2l7|t38;c%VC{&2h(2#Pm$AnRdu@%WD9F+=&aG6(YY5Ev?XLyBv{EBfGc`ag1dQUWz}(b=7z~ zoX1o)XHNzZb(0{LlOToad6zH_%7Ci2bq8NEdkLQhUmD?&qG1=032-~)ya?IfDcZf! z|Av>E2MW&g(+4x7~5VWAEYw-RQB z>><`Xc(~r)hja=xovZ<#FBOCzrduE$r*ZHGcS;80r9w&Rq*~u3~V6sw1 zUy?1NR;6V(S$r=m|+2uT%)W5bGT_ z1j05#>yu-y=W&<`3+*HWtCSFsZ?R~(T9``U$jI2({3WOTh89J*D5w^clspaE@ei{M zL~(3#Mj8j@{Fne0;(XWqg`~5mv<>uq;5C+B`Ia^kK*yL}Zz4H?oBo zUs0M=v9d^z7?E)?#URT@DIa%o$9F^$t3*f`Neh&qg%ewN$^((}6*a#7H=I2S4f>tboPat-IMBCP7 zIEp1Rmx`dEXm@)KvEbPZTx801tV8_*%(sGFGs>}inapzqXHvB$>Ai5aVvvzS$zU1P zj1E+!jA4k(ppe7>9plj;KmFA`Fg>m$dmrz2V7dxnuwU2DG@F>eWu!a98i0RUFMH=YJuI>G`yC$m*ydN}Ti_NTza2NlRe2J28c z(#AZ=yJ|gl@-#NPKrx~e2keRFG)uvUL9`P`8{37;2;-w<$XL-jXL8A_!13Q9_l}_} zDOE|b3TBkc0Hg+~6!=IVbU~2^P$+0fdOwBI*?2PwG@@Wb4hS1%W5(;tC8Vyx>CjFA zshTOZYlx9$yRm@Hdop_TmwfrkC>W?*2tNo`T8s!?dT0%@D}t;BY?2DTYIe47gw?eO zA-uEC?@S6X(Sri4h!&1VXyH3Vq5kn%)o{;9ZGUf~b{r*XFnhy6BkEQ%U%LYb#%Terg zh&cB3Nl!wSm6T6$Iq+A`5>1YjO_TEyv0KjaIWH;CrCuj$yU?prbkIbQ@943V5(%N4 z8!|XOHbo9Q!qXhY$9fDR4MytpQ2RT#DQTj7j0o{0QD^!~64hU; zT~kESuqnh48v*D%_ikAhyFjOF%BcTHW9pJJN{yHE3$4$Zv)T(a(~yE5kx^HLcEt%m zymo&-saJA>Km_OaiLR(Zh(QVuAM4!_ zKHbbb=qPk)(`jX?R+2uajjQnYvAML&=2c2ExInwFkrQwnXUWx?Hckvjwm@CRK^o3= zEj4ScjmXTlLmg9^3l4wVrk}_maPB|gOh11&ofSuiJZF)Pi;O%tuzkxLZ5*lN1)(ec z772rD&+rj%Gya$)+lCdb-wtCX>=Qwb0 zGpr~L94EbJzE*3(Y~(~{B3{mlhuuC;(>b|5EA z6)tggUp0VmFP z$8qhb6_98(=O-V)!P>Dmu`1lJfGqesq~7G$FEL-lKK6G}Z#{ql0SNUndf#?;QODor z?`=4FY-hm%-;v|aXNnmNvs3`?IrF8fZETVHCt!^GWkQ?ng;u4WL--yJJYS%R*uf7t ze!6Ox>B&xh!U)Q-6v3mq=d=p7+|>%<#4hJ5CFR2TrF5`|e96I78ZEx(y1xtIfld2rj_4w90Bz$u#u}#I-Hr0kxjX37 zo%HGLIDm@s@Zh{mP5=w&a5pPN+N&hFw$h03`vK^6+Npx%(BGrhlf( zI=)|z>vQf_`dvJOKpTHlRsoO_6M*1D1cw0JlC79v{1)Fpm*1nyZ`0*hsK_Vi z@>6vA30zwK7}dnb!4v)Cx~_9Q*SU`8`1|Mh+w1(@b1gn@kP35~9GlN=@;(A?^X);K z|BHTco6OXxP4`E*;q3us!mxNy+w&y}*~tY@>{hd;%L(+NPox}Ris`S+)yg@e=)Ty) zp!AqgY)rSx_3tt2$Ap{qLG7?krHD4Jq*5^mjI(O$Z{dzz8v6ASOa4*E!WX0(YJ0-fThZ8yMbVG-5 z^Zzc2)19zIVS~AHT~MqRc#9H2*;hlPl+uy0BR5(<8P-&`mdtd0X_|TE^z1u=GXc(+ z*;^2?O=?d0qP)9yBDEo>vEN6h^ymUJNW$a$i#=nF=AJn;xDw?d6aHvsoeaZ>Bi z*DjLexW9?J?Qg)r?O;bslRTqs$L(>#YG}J!M2l&qR6q%gr_IaRr-KFxHA(^vAfPgT z1P_Q*L#UCSfaN;#;PN=c3(WO87a(y8KgWQ8DlNVL5|PleAx>vQoaT`Uu7YJzn<}-w ze@i#S)p}xyU`mVKouyxVn(P))VF)#}_xa+g;JHD7dSPN*VM(=XB{49QA|=VlrFF19 zBbV+{tp!WBxH3K3jm2pzNRd}D0u4&QOBQ(~Fr*VQ5o6C%8lp9D=5rZ=vqTt#08DUo zlqdja7nZQ6LVU8kb3@`f;64UT3JDNf_&wVE6=aCYa8h8B;$ap-iWpEaq9ME|LpFp& z7bK$JA+>mm+4HUHMf{y57XfYRh7mp(0j&J7^sRNuFa?QCAJEO3^ndy)g@;M)zJqYQ z3zKtQyo|73|Ms4+)bL3VweO=gqC{;(f#2-P$9r_88!>a2@X>&z>|^+JXr$~vP(M*)S>B&g?|NS z-pWBqf(oA-r^9~Lb9zU&*^-x&MQAhvo$pqi!q0qzfz=ne$pK|>j--MM?#mL%fLdJYeMMz9^bSpZW-}oT`9TlK|b%f|O$L9~8x$xMu^{nb! zwl4E??ckvRa#UDl!&arjiqvyOM#jwnPbgrYou7xj!5fz;ICLnWPei`gP%5!tOuPuE zcMYYGc~aJI0;Pn63L*Yw5MnQ#0e1{Gt!X4$hG`9=IPA4f<1z`tFwfx8_2N_hmUBx; z*j$CW9aw>K2rVPif->HI0?o$d)t%C#1f`8fnO!2WE=XEWMm;i=(sB3D$~xu_0L!2W7uW32~?i$Vy}#awCFyAhpT9D=pihMWocB+@Q>5 zSf1qbXkX|l3$1Pa9iVqPx8dQ4}#(*bvUlCZ826e>(c#G+^|534x}#&yF}S+a+!5k@=vrq5JA=-z zTq-@dJd`yt>ZCm1A;c((2RCr{XI$25zIX6YdcKJVm4)^pXH8op=few zFNu!&C%$@VnV~B5nwKG|3JPbIV_^QT9kuSt-gP%bQ(^@cQ#K0IBi==kfeuUyl4!Og z)lhP;mQ`o*X@;d(W`K(DC%A+MX`P&V79z;+zU!`6P~3XfdPD6B<%QtP*9$754~{dt zkg4NX(D@g804LibigQ6E8jL(}tTP}#~U>Oe-wLqbPsW;H*3_lp5x4cgEP?}kJh6ddBT zAzr(`E$U22#BRjj_J|%~_m3%eMQp?Hx^%(XjvNAB{aTBpd#U30;Wi|%;~(Jfsderj z@}Fp2hWkf&G~<4TuM~mdeilEKRqk{Alsro_?&taU7x?<;eEkc)ei2vqOLX~5T;TKl zEBW)+_%q}F4PXD3uYX4`bcBQZ_jI?}{Re*ak9_?nTy^k*`(@m4e1ZGV^lKeSQ|swM zF$eAj`n8cRo9MEcE)qQ8ZozMg6>vxJBN`;&j?x=ENAr_fyH6=n`|nyEoH^0!Zc0jr@e^F77<@^NaBbJ7>XG_7ongh zp`nj&f*?VT32~j~;pB%49XW1EV1bkY*<(?>Fg11JQlsGT2HAxcqDA1`cf3puWgAz> zZih3NurHSLM~Qot72w!Wi-7!EQ&-3;fbMuUQlvxJp)Q0T6>{-5 zYRJZ-H`<|!d8p2aiCH2!3gsy}hE8L|nIXKpjvq_6kDq@0PV`F|0kMq&T0XW7Ph_CW z<98lgE_e$D@95(syYw;M@Ww*a$%(Nj+)L~Y4jv&&hTK@>zJk*b5n6CyVPpZC#SJBE z^Wa!7#5}O6wz9Se2>1whxKYc%Af`W*qkE_5hDC?syOOj{{cKmCrzn3zn^O2 zUWTIiun$+X8YadI!=YnM2wA+mI6&pvh6lB1p$&yIhKpA&Faw@hPG(+BS&2 zTpdU^?O+H<7D}_5oYmDlhd_BCqafuV$N|BlPnfP@`tb#mg6VD3u|)30kfwapc?--Yjrw4Pt#j%veGHZS_~s z)=uc3M0fvxzldNB#9NtoOE}Bt)-wtc@1&fTKsVqFIJq?ocPp5rGP2ehvxGxn{Md>w zYX&!VbtyA@QdWtwtIR5wAR;(`s>)-l?C*?Ulo>5(B+;vY9jmaf`v&T}X&3pG9#bKb z*iMA8B5s&skg#hXirNR-(HMx`30MR|1DhFl#z18@|C>FUAApwrdO-JRT$pa|!p&V~ z$LvZ^Nc;w>i;j9%d}hr-?=a`xZ0OH!#F$^VQdBb*Y%kcv?F^|RuL4$dYFC#98{3r> zhP%d&n%^yPaM++i`&6>fE8->&b3=^38QC&wg*GCcKLUG!`wYb}lVaqbSWbV@YE1d* zEaLA-o58*W65DaOdf2*f^7UPYMS+vWim{Zs4XqbI{Sojg?D?j!W<)a9?GpA$>=97B z*67V>hKvg{&9*HAE>=4A%v25Co%kq%_ABq<7GcnB|E0&vPoJjU0@k<$vVf6?z&q6T z)m|c+$gD1lEfjqXz@Hh)6o&2cT#~fJ@vfV&QzCDY!2mMjQe+1e$#IY$P6m$C%(v(P zjaRUpK?y544*8z8=;Ys~^>%B9Qb8TzKa{)kD(%OBSs&8ZW!lAoVDxFoIkA#KP>1Tr zPVR?Yg$N@7MlW5SCMS z#<7j9v_Qw5av!kI2CIP)jPE;#RwtnNWG^VXZ=tuWECnMUBgc*jJ2$3Jn*hHTjHeu0_Gw55;gIMdY?637$os1(~S28^Y)GSrPtp+o*WuRozm#HI?>(ru@eq( zZ}j$~gY>rEySM)~-rM7N5Ml1ilHDIl-zoPTzUh## zm3|Vv2Zp7cvri5%=oE9Ndi9amoUMPmo+!n@-)>IDrw8cO58#`gm=xmofUx?D0eY1l zRCcuLXG1&01!W%15=*fHLG zx`osVUi-R2a_VjrwB3-r(;`d=x$mLX&GYmw`~ro4FaAWiGOLLFsD2v9#@#pzMRKnW z+M_NnB)Ur(Ln^V;!`n@<(w{>006>D7EF&w`2Iy4^W}q^eP2L z4+yKD8K76`VU=1u`lSK7l?q$8qk&;dM=}N77)N@VnHKN=cmSZKm`g>S#?eZYl`SU+ z{q+F7x)v%Gjy&uzEBGtNtXQ-2?RPd{>C|EA|K=yJ2sq#kH*1 zGgxK*0X`p*l4UvApQ_AZxP?7TOKbls5U@JfVofVzq7$#ex3;qUj{6&7(?NC?GW0=X zLL!bXIU@WmIweC?yJz!2@o|5YGUl>@%Y7Qv`EN62inUf5fpKtIQx+`FZa`jfq#Bz;&>GxeL8u0oN4!P`F>r|JQ#s_E z){!~PqpE9qXPImwh*rZp$rfr7cY=rvRRM3pMXVw3L?bVK1&5F+&pmaEHXjr?l8s&> zIaj&1gzycD*W+z=ULFSOMybZ3b8067jMi{;Q+g}v5posRb>IiJ9t_Mb8|Q#Y-4-_E zm9ApP1o}rIe@NxfaCE?oM3{tOB^*dVP|%VZ3*wj70Dt2EZ)i7<3_wde(K@wG!y{xT zX<3S=Le}XKqb01RIfD8NVAqxRQQXIbMm>1Bebc69=dOM(sM z`t0n@D!$uw(2zd@R>9eP+25Y;w-+wwblGX9?zo*BNPwl1nrXH1bqaP_mZ0c**#oUop zB;?i5qyMgCU;WiVSa#{ZH8z`upWZN#8gC5p{IO)0m-XPgMKtV|aOq6n5)cZ#^&KGO zeh+ma@YYvjgBlAKn;{GNk>|#M{=*;xdWHt{Z2tqQPMJN^rPEBY68W*KlwQYrm0@_o||3q)oph1rUAN`W`aIAL&y2xUowp1b~RI- zrK{DMuprD)=+^qDOlTY)02-+$teb9=!aOXixm!h@<|o0|LkHzg3v$ODl((~KXxhTs z?jX==#7}x9H}iM;y}(&LGnm6027q-65FJPL12Bg-4$!L<7@&HUmN^s#=v4~lpn4T& z4m)F0ujh0**JGFX%gX}{q7y3j&kH)nny-ivGz6>C&fmWoVCX64PxUITKk`EZ^eP3e z4+yJ|574Xhu*$sO;Ew1!Z&ixcamEJBFvcfpiyrYi__17XC z_4S1zI_=((Uav^8*tetl0Ys;l4bZC;>_qh{EeV<&pjRoDmFiU-3x*P~^|}GN-f30z zFEFh!T>`}F-xjfX$2&EfL^7*=mB9>8=zO|VU=1yx;8+!Qeo?A2uLyo z-B?U|nwb{wzkL9prI<@aozelzpAPrWTI{_O~GBRsfk5QtvXHicOndRPvJNIr}y7;Q@!z;f-FqZoo`tU!}x zCf+|t=|qt1CZ2}`i3ccG7o075oMnK+WLkA(JmV7?DD|1jbB3Duj0gliHK|$zh9KTb zz2qJ!XN^_Dv3z_Gq~tw8o5-uvE%;02lr`g*{I8868DjJw53p!EEviIh&^1DwXk^eI z8Z8Z!`Y8-=G0{@OTOzpI)g#_#c*|F)uP%+?pXt|P@T-hp*WC(Vt90!vZY6-l>cy?Z zv$FUHB0iv4#+H6FOIuV4!NhYkS;}kq3 zmXPyV=4!PvvQJ!Ww46vziFj=>R78KI%fZKofTdy^Ut(j*|p~ z?jIjyID?0oEI*uhn90`xGp2stH^T$$Zt*$eM3v3P0s}!1z>Q!P!6SKZd_Jy(V17oVcae(f3lB4>!Q|TZN z2^|Q#wIbi%yBVdr@r)F<0D*Txx9JhW+(RvUoO_iB<=PtI@p?ffeeqkQlrA7ERzEc6 z@COH&!xSL-ei=o=0JqE@;GYQ&n1`hO14s}##s^(wwx**2@0TyN`Ka_{eN z4$$S5Ezy;mlK&Uu%n;V20CaWNl@)O=;E)GrS(l_^&0-!s%x z@7CYCtGi6!Z36NWj>BNed z=bh+uce_S<{7XC2Ck6mo`k78^NWU;ZuTmJ&2V52Q0KG~NtArt)Y!1Py-~_&#_>qD9 zwE_CJaznZRa;O|)u*$j^()TB6zNrx>THA>)hGj@+?V1hg&(rMCtv007?}Q=!KI(1M z{JDo71O}fThV;aKW&c}D^H*e#vO2#Exw(VmHpq}pN!=xbJsr=XEa%%gGozFJyW2SA$l&lrCYNLHTN&Jhkf5v+H-~j8X6EjKJxOc}V`CE;a zFv;=Vujk22fvwZnU#{kkw|~=~Z#j^1f?OtL+TQJA_aydY<3!j3J2c2y5t&N3M|dM% z%tf&p4H&@uUSo)+;j){MlM5=HXWsOg-f9pXkxZ07wv~wx`}>*)V5(<^`M?1Lb>x zG{JOwSU7snk1d^1et_CTADPK<#77okOII``^os% zV1BZIp01vs?3H|?N@TBAw{70HMf_*+Z~ETt{l?*V&=Tzr;6r;ZUP*_&-*ku~js*9z z(L;cFe|WGBJSehg&oA29!2Qm(hnvEYTBMW@H-)S1P4uvb$8B|XbN_V@T9w+<_T?Ux zbt8N!)CTHn*L9iJ)Aq$=U;R}@$f5b#_Uw+z%6-WgEAh2;0F=9%y3ozn=I@FxCX;g} zUmN_y8f18b``(rxUflO~S?_QTS8%ZISCKSmASV5EB>1X473cJhZG+;3pT-SQ;kImT zH)i1?d~8h3{pqJBjmPdDR6l^n?)U(`N?}-3y-I6tIzK?KQqV%xtN480v>XETwl$9G z&rPYhFu+(kX*K=3?_RFti|z|+WxIc8yP(=K+qJI_0EiT*rh3(Tj*4`eR*+4!_GeIm zhUEb`NSMMNfIWNgi*B_CfPN=D01*vBj5}X2^s!VPfY*w?ar$vBy=W67PRQwJA%jBZR#cO*a&9Il1P+b9l(dc-Y{Dw`d4f~ab+XTBse@Jh$1Yx}S$3ho*&*#R zjI&M|Msvy{iKj3O!>CIp_9D(gbsE9;00ycy8fOmH8l{C&)h>t0=nhUJi!1ygI;vRj zE6^o7d@I35>O;Bd_La$h{_8Nt@acE{Tiv&C6rX6-SK(1z6r38yZZ_1u6#9$SUq?nCWvL3U%siwVoGhl z%=M_On*@EooES%;m!OiMXc2`khEl>kpfzh!3R)gqtF+ zsg3F(>ckbEO+<^#j>#iql0H5_-%=QGG(;}h51Oq}Ue z(7>cG8hsg}uzi*)j_P4wFk0#!>DtLYqF@>d+a?G_*p9%ts}#|vusymLoo8WtjDE4O z&A$c{wgXr|*p8#7k0Xoi!erTLA_{5p>6X*NfqEKMmCz$)EGc6JWj-t!{lAm{2#AWu zR4B+;6vYHSAE#$LBOB8}-{0cZT8%tHPq~WUA6d8VT6^661N=R;&izCF(^6B^LTB7R z!lN1YGkpCAoc-#47C+Ut|IhK$ccIvf`+5HT1-||{U;l!yU&Ph@5?%fhms9KAzmh+H zjXyK)-|+Qs`TBSCVuQO4)t%bx{yp7ocK?B2{Ucxh3D@V`QM@mD?w4`neuXaoOqX?Z zIQe?I@Uso{Ya?AY(PcATcF~7#bGP94OffU#j^GD!dSN)r8n*vUo(8&%GYgt z-Okq?eBFtw0B{%I@22}bblHwZo^$u&Cx*HYf6nZ>)7^xJGwudl-HmkFPbF`n%Lu>O zOb@rvji4e_kPf?vy`!Xu<5n#d8mZPp*6J z2T&)W4ZU;uREAN?BfgO?bexdOrw~0$o8>v{1;yXG9JWh#IG4?LM8;jB{w;SxD$mNF zyYL77yGQ=qD}U~nKM%;CY5DUI{$TV+=+8R$Vf=9)!Q~p5|M|9i96wRdqw3ttMnJL<%01qmU*;<@cZtzU6av97HD; zvPvY8Mg1T_b*`JD)q`&Gi7TA2{eD!Da`A62<9wcS`_y`W6B(V`{-%>NkDhIZL}3Re z&)-BRO`(t?1NW+S-T*+(xF-dir}!qy_&!C5cNtLbm=ok$mlxyiH<)ky+a3e?q}WLh z(4}Kvu9TWZ>u94E-Mf zg<9U55;8mm^iku?HgKL-K-1$m=%40Oq?)ZJ%z7|vB6jE?O-_YE@vmaX)S*~W z$VpJDmq(~@z8J)t3PKOJY6I{KN%*V;@ZoVo^Hec2z|Eaz0>rL=jN5#{X}0PnZmDO+ zV6F~#Fd-JTk`=q*07o&Hc=Y%w#s&|^vrz^d=PHgUD^&x0K=g8}F32!py`@%LbR1AD zNv=}`xrP_;OPLni54gHIAZ1}gu%B*qPU&F+*nYvMLg`IjJJL_~>83!B!hQ*&N*nuMDH z-(zgfWYk;2@yW?X#d>ST!oSJO)-##}<}TODt%@@}b=huAf&5JcZ*<{Fr+V3X%h|K1 zPMkP*;(YGd>60gBF6PdiJ%91YJ$FBFcTkK@tUMw|mgSO_s16=c>r8c|Zc!D}k$Pw& z6%J^xLf*+wdz2UsKMndwLpgQy(NjlrkpZ2ZnK^OnVxsHO zUQIF(samG_q>KHzB^H|@upMNy1v|n6UUx7fAZp+bLY;Vy?FN6+0(f*N6&?Q zKX>{ljpNeAu-n0-4n5{E=U#sv=x{#hb8hD7nG->k9lkpI=%W`-T)dFGc=p`MW4ZGu z&YeDa?C8alXJ>Mc9zAyP?D-=h8qpLTJ3I5}=_d%yE zO4(9v3f8VB_S09U@~uV#+S3%0G*1@Dv|X!L=$W~F?`BHhzhu-z|B zh9#P%a;X_Jg5BV@qay& zPI(ChV703+AyG)xx(rBUtqV1TK*O;x5!gzC_oYU&WtTG%fMqGhxfzO7r|3%zSV`}eC&cLuq+i_V==3I9mZ3pVGkZSOX5lQ(DO`PpfE=n?9cOyy0W1YvC zAQ?AD=rP%of>jxhhlmz5mhTFr3tCSp2*@#*vYUt>19Mh7EcGua1;M%M-oa#Da7 zn81`LR~d}uttGBvb)#P)t0Fwd4ZA)mHag3+kp`yYl{8#%yk@#)%_Z|MZSYZ|eECKa z<;S~VV_bWmifQkZe2l$#kS-Lx2BiqXEn=KL_1DIteDCTn%BMPmA<3I$nN5OviA1ZG zVM40CS*=GRbFyk>y{<&K1*uMSXfu246U_&Yd#KqRB2XfHfno>JGeX;%v%OMY>z@sC zRcl6=C}m9d_YZfvLq_<0$%-Qbo=q~sOAR=|C4Puh?8_yPHRkmk3`KkLbS4wTQh3%C zl7X)@u!E4&BnB{;hI879!DUKu&4v!8z&S$LVu*4V_{buvK?PZ`Y%Q`lg@(EC(x7sP z)6^E!S8!LmQETCIn?ETCx+#v`2wQ3v?Pdmh8R1>8flbdta%qvjTYarI=fQyv#h0`o zX&8|rHPjspA4wu>v?p?oSV*4I;n5LG)ZbDS?xT4-?_{VYtH{tQIPkHTJ=QZoG3M;D zUClFm)OdA2QDWZ7FXhXQNjui&0Ake(FbBqx{ITT98Mat7CluIRqp4`n0T#1m?e(HU zJ<1t_{>9-AI;2BCpR71Shl)u$sV8RNZiP_OF-G|^&PMaylhHQ`vhshvY|4Iuj1TRv!8_sX5HJa8q`(5T* zrE($1#c-^X905l^=7aJRnM0Z0b@RD#y4q7@Vm_v7GCt%y4Z7Gx(uFb^_VLpZQgl0h zFe<7aJe0}k9-)L$Z@+z)aumjbgY)cGxv7SBTP#0L@@nS){5(OlfJ(8Gn)? z@f2QODVCscQZnml?qbDT!0ux9Srv1awO{-8g*F$YiP6_8VO+(YV~Q*#T7eV zx13`;Y#*-Iau*sISKjWuKmqY2GeY*mqN_uKg!l#jkww0Zs0S(F9I+E+2CKqg8edv{ zrt#h`0EsaTf7;0xYu3RtCoWt#`q+ts*4qURljp3-xtKY`nuLtY8=pkgGc}r(R1`&= zb^C{aIQ@F;pX&mp1ll0}7qPrdlu0$wsj-y;h

^V6B8Pfv$0_XgnWfsuk z#iP*bYmKGZY~~F}h;PAOPdSiU9w}C|&}YxLsuyi<5lQb=RYW54MGD*@%_9#31+v)B zx2m$mq=qn1%dt@)u9K*o^;@Km=Dz#Kl0ywNj6@3heI14|YZB@`NeGw?p6$`#0GsW? zbo4Y5%nWCY-ONBY8%{OS+d7O?PnbF21IYoaf@bsfjTrYW-H^%bODa%|1&C-4d_>`= zS+#c~hWX&&OTr)^z2FchxbE`VsXDQ|ZxeEEQj`wr^^b2<>NQkYq5w*RJ_F{D+l-;* znyR-h8fBM8ahMe8RCZL8Rg|Oz!-k=vALG-O&+;+Mo+z0~wC?s?p}V|RND6a&ArhZvYpD|RP(W=fhnV;wh}`raN*tw^DuF=&Niz0M6XE;H3@d_$5Pf1(Rc z#Ed1EHoQ!>^6bp96FJ&di%ptmXO3qwsxmP7Bg$hQppP(Z zEjk?0KZJX85XKR9ILL#bqMVX>j&zfz4#@}7u^fC6rTo&7SjR}b4EvS^qL0V;@ETMU zRH9VvCvPlO`^hdC9H(mENpz=z6aj$?$|@t7Em1cSj03`!AQbRLNiGE1oZ&P|wL*!g z9Zp}QlNmt^Lq`~=hn|gN-7M!&@Q89E#~Tt(llu|@CqQS~k{c(Hhx+cSNu>Tq4W zdiXzkG_@jnNMq3S@UFCgUjaDwBqz<}54+-%YBu&qHv%9pTMmy5!$U807!v#VzdA3z zc4QtjWCyq^r299yM!W?@%*c!Y>p0K1ei zW?}TEp?W+*`|;*v#S#1QFJZ8866jLcCrrS+j;Nt*wfR&p6MriaSlU`TEGK*2s z9&uLmn*Jr@tzM6$CKoQAKY9+T&3Pobxe!_z=>rLIl3#(DF=h@7o>Q@yZP0k9Mi?C0 zs;pt-2gBVO2M={KCk8de6q>cwZLtKuW-=!O>x;%@zP7ptUENW|{C>zPH_+VpYh5IY zm{fY{CYY93;T3-v$&kEP84ef^-W`f(V<}ZROd?XML@Ic2GC~)J+$pXtEsIi69O6>p zO!2UX0m%tl&3cQ&L)^pdWdtqA{c2r=|}6By%8{aJcQAZFm?s-*%`xj6H42SrC>JGxDl|L z2w~O7>N8ZZUQ206D%hWQCYbTs{r%YXHA$8Uq&1i_Xm@M2yHi%vNe*z)ju=T&YCo4w;l%B*BK6G zM}MS8N7L{ve-oviZ2KMBbFX5&{{4eNUnggqM;$^B2(&p>9aOnUQPbDyXdlk zZvUBny`O&hbomrrewQx4M3?^?mzFxqMmlhv8^6vCU*|@zbA#8pvFqH>b#CN3H*lRR zzs?n3=SrVz1;^p=U|4eD!Egpd9tU<5*Z#0`>}X1yknLJ!@<2g z7`D;#V3>f>VBBBe5#5Lbbh;h?LKFmS>JNGy|1$1=e~gPA%Vyy-Kz#1>w3VYI(xtqT zOt9aiO6mOT2uy}4boxrE&@4_{_dW1xzAZYXg<^BsdhotX7k<`@H~5>my0*U&_2Jwb zsjcmAcFD9J)i;k4>_fx7ueXsm6P!~FXDK5`FsY0n>JCLjoIE{nM9&D~Al||)bKoBb8RCx0+UX_+%a za?%N<0@By)g9#)#@s6!(ONO}ovLsvrfiR7nr2rmAy}y(yj-L2p&Oit7zKPF+C{sMT z+TJz`xJepG*)cw=v*D>M9UP*JJuWaEAygQdF6iS7KAxoll9MA5*tR>-j463e_JByj z7_&Rk#Q@7$XxbSYf!Wl3J(?N-_~G^!8UrBAT^R2dXlCD1fni$|;3fnz;Z&FnJa!`n z9~WACjVdnF^&(6?(0#NM!RdhRlZu*v6iAL6((Yg&Z5E;G1v|Nrd7=rVj_vSF`K__y zbHjyurxm}o3kW`Ma+TnqwsH4M<{SScb~E6lws^81Bw?)MxEMAzlVu1?U5v1hye)(5 z)@?e}u^P#K8KdTIgWwQNOFYCj4S+XSAK=>s;B~Z=?ua>s$6pNiWF^^IHz4K26yr1X z$OW=*=*&dqjUuMT#{Sa$5@v9oCNfNL#GCOVIf+8f7oVW(@d;XaQ^vf!FFDjk=%*#<^UZLfI%u!30oCX!0CS#U#{;U>~-B^@E#LI@_T5MkY*R8N-lRvDuHe*gd zw)%6rQ|9!et3Rh{7?SI3200@ESS{(#(UK-HH(b7_6q!g!V*T4@#}HlFgkdtykRs2G z`S_XP&PQmC{i$Td{(Wgqa)fEtxf;s*r#6AM@u8!mWUHmrZrzR>ZIbRV(yZmlCflu$ zX|wAkN(efUKIV^*$rs$d{ZxB=#vi=`)ggxz=y{*W%8q067pHS61lnRI@j!lKH{t*5eGP#D3rfn3ols zn)KR;S;X9*i%-jnTQbPgFRcEoD5KWTuKui~VJSU~TEPO;My)tyP18=O7IU?0YVqJ| zF$3^xS}i`rXS1pxk{ho1M)g`kd5E;X+e@!a5qCRsMi~G#nPXWwcxsTOjR&-D`DG$b zq+70pQG|Bgb;*kT*QBxQDl2BhvWuv=cqqrEec>4+u)}dec?5M(v~FNSwa9~5LDput zvnUBWp8(fD6i1bE6T|1FT9OEl3Z3g$cWQKa*F1&&O3Zf#-@%lOR1!_9opz1PIYs+& z2}xAw0n${^8J9So0~=p>S4pX%qeU7X?|DJKXx$Q}Y@?KblGOs|exWr=x|W%1&CiqF z6baqP4ce$7!5vJ&+ynwBydqv188OCd*b|Q27St{sW+I1O915LrH1}&z>INlaE$m66 z>`K-`s6Fhailattb8#fm+J6q2pKA@E8zC)a8VACK_%p$0MONr68z4Pz*9M9N*rm37 z3qDf;ASOF=32QY90=Hm0uaz@%4&EcM9YIfg^bQW04l&onqZd)PjES>Wf8sLYH&}M! z4)9qcdAkboU=`@BKRP26bS4(~(W9I(wCw5+O(|H3p~W*1yabdanv$x86MVg_#wVTH zR9FwC0VOBY3}W^(8RU(mOq*wx3|-UIwW_Qaj8ys z99TsVH>Zi`kqEldWCny5nQPg-ip;hASAP-P*}t}0kkEf^wQyn!g{*6;2(@`iD9HUi& z*s0Q%;|R89zQ|u5lpRx%MCO#{FxSL636fMg_9>1j!>3sfXSro@ER{MTE7|_s5<=is zvvF>qYx8{!ze7qd=&edI4)~C}6r_oixFDOoXr~LVtn%0A^~ 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 z zulxw6H%#WHh283C_$=CDZzNjKlS5^jA90KWR2KOWj=0+F0F^zi-0~x~Il$I^egs3L ziF=a-EYn$X8_bX&u~_$KV>fH41QGUc#0JzKOz(D8j*ht zJJ5Z}k2pr%7v;$jWteRwIYMk&iOh%%>W`ArBF;e0if;Y?G`98MdFzssZt_dD`Z(r9 zupKp?5)sRQFh8d3wbgsXfm*V|lQ_ZXjBCo9?3hPOc2LpBk{u#AHg2YNn(S~Cfu&@J zSK<{VJJ6L|vV%khBs*x#oU#R>&09U8hs`^3jE`}2K5u?hpRp&)>*TawFQ-jcHq)k~ z8P$Fm{prWD1J2ByC?A9)kw>Q3(Ttet0mm}3R{4o1=D|TV$t_v5u@VzK5{{khXY&gk zD2H5+7igp8Il6|ud($#r2JxIGJpOU4R;xg5`PIcr!%sMzre8-6egJvU&|<|9k?iKk z!T0E|n+Mt^=1y$XNT{Z}CEQoE{GaGk>t{wq0w#lxAqd8dic7lSNP&ukW+rmf>zRHC zAC1RWSMo>26D&PNeyd>f3-;Kw$)ET<4DS#r|91zdECK)=D%&{P_Z*c&i(w%agjMgMFRXgg~Hn$C~Se4=MaXiPjtH20V)eY z=1|!R^3@JdSqL(RDlW*&(DV?5&X8jEtU};h9e}p-uQd^7K%|Ija1y|jDwzA=fu0Da zBcD%K(oOZe(8;)e{^UHYRs74qpVn z4LO{lVk3S>$iGBKMO%8!LV&qj6ut52(nX74_y3LbM}6UwC#Ah`sU2n8D;l*H1hHlV zg89oU7cIJHHXr;e{Jm~b@Ne{|#mV0SV1j>#ul59Aq0b*JfiJ!am%JqQ>-6nQ;ITcy zH|YAC^!Y9N{5E}l2R?)E;>Y*k&Nu@6Zm`}SOxbd8^M$CpWvtX@f3b6!lOPH;|G1W1h1Cj$1?m_jvpKFhrb-G zfa^Vzxjn&3xBx}?6P(nO_^}G_1gq&YN1toxb1i+Yqt9dLb3J@A1a6@JZ^Zu}iy!OY zB@YCf;1Z^K9Q?U{!`5IKe7PrB0-wQB{5T$;JOMve(w*h_~kZ*OS*{S>a}Q zdQb2y_ykrv9sb-i8=S%ZoXP&2#r|xiKlvc{Y#3}Me*7A8_#^nS1poWgnXnoL1Chs$ z(j!OdHgqU|1m22_ML#Byp&#$T5%9+WMUGJpgS(bVhMIw2g(uR!nva2F0l@fhOoCK7 zZ7(l3Ak;nk0O#L3VPKNa_KW&fdpN7;Ts0gH82>m<@GtQLj}{2%L;@^k4yXnix9tMj z?Zf3gK&zk?3^EcF*q?LY56t~M_GbtCb0Pb4G5a&j{#*)wfE6yoKZ}B$@F%z&KJJ08 zX*bOVSHdNXb2a;O4gA>?T+9A*9sMV|X8#-V&>evFNa=e>mU|30^1=P;o%XT2Yg1F@ zW)q4|z1qY?!*9mU4@`PMSuS@Xvk_<)?ozJIGZ!|d%fF{KII5SFbl)V}mqe2iAbqS@I^-QLS1M?CGP4p% z62UqgwpVQW2WPxH%0+K4jM>bqj)aB&922cE9_M}%ILKdClaQ}Bz4dTnaZD;N9%B#4l%+}aSM zpY5Gn$X#3Yn6`$(eiX+kzgTUMKIW3j#clL@_VWV1Y=pr#>Y=b!{X3u|hrBOtkQzsDs2Hsfxp=Ek4)DZuu{k&;J>6ZMw+z|_WDtr*HrP4&w%ucjj~^l%kb;_jJe0} zd(;hgs=(cqB5;~^I9?(pig#53Ku;E;Y?L(WD_@%O%C2M_=OSc$O@tfN*IUhagPbwv zBz3Zoo5d!}?y4_(?Oe?Bd}fYVv9=1P6+Sjgd?bj4iknjeZuBQr0Df~W@N|5#%qprk z4HG?5y=yyEy*t4CXC^6Htc~IX=o)FXqKbp499i?Ig^S)~`QRidqk64%aB{lU#7G@# z+`0!=1}Rc9rHbR@@N5MJ1iPeCD~{ussInU~jix_U$n7QrtRc*zFaijAA4hLCD`3%j zqwKl8wMw}(Gm7dT2jONmtOGcFW7;p3CuYz-<~n<#P65Hv45-@J5V@%q7)y$!M_@I< zcAF9!yH+0rUN4s>VX>*y4g-|oD~cX;)hSQ4rnHxNd9co>n3ST$)jW(w7Xzs=Af_y4 zN8m#26F_MkDo;Mfs^3!D!}gs^X6xtpN1tyqUu6Uhu|W8P%#FyOBVKuUrSdZRb&*?rZ>-m7jJx%sNy zH|)8RkY4lvJ&jtmI97o*dK&H8_#*V^g5@Dq1$;C`1!$|#F)IJ5T4!yPH`SN?dCE(= zT6Yk7vF=>pBn~Q|bApY3m3p!mPRswewr9y4R z!W%X9rs8IOO#7*?dU7rhbP_o^NeWl7AkwDYBMV|fXBI^J-hHs*kZS@s|% z3>^0v2wF#?)3<&W!UZMZn}&D&%x-Rg@+chtlQ#y3_ERKbZ*d0A(gOp-IS>Ag`x9Pr z_%2WP@tKBSnHZG+W9n#VS0wZK$D*} z0yAa8B>V!^p&JO%-%=gJYh`U| zC)`);oCacziZz6j-Xmgq`*vt2-UyHI<>ES_s*; zAlNp(s;cX!Iko4mEOB9P-yXhwd-(QHXr^a|F}tHl(N%CYJA+wC{?YK%^D5s{bC9+; z#ISlvry#x-=s9`gp5|YZD6fww7Nl%Fad86h?vX_W7T@?g-W zgRn&_zJ#s>@Z|(Jm+&?1U7|7#YmJjc zwT-n==SeKQuwT)bA4$=e)*bLakusRciLoejL0I)nVl`J;)sUe##FH{zp2j z?U&7?+Kk93SD>({#Ea%dSAt~eAaO$x5OinBHJ$!Q;fpWo=*e11yD6(rphobI2m-CS zivbnYm^iGKsz#k{smQUX$l6=Yx_4PAT)eBUPpS2`m}hENm2Z!!dy?;GnY-V|BqpK5CN^*Uq<`&bd5e$ zO|2mwfN7ZvWh`pg8P4NjLaT*2EbjjSWA=D)|M8)4Mr=nRqk4INL|*ZE@t`KmbW@@B zO%BwyK-M0@y0tKmIzVM1%p59PVXitrWg*NQs<<%o2JfATb5c+G`y9aTPM|yJNq;#2 zl`5}y!vj5$SBBR9%IkFzr!K);i+gFIU#7455kDr*39IE>Q~{5CugLb>9SCnB+ixKX zSP{k>FdGDAdeVIR2f03Gv@HYP^GMYze+3UDnU@)j@xS7L9}BMKP^A-beN2z26#TvegjN*PdMccd9E6$|`mEa8 zSM$Fk`hYji<83NsPH=$DiZWWyofEih#lnE|LYZw2v+uR!Y>2P3DuFI`0I@p)Jxd{w z23=n?oU|;MTd??miiGDoAiX%)h{hbs3zwEDwD}-ZK9b5N@8Ix%9rV@?n&A> z2saF*PTU{oa@=&l)HiigK$y0=lZ%Nsu^kHWFyrW?2NZ+&OZbtTFpY~8nBW{5O#Z<26jMnK#KGqhgL%mvfl_Ir>rAnK3u!8vQe<~DZ#k2zpi4H3=vVmXI@fCI>c z9Egit3d1HR*TyRp{IEg+n=nx&qgtX+@Lq^*@UR?_5&^Nic%oIQu*OX}p5Hx#jew!g z9{iR{3h?o;mO;b~Snz0$-l@c+Rv~63iqu?WQwnJk%f_2+EwJ29#t+Mt$pSybss8F+ zAua3vG<2|o{>@NF0wv)^Zea>qzXWyV)Q<&7UxY$jZ1-I9bC9_&LyiS+ zAGYx-S4))^BoD)>O=<}%{16I)kSnNz4Xf_U9frb~`c$!gNT!zZl;X{40IETy6P3xT zl+|j;*C~@z*>X)}-s&q(PkDs{^Mt+X5OyFB>G8=qL$x9pY3S1wqD>dN6A)?9(w0oF zeEY6Y14&g=sz8%A;7s5ireTmzsZ|d$6C`g@GoWf~Y7Ckn)h0x1PGH3b6hD>x@*P+o zRabt(6Ynua3wl0^Zss1e^MMK~7&bRihEAgb80e`G4ka0t5$)*#vO@5SddtjV+rg0F zyzO8n!M{s70}C|5o~_tBstko~*o2}!4m6GAqW}TL*(D@!%4Za7~shz&Qm0t&4NZl}43sGwKSradXUQyJU3+EYQpPxqrATxpn!l!bnzf8RAHycn|xdo{qa%gAzAXN9~am}(DD*lD2E-wz$(IqW=L|- zMARF0hUzu3x!Pf^d)LXvSE>uq%_&&Y*1Ce!#RjG z@44;>RCHPzUV5~MZ8VrxcLVpfVZrb#<0F+a^rwDgHp%i1=(*+eoZ*o?dxnoyEkbg! zGFCeWjZENMFqvYVy`wi2yu7%#M7#%wBXPYGuVT&!QZ=cBifh$_>KxjU1aN$>DpT>B3N;?&Co&bdhW-2KD|yvxCgt2p_%~fQ_h;DAQS1 z9sGF;?H%wLGTomse3I{y#B_K+o#{r2>H3LJg*npz>WVo(MwoCwW}G=4p!mAv?_YI= z;vpoI)arJHusj@cL=Mq%g`y#cPz|)0L*JiT`CkZX$$Y6De?sZpM^Xi8b?9#znUD zns%751-&>_8gFN$7~Jasl?87*;;QWcl|8PkQw-kV0G1WcI;0p_u&l}0v`8~>)KwpJ zK%50VIaIc327l@Rl|`C?Bd$K@0F^zi+|mrbY zhmBEB&?+9L)r8n;PVB15*caQbEsn#HGPKbqV__^lx$wYKJeB7FDNV61gRj}y`HJh2 zpiFTv3ZJRG$xd}~nYjdWjws%vvI~pnM|jE@3d*;aOwY`=S1`JpkD0yT(5Ch(FFdDuVZ^wqn$ZA3F#stq`+ejSZR75nn2zeybvY zYIM>d>fMBu_UW%{FF*!J3@rU}f5|H14O(bwhkUPKAf072CK010gsk{*;t9qaaLzm> zOR76YcZ|klvW1ocDNZ z8qU%#;t|f_K{~wXDVRI#sdjKhA*~wI=y6(kGv!r=@JU*vG%TgUIRH~qI?3-o9eF_! z>okgJTHmHBD->&f;80ww9YzlW%Bq@X0p*A;?>eCTTI3!IDE}H>Q9zll+ycrH84ytJ zYTjxAE}OS<%!FZd9!Td0s3g}FPrfwx4LR+%%W2b<&9vz>9_2K(KE=>4<;T8Jf~5V? zL+5rDK99U4F>;=8_)z;5^BFmh0_+epe|6;ddD)#hjF^XOR`f`xl-|BwN7Y3n&fw3}$|L5^gAssr;~ow1|#zsBGh_ zr#e7op_n;T@m-+{yJeB|fNkcP07DM5whDM@dqwkfCcpqpG>KO;_L6ov;KzbjIaKLH zOy5ho!2!bVDCoYIl-Y=kxA&ymz$ga69zYlw#6&DftL+?$A4`YbU12RMNAOJQ*{CEe@$K9XTOTE^c)4xYtX=po#u}J zm95uA;M#*cUJ=8VHZuiF=LrVIK>oCYkR@@Uwu|xmNSkQ>>|ZKx0%FB>G1}**bskf? zhw*-0a{tG^b=f~Ez+}YT-CCDDp7IJC`R14n(NK2n^8wsTedPKo5p}FDVTB|bd9rEFSC~0+n z3if(%Yln*$6IV=gpPHsth-`lprF2T}B+4xM5^N>muF>c;d^IX0le5xECaBfzn;)gn zxX0T!OA1k4r*dpp?1Xa=>~uJ3`(_Sk&;?dksPtoEu?%Ud4tiXF@z*1%TEP~!xKufe ze#u(k7fRz-S4qA_5^85-u(ZQ1l5-KUv@>)bUeV4FT{&%$1X9B!>`=Lbv>_OFUV>d+Y3*8Kmr~MR(WtfR zC1_1VLwtE9>$CQ+@b|h!!N1X;7FXykG;aPKzS)f5V?W!T-?b59sp=ys;!$3&UNvJoq90 zZ+Y+|y7goF{0V$M5Uhgxla1g>_)qXt{CEmK7Gcr#V*H@*mf+P={8)w`%kg6a{_vNB z6>z<0GPfsK2^V1K{RAiVBz~;IJHcxD%+co>`dmw&>*(_s`dkm641pWy{~PiD$KuC2 zc*z67Cb)#D9tVG}->@}U24C(8mcVDQ6hDr~Cr`kSm2_u0ez^iaPQ)Lsnta*O;3T|# zGJb4?8xI7>;O+JJaSD8SG*}InM}t%G`Nctw{_|6u#8ddOi2lDAJ|76y;PvG7SQoPy zp57BY3qFC>PKQ7D%m!z$KWDN(XR$w9*`G^LTrP%>MlcY5bF>jW0%Kx(KD-yuZrW>! zA@KtnBL~z^8H?xws=dS9qkvMD&~OjX-fsniY{&xpa}N9gsLo@5cCbGevOgEIKf~Q^(6zqgQ!R7FA4`|byW`ir?62`fj{kdS1WY!sgIczc(Gws3~WVGCL%?$K` ztdy&Vyk@Zuy_vi%Q;?-m@rOFvfZT!=Yt% z>*zmHBLQRmJu=-LfZ#}9st~337;fZ)`_((`V|Lf3piwlm?4*vF!sKB~X8fjNPu`21 zNFW`-D`hX+0nez@7^&{k2X0@RwO2e|D>b$=MZ29>OG5eMcGf_2gwL)3ePm~)64#uK zyKjaBA+RQ)KV6Hu+>(3eRf^DkR#sp_n=$h6Cc(~xzNR(LuQpnB9}G&!OA~!Zu^Vcw zTA2|IOtI-LcC$tEGU8tX&*IT;6=)(T{T7D#`2|Ix^Fum0GPg@Q@&?;DFs-QEZ%_#j zOn#TC`{1jASx_6IRy;7<-qwk#V5|_g4FbgsXfH1}V652(xG>&{{k)K~+lR9lkg2Kd zA$4^&EKJV~BcDQLE;uOABsW#Had;JfS;J7z>n=~t!DP>7_`IYu0N(<1oV;;QbGFE> zs41fyOUCI}vdeDLW;gKmza6H#Fib<+u=HdX_Esn-;V=p1 z6FRJ2o_)aR>Y}2OSS&FG<=GwRyVyF|*-w=9>OXYUNVQ`iV>jt136u!Ff*`OsCx}`+ z{bZdYP(ozbx*xlzOzgj1Cgz@kl0C6_3d-g*-5}=~PYpRn{EDGPJf~Owu3!&}2N=S{ zmkOrVYzO>Xnx+;7LMvf-psTibmC>s1WCy4$_O3WowmY9&9iXz%dK{{FhQ|t(*ck`d zil-GKKi2{9B)imDm82zUY~uPWy5yyuEZ;t}1BEvm>1nrzo1JBF_m~ZJ0kN7vZP{!{ zGCJ7A47JrK+>l(F3RM!4!@&$2l9}2@1N~#54n?4^!{eYjqK9%A)DKYS(stwovK#(a zY)9fXr&qWg8PWWVfPaPqNL2({qx0>^^O=k^xK~NxOW2HrlQqz71g~=n4#KEFkDzJ^ zcN4*@D8*J!rx6q(JJcf~T%y~ACOS0Pqtm*drVMY|kymA%VBAv209lCy{*hCqr$(k=(Ll7>W_PG~-{#li1$ zUD1FrhZ5M}o;ly&ptnn<#PAYEW1ROlXozR_H{AC(2!TJ-`x|dSL3tf~$o&ocCbGYQ z_X3g$3@Zh1#1CBQ12hm8^bW>ew;c@T)MV~od=zok-TuXgVTj)DU%UfoV!MBVx(8PG z$9uGYv4WKjsEe)mQdz_P2|0_D-WTwycl#Cps1MxUl@;zY>{m=sH?`P4#e4>N89*I| z*!jar!QccW$*4@9g2B&atYK65$R+@h;6keB#vUt#<0poJ6QFl=TNcEipVp3=8JR>#QmxnkdH#XScG;fT^& z1^z_pghU^~(BPhtT3@J%SMjs4VsfI8?TK1XB)BSu6}3syIE* zcH)Zk8mm=eOf?bs#SRlp3UeFx611lM>tlvf7yAfo9Z26txXZwf8HJv+4tTL(M@OjM zHYZS}Gg5Ms+4ng>X2nO^o|Ju)+1CJ!se4Y2RQb5W-0gWKohlh6lz-y@Vt3@}qJ+|! zPLPWm?VG;%fU4`h;(!EuI%%8Z8Bl$HexMqR;c8ID)sl0~?v=rs4(xGdyBu$DfXZSy z=JKB|Y0J=GSCMs^16bWj7Xu=#PjkP7=sbtHS~G@Wcgo%jH4T)6{cxwA@7adi{?~$x zf=wGw;8{q$UG_TA#Uk_P`7peLRsYKlP+4#bhssusR2-nPP$L|wxK%&jyUu99R=NcyL3t=TiN}f0}d=? z*Tg#+yP${4Dn6T7EGMmL;i@AO!pZ!HY(U_+he0F?!I zaHwo`%b){P7P^H)6{qZ`1a=Vg%{uRUZS=RQ1Gm#*GD+;-xoLC?-)3i=s%)&L1w@0) zWp$V_nJqbQa=?HEIXP5XY$Rh@9d&@pg7qD7Rds;M9#`qh>asmGsGU}{*WC_aSuwE| z%4a}y6@_3VFfA$e%GH+df6W1D7PRDQ%=QfMw>v;(aR#`f%Kv}^RQ9-XI|KY<4zP89 z1~@~ciF=cTE7Kry8_ZB!lDVU=y=?_VxJ zJNKM(&caGDIqU=gRP>ETcGu96PEIdm0EEe z@~q(qG}f93eD4`JldXQZSRePMi}hw1bGm^esS_05q3Y7Q=zRn=lkmzM_tgQk8pw_0 zYLGPOZv^Aedx)>0JRg2k@+|MFc~(bwQuW^zDU{Zhkz-UGtJ*as8uGl9mvpt9 zAoOC%T!uvKVsb9Fz-@Cev14`Ko#Sa%=VF@gltTFUeQ(ml@bUZJykG>e3+!*?S|=1@ zRfy8J>+YKiIxH65{_@N~f76SWV!-4!;6jcMszCFl22Y z?v$)xfU6w%%@hXFRKBa%@jodq=}L_w^g@k4ilL1N4NSJ{JkUX5Kb|Y|aVH~zQDmB0b#de#unpdfT5d;BZbk6bMB)9-83k);- zLiQL0@7%*p%Ur9<-a8}hCFZR5=^YAL#&zsvH8x0;O>GajgagxB#M{uTbOL^iqx7xU z6(7vG;?t1q|lu=;&1ONC6s$R0?88s4&$S9c3uTa0cxOpaI(OXdH~i z94cem!6?pa7^cU)W1v~I4tOXx1E9>V!}$oSw>rl(P}nyOu@1&& zxH%QF?@Bi1O!gglQLPnjLlHyOrfKU3IJV{uLwlhToO#h09_8UQ%xr+e4I70+$oB=I z7Yf8xyZM&rs8=Z;f_>DQ?1Idh@3i#Ssf_TN6h??Q32tBP3aaGK7)J+h!q-QOX9sOi zpibqnl&KhaIv>nH=il~{=^3i#A0jf$`e}MBWc4=?s~bj69HPAfPRoG>W|mgmXx47< zTQFFACEP}@dA7ZrK|(o>c=TntRBp~5r3Ya5usVA*c#ux0d5AtA#!1*=j%#IVd`wnz_#?-u!lYGvDe|OO*UTsOz zj$4Mk^UuM5gWj1C-C&{a3p~izYBl`^{q~-mJZ*ug**SS5LpP(y$AKbtEeXT4zu-%N zucMO(+AH?XG$(7-+2CK`i+g4{AAB1A!#u^157u_5-rjvp?J#btpb-PhEp49T+Sr(c zB^4t{%0f%=IC_S5E9fA}daFuDNRHQFEzQAiCvkz#i&PN^;K8_LNx_1zTTcT84^`gb zA{+n<8{)O`Avy&r7qQtqFdYtq2_P40M#85T=!)q5Eigk5t>&cl?YIsZ;6uCW_1X+> za7|Cw>X13ptU*)|Nm%s28^Ud&NuC`^-#_Nuz~=!(hrXeG-#S zd`vQ!O2>uZ+!xG=V5{6+tedGohi@%4truZl5AbE?LFWP?M%Ki zOlxzYP@umo*H`RE$o{Gl5hBx zi2?RK+7$TTLb)+Ajj4^}V1ZB$X^vpR-<810Z~7yL%gsr6h9`bCm}MeTnC#+^(xeEG`!JD`3@iIHyXK1C!5Xb#_;y-hveNtxwf4`hfNS6 zJO;BmQ9cOAR1Tpz3jf2jP`@7eUJN#b@jomJX$&>cf+ zu2*WcL*$9YUHI)q=k_ZNw#{(iP%Tti5HjMdwWysT*DIB`Eff{J6)tDKp9id0yP-p&f&l~c_ z%GK>tGb7B5AAvW}X-4#*fC>zTF<)2(2#~mD773`K@QWd@K1Dx9du7Ort@r#6+DheO z)>L-7#&qy^|A-BjE(sV~t;uwg1Q@)Nmd_ z1OU5D>BtZHdE8tXYyMh)&b~OOqXUi=D9gY;Ne5e~5Ubn8eLC3U7p@6oM_z|#97pB? z$6L60{~b=h{m{HKRW!QB7|ia>;|C%b&PPx;g7L#)3~Th|qzbL+xpYzI>O6@@fXj`x zxoua8H>M0`GLbDhB_OQET)ISCJKTTZ#$b4$@~`T!E=WF3JX&I)<8Y{ArnD`7r`BFrnP}fNkBUej zQ9s4u_(Z6}=i|MrHpHJ7kFqT={kB4+zqKclO}pIB!SKLNT7xDT;9x*59#&%kk2^qR z(V&S#WvhO_?Esa9`sGl?>AMsbM@iE3?oITlLf$18nwKBbijma9A)3oD`L=MUg!-@0 zO^9tB^qaG7f+3}MQ#;?OZcRUc;itq|ra4%2cw%U`2{LG_Uf9w3(~RHa9i6vFPT@+3 z+iPZuptpWz`)WCoc!o((nywmL9?1@g{>;T`1r0tcup| z!pYqX!SrUSsToefOl9YqRvO}&npXFkRzl#B{b9Z`lOiTHbTSNK znd7^hY6E7kTijkor8dDHKu~){1G+(${Mn!eglR9sY;$;ozi$UTfp0NY(V}vKW$_C= zs-itU^wA*;p87vQwk~zk zi)b-G(gVsgf2p_Ad1;>mj zSOJURa)h-BW_0l&WRgOgH{|*Ws6MV8#u-RT#WqfU6q`OagX#+cprZ{#0k&WSB;fx! z8mKAbJRm}0$w{4adM$apQc>kmV98EXkOn(hV2fkOqorotm{y%Sb3cr`vh+0LK12SI zc)MNlk@%IGd8FZ~Kbc2E9c3PcAl?Oxl9YF&f~&5keM&o8&ud|B@&msF<#V&`3sQ|Q zF^NL_cOA~B{op(@hXyn)XI5E6!5dJ>*-EA7?_9Y5(leX>5lF+`>K`fjRDi#A=b(2f z^eiilG|C4@8q=`U4SVu2Z|lyTGR(|_W2@zF)!@_HQ}jz3!U#kY`&t{@EgO?_90gZy(U|{a;>$JKdb7j|4?2YThd}%knQ6m z#m4%3;;m|e@8H-`r(w1HkqX53Qh+e%x~|HCzeRX9jGU zQZGV-CTbA@eIT@e!OT{4*v9Y#2dLATgmRrSwbF)7u~t>|{-%Z$t!de70DEiu*zTze z-XQb?IVh@&@!Sz`!?3SZj)fptO$|DI4RFg?>kI16?L&zUIc!s`$22?UAr^r6r1P}E zsas$ZQx=O8kit^OscObX4mH+!Gjd8A>uAeD_C8p+4Wp`N0$W`~4WsjIn24d6+)rro zrNIzj=CvyqK|vY(V|y|ML>BGI&{g)H48`^+7)l-rMS~<_(0uN>TQvY1>h0ZOkWz+= zI;@NkZVHq|xaaLjIXxHN*A8jj zChqav_id`d{D3_o0*gahe+7mIUXEv>E<**V0>-{li1cd?uvsL_G1v_2Zldk3>6S1R z`#v_&cq;Y^rsKs_^Ff?GOSZ)bgkLCFc#i`XEGYCY1BGyD5@0jdSw>$euzlD8HVX9Y zFdC1eCPyT`tV}|66}0we$3-C%@Ja!QcN+Z~4jm0hEQRT*a{G;xw;NZ{E*gk_72ao= zy&yZ3X`zT8z+m>F2x2x0MGym0C}JhYrD#BR&9c?Z~@vR9T2#?JV&Vysi6 zj1^;fBY$mpZj8THaw$=H>{xtEimA%s{ot`<;C(&gvCS}8Z+Pq&6|EYp1*;KHQQtmF z-ldDY{VH0m=$r3UX&H&V1EGs5lZ=v#3-Nh(s;`)y83HBSX=CE^;B7sl`Q6foCi65GABb@GE$LhX@Jj5S$Wg-dCd#*> z6B6L$>{7i9+wFJ2q1(u7#R)j+7>-aV=8%QU6Oa&9g+|f-!Maa8K2haR&vS0U%ch|01-YJbs2Z^l`a%FmVVpyKVw@nrfoXZQC7BT2d7G0WZB| zON4j}dc2Hpy+H7HXGa^Z2}2YJh}onNu!;sUuiCQC+b_=(7K@(#azU8>BB*1Z{jy5@RJFc-HHFQsPW0&0WbMi69-IUayrl9wAZf!f_oJw;DV zmDD1HFNP>STL7~`_{?TyQ>ncyDueNWg-p5T!8v+XLGfSMqd3vdh~_9L-8j~*0b_nO zo-)F_aWH^W+HsIAA1S1#$W+u=r>)121K@TZhlch~11dX2yJpe93|`;I7#+F^ z5}Z@Mrv}BCP)i}ak4R2Mv4qKzkX128ISe`GTtF>naRRCX*g!0uf)3~!^TFNVbosO!&9`B>41}hcLUbR z5_v>50{7?OYd8Td2YzI^F$wgT4ijAR;P;J}8>M1>+#esHDgsGKDkMJ)6<9p?1%1M4 zu%>}@HHCU(KKh%CbnHMn2>^!@>n0$1rrd;@bJ2GmywV9ck`2sxFzxG5#sFDqa6JRp ztfq>Wq4Q&5=mb1qn=wB}t@88i06f@R=hN}wvH@r2!H|P=dIw(9Hu=dPj8`5EIFI+}U zbl8?LMvZPiu&)%wzDJ*EKi#ziyav}J2u62pbDDTa%Q2pw(b2E;wskd#^G_>MS*;Xpu=Kz&Ou!chwPexiBRj7ib`3!%1IsHft zT)oBt{G^saMu+=%M8$w`xH%MEd)yB*F0!T9I~*o#K`#!K#@lxbBC*iN;=5Hce9!?Z z3*L6b)t@>*Wsj>^olSO-=yMKWS@CSYf<%lA2E*JzgWB@`e>ot|f}UJg#nS~BUl!y2 z%T(Tf!T~CaWI;#0zTy(Ieb@t&jze`dgd-z4`LXaREzvAMsjSb(Ily)kys4NN(`j$w z$Ci#XrXZ$qd#eU#^~@gSp`JAmu3;fJ2C|8JlLSl)afZ34w*k>z9!OhkJtRRS4)(r zOJ34$;&{ryrUfQRdvJlAULo`}LJVw1i-(s<8f9Tgo2(|r+0n`{i);XeAi7QPB4zdo z+XU-k+XTRkocS6v)zW0WRwWMSdop@H8A~3^MN+;nhl_O{Vp%w}+kmloB{7VS=VluL zJeEJ669Nb@$bPhtp@Z>xkT=$U2m}5oW3W|$fqY2iY4A>5c)%az?2vR~q8V)=;Qz*a zNCOhxyFkXPEs^e4_s5ErVzmVShn@=wV2%?38`m=aNL4CS%3+hW`^f9PE4IRGbJE)H^JZ*#e z1iV8~|BM8qhZAF7Q?1^UBHGr0``=F)%(Mtwc*F>+QD_sLG0kNP`wYEHhjqaP?n7ov z4&1Z*O5mQpQk3_n^ojN}aG!wJ;FAb~F>v4WJgaOFdhELXhdqiD*>%oc*M9}Td*-@k zqFr0e-wv;zKi8E>57kJnywvEr(o<=!D?X6qx<;6uxvsydaEX=cI=UBLB79A>Us<*d z_?F<%)>t_PlxQ>|qaBMnA~roW4ux;)c&Y;!$WvYoOmt|PkA5k%UuLeXY7V#i|2joO zZ2;_>HjhoqMvCti`bqCVj7R;Xb;_G`KdJqVh@+162i!>l6r(3Ed;LPzQEeLXmf++I zEKa}-BcP7v;!_ruk8NJ*-~vGba%?D#YN|NH(zKxUYMqL4WC262I0Z)@G?AXT*GTD5 zOgZ>?nvYobMn zI3Wx2w53cItVCH58HAcp5ml+jq{x563_M77!#2Z^Ng0*-95xGv4o=WviuuDLghlL( zF^thsWQfsG$pJi;RGNc#s{x_G6vS%*p;ZEIH6FAKC!-F#BV||zl@f-75MB`uS}gj{ z=b3^}n~S#g*~EK7CR)wj6lWrb(L*;`U6+`f99g`K7I&v^@-0XUa+6cXeDcB`$)=QCKYGlY$L2j(NFYVQk?CI4r_ZMvumQey+SZ_)ZrFiD%Qk9 z`gHs0awlLnXd?(lmwRV-VkDQ}csAV@Ij#^$O$5bn6LRYKkHr&g&t;|fR>AOZ*kjlx zBjnd%cv$7NyrbA@2=Qa2-|qmGMcxsI$~I5sqYhA6C<+c$Jg4sD4mcn^S7{|5LAC7u z+F>?H&Z05aqNUg!r*t9`Ky{sQ_Zb6^WgHm$?+){~;4uzWI%P7tlYGws#O_Fx(F~+- zw31z@cphS`jmXN&KnWYN;!R7mHLXmxzeSfdCc>tHl1QVi^ZgndRK-Rl4o z$=OK4WD`N%Q_bE+LhWqCuwuS=SSQSl$Ws&`TS10rc=}1^-rx(dWMoSB#tL(_-FoFx!rp;EpiWwwuBo{{9 zAq5LE!0_F8f);;X7C3u{A#W`DBxbGP&$KQ_Ki{ZO7<5cwn;r&TLk3;SWHggO-%clF zOTHw!^RwG<8z5}w&#KoUR6oTc4qkq|1?*FU&43)sbArk|;9@)#8^Wz{0uZzvg2H2p z%NH?oX#i`XMsMGz!`fcpY?m0o zT`gHjU1TEPEBgJf^?CO*jGKVw;ByFqF^t>u%&BY;dhBR_!yd(n+&kxv_E!P$o;li? zXxG;JcfsrD#?juKrjmK(&$^u^UppdN!reYCZNQ{Ns)!6QYv^|rrb+R*wPw0+6V0j& zmOdQgJdRy%(eEsdK?kB5xqy*s1S}w+%p02?S7E~?D)oWmy+ZpR3y#b^uAUA6D?0N8 zUcRpENN0(F%2GVwOK3M{Fg4+=UX_?2H;3jNO zNc=_9M^c_smeu=QChXoUH+#bIX1Q~9TG_AJBf{pive&@yU{J=B89F z*ld=2P2q&Qv=6h1#uIpYa9Y`i9k5{0faDJi6zb@-vQIj|W=*a)<-`Rx)Wg=pFBV&h6Xw9JaXoDMBJ4alIdS@NM}9zG_e zRb}*ku-ayLU(Z-=ThCZ6^U$&r5l<%a>W7wD(YO0U%dSA^qBA!+rH2yTUhQVepkj~TaMoZ9Esp*d# zE;lDfWZ(G4Xb!V5!jsA%%fe590?TFPk0NK7Wk|sFE(iL#IOkG`Y!;e%$UO& ziAC(5`K7Ajgr{M;8v$G3ksd}AP3HS^AXqV(^Sa5);D!=!zXk_|y}&g+gO5~5hA}Z> ztD;Rcb%M?#wqMZ|V>&Q-))*^ZC%2p0Wx?SX;<$|lJi*USy}me&r!mKB==O>y2eE#f zRnUnlyJ>l1NP(+IP~!!0rdPsAYq7CYii3vX)TC%D&wd^^_LdYyW*v3@t(3t`TG1l0 z17Yo1)cH+1tnGI%tbC$$E}u0=U`sZPTHoM1O6NnOg7(tN1=6LM& zg?*BBVH4zoc$n}Q@kXXk!UyAl(-rJN@c_$X7hft^{=7YwZ7TXc3&Vp=VO!DnWe2D% zDtI_lwiSKfa)8Q0$8e}LTB^j3N2Fq%##ivC6(TRb+}Z_9G#QQQK3ehKCZ%|f!<1GJ zhHhK*e7Z>dk^C|`pYBQGCX+h1h!`_e+Zc~2G5t?59*+y_nbE~wEb_5sT?nXNl^dSS z)esLcDURMyh%#jWg*ENDqBh3nK~ z{lS|Z=8}~9V-#+!Xifys1UOyG^$iBz%Baab=rD5&-r`WD(`2=jXq7502iUBrqN&^y z6qOr-)i>%4s)}jxpo)Q`4j8bfj;-Xs&H*Y5$?u3~mV!s8;_81nK-C?$5Da}|jf?{A z|LrhcYt}HW?$&FbX`mzmWSR+XgBdoKvwfC$-uR2=Acl~xFpt$kDyl5}lLK=kk;1s1 zX`1t5*TB?l*8=npFxe!lDr4pQjsuP?1c*bGPRNXHr>7i1?2e2XyF7iPRfe+Lw9DT4 zvZj@rTH#v&pN1|DEZUr@P_*~F4xFDpW~#6h6*{x~99?l_MX4yYWeD)!PD%J{o1#&o za^gJO7bjIyL_$dn)sF(=!fjd50hdBXP9*dy{dzrh=DF8Kw%gcw%~&<>6`{eT4lC3$ zi?hDt+hr#k2U1n?g()noRTrO-41{VdX08G|Q(kEb03@jo&f;MwNt_E{n+_JqMKGiI z(rFXcM8INC_vsntWej`1LJ>e=b0C>vgBin(d~mONr=0^gr3l?2pjm{HJ!mo95{x?bVH(_8Qmdm}z?|Z~kRS@0})ul>zCd_AbghGo^Z->K(A_}>^4iuZ%l^Y#Z z`PCE#csK=Y2X+nBST;T`aAOjM+-Yxd)q@nty`9MIfPwFTY%zhYGLGq3*shos#A`5t ziwIURB3jf`WGl4HsWqCIY2s5i@QH@sOp%~yR92Cq=nVz6zuQ~R2qo#g3@^06B}o$A zPnV?iyP`^`7?Z@*-}gdh{xStX2aXA4CKYnR*J-S!%;WbxnoNI%f@#BbB^>W23OY}k@_HLkH4;TsC5I!zO5 zKejM4G2}cbApx86be_gEsC$KR^Z?PcE-&%wx>X?z(fs4^YehYti9BnYckG_Oak~Dx zrw1viXG%P`q~|S063`Qzizt)nE%8t>>(42Snei^>Y(Y+mfvnc%zX~fGIVE7ODUdG<$aT;7MV!2um_6 zf3w0yp!GTrlU=jB)o9kH;E*0T(HE?G|A=2|HGS{!q|c6S8Xdj433=pG9MoDJLS?Ap z8XhiV9vJ>*I6ZYHV)nD+XtTyueax~l1J(S{f@hl&U{XEJ^)Z;$m))N7G8?JW!e%%N z;h!I$j3q_;r_Ea9d5Z{Ia4OC)TAVYXOc`K|S4CX42hM^QtwW&$4Dkc?e=Jtu04ZpT z$~j{kixf)rVq=o3BB+u<)E`JDV8MnSjj5pQs4@|iQ5n`!NfE&@ua zwqI}!en*143WW3?_*EphCc~=v;C}T^dzENntm?t=Yek4Yg2+|}Ou1^5yGhE3^1 z`oNJX9S2kDd1c0_kc{6xZmNa{243Pt(|cyyo7mSw%D0m@?rF{zIVq-$a7%>r9^?T8 z`HU-y4gUogjn*6ZV4-jWib2$DCHaFyFD(J};S@Uef=-fendf#p-_ltroR4in(+^Sx zGp!mH2~7yAQI#bo32WAH*ly=*I;`!RJ9M{+aSGEj!{fCQs4Q$1jc0Dw>$RC$f!&n! zjnpT^o8_!iexa(A*gZwBtle#`SGs9^lYpsU4T2!uwYYP>Ix_pHcOLm(nb0XN6LNRY zvnLdHf#<5V%{lgnuxV{G2*bnT5YGkfthLQf2iPp~+Zb$dlORYj$2H*&TifK>MB{1j zJ!oz70tYNuw6?j)K%tIW+l)KFWxT96tYPqlzkjGHrHIBiLOq!1Y<(TI9E;>TbZTZEF2 zmq00R|J_h(?8N2_O^OkckYxKb^OSM zRpO^=u;a0`DcRal??@S}2X+*~+A}-q4LYptkv`Z_Dv6Dz$C@bbiGVSM%9J~b`SBrr z3epBPpgSM9n;!`n3;qZ}kdult?vPb|wlE~~)}@Z0u}4H;kskV&Fg$2ATWR>B15_4X z1&1nqQz5zB>8lQqB_#%SzOP_Y?u4sQw2U#b2!&;geD+#VY(~=elMXYt=ah7snDU&~ zTxnii4C0));2Wuei$2|K7V8K7W;}o(6SGoN^1Gr=M!D1J4j8bfj;$OIIY8BGIo8Xa zE^&a$N`^IV$t-v3iZ!IY!Zruu9inbY4WAPoycCaL2?&f(FO@!+3XaMdoUMiLIcyqnM$oV z-ifbsn!(rML-fUd*YVf9%!Az^P#cF`C8u>YKx!1x;p(1*f z4r_aVKYScXUg-+NL#r$0BhkRB{8sU6-min*ProJsOTqgP1UZ?wU-K+c0m@?L`}pqK zUM7|9e$1cQPu#|j`6vwU;K%&615_3q&!I}Unb*g0tT4Rw+;Mvl6vAvy&u$adQ{wJekT7;Sx$E8 zSjn9v$ zqqNuKY53>3EAw=-G!jHn*y_=FW-GZ|bsx%oEfG-HRvCfz-*Lczg|^~QWl$%SE`>TD za)2#~Qx|~Ho2Vnrk>qIVXB{wLO`WbZNLc=nDel^P&VbqV%YBiC47o2~g*U10i?}ap zI5tU9Ebv=NB^wd-#r&Bw6$16ipHW}J{Fw+OS^mrlXgV=j8#f=J`D2^}1yz57SLDsm z)q?b9&Tf{c{6@1lHQh;A)sQt=kc0Hoqlqw8_`Z1wtsZ~1* zjXZ4|THUC_+CI>a&}xLh(!Pm%n5!cXMZ>F+@0A7cJRSHf2d5h^GXYn@xd?)sP&~kT z^1b75ObX7bATGSSy*;(6FMK5XB#|raCv6j4y&Q&j2(I4b0F?#LbEwkoq*VgPs>3u3qH;l|8P~c{rhZ z`Y{KvtoYZVdb*?NKO=)?*4jAW;T~Y7^3~q67Vy?n^EugEAp`m&@GixGjx1SX2jHXd zjFyNHSwEP?e2hZvK3UA_OPIwRfy8KCbiM=dS)2yh%%8(6vYF|sJDXV}atbqP=@)8# zH=A`N2|R1oSyh_x?SMR$GFT5B5QNnzEVd5F_jFj>xAf2f3Awxvm4L_nqM2$2 zM0ZmOn1HKb6M`Tekhn*+CL&6LrI|^l+)-F@i_4_k)A6$>72jgJV}5jkz@L5=(@7Gb zcm{ugD31YKPvIB;9*vGrt0V)d{oo;iXhGhtL5Y38K!I_-zy}3(1FAj6{D|UlhVBNj2-$%9iXz1 zYz~#JWdEiER2GuWq0%TS%|}VmbeT3)#r$sv@Vk>{wXH@tkF*{78GtfXdVdcdFn2_= z=FR>}@0y6gFUY5-)2v`mi3ga(iZ2y${U-++TA<_~2)Ftcb%wZp%>gP4aph3iit7&@ zpt2BG4pm%SskW!H#aAyyT62xHHJ|A1biSXSS&B3RSWK12l>l>3#;&Tg^ zTZo-5myr;fpePj*N4{62bGrliETr>n!nCz?UgiLmg>-VLY^C!$2dFHhlS37k&TxZ9 z5Hx))4WCyCeZT?u?v_%^4V{?OLX2|pBK)Tt!!IJH>VYxLFy2$~bsNl(?3U@}Yj67| z1ctf~-;3rT&&K75LiIhrP2xH#|e2 ze1|{oP1I{s)Ks!mt2SCwe%-6pv9-r|s|44@323e7m75;4s2qpgVtxl2T@~;&lxDeE zu2n@mbI`+cf23*^XMYsy_%pu&txIDKD;EGfiabBuBYEaTl+7;t97kk)@t^`c@I`-G z!)%ZA)rjZygdxsobC_qFLib81kEAw%>Xc}oM5a|(w1+t{5_?qM$(6qzTE8F+t&1)% z_R;mQN>*XA4=8ksP0Dup{G*h?Ov>D1`9xTI7GQsm4r{yEmjJs;WOGb9!pg$><1y*z z9ff+I)h8iY(tz-8GJO(o7W@^0ASV^i^qH#`F<-VvgiZF(Kf&;z!))c@TMkfJ$ODHe z-B?U+5%Z)2WLCDKmONq8A_i@dh_ZsG;OAU2E3R z+^v*E8g1Jo%*x7KD7E*z6I5RJZXIb#)*{AiW|F&i4`8#cY<4HNiMbb^)4agQn$N8L z-&U5B6fdxwHZkf;Se{Y@5~F3(ZLdN*$Ps?B zWvnfxt?v^VDlvtrAHGlYo%7=R{1y_qSII^1OBu{yiU$^J1j1_M@WgO?ih6px4r{-B zABD)$P0;djl*ghq4r`)!6yN9n=#%KD?~{PD;Nu8_oK)QRq193{wq~bhY+rrBetI?@ z&F5iw2ao389iXz{at>9xN26Op-*bR!Ay`6ex|%KEW^-gRsP>*;2ekFi=7=7>OI)X1IN9M6WyGMnQpyds-}t`?-t zadxJ;QEbA=6Jv0Q7&PKO-56`-xdnX;vmP4_v#O~KdJh+o)*$xZXhT(esjNCXkw^xc z!LZDC6LA~XU)R2^KT%47qdu)?H|jIVTCQ!@v+H4ahxKg40V<32j6-F+o=rJGwGh@b zHeGF)rz^F#2enENc$g;>QNhDWqjEHVMMid}>= zlKP}itC;!{wu(g{$y&u$OPy|R2JjfpgIwod$17UK=xRYOV+EOznzCsqXRRM85xUpm zNd5GikB=^95_Yjmq_1a@#9C!Zi+r!FYJaG3p}Gs$hgI!^`s;dnI71?Nq~6dD;5bq3 zA0#sgLj2k~Z=cd9*vrN4&tZ6n#qJ**pt4x(I8^D2ooVaiKOA7|ZprK0)(69bwmP}3 zf(fD$d;)Q0Tm|0?cYC@Dnv@SMge$Mp7Q%><5o_TpcuHFfBhz4O;rkUH=+j!LzJ#rX z5lDKm7M=vNWozNdctvX=T`kD9@NAKU)lmpJ))+_8w3N%$&t-6vx(u@S$p~9K{?^a5 zne&ja(ri-~OzSj(;grD)tFKMy7-2QCwQcCQpu^hJ#yANKB~_i?dR5c~Dn^d1AyiD9 z8+5?4mgH_6_XIozdk_Snw>2xIUtPzG_7k^pybr+e4z@_m0V)eyghQ2Xi=@{X-s1pa zcNU3rong??zB|K7kL;36{?^_z0Ql^wU6Q;SkX7<#cvs9lms&yCB#*%}noSZBQD&2z zt#Cn~Y!dY)%qEFIVpQIpN15M)(;)Z!y?8|?30*BrlSKAXOmWXydqVKd%_fQH*4W1| z^TDV|BEU}Xbv=*$$Nxg%X4PylSQ_0df*;pk*Dqs1kUCsni7711yD%;$KTyohbTw zG|4+Jo>b!+VUOgr`sR-8ht)8Zp43z_oNESxO@QQOIY8?}a9&FA1!8s^RECK$hN7$l zwH5pwvZ1uy=e+~@Mf1#7vh8td2gi=s>U?4=U0Y@3abM?v0Sj%#p>h-Y7dgPzo$Jsy zp*K+{BUyLK0Rz_5=}Loy9mq4qU3qVL7F?C-_}^P0@`@@?QOQ{n~nrAWIq!@fh{7dXGi- zUB^%8bIWuqER^n_!tf4}zQ1*V%EEx>P^B-_hK>o3JAl^RI&Il8p(6u|VL)4?Y|QDf zawS1Nf6IVA8ZVI z+qNA#j8}8s-uDtDUaz)Mcc%H&zXHIJiyl3BQQLyuJIV_GE_M#VC*XewpTj9X3@Tk!Dh46 zX*3RFkxe$ym&b%{mC&zZviTrRp(Wd5B*HHgJiN^T4;D0fESW|t*uo$H=S?8_mkNCE zbAZo+P7J=D(#dTwL(Di+ytTKT2MFulZWfKaCK3H)A%709@V}yw7hY?|a72qTA>DyL zlS^@*jA8X9%qomPVq9MNMt7D~_$8bJMS}hrugDOls|9HlZoRr(fqrKG_+H)x&1fE~ zi6OC{_0vw=7<(5SZYTpk@lZy84uE(eF4+AZ1><#Bbe9$1J7tC58hmr89d z2`$9$>l1IksCO1(jIez;1mbvmWOrjKCg3YL4nZ)Qit9BTL~TaxuCm&l=`uNY<1uq` z+UoKxV4vQtE@$C%X?3{>ukgQOb-`#eyaCKUrxUj z_nFtqzf*Ag7JJ;5yFV-|&@0I>Z1CwRsPd)B1dkZGxP^D8Qy#V9e4iI)n zAJxx}shiYHH)kqkQ>Dq=n`2kKTFKpLSb4wT+!|9iV@ z)n>6=ZFoi5a35Ra%RT}PuUYfPe6K{iluc;E&l>GRv+6H&FCR%x8^}RB|3(cQrKWaq-%OaRa|7zd75sIX3`ptLV7_5!0%?3fPSbhWP9?r#!=7`hdgC zE&Qd9Xku!f^Dzh5tfqBW#$-xGnzLWS?ie&e!jwjDc)>1=LM)QA;POxhlWf>w9dOKY)96j9l>+(igpC) z%4SE9+=96{FJNnOqo)M_Mva3Bb5u0j>7#G6KK`zG@oTO{V#-*Hsxho>xf@dkGpQeo zH2`7lnO}324r?!SPBh|5^FLlhCY!Yg=blQ)Ap+)zQU{ngx%Rcsy?;ZSLnzvVmL9ZX11IDnf$H2 z=W@VjPfZYg6(IBDgYce+`60D|DEj(6xUZQW5z%C(#}x|o`(%2kFJY!f1QMgd?%eeF zKR69CJwAa~WO~rmf;2tO;{t2)7xUbCaDTa)sWpx-jJeTOyh&F2=gd|%=x`I49zBSvFl7Pn{;_kGvzf6l%4 zy?5VQ_f}Q+NQR%juBrFxzH`rZ&pG#;bH9=?SRZT?f;E-ZP4&`e@6oy1dV1-HZ8BK`{$fVI<5`!dF&v$Rq>><`>ljgbfiA@^*bV!;s8~i>y zDVB`ipHjE}l|i9;_zWW!quo&`Re2Y$XqdXyMb|!S945=*P!_+jv8ITX7 zzeM;jAxQFkn3ck$Pd^0jI^r+(V6LZ6?7{G-L(+rU=r<@#@nDc%J?l1F^Jq}@#Kc&v zKfoYEus%BlZ}Sb^=vLbxvt7qCl!x)I@N~vtX;zGZ~Em^6nxK{0T)F_SAU)PvcbXL8F0LWD%&zjX#@Iu7N8{=@7)_lhHXH*a)B)A z@@E#4H>XR?-@i-ox3tvm(k-=*SwLlAsafLcvldX9<0_knm$P!voUZ?}0LzGfV@cTp zh@PD+L57$iYvOEYE>pVljlJh~;H|F)bCRjTCi9wGG?O{BjHyU}0Z+st{h_r(Sjo@U zC_Nx6S$~PJl0%TB+7;bL`cK1Tg`NBa`owlJe>x=XHH^F(GVfUb-+iHDe3 zloMW@v%r9XS=1GEvXd(xuz;{P8tL1seNV1Tqm(cC$)U#ASm42!QZb9h&T>l7z~0pa zzfzX5_ne2jeYKpTYZzNi@55U{fkwH0DU0d-xEr&WLSPGvX@utCFJ=R>nDmzjizx(2 zp2gHnkN-z#9voWy3;M(+6MyQ>WQtKXgM%cpgC75SPYN;ZP~(ccY3Frwebk@wC;ch& zCzB~JT95xTZ!R`kl~$!*OYgX+Z-4qfNQ|ELsnh=k|1CqU`fR1N+1ap*{%#n?F$87z z0RCO6wKgnzQ@yVdNqxCw-tny;<7n#lG6w5IG?idYWoFZ8>VL*z?cCBobJr*L06My^ z*_BSS6g2nJRxbfl-f99tElaWH|DpP5JvMGKsqY%`%dDG|@=2!Q+vMe~DB&yrac zL5rUUaGd_L;K67r$qIf@-Ismx#CIB^M$8dqk`%NN!((ZVS;IMj?#nHpGO)2ERHjKm z+bp0m@Sr4AQA)0oYTc)03rVA$lgnnv+7WF8fKrkH>Nf-fiRN}rxS7( zJ5qC~(Bfv?k7@4^=t6sck>=v-w+!vwOA{OYB_hTaf+RI8Ava^Y2`xT@n3Y3|+vyXB z7WtD&oQ;+JVsx<)VXU5(EaBiT&XT1$*a>^G+Wm9~yiAnwc})+OrKq`H64}P%uN%yg zC8w`6f)`z~*6F*lyC`(2>~Hfe*SYw#`niNPF}%eR_J9Rc21}TPDtifAAuy}CDGyn| z)!QO=qLx4*K*~xo>S|3B^N+1Hc57OKV0aC}lj7jmd-mY&pw=`gJz}#A@6p#ZaaXNr z@5lYvnic|GtZ92`F20@_(3+;dM678cNcyp+Jwo#k+hz1gY?sle-qy4jbu+jqwq2%s zdt%xlmoRVIx!Yy_lt1ZDnLn9KdC|7Z&S2?I-zrN|1xYJ*pSHDo?M(mH>#%|z_OA^({>k?1bi(IK%^#$PNLpY%{X7QdW^^2gu^ zt@ui_d`8SMViJkph~crcng(Dlw}8qZ5-*`Ljl^%WfXYDANT}kGc+$~6A>)yF?Y4}> z^LHAd_gDaL5Q)E?37w)0%sIxy`iRA4Lc3X+P$gOL!C+~T_&k}8f&NAOqIa{{kHixl z*$lpqKAnn-ABm^gMqB8F6sL^DYZJ(@dj}PXUr&lD64ekUQaA{Ia@;{0WsR0(8r@H* zNHZw9kG~ff4DlL2cpMGAcc)ihn*mXZl=KqC_|5q1I=lL8SV+A1i*Pi6aTJt}Qd8yu zi+9Io(9eLyJ2AXPz~WCWpfXVT5~}Qg1>;rIx zLCjrDH>MynJj*~G%fW(}djiXQ?;yk|293SvmAKoxB4(8nLC~dgj2K-`J1;7+=5{sZ0)65s^Cy!jFJ4sQwqmu7Ww=x= zHk(M0)eibX8w5Qn!4D5IdH2=)hSaugdMVPdI=_$3FhfJJ*8D7;+;?Mfmi|V{nEXv+ zN&{}~9d`Wcd;GFoY`OIBQT0KVq&r)gzx}j0*m+h?0%j6NyGfem$+D;}WTcz|xKOD?G)AG+LqM`xH?h-=u3{*_=`){`WYBw}{v@ETA%o z*hr{MBR2P1KxJUQOQ@pMjFkLAJu+R>DX6F5w#-O-5sK?`CV zVC}tPqNY*VM=YQ+kZ}o>sf<5r0hNJ_OQ@n$Jvo;TvV}eQ%*iiV%*9B^W9>~$&Ya8@ z>(8a|RZgk*k1S?wz*iEgYNL$p6*SWNTl8|q19h?~o zCnN_E(oKU z|FeL~99P-=o6xH7A1uH!;@y}no8PLhOLk3LG0b(TDc^s?0%-=clv-;DC(nngIhSow zdP;Wq*`l|o{Fwz*7vUY5Rh%2}fY|f0)bNF8o15n5xVkQaE5T&ia-G2Zr&z$YGZkZ< zb)Y8S?7Yy7dWlDQ*@fx#;Ur`jN5D$r(9>UQJ-;&g;KrNY|prj zQ3Rpp9dxR1xJ|d#!t)cwR%zO4&K7Gm{1Ri~U9+l5Pjgh4?j?mpvuCfgkdh=WmV|o) zP|jOs1KT+gTyVJtHn?Cd`lN(t4R({;Ew2DXcP|Wi58*F-s*KI*&MHu{QGr-2eXSo_(uK7qWcyNy~zTM0o4&d8OK zd;XCvk@^?^EMng`iTCF654P1}cK)|o(Eb}5@9MTmiaF6sW$S;(U)O(&K#@0CM5E;g zPt2x=T18{Y!^g|t`BYF(#v3+tduY{)J&?5&<1mE)CItY?Fg!F;EGCuHp?sYMR0giC zgvvDPai#@S2G)RtDw+ipI+k1sRJOqo`hg~EPq6^MHw!^OweiDLJ z%s1Mr^XEer7%-+zPa5QJA;Q9x&lUIBd;SB;U=VJKZ^W>h@-E;oa8uMh>85nn>c-~A zg_zG0Qdwf6U(pP)0r@QYON7r7f+WvpSt*S8^hoKS5ofW-^5^u4Jr@3SNO~+A{M_Kk<9O-kGX_huUkq$Uf;E+oO@kz#io@E^ z?!{3?3T&8Y#57d0piExQ`v`rnEpk7I13t*8X#$?S?-K~VQ5KDwo|@VlBJki$eWcaT z#TyMhH-mL;Ifl20m_FVDDg%C(P-WXfDfJI$TY%P^DP&mx(3R_BNta74CT~uc7!T*v zKwM`5)!=z}mjzVjxXR|?gf#F83$Tp%H^*-E)!bJT zIc}z~k^BPC$2XEgOO=Y|-;et-%Q&=d2+R0UZ7my+WvstMSjHhpQZ0(^qxlaJv$Acx zK%dw)=1;xZ#xde%Fp&n;fKr0kjYhjR)+#pl@r@^jexYuRRq()c!!4GZ{LE0&Gjo;J^w>d}`=>k=H&}pPX#EE%B1Iq1&~3eU{(+_|TWrZn4^$E={{7 zg534KB{1i`kI4Q3y8Izs{)jGrLYMzdmp`M+hw1VWy8H!Q{t_40`wo8pj9=nE@4NW4 z!}}ht2fgp(`k?m%{`^B+w;$pCi2w0pT=yy;`;+*G;N%-F!6&vrPZL!A9Soixj{F6F zm|0TwcQi5|E}76P-t*tKBQ7>W-e<0cDqJlqPMScGCZ?e~MejADn&GwlM~Lk7HR8RO z(2R5oH+b*%$HiaVIVs?Pk$_-0L{oo%=rKooECZN}GJ!cV9npzP@XBVr-GBs%`Fwtr zsONpJ-!&pG1H2L3bT{Tr!@&(h^XSL5;lx_p}c`AL#+Z)51OgZ#)rzKxPTDixxVA^tIo z6aV;j;^pVlWj|eBOP4p%<;qKOxrQzeT!za_>9S!nE+ce#>*ct-lP;52;8LZ_JGbES z2XuMnmAE{MF28vdF0Z4@sRZhi=t7`+tVl>Vc+X$%v+q1$4A!*B(nSwPq*vD%ID)J> zQ!g((D5d3249xnlv#oC(i`5|rN!k$f{4!1Gt8{tQHMsmXU0!-EF26ySGoOyjlj(BI zb-0{Bmv7MJyL5TS4Y<6UE^pX|%UkJk@iTDQOqci2<^6QoxE+^Ky8Ibk9-+%SpNY$R z=yKtWxLiV)Z_?#^bh&K@E_>+mjGJ(|i7rpO8JDNi<YggS7 znMx5XIHSQzGFqIVf0SBhIh7_CWH#JMx8c^1Y%wZ#Cj>JcxA%x6niFY(z@()^@;R3$ z^6GpvhA>=xR#e^nZgpY%vd(gJJH;xr1K8>KYtnsC1)b%Xw2MdN`!2#0^p+cd&K=%1 zfz<8%4}XP*EPVb*5Me(gI8)g&*8DS> z8wBDA*0>X)`wF_X5#(z~wHU;u_QYXbYKDRGo`^LkJ}X}+biLcn4>YZOR~!>Q3#3r3 zmo~-;i1(gPAo#m6(e0(~7MGXUOvApEICmPc(ATX1P}#;q-ucI1$`|0`CU5&)j9Z;E zbBVv;Q9=i-pi5}H4&i`=3&fEF=t4=#%n z21s*XOQV^&R@uKPUG4@qs&6=W#%a6APDywoewt zj~(vHkChNDbk6I>l~qqCd9w+4^6k|Dd9#;D{^-`BmEgmt9nQ4i3-#LGC zalTqFmg!WV`fQ~X3`Ie*<|v=%H|*5h18AMsa%Y44c)8qnObP~-a?lXLnri2A z5~?UYPwR#WvJ*8|t0DBNqu;iePttZ@_jOk)wwG@AWS#oaIlG&cVIkCnZikFIRj>&t zLRha(VaS~Fx%XJ0%77syRM}KKKB@$CYW{Bv5PPHM8Il~*^o$sQS(NnN1z@e{gx&J+ z$$rZsg>;{=K!P!yVo`3Hxnxvv${bhGW8GHpHmt7Z_)>;_Bed6&EY6?@y62vn(*s4g>My9;+~$*{XA9LCA83q&{ir%HyU z&#`3K&<3Q4kDpBg_?bRfcG8kz;|IR|)vjq&5;bL_f>SEioC()yH{CLw@ir@VrJU`> z$$fryY*U>6R(6}MO0C$c)N3NGVbs~`AgWv`6{|Erp;T!ejpvQ&^Yyq-8HoHhJv?M+~*Xd3muTvu;6ZV?Cisq_CDZpp3e z2jf)05Yw*HY){NoaAcs{ny#0J9egadTJFqjiy26U!#P60ej1q{`!*5{D+Jy(k`(_?$88iT!EBYV#|gGmgwLhk8lZ%SaWzrLyF%+^6Z zkd<2^I8X=BAv3d8mz55xoQTaNBb5~&HWk09FP!OO6FdOj(QKE9+LP^Sb-v*L4uc4W zRg6puk$IOm2z)_rp};KEq&v%_Lrc1i2EeJ8O5imuCr7@C*H zIv>yoIuO=b(q)pNi$aoV( zrvA;(4E0qm|Zl zR!MwC>`f5qsgNexXTFx_;iiJ7BXvk|?3 zFk?kOHd$&cMi1(Mbc>V0*7M?0M(?r?=xc-(t^@iyed0PG{*+$_#JTQV2gLcvTnFS^ zH;HvX>tOqIR>|ccRtn_b$gBq9xB3>iz{g78rn0UE;vo)K1KC#tF#;dc)j&TW0r@U2 zel-w%6RHNHdmhUIF?!e4K=iP3eG{{n)2o5zmn`XDuL;r%60ls5JMU2xU}-Xb2Z6 z4~qJto43LYN24}0ms1uKEPjL^$_|1PMW@tmw(2;WUOfeKZn9k~k*%)VFue?<;r6mP z3i8s_6NN0ctY1n4v!lLTEbBV5!B$;%K^O?i{-$7iVs=JJRxQUx|iFC6A{xUYpI zy;1RxgjWk?#4xlLeLoUQ#UnkUGR&>cDz}DS8*Xy}oee$ik|N8+a=N4_0G|muCe@7T z!0JLdpqjCZcS`+Hs>1&vFD5gCL(BjbW9N49*r*sgv0f~5s$KUZ*}WBNRJ>(~w*!l< z(sWR|G>ljg3Yz#!YX833nM5g83$eyP8KB;Zyfc*fUsJ4BixX9Mk6%X>ux7XdOW zXHYcJ9&$KRRplQX(&Z?s_zLx5sywTk*W&R?thx9Yh`cZ|}8J{N@>k-6LhlHuR)MJe14iac-OKmMvY|B9>LJ2%JHP)QPIcJ+4{}E@yl~?-v{?ap-?OnC?p`Ecl7#FtPoiSLNmu;{YMX>g* zu$Xv?2Uw4&`YtQNtF;8(aFUM7@w?NVj`k6b2{0L07x)+O*% z@N_h@1ixR3R zZF|aE`jQ36N%8XjWi55qcVXpcSMPm}nJUc?G03SC7*B~TC%VrWnTYRZsABb3Ck3Jz zau<|@##0bO(n`;(2VFLaXfaJA6%adHX>BBym04Dms|+4U;klf$s)sG6ZNPJuQ2pMb zK$XoWtEB4D+2oHbATwf<*lD`wbz#@30Ow#>XjoUP%Z7E7e9QtR<}75YwmxeCm4Vul zjGfIwYy34$$Jl>az}6cR>F2NqVD)5wSPJ*gEoN`dFWHn?t!xaPFh`fnP5s^olikfv zZC^-(XfWdK+g8FCiZ=atk_Ar8$rX!at@^tHR{f^mYr# zdXu-MUrloud!GeLjKwX@)id^S(gsQ*l6j2h?8vsMvfTIV!FFlBXLzjkbKQuE+|#_n zgBBz(z}y2E-Xh@hn-)-+FouB2RJXj%0xA>TBA|+ThbQH5LeAo^eyuP5e`qn4BtB1# z=?>Tfe4oHoY$eU{0RP5f+6H`O3DrL>4OBVG`728URgTs1{Y8PwR5Kh^Hn*h>G=t=; zY)MbHI!>^F%t+9e(1%YGw;aYk#{wnBN+8WxFkU;;21+85xz+LH(3bhl@xEdCc1NfQ znCgna@#xU^n!Rz21@aAWb`^%Vus5D%0hIwuNT^J;%9sUI23kcz6}2~>&=ntK>!REa zV0TzdEs5h(?T?sR8cYYU+)(vQ3Pa`?Di2uT$ABRvRM|vKUQiygfUGylEuI^jMy#9# zhfEPoioTP#7Jw1CQhi6m5}OVH;npfXs3BvjEQ=sW|4QN$nevb9;t zR_J#vCYU5CsSDA79pP`La9hs$vdT4gSPZz$5~`CH1*&X5N!!O-ZvmSTqr@zhf$U>h zQsxqi*_-oAHf2)wv7T-LT5p6|#C@zZa^+Yg&$hscIk{rdw;ZUZmIkVvh*En|pfX)} z@3(-;VBwW~l`U}b28OS&fT}lH%WYto>w#H{(AzAgYA!;iZ1Fw|sLa_SCfGSWhd*oq z)!=dUaSN!-ag{AXIDEV2>RT`WY5|s!48<%?0Yp#fFG7gYTt{>7$dvDYXn`~XT1r2} zv zw_-5%wkq=FRsVx7dw_OTGo!TteKTGnT7X_nWTSto7NGPw)&ewCuPNF<)Mx;|nFoR* z-M0XJo*vvPb6)gMoo<9%oXREz zr>4GAH>t`QSc)|YJRt_IPSdrK+32sTX1vORAVKp$ngiIEH%~9KN1(<%S$K&pDH)Ar zqADQ7Ju6ehu(dIzoy~m8jUn$I{Z6NFbFooGqh7bs)F~9cq0RRt{Uy%b07y*l#WXN? z?F-g8qSniGkf)!e?4PeMPoDme_nnkGF~#+apy-nqx{(p*2DAd6Dc0tL1+h7;T3L(q zY1t=~nurw9<+ymDGSi;%SFR!NVIAO3s8W<(qT@MwQ^WP!`itw=`M7>lNDx*yU%2-n zN0&gl9~c$7N)+OAsWqOo8D_o6R(iMxQm^T4I62~MFV6P{fpYoY3e*n zYbq~<-7%eEdGg<7(B1-{0n>d{;FGm)64TNBY^ED$rW+(aHRj9$s3+$9OU8r+GNa6C z0mavR{{AgnC|>645z^Ua9fIUCcfcRwg|<*M{UNT!5NV8KfuW$;t?pYz7pG;ZGw-t5 z?FmzWo15L9NT0abEq}^ycFT<$Sub>EC)`<4b@#i~h3(5a z%c*JKg0};>>8xzl+l>#AQVU^%9Rj{08r zy;{#&hF+}#nM0}rb5{3N(dtu1iTrM=;@jA<+WEas)eKaw{V*TvGDb17esnt(a7E6` zMWfN2)_PH>7QGqiE8^NG5Gm8`!`EaCmZl>Ow!{e5RD-*_9$=TD$)`}eFN?!^2#FTf z#0f9jk@U&kDHMG<>-I<5V)yPia(u2xA!ILINfT({y^BEL$T^{+7HQ79%2z~pVj+c@ zz;=}Xtu~oIwV8~4U()=^MEjDS3e9*}Bf3*)sXp3>YDC4&@xGgv1~>~6nbmrcv_dG= z9}F4Ih+eIRRF4S03cl7D>rr#YGHJ;9cNiY5AIlQjtOK`fvmUtpoCQ<{Swa#j)1~1X z7El>14HBv-Jwr|1%@`v)-6$o={fKF(tUkC1gGqAloYU3vk=@VpXDK|HlLvp21!fF* z(h{omivm?PE3J}zsmt&M7LX-+;cE~SDA#9-mD(xUFX4>Gvfv*lnM1R>Gn)gg z1B{uyBrU1(bc?y0^GY^Vj*l)MI(crf0I@gnoS~5?23=Otp*5ZI(#$Q8U{0sl>X!pm zdugD`Nq)b7QJ^wilV4#0mBE@UXn0(tm)Jj36m#|YA`d+jCKVd-* z11x?F!&_MY|84=50h36mOf}8dEub>cG!m+)^*@r(Vxb$($ktf7O&5M?G1(-kNOc2Z z#@k?;F60^xKTToL9A{u%#oSFYU{MKGHWAlG_&~Ss&a{BAHwvDv*>_RkdNS`MK1@aS zVhbD?h-@0~>pzjAZ?%|GUXalc7vtV)8t0FV{dygtT~l^)MY(Qmr*ONqUQflu<_DkaCr@pn*OOO zYUr~}H+Tx|1#z}#D=oF#n-iOnS*4JCGeiEZe6mo_LqwpYMOl;Q(6uwq_6Hpkf z82R;G$YD*w2EN;0DWg!NRIE9TVx{RiyDiWwdO3obXyf8B&SP{cTMbTLnsq zl{lo*kc#+$Q>>LkiMBXuk`Fm`%5JgjRNWTR-km$zZrk3Tj`t_pPC-tKTe;y{;Kz9yeeg%E^(h!l5-Zo3F^@tKr?oLb`Aj78dGK=ET%$C z>L&uGJSv$fEk+MgLvW`B7f@tv zM5jIE%|m=UtFieuLg_;bu5$Z@?DHL@rr}OzawxyoSDOMORbMe!Cx`M7hm%9?lS3JS z$FHWWx)X5qPNd7R*f@XCTZfO^mwAuFpBs()IqfLAoJ3DPo-V8S&IlLxDFjrhKc#&oB+oRP8zpQ_qA_yU}oKrTNX!Pc3oiG|K+U@B{&EtKD#$ z@=j=PBRhSxI6-b^sWp1D?^NC*{mw|jY$T%Cbz*ALWEMR~^}4w34CLK3R<|Q#ur!y+ zAXZ1P#tm%UoYw2BVlkT_NA>DBtiL+)oS4FTfwAJ#y;hxN;08xreU6A`&WQ5Gso7FDnGH9yE(69Qza+IcJ;pgL}F59K1QA%a%`>Xl(SQP zx&;!<=@eTCbD%nRX`srG6iWPxe}47~uuTNwTe7El>5 zfP~6av%J{?Dg(_Tp^6&*+$dh@cwhVXTY#Lzx7}-++`jg?O5+chXHsHACSIpN z=wQY36zV^h6jW9M7#GuZ2|rO!OMgA-2~BK2V?kE~vHb@ofw8~-Wecbb#8yIODz@LV zfXYB@B~*PC+m+SDHpP1v+am#UddDJT<{PZo9s<=Y=UUL%0Ebh_Hmp zRD`dyfXYCGB~(!nUZQH2-4>JWZOzX14l?#Ud-D!$KG}Y!X+wCw9CR4 z^IapY#-&Lie6Df%4pE){scKy4vrIq?YFt8T2O`3A6%F90IwCC6eT~Z%`hgK8)M-q( zPP>Vk4O#B8?WU25dK;w|lr&Do7|twC8K_p>s$XXzoXg&Z(!9_gT5x|7uSwJewJlc? zroy!?-_za%)J1ArcAt)*Db#-Z|>TIevN`qCqjtzB(7bv}0_>FpbJ z9ypAxJZx!fzG5aUw>_sQC$YJ#mdRuD&adB6QK$X{Ssy`J+gznuCB*<%Bn==_m4}_; z{(7Yh*&v3gPk3&r)pX{jD>x%TY7!(1lfaY<6Y~x}O}faNY^mSVQB-(a3qK=17sFKR zrF~7EtqwitG%~ImJQ-IBMW0K?_BIw(oG($t|6BFCIQ>M%5kXH*P91jUTu1Jtt0RaU zpTtzA$J!sAs4J5wdxU;Ka;jULQ5vA$AYIa|;&2r@qbNeGC4xaC$(e&ENuf)UyyhmX zn01H`a9)~rOZyz0{{cnI`kGE&gLaj48FfIukockYv5bRhm|SvMi0bgs0)B!;+if&3 zY8^+w;RFCCS-nx2s?>_r;AEr-i6dk?gyGakyJ_&GJvN!NF;g*P2US`gL5ZPmqltpL zkRg|vXxwFq;dO)+E-}2GK5>a5f66a0Nr)kzduhuNNr?cOf9q2@ z;u$+tIU+kuH^L{X1k1F(#hUZ1wv@e)7>ae>J@l!6C5rdO2kz|70G@Gu5qX)Yga?y(^KN#2Yf$lNgD*8VegQcZR8Eh31tf@XuqE!^zCkTou-y4Uu z^XGZXTX)6Li6UTECY?A`x{gwo73`MiX(5;QppJFxq^FTI+vSsS8u-kY!Y{p)UnY>; zdz3&(Ex$Z13)SI5%&Z5sDSzH(%JwCh`BT2Ppmm_yUB)7~gw^ti41ai~3mt{>7+L9* zPKg(!F8M(&KQxz7lg!`mVt6R%SeZ>uz3GaYxua*Wn=hdI=Q+fKkivpGDLj6Gts0L1ie!FZK@I~feh0%RnO`}6!t(k+{R9b> zsrot50xARbBcY1=2}@KYbGF4~lcXZmVTf6D*@@}4MKZa1%)vyHSTx5&xYPna26{|F zmAw{a7s*^_0by?xv@eqBmP)1~`y2}#7>H~d@8lH8Oj|%@&O4^K+HV1sIj*ufI@!8< zp#@~Uaq^N|S81G;<4ydQ1*VKSE6pe}whPh*N}`>)b;WG}#FnhTMH)nGqs#1Z`mU~e zP?U5;Z))2iAGE-^0jl1M;gi;<924ph3#be@K|*D!V;;4D%0S0RsG_v(sl&&YEI>|T z;O-5f+*Sd(tL5jIXHvEwP2&6lp@WsvlLE;LrA{aTjJNj)2_rqP9*jvU-_#^^^{lyD zVIZl?F}#JOKHdT<14)%onM&%}7El>Ts)Q;ksVg{b#wTgEu^=DTNc>a_uzQnM2}Ra{ zhPm>3A#+Y2QF4Gmy{Q7|X_+meUqc z8OW!E%2Yo0TR>$XpAxF5e6Gu&x|c1ji9glI|DeT`dXwE9Jp@scFwv6|cplO> z12rL`imD0JaJOVOs-o;rj(T9DS0nR3TY%o1I_TZ-{1t zGoYo^PD4j)>7kuvTa;1~%MJdmDW0cUKy?w`QB2I=mKCrY@PH_%wbbN0ETA&S)pZeE z2_{qBQTg!H1m=IP1#CN0G1ghvY|qZt8?CYCOtI0rqm9l8&4q&!kw>EuNf?o7+?ym^ z=0U`>yQz3k>=ZY2PKfQXIemIutG?v zOts2$ETA%w6baQpY@VtG=t+#em^RO};2l#c-D@#b11d?VOl_W*TR>&N(U!P+ods0p zxH7hR-f01r5w{M)<`E=FTQ$serYYY)Vu3URT1xF?YV$m50hNKxW2wnMX91NtuIy}{ zZ&<+AyUimInZ~_I!ewsr43WhWi_vgP551d)vSQ*!52vrhhEUH7t0(0d&Fop#G&jW! zMEEESZ(;VFWC4}IA|atNRV?c*pfV5^3DrQ%o{KF&PvZ5(G7VLM3HmJe6oWG*LcNs4CgXc(0KYdSEU50!l(-U|mvBIW z>O>SiGQugA8uexqryDez#VH((AbP%|xwY)4iDo&v3EAslnyvY-7Mz{Lc@lko!~Mrj z_c1~If7b8>;zv%!=v2oux=@af(`gxWWQFUDkI(2GLvgd&DpxBLj%dhILQ$*Q7QJBQd3$-;>>!TJNibYHlDW zkI9JfeQTq}aMRCH86op2H-@}>^gErx%{VRxr@6R|rcRmg4Q;+oe~EH8022In1`W*p z-2-(`4Eb^$VqU0C0|oum6X< zhjq9*tJQCHLoQ=~zhnx4{E~u`Uo8>6$5S@VnkRk}HCC+H}@PvE@$T;E_5p$6T?211;1Ffx|6) z+o4s@;FUH0D|BWFeXpUnoIx}T+yvY*E^xziPvRE3pUo|o6SvqRNSkEVyL#fGy*x<^ zJlXTmO+on_mAMil-Co2gLd6y=i)Kscm1!KIGE=P02TU{Jf~Q>PtWvd3rxu+BLzQb~ zGgv89ct>y2`6+r+!}rTFXlsG2fT<4VFcsa;W~!|Q$oj&)uaoHd!o3d%2-BvT^~Ro9 z>qU#tTF(qvi;5|8SgYyc)URwq2W#xt29=I0_?7e@!vCeqbH{P zYz|Y>{cNVJ&gkYI2N(sHIL8uF-Cpyh(oYO}p?M%Hf?@YAmfJ7V!2LablFd$6gV9|Ps z#Fn%H{=L6gZR2FV>3X|brn4Dg_*C6uvsI7=G9QrOoD2Ksz*x`@#Hkh=Q*@-&3a zW|4RlW40hC?g5-~iq{m1``reDbm}38jGs|)z@U6N{Q_qUqFkYh!x`wu{33$3g7fVv zrAn)cX*KHm+?vy##rbx0c4V5K40Y50nN>pj|<7m~XXL$fP zB9oJq(x|iD#Q~~_Qq5H8Xk5$*7n(L54GaGT*ewtu8?Ya6q-xcfgvQ0$d^oGG3^E}E z3WL7fF12t1AkfM~;1s_DKGFbii%!)n7MRW%+Bse|s)7_Oh4I^(@SWC9SDqG<6PT!v z$G}-$GTl$r+R=F9Ck*9hd^}2D#2tw?-OA8-rVx$mQlvf1?;#G$mLugw42f{yCc_Ep z>&$Q#E~D$r9)FH@Zj3^?G(-0Av_c7sl>o3{87}I<*u|pSPr75?p z>DyWs96t>r$7=;ebZrJ6j%u*qi>^q$E}Y}z{a8B3#}gJ$#qm-%-P~``b@rLfV4v8A z#|{0Owwj|*c-Qs=m-@60WK63kB}w>FN^)Hi^)wO4!fu~L;Bj4wz^9^oB#p9hswy8B z_G5hA=4Iel!Z2fV>*SP4>df&Q8O-5D_3}!AAf00qs*!&yV^9l@3zi##R&m@)L8l(3 zb7Gvv`qXl)k9RJ{G~am0vz;d8S^U%|DL*w?%56vIt*3R&SQfl#@1Wm+GWuB7GI{8? z&?W-TVka9T(Jki)8+^!S3mXWCn>CTx&>VH1S=r~}WcAiGyg@kaPPy1BcHs+C>`nQv zhy>K&ZsQ2|`TD4#CoJZY7Tk;9(>&{oQs1@~lxAhHK3M;~Pe0pC5SD)B7GbU!CE&~snFs7FBlS9U%Ms!US zvv6#y{3AZp6UEY^%U*&H^_)PB#chamMJCLrZdDmuafRSbI$>7r&(IH1!>w0KXKlvI zEVv*r=x7#-3rH3@qY2m3l62$nl zXY5%PYtEG0$_Ruf*Vt=zNAe>Y{h!%ijtoqX8$v>tWO~s3RMUgC(%!)$RzpJ;G(9ou z(-{qm%BY;rk!tp%Eb)iHB6BFKZS+C<*a=$JK5 zPa;%fI$F#zs_QMF_?n;eIcmGR{xUz4mJ*W9PKB417YF+$PL}F>G{CA!N{mlZj-7xu!E;Z}TG0iJ3C573CtrjpDc);tg!FAsqrc z73+E}Qlqymo%lEff^>+cR22(?S51oN5M=XEk> zllgoOW(N{SCo5A(3n_C1F@u{UB?jNgAbgCQxAZg-orf>8Mv2b3KgpOtPn=7bQJj0R zU_gr(CaXK;~Da<|4ytn3QXS_^R2S!CC|_ zt5$D06ZKZB>ek%SK5!ZW&$akUMM-7F)&@#nnyS|+9|;j&9?qF7qN_Oq!P7_xbDDKn z%uwfUW50_uuGu1Tyyi!pt6>kpeVcJn$%o%UQ*%VANICWpB)pK;ffAMh7YhNny;^0+ zW{QZO6U+r4=1JtRxs9kS{At?czi{ts`Zj%xH4p^oyno_chM66WTAmO?o-UBbYN*v; zbXvxXdJ;04ffBN_yCSA0Q&|Y;lT2NfEK||ZJL`lfjMOJbeEwWeMccBkwR(tlhr$oN z2G$kMrF$*^5r*mXHR8PqCS}Cj>fWwgeRZ)_B5BkKAAGIhc1wS09$1i@;{%7LbXCGy z`X^g?M+c{c1#iXPP`SZhH&AvuptOM->|HCabq;2fzcVemHnL+0eh z$A#uo(M5549DC{J=ZWF@Vy_MJ)oCB99HHC#t8U47RZmh+b5K&hg6X2a*nW(o)7u8#yU77P%p`CP521&cF^X-5YO)Wr?u}yqBI@6pQAK%Qy zEP)B)D+Y=Ji-&zqh-A@uFCe<#$qF~#4dCkDVe? z<2w3vTFkFcTz9SDx_cQ;3k?)Rt?rHk8>~S)z{rsbGU&>o-^kXzlqu1`Cryl)C#3`9`#Q5Osb2?-{g>$5OLSk!}$AWXllzv{<}fv^?KT>6WR=7<8i5Y;8m>$5yQ`hfnr zqYtFp6n$fi%A$#(J~<;?YM~Ax!a62Hp$@vOzv_&|z~iz}{iRv+GqJCtO#}l^X8VoF z%0D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 literal 0 HcmV?d00001 diff --git a/.doctrees/getstarted.doctree b/.doctrees/getstarted.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cd267b2a23456d7cd1ac5d6e30f4b1b8e3f0298d GIT binary patch literal 23431 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 W#Xp1MhuJ|)k+2RLR5X^O;XeUngweJD literal 0 HcmV?d00001 diff --git a/.doctrees/intro.doctree b/.doctrees/intro.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4cbdf306890e48354f9bf1c985fd34b0c6fb02a2 GIT binary patch literal 4392 zcmcIn-;W$e5w?BVz1zLJy&tio0I@VkBsrVhE;3k3PKv;a07WPK5D+Lrr*Y3r&vt8P zrYGG!zS{>2B4HGxeoOO+5dQ;0{BOMQ)y(Yd?i~rf7*1NC=eq|t z>OZ$3Rr(2LD8?}p4;Eu+f9Q}S#>CI()(%{XJmK#1>N!Sd#7E2+xmAY$=M z^R!u08}e=gmb~jXcD%dw!9&O@Exr5JS2_wWVpb$FVT~8==6x@|Ybv*C*_6zAF?9Ws z0U+zeh8u((q8RlTKt7xZmGgGFfo{xQfKU z4Pb>$H7ms`+`oNPV;e{luppC>W_li26+{)TEihJdmdj!qu(Hf#jN4F!39Mi?i1CHH z4^pl2A?3*CFcxsb64q%}NC+s#AFKcNLlv!?;(NIY-{R}A>&F+N;9 z24LK?(q=paEjj3d_*%pqJUzJLSOfk8w|B|o6$3wCHSqN~{S^3o2y7m>qnADLilOzB z{H()wXBCx&!^0&~D=I$yCcfSruV`3vg1;0iw*Dh4j@ys{-=9jP!60X{$PhI`bA&@x z#1thglNQ7|Ssd${yOuQg?B!3sVDt8h-vhTDRawSum`S9BC1*sRvg8qE2AT<_<@w6A z`}k2{xD8Yqun2j8)u%FnEKDgiPbkb|mFM6#GN@tGD_NpM{^hzbZ64^tN_;_vL8bqp zg(X~nx;|XHfa{O{EmQmfi#~63Q^ug2`n)6ZPkxE?yp9v#F)~NeOy|HbB`9-N;IX6U zGN62^dBieS!~pIJM1O4|dUeH1Wd3%2WJWmjUtS5BA3rKU8BiowcvvE>W?ZiVMKtPg zI@gF9JT_G!ZGZ>UUggd|T3}vT?-G}PULTh|;PUtD_@1`5Ym8K#jY;`?$ zI}1ruL%1zam~IDU-$7T#;qfmlFA~&6zh-zBO_xDjUsblOtbgo!^}~ga!IYzZVOD7x z)HRW1d5OVxV-`88m|-|308SG zsBC)t{;`qxertU)#?|wEy$1G{=tuc=SZjVCG{j(s()vp z9+Aq3ugKkF$!%KOKn|D)n`baKuq;9dp&j$5Tkb9hnTK6$cJ*p#N@Bz=+dBRlDrFC`l31h4YMQWjD9-PS|o*;hba6xcxVdPGXRkM(z z{>wr%#guDnw+~1&T{$%YO-_5^HhA%rS~0iPm)c6ar9>h-&^q-Gli zp`(#d6fV{^j;%_Xb!ULa%=1WP-Hq2vZ(kC2s|RZu2Meq9ro%P;$fnv-`o42nS385J z3^^iJ6=eYLwqu1lw<%L`{*PMumpJot{|Wex1{jgkRI5#h9(Ji>O}yQS>r2{}MVwU$ VB2-Q3eufEUvo`Rlc&MWBzX8u?nHK;6 literal 0 HcmV?d00001 diff --git a/.doctrees/metrics.doctree b/.doctrees/metrics.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5c89aae1c08384d041309fcc2d861f7e6ed83b90 GIT binary patch literal 44551 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 literal 0 HcmV?d00001 diff --git a/.doctrees/offsets.doctree b/.doctrees/offsets.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3425f3b382f7bc291c54db1d3dc49d63a1f1b997 GIT binary patch literal 8000 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 literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/batching.doctree b/.doctrees/strategies/batching.doctree new file mode 100644 index 0000000000000000000000000000000000000000..88b2eba62b8cad5b16e63bbc96c4c473d2e507bb GIT binary patch literal 28915 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 U*&5NY)uRbQ>Qb_Lveowg0HwFw$p8QV literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/commit_offsets.doctree b/.doctrees/strategies/commit_offsets.doctree new file mode 100644 index 0000000000000000000000000000000000000000..29db4f28a9f48016675005cb4bd1b0984ef5a0ae GIT binary patch literal 6717 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 eK2!!@EEcH literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/healthcheck.doctree b/.doctrees/strategies/healthcheck.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cc69e6c6cfe487857749d5a2f064fd4412183700 GIT binary patch literal 14329 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 P;4O~~MyXqM5ZC!H6=g(I literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/index.doctree b/.doctrees/strategies/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8ee7a4aab0a2b19aed409409702d494262062497 GIT binary patch literal 109909 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 V?HLlGV`VZpgl;A)x;r)T{{V)SV@m)4 literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/noop.doctree b/.doctrees/strategies/noop.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d8fbffcb16a5ce0c7a95e5ea7d1bd82ff333c867 GIT binary patch literal 4585 zcmc&%TW=&s74~h$9$(j+>A zZQ6=M(+e8)#JcHLT8+&{5@+0w%Ly~vOzR?^lp5BM_Umz^NYl+QVM>9B?@q>2|FspB z`Ft^9;bp<6#8aA0&1SS^#esN7?21QXT^yMojf713s3^0H7o#g#T#i^#$QxPzgMw=0 z6&opCFwJK%SECGe4hsb<-o02WCt}5P;w<9VEoXQ?iEl$|@fZ$y55M>EJI3#XEPxXV z$bxnQvyrp7u;wI{QJL@`_Pr9rypSPRD$ZuZ`Q?ZWoNNZ3_w;U7(H(2cO7WpMotr)u z@4~@i=uuIJ^=qozC6y3*^F0c9f8c`AkF&e=KC$M5J2f7982vZ3&GlUotKv6z-D`2n zZ_X&J@P0Py%jw-pSNb@It(XmDR`^<=2f)BS?F1?Y&~#ZWWJZ@v8l1S?Al3uN%Cbyq zwv=Gz`=6e_r;$5n{bT3Y9`ZNN;ZW1Q;+m2 z+$|lwpq3qGweM5+A$`py@U{fDfDp5KWmy~51hSBBEhl_|v(03B*J*O*>_Gj=3$A$a zoLf5kE1dnL%FS;w(if{Psds&pP)@0G)Fo7O%y;g_aP7;l!#a2N@80a}f!P7HPT?=7 zjoBmRT)5quw_PlLEq+7(d@=W@_$_LcH>>B&TDGZGydN&sYzX=D|I%xV^zuq=k?1$; z^QYJKY2oC8QI$lIhdgVxNvfPYLkF@8#+j}!ebzj_GYsesJ|jfeY)#7~ak`0@W;@U_ z4A6_Tvf{7ew>M*jmwe@sw; z(SP?wFDCu+fxp$>slBzF`vbF<-!y?(3S}fy7H3xc%WNXn`X)z*{x{|pz^GnqX3{s; zTeDkzQt!O6x8@*|RUlMFA``~WTI%x76!f_{$OhuvY-H3ydEJt$HLF`QiP(lw>)vVN ziEr|6_Chndh$rT43<;S^Tu~3ugk~sjest+*)cV9;teEYZheueJbl7ZS_2iB>kgYiZCW@WM%HwH$&wQDL|vv#SC%?2wH=FtvFXh?MjWPPVX=rX z$SBRy9E%-)VSrmMvD~hfWszXDM=3#r6z$^Tj(4-UKb2AgrM$Iyv1;~cUd+lgxSq-) zwV>=%pUs0%rZk2shq9VGlYhx^vdwqQxK z?3hD-9m8wrqot~uI;IoxNjZbO{VP^v@ESM@&Qef%aDT|jDEp<^k2Clv;8`dmaG?s6 zdV2bUQ&)l>Ep7%Jvtbbkq-nx2u60ROR3~%bJ>8PhaZ;=~TH09>@vOJHf}ZT<&UL6y zKU&;aI&AKd4ZxZba8UxAtl3LgHY-s};PD9SH4OIVt%8TLh=Pdc98+o*(%3mRU8K$w zl@=a}BVd(J<71gE`5p#emmdRHk{*KoE{~gcxP8$XG%G4;;mTo5DXQ<%*Y) z4AAz$b&p@?Qt_aD(xD{O!Sh(f9-;?96e~7K$dF3Q%{n!ZX1g#(AsPJe1k_Y)!8A@_ z9OmnX^o2_>T+o1p*pRdcA>Y9Zs96G{hm>DHPBsG&lQ@mF{rKLo+0S_%z$qMAi76bK z?-FIgpgSdp`IgW+S7)OU$ZDA1Xd$zqEM_BX9uTKf0Gxs5DZ-->jxEqn-~aAM@aKLp z4VT0dWiI}MT0D}K5o9lUF^svMx;sz+Mnb0vF6(JFK^8??*o!T51Wcwulb($M)x39W z?x~whv+F>_Gm+p2{B9(Ypuek9^uyru5_zrQsJGnOFM~veta9y9DA3_T1m5QxyzE?v z)0btAvP|zt_c*NTz%9@t!#JA)19f4zPo+YYlO?`5CGaMa`D~=8;H3p-(g}}{!Z%Ps zaISI5gAiPo0Z0Ex0z7%C&^ombt4AxqnoNCJyEW@PdrnVEv*pVP@)uAv;y)gD~9YVdQP@$>$yzko-&xeQrvFSu64X7RK+e^fTySE^* zSKsOm-CvN8o>6FOQV*78RXb?aD1)IasmNKg6Urn3T7V0*!p$F7^p}X}7xrgJX$*cS n4%Ia0FKnve0(qw)I~?xBS(ua&;eJLC+>WSVSGCR0V8j0a9iaDg literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/produce.doctree b/.doctrees/strategies/produce.doctree new file mode 100644 index 0000000000000000000000000000000000000000..07bbed01e92ea021c93939438bbf723a95f1ecbe GIT binary patch literal 11964 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 C?1b3> literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/reduce.doctree b/.doctrees/strategies/reduce.doctree new file mode 100644 index 0000000000000000000000000000000000000000..44e78df299492f6156bda9f86d4fc5f4f8ff4ac4 GIT binary patch literal 18333 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 literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/run_task_in_threads.doctree b/.doctrees/strategies/run_task_in_threads.doctree new file mode 100644 index 0000000000000000000000000000000000000000..96622b19db1494b1f97abc150fd29a1c0ea1996f GIT binary patch literal 12803 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 X9a^D59@3>KH)l|2PoiLa4b=J%iuJ`{ literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/run_task_with_multiprocessing.doctree b/.doctrees/strategies/run_task_with_multiprocessing.doctree new file mode 100644 index 0000000000000000000000000000000000000000..45e4f094a164fb48d4358f7c1d84e72f5eb93b3b GIT binary patch literal 47268 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 literal 0 HcmV?d00001 diff --git a/.doctrees/strategies/unfold.doctree b/.doctrees/strategies/unfold.doctree new file mode 100644 index 0000000000000000000000000000000000000000..74086ac0a8b631349a84456ff794874e3c27930d GIT binary patch literal 11650 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 literal 0 HcmV?d00001 diff --git a/.doctrees/what_for.doctree b/.doctrees/what_for.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5ece2d408154ffbdae892b0ff87a15fe22d1347e GIT binary patch literal 30633 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 I$s4u*2SM{!5&!@I literal 0 HcmV?d00001 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_images/arroyo-banner.png b/_images/arroyo-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..90482cb669dcc531ab025eb4e1c7afe9282381b7 GIT binary patch literal 71723 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

#M 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

?H$}{j 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 o$bt4xlA4 literal 0 HcmV?d00001 diff --git a/_images/arroyo_processing.png b/_images/arroyo_processing.png new file mode 100644 index 0000000000000000000000000000000000000000..21004ddec1f5b65e4d272411acb2bff5724232d2 GIT binary patch literal 19166 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 literal 0 HcmV?d00001 diff --git a/_images/consumer_groups.png b/_images/consumer_groups.png new file mode 100644 index 0000000000000000000000000000000000000000..09aa7440e8124155500b3f926c49c8331a2f22af GIT binary patch literal 23512 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 literal 0 HcmV?d00001 diff --git a/_images/kafka_producer.png b/_images/kafka_producer.png new file mode 100644 index 0000000000000000000000000000000000000000..53a90d9d95a203732b2380077dc2e9646a1f5db8 GIT binary patch literal 16532 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 JE0NIi`5%ZO4Bh|$ literal 0 HcmV?d00001 diff --git a/_sources/architecture.rst.txt b/_sources/architecture.rst.txt new file mode 100644 index 00000000..0fedb49e --- /dev/null +++ b/_sources/architecture.rst.txt @@ -0,0 +1,120 @@ +=================== +Arroyo Architecture +=================== + +Arroyo is a set of high level abstractions to interact with Kafka. +These are meant to help the developer in writing performant consumers with +specific delivery guarantees. + +Common problems addressed by Arroyo are guaranteeing at-least-once delivery, +providing a dead letter queue abstraction, support parallel (multi-processing) +message processing, etc. + +The library is divided into three layers: the basic Kafka connectivity, the +streaming engine and the high level abstractions. + +The basic connectivity layer is a simple wrapper around the Confluent python +library, which is itself based on librdkafka. Besides some cosmetic changes, +this level provides a Fake in memory broker and consumer to make unit test quick +to run. + +The streaming engine provides an asynchronous processing interface to write +consumers. The consumer is written as a pipeline where each segment is an +asynchronous operation. The streaming engine implements the main consumer loop +and delegates the processing to the pipeline. + +On top of the streaming engine, the library provides high-level abstractions that +are common when writing Kafka consumers like: *map*, *reduce*, *filter* together +with some common messaging application patterns like the dead letter queue. + +Streaming Interface and Streaming Engine +---------------------------------------- + +A Kafka consumer is built as a pipeline where each segment processes messages in +an asynchronous way. The Streaming engine provides a message to a segment. The +segment is not supposed to execute small CPU work in a blocking way or do IO in a +non-blocking way. We generally use futures for this, and heavier CPU work in a +separate process. + +Arroyo provides an interface to implement to write a pipeline segment. +The segment interface is called *ProcessingStrategy* and is in +`this module `_. +(TODO: bring the docstrings to the docs and reference that). + +In most cases, when developing a consumer, the developer would not implement +that interface directly. A higher level abstraction would be used. + +.. figure:: _static/diagrams/arroyo_processing.png + +The main consumer loop is managed by the `stream engine `_. +These are the phases: + +* Poll from the Kafka consumer through the basic library. If a message is there + proceed or repeat. + +* Submit the message to the first *ProcessingStrategy*. This is supposed to deliver + work for the strategy to do. It is not supposed to be a blocking operation. The + strategy should return immediately. + +* Poll the strategy to execute work or to forward results to the following step + in the pipeline. Ideally all IO should be done in separate threads and heavy cpu + work should be done in separate processes so the *poll* method should check for + completed work, dispatch to the next step and return. In practice, work is executed + here in a blocking way if the overhead of offloading the work is too high. + +The *ProcessingStrategy* may decide not to take the message and instead apply back-pressure. +This is done by raising the *MessageRejected* exception. In this case, the streaming +engine pauses the consumer till the strategy is ready to accept the message. + +The *ProcessingStrategy* decides when it is time to commit a message. This is done +through a commit callback provided to the strategy when it is instantiated. + +The streaming engine orchestrates the life cycle of the *ProcessingStrategy*, thus +when it thinks it is time to shut the strategy down it would wait for all in-flight +work to be completed and then destroy the strategy. + +There are two scenarios where this can happen: + +* The consumer is being terminated. +* A rebalancing happened. A rebalancing revokes partitions and assigns new ones. + After a rebalancing is complete it is impossible to commit a message from a partition + that was revoked. In order to ensure the consumer behaves in a consistent way, + upon rebalancing, the streaming engine destroys the strategy and builds a new one. + This allows the strategy to complete all in-flight work before being terminated. + +High level strategies +----------------------- + +Most consumers follow the same few patterns, so Arroyo provides abstractions that +are based on the *ProcessingStrategy* but are simpler to implement for the common +use cases. + +Common examples are: + +* ``run task, run task in threads, run task with multiprocessing``. The run task + set of strategies are designed to be the most flexible and simple to use. They take + a function provided by the user and execute it on every message, passing the output + to the next step. The library includes synchronous and asynchronous versions depending + on the kind of concurrency required by the user. + +* ``filter, map and forward``. This type of consumer inspects a message, decides + whether to process it or discard it, transforms its content, and produces the result + on a new topic. In this case, Arroyo provides three implementations of the + *ProcessingStrategy*: *filter*, *transform*, and *produce*. The developer only needs + to wire them together and provide the map and filtering logic. + +* ``consume, apply side effects, produce``. This is a variation of the one above. + In this case, the transform operation can have side-effects like storing the content + of the message somewhere. + +* ``high throughput cpu intensive transform``. The python GIL does not allow CPU intensive + work to take advantage of parallelism. Arroyo provides an implementation of the *map* + pattern that batches messages and dispatches the work to separate processes via shared + memory. This is largely transparent to the developers. + +* ``map, reduce and store``. The reduce function is carried out by the *Collector*, which + batches messages and executes some logic with side-effects when the batch is full. + This is a typical way to write messages on a storages in batches to reduce the + round trips. + +All strategies included with Arroyo are in `the strategies module `_. diff --git a/_sources/backpressure.rst.txt b/_sources/backpressure.rst.txt new file mode 100644 index 00000000..2dcc20df --- /dev/null +++ b/_sources/backpressure.rst.txt @@ -0,0 +1,43 @@ +Backpressure +============ + +.. py:currentmodule:: arroyo.processing.strategies + +Arroyo's own processing strategies internally apply backpressure by raising +:py:class:`~abstract.MessageRejected`. Most +consumers do not require additional work to deal with backpressure correctly. + +If you want to slow down the consumer based on some external signal or +condition, you can achieve that most effectively by raising the same exception +from within a callback passed to :py:class:`~run_task.RunTask` while the +consumer is supposed to be paused + +.. code-block:: Python + + class ConsumerStrategyFactory(ProcessingStrategyFactory[KafkaPayload]): + def __init__(self): + self.is_paused = False + + def create_with_partitions( + self, + commit: Commit, + partitions: Mapping[Partition, int], + ) -> ProcessingStrategy[KafkaPayload]: + def handle_message(message: Message[KafkaPayload]) -> Message[KafkaPayload]: + if self.is_paused: + raise MessageRejected() + + print(f"MSG: {message.payload}") + return message + + return RunTask(handle_message, CommitOffsets(commit)) + +It is not recommended to apply backpressure by just ``sleep()``-ing in +:py:class:`~abstract.ProcessingStrategy.submit` (or, in this example, +``handle_message``) for more than a few milliseconds. While this definitely +pauses the consumer, it will block the main thread for too long and and prevent +things like consumer rebalancing from occuring. + +A 0.01 second sleep is applied each time :py:class:`~abstract.MessageRejected` is +raised to prevent the main thread spinning at 100% CPU. However background thread +performance may be impacted during this time. diff --git a/_sources/dlqs.rst.txt b/_sources/dlqs.rst.txt new file mode 100644 index 00000000..62562a39 --- /dev/null +++ b/_sources/dlqs.rst.txt @@ -0,0 +1,21 @@ +================== +Dead letter queues +================== + +.. warning:: + Dead letter queues should be used with caution as they break some of the ordering guarantees + otherwise offered by Arroyo and Kafka consumer code. In particular, it must be safe for the + consumer to drop a message. If replaying or later re-processing of the DLQ'ed messages is done, + it is critical that ordering is not a requirement in the relevant downstream code. + +Arroyo provides support for routing invalid messages to dead letter queues in consumers. +Dead letter queues are critical in some applications because messages are ordered in Kafka +and a single invalid message can cause a consumer to crash and every subsequent message to +not be processed. + +The dead letter queue configuration is passed to the `StreamProcessor` and, if provided, any +`InvalidMessage` raise by a strategy will be produced to the dead letter queue. + + +.. automodule:: arroyo.dlq + :members: InvalidMessage, DlqLimit, DlqPolicy, DlqProducer, KafkaDlqProducer, NoopDlqProducer diff --git a/_sources/getstarted.rst.txt b/_sources/getstarted.rst.txt new file mode 100644 index 00000000..d0ce1308 --- /dev/null +++ b/_sources/getstarted.rst.txt @@ -0,0 +1,246 @@ +=========================== +Getting started with Arroyo +=========================== + +This tutorial shows how to create a Kafka consumer with Arroyo from scratch. + +Setup +===== + +This section explains how to setup Kafka, Zookeeper and install the library + +Kafka and Zookeeper +------------------- + +In order to run an arroyo Kafka consumer you will need a working Kafka broker. +If you already have one, you can skip this step. +If you do not have a running Kafka broker, this command will install and start +a Kafka docker container. (It requires Docker to be installed). + +.. code-block:: Bash + + docker network create arroyo + + docker run --rm \ + -v zookeeper_volume:/var/lib/zookeeper \ + --env ZOOKEEPER_CLIENT_PORT=2181 \ + --name=sentry_zookeeper \ + --network=arroyo \ + -p 2181:2181 \ + confluentinc/cp-zookeeper:6.2.0 + + docker run --rm \ + -v kafka_volume:/var/lib/kafka \ + --env KAFKA_ZOOKEEPER_CONNECT=sentry_zookeeper:2181 \ + --env KAFKA_LISTENERS=INTERNAL://0.0.0.0:9093,EXTERNAL://0.0.0.0:9092 \ + --env KAFKA_ADVERTISED_LISTENERS=INTERNAL://127.0.0.1:9093,EXTERNAL://127.0.0.1:9092 \ + --env KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT \ + --env KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL \ + --env KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \ + --env CONFLUENT_SUPPORT_METRICS_ENABLE=false \ + --env KAFKA_LOG4J_LOGGERS=kafka.cluster=WARN,kafka.controller=WARN,kafka.coordinator=WARN,kafka.log=WARN,kafka.server=WARN,kafka.zookeeper=WARN,state.change.logger=WARN \ + --env KAFKA_LOG4J_ROOT_LOGLEVEL=WARN \ + --env KAFKA_TOOLS_LOG4J_LOGLEVEL=WARN \ + --name=sentry_kafka \ + --network=arroyo \ + -p 9092:9092 \ + confluentinc/cp-kafka:6.2.0 + +Now you should see Kafka and Zookeeper running with + +.. code-block:: Bash + + docker ps + +Install Kafkacat +---------------- + +This tool will be useful to produce onto and consume from topics. + +.. code-block:: Bash + + https://docs.confluent.io/platform/current/app-development/kafkacat-usage.html#kcat-formerly-kafkacat-utility + + +Development environment +----------------------- + +You will need to install the library. Most likely in a python venv. So first, create a python virtual +environment. Then you can install arroyo with this. + +.. code-block:: Bash + + pip install sentry-arroyo + +Create two Kafka topics +----------------------- + +Our example will consume from one topic and produce the same messages on another topic. So we need +two topics. + +.. code-block:: Bash + + docker exec sentry_kafka kafka-topics \ + --create \ + --topic source-topic \ + --bootstrap-server 127.0.0.1:9092 + + docker exec sentry_kafka kafka-topics \ + --create \ + --topic dest-topic \ + --bootstrap-server 127.0.0.1:9092 + +Now you should be ready to develop with Arroyo. + +Create a basic consumer +======================= + +Arroyo provides two level of abstractions when writing a consumer: the basic consumer/producer library +and the Streaming library. The first is just a thin wrapper around a librdkafka consumer/producer that +adds some features around offset management. The second provides a more abstract streaming interface +that hides details like rebalancing and the consumer lifecycle. + +Creating a basic consumer +------------------------- + +This initializes a basic consumer and consumes a message. + +.. code-block:: Python + + from arroyo.backends.kafka.configuration import ( + build_kafka_consumer_configuration, + ) + from arroyo.backends.kafka.consumer import KafkaConsumer + from arroyo.types import Topic + + TOPIC = Topic("source-topic") + + consumer = KafkaConsumer( + build_kafka_consumer_configuration( + default_config={}, + bootstrap_servers=["127.0.0.1:9092"], + auto_offset_reset="latest", + group_id="test-group", + ) + ) + + consumer.subscribe([TOPIC]) + + while True: + msg = consumer.poll(timeout=1.0) + if msg is not None: + print(f"MSG: {msg.payload}") + +Start this script and use kcat to produce a message: + +.. code-block:: Bash + + echo "MESSAGE" | kcat -P -b 127.0.0.1:9092 -t source-topic + +In a while the message should appear on the console: + +.. code-block:: Bash + + MSG: KafkaPayload(key=None, value=b'MESSAGE', headers=[]) + + +Create a streaming consumer +--------------------------- + +Add a `ProcessingStrategy` and `ProcessingStrategyFactory`. +Here we are using the `RunTask` strategy which runs a custom function over each message. + +.. code-block:: Python + + from typing import Mapping + + from arroyo.backends.kafka import KafkaPayload + from arroyo.processing.strategies import ( + CommitOffsets, + ProcessingStrategy, + ProcessingStrategyFactory, + RunTask, + ) + from arroyo.types import Commit, Message, Partition, Topic + + + def handle_message(message: Message[KafkaPayload]) -> Message[KafkaPayload]: + print(f"MSG: {message.payload}") + return message.payload + + class ConsumerStrategyFactory(ProcessingStrategyFactory[KafkaPayload]): + """ + The factory manages the lifecycle of the `ProcessingStrategy`. + A strategy is created every time new partitions are assigned to the + consumer, while it is destroyed when partitions are revoked or the + consumer is closed + """ + def create_with_partitions( + self, + commit: Commit, + partitions: Mapping[Partition, int], + ) -> ProcessingStrategy[KafkaPayload]: + return RunTask(handle_message, CommitOffsets(commit)) + +The code above is orchestrated by the Arroyo runtime called `StreamProcessor`. + +.. code-block:: Python + + from arroyo.processing import StreamProcessor + from arroyo.commit import ONCE_PER_SECOND + + processor = StreamProcessor( + consumer=consumer, + topic=TOPIC, + processor_factory=ConsumerStrategyFactory(), + commit_policy=ONCE_PER_SECOND, + ) + + processor.run() + +The main consumer loop is managed by the `StreamProcessor` no need to periodically poll the +consumer. The `ConsumerStrategy` works by inversion of control. + +Add some useful logic +--------------------- + +Now we will chain the `Produce` strategy to produce messages on a second topic after the message is logged + +.. code-block:: Python + + from arroyo.backends.kafka import KafkaProducer + from arroyo.backends.kafka.configuration import build_kafka_configuration + from arroyo.processing.strategies import Produce + + class ConsumerStrategyFactory(ProcessingStrategyFactory[KafkaPayload]): + """ + The factory manages the lifecycle of the `ProcessingStrategy`. + A strategy is created every time new partitions are assigned to the + consumer, while it is destroyed when partitions are revoked or the + consumer is closed + """ + def create_with_partitions( + self, + commit: Commit, + partitions: Mapping[Partition, int], + ) -> ProcessingStrategy[KafkaPayload]: + producer = KafkaProducer( + build_kafka_configuration( + default_config={}, + bootstrap_servers=BOOTSTRAP_SERVERS, + ) + ) + + return RunTask( + handle_message, + Produce(producer, Topic("dest-topic"), CommitOffsets(commit)) + ) + +The message is first passed to the `RunTask` strategy which simply logs the message and submits +the output to the next step. The `Produce` strategy produces the message asynchronously. Once +the message is produced, the `CommitOffsets` strategy commits the offset of the message. + +Further examples +================ + +Find some complete `examples of usage `_. diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..fb702775 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,16 @@ +.. include:: intro.rst + +Contents: +--------- + +.. toctree:: + :maxdepth: 2 + + what_for + getstarted + architecture + strategies/index + offsets + dlqs + backpressure + metrics diff --git a/_sources/intro.rst.txt b/_sources/intro.rst.txt new file mode 100644 index 00000000..72b0d4e2 --- /dev/null +++ b/_sources/intro.rst.txt @@ -0,0 +1,15 @@ +.. image:: _static/arroyo-banner.png + :width: 583 + :height: 95 + +Arroyo is a library to build streaming applications that consume from +and produce to Kafka. + +It relies on the `confluent_kafka` python library, which itself relies +on `librdkafka`. + +Arroyo provides mainly three functionalities: + +* A set of abstractions inspired to common messaging applications patterns. +* Some abstractions to simplify offset management and rebalancing. +* An in memory broker abstraction to simplify writing unit tests. diff --git a/_sources/metrics.rst.txt b/_sources/metrics.rst.txt new file mode 100644 index 00000000..c005c740 --- /dev/null +++ b/_sources/metrics.rst.txt @@ -0,0 +1,63 @@ +================== +Metrics +================== + + +Arroyo consumers and strategies attempt to auto instrument some metrics that most people find useful +to understand the behavior and performance of their consumers. These metrics are typically sampled or +buffered as appropriate and flushed periodically (often once per second). + +In order to use these metrics, you must configure a metrics backend that conforms to the metrics protocol +before creating your consumer. + +This can be done like so: + +.. code:: python + + from arroyo.utils.metrics import Metrics, MetricName + + class MyMetrics(Metrics): + def increment( + self, name: MetricName, value: Union[int, float] = 1, tags: Optional[Tags] = None + ) -> None: + # Increment a counter by the given value. + record_incr(name, value, tags) + + def gauge( + self, name: MetricName, value: Union[int, float], tags: Optional[Tags] = None + ) -> None: + # Sets a gauge metric to the given value. + record_gauge(name, value, tags) + + def timing( + self, name: MetricName, value: Union[int, float], tags: Optional[Tags] = None + ) -> None: + # Emit a timing metric with the given value. + record_timing(name, value, tags) + + metrics_backend = MyMetrics() + + configure_metrics(metrics_backend) + + +Available Metrics +==================== + +.. literalinclude:: ../../arroyo/utils/metric_defs.py + +For convenience Arroyo includes a machine readable version which can be loaded like: + +.. code:: python + + import importlib.resources + import json + + with importlib.resources.files("arroyo.utils").joinpath("metricDefs.json").open() as f: + metric_defs = json.load(f) + +API +======= + +.. automodule:: arroyo.utils.metrics + :members: + :undoc-members: diff --git a/_sources/offsets.rst.txt b/_sources/offsets.rst.txt new file mode 100644 index 00000000..6316e653 --- /dev/null +++ b/_sources/offsets.rst.txt @@ -0,0 +1,37 @@ +================== +Committing offsets +================== + +Arroyo does not auto commit offsets. It is up to you to manually commit offsets when processing for that +message is completed. + +The commit callback will be passed to processing strategy via `ProcessingStrategyFactory.create_with_partitions`. +You should pass this to the strategy and have your strategy call this commit function once the rest of the message +processing has been done. + +The offset to be committed in Kafka is always the next offset to be consumed from, i.e. message's offset + 1. +In Arroyo, this means you should commit `Message.next_offset` and never `Message.offset` when done processing +that message. Arroyo exposes `Message.position_to_commit` to make this easier. + +It is not safe to commit every offset in a high throughput consumer as this will add a lot of load to the system. +Commits should generally be throttled. `CommitPolicy` is the Arroyo way of specifying commit frequency. A `CommitPolicy` +must be passed to the stream processor, which allows specifying a minimum commit frequency (or messages between commits). +Commit throttling can be skipped when needed (i.e. during consumer shutdown) by passing `force=True` to the commit callback. +If you are not sure how often to commit, `ONCE_PER_SECOND` is a reasonable option. + +The easiest way is to use the `CommitOffsets` strategy as the last step in a chain of processing strategies to commit offsets. + +.. code-block:: Python + + class MyConsumerFactoryFactory(ProcessingStrategyFactory[KafkaPayload]): + def create_with_partitions( + self, + commit: Commit, + partitions: Mapping[Partition, int], + ) -> ProcessingStrategy[KafkaPayload]: + def my_processing_function(message: Message[KafkaPayload]) -> None: + # do something (synchronous) with the message + do_something() + + + return RunTask(my_processing_function, CommitOffsets(commit)) diff --git a/_sources/strategies/batching.rst.txt b/_sources/strategies/batching.rst.txt new file mode 100644 index 00000000..540d7d8a --- /dev/null +++ b/_sources/strategies/batching.rst.txt @@ -0,0 +1,10 @@ +Batch and Unbatch +----------------------------- + +Accumulate messages into a batch and pass to the next step. +The batch and unbatch strategies are based on reduce and unfold. +Use reduce/unfold instead if you want to provide custom +accumulator/generator functions. + +.. automodule:: arroyo.processing.strategies.batching + :members: diff --git a/_sources/strategies/commit_offsets.rst.txt b/_sources/strategies/commit_offsets.rst.txt new file mode 100644 index 00000000..64d3504c --- /dev/null +++ b/_sources/strategies/commit_offsets.rst.txt @@ -0,0 +1,8 @@ +Commit offsets +----------------------------- + +Should be used as the last strategy in the chain, to ensure +that offsets are only committed once all processing is complete. + +.. automodule:: arroyo.processing.strategies.commit + :members: diff --git a/_sources/strategies/filter.rst.txt b/_sources/strategies/filter.rst.txt new file mode 100644 index 00000000..22cba221 --- /dev/null +++ b/_sources/strategies/filter.rst.txt @@ -0,0 +1,5 @@ +Filter +----------------------------- + +.. automodule:: arroyo.processing.strategies.filter + :members: diff --git a/_sources/strategies/healthcheck.rst.txt b/_sources/strategies/healthcheck.rst.txt new file mode 100644 index 00000000..89fe7a3c --- /dev/null +++ b/_sources/strategies/healthcheck.rst.txt @@ -0,0 +1,74 @@ +Healthchecks +============ + +If your code blocks for too long in the main thread, the consumer can turn +unhealthy. + +Kafka has a setting called ``max.poll.interval.ms`` for this that tells Kafka +to kick the consumer out of the broker after this many milliseconds of not polling. + +You can pass this option into :py:class:`arroyo.backends.kafka.consumer.KafkaConsumer` like so: + +.. code-block:: Python + + consumer = KafkaConsumer( + { + "max.poll.interval.ms": 300000, # default 5 minutes + } + ) + +However, this will not shut down the consumer, it will just keep running doing +nothing (because it is blocked in the main thread). You want a pod-level +healthcheck as well. + +Arroyo supports touching a file repeatedly from the main thread to indicate +health. Start your pipeline with the +:py:class:`arroyo.processing.strategies.healthcheck.Healthcheck` strategy. + +.. code-block:: Python + + def handle_message(message: Message[KafkaPayload]) -> Message[KafkaPayload]: + ... + return message + + class ConsumerStrategyFactory(ProcessingStrategyFactory[KafkaPayload]): + def __init__(self): + self.is_paused = False + + def create_with_partitions( + self, + commit: Commit, + partitions: Mapping[Partition, int], + ) -> ProcessingStrategy[KafkaPayload]: + step = RunTask(handle_message, CommitOffsets(commit)) + return Healthcheck("/tmp/health.txt", step) + +The Kubernetes `liveness +`_ +command would look like: + +.. code-block:: YAML + + apiVersion: v1 + kind: Pod + metadata: + labels: + test: liveness + name: liveness-exec + spec: + containers: + - name: liveness + image: registry.k8s.io/busybox + args: + - bin/my_arroyo_consumer + livenessProbe: + exec: + command: + - rm + - /tmp/health.txt + initialDelaySeconds: 5 + periodSeconds: 320 # should be higher than max.poll.interval.ms + + +.. automodule:: arroyo.processing.strategies.healthcheck + :members: diff --git a/_sources/strategies/index.rst.txt b/_sources/strategies/index.rst.txt new file mode 100644 index 00000000..60d75e1a --- /dev/null +++ b/_sources/strategies/index.rst.txt @@ -0,0 +1,39 @@ +Processing Strategies +===================== + +The processing strategies are the components to be wired together to +build a consumer. + +Strategy interface +------------------------- + +We normally don't recommend writing your own strategy, and encourage you to use +built-in ones such as "reduce" or "run task" to plug in your application logic. +Nevertheless, all arroyo strategies are written against the following interface: + +.. automodule:: arroyo.processing.strategies.abstract + :members: + :undoc-members: + :show-inheritance: + +Messages +------------ + +.. automodule:: arroyo.types + :members: + :undoc-members: + +.. toctree:: + :hidden: + + filter + reduce + unfold + batching + run_task + run_task_in_threads + run_task_with_multiprocessing + produce + commit_offsets + noop + healthcheck diff --git a/_sources/strategies/noop.rst.txt b/_sources/strategies/noop.rst.txt new file mode 100644 index 00000000..5a2dc622 --- /dev/null +++ b/_sources/strategies/noop.rst.txt @@ -0,0 +1,5 @@ +Noop +----------------------------- + +.. automodule:: arroyo.processing.strategies.noop + :members: diff --git a/_sources/strategies/produce.rst.txt b/_sources/strategies/produce.rst.txt new file mode 100644 index 00000000..d40c3ba8 --- /dev/null +++ b/_sources/strategies/produce.rst.txt @@ -0,0 +1,5 @@ +Produce +----------------------------- + +.. automodule:: arroyo.processing.strategies.produce + :members: diff --git a/_sources/strategies/reduce.rst.txt b/_sources/strategies/reduce.rst.txt new file mode 100644 index 00000000..41be2365 --- /dev/null +++ b/_sources/strategies/reduce.rst.txt @@ -0,0 +1,7 @@ +Reduce (Fold) +----------------------------- + +Accumulate messages based on a custom accumulator function + +.. automodule:: arroyo.processing.strategies.reduce + :members: diff --git a/_sources/strategies/run_task.rst.txt b/_sources/strategies/run_task.rst.txt new file mode 100644 index 00000000..bce67b48 --- /dev/null +++ b/_sources/strategies/run_task.rst.txt @@ -0,0 +1,5 @@ +Run Task +----------------------------- + +.. automodule:: arroyo.processing.strategies.run_task + :members: diff --git a/_sources/strategies/run_task_in_threads.rst.txt b/_sources/strategies/run_task_in_threads.rst.txt new file mode 100644 index 00000000..84ea0c08 --- /dev/null +++ b/_sources/strategies/run_task_in_threads.rst.txt @@ -0,0 +1,5 @@ +Run Task in Threads +----------------------------- + +.. automodule:: arroyo.processing.strategies.run_task_in_threads + :members: diff --git a/_sources/strategies/run_task_with_multiprocessing.rst.txt b/_sources/strategies/run_task_with_multiprocessing.rst.txt new file mode 100644 index 00000000..1855dbbd --- /dev/null +++ b/_sources/strategies/run_task_with_multiprocessing.rst.txt @@ -0,0 +1,5 @@ +Run Task with Multiprocessing +----------------------------- + +.. automodule:: arroyo.processing.strategies.run_task_with_multiprocessing + :members: diff --git a/_sources/strategies/unfold.rst.txt b/_sources/strategies/unfold.rst.txt new file mode 100644 index 00000000..113dc3b7 --- /dev/null +++ b/_sources/strategies/unfold.rst.txt @@ -0,0 +1,7 @@ +Unfold +----------------------------- + +Generates a sequence of messages from a single message based on a custom generator function + +.. automodule:: arroyo.processing.strategies.unfold + :members: diff --git a/_sources/what_for.rst.txt b/_sources/what_for.rst.txt new file mode 100644 index 00000000..7e2d04fd --- /dev/null +++ b/_sources/what_for.rst.txt @@ -0,0 +1,276 @@ +What is Arroyo for? +=================== + +Arroyo is a library for writing high-throughput, testable kafka +consumers and producers. This document attempts to outline the +intricacies of writing such consumers. + +Goals +----- + +1. Make it easy to build consumers that provide delivery guarantees +2. Make it easy to write high-throughput kafka consumers +3. Make it easy to write reliable, high throughput kafka producers +4. Abstract away rebalancing such that users of the library do not have + to worry about it +5. Make it possible to test kafka consumer logic without having to + reproduce the entire kafka environment +6. Provide a way for the application logic to signal backpressure + +Why Simple Doesn’t Cut It +------------------------- + +When visualizing event-driven architecture, Kafka is viewed as an +abstract queue with groups of producers pushing to it, and consumers +consuming from it (as in the diagram below). + +.. mermaid:: + + graph TD + Producer --> Kafka_Topic + Kafka_Topic --> Consumer + Consumer --> Destination + +A more accurate model is that kafka is like a log file which is +persistent and there are offsets of the file that different consumers +have read or not read. + +The most simple kafka consumer looks something like this: + +.. code:: python + + from confluent_kafka import Consumer + + conf = { + "bootstrap.servers": "localhost:9092", + "group.id": "my_group", + "auto.offset.reset": "latest", + } + + consumer = Consumer(conf) + consumer.subscribe(["my_topic"]) + + while True: + message = consumer.poll() + send_to_destination(process_message(message)) + +This simple consumer would not satisfy the goals mentioned at the top of +this page. The following subsections will explain why + +Providing delivery guarantees +----------------------------- + +By default, a consumer in the ``confluent_kafka`` library will +auto-commit on poll. To understand what it means to commit to a kafka +topic, see the Appendix. This can lead to the following issue: + +.. code:: python + + # get message from kafka, commit immediately + message = consumer.poll() + # ❗❗❗ throws exception due to a network issue + send_to_destination(process_message(message)) + # this message is now lost and we're on to the next one + +This can be fixed by only committing after we know that the message has +reached its destination in the following way: + +.. code:: python + + # add this value to the config: + "enable.auto.commit": "false" + # ------- + message = consumer.poll(timeout=0) + send_to_destination(process_message(message)) + consumer.commit(message.offset()) + +High Throughput +--------------- + +The previous section has allowed us to not commit messages that are not +processed however committing every message severely hurts throughput. +Every call to commit is a network operation, it also makes the broker +persist and replicate the information. If we can reduce the number of +commit calls, our throughput can be much higher. And so we commit in +batches + +.. code:: python + + # this code is purely descriptive. + # We have to commit to each partition separately + # but that code is not helpful for this example + message = consumer.poll(timeout=0) + batch.append(process_message(message)) + if len(batch) == batch_size: + consumer.commit(offsets=[m.offset() for m in batch]) + +This will get us faster throughput however we are currently hand-waving +away how we send the message to its destination + +Reliable High Throughput Batched Producers +------------------------------------------ + +Producing to Kafka reliably and at high throughput is not a simple +operation. Here is how a simple Kafka Producer looks in code: + +.. code:: python + + from confluent_kafka import Producer + + conf = { + "bootstrap.servers": "localhost:9092", + } + producer = Producer(conf) + def send_to_destination(message): + # ❗ This does not do what it says + # it writes to a buffer + producer.produce("destination_topic", message) + # this will actually block until the messages are produced + # calling this after produce every time is very expensive, + # how often we flush has high impacts on the producer throughput + producer.flush() + + +At a high level, the producer is actually buffering the messages +produced to the topic + +.. image:: _static/diagrams/kafka_producer.png + +A kafka producer writes to an internal buffer. This batches the IO +(good) but you don’t know when it will ever make it to the +destination + +In order to allow for reliability of transmission, the +``confluent_kafka`` library provides `a callback to +produce `__ +like so + +.. code:: python + + def delivery_callback(error, message): + # do something here to make sure your message is in the state + # you want it to be + + producer.produce("destination_topic", message, on_delivery=delivery_callback) + +Dealing With Rebalancing +------------------------ + +What is Rebalancing +~~~~~~~~~~~~~~~~~~~ + +A kafka topic is divided into n partitions, each partition can be +consumed by exactly one consumer per `consumer +group `__. A consumer can +consume multiple partitions + +.. figure:: _static/diagrams/consumer_groups.png + +When Rebalancing Can Happen +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Rebalancing can happen due to: + +- An addition or removal of a consumer to a consumer group + + - (Every deploy does this) + +- A rebalance being kicked off manually +- A consumer pod dies and now its partition needs to be re-assigned +- Whenever the broker decides it’s a good idea (it can happen at any + time) +- TODO: More things? + +How Rebalancing Affects a Consumer +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Rebalancing is annoying to handle for a consumer that processes batches, +imagine the following scenario: + +.. mermaid:: + + sequenceDiagram + Broker->>Consumer: message + activate Consumer + note right of Consumer: start building batch + Broker->>Consumer: message + Broker->>Consumer: Revoke Partition + deactivate Consumer + Consumer->>Broker: commit batch + note left of Broker: Received commit from revoked Consumer! + +Once a partition is revoked for a consumer, it cannot commit to it. This +is bad news for the batch that the consumer has built up. Each consumer +has different requirements but a decision has to be made as to whether +to flush the batch or to discard its work and let the next consumer +assigned to this partition pick it up. The rebalancing behavior can be +customized by providing an ``on_revoke`` callback to the consumer when +subscribing. + +.. code:: python + + from confluent_kafka import Consumer + + conf = { + "bootstrap.servers": "localhost:9092", + "group.id": "my_group", + "auto.offset.reset": "latest", + } + + def flush_current_batch(consumer, partitions): + # flush the current batch + pass + + consumer = Consumer(conf) + consumer.subscribe(["my_topic"], on_revoke=flush_current_batch) + +librdkafka’s Callback Hell +-------------------------- + +librdkafka uses callbacks as a core mechanic for control flow. A few +such examples have been mentioned in this document already. What is not +clear however, is that **callbacks are only called when ``poll`` is +called** + +This means that: + +- this line could possibly do a lot of work: + +.. code:: python + + # any scheduled callbacks will run within this call + message = consumer.poll() + +- No callbacks will be invoked until the consumer or producer call + ``poll`` again (for their respective callbacks) +- ``poll`` has to be called periodically on a consumer otherwise the + broker will kick the consumer out of the consumer group + + - The handling of that revocation won’t happen until ``poll`` is + called + +Conclusion +---------- + +There are many intricacies and gotchas to writing high performant, +reliable kafka consumers. This document does not outline all of them but +all of what is outlined here should be kept in mind when designing any +kafka consumer library. + +Appendix +-------- + +Committing to a Kafka Topic +--------------------------- + +A consumer comitting to a topic signals to the broker that this message +has been processed. When ``poll`` is called next by that consumer, it +will return the next message. + +`API +Doc `__ + +What is a Kafka Consumer Group +------------------------------ + +https://www.educba.com/kafka-consumer-group/ diff --git a/_static/arroyo-banner.png b/_static/arroyo-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..90482cb669dcc531ab025eb4e1c7afe9282381b7 GIT binary patch literal 71723 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

#M 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

?H$}{j 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 o$bt4xlA4 literal 0 HcmV?d00001 diff --git a/_static/arroyo-logo.png b/_static/arroyo-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7952081ab4e8cb1704ba302e4c6b62d5744f73 GIT binary patch literal 13031 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 O0Qb~&)oN61qy8T(_&SyV literal 0 HcmV?d00001 diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..cfc60b86 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/custom.css b/_static/custom.css new file mode 100644 index 00000000..a738cff4 --- /dev/null +++ b/_static/custom.css @@ -0,0 +1,10 @@ +/* fix mermaid diagrams in dark mode of shibuya theme we use */ + +html.dark .mermaid path { + stroke: #fff !important; +} + +html.dark .mermaid .marker { + stroke: #fff !important; + fill: #fff !important; +} diff --git a/_static/diagrams/arroyo_processing.png b/_static/diagrams/arroyo_processing.png new file mode 100644 index 0000000000000000000000000000000000000000..21004ddec1f5b65e4d272411acb2bff5724232d2 GIT binary patch literal 19166 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 literal 0 HcmV?d00001 diff --git a/_static/diagrams/consumer_groups.png b/_static/diagrams/consumer_groups.png new file mode 100644 index 0000000000000000000000000000000000000000..09aa7440e8124155500b3f926c49c8331a2f22af GIT binary patch literal 23512 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 literal 0 HcmV?d00001 diff --git a/_static/diagrams/kafka_producer.png b/_static/diagrams/kafka_producer.png new file mode 100644 index 0000000000000000000000000000000000000000..53a90d9d95a203732b2380077dc2e9646a1f5db8 GIT binary patch literal 16532 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 JE0NIi`5%ZO4Bh|$ literal 0 HcmV?d00001 diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..b57ae3b8 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/print.css b/_static/print.css new file mode 100644 index 00000000..bd88769f --- /dev/null +++ b/_static/print.css @@ -0,0 +1,42 @@ +.sy-head { + position: static; + border-bottom: 1px solid var(--sy-c-divider); +} + +.sy-head-inner { + padding: 0; +} + +.sy-breadcrumbs { + display: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +.code-block-caption, +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; + + -webkit-print-color-adjust: exact; +} + +.yue a.headerlink { + display: none; +} + +.highlight .linenos { + box-shadow: none; +} + +.admonition, +.sd-sphinx-override { + -webkit-print-color-adjust: exact; +} + +.sd-card { + page-break-inside: avoid; +} diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..449a846d --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1 @@ +:root{--syntax-pre-bg: var(--accent-a2);--syntax-cap-bg: var(--accent-a3);--syntax-highlight-bg: var(--accent-a3);--syntax-linenos-divider: var(--gray-a6);--syntax-light-text: #24292f;--syntax-light-meta: #807c87;--syntax-light-comment: #6e7781;--syntax-light-constant: #0550ae;--syntax-light-entity: #268bd2;--syntax-light-property: #8250df;--syntax-light-definition: #24292f;--syntax-light-tag: #085;--syntax-light-builtin: #b58900;--syntax-light-keyword: #cf222e;--syntax-light-exception: #e6212e;--syntax-light-string: #0a3069;--syntax-light-regexp: #e40;--syntax-light-variable: #a4480f;--syntax-light-invalid-illegal-text: #f6f8fa;--syntax-light-invalid-illegal-bg: #82071e;--syntax-light-markup-heading: #0550ae;--syntax-light-markup-italic: #24292f;--syntax-light-markup-bold: #24292f;--syntax-light-markup-deleted-text: #82071e;--syntax-light-markup-deleted-bg: #FFEBE9;--syntax-light-markup-inserted-text: #116329;--syntax-light-markup-inserted-bg: #dafbe1;--syntax-light-markup-changed-text: #953800;--syntax-light-markup-changed-bg: #ffd8b5;--syntax-light-markup-ignored-text: #eaeef2;--syntax-light-markup-ignored-bg: #0550ae;--syntax-light-meta-diff-range: #8250df;--syntax-light-special-bg: #dccafa;--syntax-dark-text: #c9d1d9;--syntax-dark-meta: #6e7781;--syntax-dark-comment: #8b949e;--syntax-dark-constant: #79c0ff;--syntax-dark-entity: #47b0fa;--syntax-dark-property: #d2a8ff;--syntax-dark-definition: #c9d1d9;--syntax-dark-tag: #7ee787;--syntax-dark-builtin: #ffd34c;--syntax-dark-keyword: #ff7b72;--syntax-dark-exception: #da473c;--syntax-dark-string: #a5d6ff;--syntax-dark-regexp: #ef954e;--syntax-dark-variable: #ffa657;--syntax-dark-invalid-illegal-text: #f0f6fc;--syntax-dark-invalid-illegal-bg: #8e1519;--syntax-dark-markup-heading: #1f6feb;--syntax-dark-markup-italic: #c9d1d9;--syntax-dark-markup-bold: #c9d1d9;--syntax-dark-markup-deleted-text: #ffdcd7;--syntax-dark-markup-deleted-bg: #67060c;--syntax-dark-markup-inserted-text: #aff5b4;--syntax-dark-markup-inserted-bg: #033a16;--syntax-dark-markup-changed-text: #ffdfb6;--syntax-dark-markup-changed-bg: #5a1e02;--syntax-dark-markup-ignored-text: #c9d1d9;--syntax-dark-markup-ignored-bg: #1158c7;--syntax-dark-meta-diff-range: #d2a8ff;--syntax-dark-special-bg: #4f425d}:root,html.light{--syntax-text: var(--syntax-light-text);--syntax-meta: var(--syntax-light-meta);--syntax-comment: var(--syntax-light-comment);--syntax-constant: var(--syntax-light-constant);--syntax-entity: var(--syntax-light-entity);--syntax-property: var(--syntax-light-property);--syntax-definition: var(--syntax-light-definition);--syntax-tag: var(--syntax-light-tag);--syntax-builtin: var(--syntax-light-builtin);--syntax-keyword: var(--syntax-light-keyword);--syntax-exception: var(--syntax-light-exception);--syntax-string: var(--syntax-light-string);--syntax-regexp: var(--syntax-light-regexp);--syntax-variable: var(--syntax-light-variable);--syntax-invalid-illegal-text: var(--syntax-light-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-light-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-light-markup-heading);--syntax-markup-italic: var(--syntax-light-markup-italic);--syntax-markup-bold: var(--syntax-light-markup-bold);--syntax-markup-deleted-text: var(--syntax-light-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-light-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-light-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-light-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-light-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-light-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-light-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-light-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-light-meta-diff-range);--syntax-special-bg: var(--syntax-light-special-bg)}@media (prefers-color-scheme: dark){:root{--syntax-text: var(--syntax-dark-text);--syntax-meta: var(--syntax-dark-meta);--syntax-comment: var(--syntax-dark-comment);--syntax-constant: var(--syntax-dark-constant);--syntax-entity: var(--syntax-dark-entity);--syntax-property: var(--syntax-dark-property);--syntax-definition: var(--syntax-dark-definition);--syntax-tag: var(--syntax-dark-tag);--syntax-builtin: var(--syntax-dark-builtin);--syntax-keyword: var(--syntax-dark-keyword);--syntax-exception: var(--syntax-dark-exception);--syntax-string: var(--syntax-dark-string);--syntax-regexp: var(--syntax-dark-regexp);--syntax-variable: var(--syntax-dark-variable);--syntax-invalid-illegal-text: var(--syntax-dark-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-dark-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-dark-markup-heading);--syntax-markup-italic: var(--syntax-dark-markup-italic);--syntax-markup-bold: var(--syntax-dark-markup-bold);--syntax-markup-deleted-text: var(--syntax-dark-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-dark-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-dark-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-dark-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-dark-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-dark-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-dark-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-dark-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-dark-meta-diff-range);--syntax-special-bg: var(--syntax-dark-special-bg)}}html.dark{--syntax-text: var(--syntax-dark-text);--syntax-meta: var(--syntax-dark-meta);--syntax-comment: var(--syntax-dark-comment);--syntax-constant: var(--syntax-dark-constant);--syntax-entity: var(--syntax-dark-entity);--syntax-property: var(--syntax-dark-property);--syntax-definition: var(--syntax-dark-definition);--syntax-tag: var(--syntax-dark-tag);--syntax-builtin: var(--syntax-dark-builtin);--syntax-keyword: var(--syntax-dark-keyword);--syntax-exception: var(--syntax-dark-exception);--syntax-string: var(--syntax-dark-string);--syntax-regexp: var(--syntax-dark-regexp);--syntax-variable: var(--syntax-dark-variable);--syntax-invalid-illegal-text: var(--syntax-dark-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-dark-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-dark-markup-heading);--syntax-markup-italic: var(--syntax-dark-markup-italic);--syntax-markup-bold: var(--syntax-dark-markup-bold);--syntax-markup-deleted-text: var(--syntax-dark-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-dark-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-dark-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-dark-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-dark-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-dark-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-dark-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-dark-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-dark-meta-diff-range);--syntax-special-bg: var(--syntax-dark-special-bg)}.light .dark-code{--syntax-pre-bg: var(--black-a12);--syntax-cap-bg: #1C2024;--syntax-highlight-bg: var(--white-a2);--syntax-linenos-divider: var(--white-a4);--syntax-text: var(--syntax-dark-text);--syntax-meta: var(--syntax-dark-meta);--syntax-comment: var(--syntax-dark-comment);--syntax-constant: var(--syntax-dark-constant);--syntax-entity: var(--syntax-dark-entity);--syntax-property: var(--syntax-dark-property);--syntax-definition: var(--syntax-dark-definition);--syntax-tag: var(--syntax-dark-tag);--syntax-builtin: var(--syntax-dark-builtin);--syntax-keyword: var(--syntax-dark-keyword);--syntax-exception: var(--syntax-dark-exception);--syntax-string: var(--syntax-dark-string);--syntax-regexp: var(--syntax-dark-regexp);--syntax-variable: var(--syntax-dark-variable);--syntax-invalid-illegal-text: var(--syntax-dark-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-dark-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-dark-markup-heading);--syntax-markup-italic: var(--syntax-dark-markup-italic);--syntax-markup-bold: var(--syntax-dark-markup-bold);--syntax-markup-deleted-text: var(--syntax-dark-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-dark-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-dark-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-dark-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-dark-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-dark-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-dark-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-dark-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-dark-meta-diff-range);--syntax-special-bg: var(--syntax-dark-special-bg)}html.light .sd-tab-content,html.light .jupyter_container .cell_output{--syntax-pre-bg: var(--color-surface-accent);--syntax-cap-bg: var(--accent-3);--syntax-highlight-bg: var(--accent-a3);--syntax-text: var(--syntax-light-text);--syntax-meta: var(--syntax-light-meta);--syntax-comment: var(--syntax-light-comment);--syntax-constant: var(--syntax-light-constant);--syntax-entity: var(--syntax-light-entity);--syntax-property: var(--syntax-light-property);--syntax-definition: var(--syntax-light-definition);--syntax-tag: var(--syntax-light-tag);--syntax-builtin: var(--syntax-light-builtin);--syntax-keyword: var(--syntax-light-keyword);--syntax-exception: var(--syntax-light-exception);--syntax-string: var(--syntax-light-string);--syntax-regexp: var(--syntax-light-regexp);--syntax-variable: var(--syntax-light-variable);--syntax-invalid-illegal-text: var(--syntax-light-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-light-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-light-markup-heading);--syntax-markup-italic: var(--syntax-light-markup-italic);--syntax-markup-bold: var(--syntax-light-markup-bold);--syntax-markup-deleted-text: var(--syntax-light-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-light-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-light-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-light-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-light-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-light-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-light-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-light-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-light-meta-diff-range);--syntax-highlight-bg: var(--syntax-light-highlight-bg);--syntax-special-bg: var(--syntax-light-special-bg)}.highlight{color:var(--syntax-text);background-color:transparent}.highlight .hll{display:block;background-color:var(--syntax-highlight-bg)}.highlight .c{color:var(--syntax-comment)}.highlight .err{color:var(--syntax-invalid-illegal-text);background-color:var(--syntax-invalid-illegal-bg)}.highlight .g{color:var(--syntax-meta)}.highlight .k{color:var(--syntax-keyword)}.highlight .l{color:var(--syntax-meta)}.highlight .o{color:var(--syntax-constant)}.highlight .x{color:var(--syntax-meta)}.highlight .cm{color:var(--syntax-comment)}.highlight .cp{color:var(--syntax-constant)}.highlight .c1{color:var(--syntax-comment)}.highlight .cs{color:var(--syntax-comment);background-color:var(--syntax-special-bg)}.highlight .gd{color:var(--syntax-markup-deleted-text);background-color:var(--syntax-markup-deleted-bg)}.highlight .ge{color:var(--syntax-markup-italic);font-style:italic}.highlight .gr{color:var(--syntax-invalid-illegal-text);background-color:var(--syntax-invalid-illegal-bg)}.highlight .gh{color:var(--syntax-markup-heading)}.highlight .gi{color:var(--syntax-markup-inserted-text);background-color:var(--syntax-markup-inserted-bg)}.highlight .go,.highlight .gp{color:var(--syntax-meta)}.highlight .gs{color:var(--syntax-markup-bold);font-weight:700}.highlight .gu{color:var(--syntax-markup-heading)}.highlight .gt{color:var(--syntax-meta)}.highlight .kc{color:var(--syntax-constant)}.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr{color:var(--syntax-keyword)}.highlight .kt{color:var(--syntax-entity)}.highlight .ld{color:var(--syntax-meta)}.highlight .m{color:var(--syntax-constant)}.highlight .s{color:var(--syntax-string)}.highlight .il,.highlight .na{color:var(--syntax-constant)}.highlight .nb{color:var(--syntax-builtin)}.highlight .nc{color:var(--syntax-definition)}.highlight .no{color:var(--syntax-constant)}.highlight .nd,.highlight .ni{color:var(--syntax-entity)}.highlight .ne{color:var(--syntax-exception)}.highlight .nf{color:var(--syntax-definition)}.highlight .nt{color:var(--syntax-tag)}.highlight .ow{color:var(--syntax-constant)}.highlight .w{color:var(--syntax-meta)}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--syntax-constant)}.highlight .sb{color:var(--syntax-meta)}.highlight .sc{color:var(--syntax-string)}.highlight .sd{color:var(--syntax-comment)}.highlight .s2,.highlight .se{color:var(--syntax-string)}.highlight .sh{color:var(--syntax-comment)}.highlight .si,.highlight .sx{color:var(--syntax-string)}.highlight .sr{color:var(--syntax-regexp)}.highlight .s1,.highlight .ss{color:var(--syntax-string)}.highlight .bp,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--syntax-variable)} diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/shibuya.css b/_static/shibuya.css new file mode 100644 index 00000000..cd5b9cb8 --- /dev/null +++ b/_static/shibuya.css @@ -0,0 +1 @@ +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}.collapse{visibility:collapse}.order-last{order:9999}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mr-3{margin-right:.75rem}.block{display:block}.flex{display:flex}.table{display:table}.contents{display:contents}.hidden{display:none}.w-64{width:16rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-6xl{max-width:72rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-x-1{--tw-translate-x:-0.25rem}.-translate-x-1,.-translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-2{--tw-translate-x:-0.5rem}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pr-3{padding-right:.75rem}.pt-12{padding-top:3rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-sm{font-size:.875rem;line-height:1.25rem}@font-face{font-family:Twemoji Country Flags;unicode-range:u+1f1e6-1f1ff,u+1f3f4,u+e0062-e0063,u+e0065,u+e0067,u+e006c,u+e006e,u+e0073-e0074,u+e0077,u+e007f;src:url(https://cdn.jsdelivr.net/npm/country-flag-emoji-polyfill@0.1/dist/TwemojiCountryFlags.woff2) format("woff2")}::-moz-selection{color:var(--accent-a11);background-color:var(--accent-a3)}::selection{color:var(--accent-a11);background-color:var(--accent-a3)}html{scroll-behavior:smooth}body{font-family:var(--sy-f-text);color:var(--sy-c-text)}.win{font-family:"Twemoji Country Flags",var(--sy-f-text)}h1,h2,h3,h4,h5{color:var(--sy-c-heading);font-family:var(--sy-f-heading)}em,strong{color:var(--sy-c-bold)}.sy-container{max-width:90rem}.sy-scrollbar{overflow-y:auto;scrollbar-gutter:stable}.sy-scrollbar::-webkit-scrollbar{height:.75rem;width:.75rem}.sy-scrollbar::-webkit-scrollbar-thumb{border-radius:10px}.sy-scrollbar::-webkit-scrollbar-track{background-color:transparent}.sy-scrollbar:hover::-webkit-scrollbar-thumb{background-color:var(--gray-a3);background-clip:content-box;border:3px solid transparent}.i-lucide,iconify-icon{vertical-align:middle}.i-lucide{-webkit-mask:var(--icon-url) no-repeat;mask:var(--icon-url) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;width:1em;height:1em;display:inline-block;font-style:normal;background-color:currentColor}.theme-switch .theme-icon,[data-color-mode=auto] .theme-switch .theme-icon{--icon-url:var(--lucide-laptop-url)}[data-color-mode=light] .theme-switch .theme-icon{--icon-url:var(--lucide-sun-url)}[data-color-mode=dark] .theme-switch .theme-icon{--icon-url:var(--lucide-moon-url)}.light,.light-theme,:root{--tomato-1:#fffcfc;--tomato-2:#fff8f7;--tomato-3:#feebe7;--tomato-4:#ffdcd3;--tomato-5:#ffcdc2;--tomato-6:#fdbdaf;--tomato-7:#f5a898;--tomato-8:#ec8e7b;--tomato-9:#e54d2e;--tomato-10:#dd4425;--tomato-11:#d13415;--tomato-12:#5c271f}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--tomato-1:color(display-p3 0.998 0.989 0.988);--tomato-2:color(display-p3 0.994 0.974 0.969);--tomato-3:color(display-p3 0.985 0.924 0.909);--tomato-4:color(display-p3 0.996 0.868 0.835);--tomato-5:color(display-p3 0.98 0.812 0.77);--tomato-6:color(display-p3 0.953 0.75 0.698);--tomato-7:color(display-p3 0.917 0.673 0.611);--tomato-8:color(display-p3 0.875 0.575 0.502);--tomato-9:color(display-p3 0.831 0.345 0.231);--tomato-10:color(display-p3 0.802 0.313 0.2);--tomato-11:color(display-p3 0.755 0.259 0.152);--tomato-12:color(display-p3 0.335 0.165 0.132)}}}.dark,.dark-theme{--tomato-1:#181111;--tomato-2:#1f1513;--tomato-3:#391714;--tomato-4:#4e1511;--tomato-5:#5e1c16;--tomato-6:#6e2920;--tomato-7:#853a2d;--tomato-8:#ac4d39;--tomato-9:#e54d2e;--tomato-10:#ec6142;--tomato-11:#ff977d;--tomato-12:#fbd3cb}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--tomato-1:color(display-p3 0.09 0.068 0.067);--tomato-2:color(display-p3 0.115 0.084 0.076);--tomato-3:color(display-p3 0.205 0.097 0.083);--tomato-4:color(display-p3 0.282 0.099 0.077);--tomato-5:color(display-p3 0.339 0.129 0.101);--tomato-6:color(display-p3 0.398 0.179 0.141);--tomato-7:color(display-p3 0.487 0.245 0.194);--tomato-8:color(display-p3 0.629 0.322 0.248);--tomato-9:color(display-p3 0.831 0.345 0.231);--tomato-10:color(display-p3 0.862 0.415 0.298);--tomato-11:color(display-p3 1 0.585 0.455);--tomato-12:color(display-p3 0.959 0.833 0.802)}}}.light,.light-theme,:root{--tomato-a1:#ff000003;--tomato-a2:#ff200008;--tomato-a3:#f52b0018;--tomato-a4:#ff35002c;--tomato-a5:#ff2e003d;--tomato-a6:#f92d0050;--tomato-a7:#e7280067;--tomato-a8:#db250084;--tomato-a9:#df2600d1;--tomato-a10:#d72400da;--tomato-a11:#cd2200ea;--tomato-a12:#460900e0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--tomato-a1:color(display-p3 0.675 0.024 0.024/0.012);--tomato-a2:color(display-p3 0.757 0.145 0.02/0.032);--tomato-a3:color(display-p3 0.831 0.184 0.012/0.091);--tomato-a4:color(display-p3 0.976 0.192 0.004/0.165);--tomato-a5:color(display-p3 0.918 0.192 0.004/0.232);--tomato-a6:color(display-p3 0.847 0.173 0.004/0.302);--tomato-a7:color(display-p3 0.788 0.165 0.004/0.389);--tomato-a8:color(display-p3 0.749 0.153 0.004/0.499);--tomato-a9:color(display-p3 0.78 0.149 0/0.769);--tomato-a10:color(display-p3 0.757 0.141 0/0.8);--tomato-a11:color(display-p3 0.755 0.259 0.152);--tomato-a12:color(display-p3 0.335 0.165 0.132)}}}.dark,.dark-theme{--tomato-a1:#f1121208;--tomato-a2:#ff55330f;--tomato-a3:#ff35232b;--tomato-a4:#fd201142;--tomato-a5:#fe332153;--tomato-a6:#ff4f3864;--tomato-a7:#fd644a7d;--tomato-a8:#fe6d4ea7;--tomato-a9:#fe5431e4;--tomato-a10:#ff6847eb;--tomato-a11:#ff977d;--tomato-a12:#ffd6cefb}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--tomato-a1:color(display-p3 0.973 0.071 0.071/0.026);--tomato-a2:color(display-p3 0.992 0.376 0.224/0.051);--tomato-a3:color(display-p3 0.996 0.282 0.176/0.148);--tomato-a4:color(display-p3 1 0.204 0.118/0.232);--tomato-a5:color(display-p3 1 0.286 0.192/0.29);--tomato-a6:color(display-p3 1 0.392 0.278/0.353);--tomato-a7:color(display-p3 1 0.459 0.349/0.45);--tomato-a8:color(display-p3 1 0.49 0.369/0.601);--tomato-a9:color(display-p3 1 0.408 0.267/0.82);--tomato-a10:color(display-p3 1 0.478 0.341/0.853);--tomato-a11:color(display-p3 1 0.585 0.455);--tomato-a12:color(display-p3 0.959 0.833 0.802)}}}.light,.light-theme,:root{--red-1:#fffcfc;--red-2:#fff7f7;--red-3:#feebec;--red-4:#ffdbdc;--red-5:#ffcdce;--red-6:#fdbdbe;--red-7:#f4a9aa;--red-8:#eb8e90;--red-9:#e5484d;--red-10:#dc3e42;--red-11:#ce2c31;--red-12:#641723}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--red-1:color(display-p3 0.998 0.989 0.988);--red-2:color(display-p3 0.995 0.971 0.971);--red-3:color(display-p3 0.985 0.925 0.925);--red-4:color(display-p3 0.999 0.866 0.866);--red-5:color(display-p3 0.984 0.812 0.811);--red-6:color(display-p3 0.955 0.751 0.749);--red-7:color(display-p3 0.915 0.675 0.672);--red-8:color(display-p3 0.872 0.575 0.572);--red-9:color(display-p3 0.83 0.329 0.324);--red-10:color(display-p3 0.798 0.294 0.285);--red-11:color(display-p3 0.744 0.234 0.222);--red-12:color(display-p3 0.36 0.115 0.143)}}}.dark,.dark-theme{--red-1:#191111;--red-2:#201314;--red-3:#3b1219;--red-4:#500f1c;--red-5:#611623;--red-6:#72232d;--red-7:#8c333a;--red-8:#b54548;--red-9:#e5484d;--red-10:#ec5d5e;--red-11:#ff9592;--red-12:#ffd1d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--red-1:color(display-p3 0.093 0.068 0.067);--red-2:color(display-p3 0.118 0.077 0.079);--red-3:color(display-p3 0.211 0.081 0.099);--red-4:color(display-p3 0.287 0.079 0.113);--red-5:color(display-p3 0.348 0.11 0.142);--red-6:color(display-p3 0.414 0.16 0.183);--red-7:color(display-p3 0.508 0.224 0.236);--red-8:color(display-p3 0.659 0.298 0.297);--red-9:color(display-p3 0.83 0.329 0.324);--red-10:color(display-p3 0.861 0.403 0.387);--red-11:color(display-p3 1 0.57 0.55);--red-12:color(display-p3 0.971 0.826 0.852)}}}.light,.light-theme,:root{--red-a1:#ff000003;--red-a2:#ff000008;--red-a3:#f3000d14;--red-a4:#ff000824;--red-a5:#ff000632;--red-a6:#f8000442;--red-a7:#df000356;--red-a8:#d2000571;--red-a9:#db0007b7;--red-a10:#d10005c1;--red-a11:#c40006d3;--red-a12:#55000de8}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--red-a1:color(display-p3 0.675 0.024 0.024/0.012);--red-a2:color(display-p3 0.863 0.024 0.024/0.028);--red-a3:color(display-p3 0.792 0.008 0.008/0.075);--red-a4:color(display-p3 1 0.008 0.008/0.134);--red-a5:color(display-p3 0.918 0.008 0.008/0.189);--red-a6:color(display-p3 0.831 0.02 0.004/0.251);--red-a7:color(display-p3 0.741 0.016 0.004/0.33);--red-a8:color(display-p3 0.698 0.012 0.004/0.428);--red-a9:color(display-p3 0.749 0.008 0/0.675);--red-a10:color(display-p3 0.714 0.012 0/0.714);--red-a11:color(display-p3 0.744 0.234 0.222);--red-a12:color(display-p3 0.36 0.115 0.143)}}}.dark,.dark-theme{--red-a1:#f4121209;--red-a2:#f22f3e11;--red-a3:#ff173f2d;--red-a4:#fe0a3b44;--red-a5:#ff204756;--red-a6:#ff3e5668;--red-a7:#ff536184;--red-a8:#ff5d61b0;--red-a9:#fe4e54e4;--red-a10:#ff6465eb;--red-a11:#ff9592;--red-a12:#ffd1d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--red-a1:color(display-p3 0.984 0.071 0.071/0.03);--red-a2:color(display-p3 0.996 0.282 0.282/0.055);--red-a3:color(display-p3 1 0.169 0.271/0.156);--red-a4:color(display-p3 1 0.118 0.267/0.236);--red-a5:color(display-p3 1 0.212 0.314/0.303);--red-a6:color(display-p3 1 0.318 0.38/0.374);--red-a7:color(display-p3 1 0.4 0.424/0.475);--red-a8:color(display-p3 1 0.431 0.431/0.635);--red-a9:color(display-p3 1 0.388 0.384/0.82);--red-a10:color(display-p3 1 0.463 0.447/0.853);--red-a11:color(display-p3 1 0.57 0.55);--red-a12:color(display-p3 0.971 0.826 0.852)}}}.light,.light-theme,:root{--ruby-1:#fffcfd;--ruby-2:#fff7f8;--ruby-3:#feeaed;--ruby-4:#ffdce1;--ruby-5:#ffced6;--ruby-6:#f8bfc8;--ruby-7:#efacb8;--ruby-8:#e592a3;--ruby-9:#e54666;--ruby-10:#dc3b5d;--ruby-11:#ca244d;--ruby-12:#64172b}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--ruby-1:color(display-p3 0.998 0.989 0.992);--ruby-2:color(display-p3 0.995 0.971 0.974);--ruby-3:color(display-p3 0.983 0.92 0.928);--ruby-4:color(display-p3 0.987 0.869 0.885);--ruby-5:color(display-p3 0.968 0.817 0.839);--ruby-6:color(display-p3 0.937 0.758 0.786);--ruby-7:color(display-p3 0.897 0.685 0.721);--ruby-8:color(display-p3 0.851 0.588 0.639);--ruby-9:color(display-p3 0.83 0.323 0.408);--ruby-10:color(display-p3 0.795 0.286 0.375);--ruby-11:color(display-p3 0.728 0.211 0.311);--ruby-12:color(display-p3 0.36 0.115 0.171)}}}.dark,.dark-theme{--ruby-1:#191113;--ruby-2:#1e1517;--ruby-3:#3a141e;--ruby-4:#4e1325;--ruby-5:#5e1a2e;--ruby-6:#6f2539;--ruby-7:#883447;--ruby-8:#b3445a;--ruby-9:#e54666;--ruby-10:#ec5a72;--ruby-11:#ff949d;--ruby-12:#fed2e1}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--ruby-1:color(display-p3 0.093 0.068 0.074);--ruby-2:color(display-p3 0.113 0.083 0.089);--ruby-3:color(display-p3 0.208 0.088 0.117);--ruby-4:color(display-p3 0.279 0.092 0.147);--ruby-5:color(display-p3 0.337 0.12 0.18);--ruby-6:color(display-p3 0.401 0.166 0.223);--ruby-7:color(display-p3 0.495 0.224 0.281);--ruby-8:color(display-p3 0.652 0.295 0.359);--ruby-9:color(display-p3 0.83 0.323 0.408);--ruby-10:color(display-p3 0.857 0.392 0.455);--ruby-11:color(display-p3 1 0.57 0.59);--ruby-12:color(display-p3 0.968 0.83 0.88)}}}.light,.light-theme,:root{--ruby-a1:#ff005503;--ruby-a2:#ff002008;--ruby-a3:#f3002515;--ruby-a4:#ff002523;--ruby-a5:#ff002a31;--ruby-a6:#e4002440;--ruby-a7:#ce002553;--ruby-a8:#c300286d;--ruby-a9:#db002cb9;--ruby-a10:#d2002cc4;--ruby-a11:#c10030db;--ruby-a12:#550016e8}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--ruby-a1:color(display-p3 0.675 0.024 0.349/0.012);--ruby-a2:color(display-p3 0.863 0.024 0.024/0.028);--ruby-a3:color(display-p3 0.804 0.008 0.11/0.079);--ruby-a4:color(display-p3 0.91 0.008 0.125/0.13);--ruby-a5:color(display-p3 0.831 0.004 0.133/0.185);--ruby-a6:color(display-p3 0.745 0.004 0.118/0.244);--ruby-a7:color(display-p3 0.678 0.004 0.114/0.314);--ruby-a8:color(display-p3 0.639 0.004 0.125/0.412);--ruby-a9:color(display-p3 0.753 0 0.129/0.679);--ruby-a10:color(display-p3 0.714 0 0.125/0.714);--ruby-a11:color(display-p3 0.728 0.211 0.311);--ruby-a12:color(display-p3 0.36 0.115 0.171)}}}.dark,.dark-theme{--ruby-a1:#f4124a09;--ruby-a2:#fe5a7f0e;--ruby-a3:#ff235d2c;--ruby-a4:#fd195e42;--ruby-a5:#fe2d6b53;--ruby-a6:#ff447665;--ruby-a7:#ff577d80;--ruby-a8:#ff5c7cae;--ruby-a9:#fe4c70e4;--ruby-a10:#ff617beb;--ruby-a11:#ff949d;--ruby-a12:#ffd3e2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--ruby-a1:color(display-p3 0.984 0.071 0.329/0.03);--ruby-a2:color(display-p3 0.992 0.376 0.529/0.051);--ruby-a3:color(display-p3 0.996 0.196 0.404/0.152);--ruby-a4:color(display-p3 1 0.173 0.416/0.227);--ruby-a5:color(display-p3 1 0.259 0.459/0.29);--ruby-a6:color(display-p3 1 0.341 0.506/0.358);--ruby-a7:color(display-p3 1 0.412 0.541/0.458);--ruby-a8:color(display-p3 1 0.431 0.537/0.627);--ruby-a9:color(display-p3 1 0.376 0.482/0.82);--ruby-a10:color(display-p3 1 0.447 0.522/0.849);--ruby-a11:color(display-p3 1 0.57 0.59);--ruby-a12:color(display-p3 0.968 0.83 0.88)}}}.light,.light-theme,:root{--crimson-1:#fffcfd;--crimson-2:#fef7f9;--crimson-3:#ffe9f0;--crimson-4:#fedce7;--crimson-5:#facedd;--crimson-6:#f3bed1;--crimson-7:#eaacc3;--crimson-8:#e093b2;--crimson-9:#e93d82;--crimson-10:#df3478;--crimson-11:#cb1d63;--crimson-12:#621639}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--crimson-1:color(display-p3 0.998 0.989 0.992);--crimson-2:color(display-p3 0.991 0.969 0.976);--crimson-3:color(display-p3 0.987 0.917 0.941);--crimson-4:color(display-p3 0.975 0.866 0.904);--crimson-5:color(display-p3 0.953 0.813 0.864);--crimson-6:color(display-p3 0.921 0.755 0.817);--crimson-7:color(display-p3 0.88 0.683 0.761);--crimson-8:color(display-p3 0.834 0.592 0.694);--crimson-9:color(display-p3 0.843 0.298 0.507);--crimson-10:color(display-p3 0.807 0.266 0.468);--crimson-11:color(display-p3 0.731 0.195 0.388);--crimson-12:color(display-p3 0.352 0.111 0.221)}}}.dark,.dark-theme{--crimson-1:#191114;--crimson-2:#201318;--crimson-3:#381525;--crimson-4:#4d122f;--crimson-5:#5c1839;--crimson-6:#6d2545;--crimson-7:#873356;--crimson-8:#b0436e;--crimson-9:#e93d82;--crimson-10:#ee518a;--crimson-11:#ff92ad;--crimson-12:#fdd3e8}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--crimson-1:color(display-p3 0.093 0.068 0.078);--crimson-2:color(display-p3 0.117 0.078 0.095);--crimson-3:color(display-p3 0.203 0.091 0.143);--crimson-4:color(display-p3 0.277 0.087 0.182);--crimson-5:color(display-p3 0.332 0.115 0.22);--crimson-6:color(display-p3 0.394 0.162 0.268);--crimson-7:color(display-p3 0.489 0.222 0.336);--crimson-8:color(display-p3 0.638 0.289 0.429);--crimson-9:color(display-p3 0.843 0.298 0.507);--crimson-10:color(display-p3 0.864 0.364 0.539);--crimson-11:color(display-p3 1 0.56 0.66);--crimson-12:color(display-p3 0.966 0.834 0.906)}}}.light,.light-theme,:root{--crimson-a1:#ff005503;--crimson-a2:#e0004008;--crimson-a3:#ff005216;--crimson-a4:#f8005123;--crimson-a5:#e5004f31;--crimson-a6:#d0004b41;--crimson-a7:#bf004753;--crimson-a8:#b6004a6c;--crimson-a9:#e2005bc2;--crimson-a10:#d70056cb;--crimson-a11:#c4004fe2;--crimson-a12:#530026e9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--crimson-a1:color(display-p3 0.675 0.024 0.349/0.012);--crimson-a2:color(display-p3 0.757 0.02 0.267/0.032);--crimson-a3:color(display-p3 0.859 0.008 0.294/0.083);--crimson-a4:color(display-p3 0.827 0.008 0.298/0.134);--crimson-a5:color(display-p3 0.753 0.008 0.275/0.189);--crimson-a6:color(display-p3 0.682 0.004 0.247/0.244);--crimson-a7:color(display-p3 0.62 0.004 0.251/0.318);--crimson-a8:color(display-p3 0.6 0.004 0.251/0.408);--crimson-a9:color(display-p3 0.776 0 0.298/0.702);--crimson-a10:color(display-p3 0.737 0 0.275/0.734);--crimson-a11:color(display-p3 0.731 0.195 0.388);--crimson-a12:color(display-p3 0.352 0.111 0.221)}}}.dark,.dark-theme{--crimson-a1:#f4126709;--crimson-a2:#f22f7a11;--crimson-a3:#fe2a8b2a;--crimson-a4:#fd158741;--crimson-a5:#fd278f51;--crimson-a6:#fe459763;--crimson-a7:#fd559b7f;--crimson-a8:#fe5b9bab;--crimson-a9:#fe418de8;--crimson-a10:#ff5693ed;--crimson-a11:#ff92ad;--crimson-a12:#ffd5eafd}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--crimson-a1:color(display-p3 0.984 0.071 0.463/0.03);--crimson-a2:color(display-p3 0.996 0.282 0.569/0.055);--crimson-a3:color(display-p3 0.996 0.227 0.573/0.148);--crimson-a4:color(display-p3 1 0.157 0.569/0.227);--crimson-a5:color(display-p3 1 0.231 0.604/0.286);--crimson-a6:color(display-p3 1 0.337 0.643/0.349);--crimson-a7:color(display-p3 1 0.416 0.663/0.454);--crimson-a8:color(display-p3 0.996 0.427 0.651/0.614);--crimson-a9:color(display-p3 1 0.345 0.596/0.832);--crimson-a10:color(display-p3 1 0.42 0.62/0.853);--crimson-a11:color(display-p3 1 0.56 0.66);--crimson-a12:color(display-p3 0.966 0.834 0.906)}}}.light,.light-theme,:root{--pink-1:#fffcfe;--pink-2:#fef7fb;--pink-3:#fee9f5;--pink-4:#fbdcef;--pink-5:#f6cee7;--pink-6:#efbfdd;--pink-7:#e7acd0;--pink-8:#dd93c2;--pink-9:#d6409f;--pink-10:#cf3897;--pink-11:#c2298a;--pink-12:#651249}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--pink-1:color(display-p3 0.998 0.989 0.996);--pink-2:color(display-p3 0.992 0.97 0.985);--pink-3:color(display-p3 0.981 0.917 0.96);--pink-4:color(display-p3 0.963 0.867 0.932);--pink-5:color(display-p3 0.939 0.815 0.899);--pink-6:color(display-p3 0.907 0.756 0.859);--pink-7:color(display-p3 0.869 0.683 0.81);--pink-8:color(display-p3 0.825 0.59 0.751);--pink-9:color(display-p3 0.775 0.297 0.61);--pink-10:color(display-p3 0.748 0.27 0.581);--pink-11:color(display-p3 0.698 0.219 0.528);--pink-12:color(display-p3 0.363 0.101 0.279)}}}.dark,.dark-theme{--pink-1:#191117;--pink-2:#21121d;--pink-3:#37172f;--pink-4:#4b143d;--pink-5:#591c47;--pink-6:#692955;--pink-7:#833869;--pink-8:#a84885;--pink-9:#d6409f;--pink-10:#de51a8;--pink-11:#ff8dcc;--pink-12:#fdd1ea}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--pink-1:color(display-p3 0.093 0.068 0.089);--pink-2:color(display-p3 0.121 0.073 0.11);--pink-3:color(display-p3 0.198 0.098 0.179);--pink-4:color(display-p3 0.271 0.095 0.231);--pink-5:color(display-p3 0.32 0.127 0.273);--pink-6:color(display-p3 0.382 0.177 0.326);--pink-7:color(display-p3 0.477 0.238 0.405);--pink-8:color(display-p3 0.612 0.304 0.51);--pink-9:color(display-p3 0.775 0.297 0.61);--pink-10:color(display-p3 0.808 0.356 0.645);--pink-11:color(display-p3 1 0.535 0.78);--pink-12:color(display-p3 0.964 0.826 0.912)}}}.light,.light-theme,:root{--pink-a1:#ff00aa03;--pink-a2:#e0008008;--pink-a3:#f4008c16;--pink-a4:#e2008b23;--pink-a5:#d1008331;--pink-a6:#c0007840;--pink-a7:#b6006f53;--pink-a8:#af006f6c;--pink-a9:#c8007fbf;--pink-a10:#c2007ac7;--pink-a11:#b60074d6;--pink-a12:#59003bed}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--pink-a1:color(display-p3 0.675 0.024 0.675/0.012);--pink-a2:color(display-p3 0.757 0.02 0.51/0.032);--pink-a3:color(display-p3 0.765 0.008 0.529/0.083);--pink-a4:color(display-p3 0.737 0.008 0.506/0.134);--pink-a5:color(display-p3 0.663 0.004 0.451/0.185);--pink-a6:color(display-p3 0.616 0.004 0.424/0.244);--pink-a7:color(display-p3 0.596 0.004 0.412/0.318);--pink-a8:color(display-p3 0.573 0.004 0.404/0.412);--pink-a9:color(display-p3 0.682 0 0.447/0.702);--pink-a10:color(display-p3 0.655 0 0.424/0.73);--pink-a11:color(display-p3 0.698 0.219 0.528);--pink-a12:color(display-p3 0.363 0.101 0.279)}}}.dark,.dark-theme{--pink-a1:#f412bc09;--pink-a2:#f420bb12;--pink-a3:#fe37cc29;--pink-a4:#fc1ec43f;--pink-a5:#fd35c24e;--pink-a6:#fd51c75f;--pink-a7:#fd62c87b;--pink-a8:#ff68c8a2;--pink-a9:#fe49bcd4;--pink-a10:#ff5cc0dc;--pink-a11:#ff8dcc;--pink-a12:#ffd3ecfd}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--pink-a1:color(display-p3 0.984 0.071 0.855/0.03);--pink-a2:color(display-p3 1 0.2 0.8/0.059);--pink-a3:color(display-p3 1 0.294 0.886/0.139);--pink-a4:color(display-p3 1 0.192 0.82/0.219);--pink-a5:color(display-p3 1 0.282 0.827/0.274);--pink-a6:color(display-p3 1 0.396 0.835/0.337);--pink-a7:color(display-p3 1 0.459 0.831/0.442);--pink-a8:color(display-p3 1 0.478 0.827/0.585);--pink-a9:color(display-p3 1 0.373 0.784/0.761);--pink-a10:color(display-p3 1 0.435 0.792/0.795);--pink-a11:color(display-p3 1 0.535 0.78);--pink-a12:color(display-p3 0.964 0.826 0.912)}}}.light,.light-theme,:root{--plum-1:#fefcff;--plum-2:#fdf7fd;--plum-3:#fbebfb;--plum-4:#f7def8;--plum-5:#f2d1f3;--plum-6:#e9c2ec;--plum-7:#deade3;--plum-8:#cf91d8;--plum-9:#ab4aba;--plum-10:#a144af;--plum-11:#953ea3;--plum-12:#53195d}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--plum-1:color(display-p3 0.995 0.988 0.999);--plum-2:color(display-p3 0.988 0.971 0.99);--plum-3:color(display-p3 0.973 0.923 0.98);--plum-4:color(display-p3 0.953 0.875 0.966);--plum-5:color(display-p3 0.926 0.825 0.945);--plum-6:color(display-p3 0.89 0.765 0.916);--plum-7:color(display-p3 0.84 0.686 0.877);--plum-8:color(display-p3 0.775 0.58 0.832);--plum-9:color(display-p3 0.624 0.313 0.708);--plum-10:color(display-p3 0.587 0.29 0.667);--plum-11:color(display-p3 0.543 0.263 0.619);--plum-12:color(display-p3 0.299 0.114 0.352)}}}.dark,.dark-theme{--plum-1:#181118;--plum-2:#201320;--plum-3:#351a35;--plum-4:#451d47;--plum-5:#512454;--plum-6:#5e3061;--plum-7:#734079;--plum-8:#92549c;--plum-9:#ab4aba;--plum-10:#b658c4;--plum-11:#e796f3;--plum-12:#f4d4f4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--plum-1:color(display-p3 0.09 0.068 0.092);--plum-2:color(display-p3 0.118 0.077 0.121);--plum-3:color(display-p3 0.192 0.105 0.202);--plum-4:color(display-p3 0.25 0.121 0.271);--plum-5:color(display-p3 0.293 0.152 0.319);--plum-6:color(display-p3 0.343 0.198 0.372);--plum-7:color(display-p3 0.424 0.262 0.461);--plum-8:color(display-p3 0.54 0.341 0.595);--plum-9:color(display-p3 0.624 0.313 0.708);--plum-10:color(display-p3 0.666 0.365 0.748);--plum-11:color(display-p3 0.86 0.602 0.933);--plum-12:color(display-p3 0.936 0.836 0.949)}}}.light,.light-theme,:root{--plum-a1:#aa00ff03;--plum-a2:#c000c008;--plum-a3:#cc00cc14;--plum-a4:#c200c921;--plum-a5:#b700bd2e;--plum-a6:#a400b03d;--plum-a7:#9900a852;--plum-a8:#9000a56e;--plum-a9:#89009eb5;--plum-a10:#7f0092bb;--plum-a11:#730086c1;--plum-a12:#40004be6}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--plum-a1:color(display-p3 0.675 0.024 1/0.012);--plum-a2:color(display-p3 0.58 0.024 0.58/0.028);--plum-a3:color(display-p3 0.655 0.008 0.753/0.079);--plum-a4:color(display-p3 0.627 0.008 0.722/0.126);--plum-a5:color(display-p3 0.58 0.004 0.69/0.177);--plum-a6:color(display-p3 0.537 0.004 0.655/0.236);--plum-a7:color(display-p3 0.49 0.004 0.616/0.314);--plum-a8:color(display-p3 0.471 0.004 0.6/0.42);--plum-a9:color(display-p3 0.451 0 0.576/0.687);--plum-a10:color(display-p3 0.42 0 0.529/0.71);--plum-a11:color(display-p3 0.543 0.263 0.619);--plum-a12:color(display-p3 0.299 0.114 0.352)}}}.dark,.dark-theme{--plum-a1:#f112f108;--plum-a2:#f22ff211;--plum-a3:#fd4cfd27;--plum-a4:#f646ff3a;--plum-a5:#f455ff48;--plum-a6:#f66dff56;--plum-a7:#f07cfd70;--plum-a8:#ee84ff95;--plum-a9:#e961feb6;--plum-a10:#ed70ffc0;--plum-a11:#f19cfef3;--plum-a12:#feddfef4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--plum-a1:color(display-p3 0.973 0.071 0.973/0.026);--plum-a2:color(display-p3 0.933 0.267 1/0.059);--plum-a3:color(display-p3 0.918 0.333 0.996/0.148);--plum-a4:color(display-p3 0.91 0.318 1/0.219);--plum-a5:color(display-p3 0.914 0.388 1/0.269);--plum-a6:color(display-p3 0.906 0.463 1/0.328);--plum-a7:color(display-p3 0.906 0.529 1/0.425);--plum-a8:color(display-p3 0.906 0.553 1/0.568);--plum-a9:color(display-p3 0.875 0.427 1/0.69);--plum-a10:color(display-p3 0.886 0.471 0.996/0.732);--plum-a11:color(display-p3 0.86 0.602 0.933);--plum-a12:color(display-p3 0.936 0.836 0.949)}}}.light,.light-theme,:root{--purple-1:#fefcfe;--purple-2:#fbf7fe;--purple-3:#f7edfe;--purple-4:#f2e2fc;--purple-5:#ead5f9;--purple-6:#e0c4f4;--purple-7:#d1afec;--purple-8:#be93e4;--purple-9:#8e4ec6;--purple-10:#8347b9;--purple-11:#8145b5;--purple-12:#402060}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--purple-1:color(display-p3 0.995 0.988 0.996);--purple-2:color(display-p3 0.983 0.971 0.993);--purple-3:color(display-p3 0.963 0.931 0.989);--purple-4:color(display-p3 0.937 0.888 0.981);--purple-5:color(display-p3 0.904 0.837 0.966);--purple-6:color(display-p3 0.86 0.774 0.942);--purple-7:color(display-p3 0.799 0.69 0.91);--purple-8:color(display-p3 0.719 0.583 0.874);--purple-9:color(display-p3 0.523 0.318 0.751);--purple-10:color(display-p3 0.483 0.289 0.7);--purple-11:color(display-p3 0.473 0.281 0.687);--purple-12:color(display-p3 0.234 0.132 0.363)}}}.dark,.dark-theme{--purple-1:#18111b;--purple-2:#1e1523;--purple-3:#301c3b;--purple-4:#3d224e;--purple-5:#48295c;--purple-6:#54346b;--purple-7:#664282;--purple-8:#8457aa;--purple-9:#8e4ec6;--purple-10:#9a5cd0;--purple-11:#d19dff;--purple-12:#ecd9fa}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--purple-1:color(display-p3 0.09 0.068 0.103);--purple-2:color(display-p3 0.113 0.082 0.134);--purple-3:color(display-p3 0.175 0.112 0.224);--purple-4:color(display-p3 0.224 0.137 0.297);--purple-5:color(display-p3 0.264 0.167 0.349);--purple-6:color(display-p3 0.311 0.208 0.406);--purple-7:color(display-p3 0.381 0.266 0.496);--purple-8:color(display-p3 0.49 0.349 0.649);--purple-9:color(display-p3 0.523 0.318 0.751);--purple-10:color(display-p3 0.57 0.373 0.791);--purple-11:color(display-p3 0.8 0.62 1);--purple-12:color(display-p3 0.913 0.854 0.971)}}}.light,.light-theme,:root{--purple-a1:#aa00aa03;--purple-a2:#8000e008;--purple-a3:#8e00f112;--purple-a4:#8d00e51d;--purple-a5:#8000db2a;--purple-a6:#7a01d03b;--purple-a7:#6d00c350;--purple-a8:#6600c06c;--purple-a9:#5c00adb1;--purple-a10:#53009eb8;--purple-a11:#52009aba;--purple-a12:#250049df}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--purple-a1:color(display-p3 0.675 0.024 0.675/0.012);--purple-a2:color(display-p3 0.443 0.024 0.722/0.028);--purple-a3:color(display-p3 0.506 0.008 0.835/0.071);--purple-a4:color(display-p3 0.451 0.004 0.831/0.114);--purple-a5:color(display-p3 0.431 0.004 0.788/0.165);--purple-a6:color(display-p3 0.384 0.004 0.745/0.228);--purple-a7:color(display-p3 0.357 0.004 0.71/0.31);--purple-a8:color(display-p3 0.322 0.004 0.702/0.416);--purple-a9:color(display-p3 0.298 0 0.639/0.683);--purple-a10:color(display-p3 0.271 0 0.58/0.71);--purple-a11:color(display-p3 0.473 0.281 0.687);--purple-a12:color(display-p3 0.234 0.132 0.363)}}}.dark,.dark-theme{--purple-a1:#b412f90b;--purple-a2:#b744f714;--purple-a3:#c150ff2d;--purple-a4:#bb53fd42;--purple-a5:#be5cfd51;--purple-a6:#c16dfd61;--purple-a7:#c378fd7a;--purple-a8:#c47effa4;--purple-a9:#b661ffc2;--purple-a10:#bc6fffcd;--purple-a11:#d19dff;--purple-a12:#f1ddfffa}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--purple-a1:color(display-p3 0.686 0.071 0.996/0.038);--purple-a2:color(display-p3 0.722 0.286 0.996/0.072);--purple-a3:color(display-p3 0.718 0.349 0.996/0.169);--purple-a4:color(display-p3 0.702 0.353 1/0.248);--purple-a5:color(display-p3 0.718 0.404 1/0.303);--purple-a6:color(display-p3 0.733 0.455 1/0.366);--purple-a7:color(display-p3 0.753 0.506 1/0.458);--purple-a8:color(display-p3 0.749 0.522 1/0.622);--purple-a9:color(display-p3 0.686 0.408 1/0.736);--purple-a10:color(display-p3 0.71 0.459 1/0.778);--purple-a11:color(display-p3 0.8 0.62 1);--purple-a12:color(display-p3 0.913 0.854 0.971)}}}.light,.light-theme,:root{--violet-1:#fdfcfe;--violet-2:#faf8ff;--violet-3:#f4f0fe;--violet-4:#ebe4ff;--violet-5:#e1d9ff;--violet-6:#d4cafe;--violet-7:#c2b5f5;--violet-8:#aa99ec;--violet-9:#6e56cf;--violet-10:#654dc4;--violet-11:#6550b9;--violet-12:#2f265f}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--violet-1:color(display-p3 0.991 0.988 0.995);--violet-2:color(display-p3 0.978 0.974 0.998);--violet-3:color(display-p3 0.953 0.943 0.993);--violet-4:color(display-p3 0.916 0.897 1);--violet-5:color(display-p3 0.876 0.851 1);--violet-6:color(display-p3 0.825 0.793 0.981);--violet-7:color(display-p3 0.752 0.712 0.943);--violet-8:color(display-p3 0.654 0.602 0.902);--violet-9:color(display-p3 0.417 0.341 0.784);--violet-10:color(display-p3 0.381 0.306 0.741);--violet-11:color(display-p3 0.383 0.317 0.702);--violet-12:color(display-p3 0.179 0.15 0.359)}}}.dark,.dark-theme{--violet-1:#14121f;--violet-2:#1b1525;--violet-3:#291f43;--violet-4:#33255b;--violet-5:#3c2e69;--violet-6:#473876;--violet-7:#56468b;--violet-8:#6958ad;--violet-9:#6e56cf;--violet-10:#7d66d9;--violet-11:#baa7ff;--violet-12:#e2ddfe}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--violet-1:color(display-p3 0.077 0.071 0.118);--violet-2:color(display-p3 0.101 0.084 0.141);--violet-3:color(display-p3 0.154 0.123 0.256);--violet-4:color(display-p3 0.191 0.148 0.345);--violet-5:color(display-p3 0.226 0.182 0.396);--violet-6:color(display-p3 0.269 0.223 0.449);--violet-7:color(display-p3 0.326 0.277 0.53);--violet-8:color(display-p3 0.399 0.346 0.656);--violet-9:color(display-p3 0.417 0.341 0.784);--violet-10:color(display-p3 0.477 0.402 0.823);--violet-11:color(display-p3 0.72 0.65 1);--violet-12:color(display-p3 0.883 0.867 0.986)}}}.light,.light-theme,:root{--violet-a1:#5500aa03;--violet-a2:#4900ff07;--violet-a3:#4400ee0f;--violet-a4:#4300ff1b;--violet-a5:#3600ff26;--violet-a6:#3100fb35;--violet-a7:#2d01dd4a;--violet-a8:#2b00d066;--violet-a9:#2400b7a9;--violet-a10:#2300abb2;--violet-a11:#1f0099af;--violet-a12:#0b0043d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--violet-a1:color(display-p3 0.349 0.024 0.675/0.012);--violet-a2:color(display-p3 0.161 0.024 0.863/0.028);--violet-a3:color(display-p3 0.204 0.004 0.871/0.059);--violet-a4:color(display-p3 0.196 0.004 1/0.102);--violet-a5:color(display-p3 0.165 0.008 1/0.15);--violet-a6:color(display-p3 0.153 0.004 0.906/0.208);--violet-a7:color(display-p3 0.141 0.004 0.796/0.287);--violet-a8:color(display-p3 0.133 0.004 0.753/0.397);--violet-a9:color(display-p3 0.114 0 0.675/0.659);--violet-a10:color(display-p3 0.11 0 0.627/0.695);--violet-a11:color(display-p3 0.383 0.317 0.702);--violet-a12:color(display-p3 0.179 0.15 0.359)}}}.dark,.dark-theme{--violet-a1:#4422ff0f;--violet-a2:#853ff916;--violet-a3:#8354fe36;--violet-a4:#7d51fd50;--violet-a5:#845ffd5f;--violet-a6:#8f6cfd6d;--violet-a7:#9879ff83;--violet-a8:#977dfea8;--violet-a9:#8668ffcc;--violet-a10:#9176fed7;--violet-a11:#baa7ff;--violet-a12:#e3deff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--violet-a1:color(display-p3 0.282 0.141 0.996/0.055);--violet-a2:color(display-p3 0.51 0.263 1/0.08);--violet-a3:color(display-p3 0.494 0.337 0.996/0.202);--violet-a4:color(display-p3 0.49 0.345 1/0.299);--violet-a5:color(display-p3 0.525 0.392 1/0.353);--violet-a6:color(display-p3 0.569 0.455 1/0.408);--violet-a7:color(display-p3 0.588 0.494 1/0.496);--violet-a8:color(display-p3 0.596 0.51 1/0.631);--violet-a9:color(display-p3 0.522 0.424 1/0.769);--violet-a10:color(display-p3 0.576 0.482 1/0.811);--violet-a11:color(display-p3 0.72 0.65 1);--violet-a12:color(display-p3 0.883 0.867 0.986)}}}.light,.light-theme,:root{--iris-1:#fdfdff;--iris-2:#f8f8ff;--iris-3:#f0f1fe;--iris-4:#e6e7ff;--iris-5:#dadcff;--iris-6:#cbcdff;--iris-7:#b8baf8;--iris-8:#9b9ef0;--iris-9:#5b5bd6;--iris-10:#5151cd;--iris-11:#5753c6;--iris-12:#272962}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--iris-1:color(display-p3 0.992 0.992 0.999);--iris-2:color(display-p3 0.972 0.973 0.998);--iris-3:color(display-p3 0.943 0.945 0.992);--iris-4:color(display-p3 0.902 0.906 1);--iris-5:color(display-p3 0.857 0.861 1);--iris-6:color(display-p3 0.799 0.805 0.987);--iris-7:color(display-p3 0.721 0.727 0.955);--iris-8:color(display-p3 0.61 0.619 0.918);--iris-9:color(display-p3 0.357 0.357 0.81);--iris-10:color(display-p3 0.318 0.318 0.774);--iris-11:color(display-p3 0.337 0.326 0.748);--iris-12:color(display-p3 0.154 0.161 0.371)}}}.dark,.dark-theme{--iris-1:#13131e;--iris-2:#171625;--iris-3:#202248;--iris-4:#262a65;--iris-5:#303374;--iris-6:#3d3e82;--iris-7:#4a4a95;--iris-8:#5958b1;--iris-9:#5b5bd6;--iris-10:#6e6ade;--iris-11:#b1a9ff;--iris-12:#e0dffe}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--iris-1:color(display-p3 0.075 0.075 0.114);--iris-2:color(display-p3 0.089 0.086 0.14);--iris-3:color(display-p3 0.128 0.134 0.272);--iris-4:color(display-p3 0.153 0.165 0.382);--iris-5:color(display-p3 0.192 0.201 0.44);--iris-6:color(display-p3 0.239 0.241 0.491);--iris-7:color(display-p3 0.291 0.289 0.565);--iris-8:color(display-p3 0.35 0.345 0.673);--iris-9:color(display-p3 0.357 0.357 0.81);--iris-10:color(display-p3 0.428 0.416 0.843);--iris-11:color(display-p3 0.685 0.662 1);--iris-12:color(display-p3 0.878 0.875 0.986)}}}.light,.light-theme,:root{--iris-a1:#0000ff02;--iris-a2:#0000ff07;--iris-a3:#0011ee0f;--iris-a4:#000bff19;--iris-a5:#000eff25;--iris-a6:#000aff34;--iris-a7:#0008e647;--iris-a8:#0008d964;--iris-a9:#0000c0a4;--iris-a10:#0000b6ae;--iris-a11:#0600abac;--iris-a12:#000246d8}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--iris-a1:color(display-p3 0.02 0.02 1/0.008);--iris-a2:color(display-p3 0.024 0.024 0.863/0.028);--iris-a3:color(display-p3 0.004 0.071 0.871/0.059);--iris-a4:color(display-p3 0.012 0.051 1/0.099);--iris-a5:color(display-p3 0.008 0.035 1/0.142);--iris-a6:color(display-p3 0 0.02 0.941/0.2);--iris-a7:color(display-p3 0.004 0.02 0.847/0.279);--iris-a8:color(display-p3 0.004 0.024 0.788/0.389);--iris-a9:color(display-p3 0 0 0.706/0.644);--iris-a10:color(display-p3 0 0 0.667/0.683);--iris-a11:color(display-p3 0.337 0.326 0.748);--iris-a12:color(display-p3 0.154 0.161 0.371)}}}.dark,.dark-theme{--iris-a1:#3636fe0e;--iris-a2:#564bf916;--iris-a3:#525bff3b;--iris-a4:#4d58ff5a;--iris-a5:#5b62fd6b;--iris-a6:#6d6ffd7a;--iris-a7:#7777fe8e;--iris-a8:#7b7afeac;--iris-a9:#6a6afed4;--iris-a10:#7d79ffdc;--iris-a11:#b1a9ff;--iris-a12:#e1e0ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--iris-a1:color(display-p3 0.224 0.224 0.992/0.051);--iris-a2:color(display-p3 0.361 0.314 1/0.08);--iris-a3:color(display-p3 0.357 0.373 1/0.219);--iris-a4:color(display-p3 0.325 0.361 1/0.337);--iris-a5:color(display-p3 0.38 0.4 1/0.4);--iris-a6:color(display-p3 0.447 0.447 1/0.454);--iris-a7:color(display-p3 0.486 0.486 1/0.534);--iris-a8:color(display-p3 0.502 0.494 1/0.652);--iris-a9:color(display-p3 0.431 0.431 1/0.799);--iris-a10:color(display-p3 0.502 0.486 1/0.832);--iris-a11:color(display-p3 0.685 0.662 1);--iris-a12:color(display-p3 0.878 0.875 0.986)}}}.light,.light-theme,:root{--indigo-1:#fdfdfe;--indigo-2:#f7f9ff;--indigo-3:#edf2fe;--indigo-4:#e1e9ff;--indigo-5:#d2deff;--indigo-6:#c1d0ff;--indigo-7:#abbdf9;--indigo-8:#8da4ef;--indigo-9:#3e63dd;--indigo-10:#3358d4;--indigo-11:#3a5bc7;--indigo-12:#1f2d5c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--indigo-1:color(display-p3 0.992 0.992 0.996);--indigo-2:color(display-p3 0.971 0.977 0.998);--indigo-3:color(display-p3 0.933 0.948 0.992);--indigo-4:color(display-p3 0.885 0.914 1);--indigo-5:color(display-p3 0.831 0.87 1);--indigo-6:color(display-p3 0.767 0.814 0.995);--indigo-7:color(display-p3 0.685 0.74 0.957);--indigo-8:color(display-p3 0.569 0.639 0.916);--indigo-9:color(display-p3 0.276 0.384 0.837);--indigo-10:color(display-p3 0.234 0.343 0.801);--indigo-11:color(display-p3 0.256 0.354 0.755);--indigo-12:color(display-p3 0.133 0.175 0.348)}}}.dark,.dark-theme{--indigo-1:#11131f;--indigo-2:#141726;--indigo-3:#182449;--indigo-4:#1d2e62;--indigo-5:#253974;--indigo-6:#304384;--indigo-7:#3a4f97;--indigo-8:#435db1;--indigo-9:#3e63dd;--indigo-10:#5472e4;--indigo-11:#9eb1ff;--indigo-12:#d6e1ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--indigo-1:color(display-p3 0.068 0.074 0.118);--indigo-2:color(display-p3 0.081 0.089 0.144);--indigo-3:color(display-p3 0.105 0.141 0.275);--indigo-4:color(display-p3 0.129 0.18 0.369);--indigo-5:color(display-p3 0.163 0.22 0.439);--indigo-6:color(display-p3 0.203 0.262 0.5);--indigo-7:color(display-p3 0.245 0.309 0.575);--indigo-8:color(display-p3 0.285 0.362 0.674);--indigo-9:color(display-p3 0.276 0.384 0.837);--indigo-10:color(display-p3 0.354 0.445 0.866);--indigo-11:color(display-p3 0.63 0.69 1);--indigo-12:color(display-p3 0.848 0.881 0.99)}}}.light,.light-theme,:root{--indigo-a1:#00008002;--indigo-a2:#0040ff08;--indigo-a3:#0047f112;--indigo-a4:#0044ff1e;--indigo-a5:#0044ff2d;--indigo-a6:#003eff3e;--indigo-a7:#0037ed54;--indigo-a8:#0034dc72;--indigo-a9:#0031d2c1;--indigo-a10:#002ec9cc;--indigo-a11:#002bb7c5;--indigo-a12:#001046e0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--indigo-a1:color(display-p3 0.02 0.02 0.51/0.008);--indigo-a2:color(display-p3 0.024 0.161 0.863/0.028);--indigo-a3:color(display-p3 0.008 0.239 0.886/0.067);--indigo-a4:color(display-p3 0.004 0.247 1/0.114);--indigo-a5:color(display-p3 0.004 0.235 1/0.169);--indigo-a6:color(display-p3 0.004 0.208 0.984/0.232);--indigo-a7:color(display-p3 0.004 0.176 0.863/0.314);--indigo-a8:color(display-p3 0.004 0.165 0.812/0.432);--indigo-a9:color(display-p3 0 0.153 0.773/0.726);--indigo-a10:color(display-p3 0 0.137 0.737/0.765);--indigo-a11:color(display-p3 0.256 0.354 0.755);--indigo-a12:color(display-p3 0.133 0.175 0.348)}}}.dark,.dark-theme{--indigo-a1:#1133ff0f;--indigo-a2:#3354fa17;--indigo-a3:#2f62ff3c;--indigo-a4:#3566ff57;--indigo-a5:#4171fd6b;--indigo-a6:#5178fd7c;--indigo-a7:#5a7fff90;--indigo-a8:#5b81feac;--indigo-a9:#4671ffdb;--indigo-a10:#5c7efee3;--indigo-a11:#9eb1ff;--indigo-a12:#d6e1ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--indigo-a1:color(display-p3 0.071 0.212 0.996/0.055);--indigo-a2:color(display-p3 0.251 0.345 0.988/0.085);--indigo-a3:color(display-p3 0.243 0.404 1/0.223);--indigo-a4:color(display-p3 0.263 0.42 1/0.324);--indigo-a5:color(display-p3 0.314 0.451 1/0.4);--indigo-a6:color(display-p3 0.361 0.49 1/0.467);--indigo-a7:color(display-p3 0.388 0.51 1/0.547);--indigo-a8:color(display-p3 0.404 0.518 1/0.652);--indigo-a9:color(display-p3 0.318 0.451 1/0.824);--indigo-a10:color(display-p3 0.404 0.506 1/0.858);--indigo-a11:color(display-p3 0.63 0.69 1);--indigo-a12:color(display-p3 0.848 0.881 0.99)}}}.light,.light-theme,:root{--blue-1:#fbfdff;--blue-2:#f4faff;--blue-3:#e6f4fe;--blue-4:#d5efff;--blue-5:#c2e5ff;--blue-6:#acd8fc;--blue-7:#8ec8f6;--blue-8:#5eb1ef;--blue-9:#0090ff;--blue-10:#0588f0;--blue-11:#0d74ce;--blue-12:#113264}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--blue-1:color(display-p3 0.986 0.992 0.999);--blue-2:color(display-p3 0.96 0.979 0.998);--blue-3:color(display-p3 0.912 0.956 0.991);--blue-4:color(display-p3 0.853 0.932 1);--blue-5:color(display-p3 0.788 0.894 0.998);--blue-6:color(display-p3 0.709 0.843 0.976);--blue-7:color(display-p3 0.606 0.777 0.947);--blue-8:color(display-p3 0.451 0.688 0.917);--blue-9:color(display-p3 0.247 0.556 0.969);--blue-10:color(display-p3 0.234 0.523 0.912);--blue-11:color(display-p3 0.15 0.44 0.84);--blue-12:color(display-p3 0.102 0.193 0.379)}}}.dark,.dark-theme{--blue-1:#0d1520;--blue-2:#111927;--blue-3:#0d2847;--blue-4:#003362;--blue-5:#004074;--blue-6:#104d87;--blue-7:#205d9e;--blue-8:#2870bd;--blue-9:#0090ff;--blue-10:#3b9eff;--blue-11:#70b8ff;--blue-12:#c2e6ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--blue-1:color(display-p3 0.057 0.081 0.122);--blue-2:color(display-p3 0.072 0.098 0.147);--blue-3:color(display-p3 0.078 0.154 0.27);--blue-4:color(display-p3 0.033 0.197 0.37);--blue-5:color(display-p3 0.08 0.245 0.441);--blue-6:color(display-p3 0.14 0.298 0.511);--blue-7:color(display-p3 0.195 0.361 0.6);--blue-8:color(display-p3 0.239 0.434 0.72);--blue-9:color(display-p3 0.247 0.556 0.969);--blue-10:color(display-p3 0.344 0.612 0.973);--blue-11:color(display-p3 0.49 0.72 1);--blue-12:color(display-p3 0.788 0.898 0.99)}}}.light,.light-theme,:root{--blue-a1:#0080ff04;--blue-a2:#008cff0b;--blue-a3:#008ff519;--blue-a4:#009eff2a;--blue-a5:#0093ff3d;--blue-a6:#0088f653;--blue-a7:#0083eb71;--blue-a8:#0084e6a1;--blue-a9:#0090ff;--blue-a10:#0086f0fa;--blue-a11:#006dcbf2;--blue-a12:#002359ee}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--blue-a1:color(display-p3 0.024 0.514 1/0.016);--blue-a2:color(display-p3 0.024 0.514 0.906/0.04);--blue-a3:color(display-p3 0.012 0.506 0.914/0.087);--blue-a4:color(display-p3 0.008 0.545 1/0.146);--blue-a5:color(display-p3 0.004 0.502 0.984/0.212);--blue-a6:color(display-p3 0.004 0.463 0.922/0.291);--blue-a7:color(display-p3 0.004 0.431 0.863/0.393);--blue-a8:color(display-p3 0 0.427 0.851/0.55);--blue-a9:color(display-p3 0 0.412 0.961/0.753);--blue-a10:color(display-p3 0 0.376 0.886/0.765);--blue-a11:color(display-p3 0.15 0.44 0.84);--blue-a12:color(display-p3 0.102 0.193 0.379)}}}.dark,.dark-theme{--blue-a1:#004df211;--blue-a2:#1166fb18;--blue-a3:#0077ff3a;--blue-a4:#0075ff57;--blue-a5:#0081fd6b;--blue-a6:#0f89fd7f;--blue-a7:#2a91fe98;--blue-a8:#3094feb9;--blue-a9:#0090ff;--blue-a10:#3b9eff;--blue-a11:#70b8ff;--blue-a12:#c2e6ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--blue-a1:color(display-p3 0 0.333 1/0.059);--blue-a2:color(display-p3 0.114 0.435 0.988/0.085);--blue-a3:color(display-p3 0.122 0.463 1/0.219);--blue-a4:color(display-p3 0 0.467 1/0.324);--blue-a5:color(display-p3 0.098 0.51 1/0.4);--blue-a6:color(display-p3 0.224 0.557 1/0.475);--blue-a7:color(display-p3 0.294 0.584 1/0.572);--blue-a8:color(display-p3 0.314 0.592 1/0.702);--blue-a9:color(display-p3 0.251 0.573 0.996/0.967);--blue-a10:color(display-p3 0.357 0.631 1/0.971);--blue-a11:color(display-p3 0.49 0.72 1);--blue-a12:color(display-p3 0.788 0.898 0.99)}}}.light,.light-theme,:root{--cyan-1:#fafdfe;--cyan-2:#f2fafb;--cyan-3:#def7f9;--cyan-4:#caf1f6;--cyan-5:#b5e9f0;--cyan-6:#9ddde7;--cyan-7:#7dcedc;--cyan-8:#3db9cf;--cyan-9:#00a2c7;--cyan-10:#0797b9;--cyan-11:#107d98;--cyan-12:#0d3c48}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--cyan-1:color(display-p3 0.982 0.992 0.996);--cyan-2:color(display-p3 0.955 0.981 0.984);--cyan-3:color(display-p3 0.888 0.965 0.975);--cyan-4:color(display-p3 0.821 0.941 0.959);--cyan-5:color(display-p3 0.751 0.907 0.935);--cyan-6:color(display-p3 0.671 0.862 0.9);--cyan-7:color(display-p3 0.564 0.8 0.854);--cyan-8:color(display-p3 0.388 0.715 0.798);--cyan-9:color(display-p3 0.282 0.627 0.765);--cyan-10:color(display-p3 0.264 0.583 0.71);--cyan-11:color(display-p3 0.08 0.48 0.63);--cyan-12:color(display-p3 0.108 0.232 0.277)}}}.dark,.dark-theme{--cyan-1:#0b161a;--cyan-2:#101b20;--cyan-3:#082c36;--cyan-4:#003848;--cyan-5:#004558;--cyan-6:#045468;--cyan-7:#12677e;--cyan-8:#11809c;--cyan-9:#00a2c7;--cyan-10:#23afd0;--cyan-11:#4ccce6;--cyan-12:#b6ecf7}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--cyan-1:color(display-p3 0.053 0.085 0.098);--cyan-2:color(display-p3 0.072 0.105 0.122);--cyan-3:color(display-p3 0.073 0.168 0.209);--cyan-4:color(display-p3 0.063 0.216 0.277);--cyan-5:color(display-p3 0.091 0.267 0.336);--cyan-6:color(display-p3 0.137 0.324 0.4);--cyan-7:color(display-p3 0.186 0.398 0.484);--cyan-8:color(display-p3 0.23 0.496 0.6);--cyan-9:color(display-p3 0.282 0.627 0.765);--cyan-10:color(display-p3 0.331 0.675 0.801);--cyan-11:color(display-p3 0.446 0.79 0.887);--cyan-12:color(display-p3 0.757 0.919 0.962)}}}.light,.light-theme,:root{--cyan-a1:#0099cc05;--cyan-a2:#009db10d;--cyan-a3:#00c2d121;--cyan-a4:#00bcd435;--cyan-a5:#01b4cc4a;--cyan-a6:#00a7c162;--cyan-a7:#009fbb82;--cyan-a8:#00a3c0c2;--cyan-a9:#00a2c7;--cyan-a10:#0094b7f8;--cyan-a11:#007491ef;--cyan-a12:#00323ef2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--cyan-a1:color(display-p3 0.02 0.608 0.804/0.02);--cyan-a2:color(display-p3 0.02 0.557 0.647/0.044);--cyan-a3:color(display-p3 0.004 0.694 0.796/0.114);--cyan-a4:color(display-p3 0.004 0.678 0.784/0.181);--cyan-a5:color(display-p3 0.004 0.624 0.733/0.248);--cyan-a6:color(display-p3 0.004 0.584 0.706/0.33);--cyan-a7:color(display-p3 0.004 0.541 0.667/0.436);--cyan-a8:color(display-p3 0 0.533 0.667/0.612);--cyan-a9:color(display-p3 0 0.482 0.675/0.718);--cyan-a10:color(display-p3 0 0.435 0.608/0.738);--cyan-a11:color(display-p3 0.08 0.48 0.63);--cyan-a12:color(display-p3 0.108 0.232 0.277)}}}.dark,.dark-theme{--cyan-a1:#0091f70a;--cyan-a2:#02a7f211;--cyan-a3:#00befd28;--cyan-a4:#00baff3b;--cyan-a5:#00befd4d;--cyan-a6:#00c7fd5e;--cyan-a7:#14cdff75;--cyan-a8:#11cfff95;--cyan-a9:#00cfffc3;--cyan-a10:#28d6ffcd;--cyan-a11:#52e1fee5;--cyan-a12:#bbf3fef7}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--cyan-a1:color(display-p3 0 0.647 0.992/0.034);--cyan-a2:color(display-p3 0.133 0.733 1/0.059);--cyan-a3:color(display-p3 0.122 0.741 0.996/0.152);--cyan-a4:color(display-p3 0.051 0.725 1/0.227);--cyan-a5:color(display-p3 0.149 0.757 1/0.29);--cyan-a6:color(display-p3 0.267 0.792 1/0.358);--cyan-a7:color(display-p3 0.333 0.808 1/0.446);--cyan-a8:color(display-p3 0.357 0.816 1/0.572);--cyan-a9:color(display-p3 0.357 0.82 1/0.748);--cyan-a10:color(display-p3 0.4 0.839 1/0.786);--cyan-a11:color(display-p3 0.446 0.79 0.887);--cyan-a12:color(display-p3 0.757 0.919 0.962)}}}.light,.light-theme,:root{--teal-1:#fafefd;--teal-2:#f3fbf9;--teal-3:#e0f8f3;--teal-4:#ccf3ea;--teal-5:#b8eae0;--teal-6:#a1ded2;--teal-7:#83cdc1;--teal-8:#53b9ab;--teal-9:#12a594;--teal-10:#0d9b8a;--teal-11:#008573;--teal-12:#0d3d38}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--teal-1:color(display-p3 0.983 0.996 0.992);--teal-2:color(display-p3 0.958 0.983 0.976);--teal-3:color(display-p3 0.895 0.971 0.952);--teal-4:color(display-p3 0.831 0.949 0.92);--teal-5:color(display-p3 0.761 0.914 0.878);--teal-6:color(display-p3 0.682 0.864 0.825);--teal-7:color(display-p3 0.581 0.798 0.756);--teal-8:color(display-p3 0.433 0.716 0.671);--teal-9:color(display-p3 0.297 0.637 0.581);--teal-10:color(display-p3 0.275 0.599 0.542);--teal-11:color(display-p3 0.08 0.5 0.43);--teal-12:color(display-p3 0.11 0.235 0.219)}}}.dark,.dark-theme{--teal-1:#0d1514;--teal-2:#111c1b;--teal-3:#0d2d2a;--teal-4:#023b37;--teal-5:#084843;--teal-6:#145750;--teal-7:#1c6961;--teal-8:#207e73;--teal-9:#12a594;--teal-10:#0eb39e;--teal-11:#0bd8b6;--teal-12:#adf0dd}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--teal-1:color(display-p3 0.059 0.083 0.079);--teal-2:color(display-p3 0.075 0.11 0.107);--teal-3:color(display-p3 0.087 0.175 0.165);--teal-4:color(display-p3 0.087 0.227 0.214);--teal-5:color(display-p3 0.12 0.277 0.261);--teal-6:color(display-p3 0.162 0.335 0.314);--teal-7:color(display-p3 0.205 0.406 0.379);--teal-8:color(display-p3 0.245 0.489 0.453);--teal-9:color(display-p3 0.297 0.637 0.581);--teal-10:color(display-p3 0.319 0.69 0.62);--teal-11:color(display-p3 0.388 0.835 0.719);--teal-12:color(display-p3 0.734 0.934 0.87)}}}.light,.light-theme,:root{--teal-a1:#00cc9905;--teal-a2:#00aa800c;--teal-a3:#00c69d1f;--teal-a4:#00c39633;--teal-a5:#00b49047;--teal-a6:#00a6855e;--teal-a7:#0099807c;--teal-a8:#009783ac;--teal-a9:#009e8ced;--teal-a10:#009684f2;--teal-a11:#008573;--teal-a12:#00332df2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--teal-a1:color(display-p3 0.024 0.757 0.514/0.016);--teal-a2:color(display-p3 0.02 0.647 0.467/0.044);--teal-a3:color(display-p3 0.004 0.741 0.557/0.106);--teal-a4:color(display-p3 0.004 0.702 0.537/0.169);--teal-a5:color(display-p3 0.004 0.643 0.494/0.24);--teal-a6:color(display-p3 0.004 0.569 0.447/0.318);--teal-a7:color(display-p3 0.004 0.518 0.424/0.42);--teal-a8:color(display-p3 0 0.506 0.424/0.569);--teal-a9:color(display-p3 0 0.482 0.404/0.702);--teal-a10:color(display-p3 0 0.451 0.369/0.726);--teal-a11:color(display-p3 0.08 0.5 0.43);--teal-a12:color(display-p3 0.11 0.235 0.219)}}}.dark,.dark-theme{--teal-a1:#00deab05;--teal-a2:#12fbe60c;--teal-a3:#00ffe61e;--teal-a4:#00ffe92d;--teal-a5:#00ffea3b;--teal-a6:#1cffe84b;--teal-a7:#2efde85f;--teal-a8:#32ffe775;--teal-a9:#13ffe49f;--teal-a10:#0dffe0ae;--teal-a11:#0afed5d6;--teal-a12:#b8ffebef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--teal-a1:color(display-p3 0 0.992 0.761/0.017);--teal-a2:color(display-p3 0.235 0.988 0.902/0.047);--teal-a3:color(display-p3 0.235 1 0.898/0.118);--teal-a4:color(display-p3 0.18 0.996 0.929/0.173);--teal-a5:color(display-p3 0.31 1 0.933/0.227);--teal-a6:color(display-p3 0.396 1 0.933/0.286);--teal-a7:color(display-p3 0.443 1 0.925/0.366);--teal-a8:color(display-p3 0.459 1 0.925/0.454);--teal-a9:color(display-p3 0.443 0.996 0.906/0.61);--teal-a10:color(display-p3 0.439 0.996 0.89/0.669);--teal-a11:color(display-p3 0.388 0.835 0.719);--teal-a12:color(display-p3 0.734 0.934 0.87)}}}.light,.light-theme,:root{--jade-1:#fbfefd;--jade-2:#f4fbf7;--jade-3:#e6f7ed;--jade-4:#d6f1e3;--jade-5:#c3e9d7;--jade-6:#acdec8;--jade-7:#8bceb6;--jade-8:#56ba9f;--jade-9:#29a383;--jade-10:#26997b;--jade-11:#208368;--jade-12:#1d3b31}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--jade-1:color(display-p3 0.986 0.996 0.992);--jade-2:color(display-p3 0.962 0.983 0.969);--jade-3:color(display-p3 0.912 0.965 0.932);--jade-4:color(display-p3 0.858 0.941 0.893);--jade-5:color(display-p3 0.795 0.909 0.847);--jade-6:color(display-p3 0.715 0.864 0.791);--jade-7:color(display-p3 0.603 0.802 0.718);--jade-8:color(display-p3 0.44 0.72 0.629);--jade-9:color(display-p3 0.319 0.63 0.521);--jade-10:color(display-p3 0.299 0.592 0.488);--jade-11:color(display-p3 0.15 0.5 0.37);--jade-12:color(display-p3 0.142 0.229 0.194)}}}.dark,.dark-theme{--jade-1:#0d1512;--jade-2:#121c18;--jade-3:#0f2e22;--jade-4:#0b3b2c;--jade-5:#114837;--jade-6:#1b5745;--jade-7:#246854;--jade-8:#2a7e68;--jade-9:#29a383;--jade-10:#27b08b;--jade-11:#1fd8a4;--jade-12:#adf0d4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--jade-1:color(display-p3 0.059 0.083 0.071);--jade-2:color(display-p3 0.078 0.11 0.094);--jade-3:color(display-p3 0.091 0.176 0.138);--jade-4:color(display-p3 0.102 0.228 0.177);--jade-5:color(display-p3 0.133 0.279 0.221);--jade-6:color(display-p3 0.174 0.334 0.273);--jade-7:color(display-p3 0.219 0.402 0.335);--jade-8:color(display-p3 0.263 0.488 0.411);--jade-9:color(display-p3 0.319 0.63 0.521);--jade-10:color(display-p3 0.338 0.68 0.555);--jade-11:color(display-p3 0.4 0.835 0.656);--jade-12:color(display-p3 0.734 0.934 0.838)}}}.light,.light-theme,:root{--jade-a1:#00c08004;--jade-a2:#00a3460b;--jade-a3:#00ae4819;--jade-a4:#00a85129;--jade-a5:#00a2553c;--jade-a6:#009a5753;--jade-a7:#00945f74;--jade-a8:#00976ea9;--jade-a9:#00916bd6;--jade-a10:#008764d9;--jade-a11:#007152df;--jade-a12:#002217e2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--jade-a1:color(display-p3 0.024 0.757 0.514/0.016);--jade-a2:color(display-p3 0.024 0.612 0.22/0.04);--jade-a3:color(display-p3 0.012 0.596 0.235/0.087);--jade-a4:color(display-p3 0.008 0.588 0.255/0.142);--jade-a5:color(display-p3 0.004 0.561 0.251/0.204);--jade-a6:color(display-p3 0.004 0.525 0.278/0.287);--jade-a7:color(display-p3 0.004 0.506 0.29/0.397);--jade-a8:color(display-p3 0 0.506 0.337/0.561);--jade-a9:color(display-p3 0 0.459 0.298/0.683);--jade-a10:color(display-p3 0 0.42 0.271/0.702);--jade-a11:color(display-p3 0.15 0.5 0.37);--jade-a12:color(display-p3 0.142 0.229 0.194)}}}.dark,.dark-theme{--jade-a1:#00de4505;--jade-a2:#27fba60c;--jade-a3:#02f99920;--jade-a4:#00ffaa2d;--jade-a5:#11ffb63b;--jade-a6:#34ffc24b;--jade-a7:#45fdc75e;--jade-a8:#48ffcf75;--jade-a9:#38feca9d;--jade-a10:#31fec7ab;--jade-a11:#21fec0d6;--jade-a12:#b8ffe1ef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--jade-a1:color(display-p3 0 0.992 0.298/0.017);--jade-a2:color(display-p3 0.318 0.988 0.651/0.047);--jade-a3:color(display-p3 0.267 1 0.667/0.118);--jade-a4:color(display-p3 0.275 0.996 0.702/0.173);--jade-a5:color(display-p3 0.361 1 0.741/0.227);--jade-a6:color(display-p3 0.439 1 0.796/0.286);--jade-a7:color(display-p3 0.49 1 0.804/0.362);--jade-a8:color(display-p3 0.506 1 0.835/0.45);--jade-a9:color(display-p3 0.478 0.996 0.816/0.606);--jade-a10:color(display-p3 0.478 1 0.816/0.656);--jade-a11:color(display-p3 0.4 0.835 0.656);--jade-a12:color(display-p3 0.734 0.934 0.838)}}}.light,.light-theme,:root{--green-1:#fbfefc;--green-2:#f4fbf6;--green-3:#e6f6eb;--green-4:#d6f1df;--green-5:#c4e8d1;--green-6:#adddc0;--green-7:#8eceaa;--green-8:#5bb98b;--green-9:#30a46c;--green-10:#2b9a66;--green-11:#218358;--green-12:#193b2d}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--green-1:color(display-p3 0.986 0.996 0.989);--green-2:color(display-p3 0.963 0.983 0.967);--green-3:color(display-p3 0.913 0.964 0.925);--green-4:color(display-p3 0.859 0.94 0.879);--green-5:color(display-p3 0.796 0.907 0.826);--green-6:color(display-p3 0.718 0.863 0.761);--green-7:color(display-p3 0.61 0.801 0.675);--green-8:color(display-p3 0.451 0.715 0.559);--green-9:color(display-p3 0.332 0.634 0.442);--green-10:color(display-p3 0.308 0.595 0.417);--green-11:color(display-p3 0.19 0.5 0.32);--green-12:color(display-p3 0.132 0.228 0.18)}}}.dark,.dark-theme{--green-1:#0e1512;--green-2:#121b17;--green-3:#132d21;--green-4:#113b29;--green-5:#174933;--green-6:#20573e;--green-7:#28684a;--green-8:#2f7c57;--green-9:#30a46c;--green-10:#33b074;--green-11:#3dd68c;--green-12:#b1f1cb}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--green-1:color(display-p3 0.062 0.083 0.071);--green-2:color(display-p3 0.079 0.106 0.09);--green-3:color(display-p3 0.1 0.173 0.133);--green-4:color(display-p3 0.115 0.229 0.166);--green-5:color(display-p3 0.147 0.282 0.206);--green-6:color(display-p3 0.185 0.338 0.25);--green-7:color(display-p3 0.227 0.403 0.298);--green-8:color(display-p3 0.27 0.479 0.351);--green-9:color(display-p3 0.332 0.634 0.442);--green-10:color(display-p3 0.357 0.682 0.474);--green-11:color(display-p3 0.434 0.828 0.573);--green-12:color(display-p3 0.747 0.938 0.807)}}}.light,.light-theme,:root{--green-a1:#00c04004;--green-a2:#00a32f0b;--green-a3:#00a43319;--green-a4:#00a83829;--green-a5:#019c393b;--green-a6:#00963c52;--green-a7:#00914071;--green-a8:#00924ba4;--green-a9:#008f4acf;--green-a10:#008647d4;--green-a11:#00713fde;--green-a12:#002616e6}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--green-a1:color(display-p3 0.024 0.757 0.267/0.016);--green-a2:color(display-p3 0.024 0.565 0.129/0.036);--green-a3:color(display-p3 0.012 0.596 0.145/0.087);--green-a4:color(display-p3 0.008 0.588 0.145/0.142);--green-a5:color(display-p3 0.004 0.541 0.157/0.204);--green-a6:color(display-p3 0.004 0.518 0.157/0.283);--green-a7:color(display-p3 0.004 0.486 0.165/0.389);--green-a8:color(display-p3 0 0.478 0.2/0.55);--green-a9:color(display-p3 0 0.455 0.165/0.667);--green-a10:color(display-p3 0 0.416 0.153/0.691);--green-a11:color(display-p3 0.19 0.5 0.32);--green-a12:color(display-p3 0.132 0.228 0.18)}}}.dark,.dark-theme{--green-a1:#00de4505;--green-a2:#29f99d0b;--green-a3:#22ff991e;--green-a4:#11ff992d;--green-a5:#2bffa23c;--green-a6:#44ffaa4b;--green-a7:#50fdac5e;--green-a8:#54ffad73;--green-a9:#44ffa49e;--green-a10:#43fea4ab;--green-a11:#46fea5d4;--green-a12:#bbffd7f0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--green-a1:color(display-p3 0 0.992 0.298/0.017);--green-a2:color(display-p3 0.341 0.98 0.616/0.043);--green-a3:color(display-p3 0.376 0.996 0.655/0.114);--green-a4:color(display-p3 0.341 0.996 0.635/0.173);--green-a5:color(display-p3 0.408 1 0.678/0.232);--green-a6:color(display-p3 0.475 1 0.706/0.29);--green-a7:color(display-p3 0.514 1 0.706/0.362);--green-a8:color(display-p3 0.529 1 0.718/0.442);--green-a9:color(display-p3 0.502 0.996 0.682/0.61);--green-a10:color(display-p3 0.506 1 0.682/0.66);--green-a11:color(display-p3 0.434 0.828 0.573);--green-a12:color(display-p3 0.747 0.938 0.807)}}}.light,.light-theme,:root{--grass-1:#fbfefb;--grass-2:#f5fbf5;--grass-3:#e9f6e9;--grass-4:#daf1db;--grass-5:#c9e8ca;--grass-6:#b2ddb5;--grass-7:#94ce9a;--grass-8:#65ba74;--grass-9:#46a758;--grass-10:#3e9b4f;--grass-11:#2a7e3b;--grass-12:#203c25}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--grass-1:color(display-p3 0.986 0.996 0.985);--grass-2:color(display-p3 0.966 0.983 0.964);--grass-3:color(display-p3 0.923 0.965 0.917);--grass-4:color(display-p3 0.872 0.94 0.865);--grass-5:color(display-p3 0.811 0.908 0.802);--grass-6:color(display-p3 0.733 0.864 0.724);--grass-7:color(display-p3 0.628 0.803 0.622);--grass-8:color(display-p3 0.477 0.72 0.482);--grass-9:color(display-p3 0.38 0.647 0.378);--grass-10:color(display-p3 0.344 0.598 0.342);--grass-11:color(display-p3 0.263 0.488 0.261);--grass-12:color(display-p3 0.151 0.233 0.153)}}}.dark,.dark-theme{--grass-1:#0e1511;--grass-2:#141a15;--grass-3:#1b2a1e;--grass-4:#1d3a24;--grass-5:#25482d;--grass-6:#2d5736;--grass-7:#366740;--grass-8:#3e7949;--grass-9:#46a758;--grass-10:#53b365;--grass-11:#71d083;--grass-12:#c2f0c2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--grass-1:color(display-p3 0.062 0.083 0.067);--grass-2:color(display-p3 0.083 0.103 0.085);--grass-3:color(display-p3 0.118 0.163 0.122);--grass-4:color(display-p3 0.142 0.225 0.15);--grass-5:color(display-p3 0.178 0.279 0.186);--grass-6:color(display-p3 0.217 0.337 0.224);--grass-7:color(display-p3 0.258 0.4 0.264);--grass-8:color(display-p3 0.302 0.47 0.305);--grass-9:color(display-p3 0.38 0.647 0.378);--grass-10:color(display-p3 0.426 0.694 0.426);--grass-11:color(display-p3 0.535 0.807 0.542);--grass-12:color(display-p3 0.797 0.936 0.776)}}}.light,.light-theme,:root{--grass-a1:#00c00004;--grass-a2:#0099000a;--grass-a3:#00970016;--grass-a4:#009f0725;--grass-a5:#00930536;--grass-a6:#008f0a4d;--grass-a7:#018b0f6b;--grass-a8:#008d199a;--grass-a9:#008619b9;--grass-a10:#007b17c1;--grass-a11:#006514d5;--grass-a12:#002006df}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--grass-a1:color(display-p3 0.024 0.757 0.024/0.016);--grass-a2:color(display-p3 0.024 0.565 0.024/0.036);--grass-a3:color(display-p3 0.059 0.576 0.008/0.083);--grass-a4:color(display-p3 0.035 0.565 0.008/0.134);--grass-a5:color(display-p3 0.047 0.545 0.008/0.197);--grass-a6:color(display-p3 0.031 0.502 0.004/0.275);--grass-a7:color(display-p3 0.012 0.482 0.004/0.377);--grass-a8:color(display-p3 0 0.467 0.008/0.522);--grass-a9:color(display-p3 0.008 0.435 0/0.624);--grass-a10:color(display-p3 0.008 0.388 0/0.659);--grass-a11:color(display-p3 0.263 0.488 0.261);--grass-a12:color(display-p3 0.151 0.233 0.153)}}}.dark,.dark-theme{--grass-a1:#00de1205;--grass-a2:#5ef7780a;--grass-a3:#70fe8c1b;--grass-a4:#57ff802c;--grass-a5:#68ff8b3b;--grass-a6:#71ff8f4b;--grass-a7:#77fd925d;--grass-a8:#77fd9070;--grass-a9:#65ff82a1;--grass-a10:#72ff8dae;--grass-a11:#89ff9fcd;--grass-a12:#ceffceef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--grass-a1:color(display-p3 0 0.992 0.071/0.017);--grass-a2:color(display-p3 0.482 0.996 0.584/0.038);--grass-a3:color(display-p3 0.549 0.992 0.588/0.106);--grass-a4:color(display-p3 0.51 0.996 0.557/0.169);--grass-a5:color(display-p3 0.553 1 0.588/0.227);--grass-a6:color(display-p3 0.584 1 0.608/0.29);--grass-a7:color(display-p3 0.604 1 0.616/0.358);--grass-a8:color(display-p3 0.608 1 0.62/0.433);--grass-a9:color(display-p3 0.573 1 0.569/0.622);--grass-a10:color(display-p3 0.6 0.996 0.6/0.673);--grass-a11:color(display-p3 0.535 0.807 0.542);--grass-a12:color(display-p3 0.797 0.936 0.776)}}}.light,.light-theme,:root{--orange-1:#fefcfb;--orange-2:#fff7ed;--orange-3:#ffefd6;--orange-4:#ffdfb5;--orange-5:#ffd19a;--orange-6:#ffc182;--orange-7:#f5ae73;--orange-8:#ec9455;--orange-9:#f76b15;--orange-10:#ef5f00;--orange-11:#cc4e00;--orange-12:#582d1d}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--orange-1:color(display-p3 0.995 0.988 0.985);--orange-2:color(display-p3 0.994 0.968 0.934);--orange-3:color(display-p3 0.989 0.938 0.85);--orange-4:color(display-p3 1 0.874 0.687);--orange-5:color(display-p3 1 0.821 0.583);--orange-6:color(display-p3 0.975 0.767 0.545);--orange-7:color(display-p3 0.919 0.693 0.486);--orange-8:color(display-p3 0.877 0.597 0.379);--orange-9:color(display-p3 0.9 0.45 0.2);--orange-10:color(display-p3 0.87 0.409 0.164);--orange-11:color(display-p3 0.76 0.34 0);--orange-12:color(display-p3 0.323 0.185 0.127)}}}.dark,.dark-theme{--orange-1:#17120e;--orange-2:#1e160f;--orange-3:#331e0b;--orange-4:#462100;--orange-5:#562800;--orange-6:#66350c;--orange-7:#7e451d;--orange-8:#a35829;--orange-9:#f76b15;--orange-10:#ff801f;--orange-11:#ffa057;--orange-12:#ffe0c2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--orange-1:color(display-p3 0.088 0.07 0.057);--orange-2:color(display-p3 0.113 0.089 0.061);--orange-3:color(display-p3 0.189 0.12 0.056);--orange-4:color(display-p3 0.262 0.132 0);--orange-5:color(display-p3 0.315 0.168 0.016);--orange-6:color(display-p3 0.376 0.219 0.088);--orange-7:color(display-p3 0.465 0.283 0.147);--orange-8:color(display-p3 0.601 0.359 0.201);--orange-9:color(display-p3 0.9 0.45 0.2);--orange-10:color(display-p3 0.98 0.51 0.23);--orange-11:color(display-p3 1 0.63 0.38);--orange-12:color(display-p3 0.98 0.883 0.775)}}}.light,.light-theme,:root{--orange-a1:#c0400004;--orange-a2:#ff8e0012;--orange-a3:#ff9c0029;--orange-a4:#ff91014a;--orange-a5:#ff8b0065;--orange-a6:#ff81007d;--orange-a7:#ed6c008c;--orange-a8:#e35f00aa;--orange-a9:#f65e00ea;--orange-a10:#ef5f00;--orange-a11:#cc4e00;--orange-a12:#431200e2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--orange-a1:color(display-p3 0.757 0.267 0.024/0.016);--orange-a2:color(display-p3 0.886 0.533 0.008/0.067);--orange-a3:color(display-p3 0.922 0.584 0.008/0.15);--orange-a4:color(display-p3 1 0.604 0.004/0.314);--orange-a5:color(display-p3 1 0.569 0.004/0.416);--orange-a6:color(display-p3 0.949 0.494 0.004/0.455);--orange-a7:color(display-p3 0.839 0.408 0/0.514);--orange-a8:color(display-p3 0.804 0.349 0/0.62);--orange-a9:color(display-p3 0.878 0.314 0/0.8);--orange-a10:color(display-p3 0.843 0.29 0/0.836);--orange-a11:color(display-p3 0.76 0.34 0);--orange-a12:color(display-p3 0.323 0.185 0.127)}}}.dark,.dark-theme{--orange-a1:#ec360007;--orange-a2:#fe6d000e;--orange-a3:#fb6a0025;--orange-a4:#ff590039;--orange-a5:#ff61004a;--orange-a6:#fd75045c;--orange-a7:#ff832c75;--orange-a8:#fe84389d;--orange-a9:#fe6d15f7;--orange-a10:#ff801f;--orange-a11:#ffa057;--orange-a12:#ffe0c2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--orange-a1:color(display-p3 0.961 0.247 0/0.022);--orange-a2:color(display-p3 0.992 0.529 0/0.051);--orange-a3:color(display-p3 0.996 0.486 0/0.131);--orange-a4:color(display-p3 0.996 0.384 0/0.211);--orange-a5:color(display-p3 1 0.455 0/0.265);--orange-a6:color(display-p3 1 0.529 0.129/0.332);--orange-a7:color(display-p3 1 0.569 0.251/0.429);--orange-a8:color(display-p3 1 0.584 0.302/0.572);--orange-a9:color(display-p3 1 0.494 0.216/0.895);--orange-a10:color(display-p3 1 0.522 0.235/0.979);--orange-a11:color(display-p3 1 0.63 0.38);--orange-a12:color(display-p3 0.98 0.883 0.775)}}}.light,.light-theme,:root{--brown-1:#fefdfc;--brown-2:#fcf9f6;--brown-3:#f6eee7;--brown-4:#f0e4d9;--brown-5:#ebdaca;--brown-6:#e4cdb7;--brown-7:#dcbc9f;--brown-8:#cea37e;--brown-9:#ad7f58;--brown-10:#a07553;--brown-11:#815e46;--brown-12:#3e332e}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--brown-1:color(display-p3 0.995 0.992 0.989);--brown-2:color(display-p3 0.987 0.976 0.964);--brown-3:color(display-p3 0.959 0.936 0.909);--brown-4:color(display-p3 0.934 0.897 0.855);--brown-5:color(display-p3 0.909 0.856 0.798);--brown-6:color(display-p3 0.88 0.808 0.73);--brown-7:color(display-p3 0.841 0.742 0.639);--brown-8:color(display-p3 0.782 0.647 0.514);--brown-9:color(display-p3 0.651 0.505 0.368);--brown-10:color(display-p3 0.601 0.465 0.344);--brown-11:color(display-p3 0.485 0.374 0.288);--brown-12:color(display-p3 0.236 0.202 0.183)}}}.dark,.dark-theme{--brown-1:#12110f;--brown-2:#1c1816;--brown-3:#28211d;--brown-4:#322922;--brown-5:#3e3128;--brown-6:#4d3c2f;--brown-7:#614a39;--brown-8:#7c5f46;--brown-9:#ad7f58;--brown-10:#b88c67;--brown-11:#dbb594;--brown-12:#f2e1ca}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--brown-1:color(display-p3 0.071 0.067 0.059);--brown-2:color(display-p3 0.107 0.095 0.087);--brown-3:color(display-p3 0.151 0.13 0.115);--brown-4:color(display-p3 0.191 0.161 0.138);--brown-5:color(display-p3 0.235 0.194 0.162);--brown-6:color(display-p3 0.291 0.237 0.192);--brown-7:color(display-p3 0.365 0.295 0.232);--brown-8:color(display-p3 0.469 0.377 0.287);--brown-9:color(display-p3 0.651 0.505 0.368);--brown-10:color(display-p3 0.697 0.557 0.423);--brown-11:color(display-p3 0.835 0.715 0.597);--brown-12:color(display-p3 0.938 0.885 0.802)}}}.light,.light-theme,:root{--brown-a1:#aa550003;--brown-a2:#aa550009;--brown-a3:#a04b0018;--brown-a4:#9b4a0026;--brown-a5:#9f4d0035;--brown-a6:#a04e0048;--brown-a7:#a34e0060;--brown-a8:#9f4a0081;--brown-a9:#823c00a7;--brown-a10:#723300ac;--brown-a11:#522100b9;--brown-a12:#140600d1}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--brown-a1:color(display-p3 0.675 0.349 0.024/0.012);--brown-a2:color(display-p3 0.675 0.349 0.024/0.036);--brown-a3:color(display-p3 0.573 0.314 0.012/0.091);--brown-a4:color(display-p3 0.545 0.302 0.008/0.146);--brown-a5:color(display-p3 0.561 0.29 0.004/0.204);--brown-a6:color(display-p3 0.553 0.294 0.004/0.271);--brown-a7:color(display-p3 0.557 0.286 0.004/0.361);--brown-a8:color(display-p3 0.549 0.275 0.004/0.487);--brown-a9:color(display-p3 0.447 0.22 0/0.632);--brown-a10:color(display-p3 0.388 0.188 0/0.655);--brown-a11:color(display-p3 0.485 0.374 0.288);--brown-a12:color(display-p3 0.236 0.202 0.183)}}}.dark,.dark-theme{--brown-a1:#91110002;--brown-a2:#fba67c0c;--brown-a3:#fcb58c19;--brown-a4:#fbbb8a24;--brown-a5:#fcb88931;--brown-a6:#fdba8741;--brown-a7:#ffbb8856;--brown-a8:#ffbe8773;--brown-a9:#feb87da8;--brown-a10:#ffc18cb3;--brown-a11:#fed1aad9;--brown-a12:#feecd4f2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--brown-a1:color(display-p3 0.855 0.071 0/0.005);--brown-a2:color(display-p3 0.98 0.706 0.525/0.043);--brown-a3:color(display-p3 0.996 0.745 0.576/0.093);--brown-a4:color(display-p3 1 0.765 0.592/0.135);--brown-a5:color(display-p3 1 0.761 0.588/0.181);--brown-a6:color(display-p3 1 0.773 0.592/0.24);--brown-a7:color(display-p3 0.996 0.776 0.58/0.32);--brown-a8:color(display-p3 1 0.78 0.573/0.433);--brown-a9:color(display-p3 1 0.769 0.549/0.627);--brown-a10:color(display-p3 1 0.792 0.596/0.677);--brown-a11:color(display-p3 0.835 0.715 0.597);--brown-a12:color(display-p3 0.938 0.885 0.802)}}}.light,.light-theme,:root{--sky-1:#f9feff;--sky-2:#f1fafd;--sky-3:#e1f6fd;--sky-4:#d1f0fa;--sky-5:#bee7f5;--sky-6:#a9daed;--sky-7:#8dcae3;--sky-8:#60b3d7;--sky-9:#7ce2fe;--sky-10:#74daf8;--sky-11:#00749e;--sky-12:#1d3e56}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sky-1:color(display-p3 0.98 0.995 0.999);--sky-2:color(display-p3 0.953 0.98 0.99);--sky-3:color(display-p3 0.899 0.963 0.989);--sky-4:color(display-p3 0.842 0.937 0.977);--sky-5:color(display-p3 0.777 0.9 0.954);--sky-6:color(display-p3 0.701 0.851 0.921);--sky-7:color(display-p3 0.604 0.785 0.879);--sky-8:color(display-p3 0.457 0.696 0.829);--sky-9:color(display-p3 0.585 0.877 0.983);--sky-10:color(display-p3 0.555 0.845 0.959);--sky-11:color(display-p3 0.193 0.448 0.605);--sky-12:color(display-p3 0.145 0.241 0.329)}}}.dark,.dark-theme{--sky-1:#0d141f;--sky-2:#111a27;--sky-3:#112840;--sky-4:#113555;--sky-5:#154467;--sky-6:#1b537b;--sky-7:#1f6692;--sky-8:#197cae;--sky-9:#7ce2fe;--sky-10:#a8eeff;--sky-11:#75c7f0;--sky-12:#c2f3ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sky-1:color(display-p3 0.056 0.078 0.116);--sky-2:color(display-p3 0.075 0.101 0.149);--sky-3:color(display-p3 0.089 0.154 0.244);--sky-4:color(display-p3 0.106 0.207 0.323);--sky-5:color(display-p3 0.135 0.261 0.394);--sky-6:color(display-p3 0.17 0.322 0.469);--sky-7:color(display-p3 0.205 0.394 0.557);--sky-8:color(display-p3 0.232 0.48 0.665);--sky-9:color(display-p3 0.585 0.877 0.983);--sky-10:color(display-p3 0.718 0.925 0.991);--sky-11:color(display-p3 0.536 0.772 0.924);--sky-12:color(display-p3 0.799 0.947 0.993)}}}.light,.light-theme,:root{--sky-a1:#00d5ff06;--sky-a2:#00a4db0e;--sky-a3:#00b3ee1e;--sky-a4:#00ace42e;--sky-a5:#00a1d841;--sky-a6:#0092ca56;--sky-a7:#0089c172;--sky-a8:#0085bf9f;--sky-a9:#00c7fe83;--sky-a10:#00bcf38b;--sky-a11:#00749e;--sky-a12:#002540e2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sky-a1:color(display-p3 0.02 0.804 1/0.02);--sky-a2:color(display-p3 0.024 0.592 0.757/0.048);--sky-a3:color(display-p3 0.004 0.655 0.886/0.102);--sky-a4:color(display-p3 0.004 0.604 0.851/0.157);--sky-a5:color(display-p3 0.004 0.565 0.792/0.224);--sky-a6:color(display-p3 0.004 0.502 0.737/0.299);--sky-a7:color(display-p3 0.004 0.459 0.694/0.397);--sky-a8:color(display-p3 0 0.435 0.682/0.542);--sky-a9:color(display-p3 0.004 0.71 0.965/0.416);--sky-a10:color(display-p3 0.004 0.647 0.914/0.444);--sky-a11:color(display-p3 0.193 0.448 0.605);--sky-a12:color(display-p3 0.145 0.241 0.329)}}}.dark,.dark-theme{--sky-a1:#0044ff0f;--sky-a2:#1171fb18;--sky-a3:#1184fc33;--sky-a4:#128fff49;--sky-a5:#1c9dfd5d;--sky-a6:#28a5ff72;--sky-a7:#2badfe8b;--sky-a8:#1db2fea9;--sky-a9:#7ce3ff;--sky-a10:#a8eeff;--sky-a11:#7cd3ffef;--sky-a12:#c2f3ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sky-a1:color(display-p3 0 0.282 0.996/0.055);--sky-a2:color(display-p3 0.157 0.467 0.992/0.089);--sky-a3:color(display-p3 0.192 0.522 0.996/0.19);--sky-a4:color(display-p3 0.212 0.584 1/0.274);--sky-a5:color(display-p3 0.259 0.631 1/0.349);--sky-a6:color(display-p3 0.302 0.655 1/0.433);--sky-a7:color(display-p3 0.329 0.686 1/0.526);--sky-a8:color(display-p3 0.325 0.71 1/0.643);--sky-a9:color(display-p3 0.592 0.894 1/0.984);--sky-a10:color(display-p3 0.722 0.933 1/0.992);--sky-a11:color(display-p3 0.536 0.772 0.924);--sky-a12:color(display-p3 0.799 0.947 0.993)}}}.light,.light-theme,:root{--mint-1:#f9fefd;--mint-2:#f2fbf9;--mint-3:#ddf9f2;--mint-4:#c8f4e9;--mint-5:#b3ecde;--mint-6:#9ce0d0;--mint-7:#7ecfbd;--mint-8:#4cbba5;--mint-9:#86ead4;--mint-10:#7de0cb;--mint-11:#027864;--mint-12:#16433c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--mint-1:color(display-p3 0.98 0.995 0.992);--mint-2:color(display-p3 0.957 0.985 0.977);--mint-3:color(display-p3 0.888 0.972 0.95);--mint-4:color(display-p3 0.819 0.951 0.916);--mint-5:color(display-p3 0.747 0.918 0.873);--mint-6:color(display-p3 0.668 0.87 0.818);--mint-7:color(display-p3 0.567 0.805 0.744);--mint-8:color(display-p3 0.42 0.724 0.649);--mint-9:color(display-p3 0.62 0.908 0.834);--mint-10:color(display-p3 0.585 0.871 0.797);--mint-11:color(display-p3 0.203 0.463 0.397);--mint-12:color(display-p3 0.136 0.259 0.236)}}}.dark,.dark-theme{--mint-1:#0e1515;--mint-2:#0f1b1b;--mint-3:#092c2b;--mint-4:#003a38;--mint-5:#004744;--mint-6:#105650;--mint-7:#1e685f;--mint-8:#277f70;--mint-9:#86ead4;--mint-10:#a8f5e5;--mint-11:#58d5ba;--mint-12:#c4f5e1}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--mint-1:color(display-p3 0.059 0.082 0.081);--mint-2:color(display-p3 0.068 0.104 0.105);--mint-3:color(display-p3 0.077 0.17 0.168);--mint-4:color(display-p3 0.068 0.224 0.22);--mint-5:color(display-p3 0.104 0.275 0.264);--mint-6:color(display-p3 0.154 0.332 0.313);--mint-7:color(display-p3 0.207 0.403 0.373);--mint-8:color(display-p3 0.258 0.49 0.441);--mint-9:color(display-p3 0.62 0.908 0.834);--mint-10:color(display-p3 0.725 0.954 0.898);--mint-11:color(display-p3 0.482 0.825 0.733);--mint-12:color(display-p3 0.807 0.955 0.887)}}}.light,.light-theme,:root{--mint-a1:#00d5aa06;--mint-a2:#00b18a0d;--mint-a3:#00d29e22;--mint-a4:#00cc9937;--mint-a5:#00c0914c;--mint-a6:#00b08663;--mint-a7:#00a17d81;--mint-a8:#009e7fb3;--mint-a9:#00d3a579;--mint-a10:#00c39982;--mint-a11:#007763fd;--mint-a12:#00312ae9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--mint-a1:color(display-p3 0.02 0.804 0.608/0.02);--mint-a2:color(display-p3 0.02 0.647 0.467/0.044);--mint-a3:color(display-p3 0.004 0.761 0.553/0.114);--mint-a4:color(display-p3 0.004 0.741 0.545/0.181);--mint-a5:color(display-p3 0.004 0.678 0.51/0.255);--mint-a6:color(display-p3 0.004 0.616 0.463/0.334);--mint-a7:color(display-p3 0.004 0.549 0.412/0.432);--mint-a8:color(display-p3 0 0.529 0.392/0.581);--mint-a9:color(display-p3 0.004 0.765 0.569/0.381);--mint-a10:color(display-p3 0.004 0.69 0.51/0.416);--mint-a11:color(display-p3 0.203 0.463 0.397);--mint-a12:color(display-p3 0.136 0.259 0.236)}}}.dark,.dark-theme{--mint-a1:#00dede05;--mint-a2:#00f9f90b;--mint-a3:#00fff61d;--mint-a4:#00fff42c;--mint-a5:#00fff23a;--mint-a6:#0effeb4a;--mint-a7:#34fde55e;--mint-a8:#41ffdf76;--mint-a9:#92ffe7e9;--mint-a10:#aefeedf5;--mint-a11:#67ffded2;--mint-a12:#cbfee9f5}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--mint-a1:color(display-p3 0 0.992 0.992/0.017);--mint-a2:color(display-p3 0.071 0.98 0.98/0.043);--mint-a3:color(display-p3 0.176 0.996 0.996/0.11);--mint-a4:color(display-p3 0.071 0.996 0.973/0.169);--mint-a5:color(display-p3 0.243 1 0.949/0.223);--mint-a6:color(display-p3 0.369 1 0.933/0.286);--mint-a7:color(display-p3 0.459 1 0.914/0.362);--mint-a8:color(display-p3 0.49 1 0.89/0.454);--mint-a9:color(display-p3 0.678 0.996 0.914/0.904);--mint-a10:color(display-p3 0.761 1 0.941/0.95);--mint-a11:color(display-p3 0.482 0.825 0.733);--mint-a12:color(display-p3 0.807 0.955 0.887)}}}.light,.light-theme,:root{--lime-1:#fcfdfa;--lime-2:#f8faf3;--lime-3:#eef6d6;--lime-4:#e2f0bd;--lime-5:#d3e7a6;--lime-6:#c2da91;--lime-7:#abc978;--lime-8:#8db654;--lime-9:#bdee63;--lime-10:#b0e64c;--lime-11:#5c7c2f;--lime-12:#37401c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--lime-1:color(display-p3 0.989 0.992 0.981);--lime-2:color(display-p3 0.975 0.98 0.954);--lime-3:color(display-p3 0.939 0.965 0.851);--lime-4:color(display-p3 0.896 0.94 0.76);--lime-5:color(display-p3 0.843 0.903 0.678);--lime-6:color(display-p3 0.778 0.852 0.599);--lime-7:color(display-p3 0.694 0.784 0.508);--lime-8:color(display-p3 0.585 0.707 0.378);--lime-9:color(display-p3 0.78 0.928 0.466);--lime-10:color(display-p3 0.734 0.896 0.397);--lime-11:color(display-p3 0.386 0.482 0.227);--lime-12:color(display-p3 0.222 0.25 0.128)}}}.dark,.dark-theme{--lime-1:#11130c;--lime-2:#151a10;--lime-3:#1f2917;--lime-4:#29371d;--lime-5:#334423;--lime-6:#3d522a;--lime-7:#496231;--lime-8:#577538;--lime-9:#bdee63;--lime-10:#d4ff70;--lime-11:#bde56c;--lime-12:#e3f7ba}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--lime-1:color(display-p3 0.067 0.073 0.048);--lime-2:color(display-p3 0.086 0.1 0.067);--lime-3:color(display-p3 0.13 0.16 0.099);--lime-4:color(display-p3 0.172 0.214 0.126);--lime-5:color(display-p3 0.213 0.266 0.153);--lime-6:color(display-p3 0.257 0.321 0.182);--lime-7:color(display-p3 0.307 0.383 0.215);--lime-8:color(display-p3 0.365 0.456 0.25);--lime-9:color(display-p3 0.78 0.928 0.466);--lime-10:color(display-p3 0.865 0.995 0.519);--lime-11:color(display-p3 0.771 0.893 0.485);--lime-12:color(display-p3 0.905 0.966 0.753)}}}.light,.light-theme,:root{--lime-a1:#66990005;--lime-a2:#6b95000c;--lime-a3:#96c80029;--lime-a4:#8fc60042;--lime-a5:#81bb0059;--lime-a6:#72aa006e;--lime-a7:#61990087;--lime-a8:#559200ab;--lime-a9:#93e4009c;--lime-a10:#8fdc00b3;--lime-a11:#375f00d0;--lime-a12:#1e2900e3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--lime-a1:color(display-p3 0.412 0.608 0.02/0.02);--lime-a2:color(display-p3 0.514 0.592 0.024/0.048);--lime-a3:color(display-p3 0.584 0.765 0.008/0.15);--lime-a4:color(display-p3 0.561 0.757 0.004/0.24);--lime-a5:color(display-p3 0.514 0.698 0.004/0.322);--lime-a6:color(display-p3 0.443 0.627 0/0.4);--lime-a7:color(display-p3 0.376 0.561 0.004/0.491);--lime-a8:color(display-p3 0.333 0.529 0/0.624);--lime-a9:color(display-p3 0.588 0.867 0/0.534);--lime-a10:color(display-p3 0.561 0.827 0/0.604);--lime-a11:color(display-p3 0.386 0.482 0.227);--lime-a12:color(display-p3 0.222 0.25 0.128)}}}.dark,.dark-theme{--lime-a1:#11bb0003;--lime-a2:#78f7000a;--lime-a3:#9bfd4c1a;--lime-a4:#a7fe5c29;--lime-a5:#affe6537;--lime-a6:#b2fe6d46;--lime-a7:#b6ff6f57;--lime-a8:#b6fd6d6c;--lime-a9:#caff69ed;--lime-a10:#d4ff70;--lime-a11:#d1fe77e4;--lime-a12:#e9febff7}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--lime-a1:color(display-p3 0.067 0.941 0/0.009);--lime-a2:color(display-p3 0.584 0.996 0.071/0.038);--lime-a3:color(display-p3 0.69 1 0.38/0.101);--lime-a4:color(display-p3 0.729 1 0.435/0.16);--lime-a5:color(display-p3 0.745 1 0.471/0.215);--lime-a6:color(display-p3 0.769 1 0.482/0.274);--lime-a7:color(display-p3 0.769 1 0.506/0.341);--lime-a8:color(display-p3 0.784 1 0.51/0.416);--lime-a9:color(display-p3 0.839 1 0.502/0.925);--lime-a10:color(display-p3 0.871 1 0.522/0.996);--lime-a11:color(display-p3 0.771 0.893 0.485);--lime-a12:color(display-p3 0.905 0.966 0.753)}}}.light,.light-theme,:root{--yellow-1:#fdfdf9;--yellow-2:#fefce9;--yellow-3:#fffab8;--yellow-4:#fff394;--yellow-5:#ffe770;--yellow-6:#f3d768;--yellow-7:#e4c767;--yellow-8:#d5ae39;--yellow-9:#ffe629;--yellow-10:#ffdc00;--yellow-11:#9e6c00;--yellow-12:#473b1f}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--yellow-1:color(display-p3 0.992 0.992 0.978);--yellow-2:color(display-p3 0.995 0.99 0.922);--yellow-3:color(display-p3 0.997 0.982 0.749);--yellow-4:color(display-p3 0.992 0.953 0.627);--yellow-5:color(display-p3 0.984 0.91 0.51);--yellow-6:color(display-p3 0.934 0.847 0.474);--yellow-7:color(display-p3 0.876 0.785 0.46);--yellow-8:color(display-p3 0.811 0.689 0.313);--yellow-9:color(display-p3 1 0.92 0.22);--yellow-10:color(display-p3 0.977 0.868 0.291);--yellow-11:color(display-p3 0.6 0.44 0);--yellow-12:color(display-p3 0.271 0.233 0.137)}}}.dark,.dark-theme{--yellow-1:#14120b;--yellow-2:#1b180f;--yellow-3:#2d2305;--yellow-4:#362b00;--yellow-5:#433500;--yellow-6:#524202;--yellow-7:#665417;--yellow-8:#836a21;--yellow-9:#ffe629;--yellow-10:#ffff57;--yellow-11:#f5e147;--yellow-12:#f6eeb4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--yellow-1:color(display-p3 0.078 0.069 0.047);--yellow-2:color(display-p3 0.103 0.094 0.063);--yellow-3:color(display-p3 0.168 0.137 0.039);--yellow-4:color(display-p3 0.209 0.169 0);--yellow-5:color(display-p3 0.255 0.209 0);--yellow-6:color(display-p3 0.31 0.261 0.07);--yellow-7:color(display-p3 0.389 0.331 0.135);--yellow-8:color(display-p3 0.497 0.42 0.182);--yellow-9:color(display-p3 1 0.92 0.22);--yellow-10:color(display-p3 1 1 0.456);--yellow-11:color(display-p3 0.948 0.885 0.392);--yellow-12:color(display-p3 0.959 0.934 0.731)}}}.light,.light-theme,:root{--yellow-a1:#aaaa0006;--yellow-a2:#f4dd0016;--yellow-a3:#ffee0047;--yellow-a4:#ffe3016b;--yellow-a5:#ffd5008f;--yellow-a6:#ebbc0097;--yellow-a7:#d2a10098;--yellow-a8:#c99700c6;--yellow-a9:#ffe100d6;--yellow-a10:#ffdc00;--yellow-a11:#9e6c00;--yellow-a12:#2e2000e0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--yellow-a1:color(display-p3 0.675 0.675 0.024/0.024);--yellow-a2:color(display-p3 0.953 0.855 0.008/0.079);--yellow-a3:color(display-p3 0.988 0.925 0.004/0.251);--yellow-a4:color(display-p3 0.98 0.875 0.004/0.373);--yellow-a5:color(display-p3 0.969 0.816 0.004/0.491);--yellow-a6:color(display-p3 0.875 0.71 0/0.526);--yellow-a7:color(display-p3 0.769 0.604 0/0.542);--yellow-a8:color(display-p3 0.725 0.549 0/0.687);--yellow-a9:color(display-p3 1 0.898 0/0.781);--yellow-a10:color(display-p3 0.969 0.812 0/0.71);--yellow-a11:color(display-p3 0.6 0.44 0);--yellow-a12:color(display-p3 0.271 0.233 0.137)}}}.dark,.dark-theme{--yellow-a1:#d1510004;--yellow-a2:#f9b4000b;--yellow-a3:#ffaa001e;--yellow-a4:#fdb70028;--yellow-a5:#febb0036;--yellow-a6:#fec40046;--yellow-a7:#fdcb225c;--yellow-a8:#fdca327b;--yellow-a9:#ffe629;--yellow-a10:#ffff57;--yellow-a11:#fee949f5;--yellow-a12:#fef6baf6}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--yellow-a1:color(display-p3 0.973 0.369 0/0.013);--yellow-a2:color(display-p3 0.996 0.792 0/0.038);--yellow-a3:color(display-p3 0.996 0.71 0/0.11);--yellow-a4:color(display-p3 0.996 0.741 0/0.152);--yellow-a5:color(display-p3 0.996 0.765 0/0.202);--yellow-a6:color(display-p3 0.996 0.816 0.082/0.261);--yellow-a7:color(display-p3 1 0.831 0.263/0.345);--yellow-a8:color(display-p3 1 0.831 0.314/0.463);--yellow-a9:color(display-p3 1 0.922 0.22);--yellow-a10:color(display-p3 1 1 0.455);--yellow-a11:color(display-p3 0.948 0.885 0.392);--yellow-a12:color(display-p3 0.959 0.934 0.731)}}}.light,.light-theme,:root{--amber-1:#fefdfb;--amber-2:#fefbe9;--amber-3:#fff7c2;--amber-4:#ffee9c;--amber-5:#fbe577;--amber-6:#f3d673;--amber-7:#e9c162;--amber-8:#e2a336;--amber-9:#ffc53d;--amber-10:#ffba18;--amber-11:#ab6400;--amber-12:#4f3422}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--amber-1:color(display-p3 0.995 0.992 0.985);--amber-2:color(display-p3 0.994 0.986 0.921);--amber-3:color(display-p3 0.994 0.969 0.782);--amber-4:color(display-p3 0.989 0.937 0.65);--amber-5:color(display-p3 0.97 0.902 0.527);--amber-6:color(display-p3 0.936 0.844 0.506);--amber-7:color(display-p3 0.89 0.762 0.443);--amber-8:color(display-p3 0.85 0.65 0.3);--amber-9:color(display-p3 1 0.77 0.26);--amber-10:color(display-p3 0.959 0.741 0.274);--amber-11:color(display-p3 0.64 0.4 0);--amber-12:color(display-p3 0.294 0.208 0.145)}}}.dark,.dark-theme{--amber-1:#16120c;--amber-2:#1d180f;--amber-3:#302008;--amber-4:#3f2700;--amber-5:#4d3000;--amber-6:#5c3d05;--amber-7:#714f19;--amber-8:#8f6424;--amber-9:#ffc53d;--amber-10:#ffd60a;--amber-11:#ffca16;--amber-12:#ffe7b3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--amber-1:color(display-p3 0.082 0.07 0.05);--amber-2:color(display-p3 0.111 0.094 0.064);--amber-3:color(display-p3 0.178 0.128 0.049);--amber-4:color(display-p3 0.239 0.156 0);--amber-5:color(display-p3 0.29 0.193 0);--amber-6:color(display-p3 0.344 0.245 0.076);--amber-7:color(display-p3 0.422 0.314 0.141);--amber-8:color(display-p3 0.535 0.399 0.189);--amber-9:color(display-p3 1 0.77 0.26);--amber-10:color(display-p3 1 0.87 0.15);--amber-11:color(display-p3 1 0.8 0.29);--amber-12:color(display-p3 0.984 0.909 0.726)}}}.light,.light-theme,:root{--amber-a1:#c0800004;--amber-a2:#f4d10016;--amber-a3:#ffde003d;--amber-a4:#ffd40063;--amber-a5:#f8cf0088;--amber-a6:#eab5008c;--amber-a7:#dc9b009d;--amber-a8:#da8a00c9;--amber-a9:#ffb300c2;--amber-a10:#ffb300e7;--amber-a11:#ab6400;--amber-a12:#341500dd}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--amber-a1:color(display-p3 0.757 0.514 0.024/0.016);--amber-a2:color(display-p3 0.902 0.804 0.008/0.079);--amber-a3:color(display-p3 0.965 0.859 0.004/0.22);--amber-a4:color(display-p3 0.969 0.82 0.004/0.35);--amber-a5:color(display-p3 0.933 0.796 0.004/0.475);--amber-a6:color(display-p3 0.875 0.682 0.004/0.495);--amber-a7:color(display-p3 0.804 0.573 0/0.557);--amber-a8:color(display-p3 0.788 0.502 0/0.699);--amber-a9:color(display-p3 1 0.686 0/0.742);--amber-a10:color(display-p3 0.945 0.643 0/0.726);--amber-a11:color(display-p3 0.64 0.4 0);--amber-a12:color(display-p3 0.294 0.208 0.145)}}}.dark,.dark-theme{--amber-a1:#e63c0006;--amber-a2:#fd9b000d;--amber-a3:#fa820022;--amber-a4:#fc820032;--amber-a5:#fd8b0041;--amber-a6:#fd9b0051;--amber-a7:#ffab2567;--amber-a8:#ffae3587;--amber-a9:#ffc53d;--amber-a10:#ffd60a;--amber-a11:#ffca16;--amber-a12:#ffe7b3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--amber-a1:color(display-p3 0.992 0.298 0/0.017);--amber-a2:color(display-p3 0.988 0.651 0/0.047);--amber-a3:color(display-p3 1 0.6 0/0.118);--amber-a4:color(display-p3 1 0.557 0/0.185);--amber-a5:color(display-p3 1 0.592 0/0.24);--amber-a6:color(display-p3 1 0.659 0.094/0.299);--amber-a7:color(display-p3 1 0.714 0.263/0.383);--amber-a8:color(display-p3 0.996 0.729 0.306/0.5);--amber-a9:color(display-p3 1 0.769 0.259);--amber-a10:color(display-p3 1 0.871 0.149);--amber-a11:color(display-p3 1 0.8 0.29);--amber-a12:color(display-p3 0.984 0.909 0.726)}}}.light,.light-theme,:root{--gold-1:#fdfdfc;--gold-2:#faf9f2;--gold-3:#f2f0e7;--gold-4:#eae6db;--gold-5:#e1dccf;--gold-6:#d8d0bf;--gold-7:#cbc0aa;--gold-8:#b9a88d;--gold-9:#978365;--gold-10:#8c7a5e;--gold-11:#71624b;--gold-12:#3b352b}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--gold-1:color(display-p3 0.992 0.992 0.989);--gold-2:color(display-p3 0.98 0.976 0.953);--gold-3:color(display-p3 0.947 0.94 0.909);--gold-4:color(display-p3 0.914 0.904 0.865);--gold-5:color(display-p3 0.88 0.865 0.816);--gold-6:color(display-p3 0.84 0.818 0.756);--gold-7:color(display-p3 0.788 0.753 0.677);--gold-8:color(display-p3 0.715 0.66 0.565);--gold-9:color(display-p3 0.579 0.517 0.41);--gold-10:color(display-p3 0.538 0.479 0.38);--gold-11:color(display-p3 0.433 0.386 0.305);--gold-12:color(display-p3 0.227 0.209 0.173)}}}.dark,.dark-theme{--gold-1:#121211;--gold-2:#1b1a17;--gold-3:#24231f;--gold-4:#2d2b26;--gold-5:#38352e;--gold-6:#444039;--gold-7:#544f46;--gold-8:#696256;--gold-9:#978365;--gold-10:#a39073;--gold-11:#cbb99f;--gold-12:#e8e2d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--gold-1:color(display-p3 0.071 0.071 0.067);--gold-2:color(display-p3 0.104 0.101 0.09);--gold-3:color(display-p3 0.141 0.136 0.122);--gold-4:color(display-p3 0.177 0.17 0.152);--gold-5:color(display-p3 0.217 0.207 0.185);--gold-6:color(display-p3 0.265 0.252 0.225);--gold-7:color(display-p3 0.327 0.31 0.277);--gold-8:color(display-p3 0.407 0.384 0.342);--gold-9:color(display-p3 0.579 0.517 0.41);--gold-10:color(display-p3 0.628 0.566 0.463);--gold-11:color(display-p3 0.784 0.728 0.635);--gold-12:color(display-p3 0.906 0.887 0.855)}}}.light,.light-theme,:root{--gold-a1:#55550003;--gold-a2:#9d8a000d;--gold-a3:#75600018;--gold-a4:#6b4e0024;--gold-a5:#60460030;--gold-a6:#64440040;--gold-a7:#63420055;--gold-a8:#633d0072;--gold-a9:#5332009a;--gold-a10:#492d00a1;--gold-a11:#362100b4;--gold-a12:#130c00d4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--gold-a1:color(display-p3 0.349 0.349 0.024/0.012);--gold-a2:color(display-p3 0.592 0.514 0.024/0.048);--gold-a3:color(display-p3 0.4 0.357 0.012/0.091);--gold-a4:color(display-p3 0.357 0.298 0.008/0.134);--gold-a5:color(display-p3 0.345 0.282 0.004/0.185);--gold-a6:color(display-p3 0.341 0.263 0.004/0.244);--gold-a7:color(display-p3 0.345 0.235 0.004/0.322);--gold-a8:color(display-p3 0.345 0.22 0.004/0.436);--gold-a9:color(display-p3 0.286 0.18 0/0.589);--gold-a10:color(display-p3 0.255 0.161 0/0.62);--gold-a11:color(display-p3 0.433 0.386 0.305);--gold-a12:color(display-p3 0.227 0.209 0.173)}}}.dark,.dark-theme{--gold-a1:#91911102;--gold-a2:#f9e29d0b;--gold-a3:#f8ecbb15;--gold-a4:#ffeec41e;--gold-a5:#feecc22a;--gold-a6:#feebcb37;--gold-a7:#ffedcd48;--gold-a8:#fdeaca5f;--gold-a9:#ffdba690;--gold-a10:#fedfb09d;--gold-a11:#fee7c6c8;--gold-a12:#fef7ede7}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--gold-a1:color(display-p3 0.855 0.855 0.071/0.005);--gold-a2:color(display-p3 0.98 0.89 0.616/0.043);--gold-a3:color(display-p3 1 0.949 0.753/0.08);--gold-a4:color(display-p3 1 0.933 0.8/0.118);--gold-a5:color(display-p3 1 0.949 0.804/0.16);--gold-a6:color(display-p3 1 0.925 0.8/0.215);--gold-a7:color(display-p3 1 0.945 0.831/0.278);--gold-a8:color(display-p3 1 0.937 0.82/0.366);--gold-a9:color(display-p3 0.996 0.882 0.69/0.551);--gold-a10:color(display-p3 1 0.894 0.725/0.601);--gold-a11:color(display-p3 0.784 0.728 0.635);--gold-a12:color(display-p3 0.906 0.887 0.855)}}}.light,.light-theme,:root{--bronze-1:#fdfcfc;--bronze-2:#fdf7f5;--bronze-3:#f6edea;--bronze-4:#efe4df;--bronze-5:#e7d9d3;--bronze-6:#dfcdc5;--bronze-7:#d3bcb3;--bronze-8:#c2a499;--bronze-9:#a18072;--bronze-10:#957468;--bronze-11:#7d5e54;--bronze-12:#43302b}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--bronze-1:color(display-p3 0.991 0.988 0.988);--bronze-2:color(display-p3 0.989 0.97 0.961);--bronze-3:color(display-p3 0.958 0.932 0.919);--bronze-4:color(display-p3 0.929 0.894 0.877);--bronze-5:color(display-p3 0.898 0.853 0.832);--bronze-6:color(display-p3 0.861 0.805 0.778);--bronze-7:color(display-p3 0.812 0.739 0.706);--bronze-8:color(display-p3 0.741 0.647 0.606);--bronze-9:color(display-p3 0.611 0.507 0.455);--bronze-10:color(display-p3 0.563 0.461 0.414);--bronze-11:color(display-p3 0.471 0.373 0.336);--bronze-12:color(display-p3 0.251 0.191 0.172)}}}.dark,.dark-theme{--bronze-1:#141110;--bronze-2:#1c1917;--bronze-3:#262220;--bronze-4:#302a27;--bronze-5:#3b3330;--bronze-6:#493e3a;--bronze-7:#5a4c47;--bronze-8:#6f5f58;--bronze-9:#a18072;--bronze-10:#ae8c7e;--bronze-11:#d4b3a5;--bronze-12:#ede0d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--bronze-1:color(display-p3 0.076 0.067 0.063);--bronze-2:color(display-p3 0.106 0.097 0.093);--bronze-3:color(display-p3 0.147 0.132 0.125);--bronze-4:color(display-p3 0.185 0.166 0.156);--bronze-5:color(display-p3 0.227 0.202 0.19);--bronze-6:color(display-p3 0.278 0.246 0.23);--bronze-7:color(display-p3 0.343 0.302 0.281);--bronze-8:color(display-p3 0.426 0.374 0.347);--bronze-9:color(display-p3 0.611 0.507 0.455);--bronze-10:color(display-p3 0.66 0.556 0.504);--bronze-11:color(display-p3 0.81 0.707 0.655);--bronze-12:color(display-p3 0.921 0.88 0.854)}}}.light,.light-theme,:root{--bronze-a1:#55000003;--bronze-a2:#cc33000a;--bronze-a3:#92250015;--bronze-a4:#80280020;--bronze-a5:#7423002c;--bronze-a6:#7324003a;--bronze-a7:#6c1f004c;--bronze-a8:#671c0066;--bronze-a9:#551a008d;--bronze-a10:#4c150097;--bronze-a11:#3d0f00ab;--bronze-a12:#1d0600d4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--bronze-a1:color(display-p3 0.349 0.024 0.024/0.012);--bronze-a2:color(display-p3 0.71 0.22 0.024/0.04);--bronze-a3:color(display-p3 0.482 0.2 0.008/0.083);--bronze-a4:color(display-p3 0.424 0.133 0.004/0.122);--bronze-a5:color(display-p3 0.4 0.145 0.004/0.169);--bronze-a6:color(display-p3 0.388 0.125 0.004/0.224);--bronze-a7:color(display-p3 0.365 0.11 0.004/0.295);--bronze-a8:color(display-p3 0.341 0.102 0.004/0.393);--bronze-a9:color(display-p3 0.29 0.094 0/0.546);--bronze-a10:color(display-p3 0.255 0.082 0/0.585);--bronze-a11:color(display-p3 0.471 0.373 0.336);--bronze-a12:color(display-p3 0.251 0.191 0.172)}}}.dark,.dark-theme{--bronze-a1:#d1110004;--bronze-a2:#fbbc910c;--bronze-a3:#faceb817;--bronze-a4:#facdb622;--bronze-a5:#ffd2c12d;--bronze-a6:#ffd1c03c;--bronze-a7:#fdd0c04f;--bronze-a8:#ffd6c565;--bronze-a9:#fec7b09b;--bronze-a10:#fecab5a9;--bronze-a11:#ffd7c6d1;--bronze-a12:#fff1e9ec}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--bronze-a1:color(display-p3 0.941 0.067 0/0.009);--bronze-a2:color(display-p3 0.98 0.8 0.706/0.043);--bronze-a3:color(display-p3 0.988 0.851 0.761/0.085);--bronze-a4:color(display-p3 0.996 0.839 0.78/0.127);--bronze-a5:color(display-p3 0.996 0.863 0.773/0.173);--bronze-a6:color(display-p3 1 0.863 0.796/0.227);--bronze-a7:color(display-p3 1 0.867 0.8/0.295);--bronze-a8:color(display-p3 1 0.859 0.788/0.387);--bronze-a9:color(display-p3 1 0.82 0.733/0.585);--bronze-a10:color(display-p3 1 0.839 0.761/0.635);--bronze-a11:color(display-p3 0.81 0.707 0.655);--bronze-a12:color(display-p3 0.921 0.88 0.854)}}}.light,.light-theme,:root{--gray-1:#fcfcfc;--gray-2:#f9f9f9;--gray-3:#f0f0f0;--gray-4:#e8e8e8;--gray-5:#e0e0e0;--gray-6:#d9d9d9;--gray-7:#cecece;--gray-8:#bbb;--gray-9:#8d8d8d;--gray-10:#838383;--gray-11:#646464;--gray-12:#202020}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--gray-1:color(display-p3 0.988 0.988 0.988);--gray-2:color(display-p3 0.975 0.975 0.975);--gray-3:color(display-p3 0.939 0.939 0.939);--gray-4:color(display-p3 0.908 0.908 0.908);--gray-5:color(display-p3 0.88 0.88 0.88);--gray-6:color(display-p3 0.849 0.849 0.849);--gray-7:color(display-p3 0.807 0.807 0.807);--gray-8:color(display-p3 0.732 0.732 0.732);--gray-9:color(display-p3 0.553 0.553 0.553);--gray-10:color(display-p3 0.512 0.512 0.512);--gray-11:color(display-p3 0.392 0.392 0.392);--gray-12:color(display-p3 0.125 0.125 0.125)}}}.dark,.dark-theme{--gray-1:#111;--gray-2:#191919;--gray-3:#222;--gray-4:#2a2a2a;--gray-5:#313131;--gray-6:#3a3a3a;--gray-7:#484848;--gray-8:#606060;--gray-9:#6e6e6e;--gray-10:#7b7b7b;--gray-11:#b4b4b4;--gray-12:#eee}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--gray-1:color(display-p3 0.067 0.067 0.067);--gray-2:color(display-p3 0.098 0.098 0.098);--gray-3:color(display-p3 0.135 0.135 0.135);--gray-4:color(display-p3 0.163 0.163 0.163);--gray-5:color(display-p3 0.192 0.192 0.192);--gray-6:color(display-p3 0.228 0.228 0.228);--gray-7:color(display-p3 0.283 0.283 0.283);--gray-8:color(display-p3 0.375 0.375 0.375);--gray-9:color(display-p3 0.431 0.431 0.431);--gray-10:color(display-p3 0.484 0.484 0.484);--gray-11:color(display-p3 0.706 0.706 0.706);--gray-12:color(display-p3 0.933 0.933 0.933)}}}.light,.light-theme,:root{--gray-a1:#00000003;--gray-a2:#00000006;--gray-a3:#0000000f;--gray-a4:#00000017;--gray-a5:#0000001f;--gray-a6:#00000026;--gray-a7:#00000031;--gray-a8:#00000044;--gray-a9:#00000072;--gray-a10:#0000007c;--gray-a11:#0000009b;--gray-a12:#000000df}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--gray-a1:color(display-p3 0 0 0/0.012);--gray-a2:color(display-p3 0 0 0/0.024);--gray-a3:color(display-p3 0 0 0/0.063);--gray-a4:color(display-p3 0 0 0/0.09);--gray-a5:color(display-p3 0 0 0/0.122);--gray-a6:color(display-p3 0 0 0/0.153);--gray-a7:color(display-p3 0 0 0/0.192);--gray-a8:color(display-p3 0 0 0/0.267);--gray-a9:color(display-p3 0 0 0/0.447);--gray-a10:color(display-p3 0 0 0/0.486);--gray-a11:color(display-p3 0 0 0/0.608);--gray-a12:color(display-p3 0 0 0/0.875)}}}.dark,.dark-theme{--gray-a1:#00000000;--gray-a2:#ffffff09;--gray-a3:#ffffff12;--gray-a4:#ffffff1b;--gray-a5:#ffffff22;--gray-a6:#ffffff2c;--gray-a7:#ffffff3b;--gray-a8:#ffffff55;--gray-a9:#ffffff64;--gray-a10:#ffffff72;--gray-a11:#ffffffaf;--gray-a12:#ffffffed}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--gray-a1:color(display-p3 0 0 0/0);--gray-a2:color(display-p3 1 1 1/0.034);--gray-a3:color(display-p3 1 1 1/0.071);--gray-a4:color(display-p3 1 1 1/0.105);--gray-a5:color(display-p3 1 1 1/0.134);--gray-a6:color(display-p3 1 1 1/0.172);--gray-a7:color(display-p3 1 1 1/0.231);--gray-a8:color(display-p3 1 1 1/0.332);--gray-a9:color(display-p3 1 1 1/0.391);--gray-a10:color(display-p3 1 1 1/0.445);--gray-a11:color(display-p3 1 1 1/0.685);--gray-a12:color(display-p3 1 1 1/0.929)}}}.light,.light-theme,:root{--mauve-1:#fdfcfd;--mauve-2:#faf9fb;--mauve-3:#f2eff3;--mauve-4:#eae7ec;--mauve-5:#e3dfe6;--mauve-6:#dbd8e0;--mauve-7:#d0cdd7;--mauve-8:#bcbac7;--mauve-9:#8e8c99;--mauve-10:#84828e;--mauve-11:#65636d;--mauve-12:#211f26}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--mauve-1:color(display-p3 0.991 0.988 0.992);--mauve-2:color(display-p3 0.98 0.976 0.984);--mauve-3:color(display-p3 0.946 0.938 0.952);--mauve-4:color(display-p3 0.915 0.906 0.925);--mauve-5:color(display-p3 0.886 0.876 0.901);--mauve-6:color(display-p3 0.856 0.846 0.875);--mauve-7:color(display-p3 0.814 0.804 0.84);--mauve-8:color(display-p3 0.735 0.728 0.777);--mauve-9:color(display-p3 0.555 0.549 0.596);--mauve-10:color(display-p3 0.514 0.508 0.552);--mauve-11:color(display-p3 0.395 0.388 0.424);--mauve-12:color(display-p3 0.128 0.122 0.147)}}}.dark,.dark-theme{--mauve-1:#121113;--mauve-2:#1a191b;--mauve-3:#232225;--mauve-4:#2b292d;--mauve-5:#323035;--mauve-6:#3c393f;--mauve-7:#49474e;--mauve-8:#625f69;--mauve-9:#6f6d78;--mauve-10:#7c7a85;--mauve-11:#b5b2bc;--mauve-12:#eeeef0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--mauve-1:color(display-p3 0.07 0.067 0.074);--mauve-2:color(display-p3 0.101 0.098 0.105);--mauve-3:color(display-p3 0.138 0.134 0.144);--mauve-4:color(display-p3 0.167 0.161 0.175);--mauve-5:color(display-p3 0.196 0.189 0.206);--mauve-6:color(display-p3 0.232 0.225 0.245);--mauve-7:color(display-p3 0.286 0.277 0.302);--mauve-8:color(display-p3 0.383 0.373 0.408);--mauve-9:color(display-p3 0.434 0.428 0.467);--mauve-10:color(display-p3 0.487 0.48 0.519);--mauve-11:color(display-p3 0.707 0.7 0.735);--mauve-12:color(display-p3 0.933 0.933 0.94)}}}.light,.light-theme,:root{--mauve-a1:#55005503;--mauve-a2:#2b005506;--mauve-a3:#30004010;--mauve-a4:#20003618;--mauve-a5:#20003820;--mauve-a6:#14003527;--mauve-a7:#10003332;--mauve-a8:#08003145;--mauve-a9:#05001d73;--mauve-a10:#0500197d;--mauve-a11:#0400119c;--mauve-a12:#020008e0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--mauve-a1:color(display-p3 0.349 0.024 0.349/0.012);--mauve-a2:color(display-p3 0.184 0.024 0.349/0.024);--mauve-a3:color(display-p3 0.129 0.008 0.255/0.063);--mauve-a4:color(display-p3 0.094 0.012 0.216/0.095);--mauve-a5:color(display-p3 0.098 0.008 0.224/0.126);--mauve-a6:color(display-p3 0.055 0.004 0.18/0.153);--mauve-a7:color(display-p3 0.067 0.008 0.184/0.197);--mauve-a8:color(display-p3 0.02 0.004 0.176/0.271);--mauve-a9:color(display-p3 0.02 0.004 0.106/0.451);--mauve-a10:color(display-p3 0.012 0.004 0.09/0.491);--mauve-a11:color(display-p3 0.016 0 0.059/0.612);--mauve-a12:color(display-p3 0.008 0 0.027/0.879)}}}.dark,.dark-theme{--mauve-a1:#00000000;--mauve-a2:#f5f4f609;--mauve-a3:#ebeaf814;--mauve-a4:#eee5f81d;--mauve-a5:#efe6fe25;--mauve-a6:#f1e6fd30;--mauve-a7:#eee9ff40;--mauve-a8:#eee7ff5d;--mauve-a9:#eae6fd6e;--mauve-a10:#ece9fd7c;--mauve-a11:#f5f1ffb7;--mauve-a12:#fdfdffef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--mauve-a1:color(display-p3 0 0 0/0);--mauve-a2:color(display-p3 0.996 0.992 1/0.034);--mauve-a3:color(display-p3 0.937 0.933 0.992/0.077);--mauve-a4:color(display-p3 0.957 0.918 0.996/0.111);--mauve-a5:color(display-p3 0.937 0.906 0.996/0.145);--mauve-a6:color(display-p3 0.953 0.925 0.996/0.183);--mauve-a7:color(display-p3 0.945 0.929 1/0.246);--mauve-a8:color(display-p3 0.937 0.918 1/0.361);--mauve-a9:color(display-p3 0.933 0.918 1/0.424);--mauve-a10:color(display-p3 0.941 0.925 1/0.479);--mauve-a11:color(display-p3 0.965 0.961 1/0.712);--mauve-a12:color(display-p3 0.992 0.992 1/0.937)}}}.light,.light-theme,:root{--slate-1:#fcfcfd;--slate-2:#f9f9fb;--slate-3:#f0f0f3;--slate-4:#e8e8ec;--slate-5:#e0e1e6;--slate-6:#d9d9e0;--slate-7:#cdced6;--slate-8:#b9bbc6;--slate-9:#8b8d98;--slate-10:#80838d;--slate-11:#60646c;--slate-12:#1c2024}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--slate-1:color(display-p3 0.988 0.988 0.992);--slate-2:color(display-p3 0.976 0.976 0.984);--slate-3:color(display-p3 0.94 0.941 0.953);--slate-4:color(display-p3 0.908 0.909 0.925);--slate-5:color(display-p3 0.88 0.881 0.901);--slate-6:color(display-p3 0.85 0.852 0.876);--slate-7:color(display-p3 0.805 0.808 0.838);--slate-8:color(display-p3 0.727 0.733 0.773);--slate-9:color(display-p3 0.547 0.553 0.592);--slate-10:color(display-p3 0.503 0.512 0.549);--slate-11:color(display-p3 0.379 0.392 0.421);--slate-12:color(display-p3 0.113 0.125 0.14)}}}.dark,.dark-theme{--slate-1:#111113;--slate-2:#18191b;--slate-3:#212225;--slate-4:#272a2d;--slate-5:#2e3135;--slate-6:#363a3f;--slate-7:#43484e;--slate-8:#5a6169;--slate-9:#696e77;--slate-10:#777b84;--slate-11:#b0b4ba;--slate-12:#edeef0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--slate-1:color(display-p3 0.067 0.067 0.074);--slate-2:color(display-p3 0.095 0.098 0.105);--slate-3:color(display-p3 0.13 0.135 0.145);--slate-4:color(display-p3 0.156 0.163 0.176);--slate-5:color(display-p3 0.183 0.191 0.206);--slate-6:color(display-p3 0.215 0.226 0.244);--slate-7:color(display-p3 0.265 0.28 0.302);--slate-8:color(display-p3 0.357 0.381 0.409);--slate-9:color(display-p3 0.415 0.431 0.463);--slate-10:color(display-p3 0.469 0.483 0.514);--slate-11:color(display-p3 0.692 0.704 0.728);--slate-12:color(display-p3 0.93 0.933 0.94)}}}.light,.light-theme,:root{--slate-a1:#00005503;--slate-a2:#00005506;--slate-a3:#0000330f;--slate-a4:#00002d17;--slate-a5:#0009321f;--slate-a6:#00002f26;--slate-a7:#00062e32;--slate-a8:#00083046;--slate-a9:#00051d74;--slate-a10:#00071b7f;--slate-a11:#0007149f;--slate-a12:#000509e3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--slate-a1:color(display-p3 0.024 0.024 0.349/0.012);--slate-a2:color(display-p3 0.024 0.024 0.349/0.024);--slate-a3:color(display-p3 0.004 0.004 0.204/0.059);--slate-a4:color(display-p3 0.012 0.012 0.184/0.091);--slate-a5:color(display-p3 0.004 0.039 0.2/0.122);--slate-a6:color(display-p3 0.008 0.008 0.165/0.15);--slate-a7:color(display-p3 0.008 0.027 0.184/0.197);--slate-a8:color(display-p3 0.004 0.031 0.176/0.275);--slate-a9:color(display-p3 0.004 0.02 0.106/0.455);--slate-a10:color(display-p3 0.004 0.027 0.098/0.499);--slate-a11:color(display-p3 0 0.02 0.063/0.62);--slate-a12:color(display-p3 0 0.012 0.031/0.887)}}}.dark,.dark-theme{--slate-a1:#00000000;--slate-a2:#d8f4f609;--slate-a3:#ddeaf814;--slate-a4:#d3edf81d;--slate-a5:#d9edfe25;--slate-a6:#d6ebfd30;--slate-a7:#d9edff40;--slate-a8:#d9edff5d;--slate-a9:#dfebfd6d;--slate-a10:#e5edfd7b;--slate-a11:#f1f7feb5;--slate-a12:#fcfdffef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--slate-a1:color(display-p3 0 0 0/0);--slate-a2:color(display-p3 0.875 0.992 1/0.034);--slate-a3:color(display-p3 0.882 0.933 0.992/0.077);--slate-a4:color(display-p3 0.882 0.953 0.996/0.111);--slate-a5:color(display-p3 0.878 0.929 0.996/0.145);--slate-a6:color(display-p3 0.882 0.949 0.996/0.183);--slate-a7:color(display-p3 0.882 0.929 1/0.246);--slate-a8:color(display-p3 0.871 0.937 1/0.361);--slate-a9:color(display-p3 0.898 0.937 1/0.42);--slate-a10:color(display-p3 0.918 0.945 1/0.475);--slate-a11:color(display-p3 0.949 0.969 0.996/0.708);--slate-a12:color(display-p3 0.988 0.992 1/0.937)}}}.light,.light-theme,:root{--sage-1:#fbfdfc;--sage-2:#f7f9f8;--sage-3:#eef1f0;--sage-4:#e6e9e8;--sage-5:#dfe2e0;--sage-6:#d7dad9;--sage-7:#cbcfcd;--sage-8:#b8bcba;--sage-9:#868e8b;--sage-10:#7c8481;--sage-11:#5f6563;--sage-12:#1a211e}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sage-1:color(display-p3 0.986 0.992 0.988);--sage-2:color(display-p3 0.97 0.977 0.974);--sage-3:color(display-p3 0.935 0.944 0.94);--sage-4:color(display-p3 0.904 0.913 0.909);--sage-5:color(display-p3 0.875 0.885 0.88);--sage-6:color(display-p3 0.844 0.854 0.849);--sage-7:color(display-p3 0.8 0.811 0.806);--sage-8:color(display-p3 0.725 0.738 0.732);--sage-9:color(display-p3 0.531 0.556 0.546);--sage-10:color(display-p3 0.492 0.515 0.506);--sage-11:color(display-p3 0.377 0.395 0.389);--sage-12:color(display-p3 0.107 0.129 0.118)}}}.dark,.dark-theme{--sage-1:#101211;--sage-2:#171918;--sage-3:#202221;--sage-4:#272a29;--sage-5:#2e3130;--sage-6:#373b39;--sage-7:#444947;--sage-8:#5b625f;--sage-9:#63706b;--sage-10:#717d79;--sage-11:#adb5b2;--sage-12:#eceeed}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sage-1:color(display-p3 0.064 0.07 0.067);--sage-2:color(display-p3 0.092 0.098 0.094);--sage-3:color(display-p3 0.128 0.135 0.131);--sage-4:color(display-p3 0.155 0.164 0.159);--sage-5:color(display-p3 0.183 0.193 0.188);--sage-6:color(display-p3 0.218 0.23 0.224);--sage-7:color(display-p3 0.269 0.285 0.277);--sage-8:color(display-p3 0.362 0.382 0.373);--sage-9:color(display-p3 0.398 0.438 0.421);--sage-10:color(display-p3 0.453 0.49 0.474);--sage-11:color(display-p3 0.685 0.709 0.697);--sage-12:color(display-p3 0.927 0.933 0.93)}}}.light,.light-theme,:root{--sage-a1:#00804004;--sage-a2:#00402008;--sage-a3:#002d1e11;--sage-a4:#001f1519;--sage-a5:#00180820;--sage-a6:#00140d28;--sage-a7:#00140a34;--sage-a8:#000f0847;--sage-a9:#00110b79;--sage-a10:#00100a83;--sage-a11:#000a07a0;--sage-a12:#000805e5}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sage-a1:color(display-p3 0.024 0.514 0.267/0.016);--sage-a2:color(display-p3 0.02 0.267 0.145/0.032);--sage-a3:color(display-p3 0.008 0.184 0.125/0.067);--sage-a4:color(display-p3 0.012 0.094 0.051/0.095);--sage-a5:color(display-p3 0.008 0.098 0.035/0.126);--sage-a6:color(display-p3 0.004 0.078 0.027/0.157);--sage-a7:color(display-p3 0 0.059 0.039/0.2);--sage-a8:color(display-p3 0.004 0.047 0.031/0.275);--sage-a9:color(display-p3 0.004 0.059 0.035/0.471);--sage-a10:color(display-p3 0 0.047 0.031/0.51);--sage-a11:color(display-p3 0 0.031 0.02/0.624);--sage-a12:color(display-p3 0 0.027 0.012/0.895)}}}.dark,.dark-theme{--sage-a1:#00000000;--sage-a2:#f0f2f108;--sage-a3:#f3f5f412;--sage-a4:#f2fefd1a;--sage-a5:#f1fbfa22;--sage-a6:#edfbf42d;--sage-a7:#edfcf73c;--sage-a8:#ebfdf657;--sage-a9:#dffdf266;--sage-a10:#e5fdf674;--sage-a11:#f4fefbb0;--sage-a12:#fdfffeed}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sage-a1:color(display-p3 0 0 0/0);--sage-a2:color(display-p3 0.976 0.988 0.984/0.03);--sage-a3:color(display-p3 0.992 0.945 0.941/0.072);--sage-a4:color(display-p3 0.988 0.996 0.992/0.102);--sage-a5:color(display-p3 0.992 1 0.996/0.131);--sage-a6:color(display-p3 0.973 1 0.976/0.173);--sage-a7:color(display-p3 0.957 1 0.976/0.233);--sage-a8:color(display-p3 0.957 1 0.984/0.334);--sage-a9:color(display-p3 0.902 1 0.957/0.397);--sage-a10:color(display-p3 0.929 1 0.973/0.452);--sage-a11:color(display-p3 0.969 1 0.988/0.688);--sage-a12:color(display-p3 0.992 1 0.996/0.929)}}}.light,.light-theme,:root{--olive-1:#fcfdfc;--olive-2:#f8faf8;--olive-3:#eff1ef;--olive-4:#e7e9e7;--olive-5:#dfe2df;--olive-6:#d7dad7;--olive-7:#cccfcc;--olive-8:#b9bcb8;--olive-9:#898e87;--olive-10:#7f847d;--olive-11:#60655f;--olive-12:#1d211c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--olive-1:color(display-p3 0.989 0.992 0.989);--olive-2:color(display-p3 0.974 0.98 0.973);--olive-3:color(display-p3 0.939 0.945 0.937);--olive-4:color(display-p3 0.907 0.914 0.905);--olive-5:color(display-p3 0.878 0.885 0.875);--olive-6:color(display-p3 0.846 0.855 0.843);--olive-7:color(display-p3 0.803 0.812 0.8);--olive-8:color(display-p3 0.727 0.738 0.723);--olive-9:color(display-p3 0.541 0.556 0.532);--olive-10:color(display-p3 0.5 0.515 0.491);--olive-11:color(display-p3 0.38 0.395 0.374);--olive-12:color(display-p3 0.117 0.129 0.111)}}}.dark,.dark-theme{--olive-1:#111210;--olive-2:#181917;--olive-3:#212220;--olive-4:#282a27;--olive-5:#2f312e;--olive-6:#383a36;--olive-7:#454843;--olive-8:#5c625b;--olive-9:#687066;--olive-10:#767d74;--olive-11:#afb5ad;--olive-12:#eceeec}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--olive-1:color(display-p3 0.067 0.07 0.063);--olive-2:color(display-p3 0.095 0.098 0.091);--olive-3:color(display-p3 0.131 0.135 0.126);--olive-4:color(display-p3 0.158 0.163 0.153);--olive-5:color(display-p3 0.186 0.192 0.18);--olive-6:color(display-p3 0.221 0.229 0.215);--olive-7:color(display-p3 0.273 0.284 0.266);--olive-8:color(display-p3 0.365 0.382 0.359);--olive-9:color(display-p3 0.414 0.438 0.404);--olive-10:color(display-p3 0.467 0.49 0.458);--olive-11:color(display-p3 0.69 0.709 0.682);--olive-12:color(display-p3 0.927 0.933 0.926)}}}.light,.light-theme,:root{--olive-a1:#00550003;--olive-a2:#00490007;--olive-a3:#00200010;--olive-a4:#00160018;--olive-a5:#00180020;--olive-a6:#00140028;--olive-a7:#000f0033;--olive-a8:#040f0047;--olive-a9:#050f0078;--olive-a10:#040e0082;--olive-a11:#020a00a0;--olive-a12:#010600e3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--olive-a1:color(display-p3 0.024 0.349 0.024/0.012);--olive-a2:color(display-p3 0.024 0.302 0.024/0.028);--olive-a3:color(display-p3 0.008 0.129 0.008/0.063);--olive-a4:color(display-p3 0.012 0.094 0.012/0.095);--olive-a5:color(display-p3 0.035 0.098 0.008/0.126);--olive-a6:color(display-p3 0.027 0.078 0.004/0.157);--olive-a7:color(display-p3 0.02 0.059 0/0.2);--olive-a8:color(display-p3 0.02 0.059 0.004/0.279);--olive-a9:color(display-p3 0.02 0.051 0.004/0.467);--olive-a10:color(display-p3 0.024 0.047 0/0.51);--olive-a11:color(display-p3 0.012 0.039 0/0.628);--olive-a12:color(display-p3 0.008 0.024 0/0.891)}}}.dark,.dark-theme{--olive-a1:#00000000;--olive-a2:#f1f2f008;--olive-a3:#f4f5f312;--olive-a4:#f3fef21a;--olive-a5:#f2fbf122;--olive-a6:#f4faed2c;--olive-a7:#f2fced3b;--olive-a8:#edfdeb57;--olive-a9:#ebfde766;--olive-a10:#f0fdec74;--olive-a11:#f6fef4b0;--olive-a12:#fdfffded}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--olive-a1:color(display-p3 0 0 0/0);--olive-a2:color(display-p3 0.984 0.988 0.976/0.03);--olive-a3:color(display-p3 0.992 0.996 0.988/0.068);--olive-a4:color(display-p3 0.953 0.996 0.949/0.102);--olive-a5:color(display-p3 0.969 1 0.965/0.131);--olive-a6:color(display-p3 0.973 1 0.969/0.169);--olive-a7:color(display-p3 0.98 1 0.961/0.228);--olive-a8:color(display-p3 0.961 1 0.957/0.334);--olive-a9:color(display-p3 0.949 1 0.922/0.397);--olive-a10:color(display-p3 0.953 1 0.941/0.452);--olive-a11:color(display-p3 0.976 1 0.965/0.688);--olive-a12:color(display-p3 0.992 1 0.992/0.929)}}}.light,.light-theme,:root{--sand-1:#fdfdfc;--sand-2:#f9f9f8;--sand-3:#f1f0ef;--sand-4:#e9e8e6;--sand-5:#e2e1de;--sand-6:#dad9d6;--sand-7:#cfceca;--sand-8:#bcbbb5;--sand-9:#8d8d86;--sand-10:#82827c;--sand-11:#63635e;--sand-12:#21201c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sand-1:color(display-p3 0.992 0.992 0.989);--sand-2:color(display-p3 0.977 0.977 0.973);--sand-3:color(display-p3 0.943 0.942 0.936);--sand-4:color(display-p3 0.913 0.912 0.903);--sand-5:color(display-p3 0.885 0.883 0.873);--sand-6:color(display-p3 0.854 0.852 0.839);--sand-7:color(display-p3 0.813 0.81 0.794);--sand-8:color(display-p3 0.738 0.734 0.713);--sand-9:color(display-p3 0.553 0.553 0.528);--sand-10:color(display-p3 0.511 0.511 0.488);--sand-11:color(display-p3 0.388 0.388 0.37);--sand-12:color(display-p3 0.129 0.126 0.111)}}}.dark,.dark-theme{--sand-1:#111110;--sand-2:#191918;--sand-3:#222221;--sand-4:#2a2a28;--sand-5:#31312e;--sand-6:#3b3a37;--sand-7:#494844;--sand-8:#62605b;--sand-9:#6f6d66;--sand-10:#7c7b74;--sand-11:#b5b3ad;--sand-12:#eeeeec}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sand-1:color(display-p3 0.067 0.067 0.063);--sand-2:color(display-p3 0.098 0.098 0.094);--sand-3:color(display-p3 0.135 0.135 0.129);--sand-4:color(display-p3 0.164 0.163 0.156);--sand-5:color(display-p3 0.193 0.192 0.183);--sand-6:color(display-p3 0.23 0.229 0.217);--sand-7:color(display-p3 0.285 0.282 0.267);--sand-8:color(display-p3 0.384 0.378 0.357);--sand-9:color(display-p3 0.434 0.428 0.403);--sand-10:color(display-p3 0.487 0.481 0.456);--sand-11:color(display-p3 0.707 0.703 0.68);--sand-12:color(display-p3 0.933 0.933 0.926)}}}.light,.light-theme,:root{--sand-a1:#55550003;--sand-a2:#25250007;--sand-a3:#20100010;--sand-a4:#1f150019;--sand-a5:#1f180021;--sand-a6:#19130029;--sand-a7:#19140035;--sand-a8:#1915014a;--sand-a9:#0f0f0079;--sand-a10:#0c0c0083;--sand-a11:#080800a1;--sand-a12:#060500e3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sand-a1:color(display-p3 0.349 0.349 0.024/0.012);--sand-a2:color(display-p3 0.161 0.161 0.024/0.028);--sand-a3:color(display-p3 0.067 0.067 0.008/0.063);--sand-a4:color(display-p3 0.129 0.129 0.012/0.099);--sand-a5:color(display-p3 0.098 0.067 0.008/0.126);--sand-a6:color(display-p3 0.102 0.075 0.004/0.161);--sand-a7:color(display-p3 0.098 0.098 0.004/0.208);--sand-a8:color(display-p3 0.086 0.075 0.004/0.287);--sand-a9:color(display-p3 0.051 0.051 0.004/0.471);--sand-a10:color(display-p3 0.047 0.047 0/0.514);--sand-a11:color(display-p3 0.031 0.031 0/0.632);--sand-a12:color(display-p3 0.024 0.02 0/0.891)}}}.dark,.dark-theme{--sand-a1:#00000000;--sand-a2:#f4f4f309;--sand-a3:#f6f6f513;--sand-a4:#fefef31b;--sand-a5:#fbfbeb23;--sand-a6:#fffaed2d;--sand-a7:#fffbed3c;--sand-a8:#fff9eb57;--sand-a9:#fffae965;--sand-a10:#fffdee73;--sand-a11:#fffcf4b0;--sand-a12:#fffffded}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sand-a1:color(display-p3 0 0 0/0);--sand-a2:color(display-p3 0.992 0.992 0.988/0.034);--sand-a3:color(display-p3 0.996 0.996 0.992/0.072);--sand-a4:color(display-p3 0.992 0.992 0.953/0.106);--sand-a5:color(display-p3 1 1 0.965/0.135);--sand-a6:color(display-p3 1 0.976 0.929/0.177);--sand-a7:color(display-p3 1 0.984 0.929/0.236);--sand-a8:color(display-p3 1 0.976 0.925/0.341);--sand-a9:color(display-p3 1 0.98 0.925/0.395);--sand-a10:color(display-p3 1 0.992 0.933/0.45);--sand-a11:color(display-p3 1 0.996 0.961/0.685);--sand-a12:color(display-p3 1 1 0.992/0.929)}}}:root{--black-a1:rgba(0,0,0,.05);--black-a2:rgba(0,0,0,.1);--black-a3:rgba(0,0,0,.15);--black-a4:rgba(0,0,0,.2);--black-a5:rgba(0,0,0,.3);--black-a6:rgba(0,0,0,.4);--black-a7:rgba(0,0,0,.5);--black-a8:rgba(0,0,0,.6);--black-a9:rgba(0,0,0,.7);--black-a10:rgba(0,0,0,.8);--black-a11:rgba(0,0,0,.9);--black-a12:rgba(0,0,0,.95)}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){:root{--black-a1:color(display-p3 0 0 0/0.05);--black-a2:color(display-p3 0 0 0/0.1);--black-a3:color(display-p3 0 0 0/0.15);--black-a4:color(display-p3 0 0 0/0.2);--black-a5:color(display-p3 0 0 0/0.3);--black-a6:color(display-p3 0 0 0/0.4);--black-a7:color(display-p3 0 0 0/0.5);--black-a8:color(display-p3 0 0 0/0.6);--black-a9:color(display-p3 0 0 0/0.7);--black-a10:color(display-p3 0 0 0/0.8);--black-a11:color(display-p3 0 0 0/0.9);--black-a12:color(display-p3 0 0 0/0.95)}}}:root{--white-a1:hsla(0,0%,100%,.05);--white-a2:hsla(0,0%,100%,.1);--white-a3:hsla(0,0%,100%,.15);--white-a4:hsla(0,0%,100%,.2);--white-a5:hsla(0,0%,100%,.3);--white-a6:hsla(0,0%,100%,.4);--white-a7:hsla(0,0%,100%,.5);--white-a8:hsla(0,0%,100%,.6);--white-a9:hsla(0,0%,100%,.7);--white-a10:hsla(0,0%,100%,.8);--white-a11:hsla(0,0%,100%,.9);--white-a12:hsla(0,0%,100%,.95)}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){:root{--white-a1:color(display-p3 1 1 1/0.05);--white-a2:color(display-p3 1 1 1/0.1);--white-a3:color(display-p3 1 1 1/0.15);--white-a4:color(display-p3 1 1 1/0.2);--white-a5:color(display-p3 1 1 1/0.3);--white-a6:color(display-p3 1 1 1/0.4);--white-a7:color(display-p3 1 1 1/0.5);--white-a8:color(display-p3 1 1 1/0.6);--white-a9:color(display-p3 1 1 1/0.7);--white-a10:color(display-p3 1 1 1/0.8);--white-a11:color(display-p3 1 1 1/0.9);--white-a12:color(display-p3 1 1 1/0.95)}}}:root{--tomato-9-contrast:#fff;--red-9-contrast:#fff;--ruby-9-contrast:#fff;--crimson-9-contrast:#fff;--pink-9-contrast:#fff;--plum-9-contrast:#fff;--purple-9-contrast:#fff;--violet-9-contrast:#fff;--iris-9-contrast:#fff;--indigo-9-contrast:#fff;--blue-9-contrast:#fff;--cyan-9-contrast:#fff;--teal-9-contrast:#fff;--jade-9-contrast:#fff;--green-9-contrast:#fff;--grass-9-contrast:#fff;--orange-9-contrast:#fff;--brown-9-contrast:#fff;--sky-9-contrast:#1c2024;--mint-9-contrast:#1a211e;--lime-9-contrast:#1d211c;--yellow-9-contrast:#21201c;--amber-9-contrast:#21201c;--gold-9-contrast:#fff;--bronze-9-contrast:#fff;--gray-9-contrast:#fff}.light,.light-theme,:root{--gray-surface:#ffffffcc;--mauve-surface:#ffffffcc;--slate-surface:#ffffffcc;--sage-surface:#ffffffcc;--olive-surface:#ffffffcc;--sand-surface:#ffffffcc;--tomato-surface:#fff6f5cc;--red-surface:#fff5f5cc;--ruby-surface:#fff5f6cc;--crimson-surface:#fef5f8cc;--pink-surface:#fef5facc;--plum-surface:#fdf5fdcc;--purple-surface:#faf5fecc;--violet-surface:#f9f6ffcc;--iris-surface:#f6f6ffcc;--indigo-surface:#f5f8ffcc;--blue-surface:#f1f9ffcc;--cyan-surface:#eff9facc;--teal-surface:#f0faf8cc;--jade-surface:#f1faf5cc;--green-surface:#f1faf4cc;--grass-surface:#f3faf3cc;--brown-surface:#fbf8f4cc;--bronze-surface:#fdf5f3cc;--gold-surface:#f9f8efcc;--sky-surface:#eef9fdcc;--mint-surface:#effaf8cc;--lime-surface:#f6f9f0cc;--yellow-surface:#fefbe4cc;--amber-surface:#fefae4cc;--orange-surface:#fff5e9cc;@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){&{--gray-surface:color(display-p3 1 1 1/0.8);--mauve-surface:color(display-p3 1 1 1/0.8);--slate-surface:color(display-p3 1 1 1/0.8);--sage-surface:color(display-p3 1 1 1/0.8);--olive-surface:color(display-p3 1 1 1/0.8);--sand-surface:color(display-p3 1 1 1/0.8);--tomato-surface:color(display-p3 0.9922 0.9647 0.9608/0.8);--red-surface:color(display-p3 0.9961 0.9647 0.9647/0.8);--ruby-surface:color(display-p3 0.9961 0.9647 0.9647/0.8);--crimson-surface:color(display-p3 0.9922 0.9608 0.9725/0.8);--pink-surface:color(display-p3 0.9922 0.9608 0.9804/0.8);--plum-surface:color(display-p3 0.9843 0.9647 0.9843/0.8);--purple-surface:color(display-p3 0.9804 0.9647 0.9922/0.8);--violet-surface:color(display-p3 0.9725 0.9647 0.9961/0.8);--iris-surface:color(display-p3 0.9647 0.9647 0.9961/0.8);--indigo-surface:color(display-p3 0.9647 0.9725 0.9961/0.8);--blue-surface:color(display-p3 0.9529 0.9765 0.9961/0.8);--cyan-surface:color(display-p3 0.9412 0.9765 0.9804/0.8);--teal-surface:color(display-p3 0.9451 0.9804 0.9725/0.8);--jade-surface:color(display-p3 0.9529 0.9804 0.9608/0.8);--green-surface:color(display-p3 0.9569 0.9804 0.9608/0.8);--grass-surface:color(display-p3 0.9569 0.9804 0.9569/0.8);--brown-surface:color(display-p3 0.9843 0.9725 0.9569/0.8);--bronze-surface:color(display-p3 0.9843 0.9608 0.9529/0.8);--gold-surface:color(display-p3 0.9765 0.9725 0.9412/0.8);--sky-surface:color(display-p3 0.9412 0.9765 0.9843/0.8);--mint-surface:color(display-p3 0.9451 0.9804 0.9725/0.8);--lime-surface:color(display-p3 0.9725 0.9765 0.9412/0.8);--yellow-surface:color(display-p3 0.9961 0.9922 0.902/0.8);--amber-surface:color(display-p3 0.9922 0.9843 0.902/0.8);--orange-surface:color(display-p3 0.9961 0.9608 0.9176/0.8)}}}}.dark,.dark-theme{--gray-surface:#21212180;--mauve-surface:#22212380;--slate-surface:#1f212380;--sage-surface:#1e201f80;--olive-surface:#1f201e80;--sand-surface:#21212080;--tomato-surface:#2d191580;--red-surface:#2f151780;--ruby-surface:#2b191d80;--crimson-surface:#2f151f80;--pink-surface:#31132980;--plum-surface:#2f152f80;--purple-surface:#2b173580;--violet-surface:#25193980;--iris-surface:#1d1b3980;--indigo-surface:#171d3b80;--blue-surface:#11213d80;--cyan-surface:#11252d80;--teal-surface:#13272580;--jade-surface:#13271f80;--green-surface:#15251d80;--grass-surface:#19231b80;--brown-surface:#271f1b80;--bronze-surface:#27211d80;--gold-surface:#25231d80;--sky-surface:#13233b80;--mint-surface:#15272780;--lime-surface:#1b211580;--yellow-surface:#231f1380;--amber-surface:#271f1380;--orange-surface:#271d1380;@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){&{--gray-surface:color(display-p3 0.1255 0.1255 0.1255/0.5);--mauve-surface:color(display-p3 0.1333 0.1255 0.1333/0.5);--slate-surface:color(display-p3 0.1176 0.1255 0.1333/0.5);--sage-surface:color(display-p3 0.1176 0.1255 0.1176/0.5);--olive-surface:color(display-p3 0.1176 0.1255 0.1176/0.5);--sand-surface:color(display-p3 0.1255 0.1255 0.1255/0.5);--tomato-surface:color(display-p3 0.1569 0.0941 0.0784/0.5);--red-surface:color(display-p3 0.1647 0.0863 0.0863/0.5);--ruby-surface:color(display-p3 0.1569 0.0941 0.1098/0.5);--crimson-surface:color(display-p3 0.1647 0.0863 0.1176/0.5);--pink-surface:color(display-p3 0.1725 0.0784 0.149/0.5);--plum-surface:color(display-p3 0.1647 0.0863 0.1725/0.5);--purple-surface:color(display-p3 0.149 0.0941 0.1961/0.5);--violet-surface:color(display-p3 0.1333 0.102 0.2118/0.5);--iris-surface:color(display-p3 0.1098 0.102 0.2118/0.5);--indigo-surface:color(display-p3 0.0941 0.1098 0.2196/0.5);--blue-surface:color(display-p3 0.0706 0.1255 0.2196/0.5);--cyan-surface:color(display-p3 0.0784 0.1412 0.1725/0.5);--teal-surface:color(display-p3 0.0863 0.149 0.1412/0.5);--jade-surface:color(display-p3 0.0863 0.149 0.1176/0.5);--green-surface:color(display-p3 0.0941 0.1412 0.1098/0.5);--grass-surface:color(display-p3 0.102 0.1333 0.102/0.5);--brown-surface:color(display-p3 0.1412 0.1176 0.102/0.5);--bronze-surface:color(display-p3 0.1412 0.1255 0.1176/0.5);--gold-surface:color(display-p3 0.1412 0.1333 0.1098/0.5);--sky-surface:color(display-p3 0.0863 0.1333 0.2196/0.5);--mint-surface:color(display-p3 0.0941 0.149 0.1412/0.5);--lime-surface:color(display-p3 0.1098 0.1255 0.0784/0.5);--yellow-surface:color(display-p3 0.1333 0.1176 0.0706/0.5);--amber-surface:color(display-p3 0.1412 0.1176 0.0784/0.5);--orange-surface:color(display-p3 0.1412 0.1098 0.0706/0.5)}}}}[data-accent-color=tomato]{--color-surface-accent:var(--tomato-surface);--accent-1:var(--tomato-1);--accent-2:var(--tomato-2);--accent-3:var(--tomato-3);--accent-4:var(--tomato-4);--accent-5:var(--tomato-5);--accent-6:var(--tomato-6);--accent-7:var(--tomato-7);--accent-8:var(--tomato-8);--accent-9:var(--tomato-9);--accent-9-contrast:var(--tomato-9-contrast);--accent-10:var(--tomato-10);--accent-11:var(--tomato-11);--accent-12:var(--tomato-12);--accent-a1:var(--tomato-a1);--accent-a2:var(--tomato-a2);--accent-a3:var(--tomato-a3);--accent-a4:var(--tomato-a4);--accent-a5:var(--tomato-a5);--accent-a6:var(--tomato-a6);--accent-a7:var(--tomato-a7);--accent-a8:var(--tomato-a8);--accent-a9:var(--tomato-a9);--accent-a10:var(--tomato-a10);--accent-a11:var(--tomato-a11);--accent-a12:var(--tomato-a12)}[data-accent-color=red]{--color-surface-accent:var(--red-surface);--accent-1:var(--red-1);--accent-2:var(--red-2);--accent-3:var(--red-3);--accent-4:var(--red-4);--accent-5:var(--red-5);--accent-6:var(--red-6);--accent-7:var(--red-7);--accent-8:var(--red-8);--accent-9:var(--red-9);--accent-9-contrast:var(--red-9-contrast);--accent-10:var(--red-10);--accent-11:var(--red-11);--accent-12:var(--red-12);--accent-a1:var(--red-a1);--accent-a2:var(--red-a2);--accent-a3:var(--red-a3);--accent-a4:var(--red-a4);--accent-a5:var(--red-a5);--accent-a6:var(--red-a6);--accent-a7:var(--red-a7);--accent-a8:var(--red-a8);--accent-a9:var(--red-a9);--accent-a10:var(--red-a10);--accent-a11:var(--red-a11);--accent-a12:var(--red-a12)}[data-accent-color=ruby]{--color-surface-accent:var(--ruby-surface);--accent-1:var(--ruby-1);--accent-2:var(--ruby-2);--accent-3:var(--ruby-3);--accent-4:var(--ruby-4);--accent-5:var(--ruby-5);--accent-6:var(--ruby-6);--accent-7:var(--ruby-7);--accent-8:var(--ruby-8);--accent-9:var(--ruby-9);--accent-9-contrast:var(--ruby-9-contrast);--accent-10:var(--ruby-10);--accent-11:var(--ruby-11);--accent-12:var(--ruby-12);--accent-a1:var(--ruby-a1);--accent-a2:var(--ruby-a2);--accent-a3:var(--ruby-a3);--accent-a4:var(--ruby-a4);--accent-a5:var(--ruby-a5);--accent-a6:var(--ruby-a6);--accent-a7:var(--ruby-a7);--accent-a8:var(--ruby-a8);--accent-a9:var(--ruby-a9);--accent-a10:var(--ruby-a10);--accent-a11:var(--ruby-a11);--accent-a12:var(--ruby-a12)}[data-accent-color=crimson]{--color-surface-accent:var(--crimson-surface);--accent-1:var(--crimson-1);--accent-2:var(--crimson-2);--accent-3:var(--crimson-3);--accent-4:var(--crimson-4);--accent-5:var(--crimson-5);--accent-6:var(--crimson-6);--accent-7:var(--crimson-7);--accent-8:var(--crimson-8);--accent-9:var(--crimson-9);--accent-9-contrast:var(--crimson-9-contrast);--accent-10:var(--crimson-10);--accent-11:var(--crimson-11);--accent-12:var(--crimson-12);--accent-a1:var(--crimson-a1);--accent-a2:var(--crimson-a2);--accent-a3:var(--crimson-a3);--accent-a4:var(--crimson-a4);--accent-a5:var(--crimson-a5);--accent-a6:var(--crimson-a6);--accent-a7:var(--crimson-a7);--accent-a8:var(--crimson-a8);--accent-a9:var(--crimson-a9);--accent-a10:var(--crimson-a10);--accent-a11:var(--crimson-a11);--accent-a12:var(--crimson-a12)}[data-accent-color=pink]{--color-surface-accent:var(--pink-surface);--accent-1:var(--pink-1);--accent-2:var(--pink-2);--accent-3:var(--pink-3);--accent-4:var(--pink-4);--accent-5:var(--pink-5);--accent-6:var(--pink-6);--accent-7:var(--pink-7);--accent-8:var(--pink-8);--accent-9:var(--pink-9);--accent-9-contrast:var(--pink-9-contrast);--accent-10:var(--pink-10);--accent-11:var(--pink-11);--accent-12:var(--pink-12);--accent-a1:var(--pink-a1);--accent-a2:var(--pink-a2);--accent-a3:var(--pink-a3);--accent-a4:var(--pink-a4);--accent-a5:var(--pink-a5);--accent-a6:var(--pink-a6);--accent-a7:var(--pink-a7);--accent-a8:var(--pink-a8);--accent-a9:var(--pink-a9);--accent-a10:var(--pink-a10);--accent-a11:var(--pink-a11);--accent-a12:var(--pink-a12)}[data-accent-color=plum]{--color-surface-accent:var(--plum-surface);--accent-1:var(--plum-1);--accent-2:var(--plum-2);--accent-3:var(--plum-3);--accent-4:var(--plum-4);--accent-5:var(--plum-5);--accent-6:var(--plum-6);--accent-7:var(--plum-7);--accent-8:var(--plum-8);--accent-9:var(--plum-9);--accent-9-contrast:var(--plum-9-contrast);--accent-10:var(--plum-10);--accent-11:var(--plum-11);--accent-12:var(--plum-12);--accent-a1:var(--plum-a1);--accent-a2:var(--plum-a2);--accent-a3:var(--plum-a3);--accent-a4:var(--plum-a4);--accent-a5:var(--plum-a5);--accent-a6:var(--plum-a6);--accent-a7:var(--plum-a7);--accent-a8:var(--plum-a8);--accent-a9:var(--plum-a9);--accent-a10:var(--plum-a10);--accent-a11:var(--plum-a11);--accent-a12:var(--plum-a12)}[data-accent-color=purple]{--color-surface-accent:var(--purple-surface);--accent-1:var(--purple-1);--accent-2:var(--purple-2);--accent-3:var(--purple-3);--accent-4:var(--purple-4);--accent-5:var(--purple-5);--accent-6:var(--purple-6);--accent-7:var(--purple-7);--accent-8:var(--purple-8);--accent-9:var(--purple-9);--accent-9-contrast:var(--purple-9-contrast);--accent-10:var(--purple-10);--accent-11:var(--purple-11);--accent-12:var(--purple-12);--accent-a1:var(--purple-a1);--accent-a2:var(--purple-a2);--accent-a3:var(--purple-a3);--accent-a4:var(--purple-a4);--accent-a5:var(--purple-a5);--accent-a6:var(--purple-a6);--accent-a7:var(--purple-a7);--accent-a8:var(--purple-a8);--accent-a9:var(--purple-a9);--accent-a10:var(--purple-a10);--accent-a11:var(--purple-a11);--accent-a12:var(--purple-a12)}[data-accent-color=violet]{--color-surface-accent:var(--violet-surface);--accent-1:var(--violet-1);--accent-2:var(--violet-2);--accent-3:var(--violet-3);--accent-4:var(--violet-4);--accent-5:var(--violet-5);--accent-6:var(--violet-6);--accent-7:var(--violet-7);--accent-8:var(--violet-8);--accent-9:var(--violet-9);--accent-9-contrast:var(--violet-9-contrast);--accent-10:var(--violet-10);--accent-11:var(--violet-11);--accent-12:var(--violet-12);--accent-a1:var(--violet-a1);--accent-a2:var(--violet-a2);--accent-a3:var(--violet-a3);--accent-a4:var(--violet-a4);--accent-a5:var(--violet-a5);--accent-a6:var(--violet-a6);--accent-a7:var(--violet-a7);--accent-a8:var(--violet-a8);--accent-a9:var(--violet-a9);--accent-a10:var(--violet-a10);--accent-a11:var(--violet-a11);--accent-a12:var(--violet-a12)}[data-accent-color=iris]{--color-surface-accent:var(--iris-surface);--accent-1:var(--iris-1);--accent-2:var(--iris-2);--accent-3:var(--iris-3);--accent-4:var(--iris-4);--accent-5:var(--iris-5);--accent-6:var(--iris-6);--accent-7:var(--iris-7);--accent-8:var(--iris-8);--accent-9:var(--iris-9);--accent-9-contrast:var(--iris-9-contrast);--accent-10:var(--iris-10);--accent-11:var(--iris-11);--accent-12:var(--iris-12);--accent-a1:var(--iris-a1);--accent-a2:var(--iris-a2);--accent-a3:var(--iris-a3);--accent-a4:var(--iris-a4);--accent-a5:var(--iris-a5);--accent-a6:var(--iris-a6);--accent-a7:var(--iris-a7);--accent-a8:var(--iris-a8);--accent-a9:var(--iris-a9);--accent-a10:var(--iris-a10);--accent-a11:var(--iris-a11);--accent-a12:var(--iris-a12)}[data-accent-color=indigo]{--color-surface-accent:var(--indigo-surface);--accent-1:var(--indigo-1);--accent-2:var(--indigo-2);--accent-3:var(--indigo-3);--accent-4:var(--indigo-4);--accent-5:var(--indigo-5);--accent-6:var(--indigo-6);--accent-7:var(--indigo-7);--accent-8:var(--indigo-8);--accent-9:var(--indigo-9);--accent-9-contrast:var(--indigo-9-contrast);--accent-10:var(--indigo-10);--accent-11:var(--indigo-11);--accent-12:var(--indigo-12);--accent-a1:var(--indigo-a1);--accent-a2:var(--indigo-a2);--accent-a3:var(--indigo-a3);--accent-a4:var(--indigo-a4);--accent-a5:var(--indigo-a5);--accent-a6:var(--indigo-a6);--accent-a7:var(--indigo-a7);--accent-a8:var(--indigo-a8);--accent-a9:var(--indigo-a9);--accent-a10:var(--indigo-a10);--accent-a11:var(--indigo-a11);--accent-a12:var(--indigo-a12)}[data-accent-color=blue]{--color-surface-accent:var(--blue-surface);--accent-1:var(--blue-1);--accent-2:var(--blue-2);--accent-3:var(--blue-3);--accent-4:var(--blue-4);--accent-5:var(--blue-5);--accent-6:var(--blue-6);--accent-7:var(--blue-7);--accent-8:var(--blue-8);--accent-9:var(--blue-9);--accent-9-contrast:var(--blue-9-contrast);--accent-10:var(--blue-10);--accent-11:var(--blue-11);--accent-12:var(--blue-12);--accent-a1:var(--blue-a1);--accent-a2:var(--blue-a2);--accent-a3:var(--blue-a3);--accent-a4:var(--blue-a4);--accent-a5:var(--blue-a5);--accent-a6:var(--blue-a6);--accent-a7:var(--blue-a7);--accent-a8:var(--blue-a8);--accent-a9:var(--blue-a9);--accent-a10:var(--blue-a10);--accent-a11:var(--blue-a11);--accent-a12:var(--blue-a12)}[data-accent-color=cyan]{--color-surface-accent:var(--cyan-surface);--accent-1:var(--cyan-1);--accent-2:var(--cyan-2);--accent-3:var(--cyan-3);--accent-4:var(--cyan-4);--accent-5:var(--cyan-5);--accent-6:var(--cyan-6);--accent-7:var(--cyan-7);--accent-8:var(--cyan-8);--accent-9:var(--cyan-9);--accent-9-contrast:var(--cyan-9-contrast);--accent-10:var(--cyan-10);--accent-11:var(--cyan-11);--accent-12:var(--cyan-12);--accent-a1:var(--cyan-a1);--accent-a2:var(--cyan-a2);--accent-a3:var(--cyan-a3);--accent-a4:var(--cyan-a4);--accent-a5:var(--cyan-a5);--accent-a6:var(--cyan-a6);--accent-a7:var(--cyan-a7);--accent-a8:var(--cyan-a8);--accent-a9:var(--cyan-a9);--accent-a10:var(--cyan-a10);--accent-a11:var(--cyan-a11);--accent-a12:var(--cyan-a12)}[data-accent-color=teal]{--color-surface-accent:var(--teal-surface);--accent-1:var(--teal-1);--accent-2:var(--teal-2);--accent-3:var(--teal-3);--accent-4:var(--teal-4);--accent-5:var(--teal-5);--accent-6:var(--teal-6);--accent-7:var(--teal-7);--accent-8:var(--teal-8);--accent-9:var(--teal-9);--accent-9-contrast:var(--teal-9-contrast);--accent-10:var(--teal-10);--accent-11:var(--teal-11);--accent-12:var(--teal-12);--accent-a1:var(--teal-a1);--accent-a2:var(--teal-a2);--accent-a3:var(--teal-a3);--accent-a4:var(--teal-a4);--accent-a5:var(--teal-a5);--accent-a6:var(--teal-a6);--accent-a7:var(--teal-a7);--accent-a8:var(--teal-a8);--accent-a9:var(--teal-a9);--accent-a10:var(--teal-a10);--accent-a11:var(--teal-a11);--accent-a12:var(--teal-a12)}[data-accent-color=jade]{--color-surface-accent:var(--jade-surface);--accent-1:var(--jade-1);--accent-2:var(--jade-2);--accent-3:var(--jade-3);--accent-4:var(--jade-4);--accent-5:var(--jade-5);--accent-6:var(--jade-6);--accent-7:var(--jade-7);--accent-8:var(--jade-8);--accent-9:var(--jade-9);--accent-9-contrast:var(--jade-9-contrast);--accent-10:var(--jade-10);--accent-11:var(--jade-11);--accent-12:var(--jade-12);--accent-a1:var(--jade-a1);--accent-a2:var(--jade-a2);--accent-a3:var(--jade-a3);--accent-a4:var(--jade-a4);--accent-a5:var(--jade-a5);--accent-a6:var(--jade-a6);--accent-a7:var(--jade-a7);--accent-a8:var(--jade-a8);--accent-a9:var(--jade-a9);--accent-a10:var(--jade-a10);--accent-a11:var(--jade-a11);--accent-a12:var(--jade-a12)}[data-accent-color=green]{--color-surface-accent:var(--green-surface);--accent-1:var(--green-1);--accent-2:var(--green-2);--accent-3:var(--green-3);--accent-4:var(--green-4);--accent-5:var(--green-5);--accent-6:var(--green-6);--accent-7:var(--green-7);--accent-8:var(--green-8);--accent-9:var(--green-9);--accent-9-contrast:var(--green-9-contrast);--accent-10:var(--green-10);--accent-11:var(--green-11);--accent-12:var(--green-12);--accent-a1:var(--green-a1);--accent-a2:var(--green-a2);--accent-a3:var(--green-a3);--accent-a4:var(--green-a4);--accent-a5:var(--green-a5);--accent-a6:var(--green-a6);--accent-a7:var(--green-a7);--accent-a8:var(--green-a8);--accent-a9:var(--green-a9);--accent-a10:var(--green-a10);--accent-a11:var(--green-a11);--accent-a12:var(--green-a12)}[data-accent-color=grass]{--color-surface-accent:var(--grass-surface);--accent-1:var(--grass-1);--accent-2:var(--grass-2);--accent-3:var(--grass-3);--accent-4:var(--grass-4);--accent-5:var(--grass-5);--accent-6:var(--grass-6);--accent-7:var(--grass-7);--accent-8:var(--grass-8);--accent-9:var(--grass-9);--accent-9-contrast:var(--grass-9-contrast);--accent-10:var(--grass-10);--accent-11:var(--grass-11);--accent-12:var(--grass-12);--accent-a1:var(--grass-a1);--accent-a2:var(--grass-a2);--accent-a3:var(--grass-a3);--accent-a4:var(--grass-a4);--accent-a5:var(--grass-a5);--accent-a6:var(--grass-a6);--accent-a7:var(--grass-a7);--accent-a8:var(--grass-a8);--accent-a9:var(--grass-a9);--accent-a10:var(--grass-a10);--accent-a11:var(--grass-a11);--accent-a12:var(--grass-a12)}[data-accent-color=orange]{--color-surface-accent:var(--orange-surface);--accent-1:var(--orange-1);--accent-2:var(--orange-2);--accent-3:var(--orange-3);--accent-4:var(--orange-4);--accent-5:var(--orange-5);--accent-6:var(--orange-6);--accent-7:var(--orange-7);--accent-8:var(--orange-8);--accent-9:var(--orange-9);--accent-9-contrast:var(--orange-9-contrast);--accent-10:var(--orange-10);--accent-11:var(--orange-11);--accent-12:var(--orange-12);--accent-a1:var(--orange-a1);--accent-a2:var(--orange-a2);--accent-a3:var(--orange-a3);--accent-a4:var(--orange-a4);--accent-a5:var(--orange-a5);--accent-a6:var(--orange-a6);--accent-a7:var(--orange-a7);--accent-a8:var(--orange-a8);--accent-a9:var(--orange-a9);--accent-a10:var(--orange-a10);--accent-a11:var(--orange-a11);--accent-a12:var(--orange-a12)}[data-accent-color=brown]{--color-surface-accent:var(--brown-surface);--accent-1:var(--brown-1);--accent-2:var(--brown-2);--accent-3:var(--brown-3);--accent-4:var(--brown-4);--accent-5:var(--brown-5);--accent-6:var(--brown-6);--accent-7:var(--brown-7);--accent-8:var(--brown-8);--accent-9:var(--brown-9);--accent-9-contrast:var(--brown-9-contrast);--accent-10:var(--brown-10);--accent-11:var(--brown-11);--accent-12:var(--brown-12);--accent-a1:var(--brown-a1);--accent-a2:var(--brown-a2);--accent-a3:var(--brown-a3);--accent-a4:var(--brown-a4);--accent-a5:var(--brown-a5);--accent-a6:var(--brown-a6);--accent-a7:var(--brown-a7);--accent-a8:var(--brown-a8);--accent-a9:var(--brown-a9);--accent-a10:var(--brown-a10);--accent-a11:var(--brown-a11);--accent-a12:var(--brown-a12)}[data-accent-color=sky]{--color-surface-accent:var(--sky-surface);--accent-1:var(--sky-1);--accent-2:var(--sky-2);--accent-3:var(--sky-3);--accent-4:var(--sky-4);--accent-5:var(--sky-5);--accent-6:var(--sky-6);--accent-7:var(--sky-7);--accent-8:var(--sky-8);--accent-9:var(--sky-9);--accent-9-contrast:var(--sky-9-contrast);--accent-10:var(--sky-10);--accent-11:var(--sky-11);--accent-12:var(--sky-12);--accent-a1:var(--sky-a1);--accent-a2:var(--sky-a2);--accent-a3:var(--sky-a3);--accent-a4:var(--sky-a4);--accent-a5:var(--sky-a5);--accent-a6:var(--sky-a6);--accent-a7:var(--sky-a7);--accent-a8:var(--sky-a8);--accent-a9:var(--sky-a9);--accent-a10:var(--sky-a10);--accent-a11:var(--sky-a11);--accent-a12:var(--sky-a12)}[data-accent-color=mint]{--color-surface-accent:var(--mint-surface);--accent-1:var(--mint-1);--accent-2:var(--mint-2);--accent-3:var(--mint-3);--accent-4:var(--mint-4);--accent-5:var(--mint-5);--accent-6:var(--mint-6);--accent-7:var(--mint-7);--accent-8:var(--mint-8);--accent-9:var(--mint-9);--accent-9-contrast:var(--mint-9-contrast);--accent-10:var(--mint-10);--accent-11:var(--mint-11);--accent-12:var(--mint-12);--accent-a1:var(--mint-a1);--accent-a2:var(--mint-a2);--accent-a3:var(--mint-a3);--accent-a4:var(--mint-a4);--accent-a5:var(--mint-a5);--accent-a6:var(--mint-a6);--accent-a7:var(--mint-a7);--accent-a8:var(--mint-a8);--accent-a9:var(--mint-a9);--accent-a10:var(--mint-a10);--accent-a11:var(--mint-a11);--accent-a12:var(--mint-a12)}[data-accent-color=lime]{--color-surface-accent:var(--lime-surface);--accent-1:var(--lime-1);--accent-2:var(--lime-2);--accent-3:var(--lime-3);--accent-4:var(--lime-4);--accent-5:var(--lime-5);--accent-6:var(--lime-6);--accent-7:var(--lime-7);--accent-8:var(--lime-8);--accent-9:var(--lime-9);--accent-9-contrast:var(--lime-9-contrast);--accent-10:var(--lime-10);--accent-11:var(--lime-11);--accent-12:var(--lime-12);--accent-a1:var(--lime-a1);--accent-a2:var(--lime-a2);--accent-a3:var(--lime-a3);--accent-a4:var(--lime-a4);--accent-a5:var(--lime-a5);--accent-a6:var(--lime-a6);--accent-a7:var(--lime-a7);--accent-a8:var(--lime-a8);--accent-a9:var(--lime-a9);--accent-a10:var(--lime-a10);--accent-a11:var(--lime-a11);--accent-a12:var(--lime-a12)}[data-accent-color=yellow]{--color-surface-accent:var(--yellow-surface);--accent-1:var(--yellow-1);--accent-2:var(--yellow-2);--accent-3:var(--yellow-3);--accent-4:var(--yellow-4);--accent-5:var(--yellow-5);--accent-6:var(--yellow-6);--accent-7:var(--yellow-7);--accent-8:var(--yellow-8);--accent-9:var(--yellow-9);--accent-9-contrast:var(--yellow-9-contrast);--accent-10:var(--yellow-10);--accent-11:var(--yellow-11);--accent-12:var(--yellow-12);--accent-a1:var(--yellow-a1);--accent-a2:var(--yellow-a2);--accent-a3:var(--yellow-a3);--accent-a4:var(--yellow-a4);--accent-a5:var(--yellow-a5);--accent-a6:var(--yellow-a6);--accent-a7:var(--yellow-a7);--accent-a8:var(--yellow-a8);--accent-a9:var(--yellow-a9);--accent-a10:var(--yellow-a10);--accent-a11:var(--yellow-a11);--accent-a12:var(--yellow-a12)}[data-accent-color=amber]{--color-surface-accent:var(--amber-surface);--accent-1:var(--amber-1);--accent-2:var(--amber-2);--accent-3:var(--amber-3);--accent-4:var(--amber-4);--accent-5:var(--amber-5);--accent-6:var(--amber-6);--accent-7:var(--amber-7);--accent-8:var(--amber-8);--accent-9:var(--amber-9);--accent-9-contrast:var(--amber-9-contrast);--accent-10:var(--amber-10);--accent-11:var(--amber-11);--accent-12:var(--amber-12);--accent-a1:var(--amber-a1);--accent-a2:var(--amber-a2);--accent-a3:var(--amber-a3);--accent-a4:var(--amber-a4);--accent-a5:var(--amber-a5);--accent-a6:var(--amber-a6);--accent-a7:var(--amber-a7);--accent-a8:var(--amber-a8);--accent-a9:var(--amber-a9);--accent-a10:var(--amber-a10);--accent-a11:var(--amber-a11);--accent-a12:var(--amber-a12)}[data-accent-color=gold]{--color-surface-accent:var(--gold-surface);--accent-1:var(--gold-1);--accent-2:var(--gold-2);--accent-3:var(--gold-3);--accent-4:var(--gold-4);--accent-5:var(--gold-5);--accent-6:var(--gold-6);--accent-7:var(--gold-7);--accent-8:var(--gold-8);--accent-9:var(--gold-9);--accent-9-contrast:var(--gold-9-contrast);--accent-10:var(--gold-10);--accent-11:var(--gold-11);--accent-12:var(--gold-12);--accent-a1:var(--gold-a1);--accent-a2:var(--gold-a2);--accent-a3:var(--gold-a3);--accent-a4:var(--gold-a4);--accent-a5:var(--gold-a5);--accent-a6:var(--gold-a6);--accent-a7:var(--gold-a7);--accent-a8:var(--gold-a8);--accent-a9:var(--gold-a9);--accent-a10:var(--gold-a10);--accent-a11:var(--gold-a11);--accent-a12:var(--gold-a12)}[data-accent-color=bronze]{--color-surface-accent:var(--bronze-surface);--accent-1:var(--bronze-1);--accent-2:var(--bronze-2);--accent-3:var(--bronze-3);--accent-4:var(--bronze-4);--accent-5:var(--bronze-5);--accent-6:var(--bronze-6);--accent-7:var(--bronze-7);--accent-8:var(--bronze-8);--accent-9:var(--bronze-9);--accent-9-contrast:var(--bronze-9-contrast);--accent-10:var(--bronze-10);--accent-11:var(--bronze-11);--accent-12:var(--bronze-12);--accent-a1:var(--bronze-a1);--accent-a2:var(--bronze-a2);--accent-a3:var(--bronze-a3);--accent-a4:var(--bronze-a4);--accent-a5:var(--bronze-a5);--accent-a6:var(--bronze-a6);--accent-a7:var(--bronze-a7);--accent-a8:var(--bronze-a8);--accent-a9:var(--bronze-a9);--accent-a10:var(--bronze-a10);--accent-a11:var(--bronze-a11);--accent-a12:var(--bronze-a12)}[data-accent-color=gray]{--color-surface-accent:var(--gray-surface);--accent-1:var(--gray-1);--accent-2:var(--gray-2);--accent-3:var(--gray-3);--accent-4:var(--gray-4);--accent-5:var(--gray-5);--accent-6:var(--gray-6);--accent-7:var(--gray-7);--accent-8:var(--gray-8);--accent-9:var(--gray-9);--accent-9-contrast:var(--gray-9-contrast);--accent-10:var(--gray-10);--accent-11:var(--gray-11);--accent-12:var(--gray-12);--accent-a1:var(--gray-a1);--accent-a2:var(--gray-a2);--accent-a3:var(--gray-a3);--accent-a4:var(--gray-a4);--accent-a5:var(--gray-a5);--accent-a6:var(--gray-a6);--accent-a7:var(--gray-a7);--accent-a8:var(--gray-a8);--accent-a9:var(--gray-a9);--accent-a10:var(--gray-a10);--accent-a11:var(--gray-a11);--accent-a12:var(--gray-a12)}:root{--sy-f-sys:-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Droid Sans,Helvetica Neue;--sy-f-cjk:PingFang SC,Hiragino Sans GB,Droid Sans Fallback,Microsoft YaHei;--sy-f-heading:var(--sy-f-sys),var(--sy-f-cjk),sans-serif;--sy-f-text:var(--sy-f-sys),var(--sy-f-cjk),sans-serif;--sy-f-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--sy-s-banner-height:0rem;--sy-s-navbar-height:56px;--sy-s-offset-top:calc(var(--sy-s-navbar-height) + var(--sy-s-banner-height));--sy-c-divider:var(--gray-4);--sy-c-border:var(--gray-5);--sy-c-text:var(--gray-12);--sy-c-light:var(--gray-11);--sy-c-bold:var(--slate-12);--sy-c-heading:var(--sage-12);--sy-c-link:var(--accent-9);--sy-c-link-hover:var(--accent-a11);--sy-c-background:#fff;--sy-c-surface:var(--gray-a2);--sy-c-overlay:var(--black-a5);--sy-c-background-contrast:#000;--sy-c-foot-text:var(--sy-c-text);--sy-c-foot-background:var(--slate-2);--sy-c-foot-divider:var(--sy-c-divider);--sy-dropdown-shadow:0 12px 32px var(--gray-a6),0 2px 6px var(--gray-a4)}[data-accent-color=amber],[data-accent-color=lime],[data-accent-color=mint],[data-accent-color=sky],[data-accent-color=yellow]{--sy-c-link:var(--accent-a10)}html.light{color-scheme:light;--sy-c-background:#fff;--sy-c-background-contrast:#000}html.dark{color-scheme:dark;--sy-c-background:var(--slate-1);--sy-c-overlay:var(--white-a2);--sy-c-background-contrast:var(--white-a10);--sy-c-foot-background:var(--black-a11);--sy-c-foot-divider:var(--black-a12)}html{color:var(--sy-c-text);background-color:var(--sy-c-background)}:root{--lucide-alert-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3zM12 9v4m0 4h.01'/%3E%3C/svg%3E");--lucide-arrows-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m7 15 5 5 5-5M7 9l5-5 5 5'/%3E%3C/svg%3E");--lucide-award-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='8' r='6'/%3E%3Cpath d='M15.477 12.89 17 22l-5-3-5 3 1.523-9.11'/%3E%3C/svg%3E");--lucide-bell-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9m-4.27 13a2 2 0 0 1-3.46 0'/%3E%3C/svg%3E");--lucide-bookmark-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z'/%3E%3C/svg%3E");--lucide-calendar-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Crect width='18' height='18' x='3' y='4' rx='2' ry='2'/%3E%3Cpath d='M16 2v4M8 2v4m-5 4h18'/%3E%3C/svg%3E");--lucide-check-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");--lucide-chevron-down-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-chevron-down'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");--lucide-chevron-left-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-chevron-left'%3E%3Cpath d='m15 18-6-6 6-6'/%3E%3C/svg%3E");--lucide-chevron-right-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-chevron-right'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E");--lucide-chevron-up-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-chevron-up'%3E%3Cpath d='m18 15-6-6-6 6'/%3E%3C/svg%3E");--lucide-close-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M18 6 6 18M6 6l12 12'/%3E%3C/svg%3E");--lucide-external-link-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M13 5h6v6m0-6L5 19'/%3E%3C/svg%3E");--lucide-flame-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z'/%3E%3C/svg%3E");--lucide-git-fork-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='18' r='3'/%3E%3Ccircle cx='6' cy='6' r='3'/%3E%3Ccircle cx='18' cy='6' r='3'/%3E%3Cpath d='M18 9v1a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V9m6 3v3'/%3E%3C/svg%3E");--lucide-help-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3m.08 4h.01'/%3E%3C/svg%3E");--lucide-languages-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-languages'%3E%3Cpath d='m5 8 6 6m-7 0 6-6 2-3M2 5h12M7 2h1m14 20-5-10-5 10m2-4h6'/%3E%3C/svg%3E");--lucide-laptop-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Crect width='18' height='12' x='3' y='4' rx='2' ry='2'/%3E%3Cpath d='M2 20h20'/%3E%3C/svg%3E");--lucide-link-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71'/%3E%3Cpath d='M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'/%3E%3C/svg%3E");--lucide-menu-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-menu'%3E%3Cpath d='M4 12h16M4 6h16M4 18h16'/%3E%3C/svg%3E");--lucide-milestone-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M18 6H5a2 2 0 0 0-2 2v3a2 2 0 0 0 2 2h13l4-3.5L18 6zm-6 7v8m0-18v3'/%3E%3C/svg%3E");--lucide-moon-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M12 3a6.364 6.364 0 0 0 9 9 9 9 0 1 1-9-9z'/%3E%3C/svg%3E");--lucide-outdent-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m7 8-4 4 4 4m14-4H11m10-6H11m10 12H11'/%3E%3C/svg%3E");--lucide-rocket-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09zM12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z'/%3E%3Cpath d='M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0m1 7v5s3.03-.55 4-2c1.08-1.62 0-5 0-5'/%3E%3C/svg%3E");--lucide-skull-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='9' cy='12' r='1'/%3E%3Ccircle cx='15' cy='12' r='1'/%3E%3Cpath d='M8 20v2h8v-2m-3.5-3-.5-1-.5 1h1z'/%3E%3Cpath d='M16 20a2 2 0 0 0 1.56-3.25 8 8 0 1 0-11.12 0A2 2 0 0 0 8 20'/%3E%3C/svg%3E");--lucide-star-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z'/%3E%3C/svg%3E");--lucide-sun-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32 1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E");--lucide-zap-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M13 2 3 14h9l-1 8 10-12h-9l1-8z'/%3E%3C/svg%3E")}.i-lucide.alert{--icon-url:var(--lucide-alert-url)}.i-lucide.arrows{--icon-url:var(--lucide-arrows-url)}.i-lucide.award{--icon-url:var(--lucide-award-url)}.i-lucide.bell{--icon-url:var(--lucide-bell-url)}.i-lucide.bookmark{--icon-url:var(--lucide-bookmark-url)}.i-lucide.calendar{--icon-url:var(--lucide-calendar-url)}.i-lucide.check{--icon-url:var(--lucide-check-url)}.i-lucide.chevron-down{--icon-url:var(--lucide-chevron-down-url)}.i-lucide.chevron-left{--icon-url:var(--lucide-chevron-left-url)}.i-lucide.chevron-right{--icon-url:var(--lucide-chevron-right-url)}.i-lucide.chevron-up{--icon-url:var(--lucide-chevron-up-url)}.i-lucide.close{--icon-url:var(--lucide-close-url)}.i-lucide.external-link{--icon-url:var(--lucide-external-link-url)}.i-lucide.flame{--icon-url:var(--lucide-flame-url)}.i-lucide.git-fork{--icon-url:var(--lucide-git-fork-url)}.i-lucide.help{--icon-url:var(--lucide-help-url)}.i-lucide.languages{--icon-url:var(--lucide-languages-url)}.i-lucide.laptop{--icon-url:var(--lucide-laptop-url)}.i-lucide.link{--icon-url:var(--lucide-link-url)}.i-lucide.menu{--icon-url:var(--lucide-menu-url)}.i-lucide.milestone{--icon-url:var(--lucide-milestone-url)}.i-lucide.moon{--icon-url:var(--lucide-moon-url)}.i-lucide.outdent{--icon-url:var(--lucide-outdent-url)}.i-lucide.rocket{--icon-url:var(--lucide-rocket-url)}.i-lucide.skull{--icon-url:var(--lucide-skull-url)}.i-lucide.star{--icon-url:var(--lucide-star-url)}.i-lucide.sun{--icon-url:var(--lucide-sun-url)}.i-lucide.zap{--icon-url:var(--lucide-zap-url)}:root{--simpleicons-bitbucket-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M.778 1.213a.768.768 0 0 0-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 0 0 .77-.646l3.27-20.03a.768.768 0 0 0-.768-.891zM14.52 15.53H9.522L8.17 8.466h7.561z'/%3E%3C/svg%3E");--simpleicons-discord-url:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z'/%3E%3C/svg%3E");--simpleicons-git-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.546 10.93 13.067.452a1.55 1.55 0 0 0-2.188 0L8.708 2.627l2.76 2.76a1.838 1.838 0 0 1 2.327 2.341l2.658 2.66a1.838 1.838 0 0 1 1.9 3.039 1.837 1.837 0 0 1-2.6 0 1.846 1.846 0 0 1-.404-1.996L12.86 8.955v6.525c.176.086.342.203.488.348a1.848 1.848 0 0 1 0 2.6 1.844 1.844 0 0 1-2.609 0 1.834 1.834 0 0 1 0-2.598c.182-.18.387-.316.605-.406V8.835a1.834 1.834 0 0 1-.996-2.41L7.636 3.7.45 10.881c-.6.605-.6 1.584 0 2.189l10.48 10.477a1.545 1.545 0 0 0 2.186 0l10.43-10.43a1.544 1.544 0 0 0 0-2.187'/%3E%3C/svg%3E");--simpleicons-github-url:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");--simpleicons-gitlab-url:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m23.6 9.593-.033-.086L20.3.98a.851.851 0 0 0-.336-.405.875.875 0 0 0-1 .054.875.875 0 0 0-.29.44L16.47 7.818H7.537L5.332 1.07a.857.857 0 0 0-.29-.441.875.875 0 0 0-1-.054.859.859 0 0 0-.336.405L.433 9.502l-.032.086a6.066 6.066 0 0 0 2.012 7.01l.01.009.03.021 4.977 3.727 2.462 1.863 1.5 1.132a1.008 1.008 0 0 0 1.22 0l1.499-1.132 2.461-1.863 5.006-3.75.013-.01a6.068 6.068 0 0 0 2.01-7.002z'/%3E%3C/svg%3E");--simpleicons-linkedin-url:url("data:image/svg+xml;utf8,%3Csvg role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3ELinkedIn%3C/title%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E");--simpleicons-mastodon-url:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E");--simpleicons-readthedocs-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.732 0a59.316 59.316 0 0 0-4.977.218V24a62.933 62.933 0 0 1 3.619-.687c.17-.028.34-.053.509-.078.215-.033.43-.066.644-.096l.205-.03zm1.18.003V22.96a61.042 61.042 0 0 1 12.333-.213V1.485A60.859 60.859 0 0 0 8.912.003zm1.707 1.81a.59.59 0 0 1 .015 0c3.06.088 6.125.404 9.167.95a.59.59 0 0 1 .476.686.59.59 0 0 1-.569.484.59.59 0 0 1-.116-.009 60.622 60.622 0 0 0-8.992-.931.59.59 0 0 1-.573-.607.59.59 0 0 1 .592-.572zm-4.212.028a.59.59 0 0 1 .578.565.59.59 0 0 1-.564.614 59.74 59.74 0 0 0-2.355.144.59.59 0 0 1-.04.002.59.59 0 0 1-.595-.542.59.59 0 0 1 .54-.635c.8-.065 1.6-.114 2.401-.148a.59.59 0 0 1 .035 0zm4.202 2.834a.59.59 0 0 1 .015 0 61.6 61.6 0 0 1 9.167.8.59.59 0 0 1 .488.677.59.59 0 0 1-.602.494.59.59 0 0 1-.076-.006 60.376 60.376 0 0 0-8.99-.786.59.59 0 0 1-.584-.596.59.59 0 0 1 .582-.583zm-4.211.097a.59.59 0 0 1 .587.555.59.59 0 0 1-.554.622c-.786.046-1.572.107-2.356.184a.59.59 0 0 1-.04.003.59.59 0 0 1-.603-.533.59.59 0 0 1 .53-.644c.8-.078 1.599-.14 2.4-.187a.59.59 0 0 1 .036 0zM10.6 7.535a.59.59 0 0 1 .015 0c3.06-.013 6.125.204 9.167.65a.59.59 0 0 1 .498.67.59.59 0 0 1-.593.504.59.59 0 0 1-.076-.006 60.142 60.142 0 0 0-8.992-.638.59.59 0 0 1-.592-.588.59.59 0 0 1 .573-.592zm1.153 2.846a61.093 61.093 0 0 1 8.02.515.59.59 0 0 1 .509.66.59.59 0 0 1-.586.514.59.59 0 0 1-.076-.005 59.982 59.982 0 0 0-8.99-.492.59.59 0 0 1-.603-.577.59.59 0 0 1 .578-.603c.382-.008.765-.012 1.148-.012zm1.139 2.832a60.92 60.92 0 0 1 6.871.394.59.59 0 0 1 .52.652.59.59 0 0 1-.577.523.59.59 0 0 1-.076-.004 59.936 59.936 0 0 0-8.991-.344.59.59 0 0 1-.61-.568.59.59 0 0 1 .567-.611c.765-.028 1.53-.042 2.296-.042z'/%3E%3C/svg%3E");--simpleicons-reddit-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286A.72.72 0 0 0 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199a1.999 1.999 0 1 1-1.947 2.46v.002a2.368 2.368 0 0 0-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363a2.802 2.802 0 1 1 2.908 4.753c-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87a2.8 2.8 0 0 1 1.189-5.34c.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01a3.229 3.229 0 0 1 2.88-3.207 2 2 0 0 1 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135a.222.222 0 0 0-.183.305 3.199 3.199 0 0 0 2.953 1.964 3.2 3.2 0 0 0 2.953-1.964.222.222 0 0 0-.184-.305 27.75 27.75 0 0 0-2.769-.135Z'/%3E%3C/svg%3E");--simpleicons-slack-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E");--simpleicons-x-twitter-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E");--simpleicons-youtube-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.i-icon.bitbucket,.i-simpleicons.bitbucket{--icon-url:var(--simpleicons-bitbucket-url)}.i-icon.discord,.i-simpleicons.discord{--icon-url:var(--simpleicons-discord-url)}.i-icon.git,.i-simpleicons.git{--icon-url:var(--simpleicons-git-url)}.i-icon.github,.i-simpleicons.github{--icon-url:var(--simpleicons-github-url)}.i-icon.gitlab,.i-simpleicons.gitlab{--icon-url:var(--simpleicons-gitlab-url)}.i-icon.linkedin,.i-simpleicons.linkedin{--icon-url:var(--simpleicons-linkedin-url)}.i-icon.mastodon,.i-simpleicons.mastodon{--icon-url:var(--simpleicons-mastodon-url)}.i-icon.readthedocs,.i-simpleicons.readthedocs{--icon-url:var(--simpleicons-readthedocs-url)}.i-icon.reddit,.i-simpleicons.reddit{--icon-url:var(--simpleicons-reddit-url)}.i-icon.slack,.i-simpleicons.slack{--icon-url:var(--simpleicons-slack-url)}.i-icon.x-twitter,.i-simpleicons.x-twitter{--icon-url:var(--simpleicons-x-twitter-url)}.i-icon.youtube,.i-simpleicons.youtube{--icon-url:var(--simpleicons-youtube-url)}:root{--yue-c-text:var(--sy-c-text);--yue-c-heading:var(--sy-c-heading);--yue-c-bold:var(--sy-c-bold);--yue-c-link-1:var(--sy-c-text);--yue-c-link-2:var(--sy-c-bold);--yue-c-link-border:var(--sy-c-link);--yue-c-ol-marker:var(--gray-9);--yue-c-ul-marker:var(--sage-a5);--yue-c-hr:var(--sy-c-border);--yue-c-quote:var(--sy-c-text);--yue-c-quote-border:var(--accent-a3);--yue-c-quote-symbol:var(--accent-9);--yue-c-caption:var(--sy-c-light);--yue-c-code-text:var(--accent-a11);--yue-c-code-background:var(--accent-a3);--yue-c-table-border:var(--gray-a5);--yue-c-th-background:var(--color-surface-accent);--yue-c-th-border:var(--gray-a5);--yue-c-td-border:var(--gray-a4);--yue-c-row-background:var(--sy-c-surface)}.yue{font-size:1rem;line-height:1.75;color:var(--yue-c-text)}.yue p{margin-top:1rem;margin-bottom:1.25rem}.yue a{color:var(--yue-c-link-1);font-weight:500;text-decoration:none;border-bottom:1px solid var(--yue-c-link-border)}.yue a:hover{color:var(--yue-c-link-2);border-bottom-width:2px}.yue pre a,.yue pre a:hover{border-bottom:none}.yue strong{color:var(--yue-c-bold);font-weight:600}.yue a strong,.yue blockquote strong,.yue thead th strong{color:inherit}.yue ol{margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.yue ol,.yue ol[type="1"]{list-style-type:decimal}.yue ol.upperalpha,.yue ol[type=A]{list-style-type:upper-alpha}.yue ol.loweralpha,.yue ol[type=a]{list-style-type:lower-alpha}.yue ol.upperroman,.yue ol[type=I]{list-style-type:upper-roman}.yue ol.lowerroman,.yue ol[type=i]{list-style-type:lower-roman}.yue ul{list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.yue ol>li::marker{font-weight:400;color:var(--yue-c-ol-marker)}.yue ul>li::marker{color:var(--yue-c-ul-marker)}.yue dl{margin-top:1.5rem;margin-bottom:1.5rem}.yue dt{color:var(--yue-c-bold);font-weight:600}.yue dd{margin-left:1.5rem}.yue hr{border-color:var(--yue-c-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.yue blockquote{color:var(--yue-c-quote);border-left-width:.25rem;border-left-color:var(--yue-c-quote-border);margin-top:1.2rem;margin-bottom:1.2rem;padding-left:1rem}.yue blockquote .attribution{font-size:.85em;font-style:italic}[lang=ja] .yue blockquote .attribution,[lang=ko] .yue blockquote .attribution,[lang^=zh] .yue blockquote .attribution{font-style:normal}.yue h1{color:var(--yue-c-heading);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.yue h1 strong{font-weight:900;color:inherit}.yue h2{color:var(--yue-c-heading);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.yue h2 strong{font-weight:800;color:inherit}.yue h3{color:var(--yue-c-heading);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.yue h3 strong{font-weight:700;color:inherit}.yue h4{color:var(--yue-c-heading);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.yue h4 strong{font-weight:700;color:inherit}.yue h5,.yue h6{color:var(--yue-c-heading);font-weight:600}.yue img{display:inline;margin-top:2em;margin-bottom:2em}.yue img.rounded{border-radius:.5rem}.yue a>img,.yue figure img,.yue figure>*{margin-top:0;margin-bottom:0}.yue figcaption{color:var(--yue-c-caption);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.yue figcaption>p{margin-top:0}.yue code{color:var(--yue-c-code-text);font-weight:600;font-size:.875em}.yue a code,.yue blockquote code,.yue h1 code,.yue h2 code,.yue h3 code,.yue h4 code,.yue th code{color:inherit}.yue h2 code{font-size:.875em}.yue li>code,.yue p>code{padding:2px 4px;border-radius:3px;font-weight:500;background-color:var(--yue-c-code-background)}.yue h3 code{font-size:.9em}.yue kbd{font-family:var(--sy-f-mono)}.yue figure,.yue video{margin-top:2em;margin-bottom:2em}.yue li{margin-top:.5em;margin-bottom:.5em}.yue ol>li,.yue ul>li{padding-left:.375em}.yue ol ol,.yue ol ul,.yue ul ol,.yue ul ul{margin-top:.75em;margin-bottom:.75em}.yue h2+*,.yue h3+*,.yue h4+*,.yue hr+*{margin-top:0}.yue table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.86em;line-height:1.7}.yue table>caption{margin-bottom:.4rem;color:var(--yue-c-caption)}.yue thead tr{border-bottom-width:1px;border-bottom-color:var(--yue-c-th-border)}.yue thead th{color:var(--yue-c-heading);font-weight:600;vertical-align:middle}.yue tbody tr{border-bottom-width:1px;border-bottom-color:var(--yue-c-td-border)}.yue tbody tr:last-child{border-bottom-width:0}.yue tbody td{vertical-align:middle}.yue tfoot{border-top-width:1px;border-top-color:var(--yue-c-th-border)}.yue tfoot td{vertical-align:top}.yue td>p{margin:.25rem 0}.yue thead th>p{margin:0}.yue tbody td,.yue tfoot td,.yue thead th{padding:.5rem}.yue section{clear:both}.yue section>div{margin-bottom:2rem}.yue dd>p:first-child{margin-top:0}.yue p.lead{font-size:1.2rem;color:var(--sy-c-light);margin-bottom:0}.yue p.lead+hr{margin-top:1rem}.yue p.rubric{color:var(--yue-c-heading);font-weight:600;margin-top:2rem}.yue .sidebar{background-color:var(--sy-c-surface);border:1px solid var(--sy-c-border);border-radius:6px;clear:right;float:right;margin-left:1rem;margin-bottom:1rem;margin-right:0;width:30%}@media (max-width:767px){.yue .sidebar{float:none;width:100%;margin-left:0}}.yue .sidebar>*{padding-left:1rem;padding-right:1rem}.yue .sidebar img{margin-top:1rem;margin-bottom:1rem}.yue .sidebar-title{font-weight:500;border-bottom:1px solid var(--sy-c-border);margin:0;padding-top:.5rem;padding-bottom:.5rem}.yue dl.simple>dd>p,.yue ol.simple>li>p,.yue ul.simple>li>p{margin:0}.yue a.headerlink{visibility:hidden;margin-left:6px;color:var(--sy-c-light);font-weight:300;font-size:58%;font-family:var(--sy-f-mono);--icon-url:var(--lucide-link-url);-webkit-mask:var(--icon-url) no-repeat;mask:var(--icon-url) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;width:1em;height:1em;display:inline-block;vertical-align:middle;font-style:normal;background-color:currentColor}.yue .math a.headerlink,h1:hover a.headerlink,h2:hover a.headerlink,h3:hover a.headerlink,h4:hover a.headerlink,h5:hover a.headerlink,h6:hover a.headerlink{visibility:visible}.yue .toctree-wrapper a,.yue a.image-reference{border-bottom:none}.yue .toctree-wrapper p.caption{font-size:.86rem;font-weight:500;font-family:var(--sy-f-heading);color:var(--sy-c-light);text-transform:uppercase;letter-spacing:.4px;padding:.8rem 0 .4rem;border-bottom:1px solid var(--sy-c-divider)}.yue .align-left{clear:left;float:left;margin:0 1rem 1rem}.yue .align-right{clear:right;float:right;margin:0 1rem 1rem}.yue .align-center{display:block;text-align:center}.yue .align-center,.yue figure.align-center img{margin-left:auto;margin-right:auto}a.footnote-reference{font-size:.65rem;vertical-align:top}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>p,div.citation>p{margin-bottom:.5rem;margin-top:.5rem;margin-left:2rem}.yue kbd.kbd:not(.compound){font-size:.86rem;padding:2px 5px;border-radius:3px;margin-right:.25rem}.yue kbd.compound>kbd{margin-left:.25rem}.yue .menuselection{font-weight:500;font-size:.86rem}.light .searchbox kbd,.light .yue kbd.kbd:not(.compound){border:0;background:linear-gradient(-225deg,#e6e6e6,#f8f8f8);box-shadow:inset 0 -2px #dbdbdb,inset 0 0 1px 1px #fff,0 1px 2px 1px #50505066}.dark .searchbox kbd,.dark .yue kbd.kbd:not(.compound){border:0;background:linear-gradient(-225deg,#353434,#141414);box-shadow:inset 0 -2px #373737,inset 0 0 1px 1px #222,0 1px 2px 1px #000}.yue p.centered{text-align:center}.hlist td{vertical-align:top}.dark .dark-hidden,.dark .light-only,.light .dark-only,.light .light-hidden{display:none}.yue .genindex-jumpbox,.yue .modindex-jumpbox{border-top:1px solid var(--sy-c-border);border-bottom:1px solid var(--sy-c-border);padding:2px .4rem}.yue table.modindextable td:first-of-type{width:28px}.yue table.modindextable img.toggler{margin:0}.yue table.modindextable tr.cap{font-size:1.12rem;background:var(--sy-c-surface);font-family:var(--sy-f-mono)}.yue h2+table.indextable,.yue table.indextable ul{margin-top:0}:root{--attention-icon:var(--lucide-alert-url);--attention-1:var(--crimson-surface);--attention-2:var(--crimson-a3);--attention-3:var(--crimson-9);--attention-4:var(--crimson-a11);--caution-icon:var(--lucide-zap-url);--caution-1:var(--amber-surface);--caution-2:var(--amber-a3);--caution-3:var(--amber-9);--caution-4:var(--amber-11);--danger-icon:var(--lucide-skull-url);--danger-1:var(--ruby-surface);--danger-2:var(--ruby-a3);--danger-3:var(--ruby-9);--danger-4:var(--ruby-a11);--error-icon:var(--lucide-close-url);--error-1:var(--red-surface);--error-2:var(--red-a3);--error-3:var(--red-9);--error-4:var(--red-a11);--hint-icon:var(--lucide-bell-url);--hint-1:var(--cyan-surface);--hint-2:var(--cyan-a3);--hint-3:var(--cyan-9);--hint-4:var(--cyan-a11);--important-icon:var(--lucide-flame-url);--important-1:var(--violet-surface);--important-2:var(--violet-a3);--important-3:var(--violet-9);--important-4:var(--violet-a11);--note-icon:var(--lucide-calendar-url);--note-1:var(--blue-surface);--note-2:var(--blue-a3);--note-3:var(--blue-9);--note-4:var(--blue-a11);--tip-icon:var(--lucide-rocket-url);--tip-1:var(--green-surface);--tip-2:var(--green-a3);--tip-3:var(--green-9);--tip-4:var(--green-a11);--warning-icon:var(--lucide-zap-url);--warning-1:var(--orange-surface);--warning-2:var(--orange-a3);--warning-3:var(--orange-9);--warning-4:var(--orange-a11);--seealso-icon:var(--lucide-link-url);--seealso-1:var(--gold-surface);--seealso-2:var(--gold-a3);--seealso-3:var(--gold-9);--seealso-4:var(--gold-a11);--todo-icon:var(--lucide-bookmark-url);--todo-1:var(--bronze-surface);--todo-2:var(--bronze-a3);--todo-3:var(--bronze-9);--todo-4:var(--bronze-a11);--versionadded-1:var(--green-surface);--versionadded-2:var(--green-9);--versionchanged-1:var(--amber-surface);--versionchanged-2:var(--amber-9);--deprecated-1:var(--red-surface);--deprecated-2:var(--red-9)}.admonition{--icon-url:var(--lucide-bell-url);--color-1:var(--color-surface-accent);--color-2:var(--accent-a3);--color-3:var(--accent-9);--color-4:var(--accent-a11);position:relative;padding:.825rem 1rem;margin-top:1rem;margin-bottom:1rem;border-left:4px solid var(--color-3);background-color:var(--color-1)}.admonition:before{position:absolute;content:"";top:6px;left:-12px;width:20px;height:20px;border-radius:100%;background-color:var(--color-3)}.admonition:after{position:absolute;content:"";top:10px;left:-8px;-webkit-mask:var(--icon-url) no-repeat;mask:var(--icon-url) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;font-style:normal;width:12px;height:12px;background-color:#fff}.admonition p.admonition-title{position:relative;margin:-.825rem -1rem .825rem -19px;padding:4px 18px;font-size:.85rem;font-weight:600;line-height:1.72;color:var(--color-4);background-color:var(--color-2);--yue-c-code:var(--color-4);--yue-c-bold:var(--color-4)}.admonition p.admonition-title svg{display:inline-block}.admonition.attention{--icon-url:var(--attention-icon);--color-1:var(--attention-1);--color-2:var(--attention-2);--color-3:var(--attention-3);--color-4:var(--attention-4)}.admonition.caution{--icon-url:var(--caution-icon);--color-1:var(--caution-1);--color-2:var(--caution-2);--color-3:var(--caution-3);--color-4:var(--caution-4)}.admonition.danger{--icon-url:var(--danger-icon);--color-1:var(--danger-1);--color-2:var(--danger-2);--color-3:var(--danger-3);--color-4:var(--danger-4)}.admonition.error{--icon-url:var(--error-icon);--color-1:var(--error-1);--color-2:var(--error-2);--color-3:var(--error-3);--color-4:var(--error-4)}.admonition.hint{--icon-url:var(--hint-icon);--color-1:var(--hint-1);--color-2:var(--hint-2);--color-3:var(--hint-3);--color-4:var(--hint-4)}.admonition.important{--icon-url:var(--important-icon);--color-1:var(--important-1);--color-2:var(--important-2);--color-3:var(--important-3);--color-4:var(--important-4)}.admonition.note{--icon-url:var(--note-icon);--color-1:var(--note-1);--color-2:var(--note-2);--color-3:var(--note-3);--color-4:var(--note-4)}.admonition.tip{--icon-url:var(--tip-icon);--color-1:var(--tip-1);--color-2:var(--tip-2);--color-3:var(--tip-3);--color-4:var(--tip-4)}.admonition.warning{--icon-url:var(--warning-icon);--color-1:var(--warning-1);--color-2:var(--warning-2);--color-3:var(--warning-3);--color-4:var(--warning-4)}.admonition.seealso{--icon-url:var(--seealso-icon);--color-1:var(--seealso-1);--color-2:var(--seealso-2);--color-3:var(--seealso-3);--color-4:var(--seealso-4)}.admonition.admonition-todo{--icon-url:var(--todo-icon);--color-1:var(--todo-1);--color-2:var(--todo-2);--color-3:var(--todo-3);--color-4:var(--todo-4)}.yue .admonition>*{margin-top:0}.yue .admonition>:last-child{margin-bottom:0!important}span.versionmodified{color:var(--sy-c-bold);font-weight:600}div.deprecated,div.versionadded,div.versionchanged{position:relative;padding:6px 1rem;margin:1rem 0;border-left:4px solid var(--color-2);background-color:var(--color-1);line-height:1.72}div.deprecated:before,div.versionadded:before,div.versionchanged:before{position:absolute;content:var(--version-icon);top:10px;left:-12px;color:#fff;width:20px;height:20px;border-radius:100%;background-color:var(--color-2);text-align:center;font:normal 700 14px/20px var(--sy-f-mono)}div.versionadded{--color-1:var(--versionadded-1);--color-2:var(--versionadded-2);--version-icon:"#"}div.versionchanged{--color-1:var(--versionchanged-1);--color-2:var(--versionchanged-2);--version-icon:"%"}div.deprecated{--color-1:var(--deprecated-1);--color-2:var(--deprecated-2);--version-icon:"!"}div.deprecated>p,div.versionadded>p,div.versionchanged>p{margin:0}.yue blockquote.epigraph{padding:1rem 2.4rem;border-left:0;text-align:center}.yue blockquote.highlights{border-left-width:4px;padding-top:.2rem;padding-bottom:.2rem;background-color:var(--sy-c-surface)}.yue blockquote.pull-quote{position:relative;font-size:1.24rem;padding:2.4rem 3.6rem 1.2rem;border-left:0}.yue blockquote.pull-quote:before{content:"\201c";position:absolute;top:0;left:.5rem;color:var(--yue-c-quote-symbol);font:700 4rem/1 Times New Roman,Georgia,Palatino,Times,serif}.yue blockquote.pull-quote .attribution{text-align:right}pre.literal-block{line-height:1.48;padding:1rem;font-size:.96rem;background-color:var(--syntax-pre-bg);border-radius:6px;overflow:auto}.highlight,.literal-block-wrapper{--margin:1rem;--radius:6px}.literal-block-wrapper div[class^=highlight-]{display:flex}.literal-block-wrapper .highlight{width:100%}.highlight>pre{line-height:1.48;padding:var(--margin);font-size:.96rem;font-family:var(--sy-f-mono);background-color:var(--syntax-pre-bg);border-radius:var(--radius);overflow:auto}.win .highlight>pre{font-family:"Twemoji Country Flags",var(--sy-f-mono)}.highlight .linenos{display:inline-block;box-shadow:-.05rem 0 var(--syntax-linenos-divider) inset;-webkit-user-select:none;-moz-user-select:none;user-select:none;margin-right:.8rem;padding-right:.8rem;opacity:.6}.highlight .hll{margin-left:calc(0rem - var(--margin));margin-right:calc(0rem - var(--margin));padding:0 var(--margin)}.code-block-caption{display:flex;font-size:.84rem;font-weight:600;color:var(--syntax-text);background-color:var(--syntax-cap-bg);padding:.4rem var(--margin);border-radius:var(--radius) var(--radius) 0 0}.code-block-caption+div>.highlight>pre{border-top-left-radius:0;border-top-right-radius:0}div[class^=highlight]>.highlight>pre{display:grid}.yue .table-wrapper{width:100%;overflow-x:auto;margin-top:2rem;margin-bottom:2rem;border:1px solid var(--yue-c-table-border);border-radius:6px}.yue .table-wrapper table{margin:0}.yue .table-wrapper thead tr{border-top:1px solid var(--yue-c-td-border)}.yue .table-wrapper thead tr:first-child{border-top:0}.yue .table-wrapper th{background-color:var(--yue-c-th-background);border-left:1px solid var(--yue-c-td-border);padding:.725rem 1rem}.yue .table-wrapper td{border-left:1px solid var(--yue-c-td-border);padding:.5rem 1rem}.yue .table-wrapper tr>td:first-child,.yue .table-wrapper tr>th:first-child{border-left:0}.yue .table-wrapper caption{padding:.5rem;margin:0;border-bottom:1px solid var(--yue-c-th-border)}.yue .table-wrapper tbody tr.row-odd{background-color:var(--yue-c-row-background)}.yue table.hlist td{vertical-align:top}.table-wrapper{overflow-x:auto;scrollbar-gutter:auto}.table-wrapper::-webkit-scrollbar{height:.75rem;width:.75rem}.table-wrapper::-webkit-scrollbar-thumb{border-radius:10px}.table-wrapper::-webkit-scrollbar-track{background-color:transparent}.table-wrapper:hover::-webkit-scrollbar-thumb{background-color:hsla(0,0%,61%,.2);background-clip:content-box;border:3px solid transparent}.yue table.ghost td,.yue table.ghost th{border-left:0;border-right:0;background-color:transparent}.yue table.ghost caption{margin-bottom:0;padding-bottom:.5rem;border-bottom:3px solid var(--yue-c-td-border)}.yue table.ghost thead tr:first-child{border-top:0;border-bottom-width:3px}.yue .table-wrapper.ghost{border:0}:root{--sig-property:var(--syntax-keyword);--sig-name:var(--syntax-property);--sig-typehint:var(--syntax-constant);--sig-param:var(--syntax-meta)}dt.sig{position:relative;font-size:.92rem;padding:.25rem .5rem .25rem 3rem;text-indent:-2.4rem;border-radius:6px}dt.sig:after{content:"";display:table;clear:both}dt.sig:hover{background:var(--sy-c-surface)}dt.sig+dd{font-size:.92rem;margin-left:2rem}dt.sig>em.property:first-child{color:var(--sig-property)}dl.field-list a{font-weight:400}dt.sig+dd>div{margin-bottom:1rem}dt.sig+dd>dl.field-list>dt{text-transform:uppercase;font-size:.76rem}em.property,em.sig-param{font-style:normal}em.sig-param{color:var(--sy-c-light)}span.sig-name,span.sig-prename{color:var(--sig-name)}span.sig-name{font-weight:600}span.sig-return-icon{color:var(--sy-c-light)}span.sig-return-typehint,span.sig-return-typehint>a{color:var(--sig-typehint)}span.pre,span.sig-paren{font-family:var(--sy-f-mono)}dt.sig>a.internal{font-size:.82rem;border:0;color:var(--sy-c-light)}dt.sig>a.internal:before{content:"\a";white-space:pre}.viewcode-block{position:relative}.viewcode-back{position:absolute;top:-1.5rem;font-size:.8rem}.classifier{font-style:oblique;font-weight:400}.classifier:before{font-style:normal;margin-left:.1rem;margin-right:.5rem;content:":";display:inline-block}.yue .table-wrapper.autosummary{border-left:0;border-right:0;border-radius:0}.yue .table-wrapper table.autosummary td{border:none;padding-top:.25rem;padding-bottom:.25rem}.yue p.rubric+div.autosummary{margin-top:0}.hamburger{position:relative;display:inline-block;width:16px;height:14px;overflow:hidden;cursor:pointer}.hamburger>span{position:absolute;width:16px;height:2px;left:0;background-color:var(--sy-c-text);transition:top .25s,transform .25s}.hamburger_1{top:0}.hamburger_2{top:6px}.hamburger_3{top:12px}button[aria-expanded=true] .hamburger .hamburger_1{top:6px;transform:translate(0) rotate(225deg)}button[aria-expanded=true] .hamburger .hamburger_2{top:6px;transform:translate(18px)}button[aria-expanded=true] .hamburger .hamburger_3{top:6px;transform:translate(0) rotate(135deg)}.searchbox{position:relative}.searchbox input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;padding:6px 12px;font-size:.92rem;font-family:var(--sy-f-text);border-radius:6px;outline:0;background:var(--sy-c-surface)}.searchbox button,.searchbox kbd{position:absolute;font-size:.68rem;font-weight:600;font-family:var(--sy-f-mono);padding:2px 6px;margin:6px;right:0;border-radius:3px;border:1px solid var(--sy-c-border);background-color:var(--sy-c-background);opacity:1;transition:opacity .2s ease}.searchbox input:focus+kbd{opacity:0}.searchform{display:flex;position:relative;align-items:center}.searchform input[name=q]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;padding:6px 12px;font-size:.92rem;font-family:var(--sy-f-text);border-radius:6px;outline:0;background:var(--sy-c-surface)}.searchform input[name=q]+button{position:absolute;font-size:.68rem;font-weight:600;font-family:var(--sy-f-text);padding:2px 6px;margin:6px;right:0;border-radius:3px;border:1px solid var(--sy-c-divider);background-color:var(--sy-c-background);opacity:1;transition:opacity .2s ease}.search .highlighted{background-color:var(--accent-a4)}#search-results{border-top:1px solid var(--sy-c-border)}#search-results h2{margin-top:2rem;margin-bottom:.725rem}#search-results .search-summary{font-weight:500;color:var(--sy-c-light)}#search-results ul.search{list-style-type:none;margin-left:0;padding-left:0;padding-top:.625rem;padding-bottom:2rem}#search-results ul.search>li{padding-left:0}#search-results ul.search>li+li{padding-top:1rem;border-top:1px solid var(--sy-c-divider)}#search-results ul.search li>a{font-weight:600}#search-results ul.search p.context{margin-top:.5rem;font-size:.875rem}.demo{border:1px solid var(--sy-c-border);border-radius:6px}.demo-code .highlight>pre{border-bottom-left-radius:0;border-bottom-right-radius:0}.demo-result{padding:1rem}.container.image-1,.container.video-1{border:.5rem solid var(--accent-a3);border-radius:6px}.container.image-1>img{border-radius:4px;margin:0}.container.video-1 iframe,.container.video-1 video{border-radius:4px;width:100%;margin:0}.container.image-2,.container.video-2{border:1px solid var(--sy-c-border);padding:1rem;border-radius:6px}.container.image-2>img,.container.video-2>video{margin:0}.container.buttons{margin:2rem 0 4.2rem}.container.buttons>p{display:flex;gap:1rem}.container.buttons a{display:inline-block;padding:0 2rem;line-height:2.6rem;border-radius:2.6rem;border:2px solid var(--sy-c-border);font-weight:600;background-color:var(--sy-c-surface);transition:all .2s ease}.container.buttons a:first-child{color:var(--accent-9-contrast);background-color:var(--accent-9);border-color:var(--accent-9)}.container.buttons a:hover{color:var(--sy-c-bold);border-color:var(--accent-9);background-color:var(--sy-c-background)}#ethical-ad-placement .ethical-sidebar{position:relative;background-color:var(--sy-c-surface);border:none;padding:.8rem}#ethical-ad-placement .ethical-text a{color:var(--sy-c-text)!important}#ethical-ad-placement .ethical-text a:hover{color:var(--sy-c-link-hover)!important}.sy-main #ethical-ad-placement .ethical-sidebar{margin-left:0;max-width:380px}.sy-main #ethical-ad-placement .ethical-image-link{flex-shrink:0;margin-right:.4rem}.sy-main #ethical-ad-placement .ethical-content{display:flex}.sy-main #ethical-ad-placement .ethical-text{margin-top:0}.sy-main #ethical-ad-placement .ethical-callout{position:absolute;right:.4rem;bottom:.4rem}#carbonads{margin:1rem 0;position:relative;display:block;background-color:var(--sy-c-surface);border:none;border-radius:8px;padding:.8rem .8rem 1.6rem}#carbonads a{border:0;font-weight:400}#carbonads img{margin:0}.carbon-wrap{display:flex;align-items:center;justify-content:space-between;flex-direction:column}.carbon-text{display:block;margin:.5rem 0;line-height:1.42;font-size:.78rem;text-align:center}.carbon-text:hover{color:var(--sy-c-link-hover)}.carbon-poweredby{position:absolute;opacity:.68;right:.8rem;bottom:.5rem;font-size:.68rem;text-transform:uppercase}.carbon-poweredby:hover{text-decoration:underline}.sy-main #carbonads{max-width:380px;padding:1rem;margin-top:1.6rem}.sy-main .carbon-wrap{flex-direction:row;align-items:flex-start}.sy-main .carbon-text{text-align:left;margin-top:0;margin-left:1rem;font-size:.86rem}.bsa{margin:1rem 0}.bsa a{text-decoration:none;border-bottom:none}.bsa-container{display:flex;flex-flow:row nowrap;align-items:center;justify-content:space-between;padding:15px 20px;border-radius:6px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);text-decoration:none}.bsa-ad-via{text-align:right}.bsa-ad-via a{font-weight:300;font-size:10px;border:none;background:var(--gray-a3);padding:3px 10px;border-radius:2px}.bsa-main{display:flex;flex-grow:1;flex-flow:row nowrap;align-items:center;justify-content:center;margin:0 auto}.bsa-img{max-height:40px;margin-right:20px;line-height:0}.yue a.bsa-container .bsa-img{margin-top:0;margin-bottom:0}.bsa-details{display:flex;flex-flow:column nowrap;margin-right:20px}.bsa-tagline{margin-bottom:3px;font-weight:600;font-size:9px;line-height:1;letter-spacing:1.5px;text-transform:uppercase}.bsa-desc{max-width:600px;font-weight:400;font-size:12px;line-height:1.4;letter-spacing:1px}.bsa-cta{padding:10px 16px;transform:translateY(-1px);border-radius:3px;font-weight:600;font-size:10px;line-height:1;letter-spacing:1px;text-transform:uppercase;white-space:nowrap;transition:all .3s ease-in-out}@media (max-width:940px){.bsa-details{font-size:14px;margin-right:0}.bsa-cta{display:none}}@media (min-width:768px) and (max-width:820px){.bsa-img{display:none}}@media (max-width:480px){.bsa-img{display:none}}.repo-stats{margin-bottom:1rem;padding:.5rem;border:1px solid var(--sy-c-divider);border-radius:6px}.repo-stats:hover{background-color:var(--sy-c-surface)}.repo-stats-count{color:var(--sy-c-light)}.repo-stats strong{font-weight:500;font-family:var(--sy-f-mono);color:inherit}.edit-this-page{border-top:1px solid var(--sy-c-divider);margin:1rem 0;padding:.5rem 0;font-size:.8rem;font-weight:600}.repo-stats+.edit-this-page{border-top:0;margin-top:0;padding-top:0}.edit-this-page a{color:var(--sy-c-text)}.edit-this-page a:hover{color:var(--sy-c-link-hover)}.edit-this-page a:after{content:" →"}.back-to-top{display:none;align-items:center;gap:.25rem;position:fixed;z-index:10;bottom:68px;left:50%;transform:translateX(-50%);background:var(--sy-c-background);border-radius:2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.5);font-size:.8rem;padding:.4rem .8rem .4rem .6rem}.dark .back-to-top{background:var(--slate-2);box-shadow:0 .2rem .5rem hsla(0,0%,100%,.05),0 0 1px 0 rgba(154,164,184,.5)}.back-to-top:hover{color:var(--accent-9-contrast);background:var(--accent-9)}.back-to-top svg{height:1rem;width:1rem;fill:currentColor;display:inline-block}.back-to-top[data-visible=true]{display:flex}.icon-link,.icon-link span{display:inline-block}.icon-link span{vertical-align:middle}.icon-link .icon{padding:.1rem;border-radius:6px;border:1px solid var(--sy-c-border);margin-right:.4rem;opacity:.8}.icon-link svg{width:1.5rem;height:1.5rem}.icon-link:hover .icon{opacity:1}.announcement{position:sticky;top:0;left:0;width:100%;padding:.8rem 2rem;display:flex;align-items:center;color:var(--sy-c-banner,var(--accent-9-contrast));background-color:var(--sy-c-banner-bg,var(--accent-a11));z-index:20}.announcement a{text-decoration:underline}.announcement ::-moz-selection{color:var(--sy-c-banner,var(--accent-9-contrast))}.announcement ::selection{color:var(--sy-c-banner,var(--accent-9-contrast))}.announcement-inner{width:100%}.announcement-close{position:absolute;top:.8rem;right:1rem}.sy-head{position:sticky;top:var(--sy-s-banner-height);height:var(--sy-s-navbar-height);background-color:transparent;z-index:20}.sy-head-blur{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background-color:var(--sand-a1);box-shadow:0 0 var(--sy-c-background-contrast),0 2px 4px var(--gray-a1),0 1px 0 var(--sy-c-divider);z-index:-1}.sy-head-inner{display:flex;padding-left:max(env(safe-area-inset-right),1.5rem);padding-right:max(env(safe-area-inset-right),1rem);justify-content:space-between;align-items:center;height:var(--sy-s-navbar-height)}.sy-head-brand img{height:28px}.sy-head-brand .dark-logo,.sy-head-brand img+strong{display:none}.dark .sy-head-brand .dark-logo{display:inline}.dark .sy-head-brand .light-logo{display:none}.light .sy-head-brand .light-logo{display:inline}.light .sy-head-brand .dark-logo{display:none}.sy-head-links a,.sy-head-links button{padding:.5rem;font-size:.95rem;font-weight:500;white-space:nowrap}.sy-head-links .link i.external-link{font-size:68%;opacity:.6;color:var(--sy-c-light);margin-left:2px}.sy-head-links .link>ul a{display:block;white-space:normal}.sy-head-links .link>ul a:hover{background:var(--sy-c-surface);border-radius:6px}.sy-head-links .link>ul small{display:block;color:var(--sy-c-light);font-weight:400}.sy-head-socials,.sy-head-socials a{display:flex;align-items:center}.sy-head-socials a{padding:.5rem}.sy-head-actions button{height:var(--sy-s-navbar-height);padding:0 .5rem}@media (max-width:767px){body[data-expanded-headnav=true]{overflow:hidden}.sy-head-nav{display:none;position:fixed;top:var(--sy-s-offset-top);bottom:0;left:0;right:0;padding:4rem 1.8rem 0;width:100%;box-sizing:border-box;border-top:1px solid var(--sy-c-divider);background-color:var(--sy-c-background);overflow-y:auto}.sy-head-nav._expanded{display:block}.sy-head-links{margin-left:auto;margin-right:auto}.sy-head-links .link{margin:.5rem 0}.sy-head-links .link i.chevron{display:none}.sy-head-links .link>ul{margin:.5rem 0 .5rem 1rem}.sy-head-extra form.searchbox{position:absolute;top:1rem;left:1.8rem;right:1.8rem}.sy-head-extra{flex-direction:column;padding:2rem 0 1rem;width:100%}}@media (min-width:768px){.sy-head-inner{padding-right:max(env(safe-area-inset-right),1.5rem)}.sy-head-nav{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.sy-head-links[data-align=right]{--head-links-justify-content:flex-end}.sy-head-links[data-align=center]{--head-links-justify-content:center}.sy-head-links{display:flex;flex-grow:1;white-space:nowrap;overflow:auto;padding:0 1rem;justify-content:var(--head-links-justify-content,flex-start)}.sy-head-links .link{display:inline-flex;align-items:center;height:var(--sy-s-navbar-height)}.sy-head-links a:hover{color:var(--sy-c-link-hover)}.sy-head-links .link:hover>a{background-color:var(--sy-c-surface);border-radius:6px}.sy-head-links .link i.chevron-down{color:var(--sy-c-light)}.sy-head-links .link>ul{position:absolute;height:0;visibility:hidden;background-color:var(--sy-c-background);top:var(--sy-s-navbar-height);margin-top:-10px;padding:15px;border-radius:6px;border:1px solid var(--sy-c-divider);box-shadow:var(--sy-dropdown-shadow);z-index:9;max-width:320px}.sy-head-links .link:hover>ul{height:auto;visibility:visible}.sy-head-links .link>ul>li{padding:.2rem 0}.sy-head-socials{margin-left:.5rem}}.sy-foot{border-top:1px solid var(--sy-c-foot-divider);padding-top:1.5rem;padding-bottom:1rem;color:var(--sy-c-foot-text);background-color:var(--sy-c-foot-background)}.sy-foot-inner{padding-left:max(env(safe-area-inset-right),1.5rem);padding-right:max(env(safe-area-inset-right),1.5rem)}.sy-foot-copyright{font-size:.84rem}.sy-foot-copyright a{font-weight:500}.sy-foot-copyright a:hover{text-decoration:underline}.sy-foot-socials a{font-size:1.4rem;color:var(--sy-c-foot-text)}.sy-foot-socials a+a{margin-left:.5rem}.sy-foot-socials a svg{display:inline-block;width:1.4rem;height:1.4rem}.sy-lside .sidebar-links{margin-bottom:2rem}@media (min-width:768px){.sy-lside .sy-lside-inner{top:var(--sy-s-offset-top)}.sy-lside .sy-scrollbar{max-height:calc(100vh - var(--sy-s-offset-top));overflow-x:hidden}}.yue *{scroll-margin-top:calc(var(--sy-s-offset-top) + 68px)}.sy-content{max-width:64rem;min-height:calc(100vh - var(--sy-s-offset-top) - 80px)}@media (max-width:767px){#lside{position:fixed;z-index:18;top:var(--sy-s-offset-top);left:0;bottom:0;width:300px;max-width:100%;height:calc(100vh - var(---sy-s-offset-top));overflow:auto;background:var(--sy-c-background);transform:translateX(-100%);transition:transform .2s ease}#lside._expanded{transform:translateX(0)}.lside-overlay{position:fixed;top:var(--sy-s-offset-top);left:0;width:0;height:0;background-color:var(--sy-c-overlay);opacity:0;transition:width 0 .25s,height 0 .25s,opacity .25s}#lside._expanded+.lside-overlay{width:100%;height:100%;opacity:1;z-index:16}}@media (max-width:1279px){.sy-rside{position:fixed;z-index:25;top:0;right:0;bottom:0;width:20rem;max-width:100%;padding-top:2rem;padding-bottom:1rem;overflow:auto;background:var(--sy-c-background);transform:translateX(110%);transition:transform .2s ease;box-shadow:0 0 var(--sy-c-background-contrast),-12px 0 16px var(--gray-a1)}#rside._expanded{transform:translateX(0)}.rside-close{position:absolute;top:16px;right:16px;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;font-size:1.4rem}.rside-overlay{position:fixed;top:0;left:0;width:0;height:0;background-color:var(--sy-c-overlay);opacity:0;transition:width 0 .25s,height 0 .25s,opacity .25s}#rside._expanded+.rside-overlay{width:100%;height:100%;opacity:1;z-index:22}}@media (min-width:768px){.sy-main{width:calc(100% - 18rem);max-width:52rem}}@media (min-width:1280px){.sy-main{width:calc(100% - 34rem);max-width:none}.sy-rside .sy-scrollbar{max-height:calc(100vh - var(--sy-s-offset-top) - env(safe-area-inset-bottom))}.yue *{scroll-margin-top:calc(var(--sy-s-offset-top) + 24px)}}.nav-languages button,.nav-versions button{cursor:pointer;padding:0;margin:0;background:transparent;border:0;white-space:nowrap}.nav-versions .chevron-down{color:var(--sy-c-light)}@media (max-width:767px){.nav-languages,.nav-versions{width:100%;background-color:var(--sy-c-surface);border-radius:6px;padding-bottom:.6rem;margin-bottom:1rem}.nav-languages button,.nav-versions button{padding:.5rem 1rem;font-weight:500;font-size:.76rem;color:var(--sy-c-light)}.nav-languages button>i,.nav-versions button>i{display:none}.nav-versions ul{padding:0 .6rem}.nav-versions li{padding:.2rem .4rem;display:inline-block}.nav-languages li{font-size:.94rem;padding:.32rem 1rem}}@media (min-width:768px){.nav-languages,.nav-versions{display:flex;align-items:center;position:relative;width:auto;height:var(--sy-s-navbar-height);background:transparent;color:var(--sy-c-text)}.nav-languages button,.nav-versions button{padding:0 .5rem;border-right:1px solid var(--gray-3)}.nav-languages-choices,.nav-versions-choices{position:absolute;visibility:hidden;top:3rem;right:-.6rem;min-width:120px;max-height:60vh;box-sizing:border-box;background-color:var(--sy-c-background);border-radius:6px;overflow-x:hidden;overflow-y:auto;padding:.8rem 1rem;box-shadow:var(--sy-dropdown-shadow)}.nav-languages:hover .nav-languages-choices,.nav-versions:hover .nav-versions-choices{visibility:visible}.nav-languages li,.nav-versions li{padding:.1rem 0}.nav-languages a,.nav-versions a{display:block;padding:.2rem .6rem;color:var(--sy-c-text);white-space:nowrap}.nav-languages a:hover,.nav-versions a:hover{color:var(--sy-c-link-hover);background:var(--sy-c-surface);border-radius:6px}}.sy-breadcrumbs{position:sticky;top:var(--sy-s-offset-top);background-color:var(--sy-c-background);padding:0 1.5rem;z-index:5}.sy-breadcrumbs-inner{padding:.8rem 0;border-bottom:1px solid var(--sy-c-divider)}.sy-breadcrumbs ol{display:flex;font-size:.94rem;white-space:nowrap;overflow:auto}.sy-breadcrumbs button{display:flex;align-items:center}.sy-breadcrumbs ol a{color:var(--sy-c-light)}.sy-breadcrumbs ol a:hover{color:var(--sy-c-bold)}.sy-breadcrumbs ol a+span{padding:0 .4rem;font-weight:300;color:var(--sy-c-light)}@media (min-width:1280px){.sy-breadcrumbs{display:none}}@media (min-width:768px){.sy-breadcrumbs-inner{padding:1.5rem 0 1rem}}.globaltoc{padding-bottom:20px}.globaltoc .caption{font-size:.86rem;font-weight:500;font-family:var(--sy-f-heading);color:var(--sy-c-light);text-transform:uppercase;letter-spacing:.4px;padding:.8rem 0 .4rem;border-top:1px solid var(--sy-c-divider)}.globaltoc>p.caption:first-of-type{padding-top:0;border-top:none}.globaltoc .caption+ul{margin-bottom:1.5rem}.globaltoc ul+.caption{margin-top:2.5rem}.globaltoc li{margin:.6rem 0}.globaltoc li>ul{margin-left:.6rem;font-size:.96rem}.globaltoc li.toctree-l1>ul{margin-left:.2rem;border-left:1px solid var(--gray-3)}.globaltoc li.toctree-l2{padding-left:.9rem;margin-left:-1px;border-left:1px solid transparent}.globaltoc li.toctree-l2.current{border-color:var(--sy-c-link)}.globaltoc>ul a.current{font-weight:500;color:var(--sy-c-link)}.globaltoc>ul a:hover{color:var(--sy-c-link-hover)}.globaltoc a.external:after{content:"";-webkit-mask:var(--lucide-external-link-url) no-repeat;mask:var(--lucide-external-link-url) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;width:.825rem;height:.825rem;margin-left:.2rem;display:inline-block;vertical-align:middle;font-style:normal;background-color:var(--sy-c-light)}.globaltoc li{position:relative}.globaltoc li>button{position:absolute;top:.2rem;right:0;display:flex;justify-content:center;align-items:center;width:1.2rem;height:1.2rem;border-radius:3px}.globaltoc li>button:hover{background-color:var(--sy-c-surface)}.globaltoc li._expand>ul,.globaltoc li.current>ul{display:block}.globaltoc li._collapse>ul,.globaltoc li>ul{display:none}.globaltoc li>button>i{transform:rotate(0deg);transition:transform .2s ease}.globaltoc li._expand>button>i,.globaltoc li.current>button>i{transform:rotate(90deg)}.globaltoc li._collapse>button>i{transform:rotate(0deg)}.sy-deprecated{padding:.8rem;font-size:.85rem;background-color:rgba(255,221,0,.1);border-radius:6px}.sy-deprecated a{color:var(--sy-c-link);text-decoration:underline}.sy-deprecated a:hover{color:var(--sy-c-link-hover)}.sy-rside-inner>div{margin-bottom:1rem}.sy-rside-inner>div>h3{font-size:.8rem;font-weight:500;letter-spacing:.4px;text-transform:uppercase;margin-bottom:1rem}html[lang=ja] .sy-rside-inner>div>h3,html[lang=ko] .sy-rside-inner>div>h3,html[lang=zh-TW] .sy-rside-inner>div>h3,html[lang=zh] .sy-rside-inner>div>h3{letter-spacing:0;font-size:.86rem;font-weight:600}.localtoc>ul li{margin-top:.36rem;margin-bottom:.36rem}.localtoc>ul li>a:hover{color:var(--sy-c-link-hover)}.localtoc>ul li.active>a{font-weight:500;color:var(--sy-c-link)}.localtoc>ul>li ul{padding-left:.8rem}.sy-rside ul.this-page-menu{margin-top:-.6rem}.sy-rside ul.this-page-menu a{font-size:.96rem}.sy-rside ul.this-page-menu a:hover{color:var(--sy-c-link-hover)}.navigation{gap:2rem;margin-top:2rem;padding-top:1rem;border-top:1px solid var(--sy-c-divider)}.navigation>div{width:100%}.navigation a{display:inline-flex;align-items:center}.navigation a:hover{color:var(--sy-c-link-hover)}.navigation-next{text-align:right}.navigation-next a{justify-content:end}.navigation .page-info{padding:0 8px}.navigation .page-info>span{font-size:.8rem;color:var(--sy-c-light)}:root{--readthedocs-search-font-family:var(--sy-f-text);--readthedocs-search-color:var(--sy-c-text);--readthedocs-search-input-background-color:var(--gray-3);--readthedocs-search-content-border-color:var(--gray-4);--readthedocs-search-content-background-color:var(--sy-c-background);--readthedocs-search-result-section-color:var(--sy-c-text);--readthedocs-search-result-section-subheading-color:var(--sy-c-heading);--readthedocs-search-result-section-highlight-color:var(--accent-9);--readthedocs-search-result-section-border-color:var(--sy-c-border)}.yue button.copybtn{align-items:center;justify-content:center;background-color:transparent;border:none;color:var(--syntax-text)}.yue button.copybtn>svg{width:1.4rem;height:1.4rem}.yue button.copybtn:hover{color:var(--syntax-meta)}.yue .highlight button.copybtn:hover,.yue button.copybtn:after{background-color:transparent}.yue button.copybtn:after{color:var(--syntax-text)}.yue button.copybtn.success{border-color:var(--green-a10);color:var(--green-a10)}.yue button.copybtn.success:after{color:var(--green-a10)}.yue{--sd-color-primary:var(--accent-a11);--sd-color-secondary:var(--gold-a11);--sd-color-success:var(--green-a11);--sd-color-info:var(--blue-a11);--sd-color-warning:var(--orange-a11);--sd-color-danger:var(--red-a11);--sd-color-light:var(--sand-a2);--sd-color-muted:var(--gray-8);--sd-color-dark:#212122;--sd-color-black:#000;--sd-color-white:#fff;--sd-color-primary-highlight:var(--accent-a8);--sd-color-secondary-highlight:var(--gold-a8);--sd-color-success-highlight:var(--green-a8);--sd-color-info-highlight:var(--blue-a8);--sd-color-warning-highlight:var(--orange-a8);--sd-color-danger-highlight:var(--red-a8);--sd-color-light-highlight:var(--gray-4);--sd-color-muted-highlight:var(--gray-11);--sd-color-dark-highlight:#121211;--sd-color-black-highlight:#000;--sd-color-white-highlight:#d9d9d9;--sd-color-primary-text:var(--accent-9-contrast);--sd-color-secondary-text:var(--gold-9-contrast);--sd-color-success-text:var(--green-9-contrast);--sd-color-info-text:var(--blue-9-contrast);--sd-color-warning-text:var(--orange-9-contrast);--sd-color-danger-text:var(--red-9-contrast);--sd-color-light-text:var(--sy-c-text);--sd-color-muted-text:#fff;--sd-color-dark-text:#fff;--sd-color-black-text:#fff;--sd-color-white-text:#212529;--sd-color-shadow:var(--gray-1);--sd-color-card-border:var(--sy-c-border);--sd-color-card-border-hover:var(--accent-a9);--sd-color-tabs-label-inactive:var(--sy-c-bold);--sd-color-tabs-label-active:var(--sd-color-primary);--sd-color-tabs-underline-active:var(--sd-color-primary);--sd-color-tabs-label-hover:var(--accent-9);--sd-color-tabs-underline-hover:var(--accent-9)}.yue .surface{--sd-color-card-text:var(--sy-c-light);--sd-color-card-border:transparent;--sd-color-card-background:var(--sy-c-surface)}.yue a.sd-badge,.yue a.sd-badge:hover{border-bottom:0}.yue .sd-badge{font-weight:600;border-radius:3px}.yue .sd-btn{border-color:var(--sy-c-border)}.yue .sd-tab-set>label{padding:1rem .25rem .5rem;font-size:.84rem;font-weight:500}.yue .sd-tab-set>label~label{margin-left:1rem}.yue .sd-tab-content{padding:0;box-shadow:0 -.0625rem var(--sy-c-divider)}.yue .sd-tab-content .code-block-caption,.yue .sd-tab-content .highlight pre{border-radius:0}.yue .sd-card-title{color:var(--sy-c-text)}.yue .sd-card-title>svg{position:relative;top:-1px;margin-right:.25rem}.yue .sd-card-hover:hover{transform:scale(1)}.yue .sd-card-hover:hover .sd-card-title{color:var(--sy-c-link-hover)}.yue .sd-card a,.yue .sd-card a:hover{border-bottom:0}.yue .surface .sd-card-body,.yue .surface .sd-card-footer,.yue .surface .sd-card-header{padding-left:1.5rem;padding-right:1.5rem}.yue .surface .sd-card-footer,.yue .surface .sd-card-header{border-color:var(--sy-c-border)}@media (print){.yue .sd-card{page-break-inside:avoid}}.yue a.sd-text-wrap:hover{border-bottom-width:1px}.sphinx-tabs [role=tablist]{border-color:var(--sy-c-divider)}.yue .sphinx-tabs-tab{color:var(--sy-c-text);line-height:inherit;padding:1rem .25rem .5rem;font-size:.84rem;font-weight:500;border:none;border-bottom:.125rem solid transparent}.yue .sphinx-tabs-tab:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.yue .sphinx-tabs-tab[aria-selected=true]{border:none;border-bottom:.125rem solid var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active);background-color:transparent}.yue .sphinx-tabs-tab+.sphinx-tabs-tab{margin-left:1rem}.yue .sphinx-tabs-panel{border:none;padding:0;margin:0;border-radius:0;background-color:transparent}.yue .sphinx-tabs-panel.code-tab{padding:0}.yue .sphinx-tabs-panel.code-tab .code-block-caption,.yue .sphinx-tabs-panel.code-tab .highlight pre{border-radius:0}.yue{--jp-widgets-input-border-color:var(--gray-5);--jp-widgets-input-focus-border-color:var(--gray-8);--jp-widgets-slider-active-handle-color:var(--gray-4);--jp-widgets-slider-handle-border-color:var(--sy-c-border)}.yue .jupyter_container{background-color:var(--sy-c-background);border:3px solid var(--sy-c-border);border-radius:6px;overflow:hidden;box-shadow:none}.sy-main .yue .jupyter_container div[class^=highlight]{padding:0}.yue .jupyter_container div.highlight{background-color:var(--syntax-pre-bg)}.yue .jupyter_container div.cell_input{background-color:var(--syntax-pre-bg);border:0;border-radius:0}.yue .jupyter_container div.code_cell pre{padding:0}.jupyter_container div.cell_output .output,.jupyter_container div.cell_output .stderr,.jupyter_container div.cell_output .widget-subarea{padding:.5rem}.jupyter_container div.cell_output .stderr .stderr{padding:0}.jupyter-widget-hslider .slider-container,.widget-hslider .slider-container{display:flex;align-items:center}.jupyter-widget-slider .noUi-target,.widget-slider .noUi-target{width:100%}.jupyter_container div.code_cell .highlight>pre{padding:1rem}.jupyter_container div.code_cell .highlight .hll{margin-left:-1rem;margin-right:-1rem;padding:0 1rem}.jupyter_container div.code_cell .highlight .linenos{margin-right:.8rem}.yue .jupyter_container .stderr{color:var(--red-a11);background-color:var(--red-a3)}.yue .jupyter_container .stderr .stderr{background-color:transparent}.nbinput .highlight{--radius:1px}.yue div.nblast.container{padding-top:5px}.yue div.nbinput.container div.input_area{border-color:var(--sy-c-border)}.yue div.nboutput.container div.output_area.stderr{color:var(--red-a11);background-color:var(--red-a3)}.yue div.nboutput.container div.output_area>.math-wrapper>div.math{padding-top:0}.yue .jp-RenderedHTMLCommon thead,.yue div.rendered_html thead{border-color:var(--sy-c-border)}.yue .jp-RenderedHTMLCommon tbody tr,.yue div.rendered_html tbody tr{color:var(--sy-c-text)}.yue .jp-RenderedHTMLCommon tbody tr:nth-child(odd),.yue div.rendered_html tbody tr:nth-child(odd){background-color:var(--sy-c-surface)}.yue .jp-RenderedHTMLCommon tbody tr:hover,.yue div.rendered_html tbody tr:hover{background-color:var(--color-surface-accent)}.yue{--sg-text-color:var(--sy-c-text);--sg-background-color:var(--sy-c-background);--sg-code-background-color:var(--syntax-pre-bg);--sg-tr-hover-color:var(--accent-a3);--sg-tr-odd-color:var(--sy-c-surface);--sg-tooltip-foreground:var(--sy-c-background-contrast);--sg-tooltip-background:var(--sy-c-background);--sg-tooltip-border:var(--gray-7) transparent;--sg-thumb-box-shadow-color:var(--gray-a4);--sg-thumb-hover-border:var(--accent-a9);--sg-script-out:var(--sy-c-light);--sg-script-pre:var(--syntax-pre-bg);--sg-pytb-foreground:var(--syntax-text);--sg-pytb-background:var(--red-a2);--sg-pytb-border-color:var(--red-a8);--sg-download-a-background-color:var(--accent-a3);--sg-download-a-background-image:none;--sg-download-a-border-color:1px solid var(--accent-a3);--sg-download-a-color:var(--accent-a11);--sg-download-a-hover-background-color:var(--accent-a4);--sg-download-a-hover-box-shadow-1:transparent;--sg-download-a-hover-box-shadow-2:transparent}.yue .sphx-glr-download a,.yue .sphx-glr-download a:hover,.yue .sphx-glr-thumbnails a{border-bottom:0}.yue p.sphx-glr-signature a{border-radius:0;border-bottom:0;text-decoration:underline}.yue p.sphx-glr-signature a:hover{color:var(--sy-c-link-hover)}.yue .sphx-glr-footer img{display:inline;margin:0}html.dark,html.light{--docsearch-primary-color:var(--accent-9);--docsearch-text-color:var(--sy-c-text);--docsearch-modal-background:var(--sy-c-background);--docsearch-footer-background:var(--sy-c-surface);--docsearch-searchbox-background:var(--sy-c-surface);--docsearch-searchbox-focus-background:var(--sy-c-background);--docsearch-muted-color:var(--sy-c-light);--docsearch-hit-color:var(--sy-c-text);--docsearch-hit-background:var(--sy-c-surface);--docsearch-hit-active-color:var(--accent-9-contrast);--docsearch-hit-shadow:inset 0 0 1px 0 var(--gray-a11);--docsearch-container-background:var(--sy-c-overlay)}html.light{--docsearch-key-gradient:linear-gradient(-225deg,#e6e6e6,#f8f8f8);--docsearch-key-shadow:inset 0 -2px #dbdbdb,inset 0 0 1px 1px #fff,0 1px 2px 1px #50505066}html.dark{--docsearch-key-gradient:linear-gradient(-225deg,#353434,#141414);--docsearch-key-shadow:inset 0 -2px #373737,inset 0 0 1px 1px #222,0 1px 2px 1px #000;--docsearch-footer-shadow:0 -1px 0 0 #373737,0 -3px 6px 0 #141414;--docsearch-modal-shadow:inset 1px 1px 0 0 #373737,0 3px 8px 0 #141414}#docsearch .DocSearch-Button{border-radius:6px}#docsearch .DocSearch-Button-Key,#docsearch .DocSearch-Button-Placeholder{font-size:.825rem}#docsearch .DocSearch-Button-Keys,#docsearch .DocSearch-Button-Placeholder{display:flex!important}#docsearch .DocSearch-Search-Icon{width:.875rem!important;height:.875rem!important}@media (max-width:767px){#docsearch{position:absolute;top:1rem;left:1.8rem;right:1.8rem}#docsearch .DocSearch-Button{margin-left:0;width:100%}}dl.sqla dt{color:var(--sig-name);margin-bottom:.5rem}dl.sqla dt>em{font-weight:400;font-style:normal;color:var(--sig-param)}dl.sqla dd>p.rubric{margin-top:1.5rem;text-transform:uppercase;font-size:.76rem}dl.sqla dd>p.rubric+.table-wrapper{margin-top:.75rem;border-left:0;border-right:0;border-radius:0}dl.sqla p.rubric+.table-wrapper td,dl.sqla p.rubric+.table-wrapper th{border-left:0;border-right:0;background-color:transparent}dl.sqla p.rubric+.table-wrapper td>p{margin:0}dl.sqla p.rubric+.table-wrapper tr.row-odd{background-color:transparent}dl.sqla p.rubric+.table-wrapper tr.row-even{background-color:var(--yue-c-row-background)}.yue details.toggle-details{background-color:var(--slate-a2);padding:0 1rem;border-radius:.2em}.yue details.toggle-details summary{border-left-color:var(--accent-a9);background-color:var(--gray-a2);margin-left:-1rem;margin-right:-1rem}.yue details.toggle-details[open] summary{border-radius:.2em .2em 0 0}.yue .toggle-details__container{margin-top:0;margin-bottom:0;padding-top:1rem;padding-bottom:1rem}.yue .toggle-details__container :first-child{margin-top:0}.yue .toggle-details__container :last-child{margin-bottom:0}.yue .admonition.toggle-hidden .admonition-title~*{margin-bottom:0!important}.yue{--xr-font-color0:var(--sy-c-heading);--xr-font-color2:var(--sy-c-text);--xr-font-color3:var(--sy-c-light);--xr-border-color:var(--sy-c-border);--xr-disabled-color:var(--gray-a6);--xr-background-color:var(--sy-c-background);--xr-background-color-row-even:var(--sy-c-background);--xr-background-color-row-odd:var(--gray-2)}.yue .xr-array-data pre{margin:0}@media not all and (min-width:640px){.max-sm\:max-w-full{max-width:100%}}@media (min-width:768px){.md\:sticky{position:sticky}.md\:inline{display:inline}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-72{width:18rem}.md\:shrink-0{flex-shrink:0}}@media (min-width:1280px){.xl\:sticky{position:sticky}.xl\:top-16{top:4rem}.xl\:hidden{display:none}.xl\:px-12{padding-left:3rem;padding-right:3rem}.xl\:pl-0{padding-left:0}}@media print{.print\:hidden{display:none}.print\:pt-6{padding-top:1.5rem}} \ No newline at end of file diff --git a/_static/shibuya.js b/_static/shibuya.js new file mode 100644 index 00000000..e44e500a --- /dev/null +++ b/_static/shibuya.js @@ -0,0 +1,41 @@ +(()=>{var qt=Object.freeze({left:0,top:0,width:16,height:16}),B=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),P=Object.freeze({...qt,...B}),tt=Object.freeze({...P,body:"",hidden:!1}),he=Object.freeze({width:null,height:null}),Ft=Object.freeze({...he,...B});function pe(t,e=0){let n=t.replace(/^-?[0-9.]*/,"");function r(o){for(;o<0;)o+=4;return o%4}if(n===""){let o=parseInt(t);return isNaN(o)?0:r(o)}else if(n!==t){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let s=parseFloat(t.slice(0,t.length-n.length));return isNaN(s)?0:(s=s/o,s%1===0?r(s):0)}}return e}var ge=/[\s,]+/;function me(t,e){e.split(ge).forEach(n=>{switch(n.trim()){case"horizontal":t.hFlip=!0;break;case"vertical":t.vFlip=!0;break}})}var Bt={...Ft,preserveAspectRatio:""};function vt(t){let e={...Bt},n=(r,o)=>t.getAttribute(r)||o;return e.width=n("width",null),e.height=n("height",null),e.rotate=pe(n("rotate","")),me(e,n("flip","")),e.preserveAspectRatio=n("preserveAspectRatio",n("preserveaspectratio","")),e}function be(t,e){for(let n in Bt)if(t[n]!==e[n])return!0;return!1}var L=/^[a-z0-9]+(-[a-z0-9]+)*$/,M=(t,e,n,r="")=>{let o=t.split(":");if(t.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;r=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){let i=o.pop(),a=o.pop(),l={provider:o.length>0?o[0]:r,prefix:a,name:i};return e&&!q(l)?null:l}let s=o[0],c=s.split("-");if(c.length>1){let i={provider:r,prefix:c.shift(),name:c.join("-")};return e&&!q(i)?null:i}if(n&&r===""){let i={provider:r,prefix:"",name:s};return e&&!q(i,n)?null:i}return null},q=(t,e)=>t?!!((t.provider===""||t.provider.match(L))&&(e&&t.prefix===""||t.prefix.match(L))&&t.name.match(L)):!1;function ye(t,e){let n={};!t.hFlip!=!e.hFlip&&(n.hFlip=!0),!t.vFlip!=!e.vFlip&&(n.vFlip=!0);let r=((t.rotate||0)+(e.rotate||0))%4;return r&&(n.rotate=r),n}function wt(t,e){let n=ye(t,e);for(let r in tt)r in B?r in t&&!(r in n)&&(n[r]=B[r]):r in e?n[r]=e[r]:r in t&&(n[r]=t[r]);return n}function ve(t,e){let n=t.icons,r=t.aliases||Object.create(null),o=Object.create(null);function s(c){if(n[c])return o[c]=[];if(!(c in o)){o[c]=null;let i=r[c]&&r[c].parent,a=i&&s(i);a&&(o[c]=[i].concat(a))}return o[c]}return(e||Object.keys(n).concat(Object.keys(r))).forEach(s),o}function we(t,e,n){let r=t.icons,o=t.aliases||Object.create(null),s={};function c(i){s=wt(r[i]||o[i],s)}return c(e),n.forEach(c),wt(t,s)}function $t(t,e){let n=[];if(typeof t!="object"||typeof t.icons!="object")return n;t.not_found instanceof Array&&t.not_found.forEach(o=>{e(o,null),n.push(o)});let r=ve(t);for(let o in r){let s=r[o];s&&(e(o,we(t,o,s)),n.push(o))}return n}var Se={provider:"",aliases:{},not_found:{},...qt};function W(t,e){for(let n in e)if(n in t&&typeof t[n]!=typeof e[n])return!1;return!0}function Dt(t){if(typeof t!="object"||t===null)return null;let e=t;if(typeof e.prefix!="string"||!t.icons||typeof t.icons!="object"||!W(t,Se))return null;let n=e.icons;for(let o in n){let s=n[o];if(!o.match(L)||typeof s.body!="string"||!W(s,tt))return null}let r=e.aliases||Object.create(null);for(let o in r){let s=r[o],c=s.parent;if(!o.match(L)||typeof c!="string"||!n[c]&&!r[c]||!W(s,tt))return null}return e}var $=Object.create(null);function xe(t,e){return{provider:t,prefix:e,icons:Object.create(null),missing:new Set}}function v(t,e){let n=$[t]||($[t]=Object.create(null));return n[e]||(n[e]=xe(t,e))}function lt(t,e){return Dt(e)?$t(e,(n,r)=>{r?t.icons[n]=r:t.missing.add(n)}):[]}function Ie(t,e,n){try{if(typeof n.body=="string")return t.icons[e]={...n},!0}catch{}return!1}function Ce(t,e){let n=[];return(typeof t=="string"?[t]:Object.keys($)).forEach(o=>{(typeof o=="string"&&typeof e=="string"?[e]:Object.keys($[o]||{})).forEach(c=>{let i=v(o,c);n=n.concat(Object.keys(i.icons).map(a=>(o!==""?"@"+o+":":"")+c+":"+a))})}),n}var O=!1;function Ht(t){return typeof t=="boolean"&&(O=t),O}function T(t){let e=typeof t=="string"?M(t,!0,O):t;if(e){let n=v(e.provider,e.prefix),r=e.name;return n.icons[r]||(n.missing.has(r)?null:void 0)}}function Qt(t,e){let n=M(t,!0,O);if(!n)return!1;let r=v(n.provider,n.prefix);return Ie(r,n.name,e)}function St(t,e){if(typeof t!="object")return!1;if(typeof e!="string"&&(e=t.provider||""),O&&!e&&!t.prefix){let o=!1;return Dt(t)&&(t.prefix="",$t(t,(s,c)=>{c&&Qt(s,c)&&(o=!0)})),o}let n=t.prefix;if(!q({provider:e,prefix:n,name:"a"}))return!1;let r=v(e,n);return!!lt(r,t)}function xt(t){return!!T(t)}function Ae(t){let e=T(t);return e?{...P,...e}:null}function _e(t){let e={loaded:[],missing:[],pending:[]},n=Object.create(null);t.sort((o,s)=>o.provider!==s.provider?o.provider.localeCompare(s.provider):o.prefix!==s.prefix?o.prefix.localeCompare(s.prefix):o.name.localeCompare(s.name));let r={provider:"",prefix:"",name:""};return t.forEach(o=>{if(r.name===o.name&&r.prefix===o.prefix&&r.provider===o.provider)return;r=o;let s=o.provider,c=o.prefix,i=o.name,a=n[s]||(n[s]=Object.create(null)),l=a[c]||(a[c]=v(s,c)),u;i in l.icons?u=e.loaded:c===""||l.missing.has(i)?u=e.missing:u=e.pending;let f={provider:s,prefix:c,name:i};u.push(f)}),e}function Ut(t,e){t.forEach(n=>{let r=n.loaderCallbacks;r&&(n.loaderCallbacks=r.filter(o=>o.id!==e))})}function ke(t){t.pendingCallbacksFlag||(t.pendingCallbacksFlag=!0,setTimeout(()=>{t.pendingCallbacksFlag=!1;let e=t.loaderCallbacks?t.loaderCallbacks.slice(0):[];if(!e.length)return;let n=!1,r=t.provider,o=t.prefix;e.forEach(s=>{let c=s.icons,i=c.pending.length;c.pending=c.pending.filter(a=>{if(a.prefix!==o)return!0;let l=a.name;if(t.icons[l])c.loaded.push({provider:r,prefix:o,name:l});else if(t.missing.has(l))c.missing.push({provider:r,prefix:o,name:l});else return n=!0,!0;return!1}),c.pending.length!==i&&(n||Ut([t],s.id),s.callback(c.loaded.slice(0),c.missing.slice(0),c.pending.slice(0),s.abort))})}))}var Le=0;function Ee(t,e,n){let r=Le++,o=Ut.bind(null,n,r);if(!e.pending.length)return o;let s={id:r,icons:e,callback:t,abort:o};return n.forEach(c=>{(c.loaderCallbacks||(c.loaderCallbacks=[])).push(s)}),o}var et=Object.create(null);function It(t,e){et[t]=e}function nt(t){return et[t]||et[""]}function Oe(t,e=!0,n=!1){let r=[];return t.forEach(o=>{let s=typeof o=="string"?M(o,e,n):o;s&&r.push(s)}),r}var Te={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function je(t,e,n,r){let o=t.resources.length,s=t.random?Math.floor(Math.random()*o):t.index,c;if(t.random){let d=t.resources.slice(0);for(c=[];d.length>1;){let b=Math.floor(Math.random()*d.length);c.push(d[b]),d=d.slice(0,b).concat(d.slice(b+1))}c=c.concat(d)}else c=t.resources.slice(s).concat(t.resources.slice(0,s));let i=Date.now(),a="pending",l=0,u,f=null,h=[],p=[];typeof r=="function"&&p.push(r);function w(){f&&(clearTimeout(f),f=null)}function S(){a==="pending"&&(a="aborted"),w(),h.forEach(d=>{d.status==="pending"&&(d.status="aborted")}),h=[]}function g(d,b){b&&(p=[]),typeof d=="function"&&p.push(d)}function Y(){return{startTime:i,payload:e,status:a,queriesSent:l,queriesPending:h.length,subscribe:g,abort:S}}function x(){a="failed",p.forEach(d=>{d(void 0,u)})}function y(){h.forEach(d=>{d.status==="pending"&&(d.status="aborted")}),h=[]}function m(d,b,_){let N=b!=="success";switch(h=h.filter(I=>I!==d),a){case"pending":break;case"failed":if(N||!t.dataAfterTimeout)return;break;default:return}if(b==="abort"){u=_,x();return}if(N){u=_,h.length||(c.length?K():x());return}if(w(),y(),!t.random){let I=t.resources.indexOf(d.resource);I!==-1&&I!==t.index&&(t.index=I)}a="completed",p.forEach(I=>{I(_)})}function K(){if(a!=="pending")return;w();let d=c.shift();if(d===void 0){if(h.length){f=setTimeout(()=>{w(),a==="pending"&&(y(),x())},t.timeout);return}x();return}let b={status:"pending",resource:d,callback:(_,N)=>{m(b,_,N)}};h.push(b),l++,f=setTimeout(K,t.rotate),n(d,e,b.callback)}return setTimeout(K),Y}function Vt(t){let e={...Te,...t},n=[];function r(){n=n.filter(i=>i().status==="pending")}function o(i,a,l){let u=je(e,i,a,(f,h)=>{r(),l&&l(f,h)});return n.push(u),u}function s(i){return n.find(a=>i(a))||null}return{query:o,find:s,setIndex:i=>{e.index=i},getIndex:()=>e.index,cleanup:r}}function ut(t){let e;if(typeof t.resources=="string")e=[t.resources];else if(e=t.resources,!(e instanceof Array)||!e.length)return null;return{resources:e,path:t.path||"/",maxURL:t.maxURL||500,rotate:t.rotate||750,timeout:t.timeout||5e3,random:t.random===!0,index:t.index||0,dataAfterTimeout:t.dataAfterTimeout!==!1}}var H=Object.create(null),k=["https://api.simplesvg.com","https://api.unisvg.com"],F=[];for(;k.length>0;)k.length===1||Math.random()>.5?F.push(k.shift()):F.push(k.pop());H[""]=ut({resources:["https://api.iconify.design"].concat(F)});function Ct(t,e){let n=ut(e);return n===null?!1:(H[t]=n,!0)}function Q(t){return H[t]}function Pe(){return Object.keys(H)}function At(){}var X=Object.create(null);function Me(t){if(!X[t]){let e=Q(t);if(!e)return;let n=Vt(e),r={config:e,redundancy:n};X[t]=r}return X[t]}function zt(t,e,n){let r,o;if(typeof t=="string"){let s=nt(t);if(!s)return n(void 0,424),At;o=s.send;let c=Me(t);c&&(r=c.redundancy)}else{let s=ut(t);if(s){r=Vt(s);let c=t.resources?t.resources[0]:"",i=nt(c);i&&(o=i.send)}}return!r||!o?(n(void 0,424),At):r.query(e,o,n)().abort}var _t="iconify2",j="iconify",Gt=j+"-count",kt=j+"-version",Jt=36e5,Ne=168,Re=50;function ot(t,e){try{return t.getItem(e)}catch{}}function ft(t,e,n){try{return t.setItem(e,n),!0}catch{}}function Lt(t,e){try{t.removeItem(e)}catch{}}function rt(t,e){return ft(t,Gt,e.toString())}function st(t){return parseInt(ot(t,Gt))||0}var C={local:!0,session:!0},Yt={local:new Set,session:new Set},dt=!1;function qe(t){dt=t}var R=typeof window>"u"?{}:window;function Kt(t){let e=t+"Storage";try{if(R&&R[e]&&typeof R[e].length=="number")return R[e]}catch{}C[t]=!1}function Wt(t,e){let n=Kt(t);if(!n)return;let r=ot(n,kt);if(r!==_t){if(r){let i=st(n);for(let a=0;a{let a=j+i.toString(),l=ot(n,a);if(typeof l=="string"){try{let u=JSON.parse(l);if(typeof u=="object"&&typeof u.cached=="number"&&u.cached>o&&typeof u.provider=="string"&&typeof u.data=="object"&&typeof u.data.prefix=="string"&&e(u,i))return!0}catch{}Lt(n,a)}},c=st(n);for(let i=c-1;i>=0;i--)s(i)||(i===c-1?(c--,rt(n,c)):Yt[t].add(i))}function Xt(){if(!dt){qe(!0);for(let t in C)Wt(t,e=>{let n=e.data,r=e.provider,o=n.prefix,s=v(r,o);if(!lt(s,n).length)return!1;let c=n.lastModified||-1;return s.lastModifiedCached=s.lastModifiedCached?Math.min(s.lastModifiedCached,c):c,!0})}}function Fe(t,e){let n=t.lastModifiedCached;if(n&&n>=e)return n===e;if(t.lastModifiedCached=e,n)for(let r in C)Wt(r,o=>{let s=o.data;return o.provider!==t.provider||s.prefix!==t.prefix||s.lastModified===e});return!0}function Be(t,e){dt||Xt();function n(r){let o;if(!C[r]||!(o=Kt(r)))return;let s=Yt[r],c;if(s.size)s.delete(c=Array.from(s).shift());else if(c=st(o),c>=Re||!rt(o,c+1))return;let i={cached:Math.floor(Date.now()/Jt),provider:t.provider,data:e};return ft(o,j+c.toString(),JSON.stringify(i))}e.lastModified&&!Fe(t,e.lastModified)||Object.keys(e.icons).length&&(e.not_found&&(e=Object.assign({},e),delete e.not_found),n("local")||n("session"))}function Et(){}function $e(t){t.iconsLoaderFlag||(t.iconsLoaderFlag=!0,setTimeout(()=>{t.iconsLoaderFlag=!1,ke(t)}))}function De(t,e){t.iconsToLoad?t.iconsToLoad=t.iconsToLoad.concat(e).sort():t.iconsToLoad=e,t.iconsQueueFlag||(t.iconsQueueFlag=!0,setTimeout(()=>{t.iconsQueueFlag=!1;let{provider:n,prefix:r}=t,o=t.iconsToLoad;delete t.iconsToLoad;let s;if(!o||!(s=nt(n)))return;s.prepare(n,r,o).forEach(i=>{zt(n,i,a=>{if(typeof a!="object")i.icons.forEach(l=>{t.missing.add(l)});else try{let l=lt(t,a);if(!l.length)return;let u=t.pendingIcons;u&&l.forEach(f=>{u.delete(f)}),Be(t,a)}catch(l){console.error(l)}$e(t)})})}))}var ht=(t,e)=>{let n=Oe(t,!0,Ht()),r=_e(n);if(!r.pending.length){let a=!0;return e&&setTimeout(()=>{a&&e(r.loaded,r.missing,r.pending,Et)}),()=>{a=!1}}let o=Object.create(null),s=[],c,i;return r.pending.forEach(a=>{let{provider:l,prefix:u}=a;if(u===i&&l===c)return;c=l,i=u,s.push(v(l,u));let f=o[l]||(o[l]=Object.create(null));f[u]||(f[u]=[])}),r.pending.forEach(a=>{let{provider:l,prefix:u,name:f}=a,h=v(l,u),p=h.pendingIcons||(h.pendingIcons=new Set);p.has(f)||(p.add(f),o[l][u].push(f))}),s.forEach(a=>{let{provider:l,prefix:u}=a;o[l][u].length&&De(a,o[l][u])}),e?Ee(e,r,s):Et},He=t=>new Promise((e,n)=>{let r=typeof t=="string"?M(t,!0):t;if(!r){n(t);return}ht([r||t],o=>{if(o.length&&r){let s=T(r);if(s){e({...P,...s});return}}n(t)})});function Qe(t){try{let e=typeof t=="string"?JSON.parse(t):t;if(typeof e.body=="string")return{...e}}catch{}}function Ue(t,e){let n=typeof t=="string"?M(t,!0,!0):null;if(!n){let s=Qe(t);return{value:t,data:s}}let r=T(n);if(r!==void 0||!n.prefix)return{value:t,name:n,data:r};let o=ht([n],()=>e(t,n,T(n)));return{value:t,name:n,loading:o}}var Zt=!1;try{Zt=navigator.vendor.indexOf("Apple")===0}catch{}function Ve(t,e){switch(e){case"svg":case"bg":case"mask":return e}return e!=="style"&&(Zt||t.indexOf("=0;){let o=t.indexOf(">",r),s=t.indexOf("",s);if(c===-1)break;n+=t.slice(o+1,s).trim(),t=t.slice(0,r).trim()+t.slice(c+1)}return{defs:n,content:t}}function Ye(t,e){return t?""+t+""+e:e}function Ke(t,e,n){let r=Je(t);return Ye(r.defs,e+r.content+n)}var We=t=>t==="unset"||t==="undefined"||t==="none";function te(t,e){let n={...P,...t},r={...Ft,...e},o={left:n.left,top:n.top,width:n.width,height:n.height},s=n.body;[n,r].forEach(S=>{let g=[],Y=S.hFlip,x=S.vFlip,y=S.rotate;Y?x?y+=2:(g.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),g.push("scale(-1 1)"),o.top=o.left=0):x&&(g.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),g.push("scale(1 -1)"),o.top=o.left=0);let m;switch(y<0&&(y-=Math.floor(y/4)*4),y=y%4,y){case 1:m=o.height/2+o.top,g.unshift("rotate(90 "+m.toString()+" "+m.toString()+")");break;case 2:g.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:m=o.width/2+o.left,g.unshift("rotate(-90 "+m.toString()+" "+m.toString()+")");break}y%2===1&&(o.left!==o.top&&(m=o.left,o.left=o.top,o.top=m),o.width!==o.height&&(m=o.width,o.width=o.height,o.height=m)),g.length&&(s=Ke(s,'',""))});let c=r.width,i=r.height,a=o.width,l=o.height,u,f;c===null?(f=i===null?"1em":i==="auto"?l:i,u=it(f,a/l)):(u=c==="auto"?a:c,f=i===null?it(u,l/a):i==="auto"?l:i);let h={},p=(S,g)=>{We(g)||(h[S]=g.toString())};p("width",u),p("height",f);let w=[o.left,o.top,a,l];return h.viewBox=w.join(" "),{attributes:h,viewBox:w,body:s}}function pt(t,e){let n=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let r in e)n+=" "+r+'="'+e[r]+'"';return'"+t+""}function Xe(t){return t.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function Ze(t){return"data:image/svg+xml,"+Xe(t)}function ee(t){return'url("'+Ze(t)+'")'}var tn=()=>{let t;try{if(t=fetch,typeof t=="function")return t}catch{}},D=tn();function en(t){D=t}function nn(){return D}function on(t,e){let n=Q(t);if(!n)return 0;let r;if(!n.maxURL)r=0;else{let o=0;n.resources.forEach(c=>{o=Math.max(o,c.length)});let s=e+".json?icons=";r=n.maxURL-o-n.path.length-s.length}return r}function rn(t){return t===404}var sn=(t,e,n)=>{let r=[],o=on(t,e),s="icons",c={type:s,provider:t,prefix:e,icons:[]},i=0;return n.forEach((a,l)=>{i+=a.length+1,i>=o&&l>0&&(r.push(c),c={type:s,provider:t,prefix:e,icons:[]},i=a.length),c.icons.push(a)}),r.push(c),r};function cn(t){if(typeof t=="string"){let e=Q(t);if(e)return e.path}return"/"}var an=(t,e,n)=>{if(!D){n("abort",424);return}let r=cn(e.provider);switch(e.type){case"icons":{let s=e.prefix,i=e.icons.join(","),a=new URLSearchParams({icons:i});r+=s+".json?"+a.toString();break}case"custom":{let s=e.uri;r+=s.slice(0,1)==="/"?s.slice(1):s;break}default:n("abort",400);return}let o=503;D(t+r).then(s=>{let c=s.status;if(c!==200){setTimeout(()=>{n(rn(c)?"abort":"next",c)});return}return o=501,s.json()}).then(s=>{if(typeof s!="object"||s===null){setTimeout(()=>{s===404?n("abort",s):n("next",o)});return}setTimeout(()=>{n("success",s)})}).catch(()=>{n("next",o)})},ln={prepare:sn,send:an};function Ot(t,e){switch(t){case"local":case"session":C[t]=e;break;case"all":for(let n in C)C[n]=e;break}}var Z="data-style",ne="";function un(t){ne=t}function Tt(t,e){let n=Array.from(t.childNodes).find(r=>r.hasAttribute&&r.hasAttribute(Z));n||(n=document.createElement("style"),n.setAttribute(Z,Z),t.appendChild(n)),n.textContent=":host{display:inline-block;vertical-align:"+(e?"-0.125em":"0")+"}span,svg{display:block}"+ne}function oe(){It("",ln),Ht(!0);let t;try{t=window}catch{}if(t){if(Xt(),t.IconifyPreload!==void 0){let n=t.IconifyPreload,r="Invalid IconifyPreload syntax.";typeof n=="object"&&n!==null&&(n instanceof Array?n:[n]).forEach(o=>{try{(typeof o!="object"||o===null||o instanceof Array||typeof o.icons!="object"||typeof o.prefix!="string"||!St(o))&&console.error(r)}catch{console.error(r)}})}if(t.IconifyProviders!==void 0){let n=t.IconifyProviders;if(typeof n=="object"&&n!==null)for(let r in n){let o="IconifyProviders["+r+"] is invalid.";try{let s=n[r];if(typeof s!="object"||!s||s.resources===void 0)continue;Ct(r,s)||console.error(o)}catch{console.error(o)}}}}return{enableCache:n=>Ot(n,!0),disableCache:n=>Ot(n,!1),iconLoaded:xt,iconExists:xt,getIcon:Ae,listIcons:Ce,addIcon:Qt,addCollection:St,calculateSize:it,buildIcon:te,iconToHTML:pt,svgToURL:ee,loadIcons:ht,loadIcon:He,addAPIProvider:Ct,appendCustomStyle:un,_api:{getAPIConfig:Q,setAPIModule:It,sendAPIQuery:zt,setFetch:en,getFetch:nn,listAPIProviders:Pe}}}var ct={"background-color":"currentColor"},re={"background-color":"transparent"},jt={image:"var(--svg)",repeat:"no-repeat",size:"100% 100%"},Pt={"-webkit-mask":ct,mask:ct,background:re};for(let t in Pt){let e=Pt[t];for(let n in jt)e[t+"-"+n]=jt[n]}function Mt(t){return t?t+(t.match(/^[-0-9.]+$/)?"px":""):"inherit"}function fn(t,e,n){let r=document.createElement("span"),o=t.body;o.indexOf("");let s=t.attributes,c=pt(o,{...s,width:e.width+"",height:e.height+""}),i=ee(c),a=r.style,l={"--svg":i,width:Mt(s.width),height:Mt(s.height),...n?ct:re};for(let u in l)a.setProperty(u,l[u]);return r}var E;function dn(){try{E=window.trustedTypes.createPolicy("iconify",{createHTML:t=>t})}catch{E=null}}function hn(t){return E===void 0&&dn(),E?E.createHTML(t):t}function pn(t){let e=document.createElement("span"),n=t.attributes,r="";n.width||(r="width: inherit;"),n.height||(r+="height: inherit;"),r&&(n.style=r);let o=pt(t.body,n);return e.innerHTML=hn(o),e.firstChild}function at(t){return Array.from(t.childNodes).find(e=>{let n=e.tagName&&e.tagName.toUpperCase();return n==="SPAN"||n==="SVG"})}function Nt(t,e){let n=e.icon.data,r=e.customisations,o=te(n,r);r.preserveAspectRatio&&(o.attributes.preserveAspectRatio=r.preserveAspectRatio);let s=e.renderedMode,c;switch(s){case"svg":c=pn(o);break;default:c=fn(o,{...P,...n},s==="mask")}let i=at(t);i?c.tagName==="SPAN"&&i.tagName===c.tagName?i.setAttribute("style",c.getAttribute("style")):t.replaceChild(c,i):t.appendChild(c)}function Rt(t,e,n){let r=n&&(n.rendered?n:n.lastRender);return{rendered:!1,inline:e,icon:t,lastRender:r}}function gn(t="iconify-icon"){let e,n;try{e=window.customElements,n=window.HTMLElement}catch{return}if(!e||!n)return;let r=e.get(t);if(r)return r;let o=["icon","mode","inline","noobserver","width","height","rotate","flip"],s=class extends n{_shadowRoot;_initialised=!1;_state;_checkQueued=!1;_connected=!1;_observer=null;_visible=!0;constructor(){super();let i=this._shadowRoot=this.attachShadow({mode:"open"}),a=this.hasAttribute("inline");Tt(i,a),this._state=Rt({value:""},a),this._queueCheck()}connectedCallback(){this._connected=!0,this.startObserver()}disconnectedCallback(){this._connected=!1,this.stopObserver()}static get observedAttributes(){return o.slice(0)}attributeChangedCallback(i){switch(i){case"inline":{let a=this.hasAttribute("inline"),l=this._state;a!==l.inline&&(l.inline=a,Tt(this._shadowRoot,a));break}case"noobserver":{this.hasAttribute("noobserver")?this.startObserver():this.stopObserver();break}default:this._queueCheck()}}get icon(){let i=this.getAttribute("icon");if(i&&i.slice(0,1)==="{")try{return JSON.parse(i)}catch{}return i}set icon(i){typeof i=="object"&&(i=JSON.stringify(i)),this.setAttribute("icon",i)}get inline(){return this.hasAttribute("inline")}set inline(i){i?this.setAttribute("inline","true"):this.removeAttribute("inline")}get observer(){return this.hasAttribute("observer")}set observer(i){i?this.setAttribute("observer","true"):this.removeAttribute("observer")}restartAnimation(){let i=this._state;if(i.rendered){let a=this._shadowRoot;if(i.renderedMode==="svg")try{a.lastChild.setCurrentTime(0);return}catch{}Nt(a,i)}}get status(){let i=this._state;return i.rendered?"rendered":i.icon.data===null?"failed":"loading"}_queueCheck(){this._checkQueued||(this._checkQueued=!0,setTimeout(()=>{this._check()}))}_check(){if(!this._checkQueued)return;this._checkQueued=!1;let i=this._state,a=this.getAttribute("icon");if(a!==i.icon.value){this._iconChanged(a);return}if(!i.rendered||!this._visible)return;let l=this.getAttribute("mode"),u=vt(this);(i.attrMode!==l||be(i.customisations,u)||!at(this._shadowRoot))&&this._renderIcon(i.icon,u,l)}_iconChanged(i){let a=Ue(i,(l,u,f)=>{let h=this._state;if(h.rendered||this.getAttribute("icon")!==l)return;let p={value:l,name:u,data:f};p.data?this._gotIconData(p):h.icon=p});a.data?this._gotIconData(a):this._state=Rt(a,this._state.inline,this._state)}_forceRender(){if(!this._visible){let i=at(this._shadowRoot);i&&this._shadowRoot.removeChild(i);return}this._queueCheck()}_gotIconData(i){this._checkQueued=!1,this._renderIcon(i,vt(this),this.getAttribute("mode"))}_renderIcon(i,a,l){let u=Ve(i.data.body,l),f=this._state.inline;Nt(this._shadowRoot,this._state={rendered:!0,icon:i,inline:f,customisations:a,attrMode:l,renderedMode:u})}startObserver(){if(!this._observer&&!this.hasAttribute("noobserver"))try{this._observer=new IntersectionObserver(i=>{let a=i.some(l=>l.isIntersecting);a!==this._visible&&(this._visible=a,this._forceRender())}),this._observer.observe(this)}catch{if(this._observer){try{this._observer.disconnect()}catch{}this._observer=null}}}stopObserver(){this._observer&&(this._observer.disconnect(),this._observer=null,this._visible=!0,this._connected&&this._forceRender())}};o.forEach(i=>{i in s.prototype||Object.defineProperty(s.prototype,i,{get:function(){return this.getAttribute(i)},set:function(a){a!==null?this.setAttribute(i,a):this.removeAttribute(i)}})});let c=oe();for(let i in c)s[i]=s.prototype[i]=c[i];return e.define(t,s),s}var mn=gn()||oe(),{enableCache:On,disableCache:Tn,iconLoaded:jn,iconExists:Pn,getIcon:Mn,listIcons:Nn,addIcon:Rn,addCollection:qn,calculateSize:Fn,buildIcon:Bn,iconToHTML:$n,svgToURL:Dn,loadIcons:Hn,loadIcon:Qn,addAPIProvider:Un,_api:Vn}=mn;function bn(t){let e=t.getAttribute("aria-controls"),n=document.getElementById(e),r="data-expanded-"+e;t.addEventListener("click",function(){document.body.hasAttribute(r)?(document.body.removeAttribute(r),n.classList.remove("_expanded"),se(e,"false")):(document.body.setAttribute(r,"true"),n.classList.add("_expanded"),se(e,"true"))})}function se(t,e){let n=document.querySelectorAll('[aria-controls="'+t+'"]');for(el of n)el.setAttribute("aria-expanded",e)}var ie=document.querySelectorAll(".js-menu");for(let t=0;t{U.parentNode.removeChild(U),document.head.removeChild(t)}),e(),window.addEventListener("resize",e)}var vn;var V=["auto","light","dark"],z=document.querySelector(".js-theme");function wn(){let t=ce();t+=1,V[t]||(t=0);let e=V[t];setColorMode(e),localStorage._theme=e,ae(e)}function ce(){return V.indexOf(document.documentElement.getAttribute("data-color-mode")||"auto")}function ae(t){let e=z.getAttribute("data-aria-"+t);z.setAttribute("aria-label",e)}z&&(z.addEventListener("click",wn),ae(V[ce()]||"auto"));function Sn(){let t=document.querySelector(".globaltoc");if(!t)return;let e=parseInt(t.getAttribute("data-expand-depth"),10),n=o=>{if(!e)return!1;let s=0;for(;o.parentNode&&o.parentNode!==t;)o=o.parentNode,o.nodeName==="UL"&&(s+=1);return e>=s};t.querySelectorAll("li > ul").forEach(o=>{let s=o.parentNode;s.classList.contains("current")||n(s)?s.classList.add("_expand"):s.classList.add("_collapse");let c=xn(o);s.appendChild(c)})}function xn(t){let e=document.createElement("button");e.innerHTML='';let n=t.parentNode,r=t.previousSibling,o=r.textContent,s=()=>{n.classList.contains("_expand")?e.setAttribute("aria-label","Collapse "+o):e.setAttribute("aria-label","Expand "+o)};s();let c=i=>{i.preventDefault(),n.classList.contains("_expand")?(n.classList.remove("_expand"),n.classList.add("_collapse")):(n.classList.remove("_collapse"),n.classList.add("_expand")),s()};return r.getAttribute("href")==="#"&&r.addEventListener("click",c),e.addEventListener("click",c),e}var gt=document.querySelector(".globaltoc a.current");gt&>.scrollIntoViewIfNeeded&>.scrollIntoViewIfNeeded();Sn();var le=0,mt=200,G=document.querySelectorAll(".yue > section section[id]"),A=document.querySelector(".back-to-top");function ue(){let t=document.querySelector(".yue > section");t&&(mt=t.computedStyleMap().get("scroll-margin-top").value)}function In(t){let e=t.getBoundingClientRect();return e.top<=mt&&e.bottom>=mt}function fe(t){document.querySelectorAll(".localtoc li.active").forEach(e=>{e.classList.remove("active")}),document.querySelector(`.localtoc a[href="#${t}"]`).parentNode.classList.add("active")}function de(){let t;for(let e=0;e=document.body.offsetHeight){let t=G[G.length-1];t&&fe(t.id)}else de();A&&(window.scrollY&&window.scrollY{window.scrollTo(0,0)});window.addEventListener("scroll",Cn);window.addEventListener("DOMContentLoaded",()=>{ue(),de()});window.addEventListener("resize",ue);var J=document.querySelector(".js-repo-stats");async function An(t,e){let n=`https://api.github.com/repos/${t}/${e}`,o=await(await fetch(n)).json(),s={stars:o.watchers,forks:o.forks};bt(s),sessionStorage.setItem("_sy/repo/stats",JSON.stringify(s))}async function _n(t,e){let n="https://gitlab.com/api/v4/projects/"+encodeURIComponent(t+"/"+e),o=await(await fetch(n)).json(),s={stars:o.star_count,forks:o.forks_count};bt(s),sessionStorage.setItem("_sy/repo/stats",JSON.stringify(s))}function bt({stars:t,forks:e}){t&&(document.querySelector(".js-repo-stars").textContent=t),e&&(document.querySelector(".js-repo-forks").textContent=e)}function kn(){let t=sessionStorage.getItem("_sy/repo/stats");if(t)bt(JSON.parse(t));else{let e=J.getAttribute("data-user"),n=J.getAttribute("data-repo"),r=J.getAttribute("data-type");r==="github"?An(e,n):r==="gitlab"&&_n(e,n)}}J&&kn();function Ln(t,e){let n=document.createElement("script");n.id="_carbonads_js",n.src=`//cdn.carbonads.com/carbon.js?serve=${t}&placement=${e}`;let r=document.querySelector(".yue > section"),o=document.querySelector(".yue > section > section");if(o)r.insertBefore(n,o);else{let s=document.querySelector(".yue > section > p");s?r.insertBefore(n,s.nextSibling):r.appendChild(n)}}var yt=document.querySelector(".js-carbon");if(yt){let t=yt.getAttribute("data-carbon-code"),e=yt.getAttribute("data-carbon-placement");t&&e&&Ln(t,e)}var En=` +:host > div .results .hit h2 { + color: var(--sy-c-heading); + margin-bottom: 0; + border-bottom: 0; + font-weight: 600; +} +:host > div .results .hit .hit-block .content { + color: var(--sy-c-text); +} +:host > div .results .hit-block a.hit:hover, :host > div .results .hit-block .hit.active { + background-color: var(--gray-5); + border-radius: 4px; +} + +:host > div div.hit-block a.hit-block-heading:hover { + text-decoration: underline; +} + +:host > div div.hit-block a.hit-block-heading i, +:host > div div.hit-block .hit-block-heading-container .close-icon { + color: var(--sy-c-light); + margin-bottom: 0; + display: flex; +} +`;document.addEventListener("readthedocs-addons-data-ready",function(t){document.querySelector(".searchbox input").addEventListener("focusin",()=>{let e=new CustomEvent("readthedocs-search-show");document.dispatchEvent(e)}),setTimeout(()=>{let e=document.querySelector("readthedocs-search");if(e){let n=document.createElement("style");n.textContent=En,e.shadowRoot.appendChild(n)}},1e3)});/windows/i.test(navigator.userAgent)&&document.body.classList.add("win");})(); +/*! Bundled license information: + +iconify-icon/dist/iconify-icon.mjs: + (** + * (c) Iconify + * + * For the full copyright and license information, please view the license.txt + * files at https://github.com/iconify/iconify + * + * Licensed under MIT. + * + * @license MIT + * @version 2.1.0 + *) +*/ diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '

" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/architecture.html b/architecture.html new file mode 100644 index 00000000..ef7a7568 --- /dev/null +++ b/architecture.html @@ -0,0 +1,271 @@ + + + + + Arroyo Architecture - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Arroyo Architecture

+

Arroyo is a set of high level abstractions to interact with Kafka. +These are meant to help the developer in writing performant consumers with +specific delivery guarantees.

+

Common problems addressed by Arroyo are guaranteeing at-least-once delivery, +providing a dead letter queue abstraction, support parallel (multi-processing) +message processing, etc.

+

The library is divided into three layers: the basic Kafka connectivity, the +streaming engine and the high level abstractions.

+

The basic connectivity layer is a simple wrapper around the Confluent python +library, which is itself based on librdkafka. Besides some cosmetic changes, +this level provides a Fake in memory broker and consumer to make unit test quick +to run.

+

The streaming engine provides an asynchronous processing interface to write +consumers. The consumer is written as a pipeline where each segment is an +asynchronous operation. The streaming engine implements the main consumer loop +and delegates the processing to the pipeline.

+

On top of the streaming engine, the library provides high-level abstractions that +are common when writing Kafka consumers like: map, reduce, filter together +with some common messaging application patterns like the dead letter queue.

+
+

Streaming Interface and Streaming Engine

+

A Kafka consumer is built as a pipeline where each segment processes messages in +an asynchronous way. The Streaming engine provides a message to a segment. The +segment is not supposed to execute small CPU work in a blocking way or do IO in a +non-blocking way. We generally use futures for this, and heavier CPU work in a +separate process.

+

Arroyo provides an interface to implement to write a pipeline segment. +The segment interface is called ProcessingStrategy and is in +this module. +(TODO: bring the docstrings to the docs and reference that).

+

In most cases, when developing a consumer, the developer would not implement +that interface directly. A higher level abstraction would be used.

+
+_images/arroyo_processing.png +
+

The main consumer loop is managed by the stream engine. +These are the phases:

+
    +
  • Poll from the Kafka consumer through the basic library. If a message is there +proceed or repeat.

  • +
  • Submit the message to the first ProcessingStrategy. This is supposed to deliver +work for the strategy to do. It is not supposed to be a blocking operation. The +strategy should return immediately.

  • +
  • Poll the strategy to execute work or to forward results to the following step +in the pipeline. Ideally all IO should be done in separate threads and heavy cpu +work should be done in separate processes so the poll method should check for +completed work, dispatch to the next step and return. In practice, work is executed +here in a blocking way if the overhead of offloading the work is too high.

  • +
+

The ProcessingStrategy may decide not to take the message and instead apply back-pressure. +This is done by raising the MessageRejected exception. In this case, the streaming +engine pauses the consumer till the strategy is ready to accept the message.

+

The ProcessingStrategy decides when it is time to commit a message. This is done +through a commit callback provided to the strategy when it is instantiated.

+

The streaming engine orchestrates the life cycle of the ProcessingStrategy, thus +when it thinks it is time to shut the strategy down it would wait for all in-flight +work to be completed and then destroy the strategy.

+

There are two scenarios where this can happen:

+
    +
  • The consumer is being terminated.

  • +
  • A rebalancing happened. A rebalancing revokes partitions and assigns new ones. +After a rebalancing is complete it is impossible to commit a message from a partition +that was revoked. In order to ensure the consumer behaves in a consistent way, +upon rebalancing, the streaming engine destroys the strategy and builds a new one. +This allows the strategy to complete all in-flight work before being terminated.

  • +
+
+
+

High level strategies

+

Most consumers follow the same few patterns, so Arroyo provides abstractions that +are based on the ProcessingStrategy but are simpler to implement for the common +use cases.

+

Common examples are:

+
    +
  • run task, run task in threads, run task with multiprocessing. The run task +set of strategies are designed to be the most flexible and simple to use. They take +a function provided by the user and execute it on every message, passing the output +to the next step. The library includes synchronous and asynchronous versions depending +on the kind of concurrency required by the user.

  • +
  • filter, map and forward. This type of consumer inspects a message, decides +whether to process it or discard it, transforms its content, and produces the result +on a new topic. In this case, Arroyo provides three implementations of the +ProcessingStrategy: filter, transform, and produce. The developer only needs +to wire them together and provide the map and filtering logic.

  • +
  • consume, apply side effects, produce. This is a variation of the one above. +In this case, the transform operation can have side-effects like storing the content +of the message somewhere.

  • +
  • high throughput cpu intensive transform. The python GIL does not allow CPU intensive +work to take advantage of parallelism. Arroyo provides an implementation of the map +pattern that batches messages and dispatches the work to separate processes via shared +memory. This is largely transparent to the developers.

  • +
  • map, reduce and store. The reduce function is carried out by the Collector, which +batches messages and executes some logic with side-effects when the batch is full. +This is a typical way to write messages on a storages in batches to reduce the +round trips.

  • +
+

All strategies included with Arroyo are in the strategies module.

+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/backpressure.html b/backpressure.html new file mode 100644 index 00000000..735d7cd9 --- /dev/null +++ b/backpressure.html @@ -0,0 +1,203 @@ + + + + + Backpressure - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Backpressure

+

Arroyo’s own processing strategies internally apply backpressure by raising +MessageRejected. Most +consumers do not require additional work to deal with backpressure correctly.

+

If you want to slow down the consumer based on some external signal or +condition, you can achieve that most effectively by raising the same exception +from within a callback passed to RunTask while the +consumer is supposed to be paused

+
class ConsumerStrategyFactory(ProcessingStrategyFactory[KafkaPayload]):
+    def __init__(self):
+        self.is_paused = False
+
+    def create_with_partitions(
+        self,
+        commit: Commit,
+        partitions: Mapping[Partition, int],
+    ) -> ProcessingStrategy[KafkaPayload]:
+        def handle_message(message: Message[KafkaPayload]) -> Message[KafkaPayload]:
+            if self.is_paused:
+                raise MessageRejected()
+
+            print(f"MSG: {message.payload}")
+            return message
+
+        return RunTask(handle_message, CommitOffsets(commit))
+
+
+

It is not recommended to apply backpressure by just sleep()-ing in +submit (or, in this example, +handle_message) for more than a few milliseconds. While this definitely +pauses the consumer, it will block the main thread for too long and and prevent +things like consumer rebalancing from occuring.

+

A 0.01 second sleep is applied each time MessageRejected is +raised to prevent the main thread spinning at 100% CPU. However background thread +performance may be impacted during this time.

+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/dlqs.html b/dlqs.html new file mode 100644 index 00000000..3c09ef9a --- /dev/null +++ b/dlqs.html @@ -0,0 +1,233 @@ + + + + + Dead letter queues - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Dead letter queues

+
+

Warning

+

Dead letter queues should be used with caution as they break some of the ordering guarantees +otherwise offered by Arroyo and Kafka consumer code. In particular, it must be safe for the +consumer to drop a message. If replaying or later re-processing of the DLQ’ed messages is done, +it is critical that ordering is not a requirement in the relevant downstream code.

+
+

Arroyo provides support for routing invalid messages to dead letter queues in consumers. +Dead letter queues are critical in some applications because messages are ordered in Kafka +and a single invalid message can cause a consumer to crash and every subsequent message to +not be processed.

+

The dead letter queue configuration is passed to the StreamProcessor and, if provided, any +InvalidMessage raise by a strategy will be produced to the dead letter queue.

+
+
+class arroyo.dlq.DlqLimit(max_invalid_ratio: float | None = None, max_consecutive_count: int | None = None)
+

Defines any limits that should be placed on the number of messages that are +forwarded to the DLQ. This exists to prevent 100% of messages from going into +the DLQ if something is misconfigured or bad code is deployed. In this scenario, +it may be preferable to stop processing messages altogether and deploy a fix +rather than rerouting every message to the DLQ.

+

The ratio and max_consecutive_count are counted on a per-partition basis.

+
+ +
+
+class arroyo.dlq.DlqPolicy(producer: DlqProducer[TStrategyPayload], limit: DlqLimit | None = None, max_buffered_messages_per_partition: int | None = None)
+

DLQ policy defines the DLQ configuration, and is passed to the stream processor +upon creation of the consumer. It consists of the DLQ producer implementation and +any limits that should be applied.

+
+ +
+
+exception arroyo.dlq.InvalidMessage(partition: Partition, offset: int, needs_commit: bool = True)
+

InvalidMessage should be raised if a message is not valid for processing and +should not be retried. It will be placed a DLQ if one is configured.

+

It can be raised from the submit, poll or join methods of any processing strategy.

+

Once a filtered message is forwarded to the next step, needs_commit should be set to False, +in order to prevent multiple filtered messages from being forwarded for a single invalid message.

+
+ +
+
+class arroyo.dlq.KafkaDlqProducer(producer: Producer[KafkaPayload], topic: Topic)
+

KafkaDLQProducer forwards invalid messages to a Kafka topic

+

Two additional fields are added to the headers of the Kafka message +“original_partition”: The partition of the original message +“original_offset”: The offset of the original message

+
+ +
+
+class arroyo.dlq.NoopDlqProducer(*args, **kwds)
+

Drops all invalid messages

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..d84d7950 --- /dev/null +++ b/genindex.html @@ -0,0 +1,532 @@ + + + + + Index - Arroyo documentation + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | F + | G + | H + | I + | J + | K + | M + | N + | O + | P + | R + | S + | T + | U + | V + +
+

A

+ + + +
    +
  • + arroyo.dlq + +
  • +
  • + arroyo.processing.strategies.abstract + +
  • +
  • + arroyo.processing.strategies.batching + +
  • +
  • + arroyo.processing.strategies.commit + +
  • +
  • + arroyo.processing.strategies.filter + +
  • +
  • + arroyo.processing.strategies.healthcheck + +
  • +
  • + arroyo.processing.strategies.noop + +
  • +
  • + arroyo.processing.strategies.produce + +
  • +
    +
  • + arroyo.processing.strategies.reduce + +
  • +
  • + arroyo.processing.strategies.run_task + +
  • +
  • + arroyo.processing.strategies.run_task_in_threads + +
  • +
  • + arroyo.processing.strategies.run_task_with_multiprocessing + +
  • +
  • + arroyo.processing.strategies.unfold + +
  • +
  • + arroyo.types + +
  • +
  • + arroyo.utils.metrics + +
  • +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

F

+ + + +
+ +

G

+ + +
+ +

H

+ + +
+ +

I

+ + + +
+ +

J

+ + +
+ +

K

+ + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ + + +
+ +
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/getstarted.html b/getstarted.html new file mode 100644 index 00000000..776c1f52 --- /dev/null +++ b/getstarted.html @@ -0,0 +1,397 @@ + + + + + Getting started with Arroyo - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Getting started with Arroyo

+

This tutorial shows how to create a Kafka consumer with Arroyo from scratch.

+
+

Setup

+

This section explains how to setup Kafka, Zookeeper and install the library

+
+

Kafka and Zookeeper

+

In order to run an arroyo Kafka consumer you will need a working Kafka broker. +If you already have one, you can skip this step. +If you do not have a running Kafka broker, this command will install and start +a Kafka docker container. (It requires Docker to be installed).

+
docker network create arroyo
+
+docker run --rm \
+    -v zookeeper_volume:/var/lib/zookeeper \
+    --env ZOOKEEPER_CLIENT_PORT=2181 \
+    --name=sentry_zookeeper \
+    --network=arroyo \
+    -p 2181:2181 \
+    confluentinc/cp-zookeeper:6.2.0
+
+docker run --rm \
+    -v kafka_volume:/var/lib/kafka \
+    --env KAFKA_ZOOKEEPER_CONNECT=sentry_zookeeper:2181 \
+    --env KAFKA_LISTENERS=INTERNAL://0.0.0.0:9093,EXTERNAL://0.0.0.0:9092 \
+    --env KAFKA_ADVERTISED_LISTENERS=INTERNAL://127.0.0.1:9093,EXTERNAL://127.0.0.1:9092 \
+    --env KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT \
+    --env KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL \
+    --env KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
+    --env CONFLUENT_SUPPORT_METRICS_ENABLE=false \
+    --env KAFKA_LOG4J_LOGGERS=kafka.cluster=WARN,kafka.controller=WARN,kafka.coordinator=WARN,kafka.log=WARN,kafka.server=WARN,kafka.zookeeper=WARN,state.change.logger=WARN \
+    --env KAFKA_LOG4J_ROOT_LOGLEVEL=WARN \
+    --env KAFKA_TOOLS_LOG4J_LOGLEVEL=WARN \
+    --name=sentry_kafka \
+    --network=arroyo \
+    -p 9092:9092 \
+    confluentinc/cp-kafka:6.2.0
+
+
+

Now you should see Kafka and Zookeeper running with

+
docker ps
+
+
+
+
+

Install Kafkacat

+

This tool will be useful to produce onto and consume from topics.

+
https://docs.confluent.io/platform/current/app-development/kafkacat-usage.html#kcat-formerly-kafkacat-utility
+
+
+
+
+

Development environment

+

You will need to install the library. Most likely in a python venv. So first, create a python virtual +environment. Then you can install arroyo with this.

+
pip install sentry-arroyo
+
+
+
+
+

Create two Kafka topics

+

Our example will consume from one topic and produce the same messages on another topic. So we need +two topics.

+
docker exec sentry_kafka kafka-topics \
+    --create \
+    --topic source-topic \
+    --bootstrap-server 127.0.0.1:9092
+
+docker exec sentry_kafka kafka-topics \
+    --create \
+    --topic dest-topic \
+    --bootstrap-server 127.0.0.1:9092
+
+
+

Now you should be ready to develop with Arroyo.

+
+
+
+

Create a basic consumer

+

Arroyo provides two level of abstractions when writing a consumer: the basic consumer/producer library +and the Streaming library. The first is just a thin wrapper around a librdkafka consumer/producer that +adds some features around offset management. The second provides a more abstract streaming interface +that hides details like rebalancing and the consumer lifecycle.

+
+

Creating a basic consumer

+

This initializes a basic consumer and consumes a message.

+
from arroyo.backends.kafka.configuration import (
+    build_kafka_consumer_configuration,
+)
+from arroyo.backends.kafka.consumer import KafkaConsumer
+from arroyo.types import Topic
+
+TOPIC = Topic("source-topic")
+
+consumer = KafkaConsumer(
+    build_kafka_consumer_configuration(
+        default_config={},
+        bootstrap_servers=["127.0.0.1:9092"],
+        auto_offset_reset="latest",
+        group_id="test-group",
+    )
+)
+
+consumer.subscribe([TOPIC])
+
+while True:
+    msg = consumer.poll(timeout=1.0)
+    if msg is not None:
+        print(f"MSG: {msg.payload}")
+
+
+

Start this script and use kcat to produce a message:

+
echo "MESSAGE" | kcat -P -b 127.0.0.1:9092 -t source-topic
+
+
+

In a while the message should appear on the console:

+
MSG: KafkaPayload(key=None, value=b'MESSAGE', headers=[])
+
+
+
+
+

Create a streaming consumer

+

Add a ProcessingStrategy and ProcessingStrategyFactory. +Here we are using the RunTask strategy which runs a custom function over each message.

+
from typing import Mapping
+
+from arroyo.backends.kafka import KafkaPayload
+from arroyo.processing.strategies import (
+    CommitOffsets,
+    ProcessingStrategy,
+    ProcessingStrategyFactory,
+    RunTask,
+)
+from arroyo.types import Commit, Message, Partition, Topic
+
+
+def handle_message(message: Message[KafkaPayload]) -> Message[KafkaPayload]:
+    print(f"MSG: {message.payload}")
+    return message.payload
+
+class ConsumerStrategyFactory(ProcessingStrategyFactory[KafkaPayload]):
+    """
+    The factory manages the lifecycle of the `ProcessingStrategy`.
+    A strategy is created every time new partitions are assigned to the
+    consumer, while it is destroyed when partitions are revoked or the
+    consumer is closed
+    """
+    def create_with_partitions(
+        self,
+        commit: Commit,
+        partitions: Mapping[Partition, int],
+    ) -> ProcessingStrategy[KafkaPayload]:
+        return RunTask(handle_message, CommitOffsets(commit))
+
+
+

The code above is orchestrated by the Arroyo runtime called StreamProcessor.

+
from arroyo.processing import StreamProcessor
+from arroyo.commit import ONCE_PER_SECOND
+
+processor = StreamProcessor(
+    consumer=consumer,
+    topic=TOPIC,
+    processor_factory=ConsumerStrategyFactory(),
+    commit_policy=ONCE_PER_SECOND,
+)
+
+processor.run()
+
+
+

The main consumer loop is managed by the StreamProcessor no need to periodically poll the +consumer. The ConsumerStrategy works by inversion of control.

+
+
+

Add some useful logic

+

Now we will chain the Produce strategy to produce messages on a second topic after the message is logged

+
from arroyo.backends.kafka import KafkaProducer
+from arroyo.backends.kafka.configuration import build_kafka_configuration
+from arroyo.processing.strategies import Produce
+
+class ConsumerStrategyFactory(ProcessingStrategyFactory[KafkaPayload]):
+    """
+    The factory manages the lifecycle of the `ProcessingStrategy`.
+    A strategy is created every time new partitions are assigned to the
+    consumer, while it is destroyed when partitions are revoked or the
+    consumer is closed
+    """
+    def create_with_partitions(
+        self,
+        commit: Commit,
+        partitions: Mapping[Partition, int],
+    ) -> ProcessingStrategy[KafkaPayload]:
+        producer = KafkaProducer(
+            build_kafka_configuration(
+                default_config={},
+                bootstrap_servers=BOOTSTRAP_SERVERS,
+            )
+        )
+
+        return RunTask(
+            handle_message,
+            Produce(producer, Topic("dest-topic"), CommitOffsets(commit))
+        )
+
+
+

The message is first passed to the RunTask strategy which simply logs the message and submits +the output to the next step. The Produce strategy produces the message asynchronously. Once +the message is produced, the CommitOffsets strategy commits the offset of the message.

+
+
+
+

Further examples

+

Find some complete examples of usage.

+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..57a92a4e --- /dev/null +++ b/index.html @@ -0,0 +1,186 @@ + + + + + Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+ _images/arroyo-banner.png +

Arroyo is a library to build streaming applications that consume from +and produce to Kafka.

+

It relies on the confluent_kafka python library, which itself relies +on librdkafka.

+

Arroyo provides mainly three functionalities:

+
    +
  • A set of abstractions inspired to common messaging applications patterns.

  • +
  • Some abstractions to simplify offset management and rebalancing.

  • +
  • An in memory broker abstraction to simplify writing unit tests.

  • +
+
+

Contents:

+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/intro.html b/intro.html new file mode 100644 index 00000000..928628ad --- /dev/null +++ b/intro.html @@ -0,0 +1,163 @@ + + + + + <no title> - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+ _images/arroyo-banner.png +

Arroyo is a library to build streaming applications that consume from +and produce to Kafka.

+

It relies on the confluent_kafka python library, which itself relies +on librdkafka.

+

Arroyo provides mainly three functionalities:

+
    +
  • A set of abstractions inspired to common messaging applications patterns.

  • +
  • Some abstractions to simplify offset management and rebalancing.

  • +
  • An in memory broker abstraction to simplify writing unit tests.

  • +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/metrics.html b/metrics.html new file mode 100644 index 00000000..e200dc98 --- /dev/null +++ b/metrics.html @@ -0,0 +1,354 @@ + + + + + Metrics - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Metrics

+

Arroyo consumers and strategies attempt to auto instrument some metrics that most people find useful +to understand the behavior and performance of their consumers. These metrics are typically sampled or +buffered as appropriate and flushed periodically (often once per second).

+

In order to use these metrics, you must configure a metrics backend that conforms to the metrics protocol +before creating your consumer.

+

This can be done like so:

+
from arroyo.utils.metrics import Metrics, MetricName
+
+ class MyMetrics(Metrics):
+     def increment(
+         self, name: MetricName, value: Union[int, float] = 1, tags: Optional[Tags] = None
+     ) -> None:
+         # Increment a counter by the given value.
+         record_incr(name, value, tags)
+
+     def gauge(
+         self, name: MetricName, value: Union[int, float], tags: Optional[Tags] = None
+     ) -> None:
+         # Sets a gauge metric to the given value.
+         record_gauge(name, value, tags)
+
+     def timing(
+         self, name: MetricName, value: Union[int, float], tags: Optional[Tags] = None
+     ) -> None:
+         # Emit a timing metric with the given value.
+         record_timing(name, value, tags)
+
+ metrics_backend = MyMetrics()
+
+ configure_metrics(metrics_backend)
+
+
+
+

Available Metrics

+
from typing import Literal
+
+MetricName = Literal[
+    # Time: Number of messages in a multiprocessing batch
+    "arroyo.strategies.run_task_with_multiprocessing.batch.size.msg",
+    # Time: Number of bytes in a multiprocessing batch
+    "arroyo.strategies.run_task_with_multiprocessing.batch.size.bytes",
+    # Time: Number of messages in a multiprocessing batch after the message transformation
+    "arroyo.strategies.run_task_with_multiprocessing.output_batch.size.msg",
+    # Time: Number of bytes in a multiprocessing batch after the message transformation
+    "arroyo.strategies.run_task_with_multiprocessing.output_batch.size.bytes",
+    # Counter: Number of times the consumer is spinning
+    "arroyo.consumer.run.count",
+    # Counter: Number of times the consumer encountered an invalid message.
+    "arroyo.consumer.invalid_message.count",
+    # Time: How long it took the Reduce step to fill up a batch
+    "arroyo.strategies.reduce.batch_time",
+    # Counter: Incremented when a strategy after multiprocessing applies
+    # backpressure to multiprocessing. May be a reason why CPU cannot be
+    # saturated.
+    "arroyo.strategies.run_task_with_multiprocessing.batch.backpressure",
+    # Counter: Incremented when multiprocessing cannot fill the input batch
+    # because not enough memory was allocated. This results in batches smaller
+    # than configured. Increase `input_block_size` to fix.
+    "arroyo.strategies.run_task_with_multiprocessing.batch.input.overflow",
+    # Counter: Incremented when multiprocessing cannot pull results in batches
+    # equal to the input batch size, because not enough memory was allocated.
+    # This can be devastating for throughput. Increase `output_block_size` to
+    # fix.
+    "arroyo.strategies.run_task_with_multiprocessing.batch.output.overflow",
+    # Counter: Arroyo has decided to re-allocate a block in order to combat input
+    # buffer overflow. This behavior can be disabled by explicitly setting
+    # `input_block_size` to a not-None value in `RunTaskWithMultiprocessing`.
+    "arroyo.strategies.run_task_with_multiprocessing.batch.input.resize",
+    # Counter: Arroyo has decided to re-allocate a block in order to combat output
+    # buffer overflow. This behavior can be disabled by explicitly setting
+    # `output_block_size` to a not-None value in `RunTaskWithMultiprocessing`.
+    "arroyo.strategies.run_task_with_multiprocessing.batch.output.resize",
+    # Gauge: How many batches are being processed in parallel by multiprocessing.
+    "arroyo.strategies.run_task_with_multiprocessing.batches_in_progress",
+    # Counter: A subprocess by multiprocessing unexpectedly died.
+    "sigchld.detected",
+    # Gauge: Shows how many processes the multiprocessing strategy is
+    # configured with.
+    "arroyo.strategies.run_task_with_multiprocessing.processes",
+    # Counter: Incremented when the multiprocessing pool is created (or re-created).
+    "arroyo.strategies.run_task_with_multiprocessing.pool.create",
+    # Time: (unitless) spent polling librdkafka for new messages.
+    "arroyo.consumer.poll.time",
+    # Time: (unitless) spent in strategies (blocking in strategy.submit or
+    # strategy.poll)
+    "arroyo.consumer.processing.time",
+    # Time: (unitless) spent pausing the consumer due to backpressure (MessageRejected)
+    "arroyo.consumer.backpressure.time",
+    # Time: (unitless) spent in handling `InvalidMessage` exceptions and sending
+    # messages to the the DLQ.
+    "arroyo.consumer.dlq.time",
+    # Time: (unitless) spent in waiting for the strategy to exit, such as during
+    # shutdown or rebalancing.
+    "arroyo.consumer.join.time",
+    # Time: (unitless) spent in librdkafka callbacks. This metric's timings
+    # overlap other timings, and might spike at the same time.
+    "arroyo.consumer.callback.time",
+    # Time: (unitless) spent in shutting down the consumer. This metric's
+    # timings overlap other timings, and might spike at the same time.
+    "arroyo.consumer.shutdown.time",
+    # Time: A regular duration metric where each datapoint is measuring the time it
+    # took to execute a single callback. This metric is distinct from the
+    # arroyo.consumer.*.time metrics as it does not attempt to accumulate time
+    # spent per second in an attempt to keep monitoring overhead low.
+    #
+    # The metric is tagged by the name of the internal callback function being
+    # executed, as 'callback_name'. Possible values are on_partitions_assigned
+    # and on_partitions_revoked.
+    "arroyo.consumer.run.callback",
+    # Time: Duration metric measuring the time it took to flush in-flight messages
+    # and shut down the strategies.
+    "arroyo.consumer.run.close_strategy",
+    # Time: Duration metric measuring the time it took to create the processing strategy.
+    "arroyo.consumer.run.create_strategy",
+    # Counter: How many partitions have been revoked just now.
+    "arroyo.consumer.partitions_revoked.count",
+    # Counter: How many partitions have been assigned just now.
+    "arroyo.consumer.partitions_assigned.count",
+    # Time: Consumer latency in seconds. Recorded by the commit offsets strategy.
+    "arroyo.consumer.latency",
+    # Counter: Metric for when the underlying rdkafka consumer is being paused.
+    #
+    # This flushes internal prefetch buffers.
+    "arroyo.consumer.pause",
+    # Counter: Metric for when the underlying rdkafka consumer is being resumed.
+    #
+    # This might cause increased network usage as messages are being re-fetched.
+    "arroyo.consumer.resume",
+    # Gauge: Queue size of background queue that librdkafka uses to prefetch messages.
+    "arroyo.consumer.librdkafka.total_queue_size",
+    # Counter: Counter metric to measure how often the healthcheck file has been touched.
+    "arroyo.processing.strategies.healthcheck.touch",
+    # Counter: Number of messages dropped in the FilterStep strategy
+    "arroyo.strategies.filter.dropped_messages",
+]
+
+
+

For convenience Arroyo includes a machine readable version which can be loaded like:

+
import importlib.resources
+import json
+
+with importlib.resources.files("arroyo.utils").joinpath("metricDefs.json").open() as f:
+    metric_defs = json.load(f)
+
+
+
+
+

API

+
+
+class arroyo.utils.metrics.Metrics(*args, **kwargs)
+

An abstract class that defines the interface for metrics backends.

+
+
+abstract gauge(name: MetricName, value: int | float, tags: Mapping[str, str] | None = None) None
+

Sets a gauge metric to the given value.

+
+ +
+
+abstract increment(name: MetricName, value: int | float = 1, tags: Mapping[str, str] | None = None) None
+

Increments a counter metric by a given value.

+
+ +
+
+abstract timing(name: MetricName, value: int | float, tags: Mapping[str, str] | None = None) None
+

Records a timing metric.

+
+ +
+ +
+
+arroyo.utils.metrics.configure_metrics(metrics: Metrics, force: bool = False) None
+

Metrics can generally only be configured once, unless force is passed +on subsequent initializations.

+
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..35b2a96d94a0365e4e4cd322c4ed3c4889d2436f GIT binary patch literal 1334 zcmV-61NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkGa&m8Z zZwezIR%LQ?X>V>iAPOTORA^-&a%F8{X>Md?av*PJAarPHb0B7EY-J#6b0A}HZE$jB zb8}^6Aa!$TZf78RY-wUH3V7PRS<7*=)9IOE2XCe_$Zv(!M~ zm53MwXaJ0@zb{CDBq$N2NJ?E%1nxQafd_#jET!0sIAPBy-(P1UDHx!)$h@mK)fxNA zHeLOUt|Hvn#vj=8-!!AT1QCXnLhn4xvGGbUO7x&Ti6ihA!F>z78iLcn|5wTrcnwu^m@;-{ zxQFjRG$e=R==X9u{i^AHu)UozIzM|%m{8TAW}s7%T*k?FLHVV934x;4#0UU-5zCoz#=-q$Zwr|TR`P0IzN{+|qEl@>Y?FK3y98>~rc+CrO4 z-9K%AX;AOW9}gPxz_4`bXYdX##^vn8OJpwpSH3xKU5Lo)Fnh+(_O8Wtt3a!1BWbbm zP4)Q4G6Z7ob2G}nrA*r|V_)R9cUr^_b6Y(IO6+rwlBR%}PDu*nDHN+`GA&>q__6D! zC+s6Pqx{^QLP9~8ebb_?5MLZ+Pkb%oC{=FHMWNVS_q6b8(5mI`39>^y$|+$eOxrsx zN{6|Jff#+>al(SHHCDmNS@%y2vqs$){L!)ZMcN@hnRQLgGc_O5M2&^*na<0=CveH! z@yFKrKvqY-Pj^}!53+)3+8U0g+6S7MbT5@l|C{Oid>q!aI%y} zLe4Omcuqeg(KG|4ahA`FMv5npv#Z;p&rn~FjKgbvvRO{n@?fnc-4y0-G>fRYd7Oo7 z$sF>CmdqlLrZbObi6_n>dvJtg)fQwTgQqRcLoT1YHPNC`Js??|?bOv~8Q+2# zQd2D4Wonuq^*%FWg01|;H*uUBY+P9_jUd({r(`C}V~w4dLxqbu&gK?y?k0bx?fnef z-r@~!;U}}ul&RP_m6UW3G_Ealj_Cl+YG?@Rq3Gbpfbk9&yKer|@RSn?8F0OT!xXVT zT~8w*!fb21Lc-cBm;M$C;x;9o?imsJuuvWiufy_R};PM;_sbr`6ufIo@@spqvq1 zpl!352iw0gAEKy7`tt(~DTAm|DiP)ha++ck6yySYJ*u56MN@_&(JVmaDQd``qN0A` zDu6$fwveZWb)q<$bGw}*#H0l literal 0 HcmV?d00001 diff --git a/offsets.html b/offsets.html new file mode 100644 index 00000000..6b02ed2b --- /dev/null +++ b/offsets.html @@ -0,0 +1,197 @@ + + + + + Committing offsets - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Committing offsets

+

Arroyo does not auto commit offsets. It is up to you to manually commit offsets when processing for that +message is completed.

+

The commit callback will be passed to processing strategy via ProcessingStrategyFactory.create_with_partitions. +You should pass this to the strategy and have your strategy call this commit function once the rest of the message +processing has been done.

+

The offset to be committed in Kafka is always the next offset to be consumed from, i.e. message’s offset + 1. +In Arroyo, this means you should commit Message.next_offset and never Message.offset when done processing +that message. Arroyo exposes Message.position_to_commit to make this easier.

+

It is not safe to commit every offset in a high throughput consumer as this will add a lot of load to the system. +Commits should generally be throttled. CommitPolicy is the Arroyo way of specifying commit frequency. A CommitPolicy +must be passed to the stream processor, which allows specifying a minimum commit frequency (or messages between commits). +Commit throttling can be skipped when needed (i.e. during consumer shutdown) by passing force=True to the commit callback. +If you are not sure how often to commit, ONCE_PER_SECOND is a reasonable option.

+

The easiest way is to use the CommitOffsets strategy as the last step in a chain of processing strategies to commit offsets.

+
class MyConsumerFactoryFactory(ProcessingStrategyFactory[KafkaPayload]):
+    def create_with_partitions(
+        self,
+        commit: Commit,
+        partitions: Mapping[Partition, int],
+    ) -> ProcessingStrategy[KafkaPayload]:
+        def my_processing_function(message: Message[KafkaPayload]) -> None:
+            # do something (synchronous) with the message
+            do_something()
+
+
+        return RunTask(my_processing_function, CommitOffsets(commit))
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 00000000..699bde99 --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,179 @@ + + + + + Python Module Index - Arroyo documentation + + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+
+ + +

Python Module Index

+ +
+ a +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ a
+ arroyo +
    + arroyo.dlq +
    + arroyo.processing.strategies.abstract +
    + arroyo.processing.strategies.batching +
    + arroyo.processing.strategies.commit +
    + arroyo.processing.strategies.filter +
    + arroyo.processing.strategies.healthcheck +
    + arroyo.processing.strategies.noop +
    + arroyo.processing.strategies.produce +
    + arroyo.processing.strategies.reduce +
    + arroyo.processing.strategies.run_task +
    + arroyo.processing.strategies.run_task_in_threads +
    + arroyo.processing.strategies.run_task_with_multiprocessing +
    + arroyo.processing.strategies.unfold +
    + arroyo.types +
    + arroyo.utils.metrics +
+ + +
+ +
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 00000000..d991e6c3 --- /dev/null +++ b/search.html @@ -0,0 +1,115 @@ + + + + + Search - Arroyo documentation + + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + +
+

+ + + +
+ +
+ + +
+ +
+
+
+
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..2e873082 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["architecture", "backpressure", "dlqs", "getstarted", "index", "intro", "metrics", "offsets", "strategies/batching", "strategies/commit_offsets", "strategies/filter", "strategies/healthcheck", "strategies/index", "strategies/noop", "strategies/produce", "strategies/reduce", "strategies/run_task", "strategies/run_task_in_threads", "strategies/run_task_with_multiprocessing", "strategies/unfold", "what_for"], "filenames": ["architecture.rst", "backpressure.rst", "dlqs.rst", "getstarted.rst", "index.rst", "intro.rst", "metrics.rst", "offsets.rst", "strategies/batching.rst", "strategies/commit_offsets.rst", "strategies/filter.rst", "strategies/healthcheck.rst", "strategies/index.rst", "strategies/noop.rst", "strategies/produce.rst", "strategies/reduce.rst", "strategies/run_task.rst", "strategies/run_task_in_threads.rst", "strategies/run_task_with_multiprocessing.rst", "strategies/unfold.rst", "what_for.rst"], "titles": ["Arroyo Architecture", "Backpressure", "Dead letter queues", "Getting started with Arroyo", "Contents:", "<no title>", "Metrics", "Committing offsets", "Batch and Unbatch", "Commit offsets", "Filter", "Healthchecks", "Processing Strategies", "Noop", "Produce", "Reduce (Fold)", "Run Task", "Run Task in Threads", "Run Task with Multiprocessing", "Unfold", "What is Arroyo for?"], "terms": {"i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19], "set": [0, 2, 4, 5, 6, 11, 18], "abstract": [0, 3, 4, 5, 6, 12, 20], "interact": 0, "kafka": [0, 2, 4, 5, 7, 11, 12, 14], "These": [0, 6], "ar": [0, 2, 3, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19, 20], "meant": 0, "help": [0, 20], "develop": 0, "write": [0, 3, 4, 5, 12, 20], "perform": [0, 1, 6, 12, 18, 20], "consum": [0, 1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 14], "specif": 0, "deliveri": 0, "guarante": [0, 2], "common": [0, 4, 5], "problem": 0, "address": 0, "least": [0, 18], "onc": [0, 2, 3, 6, 7, 9, 11, 12, 15, 17, 18, 20], "provid": [0, 2, 3, 4, 5, 8, 12, 16, 19], "dead": [0, 4, 16], "letter": [0, 4, 16], "queue": [0, 4, 6, 16, 20], "support": [0, 2, 11], "parallel": [0, 6, 17, 18], "multi": 0, "process": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20], "messag": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20], "etc": [0, 12], "The": [0, 2, 3, 6, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20], "librari": [0, 3, 4, 5, 20], "divid": [0, 20], "three": [0, 4, 5], "layer": 0, "basic": [0, 10, 16], "connect": 0, "simpl": 0, "wrapper": [0, 3], "around": [0, 3], "confluent": [0, 3], "python": [0, 3, 4, 5], "which": [0, 3, 4, 5, 6, 7, 8, 14, 17, 20], "itself": [0, 4, 5, 14, 18], "base": [0, 1, 8, 12, 15, 19], "librdkafka": [0, 3, 4, 5, 6], "besid": 0, "some": [0, 1, 2, 4, 5, 6, 14, 18], "cosmet": 0, "chang": [0, 3], "thi": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19, 20], "fake": 0, "memori": [0, 4, 5, 6, 18], "broker": [0, 3, 4, 5, 9, 11, 12, 18, 20], "make": [0, 7, 10, 18, 20], "unit": [0, 4, 5], "test": [0, 3, 4, 5, 11, 18, 20], "quick": 0, "run": [0, 3, 6, 11, 12, 15, 20], "an": [0, 3, 4, 5, 6, 14, 17, 18, 19, 20], "asynchron": [0, 3, 12], "written": [0, 12], "pipelin": [0, 11], "where": [0, 6, 14, 18], "each": [0, 1, 3, 6, 12, 14, 15, 17, 18, 20], "segment": 0, "oper": [0, 20], "implement": [0, 2, 12, 19], "main": [0, 1, 3, 11, 18], "loop": [0, 3, 12], "deleg": 0, "On": [0, 14, 17], "top": [0, 20], "when": [0, 3, 6, 7, 8, 12, 18], "like": [0, 1, 3, 6, 11, 18, 20], "map": [0, 1, 3, 6, 7, 11, 12], "reduc": [0, 6, 8, 12, 18, 20], "filter": [0, 2, 6], "togeth": [0, 8, 12, 15], "applic": [0, 2, 4, 5, 12, 20], "pattern": [0, 4, 5], "A": [0, 1, 3, 4, 5, 6, 7, 8, 11, 12, 14, 20], "built": [0, 12, 20], "wai": [0, 7, 20], "suppos": [0, 1], "execut": [0, 6, 12], "small": [0, 18], "cpu": [0, 1, 6, 18], "work": [0, 1, 3, 12, 18, 20], "block": [0, 1, 6, 11, 12, 18, 20], "do": [0, 1, 3, 7, 10, 11, 18, 20], "io": [0, 3, 11, 17, 20], "non": 0, "we": [0, 3, 8, 12, 14, 17, 20], "gener": [0, 6, 7, 8, 12, 18, 19], "us": [0, 2, 6, 7, 8, 9, 12, 14, 17, 18, 20], "futur": [0, 14, 17], "heavier": 0, "separ": [0, 20], "call": [0, 3, 7, 8, 11, 12, 19, 20], "processingstrategi": [0, 1, 3, 7, 8, 10, 11, 12, 14, 15, 16, 17, 18, 19], "modul": [0, 18], "todo": [0, 20], "bring": 0, "docstr": 0, "doc": [0, 3, 20], "refer": [0, 14], "In": [0, 2, 3, 6, 7, 18, 20], "most": [0, 1, 3, 6, 11, 12, 18, 20], "case": [0, 14, 18], "would": [0, 8, 11, 20], "directli": 0, "higher": [0, 11, 20], "manag": [0, 3, 4, 5], "phase": 0, "poll": [0, 2, 3, 6, 8, 11, 12, 14, 17, 19, 20], "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 14, 15, 18, 19, 20], "through": 0, "If": [0, 1, 2, 3, 7, 8, 10, 11, 12, 14, 17, 18, 19, 20], "proce": 0, "repeat": 0, "submit": [0, 1, 2, 3, 6, 8, 10, 12, 14, 15, 17, 19], "first": [0, 3, 8, 18], "deliv": 0, "It": [0, 1, 2, 3, 4, 5, 7, 9, 12], "should": [0, 2, 3, 7, 8, 9, 10, 11, 12, 15, 16, 18, 20], "return": [0, 1, 3, 7, 10, 11, 12, 19, 20], "immedi": [0, 12, 20], "forward": [0, 2, 10, 18], "result": [0, 6, 10, 17, 18], "follow": [0, 8, 12, 18, 20], "step": [0, 2, 3, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19], "ideal": 0, "all": [0, 2, 8, 9, 12, 18, 20], "done": [0, 2, 6, 7, 12, 17], "thread": [0, 1, 11, 12, 14], "heavi": 0, "so": [0, 3, 6, 8, 10, 11, 12, 18, 20], "method": [0, 2, 8, 12, 14, 17], "check": [0, 12, 14, 17], "complet": [0, 3, 7, 9, 12, 14, 17], "dispatch": 0, "next": [0, 2, 3, 7, 8, 10, 14, 15, 17, 18, 19, 20], "practic": 0, "here": [0, 3, 20], "overhead": [0, 6], "offload": 0, "too": [0, 1, 11, 14, 17, 18], "mai": [0, 1, 2, 6, 10, 12, 18], "decid": [0, 6, 20], "take": [0, 10, 11, 13, 17, 18], "instead": [0, 8, 10, 18], "appli": [0, 1, 2, 6, 14, 18], "back": [0, 9, 18], "pressur": 0, "rais": [0, 1, 2, 12, 14, 16, 17], "messagereject": [0, 1, 6, 8, 12, 14, 15, 17, 19], "except": [0, 1, 2, 6, 8, 12, 14, 15, 17, 19, 20], "paus": [0, 1, 6], "till": 0, "readi": [0, 3, 8], "accept": [0, 12], "time": [0, 1, 3, 6, 8, 10, 11, 12, 15, 18, 20], "commit": [0, 1, 3, 4, 6, 10, 11, 12], "callback": [0, 1, 6, 7, 10], "instanti": [0, 12], "orchestr": [0, 3], "life": 0, "cycl": 0, "thu": [0, 8], "think": 0, "shut": [0, 6, 11, 12], "down": [0, 1, 6, 11, 12, 14, 17], "wait": [0, 6, 18], "flight": [0, 6], "destroi": [0, 3], "There": [0, 20], "two": [0, 2, 18], "scenario": [0, 2, 10, 20], "can": [0, 1, 2, 3, 6, 7, 8, 10, 11, 12, 14, 16, 17, 18], "happen": [0, 11], "being": [0, 2, 6, 12, 14, 20], "termin": [0, 8, 12], "rebalanc": [0, 1, 3, 4, 5, 6, 12], "revok": [0, 3, 6, 12, 20], "partit": [0, 1, 2, 3, 6, 7, 8, 10, 11, 12, 20], "assign": [0, 3, 6, 12, 20], "new": [0, 3, 6, 8, 20], "ones": [0, 12, 18], "after": [0, 3, 6, 9, 11, 12, 20], "imposs": 0, "wa": [0, 6, 8, 12, 14, 18], "order": [0, 2, 3, 6, 8, 15, 18, 20], "ensur": [0, 9], "behav": 0, "consist": [0, 2], "upon": [0, 2], "build": [0, 4, 5, 12, 20], "one": [0, 2, 3, 8, 14, 15, 19, 20], "allow": [0, 7, 8, 12, 20], "befor": [0, 6, 8, 12, 15, 18], "same": [0, 1, 3, 6, 18], "few": [0, 1, 20], "simpler": 0, "exampl": [0, 1, 12, 20], "task": [0, 12], "multiprocess": [0, 6], "design": [0, 20], "flexibl": [0, 12], "thei": [0, 2, 8, 15], "function": [0, 3, 4, 5, 6, 7, 8, 10, 11, 12, 15, 16, 17, 18, 19], "user": [0, 17, 19, 20], "everi": [0, 2, 3, 7, 10, 20], "pass": [0, 1, 2, 3, 6, 7, 8, 10, 11, 14, 20], "output": [0, 3, 6, 14], "includ": [0, 6, 8], "synchron": [0, 7, 12, 18], "version": [0, 6], "depend": [0, 12], "kind": [0, 11], "concurr": [0, 17], "requir": [0, 1, 2, 3, 8, 20], "type": [0, 3, 6, 10, 12], "inspect": 0, "whether": [0, 8, 20], "discard": [0, 12, 20], "transform": [0, 6, 14, 18], "its": [0, 10, 12, 20], "content": [0, 8], "produc": [0, 2, 3, 4, 5, 12], "topic": [0, 2, 12, 14], "onli": [0, 6, 9, 10, 20], "need": [0, 3, 7, 10, 12, 18, 20], "wire": [0, 12], "them": [0, 8, 10, 18, 19, 20], "logic": [0, 12, 20], "side": 0, "effect": [0, 1, 18], "variat": 0, "abov": [0, 3], "have": [0, 3, 6, 7, 8, 10, 18, 20], "store": [0, 18], "somewher": 0, "throughput": [0, 6, 7, 18], "intens": 0, "gil": 0, "doe": [0, 6, 7, 8, 13, 20], "advantag": 0, "batch": [0, 6, 12, 15], "via": [0, 7], "share": [0, 18], "larg": [0, 18], "transpar": 0, "carri": [0, 10], "out": [0, 8, 11, 18, 20], "collector": 0, "full": [0, 8, 15], "typic": [0, 6, 14], "storag": 0, "round": 0, "trip": 0, "arroyo": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "": [1, 6, 7, 12, 18], "own": [1, 12], "strategi": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19], "intern": [1, 3, 6, 20], "addit": [1, 2, 20], "deal": [1, 10], "correctli": 1, "you": [1, 3, 6, 7, 8, 10, 11, 12, 18, 20], "want": [1, 8, 11, 18, 20], "slow": [1, 12, 14, 17], "extern": [1, 3], "signal": [1, 20], "condit": [1, 15], "achiev": 1, "within": [1, 20], "runtask": [1, 3, 7, 11, 16], "while": [1, 3, 20], "class": [1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "consumerstrategyfactori": [1, 3, 11], "processingstrategyfactori": [1, 3, 7, 11, 12], "kafkapayload": [1, 2, 3, 7, 11], "def": [1, 3, 6, 7, 11, 20], "__init__": [1, 11], "self": [1, 3, 6, 7, 11], "is_paus": [1, 11], "fals": [1, 2, 3, 6, 10, 11, 20], "create_with_partit": [1, 3, 7, 11, 12], "int": [1, 2, 3, 6, 7, 8, 11, 12, 14, 15, 17, 18], "handle_messag": [1, 3, 11], "print": [1, 3], "f": [1, 3, 6], "msg": [1, 3, 6, 18], "payload": [1, 3, 10, 12, 17], "commitoffset": [1, 3, 7, 9, 11], "recommend": [1, 12], "just": [1, 3, 6, 10, 11], "sleep": 1, "ing": 1, "more": [1, 3, 12, 18, 20], "than": [1, 2, 6, 11, 18], "millisecond": [1, 11], "definit": 1, "long": [1, 6, 11, 18], "prevent": [1, 2], "thing": [1, 18, 20], "occur": [1, 14, 17], "0": [1, 3, 20], "01": 1, "second": [1, 3, 6, 8, 11, 15, 18], "spin": [1, 6], "100": [1, 2, 10], "howev": [1, 11, 18, 20], "background": [1, 6], "impact": [1, 20], "dure": [1, 6, 7, 12], "caution": 2, "break": [2, 18], "otherwis": [2, 20], "offer": 2, "code": [2, 3, 11, 12, 20], "particular": 2, "must": [2, 6, 7, 19], "safe": [2, 7], "drop": [2, 6, 10], "replai": 2, "later": [2, 10, 12], "re": [2, 6, 18, 20], "dlq": [2, 6], "ed": 2, "critic": 2, "relev": 2, "downstream": [2, 8, 10, 15], "rout": 2, "invalid": [2, 6, 16], "becaus": [2, 6, 10, 11, 18], "singl": [2, 6, 12, 14, 19], "caus": [2, 6, 10, 18], "crash": [2, 12], "subsequ": [2, 6, 19], "configur": [2, 3, 6, 18], "streamprocessor": [2, 3, 12], "ani": [2, 12, 18, 20], "invalidmessag": [2, 6, 16], "dlqlimit": 2, "max_invalid_ratio": 2, "float": [2, 6, 8, 12, 15, 18], "none": [2, 3, 6, 7, 8, 10, 12, 15, 18], "max_consecutive_count": 2, "defin": [2, 6, 12], "limit": [2, 18], "place": 2, "number": [2, 6, 8, 12, 20], "exist": 2, "go": 2, "someth": [2, 7, 12, 20], "misconfigur": 2, "bad": [2, 20], "deploi": [2, 20], "prefer": 2, "stop": 2, "altogeth": 2, "fix": [2, 6, 18, 20], "rather": [2, 10, 18], "rerout": 2, "ratio": 2, "count": [2, 6], "per": [2, 6, 8, 11, 18, 20], "basi": 2, "dlqpolici": 2, "dlqproduc": 2, "tstrategypayload": [2, 8, 10, 11, 12, 14, 16, 17, 18], "max_buffered_messages_per_partit": 2, "polici": 2, "stream": [2, 4, 5, 7, 10, 12, 14, 17], "processor": [2, 3, 7, 12, 14, 17], "creation": 2, "offset": [2, 3, 4, 5, 6, 8, 10, 12, 18, 20], "needs_commit": 2, "bool": [2, 6, 10], "true": [2, 3, 7, 20], "valid": 2, "retri": [2, 12], "join": [2, 6, 8, 12], "multipl": [2, 11, 20], "kafkadlqproduc": 2, "field": 2, "ad": [2, 8], "header": [2, 3], "original_partit": 2, "origin": [2, 14, 17], "original_offset": 2, "noopdlqproduc": 2, "arg": [2, 6, 11, 12], "kwd": [2, 12], "tutori": 3, "show": [3, 6, 18], "how": [3, 6, 7, 8, 12, 15], "scratch": 3, "section": [3, 18, 20], "explain": [3, 20], "alreadi": [3, 20], "skip": [3, 7], "command": [3, 11], "docker": 3, "contain": [3, 10, 11, 12, 17], "network": [3, 6, 20], "rm": [3, 11], "v": [3, 18], "zookeeper_volum": 3, "var": 3, "lib": 3, "env": 3, "zookeeper_client_port": 3, "2181": 3, "name": [3, 6, 11, 12], "sentry_zookeep": 3, "p": 3, "confluentinc": 3, "cp": 3, "6": 3, "2": 3, "kafka_volum": 3, "kafka_zookeeper_connect": 3, "kafka_listen": 3, "9093": 3, "9092": [3, 20], "kafka_advertised_listen": 3, "127": 3, "1": [3, 6, 7, 12], "kafka_listener_security_protocol_map": 3, "plaintext": 3, "kafka_inter_broker_listener_nam": 3, "kafka_offsets_topic_replication_factor": 3, "confluent_support_metrics_en": 3, "kafka_log4j_logg": 3, "cluster": 3, "warn": 3, "control": [3, 20], "coordin": 3, "log": [3, 20], "server": [3, 20], "state": [3, 20], "logger": 3, "kafka_log4j_root_loglevel": 3, "kafka_tools_log4j_loglevel": 3, "sentry_kafka": 3, "now": [3, 6, 18, 20], "see": [3, 18, 20], "tool": 3, "onto": 3, "http": [3, 20], "platform": 3, "current": [3, 8, 20], "app": 3, "usag": [3, 6], "html": 3, "kcat": 3, "formerli": 3, "util": [3, 6], "venv": 3, "virtual": 3, "Then": [3, 18], "pip": 3, "sentri": 3, "our": [3, 20], "anoth": [3, 14], "exec": [3, 11], "sourc": 3, "bootstrap": [3, 20], "dest": 3, "level": [3, 11, 20], "thin": 3, "featur": [3, 18], "interfac": [3, 6], "hide": 3, "detail": 3, "lifecycl": 3, "initi": [3, 6], "backend": [3, 6, 11], "import": [3, 6, 14, 20], "build_kafka_consumer_configur": 3, "kafkaconsum": [3, 11], "default_config": 3, "bootstrap_serv": 3, "auto_offset_reset": 3, "latest": [3, 20], "group_id": 3, "group": [3, 12], "subscrib": [3, 20], "timeout": [3, 8, 12, 20], "script": 3, "echo": 3, "b": 3, "t": [3, 10, 12, 18], "appear": 3, "consol": 3, "kei": 3, "valu": [3, 6, 12, 15, 18, 20], "custom": [3, 8, 12, 15, 16, 19, 20], "over": [3, 12], "factori": 3, "close": [3, 8, 12, 18], "runtim": 3, "once_per_second": [3, 7], "processor_factori": 3, "commit_polici": [3, 10], "period": [3, 6, 10, 20], "consumerstrategi": 3, "invers": 3, "chain": [3, 7, 9], "kafkaproduc": 3, "build_kafka_configur": 3, "simpli": 3, "find": [3, 6], "reli": [4, 5], "confluent_kafka": [4, 5, 20], "mainli": [4, 5], "inspir": [4, 5], "simplifi": [4, 5], "what": [4, 10, 18], "get": [4, 18, 20], "start": [4, 11, 18], "architectur": [4, 20], "backpressur": [4, 6, 18, 20], "metric": [4, 9, 18], "attempt": [6, 8, 14, 19, 20], "auto": [6, 7, 18, 20], "instrument": 6, "peopl": 6, "understand": [6, 20], "behavior": [6, 10, 20], "sampl": 6, "buffer": [6, 20], "appropri": 6, "flush": [6, 8, 15, 20], "often": [6, 7, 20], "conform": 6, "protocol": 6, "creat": [6, 8, 18, 19], "your": [6, 7, 10, 11, 12, 20], "metricnam": 6, "mymetr": 6, "increment": [6, 18], "union": [6, 10], "tag": 6, "option": [6, 7, 11], "counter": 6, "given": [6, 18], "record_incr": 6, "gaug": 6, "record_gaug": 6, "emit": [6, 10, 18], "record_tim": 6, "metrics_backend": 6, "configure_metr": 6, "liter": 6, "run_task_with_multiprocess": [6, 18], "size": [6, 15, 18], "byte": [6, 18], "output_batch": 6, "encount": [6, 18], "invalid_messag": 6, "took": 6, "fill": [6, 18], "up": [6, 7, 12, 18, 20], "batch_tim": 6, "reason": [6, 7, 10], "why": 6, "cannot": [6, 10, 20], "satur": 6, "input": 6, "enough": [6, 18], "alloc": [6, 18], "smaller": [6, 18], "increas": [6, 18], "input_block_s": [6, 18], "overflow": [6, 18], "pull": 6, "equal": 6, "devast": 6, "output_block_s": [6, 18], "ha": [6, 7, 8, 11, 12, 14, 20], "combat": 6, "disabl": 6, "explicitli": [6, 18], "runtaskwithmultiprocess": [6, 18], "resiz": [6, 18], "mani": [6, 8, 10, 11, 12, 14, 15, 17, 18, 20], "batches_in_progress": [6, 18], "subprocess": [6, 18], "unexpectedli": 6, "di": [6, 20], "sigchld": 6, "detect": 6, "pool": [6, 18], "unitless": 6, "spent": [6, 8, 15, 18], "due": [6, 12, 20], "handl": [6, 10, 20], "send": [6, 8, 18, 20], "exit": [6, 12], "shutdown": [6, 7, 12], "overlap": 6, "other": [6, 10, 12], "might": 6, "spike": 6, "regular": [6, 10], "durat": 6, "datapoint": 6, "measur": 6, "distinct": 6, "accumul": [6, 8, 15], "keep": [6, 8, 11, 12, 18, 19], "monitor": 6, "low": 6, "callback_nam": 6, "possibl": [6, 20], "on_partitions_assign": 6, "on_partitions_revok": 6, "close_strategi": 6, "create_strategi": 6, "been": [6, 7, 8, 12, 14, 20], "partitions_revok": 6, "partitions_assign": 6, "latenc": [6, 9], "record": [6, 9], "underli": 6, "rdkafka": 6, "prefetch": 6, "resum": 6, "fetch": [6, 18], "total_queue_s": 6, "healthcheck": 6, "file": [6, 11, 12, 20], "touch": [6, 11], "filterstep": [6, 10], "dropped_messag": 6, "For": [6, 10, 14, 17, 18], "conveni": 6, "machin": 6, "readabl": 6, "load": [6, 7, 18], "importlib": 6, "resourc": [6, 12], "json": 6, "joinpath": 6, "metricdef": 6, "open": 6, "metric_def": 6, "kwarg": [6, 12], "str": [6, 11, 12], "forc": [6, 7], "unless": 6, "manual": [7, 20], "rest": 7, "alwai": [7, 9, 14], "e": [7, 10, 19], "mean": [7, 18, 20], "next_offset": [7, 12], "never": [7, 18], "expos": 7, "position_to_commit": 7, "easier": 7, "high": [7, 8], "add": [7, 20], "lot": [7, 18, 20], "system": [7, 10], "throttl": 7, "commitpolici": [7, 10], "specifi": [7, 17], "frequenc": 7, "minimum": 7, "between": [7, 18], "sure": [7, 20], "easiest": 7, "last": [7, 9], "myconsumerfactoryfactori": 7, "my_processing_funct": 7, "do_someth": 7, "unfold": 8, "batchstep": 8, "max_batch_s": [8, 15, 18], "max_batch_tim": [8, 15, 18], "next_step": [8, 10, 11, 14, 15, 16, 17, 18, 19], "mutablesequ": 8, "basevalu": [8, 12, 15, 19], "compute_batch_s": [8, 15], "callabl": [8, 10, 15, 16, 17, 18, 19], "repres": [8, 12], "valuesbatch": 8, "object": [8, 17], "sequenc": [8, 19], "both": 8, "watermark": 8, "maximum": [8, 15], "receiv": [8, 12, 14, 15, 17, 19], "sinc": [8, 12, 17, 18], "sent": 8, "though": 8, "highest": [8, 18], "observ": [8, 18], "still": [8, 18], "committ": [8, 12], "lower": 8, "propag": [8, 15], "thrown": [8, 12, 15], "paramet": [8, 12, 15, 18], "much": [8, 15, 20], "tri": 8, "matter": 8, "filteredpayload": [8, 10, 12, 14, 16, 17, 18, 19], "without": [8, 18, 20], "previou": [8, 12, 18, 20], "try": 8, "again": [8, 18, 20], "introduc": 8, "duplic": 8, "unbatchstep": 8, "explod": [8, 19], "remain": [8, 19], "prior": [9, 12], "determin": 10, "sometim": 10, "actual": [10, 20], "desir": 10, "interv": [10, 11, 12], "That": [10, 18], "sentinel": 10, "those": [10, 18], "abl": [10, 18], "subtyp": 10, "doesn": [10, 18], "compos": 10, "default": [10, 11, 18, 20], "despit": 10, "tell": [10, 11, 12], "turn": 11, "unhealthi": 11, "max": [11, 15], "m": [11, 20], "kick": [11, 20], "300000": 11, "5": 11, "minut": 11, "noth": [11, 13], "pod": [11, 20], "well": 11, "repeatedli": 11, "indic": [11, 16], "health": 11, "tmp": 11, "txt": 11, "kubernet": 11, "live": 11, "look": [11, 18, 20], "apivers": 11, "v1": 11, "metadata": 11, "label": 11, "spec": 11, "imag": 11, "registri": 11, "k8": 11, "busybox": 11, "bin": 11, "my_arroyo_consum": 11, "livenessprob": 11, "initialdelaysecond": 11, "periodsecond": 11, "320": 11, "healthcheck_fil": 11, "filepath": 11, "everytim": 11, "overal": 11, "debounc": 11, "compon": 12, "normal": [12, 18], "don": [12, 18, 20], "encourag": 12, "plug": 12, "nevertheless": 12, "against": 12, "unabl": 12, "rate": [12, 18], "incom": 12, "abc": 12, "cours": 12, "intention": 12, "prescript": 12, "afford": 12, "signific": 12, "degre": 12, "variou": 12, "instanc": [12, 18], "No": [12, 20], "finish": 12, "were": [12, 18], "releas": 12, "longer": 12, "socket": 12, "until": [12, 15, 20], "previous": 12, "reach": [12, 20], "grace": 12, "revoc": [12, 20], "progress": 12, "continu": [12, 18], "statu": 12, "schedul": [12, 20], "iter": [12, 19], "amount": 12, "exce": 12, "caller": 12, "assum": 12, "successfulli": [12, 14], "impli": 12, "capac": [12, 18], "abandon": 12, "wrap": 12, "seri": 12, "recreat": 12, "recent": 12, "entir": [12, 20], "note": [12, 18], "also": [12, 18, 20], "properti": 12, "tmessagepayload": 12, "replac": 12, "treplac": 12, "timestamp": 12, "datetim": 12, "brokervalu": 12, "present": 12, "either": 12, "els": 12, "payload_unfilt": 12, "index": 12, "span": 12, "max_buffer_s": 14, "10000": 14, "destin": [14, 20], "could": [14, 20], "pend": [14, 17], "notifi": [14, 17], "error": [14, 17, 20], "constructor": 14, "referenc": 14, "tresult": [15, 16, 17, 18], "tpayload": 15, "initial_valu": 15, "hit": [15, 18], "run_task": 16, "put": 16, "run_task_in_thread": 17, "runtaskinthread": 17, "processing_funct": 17, "max_pending_futur": 17, "bound": 17, "avoid": [17, 18], "modifi": 17, "differ": [17, 20], "protect": 17, "lock": [17, 18], "multiprocessingpool": 18, "max_input_block_s": 18, "max_output_block_s": 18, "across": 18, "stdlib": 18, "rebal": [18, 20], "message_s": 18, "expect": 18, "averag": 18, "implicitli": 18, "broken": 18, "automat": 18, "adjust": 18, "adapt": 18, "traffic": 18, "mind": [18, 20], "experiment": 18, "less": 18, "production": 18, "data": 18, "enabl": [18, 20], "upper": 18, "point": 18, "line": [18, 20], "bottleneck": 18, "good": [18, 20], "reserv": 18, "But": 18, "num_process": 18, "faster": [18, 20], "tweak": 18, "optim": 18, "cost": 18, "amort": 18, "spend": 18, "flat": 18, "perfectli": 18, "straight": 18, "constant": 18, "neither": 18, "ey": 18, "ran": 18, "respons": 18, "realli": 18, "expens": [18, 20], "affect": 18, "confus": 18, "best": 18, "anywai": 18, "chunk": 18, "veri": [18, 20], "won": [18, 20], "notic": 18, "regress": 18, "sens": 18, "rid": 18, "issu": [18, 20], "altern": 18, "let": [18, 20], "backlog": 18, "total": 18, "lag": 18, "ram": 18, "2x": 18, "fine": 18, "afterward": 18, "remov": [18, 20], "potenti": 18, "tinput": 19, "toutput": 19, "collect": 19, "accord": 19, "__iter__": 19, "testabl": 20, "document": 20, "outlin": 20, "intricaci": 20, "easi": 20, "awai": 20, "worri": 20, "about": 20, "reproduc": 20, "environ": 20, "visual": 20, "event": 20, "driven": 20, "view": 20, "push": 20, "diagram": 20, "below": 20, "accur": 20, "model": 20, "persist": 20, "read": 20, "conf": 20, "localhost": 20, "id": 20, "my_group": 20, "reset": 20, "my_top": 20, "send_to_destin": 20, "process_messag": 20, "satisfi": 20, "mention": 20, "page": 20, "subsect": 20, "By": 20, "To": 20, "lead": 20, "throw": 20, "lost": 20, "know": 20, "config": 20, "u": 20, "sever": 20, "hurt": 20, "replic": 20, "inform": 20, "And": 20, "pure": 20, "descript": 20, "append": 20, "len": 20, "batch_siz": 20, "hand": 20, "wave": 20, "sai": 20, "destination_top": 20, "At": 20, "ever": 20, "transmiss": 20, "delivery_callback": 20, "on_deliveri": 20, "n": 20, "exactli": 20, "off": 20, "whenev": 20, "idea": 20, "annoi": 20, "imagin": 20, "decis": 20, "made": 20, "pick": 20, "on_revok": 20, "flush_current_batch": 20, "core": 20, "mechan": 20, "flow": 20, "clear": 20, "possibli": 20, "invok": 20, "respect": 20, "gotcha": 20, "kept": 20, "comit": 20, "api": 20, "www": 20, "educba": 20, "com": 20}, "objects": {"arroyo": [[2, 0, 0, "-", "dlq"], [12, 0, 0, "-", "types"]], "arroyo.dlq": [[2, 1, 1, "", "DlqLimit"], [2, 1, 1, "", "DlqPolicy"], [2, 2, 1, "", "InvalidMessage"], [2, 1, 1, "", "KafkaDlqProducer"], [2, 1, 1, "", "NoopDlqProducer"]], "arroyo.processing.strategies": [[12, 0, 0, "-", "abstract"], [8, 0, 0, "-", "batching"], [9, 0, 0, "-", "commit"], [10, 0, 0, "-", "filter"], [11, 0, 0, "-", "healthcheck"], [13, 0, 0, "-", "noop"], [14, 0, 0, "-", "produce"], [15, 0, 0, "-", "reduce"], [16, 0, 0, "-", "run_task"], [17, 0, 0, "-", "run_task_in_threads"], [18, 0, 0, "-", "run_task_with_multiprocessing"], [19, 0, 0, "-", "unfold"]], "arroyo.processing.strategies.abstract": [[12, 2, 1, "", "MessageRejected"], [12, 1, 1, "", "ProcessingStrategy"], [12, 1, 1, "", "ProcessingStrategyFactory"]], "arroyo.processing.strategies.abstract.ProcessingStrategy": [[12, 3, 1, "", "close"], [12, 3, 1, "", "join"], [12, 3, 1, "", "poll"], [12, 3, 1, "", "submit"], [12, 3, 1, "", "terminate"]], "arroyo.processing.strategies.abstract.ProcessingStrategyFactory": [[12, 3, 1, "", "create_with_partitions"], [12, 3, 1, "", "shutdown"]], "arroyo.processing.strategies.batching": [[8, 1, 1, "", "BatchStep"], [8, 1, 1, "", "UnbatchStep"]], "arroyo.processing.strategies.batching.BatchStep": [[8, 3, 1, "", "join"], [8, 3, 1, "", "submit"]], "arroyo.processing.strategies.commit": [[9, 1, 1, "", "CommitOffsets"]], "arroyo.processing.strategies.filter": [[10, 1, 1, "", "FilterStep"]], "arroyo.processing.strategies.healthcheck": [[11, 1, 1, "", "Healthcheck"]], "arroyo.processing.strategies.noop": [[13, 1, 1, "", "Noop"]], "arroyo.processing.strategies.produce": [[14, 1, 1, "", "Produce"]], "arroyo.processing.strategies.reduce": [[15, 1, 1, "", "Reduce"]], "arroyo.processing.strategies.run_task": [[16, 1, 1, "", "RunTask"]], "arroyo.processing.strategies.run_task_in_threads": [[17, 1, 1, "", "RunTaskInThreads"]], "arroyo.processing.strategies.run_task_with_multiprocessing": [[18, 1, 1, "", "RunTaskWithMultiprocessing"]], "arroyo.processing.strategies.unfold": [[19, 1, 1, "", "Unfold"]], "arroyo.types": [[12, 1, 1, "", "BaseValue"], [12, 1, 1, "", "BrokerValue"], [12, 1, 1, "", "Commit"], [12, 1, 1, "", "FilteredPayload"], [12, 1, 1, "", "Message"], [12, 1, 1, "", "Partition"], [12, 1, 1, "", "Topic"], [12, 1, 1, "", "Value"]], "arroyo.types.BaseValue": [[12, 4, 1, "", "committable"], [12, 4, 1, "", "payload"], [12, 3, 1, "", "replace"], [12, 4, 1, "", "timestamp"]], "arroyo.types.BrokerValue": [[12, 4, 1, "", "committable"], [12, 4, 1, "", "next_offset"], [12, 5, 1, "", "offset"], [12, 5, 1, "", "partition"], [12, 4, 1, "", "payload"], [12, 3, 1, "", "replace"], [12, 5, 1, "", "timestamp"]], "arroyo.types.Message": [[12, 4, 1, "", "committable"], [12, 4, 1, "", "payload"], [12, 4, 1, "", "payload_unfiltered"], [12, 3, 1, "", "replace"], [12, 4, 1, "", "timestamp"], [12, 5, 1, "", "value"]], "arroyo.types.Partition": [[12, 5, 1, "", "index"], [12, 5, 1, "", "topic"]], "arroyo.types.Topic": [[12, 5, 1, "", "name"]], "arroyo.types.Value": [[12, 4, 1, "", "committable"], [12, 4, 1, "", "payload"], [12, 3, 1, "", "replace"], [12, 4, 1, "", "timestamp"]], "arroyo.utils": [[6, 0, 0, "-", "metrics"]], "arroyo.utils.metrics": [[6, 1, 1, "", "Metrics"], [6, 6, 1, "", "configure_metrics"]], "arroyo.utils.metrics.Metrics": [[6, 3, 1, "", "gauge"], [6, 3, 1, "", "increment"], [6, 3, 1, "", "timing"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:exception", "3": "py:method", "4": "py:property", "5": "py:attribute", "6": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "exception", "Python exception"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"], "5": ["py", "attribute", "Python attribute"], "6": ["py", "function", "Python function"]}, "titleterms": {"arroyo": [0, 3, 20], "architectur": 0, "stream": [0, 3], "interfac": [0, 12], "engin": 0, "high": [0, 20], "level": 0, "strategi": [0, 12], "backpressur": 1, "dead": 2, "letter": 2, "queue": 2, "get": 3, "start": 3, "setup": 3, "kafka": [3, 20], "zookeep": 3, "instal": 3, "kafkacat": 3, "develop": 3, "environ": 3, "creat": 3, "two": 3, "topic": [3, 20], "basic": 3, "consum": [3, 18, 20], "add": 3, "some": 3, "us": 3, "logic": 3, "further": 3, "exampl": 3, "content": 4, "metric": 6, "avail": 6, "api": 6, "commit": [7, 9, 20], "offset": [7, 9], "batch": [8, 18, 20], "unbatch": 8, "filter": 10, "healthcheck": 11, "process": [12, 18], "messag": 12, "noop": 13, "produc": [14, 20], "reduc": 15, "fold": 15, "run": [16, 17, 18], "task": [16, 17, 18], "thread": 17, "multiprocess": 18, "number": 18, "input": 18, "output": 18, "buffer": 18, "how": [18, 20], "tune": 18, "your": 18, "unfold": 19, "what": 20, "i": 20, "goal": 20, "why": 20, "simpl": 20, "doesn": 20, "t": 20, "cut": 20, "It": 20, "provid": 20, "deliveri": 20, "guarante": 20, "throughput": 20, "reliabl": 20, "deal": 20, "With": 20, "rebalanc": 20, "when": 20, "can": 20, "happen": 20, "affect": 20, "librdkafka": 20, "": 20, "callback": 20, "hell": 20, "conclus": 20, "appendix": 20, "group": 20}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 58}, "alltitles": {"Arroyo Architecture": [[0, "arroyo-architecture"]], "Streaming Interface and Streaming Engine": [[0, "streaming-interface-and-streaming-engine"]], "High level strategies": [[0, "high-level-strategies"]], "Backpressure": [[1, "backpressure"]], "Dead letter queues": [[2, "dead-letter-queues"]], "Getting started with Arroyo": [[3, "getting-started-with-arroyo"]], "Setup": [[3, "setup"]], "Kafka and Zookeeper": [[3, "kafka-and-zookeeper"]], "Install Kafkacat": [[3, "install-kafkacat"]], "Development environment": [[3, "development-environment"]], "Create two Kafka topics": [[3, "create-two-kafka-topics"]], "Create a basic consumer": [[3, "create-a-basic-consumer"]], "Creating a basic consumer": [[3, "creating-a-basic-consumer"]], "Create a streaming consumer": [[3, "create-a-streaming-consumer"]], "Add some useful logic": [[3, "add-some-useful-logic"]], "Further examples": [[3, "further-examples"]], "Contents:": [[4, "contents"]], "Metrics": [[6, "metrics"]], "Available Metrics": [[6, "available-metrics"]], "API": [[6, "module-arroyo.utils.metrics"]], "Committing offsets": [[7, "committing-offsets"]], "Batch and Unbatch": [[8, "batch-and-unbatch"]], "Commit offsets": [[9, "commit-offsets"]], "Filter": [[10, "module-arroyo.processing.strategies.filter"]], "Healthchecks": [[11, "healthchecks"]], "Processing Strategies": [[12, "processing-strategies"]], "Strategy interface": [[12, "strategy-interface"]], "Messages": [[12, "module-arroyo.types"]], "Noop": [[13, "module-arroyo.processing.strategies.noop"]], "Produce": [[14, "module-arroyo.processing.strategies.produce"]], "Reduce (Fold)": [[15, "reduce-fold"]], "Run Task": [[16, "module-arroyo.processing.strategies.run_task"]], "Run Task in Threads": [[17, "module-arroyo.processing.strategies.run_task_in_threads"]], "Run Task with Multiprocessing": [[18, "module-arroyo.processing.strategies.run_task_with_multiprocessing"]], "Number of processes": [[18, "number-of-processes"]], "Batching": [[18, "batching"]], "Input and output buffers": [[18, "input-and-output-buffers"]], "How to tune your consumer": [[18, "how-to-tune-your-consumer"]], "Unfold": [[19, "unfold"]], "What is Arroyo for?": [[20, "what-is-arroyo-for"]], "Goals": [[20, "goals"]], "Why Simple Doesn\u2019t Cut It": [[20, "why-simple-doesnt-cut-it"]], "Providing delivery guarantees": [[20, "providing-delivery-guarantees"]], "High Throughput": [[20, "high-throughput"]], "Reliable High Throughput Batched Producers": [[20, "reliable-high-throughput-batched-producers"]], "Dealing With Rebalancing": [[20, "dealing-with-rebalancing"]], "What is Rebalancing": [[20, "what-is-rebalancing"]], "When Rebalancing Can Happen": [[20, "when-rebalancing-can-happen"]], "How Rebalancing Affects a Consumer": [[20, "how-rebalancing-affects-a-consumer"]], "librdkafka\u2019s Callback Hell": [[20, "librdkafkas-callback-hell"]], "Conclusion": [[20, "conclusion"]], "Appendix": [[20, "appendix"]], "Committing to a Kafka Topic": [[20, "committing-to-a-kafka-topic"]], "What is a Kafka Consumer Group": [[20, "what-is-a-kafka-consumer-group"]]}, "indexentries": {"dlqlimit (class in arroyo.dlq)": [[2, "arroyo.dlq.DlqLimit"]], "dlqpolicy (class in arroyo.dlq)": [[2, "arroyo.dlq.DlqPolicy"]], "invalidmessage": [[2, "arroyo.dlq.InvalidMessage"]], "kafkadlqproducer (class in arroyo.dlq)": [[2, "arroyo.dlq.KafkaDlqProducer"]], "noopdlqproducer (class in arroyo.dlq)": [[2, "arroyo.dlq.NoopDlqProducer"]], "arroyo.dlq": [[2, "module-arroyo.dlq"]], "module": [[2, "module-arroyo.dlq"], [6, "module-arroyo.utils.metrics"], [8, "module-arroyo.processing.strategies.batching"], [9, "module-arroyo.processing.strategies.commit"], [10, "module-arroyo.processing.strategies.filter"], [11, "module-arroyo.processing.strategies.healthcheck"], [12, "module-arroyo.processing.strategies.abstract"], [12, "module-arroyo.types"], [13, "module-arroyo.processing.strategies.noop"], [14, "module-arroyo.processing.strategies.produce"], [15, "module-arroyo.processing.strategies.reduce"], [16, "module-arroyo.processing.strategies.run_task"], [17, "module-arroyo.processing.strategies.run_task_in_threads"], [18, "module-arroyo.processing.strategies.run_task_with_multiprocessing"], [19, "module-arroyo.processing.strategies.unfold"]], "metrics (class in arroyo.utils.metrics)": [[6, "arroyo.utils.metrics.Metrics"]], "arroyo.utils.metrics": [[6, "module-arroyo.utils.metrics"]], "configure_metrics() (in module arroyo.utils.metrics)": [[6, "arroyo.utils.metrics.configure_metrics"]], "gauge() (arroyo.utils.metrics.metrics method)": [[6, "arroyo.utils.metrics.Metrics.gauge"]], "increment() (arroyo.utils.metrics.metrics method)": [[6, "arroyo.utils.metrics.Metrics.increment"]], "timing() (arroyo.utils.metrics.metrics method)": [[6, "arroyo.utils.metrics.Metrics.timing"]], "batchstep (class in arroyo.processing.strategies.batching)": [[8, "arroyo.processing.strategies.batching.BatchStep"]], "unbatchstep (class in arroyo.processing.strategies.batching)": [[8, "arroyo.processing.strategies.batching.UnbatchStep"]], "arroyo.processing.strategies.batching": [[8, "module-arroyo.processing.strategies.batching"]], "join() (arroyo.processing.strategies.batching.batchstep method)": [[8, "arroyo.processing.strategies.batching.BatchStep.join"]], "submit() (arroyo.processing.strategies.batching.batchstep method)": [[8, "arroyo.processing.strategies.batching.BatchStep.submit"]], "commitoffsets (class in arroyo.processing.strategies.commit)": [[9, "arroyo.processing.strategies.commit.CommitOffsets"]], "arroyo.processing.strategies.commit": [[9, "module-arroyo.processing.strategies.commit"]], "filterstep (class in arroyo.processing.strategies.filter)": [[10, "arroyo.processing.strategies.filter.FilterStep"]], "arroyo.processing.strategies.filter": [[10, "module-arroyo.processing.strategies.filter"]], "healthcheck (class in arroyo.processing.strategies.healthcheck)": [[11, "arroyo.processing.strategies.healthcheck.Healthcheck"]], "arroyo.processing.strategies.healthcheck": [[11, "module-arroyo.processing.strategies.healthcheck"]], "basevalue (class in arroyo.types)": [[12, "arroyo.types.BaseValue"]], "brokervalue (class in arroyo.types)": [[12, "arroyo.types.BrokerValue"]], "commit (class in arroyo.types)": [[12, "arroyo.types.Commit"]], "filteredpayload (class in arroyo.types)": [[12, "arroyo.types.FilteredPayload"]], "message (class in arroyo.types)": [[12, "arroyo.types.Message"]], "messagerejected": [[12, "arroyo.processing.strategies.abstract.MessageRejected"]], "partition (class in arroyo.types)": [[12, "arroyo.types.Partition"]], "processingstrategy (class in arroyo.processing.strategies.abstract)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategy"]], "processingstrategyfactory (class in arroyo.processing.strategies.abstract)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategyFactory"]], "topic (class in arroyo.types)": [[12, "arroyo.types.Topic"]], "value (class in arroyo.types)": [[12, "arroyo.types.Value"]], "arroyo.processing.strategies.abstract": [[12, "module-arroyo.processing.strategies.abstract"]], "arroyo.types": [[12, "module-arroyo.types"]], "close() (arroyo.processing.strategies.abstract.processingstrategy method)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategy.close"]], "committable (arroyo.types.basevalue property)": [[12, "arroyo.types.BaseValue.committable"]], "committable (arroyo.types.brokervalue property)": [[12, "arroyo.types.BrokerValue.committable"]], "committable (arroyo.types.message property)": [[12, "arroyo.types.Message.committable"]], "committable (arroyo.types.value property)": [[12, "arroyo.types.Value.committable"]], "create_with_partitions() (arroyo.processing.strategies.abstract.processingstrategyfactory method)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategyFactory.create_with_partitions"]], "index (arroyo.types.partition attribute)": [[12, "arroyo.types.Partition.index"]], "join() (arroyo.processing.strategies.abstract.processingstrategy method)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategy.join"]], "name (arroyo.types.topic attribute)": [[12, "arroyo.types.Topic.name"]], "next_offset (arroyo.types.brokervalue property)": [[12, "arroyo.types.BrokerValue.next_offset"]], "offset (arroyo.types.brokervalue attribute)": [[12, "arroyo.types.BrokerValue.offset"]], "partition (arroyo.types.brokervalue attribute)": [[12, "arroyo.types.BrokerValue.partition"]], "payload (arroyo.types.basevalue property)": [[12, "arroyo.types.BaseValue.payload"]], "payload (arroyo.types.brokervalue property)": [[12, "arroyo.types.BrokerValue.payload"]], "payload (arroyo.types.message property)": [[12, "arroyo.types.Message.payload"]], "payload (arroyo.types.value property)": [[12, "arroyo.types.Value.payload"]], "payload_unfiltered (arroyo.types.message property)": [[12, "arroyo.types.Message.payload_unfiltered"]], "poll() (arroyo.processing.strategies.abstract.processingstrategy method)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategy.poll"]], "replace() (arroyo.types.basevalue method)": [[12, "arroyo.types.BaseValue.replace"]], "replace() (arroyo.types.brokervalue method)": [[12, "arroyo.types.BrokerValue.replace"]], "replace() (arroyo.types.message method)": [[12, "arroyo.types.Message.replace"]], "replace() (arroyo.types.value method)": [[12, "arroyo.types.Value.replace"]], "shutdown() (arroyo.processing.strategies.abstract.processingstrategyfactory method)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategyFactory.shutdown"]], "submit() (arroyo.processing.strategies.abstract.processingstrategy method)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategy.submit"]], "terminate() (arroyo.processing.strategies.abstract.processingstrategy method)": [[12, "arroyo.processing.strategies.abstract.ProcessingStrategy.terminate"]], "timestamp (arroyo.types.basevalue property)": [[12, "arroyo.types.BaseValue.timestamp"]], "timestamp (arroyo.types.brokervalue attribute)": [[12, "arroyo.types.BrokerValue.timestamp"]], "timestamp (arroyo.types.message property)": [[12, "arroyo.types.Message.timestamp"]], "timestamp (arroyo.types.value property)": [[12, "arroyo.types.Value.timestamp"]], "topic (arroyo.types.partition attribute)": [[12, "arroyo.types.Partition.topic"]], "value (arroyo.types.message attribute)": [[12, "arroyo.types.Message.value"]], "noop (class in arroyo.processing.strategies.noop)": [[13, "arroyo.processing.strategies.noop.Noop"]], "arroyo.processing.strategies.noop": [[13, "module-arroyo.processing.strategies.noop"]], "produce (class in arroyo.processing.strategies.produce)": [[14, "arroyo.processing.strategies.produce.Produce"]], "arroyo.processing.strategies.produce": [[14, "module-arroyo.processing.strategies.produce"]], "reduce (class in arroyo.processing.strategies.reduce)": [[15, "arroyo.processing.strategies.reduce.Reduce"]], "arroyo.processing.strategies.reduce": [[15, "module-arroyo.processing.strategies.reduce"]], "runtask (class in arroyo.processing.strategies.run_task)": [[16, "arroyo.processing.strategies.run_task.RunTask"]], "arroyo.processing.strategies.run_task": [[16, "module-arroyo.processing.strategies.run_task"]], "runtaskinthreads (class in arroyo.processing.strategies.run_task_in_threads)": [[17, "arroyo.processing.strategies.run_task_in_threads.RunTaskInThreads"]], "arroyo.processing.strategies.run_task_in_threads": [[17, "module-arroyo.processing.strategies.run_task_in_threads"]], "runtaskwithmultiprocessing (class in arroyo.processing.strategies.run_task_with_multiprocessing)": [[18, "arroyo.processing.strategies.run_task_with_multiprocessing.RunTaskWithMultiprocessing"]], "arroyo.processing.strategies.run_task_with_multiprocessing": [[18, "module-arroyo.processing.strategies.run_task_with_multiprocessing"]], "unfold (class in arroyo.processing.strategies.unfold)": [[19, "arroyo.processing.strategies.unfold.Unfold"]], "arroyo.processing.strategies.unfold": [[19, "module-arroyo.processing.strategies.unfold"]]}}) \ No newline at end of file diff --git a/strategies/batching.html b/strategies/batching.html new file mode 100644 index 00000000..05ac93ee --- /dev/null +++ b/strategies/batching.html @@ -0,0 +1,245 @@ + + + + + Batch and Unbatch - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Batch and Unbatch

+

Accumulate messages into a batch and pass to the next step. +The batch and unbatch strategies are based on reduce and unfold. +Use reduce/unfold instead if you want to provide custom +accumulator/generator functions.

+
+
+class arroyo.processing.strategies.batching.BatchStep(max_batch_size: int, max_batch_time: float, next_step: ProcessingStrategy[MutableSequence[BaseValue[TStrategyPayload]]], compute_batch_size: Callable[[BaseValue[TStrategyPayload]], int] | None = None)
+

Accumulates messages into a batch. When the batch is full, this +strategy submits it to the next step.

+

A batch is represented as a ValuesBatch object which is a sequence +of BaseValue. This includes both the messages and the high offset +watermark.

+

A messages batch is closed and submitted when the maximum number of +messages is received or when the max_batch_time has passed since the +first message was received.

+

This step does not require in order processing. If messages are sent +out of order, though, the highest observed offset per partition is +still the committable one, whether or not all messages with lower +offsets have been observed by this step.

+

This strategy propagates MessageRejected exceptions from the +downstream steps if they are thrown.

+
+
Parameters:
+
    +
  • max_batch_size – How many messages should be reduced into one at maximum.

  • +
  • max_batch_time – How much time (in seconds) should be spent reducing +messages together before flushing the batch.

  • +
+
+
+
+
+join(timeout: float | None = None) None
+

Terminates the strategy by joining the following step. +This method tries to flush the current batch no matter +whether the batch is ready or not.

+
+ +
+
+submit(message: Message[FilteredPayload | TStrategyPayload]) None
+

Accumulates messages in the current batch. +A new batch is created at the first message received.

+

This method tries to flush before adding the message +to the current batch. This is so that, if we receive +MessageRejected exception from the following step, +we can propagate the exception without processing the +new message. This allows the previous step to try again +without introducing duplications.

+
+ +
+ +
+
+class arroyo.processing.strategies.batching.UnbatchStep(next_step: ProcessingStrategy[FilteredPayload | TStrategyPayload])
+

This processing step receives batches and explodes them thus sending +the content to the next step message by message.

+

A batch is represented as a ValuesBatch object.

+

If this step receives a MessageRejected exception from the next +step it would keep the remaining messages and attempt to submit +them at the following call to poll

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/commit_offsets.html b/strategies/commit_offsets.html new file mode 100644 index 00000000..e7090c2e --- /dev/null +++ b/strategies/commit_offsets.html @@ -0,0 +1,187 @@ + + + + + Commit offsets - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Commit offsets

+

Should be used as the last strategy in the chain, to ensure +that offsets are only committed once all processing is complete.

+
+
+class arroyo.processing.strategies.commit.CommitOffsets(commit: Commit)
+

Commits offset and records consumer latency metric.

+

This should always be used as the last step in a chain of processing +strategies. It commits offsets back to the broker after all prior +processing of that message is completed.

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/filter.html b/strategies/filter.html new file mode 100644 index 00000000..16af9915 --- /dev/null +++ b/strategies/filter.html @@ -0,0 +1,200 @@ + + + + + Filter - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Filter

+
+
+class arroyo.processing.strategies.filter.FilterStep(function: Callable[[Message[TStrategyPayload]], bool], next_step: ProcessingStrategy[FilteredPayload | TStrategyPayload], commit_policy: CommitPolicy | None = None)
+

Determines if a message should be submitted to the next processing step.

+

FilterStep takes a callback, function, and if that callback returns +False, the message is dropped.

+

Sometimes that behavior is not actually desirable because streams of +messages is what makes the consumer commit in regular intervals. If you +filter 100% of messages for a period of time, your consumer may not commit +its offsets as a result.

+

For that scenario, you can pass your CommitPolicy to FilterStep. That +will cause FilterStep to emit “sentinel messages” that contain no +payload, but only carry forward partition offsets for later strategies to +commit. Those messages have a payload of type FilteredPayload.

+

For that reason, basically every strategy needs to be able to handle +Message[Union[FilteredPayload, T]] instead of Message[T], i.e. it needs +to subtype ProcessingStrategy[Union[FilteredPayload, TStrategyPayload]]. +If it doesn’t, and rather just handles the regular Message[T], it cannot +be composed with this step, and many other default strategies of arroyo.

+

If no CommitPolicy is passed, no “sentinel messages” are emitted and +downstream steps do not have to deal with such messages (despite the type +system telling them so).

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/healthcheck.html b/strategies/healthcheck.html new file mode 100644 index 00000000..8a3f0e57 --- /dev/null +++ b/strategies/healthcheck.html @@ -0,0 +1,243 @@ + + + + + Healthchecks - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Healthchecks

+

If your code blocks for too long in the main thread, the consumer can turn +unhealthy.

+

Kafka has a setting called max.poll.interval.ms for this that tells Kafka +to kick the consumer out of the broker after this many milliseconds of not polling.

+

You can pass this option into arroyo.backends.kafka.consumer.KafkaConsumer like so:

+
consumer = KafkaConsumer(
+    {
+        "max.poll.interval.ms": 300000, # default 5 minutes
+    }
+)
+
+
+

However, this will not shut down the consumer, it will just keep running doing +nothing (because it is blocked in the main thread). You want a pod-level +healthcheck as well.

+

Arroyo supports touching a file repeatedly from the main thread to indicate +health. Start your pipeline with the +arroyo.processing.strategies.healthcheck.Healthcheck strategy.

+
def handle_message(message: Message[KafkaPayload]) -> Message[KafkaPayload]:
+    ...
+    return message
+
+class ConsumerStrategyFactory(ProcessingStrategyFactory[KafkaPayload]):
+    def __init__(self):
+        self.is_paused = False
+
+    def create_with_partitions(
+        self,
+        commit: Commit,
+        partitions: Mapping[Partition, int],
+    ) -> ProcessingStrategy[KafkaPayload]:
+        step = RunTask(handle_message, CommitOffsets(commit))
+        return Healthcheck("/tmp/health.txt", step)
+
+
+

The Kubernetes liveness +command would look like:

+
apiVersion: v1
+kind: Pod
+metadata:
+  labels:
+    test: liveness
+  name: liveness-exec
+spec:
+  containers:
+  - name: liveness
+    image: registry.k8s.io/busybox
+    args:
+      - bin/my_arroyo_consumer
+    livenessProbe:
+      exec:
+        command:
+        - rm
+        - /tmp/health.txt
+      initialDelaySeconds: 5
+      periodSeconds: 320  # should be higher than max.poll.interval.ms
+
+
+
+
+class arroyo.processing.strategies.healthcheck.Healthcheck(healthcheck_file: str, next_step: ProcessingStrategy[TStrategyPayload])
+

A strategy that takes a filepath, and touches that file everytime +Strategy.poll is called. If that function is not called multiple times +per minute, it indicates that the consumer is overall unhealthy.

+

File touches are debounced to happen once per second at most.

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/index.html b/strategies/index.html new file mode 100644 index 00000000..df1d1c2c --- /dev/null +++ b/strategies/index.html @@ -0,0 +1,527 @@ + + + + + Processing Strategies - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Processing Strategies

+

The processing strategies are the components to be wired together to +build a consumer.

+
+

Strategy interface

+

We normally don’t recommend writing your own strategy, and encourage you to use +built-in ones such as “reduce” or “run task” to plug in your application logic. +Nevertheless, all arroyo strategies are written against the following interface:

+
+
+exception arroyo.processing.strategies.abstract.MessageRejected
+

Bases: Exception

+

MessageRejected should be raised in a processing strategy’s submit method +if it is unable to keep up with the rate of incoming messages. It tells +the consumer to slow down and retry the message later.

+
+ +
+
+class arroyo.processing.strategies.abstract.ProcessingStrategy(*args, **kwds)
+

Bases: ABC, Generic[TStrategyPayload]

+

A processing strategy defines how a stream processor processes messages +during the course of a single assignment. The processor is instantiated +when the assignment is received, and closed when the assignment is +revoked.

+

This interface is intentionally not prescriptive, and affords a +significant degree of flexibility for the various implementations.

+
+
+abstract close() None
+

Close this instance. No more messages should be accepted by the +instance after this method has been called.

+

This method should not block. Once this strategy instance has +finished processing (or discarded) all messages that were submitted +prior to this method being called, the strategy should commit its +partition offsets and release any resources that will no longer be +used (threads, processes, sockets, files, etc.)

+
+ +
+
+abstract join(timeout: float | None = None) None
+

Block until the processing strategy has completed all previously +submitted work, or the provided timeout has been reached. This method +should be called after close to provide a graceful shutdown.

+

This method is called synchronously by the stream processor during +assignment revocation, and blocks the assignment from being released +until this function exits, allowing any work in progress to be +completed and committed before the continuing the rebalancing +process.

+
+ +
+
+abstract poll() None
+

Poll the processor to check on the status of asynchronous tasks or +perform other scheduled work.

+

This method is called on each consumer loop iteration, so this method +should not be used to perform work that may block for a significant +amount of time and block the progress of the consumer or exceed the +consumer poll interval timeout.

+

This method may raise exceptions that were thrown by asynchronous +tasks since the previous call to poll.

+
+ +
+
+abstract submit(message: Message[TStrategyPayload]) None
+

Submit a message for processing.

+

Messages may be processed synchronously or asynchronously, depending +on the implementation of the processing strategy. Callers of this +method should not assume that this method returning successfully +implies that the message was successfully processed.

+

If the processing strategy is unable to accept a message (due to it +being at or over capacity, for example), this method will raise a +MessageRejected exception.

+
+ +
+
+abstract terminate() None
+

Close the processing strategy immediately, abandoning any work in +progress. No more messages should be accepted by the instance after +this method has been called.

+
+ +
+ +
+
+class arroyo.processing.strategies.abstract.ProcessingStrategyFactory(*args, **kwds)
+

Bases: ABC, Generic[TStrategyPayload]

+

A ProcessingStrategyFactory is used to wrap a series of +ProcessingStrategy steps, and calls create_with_partitions +to instantiate the ProcessingStrategy on partition assignment +or partition revocation if the strategy needs to be recreated.

+
+
+abstract create_with_partitions(commit: Commit, partitions: Mapping[Partition, int]) ProcessingStrategy[TStrategyPayload]
+

Instantiate and return a ProcessingStrategy instance.

+
+
Parameters:
+
    +
  • commit – A function that accepts a mapping of Partition instances to offset values that should be committed.

  • +
  • partitions – A mapping of a Partition to it’s most recent offset.

  • +
+
+
+
+ +
+
+shutdown() None
+

Custom code to execute when the StreamProcessor shuts down entirely.

+

Note that this code will also be executed on crashes of the strategy.

+
+ +
+ +
+
+

Messages

+
+
+class arroyo.types.BaseValue(*args, **kwds)
+
+
+property committable: Mapping[Partition, int]
+
+ +
+
+property payload: TMessagePayload
+
+ +
+
+replace(value: TReplaced) BaseValue[TReplaced]
+
+ +
+
+property timestamp: datetime | None
+
+ +
+ +
+
+class arroyo.types.BrokerValue(payload: TMessagePayload, partition: Partition, offset: int, timestamp: datetime)
+

A payload received from the consumer or producer after it is done producing. +Partition, offset, and timestamp values are present.

+
+
+property committable: Mapping[Partition, int]
+
+ +
+
+property next_offset: int
+
+ +
+
+offset: int
+
+ +
+
+partition: Partition
+
+ +
+
+property payload: TMessagePayload
+
+ +
+
+replace(value: TReplaced) BaseValue[TReplaced]
+
+ +
+
+timestamp: datetime
+
+ +
+ +
+
+class arroyo.types.Commit(*args, **kwargs)
+
+ +
+
+class arroyo.types.FilteredPayload
+
+ +
+
+class arroyo.types.Message(value: BaseValue[TMessagePayload])
+

Contains a payload and partitions to be committed after processing. +Can either represent a single message from a Kafka broker (BrokerValue) +or something else, such as a number of messages grouped together for a +batch processing step (Payload).

+
+
+property committable: Mapping[Partition, int]
+
+ +
+
+property payload: TMessagePayload
+
+ +
+
+property payload_unfiltered: TMessagePayload
+
+ +
+
+replace(payload: TReplaced) Message[TReplaced]
+
+ +
+
+property timestamp: datetime | None
+
+ +
+
+value: BaseValue[TMessagePayload]
+
+ +
+ +
+
+class arroyo.types.Partition(topic: 'Topic', index: 'int')
+
+
+index: int
+
+ +
+
+topic: Topic
+
+ +
+ +
+
+class arroyo.types.Topic(name: 'str')
+
+
+name: str
+
+ +
+ +
+
+class arroyo.types.Value(payload: TMessagePayload, committable: Mapping[Partition, int], timestamp: datetime | None = None)
+

Any other payload that may not map 1:1 to a single message from a +consumer. May represent a batch spanning many partitions.

+
+
+property committable: Mapping[Partition, int]
+
+ +
+
+property payload: TMessagePayload
+
+ +
+
+replace(value: TReplaced) BaseValue[TReplaced]
+
+ +
+
+property timestamp: datetime | None
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/noop.html b/strategies/noop.html new file mode 100644 index 00000000..14591334 --- /dev/null +++ b/strategies/noop.html @@ -0,0 +1,182 @@ + + + + + Noop - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Noop

+
+
+class arroyo.processing.strategies.noop.Noop
+

Noop strategy that takes a message and does nothing.

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/produce.html b/strategies/produce.html new file mode 100644 index 00000000..7ab1f6f0 --- /dev/null +++ b/strategies/produce.html @@ -0,0 +1,193 @@ + + + + + Produce - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Produce

+
+
+class arroyo.processing.strategies.produce.Produce(producer: Producer[TStrategyPayload], topic: Topic, next_step: ProcessingStrategy[FilteredPayload | TStrategyPayload], max_buffer_size: int = 10000)
+

This strategy can be used to produce Kafka messages to a destination topic. A typical use +case could be to consume messages from one topic, apply some transformations and then output +to another topic.

+

For each message received in the submit method, it attempts to produce a single Kafka message +in a thread. If there are too many pending futures, we MessageRejected will be raised to notify +stream processor to slow down.

+

On poll we check for completion of the produced messages. If the message has been successfully +produced then the message is submitted to the next step. If an error occured the exception will +be raised.

+

Important: The destination topic is always the topic passed into the constructor and not the +topic being referenced in the message itself (which typically refers to the original topic from +where the message was consumed from).

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/reduce.html b/strategies/reduce.html new file mode 100644 index 00000000..25b4cb04 --- /dev/null +++ b/strategies/reduce.html @@ -0,0 +1,196 @@ + + + + + Reduce (Fold) - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Reduce (Fold)

+

Accumulate messages based on a custom accumulator function

+
+
+class arroyo.processing.strategies.reduce.Reduce(max_batch_size: int, max_batch_time: float, accumulator: Callable[[TResult, BaseValue[TPayload]], TResult], initial_value: Callable[[], TResult], next_step: ProcessingStrategy[TResult], compute_batch_size: Callable[[BaseValue[TPayload]], int] | None = None)
+

Accumulates messages until the max size or max time condition is hit. +The accumulator function is run on each message in the order it is received.

+

Once the “batch” is full, the accumulated value is submitted to the next step.

+

This strategy propagates MessageRejected exceptions from the +downstream steps if they are thrown.

+
+
Parameters:
+
    +
  • max_batch_size – How many messages should be reduced into one at maximum.

  • +
  • max_batch_time – How much time (in seconds) should be spent reducing +messages together before flushing the batch.

  • +
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/run_task.html b/strategies/run_task.html new file mode 100644 index 00000000..2d8c99b6 --- /dev/null +++ b/strategies/run_task.html @@ -0,0 +1,184 @@ + + + + + Run Task - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Run Task

+
+
+class arroyo.processing.strategies.run_task.RunTask(function: Callable[[Message[TStrategyPayload]], TResult], next_step: ProcessingStrategy[FilteredPayload | TResult])
+

Basic strategy to run a custom processing function on a message.

+

The processing function provided can raise InvalidMessage to indicate that +the message is invalid and should be put in a dead letter queue.

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/run_task_in_threads.html b/strategies/run_task_in_threads.html new file mode 100644 index 00000000..09be0746 --- /dev/null +++ b/strategies/run_task_in_threads.html @@ -0,0 +1,191 @@ + + + + + Run Task in Threads - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Run Task in Threads

+
+
+class arroyo.processing.strategies.run_task_in_threads.RunTaskInThreads(processing_function: Callable[[Message[TStrategyPayload]], TResult], concurrency: int, max_pending_futures: int, next_step: ProcessingStrategy[FilteredPayload | TResult])
+

This strategy can be used to run IO-bound tasks in parallel.

+

The user specifies a processing function (a callable that takes a message). For each message received +in the submit method, it runs that processing function. Once completed, the message is submitted +to the next step (with the payload containing the result of the processing function).

+

Since the processing function will be run in threads, avoid using objects which can be modified +by different threads or protect it using locks.

+

If there are too many pending futures, we MessageRejected will be raised to notify the stream processor +to slow down.

+

On poll we check for completion of futures. If processing is done, we submit to the next step. +If an error occured the original exception will be raised.

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/run_task_with_multiprocessing.html b/strategies/run_task_with_multiprocessing.html new file mode 100644 index 00000000..11aa8256 --- /dev/null +++ b/strategies/run_task_with_multiprocessing.html @@ -0,0 +1,306 @@ + + + + + Run Task with Multiprocessing - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Run Task with Multiprocessing

+
+
+class arroyo.processing.strategies.run_task_with_multiprocessing.RunTaskWithMultiprocessing(function: Callable[[Message[TStrategyPayload]], TResult], next_step: ProcessingStrategy[FilteredPayload | TResult], max_batch_size: int, max_batch_time: float, pool: MultiprocessingPool, input_block_size: int | None = None, output_block_size: int | None = None, max_input_block_size: int | None = None, max_output_block_size: int | None = None)
+

Run a function in parallel across messages using subprocesses.

+

RunTaskWithMultiprocessing uses the multiprocessing stdlib module to +transform messages in parallel.

+
+
Parameters:
+
    +
  • function – The function to use for transforming.

  • +
  • next_step – The processing strategy to forward transformed messages to.

  • +
  • max_batch_size – Wait at most for this many messages before “closing” a batch.

  • +
  • max_batch_time – Wait at most for this many seconds before closing a batch.

  • +
  • pool – The multiprocessing pool to use for parallel processing. The same pool +instance can be re-used each time RunTaskWithMultiprocessing is created on +rebalance.

  • +
  • input_block_size

    For each subprocess, a shared memory buffer of +input_block_size is allocated. This value should be at least +message_size * max_batch_size large, where message_size is the expected +average message size.

    +

    If the value is too small, the batch is implicitly broken up. In that +case, the +arroyo.strategies.run_task_with_multiprocessing.batch.input.overflow +metric is emitted.

    +

    If the value is set to None, the input_block_size is automatically +adjusted to adapt to traffic. Keep in mind that this is a rather +experimental feature and less productionized than explicitly setting a +value.

    +

  • +
  • output_block_size

    Size of the shared memory buffer used to store +results. Like with input data, the batch is implicitly broken up on +overflow, and +arroyo.strategies.run_task_with_multiprocessing.batch.output.overflow +metric is incremented.

    +

    Like with input_block_size, the value can be set to None to enable +automatic resizing.

    +

  • +
  • max_input_block_size – If automatic resizing is enabled, this sets an +upper limit on how large those blocks can get.

  • +
  • max_output_block_size – Same as max_input_block_size but for output +blocks.

  • +
+
+
+
+

Number of processes

+

The metric +arroyo.strategies.run_task_with_multiprocessing.batches_in_progress +shows you how many processes arroyo is able to effectively use at any given +point.

+

The metric arroyo.strategies.run_task_with_multiprocessing.processes +shows how many processes arroyo was configured with.

+

If those two metrics don’t line up, your consumer is not bottlenecked on +number of processes. That’s a good thing, you want to have some reserve +capacity. But it means that increasing num_processes will not make your +consumer faster.

+
+
+

Batching

+

Arroyo sends messages in batches to subprocesses. max_batch_size and max_batch_time +should be tweaked for optimal performance. You can observe the effect in the following metrics:

+
    +
  • arroyo.strategies.run_task_with_multiprocessing.batch.size.msg: The number of messages per batch.

  • +
  • arroyo.strategies.run_task_with_multiprocessing.batch.size.bytes: The number of bytes used per batch.

  • +
+

The cost of batches (locking, synchronization) generally amortizes with +increased batch sizes. Too small batches, and this strategy will spend a +lot of time synchronizing between processes. Too large batches, however, +can cause your consumer to not use all processes effectively, as a lot of +time may be spent waiting for batches to fill up.

+

If batch.size.msg is flat (as in, it’s a perfectly straight line at a +constant), you are hitting max_batch_size. If batch.size.bytes is +flat, you are hitting input buffer overflow (see next section). If neither +are flat, you are hitting max_batch_time.

+
+
+

Input and output buffers

+

You want to keep an eye on these metrics:

+
    +
  1. arroyo.strategies.run_task_with_multiprocessing.batch.input.overflow

  2. +
  3. arroyo.strategies.run_task_with_multiprocessing.batch.output.overflow

  4. +
  5. arroyo.strategies.run_task_with_multiprocessing.batch.backpressure

  6. +
+

If batch.input.overflow is emitted at all, arroyo ran out of memory for +batching and started breaking up your batches into smaller ones. You want +to increase input_block_size in response. Note that when you do this, +you may have to re-tweak max_batch_size and max_batch_time, as you +were never hitting those configured limits before. Input overflow is not +really all that expensive in Arroyo, but since it affects how batching +works it can still make performance tuning of your consumer more confusing. +Best to avoid it anyway.

+

If batch.output.overflow is emitted at all, arroyo ran out of memory +when fetching the data from subprocesses, and so the response from +subprocesses to the main processes is chunked. Output overflow is very +expensive, and you want to avoid it. Increase output_block_size in +response.

+

If batch.backpressure is continuously emitted, you are not bottlenecked +on multiprocessing at all, but instead the next strategy can’t keep up and +is applying backpressure. You can likely reduce num_processes and won’t +notice a performance regression.

+
+
+

How to tune your consumer

+

Note that it doesn’t make sense to fix output overflow without fixing input +overflow first. If you increase output block size to get rid of output +overflows, then increase input block size, your effective batch size may +increase to a point where you encounter output overflow again. If you +encounter a lot of issues at once, best to fix them in this order:

+
    +
  1. First, tune input_block_size to fix input overflow. This will +increase average/effective batch size. Alternatively, set it to None +(default) to let arroyo auto-tune it.

  2. +
  3. Then, tune max_batch_size and max_batch_time so that you get the +highest throughput. Test this by running your consumer on a backlog of +messages and look at consumer offset rate (vs broker/total offset rate), +or time it takes to get consumer lag back to normal. For as long as you +have enough RAM, increment it in large steps (like 2x) and fine-tune +afterwards.

  4. +
  5. Then, tune output_block_size to fix output overflow. If in your +previous tests there was a lot of output overflow, this will remove a lot +of CPU load from your consumer and potentially also increase throughput.

  6. +
  7. Now take a look at the batch.backpressure metric. If it is emitted, +you need to optimize the next strategy (next_step) because that’s what +you’re bottlenecked on. If it is not emitted, you may need to increase +num_processes or increase batch size, so that +RunTaskWithMultiprocessing itself is not the bottleneck.

  8. +
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/strategies/unfold.html b/strategies/unfold.html new file mode 100644 index 00000000..94cbfb69 --- /dev/null +++ b/strategies/unfold.html @@ -0,0 +1,190 @@ + + + + + Unfold - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

Unfold

+

Generates a sequence of messages from a single message based on a custom generator function

+
+
+class arroyo.processing.strategies.unfold.Unfold(generator: Callable[[TInput], Iterable[BaseValue[TOutput]]], next_step: ProcessingStrategy[FilteredPayload | TOutput])
+

Unfold receives a message and explodes it to generate a collection of +messages submitting them one by one to the next step. The generated +messages are created according to the generator function provided by the user.

+

The generator function provided must return an iterable (i.e. a class that +implements __iter__ ).

+

If this step receives a MessageRejected exception from the next +step it keeps the remaining messages and attempts to submit +them on subsequent calls to poll

+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/what_for.html b/what_for.html new file mode 100644 index 00000000..9f0d8492 --- /dev/null +++ b/what_for.html @@ -0,0 +1,432 @@ + + + + + What is Arroyo for? - Arroyo documentation + + + + + + + + + + +
+
+
+ + + + Arroyo + +
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+

What is Arroyo for?

+

Arroyo is a library for writing high-throughput, testable kafka +consumers and producers. This document attempts to outline the +intricacies of writing such consumers.

+
+

Goals

+
    +
  1. Make it easy to build consumers that provide delivery guarantees

  2. +
  3. Make it easy to write high-throughput kafka consumers

  4. +
  5. Make it easy to write reliable, high throughput kafka producers

  6. +
  7. Abstract away rebalancing such that users of the library do not have +to worry about it

  8. +
  9. Make it possible to test kafka consumer logic without having to +reproduce the entire kafka environment

  10. +
  11. Provide a way for the application logic to signal backpressure

  12. +
+
+
+

Why Simple Doesn’t Cut It

+

When visualizing event-driven architecture, Kafka is viewed as an +abstract queue with groups of producers pushing to it, and consumers +consuming from it (as in the diagram below).

+
+ graph TD + Producer --> Kafka_Topic + Kafka_Topic --> Consumer + Consumer --> Destination +

A more accurate model is that kafka is like a log file which is +persistent and there are offsets of the file that different consumers +have read or not read.

+

The most simple kafka consumer looks something like this:

+
from confluent_kafka import Consumer
+
+conf = {
+    "bootstrap.servers": "localhost:9092",
+    "group.id": "my_group",
+    "auto.offset.reset": "latest",
+}
+
+consumer = Consumer(conf)
+consumer.subscribe(["my_topic"])
+
+while True:
+    message = consumer.poll()
+    send_to_destination(process_message(message))
+
+
+

This simple consumer would not satisfy the goals mentioned at the top of +this page. The following subsections will explain why

+
+
+

Providing delivery guarantees

+

By default, a consumer in the confluent_kafka library will +auto-commit on poll. To understand what it means to commit to a kafka +topic, see the Appendix. This can lead to the following issue:

+
# get message from kafka, commit immediately
+message = consumer.poll()
+# ❗❗❗ throws exception due to a network issue
+send_to_destination(process_message(message))
+# this message is now lost and we're on to the next one
+
+
+

This can be fixed by only committing after we know that the message has +reached its destination in the following way:

+
# add this value to the config:
+"enable.auto.commit": "false"
+# -------
+message = consumer.poll(timeout=0)
+send_to_destination(process_message(message))
+consumer.commit(message.offset())
+
+
+
+
+

High Throughput

+

The previous section has allowed us to not commit messages that are not +processed however committing every message severely hurts throughput. +Every call to commit is a network operation, it also makes the broker +persist and replicate the information. If we can reduce the number of +commit calls, our throughput can be much higher. And so we commit in +batches

+
# this code is purely descriptive.
+# We have to commit to each partition separately
+# but that code is not helpful for this example
+message = consumer.poll(timeout=0)
+batch.append(process_message(message))
+if len(batch) == batch_size:
+    consumer.commit(offsets=[m.offset() for m in batch])
+
+
+

This will get us faster throughput however we are currently hand-waving +away how we send the message to its destination

+
+
+

Reliable High Throughput Batched Producers

+

Producing to Kafka reliably and at high throughput is not a simple +operation. Here is how a simple Kafka Producer looks in code:

+
from confluent_kafka import Producer
+
+conf = {
+  "bootstrap.servers": "localhost:9092",
+}
+producer = Producer(conf)
+def send_to_destination(message):
+    # ❗ This does not do what it says
+    # it writes to a buffer
+    producer.produce("destination_topic", message)
+    # this will actually block until the messages are produced
+    # calling this after produce every time is very expensive,
+    # how often we flush has high impacts on the producer throughput
+    producer.flush()
+
+
+

At a high level, the producer is actually buffering the messages +produced to the topic

+_images/kafka_producer.png +

A kafka producer writes to an internal buffer. This batches the IO +(good) but you don’t know when it will ever make it to the +destination

+

In order to allow for reliability of transmission, the +confluent_kafka library provides a callback to +produce +like so

+
def delivery_callback(error, message):
+    # do something here to make sure your message is in the state
+    # you want it to be
+
+producer.produce("destination_topic", message, on_delivery=delivery_callback)
+
+
+
+
+

Dealing With Rebalancing

+
+

What is Rebalancing

+

A kafka topic is divided into n partitions, each partition can be +consumed by exactly one consumer per consumer +group. A consumer can +consume multiple partitions

+
+_images/consumer_groups.png +
+
+
+

When Rebalancing Can Happen

+

Rebalancing can happen due to:

+
    +
  • An addition or removal of a consumer to a consumer group

    +
      +
    • (Every deploy does this)

    • +
    +
  • +
  • A rebalance being kicked off manually

  • +
  • A consumer pod dies and now its partition needs to be re-assigned

  • +
  • Whenever the broker decides it’s a good idea (it can happen at any +time)

  • +
  • TODO: More things?

  • +
+
+
+

How Rebalancing Affects a Consumer

+

Rebalancing is annoying to handle for a consumer that processes batches, +imagine the following scenario:

+
+ sequenceDiagram + Broker->>Consumer: message + activate Consumer + note right of Consumer: start building batch + Broker->>Consumer: message + Broker->>Consumer: Revoke Partition + deactivate Consumer + Consumer->>Broker: commit batch + note left of Broker: Received commit from revoked Consumer! +

Once a partition is revoked for a consumer, it cannot commit to it. This +is bad news for the batch that the consumer has built up. Each consumer +has different requirements but a decision has to be made as to whether +to flush the batch or to discard its work and let the next consumer +assigned to this partition pick it up. The rebalancing behavior can be +customized by providing an on_revoke callback to the consumer when +subscribing.

+
from confluent_kafka import Consumer
+
+conf = {
+    "bootstrap.servers": "localhost:9092",
+    "group.id": "my_group",
+    "auto.offset.reset": "latest",
+}
+
+def flush_current_batch(consumer, partitions):
+    # flush the current batch
+    pass
+
+consumer = Consumer(conf)
+consumer.subscribe(["my_topic"], on_revoke=flush_current_batch)
+
+
+
+
+
+

librdkafka’s Callback Hell

+

librdkafka uses callbacks as a core mechanic for control flow. A few +such examples have been mentioned in this document already. What is not +clear however, is that callbacks are only called when ``poll`` is +called

+

This means that:

+
    +
  • this line could possibly do a lot of work:

  • +
+
# any scheduled callbacks will run within this call
+message = consumer.poll()
+
+
+
    +
  • No callbacks will be invoked until the consumer or producer call +poll again (for their respective callbacks)

  • +
  • poll has to be called periodically on a consumer otherwise the +broker will kick the consumer out of the consumer group

    +
      +
    • The handling of that revocation won’t happen until poll is +called

    • +
    +
  • +
+
+
+

Conclusion

+

There are many intricacies and gotchas to writing high performant, +reliable kafka consumers. This document does not outline all of them but +all of what is outlined here should be kept in mind when designing any +kafka consumer library.

+
+
+

Appendix

+
+
+

Committing to a Kafka Topic

+

A consumer comitting to a topic signals to the broker that this message +has been processed. When poll is called next by that consumer, it +will return the next message.

+

API +Doc

+
+
+

What is a Kafka Consumer Group

+

https://www.educba.com/kafka-consumer-group/

+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file