From 68ab46ec23730a56a021c1ace33f3dcdfdf7dd21 Mon Sep 17 00:00:00 2001 From: Adrian Smith Date: Thu, 7 May 2020 23:54:30 -0700 Subject: [PATCH] Revert "version 1 " --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 1 - .idea/cython_indicator_functions.iml | 8 - .../inspectionProfiles/profiles_settings.xml | 6 - .idea/misc.xml | 6 - .idea/modules.xml | 8 - .idea/vcs.xml | 6 - .idea/workspace.xml | 55 - README.md | 2 - .../indicators.cpython-37m-darwin.so | Bin 199692 -> 0 bytes .../indicators.cpython-37m-darwin.so | Bin 0 -> 181260 bytes .../test/__init__.py | 0 .../test/test_functions.py | 39 + .../src/indicators.o | Bin 705676 -> 0 bytes .../src/indicators.o | Bin 0 -> 536816 bytes cython_indicators.egg-info/PKG-INFO | 2 +- cython_indicators.egg-info/SOURCES.txt | 1 + cython_indicators.egg-info/requires.txt | 2 +- cython_indicators.egg-info/top_level.txt | 1 + ...rs-0.0.3-cp37-cp37m-macosx_10_9_x86_64.whl | Bin 0 -> 74068 bytes dist/cython_indicators-0.0.3.tar.gz | Bin 0 -> 3403 bytes requirements.txt | 2 +- setup.py | 33 +- src/indicators.c | 25903 +++++++--------- src/indicators.pyx | 95 +- .../__pycache__/test_functions.cpython-36.pyc | Bin 2812 -> 2047 bytes test/test_functions.py | 23 +- 27 files changed, 11791 insertions(+), 14402 deletions(-) delete mode 100644 .DS_Store delete mode 100644 .idea/cython_indicator_functions.iml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml delete mode 100755 build/lib.macosx-10.7-x86_64-3.7/indicators.cpython-37m-darwin.so create mode 100755 build/lib.macosx-10.9-x86_64-3.7/indicators.cpython-37m-darwin.so rename .idea/.gitignore => build/lib.macosx-10.9-x86_64-3.7/test/__init__.py (100%) create mode 100644 build/lib.macosx-10.9-x86_64-3.7/test/test_functions.py delete mode 100644 build/temp.macosx-10.7-x86_64-3.7/src/indicators.o create mode 100644 build/temp.macosx-10.9-x86_64-3.7/src/indicators.o create mode 100644 dist/cython_indicators-0.0.3-cp37-cp37m-macosx_10_9_x86_64.whl create mode 100644 dist/cython_indicators-0.0.3.tar.gz diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index c88a062b05be4fd1d362b3e4c6a7481e718b69d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~O$x$5422WzLU7Zi%h`AUZ!n0Spcima5J4*Vx1OW>k_m#k8KJGkN^pg011%5 z4-v3?8#bF)Wh4O-Ab}?V`#vPNX$~z_{nLTqBLK8P*$r!-C7{U)&>UK-q5{*H9yD6j z#}KP~J2b_)99pW@cF`C;crrWIXQgOGwy`I%~QMGk}L;X0y%TE9jyNVZZH|!@{KyzrRiVBQB0*--!1inh( E0rZ6u#{d8T diff --git a/.gitignore b/.gitignore index 056afef..52e18f7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ /src/build/* /src/dist/* /src/*.egg-info -dist diff --git a/.idea/cython_indicator_functions.iml b/.idea/cython_indicator_functions.iml deleted file mode 100644 index d9e6024..0000000 --- a/.idea/cython_indicator_functions.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index ef004d1..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 2af0a61..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 9661ac7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index c646c90..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1588545089497 - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index cc87bcb..1d6e1f6 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,6 @@ ## Currently provide support for: * BB - [Bolinger Bands](https://www.investopedia.com/articles/technical/102201.asp) -* EMA -[Exponential Moving Average](https://www.investopedia.com/terms/e/ema.asp) - * FIB - [Upper Fibonacci Retracement Levels](https://www.investopedia.com/terms/f/fibonacciretracement.asp) * FIB_BB - [Fibonacci Bolinger Bands](https://www.motivewave.com/studies/bollinger_bands_fib_ratios.htm) diff --git a/build/lib.macosx-10.7-x86_64-3.7/indicators.cpython-37m-darwin.so b/build/lib.macosx-10.7-x86_64-3.7/indicators.cpython-37m-darwin.so deleted file mode 100755 index 02693c8264ec635166ce7071c01baa5f27c7d5f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199692 zcmd?Sdwdi{_V7J{v;-w|V2wt+5D^tbk*vlgBASs5^vDEIt||x`L3HIJ%m^r#Xl9hQ z9mG596A^P4I#N6;TxMvfAT#K~O+c=KY@P?qm{N_xU}~^T+#sUOuF& zy6V)aQ>RXyI(4e5=k5L99BAY7WwrMCd^!9b#@~=be7+c={5y)jnXP=jv15k?Mh#O* zEgobx`{%rCq{$z+)xWW0!{cX$-4}wE_-d(B{=NCHEEURowu-rrY+q&O>)5f=!;ved zHzu{jcYBS4=UbONd3RErA~`NTw_4~Cd}Ak$zjo^QX@IoEH@nU${ew%CyfGQzQAuf6>D=BV7hl4K@hm+!zaM|h=hksX0Z_)w>_eX<^&-Mm7B{Oli#3yoR@HcjB zC^%?fpe#7dt*X?eVu$GYN9xL_J77 zJ^tG7hhMjywLZ3U#id>6c3st#G$j&k4)yukAL@fNUvC#y>dV^yIW=baPLE8VcKWqf zUm<@(XH5@}pVagGo>$J|4IuuV#Gl|P^|$ivAnfkG7t*d##Q$&q8*Z5YHsXE%-M*D? zOmcU1mTy8&y>nF6qIWLy`6S;z(m%pK+&^rnansj}XpCX*o}hnMJ3*fpSSXK594R5m+oF2=dyHH6hQ4ZPH^$(H+66Us~z0 z1VrrCr}QgO026}x+=LNdkw?jpdB83i?(>DLm*v%nzg(b#6@qqoJvi-Wmu30NV|(;y z0r(7SPQBd?#+s|E_N623?Ox2EMyytk{YY-ebg`^(u)N%aWdc~hE|o0n1X{!Va<}oM zx!pdjQfRxR);?1(nX3g^^j|=P`V_yvFUzM#zvCrn^)IdJ?b8>SG-YQx$4JDa3UYjU zYy(fjQtdHfX+1hbc%Fz!T>@aFbv<^Dq*()U(nESBWhe#B&E>Jr_2}aOz@#ia`i2vO zU5jXnp4YEH?;cpnUv0?TYZttdMVYk|^eKU*ih<>^Z}bJPP(|`B3f3gr`h3YfQd>Ot zJmyxz%>BMgD_=tUj;H8?gq9?>12Dwrm9<&E8i_BLEITn$HP_xtb7LLo;0)@MH!H^O zweNdbQD9ib^Fd@-BMOABTE(?Mtzz3&kOj>|F#T5Q4M_zB${->!v7EIgYFkf@BT-9@DRe(TptuLXL4UCzAoBFVQpL6Zq7Mc(77b(+jW|VrQy;9&Q~IE;R(h>b zADlk$xAehds!du6D;CCE>R4%YlBYDyEdG+1rw^v=0;HKfSgR_?zgPvi&l8{zz9DGT z2Y+7*tL~wSMt#uT!Q$$JDhI=n4u(k%hG#M{j0Xey;4cDUY6BI0L6^RS){oeeps$e! zU2}Q8K$z?+r^wVjX^79~H`h3GclddlCS!Fk zWy~#Q-FK91(c^pRCS#FN@rKweyY;->WlVh&JR=AAnSBg%l~J-FU7D>y{i1P?JJ5%nyyMRkPM7f0Am{i$1@^#k0$==e0X>mww55 zL2QE6C#`)0#Uw3v+SIUHA6+NvXqVoxeu92+?rUTd|8Rmn`hyAj zB`~Rb`O;nb#o9Y6W7I0aDg`F!n*&Q$iUn@J=JC0Kw`30?$kO_J2lJ8rc<~36EZT(7 zy!l*~ulhJVBFjz(Ff|pZ{6?r3J*dA4)F6Q>5~vG+`tDl~SKNcD6sSK6R4;+*3e@^W zsH;4vO9bi)f%+p*Mm#^d0!(K9S)E$>%-r7c)FjS0n8@^Q&z<4(Ic>84p=2jK4i&9; z3oMl;+t+~(?uXAY%zg#C^&{M5sYQ}cB)M?6J~yz$9^fW*B&i#g-Z#(|ximS9`PE1t z7CF?g`sEnrcC0nV-gmDFQMr#DC7R?>o+m(TLi-D`kDwjm-e9(_k@#}SvS$pEAqv|2 zK&wX&hX4jbfEtix}@{TYB+;pxsWEG50ARoLoT z(ZOpnt-{as1(*GTFwLx44L!-nphxVqEzc-Othd(-nzVH*;iB16Tff=ddV9FB==~W* z6T(3=;A!hO#hP94`OnIF`_o}cTOauI1TK4@@Pcd=Tr{aDj2b;HGO zxX=wN-EgWKj&s8yZdmGuz1*4MZ6_oDfYWeB4-T{6wk>kMwy`kwVra8fKMTTvO0*)mGNn<$e~ud%LPqV z-ziVQc9}`0342(I2|yMAesi5O*W`E*BY_B+&nf!j3X^LFI#r!ZRiXF_MOgevfm$wF zGh{;N7j_}J-tv)mX9bxI3rpt4et|trnFpNAXRmWIcaZ65uAU-L&>FoDyl5|!eoS(e z277*q$_!7|N7nB4>!++EH!g^G>lfEIL3VJ{M%6i*4&4`VOP<*THCmD6C_NyCx)83; zJMAZ2oRN{q7ln+2bl%TuahCfW>#&6O49^n4655l*X5%YC)W2BC(31Fa$+D}0j?O#n zanOb@4_X0d!F&$k zXsSh(zlQQC#YOl?S$vOXmNw$|N>4#s$V}QR&vP{R^{V-*>B+MwQ&Ry`Qd-TGN;0&S zQqa_{>nO4_g{KIJSv-kYGAVs*X+M4;eX3UC^a<4z4^*|~f2kJBxy8JpiKi3ztC1kl zlBYp-&2XvdK`^}7gaK*(Ckvk!*QKj?8 zIY|EDAo-f0k&M5A1X=n}AWZG{4${cmcsc_lN=*EmHS%DT)Qas8&wUnXXPjKxUrh*> zcAKhKiFG93S>B6s&zKh9O8zhZrIBW3*As;&C~f3?xZdWMQceY^8zlwg>-|=4H+)L z%V?0}0vv@m=HNwykCICN`(->mDX(bb92Kk(w66ZA=asi?4EWSK;zV4Xjk^8RzrthD z{xKZMA=5>(!a?(L6PhbPV^}ejZUz=J;p9n8R&0m_W?%_*3kjYQM}s3)*UXfT%%4tx z#-k_J+wZeurUu{pO0^_H=J=&5&oI}~Q5PX0{@0j&9H8TcXmfSQoV3WW`o5u~XhiX? zqHLh(8^hdIw8@^~HX*u6`U~?gD&AAnvL1a~;F$d8e;}2m^~j+?{D@3Q7>mJ*19rpX zPV1w!l5Zw52w4x-Wv?JH{?`V2)aVX1P~!I}5q;T6$u}N4QJ{(vQQC@<*91-|Stm6$ zr^K*^FEY#qqi#o`v5W$uHPYx=!>l*z_7xhj^&xBg(wUbTB@MGLWB9)Isq}>`KQ4L7 zU4E25Mp9h63FiO<>kK^H39X1H3ru1?h;0<%pDlD*2IhGpePJ&lEcP*-mi)UgEURJW zf1Q;al?u%G4$ux!GguR^t|j=ylmK|kIp{STZ`FSq$dk_-c-$zU2AD=!w0uZZx&0;6OtAJ5Lemg!UM*CBm6q zydphBO{*&rC-Y>ImOTx|R7CpUsr3w1 zYY|ToUHYHcOTdU2rEa9!+oS@k*dnk;H&%PCq>3)+(Y)HSgR4DTs+G|}rR|(bYgo9H znJ2C!FmqS%M9QVY%rQsLXc$NKu8E@UzN@u=ex$K;qbDF4bkZX`uz>~zt+K9;5%eX! z;~GH#&>ml;ml#33C|!UvPZ>dOrZR%SO8cB0gS(pNH~QpT0Yq=Yh93?UZa6;qQx!K_ zuIgI&`kNqk$sy0j(e%`9?6Z@GzwOG}i2y{(n zCBoXvYLTd2MGXmUJWr8iv$%qox2j8R16{LKonKXu|Mjy{Pi_z1n8&XsXk3$>0PQs$ zsiM&b_oRcx^}(f8(fp?!3`qhooScc_lZOPkmM>MATB5Dcx0a_f2v-t20rWNUpuh8# zWs&$$*EX4P7emd54P4@{%Z@~Zox858PK$L0&vdJ8MD5M*Ng7^?(toV=FHq|=7|b0)mS zB6wzOqUdNVwnV)J<`cD@46zWHXRGZM=VZ*YYaWDKGPde+1k0RS5l^F!W}wo-ZR~Hz zPHFg82IM)4uR~y=-cvikgc8ZSp}igRidQHi=FGQ`mR^X}Ldi@j)T7gB9cr??;){^^ zrM=gMkG?LAHqo!SH91JRS-#jvXW^Z(@3=;-#Ew+wH?`_=C<)1O&=t*EyPx%pM-_U z{i?e>W_dz=hfJd(YZAh+TUbduFQKOJp)x#vxt{@lh)^8JV>@<{jCuxqE^|nv;D#gY zd&pP%Vm5Nd$k28(T`}#+U{}-L3nB`#JHA9BD3jfKhrnX`N`}#5BeqqK-mgIDxdjSD z^;|P3{6di%l6R@Wb(@_*aBQ%me5)S2nuvI4JIUCI9PUb4Gs2WVXS>wyO7b#9Gt{T= z&CtlGk?~{=aLj`PyeOaWo02LFS?y%IWWJ#+y|>ha>VJB1mN;z`s{CaXHFIB;rzUaXjcO)C z(320cIcnVKy5WANCP`L4ea5d_?W{~$Uo1^6pHtV zHBeCLQnbK676R_cjisW>9=qFP>w`dg2Id?0Dz;WDwu;6Tm)7y_Qe&|kTamKkowBky zvDouu{g{Cz=3uE+Sl)yj&y97?UKHIQJ(H#-+V(BcD%VvGWf=Cy?p8MHGHecPR3StB zR&7pmY*ct4(!4bJ;U3u2MRl6iL6+X8wmO{!XXPEUm-4lxpVVx=N9if3ym6FC@S&y@R09xfI0GuQ^=$ z?FvyfmiFd5jYyz{MiqB)kZe|~<=l1-k_$4CWDAn^g5+3`xNfd02a)UM`dF3DztcgI zAb=7r6UoXusW`6f76?;&@_=yXuRI;0f0)?G)KDW2B>z;kOOm@5Xh-(LXDAEV(*COI zbre@@fb0(`t6A*c=2r6nFkv;Pn44+}g!pmD@WQU}aysJu41fFiYiU2vM-epnw_-a1 zX*8D4!bC=Ku!a31d;gyINx^t_a-qOuC%@biG*(Prl{l7Dlo41!G0~+?bO{s1KBBhCz9>e#W0Nji2>--pzUB`ytEf|Wu^oUZ$C(?}x}ji_^u=zt z&`BSsctBo7C7;PNm%NJz1*!PeZYHR3Cz zts(PU`=nFBTBTmWRi|KEP#Rw$y^P0F%BVdm`(}vpM9k&dTIM&nc3{89wW!c#6~9cn zI|d9a%q;qs9#UXWYjzbeGsEWOq((4 zV(7|bR9T-n^?Drtl`m8gsb}ZjI_;wkq7t7JHfAmm0Qfl(co(&bOe%d4h^1$C3YF{& znfq`6*3LURxfAQG@w`eXOC{^`KO|Kx@gN4{a+iL}YF2upTz2Ulva<{e4P(aYMcB=I zl^m3O6+X?d&Q~Vl{JD9|E+Tq6^}3wc`p6&bg||!Bme;ZtHWT)I^@gPr&o1x?G|Rf? z8S%iohMC*Y$i%vGFV$g zj&glysXTQ)IwLnz0$@L^D=Ww{(yK!yJN4TSR|IMI?o;EZX0JDXE>>FS#2D#nM`9`O z!E`p~TZ(6q=18|Ug1%H^<{Cg`1g%wXlT?8g&IY7YMzhBwXXD}fv9utbzn?%2C%AtZ zhKIuP53n$x+$Gs}Z^&4BhBQ%ijHOpDSECS>lX;Xy4fxMg{Vm3brLB<`T7BQ!<2Cdr z!DgNI66tCr%4uO&y)Go}H`Hqx5KWq5fP!yPPyA&Wi_M#PsME|pWHfWe#cngzab;>|aej`LPVtH@QP2!T`THD8JE$D-mbh1&C*JgJq+_Zx)p)t2g!L9v3_d_fYqp1^mU3z{Lp*wY z`hL1zgz2ZlXpOf%J=UQ~k9{VovOfLL$yUeNHxNe^D2goYvw9IES%Tk$mJJl8)hhhD zTS<*;Pu@>pY9oITYjQZxYblk`1{3=llP@(1n427!GZah_&q)fV2eGyceK4l_H&qvI ztgd55b*-H0&T>%MED93Z7d#zQJBS?)Do#~5Y8e(ldhAsklgV~6K-BpwTvQ^&oWatg zXE`x!$*Yi=rd<`s;$*cm;}!}y7 zl*5IuT?|l*%~&O6(Rf|Nj7O)s{y^@)TyN>bUm`QG1wF%B=|nN)6vhb>$pg6;&)+ zO5{G5`ro5|%rM8F%hUq}_E9)O%FSK(NKLbNRr~(r}s!Z zw0pi6vhU*QkbOI`N1?80YoO?J|4N!d&+XA;w?k!e82qb#+@n4DDNTW$N6}JG3T7$k z!Nsi&1(7QSIRJ#r;IyWY6 z>f|UMW{mosVdI&AIuI);PAL8^kGpcm>=WB##t^+@0?vW1f#&l9{eyuv3N*i{!d0V4yi`bh83VHVjf}>=q6+6v z1lY{IMxL6)mA^f925aFahg!0$ERC&WvtfoO6j##K(!G{;E~Q+dXbnKfJW=3O&GSSx zoN_byu22l2qg-Pnb~l;TJsJPYrYNDC?2?pSX|q1rzB{VY(girxjdz|gf^4dsZ^dc*b*$-T3zH3lKc~5QEttl zFPW(g@RwT=y0VSxO>73~$xhVgcqdsr2qGng{s?HIFtiCrwe9#)n9i{{JR@m$4=$9$% zcEnu(prh|5Q2Jpz0}wB{{YWJsvf`IH8Xil1ViLIO5`0Qs{)%Go)TNqy{!01eQp(s1 z;Ho#QmpNFg2Mh0}l8eMKj7BdMj_0=rx0#zKPfg-2-L%bgQS>c}%P@=ng+WT4N`4+A z5werdNoe(rDr)krvnfd52J{ zUHP^2!WBHF5eaQHv2xm!>Ro-2*EHG{RnYlok<0mSd1?}u-G`Q|Kn#Iq(|33T#?*;* z7*prdL(W>^1?Y8*sm8U!i5Y8!t{JNVG2IUL)(VGZWLU*7r8tI_|1?jwARm+<-uD7b z3;T{j*NAXzLHfJ~mL!j+&qO&P-ke#zP;n`;RFoGoE^`wq%T-s!FwRp~xGKLDA)m#% zNcpLo8_(tD4fspc>qF!;g+iova+i@Bet!{DF4!XALLs*_)ndHx6<(p_=w zIHyPhAPH>)PtG$Dt0y*vBF)&U$DWkJviZa~v=`2CWYa1>U-82^aj;za+Vt#QJ$fGF z+i|t0j&RROidiZM1~(!IQk~~fp5-7AlUMZEM9&p`@z>JE;tA|9bM)Yg+lBY{x~Rmn zd)krCa#ZFS_PHe|c_L+MR!BSI+L>|1oG+5n($9HbPD{<=Pl+XeA&Tr?QzK+#UJ9&L z)#T4qLGIH8I7e-Q#sdhC&&IA=N)@RG?H#H?YH=5<{D%59)Q|nTN_A${N53WY$$g~0 zRW(gm1^Bl?sWm1*{WwiSo z0mP29rQKiily+kS6RU&l8hIeaQ88xXx$S{=EW{PZDv4GuT5+v5chUaD+{VZ@2KeMy z;*sFs?QG}m6X)$z-fCVVo}7!s0ClUAez*fQ-+4QPH~a69>P%FQ{u6#IWfr7Rl>@fD zKc1A|zu!EHj(5&aoUJ&;OVjy@TKtIYMR-@52FrFo{@`$-Y$t^~^328tR!f;y zcih1@-2lU-_lw#{IZSa@WPR22&`0yVCM&NenW62+fMYwgLGPJg!)y@gazmjV@XCHm zo$Qe2KS554J=47WM~H!qV>=ua?=XA`2ND;BPq)*Z6yWeBW}Q@DXtx3d@WYoZQywfv zTDzLhJIJI5%A)nAI(dNZljb2XID-N*Bgxq$IV>tsd;&{eWhhk5VHp&?7)t?m$axWe zysT@MQL)dc`?9s2x=~d$X9*o#X71!_R~cTFxJ)v%et}rP&M^l$=dPbp=Z_Cc_lOIc zBCc}f`Q7?upE;MeJ~Apc zv6bCn^n1Sas&s9-4uWUjBBKGI=vi4%_u!+g;4z^p{|8Q}dhiV~hIn%vS(R3*hQn8?g-FP;G+_CIBLZfZk57wt5Nr(A_#|C3lD(wI7j zk`Go(ol>#{+{%e?s#AKLQ@W!noyT*bDt#!i&+?>UV-{J(KHjYSJ)a4Z+%F}F_dNxJ z(B8@b#w=3PVhS-w{pku}ZXHkwZ6(jJLb!}r>y99d_uYxPRU`4`l4aiy4wzXDiR>+b zBsrepTpfURu}ZlABTIENcZ$L|iRWJ^W@>*XW-q2QWxe&gqYU!G9S$;ie#?Cmv~H31 z>v=x*T`NP@xI80K3LBs>QA#gKC{LR4vJ7k47B%8=8O|~tzc$L5Kz~KqTiQAXrlYPb ztw!RUiMF&Q#L!}LDoNz3tu(-?l@1D76LUh=%skoVt=z58V;n#NTCJT}RBc>~3QI`( zC5!>o!m9Z#kCdep5MF1_wcRU}2CccHSnH1~x8_a^n*B!w%|YXW=7@>EQP2M>-+rI} zZ17R7slEIOViZ_nYDxHAZoEg>8dsS(5F5xXkY0XEXkdGjybmJwf^pWfJo*U_h(pRKZ-Ssdvw~V+b z$|WdTz31zO-oM^G7-#>PDieWc(a&nCiC(3ae0@97i?XUP*V$VmAd;#tmMk++d61;Z z;cxErcyQ+`6r8&=jRLx*lCV&TS~^D@%-&&aq!yaWm*~;?6mX`9*vCIHrQa)zGaL3c z)Y+XKmA|TpR@LkG*YT+kqh3yi#Y_r?tP?MO8RkZbSDz=Gcn)KzX1k~bt>$9_^v7jY z!U!#IhYZ;EJY`gx#qEeCYY}90TeIohao4FX^$sW0PgC5Gn>NzZYCl-40zG;UxRU?k z@f)S?`i)XFdR|%b1B|}RgA)@SNVWy8*bcGo$=ti>8u;xToESwDJv;XSS+ZKi6KH`4 zJ3(NXp*cVosP*8cIdJ_m;Lgo}tM}k85V&~ppiRndUUn0xnvO&4!{VX$=YOd9&2flh zfW{*-ia{soExGzU{pN@TlE0xCrx6fqIrteBZ-x% zj@3PzUUI67ctP)?92W~UX6{AX7+U4enzj+u@Cm}18C;A1^Wf5>EZn?t6=RiIwL*l~r{D3cszy5wik*uP zmUh<*;BL0Av1O4J&woY*xpf4rYw{{H)-|tBVVKmr1gsM#gPXFCOP;9>`$%|y5l?5b4G~LGag98f zap#%>of`()nR8DdUF65oE>v|f0S6i)`5|)$-$fZk^D~wz_9gUG%?4@524_K`Gj~J7 zg0s;o7dDBdRy~v#>S?E_%B|Vz%H#?nruHgNQH{89#ip6fqk04dTp>tyCIN!#pNCeY z>y^o>g|%~43#U;yp-tr}0+Z0LA$EmG*QIIKpm%%U>~nO-sTF2Y=s2)PLjmuKurH zag#$Sva>AVQa9Xz1T=o|>PYH#Zo7TXBEefjI;VZSZ(a#J7JYy{7x~7G5}=0*ByhHX zS!xRI<+U)yegT0}?(W0Xq_)Ba&ORj<6<{Wu^<>etPB+IUV?^-zE1}0Q9~M9`i8}gykTyj z*2{8s^d)QMna+B%mUY)ArdDn&k9wUY**?Bvu}bf@k$?|cT(U_%V8L=N|Mcl{4x`(b zT$cKjk6Rp@Mjev(9cjBc>Aq`%KI%t4bdlmC7iw^@vfIw8kd@s#eEVV>;pc?kfO0*D zD9WpeaIm67pjN+RwOGTh0VPRGocJ1vFV!#M0u&!ZlMg2O?1x<*MnC0^-C+4bM6G?| zpB>IdSEy9^o`ifjqP>^=Hz&DJ*}W6=NwxOwYupl+lhsXS*&jK{;h9{-?&aAV_BuE9 z3Q~Iu>ZSIJZqi_qN~P>Vh4vvgxi`s%O14cmNj_*XL<(2i*Skq_xqB2}o;ZdXfe%`| zBZAZX6ad=pxEr9<%x%~#qk03+#Zb)rN9=oN!P7p90+sl3$+G{3#h^ZDvGy6v&FCBv zbnk-}^1&CiepH(`vWuf`eKzjmBnJz$`rKJ~ymLkEPH;K{jPw_R)4loF=$sXSnYSI!5gF z6P!-wC^M~;;~y;+Q;zC?%R{hP@dBg5993voqi`@Zv({zfKXw2D&G2inMbFkl01S`j2?6`9O(^w$XvDQm{AiTui1}JdarNY?=V}HV*cT z@2-teOZoh+D##r`fGH9qXmqij2PHLcQbp>)YCi!d*V|Y3b0Rs_{fWqx)p+hjg2K$r zR@JxSDWsa3kJv%08l>pp6)0>7>j#aIzU{CP?e;~Sy-`YHCgLEy659&HlGVyOQeT7X zv4jkk!OqvhiA@YO*s z;F!a!gY1?j0u9h1e!qG*T&lu28xQf}4Mx12W#*hE_Kfk^bn9gV^n(b)98)_ue(Hgs zRSqu#4czt(A7hvsLgrUS$su|a{|f2Ta*V1~IR*z+zA~&KIeTt?2Gn_aw4-2%t=FS> zE3gu_YK@YF9zB&;;+f=^aw>9OH(&TDYd~Suj&W7{#)VG|T5|fTcWSuu587YCUpJ`{ zC{kinCHVMDXN;%@qiQY~O051ahRA3m&Ml=r1>xz*N1&)>eTmY{f)Vbv?zL~0P6SsI zk}ih1)2OOdczUERZan`7?oz>hWGdi5$XleOG2bQCJ`0R|H!3@FT{>W7ry82jNf_Qg}wl?8|{^Jab1D)l3 zoa0CUjH+3%*RcE^dq)~obzBcRzKQoE8`-AEX2Wsef2dEP9=(H?&3dMr+cVS@&+H%C*W11i zysCfNr+V41UZMIY5}2@1ysp8L?RrcuZ=vdrc|z*v_+mMOrMTmCRyFzR#nQ6etax!Z zk{KI})QiEij3r!}Yw}fVdS{Gga5enZ!4)rFBI`s>mr~+nN~GRwq|ZAKKh&uDn#KC= zAlu89)>Bo*xD4#5kpXS@gM2)ehmbDY4MUL}?UN0pl{AE}HLTlY0VSih%&;!Rd$(!s z+@d`We@e=}F9-*X^g5$t^X%_a6DU{3% z`RKd`(zi(Zghb%2($eK1@=Y-G$*U&l)AzBnGB2=XUEpm|hie6ju+|N$C9LdQNL524 zJ(`5du!1=(;Kd1Bpg`lLD4w>JvqldMf2L}-rcX8ETz>6>O{M1fw}7Kd#+eNvD>u3l z(I}~p%)o~=)2Qm*YIb|0>eWg?rAI$ekX7>~5Z${^B4WtT|5oK_|9Fh%DyMmGW(?>4 z+gMpcq$5+fg=lHGFGV!)%8bG5U7dk22-Sy6CawEb-S2yFAO8 z??wz2f6$&vnQ%DEcP{}6dFbm_+{w(IQN)ZI&wWagE3$7gvg*@2tg!{w0QZjOYU%7s zqx%-4&Mu7f-n%t5*d7EWB8wHPjgl?l^HN=kw)PlXkUEQUsiJ0ujhnC-((|rAn&xbK z)a#!EVVZO2Wm&#g)#%?s)%xfR{7<-%BfO3*8wUKqP zIOXo-Zv%ge_FEEbBT-Jf-EItU>~YpBm@H^2iu>Z2ZB=BSrFlEcozTKFN;-eSad7Mx*Z2?6Q*C zc{#KH99uv4k40&7L-zybuDY)}XYJa!KWo2HvCF9YBHJ3>E63biR`T<_Hgk@P-;iZ) zFuyN3FmF>zvqt5hcGi=nKU9~s(R{tEWYwI`M#bw!-6w)MCnwS&WSyEL2VoSCXUK%X zM!0>EFi!}R4RE*!@f_xl_x)5-7E)N(VrRtcnbg-oA9?`dR|aUOV<^ z-5Y<-ddH~Pt@s&+pWDk|VVgO@_|Po#ZS$v+_u*%+CSg+tB&Q*0O`1S4P+ZeV{GC2) zYEIEsVf_JN{Rie7WhJ}kbmT*-jjY$BuL4)rr}z;znj%I1s&%EoiakPrD4R!x1=66; zp_V~$6F_BV@iYmn;tGO*xy#@ELw&)M!kmf?p^7)k&HCWphG15Gu4RRI+~FOR3gS z7)0*+o56UE;xd4Ygg=MXQPP7tdV(Tw+$X`^cj(--?LheZKKw*vj>gVWA75XZRD7+IX| zq=S%y=M`SL%o5hi&3`SH*Q)b;krPr!Hfe#(3@$Euhd<=@nQBPmx8X6}c8Eqbwd5)h ztS@=qg{DeqpU8Vp94pg+dCh@Yt6)|)!mJ?n1~3P?P~_1h5o*=l9ZjVylc^Vt?*8K6YD$)5J)*|TQ~g60ph#)%I= z*#sIw@xFUB_H;y0#Bi?_zizGnw(PEY4V%hyuJ4~b7WYCEK9pxSP7w6+-_}3ipWnZ~ zfD)GZ&C5!I={1pd!KQh%GYzZU-(8O$K_q_uo~nIE%=iP`{1^+{Fn=~G&bigd z+MfP03hejPBl&scAJvBZifl6XrFTf?W-=9`w}`~g-&?g$oAzbZ{=)F5@$(zbX{+CQ z5_MOtYAC&p!&m8b@c|^xIMr;B@lvYSydTf5jF+9?pugf|k8G&if9SL?%>81D=OvR+ zXEs#rrws#$mX##u92csn4dRkDtd8=(;se7P_F+M&WR)J1Z_$-jrn`r8d7i4rQuGFO zrt6$W#|~rICr<5@3Sq5WmQbu+3Ob6F(GzQ0iQ;c@az>Q@3GVlsC@9~>8ISW;4cf3G<*mq< zvKuEKELlZP(7dd7Q#b3k)R2~xRfqpJ&d9}$hbn(+t>2oaXeH+!qI;a?sMVN~t>_aJ zaOO|*9U=7)m(*Ba!NfNdR0DRh6QmmO9j$dmPVGm?r(@^!@21-13A#(a2w~&s&~NDq zzW5M2j9wP5R@F5q8Ub^XXPnVAc7)%0O>MlL84no^e*G01;{hHz?cY^D@q;YM?a)FD z15A3Zf}?E^l2PM7ah;}ak8XN!}%33Kg>yF@+6;ji0K4cL1{7m|RI zj8#xPnTD0oP2tYTe>jmNk}o@v+~jL2qQ}+{7HvY0fh!JA`kV)84 zf_bOo#hKvL-!vSpA)_FsheOO0LtJ7uv$Erxbyn_K3cdu87x7h@bx=Id1A0M#hIsd3 zQwN&!^S{5tj`#2M*wN(*H033rW-DB_zN^+0WLO~n%DH8Hi3^2N;0qrvg7X$m21F#> z;H14NX+PmfNv-546~5oS_A@TTKSVNQ5XijzM9>;k$fp~NHU;-`4SZAh?oifGM)!@J zyDCiGs@F86xOb?PHj=df_fqmou|aA!k#TZkh5bV_}{w2AtHN7kX_g z1PQRqFOjaRwa*<4P=N!qxe;i+)U=;oVh!AZ%mE1SfBQQ#112;6-^%^Be8Kevr2Hqi z1bfy0Der%h{woqB@cBsS^Wc;^XA(+W(k1>|_#{0u@3-QaX`R9UTX$J+Nb5_VYowq4Q##$A@JKf<@BgQNh2XjhUhm}0!6d@z zZd~5~Pyc3tE7QIlify^ss5;vhk>Q%-3l}pMzKeTf;YAte(?VF3&HZN8G(VkTvWBcX zDj6>2vV9^t5JP{#B^X40b7$3o>}j2Y@%}>w#t*N<&#PB`0l>g`*}5S(81-AW@W$yL zb5(Hfrt+*+>;oB9pS2EmHuh$?_xXO>;i&Lo>xRfLRisx(z6)0EZ>`__tIRmvYs=%q z)=dn?%jyc)6L8mi!?xHI_|Rrf-?CF;EZ&A~*(WiUZ-;LQnumXg*E~B|vL&)H`I0DR zbEiLDug{k+#^XU67qSM=3|2Ih?pfD5Ji*VJleMLXKWLV19>S^b?2Sg6lhdpHB_Bpo z0dp1WQa_8y>HU&$j%90Y)sA0`_^4mFP-E16)yhb(@|&9kkx}(?yXn)5HkD&S#eRhc zNip~Y1I6{5l`lEoZew|T^yVP}vmtY@L;5dhW^a}1KY);}`-qi&K-0>$?o?6QTej6! zQI@8we$zPS=SDyvjw32=1tLX}AFVj|4^Q_40<`OwCxVg^Jv%hF7ht|h`29DdK$ z*^ygdK)9DQb6hY!Y-3(D}>$H=fLFpug%Z}bj$#zFmqA-|V75OAo!W>-B z*c3q%qcUWToM~9MipQ32WQqZD45g3MvZ06KbCCEMFv-jU(C4&mMzdBXWAkN61M z`I2hd!1yt=_d~ya7ay6}?APy4To6BoAAtE#zl-#BrTYEr;8`I0vmWaV14;{b>9He( zk!GF0>XQS(_;uWZ++}S13UM~yVYC`m2M(EjJ~skoD}M#eNq)*hNk2=ZQF3R}h29MF z5dA~+DrRKaL8b#^Y&QFndwJCG=QFzVWwl{v;2}eLvgIyB*`7RNA_CDpj+EtzW)Jlz2>ts(jJF-BWDyQHC zYK``h+W#m8&dQ@ewgZ2b)DJv|7*Y*<8Y5f@4r&#XM?(|fk5J{3h}n8UX13tA{C zB9)@C4D;}9jDS|6vEB}v=c1zw%vyX@1Dq`*zR8kTRNMA-J$5-$u90q&yqM4%@G$i_ zuD?#uudk(P?dbjvp>27J3)_TD5E{o4kvuubKadUytNGK+r_I z#o4~7QmUboX4xYKuz)uT({<_$_=$gIbKl>mUDvs?v^*6biM+V%TVZ0}svo=a z(0K{Ten8s20?HN-XLCM8&dA?$i#LU?96|Q!WT!rFQW#C=1^IPM*{nce@$HQQqvYrC zU{16%S7}#+A|!hmtwUBXy=Fj}HKP>wXcyUlwAytISy>@#U=Fr^Pg<*}+Qo6;)WA@@ z_(o=IBYy0w!>E-z%z}W|O;7^f4i4TXj16plg63tiLBm)LncoLZCP>x~jjjAs8E51g zPjEERuYTXN>gxi%W@MRo13EG5%c|d+!Ls_0kd;$zT_<4(MrG*h!*X^Hsx+$B5n z`dP_GDO!5ljRT6-mqyd!p23RXD0YzN_LoiE0V{#$8$hMp@qPZxpYYaXaRTFjQNlr! z#OzdxZQ%S?s=BlN)`haPnogA%{Xwa$Z)0Wa`VC;ywO=nG)2Vny5C01Wn{`);t>A6e z`Cka8&hfu6JoTrl8%uru7cL6-^uN$A)tyE?6!jWa=hX1!`LfDbZ&=d{QaSz?2B%v4 zUl>vzzl>v8`BMN6StpfS=XAYoVE@XWE`x7Bl}7sLHABnd)9R`YoQXFGQmlcc%HxE@ zFI9A$`7a~uK>CYnCO2Pdc2jpvSg4BLP*;_v=wsxTS^Y{Cn16-Rx$)xjrQ<5jsWGzl zroUWBeR_;f>H5m_nto;e_)MqhXnYo`v+%h6TlMrRT3^lg?$bM#<$zcHj0klYqRAfOe20h+DlZ-AEj&_a82xiUiyKB=FXx` z#@_E`p?Rp0wLvB#ljN!!+1ifnr-)+Ti$q+u=f13X@VZgaZW-U;Pk*ACnOrLn(u|}W z2~=!OzCesmSK&K=w0QQ~X8d3;n6*^${^l^TX6(_U*8!8d-eF8nPA6otWkacm%$WLe z^Q$te{N1A3jAoZexpSRz{ZzSC4o?+BFLO&GcYAM=Efy)A(yE0;9OCTl*weUL^ZdB! z`36=*E9<>JJi79yevuNsOu$Jh3^+W)d{Rwr54PqOPJC(}oGUQQA%t>OhkG#MH8~lJ zE%^PZE;9$P8(GAcNVQ0QVDl*7*_=&=R?$x1SmQz(>jz3kgy z)>|R-&xHzqnvIu!y@Dklg{RY>!FZ@E^|x2I8->E-DsLD)G*WI@7coV#+&MXDzG;+v z5ZRn66a8SsWuJ#n;aGzRH@lh3QYQ-u-Hg_d5NB#JZv^QG!a;=U0}8RBOj)U8&<+KV zC(a=@WZ11anweLvl2W7I3imHF?xjg6>6v+%@onUN)*?T%?EfVGBzV5y?|J^DoP_cx>GJ2{%8W}|X1>Hf z;!h5%%3o&OOOx%EUX(;u}pNC88Jf8R8t6%EKEF z`TKysPu(=Zlgfz8yL>MG2RBXPvi~}Ch+0@Qo}dfo8tK+7&6FP!A>(HUWcnS=7mg}L z(uq@IJ4dpJ^_LSBR;hgQwR9GzPZRDjyvShoO}?Ee)_F-tzIqogew#snm}(N3uQLnx z`4cfVkVmJ6*aIZavT_JU{l8Q(*&g~B`Lr(}E7coxBOP>HNCsX07V^}R1x#lEB75w@ z{uW!(d`eF2Q`a9P?PUwF5YN*AL;ZwQPkx|xUQcS3d+*Ms)ZeiV)Zxkp&f@oLN3o1s z##Wp!d6%?4t8V5dj+b)e`Fs}67Y*T~udmB*BxL8L*KuR1wq)HL4lOkLpJIDv9%h)| z8znpE9hT~~P%f5ceLwSLxyt009F?6TZ+{$xl>3Q1HHou+d6osTeKK@&KT4sS-iYoM;qAA@po$5q z4gjTIY_=bd5BnFp0oKyTA=$9DrjFxV02A3iod`5bx6*NLsE!NDMryWm@@r4HHQzy! zy(Ypo7?bRFPahXDZ=AT2b%M{njCwhkW1pk2vn6ZY2>Oa~hBa_vCbXRM;53dNK3P7Q zaHcx1(9`>xpJBeiDLupdfQ2b{5E~-Lrm$J@XL#w9iM;7%3Yxaz5Jt0Gf8sJ2{zB+JW$hgfxcAZ%ed+5MYK9v z8$O9kP;#_W@2)SgLuFERF)o zan=?iTedgF-z)?<6}0jyI82h8e||ey@fKqsSn{?t=iRwiJ3L#ZG#7)I&l&{QFedB$ z>9s&LbzzzLZF#peRFm6;+kR zug;>bc`MUzJ7=``%7Ztock36{a^s?2hRalS$LkvR44LrlT_jJ)c{eqT(I1`;8`MsD z$Fp6fq_NT#BLmxl(?6+4?Xeg%z6jrMg=2hT#r*Q(~132VD1tN!hsp7V1_rs z3?_CaF!UeafE1~9hEDPUP|(Qj)4WD@2}15AMXG_L9At+oWH~$wRfY1KXqSR4*-4E8 zt;hlU>|x=`^e4Cn}^33)>xdQ{hYJrU6|o+lxBI(tLBHrIb43CoCQyQgVU?1wg)cCiY=** za;!YJIi$Eo<;?gc`=FnRwzHgv#ZP&I8ujYX_|_&uQ*Rpyng7$NbqmEVc#6NZ{JqFu zHGjW7zBxZmtGS$W+MCxgcOMxv-}Q^9GE&Va$XT-=`y9z~b+Y(bA}I9at2nAif09>> z1m`f^IYqq4P`wDpico23b5uSra^6XMl;Lfp<*ksTGu=?B_maZbJMBqHrNYFL(4!|( z+=!3i8!|0EKriROmM(#*?(Jpu+5IrJ$_P4+v7^3pG=Bl*l@rbVhPs-HLgx5d!{Ts$ zad)9Y1kd}f?RHh`v6O237-qDPw=#1MmmnrJ1oW}f8 zF?lJEPsl4b$IoQ@jM+C`hY8dNOV&(pgIy#pAvu!wAgvT-`dm-9BRQHO z>R7~Wpro1GbQ}^&ufCyIJznVq^CwWJTz*2@n$v`g)lN=Aa^$jy><^yP)qYVjMS_GnnQoZl zTVDALT66O3+dM#I$8Dh8)_=-NHdOg_E#?_IZTw_9t)xF+AbHo(4@|htfA;KGQ8Plr zv5YoplA4kV-PS~ov?rVjk87FF~sK!wR{j6V7`xf&{59c;zCGnF*ZNd9M=}ftZ8bGVWT88`9-onFbERb zUx*d-k(p$CgL1f{MJG9+^4nAiEzI+91v;5nR{@1=fsWHR)hCg#O!5`|@%$oHHvep3 z&D?Y3sYzUzjSBVdT%<0n?w(mN)usA`vqAJDiU(Ph!$vPw_iUcRV&Gkw6wUmP?-%6T z<*7*=_J+@ZDy#Ty-mLt!JXuJ*B0;=w5xWug({IYTROd6l)pTNVjnl(210??p`|WK# zWW=f;$cXL09{?Z5tLn7L;7MrL^4t%332g$ga%hvEm>A!XGP$x_Ca<;j4}8p1{GnoB z@#%v$W0Fst!p4uwWZR^zadK({Zlk^K)yTBCC<&8~>0hqFjHz!_`xJ zTax%>pnU9Lr=1I+{BGb*L{biguMf9THtCqvQ%5``R6 z37UH`^O5lns9FxEnt?6Ki0-3}CB-?n%<69WHB=f9(>u>H^32z(K8@eBzY^q;ULkW% zZOD}0k|@pDQ&-66<4KmQFD%m{wac-^e0%EnwEFu*(haE_oO|pVY*iy>9m$MswN98> zz$_CorxrSb&37u+*~Vu~$xJI4>mxIQXE2K&CFR9FuWDx&hcHWi)E`=fF{2v|a%|}{)$4t`IT*h^ z*TMKb@>~7h8DK0GjK_kp%o@|%8r};EdQy632t>0FHCOHZFjVnXFzd$v^B`NXfkL=H z^E_M-T<_#q?CMlswq;Oy-^BQFmcUnlMLq}=ZLQjuResdg;NEwFZFi?SK~~m}A>B~f z%TwC{FtT=r^xzg6Un5#2s0V&1@16?bDf)}Cm%}Kl@MvsidM|kg=CI|Lwc5~w?{Hjd zSFnPMoZ$qDZWtH!&D#?TRTGEj85OPAclt^QJT{c|tV&l(OrI}CkMu&vGV{>X+)&n( z9F;LEmAWo~lDiR}A9AHVPjBZE9-aWr4fBgmZw>#9O~Cz!oc7O0HA6S91La^@o4ed}3`+mjGcMof-aXZOKt zf7RT>Q3t{`qJ{nRSd6GhWAtw-f+co0kzhrCK17O&)?=b?WH9G}iWM@LFz4ip`PT3T zE<^R`N^8Yl$pXEoMRN;p3qmMsc=05>zz%_)AzV;ZCy_W7SXBos{VJ!C_-#>N@;DwL zYbX}|rM(m}LX}+4_scXP2vYOB{M4619KRqGxs(ano&^J#R9ljD&k2gG@MIy0dKQS8 zB&x;ARp*Q2L(`4a$maxHYThQA{ECNH8+HQHqCN-lwany2oA{h`z}&~tfT8}2hWLkF zBDcbl<`yj`jr%9%~M!O&i0U zz1b$tl`a+EDR!tE=M>VM0^-4{wS|Ux4#!1TWpi9EA{Pz9g+~1FjT{(ZPeG7{-viqr z+{NZxBxlLqiF_@M+GB^h2pbc^@4|GgpPz(c=4>C~j+D2Ab+TA}kd-_fSylvc+gZ?_ z)3u4l+5B!-BayS^d$o#UsFaCZ$XwHm%sL^nb8|A!e78B3-#AqM4dY)?8Bjz96pid5 zH_=E2BnAqT)3Cmp7ThiLv)_EzIkjX@1EU#uSJ@1E?Hi;gSsft3^REzr5y`=8M-Rzb z5ntCT#V7T>?&$4EZLs1O`+7x{wo1h7lqdYiGNRn$J+iFAn>+ z>UZ2m|H&;}d$QuL;&@Dcu2kLGsXh}bIRtSQ0gjU6RC97qrj~?uB2Q_KshvQq#llE9 zBokz8v5a&P<8n?yaa=)clV z>gO)eEU%80t`S@0-9OPSlaG@w(()b5$0^LmG-5u2*dM_xtxt9abK`h$*9`OUX51>C zk*D}8jhq&%oz-?vl`M@*BmBauHmR|;P1NS}ww$(0?!kPJU-nV`uTr*=!nd%ebS8tT zX9DBZvCJ^(V!H+ z&vi~p7*9px^-Q-jno{tkH@3HNy|O{gsXsV7R-+8O8O*EW2w5Tzm`J$ANDP<=16XVi z80Us+cY?2S;1T5mLGj^R>`li&T-A-E=%-}@Yhi@b9KK1xFW3D_rl=A*0_Wwl7R6>! z8@wS-I$wan4EcX(dlTp=i!AP&01qG#I|va*VT=k0Ix479B1VZM*ewa-&ZsC3inyaD z3bF_$t@J!J;_kSjqa*4#qBCkhg@8zd3%i0a3hqxEl}*`H^8Nm|x;qIl?|Z)QoG<63 zx}K_gZ{508b*t*uhCho<<6R@MP$YI@*!SJYrXcM9xmBq@hQW^B{$n)Cs)7%5v7#KU zX*9Y$nL4(Yy~3uXd%xzzW$Os2ex?&iH1DcRMiMREPYeB!3mDxq6|%Okz%@m4XigX} z>dK#%t?O~k{%Y@c`;!{22QZ%59h|6|!-dd6dx_A`K46?AxwDQQi(R{aq6$=Bq6k&- z+!Lwd{=sa*=_@4`^S&7?V4Zh7(uNM*s$#O@eO{UKQT#)iB2yBh7|%b%qEHL-gZM#A zk?ewihG$w!Xx5XN(uuR*S(Ol-<>@4LOWJT2&re#E(JA@gbWoY1^InQhEKO%+hR&MT}RJI{hby<5Pv?Nc` z&eiHyIQ~v6GB$^fs>v*78QlD)mWPQa4(q{R4-!ajHwW1^4QZyC;94O58WsAN3IbwX=Pr5;HR zq_p;P`Frfo5<$N_wrcL6;jN0AcE1-KzIIpfqlVSFgECh5J;~8!U)a%N*Q8_fUF?T0 z_F;#65W^J19i-S;m-$e({Q~QQ2rNK-R2qM{AW)U@!a3N>g7+QySJTmBGtn~?{gR75 zIURj}D%vl+OiB2;qZPv(UcmRIayuwT8R(KbR7;q}EOWon|IpU`x$kS@*u!+0gFm)a z@IA1#7dU;U0Cqt#xLp#AJdp5H>j#^*Us2EY)x&6q<9^JR#*0Mz-~oR2glBah4c|-( zPxmog7-DtXa%yTW%qRU!5172TM<_a!l4K<=c%Gz@)RIbmR1Sv%M(6vr3%)TO+?wFI zD&pXM7xP>?W)mld=k|`ZXcNqIF}FxYBJ~L|;Y5Oj>VgMcoXJmdvx%!LeE3dCmeW}m zwva^q{Il#QcQ8M}@st9fll8_+@JHbbaXGEPsku-$f|xKxn3xe&!R=|ebH!CW|L3lX zS|1D`N+fo52FdR-OBKd1oK33gSu)En?peWqLD_bagsNV(M7-W=u6~z;tk4T9_l>r? z9&N2dvo|6AE{8j`(tV?~p-!bz+h5fy=6zs*T~2Xmx%);ttsd=khxWK-s>^2%?ej_d z%-hI%v}+yO^$zU@6L{hC`$oIB9_;~#cB(^LDmnXwqxOyVUOn0(hZb^Z(_Lx>`$pSY zkM^5G+hCdMGRCFWbl+%4=Vm0?3onu!V}SX`fo63U71cwPB<4LVf~rQt1?lG>0YhmJ z&w-3fgWTpo+VY(S`LcsixjYTxJCH9LP?_sM2Bblrav&2Z&NP+B9mr8>kbgUn4;rvL z#)0IdK@tvRMgx!w9LO&csdBW=fplq*(D4prZ5m{w1G%#SNR9)Un+9oipvh%D5=^uE zV|&Z=vuTiy4n%JPr9s|zAh9&aQGi%n@S=;kEgcg!v;b11`OTd5C)|Y z2D#M!)d1uY2XcHG7^eozp~Z%-rHsy(&D0O8=aheO;%n0 zAkwYN*TW3wo;bAyQ?VJyHL>)oHGxsiT z3ZcckEAawoj$Nl+M zP0-u*>SX-<35bqCj>hC$73;SN*YWB^8xcH9P;5`&U6S-rl>xwiFtDrd`4CP7^@h>v z@}NW$FYHc|!Sgweqot0c0fgx)kaN>ke03dgJks&07^5@3Nju zD3PmDiM;I+>1T;}mm^+a@6%7*>)%b8@k-rS$BCYG22=uk~U3>S14nUno;6C`sjaq{~#6a^f=eMJ7{Wd}Qj?vr?Iwfd|%l6HIYD zqgcOi9U`~lxHOw@701PvI~B)9D}F1ED-_$XIJygJui_|?z>riSo07!d04J$Iw-X%q zZX+!in4urvyWD;-yT-Cr?zX!#mVK@BGJnn@tmcr|T=0eY}3+-nes2BxUaF zbN6+Ifpi&si$Dq^WH5MgaZsA#O&N-2 zh>PdGB8qvcKTv$NiBUW*P0`ahYcGmlcZcF{Z2*-lF33>)kZ^eXOGAp6If?<*$)Fb= zurG=yffBr!rr0-4G4~LW>gSl_C{fVPQF|s$ZT>!}`Gu8;5}jzn;d`XJ#b%cjQNM7( zZSdmfUq6~3v`w@%GwwO68{9m#nz@_`<@LP@2ZI4LQu}2{jd7$7QrSW3WFUk+VQ*{- zqPaSNc>V|7;BH0m{eCHGTWl;#n=7onmLNa>zbVFk00NeNZ0Csf+6Pg;@OglP*^(Uh zmI;x4TMBBqK;|9t{l3Wig-;n#?-Bhp*xW=+g~Pf_Sj*W@W>_CMtT7Jj=Do2_b6CTK z^;jC~Lx**)!z$ey%k8($KUr8;rm;S9SVudo?t5dcbW-jhtYgzyOB_~9ht*^ctc14( zB>e?X^3h|ZdW;}oP;Z`9&ZAqX?>?q|-ePZFR>j?7m zKLAVBYaI}(UVStH-lJ7=-)lLH%~Y+57sedrVUF@0Y09lKlzZJ^ly6E=o|K|otEuZ= zl-G&!1)}WdZWKnmuoKJcSPu?KQ~pMk(|EQwuGo8%qI^V(@{^8oDEc+UQs0dyKju@b zcG-g>qMx$Bd`4)pR48$;xFZp)f1rz5|G-tbvi^bZhBDDAJiY=5?nAyNd6kIAy><@e zT|=3dL3s<`$quDS3gsl3@PzXDftJcNLz$XEnT+o`hw>3pu<3qNVN@25BZ{pXe*Q>2 ze(t5XWaBLTum|@rMAm#8z;EW?{SGDLQxsKM_$csM zf2ct!H=Ut)SGdvgY%-DFl5F9^Hr1rjwzAJW=^iEW9(8D?hIVEKtr*{F4lR~Ovv*%+ktBH= z?$B}#t$hY98(%+%c1{{Cs?_duXn%5OpECl$9On!oIghM+xjiwW*$$<{-mjf(s z&l}ov8MLSHjdW;Vldy?I7f~fUIJ7wqZIq$ikU<-X?;3~pavDwh1(TnFyLagy>iUf% zjYZ>wM{|!!FCjU($!3}Bp-5veW z8T#*=33@Fv;wGY>@b@7aIr=$9e}CMEjeaY9Z5{oxH2sO9KVJ0vr0GBC=%1dU zFRQhq|9+i`>UsKM_@8;5MD;J+{}}xl__7`SA4$si&lCMFqQ6GGiT~>y{V)6RZTz2* zp?{6&Cp@3Fra!WBic6}*lIoAk3Ll9U;@jUPb!R%M*E#5re2w&i>(fc~aY@~lNouim z<`PvMD{mwv-I+>ic?-+cS_aMuZw>APL?yfx_(CqJj_IV%R8nUssix_qn!BXhW|F!z zlhgw)srP7Bsia1@q;9mNuE)KSY$d#_@a4Fq{z(Q+fa}@lk^C>|1rJL&65z7$t*$+N zT3Ucxt;1HXdb*^J1Ur?~uj)QyUUN&TDXupECA{CR$!gNhB~_G8s$5CkL{i9ofkXQU zu!Q#kuB)Q&;XBNswN9fI3hiWv7I$b58QKH5lVKy_O~rS#Lt6<8ma!H>Yv#}{aA=nq z+ECmF4DCXEeH_~3X|$z!9`HkOVe$}%*2B=cdg z9(SXmW#hZep`DXXEh@A-9oomuOeCK(5~u&eZDkem6MT0%w1d-VgM>EFp*`u)^cGse zdk*(xLwgEe+@XC*LUThxUM>-G{5q>IrWOz6B0#IV_k+nhPzx%30_D6iH9oq0T+CxIS-=TdgT_5u{j!@oy z#Qmey61|P}r9=Bu8tpQnUEOM0++lMIkYnkEsT4(p`DJenH#9wokp82v^O1EYlqg}(Awd4 zHMBPP_IGH5(`c1Ko9NJ1N|7`EzfvMuiwhRMRroqOv_GWLN`)42XpcLz=M3%d8MG(x z9puoyBw-UtuFwtut@>GF>{ccWTx(jfGJJ9M3kuTUhM*-13L}As@W7KU$xV0zGQ|7g z8{qgt+CJ4!>!)}1%ls70Sq|yiu0h9L?3F%fkV14ZG|xF7VIN=7y|6*=I6g{ah4Cx2 z_dH+s|Hiy2xR&&)etk`U54)=C%tFIu4YfG!AY(X&vEZr zht|u`j={w!3tA6+Pdl{h(`eI$_Jl*b)uHViuGF^Uy20dTeE)E0C#KP^7TO4hcDO^E zZ)i2R5^lnqjqfFgR!73dbmp`C_%xS%F8(t;Fqk@9u*z;;=rqR$bMfM+gTJ_6C7uBIdjj2 zU|(~WD_fK+IyXEM#fg!2wSVLsj2)b-U@OPoI~d)etcLfOr=VxnE@LxJ70fn152ek# zZxUv^yjgAH)I|OX`C3xBmG^|$eR;=V44@ZLdco^|cIzeZ*<@BVPDM9%?I`*&ML(2^ zK7!Kdy_jDsRGlvi znT`q<%R>&6eee{${T<|MpUdngJ?~uA@xM^VT|o~-bg6>gHb1Mpb>-NRO}HtM0^Byg zRmH`KyceAD(W(66uwOY5KjQ4OeLj=VCgnp2(o}_@e%rWk_WX1a)p8A}*YUV?v3!Yv zBG|PlT`bARz(ES5!RrO-is!)VLs%0>w_*n0{qzmd@|S=dWo2l!qNU&ex>ThZqDn(0 z8p(H_N|+-9J?o40M$)f1{(lr}?LiHSI#Ux)0j2z-hDA;xA0qkt`P0&3yvV1^Xj!v3jeHfK-m_dR-H}tdoCsZ-z;{ ztdlKfVdT?6LP<+u3<1#}2UA zJ2~e%^h*r=q73?Z_+p^%!JnUh8WDbOJ}xHl?)r%rp4ys%J!qPpM@|+X<9+lGw!t<3 z9cn^w3Zl~aDMZT|IXw{6P}x#ZF1$?C3pX7DaLCD(=Xfb)-I(I%_pxYHK;sJ$HqfBz zmN~+qs;~Is{>bu9~s489O5$zyP!v%#umVNA))*l1jmHw`zsdIyMR93oKdM-dk5d_$wx$u+QOx7R*zj?nD=g14RWIT+Ks@)A8jp3IS}WHUY;^FedRZ78Zs z)@*?%IGloz#G+4Uz^K8=E&v2AiA$Am^p6ci5WMw$3hPi2Y9ipZ&`uRo^v?hX*8`K( z(UD-TMY)4cV@M`AhbUxALe^k7afxWuBmM|t@(W=f>p;@gGI}+5^_dcaDrxj$#Z?F!Buv(R#x37==oq8JdBFfs_m{!So#`!kwZRx3ENsHin!joDO3nn81 zSA#45Mgax`z_z0Lr$Bt1M*T_ZK5WKNn|QE|X9>b#GQ@VB`A5=IX5;w+Pbhk_r#esG zsm9e-1l*s|JQv2uJhSQ;os{C+uQ1w&A7MfxgO5Q<+ZVq9J~$ZxwL z!a1KhJDS;D%KT7k%{tA*BZ;5rl$qbZZQSqjaZduG`7^`=lq(W$TD<(jk00_I6xV3!_?K^fxdU2PKI5^h1KQ#9*6=N zh3r5@awYVU-R@A;3gwV%XhKnHl*zQnFS4h8Bl|6M@`-K$y0$&lF7>^PZ#zE_@hgTg zFy)vCndSL~y7H^IJ%@8%Hv6k!u6t>{7>jb3KoXq zTDd6=y|S$=YYS2z-6GPgbtLwFq>hu=AJ`KmV^!M^wjyxJ*gXSWKo`zh%2fl=W#yGg zA91Q~G{{G)f`p=NNGbUVL`=AhvEL+=G~p~jXQ~|$UKAu%9hQ!;!y5?nu?&3?Qs-D1ADH!>y+a8 zFE&F1<$VLOxR;RDk9o_^7R@EN4;sxy_*R|>f#*^*#no*>Q3I?~8CdRXXc5Z&18KqN zP`u>V`1mZjzY8vv`|eEgjL4<`Gxz;zse2N@{_8mHZk%?-oo<}|5nma(_wzg9^K(|hXiiqQasz0+OibUzvzJKK#l~vnF>{A0;o4i-cgm-+U zYpP5oAd&L!u)PMuP1x_P3Fz+^SnpAF2`dZC|c>i*fK`DjUH!>d&}uiDD|~xsnpltx|*~C-_5E?uh3Ge%kj-pL~;_DslF}q z`7b`HI#V2x2aU-6xUN9r`1*^;H4sVFz0HR!TRP@=HrhRS_Ddr$&=EM#2%LlK>Ru_n z)v9|v#YKsd6=iI^2N^={;Q++4yUF$Br>=yeztK$V??p-e$Y*u90q*DOGh?~m4H9lr zt|z~B`!$A}Zh*;G`J~kUX&BkB1C{XpjT@)%65h-BPB@ghAZND1+z5~dG zD&5LrkDmN>2zj*H+fL2FKbupzD<*X1S>w!G9PU1~g5u4cc%2hGE@%xGd@}CGV2(;U zRx%^(Pu7H_)bBR+Fx}N;?;+DJ{6DDXdZh(lRdC3PyK31U{T&`S=|?i_DmuKD6+3^X zg8xu^P$r_TS)yd7@trzWOaq&)He|<*Vd zMPHO^(bNr~$YmW@3Zq^Jrc7c4K0;tcaqXb`PGk?d6%>HGh^_&7jxalV6*E&b8XvVL z?`5&yxR;jO7-)ai%Cw^1pq2GjyVR2_`^n?qCzCFfr=m9LDIo5RRKF1OZW^dIbR+I- zK(MDA-|)kU+M_xqACN5KUT=qXvZ3|KpdE+rHqh+y2)fMlHzdv+SB%+?k`@^k5F z+WeW~(EPr^a&u@bk+_&d^?_1L%Puuvs9NCyUAyKPd4p7kQ_s8_;zTt>l(Fu{;+A5D*%&uzJux-9 zvPbx(;q7rAUY8Sx_K+^)T!l3ryHJfKj_6WUkPSYN{1sS`ko@(G-xJ=oxc`AC*1+)n zU6MzZ|NnAjV%sxI1kxOt@Qkl+T0gUf7itjo`uY(#l_3 zw%4%dtM(8kSTj0ng7rJSd>MDfWg1fSO#s~K>~MqA+4YUnDd+SI@ECM^eO#l0joOw& z*Qk>R8{7bjvIJGh)kHH0K->35&226#7`G6$JdqO7!-aiIW{yiT*&gVZ|Ae)$E_jf& z7jUAN0T8Ksue9&=Gsk_I907$r^n1o0ZS%`XKZKj9TzM1RUZL)r`yb`Gin)p;bk7+` zNVX@LHBE!@&|=jG_A$+MD5wq7(f-X;xNQ>-@7*ZDekhXCT`>NzaOx7g);{h>2rpy; zz&+_V<;?*8&>P-ueYUvFzWNpC!CqxbIkn`x#$uS2|%ivlW(X zgF~NpjnUNbWchYV)Pqdzo9rCdk!FlxDYf=~#YSGT>YM!`HejAkR=*N|T^0|`+)q0f zO49DiB4gvyzTKXMDmS%S64`f&N*67wD05-Sp20IZcl3hGiJ1*ny?{NI>u4>H|%soo(I&jvBg2@c}wa{4gA<@Wln6_4OEx@D&YHbZwMm)Ri zdNGroTdZPjkL!vx8(*HvMNYCSA`QaIyOUA$zbdGB_R`M{c};&Ie}X#~<`dpBd_9FM zXSTwU-=PL|n=g@=s70~rca@f|G+avTNCph@x)hj67K499i#Xehn{A;?Ky zfr6ZK6uw$-&awP}*VW-2ZFooFimh0FPkfZ4C4n7EY517uV(V=X-G*2{H%l;n_LkGx z#(M}54K-T*{gNqt)&mJ=ZlOc=KWkT`UGm8*=+SD>DHA%=sHO`kuipPOZ~XOYQ|%jr z{IdX3ZS2=v^cW$I9TuKcm&JJC=KSEaPb7D47PLE3s|Es7`IZen!?D+AK&||!Qa!6^ zOLUN_IHPs~YGxTRbTW-Wb>n`2l>YkC*e;C@m1u7WYSp3YG*!k7neu}0@PXHb<82pl z^USTC-1xhaH^pK$aH*`3I=UJCTKE%fE?jvUkMX8@p3>NJGnKl3{dK&PH>}tBtBqpI2N4@829i`<0tqXH5H5M@pj|y+pzzjqKmm%4#hODH-n*f6dSAs zu+%rCh(DoKBz`HEI{(ZCYEb-~wF59p{kS9(ymd9U9nw9j%)hl&@EC}gQ0)+53b3e} zOg9OJL%o=u?G7Nq{yXA6m}h=3N4e9DMA-+*XGbfRaao`yHj@^p1~hDAnuo*^b!Rj1 zPM1e0`fsX#@;kKwzi?KOh~!^{at}U=6Qm;8En>7b=I~=)CyYhpIXz&h;Ywo}>Ls3i z<~l)UpW9E3@N8UdpkuLd5MFe#|BJr1%~oh|Oa&9#4&6{1>r}Gw+-yV6JrLMfb|<-> z{J}tu#whv!Yn641E|kL=EE7L(KIZUDMJrde`{lS_xg__x>VG)?pz3}&9$%y%6yant zNS-Hu2v5cS(f3m8eD5CISX5%C72V1QbwdTH(MG{asQHzdG3Y49prdm_J&c1;JJdH! z>^b_{*HCj`L(;Hs%{1)CjZObSW7D3?;6V+4>`0zx!#+817|*PY{QsWH|4p*Rv7;xS ziXdK>2x9pY@xziNKw*#2SG;gE+e?aL-v<}oqOO+uco(L+bbYKE1#B=~qKapCQzstF zJ_fvm_b1#%$U5P5$2S25IY&;>I|{6QKFC{cIGasfXYXP(knnckeq=aX@I5CSIYsX% zFgc2@m)cnUJ3+HPQOI;L>Pt{5Y4%56rt}C!g!bq$kIjvA6{P>L)b9}eCbxlIG^Z=| zJ=qa&y~cI-lU=}Dsyu1Pb$iA6G>jf5$v2bym>OOC3ED1#~R2DVtjjrH5 z=ah{^s|`^`Vsts~f;CCcSwZ5%Y~U3gVrk_6h;rE12`E{sFlD%M8fK)) z4Bd(0-px_L6-z`P)i&Qk&SEVo`>q@W6f2ot8hcq)C={Iu6A?YRswIKH+XrtwU{}%u zNkboD_UPXEWYdoCg~3K0u%(5LiK{A<$jvDZhEyQ28`rolv4o)b+H zeI*GB-j6DtpfGdja*s#PyLKv$1(8@OH^Q>JC3eYzJTj_#EdP18=%wmIq42d=tc{fk z!%g+zi4x_D{_sj}yT_;lZnx zbS+2U2Pf;GW;#b^qs5rlR&AMGw^d72cCs+ZV)3ym#2$+RsdmK`(lf}pwF~5_+Qg-K zqk?6sb!!D^XxB^cZ{)}9%u98b4b)eBf?cjAd-XXrE7uF0-~bs*V*lyUcLeSE0OQ(LZQ z*tOxbStaZbp-UT0vJL73c`stJ=+8wP_z44fnZeAnbdsvYoo?Tf%7QTJop+dM7QAN^CSBaz?~dp+=9g zQIOl1r|Np7nvEGF;@%CcErw&>Z6~PzT7iRKNGA~ zG3_{C=K4??pr#|KS{RBhBsjTHSaGk+Snw_|7S7ACFbLm)-IaN^vzAO}+-wRa#g6Lo zEy);sK%tGJ(7`AikfG2P-=R>@vux>X2(K@%B*nc?n0Qhy>+_ZK&v0GNSL18ZAlca3 z2B^BzH&k(;6on~mx{8(RsI|JZ131?`(($ka#o|;-&18V2li1VJS_9y;PTKdL7Mh7` zO+}18WMaK~7~7*B3HwEiI}k>!WMVi`G?MI7vPHvEzc%n-82(ZpRpRlqhWe}1q#vdu z@OmS`-}$1=%+L%!_IdD7Urkg@>Fj9~NcGO6htQ@OK8_yA;FP!7Mh=s%rz!6}grq5} zIqr2s={^UmX$_K=UrPB`z9VMPPLs%qaNm@adtJMH1CUQsX zBjI=%Hq>_{yWkhL`*B4)%L9c6QK-nJvVhii%p|}ijoE4eZhEp-`kU#=+{u)D!|4ev zZ`MZOYJ1?TJ+)}=Xsa4O&iYA#?bB7GXzl>QXKfKh?w66ij(Jgbr^d4H#x0H&R`G*Q z-#G2ty~QKKHWmGSu0_#tS5U`yPRQ z{=DN<0B_<_0J?pV0w@V6fX8{Bi@i(K>7q7Ina@{3iP#x1BDkaf$p zzY7FQ8-}N^;>OvEKsx3j7CwX7-?$;$4&$8ddZptkl1jOQ^Z_xwBz0*1MQ{ zs7n~rGh7X+R#NA)Rh87g_4TraS%pnm7Y&WX@)nBv#vxC9^vkK-5HFm_XT|L(h?!c= z)9Y2S<*6ZH<@-$`lf!G8tpJ{pm%cw^EUR=s+fZr-n_e`5C`#|(3RQj0=RP|~b*-Uj zEyrCG1L`*^{*=%kuaePfBNaY@FmXg4- z^l(jMHHm?l$bCteP0YwDR zD2^xAOwf93G{5Z^1jcjo_)!O56HJ`10B@*z&6qdhST%(!aCPo4;a!UFyd&tX)@dqJ zrBQ;d$*-3uvnfUuC%T-VN;$LzIC(APU&!jA4x zggs%!746>!9VAteImW}I4dB$Bs$mc_&a1A$*Pxp_c5JE&6aY@D4(NPKl zk*ICzaVuw5ANM^s8IR1-K6}9HLn(BJ_~tuHIZ10NPJM?ZvPitRW3%2X8p3yOH~EsB-$QR)(k=_nZh4yGsgtMK zOWiRY^d6Q)T^<=5q7QK%y+-x(?;Grr#ulQ6|ihif6$U`la3mUBg zXDv?_P$7D+P#bWaU@Oo<(O(%%BoAP8LGwEBJ>hzX9I58j1=ne=j`$9xc_jlWow&Dg zfr0Iya1-7(T-ORW;oBi)HP3-9a$w61Y$>jzwiw^xrU!qt>N^4G0Kx{Z0C_AvdA>oTz%Uo$XyBhcQZ zOXc89VX_h@%!eH2Q-=9O2J>NjEuF+Nokx42eM!xt{6lQ=a691ovYZt>^Og~dIAZ4* zvB9`Ht&s4}#CHY6IPh~Bc*%|sBI$!2bXS8u4A&J_XMDwij%`xXu>~@yIMHjHVeN2G zH_Ru!n3p_4`TY*pp?-nyEKt$7q3B-$PCnoyJJZ3>GWa($@UP-K!E)K4eE$SW1N~>U zzCbm$GZDesx6}KhHC_$-cTbcYnJen$K4xXQ32V;0KA3PnZpPf=z~D+<`9XYB%)Fl} zd^O<=rMnnQ+1+6wmfJ&azWiu=t@j7}Un0{kcHPXTv{ZVNQ|WagJv3z9GEzKvPKN?0 zuTzSBgMaJnJ}Dl-?3HqmsZ#=I}kL2gAuA}{@6aj zQL{y;4H{|#%g_ODTWt#V6LB2|W!lpLlm1{*2dKdykj0a9q?=|pigbpkY5gQ(9jO}n z?h8%&amKLqw*EV^Leb-8%47WbBFP~2|0WM3Afs<>{-X5&jz0VvJSkSlpl8;33L&~v zy!8q4tA$+NA?S|B2F}|Al03RI$|hyYxAn}%^P#jopZzJED)ElkC2HW8EZcVXi{z4L zzes>tQQgD6U_W(WrRs?eg7d0Tr;OY&Wn_P5d}NIXhi;fRA~dR|cxzGU4&J1#tYK`O zH6paJW(40eAiUVZ?s7m7}4 zPpChj58yTYVpl1tCXpKl2UZ^y z3mO}~j;F{UY9}Q^RVYwY%Jq*VS%Vgf&35P~zjIe6hb!u)VLeHUA-a=(D0#2=5{Gwx ze*lni?^^=S9Nu<%IBQw`C~ph~723(td!RV-5XQCaM# zWV`(#q}Ok|xnl?G+Byb{{1Q8M5Z>?IF*!MEVvk0=)cu866m(->;7_b4?nd*PRb3dfyvoKARIwwWYk= zH|Vcun>RwUdQ&cn{lNW^!vk_@}FL!_85 zo&jTz_fQkG-9d~VpZbb{F?Dcz5m8`I$b{$?Kq&9>ZYnCXSIY*bdeXDCTLW@u>;A-7 zs-8{X24}J7WRYU!8^UFNg?ma$x1vRSy+ExM9@~+bO{Q-&gpIc9kb4j{%eC0xmA~3T z*&h1^BeBn9KB+1fF`K|>5``tp+2dF@7|plJ9I2cK=}?taW_n_D<}V6)$ZB);%Y4+& zPVSOjIG+0`KS=!df9uOzD_t1#zRFWC_yz71P!rxdd@mj-W8260{M-+4Y4~sJCtf%f zD{C;5quNDtR11vXziS#`MuETCgaBb9N-}LP!AvDAS**56=`rUU(om!FV)YO*bGNbn zql!3Q%tLgsk{*%a<9mhYeb+pA_dkTjO8P{Gm-W(?4c?>fXT{XiWZu$d2fQ(NM^2_} zroM)pY#;hG_E>-UvrS=>=sX4XEj(1IJy1ifrZTnFN34W;|^v?imEQ(NaD_fc%j0yc>Au+t=_Y;aH|CN=Jjd3$yNE}w4$u&o_>kCOYq-UA>804YE8D&^98H(4R;}{@x8^UK=qZBD8D6< z_yxQn(3v9qB+~c7oX`|(hH$}AZfjFEm1x=Up*h;;Z-=V-J>gbw*9X6JRR34%+d^b$ z^2IGtHh-a|eI_t=p8Ml%J2>losl^%ZU1F#|gNyv}EIn*u@;kMP>JjnJ@59=3zi|AF zy4cQ2mP#vk@KB}1tn+@GY~_>Le3Rq_)(G?4D+ToVEyh7;^0!n!wk)C@NPf3k$3Bz) zni!Y-P;QD?Q&hJI;-Se|4OoZ_-?8o8W}zx=eBzDD-iv{l7LGOF&8w)*cZKVgGD9u+ zpyJ2k*tm-c!qIpIDW$Cjkj0!BdeM8*=@SBVq@*uqz`9e;N}uq;x15k^G2dO{|5Xn zrN5JucI{9~J9o&-)3JCr$s3qAU<&zLY-`r9V?IPKdH&ETMX{kHDe2n}(JJ_N?j-W3 zGs&A;*L3QbCOUn+zigJkY0UHv-GS0?4A!0}LQ!gFVHXPrbU$WGC92 zm=y0uV<T7qUn4W+yAxy6d@3q1i8NNICD@w=;qK~vQrd$LxE**9(VKA;O zS-ePys135KK`vlzhyl=$JeFSW=%Ti>Fc_N#$uSVKyER(b1@;y;3hQWG8_ua2xgE4| z64|4(6dyhA0Yn?hj-^dDTn#Z3TsT%TjdjCWf0K~oUM>9y-QCa3Tw~eWaM@b6m7hJ= z;r*f0_GyZf9qu4flRm4+tv6pG--|Nv$tzVa zeXq$+ux1CsPI+Iv<~~i=Oh!*RmXOK7)4gSQwg2kIa;BhuuT zDiGdP)7eNPcqIgb)1iX|lGZzUTRMrvCfrGoU=K9D?sWLc*0xIH&39lQ7}(+r*t__8 z2<$6eZ|E0(K+3e*pDEg4JsGjGy0ir;xxUcX4#38XRPb=6BYuMszYaHQJdD5>5%Iem z@f#fRr$qeDH1Qtw#E;o0@m7v_J0l*#oovMS!*{ia_cY@9_a3AgwlR3&P8)?;1DWD3 zC|qb=r?<4DMD!7^7FiNr0^b8rkU5954L^pWb~$sB0Yk9!CD$%cR?$_zkmtBJ(NT#R zmAf-kCgHmaDyk~UCzPP?c|W8}s@Y;n>X8?%q)u}L!bV^KZrs@Dhwp78(CvKil7BWD zg+(k2Nq_PaoR8_>O5!S0MYiuUivj!IC9w`IM|;rAVF~X`+y^X;|KbZItlwN-{^P*j zF|fCAH3ms|uj4z9s+|1TfyEuzLk6bT!^j9=Q}KNyu3YBWusjLhOEn8HZJG7_oJNFRS+89BfueXu3{2V8U~Nw>$hi=<83qe))v;`_9; z|C2!4N4{XvUJe41Seq+Jtih$J;ah?4&`$8aMHUeZlsaI|V=`;QS!+WN%!_hhAqTYz z*}M$di6XmlhLOG9k*zeclQLw-;_D`|k3lv)o0T>j1ez@s=J&DM@1~EVO<<{I6TKUV z4vy32h>l1D;$HqWBAdk(jHoIw8 zKhYLz|9;+B8xgwEqTSqEGxt_Db3d|nuq!zKf=m!kcRfeIXZ#&I*;XN}|E z51@UdTg6{?a=c(Q{mX21CTt$nqhzx+kwA&PJ8+cF*6f+dEiNy3)K|f5L4YU8{IVGSwxz zTnj33Z-1A5M@v5!*Ohh%-wO!Obf9i|2J|cXE5z~xJ4)&MahV(H- zFqOYG4LzlwW~K4sCe0x7gnHU|_EY)^l`bM{r+kB#bCj{JUCGu%7N6UHp2_Y#zK~k< z??Uqa;uyHr7`Pf&l`r89$M-$ioFm67B<6;;5FnjnK?zPSp^Y*Z)&wzq*45UAydjo$ zYGv{`I;7xcL^Q`<;fs4)OoMvAqD2zkPFx!~SJ}9GK2kjaZwqEy?U}G5j#IcXu)~4% zu_s$>=Z=wPLoqDOYhK~be?10qmOMj;OvD2fo zA2Q#&v_2Xcq$bqq=w-F1X?IO!f-@@IGR6Hkb!DsS5k@c{MN6}j`TRwG*{Tx8{_C)t zlyC=6ivIdNZXI*$6K7y5WTk=hGWPJ@tW*T8pCJcyBR!-7wdum|H_DxLsT(W(j+S^`l4|n!;KmR*Qr18GE@)Oc~;>u4l*0%+_)Z9q({1p8LSL3Bg z2fsZH4C7tw`HQKiccaKz{+O1nsx}q(N2HwaCgVHhU}~hC*$U(8#d!9g9rRxedRPYf zB7CO;NS?~u&XLcdG}!9u=NACv=N^lTZ7xqg@xp6aE(toEu6JUJksj{=d!%9 zqWo-`U|0d-ohX{!9-_E5BZ?bbDeC&BVdRu5J9!e^Ltg^VZy@lVsDO4~z%-LeZCUrv z*6x?Va70&2+mAhkN}I!UhpN7bqHjgf@SOa+!R+Y*F$vy>OiHX%&els~39l4)lSyy@ zzOj;^oZ3GD*x3PgGr+?$fL-v7&j?Sx*`m;JpD;G1HWJe*`_W;Y z50eerGxtsE7zFBDyTHPuWHn(gU8I#f?AoIn`&_$%l^xard~Jl}r0*J14Ofoo#6aXD zdEG$Zf(?vJqB1KHz?i7JMk)lF-GOPSq& zhG?itng&xzh-5G?`a|Fa;|8k{@G@4sFrlJv#t<+`VccbEo7Y)GN@ZY!julY7!}E5W z7Cv-QY1SrfsZbwDLYE{uC0%B+%SbML&=#A;Y|V`*=4Y54Bwtqc7??Z^x0W4U=qVcx zgRXq#AhqEp+Fjw=*5k~@?wX-L5$Imau}hhr5;41!>2-V(ir?QBN4S$ImGzyhA%~(K zc(omP5YkTlGxiH3;Dcd@ULm@8=4pn}f zA>yO@!D8*aJ(zMgaD}47Nje$9kt_-!seH>!6jfmISjC`}RatJqPa<{8Np*BlBx_;v za*NGg_!&vM8*s`n52B6w1%JXrYrEf~(3dDZor8(zzgCU#D-6+#yV$^USgnI?j}fUm zpIA(4i>NaCmG!{<)wG(%N+4vX(bI~6TdgDs6t7!F$w5h4x^AC8Y#rg0W_tTzIY*Wn z?N3c>Oa~S$fGw$2^yVit=Cd?1;JwCHYV{Z3GNHmZ7~k&)5rrlkI7hzOim1ILkge2d z4R$b*8)&p~G&&fK12Qz);`r{H%T2 z`1y*RrL6zpHh27dju#=El;TIB!JNJg_zC_OKlCl`Ae-s)^44xwPb(I}$^Nx2xpGVH zW?X5(gm)dj(^SUs!i{fGO!CiGRB$F~*1nxyU#RcDiriMIg6*NI76{9&n7i6LNDGh$ zt&=*Sdq5Lr>s)9k`Y0b0$L4Xs_n)Y}qKOma{kLhrb91n)M*3dB3V1aE)N#|g92@cn z;@eqQz8{B#xtEAY|CYSirg=fr$_*`x{6TrKrSmp6t^BTK!H!UL9MS!@EzAo=P4W8| zhquk+<7*P;e6CYq8~F&m*`_G;=7|NHLsh@>nJhLYa!0I%+uqB=y_fMi-WYwvJ`eZ) zB)s1eEDfc-x4>g~KdvFdcF?4XBU#ivKp0`A>dT85IZb0>NwkK+K1rxBUh3QBIC;2+ zqst%UVWY|V;A+5iy{I zvR-+t>P!QP#Bc2tsa!~=`;~@Dwn<-CwIf^yma;={kmonZb9tNE3;i}lKHiE!sbZ|$ zl~sN^hVo@8&9DsCU?y54K57~7tq<-eh+Z*PjP|OfbJ`wEN`({>;;j4b8r$@!BGq20 zk9M{at;JBQ3712ME2}3Xx+WEvKGp}vJ)#_rWiswIeB=;=vT3;C!?JJVm7#Uh`+=&x z92N70{pG`^kl%2z4Yt~3+NWAWSUYFnhfByUodZ;n!*sB2^Ucumtap3YaQ;%81O?(} z-%bs(qftD#4P)#Z43#$n#t_}I)=;5jw)SMwE4r}gf}-?&mo{o)0PdYEdTz4^J2Dn2 zkEON^V?{*?b2{cDUs}+$j0LV=q$NU*p2K&&7`V$Rhm})5d*f=6(hGcS0X+$6B#Usk zCV**9`Js;3gAIt$rvkG`9{vQ} z%p`R)lRf77yKD-cy^b&D`JI?K7D*Fm#=7zWL3lH*xAA7NXvf{pxY+0Ly^3#5XLObv z^w(@h=uV(#3nG|&BB#_zoqj(1KbEwKj+sj1JLrOUAF_19E*;$pm+;QYq!YpSkTfBUfGWRos;URQ}=3Rf?IB0Vn>U)_8Ofs#3R2o6+#V z?W)iusI>3VQ(=swwFt|lb!0j%+y1Ku3O-kb)KU^-L=D1vsYof%pDlzXu z5P8FV2tT%QuTZ7L2~J z7%sRrCvzFgQLIxk`goh-HX%nJLm9J2^I*ayysBvkFLOKl*@(l6Ev!(90L`jObOv?E z+o+PVuROlSxI}efzPoC!LmK%tkSTK=2hi2-+EK#JvmTt-FOBuFvS@gKc;Cx-w$r%r zedpedR)-5W{hrQCYl@moUq-l<%2>Wt5gk7|2x6HzQo(y>=CJzAh{3YhRXyASX;~Ug zSDjimSRk#e$s-|c(6Q$Z&^D*5SBiN9VJ6{4a4B_s{qbGiMV+H=hfWqq6mc)t0sql} zJL6^>@PYUi0<7I5?B(AVk8Vvbmt5MZD0@l)lc(%n*q!dW6<$~4X z^qush+^>RatiH$6f6(-{_vCM4@o`+2{zLc{kbaUZH>qBZZ9%dd4$aTs z$>@uBh;dPu8}t(|?2M5=Sk+5YBr{*Xq)kC@;!vwgsOAyttF{H-OjD`TMR{`#-&Dt+ z&@H90qmSlCH72@5YlAOMg)lmKKyos9A?G8c=wsfE;3d54aYL5#tML6ymetPvqsJ@* zNM|!-iLmR)VPL`U1p0+9TZ)oUrT2CzSTCDJ!^6_pJ@mo^88tZPBjAGf-cS?*; z;Jxm3qTRHIgvek`X~D8_9E4b0>U)oV*rdrI|B@w~=<1)&!kGM` zZIzD4qap>rmX8nn4?9Lzh|x1)bn%3C+~8Mm3GcX^sj5`4Xx!#V-8@yX<>OvSo@ssT z4hfeL&_wZBTCfH)c0pOeyA_|L*d3Z|;fuLU-csSP+c!T8#@H9QXI%YwD>J?x4D?Dt zS1lzSW}vbUR!-0@3co7Azf{*7yxRM1qzV`1CYC>93aDM*$>?b`arv}DHWDSl}D z;ZhiEDGbV_5XN_+QZSQ6+{<%dJq_##T-WJpUu#%kQxLCBkG2KxIq}&j;8V0<@_ig~ z7+(ymdzK4Aa4rcN0EST6dFZ zxJngO*9pDb9KDG~ZvyWACb7}@E)u=3_zbGSOI5JwQx5MmhZi=y0U5l0_$~p@%oERp zn=(%%83d&!5MRKKgnzV+uQ=keFu2C(Yl$cn9VYr2n}&_?t+R}KA5Inb-p5;&^_94e z)sOHECrMS&K3aJ2{_X((X@DRm&B!F{3g>3H>y zf@#Z5<9_7ri_vrd6HRb$A{D6gr5_1%5m>8Y|BUOjCONe!!%f@S$cU>6n?11){0krU zAuJTzmlbWR$>L!*zr(I@?7Ux@RCi#<=Xt*l#=}b81HVc^g)5h4m1dzm-XQhV`eVdr ze`u^&7`8`L80;{ORT%~|s9miT&1|4}r}>89+l{a4SCuZCMw>zu2zZxQSgLlr7a~gXJ`6?csNuzVYeUg(^02$~yWQdVh48;D zygWd_MX`BBm0w`6;T~5;%T3(*^q%u0@#1!zVdQ;{P)_p|9N1i$gJ-!sgYkS4YFD*V zOcGtZB1ge__?DY**w)aE#h>JG?4@eubYOJAR0nM;{#|=ZINqNOK9I`b39!AXU+6w^ zwZdiR1hTs+bRXU1`=N*D_uf`qwKNpHfaaUWl{SO;E!J67@^HbPd0-WKSBqN)^j=Y> zyPv)w-K4CJ_FaDHKC%Iq%|9_Fm66hd1ZUH!&dFJnL%kTrnHWO1Qa2|8rVO`59;K2; zTjWu?a&U$QaitPQsf1A~VU(^!7%4GWY@Wh;Db{?WEOw@&Te_l`V*4o;-;|X~&;V-i zAjMYHCT7-Lh{^$m#oPut@5^S9?VpZ-yNo?V{2c(9_TsOdJjP#patsu5CODT7-+FDi^lbdo>ZiYKso0P~o?Z z)~{c+*?kvptqv!Ox3c#|qwA_IqYSEe>qLR1KWf;&!X`RdVvBnIx#NN<-MVI)ir;uL3iK6rVBKnQGwfcKnF_6A>lD@LfwZ1X?lAok_FT%~EfhWB4@J0Iy zqOd>kbL5|`sNlH6HAAZ%3i-M7jXX5FKSj(%P^|su|IF>7K!>7s1-{=h91n9AAry{3 zHA5`hO((IIh^eA^kLlogPpz}o{9;@Cqk{Rrnn#&_kAR` zoQhc*Dt(`0j57z670kP%>CFCZO*(~9dDaT#K9-C*kKQq}rMtg24GTpPDLT(_9H z_=rgSaf^zV?q65jGpYJduRJk+c2;=!3dpRc?er(n;??vLTpL%l+M1nTX)R;;Vq%sG zq*@+8`tJb7D6%@SsdC=#%Eaz5FPCUCq5*nwY_*PfWEHX4P|=pF0eC=RX!3PQi{le3 ztb8L0QYA#ARx(b?k%UXuS{1RK8paM$tU4yeq7RxfZK`<78qQGQ{?F8sCkwWCUxx+On0qg#*;#p(4&O4+zhrw3 z=bnDfDJ`fi$JF*Kb$tP%ADAfKK3Gi8Qjrdy&iOOSvKZQ3(pAZZre0=AYBnbN)EFu9 zQgjE!#_~w$mH8arX&KI1!^k5XI*TJigVs3OOOl#;Vlp}m<2xF%D+)dM_99j!5~q{% z4h-{>#TZbaU0T42r;2HzN^AMtr-7s}r^G8zVwzviD+&$zB=pog4v;8 zLGG~yC9&NyDt%0FdgeNa7;+lSOM@00=zGqf`|oin0(}e&19STA(2+fm;IvvHFAUyJ zgN<;=OesoY+Z!$O`-T4wR1<#+26ANAm>T71?rCusH&sb65i?fe($G)nWy0MbC1JiHgULq;)SutkV!|@Vs+Q^{kLPSdqKtAPQ^SFe52LIZ<=dv{n~XUxQgB|~;EFQJ`@A~Jdm+uBVBxrROdGh(@tk43w@p)hu6)~c z4h`=R(g5ef!J%jedBLNqgSS|CE0dawglDOdsKx3D>oCte&D+%l8XZ%OcU?3RcuAI^|`sQkv_8c&?^_V!gFDcoKAA`T_jN8p!ga%g2LL;8hz2QrXcx-{wLV;y8*F6ImRod;zy%)Rsk!r)^ zJG-&XPqOYZ{tcDR>%HRD0pWsW6Ar6oVyQlhyK}a$B?dci8pa^*X!>gZ$z`h|@jJL> zy?8x$qrXQP+`??A!)GR?Pv-s9jMtVbzik<+`i`o?jW*%fPQa$|mR?Ub$0DzVlGm<1 z<)wK3uWltLM@}a>d2)Kl=_RKRB>J%*j7ZTONMTDapDeRA4JXX4&}L>S znU1#xZ{_$!O+r)MiGZ?2u|<_T>54f1fX%ulsasXKH0O2{N3il%2^wPso6ooEQUrNd5Gs z2>gJ%$Vh#QuVp{dKbQE}yMF$s1o*j2aZxcf`e7VSBEf$;QW@6=y@9K4(jN_Tumc|77yUWzjZ@iM?$ z5{{2Mu8#M)G`q`;$Tc4?-OkK%$}f7tQM1Ee29vr4Go_sJi(Y!P;9==t%_V=?ln&O+ z%b@!ySmQvTi+`EO+{@;d6;Hrp`LVoiVT2>`^6mc*d*2=xWwrG`C{tF_P-(|XYbs4F zB`qmUEl{YzK*?KHo&aGK3V{PN-ZI4ibIv$MWgROkE9=F4#%u=-uD%l=;7i53l}RE zE$*)>ZrydId$7aHZ?mFq`c!%OOkUXOBy4H_o+SrJ4n&m59e9B{s$T4dRQbYgyrA^?0?T6x!_OC$ z+i-LF2ltC?Y&U^Hp*ZNEqTlrg(9ZZlID}xnZFYb=@>X_*!?)y3Hp380(Dx}>z~_fm zQyc`k0KlQ9=P)Zw8NwHbP$>H!Rm%tg#Kv+nS% zZ$Zzwwh1uL7o3RtEbE&T$LlD+%5`tDrp3_M$GSI};TYE-B!QX3cK5%UhlO~P@hjF0 zMEoF!^#&cm{Wf1yYU;I$yo%!ZQ!oK{*RZ$|e9d%m@;&HvRvVlx^JN^@nrcgJad__` z`|O<6_&GE0;ONSA2P(j)WzOKyLzf*$2IxM2wC%ZN2P^=&=*2E|_dLi4-)r-_SEHZv zp9=cy?3!`5VHTzquvhGzSm*HhSorv8FL|N1i41l;=OQij>Cwa@z6 zEZ}&oji0cW*ar7Y=_Tp`eUc0j%sGH*#2!G+*1CQ0u=5J&GeB6-xlJO+c_p$(NA_56 z2h`3HjrKmJ_6^YFQI?pJ8To`3F@440q(7_;5Vm7dfxY`zA-UaP#W5@;Cb1{ z3?#7DdixASZvCEO8A-?)8Q+Kvn8$AzjEIAF`oAlIWLU{B0y+*dD8nq+kiy~F_0Mq; zFh|vXPGhQY>k1jd5gU8#-(G4kLl%!Jhv*8w!I5s?6JT9JFkiK_qKGA!y}!)&}c9xa&I; zIv>!LLlFOOK;zh@7hZU~p8^*{jaYiHinbI8hfb8SiyL^T_?5hb65RC*?G!REZ;erT zQQzVUZWsmnusg!NHz+w|ZS{vt{|UG%YbyaQW!C5zS-X%a&qvB?_fM`jV48+%HwEYC zxEp#Gv>sb8MgZ6jJyt}(?a)F05FLcoNTWG_?RVoiIv8XX;|Y-hDq?I8$x$>`Xxn=@-tMo! zg>e5)&o?5&hb%r2XJk>XH_&!ts7o{5r!mf_;sz3q7@`m8k?Ng@Ra1P#?o^z);2Isq z){R(kX>t$aFmEYlwy1Kj+rq`njG*T4p<=rkGlfjgzp_%s`7>D3@->8s z7*@H_zh%~Dk_DRtD^pwirC2IljijqF~9M$-e=8e zK%~g#4^Q_TNUz+AA!u4tmsSim_4!W8-?!+Cn^HhVNB7S}F0uZi$$Sh>%_rj`%Wpis zn@c`fW~197;xH@a|N++;ii^PBgB zW9V=kvu9ms-86I)zQ0>f#v+XVbyF;$C8{&vJ%ApWnB54pw-cCP1SYf%l-{V-Y!R@v z(PMq&1B+!S4p9GvRctwSi7;v8PSNm#eA)Nfqx=oWXM_}&j9_UKa|L4NZx;j#4`z`nrF%C%7M^4+W-6X5LG$k>$6rVsy?CW4N|QJ zG!v0jCvZDRH;=Ach!-jAX@MDsIx&Fq;u+OAMM%VrMihKJ>uPu&YdYMBVnB;`rHFWk zNl{?9+MI}dby6IhfEW$d+e>w<7*0LsKC{*r1U@iL|)v=vghQSGN*@Ll=_u?rcV~BcC(r9xUX-!x% z>zGV^}>53}&4fz_#kMK2byx z*5|Ork8hvDEs#3%cR=q#wt>4r(f^fGQk8gTBVOHm2x{)-e;e-&db|=@x0~-Tsrwin zihXnuqs5IE+Sh2>9_v^@6c7qozRBKvVck9z;WQQD9Erehosk)j^-Mq!V(}&&hnL>& zttclHatl4*h;fU->=(E<$!l)MfT2iz&+~5MpwWJeD+5T0ekR!s(G) zL^+0DCE%5)#Lz1kzPKeTJYpwf{3Vxw*}qADI0<)cB^exeEq|O!q8v8s@D-|v?@%yV zgxRBnB_J$8hspJsvkVT-3-&5F&x2dMGIDChfLj2K<^IU9q#9fnt5C*NYb0i*G1VThaF~E|9#{d4NpDEYLY2Zd z;tkT%zdOpm)qnrHoTWCZrz?*}D!DkL%IEwDZ` zt&4k7a}r`8k=qf3dtX~Zkzva~l}$K}N#tf-y3g&vxGNRIz6HpMoTilB*UDS7EHG!D z7k3G3dgU)&ZoLeRcc|3vvguzA{C>=|cp>JXx zJ5^rSN+!3VFsZU&6wT54M!*X$H;gz769tO7`O*#Fpu|D{4)lXii_3RVE#3?FIs|)? zmH`U<0?>ai(%SF}Bgz?9U)-N1M%*-Dc)AzRO(G1fbRs%OKjyV!>qC8&B=9b1m@DzQ z!aAx((wi(M&3R@nxxn%}i>Cpsa`O+@J>(kMg7X5uALeOxEJB613jcdIA|B!_{R9Z? zmoUE3WVwFjKaeBg_}Cintr-MuOP>XL^M$tfQ81g7R%1IUEv%s}096=FN~@u@Bso62 zbROyZl5)2rH$Llm^FY=&v6gA@CfnRYf8g4qZE;u0ESJY_tqY_xir2d5Vc_DpCXCb| z6w#6fvzPaE|JN<_;^Odx%WG5MrEr%T^IQL^U|_@hD4@Xg=)kEku-QOWfdc!Ka};0P zUV5PyzaLk6_EcOPawSh&x~xnU%EN#W5`W|^%1x%^akq# zfDR(n4RlbRmsd+tMZjK541XEU(nW5DVgU(h*GSr`_E&X6P4+*9g5I!?dAJvkqw)Vc z{zoA{_uxOWzp7kNWSM^)6vk|{A$5d3IRDZ8OFHhkU`1gqvjCk1HTmDMCt{4h9Siq& zfz(NSXwpuoHCxs5$ZCrBN-Pomj3GzyS(2Wu>O-n$R592|eu!vt+R{57YdpW=6Fg<; zB2ZBH1mDf*+h8sihojMz+p2B`HJE?QmN;(paJ@VfsD}~qa04H(#^*uySe5<_dTb2W z;(bHfGHPnwlT_DGezpbGT;Qc&s{I`8XK6oK`vbLa*M7YAE!yYmG3o5neiM8Y={*lZ zFXPL~Rc|5VYA_i0P9tQ%gRGs70bn{=RtR>DlVwr9_x?6f^!MJ=y<=vld+)74bx-$h zz+eV>e|aVN!AC>TFI2AvnC6{Sl;L}jZ{;}9CP)IEoUQ5wpmVK38JWib=sAR--wEvP zMkdtE4J$9h`g{$2jl<5Mfcpo-`h3pEW%Uqi^^#rUPa!}2W?LGO*sv@;CKs%PdDQ5>DF500q`cmEedWR zJP>sSCs8+Ii>zvEy#%Cgk_WZbRg&5uCsVg3v-`(4L~wGbll#f$!8mLshhwut?C8&) z{C14mCBoPb_XDf10#ktnaB#!~r+&_h#u3k#HgG3Sc*+?1zWZ3%uy~zf#wKy)wvz{a z%=P`?VaTcjcCd?QeNwXOK#qF;xsU@piRQgZmFoXHJ_ zunj}(*Fj!Ow7j}PUQ0w?LB_D3NMS9}!pfkqmTcAgf>k0WqHu3+`W0O2^V??NA ziO4fH4kXGxjUo@+788^l<^U^L5H=35%K1=Sc^jd=a)pn#@OW(%${JNPzH1EVSXKFU z?L?U6OEOj#F34cPahv;n9Ef(u;y~rlK_7<{DnP?D8v{dhiUp6yl+}H2|qli=aYv*}o;9+r)htj#SsUgNV(Br)^iHZCxm`I>2+FeTJ z{346(j=nrS>$QIJHxeD<-wsqTe(R0!Jk~`>qruAk)SZaYV4V-BW)RYS90D*?G<%+}HRvkQqy!<0p`cVW!9%SF;vR zzNB~EGK@Jmflt z63wro7Naf)8i=BViW_Jqq4K2lkID2sv>JS7dKcBg!<}_}t*yQQ*`}6ANVJWR!Q(7BRJ-4oFzA)8$>$>#32DIm`?6XlcxHw+5mAX?R0H)sL zueo7bO(wdtO8KTHdnW0qM`7L^HxC(e480mA<*&!f^r2g9zFWZ$de9zYyo2{~CfB+J zGgaQp4KrP-1_O>9Ded+#a$&3bC!dB{`-#j>C0V&tYHZhHLKkDZ;|lV?u5}WC z6yCVwq%^^>R)3a1aXb)A*6MHUVzzjfnFmqe4zCzA9qo11$B*_-sLvYhT~c4e>k_vo!EQ)AY(%NOr!-Le7-lQa` zoZuR%T4nXen%BQ}ArdUFR7)fbE%;C&4|k}CJbAc{4_FR<4w*ux7ypcC7{AU(o$Lez z$IwwI0iNlE;IV5ME~?87Q9T7f%-TRwXW|qY?c2D!`(wu;Uc*KfH6>b|3Q0LUnajC~ zG$=F{YVLy?Hmnyd8^{32eOtsb6DuITn(j>+3#FsVS6^6EIgbs?xu2uIVZFR0SB0YH z!yEmd}wae|MLWnB*KTSzzvp*0m-I0zzYmZW z?N>32_sWAV={fRXl=N0`$2?zvXu70(072!sPn0}QH}ZTZfObmy^ej*?mGr&j$%F6r zwp-GN?liL9Zb`31&L=`mwo}qqLWg3Fm(uUW$~VlqinQ**u4NaVmkoVLD(T$zDf}r! z;Va|?%NDhua-&d5Tilk+uKF-WQn;O`YTZ6472)Mo$lQ{GK7a-A5QwHO{>}DE=Hisa zxLxrvs9QiiMKjq$Gnwi604K~B;{(sQ+_5;*^DB@m8deE{4hgqf#d&J zzXprd-I?weC|Cbh)7xM8mfs!nKWBRTF4jE)yZH7#zGZY;VhFs=SBs2SU-DHWUzMv@ z<|3}{MWy@-La9QI*Kw*&3<+v=Cd1N}NAyhC>RnFFXsiC2`7k7fiI! z3=x+iB70Fuk}m@r;nbyHghj0Vs8O&Gf;qo;2A0?{a`U>I0-exC>yjD%9m1RU)ZGhs z(8p^J@o8t>GwSIVK5ePnq@I4|(<^nm8S60N)ph?S{5#JgZVMktSxmt4cyb9d!&-P3RWa8$ld*5RcpnNZyAkA zJ~q!wpPSUdt2NgU-MZ-&j)&{vehsP(*0q3+Ln5pZp1u4sWJnBhDCIn`88{tI-3p*Z z2ud-|mRYrbiG%T2 zL?4YBUV+2)$g_14c*i|oGt0KB@od)KzfPvd>BnK#X>ADAZcq^nQU%0=Ck$f+6(75Jw!k({wbUcn;fL|K-Z1k_gsZE@<6Ev2^Q-Z^Vz`r6l zwkma5C(ijYqLK+Gc_r8v#hNUyl zhyL4fHry<OJuY~;4D8J)aD89H#b~K*2B``USFYYd4!rBdL6zrFBGp^>VKR9WYgik?w&DCgn=iUx9u{e>&)dFAl`GwRW2T=!$ z()hxfE=gL)AraVqg?qfzu+e}9U5py`8K+b}>p2ST0zvBsmx6Dwo(pIc(OxB*RDJ8i zi;Ogn$%FhZLpq_d!ssS5gz5^SemoVZHlhZb1yE^NNYC!i54H^~nFMBp0-&2h)BeB& z1`LaPx|%ihDm(5Rzfe)c% z>Utw!E%Cry8T!M}+MU$rHs{N@Ie|r{s*BkaJqKVj9t&6nXsh!eK5S;EcxM)|x7f@n z0X5VHdCxCz`Gw&f9)m zs$^o=0F{5(*u!jjz%rrz3qywum?aPU`9Mxm)eNXmQW_Iaru-6y<@P^XujwLe)&|*3 zk=U0C-9E$R0Us^}-9Bf@LoYsHcjRW!^=t+;exQdHuW2+qeE;}4ivI(+tMR_U`VOES zXcK`rFn}67sEQsgv-9ATSX?f}@+9i-Gb7n>*pUWet&|E5Mj@f#q0Cr>a2W@g;$cqq zm%|3!4QjUPUr`IVtuSB-AD7i*PlNfa<{5uZV7z~ZTww_3*Vb$7lHHe)T@2T3ReuMM zvN$ClB&sR~kLpZwKA~W0vg2^Q1k(5nZHJinlLMkDco(=D4*K$8eL7c>5uCbmVx0*L zxEuW~k8*CY1r7gFA$N?_1ikO^CC?PLX36G9^)`g0Y}gH2@Z_r(s zOz(r|zZ+FTO4`b-p|it`?uv7uO2SV%q1v7%nXsM%MjEVkxQ`+e4c5~EEkHJ#&jHQ> zbnmFze>}sG!*Ev#&OtzT0tYLFvS?EuI1?2Pb=oN$42eIA(UlFUNv^A+BvY*>v5 zuQI-l@(9|Zteszrh#A3%gAq|-7|Z8Nu3+^0jOfibgE6t=-yF&4&*2Zt8$7iWcLqy?=Fx$0Y%42% zgLN68_kk^_>lJE&Lj8-NmcV^hPzwQ_aIO%>Ctw516!I{IoGQp8;j)T0Sce1p&Y`!d%3GI%gJR?daT`Gwi&}B3ZpGu!u~=1}fq?X(TW!Am;1Qu**Z0f1{#Fh< zkK;O%nDCXWCa4R?$>@;P6*{dyB%t*AFzaN{v{lpY2H!+1Q}eis?T%B(1?%9208%)- zaNvsh&wH`PfO~*xzd+afe;x)LD8}k~Z`vwbRabVoGTK-SQD6c78fs>USA7gQ-8&Pq zPx@&d7L(6_S-l(~Uqt0vS*JG~ZsgOjq$c2?50+cd_iXI4(e}zlNDIqnu+1^nPBZXJ zWu5w+U)V`4^{|=nnA=#Ku7km))_Rz%jaLV?YfRN0T!O1tq1l8h*#%-2*C+{5e}|>9 z5p*3o4NM17fg}w_D2;}+dc?H^E``F<_IG%&2_}NqU#4cvLY~^K;2tat?=ZsH8?ktNt4qdG}rp{ zehnEo%i6m6H53$jr}W?a1IP#qK9!lr&7Y+xd88C)hfdG%#$@sNIOF-i9M&hV)O`%3hgomJi*`PaR|pLMXr|%Wyykf(LDBIo229ha zS3P_DU*cYsy#E02x%?eINMa@Id>VSWR$I#Y@dNouj!-*L3RRJY{Xg~su>bcMh6iyU zz{Sz~UGShJWd)1p@tmuXyQc7)C{UP@r<2h!w(}WSZ&EeLdAr{N7iC^V&o|=h>yXPF z+y;hLmjx5~#3OAs%e=x=fDa$DeIfiA+7m4M8-jU z;4F;nQr6E#?$^A8cLCh8!}IBUewNQPZRh{_5>PV;4X zkIOj|sJ3DXh|k$O*^HDeHe=f6Gf|DeHe^PT2qhyl+-_7>_CI z`KDiyz?%9^ znTmySVS!20a}AK|&MuUoxZDE2;;bM4e%>}J(h@csW6hQ z$}Rb-E1CKAa^mAMvi+fue!wCGP(;HXmE}mONsj(^op%xPcFgdKv`JW4#b= zx@Q+gaZMOp-9UvqjSAOi{Y8|gwG$8;tQNSOZ8lhceF(#6qwI;Avi@m2u3@O?L}cod zOwS)mKL++;f1pAkFI3xw*Plvbylxyp}=!**md*%NzHaZfM4$?w7Qe|0i|+sb|{FKb8TRf6UK<`9}e)1-b>? z;}#000L(vz(HmQPK?WlrgQ4mXW7?|UMHC4X#qUZK+Z-|PIEL<-w*&b;@E1glki|P~ z-udEumokaCdsk2b%iy|17E1vYDp^dP09g=T%OHQzJK?ejU$0!a-vLdG`C6*?4(1%T zRc}XAo(;3$6?k-bwfWlhU8KmzIvgG`FyS3rgf3($*CugB%+(Voh1{2>vA%ua`1yl_ z8*y@$o4A2eI6OsEy$1k}#lw0Tl(2+fj)Vi85M=o7=|Sqgd2eFhzGq{GFLrzS(2tbW z*anzc-I^&DWjDk0AD-%g^Og$d_6uytBHgsA{Wf0xv!vNK+p4!SC-%Lz>Wu_E+f!gJ zAl-L84$AIzyz?EVHYuJ%Fna?lvN*TT6Q;%=6*^R0e?hz zvV!-(jO?e&F$ms`BdArMvQ^;WBY7ym1I^0r;o;rXPgnCGDQ)YzpUZ@LJ2x6tp26KC zF_x#pqHNV8D8isjU42G-dp3>stay*i0NzQM%m99Wv}ekD%hM~j$2el%#=UYxO!qWq z_G=pLoA=(zF}^A9cNy)QuoF&dQx{}0H2!q$KIHJcw0Ab>;H1SzcyR5l!xsZS7U&Q@ zi@KYyDgb;$028&rA7he)x#DKn3f}Er7x)!2geDTmUJaMwAQ6YBI`dkK>(h(QA2rhGiTacQ~fpj>98V z`aHH4XokZ*ntEIHb5LM`H{s}F{L$faoyB6rFa8|ZFtLdW4dR1X1`6S30qg95^Q26s7EDG^Q(5tAC_?U z9wLpl#gEG|dnH7Q|0DN$Tm#5SseFA%igyvzki~?#RuB)c#Q z`b#{mWgeVwZ)d+T6(3wk)@#?_quMp6a1Mr#6Ph+&?HjgGW6ndX2|R*44BDAe2agA; z#@~$T%!xQdT7e3x_f~OIr%2~kXU?=2%@a}EuoHceT3~jajE;y}*0cwRA;y+Lpzeu# z6YH-H);Hj0LYFpJw*uNb96`PjNn@eN39n_4|FJjzXx;EOxm*Y?LE$z%OVtN&4~|EvH1SN|*h{=fQP_5c3`{XaQO|BvNN z&i5ddxLN;;>RQiUA*BENQvde`y4L?XP7uj|J}?aZe<$$%C-lEP5t?;zd-~tmk^U#Y z?dkuYWP>r9{=Wbjf&Q-%{SQ~`e?W%*PY>7sTcQ6iAeTO^{}lxI*HZfWrQy5DXg6Jq8eWkVil9pU@Bzb+Gg%E`~cPr~_m0$cmS&x*GE z%;nGl_OI?BKMUcaw#wlJP|F)3sj!5UnRfvD zasE~3A|@x@MGzrYRWVzyCz%VdNNJ4EM|OR*%<=)c-PyGRJ~vpD`U23p3 zkgt((Y?3v-Ci3H6p>V7cz}Drl_&^}GWoR~r%QaVGZHlWkS7J~$g5R#=W=X=wC{1I9 zj#g5z(P^tX6SBe55X{wH4&MneB;XC~sN>A!N(dIrd)@0G=Q`Mz^ndZX)CgM@kD8#0 zrh2~3@O;Lt9g9B!-%o=W7u)b;G(^lFa4ry5L3^{1#+|i$Igb@Id8@C-|*fXz=wU^4(8K)V?2xO;JP?{t~yz<1`gAc zSd+Sti{v=NB>O!W1F|NC#(=Fk14B#XKzF~>21Ra6t9{!rIaTk5!U^r^1|S(+J9pOO zBZP`gY&l`P9hkyFH*yzzdj;QK2}hQWgRc|#8lQKCqP7lzs&(L-e^>@;unva%3-Z-q zO$2mqPYjMfz++t>K+V|Wv)++o2yFEbl*7og5ZD)igIb$$ZEVm%|M6!7fpfH%q4AqP zuj_|E=7qHtL)h2OV`_1YUZ$}PE>rVZw*cbutNSFiqX~;$a>@rY2rL1*y3W-Xts(W8+{XTx=X% zOwTu>W)w2kw;pN?2XLL3`$|QyRsV<#1%8Fo-uN2&b>aS%C~x&Cpop~;-ZBM`SWA(W zq*N@Xq;WOnCN?+ZFD`}4DfqllU@yeM2U~S#5X1GjGl7x{v&Q@IMH$YKKU5}r)x24) zXB-PmJ)V6d-Io!$o`Fp}wTQvXr3TDf7Jy|zqn6uxY7rw@Udu!3r!b%!T+XOh%NZLx zxof$c(K{;9(0WE~1`pWY4(7}POGdxm6<>K?B6p4*8djG+x^BaM+tylc_YU3Y{vdEQ z;--4u3f{rid8ahg`amzP53sI5YJvT5^!mV!$VPL8Arps|iQM5$#yymHwJ4zEps6~32W}kU>E2k_FRnU3blfKv znCKYL9jJwmZgd+r3O;b)g9vEC&n!lz!+fj)T(2T&Q_+c|;8!s23h-rHB8d@wL%TQF3%C};GvoID@+ zTC4j2@h~VEX59`twyIho5_jNsyykf}?ga&pBHt|!q2p{h^4#9}ZQ0)pooD;<22wH3 zvo$TilP~EM?CIci(ww^!LI( z1FHG}cJn-MgO8@{q2U-$XY(ji9h{~Dm7ybgihJxx-4pjvH8ZvXF2Cjo8#sUlQ2M?R z?_3V939n_4-?bJM$lDo`)#RUUewg)_>)%kmFqj0(C1@|f_3#PfVcZYLioWXsa!?~x z98K_amN$ELdfrvAZqa*l#?a5p{?xo6q`_!!dUF@NF2Bj)9p-<-h>J$W0Ub}7rVkxs zpWmO~a^SfYe1U);VjsR8hSt+PW3ae~!P2qrHKDOU^RwvEXtnQp5TiQ#khBe5UBchZO7A->b+YfRo*ycp@bbC9 zi2Z+~eAb?-%4Zlki7cPT5GZ_}g3u1i=WI-1RQWvDi^y?xx3PS9#&)=r&r5*XmXECp zb78#483oBs@ZeGNJdC}UNdY9qA;`b_ZLLi2M+7~?oA5K zfd=b^fVzN7IqG`6!Z}57PJ&A&8>}Y)Is-V~Br70q_um#GEpOa@dcF~lK$rUWy&^S$ z2O;Xt1F9Iqt2>tv-y!{f^dy7Ue3L;cOA=DSoQ`{#K3&)G+@EM(no`f-UG^`^8ut ztJ-Y9Fcu^&xOZ3!j_vJ!#dJiV`AKQRU;6Lurs~MO|3tq2xwKaunr zSjeOGh_w0g^t=T{{xSpQGsO~$HU&DGTe6QELEjp&BWyZncn$@%0EBzZ8H{JWzJkJ? z40n_i+&DnXAY2ZuVLTvWOgsdk-tLKTQJ81Z^Nna7io!hQW%gUG&G&=y&*&mS*@EB( z>mLgY%7*|gWwF%(=Us*K3Esi}Ll9>dp!xpDHjO+cZYyJ;k69%-yTk1*7qkU z8;?n+h$6TOV?D7Ez})20gy-|j=viiQA-4_S(s^Y%AQW%fKbd{jOUYKF8f4x zPk!mwbm=0ju9$0^|7s!0G~6ptrth=6@>uuY${c+PcdX>-13=dx7tLeq#?!ObO_cn_ zJt6pU&k6ps8sB4m8jws3&6dmCueTLI^>&{L7xi{JJ>Q7eIdHk*1*x}zOzCq%{l7lH z44Yun?YKQLWgM#8@p9NIAU&|>cO1~)Mg~HvAj7+0wj*zBQM#`yzR#2i6Y+1`Dls6$ z2x~?YP8Z8~{0jd|@ghuH)%ys7pmDU@g%4Y1$}zd%brmJ}4F>KS;7Z34(Wv<`A~`s6 zAY<6Ajb#sGkb|@DnB?DT$7`*lI1fIn8Fs!$EW1Xv5v9BM9v_vG15TM9ryXZvcubX6 z=RL3<(%yNx_QZ>#Mr$yiI^XajE8`@TYNqGg=HoZK#>Z>%i01Mk`$A9LXSbkPcK?EI z5@8g`)Jsqx+hO_$iUg^zQL0(gsipTq0+ z88RNhr&59289FOq;Tfn_}?uU zochsPTA$bqRt5K6&7VP!b{3qsdwa2`ZOsp9W93SA%&iTFRp15d|aL zVa*q2c(1l+4*gd-FHW5j#9kT1&h+dvi?U)Y4u1V+vO4 zdgDyZg0wmsMcv9vo?oEG^We4|pqKg7!q!2aV_-I705lbPka~0$e_|1Pld|U0GY=W? zl{YJ`yQpD;ZNg2;o?L-5?P0qDUw~8l;wdt;f z^5R^)K-=wx2U*c^^gspq<~%(4y1(96IzyC5E(C^g$>r>AJ=Uw-Y

Nk3-=#Sg!!| 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�jH} zFOz6qKZZHcb|;MVc^EqX{r}QmCej~Id$<2!gWd=qm~@Zt@`&?{1$_^G4nncHO z{}cZ?@V$y3m&S-+jUON9I*8xz_{C*tNjfv^bo^R4VWjKzr)vHC_YyowS;s#vnWa+DL!!LxhFyKuhdCx|}g#qSC~7;f#-`uWTY4j7{V~Qr&qZtf%Vl zUR|4QgeGD$>!AN<>@POLhGG-L{CvC*PJ{7|{_fz~EU*j)3*GkO=8D@z+#+!ear;7A z8V)E<4oBM~x#y0MjQWoZj;ircqF#dZr~ zE5TZRn)|&gqp9xq`WBm|pLj#pW4JQ}CxtT0!65nTwYrpAmmoKbb9x49hx*d64jia0 z@?Q>puFffTFQsmwD=GtrFPb<_qDGQl5Y3v;GE(-(zIF3`pRULeICbmS$KiIzxi3O? z8)XS@$Z|zKg5zF_fr%^fo{$pCuFw(xEJ%-asjRM^gfy0zpW49!^wpN6XFe8OOUy`g z9Cj>twx_}yI)63wijGJM2~ujbKi6cjBj#F^4F{dQ9W7FEN4u!lqPdQbMSmRG&cE7= z6DQ`Ew4Gh#L|SV8SZtMkf^|t}|3C~_qz6-Au@Ze*aZa&R0e5IpWgvEu{=h^Tc4^I+ zdUFLbc8QTv9oxxQ`?{iS7mI3Hd{o&LZMm50p+qLiugCJ`$TI3aD_d}egO zngPN+fyp^I#}#}4OtN!@_$FS662#XW8Rj||8*y!jean{(yP^Z-eX-HLizG^q3hW*? z?ttj4yz55aB~l3aE-@q3z%XK522+G7Lto7Ij4a;83!@-V zs%M=&C^B%w&>vqBI1IOvbNRPh*u6lXyILwrW8ib=^WE!g9m7*9`#rxIFttbrJhZ}esB3&#%*9PRJ- zGGow4UWEmqOI^O!(X-Ti7aPn74&AX&CCBpY^A>!I=ZE|YqdCx}y^#uCLQ|1iJfCZr z*C4fhAQ^g(MC%-F!)8Gp1jNp?&J*-M9*o6gNiN!wEl07-4M-7Eg2tu6dbldI*L&FR zL>|McrwZ660mxh1d$H3NMOS04@dnl-`3N0<$#gs{9-e$JndZ9jcYng0Ea$(`uR_jl z{NBZnSo-`ioWD4KGR?5$`=rOgieJL#FPV;q(VvgsatFifTa)N@p!rJ52HUAzb}#F@vvn2Cfwt141V$Z|8IT9&)+$Y ztV`hg@cXm)85eot@snO?7z_YCDZXR`Y+)(HwpJl68$b{{*uFzdH**wmiFUirK;QAF>|Ot{2urHp$KC3r=kQj#&8kNFW8y z%i$IShBb>{dQu9SL34wB2biMg0oh$4Wd$Xaxd#wA=ZlfpOhBOAsd+ewf#;;UVwywM zu#1Ve2}DECEW)W7dz?i7%k*O_I@?^+;iyse*`#K859{O>5q2_0N~JzyIf>AK46oH4 z!h0YR&MP@2dpI;jn^-^5arVB;XuFK(>T5A!N1sALkbrPsDilVcGVbShT>HCD7 z?#M!Wg_1Ex$=Gxc6ZHjLm8j1^ji(GcOBjY#zmtg#rQZh6&i|axzYJL^>xul1#8WU5 zP6Kqo`$J}9$wKcC;)!s*!{dAsLhtZ=g?O*>ISIYP+dIXRCzkaN&PNMEGZ5%CgVW&| zc#uH6$H$4cU=+PjaJXER>@z}qh_%EHm+Z=AqDyu%op>3EAB&Pk==ls3J8!6T=dvmU z=WSd}kLL-0W+uRY1HKwxB<62d_m}6hoW)RM99IiZlcxzl;6=M!-{e*~kEF%EMQy;L z;>id~Fb_K-gZ7a^KpIFx$|Fq?%yhg@W^-laFmjgl z*=Zk<7xv=wC%2FGF9=s{-CjnfTD8XhQ=r2;JjTa20Myvq1QlJIw@s$CoGRDY zL&a*+ip~RkS{?i?f%6pqlN74ju)J+iv%z@z_~oUm_6kJ#hN4wo2|_QwpT*G{K1z1j zcrJufi!9t=IY1+R*O?gnw)R*!3yT&MkD0}AxE>arv4q%^H8PrSQ0R7I$pB|X7gl*q z91;Jqn-MsGJv^i7IvJDe#g*QaeRvP_gl@RTNcxOQbSlvs{)bF>YxUr87CA0twp;*n zpu6ECxHY~uN)h`V1WFmJ_clD~x8l!?SXvJpyF?b)=X7E&A#pqGRv;sMOu|`@cccFc z>_rukJ`hz2{T-G{rX%TwWzMFDs)eK)6p)V-H3eX`66QnQgEjomy9rq9?M|naXI@ z8D}?Q?U7+vshA^SOV{5@lr(qnWz06JEpC@!Lv2-tGbE6c>ndF9$Da9ns@;p!7E*cl#0O{6 z>m%cj#k9vMQ4|)ZjbVw|#WHjUa@;8{UnH5LYW8g0coRRqIAH;POYn>DZzt*(zfaT` z&&%2m(rVVE41073ny(TW8)ILFw$pbO%DXQYA+K_^T}C_u+$adUaEKIBwmhyBnCaDk zb8g48oo6!0(uVkfN8!YYZuM3IG`8c>DX=O1P~yQ(wiLLZ*!v^%x*?Q_tp9)u_t0^0 zqY5A}F8v2qjfyW~y6*Drbd;_MEL>}Sogl1Wi(WqQBuQDG zQUONEfKlusC?M+)k%7D)%6tT&cr39w6kf&^rN!7B#KY`7ON2J--+3N(8#e^jrjY}=YqJ72_Z0`pTuBz^U$6>-R1cwT9 z5nW!5y);Me{v&?3R^2^G-Tg!HHisnPP00YS+2$>xIZ4`KzY7&0{n9x92}HygfySX} zuDbns{Pu~7+rJdzc1v};ar}0Ma~scSF^1i*=A*BBrUDd*XngVBIm+f&AKPe?v7+cyN{gB3&Wa_VZ=VOSDlTp&UnZa zT}L96t6)v@*4ldzRkWpj6khUt$*|CMq_Cqv>&AJ?bx=j6QBIWh7R~Ny4~4F8uLt?O zB{JYfW#Vu=k?Ba}a_H`|4RvS0I3$u;)0%f!(Cp6YPN(>t^LQuEJmEyUmAZ3pT-rr6 znR@MwU5hj!Gj5CD>xO%Q!VzN;8Cqwn@K;dS1}~*lE3*$g`$>qCp$=0rL-^IVp*m7- zD1S;GMeeZwbryWgXwL-W+Y}SZztOq15Vt5|B+iK&R-5%KELP!8iHm0$)N_mGc1hw9 zlrJ^9DnHDkW@^1yL9I5UsI*o1`tjLl8HepODrRa~ifzB7rEvW5*)FYPD^P3^(XP!^ zDz>i2XS=SB?OMgQM6n%IY>ki4_EH_&9K~iSw#iD#Pj6=uk1xC`92y9ZC z(da$MLSkx5d57h>2a#5OAry*3Mk`37z3HVOXMrUS>8T(O#HI9BkV8pQ&Q_2yambYl z@*s4NOK~Ykzc{47f_$5#?l{%PLD&bSCCFg5k09Ot~lg=1(}@$ z@hQk|W(@5zQ$c>Ztxny33bHN^nWZ4_CqX(Z$h&b!6(EvYyM?;*eEiOr!kj(=%tkDQ zTMo#DJxL0EpDii(#ThM3x1;@E0Z9)g3P`YLQyh||Ag?e(tjwTz>9gSB z6#`?$OP>U9IoFy{kBSw$7Ei4U?0DYykI`gLKPq14S0W{U6ylJle+_IgMHu;K??)l z07Dr6@Z5SO9ymwy-w|Lwn{4NaI;tyL#BSBfza0j~Ac*Czkay7;$JXLZlzE~)<99udlyHqD{@K zt_shStDfpAcD`H{sjK($SQ zk10`!dU#koQMD>j50^NJngIf;eT!gZ$5p@~JGQ~(k{$nO&ATc)iYe8~-+`=mvf~}z zP0o&!2stJ@{_R-m%hQyl&Qg}D842!?HW6__fw}Z7?FR9TY|I#^DiX_d>9;Bps}<>k zgv9Wo2xVLA&MPzh@AU9;=_|w}rRwUG-g4DTAZ=X32`M~GJN3-f#w$tr| z9Al>;%o>!ax3PM`5;av7+uLuJxL$<0Px9 zW!yj+^{2~rG>aIeY*We9!tsi`x5ND<5ahn%SZ>(xdB%=cPyY=HZM3H)Nt0QCRk#<^ zW$2RbNPEDM*8Vustim0L+P+3gQsMVXja>}->I+PWphUS8Dy#4--ZQmodPy%#MlQUq zxR#OYr8rlrO4xgf>y2Z%CMvF{$aQO+>sP916`Wgp#PKf%=|b+ukyEmBwSsjFvjg_3Ykm4r)j zr6l-IVGgNsm8}xj=z0WM`Kg4XR89ecufBFB)`Mru>Q#I(Fw%;bA#Ga@1!*n89M*KW%)GGH6x6fD*h#{)g|PVw_TvqN z*>Dx?J5Zkz=2ftef~^!-WdimgsF!<)pj#Ef#;@dZ$T)toKT&KFq61dMMMdx@}F3btOsG=ZfiV1J+q z4g(gw1)|)^H$!n(g)KE6+UJ_ zbl^meTRPeH-jfNbkUft#3Mq)+Q|Lt@5#9`KW^xtiCf&LReV4u*|V^NVAmKO7w|gZ8=;n!G*QO zpziMuv1e24LlnDRiS3pUdv-!>o)WwB#)Q}ns{Oo0#Eya+6tOpgnn|&rAW?P~ie09} z+Fj$?e$pwf?beo}?Zb6qRsXM@EMi;2>LH5dM;`5=6np4rDTgf*Vh?nP8^NW-vOVG-j4(%u)`$(u&Y5GB5aw0J*Qy#0{c7Mv__2d0#J=uzn&zl;c#9X zskpdLhHpQ>RkiXEsBg%1gA(3N!8QwQ6WmKhIQPra3AIC|DB(no+(*;2dEnf+lGBp7-X@6T_v!- zaN7#(3Q)HZHebOWQLs(|>i{=fU}uAxL|90{ZdI_x0&4^pgA}Cs_knm_CSfBLtXRRm zL2y{x1{b3+P+x+YMOZflYolNb1vVcpP=LJy>Pf<~6s(4wovA$}uuuZ_0H|jO+poSF zxn9BeuCK5*67H!I>2Odx30tRNa}~@jux<%h0jNEMy{usODp+fQWx>5dq@4t6KVg#z zJEm&%R$RNTp$^}{Ra{?#swG!XB|JyLmI~~{1Z)AQ!-Ta}us_&ync5QqdkpUCRN7}2 zC>Ps=+J7HUhp^%rE?h$sT!TP0A=e6Wq5W5|0)btUfaQToBkWlP`#MW>I7wg`a8({P z164ym8l`$XrRnoDUJ)5cBA+WJ<&yhMh8q__M#;yR;S}AE)2+V-1q;&`7 zBJ3?CZKjfTw!qrK{a#FdI;a_dMX|rBjZ~P})lBOjaFzatKsBeR8LsU_zPSGbr9Hja8=cA2dW2QmV%8|utoxN z!BtiJNdFX9Kf-QOuPr1-iNEq{T8VE2|Go>ens&? zO7X@CNVDK7QwBjjOxQ06lFoMxbYCOy)4(a9EVucUdPB3ExA33B_tRi>-Gt)Qd_IKY zQEX1ZH*Wn^hFMaLDbfoNYyT4%9D&38$#BX_y&TBb)izI%a~cv_kF;6Y-W#yeIsgzL@McLcz7a9HiFWb|I~c z7Qyjj^Hgs0Je9rBxs6^QFV@ApE`2kN65JVo8*vYOv;*Jq>XD6yz%#5Kxo)#p4o(>1 zJwPpc;T2T9iU7wfu?HU#&vJ)*W%Jryv#K#(t{(2yo>x)KFSXJOVRxBKeubHg{hWr* z{v)pYMcjxQ0`T&-UhT0Fk5{c?A+(7cUuu&0gqX)1mZlDX?1CUY*qltPMZX~e=a5B& z?=3;0UxAw_G1vEFiMbZ;hX@aA{Xyko0c{zbB@BzqCWBS@G%Nvo9iTz-D^YQr@*yX{ zuy*-ye~GOAg1mOUissk8jOGB`3W;VfsJj^roh1y5;yv}+1q!`J(0m^W*%OXZ9YK?6pEH+dpQoiMW3d#qN?s|9zY3<<+!;S|iB}?O%h}qR+8~MT z8o1OWtn~$TCu5@%83yauKR@ke{o#34r*QesN5PuVIZ?1`R;2iv1@0Mz4B&COniXl1 z%ekOcF5irW0+q}AF{`l`rY3UvEkKaVlaR}~H7l}wc!gA8I>K<>C7On0bisvd+Kw1B(vSgQZ+j+N6J%d_>ccNWD5jn)>;iTnKMBK|Jat8#5NZW9MdrUtmB<^MR zAhdo_NzZM@>_}hRheag}mt*Z>Gk+CG7od*J>jD zLHybI(chOp4~yCJ8?njasWIOeH_nNUaq&%+`LCak6Crq0W&UgsXfM<;jmME$s^t6d zl8nZ9n|)c9*Ssg2pNm5!IfJ_5g?Fu%$(cMJ#=A#q;A+H#%!v163wasR3Y!wHZ7OAw zzktgID6D-3swtL1`6#@0n!>yNbVuG;Wkzl_S zl~oxErfhF)Sv-e~@w*tzfCS*ITet^+$p=%+hL}yF(=%hye^@X{mI322*$Y z0?};^b;I$(_oeO4-*@G4)d-0iIF^lOM}6(XTW|=+XRS72FhFp%mtNf=5bFL6nD8Nl zMFw6v9)Gd~FS17H68zNe(RTX>bmMMxv3O6=j5g4+K_x}F*MbbZELtz$NhKi-5ng$G zMfq)_Shbvj*UOvZf{$;S1FAgMa+DEj+5(LB=SO)|p6lMPAhho0VH9oqDcp49VDehN z6?#TMvHgNO$H|`?BtFTiDyGT0;4{_^D}Q-!dU#CIIc-eS;Q%t1SCE2gIdv=tH7P;t zfu_T2{%miGsc!ljB2jQNcxE$EsftY-qZcg8j*P58eB7PGv0KxR2X{VYI_-QakBW)r z0VsTrL2H9GS+vCRIAkdQF%)y`#n=2nJ$5iVgB;??XQk{j5qIPvuDW3iWLFSl<^O^D zah#M-1($Q;W(sX+uC6oV3b1(1AMG)afRCw+uDip!ZC`?57#QZA)CUFKz68-SgXLBJ z^725&&!y9nDir<5HAoHWm^GvVU;3zuq~p?_fOJM~g{sN~d21szSTc=c_-PWnOFQx% zmr)HuBMy{^$j1ndmrT0@Zx6+7d;RY`TUw(c78f<|r+D#8?rbp{JzKn)1B`@Z8YF4#R8v5Dy!(fposp9#f;;zUht|E?Q zFc+Xv-W}sG;cC4ch0N|lz@y~*6{91hB@&`R_TU0Xm$?w0cpf5Yyo~k@uk885V+}Ca z$YPtgj&W>f!Ais8%5I~T|Fg$eo&^7X3Q*4dPvWzoW5b^TzGd)c|i(tJ6X)GOt_haHctljvq zb_yPsSb?_!8^INN`9ruL=>@6B^75-z?;v)zpsZSLkpnQDyfbDt-k@56Ci)57hY3-X z(wAU5|CTF>zQ?h)p#dPqvF+_9CM%mqLnbL-t2dgPAPz!A!Rb8 z7zIX}AD_bDBib9((?aWTN*$l&)*%^&k&eQb%6At*vG`~CjwC+I=O2krC?Hrqiumw_Cdxdq;VUP7Vhk!;H<8e{hH{c4Z`H|?A@%;B#{^9ca^E}8g0{E0* z`2ZC2cvd}a96HKgK!0}=-eroX(3xL(c#(gko6&BA(V@zbjBfBQJTyLFQlHd|j_5Pm zF}DlW=np=RYQk1(3ba-!)yr$yI9r9cpyYBS^o&Zhbfk@GocaR}ASZd)BG%Xyo;o4& z#q|0^Qd;nWUdIZ+$4S{nV*MYs!rBkqmk|%v|3RI2A~>xQ$(Es_i>5w6i_#IMvN~Z zQ)rhFggf&jeoFzVy{f0O%YDpfd7@M=zt!o_n$?vGAcq^uE_01KA^gmFgHZtOlGziG z28Io3JJ5PV%Sk<$;5*^Y5iQ4o`Wjl|`+uPD{Xe*<68-3f3YRmPUp|9;bs7n&<{|A7 zC9D%rVXXsPWxcaO9i;W>i1j$;Z2=v9Ct-Fr7+leFLG&ll#u=Dm5^v@I)SZ!k4;PVt zK`&Hz3L_tc$oVGyAy^KmtHM%U(7J*bZKh#XH|Piu$1iAfF@fMyMq%xKxT+1E4r(P; zq?6Q!MrYY)*MI{D%Fsgk&cWM7p~*>D{Ba($TRupJ8|BDVm;D*OGlb8+Az^y(Cbm3k zjE#@S%96x^$d#;tA?+4XLQ54TQsAn>_!}nhDJ+clqxvmM1+|zrqEi-~5T_$=uqubN z_DVt}II#Z-S7qB`P#ameiXp+Uv}>`LrDlU%Q&mt@lhRpr|nCX0a$J9upH0i;usNQu&GV(Dl7k!n)J5}+XD!iu&FKMw6 zd(gVW^egD2d-U+_dU!(z-V=)$@IfxU{16d|FMr`1e{!w9{*|M?{*}}o8~py415)1r z`^j#`LSvT9HLMx4!HiFv-HGK#^*k&4KfEar7@f8L>TlL2HJ@x+41$s zbV|F!iLF-J5NWgJdb-Am%fRGZn`K?0Fj-1yF{vijnJk-Q0x7hVkO8WuYa#KxOqdVd z^+K4d5<hO@h8YOY#~{tgl5j`$4fk39QlRzrb^oNb9-o-<5`+hyF+ znOdz)`vXv%>dhawvgec3wosTDrS*?Rw%h7 zl>hFy4RO>e%t1RY(lqcPAIYayuopTh~Dq6Y*8hF9)c)eW#uA(aT zDjSr>E%c!EEyW_F)vuOMu&iqJYc-jJjYhaV$-6pf8BO&y5@usypUIQudoa5N z3AWlVrrmE7Pt+YYHyh@dR%pk|_^JMfH$hT$1*ZQA-!PO|P3%1Ne>04R{6ApS`UO5M zb?Y=Tvu?|QR@d4~m_##3FYh>z^>VTZ>CQvHFx}~Oq&x3>Q0k-4;yUB z)olKNpC5pq8yFTp`FqEG9rSYkM_XTb$nvhFcVXDkyq=(pDj@MSnMSi7(cJ20olE)b z{Sz)Q9rH6{&(Sdp70lPWxb`2JZ9X_o8OkVZcYEsoKG`JRVo@|544d5#nZ-~$6YxM} zlo252^wCH|rhDd>khoDxT1Rr>f-^dSXP}BeWxST3YK?cPu>3UH=0M!$YeRFy8Z`&k zfHl*HrrN`3CmY)1WP^U=_Q*w5PJ3)&^MLmFlbIy4P630M)0J?cX^-QGy`uI|FkkQD zb0pbDv#zxXcJ@(%uLx}e?jZKO5-6|@SY@PSXU4JV27I+04fqh{CjO*VWvlJCgNX_q zqisJOpwtQ5Utg#8vlp~e9~vcZsUb@w$@B>|bP-H*Xd|VrNy+J&vbfB>XQ~^PPs4$N zyR?Y4Q^nE#w+XPF54K7ec~IFl6T7{OKhe#>NS%Vf-}Vs~$`yTkw6ugv`> z>C^hoQrZi7!@8Y_X1(>Ta>**YP`xvd&~|5#*sGwjP=W1E4MhJKIwQVH%@fTUXOrfb zq(>9J1IjTci`ZNxRWM)g%917z#?10R8zlrbgop^f*H0?dIJ>jQ%pYR&;HUZ0R$;csbYUyO(vD z9?`;mhe3HOxIq#n%cRBPOpOGGls~ol{l*mk>JF4{DR6%zh!LN^b#llCb6AhNn#o?awBsAz@vP( z>{9oOP-Uzv>_)12<-hJ*jVZn4Ef5e|2k_NpiaUF118J}S2p}PEoX$k0K7~D#IP67L zV}H&_BqKcFW%|QRZi|cNf-yp+^mPrSFit>P!?G1noT1L5$8a}^X;oW{-G%>;GTsH=50}r zL~|CH#5vai%lR6Gj^h5$peXUf|C40B%IUOIAe&PIsRq4GcmHOKrkdRk6^zc=r{0M^ zEZPr7qoR9FbbYR{GToElkLdY0%sXSs>1_1K1cjUSRHkNbkGZMjUbczH2mP@uah zKhPN%P-rfg$jNzYR~WV?0hwVM^r8k$?_qeu-9EH3Wr6L^a;3jima>nf>*3ZApH^90-2`jpp0q%+i{h-@;|`t$vk6o&v_PO_A`V|h_|rb&hiY|#!8&3#*il;> z3lrzkEXiC0`4n~+==KMA_-%T4qq+cL^u1~hh78*{9juaJmblp4yd~++l&j|)K+=W_ zpcjZEmC#F0cg=0CQ}aI}>URiz-edny>;}47yHH!Sk~lWgfbTcF%6ZU$PbW+m@F~QG zr@_?%@g0ZJ;J>6tQr@o`V@&oehStv(su zW;4n#870q2XSAPKRSKc%bZ+cUxup|B%(cqydq!Z>?D#@`%@$*U^Oo#YfD2TeqLwOf z4q-82-7Nu;?e)#B+#W5QXj*p)A$vlzgP!d-R7nN8`L?nj7)sBIx7;ov{RMvqi#v6-q^r8?9 zJy+YH_QN?9d5wE+22LI1Pf1~og1 zf0jb6x%w#GmPYzvkB2>d$hM_MXBIVv?kiqM_j3J^I!-Ns1zCml(^lYog>eVmufREy zu2k!m7jnLpd8N9X`{?^J)~m}4WOT7tRsyla%?u?Nb7BP7*k#)UC(+zAQ6ENFqOW;f zemJ+;bil8IA1lo7XwZiQn!z(OwOLaeR=-c=;jCFq*(8tV|H^rZC(X3-g9#cDH2-u1Mn0o0O8@158}E}>e?22nfD z6fuiSE%?VF43b%4Z_I6U`^;dhC^dN(4Kd}#ip=EAByuvUy4EI;Dw?@r;XILFa4!vH zNR;_!Iu(3DlMMrR)FmvyXoTjg^&T0$mZU4o0aaL!Lm7|SO> z&e4jQs3B(sqopq(&Z`yu`-&yCjvkCGFoEWwmG<%QPn;?0x1((huN{V z;pBUtNieZK!9B#1BJrDb={GDr-rXLUnP=gzGVo=Dc1R2$_7w18xd}9s8NbXPG?{D@ zoN5xBLTC{`p4ib~q;;y-Dzg~<|I94T!2tF@FpFe)4#URq3NG_XkC{Y!y^*T8CDAa8 zwDywes2O>Ac~_zY@^UUCgc|zj5iL9gjg9~Iz2-*d*2R3S*Zv!l3>Vz7rs61jtMlka zIt9OOOLPCZ&E-?}yEYhmZEk&c0*JF|@v&mZ-`?{%fmciCh-P#|m8KjjJ#3 zh(_hD;;r;JZT#%bLembiZM@ZW;VBuZmh1wNJ<1@-ofz9tjroUf64Hx}1bzZYHyex1 zCUB6!LfyZL?T2(t1FC7VQ`jqfg6#1$*ThtoDXZypRdCKQRf_$NK-J>5YLOCI3I#Jj zt?G4NKve(chjBD()Xfil$IEEW-+7qHVivmAJ2&W^bAp+^o!3tnn|O`z5KRy>hp7L; zXv5$~UR?nEW-AZZnPLFt*K3~vypPxj0amMH(~>4FdnqN-vVq9o)kE%P$vdJm#`DZT)l+(@6^dj{`Y$DGvKpa}{QBPo6OG4d2wMbVYsj-7VPc0-lcQ+;%u(1$qjPf=yqzlh|Q+QjdO)(EzCs*<`;yP?er#gKQPAjvv3;uG8E!Zh)+bFJ8hawlcocq%~z+c z{$gCdybr61IqL{*IV*{|wj6`bF&6Bf2JEGJu;+<+fLVor_P3=W zd>4L@+Bu8tw=&E7OaT!29VY$n>(dV-Hr*D3Mj>$}2)$?_`x(fhddLD|586tUx(D&h zA9W^L$m0#b3Qx32ea{cnsVQQ2uw>|$6Q0}?>b4H{54@)LvUXZ`;L}kRoMGS zW}|Dhazy`Qp=%8EJA{^u<`H|(wkyrR+M+N(q7*0AED?Xq3c$W5PS=@a(od*QKZe*= zQ(EDAuoT_?({<#X;p{p;9?g zs0^-cw*M@AJjqQ?LBj2w5ZsYfvm>}ntAE&n{V*B9nwXb(M!>8K+=vWf++W*}e6Y1lhyINTt z$pF}mfr^hM;CBCLWv}CZEDVkb#`={}K0tx`b9Q_jl>RuV{+71r}{;+6xU_^B>xBC{A1!Wo} zFXwLC;elP%!vhmaW-FM5rl#7olIKhnNk|tN*;48aqey)SRsPhj{8&P#{CL9lfyjGD z^EO)2C6N=VT!N(NCyvoi1dTqFQq8j`&$(hI zf%{JZXSml*wAO&39cOW!3injd(GRSka8^@Z-Ud~k8wmCGb<=aSjn+x)j}k~Mlw4Kn z{t%zgQPbF7|CW^|q4@pj`rU!w(ymI=dNV|$YNl3BW&HH7qo9V1CO|z?^}l0w(39@B zWFjC{w{m)K0g1$jf$Sp=%Cljg4AoGbOF>TePs*{%SjuX(Y<$dj1% z8-L0<^hl8|E#s1I-OUiFTAPymr=5%XUP7+Da02^(My|T!kH@Q3QzyfAnKWwv)p{Vk zh6q%xOeKaa-0#Ix?&k#**u^Xg?=kRmq}M6+D%h^jI+ZO8>=v1SonMk7WxD9)96|4= zmWbOJZl>FsEfVO&uxE3VDs`F4Zf*nV-7C3XF+*vQ)13U!l@*UIrk9D?<9&S+(0G_eeAz^ zhy6EU5c_XEqJ>L7gIj-adouZN^>M2*0PC>Hwb^Qu?eR4{)t_3@4Qgpkr`zZTQLAfA zCB~Yi-IHo(vu>cHyN8C3!-;9l7w!EW;I9Q*pU}`SuP`DA;nB3O>Cs-Mhlb4zc^#0P zLv9CzA*1UKOv`5eQD-NHGM|QqF4oZxV{RCNSDaK+S};6&TrmErL|@&og3!zjE8UB{ z!Q8M?a#FBn`^mw>YvXfiq-O6}a3rpkHAb{fEn1rh4xfI7cl!?3jU_ag(+883P<~0K zl=-?3r}2$56CMKXdF0tftfiD8-{QiVkhI6U{PARNh1K%YB)sO@!labg*hsIn(%KjM ze~f`k{cSRV$V4-qni<&AK@WT@#x(RNe?198sWs=k!&Q-O{wnj%Dn!=tPWAz9{Q0(I zv&=sJ2sP^OVZB3h(QsCXHqhd}Yml`GrvlPUlLF+Z<1{>W_}?98+RSA30FW&fuEOJ{ zoR(Q2|7q4^|L-Uf@H>Q$fgSsQ#N-Gbd6v$PzbvuC%Nn&?k9=awOf1A!2-_ynJnthu zM00L^-;9mZmU6Iv0=y~_78PJoN4tp<0+FS}n%$5SUn140=NxOY>_cv=KQ_6YVsm?c z3As%oH$<>|3?t7v+F;w6@E)*rod7Y0+U?{ZNppsPJ!c79u2wug7xetM$%hepp~=Eo z(^(Z>ML5Y+xQ^Hy(iyi{fMr{-e;Ba8*MmJn>@9(vhPeRa1C|eKVeAltyEHn~4YRcN zNNjP?`rGNENOg)+1tt&F5c3M>gCZCQs=!SsUn&bG4pcF|%Yq*2O=RAHoZ_0zF91#j zK*P4I2phzn5tPfj1JlkIS)%x1Xq0#BTO2LIE&iUGc6=*8$z8!}z8BkWyRi>)+aKce zQTqcdhVy@{*j-e)uU+82ALv`I7>izWfSxQr)TKdw4Z8h(;4k%w>{etqk$sBn3%VV6 zwq;G6%lbUGvgW6Xwegn>mE`3dE&AQ&e~tXdq%!$unc}HILMqTkAOE)+Zlf<#HN2)9 zz8%&SCF@kn$))733R25)-TH=xZrrn|U7+eKMpNY{?e=a4hWc#-tM*%i$rZ^(?xu>J z@%O}uyutx$S1+%UhreTjWJ2jP>45y5sSfBP^gy}~(n0fq7IoTcws)P!v51H{j}b-; z(L6+Kqp0CzL&Alhs&ZalHx)CXzL-GOuTq(B>1;Bm+?uaVxsCTzAiBqy?J1_WDds%F z$)=dIiS1J{Z`q|!xdoGb2EOkIA2nbOv4_l<{Va7$-KV^7B)Bl1gx;KNagAO6f}{EB z#^Q_jaS6w8@}IBK6xRt#v3UQnT7GrsBba5_BLC7!Mb0GjOpy-~%b`eWwCgKVBMpdn zKzMpiF|X_ZEZWKdELg~PS?4@WK~KSHCbIoOcy+`KAl0jc#SQ1vV}g?K%YWr z3qGFM>FK&MZ-T%dECMa9^#9}jfrhN`4OHEv!ldZDR*`xoK)gRco3Sfh=rxe_nuNrU zYgCom_{Cbk;g1*QK>MBp1^W}(yQrtK_Yx^8+sCjMm8}c#Y_Uo8M4f4wyeu{H`Ghk} z%bY{(Zt5DJivy}+w+2er$Q^k}FnY|^V6^wP^!g(`C>sW8!>~;a^8;&=J$Y}L$^QpX??MPMSHK~0PZ+x3et6*D4i*H2AcBJAPC zfj9SgrBhiRQq8esQsl;pDzTw0omz21k-OUOS}lvY{YCE}msqLx6$vUd25inO=G+zN zU*xa`?-1Oo#bNa)X$R!IQg;U%9J%Os{jQ=Vwpo^LDmMLz^h9_Jr>&=pG$jv6{`8_lF+G(OMC1<_=k?pq%!d2@xcMnV-T7t z$8*~9PCD*(y}L0#wcn}2SNpT6Ua8x=TcWGzKW>s4`ad6sS-ko%{mPPA{3KqNdiOHV zvpGide8O5AX@RC62|1@1D;>xcG_}Ms`!g@ABFT3XCn7CVciuM2;_3P<_Ch7;ENZKT zV99JF%{i&`SEpBZCunt-=&10&T;mDZJX?}kK4xm+SbkQbOf5a_z&E1)yrqp0xKs$B z96(SjnG5m;Zk>hO(Xj#16B@x)r{P`{Tr_VQ+mYPcGjkJJX**ckOCS4_uTLg5seGVL z)kXrAAMw#9g>&N)RonRiqlcLD9iiw39T>4sHGckJ9aZI7uvG?ZCE<$(Y$>rD8JF=Z zEm$WD_ICsJJfW40o>l_Gd5mQApxxK~c(Ez^9s@kO9(W|Nmksb|@!No0_&c%Lv6KfR z{HIOR9~d_$s4!1)243a9dH5M) z8nK^iY<4VklplS0^^rW2N2d8-vsoy|7WYb~ihG%GwrQWg5p&f(y}ncbI6IjhXzlwA zScK4GHG$Zh4ee8Ir>q(ae1icVR1bU=v3V9a9<-2;TF9OT@_z_tnbNxx%TnpDe=BM$ z3?2a$6%_ti+y|jh@gR=t%Z|Cpas453F6udZK1*YCtuV^67)`brpK3Bbh0tPjykcsO--?Sy zonKq91096;K0+%wd`s+ml|RaiJ?CGkGGgt!!7!iA}|~7gYQSe=S)3cAa;owyvJ_S;Jd4pzvCLP`w1-*nM7=` zrIf9oHcSY!tn0{s+eFuxL{|~o2|i40lm_w!IpU2vGc1_wF=Eco32jrKLF_uUfdV6| zL64(tDRCDprR3w)F#8G~-8S%awHS8b&FXNpxQ*@*=@$dV^S_z@*8G*=-|tG;s@pVPavHxeh2N5)~D-kOoZvZe&w4Yz*-qSv1@m_u|o0sjzE(Gdry{S zO7q)vKxcpUuRG()DpmY8Olug>i4^mXJQ7;@qp$(H>*39i8*HyqTC^tOY8_1t_u~& zjbYYs3#h|h_&+7Ifbvt)5g0I|-4vUz4~Zu2CLdQ`&PqbsZGj%q!fo%;ZbiSu4J0f} zM>w0%XFa{F#_Fh9Bi&fvNY`uCZFT3_<$-4= z+uYBt`Kx%ghF=uD!hf1(N=Q|GpLHM5@OezNhjf^W!`w-ZQq4oe@EMkYfXziXZiw z>c6$on*&e>*5#3ZN!~He6K}$4i#51g1vEUVnPHvAGOh^+X6~6}OQd6+*Egq29J#`d z#La#MStoR5v-sPC{6JFT4)O-3nNlD%yh#q}Y4zjc&kTXou_Ct1A;?dumDM1Xdkw+o31=U@M z+P$pAN%d%?%asalb34;_RBtx;%e=IpWKG41cGha_bhp92X!CR;`_uU)ik71m{k+7?QB ziMGEhaK)nhntKoTUj%At-)`t=k`)*E*{_(qP!&{g4%Ru6qU?wmsFIGbUlYgBS8L`Y zM$!A*{J%+>m)DbhmL%(MFRofP`r>y4= z^BT#biI*FZh_Po#7Ym709HtJ4B_`XRh{ea*$)UykV8*}giz0(fIRCpq)mHFQw`fGt z8xOL=s~8_F$Z{2_m^e0Sl2f&1MduL@E`}zKF+-R4kceGe-8>iP^elPh+xIkrf=@PKm^@(BR7$I{D1sY z-BO#@=V3Matuim@x}GJaRTaK%Vpdf+*TkhN>>yR4;XMA;DA}g7QyogZyMl>8D0)}VQ03C#o<)7bfs#Fy``eaZj90meO9O8n zT@-lpg2crlnYGIQ9Xd>^BX=fZX`)Q}+j&jidwSm|@D>T*x**|rM;Cb)CSk9>q{7{w$3}72{|pb~tPN_gKJMGhQ_CZ7DoZg+S4U-OXw37;)UB zIe0G+l}q8Am*X;QPi?#MQ!kJ9ZtrfZ{Gwg2b!M|z-!T$yzaE3tVE%@RFQHdfFpEGb z*yFuWwEdb;w75NL$4>U*RNssTbBF3~qS&tMI@NuK(iN4#WiENL$yEDOMO|FxuHO{} z?qn<5+(yqtP0qNQtjJ0noBE)iMdT$^VWgPM)D0XSSkIlEgtR!@+^8k7*h2}Te#_xEfp7ZT=HqTL+x@TG-t$w^Wsj`!qUhpk4@L zd29L$YY@LTb8>5)FwhjPEnmvNm+}Ku_dvA}n;fi+rxP~*poRHBI>6ZM(gPjayI8)` z19o{xOQ{Ferh6bn4~#4h_E=xv`sRv6wX<)Gz-;TAGr_j?iE=J5-TLH5>o2ACwT$?} zk0Q~~KA7dz;etI`?c#@BM){4cAoZb+5Ag*Isrvqsb5NXu{+@RY@W8!}Q3+?> z!OFRl>E<>SeKd44X%Toa2bZmRShl*Xsd*T}HAgxnunbPl>Pu4DepTRYcbh+#JdwEH zv|n3W|4DvfschDpK^BYN1XENeBimSGy}=c2dsS;a8f1veEs>Y??OOF8_E0nvh;)an37#bxMhP#2gH?fn5FzN5}s zL5!j7v>SSCWms34y%H!l?EW^Jl@<4V+ic^f(+=AB$_>hd%jEa4ib&-rMbS#w1oprW?9eh z3vJ<69@bL?8mV`f7ts9t4yK4ksvT2K%*i0cJc-zk-?V9S>oJI#3Sgj}Y(^IWJzo(1 zZ$kKH0FPu)=kf8h+QiK*8F#iBzeq+g=LJHW@n4DEsEifR+6Pwaabn_e|DM0w^Y$t8 zzKS!_rhV4rtusWkK)@-Y!G6W9LtyrtM_Cio=#$AgZReI)(J(%Y|9j)_#M*6I0cRYY z#UK=$*X95j^b-~1e7*~Lz5Siu)Gt5-RWmFI>k)gPl&-6qsCUe9#(l$S((`<1P;ur~=q$=M(pS1DO z>I$gGutldg(^||qkI(_9m~%F<-848;77Duf;k?zb@pqDxDT_vwT}asLDUT(CG`9{a z&Htgir`ZRb26V$}9COE>ynx+n0>8Y2nZT=lr&r$jN;#y|yQSN0te!AM&8BqhfBI$G zClzB`q4^0=3V|1{`LDN~J!cNc(phl$mxOly@3ZX=r(p%2(+LjG685rPJPI!B5{O{r z190AZw!>d; z3dH==$rP3{PI8?E42Q6rw~&Y0FH+3}7_k!@^2CReNVI?|;{uef z*yCUFS5+r#B7i|JL_cJez@KTr{(3+zk+m|-@1z>)*V7bFt7THBMrt)9`9NCVQULvM zJ+-_GPD?fcgHaY?z#x7Yu}Uz4JgzYZ@v=-b_+(#^>IjfQKtoe~wFYhQa^l~x@Y3}`B3e7_4ME!d&MYFPnIYJpV zxztBfIfl2*3>nQ4lg3I1|4}L(zmi5VvN?hRChFt+B6;WEz7)rP%e3#z(JGu#er<@W z4*M(#-Mf5dGteommb>4QI@YfZpc`nLf5Exw!^^=o=7b1g#Kig$OBzQ1b^LUu1pine z@N33L{dy``kXKO$8@^2wob(#{@hfV+K^s@HO*CgbU!~)aAR=ZY`G01RFI-KdqoBIb z6rHsut^!vPcBW`IZzVAr?gkRf*Bk#5L>HZ*@ZW?!7OqiZB*}#>PiX8=!IB`2{t+*S z6^G3w2`@y)l@dWA6Ib)yp8H=S-ZxOiP9De_FZKG2X0UkApUk&%wrCz0q|Y*Z`IL`1 zN|b1ax5a5X<)Slu<@;%Uh?;U^e9GT2E)hpBZWN8}162$V$bKNHO65Fs2R{Xc^H6K+ zOrM3-XC=MXv7$J3X`40!y&KoFD(ja+y{7p)%eZ~ zko+5Kx|9zxw6JE}H=*Pr(a7>~FC^|zqhZ)HQRs#9H&*OQ^e@e?t@tq2M1$i$KCZeZ zac0JDpXyBm?n-_AFCNgtwM%H<8P#lZ+6|7T`uaxtvAwvt3>OsUQQ<(9)}*1z2{_ZL z($;avyIIaqjJ?x|u;`FCzLBuabyL>;h^ zWK9bL3q)=-NTt0G#7p@}satFH5VyYbHOB1+kMT3=ls&`4b>g3En14aokxXOG$HZ!> zWc)i4qfzhm7m6~c)yuo5gxNQEh3p~x(4iRShq8dBuhdZ=YKDk9-_A0*dnR|cKKDvu zOO*S=LM`g7uwb_su-_2c30WrzHVEtw1}y721C~{2zzPUEfvfA}6EgxrAHd?5641Dk za@yNAjnA`!!$*rK%rwCFb7+9~XPUCFux0z7soFaTZQ0w2ZB^OK!rX>MW5vsCbl7`qqQU#E$vi^tC6s|HkjpZQy<2bB^-$BEb9gV^ zR+3_jzb%-;WvGH!oyiuBH9tDzz@G|i++7qt^~*rjIl{@kmgX<13q`Ns6#o-Rbxmb+EhEH9DwLTY+ycb-X0Kov>{6==;aDO{ zij;j9xU&N)y9xITwRubqwBr`Utz;~GYD~@7(0-(8zk)=?tFskdWuj%NSk-D}!29AA zd<9011d3PL_z+4Vu5zkY&r%tcHSL4>t1Dg(<)azF(R300CP!u&?By-b=&^xQ{u$+` zg}jSagxqnfnS?K5@Qqtt7BrE!O<}>xWf?{J?+2>dD{+sNq3Dd&uoS9azA7^m9j73? z0v9T2e}7)_rhP%TYO_&4c*WcJQM`F>&@0|*V*9Y8*`!w!iELA(n#fkPtDDh^wk^v4 zu;T6b%y#rQ9vC>?a^Fz(_nwfus8s!ZEx&9(&q(!i?;k_alj!4b)RUq7_jq9Fv&nS$ zdV0Foo{}nrWr=yY^scsAg3&AJx;X7~$X&H|C(atI;x~+|;mREyDwiJ8%gP;iY}nds z-SEI&)lK@RBV}|BZ&3eqTyLUfrqMST&QQ6iE#46-HlU^N5V#LkD}ge6>aJjq4Wa1N z4b{BB)x>)AD%ZTno-cVf>Hk3X0Q@$%Iu9Ah9!NAaU1wAA=`aAF4zApk@t$aCmfqvv zVE~RDTzQ(}J<-r?y~pRn5yU43vODpp=2ZsO?TgZx|3&=A_EpRX=dTI7>jPCipvaTBZ9iP!-f91#R_HMHL0wVbiBH1fyp;yN3Eepk}_NwM! zz{+K5vZi87>i?H=JIKu{lxav7^v$PJgS4S4D+(GCO3Vq zrl@l9PZg8ny+sJz9Mr@gH}+u({F!H6$C3qq+%h69D7>D9UuxN)^#h`eWs7SSX~Y&y zUwf7#Gz$d|t3Ae#rUb@#Js(wPV7gg?uz`;wzAOwO>F>vY^_b*~`tE@S)^^ zdkJ$HeKF^5V#k~>h{6%TFI0TKKKY+>DjQW^;@3gs4U@Tqx8AH;{4Qjfc!{c7d|IvV zaOTKBWT=y&J=UFy|R+LVGt6t1Hc~ zo85mx+u8k!+yf;&J_$ts1`SM(Nq&?J43ES9w9PyG}-sdz$i>P>lLeZB`-!X(S3~{F;)@I7u#LcXo?0 zk?gH3dwd&;R_zfTr1^VnqQ+`E2Xya@*S>bV#wKd4Hu}VP?Q6$tY@%w_=o90$uN|+k zz7re0XT(}g!X{-=<)WV|ro~_4v+bp#{GS3*ZPmh`)KjcY)KlC;Y*#tJP12L(xxm0*zkNO+AIn`i$}sbd~uUExs^W++%yjq2eAp8u&d8pX#r@>HgZA z>MxV3aeu|q{S{01SL{Fa*9I_$^eHdZT^BX!u7>jIuf3`Mx>{xbZw zwf?%I>_7IG`P6!UnNO|smwDf^zl!s}a1Rv)!rvpgO;bI??(^9Uv9P--ICN>REzGEm z#yk51TeI08*p^+I|9N>AP8YFDr;Q;hzO{_hZH$phsPgTtYD<(p)r5wX){a{giuT9+ zR}k3oIFqA~3^c8g?P*Aj zw&ZF|680ll6ofN2!1=;~E4G9K12-hAi}U?)E8?GnVAy?9xipj_WYR@T&wzJn%8NyW zl2Av6330G(Hfd4H9=U}F=W-ca?q=U%g~j4_=bw3S{sV)Km=hs92B|paOdxjMFIWeT zMEdtDr_j;py4mQNPc*$}HI~)5Hk1El-r3EiY3AK7|0(m%?nynzJG)0Q#Zzh4o_~&k z9BX$2+~0Qx!{ayU^H%>cz|tF9+W>2(cL4H|%_@4Q|ITJLzRfTWWJ`7EHvi`vfoW>k zMa6%hbE){W4^-W$grA!U?@z?0_F-|EH<1|re+XHb+^R>kaD%3|#M!cU-RqBX_0Df+Mx=+H+rUeU$^-&9Ir^iV zR*L7dWx~kkd~x8_<(wf51T!`vUIYVIa6)+CCQCc36YWSEY_~wPW8&fbEu%(-@(+yq zLs4`vq{=L1NPeCea^Q;P?&iQ1YeL=yL3hq}=qc>=9}*gR5HteQ9)haE9BcEUqH>GR z&~=QJ^=7P$IV+T3zP_yDbdKkhuSc^~ov|EeW#hJ(E1*<|NE_0{SI{OU`74XvWkrF~ zl}TK~Ht-+r++;ppn_R{$yTQ)K#T&|SAB$XU>Tl-Xz0AL-CKnawe>rZaPVO0e5*LuDzQ%C$UC09eXztLtbBGCuYm$!|p$QjnwFMtmldkWe42_y6FL^ zQg=z9QgT)Ux=hQ#=tb|UvE2PN@pj3YJvI1ETnlLVxeZ{^-Ug&*XFEyu_%vh5AsFr# z?SW*>-rmxR?}C-dJ|hd8$TRxR|8FxDWGm>RAXhxhokCTe)ZvH7^nUGVrDOOKTfq^VA`)pWhzuh zH!a3uAX$xpidiIaa;Z(j0##&@m2#6o1%4&ezU&0 zf~4xalj;Z)l+&Xo9AGAnaIstj|u-tH-&6 zKTd2|7hn#xC^K1Cv15u61OspGt~}H~5V=H+Ey?N(rj>>~gVE?@Ro8o1-5ZeoN@s@q zmDQpla@id}Uw!L!?G3~6H!&w08$6A9zt?;8Y&7qPsT#C-&#n=NdWP^D!|EO<)<2)L z(Zcc1BHJrIU!Qd4L5J>?*_3G(V@WcB{K;yN$?7`7I+Ilyu}3bX{OkGd)}lk_g_o00 z2=hEkk7(iEzXI^e&lok^{0nV9*?fsPod{1fOf!?%129d$b1I)7S1X@y2+8LYJ)(s@ zl+SRR&#p?`O3+iu_%t$zY#H4nIFucmsBNo>5F_n1b%|-gz^hZ21l5$uI<{(j)7J9< zuv{(}jR?v#JceY3pNKh44_1z@&cNeLOqsR8lr1y443oI%f=r5?55hFa9{;9@R#TM= zG^YAD;-56u2#_yPV=`d!OC$T&1^H~reOYz zj|P#j;u?B<#z$S02P}03P9w){OrYvEST;i??7ru(q4^+ybSZKawm^)R#kVffevQwG z^Rc=_YJAx61WRP$Xw)>2XIKfUl5UyqMcs4?%H814I8v=|?%GP#dar*Q8HL=BDi;`u zBj`P8W`)R9QLv_qF5(iLbn^NRDIK~5Rf~(>OKgFA#$i1*8jo6=RK9H%1Z~FL63S$OhxA)_=hRZ3=&8Dn!W$e&15mEHqbd|- zSIRYPfoK^~$+3RBNg}dOb+0{hsApz!NGF$Xbf7?VbDpilt`y{#?-XuM@jsV%9DhyCi=9)Nj#Mnldg;QHJ`tG#63=h?%S0np~Rgt0D zIs2_Z+1-b+C(Z}g^KF`yz{H&8^=TFpyWb#DiiWK>i5d>D#LwWTQO`8U+fDRmWkv4$ z7`Jj#)1Nj@J-)=4kL~rRt9$K2Yx0%QsCJO2{hA2Y2khUlXxn;kJw%nv#N;I2B2 z6lU9Zr~m3okux5ue`>K3)Ry<X_WT{hR z+PHm!pES=alPJY?E;Cq^q_BuNmk`@P^9WaCitxTto6Y#;CZC4Q`1#7na~2?i+Wqer zX3}`?kKt$3xx!}eFHt3T5Zcz?POOIPU24xxuhhXQ;Mjy0R$0W<{z^@mp8*V1t1+B%L>xrG04}J>f>m3N62f}{r zMBCj>y!=aPa`9->uXmdaooq5d{wG|(23*X^B=*6%r0)!v))7C}8u_14^1mL@!V^`% za0&q3U3b$kEQJ~mCmmos<XU6!?E2vpoMrd4YW4`n|GUw8AVvaIzdBBjfu``Nu0V-o8Yl`8W zS*IIhPOV4gL}KTt^%NK^jNOdNHij~@6=7o>)<%I|-mXPzi_ZyZi}gI>(}1w&Wz+Ui zSTyuO$6zmu3wzgg@vcSJi9H=#RGjtqP7S-m>M9RpR1`@6IPF>JO2c#7UxR-urOVxG-$?tj z3cJ^^j5vm6#5Qaq=3<6f>iXy>{C--_U|opD!5B+;crrp&!!f2{#(UniZ-g>1s$5<1 zP689~{{{U|9&1Y7FM}B?N;7sSh5QpVKDc8TM7_Mgo$2QEDrmu1AbbyJ?zm@Vio)peVgpw;OK1*CJ z;DM%HSma|TP+gQ<)wF!lOM~lOTV3paQ|hwG5-WB0`#OYSCV`u82`@|JR5s~4wm!6c!BN$%lP&wtS*n_Twc&$Jql?N6>PsU z-f!l8#fkM^oV~(jyl7%w;&GIZnXTA!-mH-vJN|eyK+&w%_%R*%IGBIYH|1IEjx8GZ zjXwn>5+`ty$eF_D{6!cN&J23TU?6bJH$nHJ8n_L{CA%R3pIUGC>p;bv+oS-wlI{Yb zH7`9^rR!sED<8Y3KXz~V(N2d={7f4c)8=koTC9`?;u!0v=FF2_k2j$gHbf3#t+$(+ zG_ve7DmHxEn8U|b58jqv0B$pY;?UNv58iBm@o!^*V{_YfgWE5-rL6`cI|4s~b4v-u z%Uk%4N^E5IZ11blj<61Y*h1emiJS6tudp9{Mv~S;weS;nDVw%N41m?9yqJEk7I$ms zo&YL_{k_R2jt(#~M&+VxpI@!-Tm7~)4jGu#D4VR9af+#ETFi)R=g2>U4CC^q$_ySI zqr}dc3&n}M5vr;&=VW4SC@;Q%r~my(VmnEo9p#Jt&-D`pkJ6Xg^gDoyIiC^Q^jnEJ zq)!yh&E`?GU>MmZ+Ua`OXx8y2P1e7FDR$3!ormkZM%bcZY4Y+*Bmi;9-Y{A`-bJ0w zFgj2kMT(g7M?zcV?}?qJCTc32V!O!)FDFb0V=mMqTKEQx)UP>4HImH$nCvOp&n#dTq)VfnMm!_(d z5e=Ifo1UF6YwoS2H{HxGPV@S{15_Ko`j32|q~F<+%KPZJ3AFME{VG~n&v!}wciNn| znoq`mbCq4aOd9`(enzu?CnoM@wR>Cbok4gTed#*Me_PydNlBfFvw*$W!fxPO%=v)O z!oEjL{nDo)_r%%$lOv#`YD4UdhfNj3L5UL|)94+AKc5at+p!tv&ef>?58qHJj_Up& zz8OSX_3fYX+>z49HQ|@cuY-&*@*OU%9zZkVV z1!t1z+$}+@&gxIvpqC;4`8C#mK2~QE7)raNl11B{5sH-|$W4KMl^tTfElpp~`#9+Q?C-vl}6p1}?)`I5;%x%Xw6#a)0K%C&L6k*AK5f zHjaaP0@5=Y%5bylc$q+b#4E1^5um!Fv;Q1f2VHFL(PkyV1&3JeD~>L4pMOG#asL-( z(CdkxlVn8T&CJUES5zE6aWwa1&8SX5&VY=uAgITRT;s$e6fNn4dN_y~nDNmP?6F+d znA_XoIAHmJXmO7|pwu@Mi_D@7{c+zxJO(LIr;ZQnk$3PdEtyhR4*V7Ex_Ulve;a`4 z))%Out`)1lc0e8|wFE!r_o_|FbaMD~zB1A|sJ;G$R1$V3f-rnh2ke5$QoshkkQlmf zCEYfEFz*rpf6wpe$CBfC@mpR{yT?I@27q}@VqSyMod9ZX&PfXM6o=8QnGPrU+Q947 zo-Uys{DMTdDsnUUxcv6=R-0b2_aQtB!5}<}R*mRDPT)IuI)0OJR8mjH>HO|}!N1UC zW_HV`b)!kh@TPQzTxa87Nsjbm`9+jit!&N;WcSMr^eCAg=v=~pXq44gzZG8GnsH~z z^x>hv_?S@$tv0UQ@_Njn;!)>WR1m@FwbbQa+V*4rK?mQNchXdtT$R$`vypV?#vfN2 z&-v&fVc#c+^)byry1ctb>yb0qjN`PB2x z_ncK#29M*w0}Kw{W(t3Si2#YA$P|7_s_>YTPb>m@3l-4IUry5_>mH!z3q5~UM`J3Y zGh7`Tv~-LK-04*WVDy6;v_!T3hjicY>DSS5TlqhedFKxP#c$bpns9rY@!|}ljo-CK z_AY6DT(5DF?b9%1&dbkRG?(?o1g{_3m%Xf&`kg9zwUX*} zFt%{P86zH)(n2g$hdz@JcG6>Jk`Wtv&6fa zxY%qK{hQEnp!iyvUwr&EdQ0lH<&Jq)4Fc6z$@^lrsaYekTeEp!LS%dDxhD0L6ruN8 zlORxVbcoMh*6VN3aI$`X1N0i3 zc^)z_*37dT`{T{lllkET*uPIuq9h(*_KxEy^W~7iLlYS#Vb9Y_9#bS4xgi||gKk8d zk!%x{a8mmAa5SPXX1nfHXfik#42|7fNpvvV4p(RB_?fwT8aFnm4g!B-83AN3zK|z;UI{5wrV_3y=)9 z)k~(EqqHIW}NC&$1qR+N8``-v_y9mrvRqvB3xo4Iis zWKGBDWzb!kyb@u}KtqEjIQ8p?n6#oL$7`9}k`jP56%9 z#^)X_9+X0o{lWMXDmR*Sg3aS~lgDd>Ivk4+G-9`zJWTkG-m>+@+f2%@|}?8zKK zdL;sLy7Cs~=BzX`qBG3oHncvs!Newz8(Pa3NmsN`KZ+V6?3~)LqT? zyRr&IPT^G}8g{>1n@HATv4UB8-(ojW`DusB+CzGmzFX1Qlw@~=45y~(vm^95)zGIQ zI;;m|rczt6NoFd6`!p6UjfZ;tD2l5NMsGaOGZ-DW-My{>oY#p(4c(jY9lec@%WgF2 z;+n}rgKXwQoqRyG7 z3eGz(tHuimKQR6A7O@NH4~_FQr-(1=q`aJ=CQDiEk4Loee?vxzIq8&2YC?uF5FF`+tvbN?gCF$L=ETDJj1M=C9j3+i`hk&@|-H$KuBC5~0> z8y|_jgR$a|rt@UGp_XesHx^+7p5n=)y3`{JTT9JQacPW-dVIvF`3Uj-n#~+y2ybcx zX(uv7@-cqUU3i-*PUkzuV=vy{Hzj#vcJoQ2#h&jNkNt7~-KkF;>R341ej+*^`(s@k zA<%q&PBiB`#$$cl!Mrr?taNWm4OZhzINt%LiIbs+sf_VJBm_f2^aw}g^#S5~GMg9J z=xO7gvpaXPOr2m&K4iFC;2i5BE0q$-Q>0jHj=eWG$V*=yE)mJ<5x1KRjYWf*SoZNP z7&9!)VCFt4Tjazk6sid8N7I_Qlx!lFZGNBPuv|aiMqeOlbX8v`vXiw%?%qc7W3Y08 zl2WHjAORtfjj%GDT4LHF#b(qpPid-x9CeE>Na4zowLK<-P%*k*1H{^%OY0=-$fMC-OsNhagOtF2e}uvR!1wqTf}-f%8TgpkeLpiz zzK;k>2JW2CXf9e!23jnQe$Vg^dQ+wY9>mcgieC-sK8&m6+SJ@#)%yrO7Id9WK4!(= z^$`=3D4L(Z6<_9ZuI46hMA5jcfph@*VKt|EF7g$T_^?c}P`gEl(7Y?V#ACdtZd5`> zoDU2JfK}O&NW8Y@CL^bGwC@XD*R z2YA<1mkscyR@?gBNKZyf*pzSIEyjIf)VU4Mo~dW|)H7F425z@5=?L7AH&J7fWK5Jc z`7fPnbPZuQ&SrHW@;0p*ujv3(<$*)^o?gr-4`zqeOw6){3kG5j9<640=ZvIx5eY z-?Ig%AN5*JGv;LMm$=982paKfk(Y4#l_>(x!s=I(*1uNoyamQKkU0;{^utCY>>6`H zx)^&eeT69|LaXvn zCnzs}&Gjl{f#RADwX17fq-p!bHDBJPN~L}=ojS7El;1pu zqnhSWH2EW@eN*oDYFu}LjDk&GY0KKGiDZdK)Pv}*=9o+ioUUbpf|NvEUXwOa6OCN@^0Pn-IdEEVVcYO9jmtlCW&ED ztazJF71TF90dS=Nm}>eg!Wi+{6H_|pU5vi4_fOTvGjnWwCO2vL$?G7JhhfnE4~i`_ ztlHGs|4c91i>>MYN#p_UpZsG}x{>;;$s4$He3+zgMs+9BGj!wE^1B7lV_MJv6u;I2 zx%_ScbWmDJfEK5KzBZao=N%Y0ioQY5NX)*DP&e1bjGvN?J+v?gx$nl$qP~da4_Vl= z4eVKjy9{hMVyg`-Et*L!!qzsM$r6Dm{-eeU_kY{OyJji-uL-|2iN7HB2#K}+NI{-$ zA(t4)+Iq+Z#AaGZR`@TH+Q01@vSx^#g8X(9tB0W13u^X{e9O3ZtXc`n@lODzg|ZDq z_lbgyjOHBqSCXPau`9(C_JOLiAWg)jK^ZCpK}qv=+Pl!nm|UmrH-h=a-=MGhQH_K# zb^dzkt4#jh#3z&{I!8*fc_%3De(_!K`CfZ^t#h}zHGT~gmDV60C88=g(`Hk~6+OvO^5trFt(3bdTkdj<3h zYJeOY)PdvGi~9NTCg2Y>EmaFa%RUJ0K^IaOZ<+kdRUl6 z2Bw`KA(2gb25PZ^je2!Ap#j}W_6FsA|Yv8FNCxyQhaCe(#&F=r&Pa$s;n z=Khel0>HTz@Ja)C1>qqB7$P<)o!JZvbB=-eIbj>qKxYt}W-?2$gr;yz5CeV-75UZO{|@XS#Vap;FbtYtofthDM9$>VTM+*clNjijuVNDJR-D%;UA zZk$!e6)l{3JnZ(J$3+>@tXj=RZq|(yRO}WGHjlg;cqrYu!WmEA(X1x`OXQlxnxy@* zp2c2XZvlISJ$QiX33@~e=Ri+fexU8Sncp8ma^0#1-X)uamag9R=v~u&d_28PS}dYz zv`0YSoMg~+<}jAfeGpp0{3o&RX!rPHH3{b*HB)l_(SS`QwB+|EVm}jDXA8E}Awf|R}VX4h<$6u7;XM{(X47U=iR?Gfi zC#Ewk*gFPn0iiATEn@2gwn|{0b7y_2Qz+H{17*bfYo3idpP8A?x!2?{me3MJ1+kwi zhc-5cbLw*lDu=U`!`Iem|F1TO0+T~Np{14ci4`e_g_?My&R7d}i~&1}(9%jrV!ssF zqh@|y4)ZKOs}bYe6+c@Tungk^3%GiYx+{LPJ`^}d-K|dVz>oMoQU7>MjrVs# zJBvO;>~%8*$H%L%0%yZrO1gp{@itVZvHmK(f7bLqiyzPjm|a&fHse0cyX!Wrt0Nu* z5^LgIt=zAa5O1~oRqyJ3L075Ta4)1E-qooMuQTaU-PyppCO3%NDP#F7y-CZvDxLHxx{D2a6`3)VKF!eAQ_J^ zE5fk+sik%?aTQoas!5Vv-WRzv>>lE7CNqp4H&t=|tu~ucOY1#jVl|nYh(BrKD!ngt zsY5JHBnC>Z#TO=qLD)?u%W_RNr%?b(Cvj$MYtxeT|Hs~&z(-k~?ZZ!iQB*Kd!J>5; zl`Sq9t0=1`kl+Lph%AZ=Bq13{G$dm(K|pGwK+SZF#=11Et)^;QYF*-V+aXdPHo_h&XL8y}Mi_~(5FjXss>T`7T?J{FSD9V=fpAaC zRRo8AHFfm_Gkbxw(bLSh4bR31@x())sg=T6f;HTKibdE{@hfQ3o0J-ShMi+PYCya* z2^nlV6R#}r#`llxbR#ST@qXovpm^?{ZgiHJ61s6ZZaCH*4A+LiS+k&p2ETHHROhWw z|AJmJTQN*3QS(mNN*-j6ucW9Xky~|0)w;d^YSl5 zWV&+!8$1_UUj`Uo`o(0zJBsWnHjD87rKP{m(BA`9E;C^N4<YmJxlU^-8|90@OPwshkR-N{g; zhPHb$V7ioa;jtru!b1;%ipkJm(HbV7g?d98%A397B9>tNa&Ax1Bj;nofsIPnx8G(_r>r!#;qY|T&M zldId19tsP{PqtnLe$#JUCP5{(5ZiAAahq~}M;BgAm^Kidj#-TmdCIgvwr$TjJyK9*d>vG344EMso$+5;4T z5S;nSG?_Ws&hd{XtB2-DdEgyFS!0{%`57_@gY87mO=6g8o<4aqG9USGJbqeuLi3wU z_Z<#(8kpaT?>~ft)2A~2;aLP3U-0Gt`u?s1C1B|nTG>u84}=Fe9^?z<*TEhK?jTSR zA{Ih8T_rmQ`Sm!dBKue3XY?cKo*O);V30yH?6^is{U1bAEf{kUK$T%$0#zh_w|f@D zG!6kk9L1~Ae`Cay?+N4zO8&2s=SX7o3`Eh@-<$J$GjXWvBph{bg9JhhPdF}sYJ#`= zLLZ<4wd96g@~!%5E2?5DLP6GJv1RapDj3IOc!4Ou)HPmlkX?d%O`s5>9zF^0N$g>> z2+un7{Ae)p{d=v77!CG7LS!z1qP?|J8o?ciJ}j`X+xJ4aRCY-H4-Uu*=c6V)>-!up zc9;e6FEErvZpua+u}&vny=P;1)14kOV}Zy*X&#|ha8~ipsAH+C(Lxd8Qbb|wI7A`% zV+h?XGS%u#85>u%4wM{CT|HIM#IZvpn%A|h`e~aicMV*h`rvw;Qp34z>?O_gB5y7o z|Q~9;~9_Rn;?xIh7jWG6QQ|l!#TG}yAgrt z$g9f{U3WMWZ8(>jcRs^2krT;9+n&=VagPUtn+BF=}VW7dgyLNqEa@nL-}Mba%SuZ+32H6NS3rrNZ*LSIkSCiWdtM_;0QTvVci`G%#Yc|o zRbK@nY=PmUM{mI)9+PZ5nY3MID1QdkX5@01CKyUP1fh4A&TY*;Xk*bILx~JM%_P$-sqRxQ zsWeNft-rTRswK$xNc*XLt-Ul6t+}QaL zP2`(Mx(zRNwaChYW$IP;A=8n!Z(J=Jgk;QZ^rbu(+LE1)*Ib{c4v!V0r zf=6bje+romXe06O5mUJ**~h+KkoK{&m-Yd7L$^}f2V^Cx4co`cEnc-@`&hY!?PKK@ zwvU%^=r{iF{( zR(VqE@&ys}S|h?H`j_&i{8FlTLUXc|(IgVA`JH!6qYP=%f~ zLz<^7Bvot?)CWx!DuU@yRQl+2OSaaMWf`*5pxQb)9;R1Of1-<}D{k;yX2}jVWW!=) z`@{4)$fV+8A{1@1)Uz%12lW#6`%vXG2WvnuorkcyR=~&OEzM>_^JI*s4W{{^IpJ^l zp?~42GU)_NvzP;(ucSW;d9E`&zl7Rq{FQSnCxFL%8oX?20*0nCMpFjU1klJrrTB|E z8RG2QwYP}ZoPxbEyo~iMhIx5E4Kv%JQtjblZinGKhM53BLfPMB&bycFr$L0ZVZcNP zotzYGcIeE@(s#Ef1m%irVJ*P_chL-!V zHS+0&DJGvP5QBEl1yF7Nm%?-w@*q0Pej43j$#M+YRH(Ao((aiI(`BQi2sHDfZL-#c z??1~h#4zk1V;BU}zsO zZ?{2RWP>VTP(QIj{n!R|{~8J4UZ|NSC^_#@DnSiLP}$-6(j2ib53~Gm(rb=n!6Plwhp0Unv?TcetK6PK6-xb z`y3JoHbAh`7RZoJy?z5yC-kt%eFYM5w&j-K<3|JwgwBT~fzXv!vM26y`%3!ZV)pwI z_}+ObcNqJw0eLA^1Mxuv>3Peg;5^x(y}PP%(A1V=bnu~vL79}EYs+M>M@^Y*lYTek z39pun3PD|EGHMk}ZyksBCUOwv68=(Hgojo@MT49#TEpZ8@GA1wtKZ5c{0l(WYQFK3 z?%_k!jITd-U1kpKdN($|PN;9VA2u4FPpEEbc(tr}A*LWh5a+`~xB?xjZS#c>oeMh= z@HaLa27K^DpBsQ!#hgdN7N3+>yyP+CO|OnGI`i3n50WFdV=z+eX~@v!OBe4cMpeML zAsu~gXaNSR$)~_Z?#N#KscgjX%~?E43?FFtZU{{3$o7wz=U)hvTXg zi1o!ljN^6(D|824Ry9k_3auV4y04+emk%LOtJ-}J7XZsVYBS2m*C5yEGV!gNJzTyh zv+#gs1+wC!BH_&*E?2<9tD3;EsxxKP=0mdJpP>AP$~1W-Zdq=_G;|KDhu6Up0(^&~ zlQutJ$@<&|D<(MiG9xWGclm zb#~-ycm_Tg>}f;uHEd2B)}GOI64rzw9b*k`aFjXbwJ}mHSdZ`3zQp3}`n&FrN7kPN z0@wMy1t!r670{$FG!OH|CkEzClx6O(s?Uy!WEJ_w3;swx`)WsL;iZ?X@HBquZR~nD z$wJP|$si`Nd`$wy`U+l~O8Wl5!BqHuWf>!kNM1L^^&@9mx( znEvz=bhED`Z$Q>y$wnHo;ZTPdvcq7yPsn8c+WG)Ye-($W!L9e60P}X#eW?QtL-P&) z(D#0ZRzEl*sz=OHVwZ4c(N)#@Se)tIt_hLb5Z&ngc7bq^jldtk)b6X-1l-Saz` zUIW(&uXdf>+N$9rz}F^7x`x)mJv3P4l!QEDPU-@X8--r3CL*IPHs5k;TI%&ZILtj_ZY8d`!4%HR$yi6ui=4tD3Hh>ev4AU zPWLij$$1sNhQ~&uAWi>-FRnCb@TpjD&$FGt!>rHXIh=*>Avx+ zpOF*LwTEL^TK&v8q1?3r;$_FbvT`dL#osUslle9#Zk{`>8C%d2k@L*6@xMnOi2aEP zmr4eYgIb9OiZ>u(x_daB8YaIp2e;wG{IEDhnqT@BXOg=fPTp_pC4EoaXwrx4I;b$c zrSY{BVUIN87-B4qn0!49a=9-cQva;{Sgc#E-*qU`JQ-=m=bAvQAFckzB;6}X|HdZ$ zNqkD-sg9L@M|z(*58gBF_gHg6+W#P(Y-sSQKa~_uf*LewKN+T-HtqXL+Qs~^I7M!Q zNF+&n;&^!32TgF4&BgFK>3?%@%zo8dSKz7DW%=Q|>R^)_UMGF89N$Lypm*~5uxAV- zx}l2P^&fk2_~xps27oYjldItzhyguM9=XN#D7=Ss>Q!IiBG*~S7kL=(4H3~AGW+XR zJ{KfS%OT~whUKE(__D5bXgm^#@iOD?j0da-AN(nai5h&&eFdsX| zCA7RFaQ1csu9bDD+s&1-C)VQX zIUYROSo;^$IXSeHi)>geCzBe^NeOL`Cr@73u`wk$GB~yyfN*>V=5hDRR_ZsF|^_33<&6*^a64a@11nuy%TADa-Huh z+^wpST7W@dYo1)^^8=wmNosKMLh=ZAEu{D-y@n{fjzMv!6gZZ;q-1l)x0y#!UV_yL zyRueqOI;(=YcCeJx8{muFH?+pVI#~sb&ag(`WmL9G&_)W--g=h+$P*}E4~yrYegEVUsmizn6Y+&E z!Tp%25#y10|Kt%#n!O)$3GT;C?WPlI*CWfU6O5POe$3RJ)(OI;E`zM#Q`PwmD zfq#`eI4<{Np7gG2`?@xikH!70Reu|oEfQrLhNj9W+wj;pR1u6|1Hln_VIX?NP545? zFjl(~j$#W(p)n&_83P1PLahBShQ||#8O`VgAXIE z508T*G<3bFW5o>4b=U@roC10bHkYISOCE2^s+z%rU2kS8*d5?r|GH^ z#v6HBE@8Y8!q|8tt{875*#A4n8_B)@?~FH+n*Zi_W9rrqHY@umblXJiigP#teL7zvFXZ$el(<#=;o4e0*Y#+$pPC$CQ!Z*tJ#e~^qGheyW(wd{48d4QtgA+> zckPq4ZU<~-f57Y<$hJYl;A|V>>o^wC?s*j|B7zm>v0Gt8uzyCd<{TJ~R7ZR!cq6XM z%EvU}A8o_`3$(}|v6o=NA2kx}SkN`$I~x8muuTeo)6pOd4W4hpKMyL#VF`bp4gV|& z-&*a6Y<^Ob?+V`~A7w4#ofZ1KFN8@t9=6++dUhKm?8sjW{+f-no%Ec#)burGikZH~ z%s|tP$P8F!Vp0Sx!)jiurCH5^hL^qYy5*%_5k_B!7&?$V`$D4_QbXo+i3lx!du7xY zYCsWS+P@|ub1+t($^icK}kV@8`KmOyD|HK!Q2|pYN;EI>T zA##E8$b(ymkyy&w)VL#LhGO3mx*JZoF(8o@r!Npi1cOT`5~9wTO1^RNq>K1Z z@zhU7P6MSb`L%-TaVe|F7YI_l{ugW!D~TyS^dVphOT{J*FnSqX7)L|yRt9SGoJtAg zqsaNM%aXA@LuH;ENP3YSB9O68cPgrrbR~$iROfJiU%0**F#rxfAbFk*X{K*IjY=t* zb~O^w;85`VTLuH0|1|R zy`@ohq*)NDp-!YVdY?(Kr)IjOTMpOVH`Nq4)|^Io@lE)*=ry2V-jX$XsW3tQ1G+}6 z{>`kA)|e0V3xo*y4=~+(K#VCm%2L-`>LU#G;W6riV7edFs6Y(G2y|f4VbNu6u14)z z?CwS$Kiq^ZTk;6|g$pIb=b+lKpN8o{_01H1*Qr_yM27ZxMv&|*wKj}nO&CYV!Wa(IlL#aE z3_y77zHkW-9RL*{INL9fv`#LXf^;w6U^hN(GeWFPL&tXK{t`7Do|cQL++8)@i4p13 z>pm;ChI(8iv2})<8M`9aqU>d93zf`0YS_TLF4KxoD}B!4ls_o_+ZEOu8sUR2Hj-!I&LB9k1}VrCt?8pAugw$Y}^b=FkExRpA8oUhoSK zv6`i-`{4`TFAn`P{|Ky-{1GU(VVbTZ$UfS0@1v(meYg|ChOk1gCl-Rd5qziq<^TBz!yPnKH0`IA&4fq^OJ=-n)fKS9M9I*cst3lhFW&P)KS^wE? zdfl|_PYeiHU$Z|oi$U94@Tm*=LOVph(9?OLf8ebOgp?Cn4>1{7cG!-!oFS0#Gw74t zhLb**l@0cnSOUT-&G{X5Fgzy)EY}=@<(fk}u=biY{yE4KDu72K2}f3IuYNCe&Awpt;=N&! zT8n3|kdt`WX~Vanj^`qH|vZP>oM|f6CR?Sj`bLbz?m-VF?_yBMBw0Q5qZK1 zB5+VrPuumFtcHS=&{izNg|?(WX^L%q=8h-(2T#FzRk}P*_4zAi{W#aWBE0%_sV0VR1kZCdUZ26*%!XZtfTCB1hIE6U4V6zwpe}58=tp+7(@i_ zLWSx!1Xxd*=w45G9wMIYNo)9w^%VG(H*s(fgNq>-$&)wB0*WvED_KAZU%|B#=^}Jk zGlLhFM&H2N$y0A3{oKU+CnAJf8K-1poL?=YJw}NYi=oM|S!ytEWZY&z{6@w?gYAus z!*C-b*8c2$j9PJy-^ZAN*e2e`C^!WTuPw6ALCCO%u@8EoVb1F};~&(c(MB=;!E_It zFo_MOt`pP4;t+jMq8*#fVh#+t@X&*xVrP4AXwmCH0e=^O1^#|sD!y%pYG>vj!^D~S zl1c8FxxCeN?xWvgGBkFh;aLxL(g5Lp1g1|A8(@_tbk3UJM}hT~1&W$kN`{7BYKGD!)ZAk!mMuTX#7iS*&wxln)iTwM0bF54sn zjSNpl4lX_qM#$VCG}Ln zg5W@B{zmtD*__#!t>e)AAAW=`j1#^O5ba#NHlJH^Iwa{0-`M4W#IKD5^TxkZv%nXg z82Ocso6i#vHhGwK8t+1@cds2GdvFjd8 z5M{@DI6OiXU-Ov>aL=w6W%fH1mfA4x5eM94vhq`7GtFoN>@gYH<1iuh+`Le-=XX%$ z0Aai5S1@HAAu}+!2IZcjN|aBO)0bmhv5`x{j~;4#l5-jDp4l;<@?n|?pTc8LhbcUC zGE_`s#)#H1c{7%KBlqHI0~~P)ZFQBKXNmQ0574!H20*nD`?eTIglxp33#I>S@JzLo zufe6=^9oc;`65hHK^dJ0GIx2+#f+ptc1Tw}Qin`He=#BjO?X%2-Jw!|_V8&1tn$LQ z3W2X=YDIp-v77S8e~`NBDOgC=C~m|t1r*y%@1^77)iQiGy4XW(vCWiXORA!|I0yr8 zs*j3Z4u9m3FHVRQBiO&*iJ;PZ}Pnf*VTmuPt!K+^6;zNbl@J#Ln|U zk)-#1sFV8PGkb6ZrleD`=CsQugk&m!bh7bJjp!YKatb6e#0K#IfH2Pgjx zz1Fzs?*Q?6^E!G0e5@}*-xOKiVLq14q^wDt@u~h2N+tQ&1n&R*SX@2hiX_e_L!E#) z40`^#KKMZmqs=JQ*}Rb`|ka~jNz)E zIs5PjOMO z!=|oz2FZc6)4#(!uuqDtHzOp=czJiCKP#@w;XK$88RiRQA{HEz@=Myg$oJmT z*LxFZ_Iz*R)SmB69Mki?39Ny}5)*%zBJmXpGvQAxKbdz$7XA+DAbZ%e8r_vIWOBm? z;ReW@LGFb$SDBrMGCK>@5Ef|5?9y5PwerHzAbwb#XJ2<}aWHqYPa+HZK+bU|Zhqoa$Qj2#Iy z>#TJnPk;xy-_Upta!B?&j)txK8wYJ?&i)e8;1AD|-mMENT9xcKL|{aZb{RNg`yKP{ zlCi|K-(dDTCfM*_g%)`bI}#@R^W5R5Y50Xb!+&u<6aEqt{)JEn*zn72_$NvD)@ny& z>z#?=`@&b)9Kt75;(3ErANX+ITP`4n554>(gn;wVxC?7HL9n`!(f8RQYvv7GQ~;bXZ$r0uw?sZXcIQ0NVy`Kg#e?^e7#R}nEK42|l@A|O#W1?6)HOFDB6u|s zPbj{dy80Rbyb;!%AFje;u)Lv|gO1w1qj)~ZG2h0(g*_BZy>RC=5}Aj+dfa?V?#m(W z2N7%51M4CTK51%?Q}JiOL*&*Rqx~3fxuYWR>h3^^+G<&;Mb*4fj(|W`t(8_)GaRU4 zXzmD^?L#O*WES!d6RU5`_~N-?j#R7bpzekIZueXTQ|+nJZ*Pw-_n^W|6mpq~{uXI{ zT)MEx9Z~|!pE47s=W)qTY?hc?u#l)acHP;qKt98}NUM0kb(>1~5V?6z@xacO=ffgL z4j&p(9ig{zWhio@W$2Mj=EK8G#*xRa+kkl3;Z#$g?vwQRS~lf*F5(@Z;>d#oxvM4( zcM@JCO!|P4O|O5NIND0k1STZr7jvaVzm4=mR_Uj~pTxh!*qDl7Wb{t-oQ>9zy86!` z;tc9Q)Bxm#9L-Ps&NgX#xua86_y9 z;U1ERH+c55l(!qowNO#8;JF2+A%+q+-#;|pfIpWA#8w@|3$rdS4eyFKQ7hq@2$#om zDJ{N~^}F7Z56UPk(BROVK0yZAmr`~`2D8x7NKMjyY3lSdxZuTaVJv5S6d82^QYI78 zOC+X=SN?MGMzySt>>+jWG@Fvs%~4PMA&jv8Id)lB%b8Yv?1&}u<<0C;7^dS2m zFWQfz74RZ*8FC}KujP;KWB4yO{B=-~9PqDzX{O}v8o<{1F#S~=q9;mQ&JzBcvY!UNW4>5{|9&fT8gT$>UBMcJo8ux&)s)(b}Yvhid3>@g@ke5-j z1mEEK0KFP2&l&{O?pX!Z4hTPmX{jxa=)b=(#XR9yiIRDu2UQ%=8Y|yrNLIPg2CsvL zCwjhymeq=~mgVx-5GIQ13LA*m1acTuSR=S$Fg+(VRFvpBvNs#{ynqVBV1x?6EV04# zv%#EggSp-vj9I;J@OW)7f6W)qAA)Lwxd*1FB^Xhn+f4Cdc7gobWx|pQJKu&1F&#Lb zI`*qnlQ8*i!&K~F(2%gB+#&Y23A@X5cb?Nth&izkPlM@Q2~iZ3-=m|AM|GeU$9#Don_QHMm@`@ z^Nf0~QO`H(0;3igb)iw^uH~)~i;P-k)C-JSVbn^a28>#5)Syw98g-dbR~U7rQ7<)W zol!40>T09@+^F?N{e@AlH0o7GZ8YjHje4C?Z!l_;QGa99-x~EMqc$7$7Ng!~)IS<^ ztx<0`>K#VC%cw0zz1OJs8&%Fl?HbW))Q64ws8QD$waus-jJnCFPa1WzQJ*sE-;MeY zqjnhed858))GbEcYSdSZ`kGPSFlwh!-!|&IMt#qy5u?6u)DMjMkx{#iy3MGc8FhzI zcN+Ceqke7FZ;k4p2iP^DpHT-Gbq}KsH0s_)9c0vfjhbfE{f#=rs0SK#m{AWl>LErw z%&1)XPd14BP zX@;17E~acT{aQ?NQM0T?Oc`Q&Moc5c^r4sz5tB4NBhs~Oh?oY7-7#YN7X4hAPfYTf zVA=U%dS6TdF?EVby4~m&F-fN!{kxc2#k4_8(m_V0w=DZqOm~TC2pV+sHZjRgRrEJv zlGV#-qnKoQB`OoPvMMpH6w?)Asut64#Uv;G${rBY0x>-+ra5AIUrf`*WMo*#71Ofe zP@*S`NhVv-W5pzs=cowiE2|XKFfrAOXh zL`;W?X%L3*s1!<>h-HuNEv6}Al5g^|d1Bgu!Yiv3(+6T|64Tpax=T!3#k5&WB4xPj zT`_GE(*R7UqB0_s9V(_4F-;Pa$b>69TTF5ot}Gy?Uy3OtCfPPGldmar9INahF$Kl$ zSutH8rgz0uB&HM$BvHBQRd%G9^28)xchMQ>`l*=O#Pmxs zJt(HT#B_(4HjC*NF})?GCNb?2(^X;`hG|rEwV1|=X@!_(iAkDx*-|kr64P~J!s?4t z_K=wH*@M+fu#t@#F6O-N%1= z@*TR9$LT&zO*O&l^2)_ERkhV6ezBWb8}wE!@-D2Ztt_qaR#kcz)-GD)ul5#~l=y3E zyrYYkmDhMjl%_i+#g(NM{u-yUc!?j$otm3#yqsdmmzMi4_Lf%pYrK_JL9c&VpsL32 zm9R>|;{Hu7u0$vm%e^Jl{^FqDTdV;F%Zh_ugjG^i87yC1TUA@*EwA)0@h_>WUOp!7 z1NbF`;+mTB#g*P*l^5QW9%p>Cv=WmzxkGw}c5!uiuy|pGpZ!ZE$P!6@|RbZ z`j>exE)SM@gUbVc@2C+qqnw}v_9CfUBF>-lCO^n{A2qnS_F#(lgjFWGQCl(omHOX3? zCG`RIY6NOh5Xl&^OqyD+?o|sfKpakWW;zAsB^Orst#5OX%Wi)yH^iA#n({-zqoOSJ zSEJ4Z{Y#`GSbvs!B{{HuT-j2VR=m< zqwhz3DD^x3%GxFVYQ)p=o048sQM|YYkzMQ$)&wQ`8eb`<(sF6CXx1ptpuaL`T28D! zprE{?O=*^TCC1X2%S+)``4XuiF`sONBsXiySNOe?CVMk_*4@IwCB?{`LPzS4Qwd+B zRszG|zZiODmABNtsJONw=q)U)_LtU{z|~t?i`GzuzM=9s^a)GLi!0z-QeIgu!B++x zq!z-#kp)gbay)?4RFygbQy-X7)Cvm&%a;|pYl^kerjtkwNoa;1*%m8r;ji}BAck}_ z8A`L128~NiPl5QMJuDVWO-0& zKQljP#+8#g*)WYWjN!k`0TPBG#osKMnjz@S5~MKooc>79jR zbXjqY_u}d*bQ8$5h5l;kpJTlQQV|PyL@B#}^c1<$yP6I`W(jt%M|x|$3zrA|BWlv) zgFXteq%1}%1Ege3jL=EyiN~N8U}%?$P*`$tb#VZV-tk^sRxaZp>Z){S#ohulaBAN^ zV{Tp^MrvuhW-PA4o> z<-uTuU#VnFMntL|W?gZ~MYZL&@F#e4VuR)-qrAn7g2>5Hb4H=dE_FsJg9+EWq`b!D ziff=9Q6v8lji8RO45CjClaq0JNh++y$OL56!m6qYXeDLE)zD;0gt45c7PA32t|>$N z0#(djEy^nstSziSJ#iBgi{|akO)VwoDlk=AR8dtd-m0$lrB$_<>A)doP#5EM%r*fP zOHU;ITVi!6MvFvjQA~yaHO6#Q)ir)IN3b1>>BQg?E4AWyrI!|9>Ne^rtNe=EI3)(o zc>B;M(R&F`^rGDcy^G5I6{RwZMVC^wXc4+T({V`YNgtstOw$pYFk{HXv;*}W<40v_ zadoM*W>g(U-bPXyxGP({qem?sl|E(+rbOy*5|>m2^l1L-38*n8qjWA@h9J<$s{H|( zfn#KnS*e*bBm^4Ihwsj@Qa2$Ab4jsO(FCt--kCVWiou<^qifP*+3QLTT9lMfl2@_B zj!GZpWa}pfK41LRCihJJH_6tyPAsf62GY$74pfl9GQf{1at8f{?a2HTkjpym1Cw< z<*mR7W9Cdc&BgQyb={FabYoKO7o+1rRjc-+Z^GOJgFkFB*{b#jYpbOrkm(kzyra!0 ziyhU{$9TPS%23r7mZQsCZoi;}UIw4?O36V)6S;1i6h17FCuWK)mf{y^rL zteH|SDPAt)Sv7j}r3e>UQ0!e)3turfp;Rzr3bSpzV-U{~V@|@1J29eSml#tFbr?Zv zCdh=frn=;K*SK2Z$Sl4BLtk~dY3rtwtoCCXj0rTNu+Wdu`q72lI>4;D?OVN*4 zRXSPm9vuZ*Ytw}~Ia=obW{xbgiZME)7-e%0A4z76kxZ~d$ikYE>hge@D#|CaSS~6L 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 z%0D+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ⅆ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 literal 0 HcmV?d00001 diff --git a/.idea/.gitignore b/build/lib.macosx-10.9-x86_64-3.7/test/__init__.py similarity index 100% rename from .idea/.gitignore rename to build/lib.macosx-10.9-x86_64-3.7/test/__init__.py diff --git a/build/lib.macosx-10.9-x86_64-3.7/test/test_functions.py b/build/lib.macosx-10.9-x86_64-3.7/test/test_functions.py new file mode 100644 index 0000000..73f163b --- /dev/null +++ b/build/lib.macosx-10.9-x86_64-3.7/test/test_functions.py @@ -0,0 +1,39 @@ +import unittest +import testindicators +import numpy as np +values = np.array([12.0, 14.0, 64.0, 32.0, 53.0]) + +float_format = lambda number: float("{:.2f}".format(number)) + +class TestFunctions(unittest.TestCase): + + def testSMA(self): + expected = 40.75 + actual = testindicators.SMA(values, 4) + self.assertEqual(expected, actual) + + def testMOMENTUM(self): + expected = 39 + actual = testindicators.MOMENTUM(values, 3) + self.assertEqual(expected, actual) + + def testSDV(self): + expected = 22.23 + actual = testindicators.SDV(values, 4) + self.assertAlmostEquals(expected, float_format(actual)) + + def testBB(self): + a1, a2, a3 = testindicators.BOLINGER_BANDS(values, 4) + self.assertEqual([float_format(a1), float_format(a2), float_format(a3)], [ 40.75, 85.21, -3.71]) + + def testFIBONACCI(self): + expected = [51.728, 44.135999999999996, 31.863999999999997] + print("values ", values) + a1, a2, a3 = testindicators.FIB(values, values.shape[0]) + self.assertListEqual(expected, [a1, a2, a3]) + + + def testWMA(self): + expected = 89.2 + actual = testindicators.WMA(np.array([90.0, 89.0, 88.0, 89.0]), 4, 10) + self.assertEqual(expected, float_format(actual)) \ No newline at end of file diff --git a/build/temp.macosx-10.7-x86_64-3.7/src/indicators.o b/build/temp.macosx-10.7-x86_64-3.7/src/indicators.o deleted file mode 100644 index 53e1135a03fed682fab76b9b8f50df4bd7fbfe9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 705676 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

>fF9_ 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

-nZ5neGr|XkCz)41)#Tnncx9q-qAI z)y1peA0<QM!X#}^Vg zFjF({59^+yH-9CQFjYPysVqizVCKAt0jeANb6Y->v1mf<-?eDHa=@-3n?Tt!;xjB`qp&7Za_?x9)j~nh3AwBBa5ejV9R#C;dTFsZ9Xw zRYN26KjfVQbC4=>P3CZuzT9-oHSLLt;7c=J)kxWiZ^XE$dS`4W-FbwOljIgHtJr{$ z1hT}J*ZWg;I29-Z#225+euj^6Y6HncGBQu@?FUg~Ng4uVXy-vD4s8be!>NTdqb3&) zDN%h~13qb;BCG&X0M2vrBa%WQ%giHqycg;DLjFpho|~fvfL?&JuVCSQPX&Bl4aMkJ zT3AG(-E^3R-NG^o`R$bz*$26vuMd*I>k!Bmu3C|)>W)RP2jn;xq@=!bTArd6;6tY` zVS2^mV*g zP}9lnFSjZ?DiYfpdaixZz=5g680fk%>MXasS!3>5Px|10QgCE1XbO9j+OY!1Q%3uqA#*uB4y= zDFPz8U~aP9wi3~fk`rXP24`Tl!V^NiqkOogkj}v0pH_3VbX2{2 z2jlN4>yBZJI7if^G{3?O6|!!6fXVzDlA{I>&|Y({N7!G(5hGFP5!}>bfNVKGM;~Di zICQen19|li0AM$ggFH4Qv%ba#08Q7kHR=(yj18L9Q?ufTeIe$hH}&c-MUh!mbT~?9 z_*nee^+jqFVyFHG_t;=wwM?nZQa8e`>Z2K?H z1Pi48lK+b{A?sIHgHuq4NWmY&sTf#x!L5OyKtCJH!HHzOB~b;7UW)MBk#9PI3&i5Q z-U|vTJ5Gb3%S+jL1Tk^Em7E_a$niw5wxwX-VLj7CfXxJgLy)huHo0W^OMlLUl7|Y&fN@<1dP1YR5cJ!X@%5Be4(H5M zdw+&nxHz4Iv|j2uQg6UZ9@1^HhCUay90r2XU zBbJQVUcW@&f0D+BC366o6wWAe+hZD0{x~-j65QJnA4+;?K)# z!;%1w_w=*0UDyh0HA|Eiab2a#POKY=^1M%jP&>;@YlxxJLkk43RJ^HV0Ps*hS*`+z z=7K?w-tejVDP-iPNjp8Gi4GA8#tI&5c`8X0dU(yTvQpz>iZtOB+Xa_pnoptjRDQdg zQj18|RZocS(W71F*iy)Yn(})){y~Y}4UvT^*F38DYb2&h9W5N_C2#qV7`kI7CWTkI zzjeZNms>F7_m*$TLLk`I$dH^;b0yAllsxIB(o;f3VC|>Ke^skVSe9)X`H;J!F8I=f z(DLu_$;-!tD7;LKDI-^KlxvaUv;!@at5?!$BtAK!YUKx}xVyZ~F%I-V(QF}6<*Y9{ z^Dex|$$EU6YCxGf3nB|b(DGM~)q7J+$8W(HYbDXxE{h~Yq$VODo2xC7a0bJ2$VH5N zb_N!!EctphlF=E=BFP0MSfhx5#uvCTz`l&s!^@0Z(-Vk}a$#9LF6!xLzf3p?B3{x{G7kTIkhrFdw{WzcZz~`ZzuGKu-ZFT6ZwXir^O&3T$ zvFZeLG%Cj*_T?mE3w7NJ7{D~8_R@)s3sz+ifmjQBzU^YFXfOAzRMOy9qzU=Tn=n~$ zNE4_v8h`6iv9}d;3w$0$avrtWwiKD9lX8P-PG4n0Ip%>Qj?(X-#vRMludmjM#!R@a zJi-a#$@2X&wc<77zk1Hnhigh2_%EKGXp)6c%e9VSbeMnzkU@XJQs2gVI!akzqk-Gb zRNBrIN=2wz6A6&4h~Hon#Dv&VMhL#epnzVc$!Jqp zgVWzJ1-H|`?u3itMPgBi^1)1`me>v`YeJ_xa7?d`pt}#n9P8ZkT_9q5>dxgjbvI7Y zAeBuEHAtlswlWpc(n*AoUrr<};E ze&wq0g5JmxT>`^W!3p%vrBl7-4`lN)WAXABN1%k{gDG~stm=7&8nGtpbR@}x3zZn{ z!_F2|F9YQV;9er#Fk(DKC(XXzLZ$ooTyQ6KJynn z(FTZ3bH_jdmG`7_W`+~`vXKDodBbR3Ph7|u8Bx+9aFA8jg-%yWrS2sg zs?v%XP@?;)Iw?o%_SI8Wt^uWg&;Ke&99(e);mH!E3QCY@I+Z<*%uSlQFKs0 zTo6s7p)Rb{mGgW5iIZNk$vA41$^?y+fqXqNGiyX*gFTQ{9yv zrZHbyPKAUj<4!Valh_F|+{LhmF%RIajs-LSJY^II8iuoCA2aVM%g2`i&YAN4jSoeH#_UZgoxe zU@ovx$kcV$8O^Tya2?mEybISpXP$}p1QY+A2E$@Xorxb48;(Kum`Q8%w>QXy)otNA z0W=GR=r!GvAWirHGz}h$qPwjL#?&X{oaJ&rL;r|WixW;Pc7xBFyf>vT4ODQfHmh$4UW5zQgnF0S$% zEqKD7)z=VULT)h%1nETI;6g^PYIv|Ybo#m%ORTMT*hKEYGJ^9N17DJxB;J$2FDdzu zv?_JgEOq2xo9#KNy`TgexRi7Z*E9K4+~33!}>ejkcJ+~au+IyyznR1 z!3RIaP&`UyTTI1mA)rbt)#wP1EmBw2RVOkdQ7!xYesL8PPe!W2Cd! zl%2!F{BwyFQ|aUW7nq4?`F2Nfo~(O`(KNL~)+g$93ulKUHG)A>ggr-|f?0TWNR8xf zWQWXYFpCl12MWVdtT9lniK;DAfm#Y(8ztgEy`|8#{WVw-DZ7wn<|*TS;CzktCki_m zY^^f@HZyfvqv9yJx`64Y`pZ>9#Yl^*iL0x9RRq@7lA$Wwiv1%s2yCR%@D#bGmWfdG zK;C)jb{p5VwOGA&(ZnWdko40ZL!cD^f&0?aH3&v+mK%K9pLq?vaR3>piq_xnt!LiWuHSQlo(cDgbjnJNHdILRKk3i4Z3}UEg6G(?pZ`3#? z*Rp6+CJW`=Tk$|X3o*eF*1X~Taa<Da zrh(P+Q-&f!x~#`tMc#BqjY)gQL_bMl&YdRr=K8E@QWDg4R6YpOnJ7Px)-ct#?Qzc? zUPZS~GVzcA*?u3Q4NJQZx$i|~sx#$de zYmCO+-dY1XG@>VJ_P4+0_o_m<`JIS^20fp!Zq-GG%ewnCM05;flOrls z>K!BPE6AlUG#l}fC6}0+{r=OjBXHD&b$Hk?USy;qO-jN#yhj_zhFtW63RI~M#tCY2 zH?WB;IH9%(@bFjnr3#gd@>iUjgXNR^wO?e>%E214y6O|kQ|0RW?PMIT(aF$+ayuE= za<9@;{ew?1>0h6xdftXkdiXqiUowlDHeU*&)4L=bbM0sL@Zv4$Ts8o|$`HX>a%8o|Hq2>$W* zkvQOup!|Wl>3*r%2%d09P<_M*9XnN+V;ug}5e%)vW;^$8P&z2fu?Y1jt4Agj@g5RI<^S3J9e%m~ zKIm?`?3$`}`8D!5^!7YnDU{2hHU8eolw6{uQ*O?{K!tM#orSZpRdAPY*>vRH)3s>1 z4)rC2&?Y?9^`6B;b%c2?5q~?86*zV`$E;zvn(nB6;%9fYoDj|7{4IHs=F5}MK-G;r z_MFv{T*5t9C5sAzSyM6B@Q2~db-(6FtX`$dmh<#`j(m=8yH4uvUTN=&eAhXk9#*SF zoj|n1D7N!iR=LpEAlW>$2^ccYRl}c#Ff8P(8B3@N^^Ag^s)F^`aJS)3;CezONZM6% zA{Xw%4hJghDytDC52>5Oe{Da#KWwr0?Pv%uqt;o%@p{*&q7RKFU^L=o7};TuF>VgH)yzIrZJMk(f}$Xg#F z_;}*xzch^?S{7^aeWG0UQ3Rqc>&rOhZrZ?3EQN{_iE`CPSRWb-aFO!;9bi%{7JHSe zL|#IzDwJC^e>Ijj4`^fL^*@T&AXZ*mqnAtM-!vU7m)az51iednBv$^tMs>F{$R1V4 z&Q-Q>33-27_L(gk&XG@=2knI(VSbdyb^hDRyE+&}NlYHE-l2#ZBTv;@^lglNDL<}&lXONV z@n$Hcvq25N@8gqeck1Yg{@~PJum}bGPD~!0fD!JD8wic_iJrBat?`CId2u%(m7GMQ zFR|kY?M?FVW5qf0=5AEqP8yup>~(he^68`O1f$dh12{YBYSt=Ma7?zj(L}#0U1+%1 zb==vawyYqbC8j$8G|n!}hM!qm6`I@{b-fQ3a!*s`>!&af=+Pev$H5=<f{jmYy}SBF3SEns;ATg)V0 z!uBW|PSXre=0I%sC2ZgFh#;7wjIW$Fh(H;ug0$w+V zs*=LNWaKy~1<57>SI_vFh!E%HU|j$!CCIHn-!5sR_c@Xdy)RupyqN9Nl%GE1E5!LK z!Gn0a^d&sJ6IYU4&oQqe9ABt-%V9>C=-)=f+G$P>T*Dnj6h?5ej=(i-=?LE5p{wQ@ z!etvdZ<%=bI59Pns`2Ms@;+hiadP=RkN`bxH_myTqkr{e@!i;gHU9JZwZ#ALVAsI0 z*yYdx^1zch=I>wju%97%2xAdrXGZ2=HwK?IvLoAPPnps`_`?Hh8~KfGLN{6Q4M#-i zfi~mhY^HV^2h(d4SNr_OC2{JH^}NJOo|2{rc`Z`62_}npXn2OyL{tktfo?LFAU9rV zC#@Ok2_vyQsCKUwsSuWQojAF{b{vr;S_yMHm7U^d3O5EAVDd z8VhDY5y`OaB7<<7=&Qwg@&W)hul1h}G0|DHy8%wsQ{xLc)tc8^K&`Atiw8ALg9oE? z;Vmyg(YkWlQH|zNY3LxZL2OYPpwUiq0dv4l?L=_7w68(E;ikq#@YW_B2S@nppG@gp zMYyAN-%M8xv!kZaao}8}bYl2w!tX3ELY|}L6ou}lrw)Y78w`qCY^Y6hU&k|;)%6&U z;WS1Wd*h_`aads&I3X{C+?>Ce zxBFnqroow*oWY$WJ$yqW-J{rwy|GP_#fx5ay)IO20pS7vB-it7hC|I?_fUdyq-A-& zTnVld=vYE(Oh;^}ILJ|}m-EeRk&E7q_C_;B5PUVpU^(HwzC@Mx;>lmp#fa76?X+rD zJO{!Df$pdt<@0kO9UWam34$CTeRR6*(?q&eajC8+;>jhZ7PnGJAGMJ;9Kf3;9BSU9 zR72vhwQXh6J65TqLeqAlV5xG(K~R1Kf^98wE|R!f>}P7%Gi3gt0Uu6qgTqE5R?g3SKoNuttms2S|NglSBc^Gn!XRuB8vi%>_a zAb?n2*6O)-a&W~pRuH<%N7Uk)s0NjoQ;Dv`EvQ>>u>AXC&H9?gS%WoP{gYQBi9EvF zZerxCZkP;7NxQPJg6#C^nnSlje!)??O4bqkAmpTBOGLu)d}>I&^~X1SitYBR9_(@Z zlJKe>`nq4(YC9(5Tw=LYDZXki#OMSGRq`Ivt9cbJ-u55f0;ScHPcakDq52x{(bSa> z8M~pCCWo>H#8=z_Vv++-1`=mza#RSvm#gyt6F~%05Y)F>v(LSS#N##lw%hEsx@MD{ zMQrrlmDGuJ^%g5(J@h4N$gGbgupQ9j-fahNsyJ!~aGZA5VQajSMyJd6_90wcYD}t& zwRCNqvmMznQ*n4td)@C*iZx2_n%FsC^EFtX+>lBPoi^Um8aiE4sHpD7RAS7ug=+D0 z<1L$%%~#76c6mq7Zc^f-rEazMN$g%4(S$<|5HBRN0pvf8x4hA{UBZzxh_0?V+pYh% zjF$|{3%GQLMW>pZ`@CT{vy}c<&3$WR`%GvW$0ONyef-%MsMbZm!Wk!TaSm&=Y|Q3( zJ2H9Du_uwR!u^UrAm+V7woh-lHJg`DEwgxnvr!8mOM8($$1Sku>!q@OlGubBz3`gtY~{zHNrZ>jNDc z@Op{tm;qjY+XS!Usk}+5CN>_Ms=3Hb)m(JcRLyX}^{JXq=nF`B32c`X&Y3AlGG>Ho zY)K!Rj{dG~kw}peNjORhj5TJJ>CPl2LnUKysKj2cFA+-w;3O-(kmyvxktHX>eiHB? z4?}tx#CK2*e?<%NBu`esrhnLgLPQ3hoBwopXu-B^rr)VN!3wPnAk%2L<>A_`zB-OGnfEL($U)U231|342t2=+xa2)Heh)SH@&RB`E zF)LKnwR1p%t?w1M`9o9GqtPu&{x};3N~G2iOq5f-Yc!fq9^<$Tr8YKcp_#ML^YG{n ztaldH^U#C!oT=Vd7>0$`Gsy-PI>cq6;oO7T5jUM+l}|T2NZ6PKx@6!8|D7`C|J$^p zt}9JEUY>B!jAH#)Szw&3)d19R6ycH6a%6x@4{*ZN^Eqxq4xY(wLJe?gOP7fdN&5B+vhxJXLT+!s&^58^!(OvCjZS~MMc2m6vk|ATU0v+n}A5N5Y_ah1Gt8@wq zZRRyvX{?;7rzQ>~_llz!ht*fd0bi=4OieMFyUBmNa*Dw@3!fm4D z$KmQ1RNalZB=G4}h>WT?t%<-%$Ysl8#KG}C7UNC+9NsJK8ll*YZw$<1d&Hn6j-{I< znPJ!B^|x`8h)h&{shl%RR;kp0LAaZbKuGE$z$1}YxY=WAPiJdSMM($|uR62_CrHUj zoC4|Z9Y=514pZw0n*H-9@j#qpH1x3#1WI4Qkt#2aA-1<^pLU+0eS#2?x2qX&^zOAW zEUY|v0ybK@K10tG)HmJcGrZH^HTk#EzvLqFN10MtM0dTg%1Ma%Q@HewYq2MysNr-F z@l)6|M!IA0VwH6amoSD{x%VU%>jLS@`BU=5P+e07vF&6mhSIfR4EoxVGqL07Jg2$y zJj9*nH%H_D$e+V2x$Eb7`yg+g-x|%52BmV4JI{0L=ediN?^i=qGS!WA^>~)MHXCwlu}D67vfj?ug_tDM zRJ9vW#1L=Hg_pn&zv`^S5W^csc5O!87Wsk~6c@^kBNPd}!vOx0gRY|}7$Qep72&3lXxE}5v(6fcrY8`L(ETup!xI$cok`d|Ck7Uq zGu|;1Z>RO-BJv7jxuC>?R z_D*{-uEO^V_{kVPxlH@ozFFF@(wM-f3w>Bd*B+lor~Pw|?Fl3JciKsd`Qn{lo0o9% z1^$}koir?>A&I{NuaAJHrv3j{6Zkz<;WOu?@2i}oeMwz?lG-$hUpV%362I7@Y1)Sm zNi}uu&sF8z{~tetSuyDkK1<5NUwGk*fQf7&7ay?jYx4Pv<=Gxf`81CqSBzrs(dqv9`b`Mo1I7PuKRd@K zK$rMnEF;f>%)EOk&ZU;9AE)C(!6g0_KEFrqR=&r_=?p(X#}7RJ$OkF^$5FNWzmF;@ z>FxgfQ_G}d`UYYOr{}kR>^D~yey*>7a-GNcX)Jw-&QCBiaXx-O5I<_g4@`0Y`TyzN z+?K+8)|Ga<{kcQGq>t{@k6=w2$Y-nk_>&&f%&T}S#P5Ge;a(a3@xQJl{rgb;R-uV$ zA5rrGR&oB?Z&JH0e7tm#9|qGm5BY%X2A^*Hzn>6KCjHBABjAVd(thz;E`G%wKe4@) zkL>v8qW|*~+u4%%RXF?%MAGlPk4u`sCy;y~cMJa_peq;a{N!F;lQ;6u+xR4rf9R3+ z?})0)ptU27TuEX(2w|L zVa_^9XLYOR`v@ueDbS_-Qj`DvkzQAxy8Z#%JCe3!*UR+q&f_xlHqwG`%}r8|DPY}&X)F*lgWJZgcr(F`WM68mb3BqqqX0*Nu_m*8=0tcoQ=P& zs*5$L2_L$#Exwb)@6a2U+)Y1xm9#i_#U}ZW7-r(<@B2q`gD+h4+F)eIIQvfA8b5q^kN|P!H*h3`(lb=h^8>k$4i{65$_Kj!UjSk$*q&KYv|)jc!TRxwZ0p-DdGlrZsO@ zZcQ4ULod+!wqPSZBJZv5UEG@VSx$Y&!;L%A8u_IPYP&UQ3jY{fNqc?>v$uZVDZex7 zHh!8sGv5K@A9Q!kR5)Fogv7+!;}a9grb|dEgBcSNqGFf<3t@6XLOd^4z(2<&CS*!T zNV$NjPa*wc`%&Yzg*w`V8ut~d-*Q}-n2<6zi908<~xO&?`K@de0xyG z^{w52ns2r1xv2TxMeQ#N?a^zf`G%q9OGO<=Y1DZuhMKn^s$ZT^$8#a`#BYubUPt=H ze@FGZfSPYD?q;5Oc!u={qt<^8bv!*#{hvbhZ|1zd^9P+*ah}Qfe^D5J4K@BUYWz7| z$oV)L^4I}f$GY3_Guk)c8tUcv5A_t(e#W8p^9E|Zk*N7zK=peDbzUAr^>2#m-w4&e z4yu0%%*yfRMVy}5Y zdk<>eVyJbmj!8`TgMPbE^KZbHX#Wzm?(?Ye-B9B@qsF&Gjc?$*hV#nK%Q?@FOPK%k z8(}~Dk;gN2F6L*wkFXra`4%2yy&71C`WF0w`uyvO3A6D>Jcs-70oL7#W$CvD)qgG? zCVv-~;H#*84?*pF0BYa8QTy(Odb~S?Jl5Ja#H~Ee)i8Iugw&F#$L~(Om-^)Ba9!?3 zU6&sQQ~Tk)?4u{Xt@DC$j{EP|!uXA-=f!elKe0u~{^GMj9Zg5=Z!&6sLr~|fE8d5l z@Oj!F!$+_#YQ9RS`O2c^D;Dag5Nf`>sQGTZ>c;^!-!XiS_8(F6EkKU1`b?ZoJqeRI zKf^H_{cjI>>X}iY-;bD%yc{aO1OKE>#J{Ppzmk}6jd~|8#m=bn_b@J?u8P<3pON7> z{zM(eMbvSe4R!nk>NtKv9Y-tFK6Bu2j6XRdG2sL*!o1|uQ0qK{IzL@d^L9YZ(>m1g zW~g=Q2czntJ*tH2R~EJ2U8v{rwc(-vZ^(Sn8C1VxsD2;gCHlRI+D|9Ei%XyZY99}v z_Hi$=Zgf|uqk^b;@}TC)j2eG!SQvK}HSTBBxP76HcA~~@MveOtk1_5o)N#FzjEj#% z^&5if*A%s%#vzZ@bzVKx@k*%iDZ!{{XpiEkd2YwFeLBDSayTE?QTY{AehRhUL(ca* z-|74_=QEv8b^ea?uBh|b0ediCW7P58g+F0-JcMh8hV%6n>iORVwQf7qHpD7sq_fnYW8fu=)sCiDJ*7?!-KIc1}FGoFpXQG~O)9@L_ zy^9U78|pa9qSh;p+HYahI{8rRB%`i}vqQr1K97f~YoXS!h#FTGHLetD-0jY@I?v$z z=HQT@L!F0H$oSaLsPW&2I=%+mX)Nu?%?V~$tA01G~)gshU6V!V3QS04;*XjS~i-`$Scpce<%b8~#YWyw{hkW#v9_pwkAymEi0W4x)vs)5j}=4p%OC0}hU%9cwa;{} z{~4IJulQA@e|$$U+7Q~KHK=jRP~#S&UYF*CJoXOi^{6(^B)=bZe=CAH>38OZa2|%D z^6`BW6Dsn$S`@Y4f~fP72enSlP{*^N_H*g^a2%(Re$i1>zaLQhdDHm_=R=(LcitTf zv0g*e`KXDS=K<6_Nw_L+Id9X4+fy_2hU+o@@G)5zb#OYSAEocwNUfj zAL^(KYQB=F`Ld$s`?F`5?=n71`#IEn`%&}lM$NYsHQ$C%$Je0dTZWo%7OMX{A&-qg z`bWb<9SuhH?}zH&3UhK^@}QoFv!4yu-}|WRZzwJye-ZOwSIo!jVV9@FIvr8_YKz)e z^H9fAQR~!0t#dzWU&TWn%a7Vuu24s}p!%mr^*`M;?CTTMzAB=g7k8ufl^wOO%&2|+ z*(EXIcJ_6xV_4@bYF|I2*4Y>8XeVl&&8T&jU<&U;KEX2B05yLJ{EGeFcp}XAD{8*u zsQC_tI@*hxZyRd9<*51Qq2_xEHD7(ye0QSWXYK0{=G}#wcMEEsuR|SQg*u-z?NqnF zi|RKHwcZOMk9vkYdfItM=PmFbwp1Q9-#y5B@#3g?3Zdrtvwb+O3rHTFM&(CP`7Y<1 zoUe7h!uc%J^XpYSin&ma&!xvheH1TJzk?@vUiZV_sN18)4Q&_R4|c{%oUcC~OH8=I zx|>nwFG4-vMxm~QzE}&ppx#F|Mm?Wvpw53uw--V^4!49lb$#2!gadS0g}NS>q0aw8 z)bY*_J=|4Wy(Q6@(hNJoqLY<$!_$TxA2zl%&Y)N~!HsQQ>K%Lh%sBz6u z;~JsH)ed>ADr(%nt;4wAQR99^jXRARcLX)=`;f1PjjM+mSH^iU z=Y^c-b)L!jf33p0*HGgxqsD)antzA$&Cb_3U*vqY^BKH(Ch`2Pix;S?;2vI2 zt~UwqV?RR8)6I2B%*uY!+uu_Y6Pl5Ki~71{I5L0g0Mys1dGTk~`|RPc@0qB5Petwf z9n`-2IPdDbqw}`TA9h~bc{S(vJ73Z`G2tfb&qjToF%?-i^)1wWa0u!=JchcihBOMV zo2^ji^I_D!>Y?^k6Sc4Va5>}d4SDP?)cfvRP|wp0ZokQ1h>L{<-t{&SyCv@BB6A!<`Ru-re~V&f7YF)cFI>%Q!FPyomEm&i`u=j{h2J zf0t4F+k`qltDJw~e1Y>%a3SYsM#y86>{vStw{gCDpyufm+M{-;by}d-X^fhuX2@gr zqsA3Qy?*6Ijn5wPC=+UYB5M5K^~2+I6*>R0^SG7qdr{-Ig!X7XYTPQ+xCPEXc0SGd zyUvHBp3gl|udm(kDaLg|J+Esc^T#WruAlO#`R_)}UkG(vc|#t{fZErhdWi`|$fu*8 z-&HUt^B2KHuFqW$h4u}|>vigv$bBz$94dbaHSYk_@jitcnYS5gzK2lbs-njIRyVXC z!dr+&;S`=9eNpG9J8J(=qW1qdYX6N;{W78Y{Z}XSyN2p_8P)F?D*xX39_QaW{|fay z`ZDCPg}8e$@OsQS)y`jb9h?*aFn!+8On@wnRM+wNYO` zTzD{?$DdI1?nTYJ9X0PJ)VyCfpXYp*^J&hg|YWzm$ zE1fTO{+aV>c$9s-Xj|CZP+wOi+3Qt9{R3vBy%y?t|E`jlkc0O%D=<3_!mOBzI==j< z`7`20-1k73rxl*$Jk&wm4@;o#cX8DH?sDZY??%)-6HxOEMa|O~wZ9#e!aOTc^Grj{ zGZ8gUH`KnWqUOnln&*1OFwX_lJOfet>4KW4C92<^`@``zLya$oYQGb;kDV3xAJ*B3 zTJJs7@ee`HPxYe6ys69X3-6=y;Z26*K)uh&5ZY6Bmk;-s(dEMZawPJ2#$Lp<`z7i+ zX&&06RMg{K5A`_L#D&aTIpne8sOxh_+3+~6!zt`z3TmElsO#ko)I1|m^K^3F+IchQ zjhyF4t#fP0V;QZ!$)){XDHC4zcc9kUfLdn_YMo`Mbr#|m%<~DZW}k`ohIxNa3G@_b6&yG3WW6$DC(( zp84+ZJic0*?~|~P9;oZ%5!Cfx2le33) z+fy)^_JVFtM$PkI@vzTpNFBd|+UI%HK98Y}XE!cpomr@L-oy0FHx{*iYb;CurpWbQ zJqb1LXtCfr%+9#^IG29!;(UC=^$^tc*9HG&zNV=Aef`j$nhBTC{`Xzsx;TTnE`CB? z7kg3H#bQ*ynaI~`DaBFq=Eq6QcdlsIPcu~esv_aOwAg-#dY%3Nb$%wH&d1nL$48?c z*P+3vUuchdq53_II&bYz_q&Hs{i`DLMfaon-HYm%&v_2#nVs{KG->&PJHywxJ263z zH|p!MzF3Fx_u;>o1@$@Cp~7MR2T=Rpg<5Y*sN?HV`}s5&O%LtSd#HXBQ2Tm1#?R7dl~c+KZ!(|8T)@{7X^CAK{ZqFj)qt2m@9!HI9i5gcO53rw#sOz;HYFuelzoMaz$5H!;;ePsO4Rw?* z6V^LrKwLv{j^^xOAy&Ls?ltQR^ za$(v&umR&L*oWHx4%E1BLLFa+ns-?+njhMu z*{FWgQS*;Nou5=p`#Buc`MDVj*ZWU+jPO9%`w%fw^uTkSyp~f#ojsMvB6z3D2N6rU1@8kR#=TACs?!2M%I?k&(zsGqI z=LMX{oF_Z~CwJK2Rn-1|L+$T7ypQv-84qwi*5cQk&)K-2dLmwKq}TgIcGr>lXGK-u!BOb=3YUV%qZ(b={Ok z9Z%6v$K$B$CWe|nYpA1iA&+ik3;nO6=KBpb-&xdr$DJPvb$mZ+z8$FfHikM{8S-c; zYW>ep^Sy(b@0F0pUPN7Ay+a*!NA>TFI{)o3?fON{-vArY{y1;GDsbH2XA0wYpsugY zsPXGiiA^Taf}T{uY~q!D5~EJsQEgf_ER18e7YYS(4HIh z`f&^XMSUS-c>OqldSAHSEDkRMa|ehdPQ->%59u=Ve^TJOe`>>xz2+mmBqdCj(C5 zzHtjLb~EXJiXX1pLH{lIIW|G9*ATUj+Nk-fhB|&f>iiZ6Mz@CcC@ZR8GHM?uc#{0b ze7jNSZ7FKsb5ZB#V^sgCsQ%;eANq|%^?MQ3uP>_Kv#5R@QT>{uUUwfxecfK$?G;et zOQXi$g&H46jlUgro^ypfmJxM+uJNSQb#MfAeEU)3ccI2_L5*J#@@RqcInF^+ol27Il1` zLmq2`8#t~qScAMIzJhsC^JPQLmxP+{-^*dXKT-4TLyg;rOPF^V(lx#i`7i!4|5F~P zqP|`lkD7llYToBi^Y%dP^C{H4Eu1%UUe|eb=OvuSo#%0$)43Mc{C{2w^It;Ee-<_W zanyM@81mRo)OnbOI-Yk?`y7RuXE17?{ZaGuLe29qs(&@q@!yO57cas8T*LyXCzYZUy{X^HUq0Zv~)cD@WA;lXwuZS970yQp^+kfN9!V>YrsBs67 zDE>97|8n~v>UzwAYdCH_$x5=1Grxx8{TX$<2T{kn2X(xgP}lG4_$zin?Y|{5e`;Q2 zs`%d*Li=_st8u93=R(vz_(PLvpG%Cua@5bG&T}`^x}8z$wnMF31@(L>>$()uFP0BA zE=Q=N%&2kcP~-kNA0Fr5Q2l?gN9_-G8|wMZ->gjA&qtV*_1<>=Ch}kWN&ZKVV{1G| zor?Opzoxwnbv$bbUr#3_+=FLO$A1{rZzpPA{>F5|{rDi3#!`0c zDZb36UW$5L=b%1cn1=d%VHBn(ZyECH58|E7yWwP-sVi+IypN&zP}j+yClV4iQ6ELU z9vs39>}wC|eZqRw^Jpn*e`DfaT09Ic(-gEM$ND1`g)>hW-WZAU#0>rv~D zLha{q)PAy}#@##?#{G)wzX>zZZy9R6d6<#w?88t;?_)BL+eFlL_9!l6-w&bgD^*eB z%Au~S40x6H%SXey=TQ9*qRzusRR6W8{;#0cf5Gj2koDtTLLEJUTE7iy{c5;`{>4$p zcPDnH{SJHt)1&75>quDV5^BCvp^lEA<~xX*Z#8PZ*{JzG#7?wNLCrS^HD7HU<9^HfLR}8gIcIWAx|Mzpq|3c-zq3$=o*q4w)iMKB zggRauwSGJpYV$^!maU+k@FwDet z)CRS$qN>?fK~%pysQGe+I-Ui!uTwvTbq}G|-H+g z{lxVQ)N#LtTKA<;M=zkp^+Ap6j%n{hLLO^pTiAN2=RsB16>J{V^E17@crdJU3bnr@ zsC5pa*4g6xE9d;OkFizd^ z*nn|~c$vrP{P$u0W2pHLq2}L*ntuoCe5?z3>`VK(ooC;}wEF{Uzk@=1)DJaZPt<%} zQS-G8dF)Z!*w(e>QS%i+&6hW{N4KKpy9G7hKLem=Gf4z{$s^NC#FN^v*Hy`r)lgck6 zOnbe$u|FY!r$qb$YTo0hd4EF9yB{_0dgm*gf9`yq^GVLfI3MMFsPkUVpK{*8d28nn zpstIOsN>9!x}V;T?O8tuHo}|x!alE}_IVMt&ofv7e?X1jiyTjUJJK)y4XWQ-tbiY3 z+WAJ!GXa(JE8Wua{?2h{lea45V_c^bl-sil8dY{u5^*-lu)cc%AkcTS%%kFS~ z52McS_o(x`8!O;ST*4HeqW1Lx-bei|wj&>hdc23@QP$6n>i5sCFz;p5yysE#o=5hRKGQ-e#=n(7NVXfb3-1RfqH&NsC7o5#t#g6^gL>O57hW4P_HXBQTMS* z$ba!1{Ex;Zqt?B-GmN{28g~Yj|BT8HI^W}b6>9y(sPi)wbzUZ8TgHz^-7klu=6L}% z&vU5#J%d`O1!{a9)O;0D^OVEZ?JOA@J?zQVt^UX)~ zn}Pet`=a*K9krh)QTuruwV#Kb*LGgb`TfrCMLiy+LLMuGdOUKX*2|2{AHTUR%zqs< z{}t5yr&0IuBlsQlL1Z7Xov3*xJ0Fi+;_)|}4@N$xsQw(PUpv%sGz)pu7`0Aa)H?T~ z&TD4WUexn#^Oo@bVLj@&_)Vv2`&t_6_yW}VnT0xEQ$ih$3wiVg>NrNCj$;VweDx1` zte5SGIuFfp8t?aOqt^d*bNKw}IO;mzkNO;HW-zrca!JMSLG{mXGuxZrgwKOcppO50 z)cxceRR5Kz`^h5I{bUHL-{YwB@i6KRyq{SdxMJr{MJh9VC^N^jKXikL0Mz*2sK>K4zEA&BsGnoF4e1|cLB>bvQT_jAlj{F7>iD;#`mIOxTaD`X z1*+d{RKNF8{l=sEjY0K$1=X)7s$V-)zh_t^?YjVK-x*Q+KKfKY?1OEoz-dQR~!pUfFqh=XX1gpIf9CuX=QEr~&PO_b$@u{1MNp5&T;3f0$N732^*a9m>N+WlKXY9bLVaI;1#gx% zvHy;EAI4GFQ7_(n&7fa<)ODX9weMW0ecysQuJowm+Pg61TTuCWRK5z8e~5bg-aySW z4ApNCs$XAJzjn@>IdAN|uJiJ!>-yY+a9wXlUDxB0m%{i%sQX7*)aR!;a4Pwg&%*V7 z7InRUi#ks;QIGR9WIwTYk^RNThdMq6wZB(T`+EX4e*x6iP-Pdd-n>@h9gcB%ETu?NI%jpz_+NyaMX_+&niN-+ENO8kH|Yja!IX zXBui><3k>M1J(cKP)9GK`ah5A-wL^eQfi^DhpO0z_6pbli=d7_KWd*@QRgukc_~jh z@hM-o(S8VdX-xSV^?m8(sQex0W1aVPUK};=+jG+P7rl-gPc#y>zagmo^~c4`*9}i& zedHx0B`0bhdp-%ryB!%H+k_hbRjA`DFeCLeJ2A9JV^RHHL#@*%?Yt1`de4X%IgWp4hvWGRwaz8fIww*6wxjy3#|*d{)$a>bzuBns^A7UXA*B}T zeQ0@1qE3&zB*%}=3hjGQ?bA^0V^HU50P;RGwKeK}%%hlr^V9(K`Tf19ecTn=qk@>s z_&lh6{QGgpe@DhezoPQfsQd`(b?sotW8a`&&w5}H@(##xq&7zFry^=Ux1;ux3$>q& zsQvspGpu(4wccUWdIwPJ?Lw`$CFHSXsP)>T)@zDd?+(nwdNI`e*-`Uk40SvaIqrCi zkHUJ5Q0vu2^{b9ruj7Z|`PUdVUp>@(HBtR4hdN#!HD7Mj>%+Dg;W$^J>NoKb@)oG` z-3Zgx!?g8K>m@q>YkJ5pqw;g8{9DxcbvaGu$DI_E#W zAHKfYfvY(s>v1#lE<`=QCZgtl19jZ5pyq!GHGf^ybxbUcv`scKl zr-XTbLCt#%HSdq8ew$JAt`B)^mGh;cjxRvX`*ARu656AQsCgpPJTIW`=Phs*K8!7C zFOB-#wFs`H&VhQL@ZWo3Uw@$X^&4uwUr_TMMLiCOLLS?L`W$x&>O6fK+M}7MaUY<@ zz3F^}^C8arJAVST&uXZBRzU6ZR@6STp!WIKuhQyoht&4WCzZM&9RC zuY<~)z7zIW4|QC%Q2ToTwZBYwlYak93h$Gypx!5ajr#g~shx|uU%zgLxczz8KTHh$ zccJ<%vZHJ>jBz{<;!N^t_$BL?#yQkQa0T_nw?q3G)cQZ7=G%z6->pH8BeoE~;W($F z&PNAKX8vMWhj|L3=D#{2%zG5I?jhu@dwc_G-LG&N^(ePDLCtd;YMyLv|7m>aw;4;3 zuSf3R)mOQ_C4NEwyPX$zUdZiP-JTJb((ll?aGf7O9nUV*MUD*QpAq=T{ljyv6V<&hPao z+?O|^o@XnOJX(rc=QGqgFQE4Iyz3sQd0L^yJsj$&9%@`o)VPw)3p&s1JeTu--VFQy z1-1X<_ypq)VFUacHUDzdz80hApNpD*H0t=8ppLI0YF{-`$9G^%_}q36eop`8u0O{` z)H9Ir)yv@zj8DYbc>WE3jss8Q1N7UBhpFE}?PnBfKQE*9GZ3|(Zq7S6Z{xg~^9P+* za$e4PY3Fx1&*?mi^CaiLzaG{u-0y-uY_hUpSxT{C($>oR4)r)OkPW zy_`Soysq;q&MP=iaUOS`+j%zU8Ju4q9rk|_wg0oI{U1l|f3Nc`&euC%73$bL=N~$M z-}yw;_*a|{a^BB*&rrwOJ8$kh)pyiPAymG{`8MYpoiBAh*ZIfJr#g?Ek97W$ z^8wDgI)B`GE9Z|muj%}L=VhFibe`9FcITO#Cpy18D(wFk%)oIRLml6bsN?$ii?;6P%BBKEnB6=RKTva^B8) z3+Hv6S8-m!d5ZJ6^W4s}InUtymyu!rhf&A>J?i*&qmFN#^JUH#Iser8d(Pi-{<`xK z&YySQ&3R|%?Lr-E?EFFJRh?Hrt$&yEJDlIM}+4Tc5qw`kIn>ugk zyaqnZ_)4gCQc&v@MXi$uwN7T#IyYYq`@N1@=L%|_U$7DRQPeyKQ1fg@&9e?Q&*!Ll z=7c=@2sO|9sCmX=1M=5V^Sq3jr$1_*?x=a%q2_58@~AOtp1PrqJ%IJd%cJHg>Gp!C zd2U6`lO8qC-$TQ3{ehb2*HFg}qw?>Z?{NN&^JUKGJD=@*y7RZ3k8=L9^MTI0Iq%@S zjq_&CA9P;Hc{%5$oo7PcANEW{z5l%NQaE2%a2>~a8uj(lE~HV4?Q&>p>rjEnlB#yuPA*b~lMI)B7@1Lswpmver%^Shkq zah}b2M(6q^*V^Z$A>r{jjavUGYW*KV9oy=Bt@AIPfA0Jv=aZdJa6ZQQVCT;{@8SF@ z=WU%o;=G~r+Rn>6FX_C9^Zd?lah~Y>pTS}Of1r+U2kPtAO~^}C{43=A$LHa6+CRpH z)KhT*zJvO@dpyph?u#1V13#sH3O~YT_#y3$Q0vse&uFiP8ea*EQ0GI9&xIPF1*hU) zgTnYrsPSh}8|Jp7_^_!0aX`hAaHvwP6F?KMj-vAsydv8>~$MIEcX&*xMtA+h& ze*o35JnHdGK|YFz=RiH48BvdC0`jGI{8u)i>)|x&@jQZaX#ZN${w01w{WD0$j{SMiE z_&4{lZNb!yZeM8^+8KB|$Nj$Ri8jJ%%=apOh%dVyh%>04bN!5c+%~iIY*pl=uy_U3 zK2zLY9QC}(gF4O}sOQTW9y}fAVbpPci#p$5qvlzO>bJzsM;+(PVCn~MpI~3J15wA> z*Y&eFk$Jk{2iU=NYkZ%&sq2O~g}S!us`wst1=lG!nYy^^LijFqUe~$s9qKHo{U^Eo zM*nc#{favNQ#gVAXZt_$8#bt zd2v0tb^p2EH;nrgxh2OBqwY5c-2N@{)Q+!2o?7uGZvOd`S;&WKS?fKn)3-+Nsz1y!bxHt6~?1jhh7LNNn)aP9r zuqW-SQRib3YW^AcEWYRV$n7ssjFi~`8ZV*tc@kSuAI6rr6l>sT*aBx`b9~9| z1MpGm-q;N5xxFSfrLK&RU=Fuu!Y0&-n2HB^P&NM^dF6=rR)}qef`ZO1F z0_(2Bg7_uo!w+yO^N+^D)IG2!X#YS zFP+=}LVb6B4C6R6LR52EJTg4OYB)c#hY`p?BOw9iEC^8>fPiDhXYg?gS1#cI^O z@jLG49dQNyo8cdrf|{?m{f8&1+Rvccf5xKB^Ml)0xqU9`>y}xr-^Xv5{}t4}2Vgnw z7o||&FDi`sdC|PMhJIPyp5*p_xEZMZBC7vsRR5pdzSr$r-Tt-P-$z|%<52s34Y^OH zK8H7G@9y^csD9O4mvVlm>zmwsl>dR6=NM}I53ZLxpYQrT=i^-uMLlk9@jTXXUKOiw zK1!g@%WYU0Goa32B5J+AxasNZzEi0D5dKKM7qfBx`(a65PaESA+W+FFn8dhW?Fst< z?j|3I`uBmoa1ZmgMqLk$aT?!8tc`bao+_f|DTexbyC7;mS#c}l{_UEOa2w;Uq2@Us zO#L1;ZX)XOdL8w64M%++{Bit`x;~yzJ2z|nyw^bdne{89{=H%fuBU%N)O|6t+yCRH zuJ#kCuY8{^^^Tf%OOB*YxX)+DBK^zu#|%+D9eK&3Vg>n&;Y+Vf-1qNWC9* z+&fY8twSC6P}I*w7sn#(t00!go4lx~-_w|hc{{sqXX{}`-l9|sbyN|Pc|6NFFNu2G zi@MH-+gUFiYTPwmoR~klf*N-|)UlJOeICMswC_P3_j1&@&rst&L5-Uc>ezdzapO?q zUPX<24mIv+)VNNlagT*M)(Ceo?paEH<9-y^GQJ^d-s*0zXiK8b-)*Sl%;ENA zxBtb9tR9E+sPo&47g5dg6l(tFwg^__{LX5dkoJ4@rl9)0f$BGx7gfza4OQ2|ZLE7g zs$YuR`|zTx_NJ)zhN%8E-F}=GVYMGZweLjr|D6|QwVy?`A3?Q$%Zsnt*Q44O+c|c+ zeaF6TN7(0W58KYRunlZYThW%b1?{aigZ;Z{*w1hFxIJLMwHr|TU*USOonxolckJtS zgni!juVu-(B5h@*uNj~{_Sylz%|2B9xuX7EZ533*M9gNDKL#;Qy zZm3^F)dO5V>$;=sR<0YluI0J}>T!#^J*V6CW=ZpXU59^n&+}yw>UlH4bwAW`_D1ce z3#$LV+F`z3sP<*3_V#XX>GpZsTC%&6z-?>zW=KQs~b{r6E=f^l6@<2s?nwMJdvWw9dtZg4T^`E(VP zAIGAszt8m!yB0NW8LIzWx6g3ey|EY5z;a#5&$4Yl5jt{Y)7@~W=y z#=EGCyS^Q#@H%;ti$`C7&qQ6n?}R!vKk9w3_x1wH$SGfH%x6gF@J8mE2 z_Ltn=3Uyu|#JrrR^q2>ia`DM0@DuWLT-54!7}f7%RNl;f!$qfleJ~rx(-?Ihco4O} zDz-H0d0jZv(H*Ggb#CWbQO9+Yi%8?H*~|8v{RwrvyHNL&O`$zni<)mmsAKa{^G$a> z*^akw*nz0|x})B2rl9s&G~`hnHSg`Aj%9FugNvJeMt`F6i=mDkMa?q@HP5ur9!*B| z8z1UeG1S*D1yJWJo7>Z&#$Dq{qxr9(#+?s!Y%{9=de^I*FAa5k0qVR=4MuN=_9#Nl z^J=JLFQd-S04zxRv#9rrO>r0Pmw1xuao>$Po^^N;KS1qo0&0J6qUIeH>R5m0J)C!O z-og2Un3esPcYQbB$@p7vF7qGfW}y4f0n9@CYS)V}Gxcm#ze%Wlj6v;V6lxzsLmhho zb$q>0$M+QK`0}9MkDe>R?@1#64)r?F6Lq`~qmH*4>Ui(KjLe@CwN4h)I!U39{ZTyZ zryFYCrl_xj?nBL20+Tr2KZ@z&2i~7!Htd0!uoGtBdVkC|LakRT)KL{oX1)7D9lHm0 zT!mccwYh8-dxM*cuIr1)eDPDrI?)kKralYhACfi|t%H88zPs6FX;i-_T(@!FEY$JF zsN>2PjBn9F-pmb!?gQ`OarMpYHrE=cAmz?0lf}F3#II zZ|S^=^BT@8IKS6<3Fmp7XLFv>xo-ZtE`H_7q5Ypg?f)=p{|7=Hn}>RTGYR#0^szN< zR@8Nvgz1>?m%{wJWa`7n*ZHZNFg@paEUMoqRKM=1eovtK6+k^6c~JYxiP}fzP{)%{ zkH?ilKHsSQ9>=uv9qQO-=WCoVcfQE^80W*C4|d+qc?IXCo!{j=?mQRjd7XsX_gS9& zI)6t{`}qO2pS_`ut#ZED`8?+zJAVarzk1$v4`k|iW7K`90P22~6Lr7(Js#>`Q1`3D zsD9f~`&f_K$7<9*z6f<}mh<zo89nt+MA*7mpM`QyMObC&s|TTuD{x->!<>bmTV>emXBsB7SH>N2SJcj;04xsfl_TTuO1 zqWaHp`ygbUl+}5|`^TxM>-lZuJjC9#Lr{;?^P!HOMV+56&O4yaPczqzY#m$8-ix|l z-i3PKb{p#XktO6&deprC<_YUxM$LQD^{oNYsC{xIzbg23MxjpRfH`ID3LmmB$%D;EM4K>diRKF#mJ^BpQ zZ+56-@1pv>iRw2Zv`0fw{rZPG*3Eeb=WU!fb6(eZ73US4r#R1tS|^LW84K%OMP2t7 zQR|%vb?l(?ozAy7|JwOt=bt$L(D@YSZ#W<3e30|L&YwcV`8-@0$E@~guLmeya zys+~-oac6)r^?N_GN0U(Vj16^csPlf# zdpUpFc|Fv9v6AbusHc1!b)UJEJKP6PqV9{EU9UpA#22Ib%|Pwr9n|A84z-WhLmhk3 zd2i?4op*NL9CbVmQ1jFX?NMdaJmo?iD}w5m2h}fIXpb_Y`su@C-3Kn+8uHVq{TxN* zKZH8=Eoz>%sCm8!?a@M1zd50feTe$H^aIxuP|w?usPO|)<9mfX>V_KMDb%q?QT^(p z`c)6@Q6*HrvZ0QZLftnCBe%kMKDTE>1bX zT-SG9#r5r|{p3L1uW#n$`)54CwBL)U z{7k6h$C2^z_k+>+&>oFJ^?N1Mv2MsilhW4pqsU86ye8`Yc020*VHV`p9Y4yXs`sJp zgIiJkRv`aH3-}-HcMfWu4?`UrkNg+C7V2m?DjyW;STEG`us!l$)I79Dsi=PSLLIA! z{1@F5>Zmv>FBIxnZqz*KkpH4`B29Wq4GVUjs zM?z@dj|@%WoF|+m=UnLj;`+MiWqxF}0S?7l_!3^@>y~@?Q%aXG6<6ThxCjU1WGs#2 za3BuD3^)*zu@9!ll2{B2;}A^1qIiurK^$*}gII)mH$H)j@J^hAU2!xP#$l-b9kCE~ z8`qVwAaz;X%f54BoH`R~-)DHSFMvl;KUlx7>%5>?88vU(GBxrM^yg?7^AM` zx+LC4UD$Od%uSu(`V23&pRtdln2Yv zhx!^{*Brx3cm&VjVO)ei<7C&hu$1hItdEQ#x|1g=2MUm1&27k0gfn|%^> zADo08aUxd6bXXP>F)zN2dU3d^{qUkNf%+(p$KCi3?Q`&N9EV!3FkYa}iDz*)H?eW_ zpMz(p^}hNStc9mBFP=ib&&@E7o8dOuJbtJLH0G0lUcsJr3g)D7?z>RR{-bzvMy zofkJyU*l$50WaZ5+>Im1x8MuZb8tBI4D3ri42Mw<#QxN6@MY?z$h{iK;T@4^+R=i?&ObvX{xo^SXibvGPDzmB+qx)#1jT^YZi&WpM}bK-L9 zOWD{r^%-17y#)tQufvC^XJCKo$@muaK)jE-557X(6#G#(K;7R;VqfaQsQX_6K2Lp( zoBD9-gZLcvZv2#b5%!^;gSt_y!M%VK5hiDi-dfA*aCEOjQ_OnrtI ziyqWRQTNGp_zdcO>&N7iu{*Wix6Y>SgWagRVMpo)_%wAbycY|j?w5ISE%`MT?LvJC z>rn5;D!2vD;T(L5day60x+K=6&V;=7WY@v9p+3rs zn(p5R@q6kO*nxTxw#RY!IF80g$-7}Y>W=sqbuE01x-u@M&Wrh|bK>XJmw1s>t@oY# zsJGyExDF5E3~Wn28TI-z5ZhoM{D!S z;T^aFxm9JKjJK1I!$s76TzA9m)D2LtZ?*6Sbzyv%Ixqf6eT_E_jj1o;0_xq^hS5S`dLTBTZiDryn_?L(i+s+Ry(F&0OjwV0y*b%WeKbAKL+XQ=fGe;r zF2euF$6+1n(b$l>8`h@ohS4Hxx*MiYcSPNH8X!-N?6pwWLrK?#U1xHgfO@>o@P19t!=tF0dtU+%Wd@$} zY4h-0OPhzsD4{AjdrPQ<*ErpU@e-;(&jr23%D&t63d}>zHI$Z5#_aqz&h^$4w_OvbR!#0!EO;7V4?HD|0``B()H$(Ni#!XNj zvESRZcDbEpr`j9bEH&;AyTH!2Z`(1po9$?u*m|~{EoJlA9QI#s%3ANLZEsuJZQPud zZ?HY=llDRTfc=-7ciMb*C^uu(1ME6(#;RA?TDGzs%gtH&tG2K0VIQ`2ZD(%Y>i?L{ zz|C9rf84a?d3(a{wp;9VZszKD*?!5*T=il*)lRY_?O@x@cC=Ht`D^?HTb`T0>e4oo z)r*4KH}Ya2SK9|{Ia|o)u{U|KQ2)Q|_jZ?k&UUw_crj4_!*&!e2C84O-E2qO&^~BO z+QK&3{>zJq<~eD9vYYK%`AewX0{`E@lidiMpXKWV_c1btkJAEA_wjU~o#U-~@ZFW~h(by0)5~SR>?b z+LP5o{gd5n*V>Qm2X>?#Y@f1^Tm7AR?XRXSX$#w1Y?3|8i=+A|WVSlpw>}PhCEmS`A&tvD64fRYr&W^VIZBN_QHnTNtC3}}GU^Cl9`&*f?-f8=t z-Da2Ad3KB)X$#of?2&uJeBaw`c7vT~XWGb)vb}6qJC!%1I-is5z`H};$F{dEZEah{ z7Pa~9iPB;GAv@9zw%u$;dyl=#ZYdSUud_4kWZS{EvbAj$`$5Stexhw>o7)2RHhZW< z=&!$Duk-MMooGwhJME0(q2FXX(Dt!0o6TOoEA+o?f3SP(D!asfU?~{r2 zz0LNuJ#1rJ$7ZxQ<6+!VJKyT>itD(aw+(D9Tgu*PFBAyyFd zJ3@Vny^=4~=j<-K*)FiN?HD`KK4Uvu{he|eP< zebH{Q>+C0Xy6tQqv!!hjJ2zLD?;|@TXQ=zxwziqAZtu56>>W0vy_qA-v&pWp9c(Mx zBYWugq`k!^S^XVq9sg;&%Wk%x+qw2_JH`&My=-gyh^=DF+q^cX{WEJ=|2MnOZnpz% zAN!bn)RwkIY|UH3e3fjkETQgd>)V<(i%nx5wv%mZYuZZo(M(}{Bb#jh z%^2FZ+l_XjebYW}Ti8D`gmD+_e!IgivGZ&us}I-oxSmZ89|5!=dav0>Z6jO8may4uvTe^%>$qFmTG!J) zcgaxM#%;`Ay%zFct^SU*#?Q8|+M)l`&WEVVr`aoihWeb{W4GD`cD9Y|C|ko;v~e4= ze_svrU$H;fJ$9L0U?}30@9crJkoo!Rwz~;3%?TNEt z{X=%J?Q1ul3HfSU;dH3)u{%$N`WyS1on<@Ow)T&cq5lQD-|n#E?d!Ibz0+p0`sT16 zkKHGNTWpQvp{{6$9Sik9+u1&5%h^&kyUk#KIvU3BvsG+)8@Dlgif=L}vaiE-shw~2 z_ivSVwWVzl+w*^wb|&CaRN3E-iij(?Av!7%ML>l~01*Y8ump&*L>56ur_)I~&?M<@ zdjaAfHSVaOLB)ME;sS~Y?zoJCg9{8gh>i*_#2vR09Tx^2{m!ZLR&{kH8JOqm$HzCn zd(J&~ty{NlH{I`>JpxaKL*W*A^IG$7hWfj*s%OHj@}`68EpUIhC;aXmvws0!gR5aJ zjKESj683?|!cFofjh6QooD56h0I0tstA3wtFm8e&I0@?Sv^sw9R;a(bs_6&4Wo!@I zy=hv1#8K^!{=@hH{OAqS@4$=U|G^>fB$#^L{Hx&vI0_yD_k-KkoBwxk6MPFUg$rQ= zoDGvue}7WzKOUY6`@;fw7(5W}47a^z`R|3d!>i!MFaf8+iEuRR1&@a9;coC>>#UqF z;R1LIyc}Kt-~PM#uY-@lC2&5}-<{O<4}}9@cbE^qd)55DfXm@BxcU{duY^ahHhnnU z8E$*o(m#M3;Ir^?_-8mDUJfsSRq#*n2zW63{3XhPSHg?nuP>VYM>r2&0ndR^SPDnN zLf8X#fbHPdFIfCf;99r}-Usi5vtd1qz_Z~nI1nBI4~F_9PdbiUSJ7^`0j`42zSHk<@0yr053S+Pej)ujs0CtBR;XZKN(^ik~ zU=w^Bu7c0N`{4qZgwx<@umpC2hrpfTwx_Jz&)_Dw7OsNJ;37C5&V}c~B-Gz6)cH6G zc7=z*-QaIeQa;=S^>+$2|MM^m&wxYVN$?1GFuZ!X<-ZK3U^NWENl<^cP|NEF|MR%% zAK-(JnZ6eu4m-l%9yR+<@DunRTn$&krEnp<4qgT8;5l$GJQ3!@POvTf^%1Mb7w|*4 z4(jg&YC9i=55QaCwXhtX35#HVcsT3`pMKclJ_4_T7sHcbKe!KU3)eqn`PaY);N7qR z&W6Xsp76b;mj55{r6s1HgZD!Hojz^o@5eO8|So}RY%75D;t1TKa*!fW7pFayKz z3^)S*0k(&`!GA8YazBM{z_oBWTn2B4H^7VFxln(vPuo!j3t)G+2izHMUTFSJ@J0A6 zoDb*1v*AQo1pC7y;K8sB{N-LN=L5I_u7Jzoo$zLO37iGP@C;Z4`@_TFf$*1mtlaP6 z`|wTpG<*ccU=SbSlAir@AhfG|9ZFaM|eM60GHln_J#2IJ54_Y?}E3&i{QDi z9G(e_;UIVvJQTKrdGNkQEALKtHM|U_U^Sc!OW`1RJnRAwfxE%q?yz!Rg)hP}a5yZv z-TVf_du}uRXQ;nVx0Cd1J&eLI90iBLp0F$I0NcTDZ?$-z!#Chs_!wLQZ@Jn0uZ4#| z{k=4;*S~KvehW9k_3$t7F?b8S7S_RY;3PN}4uu2YzHoPV&5c(6cu zg*RCKJKzoTO<_&WCg13>b&Iz@M+Se5b(@m=8O_ouK}XnAU3( zd<(9GPr^Ikjqp5}fn{(q+#T)&Kbd3Yya!joXW&)vVmJ+!!$aVH@IO~sydU7J@J09_ zycb>%=fIgT0sjO~hkL-C;ip$xdGEs);9p<{*1}0}EWGmy%YQT63$}q6at=y<7dAGqXV)Aztb;Q{d97n%KA zn1(g*G*|+UhdtrGaCf-qLW|c3zpOX?5&ZE2)BlA3fUm&E;e+sII1f&TF*p&9hWh&_ z+7HLTec|r#oAb^78GHxo@11DAg;0ObMDsJ~;O@xOuZ!GFM&@JYB3-T~uq3hW5? zfoIfN{L|nuwWhnkf7h7)7V7siYkk(iC*V>zAI^m-SPk|2moo8X z5qLYi0Y+gM7Q;dCFnA#BHqGL7hIdz)z73uSGf=->U#u&4&g^$7q;LUIzjKe9g7!HDm!;bK`(H8$Fcs-m0XTUf-8%~5B;Xd%EQM3n6 zhNbXu*b!Eo>ioOawkHdQP11LQU!G$6AMiPNAG{8p2dBW(-~iYawuk>N zvA7?>SKt%yPIwi}2zQlwgeHrwg^5 z(jmr^;8AcNxOK4EKZI-HvmLiM45w3y{!kgelum+wEi{LTv z0Ql=4EbeBw9zFx_g$?jrSP91n+e!cQM|VN*h5qqmvo{H~AJ?ECMc_RFDAc%X(T}6AN1uMGnYTWhcXVCYeFM%=AN1^+n z^U-^tzdzC9z7Jm(YW#cA4d`>xm2e0=4tqzme)+xT|DwOeeM6}FS@a@!E$Oq+`u(>$ z4yB}@ggy$r5BjSU%1{u4xBF3awniq zMt4W=hu+f1;%pSE|0?u@=sD==u#EJR(cRH)(OY^`KcQ1U^aAu8^fdGYbZ_*b=xv4c zpHS=dJo*9jmFP5j9C{%75Of>#hXodItx)6LkG>wAM4yE|34IiLXY^OUxBP2_+CKfh zT#a`vdKUUj^e}W6^j>KFUR}-qhEVhO7V3TMP;^_krKj1K33n3vB6uCV3MSxGI2Mk8 zJz-b4C)@>oeVoPr1il3Idv&$k`{14MB6uzg!!zK?upiX#(bYHy!fnTz{tj+{uffOR zgK$2a3zKjfJPnq>-@|TjU${He@6*-#d<0j+mGA+0H#`*%gi55@Ujv*4)36+#2}i&`z;3WJeDg?)_bOZp7s6}cm3>*W8!@lr1cre@-{+e&){RlsV8{tdvIrsp)8_t7Qz$*ABm72G5647=}aP0C*HU z6n=Av#s3WI_mFCNE8+cc0bGBu+1J1u;MGvSr$*=DUxgayY51^E`|~z<8BD-Jq5AiL z`aLzO+rjS-GW`|Y2-m~s;1lppcr(=R|I~Q;{h!JyFa$@zVXzSPfcpKNnr|`OTd3{S z@5|KmCis?6+o|7^say;{+~4$Cco&=tuh`Gxl?yfBDA*6?!|(Pr`@3+CP|Lpr>h~6^ zE{COXB;3@&>~Fz=LT$%E==N}1drSXgp7CU18}aKV)cA6FIc(b7xB@o9dRPXFU_Q)) zO?#0aHo|&X28&=m%!5sPk{>q0dRPXFU_Q))O?!|ZHo|&X28&=m%!5t4lOHz1dRPXF zU_Q))O|t3H{#*eYVLdE^MKB-c!6un3PJY-3>tPuzg848HHnk-`Y=rf&3>LwBmBYoO9Pg3PI zs6e#*neQn1ZMLqa^~YHBb*qe@+8gD$M_;d|6Q(cwbx_c*2DB{bd{_xT3`LLFMaJS>yGBH@9D_AS7g0XohUc` zp*$z3*6)eYSD)UZCH@xTJuUYqwHH*F{q`9Z3{8qhXpy_rxzeFeWMj)@@I-a6SN0{y?`zh6pA=9TwJ+!=K zl(&-kvmCuR-|Q>UyX*WB|CiC-=+B#ewf-C|^HlA#(a$iy*5Q9W<-LubNB#!<|9GtB zUxfW|+5c#L^T$|y4`+ND>EB}PiHTq#x`%2hFaLT8A}{@2AI(2`oAuW$ zu8%VGNbFP54`ZK7ymOfE3G{0^KP2ABUo75Y^cM8A{mtI#XS3I%w_^WIuV2akHsy8P z&vf2@%wK=sLG20hcR{zq{vqXcK)*@+cKCnkmXG~K*$-&EM#|fW&c{AL$4BhT$bTNX zJNDD5-*WQTpbM~1r#*|XKhJpd$38`dLF2zn{5R;|BJ2nY_Qj(sxrqq)AeQvMoUFC>2%_B+s1(Jvoh_SwWcAA16O&ppiEfq3Jv z&%}N!*J}g$_4lQ;yn5^9NwSt|{T9*R<=7W7|HsMxOzn->51@U^v9BlpGVGPK=Vk2sl7A%q zw~h9^jeRcpOR=AceKYpgSg-pN|9h^_eDn*nzW_a&@$7`&D3_VmzdQOD`tN1hziW51 zFUNkpJin=bDg8MU|8@B5?>wn}8THfiB-Ja>yV2ft=$*L!n$TNizpegT&>wTXyiNSh z=qB{evbH(*lWS~!Tr6dlnDY!}n{+&?^sTzy zh&_La={9#THj9hij%zBXn9hQFF+1^R(jOt((|D!DyNmr^J$C(mX|2y}wEm8Rwx|9o^RHGd_M5P8 zIL7o=^gQN!2lPVbOCI&Pm3U2aEnY9m8;Si>##6sUR$uLzpZ&R>uF-g6YWUdlKhE`Y z6ZU8Iexvp#v)^%q)vpozz@1H(F~9!a&2%YRzi(IDHyK?={;B9e*c0ga)Nd>Gf6Lw9 zeMI@~C7#yjd(-FXdM-M#&2$@`pQ5+?Z2AoL7n`Z?QM9*6{vEo$o@Rd5Z#4hG%*TX$ zuZOS2JD>#J`02TgZQaj)$yq_4t3U`(Y`61^yA%x7p}! z)c0-l6I>7Z=o8qV*WYjT*`5Ard?Z@2B-O1)V^z zW4!g>W9uuycs5bLIkdmSVhJLzBJwwU<;c7k^=(4GE`6>2J(>Jp>v)Ks%KGjvN7LoHK1lv1=3kWlsF&}7(U+bBt9=pmIb7$P zn2O|ka`bfx>q}`T)6dht1@b*S`sz&ijq?3I`s#S3#p_PI_+F-q(3Px5P0Wv7$**6c zuCJ9cH?=;Su}`DCbzRK<`7YG&NYh2=b?6IdPaf^f>}~PtDSs~U%g`Zr{2sJ;pD_th(S-^RLzWjnscO<%fEhy?&C}FXjGo6ZQ@02J|KPZ#l#K z&!Byc!%X+;VDWFFe`fJKTM#n)pU@r3Ov~ly)K9+`RA2k+{E_wIM6UmV_&3GOext4* z@@GOH1mty@?gzzx0RBbpe6BV7g^XVr`TM#3lQR3a%%6sHO}EkONB(R?Z)|V6be7qN z>3oqt6X%=m%Y0o{Z~AZ4SHBEgU-NZ*< zW_{^E{qJEvzKrqyR@*CUWYdFI-p9KCknt&Fd^+p=5POGf&Azwxr|5O)*L8fv|5Kjd zr|bP&^cHlX#uuHx+VcOP_0#z1m-YG*-GCmi<%wR0{!Ysi{T2EynSiSE)>ypt%%=kM zW&4@E96k03(+PAx@;9Qd)b&ZrLl=_&pXk}TzG!)Wv+_RP-E=;>j`p8~zKQk?M7KeY zMC_E)>?Z%lDVb&5cDGa3(%9gnY{=-fbvG5x6t3Gp)aHSN$5uypR>`O znLi2iHOE-|d(nef50^8)$Eue4-G{wvU(=)MpKGKUYF~l*ycozYXX!xIVYMYVALb>*-_cb1CmT^f&Zx2l{hQ@}G`ApZflW|L64QuEd{@ z-UEFO^R)vyB5l$36rlfwE<<0-e4l~diSo`z$Bwi74QPGeP~$B_zr%RFiB5ApyobJ7 z`%B8$%zC_%{`(mFR_P{PU;E!@{iVyE>e=YN=tlG&=w;|1bUulH!TpwhypF%dNP=2mHFOdH}nO}bY+XD8>rF_5ru7G}B_6L6ZcY*Rx zll9tfj|K8S6VMk2;=LP)mkG3IY@ojS`Ce9;pdSeMcMsYF{n;^4--81F`umgq@*WK6{{+e#D)$G!e~GLg ze*MRQzCAD=@xc5#H!xqH4%n{>=+eM^c&|%t`SpSM(M8rqfBgyqP=7v;0f&QEqh<{PQ|E)m#dIZ*6{XK4f zdu|EL|Hi<4IyA6emC5stKYwX(yaM<0n*;sVG2q`eFrE(w?0*gD1p(bBkpHtDx%I0I z*!6>K{`xNojJN)7x8FW8Q2%*>@%W@5*Z-P8|K^2C>xz@f(3tq>NNqe>mlq0!5_K~} zwT_w|jm!vD#1md}ER+hxGPT)+YFA2z3QaDp85ImL=a zVu#b|WIWeUosj;ErX#hf=(&+lL8vO83{})gfw6$!jyR>xalCSKTBT~ki9|FuCD){l zsEOpJnR_a7P9_qoXl|>FgllTz6>c8i*j7enx*e}`A{nX7Nd9bMbqh(_c$;OX>%59r zg{0rop@NwqFIIKy4yAQNhi76H>8Nzpn8=J`$zxM@QaBkyO%KB>M)$AoNRSKnQqB5dY$#`uGzV6&>u>iR$+zHsCJ)I0sk0eu(7UD8TTg)b5 zy@}eQgF9QB8>KyoWIW+tHnebE-rNy%E?~WEg9e=w0bfmWrtoN|%k)n-Om%ZZY2B!3 zDy?%?XY8l42TnM79T+;t7(opH&HHZ!fEOJdP=?Out~1< z^y}JqrIrxY@rlNAOw~CmQ75i)HAgDE1aCIoF zHDgJRRjZXshyCuz(z>zb(<0hIaVM7M)pn&rgJs=}dGWI&EK?$_3o6r9R{Q9bSZyTh zs)gwdEg6yC^#WAqq?OiZ&ePjaEh~L*ZDZl#-q0-v);PJlZ)Oe>)fw$+nx2a zxUIT-SB5OEwhp;ljPa3lHi4_bU>C%w$n;1})`K1J_)NLn>atg$j;rkWYQxS-pu29} zx(xSH-0kjgx#wn6)i0|&A1~LaxNP(Wr^Y*5N++_DqCr|r)19Zdxf9-Zp}CVx)_%E7 zRLWwQs)?slUUGJSppOJjMp{{d+w+8%R-TE<14yh{dUf*@oz_Fcu~0l#BdwD)T-NWfyTMOS zm91*j3tPQIp4Jwd7?Po;ruX3F6fcG|A8Nwcgz8Y0U$)wzvGO{(t-GBPsZFHoLODs+ zzwuPoNjuoD6Ei}E$2)tN%6Qtpa1`1NDHBUXE2?F)P%Mvoy(}$J7fw!z$$if&+BQw0 zP(@U?9-&tKeB-u#=h3z?(}LyJw4KP(j=s9Z37s%x?5L74BZ|j`h72AvtayB@b@6hX zIC|{p;xQ8@j^4g&pNXXt#ubklwtdgzhnEc5zE|P+(Suv{at2TCc{SG0HivW-7!jQw zktdysNJ1ZiMu*d~wUD8(r=aHPHfXI*BD?!JL+KO|mL2(6Cvv#v)JWZoc(T$PXC6e{ z8RtC4%9Rq6sUz!1WM*haG(9!s+?l*Q&K1&%hqup@g>|qzCTk#N-(=S{agsP@icNvY(O7 zO@;1hWc~Js-2qQu%bfjIsV~14R_t89R_(O2>6bEmrvlkF?5Jl|I32EuB$IKk{W_&` z5~_2h+U2s7^B(TFSmh{v4)6@lBc4oPeO8(z7X}8Kx7sJChifvCoK&|@np@<7(&ueG&^$%2 zm1ub;of}olnjptzEf&?xQ0@1%f_y%fFfJpzayeSDSz>8p=nftwp~vrTb&*k zI41n@wsaS=TesLWR1S8hws*rAk6`LNempLfoqxaTHAC%3SndiEqeArHcOj5{hG zug)a=J(EhuJzXtJcvfj!V?LYyEu~h}dTD718I4uR6G=8rbIC>Q`Do0ns;G&^BC)tz z0aQ(>mjsqZhZ1sz8%f4oyK~Qp#Y3_+4$EPJ>`plM423E)va61VV)3lAi0ymotydqc zz1z2YKOdtT{2JM;=UQaV884lp^DL|jnO03>3>_sck;jAy^1u-(4_8#Pz0ebYke;^T ztJh_sN;2smqjPpzw1x9%cQcn8K#m@yvZv?9bNW~g(wzej%kK7=nsVa$4LadmUF{r6 z<>^hkCgP>~W|i~E;oN=0o;eoE*bUjAYmk2au09)Y2s$5uYpAGMAV<|)-Pu(?neKg_U~?{T79P5@om4GO=|5P zt@`UHE0yn1)i+df?Bn%0(MfZ6 z#zSShq1SgHk)-VQLMDvkWGU6M_w{RMTIJY-R%ca|jeSU_r7b4f1idKqDN@#%fX%rp z+e1l6hD__@EJ1Gf4X&*8rAgbJU2dtb4qB&p`Lt{?e&M^N^H4q`8MXJaY&M0aN3%J( zrElL;!%mTHLSX2nuXLIP(SbRooWH>d|cb&LW@36xo@>uBhymxKr#2p)p$mv7Y#Ibsf zoF8c{&XE*ZA2tW#IyPw*9QAm~P0(Ux+{a7HEEE$~(sWlHTu)~qU>V8Q!@rEUskWGK2|G)HYq3q|ut-AAwVivep4vGr zWnl@Ni^XKr?P%DYmA*w!PIP4raL%?{wpMsnS(5a5yjJ!A!{u1W8Sn8ScOmg|yN7jd zLaWPiRHly}61t9h(FN05%^b{Vy0k7h6oX@x<)SAAf(tkxfPZ@Y9K|uWN4fnR@N(+qF%a62i%$^_j%?xss5cIXT4{Zr{tE)jXiArBYxiRHv8F)LOm)lM(rHiFMuXB9qCUBamQm4eY za8#XTHrj_V#zo{Y!%{|+j2iFkOT9F^Xj`4=R#&OkX;;Qj3h2!ls*9MC<|B(BydroDGpWtU`cCb>R#uJ0TPYFW;Q2nMH|Myej~erSi3?3A^W zdpC@Xx^oVrS}zuFS(V3C8E854(|wBdj(qN^GMVTK#YcX3+qI^opLhF88JC(UQ z94Y-H+YB{j>#c{vu9l}(pVBhrV^qErT^s${hBRXzYt!=FNjf;iU;aexw-%CzMJ%Lu zbfb4iJ-^J>%W1vykt}y0Ws%P$cofgp-X6_8t$Wv$v-3*DGsz0CnQ55?^gv(~4HM8$2xFr|8 zw4C>7m zY=wNrM=k}`y5NOm9gbE-odTR=C%q>0<1Mmc@~66b&qmJYTxI$8B|6Ib$El_^lO3e& zP35g6d%s7XG{ZAxK;=_2ZiRL0*s6=12+Bc$mNQybCi$SOD_OVnF>iP@=A0WQon^O~ z%V;l;hH%vsd)LjagdVI(G1&q3ge?ytdHiKBWIfv+4+UtEP5o-?CrP~+;lw} zn~~{U6>{EYkwb!*`+j`5LJwI&UQFjc8FEXIw&_Kv$5qk_dk@*QSwSK9Bf23klW(rb zu2??q+p;AoPl8!fZb`W|Ii#~Lv?BXBdu?ZT?!Le0mEgJhDzQWU{_=MyL$&~CX$b95 zCToCvHX!FPH`@y>ReuM({gvMV_h8jq&*F};?7Fg*%x0Hi$+5WZa-Y&C;#RUWv$ncp zoZ!wi>6ey2p5QuEhsL^p%GAyZFQfM<1-)dvgn5z+{7vxB%fe#lRQ8DSc98r*JJ3!fG#{SPu^aUi>p^} z`IEZi+drTSg9#_NdHbIbbPXo-b6pGj_H*7R(x+VB&MA}>yDlkM61+-f|11c)9q(rQ z|2t9WRd~D?Nq2H`vkrxNdr5Xx$}zoL8kOwp>i@lT-v5z;`??J+?CZrNe(zvHq0iaN zCf}z=-^sl^)W;RX=;QjG7_{^bCKP%J8mO>;-xE(b;e>2r;1kHao0Sgrc1zTKi#|bR zQ{>b7IofTPTc_TAd%J%Y%Gb2!P67E{3wH|0pSiX|FF}VZKlaZ|uE!d=y2uH$IbONLWG-2ojdC86;sd@i9t_kqk^ik4zx! zi!6}ySXXA-d&(my;&V zx7jDpzooqD^(;pT@?QtWG)$G}j~~jLG=1u8Z-0EjjK`-;n(_Fw zISt5LzK{8r>;2btWd#0Vuvug$X442$zyr-bVjI53)?RL zn4gPl@jpIm()@+9C(oHRX|8QvJ$cawSdcN`x~{x;Yss7S$bXX8SCv;D?7t3_hv|H; zmb|)lQd?fqz9y12%l2vID@Kag@>B69*J2Ndv7d=6zYYO+$Ri3FK z{6p-cA+_zO?%(vuLAp+L69<3o)o{`-+dq8U)wkjk@$jVgBHGM|(y2DlxCsQ>MAt*- zw-HJw{Q9cA7{0#A-VjXjUH19&?wU1YGX91yoNt>tyHEcSEMu zOy@s;|NQ;)_s`!yfB*db^Y_o+KY#!H{qy(F-#>r<{Qckh8!1X>MOTtDU$2|sUiN}s zH;w-K2%WNh&rPFEqf8@BBZiAlUl;>@c8hdWl&%P)^Mx2^d5zZ#r!qd}^JycW*70c# zpO*7!E}t^^l+LGQKE=XGEOu7F3B!gvI65!Xwnl?Nu_MWN_CDP*sM2iC;+tK0QD+bD~in(XMS6IL$-$=iU>TOkyLLF!R9 zrrvQ?Z;yqDQIJlrke!GTEv5wHbI~gZ&h8ZXfnnbCSahV|_m(8+0_)15KRxr3eubxh1HiR$K#DV^*XD|F!?Rao0n83 ztMrSqvWHHWw-Ms+%+In~S;g*ekx4cj%EhSk6^lcnaJUG>%qITU?dcRg`YjY1{t}!_ zXokADe8mp&$orIZV_1qX$*}nZYVXSvtUW1yBT$~nXvYx791g=OMMZ)9aF+kgn$XHa~Oq@IT4Cfr#j``aUt3w9frbgm6L`+q|@YnR%uC@Se%lNCT5l6 zdqLn<$zB46W|e0`A-zC_^k$IF2uCosiV%pDqcFnL%qq|Cj1yMO0`Tp{;wH+M9^-fG~It_7AcU_3%W0feQ^n z18Z(?0);IM@*Yrxm*bZl#~@CNiH7-G^*X_cNM++Boi6}g{Q$(`A}prc(JV0HT{8S3 zRbw<+bXT9~2*2o&B)XW)z5&s32gx#Ply?G>?$y_ey~QiwSJ+;g(JXAOfZSWVm2%J15du`YLntPxCnszN~9V?)s-4Vu)7&HonX^^uneG@Bdim{nlj8puzo&R0#HVTeZzsCd5vK0 z2o~XkwFK%mfThHF-Jbwbsltf4I|;VK2m2bR zwyNlK6#Zs^=#k7L6OZKMaRAjGMTfEIJ`9^eu*p8yc%V8WteULxymDMZTuLrjV9rsk zHa)N0kkx8;Nj@3ha57YYc}r9~TfN{0R($c}0=SA~t*F_0V{sL|-+9_&`Q@_f&(uuG zXRoX8x&`3mCCAZS58`ic$j!bP2Fw6E5_s#31i9xSY5}!VTNnCbB zOX5PHx{&rN>zZX8It8{n>XZ&hpiQV#MCAB;L5$qG*AYxzcqE=&k?Y=}GOE1Y3w0d6 z_Z4dKbQFP_!+LtlP;96MYCS|C4-ea$QnP+qd8`-Kmr!s_Us1tvzehFUOe5Ut!?&>gt7U!qu0lP51;(SpVm6 z{r?Kr|A(pm_eFCkP|smB@c{LI;oDsQ1208d$?ZuoPFzxE?=L!bM+emZAoYirNop`j z)%&DgKcv?!L#cRxqz(U)E0DL9Ly+gw8ukwz7esarfuZY{zV>1o_=?knn3Q~S<*=1V z3sox&=Lg{d)r6c07B;m6Ei1T(=882}dau;87naim*dTAAa?RXC)txml>7z|*WhZ3! z3`Gws=@q<_y)l%)Ms8e;(9B5%F~<`M1eeeV6qR{g%!D$KwoVvbdPOiAx3RNWqB&S)Fy{Sb8Hc%Z1q7+;a#(~!Rq-+pYlwhqa z4>4M$3b9Lxs6Qqqln9O{l$s%sny3PcHzbPU^<)^OVf;Z#!^kgu(PEA+lp4{F?Cs+anM*%9nZH70oNvyk9+PeqUhlqjcOcNx;Q zfs(#j3%#`#I-x)$VUXR9?2QDuSl5sOz6@?a0plB!0v86#c8v?1R$-NA@N#<5R85i_gGI|xD zRZ`4`8YmfS%P1MH&$Rel*K@8Ej`G{$C_{s}qI~8{JLG3QTfDkTwZ+vA)fQiE)UYk4 zZG;K{%&`DcG7@>qgcUn=TskdXiY)q5mV_d~v0u-nYp@(u;meL>E>qv{r*!Q3)EA|b zdd`k(BmLPirlGEgU{ z33AMR8JkRy{p~Y;+0%l3vJ?HX1t&Th0rK5vZnD(dQL3(nrM`huqia~|G?L1?oE@S{ z{X;p+fuS}8=h5pZRWlQJu^PJqz_`z-7pW*T=>`jJ@r>VZpJz~oRw`>Wq0I$n%Nmra zwd3w!HEy#}X6G7?^<~Is_dqqGJD&DO^b>5Z{m-}<9KSNN^*znSoYApb`0>!c1udO)%+euxx{ZIS*1?808Goi)A z)^dKd`(z{44gbmKhW825-0;*!fo^z}vS}Gfa-ShbF#OC%SgsO)YWXoz7N|v%BftZ> z!5)YcA{TcOe30jtkq`3DYVsD2e23n`Avi{nx9|f{Pc9R4JByh>VjhNL42c;D)Djl+r7C81 z2!&foJt;#kV(8%uHwvgXfWaNfu>A}(5G>dy_vT*kepv1}Rqnma@HR6X-ir(e;ndmlSsP5SRE8}k*i(D8_}YMa8(|TY>s897C1gfW zC88{C(4_V9+HQV-Y}&owTczL79|-_nSVrvVWsxOr#n9QiSADMlTX8P&d-u~T$-5u_ zIeGW(p4GhjD)jE}Z3~X#qfObxe=k^b@u!x!s4l*S8G2TteetC7R6Nfr=!VmF@~gzQD*5LKc;1g&`lPxq!@@%OxU0 zjdNSh>G90<0&%S=(Gs}|s82B(eOP!r!)6j}hA$eKKy^Zu&0<({hM5W0-zV(>puRw9 z@eDh^ieQlhYY)dh1Zxe{->lhrA8;%OQx7dElP|eFx^j(j@!u@uSTPDYTC52v1F8yy zcoyLJ7h^UP=F4I&KA!@$2{FR~GmbH92(ucFy$F*7R3S&^?0Sw&0S&777b!&r0$%wfhfAxxN0Xb?~(O*Gp9xno&w zT?Yw=R$J6-#Iav0)ajSX@n05UA9O!w6whnlnv8nqv#~fT0?>!05qjk@piz0OX|3`#NkWFZZV+msywtvU+?`y-w^Hn zgxcwJqW^$rqk7h<=Zc$rE?3WG>N#IMZ&c6g)bkqkyj(rcRnN6vQMiJ&R}^nTnx^5f z^|U%KDc0TKmlV&mK}-K^9gV)cwSfjtwrr%+4wStehgg;Dry#p}H&Yw=(eXC)qapO3!Sz;hPg}CPDo=dn9Gm?v$SI| zdVh7te&5PbeNsajjmKJ0dCip{o>X~vhNz>>=d9BDHGozAy}<8|Jrl%DaEX<=PLR*Y zyhdYwC9M8&0Lm-Qkft zcQy|;2fd^DgJp}M5j+Uhios6R%5B+Htyl`MS{Vq(&Qz_KfNG6RUppF}h5##cYN^cb zuh(9J-3YDs66|FgIq~klxzX9|Ao0KFqj&|52_*hkptfNH+yp&qHWSs}fN2>sZ6T(w z;Mks+J_G7RW2_U^QsQ0`)Bv}Mxfc+(9gZE?{{iYe4)%)d$h2cvI>83Ru@k{WplT4- zMK#nt^R+i|t@HgZpxa*WO`NBZ_9pJHoqk}xJ@8GOkUf=Ao*wGkIE;J1+qlsj+B6}W zp7>wKh0-u@yy<;%9e;be?(4Yf=FkRoYsTJVGWA#ZmE1mdJ9<7t$$exeCU+7XyHIk+ z0@W4sIYI9$@qoTbT_wZ62pzXm(_v4b+&mVq76W%%tdJ57`nPbjaDah_6E;CA+=)Cy z|0Ro3@=(;dJT2gIprV@aus(HK9Mxc2?F~fL2+r<6ndHS$5hf@?9mIn2j$-3tC?@Wo zIED|i*yl;?b3U;WPBPJviFbIOmbx^c&Oz!tF)9Z@|5{Ga9t4ff z)2yT`P&a8zm$U%3k%!Jn(>!ucZtTF^N!kzIh_bvjc|p+NP_^mw+M0=8!5*r=!7wCZI28(fE@&p(zGt>>x>L+|bjy?aBU=Wyt~wa|;^s-d6LH$09-99X|zR=JfUbN$uY5giTy z87WZ=8bd(TGSJNM{#+_kq%SN}I52rxl?*jGft6)*{f!PbyF3Q)-4p&XfL~~AH8TQQ z6%r*4;Guwh?CoD&N?Cu`x0v<4ztyU)?m&IR-6HqvT*>Wcq=AsZaJ--Uzu)L}rC7;z zV}TnOcIq31{RGEEf*l3wM}*a|w5J*NHNm#{U|#@rT-WF-0M zu?(9=uqi&+M4*0d+Mwk@R@eu7CZPQ(FFPU@j++s>*2MQYB z(Q$3i3SVb839J^?>PM|d>c3(WvP*FU5F6}#8Vd9^*qh+eSH#8`jze>*Y@Q9(>4hq< zw_b(l-d9BvF8+;gwdCXsQf-(!pYK{Nc>RIG=yvd>u=A!7b zTrCs#0(CcL;@uR3qy^a|=y5<(mMU>Z|1=EjrqrH>F{~Md@zVq3^4)U&RfN7y|0dw2 z+I5}wQq9}Q-}y+%*LofmHQe(EqhX0Hc$s&mnK}(>1Gl@?HDm$QI?JCWlgGNGM6oyb zPmFqJCaC$W*43CxUeI|k7n};FM9uP7i0gFzs`%TN(67wZ-NLU7p~3vm$|#0Aj=?F= z%d|-QE$n4l!OKLaUC73I1g%lJ0fc+2PVFJ>^9_Nv^9_MsGSnUd{roYCqx%q-jPDmx zeg=Jw`Kg0rKg!Q*TcKHK#+BtW!F8jDjf!oiHt1`MqH%S)F6L4=%3Evnc_4P#reeUw z#a`8+a)x6IAG`wsl@bzyn>VhWkXD;x;=uXtPa zU(X1u3wUC~yRVV|`mY7GhCUM^(7c~i=QUFu`gE^m7wm}zl)eu)WBS%_*3$P5P%cbg z54OOE7`B{XOMS2`pq^_+lX9R)>(m)Wluhmm_2p{CbS<-OcVMIO0wtn|Smt5&`dKou zeE#|$ zv;^uVSJ}UUw~>eRc6_8PZ^8|5{J`h20q)8}6Wjpz2&&rv2Xn7ha9-2%5Qh3P%cIwd z^(md&S8#fCSdi^dj#JcPT;zU|hGz^9QY;O&FEN($zSLAP3#ez%WU8oA2&^0G)d)~m zx_`XJb<{J{sEoLaxhqv}Bk8x3^j1FU&4GFwrN6+D*v7CwHzDleCJlBTs27@Pe#W$# zS~c8gib}0CL9O7vsJ_a)I+YC5{quEd-)B8nw|#G9qxSdkd}=l;=2QFI#}?53HU|-T z$GClO!!b;w7!KORnJL9vHgWqt6WjN&=K@D7KOn)aZ7hEc%ilLYK>p`b$QZw!&*T3a zY5aeqW+%S`<;M2i&Bn52F$r1?Xf~IjVgB|Vo9Wu^d*g5l?H z8kuX6DlO6tu{ed6Si`wQJ?GQeWzUCds7!RFl_+~N^;rL8@1^>3$;LF-1E(xNO3)usyUY-{wI(CJL&Px05qC7OL@|jOStWn68g1BkV9!9Xf zV#5A3>86m4M!QCIEQ{9J+R6hvJIXU0)fx6aqNCX8`InX+WdP>0oPvzRV{K09v&fA^8Cu-5G9mkJswozdeus8;{F>poM*1x;)F{;wfCXM5lSh~(Cat?wWqw@VtoU7 z*XcCd_=-iUvC7>Zk@2-h6u5R%k4+Q)1ZR7hGXn?m;he6Xlht#qdhV>Ajp|vao-1nj zT&|wW)N{Ui-l(2&$%L2~d32RtXG;;~;b4-6g`Yyo63T3IMS0a2jG(jBCPIldiq3;e z7sOT8N{^Uez7zqh-XbyK=;BMB(I6m)-ky3Wk5j)P|rEoJ3x4DQrh@Qv4n`l#fdzvUbzH6E=zdG!Suq@@(qLiIjIc`xa$&KoH1D=JgtrtLej%&m1ch}B; zQMQ18BpSuyWhfN&agRq%?8rG5c6(<%LLlV*7)hE^#M&PKxlvgB(w6ZDGvU9#Xk-g_g=f zsM(dbH4)OWhfNbF6e|6C(2Fg)hhs+PQG-1YP>ACy$NXNR=Xg%oHNQ^%OcWs$K zoIqj%YAl;L?Snl-Ag~ud@oI+1N?6fi|Pn*8JH7Y^Pa824 zYUHE7+rpcL!qzML%L#jzbP_Z7iUq&m{je~53#%Lzrp>f;zDzF#my{^)KkVtX*0!&Wkx@QdqF>4rbn<0>I*RI;3Q z7*61l&x(o_rSVbGqGXQhjE4w381Vq=4T*~L##KU1SegR$)V?v?`>!)nQGY%L_t8k@ zr9AWy|B0&dSa={u-u?;JuhMaEX;yDB^O8?Pd8k^G^z-5co(|M?KB2AWkxtW0xwuNm zicxxLzjQU`$E97Rnu0$%>1z(u=#Pq-HDbYe6w^0MssjBVGf97YBCMHzfb-~6weV(v zu(i~r|G|{-^OBa9%pd$uvT@pLVx;3^Xma~F3X{dmD;O_a2<0B5#{N20l!iwEBSnsd zqZ~O1>C@(zKbMXL<4Mc>!RqSoO^Yc>t}G6=4H7f2W2{8i;?N4|xJlY;j`j#!Pda`J zhPtp;`{&&&%J+%#5J>6}$b$t?s}@&?-a`9XPZ&t`JZ6$kSRB>C^9^R{kY~Io9l)rI zE}I^*{}8l|gJVT`X^BWXJBT0FO{DzP0aqGh%n*&RELC(P}0C5V&CtHChs_jg0mw3OdK&P)@=YmB0_|ca7151bZQ29S;=Y+BQ$; zRYS%LTMHc3qTOK5$@dtAt*PUES3z<4xX{M2JM3Z3PUtrL0l(kjcMg8P!tYeW>s8V% z(mv^sMY;)vSeZD|KXUB=Bv@8sT=%jJ-y8yQKhB)=hVr|(exrQmw-l$``{&~>iiReq zXdOO2rQ{j?%l_7qc5AmF(%0xw={zLzPvIv$*+y4Wyv9U5IG9A5}RqniNK zs5^B!&pdoN#~2e~`uQ*kK#jYzfj61x?%l5j<>>WGwCZHOqsdv_kwH*K3 zJ2(t?oF-<3?|p}c;ogFNpfb41>%})oQZ?s?zteTA@s7S0=`ZMRLH{roSFh!2j(t9k z%6g)qf1Vm`ky2w#t5Q=;IjO0pRUuJuHk+i0$rkT!OK~dgREW2Qyb{ONB@4Pj6SWK9 z#b@5LO4J{PM&zXT96&uM;Q*{Do`X5NmhUPPwjOj`Yb>k`1+1f>%(TiJr3Xa7vjttI ztr7C_UCktyRcrvzWZo~1tB|vMa1KCb0Yo#}Js*etq1O$)o>R2ECKcRaP?OFqXN^H; z=6Y-Lbxk|CbMPU8Tp&5F)MJ49z*}Gz@}O`+ee*{U`fgjx9M@um>|gN0m0sz%b~{wj zuJ~iLgsIibqW-e?*OY94f6Is}$F(+uXc-!SFxN_Q2n1?! zoj9)b5}Y)_)|>BcgG%!5#_=dfU`Q0uj_UjESKRT?D=-zMrX;}~T9l9mO$q1_nv#@_ zzPuK;g1#Kpiv;KM>ZIroTGdkOFt`n3%sQO^>?jO^@<(ePi<85+SEyrL6Mg;pRnQJV z!5xW9C#W*eWY*B|?tc3z_m5<65QUtA<~;#_J!=*=oQ0m?xL=NstMvd z*ql&cH{;+jbg>`6*C_?=Xt6+v1#Un<&#^lhx;`~lOC@UHPMl&`JATq3Oz+m)0@LgK z5vPkxP~VljUh7$QDvw&D?9SlhLTp;3Mw4>1B84G+i?4d6pG3!!jllCc%}E4}OR0U` z@8T?pyhGqjl`N$04pj24_#73EuwaM3dlN=9G2@re&^n}`)0<}9|!?JeMm;mAyh zrK$=?d74=DSH+kE7I4BqnkUYba}1*P*8+-~NysbngyVV;x=w&gh;7Ho6j5-&Ura*> zUV&P@Z{X@t*|2$mmb8wK;9?yf*n8V|HxUx-Zo+qSe0NJTNbvS?sG)W6XtwVW4jsCW z<8auTGjJSx?Z5sFx&{6J_lL5I{zDvc|ChqSS0Z?>gmbzY=I$Fz<9(zX;=}ua&l;iw z?*-pN&Kq^^r{5x+K$&&#H5AXl=eOUiAMV`^+=~QL*$;Y%yXy5Ghx2bL{lD?US5Z2M zj}d;I;a64tzx#{5QD?jc{L3HFxwAw0UKXaaC4i+nY?`HKPJ+7Nv4`+|Y^XXEL(P*m zXdUQ3S$2R;cxmii{(8AiowJb-H{iUwCpZIU*F%}g+u!|;@6(~X8{J4`F zf^GLn6^`;|j{F;R%K?sj)v>sfS4_g3kW(hXXgy^FdYSojIy5cT(;3jB^9I!?(4q7L)NM0kf5ZA%=M!3$0>y2=o z57%XIT@Ke}a9w^ym@}Y4FgCp+EK9BsT7-!XWx43^z;9QD{mZn3y;kV{WaFwA*F?Qk z<|xra2i6p`%OqVg#T1w-cZJ&8yZY;63LU?NR-FX@GUTX5GXIzk9UtiQR+t=DLxpE5 zX*i(56jKIq{V|8)I^t+we7_`*D-oqJC2%f-a~YhE!5OO3apiC>hqD4_1f;u;6cp{t2{c(l6gG2vMAUVEnRl}8eDZE zpgn=OLXHVvgq#q)-+3WbC+!zJ!70*r5b@x7CX1^Ts24KT|9&S}6ut-&r2*A&?hkPp zP=N$QZh(RW)akp*Ab&cg3Bo+!bu=i>hhl z*j0nKKuKcNiMW$sjUf<13-f6sndeVvnAxXkP!ilg$YMLVIMt2j*)86pv@S)Km{WdR z9Pv{uXzoNT8C;9y_=ZO?_Aev5GY$azTb{wU&=kwz7Fgf%xqJ&qFh*lAoR))u27z(v zw7iCpp(|TdZT}!G;kZ>gCS)%L4dP%@q2oI+&I6{H<78{cOqB(}wjR(0jyXZuj{b^8 z?y$=ujW0F=vD+fOS-ggwAxO#@aK?j$XK<-!Op(R)X7L6p;O5;C(4p8Bp}s$r)4?8J zoKCZmkQ@%CnGU)C;#|H3AekQ=``UI3Qif(yhW=4ILr=saw_tn-GBJl&T`a@QdY3$%SxDLUwU&M8R^BrEdIn}6z2DXHuQ;3Xjw*M5{>__*dAFAG zj$FIiV+NTKXny-u)6J8rA4ACpQ8LKHbXQ<{0xqW zv`*3MWU;fiKoUD!<=!EW>vg8YG~LqML|4-K;n32(oI+#n&V2g--0le1fO`*tPp_Ob zGiNDqn&cFnD}A3-R8SL?gs=QuAx{cJb|n-nX{>w&xT54J+S9DJRVuI3L~257-*#Ua z0AXL~PhsP$og!$1&(G4@;2s#WbNtlvi8>x9N?`qB1ioiYx5|wz2?e$>R@nrlBzzBX zCRpUgqTE8rn`?H|%okR!!UYI&da~#WcMqpIB=#U0fY>PNi@fLH_Q?_8)uzzujqu?F zX+3NxbdJJFQe(I@4X3vhQz(E3RnZInWtNkZt*-DFSnMCc0b=2HHj2e<)PTM*4Cr5( zw&VSyOwS*Vdk8SS4Cy?kS0Vi+(`%9bfawV2eVyrcNUvu4S;RcUv%`1UI8c2~IAkJ8!#aT*CDhB%Cd z;auTYhtWIER>SZmgheWw;I2xhi8wcgs_6&XK3q*d(DR3>=?8k*Fg5)^uNtPNALzBi z)bs-#FhJzwQCo{|cb{!4F68M+e-?{6CD#Ecn^sw^Y4;34Wi#uMmFU2jGs> z;adxRqEi8McW|Bm_5bLv^-VwB?-rOr@EaX)of$ySf!`wdtqi#L;{Rb>-h|(J_9+I{5HjT zP{JxnOG^@f(N^)%nO%3wV? z>jg@2qB=3kon*kbMf(f>jEE~u&i3*ip%fg*)d{O^kTvl`yZmCILP9t4i%+C^K5Xa z(=nEged(A?N0E-{AT3Nx*uS{g6Aj6|b1EfQ9yJD1yg7|#xg5J+ zOYUG=-FwJX1nPp`Ht33nlk*O^`WHB=?^)2tv`K_2c1lRVL=w{`izm^vX{6^~oMM}7 z+B5*1h#sa*!#v#}z%5fW{Z?{lkKK>HM5!mtv}uSZ*t99#ETw&Kbv+E8$%Hbi+&X)T zp7Yl#_f3=Uqp|E%NA*Non6Ne9QJrjm5aKf;%52(!adSOX;JA9vf@Ksm1oAe;tl4T& zf64oc3HSTdxv$|kvrm5waGNyldknR>aeprNx5%>tC&0Ql5lMGHAd5S zV$~%aMr|tU_lYq_EfUQ&<5X)5uqRvOQDK;j`^X4!FEKG#1UF)?5mN+RhIHufi4piT z)_q1-@BIjhbX*gKmv%X>!m$AR@-O9Q9}t{4Lk!3AOH{3aj1izB3SlsmQRrIygxRil zrwLzpM4Sz3_E_{kq)D?72H}a`5==^LTEcnT0xdl*oR!erB9D&1Xm=L2&KvKj8E&^y z5TZOROmy6@v$gYdou>A;a8o3&b zdi58GtIM}OfSwClJaV0Xfpp++GyHZ2T+a-k_o}~{4ee;7XguBz8ffsVZKpTpPq zW(Lr2!db8W0_nitc*I}xUkB1t)ZeUI@cvJJZ>qm;>h*o_v;7z0Ykac;=xF#&yUD*m zI`C(N`;7yh1=XRoUqihAlV7wNA59j9+2;Cx4qxNb?jc-0_nityYSl(aQ%7! z{e}8_{T96clV7#^JF8w_fZvt>B7BYS^#EF%|0-R_2^i`WSZIX2!J<0L6xYsTWz|!Z zmoHZyo%dx&!Qw**O0H;3CckcKe+Oy$ktMCpL?1TcBJ1F}COX#~a9`aD4L)LF}`;&2|P ztxeoXS|^q04czq4RzIRm{9Z>tCFeS?$GyB2l`uxRd*Pt$_>h zR|~*B5^`{002lGA^2V?{5d|*(2B-5JCqR$=SA>ZL2vqjQ@;ou;?YyYZ-j62Le6koP z)qDiU#yXr-^Bzz(+^roC?lSVQ4IRg68F1k~bq08sSQ_!Ui=|8@DVcCIkdz5PnNbQJ zw&OkbDi(EUtS0JRP1Mo5NYt4JNmM%$6#>UE64er@OcaHO?d+3)oZozM`a>2fyI96L zmT`0u$~e48OVmD~=AjHcY;R0?l62dHG_WxnPD=bCT>mnmkj4{nrNygy^cHM=ecy+0 z@z)|=;%`U1#b1(G&)=2!jF)NBie({2-LJ)!LrdW3yArsNfKD&XrPG$_G3)>^x5hzv3*Au zu*4QT6zMyh#LoNd9H%Mk(>)`hv_*|kOItdY%Ohs$gq-b-C*RC`+Ow#SHoFaH8Jt%h z>q8URXl~fXfVp9w_mrK$EfyEjurX8+@!E#>qI60V$=gCWs%vZ`a6zMes!5(0VUkm| zIr5(GAZjyk;v{rorDA1VZ(g7FD9BXed()iY9;3B69ARqgAAs1qlf1ZBKrLyIa(81d zZ!+^`Z;H43Dw+b6XSIHWyim6F^3BN$tRIy>duesu1q_U9wGjL55Qoo4sVf94m6L?> zl*XOh$<-C!oY=>=4?3~ZRrYB zv79lT-mqc(uxk+k56})E_=O$8`E6&BL!!_mTHqYPGOTQJaI&~XU&LL?+D2FIJcx5e zx0YC?%VNRr{Y1xQJ=E2W_mWR8m3NfK%em~qhSd=>yfYLmV{5P4JSmg1=5y){D zW=rp0q$pg1TWO0_cX<80muh3Rcj3Z(8Sk4wGGHX>RO!|e6$*(vt+WEtjmspo`LUyL zq{OJUfl!n(aQ$93HFmPZOAbnHHf-|_KzO+K>V&)X{BA-a&>~QIQrnTJ>96QUd^5OE zoV|E;-aA}%9vh)9M;oA7WKMr7PcQYLl?p;OZuO4hYoH}_yO1l<&;%se(t&6T?6!eq zJxZru{vBMNr7qe;P;t`BBd|(F-Hh+ax+zYj-UjNZO+aJV6l7j+2UvyyYRBHw7`Mpc6Ovi5rzqNYTRvM_}PmlG@uYaFIG=GMtwu! z6yn@xFu03)ZaVtKXbbUcedr^fOrk{3bM;!q_%};?m)wThO6tQ;_+gatCO#a>4`-5j zm2vrKp3MTP{QSBzog1$I(dUUK)3|PxlNt@xzKu{04W$kjoI?%P6JMAg7qS<$q?E;_ zYc^^Gr6|dFYU7xrX)~eLFQ9Aa+R+Sd<>6@1Hk_Gm$_-^_`)`0N)!n%WxLVI-aF_-L z#34WkTWNbYVXF(pBox?N!ks33r#aoRS%5pXA8mbc+dX*Ng5HwoA`Yv|MIuYoCbLRe zawo28QhkO>WlcA#Vso4VrRl99n5JZW7hMg0T)}-BoD&uW$lUK;?&K>^hqlb}dmL+lQq<__wWZF9d z<7c!~Eq=24Xlqv%F|8G9C~`j{D`&Re%(j(7o76CyzJ-rX*Mit; zC{d9sIkf18*}C}IIy2jTVvA1(Hr1(Dp6yEZw?nhP0WHWKOq%P5%;;LXz8T1nu21+O zsSH`EK?X6TDnQB|44I`thA`yW$Ndl;LxyUQ;SBjDAi6(yA;`TNWHdwa0wCKN(q4l+ z%#fY|0lmTyod#LKkTn4i8$-@&rFj)YF3$EthB9QY23gIJF9RTb81jV%DQThABhC5A zTiTNh{qSFC&W_{sr9oezl6Z=H$3rZIfSq3sTUZqQPzYf0;UZ_XgT8alQ9k)*^=pQ*0?6(t)k`yGMHeyzCd z*XmpLYsF>1&7z9UQ8=rVo0zyt8rg~~HRV!^Q`CXNeC=^H%&(}FN6x?vzM#RABInRn zUy)gSdYVtG@Z`uh;7nMTVanqqV=A6phPT^MJu!r?l8%kXH7y;vsYu6-9*PasuN}KVKcXm#*&NtC9E7RUf`OZ=$Pcx=MN;*TCGaCTa>NYSTntqMo0mC90Ye z^?Zt&sGJmv=r0q|8smpeqU<<1OU;gdxASL**~s?(m@hj%Z&xQfS{fV5j=xn+9cjy& z>dKm`oJQ$bKpSfqHqabB!y|MO!HmO~G6}{UK9fl>09Zh$zv=KXL_#x_3;`JW6La{# zcoWIZ50OgJ`0DmS>}L=pQkOw`x{7-Gqdn^>Um!iTo#fNgRiBaP2>2aYUJx!R%dipGa^|X}D_VGt4taqki zSlh|rOT>Cb4UXI?IcX!!(ujW=l?p-L)|Qj_2tKXd*;70b{>V0_Oih}{+=Eo^BN5E~ zPy5P1JdNA(-5>WiYzJVH;%>`y!GQ@ zbvNIZEcC~zlmTUU3fx3OPWp_w@{sFYjVqYBHZj-7^|=->*Q>}iQ{(!Jl_@hm^xa6` zB+VQ8AbpAH9!Q^M`c9;eGu;*GADHflbOF=tfEJ<+P4N_C_=~SDX42JBzS_@MxqP*W zuU@BJ-IA`bCEOQFmSDf#ZwZ|_aY6LnDn57$Tf&mt*%D@jH)IKCCqu-n5hVFFmi+Tw zB)NTngj&d+An!KOP)5FB!{YT zE^W<{hq7eBc?XSN`F4P8#WP_}a{sKwWPFJuOy=ziiVcl{dc&;Kx##l>tj!Gj{Sn&# z{t*rKD^Ncm%*rqq!wLyj;Ddbw)O!O6F_RJR65<^n;x(Z5qo80GWM}pV!wELj2O9*`I)rUuSS5Efdl9UM4~9F7y^AoO)oa+#FayDYeXyHQ1s4O% z^B7=0VazXh&u}_J!yE^y6fvoQS;?3kg!#sY*#gveX7z(JnT&ajFt7M9&jWRsmTDwb zV$JXL+6F`YF5$OjZ9V09dj_typP50P)p%|jp6v}*QvNj#RV5XuObOVIW~l806wes7 zczQZ37j7e$iQaj9oTOKWl?I{^H$HMCEyC!u#gBxR3(js$K*H0zqiK65?K`3Cxwmq1 z62|`cBrW!bfO;SD*?k*t9l4ZYn+f)%5B4cg>k)Q=x7HucFc-mOAIu5V2MF84uvmso zBiIxlY$8w}BJ6F3HD*{pf+hK2_W`v5VG9`cD|bR72zI*i(V(lpQ7l@7fZ5I2yPpsW1*1=-?`^DbDV!xe$Vz$ zVjqCxW)gcZP%aD|zp|q=L$UX<*l+LG#IEy+{oF`mm-xjFX0hkTqu8@>3?i|ofm)4X zEhu&i#Kzr*#ZL8!wfMx2X0d(zVyoJa*fk_}H5}LK>HAkeJ=b6T$fGh5#a8`6Vw?NK zUXIbk>R9aQ44>F_EH;6}-Ur92w2em`P-{@^8z?pu#s0`*zfRD^zTp%5kw9YC_{CaS z?5_`_*m5`~2cy^%Ks}FQ&DSYsyE5z>f^Bpq7GRms$~Q6~XYe6>Iw$pt?~@QBAPD49g_gBV#pfKMYhK zYAG1@9>X3W*!^()m;${As03;$7`B*UtqFD;9Cs2d94Irj6bu{5us_Bi?7|o=Zs&j+ zjIeZu^J-9)7*>88!4?v10USG07C!;h zWQ3ip;?0>EHjH5DaO^~|hk%-mu+0p6fnhxf76Zr51iJ&MEQGljHj`l?1Pg-W9R#~E zTCZ~;Y#PJN4EuRB!cM|5ieN{8T8*%N42xvgR)TFFt=atNK)r&n2!>U*B-nEVbNOH^ zfqETbm-wrZ`x!Q!VAJ5(h62q1svKc^8Mc98CW7_z!4iNvkFfU`_B6xV5iA0Z4-u>- zP?r$4xU!+5F^IX&j6$woM`>I?0acA$sVqE-VLJ%+jSsd3sH+I;#ITz!2=+3;*1~ZQ z)upRP;R-^4RsY>k9EzDMgSaO8xW)h#id?(?CgJNCmO!xke6Tp6!VvZb!+zpMttG*X zqcr6=0jkpM|6=48hIvLJ%soRgvkt>!LT5L=|*Tp``U25ZYaX0Fswhr zP7Wvkf4G(_hk#m$uq1}HXV_+feK}lH_oqOuK-ldJ`>Q$o{{)kV`}}{Po=4c9mjmW^ z1+15fFiAi14$U;*!hSpMPXpd{sK0NF^K#76lHFFxULr~8<+Wh7)n#%QsTV6 zZJlh1iqweaY0%wD^=>ygWw)c+YZg+faYIb{9N=Y9I-Vj`E8(HM$)!{UkIEYOC|3Rb zba~^Ph`>n#4b2ZTNrx>s2zQ;PgS^9o&fmx43YZ097H=a_UX%`<{UDsVbYu*VyWt9r zT-++o-c@~!^Qn}r>SJj2b&hK2*M%QLr8vvA-G~Q7SR{z@fX)_apiv$WYmx>=3C00^ zaR<~`OYy*D9m8;uc!a5VU}wBGRqhV4_k^d>c;$iqr6KJu&4c_AdNRtJ259WRrAZ1V zJqd^g0nws2*di|r6Xj5vz7*>JOqet&j3H@y^;lU}2lW$~9$A@Kz?w}|Y6W`IejmFI^yFk)zU zn1lH%9fP@?uDOc1HTY8)3?At7nVw#N?#<{TLgRkOI|!Wz)L=y8VLNS1>`HRulrLBK zHK;O`ZX0m!^Rh5j7FtoOTAxo-w}LTC<^H*HF2l~I6xtXHZImx==|DY+q2a+j38zpu zJpWKNE?X}!toeO>hE=&sZ)@UMG#xSkr^{9D3Zq<(_2u%Ty|rAv)B~+6*q6(nvYBK- zF2`2xim-)?vST^soiwnoCk%x2MIqCwc17svSq?u-re|bimAgWqtY|g`HZou?nGD%p zs61enYMNuvG{ID-!*ypgs5&2z^jXsD5LtU0%GiL%4JlMkdXg92S7G(gawnOHDQ^M3 z0dbzRMWT_+8cIfD%3B0?Ynw`VY!l3m@Y2DU9mRv$*EUP>y9d)4O(f`QJKw5Q?)jij zh6~xWfdg(3I?2l$gt~`&>+SbeEB|ind<$+Vn}f7jW42i)$Kt42I^3x;{-a*JQ)T=b zoP6kQ#M3lh3f5{yTPE(MieHVhN{i@oaiDo(LoM z`NaN&k9{Uk^p3LbW|X7SaCpp`M#E!CX{7qI?Qq=qecX()(kfN>vb@fI7Wlmli{!=c zV?q&9lpxw;mL~BJppVhV@1QwYN%x}Jmy+7|#FeHwFVcp=v{ADOS5Q)2q!Y6H@pn~M zrt5VU{{#h`&xWJuGlFn}0*8PrZFRShausU9H0gphp`6tm zdmXy&O79?^e_Kk^3%{hgH@;#>gVAsW@z&hMWQF*(4{Jh|%_ho`#WXuBzRarE)!ong zb=qBUYA$X%uB|K)vT@7k?Lj)usJX)hidR0F*bMf4Lsk&t6FDhoem}+z>iq%Jsl;RC^R$Wh9iS$T zjHa5HmP5MY*S4eS$(1)LK+H}jx_IBYv@}+uT%9o%H zr9FN%?xL;#ephDQ#I$71@IS$_t=xB$6b$Ok8Vur;`@HyUNj`1mPn!o~_;f76??2*q z(Vzs#6CmS9mbk<59pQXPr+em2FYoz%GOpBJN%J=ugP$g`N^bYBIE*SH)U84h;r@=6 zfv{yNG5B~Qj$rP;LEmoVfH@Kn8_oRcd@&MtlL1H1)>`z2*^QLd(sjsY@6cFQY@OZU z8}|Gz+KhEKB{$=TQ)+#FL|JhYhhZ>^y>9T=<&NSg;+&i605sTpK*D*v9E?mEjDQ!B z@2~5$<)hn$3ORor=VQ=7ctiejG_5+gX^}^Y>Y9@tcj|REI}jEmW{JF`XxL5vH@GJo z)NgRh%gf1@Q}QjvyHzt3r4#l6P)+}f+7-k11F@Rk3r83A8g>J&K%e_*TdMJ1-)s=o|nEUS?i+(eZ2T4h|PmQrT%LdiP_ zrA=_Yh@M^x6q>MGaNSM|u1A&(lFjEL*eh{dtFiTmV~~B6S)Lmqiyf#lQ1DAfOXGd+ zu~b#0jS;01u|VmEi?#I!g|)kctp`QtF8;2qdm!$QP>&bCYW2BV4Pepgbe&X3d&aC0 z9ZT||ihh~>S1_gU?a-aFBn%D{oWpRz8^(5e2*(!pFMUW3DHpxC-77ZHt*Mp}Sy_``98~MpXM2Y z;bLt(G9T*{+5J(lKPB&7)85tFx})=xa!serVbAwhTb|7U{)zJZRb8zQ%9-`Jx9}41 zN$!DSkY$lw=nq0Fs~?i@xoVMLqVJ#-7cj#?+sKFHX4gDJ{Oj%Q8MOU*9M&=TDZ%WK z^qn!zs@KG-8f*oGFOG^a2ZWa>zv3>51@3-gmjhxZ3+8r0 zk?`zWH?gwtDod{VXC+iqqn-5FK=y=QzveFqA;As3qRq1CX>N1A#V_Ps{coD1273=| zsE<+QrRg4P%ryQF$M>j@oC8$TyKsP%M_|erHiKY~!f`bfu}6Tqj71C&+wmS24<5FW z4L!SRzWQCQpn7gnO`@DEsw0W&0LPao#M^72Pd=if9D3)`9`Uzqw$3HfJzW+CXe7&Iq z$k*G6$vpBpey@}(2`Z{C!wW2|CkcxgplR<8pst|yu4vjrpSL-F7oa8h^y7icb0_Z7 zg+yfF_kAz+$H0HAY@h3Ih;ke4E z*s!9%R);PJst}`CSi27OtXA%*B!3KRNLx3H^drQiB~B{jWp+Ec+nzP0XGf#GFmc&zLmJTnyASWDdpP z4+FIgrHZcB+lis|Z~#c*xOzu2AkClcxLIrP?K`;4{V{-dDf6}=-nPVxH0cOi(16c2 zKF9AXtsK3x$r!!glC>=Q8K`p1qH-;ZL}@~qdy}?d_btEg2c6o=TYb_Gnnzk7I10b| z<-lFd5}+ljqK=sM;HzXDOcb&=1*&E1`mM5rmYIYm!&K3PQV0 z18WLLO3bWQTK+{&q*a<-Mqh(TrAA@ro76rfSmmUfk9;Ej_aQu?r{{VHl9a&Q?>(ajT{tUCVC$_deHe99M zsC|QpF5^Vk>aJ^2Jp*xZI*TkxLXkyDn#g>hTC}eplLkFx-}fx#_%NzkQ#M%TtT7h+ z?#XjH^}BK0q4lrby%XE21H-Ylv(I+p+jE>J+75>hakDM7m-ngC84Rvc+N)S@RzFVl zs5N16QG_i)^yZ5RC5tbC8x0+pZa6#4R*yyjSbw)uXj_9 zZAiiEiN)XM@cs9 zL~%5FLf7EbClm;M`o-1^y{a&K$d7y>LrFX=6>(%GiB2)}?eiEt{Ulirmeel(n zd_Ob;5xmbvd~7os3h-RSvL62O-{e@_bw6fIZ#eFtjOh;4`;aktc-W5j+x6D$NSvseD z@GyPDL|d(ID8d;fUL9{c;R^ryGUZPCef0kGJ}o;%puWJ|`NEf-SP+#~kQwfMG(9nV zF|)QN*4ysm^)SVTaG-LL6%X6-9(|odIqt#N(#&dN))V(4>#=(^)`LL(f2_TEU=&sI zI6jkPLO4PXLL_n-G-Be)N`zptF_Mu4dSC{E0!9R77eQ7*5oQ!5gy3Y>G|gaCP&~o) z!W&nCfC4!n6AmHVmmGpZ52FySBm~I(>gb*$8NQ$W{J!5m(o^ZKe(&{r_3BmCt5@|C zzWS5)s&@upcVz6Z2>Xlv8U=j}P&Hy#YZT!Inz3cMrCD zkMECcYjl5NTZ8)(+iGY9l(*G|kygZc8<8^w2@YyJwdVXQ39Yo!ezSC$!Ydf2psR|k zBOS`^YyjTJE4Z^Z04f^jTB*Cv*}Xq`Sm#fk6-TD?+2hgBJ2dAz*~)^ZB?naK=DD-33G`v<+WLzVhE5S(?W%zny%0C4gc7q# zoyho51`MitI`EgwLF6Qhi5%2*1LoU-YnbnR>J*DSaJUM;4i0w#csIaN-MNxHzUS^xez-ZfjD)MD4H z@hp-08+~!qU+c>rSlLqQ!oEbraX`dtH>kU2P4hv4`v}Nj&0(7PaqH;ixY2!4fy=|I z0b%7%51SnRN0OBt$l(N|PDoZebTa1tH8NgEekdSsEKGDQuB9KBa*a7`+HjWX-bZ=R zunU+T6P;|>Lhu19H}$)FDU^ZI`Lw^@ATdZtqWXmnfHV33P6DED7G)PTQ(jEXlxOEz zt9m_9Sc)!6@m{^_9{ z4v4dK0n*AoWEnfy6aZhYcF#cQ04I0RKnZIJ-c=eaE;d<^s)B2fHx{%Lk111dJ)s`#boD&3$HEK@bFC91;v za6k3@*B8Igme6uyjt`LKf>K0Okms{DgQK%)-R@VQHH=LAdKrUgL zj=i%zCTynlMZ|pANvKg6KxsmILM{gGw4a7sK=wfT(~Pz#Oqqx@7Kz#~=)IAov`;L? z^Rj*M)Y`<7a01CWzd$05TSh|3X;yp+MS12lW#I{(8l-?)?W7HMU_Im)V0bVVWv*c) zEUg<)GS^B>t6-65!~+J|H6I{j>TDxgV#vs_47u1($XW&Goh-&SlFJ9#mpCqqA?Xa; zzy3=0FSsg1)N245)17yr4x=VLv8~08P@+u?IY-T0w_D0wbbE zzY1oT>qqU9t7y+?mB<&b3ZM}L^c0>C}=Vlq^E*>y|sd_094dn z+eK4LOW6zxb)gw3AB(#b*}OP-0{Ci>tJUbQ0(e5vt*oLqwZSo1N{i%Rqnu@Q9Cu|F zQt!^Eakj4jc1GhS<$!89u55^_-S5=;`hzCNwg|KQh*6XujFBHQrugbA66{fCc`nHN zw%F3TiU`5E(}1O%Kq4Uu$9@Er!a!DDwP>NpOUihA!AX9JQe{YRDi5kBCRcu9g!1SK znjK4ssHQ})sW^(QOD-&Gh-5jAL9k4|jb`a6eCm>6lI>)?MV_;a1EwiIy%#jwa>JO- z)fwvjXV{OAQa}Cxe4?Qgdw^nVolt)3r`q%=^oH8B=H?@&I>d z(Bkguc0-{?J!-R|mx(V++il&EgyK~W8zPCQFEGQw2+GZ9FFcjbDQwyI(l}TRTs(xP zJS26C{5-5t_GK1%)?^s=C8FD;F5V_}@iyi0$fx$WJG@3)6rwm6@>+mx1`@NJbt09$p; zDFhv3IGG`zNJ0g06#0Y1VvbA@7kXcV1!K!xGD9vAU89zXF6(j-=dsDk%h}|=F%D#b zxp$KQ-+(TgU6%wrBWqL@|HZpn@+p_WbdreX(4D0J-l?5H*#%JN9(eA6X}b%feNSlL z!SyVmeF;!2L__ynW!^6U+4#huhq$caWqP5||H4ZE`H;k)z@*>6(mhFhU}g>DKScPs zcWT5t1fUPPSsAF%yEN1?%nMH5I4Vi_{76;RY zc!e=AXS`8(2TjG{43^8n-CPpJiaDYeQp4b0L=9=Zh#GEfgpU4c4rOExFXp4Z_TP}C zC1Yxh{U*-p9Go~^sXp91er}lkF80^H2BMP?6)-NyndQlj+~eFut8v$VO)EDw)C zU$`jo_P3YwjQ%AltP9o&mS30qcA}qx^RRsy$JaBk{ya^2=|I4!)+U<$T2c#W8l_wc_Z)*t}?4c`uWckmf%6}0QECJ=e*?Kh*W4^z>HbM1mH)zps zjE4eC+A$JQo{3jwq{;|vM;#X6YejBjO-k#70c%Q^=oWLag?l;hu2afGi%|OFnuTZ* za4d4>dl3|AF2onMIT=_odQZfUlI_ccqK%XM39*88~Bq)Z+lCVVzUoxJc^w zXBXAQVp&R=^4xx&|HpX#-%j%%u1!4u0eS~!TgqV%Ms>mSUq=aXJ|SXUuLeSV8K7xB z)N+@5$Pp6&W!M2cJ%Bl(rAzc|2{xFye1^e7ZSBEg=36@K(|1){OsJgcWbtMRW|Rh1 zsnmilh^}@=R3X!`H3IV%gbJAk9NT!nF3}`S=-CJL)U$%~GaMo55Xw8)`zQqpMIS`# zH~=ZinzT1fvL=tAXE&`$Q%hjYS>~D@q15gV4EUD@wSlmF8ZaLM2%9;u>}LOh5|R(p z-27kSMUpU2DdS!b4ElczVRF4gL*LeMut9m^GVip|PsbME=SLk07Bis_Xc0W56xOUMRc4v&OyG1xbl;41&KDjetLU=Q+#52gYYkO#kIIh z$FrrX^0NkCRf>-?cJ^^Sdc53g@KriaMvC=^Q+y`Dn4Ot`X;L%$n1l{d4`3d{2aKY_ zogn%u?Z?fIhVj!UiPCn_aq763+%&{B_P%Lm*H4*brn*%p7zdXK#^K9^4g*Vs4nvp0 z|104CGWdT5{9gwD*TDbB;r|-=|2X_#D;Nd%w^r!TmJ_3%gTJam`wwFJPN4{Mm56$f zf%Zu|lIum+2%ngIA*;^a%613daGY)>)*lP-^ZD_n;%@!XmB3df`rP(&qNB0Z^c*qy z{1Dg3{;f*p#}|*eGCxmWJf?AeUPSSjtMl_Bi^p7>pBGg;=KB0RL-ClV`FYXBV|?@T zS`~K@9ThQTS9O#(*f;X1Y{5|p*%6kz??aCgU!*6F16H_+eHzB!O6T8h)kZuIpcOsT z;0hlx&i#b*w_7!~(+{9mXp#RDsCMCX5F*M#<^AMF!>WFk^D2)wFeudAPT`*+TqS6F7* zbCBMjO7B18e}5uCC0q?=EF1xtUohrC!Zi6YGXQ#>Kf)?q_udJZg^YO%VRrUob^z#2 zE)xw8ng6_|OzsEGyD>VXdlEO z;GUdX*c}C$7rK)`^Hg^dXx;^8pm=RQAFS5l1g5afvt-Pv5uBMMCmd+*Od%V7Yt*Ux zcDG^ahihn%M<1Y`I@b+*>QA^v5Mi7K=wc7@4DWXpR-;jDKS^Tja>CxwO(UZ<0PWUD z&knjprf^lKabjF0Ja4lAtn8=v=h6Ff{qN5L=qS~exv!CF@N0fyHNTKcFAVd)AOchw zQsD>u9#wWX`xfIu<#~vS>^UwchRTWdm!kt{Tc8}z1#~(-vXl4`=VN%KP|y0^%_1uL z6k23`ZXca)?OyZ|yIC3KC6Ue+F|Km`WW2whc5q^^?;}&^n_bb=xdgAN2*cn$e;K0$ z&LC6gmge~%UMW`Vi^qIo(mr1e)Og4GkFey!SmQm4<1*LSwWSfZ7~NESI%vvjeBlT; zWjZ&dEj1;Un$nh=(gT~~n9dms!kovUbBJUP9t!g4Jd{wE>uv2t$C_f66gk7>oLW%B z6i~yCE5o)EKO-YFMUj?g$NOq9w(G#j@P99{TuHEX#=D|C1C)=4v*e*L56YAyHzRq@ zj#r+pAs|h;X9vj>Fac^s8H$&o_>SA@VJ@E|a}Ug=)jVWXo}H&X%xn3OCu~U;?RssD ze{5W3-Nr0io4SFudcoP($GaXYwv)TfQO|97N-0F%r}+EOA+|;KYNRgZR3+}q(96g=Zecf%e(4Twlt@v?iKVrGz!jm zTDpC2^`Yrqjz>a4DfpA3yc*{9KtrtwM7g+sQClJ=iNdoLlZ0ty*%yVmrd)Cj!YJob z#3bQd*(70Z&I-IN3%Jx679dHWInH_5Do=ze@qyWKEz))~Tn)Bc;2I@3cXy<0>+#+= zvttuTii)=r{tJRe8q`t-zkT4hlmo+AS6Jj}z@F^OEtpJT&N9`uwxo_MMoR?eH#*gQ zyjfO=^M?N+D}>;r6ObQrdSq<;y}N;mA$^@)cyGJ^5}Squ1g~aeM9lUZlVRt?AvaYE_>#-<7nnjZqq!3ZMWn9 z(c9R%ik8+VLXy3BFdMTndaEud(F8O-2ETvm3Xn2O*#I@Cj8eG)=~|^GnvZiG(~ z7L@_?1wrL8Rs4Dp{yr&gw zQtY%ABRF@kD*HTz*i-FN=jff9R;&+bI)qTPt(9L5lP)1od8HMS|HOFG5ndwvm1wiD z%622`snN9b!TM`>=#z-D)?*v#+%@a1_(GPMrGy|{bR&LFhWXu;m zCnI#6VWkUYSV=O;AfXkKYSqk#+%3 zLFB}sF+ZmnZ<+gsb|?{9i#1%r88cds&nX4fny_lS4TaZ)YIT+i_5(q7t!?aItUT`y zo#cg4VTcO`=+z6zm?m6P_PGN(=bF}RklgML=*PR@9{LC9l(p3XtI92H*s5ZYCM1Y* zrag`iE&N;^cyU3SmR3zUb4F*J9;cLxodbov+9r%9jqP|mE}UUBX*J}Sac(*cXv4%d0~!PNk*j8(&80h*D~J}0!# z{AeEnv>MTFLkAf-8d!b_rGAVi?h>*ykjnl@;|j6&k9S51MCDXM@vv6J9M+zr7OOsi zvf;r_wB?TTJ6Dti(FZcGfN@b(VaL$3lb)t+u1SVz>)dRSYK4V;iK~xn@{lpJgG#KqMAhE+o(oRhSRUwYfX-ZNa5wnFt*88MAyhh+>30A z56&kxNCEr@6#!}xs0E+_fd)~EhTjO#i4#CSPjHl9v+wkL$!B}xD2~oC<G<-M9JmElHMWj&l2h1kNiOBjx zfCJxm48QNF=-cY6kPh02YPX)TXw12sf! zC2DwAKx%kf(Bgx=0nh=Yh8{%1nI}6^HHlcw+_{0hiO1B!4|kx#q2BU8b!^%Uspj1+ zR82ps=3YUIFLpOT4Oq=;R())Y7E5St1ua~i0iZW%&i06D~-rC z&ME6U5;OE{Z1DNkPlEE-;%xH#!@w+FdAkz+OXBcOdam-F_E_Z-xXM)J>j1^^I(P05 zRX?0s;t{UUjL!Z;n}DXHFaa|vXacU(wWA`NN zTm2Q^0?_T+w~~8C=Cj;@aNgiI*gwE2i|rMP9>>bi&^f9hK7sv>On(`Wo5Z1%}wk`nm5I%Eu zISQC=lf&nOd-g6SX@}Ci4Bg|dm^S!V)o;{Yg7#`>NL!&hFknr7;*^xbs1#x32$1uv z(kZJvDSFxDL09$ZzDh__n$JI*9mY;oD8- z&hSzk*)I{OIf@+lb|@># zv042Rz1@-iJpuafTZgVWnZIban9Mxg>QLmJ6HmT5&^;&CleBz_t8JDWF~zvg!awMHY3h}Tqvfp9)L&4LUj$_B(DM(j?7cl8$@2hcb8 zUF~`GnMwnYx+)f(xMl^hpOL3k_ValZv!93Cs_PIFW-~Sv$JKokgVlW%qs68C6d(!v zCxxS6ovkFaR|w4+qqS--K&t}%W8)>OoRP;6a-JXgA%NB}vPWdhw-~bzVg41a%Lp?G zpjfQ^`wR53BF3-D$o%Iilr3s$cXMD2>HtREABDTNSn>AaGJj*+w zWxs1{)5iU;db$f&{(URj|7)d%V*L`J6#^}DF{eW3bm9db{|X*|dU0keO+c6q z&>md5ub;;i<2WAIM?dC}&YGsm~#bKJ+<1lBKI_;cLWm~e}5 zXKug>12*6rxPD9xSPswt?C|7T>hM}(u?C6IUNLA)WFA1{m{N|O3@ixCICSKX{L)Bz z=^=x*z*_*CffITEIYL{+XuS#TF9xj-?f_^s_Q7aPR)bn*axET7M&ncy`xwe7Y zwKxjf^+uG|E*C(vuwAnP?V7kmbY-62O?7R8*Oc1F&?HS#SZt6KmQu!h92C(!)IkF( zl)1u0s_?cbjT3bP2y?P|USM7ANk+RKiD*|NwIRCo;D&TY-9@N1e$*`h z{Y~&Qt#z;hD9eE$CzX8Z_4zPhstkWy;cpN89cs8?e7~Q~(msyechw?4fEKBRz@>F2 z$8|k#>gT{}_oCS~*q5@|ROgPgb<36-L4QfvjOU5vzM?PM9N9zkm5b?HaK922H1s1h zC-1=gYLTQmMT@R>k)j->{U>*d5q%LNjDuNjFS@$Lz%xBQi|k=`xUbpW9^^*&enyxu zc7WvDVL$185(L8-t7}q>$@eq1G6nb7YhYfOr8?kQ*^(zmaw~Y?D@SU8rMCvA86Hp; zBjd4vUEbUAR7eoI@(V?`2}U~7JeFXXeA$E3L|KPteggRib1~2r$lH!pG^r^H)nVK1 z91JLH8oR6da${QNth7)Jo0!LLoZpb`|8lA?s(IijTdL-6XSs{a`6G>4NniL# zr_%-L3pk&Zze6j%RY3ULej;ndL_PUG!u3xgws8P$1vPU$Ue@A0Z!Tbez}WW@cB&uy z9)NykrPS7L{m=eaLQYh**Q0GQiridcFYCy*xMe%EWmaAwj@aYj`djPYeP*d1KWi{_ z#ihs=UGbE^E1qOOAB%KBsai>1d9!gmpxaY}!mMEAz3%8EgDGSNYbj|T-Oe5nI~3pd zT6C!FkP%W6p-k^0=#E!^r0z)4VR!U`Yb|w00zhp*ab1rW3}YBOi4pM}hud%+u8fFr zO4@bQ`VFDAwJrJ$V_eB`+sJz(b{+n>GLQWX{bqW^=kq+qA??D`%Z`W^oix_pNsk7S zH5+Yd!KWYrEs2TApW}WEQPPS~N}^p5Cb|x=83ZSZF)e6W2jeQn7@+51OcZPHcnjxova^ zSp}cZ!+gA%jnp}*8F-xZg=f`MRuAH6Xs4{mT@z1P4eHq9l+~g&)a2gOn zmtUv)S7H58YW?xe>!+i>)&#!fZM6ES zlfZM+cO>2f-Dw2sNbxDo|M<<F?I8}Mi^Mb_lL9^ zr*GA%G4t(EG^K1tQhR*`NlLc1K~qu{ngVxxoFoX^vl@Zfx7QQsCqrZYw?k?|6$rTuL$Dz{`Hg&cV03}*P-pNQrpS@Qr)YGJA|@7 zF5vLbcu*7V*|;|VDy+1{al$pP5sA_cOTff343UAUtk5n>=Pu>|JF=G%71fnT2u?f# zNfXjLgYENOz6)Mz9@nBz(#e|H3ACvuokJP)t!FqPbaOXHtInPjut9md`J18Di&mCH zk?MA(VZ}lIyo{V0dskkyf)~n^&D^@ZN{8=sx^U-VbJfFClD&qSkzu%e0Q;wm`zH(k zaUNkNgMCz29>d4^G1>wMJ=8H4c|yF>3Wz`!6MW?qfuwsKyqVFqpd)4rS`R%le+9}( zpoH7=EqEHb&g9z*M5)w#%dc&Q*W^f7?sloFyeT3Rr59J!3&QY<^zu2al`jCRDk~8^ z^6mF4#&4)B+;+bQI-%_WjXsBAO>Ow8w-fYP4Q1uUnfqx3O#=4l4bEO%w0Y(O?6NxU zTU{VpvTZLNU@x4VpcABrP*5x^K=27hH^LW~GX@z2 z=Lh8LJ1ia(d)qovT3tt@&(<2mM8P=^o$6;KNaxEv5sqJ5ndH$4(*E*u5suTX(ys_k z%yW`eSCt?*`9%6-qGv4uac$9uCVgj?u*fZ@*MLe2JhL<1yC^IwGpE-Hi^`!1MLPv& zcPu2KL2%;n;y{?lI_2}PX`*QMJW#hT5XE)hw@)(_{G=g;gC*!m9q>2eAB|SUxq-StdwJKrHp$X+h8@uFWfBRJUT1NqiU4hUue6H7P)uCUSu7pW}`DeB-(#v z!?=31s8+$W80t&eRaY5l>p9fbFG@P*I31a?i#Ch#IgDJ?KG9bprti0(0eS@urUJ=1 zdAHdWRbzH#N5!L>LWxrqnhyllnla!Ffel3I2%^Jf0+g8m!+*_Q?Ll|fizeZ@?8GF> zM$ge@WqXZ1)_b%10RJ^XS=dzE_7bL551S~m%>a_{S)zABAh1h|?>&e7e7ukHGR`I<$#f?=r~8`FX~6OMuJ$ra6>hEq4@a~$B= zM$H3^54*SY0He7#&bJKxz|i;0UV(3yF2@;aTg6Yq>3=A{kbfQO->~e;bE&HK^o*VL z#@QoM%J@0-%}k7od0{7xpGZ9h*d4Gz?bPD1QRCo+u<@Gr)5>rKmembdgxnQFuLWXE z`S1XTeX!YaO|Q;q`C0VcuVycZS;m0=9!tsx?UexKTBLs(>74mwF4l89ae?1#31r@< z@)ie`ht3ZZJ_X6IA3n$bMt#Z#Gdb0OA=l*598YSw77VQ#y;BCGA1c%@TPbGQ!inTx zw-pxbX=jlx4ewTxwZ588dj6^$GO@M(3z9RYLc7!?-#;SXesI{E`z3-xR*-0%rmq@Je5#}Ih|WlTL>Zy~SXtLJsPr#gX{i5Fm? z?YW@)0edZCDE~0~e5JHt;d%TATSPZBbl`%&I8U~}^IF0G252l6JeHHOH}0Sh@V=|O z^cmBW>fUF+Lv!t8m$we6U+xGHjZ_X?f}D8YBLBzKVmvIM`nh?xP71qzpx-77IQgFj z!WC^)Wjf@((qK$Q{S)~u`4v#1Xpy$21_i|~ZgV zp@2(3uyh1onu5nld?- zIQ!84_BmX@hemVE$*1v_+!x;*ZyPv_I*Da$p&;IR{tWjjHbAueuXJ565BRK|bCwmeDT% zfe$bKp`rZ=(D*oiFl!eh-^0k&gj@yJ7(y-s=w>YQBSwp1v=0ewsUPiafVu|C?9U{c zaTdn{SB^Smz`x0AR7gG`X3Q>~Ls6v+gD$8&zY|^a+b>i9Tgu}Q^JlYOqm%|k7wGV_ z_fb6m{TUS_P>W*WDo~4B0py4y|B;c@ljCa8ITM@pF_oG5^&er2eoL>#k9R&uaaRmu zH)|u2wT4IHf--C=b;lK2B@Gxk%xx&~YL(9iXdYL-e=`O|0MzY_`V^r~^rJoj&_YK2 zYBL?+4HLnpj#x^I)74>)yvnIJdC^E0w23Nn9>mio;lkmB4`xY6OoELL z%3DiuJDkENQZPz%Q7^~>$vb^YRlHEN8TXwz7$t|wuQtmz6uQqT=V>&pWf<-^ryBIv z0P23|oBz;)VHkP_d&CUaXzH7R0Qoxcb^xb9SikV?=w*E~HsJ3~xZR@Jn=(@EAS~G? zi|hoQh5tMTU%nqVuKdor-_mYkoRemf@)}I?^*iE72)K``j;--f?hm+j&|$Q)Z64~l zG4R4#yrT>-@fiwb70}1}nm8g;+xnI#G)}p7d_sfdJu$uB-io9YT-^u9I7;b2yddFv zSN96p;)EiDo>yofMSScmo0VPnFM4Ln5an0>@p3ug(FhdnoV$dDc*+IO@Y$|F@Bc}H zup1tw@6Y#oFi79$w89mAMr1$Ch$_-%Vc{tfnM4d8%BwsKgayYeCuJ9C6gOAtbi?Ga z`#>ujs5N)i{U+5?X}i~)epNkr=WiGY!nR&o9N!KYm~?D;ye*FgxF-L+*;j!yvL%1H zcPe&Td-zOjo+bT&{hW7@HNDdQi`qrwJXhb+uMGHUefj^&H9}kgUT&Yi2W=N^SIneedar;1Cd#xYE(y zP~lFEv-q60&fF;IIevVE@bWy2zal@CfELcu3lEUi0A=gd24onjHlpQl9^H66o@%zy zQS)bwl*%ZF_SVsL|GkYmofiA|9K~`wp(LFlV_Wls`qJ4JT(49=K#iE|(Y4sGr$DY_ zsSW->u2yz7I9jQ3>*u~hnd5C@)VUuLhw=PQXW!u3jyTM(09C?AdM?sbQc~X0Botec zD$M@yj*fl8+a(IlKZyDH+vxd)gU4Q2My1PCy5uk20njEaeK9YdTN&+1Li@+>+JcNH z3HBq}vxFA=F`>m~5?Tga+apUdr2no8EOhqeK@!a9C`1(Zsb>uf4o51q4!E=uI$+Nd zs(U!st^7u@KY!EeJ`T`PtQ)O#%Br_9lm)KCW0z28-cm`-%!7_^$`X9KkiS^R#l20% zz4aTn(QSAQAP*LY8==Zm_=3bQ>{v=KOr{qm`Ck|hkoN&5#_1|Scqg%{@$nK(>a+Dy zLlE8hHjDUZ8GJl6K>Bd5=P9m7NA)zF)aq#f2&uUl9m%ODPvUZU@FXplTTT+!cY$iD z49lQUZJ{>h8|AYCZ7czERL}+mTQD%r%K;A6h9M#_PFqg(je@j^t~m$Lyo|cC67?4H zk=c1L&DO9zt6Fr{*}7wVVCD9=*o%5;(340J#eb+xi)D`S!qph(W+^JsED2@_7^=(> zL10mQG{%C~14+-4v?+!*Qb(`SNP-RvvYG!vU{)whfmElwW zt1L7a`dCXDppCj_#mU6gR zJYLJ8cooH0DW+e{|I;ErG1DTiCgoUO%^BYYKpmJ%FeY1mY6_-@TKF;QlxW-XA>CrU zEuh4~ddmG#%R0ZKK`;C(gJG${(({Z^)SEQkQ8gqexrQ6fuJ?R6KxS8`t5#Q3lf`v+ zlbF8KB)nN}PCpDk6_)gJxSG?C3U9(1>w#Oaz#fI4O(~mm&?i@sfCzUZD#rYt!62I2Q0$( zZ$}_kB;Y5iOmuA4o6`3PMN#;2@;0+;(GEJw<+5#$F}w2dV%Zv#a#)M^CubjQ5T&9+ z96u-f82pocs1%^11T~0q)IkIa0XT*LNV8E#MJei#=%|b^rT=38$+IMqBQSs%@bUyY z(rK0|tT^77%azA@kvh)(u9{ulV2sb>NSf1k<4}v~2Wi0f!APgn-3-H^yw(kK@yB zAAz~l>HE3ADk4N*m3_bHxDqYA{5A`emY(Oth^@fVCk zYJ?6Fo`)2S!vHjw;Mvp~xPKh(kLUXUnwR1I<8Z$g?oZ?U0Ge0e{aV4;2H--$*dBh$ z;FcafH%oL>!CwXZxf|?@Ea^2CX`fJ(9D#IU0lKJn?9fYFldon=Cz2a+HzL(lpijQy z_%*WrAoB|#l8Znj^++vs2;`dGMfLdQ#AAF_zH<9vM`NV$@^0KxNxlRhUB8?@dSqQZ zeEG%rP<|m7D5A86!YIiv0XS>9=r$=-m|Rc`k2q@MO90MV0gr0cM?g($n8scLa8@Zi zYT!o?z`unU{acz(@~zFovSf9HeRzAd-@UQs0fY6y@lg($Btf$(|jO0k!EB* z`XkD=q&A@bK(X7AE$-BXvPBwel`VD!w#fN3m><%Xo5~MGIj#U5NH9KmZagXSuGGSB zNUO>yA?fARTO_^A{RNlZIdDygLg+<+I`yUHbsFHWM|dqhQhx7CVV%5xM|oqdCcE?l ztwo84BE4V2r*eD3e($6;_`MUT`vlQ7LN7|4Ev^j|YYCQ(wxT3p5|Bs|LmR?4oZT=U zeiG1@v>0Ozn50V<*Sg~#0i_t z5-?b``0VYuX1S=2n2=Po9e-VqG>N|L4xirk46H-+$mGiI=SyzL)}Kml;{KP17K#&K z=2+@5tydWWz;N4|r3G~?S;$1yOW;8jVw55P7(*KXrHWZhWv!#E3D^{@J+r>aK`r(b zn!?$MP*+Nwsjec@mXR&(LMO<&Q2t_e!}s7SW|oKLQsppz>w@NQ`URN3=pxw%Dh#?0GnQN8 zD1(_=am~Ka^QC{3OzGDI7jD%8f5MUajz`K=w~xjuS3t+4VS1J8+!p)p6nl z)HN~@N6O^5rngOlp`xd*?E8G#$;b6g*~zDZ`I9zY_1bvVtK(JQe7xM+c)7Lla^GmY z_G5*Eu|9RU?hhHRknyTl$7^^lRo;x>`o|0LdA#axG+x7RJYK_ZJYK_ZFkZvMk5_j3 zX{pI1ST2F&M&D_XJ~5Kl>OpZrRmx#lQG>qEDo;6Tw8~E&Gg{Msx5b;usTVhf;KPqn z+zRp*F*|-bT0-liRHm`g%KQqmYfubm&@ot5FXA-qDC>c<0d-7_VZScEiJYV{2o@O@{eIwl7Gd~di!f}zuPi%V$=~Yv zofOCSv6Mh9*ch#9nLw=1?ZhV0P)ZeMsnWB8o$A}7rK*YTKUiXzy`s>cI*@N!Ti7( z>W|?bZzar^b^aZJm4rE)cLStnFct7E6dvfP^0pj!`B=LaHV?oYaES6XC>st1&S!es zg*n#^P5#RPIu_XMguvwz`tXH&@pBiz^>t7H#N;^tEXX9M zY(M?r#0O2WuUQ@mGv5b#z_(jOS3g12AH?jG!tf?h74#^` zFsC=pc-G_^=R+f3HIY1ps1Sy4kq!yNYs_+gQCfK%vn$Ah#+xTx&%sk&Z_wP;9jH0hhzeP-M$UjUepzs@4O;rd$->u*nAMRxj`{Ihs+kJ{tC z&noR!JJ3^3-G{srWUl%{qF|{(pN{$i0D-(-!3#69d5iS5f}`LX4RU^V6R6nhFw+BI zS*1;a1LdqhbAjE9uKRz+&XTT_dm?@1b>*!@X(yoC?g^l|`VmU`*+`V^TY+THI2PgC zWRMPHP-edmw3D+;3Ww!eejY-!gYH2boi*n)szFnd4PWC z>#fo@oP|FX>v&V|7m_`lSxkjGGC4VqQ({+V8d2S1>;PCPtkSP)4+;w()2rWI4Ii}8 zR}JHtvWu0ZR>&~@3M#s>mRow3bAWVu1++)&CEs@VN=wfwkb;|}3p>yFDlnX3q-`jn zYyp%#juX+aNZ}(`j9{Ene5|4b>pzwzqtIc&brJngK<&9+jqP{1LG7uq9~T`>(bH#y zsWZ7rbS=8xKzuU4DGQ6m^B#h6I4C*uQQv{W9#mu3%^$D+5Bkk;P-^B+Q~&2!c0&pQ zj!+dDRB9URt3f0er7gDfKo2F?h^_^DtEtA3`;02R%J+)W^MwJuAO>U5`Ks-w<`eA+ zt7;uhg9PUQ>}*`A?}!NQbLTdeTlty@3$AT#T2PN zcsS3Ml-)40uGBUQXzTQ&8j5`Y*Ym{c-UVn-I`OrFkMQglz-!ObG28P>bW#hZnJxL0 zxkXe|9u+kjuGLgjEAuA@ol!B5nb!>5Y1ZJoRsR6$DPRE9P6;CK|$O!dy9~L00u9HG@XaWi}E^!c zGK8+Iq5qsXg*E)2iTHK=uoaTG+gi7-SR{worR4eC5sLK4q{dW{nKvQDRV7Q4+@fLxyU|?GT>nS; zqrE17w6RED?`I>j|oj9^g3oO2zwMZwVgGwK_&nJ^;sq6(jFLqNdzUrrdG_(9j49NF_dHVgZsIaT#SmAqji)Hli&i z)FrRLNz!uXEp+xBt|`R$1%L);fV3RJC-EO)wA#)1@GM;KB{T(~Ttqv}$ISaM+Gav? z!}Sy`N96!L146u~KL-J5&1nB7v}Jy@cL182<_~3R#{AF3I1Mui^94WVG=QE<3&d6} zWwa55Hr$V92I%=TUGt2kH_CAIr~NU{B0h%y6c?zY0-LHeZKMI9qBI?cZ~o^+|IV4W zFTB&2-`Q48XJ7sAYy{|)G**QKXTOWc0yK5VbH~LSo_FB=b(6HmEY+D|Ko{oYh;JhI zv3jMXz^}O#k0ATwVPWCl(Nexk&5m(&PC&OqH!+N)wIH87xk@Y3I1DUqt(eG~GIfvY ze*g6x()CI=rKur5D0NQrb2!bmkz1*u%WFSDL+Nd#8{;fczTHOppjEmSF2YyQQ2hF1-x&RM(MMK zx|6~Xec2QeKk+>d1pCcA>Yl;WikvE~dj`=x+gq%)B+44)c){`Y_5R7j_(a2lt=$D7rua60T%cv9bjPvJyp zstRK)iLIVXwD$Ln7dwP*OdYy(3UKn6S9|*QcEWk zHpQ4xE!`rG`oV9{kVb-Z(J2x8NVb<+qzhI_u}a$%NXTr{t_q;8)TLCV&|WJQAd6gR_TnW-)hyL(&7`O{U75Kg!ms= zq-rbYUpE0qz;3$>GuT<=UM5GA-rgHJs9<)mzQ8&68ew5mo_Y}*RBO?D&Ax5+-@Fea z@-XTb3^Xr|Dl_@EH_IQ4!4)pUXO?A4=dDr$T2rMf%0!hV-ze3|b z2aepd*N)r>&Lq_<|24ZVGzzq6)2UIQi>)&Us}%G{W1( zS1lRl!{hV{Xy_7A?o=*Hoz9EW{pHO=NmtLnI%mggXNBUa5uvpwXb%&@JWSFaCbfJR zCeAd4nBK0YF1Fez#Pmrz^AyHkB^PsS%c-^HA)b9?VvE+Zs~+3IBgiO|dW;ZTrh#gs zBD+f?5`o*Vdon_u{a1D2BosMy{RZ}$^OwW%tc1dKpu4on2Fac)9j07lPZ5f;8BW!^{J$rSkm~pFiRDu1uaOX(5 zV+OjWv4G&3MV!9ZdSrQtaD9>@y!XHenPNu_&Gmz#jXX z+GF0oLY0SRQk65P%IE!6J_FEgi7kXvId$|pWXzUz#F#VJ(em;GFjA$wlNMm1r9)ct zcoZD^jg zrB5ZQr&Q+aT6`~i`ISA-H1jmqWJ|;2CO|81u4h`=_dHAf&v8k%Y$BG@5Si3NZp^OO zr(dMuiu{Srf5CM!Zmb!6KXTijRNL;o3veG`-2Fcy?%p3Y+}%HNJJW(B-n*6ervV+6 zF&!G{MZ*X5;(O|gZo``Z{UZ_O_>v!S6#w-jjpBV5no~weNPM;tVn*h_-_jz)7rzyV5MT6G@R|AJ-aD1sp5?^Z zn8*GWWy=&Owg8GX{p1g-nMlX*qAAivm_Xt7_#9~+3SyRw)H|Sfl2Nynsxh{En_YI% zg6ZrVm8DbFboL{t59Z|RFi@wV_D$;GT=YJj5PJrXTR5)7%;^F1<#+r?j;c1h#`OV| zJ}$FfimhIQMkTr>=U~QRdk5v?sW`DBiG$#-v#HJ) zRWXh$!|kmLXX>$wyg<%?GK*0_4>L&=#KY{$NyF2Xj$b1wMvIud1-&tkM~XtumLaa} zv9XN{V`S*27IS?tlqN6CN_T}(}m{!c6b^s$# zq6*&W8T=YdN1S?+yqfSFRK0TFR4tt63gU|^$w*mI(!94x}~0Xud)C88?65aq7A-Cs$$$YDkU~|CY>K% zIup+iqu7#Crp$##teGyAA0W zS__)D-broDJhPChcnPrAB8IZ89mmrH{k&a3Kj(0Ib^#cDUhqM#U!KPJZ=+%0j>2Cr zSa+tvAM)FjGRNF0x&q`3Gb!%c4b~%yzZS_u_y08hT9E%;15QI&jM7spfD_r~$^)lB zt)MFn>=|$q8BO`o?wIyE8ZG8U^5IXT=x7ACj7M})`HrWE8l-+lhe_g=nejTYS%7-J zuCiHxyT7in*;p7~FCGW-?7W$c?B7jhFZ?a4u{{q(fSf%(N+(0BhO?IB{<+TM>Tiwu zTc-Z5P=A-Hza{E#q53;b{T;9V=BmG0>Mw8I7@h#Z!jXnaDxx$|EcSamFOP1XKTw{# zfSYGikoS9HN^^Ucm~Lr|7mDWMOFp-lUXT8sLxBw5C?p0f7n6whzK+!Gfublmal6ng z{gNY3Nt|MFIq?Z?*L{mM`Zx7+T;qIJ*TZ@|enz>cQ-Fsy>V5NPJaJm~zP)eL= z_EnmDhWd93#;7YohobBJa#SP2__~Q7WM3~4jM-O=csqemvK#52@oE+D3@XXKzD#tu zqs-}7?cZ3_D=ZirgxV|=m0$vuUKqRb!rq{?XHl!ijgd^q5i{BS41hh z3EjyX5kPnHs}z;r=QgEZw;%NkrU4viR71oWX>D9cg2GTE+Yfvrl2lIYY}*OLiCnix z7lAiCK82Qu`V|!W60RQ*CpotQgC1bCJ-TkdyPndHs!t6&yPfpBM`o!hKXFUF-qzw8AZ)YZ_|U%amfjjC%^F1}_0zCO+Wx@T#GpQ2I@n~^8H>_q?k z!xoSvdsYcWFH!`9l}Tg|zhZH%MA{hQ%0E&v#MSNK5LdrLW;$R2v*8Lm>DOfmZ&r!v zjqu}6Ih<4E7M%A)Vl1R4tF*%+JCkVN`c`B_0UDMr?)3U9Q+()_o|P?m9Veq5l}&h0 z%dJR0CB}AF&^v|cvt1*?s&fg@CcCLr+7F_eitsX>MIjnDCtpR1D-&H~8~cc^{40I9 zFmz5?$j!!D%3kfsow+SBD$yR2E6OZHwL}v znM^OfOfMF~^?iErC4j!A7wNhI?|Lwv1m;fs)8oPL{~59G%}0})g!`5m-IvO^pkb&b z^4xz@r?T|(`cRg>SQlXFJ)7|t=I0yq!TdaK{d`?B|NXK8nmx0}(|GivPcUrw3LCx- zu6t=bRs+;OnWv;S#GZ=wGz=5wYxA+-MU18b1$kF$J8NA7 z-XvWyC7;ic6jO4osjfWIHUK6LX77xwKi2HLMZbfh^urM&tv~$^A)HHYz1c@f*rmAA z=e8ffYzQj#&4>?XYw8N+L5qM~_79Iu8cNBnltKWO83V`%PeUw0M$pA3hyrgnii$r_&NYWUW z#cT9cnxy*R@pF)mfsQ@YD4j6~E0c=JwFMjGV&<7fq*5-p)~RicNA(dkOJBJt5fVl$ zxS6C~qgl4bkV19NH-h9#ITwl=G9KMp{~Yzk`rsK%hwba)`va~SE!^`hP)_pW^fw>=aPK~Y&)`5SpX zy|1up^bAH1lIOF9%#DU$oYHA{B73K{(cKRNlxK8b@ro8D@6A^#2B^ToH5jI+u}WL@(uolLN=XKULD6;SuadEE>$Wili(Hb(Md_gOWlyp-SR@Znnc)2CIy&Pai^ON4BLBx2> zSqV<;I`1q{mguCA>V7XcUk$Nx(wxHw-j|eiW6>aaU2W52Jg#Xpu7skD!h7;M_S&mJ zBimw*5JrxCWQZfkGaE`& zzQqTgkI^Xo^%zWSLEIS=mQk8jN?4`EO`(#VD#3U&ngNr$9RPW#TAWvX) z7Od60f`gX|eP98|!O)7deBwIrQCHRGe2!v#eT`ou(;DkpQV(P08;vnGa3AF|LYs*Y z=$n<_@J5tMKPV40MA)AXr5iMVh1>z!^-OGJVroB{bOz6;#xO{4Uu7iEC`OX5hC#Z1 zjgdC0NPlvYiVd``81gDLIggih)`B*>e}|D;VBj+`9?)F1Vf}+(dwO z5H9p6Nnq?XX~h`XRi3MyaDFtud~O-V{(|cn&i@V2n=H?3n0GVgCc>=rW3B^eNwTJl ze*yQD$s>7+-3s#Cp+G0#F&>dM;S6eR> z-9=Wa`TnR!l-@;+F4QBXZc;$M$vzMI%~k9qAL!)!P`{z_<-+%fmR2Gyt?5E@;PgfD zla#uYUD7eBTq*Awkce+$3*ui3P~p0XP5(QW>Uh_5B!vq^=@bMjHL1*Ne&wsw5KzA2 zFcMQXDqPz`6)x)>RpA;DuSTO9{yZsMZ62m>Upa=l9V3dl4HmezCl97U0A0TesQ0EQ zwKhX!kS0|Dnv|Z&!^Q=~QUPt@+CbxG0O$@ZfRd@W3|2-v^#SdF!}SX9e*=^OXx^s* zCz)|72&W9LjfArnpb>~O2=_l3=L5od53bjE{}Z665C`2_e|?m2ULu^CaJ^1A)6q}l zE~HqiblE!`{a+bz1R)NGYZD=w0h*^3wuo_h6V6|7Bbqws4uBR?VJb@qrK20B`3n;> z?dbcsW4q^l?BCc;_~Xj#H3Nv)e7VVo`*AWUhDh=Pb6<>j%X??xVy9u<22|tn*)m{S zzl8MuclBhUsLUfP!PxhaV`h${pVTq$bA;A=u+6sCfc74sc@u)&-sIGNh%9F&b5px; zQ&&Du$p>(IZpo!4kX(;q2cHWc>aDJ2969NLIB#P^3lHmV)J((5_sI6~o<^8o19TDT zY9sH5Uw(wp782Tm_cZeR7eIF+S_ekk&S*~&+Qj!X@_PcHOhh}w@q0dFv@Ak<;6053 z(*SxH(JFbZnl=j+xme7)3a$4Kk5J^L$zCqX^9p&g7SoT5*uvZ4*+Mo73RSSse9<|; z7BFNTu!YVqAzQf0kpS1etFi@huJN;lBlI-D7P!jhY+*Gm-F~*ve^zt0kT#Xr!o^`U zT|c0e$8g`f`1z@DZB4y@4?uf}>OEb!QI}_G)|b8$@y)og(}K)!P~gA0Kr0t`>K&T@ zaBV{c9tEfjd-gIfOuZOw1EH;ZN2_-=K)VoaJMXeR=dX4CM2tBKb$AA`qs?!$(i!GZ z3A5kP2*M7~U$6unm(bf^f`}#DjV1iaPW%7n5;CZS^mjB`=?jnvOIUxE&}K7QCqldF z9gSAn0rUu>y+!Nu7K|HlR}kYo=ehfu|A8gsLC0%ET{pdmgB}h4cphTvHF8y-zl{}q z_O`Y*ehAR_v;=z!DB^};{|or)R`|!GYYgwt5t`59vRP`PU03$7!ED|yOvW%@GA>2s zXA@8h9YM*vS)l(pf&}^kYGW;}R}ZTjUcE>@ng9efFo7~-py#izr4xK8w*o3pe^K25 zyW`du{X1ZHbbV3V0qcVrLIw<4-U~EnENoH|pGA|1YBMcb?0k>Yz^AzvSXr5PC=!1$ z&%7;*4tzBEVEM;s^e%mh;YaMVMU?=3_yX5{5a9P;&}z@Z5J@1GdcDI?u9e5tup_B2 zH-U<|Et1nl0B4R3$i-@SU`m>Z6FjF{X|&Ku1l*!3o)*cXwrsCaE_5RgXSi>(a*8M+qc7= zkKa3jrp~ie*A%$^n{48f0BYYwUE;rEoFRlG!u4aqc@Ut4E^1iWYD~oz!}8gc85-}f zK7-lh%*5fI;ZmZgln8$**B0w^_u+TT-OV=D^BDJ&@&`dl8~i1G|FoLP0{ZGXD9}3w zij3zXzgvt2eGAvmsL0O&8V*Hz$a&ehYvx~}D4SXo??yb3M?IZ}KfD_;`)Mk>BR6(^ zE|vTUl{{*(*4W_yC3WFU#`M+X?$#mHHQfqpAF{$8U2+{q%~ z5Psq0B1HQYu3ys&hXH!W|AJXM!d>JtbYcAO3I98|e$M-U08Q*d)Li48h4BxE6P`?X zk{{0j&{Ha&rynm4ZbltXsE@;SIicnO^q5v;FTh*Mcxi;!e-Trt+t3G~0u@hA?X?Ky zwr-0^7>Zp)!q8~wW#u(*laINPMe^dL^L)oUMy1bd!@c`)z*{{S#_%*Re7(8GsyFED z(;FI{t_P?M4)u%I{fkEX;6($Y5E+h7LwRHlWr6pz4dhVq=({+ti|PeA?^=r)!hFL< z@w>h4gS{&;9`p^)dxZ(t8%D6r{@=tqa{Q6!_XDTU==R&p(k1rM>?W$5>KqwxB1I`L z9wxsx8lxThB2#?Ip+NzUUb6DYaXC01z6dq@&|K&sSZp&4A0RN0QlA`C#tl{r-b%vQ zxFy8CWr=qttfdrOwi4DxT>soT)x0fn0D9JYGggcQTdK|zkOQFri}WkJScvJ4DfiI? zD8O1mI|tU{oRm7$VzErmSvq85xX((XUh^7`^>(;^ObdH8K%MRcCXfg?9U12f9Y$PjVamc_dWu?;V^|G+j?1vmLN7l@FHeQ*XY}$@0HxiD@c=<~I8A!w z;27u?7&ba81fS>`3QY_??~49=!{aSdzjD!6W|js6on6H!@m8tcD*XWjv%)Ox6&-U* zffNOfuZ}w`QO_Zz!tx?ps|9BQKEPdq|FCaCyhZL;jh>p+Mb+Vy28!>0gYfmK(XZiB zNg234dKM?aSG2j4^M5piBXOIhW40)hYz0c%A=V#L&4pKBDN{bc)9dQ~;Ukf1Fczaq z?4q=rl$Jx5jMUE;p%C;2N#id-6H?Ql3AV1HJZL(Sc|Kui#TG;B&MCvT2PzWfQOiAX zAEm@0 zCT&~eJ?JEcmNRYC2B0y`ZZ*ks;!SdnYV2~u7>+?C`akJ|_72GiPg_DtqUaGc- zFwC`H6Ur?kZ=#z~~tJf&_F= z6ZFy8k={oD^Crgpk}yAq>(_+&5kQ|4rZ zORUM4g`&24a<+5+2~*^{k~~1ArG627TzVmAgUdYnD*g!Y?Iogqr?f9S`Tt|@P2i)f zuK(d@LZX0RqN1X88I)BKgMtz^6G&hN6Nqf$f=?#Ngc(U@##taB+9;r;X=2A}$dXaRJ_Q&OK-5dG5?4X@C8_@8|#io#c6*`@Q$veZS}4 zb9cG+JzG3#r@Ow5gpKYGSy2}~u5i>>t3SXxqLu&2>awp_uzu`LQ9mYg{a7XSW0lm8 zRZ>4zN&Q$Q^<$OPk5y7XUW>I9kNOgYJF5Bt&A^6^c8Sz#M^XjBy~EbC2H5;VOx8yS zK+}_ln_l)AI}XA&aP(AmrGVx&MH@))^3Ev)TGXu_h8%f9DdjTod4M8Ww833J17cDH zz3~iZ=WoK&W%QqMoOyKV643pR7~UoUK_Og6cf*d&f$=|3lGiBbuk< zG_9aoOqH^v{-Y8+vZlI~9rMA?57ZH6T}yU;4eyO)2luUv9Z3xB#;i9KO^9d$aT*_} zCXQ4q!RW54Y_5I%QM~3f$g(%w^)FKG{SHUAhhnkMk-NR*mMh%i0b|~Nn9T)X@*HE_7JERNLK(E2HDn` zM_o+X`xRa;Y>2s_`59cac2~5zu;G&Y;s)=?;`(+xK#x80wNDg5vwhu@*$=*%T?p@& zvkPCrA>Rho65WQ|${NT2<2+p5exl>1$0&SP6j1n%rSKgM?-{f{c{r&4cp^mlD%u>= z;o7|W4A+n@x8o@S9cQfWa=7!p$-eOkZ0x`*R~t6K-zcvxQeKs^SEneiex|&-e=T}& zFTC@~E8OoaJY6T__1na{S%wtKX&u?#}-$7;&yzqW3a1n zA+ANOZ7t3&`eaAHu`h#eaklG|A}ZPqMYxPrd!#F`%auI`dbKBa3|_t4QF6qa?r&dl z_xox`|Dv&Px*T1_+3xL-V4EB?%qjZ1WYmsgnDqSC_3d69U}fL^x;yWc?CYL@*daaW zxc}+SzI&&;VzUw~P=Eeb7+0}m&xQp#u8NG3?7Kff&-)iU?jZdgnZ=G^U%X)Cnc5YY zaao1+{dWY5psKBagmRIn!ts^os)XwIC?(X+Gt~Tl4bA`Iy_yngHK^V@3F;flLBvD& z%hq6ptX@MEa`76fkQabc9q+xl7Z2fIIDv(5>F4kp&hG2#)8AD;r|*srtJ2M1@jg8$ zZaKx1PV$t)5M&U9`B=PSw>}2Lhocvi<9*h}4dV;TX)e|I5{kKq8xJq1sjU((d14;5 z>LO|69$G8BWFzzx`xBX=n)ocwT0u^C{RJp_^7OUpjOaoO;$G>Bx!bNGcEr_TqyEk^;XxzrG`58uni^1G~zM3 z{JwZi7tSaP>Wha~LsEQRX3*7Lcm%9rHLi=TZg;HSc2ohlhp416kb{@R)w&yJl%gkf z=-JjaL)RJV=c?H3Zd77|-Iu9P-rpm~7T50-`CO|f8Y>Q<taqgLL^7ZobT$(Kj|3SBCUSG41P>y)!Ty zo;_H08}5$pHjJIQV;pYdY#XnJh$DFWUU{)hw#~*C|QLzOdL)dCPo%CTmTcc89ZToa>v7(2JV@gON(vacDyx? z5~_3BK7Ib-Zn(tgcyU}@?CaVF#ap?5615&Bb=YQ{3GYKlszni~{(K5Fvu~@#$VNpr zoXD{B3?i~)Ky@FI;rMmq1EBgF8tfRj@!qkZ{)Tx2jfa+y{X;)SF<%2a@STNf%(06_ z8d7lMV+l(i?wHtd8w9uWezib2Kn38BKc}%jyuYVb?j}&ZH5P|5J5JlUQTzuF-m6v%hKc|M#w*azm+v_w^={+-B4M42dS2pB6{K{Bb zc|NmGQh$x-tTs?_{=wDwz#`m3^T!(%r@PiwabC5n@v)I25)ek&9j%zVYu~(dlB;3u zNZLV_Uq<);qCClpXI!gSy|B?(G0K&<<^|jV9Xl4fr8O^1pv~D&?0d$Q_s><^p;A0^ zz8Y^sz_adDYS(33Fd*lV)Ro_(XqEbb6E7v+FT4XZ2ss5*cMql1`Cz_bY(n+JXw=dC z+Frai{$YK6Ge!KKx`A26)L^EF<6EbyIL@=g5e8qhK7g$-Z9$>o@{6v``;LYV@x|3<&I5Ii%k9*))+5SS4K z^a9tuCyR%?3FRH_Y{@=o%~Na%Iv+%f)bX;d*#{LqwH~#%;3=}FMhX!jpK`l!D;+6& zYJ+QaYo;sj$=F|6lAarqfp#V}p5v&00(-e`{ZNWArI_6>jMZ^Y$iJ!>YF3 zuKGt`QD+ray$)d2D;wPnt6nD6Zdb$PHdNGs;&oKCx*I0H3{&`5@T!o4ytde*odG`1 z_d`bZF-49DP7B`SE>+H3CX}UZea(C4Gkt@pl zS6riBfuj7{Hh1Hy*YGx!SNX^l-hZ-A9l65OS1vqqmCyH|tW!s>@br}nk6h*R{U__x zkt;lX<-#LZ`Re`?R~?a{8M*Wj= zd^<`;p4fP{V^rJf_CDWk=kb%fVbG7R`fK;7vNL~=fnbq3K(lAPIzY2^Uu*1*0usuP zw*=R38?_sX&z=^DC>u`hNUyJ_AqXr)(WFxMHJoHXzO zXuZic-jRMq9dS#p$MGl(s;Y|`uHZdN7-q{JB|7U_SiiYrzpqsHd@ytx>-9Zb1AV7Z z=iyk6UB@4ihJU??x6U7!PpD;FMLhN1;F z<9j@+!RDqCpg;ZZ)Y)7P?VsM?`1<^R)!&ruvGg~kd;Zh@#@v&-zrm~JZ2gV7$I{=- zQBs)E+y68B8%(|b|MWLyd;Yuq4VA5*`kVjj`N+>I^yI$M8JG`m;*&4j(F`Qo`8So|~N&UMWbz$0QQ?O|l=xQ=Z3zd&=2WjsUys@b* ztRKHUNZ$TsChr3)tl!n)BJW8mRa3(M6O{jdg-^$y-evzs47d1ii2o-JPx61u3FQA` z^8Y+|XDa^}DgPIu|C#Lnwx>1!E&c5VYH^=;)kCBCmAigl_Svo3ql)lpfkeFpR8(yn zF03MgAfR-QfJ#au4FVF}FlK-bw>*6tk|LotHuS}2Yn!U+f&Vvsf&zDaui(7&pBzHOsH{ zQ}@X2)0SR#g`GsclqT;$`n-x|i&qgrKMPALkdN+>_d%71jwMlwinip@fBXQFtBX3r z*&`@8gTr2eH+hXk^G>`7>FnK>DobfEFWRN5!#zg@f8PFD4b}%PgT3p6XzjF*UFWE< zoHq}u=)8YnM7S?~M16W|V#!(4bLR13*Z2bQw$ockN~}?>2|qmMtz9$<`X8eh+K{+8zNwhZ4MO8rC+%Al?;m_P=N60alHp<}Fvs+k@k;2oP5+~c%fw#o=$@ls}AnyFMjQm zQXm0$O(*|K{Y#V?@*Sbwbuews!6#kgDfCHKG5hYdGHL>>jOtO%lK3}JP-|}O`7CME zRNnRW8K{*)DEu;6(BxkpE;5L??OSpQ@zpee$$PZ4a(GA4B?oX8JvoPTmf!yD#NZ*aD? zGYJ&}ANTy{V&*8h!>Paig=aZ-y{mZmr)7W#c}&K*OX&SkEuQ=b;p2+Gk8jG}*j5mp znnZO@f6S0kB(yt^xte4~8o%sStuQ5@{TO=&wUZ)S%9-_^J;l-g}ECdw=G|yynBDCPl+8G+w>$SV#_l zaK*(lp@Rl@h5xDOoH;2!bx@)p{nD`9bn8#eQ216W`RGWi-K^+NjqV9O^y{SSxsj)^ zQ)1iKORC4uL>e-#b4nK6G!jXJ1uD}K4jHengxCSH;q^)h&dJIvELq4ka5~Y0wTiCh zb6bkro~V!%w=I|Fj7x-_7J9!hr^Inl)%!e$_$)%pM|8INZUbq1Lb)pBB3}M>eYV?S zgfWy9Wodfcn7axcxL5?nLA_8OMlI`*l_mo25^pEZE)vSR7X9Jl$DHCUZT?z5d$ zxS~SU+y1kUOTCr$$<5mU1@AGk)|CR6hta&?rS*_fqRAF%^XZ_7RO?L89)84&USa^aMwA_BC8CZOD#2|!w zkaxQ}=xEbY?@qB`_cQ6(^l?Rd_CR4mUg%*dE2p?PDBsz(zxexBBmAr1)`O&ZX-D37 zt1PrsQkBD{Dy?T-75DUwsjw9kNW_Q0;kmu;bQ6$C!g}g zPDtp-$;|58!<2yG3azn2#W5>b_ToNY3=M}__GTknl8~`h*QU%F#P92=E^uwF!Lj#( z&nFRgWp}@uZWF|WAT$b`8Vn%DjFz6p3>YUQuTHt|eD4Qr(n$GKYSaY%QwC>{A?KBM z5BX)7g1I{3lqJJ#r00=>Tb_GYgVSHvL1urzOA%6tHjSpe2~rl5oG}$+72@| z{fYlD8~F^s<=9#8=J>x_7uK2n!$1q!x^hz{G15L7W6v3VK1LCS8{~*nd{I2W{YT6= z=lSG=i3IOg8&4Mnh~ky%k~!Pt=}^^JW?6a0sn<)jl*;4p+flzdPadVkssGlwX*$&@ zg*o5Qg!w)QyAkx!D3Tb$oplL6F0YHG7=2zKnzr5~JyZP^oU~4ozO#W-^6;Otrg7-~>%hcLsdjzoE_DiGOLDo@ zKYmIDUhyTmRJ6Y<2&8TX8PY3)?w)=Oxj^R2kt)XLmUwK4V1C_MW_=P*CTtnV!`#og{wri-ieRm2cAZ#><84n%MTN+hjGFJbPfLv!6(8P z(89!W7an^H#D}yoUG#=fYEC_zt_IDj4+^ipy!ue$QV{5BZVwOqZa6Zmi2^-{#`h)R*z3 z4|tlK6ASu*>DnnPQhTk#?9$XMF|Vmb`{!-v%zydhiR=F)@fPd2wr|*ZEdNkshiux1 z6n~06@}cOS6*cn2NgQnbIX_m2zT0Ns{xyY(@#3H{8t?gWLj8V<)@RZq?n+}mRSVrd;di_=>@Y5DG5>S6U7j(R+}>htRaI%B*VOL%Uv%~D zk2kejWBz>gL%L8ix^b$p9or#wE&)lGvc}oc)c~hyqJ>B)v^tACX{)}=Vf1PK@`X$C z4203Sq^SsZ@e>hewz5M%MiW8OQzgRjHAU!wXo#-q5m&W~zWA<`X7Te)_1&2dtOpTf z!fN7-QU7Fre!>wRRk&F2d6SQEAGm$BH}|L@;K!|;M(>r+58Ww|O(yCXFBFE+aoqb; zibq#n1k%Z5U22E1t!K#%8tammf7A^8pd+6@oplT%OH#pa`G+K%kEj_vqVKot?t7m_uhorU>UvS7iC% zm0DI>0KC^s#d2y{Hi3&I3uer)DZFZ_^U-C%P|k>tUFb7H=ah)-L_(b8)N$3$=U436 z!Bp#A6Kd_tG^VYRkWJFNBRwgHp;T_7Un(?M^geBZ#E+JpZte6;+p8@x3c?5n2jivw z+tKPTt|8z%)6TyT1)cI_c?Er^8V%-+$Tz*R5rW{OqD)hmWNBWaPzvNRjHZw3p@9Y(CP*Sqd+Gkkxh!KR&Ym}&p?W$(=2-8dEN=Xl! zoarf`cAQP0{LLWp=y3i=)PnmE;a9jBh3_OLF(VlhM(QzgsDjfjIRmvcmIgIk82VfZ z*b>p})Rq5nhD^6I6B3LRb#WNat>C-rZVw`MGO5FE2gZN)Q+?pB)UJ(N3qQ#mD>2_* z{`aXL))iUJb&uO)sUBhx(3a-q+dPzxyo%n3?u+PtRB8gJ;H?|3396>IO-QxmqnDF% zw=e66T`50^W=PD`ivL7(qYKtSNLJ?7oUcBrH+>IACOa8u(4^X-(pT>ZVlUpn8u~3@ zsA3X0tfg|jRvx+5%=cGZCuWguu-g2h!&at3bgl@89nUm7`sR|qaWwVZWC5jY#gb#(nGOvPsyKrWDN5r z{OXF;4OJ!>M@Xoy1b7kn3Yog z$JK%}jt3(;5m1GMrTL$%%DV@q<$ngc-@Vc?G;>4n2Mj znVV)Ey#1%hTA^kN_iilj=rFi>^DRKUMd#G*UKz1|F==~I|4bfIpojP82jSXYFK2!C z8SNyw@ll!m@sWh6;}>P&uJSD^T9>*>P}U)%wInF+?6-2RcZ6sDycGAZ;scPS_H$(O z5EHK-o3|QmKV5D5|MNx8P_+6i)}JXZIt}C9UlO@L?IcampYQpC>T-f*>tDc`&Gne9 z(AOk&y@y}A%uyKk9n`v`{fsm#yP39L_LptYU88VpfJDX|83AKHp6)Xi}orB{|{gq?`+ zgxcQh3VhZkHjX_56PrvWyEEm zlCE=&X7-e$qCTg(^1btj;UJVpm)lK)1??S0^f2%mL&$^1G`ok1o56_x*d#9ladk-d z@S>GG$F!%x<LPE7&cO4o?<=$C#1rE05WJm*=OzjWL%*7$D-J(XWrUcYsX9XF zyenj7e+NzIclTojTHsCA2~k5h>;_79&QBw~&$|*o2t`$3hCg7D7bR=gJ>W?yPc^k zFxvo|3Gu`gj_iUQ*eL`2?JxNRJC5SzS||>~9sF6ZF@g%DNXH25uMbk?DkK&c<;# zdWoAVQoI?;9xo*De(ot1%;ET4yiV&RFs!0oQwaZKxXm`0yq1J3j#bB9i`sc0&t+341045zYt?orxwhvrLRpm!V9IK^Ku%L9IJrd+e(f)*%FcS=K$+g_uXD$sDy4>JG%6 z0a=QJ+^;Ap;2;c-$o^w_9Va{cxNJx+nM^lY%agjIpp5oQg@TUNM7M_P`s6r02~Mal zG8|3RrPd`raRA==5~z{C_gbejwjvdHJGDZSIRhcC<0PvKzi)ui@)W6XR-DDxSq&mJ zm8z(QmvVQ1G2KlRASyg^#cgA}GDa^{2*B>pC(_HceG8;3nCtgfE9ZT=xtK4boAaLG zWz3Vc(zP#0W5PH)zHRpwjF}}jNKg~%C}jQq(jcLyyGbN2NkOrq)GIory&o?Up&Q4~ zArU-e@6wC!W8d*~dDmIERah;7=gdD$bG7sAVA_e?AF zML4@nG-meCzeQ-}vhF>Ea)bnzLEdvwM~k5E0~g|XMQy?dvjznozhlO{yl*48^U#Jv zgPDrrb$G8*fekz*0BUl7gwmy|;D%zp$+B zFDUBT=^0nWV|jfM7Acaa@?fUp3Jz*7y`SH1LxTBoKL2Ux&Jj3zD_{F+Bl4C{heFDw zZ%XOsqp3iH-d3))k*e3@l1{QK<=|}XEEc{^#n=aQPm>Bhi%{!ba-z*$0x&DqhJ|$#{HCRl?I%oY1oH@107U$V0y)sRB5jHqu^<*d6V{ZI^HnPS6)@2E$U)S zRPn6I=HCD%tIGCMqo;YO(3psj`VqSDpOJnJPdU9~!gBV~`d;}7zFI9^Ew3ild#lB( zTPL8}P(VwNXjhMteB)dAAeFBmqPwRN8=)b5h4-~v zkP}TY*`kQ5>|L|GWqE}MC)~`RBFr_26@IcR*g>9LVL$!@U!<;=F7_SY_1Y6_?P5^j zgIU^Bfjy#kJ69r*GmT#x$uLj`+l`O3=Ej*tl^HN99ftD$a-BEkNs zG`2T?#}#t(9xNN+DzNRv{;3zFtl{}^nw^w5rmQg|@T$1AVsA%E_#gO7)agsgir%6M zUH0zXVY~dONRy7LaTeW?8YmFL7ZZQ#bC>)>O0tOVcrS?orDPHk6}6r4%FFTp2b=Bkb%Mk`S54TJbXW zwrLfejI{(&8P9=x$LB=ZUJ!u)q-ndkv#=m8m&~-Z_c^yV)q;LQ9b5b6C$Tci$le1vOJV7f`9mHSPO~u+rJf%?9+zTc} z|NK}daqw8CSU77qFz5g;pUc91%QfXgdcv>3%aApT(u(#ODm?RJ*+Z5$KE<3{Pm@I% z9O>wF>`h|rFfUnsne-)2R%5H8d(AbPq-m=z2`DZHpMI}>kzKl0kY;Lyd1s^5G2P+w zby}MO_w3o3;@d=HyWZ&xl;_+vOA<#)oR`7FyXVweyXOA&GVJMj{beC@)bw9s*hn5# zu4=EIeO(QeW3K&=jk0$A8ws<+EEN&tzmh65p(L_OZZJwjJ3aDM$tR&F$rTl$j2?54IbDtEPDNS+8>sL|W|Z(>TP8;AlM3mqeoOr;I9vPey~MmkO7$}W z4hjRd(oY-uFw&$Rj@K7*74P;?85>{y=sfjqI%ktbqAvcGwGm`U*^BUA9dr6}oP3*S z*x@(-v)XI>wtYXC){(G-;Dz32m3k4yI0Jr*nKVA$7g4Dc?XO3CY$rQbBQ-5J6b20D z6j^-B6q)GB^eZr5hGrp27Rh?D10%E=KeVHMbbse}Ra8*uV`%7oWKVuuDwzh4bID9!scr1vMiMH!b+8GFQ-$j;C3S4(e3a9<{Q;(%=P zYX9&AAAj*T=V?@%c)b3N`(B{5?K`mf&s3462d}r4qM&;b3bC$Y+sM4KWMuxJQNFdN z65@qEA1-IveSO`E2bqIzw9JLC+8&wc`N=)C;*uz|%hJSIk96bG68dd56Y}M-g1Utu zn{0z1l}>l3|E)+wEDhBpPL$u}cUk?2v%JVZMDpDftVXx91UUU1vlAC#Xr1};geU$? z(PsCExKsR@+B+rGdUGc7!tv{^(?LC8@)w34N^5CRRB=hJC=E$aEScpyKG`t4hr*Id zKij^aD#`x=734FkCulVc#am_XGWCUU*qP6Hk?LhD4@zv}#OW%do~pAYk^4I@5s(^- zh=-w@K_z(R9M10?b{itUIXo)`MNs@O8U1L3hhvhZ&t97MS>GRrMG?5%=aGd?M$%Wm zu5yni8+v(F(3f&o{Z-lGZzTQy`Mr!CPJR#`@w*lh2`Z)34Wfm}MaR+Lvq)2i`lU?p zit7=ReW#|DGXhl~rwe-YS!WCsNaeYL$M0>D(><^yHR~nVd{gmZ|AoyAUV@JEf1g9= zU*tW}X5-NPB~!0y63NLF&@JM--iBF4S?>P7k9GXgNP zuP=)4kpgEB^@z-lZw!6-gU7M>?-W#@%bvU+Q5qjQEH^#}Y#d)r0v(gex&%Dl8SFF--v2+x3+i40l9|DeofQ6&>6J>nN>A_!;n~l zep^vs0pG`F_c1fuu*hi77PFMBkGxfazCy2?n5s2&vU&^ObHvGfFu-%P?@hGK?SNfS z3D62MS;?{oe&6^llz?AV$|_s)Cmb_KU9-Q}~mgWn#nk2jSy1SwS_5hYgv} zi$3QL=|&y($PNvb5pWcdkwkNaQjFO@$Dh7eOxG{+YJ)PF!7KLfz2Ojuu)3N5Q{`E$ zKej1Fhk^26Vi=hLlY_9P-VAA`=euUoNBQ?_sOI;~+33QUo~SVo5>$!z zITeGt`^fsm2!DIdk=Nzf=SSh6P-n@|xv>2v$e_9iw;dT*lm0bKxgN4-zu!ixPSKHU zpyH@9HC5rNmFN5L;)43i#*cjEA|c9UUFVT?MnZpYFs?Wa(bK&0O5WK$sfx;Xu}$eF zC0u4+a1$8AZqCmND$5Pe4ho`=zWN*t)4#}44wM%TSyMLr>}AWvF4E>Y)p9pXnoFO| z_$}XrkNhEX_hrd@1X>mml9poJW9nM|<=m39Oc((hX!CPXTCdw75~|L)3RkC`^WS{+ z(xj&QuL{*PiRkD<3W{=%&bRTGZBECY_CmV7R)IoWu=^GRg(Vw)u~8n=HLPI;+f!NH z%5Ld#HIC!w3bSG}?=sM8>9T}tCw)O>6TeTDp1x8a^ql0sS*%Q z5&F#VM#ITSVo1}-xt~u1AKK!-RxJO~_JG>LQbZz7DlU|Gz(eFoM4|6@b8@=9o1^$W z6nTX!V)Gt2g-_j1H0zqt!4mj(D1Syjox<{qLXCOLo`H0*h%Dig!i9%ue$7<6kF696 z)(*u9T3fic94v*iHq=%su~MVZd;UZU*7}L&A_zf#!z00%CDtd3M~Mo07)q8xJK#)^&JP^<(VjAVNj*z}VGC`!b5zZLvrRpx6Ykz7; zHcB!Wx_&L54CTg*Z6a<^RckKapqw}D;ZW!r!Vj}D1Q)+XK8G0HAh{r>n+S2#;Xi~r z1~ULhV=B5tQIbEPayR1PP_k?BSZE*0cmU3iF&TifL3lP1Vi-&YRQU8t1Ld@e=s_)a z!=Y#1;t=>Yq7=2W3jd+D|UPlb00;8dzv*u_h{7m>v{X+6PH1x)w9-?@5C5YKN^QMGsp9%NE zlTpS!aMKfSNr=lPf&mry9a`n>1%GwKPpUzz_wn8 zYG*=vwhsG?-rU8F4y!9Wtsw5JBO=R3{cqoM4RdS3pYWBbsKGlD7i+RF&u`9Hyq2!u zPZYg@TUs9{pOzx@?M}BVXI2wU+m5d+fgcw+Wq~|}D{6o{bDFw~dr&powBZqRZ>#FV zJmeC0L?l$_dp$}^^B4c~a8ebPATlPLrtz*sBnf)ZrE}-*#wp9q4|!}07(-u(IlH8B z_j>e~y4J+*W~3hhB8%xqRwd%kW1)wt^J5yKaUv!oozxsYQg-42j{+!qdk8 zdEiWa9ls8r4%-b%fpvCaJt~&u51Y3wrgO`cg1djKZf~6ObHw_qm$Vl~_{3PY#j4Ir z6B%<)H}Nfh7sRNWwec9Wjhp5sZTpMdO-*bz_=`$Tw5A^vHRQI}kCXYA z|Gf~qc>KNOBp!5W zM{~$_5>vuy^abWR%mIfv-jw*Ctb!7yrn$r}TJq`M1X-%t{FPmdoFJ>`jlXBIQUn%_OJMyDLZg z5sB!|&|UuNiCD|F6vk6Im@moFVqoB~)fMAmu=4|KQGeU*oTeWImJF-QHEY3IuRP(^ zt$#YRkZm>4VpVU!>EiuyD!%11V4ccD1NE5UX3{dzqj05o!MVyZoE@}&+{uWGPS(Y161 z2APtepS0U7!2_kI`#jW3RD^jJM?D1mcCKPwW}A!f+PYMQp{!SaH!6yOA35h0)u4y5 zkl~wam&MX0Xuw?H_21@2*XjwIR~Ptqb3CSJ%}o)X&(DX^{dWU?e@)vo8E#&b=9ZZL zYW6<*b@iiq9xCe}ur<2%Hb;w9mdw8O*K`*+^m zlk4$kVCslUbn{XUrrLYe4n3v5t=dq%uxNTjbSJ+1bWgd;G*toGeAG02rE=l<~wi~n;S!ACB?Om%YT>T$$j%4wb!z& zLIo}9l5oEE#%UZrGDRi{ZrbcY^s0M1`G4g?i2JwaX3iUOR$aj_JOileeN_aTd_^;b z`#)szn4e|omXEIQ2Krv@I{n0qPqpuVRFC&uE-n3Ox@9senLQ$Y>Yukbi1FGbD!oMJ z?7CI&=BUpxDc9@+|NJxj^M?K6dggJmM{={EH;6{}dPb&we^0wT)1C06VYzvtyN|x# z1BjQe;gRtpNUOjCk9kP{a&C|`I_MUCj@-SPMwG%ep#MK%9*xLjq7xX>Yn2ssC)`$F zhok47Zh!hZ|VrVw^qeVxbyY(cXk=?$AO}t>fOo)nG9>DVf*_wW0zlX zd_p9gw@P}%GH{~<23uCrS12;Z95rH(&kAaqz)|Jn--{tWPVywS6 zCccXs!7nV5BUB&jv4Hg27m83DSOmXZDdRD)oBWo$N8rUP|_(| zSlN_svaQcnlgP&(io72<<78v3Dn7TTX{d8Y&^gO?Ox)DY_4m6_SvLNkBg>u!v=%6p zalN2T>aqK!b+%gNnqCOl8m zz8^+jY+xSuqH)`gWzsB-c_Dcs>>ZOUOB&f5W8FeFJpQWN$PJ^^iT*9k{ghOapM$xtXkA#^k zA^1UT&5mtn$9eVdR~O9q{?nl#e4T;mXo-z&d*5BBXZ4Wco@xhqx6|V)Qqo%G^u&p* z{n&kH8{_2K6^@;6=ncpA*?Zc`A3A%i?>+vmw9RcLnE5c!Lhr-cqTq7yls#LLqh7Nq zK?CVaizJRSvDkaKJ!X`D8mlPh7FD|ClMKc~Svtl+Kkq_GZuI641?G|RRdRY-}0~YJC`<*u=K=-@j-JYY0)pw=rH_HY;%-WZ~ zh!1-ei;w$jJ+Z>gIGHO7C9>V=8-1TTm5Gp>bUrDGI_m>~mrDwVLk-3p-?uoeXSqXz;m7lwLbn z6YSMRX?BoXjX#=G*U|GR&`HKnzG+PPjeGxx_fgeGcZ-%SZ)kMr@8Y_ro6HU>57$3J zV~HHezFL{sNiN>n6(Tv}bD#X;47HlNSIA_=yr=KFxDcH8YUP8+v-3Hf8O<~=!Y5iv zd$*k5e#o(R(iECCerJuM;lC7Ab`$*eu4i`T-Y7eLNrIK-Kh18?%kpj5pfVROVfeXX zQkfq=?R>v2qm?DC8fZ{zZcA&d8g2AwhG9AAoxj&IW)wMZ)d-qM)|xLx=lu#cj=Q}7 zI&_c!?`@-4#;u^Zp}=1OLx$0hRoaUThv`*;fBF9+g{+zxCjQnGLlO&bCNAY<)#6HG zrmD#n`Q3*0_zn3p1or4X7fwli!W)xM8NmHdh!Uw3 zZ=;$`DY0nYzmt;%HW@m4Oo=oOJh-f)J{%U^7W>6xaIk%3)9lh`YdR)#mvTr*iS)$# zduYV>H`RU0yDspz1vK!>au-Empr|66d69~~849(AK-vSh1;fM_y8iiGH=S2bPt~+4 zt)d^f1yL>>3Oih83L$Uy45`+2u;zzhN_8%MmXMTgfj$h^Ys^PORKvk#b}>P2|0QlT z`ui3{=?uEd6&C7f`dI=ki1f@rXZaG;SRq5!R}qzA(3<6-d0zr}H&*yf73!DWW^>c0 z)mT8f14HeF)Kk4Em0hL!(`8m?T5%3i$Efq5S`U7JU5Ku;iW&9 zG+$Ue8Itcc;KwNgP2YvGkyxbSx-@D!Z?I^D!_Ea3f-!nhC~)F-hl-}a6c@q!ypUEIX#UZlGmfyk-b>soU@IW*Wg)#&X}q?vJsGcE zq-uS}qm0^byarYF-5Io_QAXq#gEdI>a!@;E5NF9{>BrR?te0E6Ri5c?9;7nKfZio; z|Fnh*gtO!rUUH0&En=$urHT+z4Wc8Gdq^19FRdL7DOnEM@e12+2>g9=T61BlW_V|{ zRC(<7i$}x+(sT(`bGTb%{BS-0zp6GKH`}ke`01?nzre)*J>0g(0FP#8Js&)vqw&!E zK6vdSPoV5-u;>sF%FX=WaqBAdfuG6h^dDf2xoB8ywor!7Q*eWkA$?t04WvNXH{-{R z(NTwlM^32Cr8)2#)LL4R6RM}WE-aOLK?~UBxy!iIi@DtFnAvtTt^I=#n{kFmm17|J zpJ6he?w}JWL_TJ)HG~fvA;$2!D(x>xN$%L?zTp2UX;+qwLGR_F5K{62>PEcATz6Nz z98_&Bt>3`2{i50e8;EuTV&-62G>Qmozh-*PrB4uJew+FyXc%fIeMJ`rA-{vxEh6kt zFSiA68Adj3QkR1?Hidi73m1Zv8sOTu!jQ`2C;zLM5c2l=<&}7tBoM0+U-pE?@`^D4Je8aj;g0My&W}tKSa;tsv-F0(TNORY`EUIzUK zbni@~A-8fN^(?&oC4e-yPuwP$bJV)KSSax-3cR#<%DNq(P>U8D4FbGu+oGXaIEDjQ zY*~+Dn|`HzuCIKJTsXYa2{J-*#x7#nrW2F8u6iVBqVMN z`sR*fcAke=`yB7d+Npoqau9|II~#}NkE1Z}un20lyJ%Lcgc=u81U|zy2a81#JG3WV)^kj6ShRJuJIfM6+f z3n~RkK5P8Ho51z{y0BZy#eIN)8$Y@YHP_&!bdh84#6R;uQjBn%A*Z|YNTRIDWRfYML9))qiHkfC2jzp#D zLe8eC06v5r5mQbGQx!@GmmFP+<&V#w@|fmAPFnlBB3!Ro3~%jrv4B`}Pv}_yb_e+M z_4_e3%6ed4t{rwkQ}Z>~pEiAgcDo!7w+<)&9|(23^yviMeA;@1?epb+T2T9S%>u#> z!@VsA1!4j!upjTXa#q&Ude=GR3?!PEh4b1Bd6N-H*-r)RqBD1&Bf7p~cTx2!lz7uA z&$dDh0M+$P(}vs{01!na*m=FJ>@x*P4~kBEF9ZQUbTJ*vy<`|UnLoIifef|IB>ul> zH>gJdpZ@#M0g%BMkT80FEqCUwb}57oyW7Dl7F=czqEW$$SUg}HF3*IJZey2fC#DUi zr3*FFz+f!l#Q#Gfg@K)ZX&0O5e(peWl{t2YHFQEN9ap`TmJnd_zGQ?kn_jBHm=)jb zD}~9M91O2MgS-&Zx zZa||mrf%SUXL8+uTwn-rn}@*Qx`Ee$xpf1q=6e}X`IpWlEJs9MtM25>vR*A3iN0%2h0_$YmY_GzM*y8Nl51G=hWUL`2=d z^eMlyHOc|#`koYw*=COdsEs`s2xP)XjX9H}wbs%GOqKph0s|EFutUP_MxTJF)pv_q7g;8Qz%Y%DJu#Tcqv> zgu9YXykPo#&Ndx6u6XNE-Xn_u5P*$l-Z$@Z*w?#a;NYwtAFB1=G4b?+H@`*VU1`>F zfgF9m0RVQg{4{*+4fuqQ0yWlyxxxQaiP?u^;Qd?8bG4dONFH8{dC7&h3zz=52Q zE zW@r#F1lk|~$U83PTyEPSGp^IdzX1BKy1JECn z1h6x~0qCRj0o31s0L+{sX`(+Blu}1`)CyBa)1PPnN5_C1_q7bGD@Gt^$Y3LY3Mldl z6)&Zzl{t(#7wHX5!)11ieB1&UIQl~f99=8|Ww)GnTZMeb0vGcj3d`ZFm)JS{3gmKfEmEbO$;lqRD`S4dNg%Ab&d6> zq3c($XzIIUps$M5NNVYRk=|=HSW}EQZ#5W&v+fx~A`*6%dooU4lX}hPY%P&~@+bi` z(h_!p3t*U--`VO@zYiTSXaJIu0VG{vkrW0XX`b4f@5rnp^CUhdc6kYtHFPt6{Sfd@ zNYhTO57_R=I1z&xQ48}ONykmcpU}fbV<5x81dG!&^RA5euz&;fIf|or(m*>(2c?*= zt|*hT6N2HO?cXt0cW#W}g?Nehx&t0!z7%w~@MB5DU8f>1Vmnaz;OxPcH1%-MA`kU2 zW+AAQoeOCm59UG|Y1nWfb+-ZWQgc{+?s;m6FJ$Mn>^M>gVa|mV&ISJP!L7KEoZgZC z9j5%-9_l13cOo%$2R0*ME<&H;7%S*1F5ub>AmMcw?zm_JxT`mHApfsd`bqBeI z;|7;<%Yz1&!jeo!d_mg021TXNM zW&PPk^MH6$&|EZ$EfU9=?<_#pi6=maN{_({Bp=2MF1pEBse(_##@-QJsZGq^}i2)Pb~bt8mI>hDINk~ww9;C_Be%$_W)n}>){ z@=Q9Dno#IohHcg!#CLJM9+=mO@JDPqFzF7;vE8vc=W$NgPk zE>v~?%_n#|WW$;ZRmKZmi&1rgGyhG34?!lu@&P$LnytW z&S!(^rHctO<-2!VjPn}xEtiin=-o5$s^UX{z1AEP20D2GtO9xsuAjjHuf5-Q2>^yF ztUI0;kSG8mXE_2~f13wZ7I=W@6Sj?OUdB;C9+=CZcYFXT4KSlM4p4*v>%E~^qs#!g zqX%mgD+FZ@3j?`61Zb*efGu|*d5g!uY6cq(8E}9K#`>`Wc%xWt0)TX24y=L%$N`Jb z02*I1AQ6QP`V$b_F%asz7=XfU14xNu?Xdtlj#vx&SRtVJ@qY#Z|1<)v61*51fEfcY z@u`4=ENrMUfIth@LNzu!pkdN$L0Fw3fOm%tk{G+{16JwWK=7+ThyJImgH4ei;2B`E zgJ2!bW0hF|(sejsuik7aAP>lv8u0W4YkLq|oiRX|6DvouCbe#ZJ-`DLsHIfQfp~@i zran-oUeMQ^n`iO7z>zc{0-SmPCZx0h5df8_Z=!&qRcyX0*bHd_eV=zbG|&M+TN>NC z$v&WU7TDVTFT-KLL;(OD7DlXcGq!&u08f?Yz69@Yh{1mb*CZ;`gm>nm;8p3LKpqhQ zV(wOJ0Mvb!21pV>R3zIZa;0PCx`0M91^ zYZRzGNjne{Q(@9s=m`^6lnW5uz?uROEPV~|%o(uCFhDY10I+9-bq{o%#2>4NUgS8GI34|S|h+ub7X=)9ivk@<`)&WFHFJXgs0cN|05fG&oj6VyV zF9e>vFg?D2$Um&sK6O809GeCJ)w^SC^(@Eq0WIu+_W;el<4p$~EMYBj1I(WmfT%TK z%oZEPHa15mV1)%INg(BCi~u9HvOU;<;{iPY;&=G~E^Ay-qA^?EitzKaR=K(xP{02PLU{l8fNXHZaiN50-@RWyDZ29tky~#-e z^#8T*5Rj_H#>zjw3OuI*_?M2sTBQN#|NdVGK4Z-|0`nE22UzjJR!Rz6O9VFUyH?-~ z1vp(mMUVlJm;-x=^a!?k?%3#otrKE^EgBYfpMhzYUc#<2u`$a7JX>s@Jb)zAx&)A7 z1U7I@fG&~^_!z?)#lp@2o76m(*NIJvA237jCRGYr2lk}9RcxDfu)%?_c5L`cLEt6I zSd|E7l1B)mQO0|ilWWAoP#^M>MNEmUPh2>sU_f~|qZ7e8_Qm^P=#yg7V) z`t#eKR0p5VaKsdFDGzA*>bOu0m5h;VTzG`7Pks3K)c@Dml}AJMzkh3C>}$4!v4_D7 zEhD?e&e&zmlCkfGB*a*gtdpIPo$Q4W3ek)qI~ioGHHs+IZ~A^u=d=92e{}D8&%O73 zp67L+^L{_)^?uHr_w(FF%YG@yLM1*Aa*~EB8Ydp}{4nY72yq;IjW_}`aCsbEWXR)T zL?ByHcOT<>JdSi2?v~;2@LU7ENqsO*dd)Sveg$wBtUr>W0q2*2^2HGyz`u~Dh@Lz@ za!@@J#NN}Lqgy<0-w`h|6xHB)7#u3_o{$qR2H#1d1;gD^{3kHf@orrt0$GYmhS*l& zZ5V#4_bYiEHSk25^~<^+88DCrgYx^_-Z;*yiSdIj}K${#zyR-!n`4NQDAC_U1u=c#4d77 z2=WIlCXd)fjhQEQQDQoYU1u@J#0WA>{G)24ALqjOh(Wy*v=}ksP87iudF>tnfPB6@ zON+52Mv&?U5O-n-H;^yx-7>1!!Z7SiEDuLLVS+v)y7V;*K=pbfB%l!Dt$sBKq6q;I?fM z+@h3Ir}4|k49#{+*hc8}vL3K{kF(B{pAGG4(QOEuto@`o#*XGX)11#s(5|H;`YUhxXju(twCpNqls(4*-F8EkWS<=n@v5N?)C!OpUCWam zWw*3J4~JT#t7M*ncH1q{Up=Kp3qRF>cDc;a!%Al8s`?7h#G(#qWVIibWmHP*OdFBx zH{7^l!IK{CyJe}5{=Udsu?weF_~6Yd5xmJmtFZYa0a#E*Gp0w^6?AuwpQYj;fMy~@ zC+AVb_1H)20W=DObvT>S-IWM}jqW~go2@z7ZuDL*V1!yH;1UAPQ=C#H4`a5y)qWtbW(WvF=K z53MLYw0PtEV{0TskXOUm1Ip0{+tqOne7#m+b`=l)(&8^xaAiFxU|}W1_@G%n3#%{X z;=^L&ld3@xxYLy$0~|Bu%6waN1KbH3c08d!Yypl@Z&pfInh22D$5@OG7 zF@Y&X*P1ufm=N6dRgI3FD@EbuPit zFI|1~!|c{u+XpHXlsnAlZc9O$aej?2c@rJ)t^y*3q2B)(dfP(r;j!tlNiX633Ab`LKz4|DEuamg5R^rGK#i3L?yF70 z5(nsnsZ0d=ZeTRkxWPkYut{$>c7{?w1MfKGW-Ybdrbx()A*Qc=Wiwc(>T=8mrN4N- zQF?B_gZA|3gn6E9aM`$WRJ=SOrw6^MI64EcU!sl}+7>w&9~Si>`xMi+4@y8BG%K)+7)3 zOQ7p6Q(bR0okp8GFz#~8satu^tDB{^sC_0)bu~%zwKFNsj*OOxkb*1;+wJ=Crp$Xj z8ns+!@=Soa6=>j9ZrO_x_ZzMDnNu3LW< zql4VAg678S$2nz+b-KPuj|%Id=4xE@AB3w?tv13<9$%c?lr)pXP*xi?$IdM+TW=5! zVJ07SrhRO_^bu$eVv;Lm^0v+ zk;lp)4xV92PbE)qeH8GTSB`QS-Oib3CuvAKvRN3#O>fq)tk$$C_pWj(9pjFM?yfqnHDrNRg z?s1DfWgV*Q61^^K=0{cP`e&M_8&~T%HE%+&E-%>^er2Au!bLexrNe)K7_Exyk(3>d z#p!aa0K9&mXSwYEP*jfzzww)PAc)~3y(Vm(qvoxc~-*DWolNkp4rp7 zdc1>>Fmn;NvDjcTX4N{-QOKnhwr8-ZgA1Q0{l{G)MwX~Ii=LVhz|u;dDr#!6Ht9TQ zQ!3^hW4&Z?kDjk4TiK+#T3PQR-uC5KoR(O^Aj1T;=#g=zyI)*luPaDxvz?v0$9wBJ zc*!sCnaw+xzEC#nm#G*pxu@r-((D40sBe6cXO6Y#8eywR&E5No14}uZc~Gd;Cy0(yg!@I6V9NR&VUPZ3zzQRp!!IHbp9MM*lxNODNHY$tTEXDMquY!g)lYo!< z)0EKXxMs7tUpFq%86j!2zaH(g&1)*jycL=H>Xq$!S-zZ7QP;L;=aH^M3#9Y`cD>DY^pf zSS~+#J>vYvYFvL=!!FWqUROL;(7AUeqx&aZ|(Q zY|EvJ{CFFo+_(A8c^>Ok6lgD@y^l_9bMx%5oWvCarPZ&bOz`~@SZjt3H??D?yMRS; zYPU-D=YGxe3v4Nr*{a6Iar`#vujdj6_*V_D)V85u2L<-@q)k_-)fCE9K&tVm>r2mV zYVWwSHZi(^+^Lg0{`yKIpK+jh#b#3*lfmZJ4)XiRR^^fvWtA4tdX-M12ZW#3s06t_ z$F*^pXM8{$*ixDl^3c%;&QELJuWD!zu}glR*3uM_Jx}4zJ5`(-4Ao?xGND7n)(+WN znRU0jNpWPGJ!bHPwA&c7aR+)8l83lUMY{#))|bdWNTe+*Uh+<6834)6y<;#kn9);n zm2OO`OXWLA;7%^HEpEmEdB5O_vegmmH0el*+uRrBpS68faI#(6d{T7nt67a(Zzs^C z5vzQBa*66nccGB5f5WX|{e{lNrnnBmv!=L9yFuK}xnL*lW9u(pkEjuVy)x5w*UzZ&kgxl*akC_3k4D;p>m z`==>-a@{$mvJ3K_70Ru;a`PC>AME`FhHEr<$95(EvjjbBGjej0uxHWD?lUv>L#H23 zMsvfGJQJnl@;W;!iWyO6M-TJP4^UPWGtgtUVx@iclEbFhyM`Jz*C`SM&XlmErO>S5 zf*k9TlS<&x`C;JfTemzG*Er4e;X$G|Gbb4n)pTXkbHn7YonGTcVBXSO1s4GfZXa6tGVf*c%V z{K6>7{wXgxk~O$QPDUn4O-9D~TmF}lgIlnVa}dJUCy=C7p7}m`1;qUNJ@wD{Wm7;m zR@A)4k7+8H$;tdu=;3)?>n6wty3=5T@P(#@pOG2bbv~{fGFWf{Z~_ydkO7oR)-Ana zRJNx6^>(6SS~YC;)2SO`jQTsB0NR}6wgN@GwQ|U!o2)6QWQDz@QhMSc5!1Hn&o&wYQJ^w%4oupQ^*Ava79I}m#m^z3Ubn1( zp4l;{wluX18;#Oyxx3*Xcqq>`tgUeEfEnxSx~0AdV?CN}Y6XfcZdWH82L%*tY!ITf zegZsiAD&bh#yYBxGpI)wNvV(FYMFEO@}mkw6P`ZVar_>clYW_*BRW3B|75H`;M9BX zbg-!IQ(HT~lb_)VT3{CTT73+w9&IQJ2-DDy+5`+bi|xev_3SHc&qlmBG5h4Wu`IVo z_HK}o-*8Sb=5a`)QmI&*|I8JM8elwpj%%}5J=|qU^cx&n~Hr^a60qBs$?3# z9u@gGa9Zb7YM*@e_lfy6#yhdcU&#xL3X4<+mQszsO+oNV&RGSiGE{`?e&pd-XBT<- zD%?`q^c+>J0g+7J@Ac2-sqSM_eEphCRioYyzPj%NRi%`cl*><1#!>Y=$Z>1Bw4laD zktiq-^g>x+_go$<{I=2z+2O|7k6XMeADuWiy%a!76bDN;{QRFD5@<3Q`~#%@fy=K# zE`_e)yOld0cSC*Ke)sr}^(_)>s09q9zFDzI9loezL2#Z=Bm&3D3K`q7M`h zI==*=%s&Bdp9*|oIk2SgXa)1uQxEY-*4ev?%6F_nUVLJmfi=TDDKC|TA=-+wd*4W( zq`78C9a$qxri;NDT3LG05bKI>S28{TE;3t6o&esc^8g`qFrv1ImVrwgc9X6sLNE}~ zMteiol$8KSEF1fKyF7pU4CPTLWe&*1q_t&!fIm(W*F>B*;qbg*zej$MM7XRY_d@$H z_e8C_x-MH*ic%`;7DX~3`t6Yrm!$-K*19bxtxMOk>`iS6m+_QW^&cIZS`?A5I5l8j#2gL~>urKXP3IEi*MuH8V9k6FZ}qAoe?-8a4!GQ0Yfl zO<{S~#6}jiJHX&hFNW>-UFqj{eYeRdWesk>eMVTg-AT0uxn9_HFIZhl+joK&?nj$q zq15P4224K1dZeCTv(|&r`^I=CyYszi z(stZdnb3VhpHfd1dhBKFi%Fbsw&PiIS)ugiE^q=Q)uT#fBKK;Ga&oUb-`8+oO9#;#kV3w_Bsf%}SkFoyt05Q`Co6lg!zICWA0L^&^pMZi zH7@bCPKAwAnrPlqES@0 zTJ#|{&EcPua^IO#(UUY8KBOl0N0VX+)6&uhU|KV zK#J4UEYF@lOC0_-$gzhyvzNWc!RfZ=CTeT@w-wQZ#DBgny>6@|JAbX7vVUZ6kguPE zmurZtmrM{c=*_6!u)ZP5NXd0c9cdXn#oyq6(QAJ0O{2#oA1x#KsQ4ej!?iSw;F|X_ zolT{x>~Z*oTjYilbnYNEfVdwsmF7ShfG5-989li8+NrHaWiHkw{%1Q^oxCoqMSFp2 zE|=6+QjwHMk;pDgs-)&wJ**h`v-bj+MY?}C>+2;t&s#o76~JI{YY@$zBp_|g#U$!I z-O4~YjVs7G?DY#!1&8Z7z?i45G`qoJ?mW)wEbRj(H}1Xk^7ZbV<3o5r$bF82_Af#k zN`i+Cp9#x)4lLT+)yEB4Ti$_|0>z)>q${Ztm8~qlS<#9wbBXntK`0 z8s3wk_!GfKu{<<$2Ac2UnP3=F2Y`Iz&3ep;x)>@>FI{b47bvM+vzpHKfr;J0(#~PE zV^-E!kDP*?^1rc|8EL9Bj5Ojtv6GY04^WU@AWik}V>kNO-Cql;jI-Z=)>vr;C2wgL zr+`p|k4&KN-_ib8WcM4bELxg_{Qt#y|JMF@ocEWu-EZyx7xn!e<9|g4e_{A?k^gy| z@Nd|Ev-V%Gl01I``A`$gM3~lI^6v^J4Sd3$}TnNw)_ChL(|Nn^(P7k0eIX|9(SKl4aSB z-E5lnuADZuL=I<$Go0a2q-;-|bcfB%nw zy~6&NzyH=eJwLg4F8lX7ot5@yWpnm7+Pc}@LTzdPZw_Z9!46Jv^A8fmH1PY#&~)V- zd!&yR#)eWL@j;?orJjeQX&;^DC}@=Wb^<6dN@MDeGaAaj0*^F9JO-+hBnjhwt2L&{ zB)!$_z-y6A@2x6Ft01QVy0V`_b<{`4$%OdmQZ&j+o5aJ^?W3I5uXllqlL$M6u~6Po zoA@!X|8V~M`NhX`<%q;~M8kx4=lTL29HafCqvIpx5}J*I$eW=ax;T#Mh!S9Z83p4A zdmiiCJM52B=o9KgIhUMWnRECVUsiE(b&B@GFbeL7!|u;cuk-4;CKn-zaKac|P2+@k zqAk-g2?>1oiSnNOmC}gBO~JO0ei@iruiU5RVc;i#+Pt2I(CdUeBrUMjCnvb~l@0v= z{qg?M*|Fw1-`@X??rtadf4$w+ng5&muJr$xfbEj+o-FlUq~7r%QGccUDqOAbu~*6~ z<@IZHl~C73)QA5g?Ay}@8VA0QQ6xqw!f+or2zx>5Cny-9`yl#+pdo9&y^RjjD1xEt zP7!ks>JSvCVHiXS0zd2n3v_URn&{>ra6v2*p#$tY@leep$^HGkM*TYyCqYOYig`@I zQ9^B(#I1zb6CZl$w)D0EGmD1fu+Ak%C#Rh5hY&mtozUCB$F@z;djfI8CLYLy-jO@v zuH%)E$ctN})+i?t%_z*XvqVp3ydLY57bNtK+~YeQ!dh{XIutr|8@Qs4b<5gVz|~>_ zBZ#$0;$^(9&h{CjE9!+VL1&;=FzEgrM3ynxs5kJ>!zJNA3W6UA9ZwPnV2_a;fel@n zOgTB1;K&EmCPX?Q-C{AB-3q>NHM39?``Devv}Ckq5t*9f6v(#jJ)C#(=nvk-1hjx7 z2OW_+%GBUjw1|@lkc63pi^C>6P^Dh*zFOyrP$B!PKXmkIKO)j+7-3EPR8y!0DlDOz@O9; z@U-*bzAmb^(Z1uLBtW6?O5)!|AU7YR>gDNW9lYt!KmWX%5Z8UBgfs+i6oiBu&lDLW zfw}?RGwi3BX#>zvMj9q!WV?Y+{>DtsJwIa@lOzqbaEfkI>N-nn@}4xCX$-DXNS~|h zed^Dv3+e?8b^|WJV#%!kMUkI+Kpn@(4>@1xR!m|vfO`!`5uU0yx}lj3r0ZI@fee#> zb~K}bOhfAoIj=CHexlB(Yv6jSpwvK}dOef&7sJrr7LxO?A36VDDA&lC`RpiYJ!$^` zs`a1IF*;qj{`*1g|J6&wuV4Rl&8{KyzaL}$*OcqOpK$&6i2q+*e0YC&e5EB1$@BPs z$J8tS-_s4b{(BK9*7-`FZ7Caser2=a@fcb@nC+Ll-1Sne) zer9-r|Cb~2v&{c&v#&D$_spL3|CfM6k)QL)KM4XiR`^2^85X4fZrd|VCnbL|GEE*)u25ZKLd}o{@>|U&ws#;^#7ND8wl$b3+qEA!DCD8!3+?; zad1N5x~<5l@RR!g^E?JwcmBgLi|7Bk3Aq6Hf43vo|1ScgDDaS21ZYPzPSS+BG0OHw zc{H%dLy~WpmX--wNf0B2)0kD|t&blP;a7u5Njb$CYnPdAA3a2 z?<0a;cA;9UAYsY_jd>OQ?d@JEbDN2HjDz{b4I#nF7|$5Giz2u%a=es8*=e z`w9ZMr$9IeiN8?K_J&6SiNO*+BPO+@*0nfvY2s3!#A;o!J;!EG^a0`X7X=h(d4ZF< zLb5_HYHj9rwFbJWEk3QR4eP^#nwEwvB&(ly3d8L5XGZ!`S4!(RjbExE6+r`FEJh&+aVr_$Ms7zjtzS%BRxyAZTs0@3UsYU3n={CfQdG=)M(M7hD0P{3e9!qGLeX>ac*6Pr9y|Xj&wqSh`_E5B-zxvp+g(Gioc}et z^8D`$J^xue2`BP7NZ4$Cb`sfn^7mJiD2g3AWQ0a;fD?AeRCR*%)+IOnAQOr*dvwNO1VBY~UVFa^RywFNW(9gcv z0Y@9VcIvVnJ2%*Ij9Fm*%a2``=BMD%7FHmnp)284* zTqI44A|?)H=cgYcn97N&&NZ#S(Hof@C4J@~n7%2v(ix`+5|qdn!l@jul~GhGW<2`i zNoLFs-WG>wzo!l775p`J^9c3h3ItlJ;M3IWu!vH&uP=@+5Oy5Mo9|%_Ryv=KvY~KtdhnD% zFgwX!rU_Xf9}xdQc5!|>@Zlpr*q`zv_oXIl2aFgfFd;FzIHE9IK)vjs78vF8&d!%- z96iF)penGm&cpe#`UxFR_~Wr9bq*bkmJN`ngqZ4Bstlz^MiL#(!UFmy>(C-j4x+b< zQDiBtUwG$N6U$UHqgG%t#Xt>5XfmeD$8lD#wl%}-q1U`w9h|0GYwj73)b{kfqE;z_ z-oeGY)AQes-&+U!=SNph8T4~6Z4{%5FK2(42q?y3?A)=?1_6G9&=z}mO&rW@qyi?W zn|+}-jK^yuzino>l_}=z;_UeR`omeKZS+;@J_}fcNWC9Ix#GCLU|6q|F4gTuKAtId zK6TJp z*q|3Y=j*sPlqdQ%dDz2(adEMNMQkpt5-u#O57FV2iiTNA!2=h0OFn_a>c{Un2 zzcSkeVYqlwvEaW=6e0wZyS|8c6N6iQTE8vg?0DJh%&?e zx|p)iZf#UqC1r@?Sg9%jRkW~wu|f$W8pVkPGoqCTTvi$rJMf)_;sxIrR9Wk#SEHFlWRHObKb}3*njgSP4YX{yf^?A-x?(?ebcPU1Z|1PcN8E~a0&w-Z| zuMF1}T)vLAcqbd#jnIgQ)eRo7XKgmmoww%$FKhT8#GiyvrdC?CLAO)X)cZ=QMV`7c zss2x%|MEle-|P9W!4T#1-|ue!(pwVW^!(4v{`vD?y)DoGet-Kv(@Qby&VO{eM#cVS z$CT$kUh?^W3VzP4UA!8f@ZV-AelcL#EAy`u$STss_vK*{);sL8$3IP8(lxcVcwe5U z2UhmrZh&0u-8z`jy=5;yij24Rxvv?cFEve|siL-C7cc3von-d=3&ro1sJZwWD?Y?A zsrMPGSV4_=XV_znn7E^QAH6E_Eb&WjQ0Ck95*2iEvCO|E7JF9on4Sy+)-PxSMFE{P zirRO*AQp1PCBe!AM9rjJ5cA+*QA(^suMGGz7saV8IX5!l&AcRfy(*irP-51H4Rj+0 zQv>aFH3MX7n%b^DT<8KU+Aq%c4-Zct)%Q(T*LICP5VfP}X7}w3dSGf@+v}O7vfbgU z$}_22=A^X-5?A%j6vp-gaxIDPA}3$2vv)LJ7-Kgx4#Vs>RmvLpSoq}9uJ66ojP(PJ z5t+rGw|o%*E!pQ@emw+3bs#LYH*<}pBT$|dksv{W1PKx(NRS{wf&>W?BuJ1TL4pJc h5+q2FAVGoz2@)hokRU;V1PMP5{1?fJ1P%ar003bWy_o<2 literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index bdecdbf..e82730b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -Cython==0.29.17 +Cython setuptools numpy diff --git a/setup.py b/setup.py index 9e5716a..e531c72 100644 --- a/setup.py +++ b/setup.py @@ -1,32 +1,27 @@ +from Cython.Distutils import build_ext +import setuptools import os -import subprocess -from setuptools import setup, Extension - +from setuptools import Extension thelibFolder = os.path.dirname(os.path.realpath(__file__)) requirementPath = 'requirements.txt' install_requires = [] if os.path.isfile(requirementPath): with open(requirementPath) as f: install_requires = f.read().splitlines() +cmdclass = {} +ext_modules = [Extension("indicators", ["src/indicators.pyx"])] +cmdclass.update({'build_ext': build_ext}) -# cmdclass = {} -# ext_modules = [Extension("indicators", ["src/indicators.pyx"])] -# cmdclass.update({'build_ext': build_ext}) - -setup( - setup_requires=[ - 'setuptools>=18.0', - 'cython', - ], +setuptools.setup( name="cython_indicators", - version="0.0.6", + version="0.0.3", author="Ethen Pociask", author_email="epociask@volatrade.com", description="Indicator functions using cython", long_description="TO BE ADDED", long_description_content_type="text/markdown", url="https://github.com/epociask/cython_indicator_functions.git", - # packages=setuptools.find_packages(), + packages=setuptools.find_packages(), install_requires=install_requires, include_package_data=True, classifiers=[ @@ -35,12 +30,8 @@ "Operating System :: OS Independent", ], python_requires='>=3.6', - # cmdclass=cmdclass, - ext_modules=[ - Extension( - 'indicators', - sources=['src/indicators.pyx'], - ), - ], + cmdclass = cmdclass, + ext_modules = ext_modules, + ) diff --git a/src/indicators.c b/src/indicators.c index b954c3f..d277a95 100644 --- a/src/indicators.c +++ b/src/indicators.c @@ -1,4 +1,16 @@ -/* Generated by Cython 0.29.14 */ +/* Generated by Cython 0.29.16 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "name": "test", + "sources": [ + "indicators.pyx" + ] + }, + "module_name": "test" +} +END: Cython Metadata */ #define PY_SSIZE_T_CLEAN #include "Python.h" @@ -7,8 +19,8 @@ #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else -#define CYTHON_ABI "0_29_14" -#define CYTHON_HEX_VERSION 0x001D0EF0 +#define CYTHON_ABI "0_29_16" +#define CYTHON_HEX_VERSION 0x001D10F0 #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof @@ -484,8 +496,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif +#endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) @@ -590,14 +604,13 @@ static CYTHON_INLINE float __PYX_NAN() { #endif #endif -#define __PYX_HAVE__indicators -#define __PYX_HAVE_API__indicators +#define __PYX_HAVE__test +#define __PYX_HAVE_API__test /* Early includes */ -#include +#include "pythread.h" #include #include #include -#include "pythread.h" #include "pystate.h" #ifdef _OPENMP #include @@ -807,12 +820,8 @@ static const char *__pyx_filename; static const char *__pyx_f[] = { - "src/indicators.pyx", - "array.pxd", + "indicators.pyx", "stringsource", - "type.pxd", - "bool.pxd", - "complex.pxd", }; /* MemviewSliceStruct.proto */ struct __pyx_memoryview_obj; @@ -924,63 +933,22 @@ typedef struct { /*--- Type declarations ---*/ -#ifndef _ARRAYARRAY_H -struct arrayobject; -typedef struct arrayobject arrayobject; -#endif struct __pyx_array_obj; struct __pyx_MemviewEnum_obj; struct __pyx_memoryview_obj; struct __pyx_memoryviewslice_obj; -struct __pyx_ctuple_float__and_float__and_float; -typedef struct __pyx_ctuple_float__and_float__and_float __pyx_ctuple_float__and_float__and_float; -struct __pyx_opt_args_10indicators_EMA; -struct __pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc; -typedef struct __pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc __pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc; - -/* "indicators.pyx":35 - * - * #TODO add lower retracement - * cpdef (float, float, float) FIB(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Fibonacci retracement equation; currently only support upper retracement - */ -struct __pyx_ctuple_float__and_float__and_float { - float f0; - float f1; - float f2; -}; +struct __pyx_opt_args_4test_UPTREND; -/* "indicators.pyx":116 - * return (dy/dx) +/* "indicators.pyx":11 + * return float(total/period) * - * cpdef list EMA(double[:] closes, int period, float alpha = .3, int epsilon = 0): # <<<<<<<<<<<<<< - * """ - * Exponential moving average function + * cpdef UPTREND(candles, n=3): # <<<<<<<<<<<<<< + * cdef int positives = 0 + * if candles[len(candles)-n]['close'] < candles[-1]['close']: */ -struct __pyx_opt_args_10indicators_EMA { +struct __pyx_opt_args_4test_UPTREND { int __pyx_n; - float alpha; - int epsilon; -}; - -/* "indicators.pyx":160 - * - * - * cpdef (float, float, float, float, float, float, float, float, float) FIB_BANDS(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Fibonacci Bolinger Bands function ... does retracements between ma/upper-band & ma/lower-band - */ -struct __pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc { - float f0; - float f1; - float f2; - float f3; - float f4; - float f5; - float f6; - float f7; - float f8; + PyObject *n; }; /* "View.MemoryView":105 @@ -1185,47 +1153,6 @@ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* BufferIndexError.proto */ static void __Pyx_RaiseBufferIndexError(int axis); -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() PyErr_Occurred() -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* WriteUnraisableException.proto */ -static void __Pyx_WriteUnraisable(const char *name, int clineno, - int lineno, const char *filename, - int full_traceback, int nogil); - /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); @@ -1267,6 +1194,46 @@ static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *, int, int); +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + /* PyIntBinop.proto */ #if !CYTHON_COMPILING_IN_PYPY static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); @@ -1275,53 +1242,71 @@ static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long int (inplace ? PyNumber_InPlaceSubtract(op1, op2) : PyNumber_Subtract(op1, op2)) #endif -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +/* pyobject_as_double.proto */ +static double __Pyx__PyObject_AsDouble(PyObject* obj); +#if CYTHON_COMPILING_IN_PYPY +#define __Pyx_PyObject_AsDouble(obj)\ +(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) :\ + likely(PyInt_CheckExact(obj)) ?\ + PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) #else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#define __Pyx_PyObject_AsDouble(obj)\ +((likely(PyFloat_CheckExact(obj))) ?\ + PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj)) #endif -/* GetModuleGlobalName.proto */ -#if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ - (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ - __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ - PY_UINT64_T __pyx_dict_version;\ - PyObject *__pyx_dict_cached_value;\ - (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else -#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) -#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + /* PyCFunctionFastCall.proto */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); @@ -1352,13 +1337,6 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - /* PyObjectCall2Args.proto */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); @@ -1370,64 +1348,6 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); -/* ListCompAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS -static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { - PyListObject* L = (PyListObject*) list; - Py_ssize_t len = Py_SIZE(list); - if (likely(L->allocated > len)) { - Py_INCREF(x); - PyList_SET_ITEM(list, len, x); - Py_SIZE(list) = len+1; - return 0; - } - return PyList_Append(list, x); -} -#else -#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) -#endif - -/* GetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* SwapException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* GetTopmostException.proto */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); -#endif - -/* SaveResetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -#else -#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) -#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) -#endif - -/* ArgTypeTest.proto */ -#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ - ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ - __Pyx__ArgTypeTest(obj, type, name, exact)) -static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); - -/* RaiseException.proto */ -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); - /* IncludeStringH.proto */ #include @@ -1456,35 +1376,6 @@ static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ /* GetAttr.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); -/* GetItemInt.proto */ -#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ - (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ - __Pyx_GetItemInt_Generic(o, to_py_func(i)))) -#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, - int is_list, int wraparound, int boundscheck); - -/* ObjectGetItem.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); -#else -#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) -#endif - /* decode_c_string_utf16.proto */ static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { int byteorder = 0; @@ -1516,6 +1407,53 @@ static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tsta /* GetAttr3.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + /* RaiseTooManyValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); @@ -1528,6 +1466,38 @@ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); /* ExtTypeTest.proto */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); @@ -1545,6 +1515,23 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + /* PyIntBinop.proto */ #if !CYTHON_COMPILING_IN_PYPY static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); @@ -1612,17 +1599,6 @@ static int __Pyx_SetVtable(PyObject *dict, void *vtable); /* SetupReduce.proto */ static int __Pyx_setup_reduce(PyObject* type_obj); -/* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto -#define __PYX_HAVE_RT_ImportType_proto -enum __Pyx_ImportType_CheckSize { - __Pyx_ImportType_CheckSize_Error = 0, - __Pyx_ImportType_CheckSize_Warn = 1, - __Pyx_ImportType_CheckSize_Ignore = 2 -}; -static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); -#endif - /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) @@ -1649,121 +1625,6 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); -/* ArrayAPI.proto */ -#ifndef _ARRAYARRAY_H -#define _ARRAYARRAY_H -typedef struct arraydescr { - int typecode; - int itemsize; - PyObject * (*getitem)(struct arrayobject *, Py_ssize_t); - int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *); -#if PY_MAJOR_VERSION >= 3 - char *formats; -#endif -} arraydescr; -struct arrayobject { - PyObject_HEAD - Py_ssize_t ob_size; - union { - char *ob_item; - float *as_floats; - double *as_doubles; - int *as_ints; - unsigned int *as_uints; - unsigned char *as_uchars; - signed char *as_schars; - char *as_chars; - unsigned long *as_ulongs; - long *as_longs; -#if PY_MAJOR_VERSION >= 3 - unsigned long long *as_ulonglongs; - long long *as_longlongs; -#endif - short *as_shorts; - unsigned short *as_ushorts; - Py_UNICODE *as_pyunicodes; - void *as_voidptr; - } data; - Py_ssize_t allocated; - struct arraydescr *ob_descr; - PyObject *weakreflist; -#if PY_MAJOR_VERSION >= 3 - int ob_exports; -#endif -}; -#ifndef NO_NEWARRAY_INLINE -static CYTHON_INLINE PyObject * newarrayobject(PyTypeObject *type, Py_ssize_t size, - struct arraydescr *descr) { - arrayobject *op; - size_t nbytes; - if (size < 0) { - PyErr_BadInternalCall(); - return NULL; - } - nbytes = size * descr->itemsize; - if (nbytes / descr->itemsize != (size_t)size) { - return PyErr_NoMemory(); - } - op = (arrayobject *) type->tp_alloc(type, 0); - if (op == NULL) { - return NULL; - } - op->ob_descr = descr; - op->allocated = size; - op->weakreflist = NULL; - op->ob_size = size; - if (size <= 0) { - op->data.ob_item = NULL; - } - else { - op->data.ob_item = PyMem_NEW(char, nbytes); - if (op->data.ob_item == NULL) { - Py_DECREF(op); - return PyErr_NoMemory(); - } - } - return (PyObject *) op; -} -#else -PyObject* newarrayobject(PyTypeObject *type, Py_ssize_t size, - struct arraydescr *descr); -#endif -static CYTHON_INLINE int resize(arrayobject *self, Py_ssize_t n) { - void *items = (void*) self->data.ob_item; - PyMem_Resize(items, char, (size_t)(n * self->ob_descr->itemsize)); - if (items == NULL) { - PyErr_NoMemory(); - return -1; - } - self->data.ob_item = (char*) items; - self->ob_size = n; - self->allocated = n; - return 0; -} -static CYTHON_INLINE int resize_smart(arrayobject *self, Py_ssize_t n) { - void *items = (void*) self->data.ob_item; - Py_ssize_t newsize; - if (n < self->allocated && n*4 > self->allocated) { - self->ob_size = n; - return 0; - } - newsize = n + (n / 2) + 1; - if (newsize <= n) { - PyErr_NoMemory(); - return -1; - } - PyMem_Resize(items, char, (size_t)(newsize * self->ob_descr->itemsize)); - if (items == NULL) { - PyErr_NoMemory(); - return -1; - } - self->data.ob_item = (char*) items; - self->ob_size = n; - self->allocated = newsize; - return 0; -} -#endif - #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); static void __Pyx_ReleaseBuffer(Py_buffer *view); @@ -1824,28 +1685,15 @@ static int __Pyx_ValidateAndInit_memviewslice( /* ObjectToMemviewSlice.proto */ static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_double(PyObject *, int writable_flag); -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - -/* ToPyCTupleUtility.proto */ -static PyObject* __pyx_convert__to_py___pyx_ctuple_float__and_float__and_float(__pyx_ctuple_float__and_float__and_float); - /* MemviewDtypeToObject.proto */ static CYTHON_INLINE PyObject *__pyx_memview_get_double(const char *itemp); static CYTHON_INLINE int __pyx_memview_set_double(const char *itemp, PyObject *obj); -/* Print.proto */ -static int __Pyx_Print(PyObject*, PyObject *, int); -#if CYTHON_COMPILING_IN_PYPY || PY_MAJOR_VERSION >= 3 -static PyObject* __pyx_print = 0; -static PyObject* __pyx_print_kwargs = 0; -#endif +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); -/* ToPyCTupleUtility.proto */ -static PyObject* __pyx_convert__to_py___pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc(__pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc); +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); /* MemviewSliceCopyTemplate.proto */ static __Pyx_memviewslice @@ -1860,9 +1708,6 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); -/* PrintOne.proto */ -static int __Pyx_PrintOne(PyObject* stream, PyObject *o); - /* CIntFromPy.proto */ static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); @@ -1883,100 +1728,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ -/* Module declarations from 'libc.math' */ - -/* Module declarations from 'libc.string' */ - -/* Module declarations from 'libc.stdlib' */ - -/* Module declarations from 'cpython.version' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.type' */ -static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; - -/* Module declarations from 'libc.stdio' */ - -/* Module declarations from 'cpython.object' */ - -/* Module declarations from 'cpython.ref' */ - -/* Module declarations from 'cpython.exc' */ - -/* Module declarations from 'cpython.module' */ - -/* Module declarations from 'cpython.mem' */ - -/* Module declarations from 'cpython.tuple' */ - -/* Module declarations from 'cpython.list' */ - -/* Module declarations from 'cpython.sequence' */ - -/* Module declarations from 'cpython.mapping' */ - -/* Module declarations from 'cpython.iterator' */ - -/* Module declarations from 'cpython.number' */ - -/* Module declarations from 'cpython.int' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.bool' */ -static PyTypeObject *__pyx_ptype_7cpython_4bool_bool = 0; - -/* Module declarations from 'cpython.long' */ - -/* Module declarations from 'cpython.float' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.complex' */ -static PyTypeObject *__pyx_ptype_7cpython_7complex_complex = 0; - -/* Module declarations from 'cpython.string' */ - -/* Module declarations from 'cpython.unicode' */ - -/* Module declarations from 'cpython.dict' */ - -/* Module declarations from 'cpython.instance' */ - -/* Module declarations from 'cpython.function' */ - -/* Module declarations from 'cpython.method' */ - -/* Module declarations from 'cpython.weakref' */ - -/* Module declarations from 'cpython.getargs' */ - -/* Module declarations from 'cpython.pythread' */ - -/* Module declarations from 'cpython.pystate' */ - -/* Module declarations from 'cpython.cobject' */ - -/* Module declarations from 'cpython.oldbuffer' */ - -/* Module declarations from 'cpython.set' */ - -/* Module declarations from 'cpython.buffer' */ - -/* Module declarations from 'cpython.bytes' */ - -/* Module declarations from 'cpython.pycapsule' */ - -/* Module declarations from 'cpython' */ - -/* Module declarations from 'array' */ - -/* Module declarations from 'cpython.array' */ -static PyTypeObject *__pyx_ptype_7cpython_5array_array = 0; -static CYTHON_INLINE int __pyx_f_7cpython_5array_extend_buffer(arrayobject *, char *, Py_ssize_t); /*proto*/ - -/* Module declarations from 'indicators' */ +/* Module declarations from 'test' */ static PyTypeObject *__pyx_array_type = 0; static PyTypeObject *__pyx_MemviewEnum_type = 0; static PyTypeObject *__pyx_memoryview_type = 0; @@ -1988,15 +1740,12 @@ static PyObject *contiguous = 0; static PyObject *indirect_contiguous = 0; static int __pyx_memoryview_thread_locks_used; static PyThread_type_lock __pyx_memoryview_thread_locks[8]; -static float __pyx_f_10indicators_SMA(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ -static float __pyx_f_10indicators_SDV(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ -static __pyx_ctuple_float__and_float__and_float __pyx_f_10indicators_FIB(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ -static __pyx_ctuple_float__and_float__and_float __pyx_f_10indicators_BOLINGER_BANDS(__Pyx_memviewslice, int, int, int __pyx_skip_dispatch); /*proto*/ -static float __pyx_f_10indicators_MOMENTUM(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ -static float __pyx_f_10indicators_WMA(__Pyx_memviewslice, int, float, int __pyx_skip_dispatch); /*proto*/ -static PyObject *__pyx_f_10indicators_DERIVATIVE(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ -static PyObject *__pyx_f_10indicators_EMA(__Pyx_memviewslice, int, int __pyx_skip_dispatch, struct __pyx_opt_args_10indicators_EMA *__pyx_optional_args); /*proto*/ -static __pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc __pyx_f_10indicators_FIB_BANDS(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ +static PyObject *__pyx_f_4test_SMA(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ +static PyObject *__pyx_f_4test_UPTREND(PyObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_4test_UPTREND *__pyx_optional_args); /*proto*/ +static PyObject *__pyx_f_4test_SDV(__Pyx_memviewslice, PyObject *); /*proto*/ +static PyObject *__pyx_f_4test_FIB(PyObject *, int, int __pyx_skip_dispatch); /*proto*/ +static PyObject *__pyx_f_4test_BOLINGER_BANDES(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ +static PyObject *__pyx_f_4test_MOMENTUM(__Pyx_memviewslice, int, int __pyx_skip_dispatch); /*proto*/ static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ static void *__pyx_align_pointer(void *, size_t); /*proto*/ static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ @@ -2031,14 +1780,14 @@ static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ static __Pyx_TypeInfo __Pyx_TypeInfo_double = { "double", NULL, sizeof(double), { 0 }, 0, 'R', 0, 0 }; -#define __Pyx_MODULE_NAME "indicators" -extern int __pyx_module_is_main_indicators; -int __pyx_module_is_main_indicators = 0; +#define __Pyx_MODULE_NAME "test" +extern int __pyx_module_is_main_test; +int __pyx_module_is_main_test = 0; -/* Implementation of 'indicators' */ +/* Implementation of 'test' */ static PyObject *__pyx_builtin_xrange; -static PyObject *__pyx_builtin_MemoryError; static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_MemoryError; static PyObject *__pyx_builtin_enumerate; static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_TypeError; @@ -2047,15 +1796,13 @@ static PyObject *__pyx_builtin_id; static PyObject *__pyx_builtin_IndexError; static const char __pyx_k_O[] = "O"; static const char __pyx_k_c[] = "c"; +static const char __pyx_k_n[] = "n"; static const char __pyx_k_id[] = "id"; static const char __pyx_k_np[] = "np"; -static const char __pyx_k_end[] = "end"; static const char __pyx_k_new[] = "__new__"; static const char __pyx_k_obj[] = "obj"; static const char __pyx_k_base[] = "base"; static const char __pyx_k_dict[] = "__dict__"; -static const char __pyx_k_diff[] = "diff"; -static const char __pyx_k_file[] = "file"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_mode[] = "mode"; static const char __pyx_k_name[] = "name"; @@ -2066,16 +1813,14 @@ static const char __pyx_k_step[] = "step"; static const char __pyx_k_stop[] = "stop"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_ASCII[] = "ASCII"; -static const char __pyx_k_alpha[] = "alpha"; static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_close[] = "close"; static const char __pyx_k_error[] = "error"; static const char __pyx_k_flags[] = "flags"; static const char __pyx_k_numpy[] = "numpy"; -static const char __pyx_k_print[] = "print"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_shape[] = "shape"; static const char __pyx_k_start[] = "start"; -static const char __pyx_k_zeros[] = "zeros"; static const char __pyx_k_closes[] = "closes"; static const char __pyx_k_encode[] = "encode"; static const char __pyx_k_format[] = "format"; @@ -2087,9 +1832,8 @@ static const char __pyx_k_reduce[] = "__reduce__"; static const char __pyx_k_struct[] = "struct"; static const char __pyx_k_unpack[] = "unpack"; static const char __pyx_k_update[] = "update"; -static const char __pyx_k_values[] = "values"; static const char __pyx_k_xrange[] = "xrange"; -static const char __pyx_k_epsilon[] = "epsilon"; +static const char __pyx_k_candles[] = "candles"; static const char __pyx_k_fortran[] = "fortran"; static const char __pyx_k_memview[] = "memview"; static const char __pyx_k_Ellipsis[] = "Ellipsis"; @@ -2107,12 +1851,10 @@ static const char __pyx_k_pyx_result[] = "__pyx_result"; static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; static const char __pyx_k_MemoryError[] = "MemoryError"; static const char __pyx_k_PickleError[] = "PickleError"; -static const char __pyx_k_numberOfSDV[] = "numberOfSDV"; static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; static const char __pyx_k_stringsource[] = "stringsource"; static const char __pyx_k_pyx_getbuffer[] = "__pyx_getbuffer"; static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; -static const char __pyx_k_weightedFactor[] = "weightedFactor"; static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; @@ -2121,15 +1863,11 @@ static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_strided_and_direct[] = ""; -static const char __pyx_k_out_of_range_alpha_s[] = "out of range, alpha='%s'"; static const char __pyx_k_strided_and_indirect[] = ""; static const char __pyx_k_contiguous_and_direct[] = ""; -static const char __pyx_k_out_of_range_period_s[] = "out of range, period='%s'"; static const char __pyx_k_MemoryView_of_r_object[] = ""; -static const char __pyx_k_out_of_range_epsilon_s[] = "out of range, epsilon='%s'"; static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; static const char __pyx_k_contiguous_and_indirect[] = ""; -static const char __pyx_k_out_of_range_period_s_2[] = "out of range period='%s'"; static const char __pyx_k_Cannot_index_with_type_s[] = "Cannot index with type '%s'"; static const char __pyx_k_Invalid_shape_in_axis_d_d[] = "Invalid shape in axis %d: %d."; static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; @@ -2172,24 +1910,21 @@ static PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; static PyObject *__pyx_n_s_ValueError; static PyObject *__pyx_n_s_View_MemoryView; static PyObject *__pyx_n_s_allocate_buffer; -static PyObject *__pyx_n_s_alpha; static PyObject *__pyx_n_s_base; static PyObject *__pyx_n_s_c; static PyObject *__pyx_n_u_c; +static PyObject *__pyx_n_s_candles; static PyObject *__pyx_n_s_class; static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_n_s_close; static PyObject *__pyx_n_s_closes; static PyObject *__pyx_kp_s_contiguous_and_direct; static PyObject *__pyx_kp_s_contiguous_and_indirect; static PyObject *__pyx_n_s_dict; -static PyObject *__pyx_n_s_diff; static PyObject *__pyx_n_s_dtype_is_object; static PyObject *__pyx_n_s_encode; -static PyObject *__pyx_n_s_end; static PyObject *__pyx_n_s_enumerate; -static PyObject *__pyx_n_s_epsilon; static PyObject *__pyx_n_s_error; -static PyObject *__pyx_n_s_file; static PyObject *__pyx_n_s_flags; static PyObject *__pyx_n_s_format; static PyObject *__pyx_n_s_fortran; @@ -2203,23 +1938,18 @@ static PyObject *__pyx_kp_s_itemsize_0_for_cython_array; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_memview; static PyObject *__pyx_n_s_mode; +static PyObject *__pyx_n_s_n; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_name_2; static PyObject *__pyx_n_s_ndim; static PyObject *__pyx_n_s_new; static PyObject *__pyx_kp_s_no_default___reduce___due_to_non; static PyObject *__pyx_n_s_np; -static PyObject *__pyx_n_s_numberOfSDV; static PyObject *__pyx_n_s_numpy; static PyObject *__pyx_n_s_obj; -static PyObject *__pyx_kp_s_out_of_range_alpha_s; -static PyObject *__pyx_kp_s_out_of_range_epsilon_s; -static PyObject *__pyx_kp_s_out_of_range_period_s; -static PyObject *__pyx_kp_s_out_of_range_period_s_2; static PyObject *__pyx_n_s_pack; static PyObject *__pyx_n_s_period; static PyObject *__pyx_n_s_pickle; -static PyObject *__pyx_n_s_print; static PyObject *__pyx_n_s_pyx_PickleError; static PyObject *__pyx_n_s_pyx_checksum; static PyObject *__pyx_n_s_pyx_getbuffer; @@ -2249,21 +1979,12 @@ static PyObject *__pyx_kp_s_unable_to_allocate_array_data; static PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; static PyObject *__pyx_n_s_unpack; static PyObject *__pyx_n_s_update; -static PyObject *__pyx_n_s_values; -static PyObject *__pyx_n_s_weightedFactor; static PyObject *__pyx_n_s_xrange; -static PyObject *__pyx_n_s_zeros; -static PyObject *__pyx_pf_10indicators_SMA(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period); /* proto */ -static PyObject *__pyx_pf_10indicators_2SDV(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period); /* proto */ -static PyObject *__pyx_pf_10indicators_4FIB(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period); /* proto */ -static PyObject *__pyx_pf_10indicators_6BOLINGER_BANDS(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, int __pyx_v_numberOfSDV); /* proto */ -static PyObject *__pyx_pf_10indicators_8MOMENTUM(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period); /* proto */ -static PyObject *__pyx_pf_10indicators_10WMA(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, float __pyx_v_weightedFactor); /* proto */ -static PyObject *__pyx_pf_10indicators_12DERIVATIVE(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_values, int __pyx_v_period); /* proto */ -static PyObject *__pyx_pf_10indicators_14EMA(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, float __pyx_v_alpha, int __pyx_v_epsilon); /* proto */ -static PyObject *__pyx_pf_10indicators_16FIB_BANDS(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period); /* proto */ -static int __pyx_pf_7cpython_5array_5array___getbuffer__(arrayobject *__pyx_v_self, Py_buffer *__pyx_v_info, CYTHON_UNUSED int __pyx_v_flags); /* proto */ -static void __pyx_pf_7cpython_5array_5array_2__releasebuffer__(CYTHON_UNUSED arrayobject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ +static PyObject *__pyx_pf_4test_SMA(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period); /* proto */ +static PyObject *__pyx_pf_4test_2UPTREND(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_candles, PyObject *__pyx_v_n); /* proto */ +static PyObject *__pyx_pf_4test_4FIB(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_candles, int __pyx_v_period); /* proto */ +static PyObject *__pyx_pf_4test_6BOLINGER_BANDES(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period); /* proto */ +static PyObject *__pyx_pf_4test_8MOMENTUM(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period); /* proto */ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ @@ -2310,9 +2031,9 @@ static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_float_0_0; static PyObject *__pyx_int_0; static PyObject *__pyx_int_1; +static PyObject *__pyx_int_3; static PyObject *__pyx_int_184977713; static PyObject *__pyx_int_neg_1; static PyObject *__pyx_tuple_; @@ -2342,124 +2063,132 @@ static PyObject *__pyx_tuple__24; static PyObject *__pyx_codeobj__25; /* Late includes */ -/* "indicators.pyx":6 - * from cpython cimport array +/* "indicators.pyx":3 + * import numpy as np * - * cpdef float SMA(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Simple Moving Average function + * cpdef SMA(double[:] closes, int period): # <<<<<<<<<<<<<< + * cdef int length = len(closes) + * cdef float total = closes[length-period] */ -static PyObject *__pyx_pw_10indicators_1SMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static float __pyx_f_10indicators_SMA(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { +static PyObject *__pyx_pw_4test_1SMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_f_4test_SMA(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { int __pyx_v_length; float __pyx_v_total; int __pyx_v_i; - float __pyx_r; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_t_2; + size_t __pyx_t_1; + Py_ssize_t __pyx_t_2; int __pyx_t_3; int __pyx_t_4; - Py_ssize_t __pyx_t_5; - int __pyx_t_6; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("SMA", 0); - /* "indicators.pyx":12 - * @param period: period to calculate for - * """ - * cdef int length = closes.shape[0] # <<<<<<<<<<<<<< + /* "indicators.pyx":4 + * + * cpdef SMA(double[:] closes, int period): + * cdef int length = len(closes) # <<<<<<<<<<<<<< * cdef float total = closes[length-period] * cdef int i */ - __pyx_v_length = (__pyx_v_closes.shape[0]); + __pyx_t_1 = __Pyx_MemoryView_Len(__pyx_v_closes); + __pyx_v_length = __pyx_t_1; - /* "indicators.pyx":13 - * """ - * cdef int length = closes.shape[0] + /* "indicators.pyx":5 + * cpdef SMA(double[:] closes, int period): + * cdef int length = len(closes) * cdef float total = closes[length-period] # <<<<<<<<<<<<<< * cdef int i * for i in xrange((length-period)+1, length): */ - __pyx_t_1 = (__pyx_v_length - __pyx_v_period); - __pyx_t_2 = -1; - if (__pyx_t_1 < 0) { - __pyx_t_1 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0; - } else if (unlikely(__pyx_t_1 >= __pyx_v_closes.shape[0])) __pyx_t_2 = 0; - if (unlikely(__pyx_t_2 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_2); - __PYX_ERR(0, 13, __pyx_L1_error) + __pyx_t_2 = (__pyx_v_length - __pyx_v_period); + __pyx_t_3 = -1; + if (__pyx_t_2 < 0) { + __pyx_t_2 += __pyx_v_closes.shape[0]; + if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0; + } else if (unlikely(__pyx_t_2 >= __pyx_v_closes.shape[0])) __pyx_t_3 = 0; + if (unlikely(__pyx_t_3 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_3); + __PYX_ERR(0, 5, __pyx_L1_error) } - __pyx_v_total = (*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_1 * __pyx_v_closes.strides[0]) ))); + __pyx_v_total = (*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_2 * __pyx_v_closes.strides[0]) ))); - /* "indicators.pyx":15 + /* "indicators.pyx":7 * cdef float total = closes[length-period] * cdef int i * for i in xrange((length-period)+1, length): # <<<<<<<<<<<<<< * total += closes[i] * return float(total/period) */ - __pyx_t_2 = __pyx_v_length; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = ((__pyx_v_length - __pyx_v_period) + 1); __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; + __pyx_t_3 = __pyx_v_length; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = ((__pyx_v_length - __pyx_v_period) + 1); __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; - /* "indicators.pyx":16 + /* "indicators.pyx":8 * cdef int i * for i in xrange((length-period)+1, length): * total += closes[i] # <<<<<<<<<<<<<< * return float(total/period) * */ - __pyx_t_5 = __pyx_v_i; - __pyx_t_6 = -1; - if (__pyx_t_5 < 0) { - __pyx_t_5 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0; - } else if (unlikely(__pyx_t_5 >= __pyx_v_closes.shape[0])) __pyx_t_6 = 0; - if (unlikely(__pyx_t_6 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_6); - __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_t_6 = __pyx_v_i; + __pyx_t_7 = -1; + if (__pyx_t_6 < 0) { + __pyx_t_6 += __pyx_v_closes.shape[0]; + if (unlikely(__pyx_t_6 < 0)) __pyx_t_7 = 0; + } else if (unlikely(__pyx_t_6 >= __pyx_v_closes.shape[0])) __pyx_t_7 = 0; + if (unlikely(__pyx_t_7 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_7); + __PYX_ERR(0, 8, __pyx_L1_error) } - __pyx_v_total = (__pyx_v_total + (*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_5 * __pyx_v_closes.strides[0]) )))); + __pyx_v_total = (__pyx_v_total + (*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_6 * __pyx_v_closes.strides[0]) )))); } - /* "indicators.pyx":17 + /* "indicators.pyx":9 * for i in xrange((length-period)+1, length): * total += closes[i] * return float(total/period) # <<<<<<<<<<<<<< * - * + * cpdef UPTREND(candles, n=3): */ + __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_period == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 17, __pyx_L1_error) + __PYX_ERR(0, 9, __pyx_L1_error) } - __pyx_r = ((double)(__pyx_v_total / __pyx_v_period)); + __pyx_t_8 = PyFloat_FromDouble(((double)(__pyx_v_total / __pyx_v_period))); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; goto __pyx_L0; - /* "indicators.pyx":6 - * from cpython cimport array + /* "indicators.pyx":3 + * import numpy as np * - * cpdef float SMA(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Simple Moving Average function + * cpdef SMA(double[:] closes, int period): # <<<<<<<<<<<<<< + * cdef int length = len(closes) + * cdef float total = closes[length-period] */ /* function exit code */ __pyx_L1_error:; - __Pyx_WriteUnraisable("indicators.SMA", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("test.SMA", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ -static PyObject *__pyx_pw_10indicators_1SMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_SMA[] = "\n Simple Moving Average function \n @param closes: list of closing candle prices \n @param period: period to calculate for \n "; -static PyObject *__pyx_pw_10indicators_1SMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4test_1SMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_4test_1SMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_closes = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_period; PyObject *__pyx_r = 0; @@ -2488,11 +2217,11 @@ static PyObject *__pyx_pw_10indicators_1SMA(PyObject *__pyx_self, PyObject *__py case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("SMA", 1, 2, 2, 1); __PYX_ERR(0, 6, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("SMA", 1, 2, 2, 1); __PYX_ERR(0, 3, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "SMA") < 0)) __PYX_ERR(0, 6, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "SMA") < 0)) __PYX_ERR(0, 3, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -2500,32 +2229,32 @@ static PyObject *__pyx_pw_10indicators_1SMA(PyObject *__pyx_self, PyObject *__py values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } - __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 6, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 6, __pyx_L3_error) + __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 3, __pyx_L3_error) + __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("SMA", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 6, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("SMA", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 3, __pyx_L3_error) __pyx_L3_error:; - __Pyx_AddTraceback("indicators.SMA", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.SMA", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_SMA(__pyx_self, __pyx_v_closes, __pyx_v_period); + __pyx_r = __pyx_pf_4test_SMA(__pyx_self, __pyx_v_closes, __pyx_v_period); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10indicators_SMA(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period) { +static PyObject *__pyx_pf_4test_SMA(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("SMA", 0); __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 6, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_f_10indicators_SMA(__pyx_v_closes, __pyx_v_period, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 6, __pyx_L1_error) + if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 3, __pyx_L1_error) } + __pyx_t_1 = __pyx_f_4test_SMA(__pyx_v_closes, __pyx_v_period, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -2534,7 +2263,7 @@ static PyObject *__pyx_pf_10indicators_SMA(CYTHON_UNUSED PyObject *__pyx_self, _ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.SMA", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.SMA", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __PYX_XDEC_MEMVIEW(&__pyx_v_closes, 1); @@ -2543,148 +2272,138 @@ static PyObject *__pyx_pf_10indicators_SMA(CYTHON_UNUSED PyObject *__pyx_self, _ return __pyx_r; } -/* "indicators.pyx":20 - * +/* "indicators.pyx":11 + * return float(total/period) * - * cpdef float SDV(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Standard deviation function + * cpdef UPTREND(candles, n=3): # <<<<<<<<<<<<<< + * cdef int positives = 0 + * if candles[len(candles)-n]['close'] < candles[-1]['close']: */ -static PyObject *__pyx_pw_10indicators_3SDV(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static float __pyx_f_10indicators_SDV(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { - PyObject *__pyx_v_length = 0; - float __pyx_v_mean; - float __pyx_v_x_i; - int __pyx_v_i; - float __pyx_r; +static PyObject *__pyx_pw_4test_3UPTREND(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_f_4test_UPTREND(PyObject *__pyx_v_candles, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_4test_UPTREND *__pyx_optional_args) { + PyObject *__pyx_v_n = ((PyObject *)__pyx_int_3); + CYTHON_UNUSED int __pyx_v_positives; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - long __pyx_t_2; + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; - long __pyx_t_4; - long __pyx_t_5; - int __pyx_t_6; - Py_ssize_t __pyx_t_7; - int __pyx_t_8; - __Pyx_RefNannySetupContext("SDV", 0); - - /* "indicators.pyx":26 - * @param period: period to calculate for - * """ - * cdef length = closes.shape[0] # <<<<<<<<<<<<<< - * cdef float mean = SMA(closes, period) - * cdef float x_i = 0.0 - */ - __pyx_t_1 = PyInt_FromSsize_t((__pyx_v_closes.shape[0])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 26, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_length = __pyx_t_1; - __pyx_t_1 = 0; - - /* "indicators.pyx":27 - * """ - * cdef length = closes.shape[0] - * cdef float mean = SMA(closes, period) # <<<<<<<<<<<<<< - * cdef float x_i = 0.0 - * cdef int i - */ - __pyx_v_mean = __pyx_f_10indicators_SMA(__pyx_v_closes, __pyx_v_period, 0); + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + __Pyx_RefNannySetupContext("UPTREND", 0); + if (__pyx_optional_args) { + if (__pyx_optional_args->__pyx_n > 0) { + __pyx_v_n = __pyx_optional_args->n; + } + } - /* "indicators.pyx":28 - * cdef length = closes.shape[0] - * cdef float mean = SMA(closes, period) - * cdef float x_i = 0.0 # <<<<<<<<<<<<<< - * cdef int i - * for i in xrange((length - period), length): + /* "indicators.pyx":12 + * + * cpdef UPTREND(candles, n=3): + * cdef int positives = 0 # <<<<<<<<<<<<<< + * if candles[len(candles)-n]['close'] < candles[-1]['close']: + * # temp = candles[len(candles)-n :len(candles)] */ - __pyx_v_x_i = 0.0; + __pyx_v_positives = 0; - /* "indicators.pyx":30 - * cdef float x_i = 0.0 - * cdef int i - * for i in xrange((length - period), length): # <<<<<<<<<<<<<< - * x_i += (closes[i] - mean) ** 2 - * return float(sqrt(x_i/(period-1))) - */ - __pyx_t_2 = __Pyx_PyInt_As_long(__pyx_v_length); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L1_error) - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_period); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyNumber_Subtract(__pyx_v_length, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 30, __pyx_L1_error) + /* "indicators.pyx":13 + * cpdef UPTREND(candles, n=3): + * cdef int positives = 0 + * if candles[len(candles)-n]['close'] < candles[-1]['close']: # <<<<<<<<<<<<<< + * # temp = candles[len(candles)-n :len(candles)] + * # for candle in temp: + */ + __pyx_t_1 = PyObject_Length(__pyx_v_candles); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 13, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Subtract(__pyx_t_2, __pyx_v_n); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_4 = __Pyx_PyInt_As_long(__pyx_t_3); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_candles, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_5 = __pyx_t_2; - for (__pyx_t_6 = __pyx_t_4; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; + __pyx_t_3 = __Pyx_PyObject_Dict_GetItem(__pyx_t_2, __pyx_n_s_close); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_candles, -1L, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_Dict_GetItem(__pyx_t_2, __pyx_n_s_close); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_5) { - /* "indicators.pyx":31 - * cdef int i - * for i in xrange((length - period), length): - * x_i += (closes[i] - mean) ** 2 # <<<<<<<<<<<<<< - * return float(sqrt(x_i/(period-1))) + /* "indicators.pyx":20 * + * # if positives/2 > n: + * return True # <<<<<<<<<<<<<< + * + * return False + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + + /* "indicators.pyx":13 + * cpdef UPTREND(candles, n=3): + * cdef int positives = 0 + * if candles[len(candles)-n]['close'] < candles[-1]['close']: # <<<<<<<<<<<<<< + * # temp = candles[len(candles)-n :len(candles)] + * # for candle in temp: */ - __pyx_t_7 = __pyx_v_i; - __pyx_t_8 = -1; - if (__pyx_t_7 < 0) { - __pyx_t_7 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_7 < 0)) __pyx_t_8 = 0; - } else if (unlikely(__pyx_t_7 >= __pyx_v_closes.shape[0])) __pyx_t_8 = 0; - if (unlikely(__pyx_t_8 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_8); - __PYX_ERR(0, 31, __pyx_L1_error) - } - __pyx_v_x_i = (__pyx_v_x_i + pow(((*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_7 * __pyx_v_closes.strides[0]) ))) - __pyx_v_mean), 2.0)); } - /* "indicators.pyx":32 - * for i in xrange((length - period), length): - * x_i += (closes[i] - mean) ** 2 - * return float(sqrt(x_i/(period-1))) # <<<<<<<<<<<<<< + /* "indicators.pyx":22 + * return True + * + * return False # <<<<<<<<<<<<<< + * * - * #TODO add lower retracement */ - __pyx_t_2 = (__pyx_v_period - 1); - if (unlikely(__pyx_t_2 == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 32, __pyx_L1_error) - } - __pyx_r = sqrt((__pyx_v_x_i / __pyx_t_2)); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; goto __pyx_L0; - /* "indicators.pyx":20 - * + /* "indicators.pyx":11 + * return float(total/period) * - * cpdef float SDV(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Standard deviation function + * cpdef UPTREND(candles, n=3): # <<<<<<<<<<<<<< + * cdef int positives = 0 + * if candles[len(candles)-n]['close'] < candles[-1]['close']: */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); - __Pyx_WriteUnraisable("indicators.SDV", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("test.UPTREND", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ -static PyObject *__pyx_pw_10indicators_3SDV(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_2SDV[] = "\n Standard deviation function \n @param closes: list of closing candle prices \n @param period: period to calculate for \n "; -static PyObject *__pyx_pw_10indicators_3SDV(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - __Pyx_memviewslice __pyx_v_closes = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_period; +static PyObject *__pyx_pw_4test_3UPTREND(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_4test_3UPTREND(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_candles = 0; + PyObject *__pyx_v_n = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("SDV (wrapper)", 0); + __Pyx_RefNannySetupContext("UPTREND (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_closes,&__pyx_n_s_period,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_candles,&__pyx_n_s_n,0}; PyObject* values[2] = {0,0}; + values[1] = ((PyObject *)__pyx_int_3); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); @@ -2699,50 +2418,55 @@ static PyObject *__pyx_pw_10indicators_3SDV(PyObject *__pyx_self, PyObject *__py kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_closes)) != 0)) kw_args--; + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_candles)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("SDV", 1, 2, 2, 1); __PYX_ERR(0, 20, __pyx_L3_error) + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n); + if (value) { values[1] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "SDV") < 0)) __PYX_ERR(0, 20, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "UPTREND") < 0)) __PYX_ERR(0, 11, __pyx_L3_error) } - } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { - goto __pyx_L5_argtuple_error; } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } } - __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 20, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L3_error) + __pyx_v_candles = values[0]; + __pyx_v_n = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("SDV", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 20, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("UPTREND", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 11, __pyx_L3_error) __pyx_L3_error:; - __Pyx_AddTraceback("indicators.SDV", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.UPTREND", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_2SDV(__pyx_self, __pyx_v_closes, __pyx_v_period); + __pyx_r = __pyx_pf_4test_2UPTREND(__pyx_self, __pyx_v_candles, __pyx_v_n); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10indicators_2SDV(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period) { +static PyObject *__pyx_pf_4test_2UPTREND(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_candles, PyObject *__pyx_v_n) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("SDV", 0); + struct __pyx_opt_args_4test_UPTREND __pyx_t_2; + __Pyx_RefNannySetupContext("UPTREND", 0); __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 20, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_f_10indicators_SDV(__pyx_v_closes, __pyx_v_period, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error) + __pyx_t_2.__pyx_n = 1; + __pyx_t_2.n = __pyx_v_n; + __pyx_t_1 = __pyx_f_4test_UPTREND(__pyx_v_candles, 0, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -2751,55 +2475,197 @@ static PyObject *__pyx_pf_10indicators_2SDV(CYTHON_UNUSED PyObject *__pyx_self, /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.SDV", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.UPTREND", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_closes, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "indicators.pyx":35 +/* "indicators.pyx":26 + * + * + * cdef SDV(double[:] closes, period): # <<<<<<<<<<<<<< + * cdef length = len(closes) + * cdef float mean = SMA(closes, period) + */ + +static PyObject *__pyx_f_4test_SDV(__Pyx_memviewslice __pyx_v_closes, PyObject *__pyx_v_period) { + PyObject *__pyx_v_length = 0; + float __pyx_v_mean; + float __pyx_v_x_i; + int __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + size_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + float __pyx_t_4; + long __pyx_t_5; + long __pyx_t_6; + long __pyx_t_7; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("SDV", 0); + + /* "indicators.pyx":27 + * + * cdef SDV(double[:] closes, period): + * cdef length = len(closes) # <<<<<<<<<<<<<< + * cdef float mean = SMA(closes, period) + * cdef float x_i = 0.0 + */ + __pyx_t_1 = __Pyx_MemoryView_Len(__pyx_v_closes); + __pyx_t_2 = __Pyx_PyInt_FromSize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 27, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_length = __pyx_t_2; + __pyx_t_2 = 0; + + /* "indicators.pyx":28 + * cdef SDV(double[:] closes, period): + * cdef length = len(closes) + * cdef float mean = SMA(closes, period) # <<<<<<<<<<<<<< + * cdef float x_i = 0.0 + * cdef int i + */ + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_period); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 28, __pyx_L1_error) + __pyx_t_2 = __pyx_f_4test_SMA(__pyx_v_closes, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_2); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_mean = __pyx_t_4; + + /* "indicators.pyx":29 + * cdef length = len(closes) + * cdef float mean = SMA(closes, period) + * cdef float x_i = 0.0 # <<<<<<<<<<<<<< + * cdef int i + * for i in xrange((length - period), length): + */ + __pyx_v_x_i = 0.0; + + /* "indicators.pyx":31 + * cdef float x_i = 0.0 + * cdef int i + * for i in xrange((length - period), length): # <<<<<<<<<<<<<< + * x_i += (closes[i] - mean) ** 2 + * return (x_i/(period-1)) + */ + __pyx_t_5 = __Pyx_PyInt_As_long(__pyx_v_length); if (unlikely((__pyx_t_5 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 31, __pyx_L1_error) + __pyx_t_2 = PyNumber_Subtract(__pyx_v_length, __pyx_v_period); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = __Pyx_PyInt_As_long(__pyx_t_2); if (unlikely((__pyx_t_6 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 31, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_7 = __pyx_t_5; + for (__pyx_t_3 = __pyx_t_6; __pyx_t_3 < __pyx_t_7; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "indicators.pyx":32 + * cdef int i + * for i in xrange((length - period), length): + * x_i += (closes[i] - mean) ** 2 # <<<<<<<<<<<<<< + * return (x_i/(period-1)) + * + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = -1; + if (__pyx_t_8 < 0) { + __pyx_t_8 += __pyx_v_closes.shape[0]; + if (unlikely(__pyx_t_8 < 0)) __pyx_t_9 = 0; + } else if (unlikely(__pyx_t_8 >= __pyx_v_closes.shape[0])) __pyx_t_9 = 0; + if (unlikely(__pyx_t_9 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_9); + __PYX_ERR(0, 32, __pyx_L1_error) + } + __pyx_v_x_i = (__pyx_v_x_i + pow(((*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_8 * __pyx_v_closes.strides[0]) ))) - __pyx_v_mean), 2.0)); + } + + /* "indicators.pyx":33 + * for i in xrange((length - period), length): + * x_i += (closes[i] - mean) ** 2 + * return (x_i/(period-1)) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_x_i); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 33, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_10 = __Pyx_PyInt_SubtractObjC(__pyx_v_period, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 33, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = __Pyx_PyNumber_Divide(__pyx_t_2, __pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 33, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_r = __pyx_t_11; + __pyx_t_11 = 0; + goto __pyx_L0; + + /* "indicators.pyx":26 + * + * + * cdef SDV(double[:] closes, period): # <<<<<<<<<<<<<< + * cdef length = len(closes) + * cdef float mean = SMA(closes, period) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("test.SDV", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "indicators.pyx":36 + * * - * #TODO add lower retracement - * cpdef (float, float, float) FIB(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Fibonacci retracement equation; currently only support upper retracement + * cpdef FIB(list candles, int period): # <<<<<<<<<<<<<< + * cdef float low = 100000 + * cdef float high = 0 */ -static PyObject *__pyx_pw_10indicators_5FIB(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static __pyx_ctuple_float__and_float__and_float __pyx_f_10indicators_FIB(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { +static PyObject *__pyx_pw_4test_5FIB(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_f_4test_FIB(PyObject *__pyx_v_candles, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { float __pyx_v_low; float __pyx_v_high; float __pyx_v_diff; int __pyx_v_i; int __pyx_v_length; - __pyx_ctuple_float__and_float__and_float __pyx_r; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; + Py_ssize_t __pyx_t_1; int __pyx_t_2; int __pyx_t_3; - Py_ssize_t __pyx_t_4; + int __pyx_t_4; int __pyx_t_5; - int __pyx_t_6; - Py_ssize_t __pyx_t_7; - Py_ssize_t __pyx_t_8; - Py_ssize_t __pyx_t_9; - __pyx_ctuple_float__and_float__and_float __pyx_t_10; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + double __pyx_t_8; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; __Pyx_RefNannySetupContext("FIB", 0); - /* "indicators.pyx":41 - * @param period: period to calculate for - * """ + /* "indicators.pyx":37 + * + * cpdef FIB(list candles, int period): * cdef float low = 100000 # <<<<<<<<<<<<<< * cdef float high = 0 * cdef float diff */ __pyx_v_low = 100000.0; - /* "indicators.pyx":42 - * """ + /* "indicators.pyx":38 + * cpdef FIB(list candles, int period): * cdef float low = 100000 * cdef float high = 0 # <<<<<<<<<<<<<< * cdef float diff @@ -2807,174 +2673,224 @@ static __pyx_ctuple_float__and_float__and_float __pyx_f_10indicators_FIB(__Pyx_m */ __pyx_v_high = 0.0; - /* "indicators.pyx":45 + /* "indicators.pyx":41 * cdef float diff * cdef int i - * cdef int length = closes.shape[0] # <<<<<<<<<<<<<< + * cdef int length = len(candles) # <<<<<<<<<<<<<< * for i in xrange(length - period, length): - * if closes[i] < low: + * if float(candles[i]['close']) < low and float(candles[i]['close'] > 1): */ - __pyx_v_length = (__pyx_v_closes.shape[0]); + if (unlikely(__pyx_v_candles == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_1 = PyList_GET_SIZE(__pyx_v_candles); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_v_length = __pyx_t_1; - /* "indicators.pyx":46 + /* "indicators.pyx":42 * cdef int i - * cdef int length = closes.shape[0] + * cdef int length = len(candles) * for i in xrange(length - period, length): # <<<<<<<<<<<<<< - * if closes[i] < low: - * low = closes[i] + * if float(candles[i]['close']) < low and float(candles[i]['close'] > 1): + * low = float(candles[i]['close']) */ - __pyx_t_1 = __pyx_v_length; - __pyx_t_2 = __pyx_t_1; - for (__pyx_t_3 = (__pyx_v_length - __pyx_v_period); __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { - __pyx_v_i = __pyx_t_3; + __pyx_t_2 = __pyx_v_length; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = (__pyx_v_length - __pyx_v_period); __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; - /* "indicators.pyx":47 - * cdef int length = closes.shape[0] + /* "indicators.pyx":43 + * cdef int length = len(candles) * for i in xrange(length - period, length): - * if closes[i] < low: # <<<<<<<<<<<<<< - * low = closes[i] - * if closes[i] > high: - */ - __pyx_t_4 = __pyx_v_i; - __pyx_t_5 = -1; - if (__pyx_t_4 < 0) { - __pyx_t_4 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_4 < 0)) __pyx_t_5 = 0; - } else if (unlikely(__pyx_t_4 >= __pyx_v_closes.shape[0])) __pyx_t_5 = 0; - if (unlikely(__pyx_t_5 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 47, __pyx_L1_error) - } - __pyx_t_6 = (((*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_4 * __pyx_v_closes.strides[0]) ))) < __pyx_v_low) != 0); - if (__pyx_t_6) { - - /* "indicators.pyx":48 + * if float(candles[i]['close']) < low and float(candles[i]['close'] > 1): # <<<<<<<<<<<<<< + * low = float(candles[i]['close']) + * if float(candles[i]['close']) > high: + */ + if (unlikely(__pyx_v_candles == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 43, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_List(__pyx_v_candles, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Dict_GetItem(__pyx_t_6, __pyx_n_s_close); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_8 = __Pyx_PyObject_AsDouble(__pyx_t_7); if (unlikely(__pyx_t_8 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_9 = ((__pyx_t_8 < __pyx_v_low) != 0); + if (__pyx_t_9) { + } else { + __pyx_t_5 = __pyx_t_9; + goto __pyx_L6_bool_binop_done; + } + if (unlikely(__pyx_v_candles == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 43, __pyx_L1_error) + } + __pyx_t_7 = __Pyx_GetItemInt_List(__pyx_v_candles, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_Dict_GetItem(__pyx_t_7, __pyx_n_s_close); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_8 = __Pyx_PyObject_AsDouble(__pyx_t_7); if (unlikely(__pyx_t_8 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_9 = (__pyx_t_8 != 0); + __pyx_t_5 = __pyx_t_9; + __pyx_L6_bool_binop_done:; + if (__pyx_t_5) { + + /* "indicators.pyx":44 * for i in xrange(length - period, length): - * if closes[i] < low: - * low = closes[i] # <<<<<<<<<<<<<< - * if closes[i] > high: - * high = closes[i] - */ - __pyx_t_7 = __pyx_v_i; - __pyx_t_5 = -1; - if (__pyx_t_7 < 0) { - __pyx_t_7 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_7 < 0)) __pyx_t_5 = 0; - } else if (unlikely(__pyx_t_7 >= __pyx_v_closes.shape[0])) __pyx_t_5 = 0; - if (unlikely(__pyx_t_5 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 48, __pyx_L1_error) + * if float(candles[i]['close']) < low and float(candles[i]['close'] > 1): + * low = float(candles[i]['close']) # <<<<<<<<<<<<<< + * if float(candles[i]['close']) > high: + * high = float(candles[i]['close']) + */ + if (unlikely(__pyx_v_candles == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 44, __pyx_L1_error) } - __pyx_v_low = (*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_7 * __pyx_v_closes.strides[0]) ))); + __pyx_t_7 = __Pyx_GetItemInt_List(__pyx_v_candles, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_Dict_GetItem(__pyx_t_7, __pyx_n_s_close); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_8 = __Pyx_PyObject_AsDouble(__pyx_t_6); if (unlikely(__pyx_t_8 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_low = __pyx_t_8; - /* "indicators.pyx":47 - * cdef int length = closes.shape[0] + /* "indicators.pyx":43 + * cdef int length = len(candles) * for i in xrange(length - period, length): - * if closes[i] < low: # <<<<<<<<<<<<<< - * low = closes[i] - * if closes[i] > high: + * if float(candles[i]['close']) < low and float(candles[i]['close'] > 1): # <<<<<<<<<<<<<< + * low = float(candles[i]['close']) + * if float(candles[i]['close']) > high: */ } - /* "indicators.pyx":49 - * if closes[i] < low: - * low = closes[i] - * if closes[i] > high: # <<<<<<<<<<<<<< - * high = closes[i] + /* "indicators.pyx":45 + * if float(candles[i]['close']) < low and float(candles[i]['close'] > 1): + * low = float(candles[i]['close']) + * if float(candles[i]['close']) > high: # <<<<<<<<<<<<<< + * high = float(candles[i]['close']) * */ - __pyx_t_8 = __pyx_v_i; - __pyx_t_5 = -1; - if (__pyx_t_8 < 0) { - __pyx_t_8 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_8 < 0)) __pyx_t_5 = 0; - } else if (unlikely(__pyx_t_8 >= __pyx_v_closes.shape[0])) __pyx_t_5 = 0; - if (unlikely(__pyx_t_5 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 49, __pyx_L1_error) + if (unlikely(__pyx_v_candles == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 45, __pyx_L1_error) } - __pyx_t_6 = (((*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_8 * __pyx_v_closes.strides[0]) ))) > __pyx_v_high) != 0); - if (__pyx_t_6) { + __pyx_t_6 = __Pyx_GetItemInt_List(__pyx_v_candles, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 45, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Dict_GetItem(__pyx_t_6, __pyx_n_s_close); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 45, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_8 = __Pyx_PyObject_AsDouble(__pyx_t_7); if (unlikely(__pyx_t_8 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_5 = ((__pyx_t_8 > __pyx_v_high) != 0); + if (__pyx_t_5) { - /* "indicators.pyx":50 - * low = closes[i] - * if closes[i] > high: - * high = closes[i] # <<<<<<<<<<<<<< + /* "indicators.pyx":46 + * low = float(candles[i]['close']) + * if float(candles[i]['close']) > high: + * high = float(candles[i]['close']) # <<<<<<<<<<<<<< * * diff = high - low */ - __pyx_t_9 = __pyx_v_i; - __pyx_t_5 = -1; - if (__pyx_t_9 < 0) { - __pyx_t_9 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_9 < 0)) __pyx_t_5 = 0; - } else if (unlikely(__pyx_t_9 >= __pyx_v_closes.shape[0])) __pyx_t_5 = 0; - if (unlikely(__pyx_t_5 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 50, __pyx_L1_error) + if (unlikely(__pyx_v_candles == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 46, __pyx_L1_error) } - __pyx_v_high = (*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_9 * __pyx_v_closes.strides[0]) ))); + __pyx_t_7 = __Pyx_GetItemInt_List(__pyx_v_candles, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_Dict_GetItem(__pyx_t_7, __pyx_n_s_close); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_8 = __Pyx_PyObject_AsDouble(__pyx_t_6); if (unlikely(__pyx_t_8 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_high = __pyx_t_8; - /* "indicators.pyx":49 - * if closes[i] < low: - * low = closes[i] - * if closes[i] > high: # <<<<<<<<<<<<<< - * high = closes[i] + /* "indicators.pyx":45 + * if float(candles[i]['close']) < low and float(candles[i]['close'] > 1): + * low = float(candles[i]['close']) + * if float(candles[i]['close']) > high: # <<<<<<<<<<<<<< + * high = float(candles[i]['close']) * */ } } - /* "indicators.pyx":52 - * high = closes[i] + /* "indicators.pyx":48 + * high = float(candles[i]['close']) * * diff = high - low # <<<<<<<<<<<<<< - * return float(high - (0.236 * diff)), float(high - (0.382 * diff)), float(high - (0.618 * diff)) + * return (high - (0.236 * diff)), (high - (0.382 * diff)), (high - (0.618 * diff)) * */ __pyx_v_diff = (__pyx_v_high - __pyx_v_low); - /* "indicators.pyx":53 + /* "indicators.pyx":49 * * diff = high - low - * return float(high - (0.236 * diff)), float(high - (0.382 * diff)), float(high - (0.618 * diff)) # <<<<<<<<<<<<<< + * return (high - (0.236 * diff)), (high - (0.382 * diff)), (high - (0.618 * diff)) # <<<<<<<<<<<<<< * * */ - __pyx_t_10.f0 = (__pyx_v_high - (0.236 * __pyx_v_diff)); - __pyx_t_10.f1 = (__pyx_v_high - (0.382 * __pyx_v_diff)); - __pyx_t_10.f2 = (__pyx_v_high - (0.618 * __pyx_v_diff)); - __pyx_r = __pyx_t_10; + __Pyx_XDECREF(__pyx_r); + __pyx_t_6 = PyFloat_FromDouble((__pyx_v_high - (0.236 * __pyx_v_diff))); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyFloat_FromDouble((__pyx_v_high - (0.382 * __pyx_v_diff))); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_10 = PyFloat_FromDouble((__pyx_v_high - (0.618 * __pyx_v_diff))); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_10); + PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_t_10); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_10 = 0; + __pyx_r = __pyx_t_11; + __pyx_t_11 = 0; goto __pyx_L0; - /* "indicators.pyx":35 + /* "indicators.pyx":36 * - * #TODO add lower retracement - * cpdef (float, float, float) FIB(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Fibonacci retracement equation; currently only support upper retracement - */ - + * + * cpdef FIB(list candles, int period): # <<<<<<<<<<<<<< + * cdef float low = 100000 + * cdef float high = 0 + */ + /* function exit code */ __pyx_L1_error:; - __Pyx_WriteUnraisable("indicators.FIB", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); - __Pyx_pretend_to_initialize(&__pyx_r); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("test.FIB", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ -static PyObject *__pyx_pw_10indicators_5FIB(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_4FIB[] = "\n Fibonacci retracement equation; currently only support upper retracement\n @param closes: list of candle dictionaries in format {''} \n @param period: period to calculate for \n "; -static PyObject *__pyx_pw_10indicators_5FIB(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - __Pyx_memviewslice __pyx_v_closes = { 0, 0, { 0 }, { 0 }, { 0 } }; +static PyObject *__pyx_pw_4test_5FIB(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_4test_5FIB(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_candles = 0; int __pyx_v_period; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("FIB (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_closes,&__pyx_n_s_period,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_candles,&__pyx_n_s_period,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; @@ -2990,17 +2906,17 @@ static PyObject *__pyx_pw_10indicators_5FIB(PyObject *__pyx_self, PyObject *__py kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_closes)) != 0)) kw_args--; + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_candles)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("FIB", 1, 2, 2, 1); __PYX_ERR(0, 35, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("FIB", 1, 2, 2, 1); __PYX_ERR(0, 36, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "FIB") < 0)) __PYX_ERR(0, 35, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "FIB") < 0)) __PYX_ERR(0, 36, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -3008,32 +2924,36 @@ static PyObject *__pyx_pw_10indicators_5FIB(PyObject *__pyx_self, PyObject *__py values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } - __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 35, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + __pyx_v_candles = ((PyObject*)values[0]); + __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 36, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("FIB", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 35, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("FIB", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 36, __pyx_L3_error) __pyx_L3_error:; - __Pyx_AddTraceback("indicators.FIB", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.FIB", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_4FIB(__pyx_self, __pyx_v_closes, __pyx_v_period); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_candles), (&PyList_Type), 1, "candles", 1))) __PYX_ERR(0, 36, __pyx_L1_error) + __pyx_r = __pyx_pf_4test_4FIB(__pyx_self, __pyx_v_candles, __pyx_v_period); /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10indicators_4FIB(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period) { +static PyObject *__pyx_pf_4test_4FIB(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_candles, int __pyx_v_period) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("FIB", 0); __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 35, __pyx_L1_error) } - __pyx_t_1 = __pyx_convert__to_py___pyx_ctuple_float__and_float__and_float(__pyx_f_10indicators_FIB(__pyx_v_closes, __pyx_v_period, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_t_1 = __pyx_f_4test_FIB(__pyx_v_candles, __pyx_v_period, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 36, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -3042,96 +2962,130 @@ static PyObject *__pyx_pf_10indicators_4FIB(CYTHON_UNUSED PyObject *__pyx_self, /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.FIB", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.FIB", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_closes, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "indicators.pyx":57 +/* "indicators.pyx":53 * * - * cpdef (float, float, float) BOLINGER_BANDS(double[:] closes, int period, int numberOfSDV): # <<<<<<<<<<<<<< - * """ - * Bolinger Band calculations function + * cpdef BOLINGER_BANDES(double[:] closes, int period): # <<<<<<<<<<<<<< + * # * Middle Band = 20-day simple moving average (SMA) + * # * Upper Band = 20-day SMA + (20-day standard deviation of price x 2) */ -static PyObject *__pyx_pw_10indicators_7BOLINGER_BANDS(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static __pyx_ctuple_float__and_float__and_float __pyx_f_10indicators_BOLINGER_BANDS(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, int __pyx_v_numberOfSDV, CYTHON_UNUSED int __pyx_skip_dispatch) { +static PyObject *__pyx_pw_4test_7BOLINGER_BANDES(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_f_4test_BOLINGER_BANDES(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { float __pyx_v_sdv; float __pyx_v_sma; - __pyx_ctuple_float__and_float__and_float __pyx_r; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - __pyx_ctuple_float__and_float__and_float __pyx_t_1; - __Pyx_RefNannySetupContext("BOLINGER_BANDS", 0); + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + float __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("BOLINGER_BANDES", 0); - /* "indicators.pyx":63 - * @param period: period to calculate for - * """ + /* "indicators.pyx":57 + * # * Upper Band = 20-day SMA + (20-day standard deviation of price x 2) + * # * Lower Band = 20-day SMA - (20-day standard deviation of price x 2) * cdef float sdv = SDV(closes, period) # <<<<<<<<<<<<<< * cdef float sma = SMA(closes, period) - * return (sma), (sma + sdv * numberOfSDV), (sma - sdv * numberOfSDV) + * return (sma), (sma + sdv*2), (sma - sdv*2) */ - __pyx_v_sdv = __pyx_f_10indicators_SDV(__pyx_v_closes, __pyx_v_period, 0); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_period); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_f_4test_SDV(__pyx_v_closes, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __pyx_PyFloat_AsFloat(__pyx_t_2); if (unlikely((__pyx_t_3 == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_sdv = __pyx_t_3; - /* "indicators.pyx":64 - * """ + /* "indicators.pyx":58 + * # * Lower Band = 20-day SMA - (20-day standard deviation of price x 2) * cdef float sdv = SDV(closes, period) * cdef float sma = SMA(closes, period) # <<<<<<<<<<<<<< - * return (sma), (sma + sdv * numberOfSDV), (sma - sdv * numberOfSDV) + * return (sma), (sma + sdv*2), (sma - sdv*2) * */ - __pyx_v_sma = __pyx_f_10indicators_SMA(__pyx_v_closes, __pyx_v_period, 0); + __pyx_t_2 = __pyx_f_4test_SMA(__pyx_v_closes, __pyx_v_period, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __pyx_PyFloat_AsFloat(__pyx_t_2); if (unlikely((__pyx_t_3 == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_sma = __pyx_t_3; - /* "indicators.pyx":65 + /* "indicators.pyx":59 * cdef float sdv = SDV(closes, period) * cdef float sma = SMA(closes, period) - * return (sma), (sma + sdv * numberOfSDV), (sma - sdv * numberOfSDV) # <<<<<<<<<<<<<< + * return (sma), (sma + sdv*2), (sma - sdv*2) # <<<<<<<<<<<<<< * * */ - __pyx_t_1.f0 = __pyx_v_sma; - __pyx_t_1.f1 = (__pyx_v_sma + (__pyx_v_sdv * __pyx_v_numberOfSDV)); - __pyx_t_1.f2 = (__pyx_v_sma - (__pyx_v_sdv * __pyx_v_numberOfSDV)); - __pyx_r = __pyx_t_1; + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_sma); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 59, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyFloat_FromDouble((__pyx_v_sma + (__pyx_v_sdv * 2.0))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 59, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = PyFloat_FromDouble((__pyx_v_sma - (__pyx_v_sdv * 2.0))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 59, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 59, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_4); + __pyx_t_2 = 0; + __pyx_t_1 = 0; + __pyx_t_4 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; goto __pyx_L0; - /* "indicators.pyx":57 + /* "indicators.pyx":53 * * - * cpdef (float, float, float) BOLINGER_BANDS(double[:] closes, int period, int numberOfSDV): # <<<<<<<<<<<<<< - * """ - * Bolinger Band calculations function + * cpdef BOLINGER_BANDES(double[:] closes, int period): # <<<<<<<<<<<<<< + * # * Middle Band = 20-day simple moving average (SMA) + * # * Upper Band = 20-day SMA + (20-day standard deviation of price x 2) */ /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("test.BOLINGER_BANDES", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ -static PyObject *__pyx_pw_10indicators_7BOLINGER_BANDS(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_6BOLINGER_BANDS[] = "\n Bolinger Band calculations function \n @param closes: list of closing candle prices \n @param period: period to calculate for \n "; -static PyObject *__pyx_pw_10indicators_7BOLINGER_BANDS(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4test_7BOLINGER_BANDES(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_4test_7BOLINGER_BANDES(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_closes = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_period; - int __pyx_v_numberOfSDV; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("BOLINGER_BANDS (wrapper)", 0); + __Pyx_RefNannySetupContext("BOLINGER_BANDES (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_closes,&__pyx_n_s_period,&__pyx_n_s_numberOfSDV,0}; - PyObject* values[3] = {0,0,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_closes,&__pyx_n_s_period,0}; + PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); @@ -3148,52 +3102,44 @@ static PyObject *__pyx_pw_10indicators_7BOLINGER_BANDS(PyObject *__pyx_self, PyO case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("BOLINGER_BANDS", 1, 3, 3, 1); __PYX_ERR(0, 57, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_numberOfSDV)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("BOLINGER_BANDS", 1, 3, 3, 2); __PYX_ERR(0, 57, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("BOLINGER_BANDES", 1, 2, 2, 1); __PYX_ERR(0, 53, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "BOLINGER_BANDS") < 0)) __PYX_ERR(0, 57, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "BOLINGER_BANDES") < 0)) __PYX_ERR(0, 53, __pyx_L3_error) } - } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } - __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 57, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 57, __pyx_L3_error) - __pyx_v_numberOfSDV = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_numberOfSDV == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 57, __pyx_L3_error) + __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 53, __pyx_L3_error) + __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 53, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("BOLINGER_BANDS", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 57, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("BOLINGER_BANDES", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 53, __pyx_L3_error) __pyx_L3_error:; - __Pyx_AddTraceback("indicators.BOLINGER_BANDS", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.BOLINGER_BANDES", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_6BOLINGER_BANDS(__pyx_self, __pyx_v_closes, __pyx_v_period, __pyx_v_numberOfSDV); + __pyx_r = __pyx_pf_4test_6BOLINGER_BANDES(__pyx_self, __pyx_v_closes, __pyx_v_period); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10indicators_6BOLINGER_BANDS(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, int __pyx_v_numberOfSDV) { +static PyObject *__pyx_pf_4test_6BOLINGER_BANDES(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("BOLINGER_BANDS", 0); + __Pyx_RefNannySetupContext("BOLINGER_BANDES", 0); __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 57, __pyx_L1_error) } - __pyx_t_1 = __pyx_convert__to_py___pyx_ctuple_float__and_float__and_float(__pyx_f_10indicators_BOLINGER_BANDS(__pyx_v_closes, __pyx_v_period, __pyx_v_numberOfSDV, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 57, __pyx_L1_error) + if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 53, __pyx_L1_error) } + __pyx_t_1 = __pyx_f_4test_BOLINGER_BANDES(__pyx_v_closes, __pyx_v_period, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -3202,7 +3148,7 @@ static PyObject *__pyx_pf_10indicators_6BOLINGER_BANDS(CYTHON_UNUSED PyObject *_ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.BOLINGER_BANDS", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.BOLINGER_BANDES", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __PYX_XDEC_MEMVIEW(&__pyx_v_closes, 1); @@ -3211,110 +3157,106 @@ static PyObject *__pyx_pf_10indicators_6BOLINGER_BANDS(CYTHON_UNUSED PyObject *_ return __pyx_r; } -/* "indicators.pyx":68 +/* "indicators.pyx":62 * * - * cpdef float MOMENTUM(double [:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Momentum function + * cpdef MOMENTUM(double [:] closes, int period): # <<<<<<<<<<<<<< + * cdef length = closes.shape[0] + * return closes[length] - closes[length-period] */ -static PyObject *__pyx_pw_10indicators_9MOMENTUM(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static float __pyx_f_10indicators_MOMENTUM(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { - int __pyx_v_length; - float __pyx_r; +static PyObject *__pyx_pw_4test_9MOMENTUM(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_f_4test_MOMENTUM(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { + PyObject *__pyx_v_length = 0; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; - int __pyx_t_3; - Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + Py_ssize_t __pyx_t_7; __Pyx_RefNannySetupContext("MOMENTUM", 0); - /* "indicators.pyx":74 - * @param period: period to calculate for - * """ - * print(closes) # <<<<<<<<<<<<<< - * print(period) - * cdef int length = closes.shape[0] - */ - __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_closes, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (__Pyx_PrintOne(0, __pyx_t_1) < 0) __PYX_ERR(0, 74, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "indicators.pyx":75 - * """ - * print(closes) - * print(period) # <<<<<<<<<<<<<< - * cdef int length = closes.shape[0] - * return closes[length-1] - closes[length-period-1] - */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_period); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 75, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (__Pyx_PrintOne(0, __pyx_t_1) < 0) __PYX_ERR(0, 75, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "indicators.pyx":76 - * print(closes) - * print(period) - * cdef int length = closes.shape[0] # <<<<<<<<<<<<<< - * return closes[length-1] - closes[length-period-1] + /* "indicators.pyx":63 + * + * cpdef MOMENTUM(double [:] closes, int period): + * cdef length = closes.shape[0] # <<<<<<<<<<<<<< + * return closes[length] - closes[length-period] * */ - __pyx_v_length = (__pyx_v_closes.shape[0]); + __pyx_t_1 = PyInt_FromSsize_t((__pyx_v_closes.shape[0])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_length = __pyx_t_1; + __pyx_t_1 = 0; - /* "indicators.pyx":77 - * print(period) - * cdef int length = closes.shape[0] - * return closes[length-1] - closes[length-period-1] # <<<<<<<<<<<<<< - * + /* "indicators.pyx":64 + * cpdef MOMENTUM(double [:] closes, int period): + * cdef length = closes.shape[0] + * return closes[length] - closes[length-period] # <<<<<<<<<<<<<< * + * # cpdef EMA(np.array closes, int period): */ - __pyx_t_2 = (__pyx_v_length - 1); - __pyx_t_3 = -1; - if (__pyx_t_2 < 0) { - __pyx_t_2 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0; - } else if (unlikely(__pyx_t_2 >= __pyx_v_closes.shape[0])) __pyx_t_3 = 0; - if (unlikely(__pyx_t_3 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_3); - __PYX_ERR(0, 77, __pyx_L1_error) + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_length); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L1_error) + __pyx_t_3 = __pyx_t_2; + __pyx_t_4 = -1; + if (__pyx_t_3 < 0) { + __pyx_t_3 += __pyx_v_closes.shape[0]; + if (unlikely(__pyx_t_3 < 0)) __pyx_t_4 = 0; + } else if (unlikely(__pyx_t_3 >= __pyx_v_closes.shape[0])) __pyx_t_4 = 0; + if (unlikely(__pyx_t_4 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_4); + __PYX_ERR(0, 64, __pyx_L1_error) } - __pyx_t_4 = ((__pyx_v_length - __pyx_v_period) - 1); - __pyx_t_3 = -1; - if (__pyx_t_4 < 0) { - __pyx_t_4 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_4 < 0)) __pyx_t_3 = 0; - } else if (unlikely(__pyx_t_4 >= __pyx_v_closes.shape[0])) __pyx_t_3 = 0; - if (unlikely(__pyx_t_3 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_3); - __PYX_ERR(0, 77, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_period); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = PyNumber_Subtract(__pyx_v_length, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_7 = __pyx_t_6; + __pyx_t_4 = -1; + if (__pyx_t_7 < 0) { + __pyx_t_7 += __pyx_v_closes.shape[0]; + if (unlikely(__pyx_t_7 < 0)) __pyx_t_4 = 0; + } else if (unlikely(__pyx_t_7 >= __pyx_v_closes.shape[0])) __pyx_t_4 = 0; + if (unlikely(__pyx_t_4 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_4); + __PYX_ERR(0, 64, __pyx_L1_error) } - __pyx_r = ((*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_2 * __pyx_v_closes.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_4 * __pyx_v_closes.strides[0]) )))); + __pyx_t_5 = PyFloat_FromDouble(((*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_3 * __pyx_v_closes.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_7 * __pyx_v_closes.strides[0]) ))))); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; goto __pyx_L0; - /* "indicators.pyx":68 + /* "indicators.pyx":62 * * - * cpdef float MOMENTUM(double [:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Momentum function + * cpdef MOMENTUM(double [:] closes, int period): # <<<<<<<<<<<<<< + * cdef length = closes.shape[0] + * return closes[length] - closes[length-period] */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_WriteUnraisable("indicators.MOMENTUM", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("test.MOMENTUM", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ -static PyObject *__pyx_pw_10indicators_9MOMENTUM(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_8MOMENTUM[] = "\n Momentum function \n @param closes: list of closing candle prices \n @param period: period to calculate for \n "; -static PyObject *__pyx_pw_10indicators_9MOMENTUM(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4test_9MOMENTUM(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_4test_9MOMENTUM(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_closes = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_period; PyObject *__pyx_r = 0; @@ -3343,11 +3285,11 @@ static PyObject *__pyx_pw_10indicators_9MOMENTUM(PyObject *__pyx_self, PyObject case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("MOMENTUM", 1, 2, 2, 1); __PYX_ERR(0, 68, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("MOMENTUM", 1, 2, 2, 1); __PYX_ERR(0, 62, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "MOMENTUM") < 0)) __PYX_ERR(0, 68, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "MOMENTUM") < 0)) __PYX_ERR(0, 62, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -3355,32 +3297,32 @@ static PyObject *__pyx_pw_10indicators_9MOMENTUM(PyObject *__pyx_self, PyObject values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } - __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 68, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 68, __pyx_L3_error) + __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 62, __pyx_L3_error) + __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 62, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("MOMENTUM", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 68, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("MOMENTUM", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 62, __pyx_L3_error) __pyx_L3_error:; - __Pyx_AddTraceback("indicators.MOMENTUM", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.MOMENTUM", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_8MOMENTUM(__pyx_self, __pyx_v_closes, __pyx_v_period); + __pyx_r = __pyx_pf_4test_8MOMENTUM(__pyx_self, __pyx_v_closes, __pyx_v_period); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10indicators_8MOMENTUM(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period) { +static PyObject *__pyx_pf_4test_8MOMENTUM(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("MOMENTUM", 0); __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 68, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_f_10indicators_MOMENTUM(__pyx_v_closes, __pyx_v_period, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) + if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 62, __pyx_L1_error) } + __pyx_t_1 = __pyx_f_4test_MOMENTUM(__pyx_v_closes, __pyx_v_period, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -3389,7 +3331,7 @@ static PyObject *__pyx_pf_10indicators_8MOMENTUM(CYTHON_UNUSED PyObject *__pyx_s /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.MOMENTUM", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("test.MOMENTUM", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __PYX_XDEC_MEMVIEW(&__pyx_v_closes, 1); @@ -3398,185 +3340,37 @@ static PyObject *__pyx_pf_10indicators_8MOMENTUM(CYTHON_UNUSED PyObject *__pyx_s return __pyx_r; } -/* "indicators.pyx":80 - * - * - * cpdef float WMA(double[:] closes, int period, float weightedFactor): # <<<<<<<<<<<<<< - * """ - * Weighted moving average function - */ - -static PyObject *__pyx_pw_10indicators_11WMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static float __pyx_f_10indicators_WMA(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, float __pyx_v_weightedFactor, CYTHON_UNUSED int __pyx_skip_dispatch) { - int __pyx_v_i; - PyObject *__pyx_v_length = 0; - PyObject *__pyx_v_delta = 0; - PyObject *__pyx_v_ma = 0; - float __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - long __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - long __pyx_t_4; - long __pyx_t_5; - int __pyx_t_6; - Py_ssize_t __pyx_t_7; - int __pyx_t_8; - PyObject *__pyx_t_9 = NULL; - float __pyx_t_10; - __Pyx_RefNannySetupContext("WMA", 0); - - /* "indicators.pyx":87 - * """ - * cdef int i - * cdef length = closes.shape[0] # <<<<<<<<<<<<<< - * cdef delta = period - * cdef ma = 0.0 - */ - __pyx_t_1 = PyInt_FromSsize_t((__pyx_v_closes.shape[0])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 87, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_length = __pyx_t_1; - __pyx_t_1 = 0; - - /* "indicators.pyx":88 - * cdef int i - * cdef length = closes.shape[0] - * cdef delta = period # <<<<<<<<<<<<<< - * cdef ma = 0.0 - * for i in xrange((length-period), length): - */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_period); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_delta = __pyx_t_1; - __pyx_t_1 = 0; - - /* "indicators.pyx":89 - * cdef length = closes.shape[0] - * cdef delta = period - * cdef ma = 0.0 # <<<<<<<<<<<<<< - * for i in xrange((length-period), length): - * ma += closes[i] * (delta/weightedFactor) - */ - __Pyx_INCREF(__pyx_float_0_0); - __pyx_v_ma = __pyx_float_0_0; - - /* "indicators.pyx":90 - * cdef delta = period - * cdef ma = 0.0 - * for i in xrange((length-period), length): # <<<<<<<<<<<<<< - * ma += closes[i] * (delta/weightedFactor) - * delta -= 1 - */ - __pyx_t_2 = __Pyx_PyInt_As_long(__pyx_v_length); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 90, __pyx_L1_error) - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_period); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 90, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyNumber_Subtract(__pyx_v_length, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 90, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_4 = __Pyx_PyInt_As_long(__pyx_t_3); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 90, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_5 = __pyx_t_2; - for (__pyx_t_6 = __pyx_t_4; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; - - /* "indicators.pyx":91 - * cdef ma = 0.0 - * for i in xrange((length-period), length): - * ma += closes[i] * (delta/weightedFactor) # <<<<<<<<<<<<<< - * delta -= 1 - * - */ - __pyx_t_7 = __pyx_v_i; - __pyx_t_8 = -1; - if (__pyx_t_7 < 0) { - __pyx_t_7 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_7 < 0)) __pyx_t_8 = 0; - } else if (unlikely(__pyx_t_7 >= __pyx_v_closes.shape[0])) __pyx_t_8 = 0; - if (unlikely(__pyx_t_8 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_8); - __PYX_ERR(0, 91, __pyx_L1_error) - } - __pyx_t_3 = PyFloat_FromDouble((*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_7 * __pyx_v_closes.strides[0]) )))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 91, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = PyFloat_FromDouble(__pyx_v_weightedFactor); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 91, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = __Pyx_PyNumber_Divide(__pyx_v_delta, __pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 91, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyNumber_Multiply(__pyx_t_3, __pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 91, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_v_ma, __pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 91, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF_SET(__pyx_v_ma, __pyx_t_9); - __pyx_t_9 = 0; - - /* "indicators.pyx":92 - * for i in xrange((length-period), length): - * ma += closes[i] * (delta/weightedFactor) - * delta -= 1 # <<<<<<<<<<<<<< - * - * return ma - */ - __pyx_t_9 = __Pyx_PyInt_SubtractObjC(__pyx_v_delta, __pyx_int_1, 1, 1, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 92, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF_SET(__pyx_v_delta, __pyx_t_9); - __pyx_t_9 = 0; - } - - /* "indicators.pyx":94 - * delta -= 1 - * - * return ma # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_10 = __pyx_PyFloat_AsFloat(__pyx_v_ma); if (unlikely((__pyx_t_10 == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 94, __pyx_L1_error) - __pyx_r = __pyx_t_10; - goto __pyx_L0; - - /* "indicators.pyx":80 +/* "View.MemoryView":122 + * cdef bint dtype_is_object * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): * - * cpdef float WMA(double[:] closes, int period, float weightedFactor): # <<<<<<<<<<<<<< - * """ - * Weighted moving average function */ - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_WriteUnraisable("indicators.WMA", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_length); - __Pyx_XDECREF(__pyx_v_delta); - __Pyx_XDECREF(__pyx_v_ma); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - /* Python wrapper */ -static PyObject *__pyx_pw_10indicators_11WMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_10WMA[] = "\n Weighted moving average function \n @param closes: list of closing candle prices \n @param period: period to calculate for \n "; -static PyObject *__pyx_pw_10indicators_11WMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - __Pyx_memviewslice __pyx_v_closes = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_period; - float __pyx_v_weightedFactor; - PyObject *__pyx_r = 0; +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + int __pyx_r; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("WMA (wrapper)", 0); + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_closes,&__pyx_n_s_period,&__pyx_n_s_weightedFactor,0}; - PyObject* values[3] = {0,0,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + PyObject* values[5] = {0,0,0,0,0}; + values[3] = ((PyObject *)__pyx_n_s_c); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); @@ -3589,1313 +3383,740 @@ static PyObject *__pyx_pw_10indicators_11WMA(PyObject *__pyx_self, PyObject *__p kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_closes)) != 0)) kw_args--; + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_shape)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_itemsize)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("WMA", 1, 3, 3, 1); __PYX_ERR(0, 80, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(1, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_weightedFactor)) != 0)) kw_args--; + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_format)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("WMA", 1, 3, 3, 2); __PYX_ERR(0, 80, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(1, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mode); + if (value) { values[3] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_allocate_buffer); + if (value) { values[4] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "WMA") < 0)) __PYX_ERR(0, 80, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(1, 122, __pyx_L3_error) } - } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { - goto __pyx_L5_argtuple_error; } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } } - __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 80, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 80, __pyx_L3_error) - __pyx_v_weightedFactor = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_weightedFactor == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 80, __pyx_L3_error) - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("WMA", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 80, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("indicators.WMA", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_10WMA(__pyx_self, __pyx_v_closes, __pyx_v_period, __pyx_v_weightedFactor); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 122, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 123, __pyx_L3_error) + } else { -static PyObject *__pyx_pf_10indicators_10WMA(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, float __pyx_v_weightedFactor) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("WMA", 0); - __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 80, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_f_10indicators_WMA(__pyx_v_closes, __pyx_v_period, __pyx_v_weightedFactor, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; + /* "View.MemoryView":123 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 122, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(1, 122, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(1, 122, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":122 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ /* function exit code */ + goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.WMA", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; + __pyx_r = -1; __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_closes, 1); - __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "indicators.pyx":97 - * - * - * cpdef DERIVATIVE(double[:] values, int period): #TODO additional testing # <<<<<<<<<<<<<< - * """ - * Derivate function... interpolates a list of values, derives the list, and returns d/dx list - */ - -static PyObject *__pyx_pw_10indicators_13DERIVATIVE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyObject *__pyx_f_10indicators_DERIVATIVE(__Pyx_memviewslice __pyx_v_values, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { - int __pyx_v_length; - int __pyx_v_j; - __Pyx_memviewslice __pyx_v_xvals = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_yvals = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_i; - PyObject *__pyx_v_dx = NULL; - PyObject *__pyx_v_dy = NULL; - PyObject *__pyx_r = NULL; +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_dim; + PyObject **__pyx_v_p; + char __pyx_v_order; + int __pyx_r; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - __Pyx_memviewslice __pyx_t_5 = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_t_6; - int __pyx_t_7; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + char *__pyx_t_7; int __pyx_t_8; Py_ssize_t __pyx_t_9; - int __pyx_t_10; + PyObject *__pyx_t_10 = NULL; Py_ssize_t __pyx_t_11; - __Pyx_RefNannySetupContext("DERIVATIVE", 0); - - /* "indicators.pyx":103 - * @param period: period to calculate for - * """ - * cdef int length = values.shape[0] # <<<<<<<<<<<<<< - * cdef int j = 0 - * cdef double[:] xvals = np.zeros((length-period,)) - */ - __pyx_v_length = (__pyx_v_values.shape[0]); - - /* "indicators.pyx":104 - * """ - * cdef int length = values.shape[0] - * cdef int j = 0 # <<<<<<<<<<<<<< - * cdef double[:] xvals = np.zeros((length-period,)) - * cdef double[:] yvals = np.zeros((length-period,)) - */ - __pyx_v_j = 0; - - /* "indicators.pyx":105 - * cdef int length = values.shape[0] - * cdef int j = 0 - * cdef double[:] xvals = np.zeros((length-period,)) # <<<<<<<<<<<<<< - * cdef double[:] yvals = np.zeros((length-period,)) - * for i in xrange(length - period, length): + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":129 + * cdef PyObject **p + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 105, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 105, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyInt_From_int((__pyx_v_length - __pyx_v_period)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 105, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 105, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); - __pyx_t_2 = 0; - __pyx_t_2 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_2)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_2); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - } + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 129, __pyx_L1_error) } - __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 105, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 105, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_xvals = __pyx_t_5; - __pyx_t_5.memview = NULL; - __pyx_t_5.data = NULL; - - /* "indicators.pyx":106 - * cdef int j = 0 - * cdef double[:] xvals = np.zeros((length-period,)) - * cdef double[:] yvals = np.zeros((length-period,)) # <<<<<<<<<<<<<< - * for i in xrange(length - period, length): - * xvals[j] = j + __pyx_t_1 = PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 129, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":130 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 106, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_length - __pyx_v_period)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 106, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); - __pyx_t_3 = 0; - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 106, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 106, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_yvals = __pyx_t_5; - __pyx_t_5.memview = NULL; - __pyx_t_5.data = NULL; + __pyx_v_self->itemsize = __pyx_v_itemsize; - /* "indicators.pyx":107 - * cdef double[:] xvals = np.zeros((length-period,)) - * cdef double[:] yvals = np.zeros((length-period,)) - * for i in xrange(length - period, length): # <<<<<<<<<<<<<< - * xvals[j] = j - * yvals[j] = SMA(values[0 : i], period) + /* "View.MemoryView":132 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError("Empty shape tuple for cython.array") + * */ - __pyx_t_6 = __pyx_v_length; - __pyx_t_7 = __pyx_t_6; - for (__pyx_t_8 = (__pyx_v_length - __pyx_v_period); __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) { - __pyx_v_i = __pyx_t_8; + __pyx_t_2 = ((!(__pyx_v_self->ndim != 0)) != 0); + if (unlikely(__pyx_t_2)) { - /* "indicators.pyx":108 - * cdef double[:] yvals = np.zeros((length-period,)) - * for i in xrange(length - period, length): - * xvals[j] = j # <<<<<<<<<<<<<< - * yvals[j] = SMA(values[0 : i], period) - * j+=1 - */ - __pyx_t_9 = __pyx_v_j; - __pyx_t_10 = -1; - if (__pyx_t_9 < 0) { - __pyx_t_9 += __pyx_v_xvals.shape[0]; - if (unlikely(__pyx_t_9 < 0)) __pyx_t_10 = 0; - } else if (unlikely(__pyx_t_9 >= __pyx_v_xvals.shape[0])) __pyx_t_10 = 0; - if (unlikely(__pyx_t_10 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_10); - __PYX_ERR(0, 108, __pyx_L1_error) - } - *((double *) ( /* dim=0 */ (__pyx_v_xvals.data + __pyx_t_9 * __pyx_v_xvals.strides[0]) )) = __pyx_v_j; - - /* "indicators.pyx":109 - * for i in xrange(length - period, length): - * xvals[j] = j - * yvals[j] = SMA(values[0 : i], period) # <<<<<<<<<<<<<< - * j+=1 - * dx = np.diff(xvals) - */ - __pyx_t_5.data = __pyx_v_values.data; - __pyx_t_5.memview = __pyx_v_values.memview; - __PYX_INC_MEMVIEW(&__pyx_t_5, 0); - __pyx_t_10 = -1; - if (unlikely(__pyx_memoryview_slice_memviewslice( - &__pyx_t_5, - __pyx_v_values.shape[0], __pyx_v_values.strides[0], __pyx_v_values.suboffsets[0], - 0, - 0, - &__pyx_t_10, - 0, - __pyx_v_i, - 0, - 1, - 1, - 0, - 1) < 0)) -{ - __PYX_ERR(0, 109, __pyx_L1_error) -} - -__pyx_t_11 = __pyx_v_j; - __pyx_t_10 = -1; - if (__pyx_t_11 < 0) { - __pyx_t_11 += __pyx_v_yvals.shape[0]; - if (unlikely(__pyx_t_11 < 0)) __pyx_t_10 = 0; - } else if (unlikely(__pyx_t_11 >= __pyx_v_yvals.shape[0])) __pyx_t_10 = 0; - if (unlikely(__pyx_t_10 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_10); - __PYX_ERR(0, 109, __pyx_L1_error) - } - *((double *) ( /* dim=0 */ (__pyx_v_yvals.data + __pyx_t_11 * __pyx_v_yvals.strides[0]) )) = __pyx_f_10indicators_SMA(__pyx_t_5, __pyx_v_period, 0); - __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); - __pyx_t_5.memview = NULL; - __pyx_t_5.data = NULL; - - /* "indicators.pyx":110 - * xvals[j] = j - * yvals[j] = SMA(values[0 : i], period) - * j+=1 # <<<<<<<<<<<<<< - * dx = np.diff(xvals) - * dy = np.diff(yvals) - */ - __pyx_v_j = (__pyx_v_j + 1); - } + /* "View.MemoryView":133 + * + * if not self.ndim: + * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 133, __pyx_L1_error) - /* "indicators.pyx":111 - * yvals[j] = SMA(values[0 : i], period) - * j+=1 - * dx = np.diff(xvals) # <<<<<<<<<<<<<< - * dy = np.diff(yvals) + /* "View.MemoryView":132 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError("Empty shape tuple for cython.array") * */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_diff); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_xvals, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v_dx = __pyx_t_1; - __pyx_t_1 = 0; - /* "indicators.pyx":112 - * j+=1 - * dx = np.diff(xvals) - * dy = np.diff(yvals) # <<<<<<<<<<<<<< + /* "View.MemoryView":135 + * raise ValueError("Empty shape tuple for cython.array") + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError("itemsize <= 0 for cython.array") * - * return (dy/dx) */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 112, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_diff); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 112, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_yvals, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 112, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 112, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_v_dy = __pyx_t_1; - __pyx_t_1 = 0; + __pyx_t_2 = ((__pyx_v_itemsize <= 0) != 0); + if (unlikely(__pyx_t_2)) { - /* "indicators.pyx":114 - * dy = np.diff(yvals) + /* "View.MemoryView":136 * - * return (dy/dx) # <<<<<<<<<<<<<< + * if itemsize <= 0: + * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< * - * cpdef list EMA(double[:] closes, int period, float alpha = .3, int epsilon = 0): + * if not isinstance(format, bytes): */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyNumber_Divide(__pyx_v_dy, __pyx_v_dx); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 136, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 136, __pyx_L1_error) - /* "indicators.pyx":97 + /* "View.MemoryView":135 + * raise ValueError("Empty shape tuple for cython.array") * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError("itemsize <= 0 for cython.array") * - * cpdef DERIVATIVE(double[:] values, int period): #TODO additional testing # <<<<<<<<<<<<<< - * """ - * Derivate function... interpolates a list of values, derives the list, and returns d/dx list */ + } - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); - __Pyx_AddTraceback("indicators.DERIVATIVE", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_xvals, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_yvals, 1); - __Pyx_XDECREF(__pyx_v_dx); - __Pyx_XDECREF(__pyx_v_dy); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":138 + * raise ValueError("itemsize <= 0 for cython.array") + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_4 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_4) { -/* Python wrapper */ -static PyObject *__pyx_pw_10indicators_13DERIVATIVE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_12DERIVATIVE[] = "\n Derivate function... interpolates a list of values, derives the list, and returns d/dx list \n @param values: to interpolate & derive\n @param period: period to calculate for\n "; -static PyObject *__pyx_pw_10indicators_13DERIVATIVE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - __Pyx_memviewslice __pyx_v_values = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_period; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("DERIVATIVE (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_values,&__pyx_n_s_period,0}; - PyObject* values[2] = {0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_values)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("DERIVATIVE", 1, 2, 2, 1); __PYX_ERR(0, 97, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "DERIVATIVE") < 0)) __PYX_ERR(0, 97, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - } - __pyx_v_values = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_values.memview)) __PYX_ERR(0, 97, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 97, __pyx_L3_error) - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("DERIVATIVE", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 97, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("indicators.DERIVATIVE", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_12DERIVATIVE(__pyx_self, __pyx_v_values, __pyx_v_period); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_10indicators_12DERIVATIVE(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_values, int __pyx_v_period) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("DERIVATIVE", 0); - __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_values.memview)) { __Pyx_RaiseUnboundLocalError("values"); __PYX_ERR(0, 97, __pyx_L1_error) } - __pyx_t_1 = __pyx_f_10indicators_DERIVATIVE(__pyx_v_values, __pyx_v_period, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 97, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.DERIVATIVE", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_values, 1); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "indicators.pyx":116 - * return (dy/dx) + /* "View.MemoryView":139 * - * cpdef list EMA(double[:] closes, int period, float alpha = .3, int epsilon = 0): # <<<<<<<<<<<<<< - * """ - * Exponential moving average function + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format */ - -static PyObject *__pyx_pw_10indicators_15EMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyObject *__pyx_f_10indicators_EMA(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_10indicators_EMA *__pyx_optional_args) { - float __pyx_v_alpha = ((float).3); - int __pyx_v_epsilon = ((int)0); - float __pyx_v_currentWeight; - float __pyx_v_numerator; - float __pyx_v_denominator; - int __pyx_v_i; - int __pyx_v_j; - int __pyx_v_k; - int __pyx_v_length; - double *__pyx_v_results; - double __pyx_v_e; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - int __pyx_t_6; - int __pyx_t_7; - int __pyx_t_8; - Py_ssize_t __pyx_t_9; - int __pyx_t_10; - double *__pyx_t_11; - double *__pyx_t_12; - double *__pyx_t_13; - char const *__pyx_t_14; - PyObject *__pyx_t_15 = NULL; - PyObject *__pyx_t_16 = NULL; - PyObject *__pyx_t_17 = NULL; - PyObject *__pyx_t_18 = NULL; - PyObject *__pyx_t_19 = NULL; - PyObject *__pyx_t_20 = NULL; - PyObject *__pyx_t_21 = NULL; - __Pyx_RefNannySetupContext("EMA", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_alpha = __pyx_optional_args->alpha; - if (__pyx_optional_args->__pyx_n > 1) { - __pyx_v_epsilon = __pyx_optional_args->epsilon; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 139, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); } } - } + __pyx_t_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_6, __pyx_n_s_ASCII) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_n_s_ASCII); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 139, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_3); + __pyx_t_3 = 0; - /* "indicators.pyx":125 - * """ - * - * assert(0 < alpha < 1, ("out of range, alpha='%s'" % alpha)) # <<<<<<<<<<<<<< + /* "View.MemoryView":138 + * raise ValueError("itemsize <= 0 for cython.array") * - * assert(not 0 <= epsilon < alpha, ("out of range, epsilon='%s'" % epsilon)) + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(!Py_OptimizeFlag)) { - __pyx_t_1 = (0.0 < __pyx_v_alpha); - if (__pyx_t_1) { - __pyx_t_1 = (__pyx_v_alpha < 1.0); - } - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 125, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_alpha); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 125, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_out_of_range_alpha_s, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 125, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 125, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4); - __pyx_t_2 = 0; - __pyx_t_4 = 0; - __pyx_t_1 = (PyTuple_GET_SIZE(__pyx_t_3) != 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) { - PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(0, 125, __pyx_L1_error) - } } - #endif - /* "indicators.pyx":127 - * assert(0 < alpha < 1, ("out of range, alpha='%s'" % alpha)) - * - * assert(not 0 <= epsilon < alpha, ("out of range, epsilon='%s'" % epsilon)) # <<<<<<<<<<<<<< + /* "View.MemoryView":140 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format * - * assert(period>0, ("out of range, period='%s'" %period)) */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(!Py_OptimizeFlag)) { - __pyx_t_1 = (0.0 <= __pyx_v_epsilon); - if (__pyx_t_1) { - __pyx_t_1 = (__pyx_v_epsilon < __pyx_v_alpha); - } - __pyx_t_3 = __Pyx_PyBool_FromLong((!(__pyx_t_1 != 0))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 127, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_epsilon); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 127, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_out_of_range_epsilon_s, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 127, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); - __pyx_t_3 = 0; - __pyx_t_2 = 0; - __pyx_t_1 = (PyTuple_GET_SIZE(__pyx_t_4) != 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) { - PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(0, 127, __pyx_L1_error) - } - } - #endif + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_format)->tp_name), 0))) __PYX_ERR(1, 140, __pyx_L1_error) + __pyx_t_3 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; - /* "indicators.pyx":129 - * assert(not 0 <= epsilon < alpha, ("out of range, epsilon='%s'" % epsilon)) + /* "View.MemoryView":141 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * * - * assert(period>0, ("out of range, period='%s'" %period)) # <<<<<<<<<<<<<< - * cdef float currentWeight - * cdef float numerator */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(!Py_OptimizeFlag)) { - __pyx_t_4 = __Pyx_PyBool_FromLong((__pyx_v_period > 0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_period); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_out_of_range_period_s, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3); - __pyx_t_4 = 0; - __pyx_t_3 = 0; - __pyx_t_1 = (PyTuple_GET_SIZE(__pyx_t_2) != 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_1)) { - PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(0, 129, __pyx_L1_error) - } + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(1, 141, __pyx_L1_error) } - #endif - - /* "indicators.pyx":135 - * cdef int i - * cdef int j - * cdef int k = 0 # <<<<<<<<<<<<<< - * cdef int length = closes.shape[0] - * cdef double *results = malloc(sizeof(double)* (period+1)) - */ - __pyx_v_k = 0; + __pyx_t_7 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(1, 141, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_7; - /* "indicators.pyx":136 - * cdef int j - * cdef int k = 0 - * cdef int length = closes.shape[0] # <<<<<<<<<<<<<< - * cdef double *results = malloc(sizeof(double)* (period+1)) + /* "View.MemoryView":144 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim * */ - __pyx_v_length = (__pyx_v_closes.shape[0]); + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); - /* "indicators.pyx":137 - * cdef int k = 0 - * cdef int length = closes.shape[0] - * cdef double *results = malloc(sizeof(double)* (period+1)) # <<<<<<<<<<<<<< + /* "View.MemoryView":145 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< * - * for i in xrange(length-period, length): + * if not self._shape: */ - __pyx_v_results = ((double *)malloc(((sizeof(double)) * (__pyx_v_period + 1)))); + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); - /* "indicators.pyx":139 - * cdef double *results = malloc(sizeof(double)* (period+1)) + /* "View.MemoryView":147 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate shape and strides.") * - * for i in xrange(length-period, length): # <<<<<<<<<<<<<< - * currentWeight = 1.0 - * numerator = 0.0 */ - __pyx_t_5 = __pyx_v_length; - __pyx_t_6 = __pyx_t_5; - for (__pyx_t_7 = (__pyx_v_length - __pyx_v_period); __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { - __pyx_v_i = __pyx_t_7; + __pyx_t_4 = ((!(__pyx_v_self->_shape != 0)) != 0); + if (unlikely(__pyx_t_4)) { - /* "indicators.pyx":140 + /* "View.MemoryView":148 + * + * if not self._shape: + * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< + * * - * for i in xrange(length-period, length): - * currentWeight = 1.0 # <<<<<<<<<<<<<< - * numerator = 0.0 - * denominator = 0.0 */ - __pyx_v_currentWeight = 1.0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 148, __pyx_L1_error) - /* "indicators.pyx":141 - * for i in xrange(length-period, length): - * currentWeight = 1.0 - * numerator = 0.0 # <<<<<<<<<<<<<< - * denominator = 0.0 - * for j in xrange(i, 0, -1): + /* "View.MemoryView":147 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate shape and strides.") + * */ - __pyx_v_numerator = 0.0; + } - /* "indicators.pyx":142 - * currentWeight = 1.0 - * numerator = 0.0 - * denominator = 0.0 # <<<<<<<<<<<<<< - * for j in xrange(i, 0, -1): - * numerator += closes[j] * currentWeight + /* "View.MemoryView":151 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) */ - __pyx_v_denominator = 0.0; + __pyx_t_8 = 0; + __pyx_t_3 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_3); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(1, 151, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 151, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 151, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_9; + __pyx_v_idx = __pyx_t_8; + __pyx_t_8 = (__pyx_t_8 + 1); - /* "indicators.pyx":143 - * numerator = 0.0 - * denominator = 0.0 - * for j in xrange(i, 0, -1): # <<<<<<<<<<<<<< - * numerator += closes[j] * currentWeight - * denominator += currentWeight + /* "View.MemoryView":152 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim */ - for (__pyx_t_8 = __pyx_v_i; __pyx_t_8 > 0; __pyx_t_8-=1) { - __pyx_v_j = __pyx_t_8; + __pyx_t_4 = ((__pyx_v_dim <= 0) != 0); + if (unlikely(__pyx_t_4)) { - /* "indicators.pyx":144 - * denominator = 0.0 - * for j in xrange(i, 0, -1): - * numerator += closes[j] * currentWeight # <<<<<<<<<<<<<< - * denominator += currentWeight + /* "View.MemoryView":153 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) # <<<<<<<<<<<<<< + * self._shape[idx] = dim * */ - __pyx_t_9 = __pyx_v_j; - __pyx_t_10 = -1; - if (__pyx_t_9 < 0) { - __pyx_t_9 += __pyx_v_closes.shape[0]; - if (unlikely(__pyx_t_9 < 0)) __pyx_t_10 = 0; - } else if (unlikely(__pyx_t_9 >= __pyx_v_closes.shape[0])) __pyx_t_10 = 0; - if (unlikely(__pyx_t_10 != -1)) { - __Pyx_RaiseBufferIndexError(__pyx_t_10); - __PYX_ERR(0, 144, __pyx_L1_error) - } - __pyx_v_numerator = (__pyx_v_numerator + ((*((double *) ( /* dim=0 */ (__pyx_v_closes.data + __pyx_t_9 * __pyx_v_closes.strides[0]) ))) * __pyx_v_currentWeight)); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_idx); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6); + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(1, 153, __pyx_L1_error) - /* "indicators.pyx":145 - * for j in xrange(i, 0, -1): - * numerator += closes[j] * currentWeight - * denominator += currentWeight # <<<<<<<<<<<<<< + /* "View.MemoryView":152 * - * currentWeight *= alpha + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim */ - __pyx_v_denominator = (__pyx_v_denominator + __pyx_v_currentWeight); + } - /* "indicators.pyx":147 - * denominator += currentWeight + /* "View.MemoryView":154 + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim # <<<<<<<<<<<<<< * - * currentWeight *= alpha # <<<<<<<<<<<<<< - * if currentWeight < epsilon: - * break + * cdef char order */ - __pyx_v_currentWeight = (__pyx_v_currentWeight * __pyx_v_alpha); + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; - /* "indicators.pyx":148 + /* "View.MemoryView":151 * - * currentWeight *= alpha - * if currentWeight < epsilon: # <<<<<<<<<<<<<< - * break - * results[k] = numerator / denominator + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) */ - __pyx_t_1 = ((__pyx_v_currentWeight < __pyx_v_epsilon) != 0); - if (__pyx_t_1) { + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "indicators.pyx":149 - * currentWeight *= alpha - * if currentWeight < epsilon: - * break # <<<<<<<<<<<<<< - * results[k] = numerator / denominator - * k+=1 + /* "View.MemoryView":157 + * + * cdef char order + * if mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' */ - goto __pyx_L6_break; + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(1, 157, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":158 + * cdef char order + * if mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * elif mode == 'c': + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":159 + * if mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * elif mode == 'c': + * order = b'C' + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; - /* "indicators.pyx":148 + /* "View.MemoryView":157 * - * currentWeight *= alpha - * if currentWeight < epsilon: # <<<<<<<<<<<<<< - * break - * results[k] = numerator / denominator + * cdef char order + * if mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' */ - } - } - __pyx_L6_break:; + goto __pyx_L10; + } - /* "indicators.pyx":150 - * if currentWeight < epsilon: - * break - * results[k] = numerator / denominator # <<<<<<<<<<<<<< - * k+=1 - * try: + /* "View.MemoryView":160 + * order = b'F' + * self.mode = u'fortran' + * elif mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' */ - if (unlikely(__pyx_v_denominator == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 150, __pyx_L1_error) - } - (__pyx_v_results[__pyx_v_k]) = (__pyx_v_numerator / __pyx_v_denominator); + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(1, 160, __pyx_L1_error) + if (likely(__pyx_t_4)) { - /* "indicators.pyx":151 - * break - * results[k] = numerator / denominator - * k+=1 # <<<<<<<<<<<<<< - * try: - * return [e for e in results[:period]] + /* "View.MemoryView":161 + * self.mode = u'fortran' + * elif mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * else: + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":162 + * elif mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * else: + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":160 + * order = b'F' + * self.mode = u'fortran' + * elif mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' */ - __pyx_v_k = (__pyx_v_k + 1); + goto __pyx_L10; } - /* "indicators.pyx":152 - * results[k] = numerator / denominator - * k+=1 - * try: # <<<<<<<<<<<<<< - * return [e for e in results[:period]] + /* "View.MemoryView":164 + * self.mode = u'c' + * else: + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) # <<<<<<<<<<<<<< * + * self.len = fill_contig_strides_array(self._shape, self._strides, */ - /*try:*/ { + /*else*/ { + __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_v_mode); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 164, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 164, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(1, 164, __pyx_L1_error) + } + __pyx_L10:; - /* "indicators.pyx":153 - * k+=1 - * try: - * return [e for e in results[:period]] # <<<<<<<<<<<<<< + /* "View.MemoryView":166 + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + * + * self.len = fill_contig_strides_array(self._shape, self._strides, # <<<<<<<<<<<<<< + * itemsize, self.ndim, order) * - * finally: */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 153, __pyx_L9_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_12 = (__pyx_v_results + __pyx_v_period); - for (__pyx_t_13 = __pyx_v_results; __pyx_t_13 < __pyx_t_12; __pyx_t_13++) { - __pyx_t_11 = __pyx_t_13; - __pyx_v_e = (__pyx_t_11[0]); - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_e); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 153, __pyx_L9_error) - __Pyx_GOTREF(__pyx_t_3); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_3))) __PYX_ERR(0, 153, __pyx_L9_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } - __pyx_r = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - goto __pyx_L8_return; - } + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); - /* "indicators.pyx":156 + /* "View.MemoryView":169 + * itemsize, self.ndim, order) * - * finally: - * free(results) # <<<<<<<<<<<<<< + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * if allocate_buffer: + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":170 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * if allocate_buffer: + * + */ + __pyx_t_10 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 170, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 170, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_4; + + /* "View.MemoryView":171 + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' + * if allocate_buffer: # <<<<<<<<<<<<<< * * */ - /*finally:*/ { - __pyx_L9_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17) < 0)) __Pyx_ErrFetch(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); - __Pyx_XGOTREF(__pyx_t_15); - __Pyx_XGOTREF(__pyx_t_16); - __Pyx_XGOTREF(__pyx_t_17); - __Pyx_XGOTREF(__pyx_t_18); - __Pyx_XGOTREF(__pyx_t_19); - __Pyx_XGOTREF(__pyx_t_20); - __pyx_t_5 = __pyx_lineno; __pyx_t_6 = __pyx_clineno; __pyx_t_14 = __pyx_filename; - { - free(__pyx_v_results); - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_18); - __Pyx_XGIVEREF(__pyx_t_19); - __Pyx_XGIVEREF(__pyx_t_20); - __Pyx_ExceptionReset(__pyx_t_18, __pyx_t_19, __pyx_t_20); - } - __Pyx_XGIVEREF(__pyx_t_15); - __Pyx_XGIVEREF(__pyx_t_16); - __Pyx_XGIVEREF(__pyx_t_17); - __Pyx_ErrRestore(__pyx_t_15, __pyx_t_16, __pyx_t_17); - __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; - __pyx_lineno = __pyx_t_5; __pyx_clineno = __pyx_t_6; __pyx_filename = __pyx_t_14; - goto __pyx_L1_error; - } - __pyx_L8_return: { - __pyx_t_21 = __pyx_r; - __pyx_r = 0; - free(__pyx_v_results); - __pyx_r = __pyx_t_21; - __pyx_t_21 = 0; - goto __pyx_L0; + __pyx_t_4 = (__pyx_v_allocate_buffer != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":174 + * + * + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError("unable to allocate array data.") + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":175 + * + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate array data.") + * + */ + __pyx_t_4 = ((!(__pyx_v_self->data != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":176 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 176, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(1, 176, __pyx_L1_error) + + /* "View.MemoryView":175 + * + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate array data.") + * + */ } - } - /* "indicators.pyx":116 - * return (dy/dx) + /* "View.MemoryView":178 + * raise MemoryError("unable to allocate array data.") * - * cpdef list EMA(double[:] closes, int period, float alpha = .3, int epsilon = 0): # <<<<<<<<<<<<<< - * """ - * Exponential moving average function + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len / itemsize): */ + __pyx_t_4 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_4) { - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("indicators.EMA", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":179 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len / itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); -/* Python wrapper */ -static PyObject *__pyx_pw_10indicators_15EMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_14EMA[] = "\n Exponential moving average function \n @param closes: list of closing candle prices \n @param period: period to calculate for \n @param alpha: alpha value\n @param epsilon: epsilon value \n "; -static PyObject *__pyx_pw_10indicators_15EMA(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - __Pyx_memviewslice __pyx_v_closes = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_period; - float __pyx_v_alpha; - int __pyx_v_epsilon; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("EMA (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_closes,&__pyx_n_s_period,&__pyx_n_s_alpha,&__pyx_n_s_epsilon,0}; - PyObject* values[4] = {0,0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; + /* "View.MemoryView":180 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len / itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 180, __pyx_L1_error) } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_closes)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("EMA", 0, 2, 4, 1); __PYX_ERR(0, 116, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alpha); - if (value) { values[2] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 3: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_epsilon); - if (value) { values[3] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "EMA") < 0)) __PYX_ERR(0, 116, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 180, __pyx_L1_error) } - } - __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 116, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L3_error) - if (values[2]) { - __pyx_v_alpha = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_alpha == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L3_error) - } else { - __pyx_v_alpha = ((float).3); - } - if (values[3]) { - __pyx_v_epsilon = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_epsilon == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L3_error) - } else { - __pyx_v_epsilon = ((int)0); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("EMA", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 116, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("indicators.EMA", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_14EMA(__pyx_self, __pyx_v_closes, __pyx_v_period, __pyx_v_alpha, __pyx_v_epsilon); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_10indicators_14EMA(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, float __pyx_v_alpha, int __pyx_v_epsilon) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - struct __pyx_opt_args_10indicators_EMA __pyx_t_2; - __Pyx_RefNannySetupContext("EMA", 0); - __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 116, __pyx_L1_error) } - __pyx_t_2.__pyx_n = 2; - __pyx_t_2.alpha = __pyx_v_alpha; - __pyx_t_2.epsilon = __pyx_v_epsilon; - __pyx_t_1 = __pyx_f_10indicators_EMA(__pyx_v_closes, __pyx_v_period, 0, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.EMA", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_closes, 1); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + __pyx_t_1 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_itemsize); + __pyx_t_9 = __pyx_t_1; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_9; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; -/* "indicators.pyx":160 + /* "View.MemoryView":181 + * p = self.data + * for i in range(self.len / itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) * + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":182 + * for i in range(self.len / itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< * - * cpdef (float, float, float, float, float, float, float, float, float) FIB_BANDS(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Fibonacci Bolinger Bands function ... does retracements between ma/upper-band & ma/lower-band + * @cname('getbuffer') */ + Py_INCREF(Py_None); + } -static PyObject *__pyx_pw_10indicators_17FIB_BANDS(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static __pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc __pyx_f_10indicators_FIB_BANDS(__Pyx_memviewslice __pyx_v_closes, int __pyx_v_period, CYTHON_UNUSED int __pyx_skip_dispatch) { - float __pyx_v_ma; - float __pyx_v_upper; - float __pyx_v_lower; - float __pyx_v_diff; - double __pyx_v_upperOne; - double __pyx_v_upperTwo; - double __pyx_v_upperThree; - double __pyx_v_lowerOne; - double __pyx_v_lowerTwo; - double __pyx_v_lowerThree; - __pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - __pyx_ctuple_float__and_float__and_float __pyx_t_5; - float __pyx_t_6; - float __pyx_t_7; - float __pyx_t_8; - __pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc __pyx_t_9; - __Pyx_RefNannySetupContext("FIB_BANDS", 0); - - /* "indicators.pyx":166 - * @param period: period to calculate for - * """ - * assert(period>0, ("out of range period='%s'" %period)) # <<<<<<<<<<<<<< - * cdef float ma - * cdef float upper + /* "View.MemoryView":178 + * raise MemoryError("unable to allocate array data.") + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len / itemsize): */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(!Py_OptimizeFlag)) { - __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_period > 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 166, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_period); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 166, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_out_of_range_period_s_2, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 166, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 166, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3); - __pyx_t_1 = 0; - __pyx_t_3 = 0; - __pyx_t_4 = (PyTuple_GET_SIZE(__pyx_t_2) != 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_4)) { - PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(0, 166, __pyx_L1_error) } - } - #endif - /* "indicators.pyx":171 - * cdef float lower - * cdef float upperOn - * ma, upper, lower = BOLINGER_BANDS(closes, period, 2) # <<<<<<<<<<<<<< - * cdef float diff = upper - lower - * upperOne, upperTwo, upperThree = float(ma - (0.236 * diff)), float(ma - (0.382 * diff)), float(ma - (0.618 * diff)) - */ - __pyx_t_5 = __pyx_f_10indicators_BOLINGER_BANDS(__pyx_v_closes, __pyx_v_period, 2, 0); - __pyx_t_6 = __pyx_t_5.f0; - __pyx_t_7 = __pyx_t_5.f1; - __pyx_t_8 = __pyx_t_5.f2; - __pyx_v_ma = __pyx_t_6; - __pyx_v_upper = __pyx_t_7; - __pyx_v_lower = __pyx_t_8; - - /* "indicators.pyx":172 - * cdef float upperOn - * ma, upper, lower = BOLINGER_BANDS(closes, period, 2) - * cdef float diff = upper - lower # <<<<<<<<<<<<<< - * upperOne, upperTwo, upperThree = float(ma - (0.236 * diff)), float(ma - (0.382 * diff)), float(ma - (0.618 * diff)) - * lowerOne, lowerTwo, lowerThree = float(ma+ (0.236 * diff)), float(ma + (0.382 * diff)), float(ma + (0.618 * diff)) - */ - __pyx_v_diff = (__pyx_v_upper - __pyx_v_lower); - - /* "indicators.pyx":173 - * ma, upper, lower = BOLINGER_BANDS(closes, period, 2) - * cdef float diff = upper - lower - * upperOne, upperTwo, upperThree = float(ma - (0.236 * diff)), float(ma - (0.382 * diff)), float(ma - (0.618 * diff)) # <<<<<<<<<<<<<< - * lowerOne, lowerTwo, lowerThree = float(ma+ (0.236 * diff)), float(ma + (0.382 * diff)), float(ma + (0.618 * diff)) - * return lower, lowerThree, lowerTwo, lowerOne, ma, upperOne , upperTwo, upperThree, upper - */ - __pyx_v_upperOne = (__pyx_v_ma - (0.236 * __pyx_v_diff)); - __pyx_v_upperTwo = (__pyx_v_ma - (0.382 * __pyx_v_diff)); - __pyx_v_upperThree = (__pyx_v_ma - (0.618 * __pyx_v_diff)); - - /* "indicators.pyx":174 - * cdef float diff = upper - lower - * upperOne, upperTwo, upperThree = float(ma - (0.236 * diff)), float(ma - (0.382 * diff)), float(ma - (0.618 * diff)) - * lowerOne, lowerTwo, lowerThree = float(ma+ (0.236 * diff)), float(ma + (0.382 * diff)), float(ma + (0.618 * diff)) # <<<<<<<<<<<<<< - * return lower, lowerThree, lowerTwo, lowerOne, ma, upperOne , upperTwo, upperThree, upper - * - */ - __pyx_v_lowerOne = (__pyx_v_ma + (0.236 * __pyx_v_diff)); - __pyx_v_lowerTwo = (__pyx_v_ma + (0.382 * __pyx_v_diff)); - __pyx_v_lowerThree = (__pyx_v_ma + (0.618 * __pyx_v_diff)); - - /* "indicators.pyx":175 - * upperOne, upperTwo, upperThree = float(ma - (0.236 * diff)), float(ma - (0.382 * diff)), float(ma - (0.618 * diff)) - * lowerOne, lowerTwo, lowerThree = float(ma+ (0.236 * diff)), float(ma + (0.382 * diff)), float(ma + (0.618 * diff)) - * return lower, lowerThree, lowerTwo, lowerOne, ma, upperOne , upperTwo, upperThree, upper # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_9.f0 = __pyx_v_lower; - __pyx_t_9.f1 = __pyx_v_lowerThree; - __pyx_t_9.f2 = __pyx_v_lowerTwo; - __pyx_t_9.f3 = __pyx_v_lowerOne; - __pyx_t_9.f4 = __pyx_v_ma; - __pyx_t_9.f5 = __pyx_v_upperOne; - __pyx_t_9.f6 = __pyx_v_upperTwo; - __pyx_t_9.f7 = __pyx_v_upperThree; - __pyx_t_9.f8 = __pyx_v_upper; - __pyx_r = __pyx_t_9; - goto __pyx_L0; - - /* "indicators.pyx":160 + /* "View.MemoryView":171 + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' + * if allocate_buffer: # <<<<<<<<<<<<<< * * - * cpdef (float, float, float, float, float, float, float, float, float) FIB_BANDS(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Fibonacci Bolinger Bands function ... does retracements between ma/upper-band & ma/lower-band */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_WriteUnraisable("indicators.FIB_BANDS", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); - __Pyx_pretend_to_initialize(&__pyx_r); - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* Python wrapper */ -static PyObject *__pyx_pw_10indicators_17FIB_BANDS(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_10indicators_16FIB_BANDS[] = "\n Fibonacci Bolinger Bands function ... does retracements between ma/upper-band & ma/lower-band \n @param closes: list of closing prices\n @param period: period to calculate for \n "; -static PyObject *__pyx_pw_10indicators_17FIB_BANDS(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - __Pyx_memviewslice __pyx_v_closes = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_period; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("FIB_BANDS (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_closes,&__pyx_n_s_period,0}; - PyObject* values[2] = {0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_closes)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_period)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("FIB_BANDS", 1, 2, 2, 1); __PYX_ERR(0, 160, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "FIB_BANDS") < 0)) __PYX_ERR(0, 160, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - } - __pyx_v_closes = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_closes.memview)) __PYX_ERR(0, 160, __pyx_L3_error) - __pyx_v_period = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_period == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L3_error) } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("FIB_BANDS", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 160, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("indicators.FIB_BANDS", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10indicators_16FIB_BANDS(__pyx_self, __pyx_v_closes, __pyx_v_period); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} -static PyObject *__pyx_pf_10indicators_16FIB_BANDS(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_closes, int __pyx_v_period) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("FIB_BANDS", 0); - __Pyx_XDECREF(__pyx_r); - if (unlikely(!__pyx_v_closes.memview)) { __Pyx_RaiseUnboundLocalError("closes"); __PYX_ERR(0, 160, __pyx_L1_error) } - __pyx_t_1 = __pyx_convert__to_py___pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc(__pyx_f_10indicators_FIB_BANDS(__pyx_v_closes, __pyx_v_period, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; + /* "View.MemoryView":122 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("indicators.FIB_BANDS", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_closes, 1); - __Pyx_XGIVEREF(__pyx_r); + __Pyx_XDECREF(__pyx_v_format); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "array.pxd":93 - * __data_union data +/* "View.MemoryView":185 * - * def __getbuffer__(self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< - * # This implementation of getbuffer is geared towards Cython - * # requirements, and does not yet fulfill the PEP. + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * cdef int bufmode = -1 + * if self.mode == u"c": */ /* Python wrapper */ -static CYTHON_UNUSED int __pyx_pw_7cpython_5array_5array_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ -static CYTHON_UNUSED int __pyx_pw_7cpython_5array_5array_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); - __pyx_r = __pyx_pf_7cpython_5array_5array___getbuffer__(((arrayobject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_pf_7cpython_5array_5array___getbuffer__(arrayobject *__pyx_v_self, Py_buffer *__pyx_v_info, CYTHON_UNUSED int __pyx_v_flags) { - PyObject *__pyx_v_item_count = NULL; +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; int __pyx_r; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - char *__pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + char *__pyx_t_4; Py_ssize_t __pyx_t_5; int __pyx_t_6; - char __pyx_t_7; + Py_ssize_t *__pyx_t_7; if (__pyx_v_info == NULL) { PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); return -1; @@ -4904,171 +4125,233 @@ static int __pyx_pf_7cpython_5array_5array___getbuffer__(arrayobject *__pyx_v_se __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "array.pxd":98 - * # In particular strided access is always provided regardless - * # of flags - * item_count = Py_SIZE(self) # <<<<<<<<<<<<<< - * - * info.suboffsets = NULL + /* "View.MemoryView":186 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS */ - __pyx_t_1 = PyInt_FromSsize_t(Py_SIZE(((PyObject *)__pyx_v_self))); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 98, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_item_count = __pyx_t_1; - __pyx_t_1 = 0; + __pyx_v_bufmode = -1; - /* "array.pxd":100 - * item_count = Py_SIZE(self) - * - * info.suboffsets = NULL # <<<<<<<<<<<<<< - * info.buf = self.data.as_chars - * info.readonly = 0 + /* "View.MemoryView":187 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": */ - __pyx_v_info->suboffsets = NULL; + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 187, __pyx_L1_error) + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { - /* "array.pxd":101 - * - * info.suboffsets = NULL - * info.buf = self.data.as_chars # <<<<<<<<<<<<<< - * info.readonly = 0 - * info.ndim = 1 + /* "View.MemoryView":188 + * cdef int bufmode = -1 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS */ - __pyx_t_2 = __pyx_v_self->data.as_chars; - __pyx_v_info->buf = __pyx_t_2; + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); - /* "array.pxd":102 - * info.suboffsets = NULL - * info.buf = self.data.as_chars - * info.readonly = 0 # <<<<<<<<<<<<<< - * info.ndim = 1 - * info.itemsize = self.ob_descr.itemsize # e.g. sizeof(float) + /* "View.MemoryView":187 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": */ - __pyx_v_info->readonly = 0; + goto __pyx_L3; + } - /* "array.pxd":103 - * info.buf = self.data.as_chars - * info.readonly = 0 - * info.ndim = 1 # <<<<<<<<<<<<<< - * info.itemsize = self.ob_descr.itemsize # e.g. sizeof(float) - * info.len = info.itemsize * item_count + /* "View.MemoryView":189 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): */ - __pyx_v_info->ndim = 1; + __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(1, 189, __pyx_L1_error) + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { - /* "array.pxd":104 - * info.readonly = 0 - * info.ndim = 1 - * info.itemsize = self.ob_descr.itemsize # e.g. sizeof(float) # <<<<<<<<<<<<<< - * info.len = info.itemsize * item_count - * + /* "View.MemoryView":190 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") */ - __pyx_t_3 = __pyx_v_self->ob_descr->itemsize; - __pyx_v_info->itemsize = __pyx_t_3; + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); - /* "array.pxd":105 - * info.ndim = 1 - * info.itemsize = self.ob_descr.itemsize # e.g. sizeof(float) - * info.len = info.itemsize * item_count # <<<<<<<<<<<<<< - * - * info.shape = PyObject_Malloc(sizeof(Py_ssize_t) + 2) + /* "View.MemoryView":189 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): */ - __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_info->itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 105, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = PyNumber_Multiply(__pyx_t_1, __pyx_v_item_count); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 105, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 105, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":191 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + */ + __pyx_t_1 = ((!((__pyx_v_flags & __pyx_v_bufmode) != 0)) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":192 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 192, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 192, __pyx_L1_error) + + /* "View.MemoryView":191 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + */ + } + + /* "View.MemoryView":193 + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * info.ndim = self.ndim + */ + __pyx_t_4 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_4; + + /* "View.MemoryView":194 + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_5 = __pyx_v_self->len; __pyx_v_info->len = __pyx_t_5; - /* "array.pxd":107 - * info.len = info.itemsize * item_count - * - * info.shape = PyObject_Malloc(sizeof(Py_ssize_t) + 2) # <<<<<<<<<<<<<< - * if not info.shape: - * raise MemoryError() + /* "View.MemoryView":195 + * info.buf = self.data + * info.len = self.len + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_6 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":196 + * info.len = self.len + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * info.suboffsets = NULL */ - __pyx_v_info->shape = ((Py_ssize_t *)PyObject_Malloc(((sizeof(Py_ssize_t)) + 2))); + __pyx_t_7 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_7; - /* "array.pxd":108 - * - * info.shape = PyObject_Malloc(sizeof(Py_ssize_t) + 2) - * if not info.shape: # <<<<<<<<<<<<<< - * raise MemoryError() - * info.shape[0] = item_count # constant regardless of resizing + /* "View.MemoryView":197 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = self.itemsize */ - __pyx_t_6 = ((!(__pyx_v_info->shape != 0)) != 0); - if (unlikely(__pyx_t_6)) { + __pyx_t_7 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_7; - /* "array.pxd":109 - * info.shape = PyObject_Malloc(sizeof(Py_ssize_t) + 2) - * if not info.shape: - * raise MemoryError() # <<<<<<<<<<<<<< - * info.shape[0] = item_count # constant regardless of resizing - * info.strides = &info.itemsize + /* "View.MemoryView":198 + * info.shape = self._shape + * info.strides = self._strides + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 */ - PyErr_NoMemory(); __PYX_ERR(1, 109, __pyx_L1_error) + __pyx_v_info->suboffsets = NULL; - /* "array.pxd":108 + /* "View.MemoryView":199 + * info.strides = self._strides + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 * - * info.shape = PyObject_Malloc(sizeof(Py_ssize_t) + 2) - * if not info.shape: # <<<<<<<<<<<<<< - * raise MemoryError() - * info.shape[0] = item_count # constant regardless of resizing */ - } + __pyx_t_5 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_5; - /* "array.pxd":110 - * if not info.shape: - * raise MemoryError() - * info.shape[0] = item_count # constant regardless of resizing # <<<<<<<<<<<<<< - * info.strides = &info.itemsize + /* "View.MemoryView":200 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< * + * if flags & PyBUF_FORMAT: */ - __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_item_count); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 110, __pyx_L1_error) - (__pyx_v_info->shape[0]) = __pyx_t_5; + __pyx_v_info->readonly = 0; - /* "array.pxd":111 - * raise MemoryError() - * info.shape[0] = item_count # constant regardless of resizing - * info.strides = &info.itemsize # <<<<<<<<<<<<<< + /* "View.MemoryView":202 + * info.readonly = 0 * - * info.format = (info.shape + 1) + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.format + * else: */ - __pyx_v_info->strides = (&__pyx_v_info->itemsize); + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { - /* "array.pxd":113 - * info.strides = &info.itemsize + /* "View.MemoryView":203 * - * info.format = (info.shape + 1) # <<<<<<<<<<<<<< - * info.format[0] = self.ob_descr.typecode - * info.format[1] = 0 + * if flags & PyBUF_FORMAT: + * info.format = self.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL */ - __pyx_v_info->format = ((char *)(__pyx_v_info->shape + 1)); + __pyx_t_4 = __pyx_v_self->format; + __pyx_v_info->format = __pyx_t_4; - /* "array.pxd":114 + /* "View.MemoryView":202 + * info.readonly = 0 * - * info.format = (info.shape + 1) - * info.format[0] = self.ob_descr.typecode # <<<<<<<<<<<<<< - * info.format[1] = 0 - * info.obj = self + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.format + * else: */ - __pyx_t_7 = __pyx_v_self->ob_descr->typecode; - (__pyx_v_info->format[0]) = __pyx_t_7; + goto __pyx_L5; + } - /* "array.pxd":115 - * info.format = (info.shape + 1) - * info.format[0] = self.ob_descr.typecode - * info.format[1] = 0 # <<<<<<<<<<<<<< - * info.obj = self + /* "View.MemoryView":205 + * info.format = self.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< * + * info.obj = self */ - (__pyx_v_info->format[1]) = 0; + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L5:; - /* "array.pxd":116 - * info.format[0] = self.ob_descr.typecode - * info.format[1] = 0 - * info.obj = self # <<<<<<<<<<<<<< + /* "View.MemoryView":207 + * info.format = NULL * - * def __releasebuffer__(self, Py_buffer* info): + * info.obj = self # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") */ __Pyx_INCREF(((PyObject *)__pyx_v_self)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); @@ -5076,21 +4359,20 @@ static int __pyx_pf_7cpython_5array_5array___getbuffer__(arrayobject *__pyx_v_se __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "array.pxd":93 - * __data_union data + /* "View.MemoryView":185 * - * def __getbuffer__(self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< - * # This implementation of getbuffer is geared towards Cython - * # requirements, and does not yet fulfill the PEP. + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * cdef int bufmode = -1 + * if self.mode == u"c": */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("cpython.array.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; if (__pyx_v_info->obj != NULL) { __Pyx_GOTREF(__pyx_v_info->obj); @@ -5103,9472 +4385,9058 @@ static int __pyx_pf_7cpython_5array_5array___getbuffer__(arrayobject *__pyx_v_se __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; } __pyx_L2:; - __Pyx_XDECREF(__pyx_v_item_count); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "array.pxd":118 - * info.obj = self - * - * def __releasebuffer__(self, Py_buffer* info): # <<<<<<<<<<<<<< - * PyObject_Free(info.shape) +/* "View.MemoryView":211 + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) */ /* Python wrapper */ -static CYTHON_UNUSED void __pyx_pw_7cpython_5array_5array_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ -static CYTHON_UNUSED void __pyx_pw_7cpython_5array_5array_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); - __pyx_pf_7cpython_5array_5array_2__releasebuffer__(((arrayobject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); } -static void __pyx_pf_7cpython_5array_5array_2__releasebuffer__(CYTHON_UNUSED arrayobject *__pyx_v_self, Py_buffer *__pyx_v_info) { +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__releasebuffer__", 0); + int __pyx_t_1; + __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "array.pxd":119 - * - * def __releasebuffer__(self, Py_buffer* info): - * PyObject_Free(info.shape) # <<<<<<<<<<<<<< + /* "View.MemoryView":212 * - * array newarrayobject(PyTypeObject* type, Py_ssize_t size, arraydescr *descr) + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data: */ - PyObject_Free(__pyx_v_info->shape); + __pyx_t_1 = ((__pyx_v_self->callback_free_data != NULL) != 0); + if (__pyx_t_1) { - /* "array.pxd":118 - * info.obj = self - * - * def __releasebuffer__(self, Py_buffer* info): # <<<<<<<<<<<<<< - * PyObject_Free(info.shape) - * + /* "View.MemoryView":213 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data: + * if self.dtype_is_object: */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "array.pxd":130 - * + /* "View.MemoryView":212 * - * cdef inline array clone(array template, Py_ssize_t length, bint zero): # <<<<<<<<<<<<<< - * """ fast creation of a new array, given a template array. - * type will be same as template. - */ - -static CYTHON_INLINE arrayobject *__pyx_f_7cpython_5array_clone(arrayobject *__pyx_v_template, Py_ssize_t __pyx_v_length, int __pyx_v_zero) { - arrayobject *__pyx_v_op = NULL; - arrayobject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - __Pyx_RefNannySetupContext("clone", 0); - - /* "array.pxd":134 - * type will be same as template. - * if zero is true, new array will be initialized with zeroes.""" - * op = newarrayobject(Py_TYPE(template), length, template.ob_descr) # <<<<<<<<<<<<<< - * if zero and op is not None: - * memset(op.data.as_chars, 0, length * op.ob_descr.itemsize) - */ - __pyx_t_1 = ((PyObject *)newarrayobject(Py_TYPE(((PyObject *)__pyx_v_template)), __pyx_v_length, __pyx_v_template->ob_descr)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 134, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_op = ((arrayobject *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "array.pxd":135 - * if zero is true, new array will be initialized with zeroes.""" - * op = newarrayobject(Py_TYPE(template), length, template.ob_descr) - * if zero and op is not None: # <<<<<<<<<<<<<< - * memset(op.data.as_chars, 0, length * op.ob_descr.itemsize) - * return op + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data: */ - __pyx_t_3 = (__pyx_v_zero != 0); - if (__pyx_t_3) { - } else { - __pyx_t_2 = __pyx_t_3; - goto __pyx_L4_bool_binop_done; + goto __pyx_L3; } - __pyx_t_3 = (((PyObject *)__pyx_v_op) != Py_None); - __pyx_t_4 = (__pyx_t_3 != 0); - __pyx_t_2 = __pyx_t_4; - __pyx_L4_bool_binop_done:; - if (__pyx_t_2) { - /* "array.pxd":136 - * op = newarrayobject(Py_TYPE(template), length, template.ob_descr) - * if zero and op is not None: - * memset(op.data.as_chars, 0, length * op.ob_descr.itemsize) # <<<<<<<<<<<<<< - * return op - * + /* "View.MemoryView":214 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, */ - (void)(memset(__pyx_v_op->data.as_chars, 0, (__pyx_v_length * __pyx_v_op->ob_descr->itemsize))); + __pyx_t_1 = (__pyx_v_self->free_data != 0); + if (__pyx_t_1) { - /* "array.pxd":135 - * if zero is true, new array will be initialized with zeroes.""" - * op = newarrayobject(Py_TYPE(template), length, template.ob_descr) - * if zero and op is not None: # <<<<<<<<<<<<<< - * memset(op.data.as_chars, 0, length * op.ob_descr.itemsize) - * return op + /* "View.MemoryView":215 + * self.callback_free_data(self.data) + * elif self.free_data: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) */ - } + __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_1) { - /* "array.pxd":137 - * if zero and op is not None: - * memset(op.data.as_chars, 0, length * op.ob_descr.itemsize) - * return op # <<<<<<<<<<<<<< + /* "View.MemoryView":216 + * elif self.free_data: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, # <<<<<<<<<<<<<< + * self._strides, self.ndim, False) + * free(self.data) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":215 + * self.callback_free_data(self.data) + * elif self.free_data: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + */ + } + + /* "View.MemoryView":218 + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) * - * cdef inline array copy(array self): */ - __Pyx_XDECREF(((PyObject *)__pyx_r)); - __Pyx_INCREF(((PyObject *)__pyx_v_op)); - __pyx_r = __pyx_v_op; - goto __pyx_L0; + free(__pyx_v_self->data); + + /* "View.MemoryView":214 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, + */ + } + __pyx_L3:; - /* "array.pxd":130 + /* "View.MemoryView":219 + * self._strides, self.ndim, False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":211 + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") * - * cdef inline array clone(array template, Py_ssize_t length, bint zero): # <<<<<<<<<<<<<< - * """ fast creation of a new array, given a template array. - * type will be same as template. + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) */ /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("cpython.array.clone", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_op); - __Pyx_XGIVEREF((PyObject *)__pyx_r); __Pyx_RefNannyFinishContext(); - return __pyx_r; } -/* "array.pxd":139 - * return op +/* "View.MemoryView":222 + * + * @property + * def memview(self): # <<<<<<<<<<<<<< + * return self.get_memview() * - * cdef inline array copy(array self): # <<<<<<<<<<<<<< - * """ make a copy of an array. """ - * op = newarrayobject(Py_TYPE(self), Py_SIZE(self), self.ob_descr) */ -static CYTHON_INLINE arrayobject *__pyx_f_7cpython_5array_copy(arrayobject *__pyx_v_self) { - arrayobject *__pyx_v_op = NULL; - arrayobject *__pyx_r = NULL; +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("copy", 0); + __Pyx_RefNannySetupContext("__get__", 0); - /* "array.pxd":141 - * cdef inline array copy(array self): - * """ make a copy of an array. """ - * op = newarrayobject(Py_TYPE(self), Py_SIZE(self), self.ob_descr) # <<<<<<<<<<<<<< - * memcpy(op.data.as_chars, self.data.as_chars, Py_SIZE(op) * op.ob_descr.itemsize) - * return op + /* "View.MemoryView":223 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') */ - __pyx_t_1 = ((PyObject *)newarrayobject(Py_TYPE(((PyObject *)__pyx_v_self)), Py_SIZE(((PyObject *)__pyx_v_self)), __pyx_v_self->ob_descr)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 141, __pyx_L1_error) + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 223, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_v_op = ((arrayobject *)__pyx_t_1); + __pyx_r = __pyx_t_1; __pyx_t_1 = 0; - - /* "array.pxd":142 - * """ make a copy of an array. """ - * op = newarrayobject(Py_TYPE(self), Py_SIZE(self), self.ob_descr) - * memcpy(op.data.as_chars, self.data.as_chars, Py_SIZE(op) * op.ob_descr.itemsize) # <<<<<<<<<<<<<< - * return op - * - */ - (void)(memcpy(__pyx_v_op->data.as_chars, __pyx_v_self->data.as_chars, (Py_SIZE(((PyObject *)__pyx_v_op)) * __pyx_v_op->ob_descr->itemsize))); - - /* "array.pxd":143 - * op = newarrayobject(Py_TYPE(self), Py_SIZE(self), self.ob_descr) - * memcpy(op.data.as_chars, self.data.as_chars, Py_SIZE(op) * op.ob_descr.itemsize) - * return op # <<<<<<<<<<<<<< - * - * cdef inline int extend_buffer(array self, char* stuff, Py_ssize_t n) except -1: - */ - __Pyx_XDECREF(((PyObject *)__pyx_r)); - __Pyx_INCREF(((PyObject *)__pyx_v_op)); - __pyx_r = __pyx_v_op; goto __pyx_L0; - /* "array.pxd":139 - * return op + /* "View.MemoryView":222 + * + * @property + * def memview(self): # <<<<<<<<<<<<<< + * return self.get_memview() * - * cdef inline array copy(array self): # <<<<<<<<<<<<<< - * """ make a copy of an array. """ - * op = newarrayobject(Py_TYPE(self), Py_SIZE(self), self.ob_descr) */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("cpython.array.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_op); - __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "array.pxd":145 - * return op +/* "View.MemoryView":226 * - * cdef inline int extend_buffer(array self, char* stuff, Py_ssize_t n) except -1: # <<<<<<<<<<<<<< - * """ efficient appending of new stuff of same type - * (e.g. of same array type) + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) */ -static CYTHON_INLINE int __pyx_f_7cpython_5array_extend_buffer(arrayobject *__pyx_v_self, char *__pyx_v_stuff, Py_ssize_t __pyx_v_n) { - Py_ssize_t __pyx_v_itemsize; - Py_ssize_t __pyx_v_origsize; - int __pyx_r; +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("extend_buffer", 0); - - /* "array.pxd":149 - * (e.g. of same array type) - * n: number of elements (not number of bytes!) """ - * cdef Py_ssize_t itemsize = self.ob_descr.itemsize # <<<<<<<<<<<<<< - * cdef Py_ssize_t origsize = Py_SIZE(self) - * resize_smart(self, origsize + n) - */ - __pyx_t_1 = __pyx_v_self->ob_descr->itemsize; - __pyx_v_itemsize = __pyx_t_1; - - /* "array.pxd":150 - * n: number of elements (not number of bytes!) """ - * cdef Py_ssize_t itemsize = self.ob_descr.itemsize - * cdef Py_ssize_t origsize = Py_SIZE(self) # <<<<<<<<<<<<<< - * resize_smart(self, origsize + n) - * memcpy(self.data.as_chars + origsize * itemsize, stuff, n * itemsize) - */ - __pyx_v_origsize = Py_SIZE(((PyObject *)__pyx_v_self)); - - /* "array.pxd":151 - * cdef Py_ssize_t itemsize = self.ob_descr.itemsize - * cdef Py_ssize_t origsize = Py_SIZE(self) - * resize_smart(self, origsize + n) # <<<<<<<<<<<<<< - * memcpy(self.data.as_chars + origsize * itemsize, stuff, n * itemsize) - * return 0 - */ - __pyx_t_1 = resize_smart(__pyx_v_self, (__pyx_v_origsize + __pyx_v_n)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 151, __pyx_L1_error) + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_memview", 0); - /* "array.pxd":152 - * cdef Py_ssize_t origsize = Py_SIZE(self) - * resize_smart(self, origsize + n) - * memcpy(self.data.as_chars + origsize * itemsize, stuff, n * itemsize) # <<<<<<<<<<<<<< - * return 0 + /* "View.MemoryView":227 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) * */ - (void)(memcpy((__pyx_v_self->data.as_chars + (__pyx_v_origsize * __pyx_v_itemsize)), __pyx_v_stuff, (__pyx_v_n * __pyx_v_itemsize))); + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); - /* "array.pxd":153 - * resize_smart(self, origsize + n) - * memcpy(self.data.as_chars + origsize * itemsize, stuff, n * itemsize) - * return 0 # <<<<<<<<<<<<<< + /* "View.MemoryView":228 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< * - * cdef inline int extend(array self, array other) except -1: + * def __len__(self): */ - __pyx_r = 0; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 228, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 228, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 228, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 228, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; goto __pyx_L0; - /* "array.pxd":145 - * return op + /* "View.MemoryView":226 * - * cdef inline int extend_buffer(array self, char* stuff, Py_ssize_t n) except -1: # <<<<<<<<<<<<<< - * """ efficient appending of new stuff of same type - * (e.g. of same array type) + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) */ /* function exit code */ __pyx_L1_error:; - __Pyx_AddTraceback("cpython.array.extend_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "array.pxd":155 - * return 0 +/* "View.MemoryView":230 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] * - * cdef inline int extend(array self, array other) except -1: # <<<<<<<<<<<<<< - * """ extend array with data from another array; types must match. """ - * if self.ob_descr.typecode != other.ob_descr.typecode: */ -static CYTHON_INLINE int __pyx_f_7cpython_5array_extend(arrayobject *__pyx_v_self, arrayobject *__pyx_v_other) { - int __pyx_r; +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + Py_ssize_t __pyx_r; __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - __Pyx_RefNannySetupContext("extend", 0); - - /* "array.pxd":157 - * cdef inline int extend(array self, array other) except -1: - * """ extend array with data from another array; types must match. """ - * if self.ob_descr.typecode != other.ob_descr.typecode: # <<<<<<<<<<<<<< - * PyErr_BadArgument() - * return extend_buffer(self, other.data.as_chars, Py_SIZE(other)) - */ - __pyx_t_1 = ((__pyx_v_self->ob_descr->typecode != __pyx_v_other->ob_descr->typecode) != 0); - if (__pyx_t_1) { + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); - /* "array.pxd":158 - * """ extend array with data from another array; types must match. """ - * if self.ob_descr.typecode != other.ob_descr.typecode: - * PyErr_BadArgument() # <<<<<<<<<<<<<< - * return extend_buffer(self, other.data.as_chars, Py_SIZE(other)) - * - */ - __pyx_t_2 = PyErr_BadArgument(); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 158, __pyx_L1_error) + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "array.pxd":157 - * cdef inline int extend(array self, array other) except -1: - * """ extend array with data from another array; types must match. """ - * if self.ob_descr.typecode != other.ob_descr.typecode: # <<<<<<<<<<<<<< - * PyErr_BadArgument() - * return extend_buffer(self, other.data.as_chars, Py_SIZE(other)) - */ - } +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__", 0); - /* "array.pxd":159 - * if self.ob_descr.typecode != other.ob_descr.typecode: - * PyErr_BadArgument() - * return extend_buffer(self, other.data.as_chars, Py_SIZE(other)) # <<<<<<<<<<<<<< + /* "View.MemoryView":231 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< * - * cdef inline void zero(array self): + * def __getattr__(self, attr): */ - __pyx_t_2 = __pyx_f_7cpython_5array_extend_buffer(__pyx_v_self, __pyx_v_other->data.as_chars, Py_SIZE(((PyObject *)__pyx_v_other))); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(1, 159, __pyx_L1_error) - __pyx_r = __pyx_t_2; + __pyx_r = (__pyx_v_self->_shape[0]); goto __pyx_L0; - /* "array.pxd":155 - * return 0 + /* "View.MemoryView":230 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] * - * cdef inline int extend(array self, array other) except -1: # <<<<<<<<<<<<<< - * """ extend array with data from another array; types must match. """ - * if self.ob_descr.typecode != other.ob_descr.typecode: */ /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("cpython.array.extend", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "array.pxd":161 - * return extend_buffer(self, other.data.as_chars, Py_SIZE(other)) +/* "View.MemoryView":233 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) * - * cdef inline void zero(array self): # <<<<<<<<<<<<<< - * """ set all elements of array to zero. """ - * memset(self.data.as_chars, 0, Py_SIZE(self) * self.ob_descr.itemsize) */ -static CYTHON_INLINE void __pyx_f_7cpython_5array_zero(arrayobject *__pyx_v_self) { +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("zero", 0); - - /* "array.pxd":163 - * cdef inline void zero(array self): - * """ set all elements of array to zero. """ - * memset(self.data.as_chars, 0, Py_SIZE(self) * self.ob_descr.itemsize) # <<<<<<<<<<<<<< - */ - (void)(memset(__pyx_v_self->data.as_chars, 0, (Py_SIZE(((PyObject *)__pyx_v_self)) * __pyx_v_self->ob_descr->itemsize))); - - /* "array.pxd":161 - * return extend_buffer(self, other.data.as_chars, Py_SIZE(other)) - * - * cdef inline void zero(array self): # <<<<<<<<<<<<<< - * """ set all elements of array to zero. """ - * memset(self.data.as_chars, 0, Py_SIZE(self) * self.ob_descr.itemsize) - */ + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); /* function exit code */ __Pyx_RefNannyFinishContext(); + return __pyx_r; } -/* "View.MemoryView":122 - * cdef bint dtype_is_object +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__getattr__", 0); + + /* "View.MemoryView":234 * - * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< - * mode="c", bint allocate_buffer=True): + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< * + * def __getitem__(self, item): */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; -/* Python wrapper */ -static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_shape = 0; - Py_ssize_t __pyx_v_itemsize; - PyObject *__pyx_v_format = 0; - PyObject *__pyx_v_mode = 0; - int __pyx_v_allocate_buffer; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; - PyObject* values[5] = {0,0,0,0,0}; - values[3] = ((PyObject *)__pyx_n_s_c); - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_shape)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_itemsize)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(2, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_format)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(2, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mode); - if (value) { values[3] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 4: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_allocate_buffer); - if (value) { values[4] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 122, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_shape = ((PyObject*)values[0]); - __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 122, __pyx_L3_error) - __pyx_v_format = values[2]; - __pyx_v_mode = values[3]; - if (values[4]) { - __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 123, __pyx_L3_error) - } else { - - /* "View.MemoryView":123 + /* "View.MemoryView":233 + * return self._shape[0] * - * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, - * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) * - * cdef int idx */ - __pyx_v_allocate_buffer = ((int)1); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 122, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(2, 122, __pyx_L1_error) - if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { - PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(2, 122, __pyx_L1_error) - } - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + return __pyx_r; +} - /* "View.MemoryView":122 - * cdef bint dtype_is_object +/* "View.MemoryView":236 + * return getattr(self.memview, attr) * - * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< - * mode="c", bint allocate_buffer=True): + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] * */ +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __pyx_r = -1; - __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { - int __pyx_v_idx; - Py_ssize_t __pyx_v_i; - Py_ssize_t __pyx_v_dim; - PyObject **__pyx_v_p; - char __pyx_v_order; - int __pyx_r; +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - char *__pyx_t_7; - int __pyx_t_8; - Py_ssize_t __pyx_t_9; - PyObject *__pyx_t_10 = NULL; - Py_ssize_t __pyx_t_11; - __Pyx_RefNannySetupContext("__cinit__", 0); - __Pyx_INCREF(__pyx_v_format); + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__getitem__", 0); - /* "View.MemoryView":129 - * cdef PyObject **p + /* "View.MemoryView":237 * - * self.ndim = len(shape) # <<<<<<<<<<<<<< - * self.itemsize = itemsize + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< * + * def __setitem__(self, item, value): */ - if (unlikely(__pyx_v_shape == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(2, 129, __pyx_L1_error) - } - __pyx_t_1 = PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(2, 129, __pyx_L1_error) - __pyx_v_self->ndim = ((int)__pyx_t_1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; - /* "View.MemoryView":130 + /* "View.MemoryView":236 + * return getattr(self.memview, attr) * - * self.ndim = len(shape) - * self.itemsize = itemsize # <<<<<<<<<<<<<< + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] * - * if not self.ndim: */ - __pyx_v_self->itemsize = __pyx_v_itemsize; - /* "View.MemoryView":132 - * self.itemsize = itemsize - * - * if not self.ndim: # <<<<<<<<<<<<<< - * raise ValueError("Empty shape tuple for cython.array") - * - */ - __pyx_t_2 = ((!(__pyx_v_self->ndim != 0)) != 0); - if (unlikely(__pyx_t_2)) { + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":133 +/* "View.MemoryView":239 + * return self.memview[item] * - * if not self.ndim: - * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value * - * if itemsize <= 0: */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 133, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 133, __pyx_L1_error) - /* "View.MemoryView":132 - * self.itemsize = itemsize +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setitem__", 0); + + /* "View.MemoryView":240 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< * - * if not self.ndim: # <<<<<<<<<<<<<< - * raise ValueError("Empty shape tuple for cython.array") * */ - } + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 240, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0)) __PYX_ERR(1, 240, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":135 - * raise ValueError("Empty shape tuple for cython.array") + /* "View.MemoryView":239 + * return self.memview[item] * - * if itemsize <= 0: # <<<<<<<<<<<<<< - * raise ValueError("itemsize <= 0 for cython.array") + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value * */ - __pyx_t_2 = ((__pyx_v_itemsize <= 0) != 0); - if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":136 - * - * if itemsize <= 0: - * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< - * - * if not isinstance(format, bytes): - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 136, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 136, __pyx_L1_error) + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":135 - * raise ValueError("Empty shape tuple for cython.array") - * - * if itemsize <= 0: # <<<<<<<<<<<<<< - * raise ValueError("itemsize <= 0 for cython.array") - * +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): */ - } - /* "View.MemoryView":138 - * raise ValueError("itemsize <= 0 for cython.array") - * - * if not isinstance(format, bytes): # <<<<<<<<<<<<<< - * format = format.encode('ASCII') - * self._format = format # keep a reference to the byte string - */ - __pyx_t_2 = PyBytes_Check(__pyx_v_format); - __pyx_t_4 = ((!(__pyx_t_2 != 0)) != 0); - if (__pyx_t_4) { +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); - /* "View.MemoryView":139 - * - * if not isinstance(format, bytes): - * format = format.encode('ASCII') # <<<<<<<<<<<<<< - * self._format = format # keep a reference to the byte string - * self.format = self._format - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 139, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { - __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); - if (likely(__pyx_t_6)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_5, function); - } - } - __pyx_t_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_6, __pyx_n_s_ASCII) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_n_s_ASCII); - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 139, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_3); - __pyx_t_3 = 0; + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":138 - * raise ValueError("itemsize <= 0 for cython.array") - * - * if not isinstance(format, bytes): # <<<<<<<<<<<<<< - * format = format.encode('ASCII') - * self._format = format # keep a reference to the byte string - */ - } +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); - /* "View.MemoryView":140 - * if not isinstance(format, bytes): - * format = format.encode('ASCII') - * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< - * self.format = self._format - * + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_format)->tp_name), 0))) __PYX_ERR(2, 140, __pyx_L1_error) - __pyx_t_3 = __pyx_v_format; - __Pyx_INCREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __Pyx_GOTREF(__pyx_v_self->_format); - __Pyx_DECREF(__pyx_v_self->_format); - __pyx_v_self->_format = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) - /* "View.MemoryView":141 - * format = format.encode('ASCII') - * self._format = format # keep a reference to the byte string - * self.format = self._format # <<<<<<<<<<<<<< - * - * + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): */ - if (unlikely(__pyx_v_self->_format == Py_None)) { - PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); - __PYX_ERR(2, 141, __pyx_L1_error) - } - __pyx_t_7 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(2, 141, __pyx_L1_error) - __pyx_v_self->format = __pyx_t_7; - /* "View.MemoryView":144 - * - * - * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< - * self._strides = self._shape + self.ndim - * + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); - /* "View.MemoryView":145 - * - * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) - * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< - * - * if not self._shape: +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) - /* "View.MemoryView":147 - * self._strides = self._shape + self.ndim - * - * if not self._shape: # <<<<<<<<<<<<<< - * raise MemoryError("unable to allocate shape and strides.") - * + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_t_4 = ((!(__pyx_v_self->_shape != 0)) != 0); - if (unlikely(__pyx_t_4)) { - /* "View.MemoryView":148 - * - * if not self._shape: - * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< - * + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":244 * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< + * char *mode, char *buf): + * cdef array result */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 148, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 148, __pyx_L1_error) - /* "View.MemoryView":147 - * self._strides = self._shape + self.ndim - * - * if not self._shape: # <<<<<<<<<<<<<< - * raise MemoryError("unable to allocate shape and strides.") +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("array_cwrapper", 0); + + /* "View.MemoryView":248 + * cdef array result * + * if buf == NULL: # <<<<<<<<<<<<<< + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: */ - } + __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":151 - * + /* "View.MemoryView":249 * - * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< - * if dim <= 0: - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * if buf == NULL: + * result = array(shape, itemsize, format, mode.decode('ASCII')) # <<<<<<<<<<<<<< + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), */ - __pyx_t_8 = 0; - __pyx_t_3 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_3); __pyx_t_1 = 0; - for (;;) { - if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(2, 151, __pyx_L1_error) - #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 151, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - #endif - __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 151, __pyx_L1_error) + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_shape); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_v_dim = __pyx_t_9; - __pyx_v_idx = __pyx_t_8; - __pyx_t_8 = (__pyx_t_8 + 1); + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_4); + __pyx_t_4 = 0; - /* "View.MemoryView":152 + /* "View.MemoryView":248 + * cdef array result * - * for idx, dim in enumerate(shape): - * if dim <= 0: # <<<<<<<<<<<<<< - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) - * self._shape[idx] = dim + * if buf == NULL: # <<<<<<<<<<<<<< + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: */ - __pyx_t_4 = ((__pyx_v_dim <= 0) != 0); - if (unlikely(__pyx_t_4)) { + goto __pyx_L3; + } - /* "View.MemoryView":153 - * for idx, dim in enumerate(shape): - * if dim <= 0: - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) # <<<<<<<<<<<<<< - * self._shape[idx] = dim - * + /* "View.MemoryView":251 + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< + * allocate_buffer=False) + * result.data = buf */ - __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_idx); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6); - __pyx_t_5 = 0; - __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 153, __pyx_L1_error) + /*else*/ { + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_shape); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_3); + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_3 = 0; - /* "View.MemoryView":152 + /* "View.MemoryView":252 + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), + * allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf * - * for idx, dim in enumerate(shape): - * if dim <= 0: # <<<<<<<<<<<<<< - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) - * self._shape[idx] = dim */ - } + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 252, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(1, 252, __pyx_L1_error) - /* "View.MemoryView":154 - * if dim <= 0: - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) - * self._shape[idx] = dim # <<<<<<<<<<<<<< - * - * cdef char order + /* "View.MemoryView":251 + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< + * allocate_buffer=False) + * result.data = buf */ - (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_5); + __pyx_t_5 = 0; - /* "View.MemoryView":151 - * + /* "View.MemoryView":253 + * result = array(shape, itemsize, format, mode.decode('ASCII'), + * allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< * - * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< - * if dim <= 0: - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * return result */ + __pyx_v_result->data = __pyx_v_buf; } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_L3:; - /* "View.MemoryView":157 + /* "View.MemoryView":255 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * * - * cdef char order - * if mode == 'fortran': # <<<<<<<<<<<<<< - * order = b'F' - * self.mode = u'fortran' */ - __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 157, __pyx_L1_error) - if (__pyx_t_4) { + __Pyx_XDECREF(((PyObject *)__pyx_r)); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = __pyx_v_result; + goto __pyx_L0; - /* "View.MemoryView":158 - * cdef char order - * if mode == 'fortran': - * order = b'F' # <<<<<<<<<<<<<< - * self.mode = u'fortran' - * elif mode == 'c': + /* "View.MemoryView":244 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< + * char *mode, char *buf): + * cdef array result */ - __pyx_v_order = 'F'; - /* "View.MemoryView":159 - * if mode == 'fortran': - * order = b'F' - * self.mode = u'fortran' # <<<<<<<<<<<<<< - * elif mode == 'c': - * order = b'C' - */ - __Pyx_INCREF(__pyx_n_u_fortran); - __Pyx_GIVEREF(__pyx_n_u_fortran); - __Pyx_GOTREF(__pyx_v_self->mode); - __Pyx_DECREF(__pyx_v_self->mode); - __pyx_v_self->mode = __pyx_n_u_fortran; + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":157 - * - * cdef char order - * if mode == 'fortran': # <<<<<<<<<<<<<< - * order = b'F' - * self.mode = u'fortran' +/* "View.MemoryView":281 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): */ - goto __pyx_L10; + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(1, 281, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + } + __pyx_v_name = values[0]; } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 281, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); - /* "View.MemoryView":160 - * order = b'F' - * self.mode = u'fortran' - * elif mode == 'c': # <<<<<<<<<<<<<< - * order = b'C' - * self.mode = u'c' - */ - __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 160, __pyx_L1_error) - if (likely(__pyx_t_4)) { + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":161 - * self.mode = u'fortran' - * elif mode == 'c': - * order = b'C' # <<<<<<<<<<<<<< - * self.mode = u'c' - * else: - */ - __pyx_v_order = 'C'; +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 0); - /* "View.MemoryView":162 - * elif mode == 'c': - * order = b'C' - * self.mode = u'c' # <<<<<<<<<<<<<< - * else: - * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + /* "View.MemoryView":282 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name */ - __Pyx_INCREF(__pyx_n_u_c); - __Pyx_GIVEREF(__pyx_n_u_c); - __Pyx_GOTREF(__pyx_v_self->mode); - __Pyx_DECREF(__pyx_v_self->mode); - __pyx_v_self->mode = __pyx_n_u_c; + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; - /* "View.MemoryView":160 - * order = b'F' - * self.mode = u'fortran' - * elif mode == 'c': # <<<<<<<<<<<<<< - * order = b'C' - * self.mode = u'c' + /* "View.MemoryView":281 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): */ - goto __pyx_L10; - } - /* "View.MemoryView":164 - * self.mode = u'c' - * else: - * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) # <<<<<<<<<<<<<< - * - * self.len = fill_contig_strides_array(self._shape, self._strides, - */ - /*else*/ { - __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_v_mode); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 164, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 164, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 164, __pyx_L1_error) - } - __pyx_L10:; + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":166 - * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) - * - * self.len = fill_contig_strides_array(self._shape, self._strides, # <<<<<<<<<<<<<< - * itemsize, self.ndim, order) +/* "View.MemoryView":283 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name * */ - __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); - /* "View.MemoryView":169 - * itemsize, self.ndim, order) - * - * self.free_data = allocate_buffer # <<<<<<<<<<<<<< - * self.dtype_is_object = format == b'O' - * if allocate_buffer: - */ - __pyx_v_self->free_data = __pyx_v_allocate_buffer; +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); - /* "View.MemoryView":170 - * - * self.free_data = allocate_buffer - * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< - * if allocate_buffer: - * - */ - __pyx_t_10 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 170, __pyx_L1_error) - __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 170, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_v_self->dtype_is_object = __pyx_t_4; + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":171 - * self.free_data = allocate_buffer - * self.dtype_is_object = format == b'O' - * if allocate_buffer: # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_4 = (__pyx_v_allocate_buffer != 0); - if (__pyx_t_4) { +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 0); - /* "View.MemoryView":174 - * + /* "View.MemoryView":284 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< * - * self.data = malloc(self.len) # <<<<<<<<<<<<<< - * if not self.data: - * raise MemoryError("unable to allocate array data.") + * cdef generic = Enum("") */ - __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; - /* "View.MemoryView":175 - * - * self.data = malloc(self.len) - * if not self.data: # <<<<<<<<<<<<<< - * raise MemoryError("unable to allocate array data.") + /* "View.MemoryView":283 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name * */ - __pyx_t_4 = ((!(__pyx_v_self->data != 0)) != 0); - if (unlikely(__pyx_t_4)) { - /* "View.MemoryView":176 - * self.data = malloc(self.len) - * if not self.data: - * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< - * - * if self.dtype_is_object: - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 176, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 176, __pyx_L1_error) + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":175 - * - * self.data = malloc(self.len) - * if not self.data: # <<<<<<<<<<<<<< - * raise MemoryError("unable to allocate array data.") - * +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict */ - } - /* "View.MemoryView":178 - * raise MemoryError("unable to allocate array data.") - * - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * p = self.data - * for i in range(self.len / itemsize): - */ - __pyx_t_4 = (__pyx_v_self->dtype_is_object != 0); - if (__pyx_t_4) { +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); - /* "View.MemoryView":179 - * - * if self.dtype_is_object: - * p = self.data # <<<<<<<<<<<<<< - * for i in range(self.len / itemsize): - * p[i] = Py_None - */ - __pyx_v_p = ((PyObject **)__pyx_v_self->data); + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":180 - * if self.dtype_is_object: - * p = self.data - * for i in range(self.len / itemsize): # <<<<<<<<<<<<<< - * p[i] = Py_None - * Py_INCREF(Py_None) - */ - if (unlikely(__pyx_v_itemsize == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); - __PYX_ERR(2, 180, __pyx_L1_error) - } - else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { - PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); - __PYX_ERR(2, 180, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_itemsize); - __pyx_t_9 = __pyx_t_1; - for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_9; __pyx_t_11+=1) { - __pyx_v_i = __pyx_t_11; +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); - /* "View.MemoryView":181 - * p = self.data - * for i in range(self.len / itemsize): - * p[i] = Py_None # <<<<<<<<<<<<<< - * Py_INCREF(Py_None) - * + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: */ - (__pyx_v_p[__pyx_v_i]) = Py_None; + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; - /* "View.MemoryView":182 - * for i in range(self.len / itemsize): - * p[i] = Py_None - * Py_INCREF(Py_None) # <<<<<<<<<<<<<< - * - * @cname('getbuffer') + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) */ - Py_INCREF(Py_None); - } + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; - /* "View.MemoryView":178 - * raise MemoryError("unable to allocate array data.") - * - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * p = self.data - * for i in range(self.len / itemsize): + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True */ - } + __pyx_t_2 = (__pyx_v__dict != Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { - /* "View.MemoryView":171 - * self.free_data = allocate_buffer - * self.dtype_is_object = format == b'O' - * if allocate_buffer: # <<<<<<<<<<<<<< - * - * + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); + __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); + __pyx_t_4 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True */ + goto __pyx_L3; } - /* "View.MemoryView":122 - * cdef bint dtype_is_object - * - * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< - * mode="c", bint allocate_buffer=True): - * + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_3; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + */ + __pyx_t_3 = (__pyx_v_use_setstate != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":13 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_184977713); + __Pyx_GIVEREF(__pyx_int_184977713); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_184977713); + __Pyx_GIVEREF(__pyx_int_184977713); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __pyx_t_5 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict */ /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_format); + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":185 - * - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< - * cdef int bufmode = -1 - * if self.mode == u"c": +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) */ /* Python wrapper */ -static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ -static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_r; +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_v_bufmode; - int __pyx_r; +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - char *__pyx_t_4; - Py_ssize_t __pyx_t_5; - int __pyx_t_6; - Py_ssize_t *__pyx_t_7; - if (__pyx_v_info == NULL) { - PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); - return -1; - } - __Pyx_RefNannySetupContext("__getbuffer__", 0); - __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(__pyx_v_info->obj); - - /* "View.MemoryView":186 - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): - * cdef int bufmode = -1 # <<<<<<<<<<<<<< - * if self.mode == u"c": - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - */ - __pyx_v_bufmode = -1; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); - /* "View.MemoryView":187 - * def __getbuffer__(self, Py_buffer *info, int flags): - * cdef int bufmode = -1 - * if self.mode == u"c": # <<<<<<<<<<<<<< - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": + /* "(tree fragment)":17 + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ - __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 187, __pyx_L1_error) - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":188 - * cdef int bufmode = -1 - * if self.mode == u"c": - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< - * elif self.mode == u"fortran": - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) */ - __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); - /* "View.MemoryView":187 - * def __getbuffer__(self, Py_buffer *info, int flags): - * cdef int bufmode = -1 - * if self.mode == u"c": # <<<<<<<<<<<<<< - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": - */ - goto __pyx_L3; - } - - /* "View.MemoryView":189 - * if self.mode == u"c": - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": # <<<<<<<<<<<<<< - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): - */ - __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 189, __pyx_L1_error) - __pyx_t_1 = (__pyx_t_2 != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":190 - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< - * if not (flags & bufmode): - * raise ValueError("Can only create a buffer that is contiguous in memory.") - */ - __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); - - /* "View.MemoryView":189 - * if self.mode == u"c": - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": # <<<<<<<<<<<<<< - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): - */ - } - __pyx_L3:; - - /* "View.MemoryView":191 - * elif self.mode == u"fortran": - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): # <<<<<<<<<<<<<< - * raise ValueError("Can only create a buffer that is contiguous in memory.") - * info.buf = self.data - */ - __pyx_t_1 = ((!((__pyx_v_flags & __pyx_v_bufmode) != 0)) != 0); - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":192 - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): - * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< - * info.buf = self.data - * info.len = self.len - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 192, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 192, __pyx_L1_error) - - /* "View.MemoryView":191 - * elif self.mode == u"fortran": - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): # <<<<<<<<<<<<<< - * raise ValueError("Can only create a buffer that is contiguous in memory.") - * info.buf = self.data - */ - } - - /* "View.MemoryView":193 - * if not (flags & bufmode): - * raise ValueError("Can only create a buffer that is contiguous in memory.") - * info.buf = self.data # <<<<<<<<<<<<<< - * info.len = self.len - * info.ndim = self.ndim - */ - __pyx_t_4 = __pyx_v_self->data; - __pyx_v_info->buf = __pyx_t_4; - - /* "View.MemoryView":194 - * raise ValueError("Can only create a buffer that is contiguous in memory.") - * info.buf = self.data - * info.len = self.len # <<<<<<<<<<<<<< - * info.ndim = self.ndim - * info.shape = self._shape - */ - __pyx_t_5 = __pyx_v_self->len; - __pyx_v_info->len = __pyx_t_5; - - /* "View.MemoryView":195 - * info.buf = self.data - * info.len = self.len - * info.ndim = self.ndim # <<<<<<<<<<<<<< - * info.shape = self._shape - * info.strides = self._strides - */ - __pyx_t_6 = __pyx_v_self->ndim; - __pyx_v_info->ndim = __pyx_t_6; - - /* "View.MemoryView":196 - * info.len = self.len - * info.ndim = self.ndim - * info.shape = self._shape # <<<<<<<<<<<<<< - * info.strides = self._strides - * info.suboffsets = NULL - */ - __pyx_t_7 = __pyx_v_self->_shape; - __pyx_v_info->shape = __pyx_t_7; + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":197 - * info.ndim = self.ndim - * info.shape = self._shape - * info.strides = self._strides # <<<<<<<<<<<<<< - * info.suboffsets = NULL - * info.itemsize = self.itemsize +/* "View.MemoryView":298 + * + * @cname('__pyx_align_pointer') + * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory */ - __pyx_t_7 = __pyx_v_self->_strides; - __pyx_v_info->strides = __pyx_t_7; - /* "View.MemoryView":198 - * info.shape = self._shape - * info.strides = self._strides - * info.suboffsets = NULL # <<<<<<<<<<<<<< - * info.itemsize = self.itemsize - * info.readonly = 0 - */ - __pyx_v_info->suboffsets = NULL; +static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) { + Py_intptr_t __pyx_v_aligned_p; + size_t __pyx_v_offset; + void *__pyx_r; + int __pyx_t_1; - /* "View.MemoryView":199 - * info.strides = self._strides - * info.suboffsets = NULL - * info.itemsize = self.itemsize # <<<<<<<<<<<<<< - * info.readonly = 0 + /* "View.MemoryView":300 + * cdef void *align_pointer(void *memory, size_t alignment) nogil: + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory # <<<<<<<<<<<<<< + * cdef size_t offset * */ - __pyx_t_5 = __pyx_v_self->itemsize; - __pyx_v_info->itemsize = __pyx_t_5; + __pyx_v_aligned_p = ((Py_intptr_t)__pyx_v_memory); - /* "View.MemoryView":200 - * info.suboffsets = NULL - * info.itemsize = self.itemsize - * info.readonly = 0 # <<<<<<<<<<<<<< + /* "View.MemoryView":304 * - * if flags & PyBUF_FORMAT: + * with cython.cdivision(True): + * offset = aligned_p % alignment # <<<<<<<<<<<<<< + * + * if offset > 0: */ - __pyx_v_info->readonly = 0; + __pyx_v_offset = (__pyx_v_aligned_p % __pyx_v_alignment); - /* "View.MemoryView":202 - * info.readonly = 0 + /* "View.MemoryView":306 + * offset = aligned_p % alignment + * + * if offset > 0: # <<<<<<<<<<<<<< + * aligned_p += alignment - offset * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * info.format = self.format - * else: */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + __pyx_t_1 = ((__pyx_v_offset > 0) != 0); if (__pyx_t_1) { - /* "View.MemoryView":203 + /* "View.MemoryView":307 * - * if flags & PyBUF_FORMAT: - * info.format = self.format # <<<<<<<<<<<<<< - * else: - * info.format = NULL - */ - __pyx_t_4 = __pyx_v_self->format; - __pyx_v_info->format = __pyx_t_4; - - /* "View.MemoryView":202 - * info.readonly = 0 + * if offset > 0: + * aligned_p += alignment - offset # <<<<<<<<<<<<<< * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * info.format = self.format - * else: + * return aligned_p */ - goto __pyx_L5; - } + __pyx_v_aligned_p = (__pyx_v_aligned_p + (__pyx_v_alignment - __pyx_v_offset)); - /* "View.MemoryView":205 - * info.format = self.format - * else: - * info.format = NULL # <<<<<<<<<<<<<< + /* "View.MemoryView":306 + * offset = aligned_p % alignment + * + * if offset > 0: # <<<<<<<<<<<<<< + * aligned_p += alignment - offset * - * info.obj = self */ - /*else*/ { - __pyx_v_info->format = NULL; } - __pyx_L5:; - /* "View.MemoryView":207 - * info.format = NULL + /* "View.MemoryView":309 + * aligned_p += alignment - offset + * + * return aligned_p # <<<<<<<<<<<<<< * - * info.obj = self # <<<<<<<<<<<<<< * - * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") */ - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); - __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + __pyx_r = ((void *)__pyx_v_aligned_p); + goto __pyx_L0; - /* "View.MemoryView":185 + /* "View.MemoryView":298 * - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< - * cdef int bufmode = -1 - * if self.mode == u"c": + * @cname('__pyx_align_pointer') + * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory */ /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - if (__pyx_v_info->obj != NULL) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - goto __pyx_L2; __pyx_L0:; - if (__pyx_v_info->obj == Py_None) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - __pyx_L2:; - __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":211 - * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") +/* "View.MemoryView":345 + * cdef __Pyx_TypeInfo *typeinfo * - * def __dealloc__(array self): # <<<<<<<<<<<<<< - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags */ /* Python wrapper */ -static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + int __pyx_r; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_obj)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_flags)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(1, 345, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dtype_is_object); + if (value) { values[2] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(1, 345, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 345, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 345, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 345, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); /* function exit code */ __Pyx_RefNannyFinishContext(); + return __pyx_r; } -static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; - __Pyx_RefNannySetupContext("__dealloc__", 0); + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("__cinit__", 0); - /* "View.MemoryView":212 + /* "View.MemoryView":346 * - * def __dealloc__(array self): - * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< - * self.callback_free_data(self.data) - * elif self.free_data: + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: */ - __pyx_t_1 = ((__pyx_v_self->callback_free_data != NULL) != 0); - if (__pyx_t_1) { + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; - /* "View.MemoryView":213 - * def __dealloc__(array self): - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) # <<<<<<<<<<<<<< - * elif self.free_data: - * if self.dtype_is_object: + /* "View.MemoryView":347 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) */ - __pyx_v_self->callback_free_data(__pyx_v_self->data); + __pyx_v_self->flags = __pyx_v_flags; - /* "View.MemoryView":212 - * - * def __dealloc__(array self): - * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< - * self.callback_free_data(self.data) - * elif self.free_data: + /* "View.MemoryView":348 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: */ - goto __pyx_L3; + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + __pyx_t_3 = (__pyx_t_2 != 0); + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; } + __pyx_t_3 = (__pyx_v_obj != Py_None); + __pyx_t_2 = (__pyx_t_3 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { - /* "View.MemoryView":214 - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) - * elif self.free_data: # <<<<<<<<<<<<<< - * if self.dtype_is_object: - * refcount_objects_in_slice(self.data, self._shape, + /* "View.MemoryView":349 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None */ - __pyx_t_1 = (__pyx_v_self->free_data != 0); - if (__pyx_t_1) { + __pyx_t_4 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 349, __pyx_L1_error) - /* "View.MemoryView":215 - * self.callback_free_data(self.data) - * elif self.free_data: - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * refcount_objects_in_slice(self.data, self._shape, - * self._strides, self.ndim, False) + /* "View.MemoryView":350 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) */ - __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); + __pyx_t_1 = ((((PyObject *)__pyx_v_self->view.obj) == NULL) != 0); if (__pyx_t_1) { - /* "View.MemoryView":216 - * elif self.free_data: - * if self.dtype_is_object: - * refcount_objects_in_slice(self.data, self._shape, # <<<<<<<<<<<<<< - * self._strides, self.ndim, False) - * free(self.data) + /* "View.MemoryView":351 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * */ - __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; - /* "View.MemoryView":215 - * self.callback_free_data(self.data) - * elif self.free_data: - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * refcount_objects_in_slice(self.data, self._shape, - * self._strides, self.ndim, False) + /* "View.MemoryView":352 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * global __pyx_memoryview_thread_locks_used */ - } + Py_INCREF(Py_None); - /* "View.MemoryView":218 - * refcount_objects_in_slice(self.data, self._shape, - * self._strides, self.ndim, False) - * free(self.data) # <<<<<<<<<<<<<< - * PyObject_Free(self._shape) - * + /* "View.MemoryView":350 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) */ - free(__pyx_v_self->data); + } - /* "View.MemoryView":214 - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) - * elif self.free_data: # <<<<<<<<<<<<<< - * if self.dtype_is_object: - * refcount_objects_in_slice(self.data, self._shape, + /* "View.MemoryView":348 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: */ } - __pyx_L3:; - /* "View.MemoryView":219 - * self._strides, self.ndim, False) - * free(self.data) - * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + /* "View.MemoryView":355 * - * @property + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 */ - PyObject_Free(__pyx_v_self->_shape); + __pyx_t_1 = ((__pyx_memoryview_thread_locks_used < 8) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":211 - * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") - * - * def __dealloc__(array self): # <<<<<<<<<<<<<< - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) + /* "View.MemoryView":356 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "View.MemoryView":222 - * - * @property - * def memview(self): # <<<<<<<<<<<<<< - * return self.get_memview() + /* "View.MemoryView":357 + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":355 * + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 */ + } -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + /* "View.MemoryView":358 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (__pyx_t_1) { - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":359 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); -static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__get__", 0); + /* "View.MemoryView":360 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":223 - * @property - * def memview(self): - * return self.get_memview() # <<<<<<<<<<<<<< + /* "View.MemoryView":361 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< * - * @cname('get_memview') + * if flags & PyBUF_FORMAT: */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 223, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; + PyErr_NoMemory(); __PYX_ERR(1, 361, __pyx_L1_error) - /* "View.MemoryView":222 + /* "View.MemoryView":360 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError * - * @property - * def memview(self): # <<<<<<<<<<<<<< - * return self.get_memview() + */ + } + + /* "View.MemoryView":358 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":363 + * raise MemoryError * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":364 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = (((__pyx_v_self->view.format[0]) == 'O') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_2 = (((__pyx_v_self->view.format[1]) == '\x00') != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L11_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; -/* "View.MemoryView":226 + /* "View.MemoryView":363 + * raise MemoryError * - * @cname('get_memview') - * cdef get_memview(self): # <<<<<<<<<<<<<< - * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE - * return memoryview(self, flags, self.dtype_is_object) + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: */ + goto __pyx_L10; + } -static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { - int __pyx_v_flags; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - __Pyx_RefNannySetupContext("get_memview", 0); + /* "View.MemoryView":366 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L10:; - /* "View.MemoryView":227 - * @cname('get_memview') - * cdef get_memview(self): - * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< - * return memoryview(self, flags, self.dtype_is_object) + /* "View.MemoryView":368 + * self.dtype_is_object = dtype_is_object * + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( # <<<<<<<<<<<<<< + * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) + * self.typeinfo = NULL */ - __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + __pyx_v_self->acquisition_count_aligned_p = ((__pyx_atomic_int *)__pyx_align_pointer(((void *)(&(__pyx_v_self->acquisition_count[0]))), (sizeof(__pyx_atomic_int)))); - /* "View.MemoryView":228 - * cdef get_memview(self): - * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE - * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + /* "View.MemoryView":370 + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) + * self.typeinfo = NULL # <<<<<<<<<<<<<< * - * def __len__(self): + * def __dealloc__(memoryview self): */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); - PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + __pyx_v_self->typeinfo = NULL; - /* "View.MemoryView":226 + /* "View.MemoryView":345 + * cdef __Pyx_TypeInfo *typeinfo * - * @cname('get_memview') - * cdef get_memview(self): # <<<<<<<<<<<<<< - * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE - * return memoryview(self, flags, self.dtype_is_object) + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags */ /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":230 - * return memoryview(self, flags, self.dtype_is_object) - * - * def __len__(self): # <<<<<<<<<<<<<< - * return self._shape[0] +/* "View.MemoryView":372 + * self.typeinfo = NULL * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) */ /* Python wrapper */ -static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ -static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { - Py_ssize_t __pyx_r; +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); - return __pyx_r; } -static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { - Py_ssize_t __pyx_r; +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__len__", 0); + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyThread_type_lock __pyx_t_6; + PyThread_type_lock __pyx_t_7; + __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "View.MemoryView":231 + /* "View.MemoryView":373 * - * def __len__(self): - * return self._shape[0] # <<<<<<<<<<<<<< - * - * def __getattr__(self, attr): + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: */ - __pyx_r = (__pyx_v_self->_shape[0]); - goto __pyx_L0; + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { - /* "View.MemoryView":230 - * return memoryview(self, flags, self.dtype_is_object) - * - * def __len__(self): # <<<<<<<<<<<<<< - * return self._shape[0] + /* "View.MemoryView":374 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * elif (<__pyx_buffer *> &self.view).obj == Py_None: * */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":233 - * return self._shape[0] - * - * def __getattr__(self, attr): # <<<<<<<<<<<<<< - * return getattr(self.memview, attr) + /* "View.MemoryView":373 * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: */ + goto __pyx_L3; + } -/* Python wrapper */ -static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ -static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("__getattr__", 0); - - /* "View.MemoryView":234 - * - * def __getattr__(self, attr): - * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + /* "View.MemoryView":375 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< * - * def __getitem__(self, item): + * (<__pyx_buffer *> &self.view).obj = NULL */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 234, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 234, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + __pyx_t_2 = ((((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":233 - * return self._shape[0] + /* "View.MemoryView":377 + * elif (<__pyx_buffer *> &self.view).obj == Py_None: * - * def __getattr__(self, attr): # <<<<<<<<<<<<<< - * return getattr(self.memview, attr) + * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< + * Py_DECREF(Py_None) * */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":236 - * return getattr(self.memview, attr) + /* "View.MemoryView":378 * - * def __getitem__(self, item): # <<<<<<<<<<<<<< - * return self.memview[item] + * (<__pyx_buffer *> &self.view).obj = NULL + * Py_DECREF(Py_None) # <<<<<<<<<<<<<< * + * cdef int i */ + Py_DECREF(Py_None); -/* Python wrapper */ -static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ -static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("__getitem__", 0); - - /* "View.MemoryView":237 - * - * def __getitem__(self, item): - * return self.memview[item] # <<<<<<<<<<<<<< + /* "View.MemoryView":375 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< * - * def __setitem__(self, item, value): + * (<__pyx_buffer *> &self.view).obj = NULL */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + } + __pyx_L3:; - /* "View.MemoryView":236 - * return getattr(self.memview, attr) - * - * def __getitem__(self, item): # <<<<<<<<<<<<<< - * return self.memview[item] - * + /* "View.MemoryView":382 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: */ + __pyx_t_2 = ((__pyx_v_self->lock != NULL) != 0); + if (__pyx_t_2) { - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":239 - * return self.memview[item] - * - * def __setitem__(self, item, value): # <<<<<<<<<<<<<< - * self.memview[item] = value - * + /* "View.MemoryView":383 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 */ + __pyx_t_3 = __pyx_memoryview_thread_locks_used; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; -/* Python wrapper */ -static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":384 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_2 = (((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock) != 0); + if (__pyx_t_2) { -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__setitem__", 0); + /* "View.MemoryView":385 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); - /* "View.MemoryView":240 - * - * def __setitem__(self, item, value): - * self.memview[item] = value # <<<<<<<<<<<<<< - * - * + /* "View.MemoryView":386 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 240, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0)) __PYX_ERR(2, 240, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_2 = ((__pyx_v_i != __pyx_memoryview_thread_locks_used) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":239 - * return self.memview[item] - * - * def __setitem__(self, item, value): # <<<<<<<<<<<<<< - * self.memview[item] = value - * + /* "View.MemoryView":388 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: */ + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_7 = (__pyx_memoryview_thread_locks[__pyx_v_i]); - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":387 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_6; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_7; -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): + /* "View.MemoryView":386 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) */ + } -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + /* "View.MemoryView":389 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":384 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":391 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":382 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":372 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ /* function exit code */ __Pyx_RefNannyFinishContext(); - return __pyx_r; } -static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; +/* "View.MemoryView":393 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + __Pyx_RefNannySetupContext("get_item_pointer", 0); - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + /* "View.MemoryView":395 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): + /* "View.MemoryView":397 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 397, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 397, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(1, 397, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 397, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(1, 397, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 397, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 397, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":398 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 398, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(1, 398, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":397 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":400 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":393 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") +/* "View.MemoryView":403 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self */ /* Python wrapper */ -static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + char *__pyx_t_6; + __Pyx_RefNannySetupContext("__getitem__", 0); - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + /* "View.MemoryView":404 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":244 + /* "View.MemoryView":405 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< * - * @cname("__pyx_array_new") - * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< - * char *mode, char *buf): - * cdef array result + * have_slices, indices = _unellipsify(index, self.view.ndim) */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; -static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_mode, char *__pyx_v_buf) { - struct __pyx_array_obj *__pyx_v_result = 0; - struct __pyx_array_obj *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - __Pyx_RefNannySetupContext("array_cwrapper", 0); - - /* "View.MemoryView":248 - * cdef array result + /* "View.MemoryView":404 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self * - * if buf == NULL: # <<<<<<<<<<<<<< - * result = array(shape, itemsize, format, mode.decode('ASCII')) - * else: */ - __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); - if (__pyx_t_1) { + } - /* "View.MemoryView":249 + /* "View.MemoryView":407 + * return self * - * if buf == NULL: - * result = array(shape, itemsize, format, mode.decode('ASCII')) # <<<<<<<<<<<<<< - * else: - * result = array(shape, itemsize, format, mode.decode('ASCII'), + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp */ - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 249, __pyx_L1_error) + __pyx_t_3 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 407, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (likely(__pyx_t_3 != Py_None)) { + PyObject* sequence = __pyx_t_3; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 407, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 407, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 249, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 407, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __Pyx_INCREF(__pyx_v_shape); - __Pyx_GIVEREF(__pyx_v_shape); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_shape); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4); - __pyx_t_2 = 0; - __pyx_t_3 = 0; - __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_4); - __pyx_t_4 = 0; + #endif + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 407, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_v_indices = __pyx_t_5; + __pyx_t_5 = 0; - /* "View.MemoryView":248 - * cdef array result + /* "View.MemoryView":410 * - * if buf == NULL: # <<<<<<<<<<<<<< - * result = array(shape, itemsize, format, mode.decode('ASCII')) - * else: + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: */ - goto __pyx_L3; - } + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(1, 410, __pyx_L1_error) + if (__pyx_t_2) { - /* "View.MemoryView":251 - * result = array(shape, itemsize, format, mode.decode('ASCII')) - * else: - * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< - * allocate_buffer=False) - * result.data = buf + /* "View.MemoryView":411 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) */ - /*else*/ { - __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 251, __pyx_L1_error) + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 411, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_v_shape); - __Pyx_GIVEREF(__pyx_v_shape); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_shape); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_3); - __pyx_t_4 = 0; - __pyx_t_5 = 0; + __pyx_r = __pyx_t_3; __pyx_t_3 = 0; + goto __pyx_L0; - /* "View.MemoryView":252 - * else: - * result = array(shape, itemsize, format, mode.decode('ASCII'), - * allocate_buffer=False) # <<<<<<<<<<<<<< - * result.data = buf + /* "View.MemoryView":410 * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: */ - __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 252, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(2, 252, __pyx_L1_error) + } - /* "View.MemoryView":251 - * result = array(shape, itemsize, format, mode.decode('ASCII')) - * else: - * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< - * allocate_buffer=False) - * result.data = buf + /* "View.MemoryView":413 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * */ - __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_5); - __pyx_t_5 = 0; + /*else*/ { + __pyx_t_6 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_6 == ((char *)NULL))) __PYX_ERR(1, 413, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_6; - /* "View.MemoryView":253 - * result = array(shape, itemsize, format, mode.decode('ASCII'), - * allocate_buffer=False) - * result.data = buf # <<<<<<<<<<<<<< + /* "View.MemoryView":414 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< * - * return result + * def __setitem__(memoryview self, object index, object value): */ - __pyx_v_result->data = __pyx_v_buf; + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 414, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; } - __pyx_L3:; - /* "View.MemoryView":255 - * result.data = buf - * - * return result # <<<<<<<<<<<<<< - * + /* "View.MemoryView":403 * - */ - __Pyx_XDECREF(((PyObject *)__pyx_r)); - __Pyx_INCREF(((PyObject *)__pyx_v_result)); - __pyx_r = __pyx_v_result; - goto __pyx_L0; - - /* "View.MemoryView":244 * - * @cname("__pyx_array_new") - * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< - * char *mode, char *buf): - * cdef array result + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_result); - __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":281 - * cdef class Enum(object): - * cdef object name - * def __init__(self, name): # <<<<<<<<<<<<<< - * self.name = name - * def __repr__(self): +/* "View.MemoryView":416 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") */ /* Python wrapper */ -static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_name = 0; +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { int __pyx_r; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; - PyObject* values[1] = {0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(2, 281, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - } - __pyx_v_name = values[0]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 281, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; int __pyx_r; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__", 0); + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); - /* "View.MemoryView":282 - * cdef object name - * def __init__(self, name): - * self.name = name # <<<<<<<<<<<<<< - * def __repr__(self): - * return self.name + /* "View.MemoryView":417 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError("Cannot assign to read-only memoryview") + * */ - __Pyx_INCREF(__pyx_v_name); - __Pyx_GIVEREF(__pyx_v_name); - __Pyx_GOTREF(__pyx_v_self->name); - __Pyx_DECREF(__pyx_v_self->name); - __pyx_v_self->name = __pyx_v_name; + __pyx_t_1 = (__pyx_v_self->view.readonly != 0); + if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":281 - * cdef class Enum(object): - * cdef object name - * def __init__(self, name): # <<<<<<<<<<<<<< - * self.name = name - * def __repr__(self): + /* "View.MemoryView":418 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 418, __pyx_L1_error) - /* function exit code */ - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":283 - * def __init__(self, name): - * self.name = name - * def __repr__(self): # <<<<<<<<<<<<<< - * return self.name + /* "View.MemoryView":417 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError("Cannot assign to read-only memoryview") * */ + } -/* Python wrapper */ -static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); - __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__repr__", 0); - - /* "View.MemoryView":284 - * self.name = name - * def __repr__(self): - * return self.name # <<<<<<<<<<<<<< + /* "View.MemoryView":420 + * raise TypeError("Cannot assign to read-only memoryview") * - * cdef generic = Enum("") + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->name); - __pyx_r = __pyx_v_self->name; - goto __pyx_L0; + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 420, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 420, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_4); + __pyx_t_4 = 0; - /* "View.MemoryView":283 - * def __init__(self, name): - * self.name = name - * def __repr__(self): # <<<<<<<<<<<<<< - * return self.name + /* "View.MemoryView":422 + * have_slices, index = _unellipsify(index, self.view.ndim) * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 422, __pyx_L1_error) + if (__pyx_t_1) { - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict + /* "View.MemoryView":423 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 423, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_obj = __pyx_t_2; + __pyx_t_2 = 0; -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { - PyObject *__pyx_v_state = 0; - PyObject *__pyx_v__dict = 0; - int __pyx_v_use_setstate; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":5 - * cdef object _dict - * cdef bint use_setstate - * state = (self.name,) # <<<<<<<<<<<<<< - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: + /* "View.MemoryView":424 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: */ - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v_self->name); - __Pyx_GIVEREF(__pyx_v_self->name); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); - __pyx_v_state = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 424, __pyx_L1_error) + if (__pyx_t_1) { - /* "(tree fragment)":6 - * cdef bint use_setstate - * state = (self.name,) - * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< - * if _dict is not None: - * state += (_dict,) + /* "View.MemoryView":425 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) */ - __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v__dict = __pyx_t_1; - __pyx_t_1 = 0; + __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_2, __pyx_v_obj); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "(tree fragment)":7 - * state = (self.name,) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - __pyx_t_2 = (__pyx_v__dict != Py_None); - __pyx_t_3 = (__pyx_t_2 != 0); - if (__pyx_t_3) { - - /* "(tree fragment)":8 - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - * state += (_dict,) # <<<<<<<<<<<<<< - * use_setstate = True - * else: - */ - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v__dict); - __Pyx_GIVEREF(__pyx_v__dict); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); - __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); - __pyx_t_4 = 0; - - /* "(tree fragment)":9 - * if _dict is not None: - * state += (_dict,) - * use_setstate = True # <<<<<<<<<<<<<< - * else: - * use_setstate = self.name is not None - */ - __pyx_v_use_setstate = 1; - - /* "(tree fragment)":7 - * state = (self.name,) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - goto __pyx_L3; - } - - /* "(tree fragment)":11 - * use_setstate = True - * else: - * use_setstate = self.name is not None # <<<<<<<<<<<<<< - * if use_setstate: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state - */ - /*else*/ { - __pyx_t_3 = (__pyx_v_self->name != Py_None); - __pyx_v_use_setstate = __pyx_t_3; - } - __pyx_L3:; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.name is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state - * else: + /* "View.MemoryView":424 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: */ - __pyx_t_3 = (__pyx_v_use_setstate != 0); - if (__pyx_t_3) { + goto __pyx_L5; + } - /* "(tree fragment)":13 - * use_setstate = self.name is not None - * if use_setstate: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state # <<<<<<<<<<<<<< - * else: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + /* "View.MemoryView":427 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) */ - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_184977713); - __Pyx_GIVEREF(__pyx_int_184977713); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); - __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state); - __pyx_t_4 = 0; - __pyx_t_1 = 0; - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L0; + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_memoryview_type))))) __PYX_ERR(1, 427, __pyx_L1_error) + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_4), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L5:; - /* "(tree fragment)":12 - * else: - * use_setstate = self.name is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state - * else: + /* "View.MemoryView":422 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: */ + goto __pyx_L4; } - /* "(tree fragment)":15 - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state - * else: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_Enum__set_state(self, __pyx_state) + /* "View.MemoryView":429 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): */ /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_184977713); - __Pyx_GIVEREF(__pyx_int_184977713); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); - __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); - __pyx_t_5 = 0; - __pyx_t_1 = 0; - __pyx_r = __pyx_t_4; - __pyx_t_4 = 0; - goto __pyx_L0; + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } + __pyx_L4:; - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict + /* "View.MemoryView":416 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") */ /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_state); - __Pyx_XDECREF(__pyx_v__dict); - __Pyx_XGIVEREF(__pyx_r); + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "(tree fragment)":16 - * else: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_Enum__set_state(self, __pyx_state) +/* "View.MemoryView":431 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: */ -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); - /* "(tree fragment)":17 - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + /* "View.MemoryView":432 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 17, __pyx_L1_error) - __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { - /* "(tree fragment)":16 - * else: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_Enum__set_state(self, __pyx_state) + /* "View.MemoryView":433 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":298 - * - * @cname('__pyx_align_pointer') - * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< - * "Align pointer memory on a given boundary" - * cdef Py_intptr_t aligned_p = memory + /* "View.MemoryView":434 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: */ + __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 434, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); -static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) { - Py_intptr_t __pyx_v_aligned_p; - size_t __pyx_v_offset; - void *__pyx_r; - int __pyx_t_1; + /* "View.MemoryView":435 + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 435, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); - /* "View.MemoryView":300 - * cdef void *align_pointer(void *memory, size_t alignment) nogil: - * "Align pointer memory on a given boundary" - * cdef Py_intptr_t aligned_p = memory # <<<<<<<<<<<<<< - * cdef size_t offset - * + /* "View.MemoryView":434 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: */ - __pyx_v_aligned_p = ((Py_intptr_t)__pyx_v_memory); + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 434, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 434, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; - /* "View.MemoryView":304 - * - * with cython.cdivision(True): - * offset = aligned_p % alignment # <<<<<<<<<<<<<< - * - * if offset > 0: + /* "View.MemoryView":433 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) */ - __pyx_v_offset = (__pyx_v_aligned_p % __pyx_v_alignment); + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - /* "View.MemoryView":306 - * offset = aligned_p % alignment - * - * if offset > 0: # <<<<<<<<<<<<<< - * aligned_p += alignment - offset + /* "View.MemoryView":436 + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None * */ - __pyx_t_1 = ((__pyx_v_offset > 0) != 0); - if (__pyx_t_1) { + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(1, 436, __pyx_L6_except_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GOTREF(__pyx_t_6); - /* "View.MemoryView":307 - * - * if offset > 0: - * aligned_p += alignment - offset # <<<<<<<<<<<<<< + /* "View.MemoryView":437 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< * - * return aligned_p + * return obj */ - __pyx_v_aligned_p = (__pyx_v_aligned_p + (__pyx_v_alignment - __pyx_v_offset)); + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + __pyx_L6_except_error:; - /* "View.MemoryView":306 - * offset = aligned_p % alignment - * - * if offset > 0: # <<<<<<<<<<<<<< - * aligned_p += alignment - offset + /* "View.MemoryView":433 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":432 * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, */ } - /* "View.MemoryView":309 - * aligned_p += alignment - offset - * - * return aligned_p # <<<<<<<<<<<<<< + /* "View.MemoryView":439 + * return None * + * return obj # <<<<<<<<<<<<<< * + * cdef setitem_slice_assignment(self, dst, src): */ - __pyx_r = ((void *)__pyx_v_aligned_p); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; goto __pyx_L0; - /* "View.MemoryView":298 + /* "View.MemoryView":431 + * self.setitem_indexed(index, value) * - * @cname('__pyx_align_pointer') - * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< - * "Align pointer memory on a given boundary" - * cdef Py_intptr_t aligned_p = memory + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: */ /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":345 - * cdef __Pyx_TypeInfo *typeinfo +/* "View.MemoryView":441 + * return obj * - * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< - * self.obj = obj - * self.flags = flags + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice */ -/* Python wrapper */ -static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_obj = 0; - int __pyx_v_flags; - int __pyx_v_dtype_is_object; - int __pyx_r; +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; - PyObject* values[3] = {0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_obj)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_flags)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(2, 345, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dtype_is_object); - if (value) { values[2] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 345, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_obj = values[0]; - __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 345, __pyx_L3_error) - if (values[2]) { - __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 345, __pyx_L3_error) - } else { - __pyx_v_dtype_is_object = ((int)0); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 345, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + __Pyx_memviewslice *__pyx_t_1; + __Pyx_memviewslice *__pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 0); + + /* "View.MemoryView":445 + * cdef __Pyx_memviewslice src_slice + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(1, 445, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 445, __pyx_L1_error) + + /* "View.MemoryView":446 + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], + * get_slice_from_memview(dst, &dst_slice)[0], # <<<<<<<<<<<<<< + * src.ndim, dst.ndim, self.dtype_is_object) + * + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(1, 446, __pyx_L1_error) + __pyx_t_2 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_2 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 446, __pyx_L1_error) + + /* "View.MemoryView":447 + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 447, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 447, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 447, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 447, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":445 + * cdef __Pyx_memviewslice src_slice + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) + */ + __pyx_t_6 = __pyx_memoryview_copy_contents((__pyx_t_1[0]), (__pyx_t_2[0]), __pyx_t_4, __pyx_t_5, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 445, __pyx_L1_error) + + /* "View.MemoryView":441 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { - int __pyx_r; +/* "View.MemoryView":449 + * src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; + __Pyx_memviewslice *__pyx_t_1; int __pyx_t_2; - int __pyx_t_3; + PyObject *__pyx_t_3 = NULL; int __pyx_t_4; - __Pyx_RefNannySetupContext("__cinit__", 0); + int __pyx_t_5; + char const *__pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 0); - /* "View.MemoryView":346 + /* "View.MemoryView":451 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item * - * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): - * self.obj = obj # <<<<<<<<<<<<<< - * self.flags = flags - * if type(self) is memoryview or obj is not None: - */ - __Pyx_INCREF(__pyx_v_obj); - __Pyx_GIVEREF(__pyx_v_obj); - __Pyx_GOTREF(__pyx_v_self->obj); - __Pyx_DECREF(__pyx_v_self->obj); - __pyx_v_self->obj = __pyx_v_obj; - - /* "View.MemoryView":347 - * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): - * self.obj = obj - * self.flags = flags # <<<<<<<<<<<<<< - * if type(self) is memoryview or obj is not None: - * __Pyx_GetBuffer(obj, &self.view, flags) */ - __pyx_v_self->flags = __pyx_v_flags; + __pyx_v_tmp = NULL; - /* "View.MemoryView":348 - * self.obj = obj - * self.flags = flags - * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: + /* "View.MemoryView":456 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): */ - __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); - __pyx_t_3 = (__pyx_t_2 != 0); - if (!__pyx_t_3) { - } else { - __pyx_t_1 = __pyx_t_3; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_3 = (__pyx_v_obj != Py_None); - __pyx_t_2 = (__pyx_t_3 != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - if (__pyx_t_1) { + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 456, __pyx_L1_error) + __pyx_v_dst_slice = __pyx_t_1; - /* "View.MemoryView":349 - * self.flags = flags - * if type(self) is memoryview or obj is not None: - * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< - * if self.view.obj == NULL: - * (<__pyx_buffer *> &self.view).obj = Py_None + /* "View.MemoryView":458 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: */ - __pyx_t_4 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 349, __pyx_L1_error) + __pyx_t_2 = ((((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":350 - * if type(self) is memoryview or obj is not None: - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: # <<<<<<<<<<<<<< - * (<__pyx_buffer *> &self.view).obj = Py_None - * Py_INCREF(Py_None) + /* "View.MemoryView":459 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError */ - __pyx_t_1 = ((((PyObject *)__pyx_v_self->view.obj) == NULL) != 0); - if (__pyx_t_1) { + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); - /* "View.MemoryView":351 - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: - * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< - * Py_INCREF(Py_None) - * + /* "View.MemoryView":460 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp */ - ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + __pyx_t_2 = ((__pyx_v_tmp == NULL) != 0); + if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":352 - * if self.view.obj == NULL: - * (<__pyx_buffer *> &self.view).obj = Py_None - * Py_INCREF(Py_None) # <<<<<<<<<<<<<< - * - * global __pyx_memoryview_thread_locks_used + /* "View.MemoryView":461 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: */ - Py_INCREF(Py_None); + PyErr_NoMemory(); __PYX_ERR(1, 461, __pyx_L1_error) - /* "View.MemoryView":350 - * if type(self) is memoryview or obj is not None: - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: # <<<<<<<<<<<<<< - * (<__pyx_buffer *> &self.view).obj = Py_None - * Py_INCREF(Py_None) + /* "View.MemoryView":460 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp */ } - /* "View.MemoryView":348 - * self.obj = obj - * self.flags = flags - * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: + /* "View.MemoryView":462 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array */ - } + __pyx_v_item = __pyx_v_tmp; - /* "View.MemoryView":355 + /* "View.MemoryView":458 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) * - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: */ - __pyx_t_1 = ((__pyx_memoryview_thread_locks_used < 8) != 0); - if (__pyx_t_1) { + goto __pyx_L3; + } - /* "View.MemoryView":356 - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: - */ - __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); - - /* "View.MemoryView":357 - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() - */ - __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); - - /* "View.MemoryView":355 + /* "View.MemoryView":464 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< * - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 + * try: */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); } + __pyx_L3:; - /* "View.MemoryView":358 - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: # <<<<<<<<<<<<<< - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: - */ - __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":359 - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< - * if self.lock is NULL: - * raise MemoryError + /* "View.MemoryView":466 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value */ - __pyx_v_self->lock = PyThread_allocate_lock(); + /*try:*/ { - /* "View.MemoryView":360 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: # <<<<<<<<<<<<<< - * raise MemoryError + /* "View.MemoryView":467 * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: */ - __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); - if (unlikely(__pyx_t_1)) { + __pyx_t_2 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_2) { - /* "View.MemoryView":361 - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: - * raise MemoryError # <<<<<<<<<<<<<< - * - * if flags & PyBUF_FORMAT: + /* "View.MemoryView":468 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) */ - PyErr_NoMemory(); __PYX_ERR(2, 361, __pyx_L1_error) + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); - /* "View.MemoryView":360 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: # <<<<<<<<<<<<<< - * raise MemoryError + /* "View.MemoryView":467 * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: */ + goto __pyx_L8; } - /* "View.MemoryView":358 - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: # <<<<<<<<<<<<<< - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: - */ - } - - /* "View.MemoryView":363 - * raise MemoryError + /* "View.MemoryView":470 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') - * else: */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); - if (__pyx_t_1) { + /*else*/ { + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 470, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L8:; - /* "View.MemoryView":364 + /* "View.MemoryView":474 * - * if flags & PyBUF_FORMAT: - * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< - * else: - * self.dtype_is_object = dtype_is_object + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, */ - __pyx_t_2 = (((__pyx_v_self->view.format[0]) == 'O') != 0); + __pyx_t_2 = ((__pyx_v_self->view.suboffsets != NULL) != 0); if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L11_bool_binop_done; - } - __pyx_t_2 = (((__pyx_v_self->view.format[1]) == '\x00') != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L11_bool_binop_done:; - __pyx_v_self->dtype_is_object = __pyx_t_1; - /* "View.MemoryView":363 - * raise MemoryError + /* "View.MemoryView":475 * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') - * else: + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) */ - goto __pyx_L10; - } + __pyx_t_3 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 475, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":366 - * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') - * else: - * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + /* "View.MemoryView":474 * - * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, */ - /*else*/ { - __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; - } - __pyx_L10:; + } - /* "View.MemoryView":368 - * self.dtype_is_object = dtype_is_object - * - * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( # <<<<<<<<<<<<<< - * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) - * self.typeinfo = NULL + /* "View.MemoryView":476 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: */ - __pyx_v_self->acquisition_count_aligned_p = ((__pyx_atomic_int *)__pyx_align_pointer(((void *)(&(__pyx_v_self->acquisition_count[0]))), (sizeof(__pyx_atomic_int)))); + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } - /* "View.MemoryView":370 - * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( - * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) - * self.typeinfo = NULL # <<<<<<<<<<<<<< + /* "View.MemoryView":479 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< * - * def __dealloc__(memoryview self): + * cdef setitem_indexed(self, index, value): */ - __pyx_v_self->typeinfo = NULL; + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + } + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; + goto __pyx_L1_error; + } + __pyx_L7:; + } - /* "View.MemoryView":345 - * cdef __Pyx_TypeInfo *typeinfo + /* "View.MemoryView":449 + * src.ndim, dst.ndim, self.dtype_is_object) * - * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< - * self.obj = obj - * self.flags = flags + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL */ /* function exit code */ - __pyx_r = 0; + __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; - __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":372 - * self.typeinfo = NULL +/* "View.MemoryView":481 + * PyMem_Free(tmp) * - * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) */ -/* Python wrapper */ -static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { - int __pyx_v_i; +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - PyThread_type_lock __pyx_t_6; - PyThread_type_lock __pyx_t_7; - __Pyx_RefNannySetupContext("__dealloc__", 0); + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("setitem_indexed", 0); - /* "View.MemoryView":373 + /* "View.MemoryView":482 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) * - * def __dealloc__(memoryview self): - * if self.obj is not None: # <<<<<<<<<<<<<< - * __Pyx_ReleaseBuffer(&self.view) - * elif (<__pyx_buffer *> &self.view).obj == Py_None: */ - __pyx_t_1 = (__pyx_v_self->obj != Py_None); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(1, 482, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; - /* "View.MemoryView":374 - * def __dealloc__(memoryview self): - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< - * elif (<__pyx_buffer *> &self.view).obj == Py_None: + /* "View.MemoryView":483 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< * + * cdef convert_item_to_object(self, char *itemp): */ - __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 483, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "View.MemoryView":373 + /* "View.MemoryView":481 + * PyMem_Free(tmp) * - * def __dealloc__(memoryview self): - * if self.obj is not None: # <<<<<<<<<<<<<< - * __Pyx_ReleaseBuffer(&self.view) - * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) */ - goto __pyx_L3; - } - /* "View.MemoryView":375 - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) - * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":485 + * self.assign_item_from_object(itemp, value) * - * (<__pyx_buffer *> &self.view).obj = NULL + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" */ - __pyx_t_2 = ((((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None) != 0); - if (__pyx_t_2) { - /* "View.MemoryView":377 - * elif (<__pyx_buffer *> &self.view).obj == Py_None: - * - * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< - * Py_DECREF(Py_None) +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + size_t __pyx_t_10; + int __pyx_t_11; + __Pyx_RefNannySetupContext("convert_item_to_object", 0); + + /* "View.MemoryView":488 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem * */ - ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 488, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; - /* "View.MemoryView":378 - * - * (<__pyx_buffer *> &self.view).obj = NULL - * Py_DECREF(Py_None) # <<<<<<<<<<<<<< + /* "View.MemoryView":491 + * cdef bytes bytesitem * - * cdef int i + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) */ - Py_DECREF(Py_None); + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 491, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; - /* "View.MemoryView":375 - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) - * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + /* "View.MemoryView":492 * - * (<__pyx_buffer *> &self.view).obj = NULL + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: */ - } - __pyx_L3:; + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { - /* "View.MemoryView":382 - * cdef int i - * global __pyx_memoryview_thread_locks_used - * if self.lock != NULL: # <<<<<<<<<<<<<< - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: + /* "View.MemoryView":493 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError("Unable to convert item to object") */ - __pyx_t_2 = ((__pyx_v_self->lock != NULL) != 0); - if (__pyx_t_2) { + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 493, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 493, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 493, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 493, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 493, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_7) { + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; + } + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_6); + __Pyx_INCREF(__pyx_v_bytesitem); + __Pyx_GIVEREF(__pyx_v_bytesitem); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_bytesitem); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 493, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; - /* "View.MemoryView":383 - * global __pyx_memoryview_thread_locks_used - * if self.lock != NULL: - * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< - * if __pyx_memoryview_thread_locks[i] is self.lock: - * __pyx_memoryview_thread_locks_used -= 1 + /* "View.MemoryView":492 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: */ - __pyx_t_3 = __pyx_memoryview_thread_locks_used; - __pyx_t_4 = __pyx_t_3; - for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { - __pyx_v_i = __pyx_t_5; + } - /* "View.MemoryView":384 - * if self.lock != NULL: - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: + /* "View.MemoryView":497 + * raise ValueError("Unable to convert item to object") + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result */ - __pyx_t_2 = (((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":385 - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: - * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< - * if i != __pyx_memoryview_thread_locks_used: - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - */ - __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); - - /* "View.MemoryView":386 - * if __pyx_memoryview_thread_locks[i] is self.lock: - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) - */ - __pyx_t_2 = ((__pyx_v_i != __pyx_memoryview_thread_locks_used) != 0); - if (__pyx_t_2) { + /*else:*/ { + __pyx_t_10 = strlen(__pyx_v_self->view.format); + __pyx_t_11 = ((__pyx_t_10 == 1) != 0); + if (__pyx_t_11) { - /* "View.MemoryView":388 - * if i != __pyx_memoryview_thread_locks_used: - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< - * break - * else: + /* "View.MemoryView":498 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * */ - __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); - __pyx_t_7 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; - /* "View.MemoryView":387 - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) - * break + /* "View.MemoryView":497 + * raise ValueError("Unable to convert item to object") + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result */ - (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_6; - (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_7; + } - /* "View.MemoryView":386 - * if __pyx_memoryview_thread_locks[i] is self.lock: - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + /* "View.MemoryView":499 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): */ - } + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - /* "View.MemoryView":389 - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) - * break # <<<<<<<<<<<<<< - * else: - * PyThread_free_lock(self.lock) + /* "View.MemoryView":494 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError("Unable to convert item to object") + * else: */ - goto __pyx_L6_break; + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 494, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_9); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_9 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(1, 494, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_1); - /* "View.MemoryView":384 - * if self.lock != NULL: - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: + /* "View.MemoryView":495 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: */ - } + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 495, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 495, __pyx_L5_except_error) } - /*else*/ { + goto __pyx_L5_except_error; + __pyx_L5_except_error:; - /* "View.MemoryView":391 - * break - * else: - * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + /* "View.MemoryView":492 * - * cdef char *get_item_pointer(memoryview self, object index) except NULL: - */ - PyThread_free_lock(__pyx_v_self->lock); - } - __pyx_L6_break:; - - /* "View.MemoryView":382 - * cdef int i - * global __pyx_memoryview_thread_locks_used - * if self.lock != NULL: # <<<<<<<<<<<<<< - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; } - /* "View.MemoryView":372 - * self.typeinfo = NULL + /* "View.MemoryView":485 + * self.assign_item_from_object(itemp, value) * - * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" */ /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); + return __pyx_r; } -/* "View.MemoryView":393 - * PyThread_free_lock(self.lock) +/* "View.MemoryView":501 + * return result * - * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< - * cdef Py_ssize_t dim - * cdef char *itemp = self.view.buf + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" */ -static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { - Py_ssize_t __pyx_v_dim; - char *__pyx_v_itemp; - PyObject *__pyx_v_idx = NULL; - char *__pyx_r; +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - Py_ssize_t __pyx_t_3; - PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; - Py_ssize_t __pyx_t_6; - char *__pyx_t_7; - __Pyx_RefNannySetupContext("get_item_pointer", 0); + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + char *__pyx_t_11; + char *__pyx_t_12; + char *__pyx_t_13; + char *__pyx_t_14; + __Pyx_RefNannySetupContext("assign_item_from_object", 0); - /* "View.MemoryView":395 - * cdef char *get_item_pointer(memoryview self, object index) except NULL: - * cdef Py_ssize_t dim - * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< - * - * for dim, idx in enumerate(index): + /* "View.MemoryView":504 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue */ - __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; - /* "View.MemoryView":397 - * cdef char *itemp = self.view.buf + /* "View.MemoryView":509 + * cdef Py_ssize_t i * - * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< - * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "View.MemoryView":510 * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) */ - __pyx_t_1 = 0; - if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { - __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; - __pyx_t_4 = NULL; - } else { - __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 397, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 397, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(1, 510, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":509 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; } - for (;;) { - if (likely(!__pyx_t_4)) { - if (likely(PyList_CheckExact(__pyx_t_2))) { - if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 397, __pyx_L1_error) - #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 397, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } else { - if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 397, __pyx_L1_error) - #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 397, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif + + /* "View.MemoryView":512 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 512, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 512, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_7 = 1; } - } else { - __pyx_t_5 = __pyx_t_4(__pyx_t_2); - if (unlikely(!__pyx_t_5)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 397, __pyx_L1_error) - } - break; + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 512, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 512, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + { + __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 512, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + if (__pyx_t_5) { + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; } - __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_v_value); + __pyx_t_1 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 512, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } - __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); - __pyx_t_5 = 0; - __pyx_v_dim = __pyx_t_1; - __pyx_t_1 = (__pyx_t_1 + 1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(1, 512, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + } + __pyx_L3:; - /* "View.MemoryView":398 + /* "View.MemoryView":514 + * bytesvalue = struct.pack(self.view.format, value) * - * for dim, idx in enumerate(index): - * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c * - * return itemp */ - __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 398, __pyx_L1_error) - __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(2, 398, __pyx_L1_error) - __pyx_v_itemp = __pyx_t_7; + __pyx_t_9 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(1, 514, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_10 = __pyx_v_bytesvalue; + __pyx_t_12 = PyBytes_AS_STRING(__pyx_t_10); + __pyx_t_13 = (__pyx_t_12 + PyBytes_GET_SIZE(__pyx_t_10)); + for (__pyx_t_14 = __pyx_t_12; __pyx_t_14 < __pyx_t_13; __pyx_t_14++) { + __pyx_t_11 = __pyx_t_14; + __pyx_v_c = (__pyx_t_11[0]); - /* "View.MemoryView":397 - * cdef char *itemp = self.view.buf + /* "View.MemoryView":515 * - * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< - * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< * + * @cname('getbuffer') */ - } - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_i = __pyx_t_9; - /* "View.MemoryView":400 - * itemp = pybuffer_index(&self.view, itemp, idx, dim) + /* "View.MemoryView":514 + * bytesvalue = struct.pack(self.view.format, value) * - * return itemp # <<<<<<<<<<<<<< + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_9 = (__pyx_t_9 + 1); + + /* "View.MemoryView":515 * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< * + * @cname('getbuffer') */ - __pyx_r = __pyx_v_itemp; - goto __pyx_L0; + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - /* "View.MemoryView":393 - * PyThread_free_lock(self.lock) + /* "View.MemoryView":501 + * return result * - * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< - * cdef Py_ssize_t dim - * cdef char *itemp = self.view.buf + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" */ /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_idx); + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":403 - * +/* "View.MemoryView":518 * - * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< - * if index is Ellipsis: - * return self + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") */ /* Python wrapper */ -static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ -static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { - PyObject *__pyx_r = 0; +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { - PyObject *__pyx_v_have_slices = NULL; - PyObject *__pyx_v_indices = NULL; - char *__pyx_v_itemp; - PyObject *__pyx_r = NULL; +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - char *__pyx_t_6; - __Pyx_RefNannySetupContext("__getitem__", 0); + Py_ssize_t *__pyx_t_4; + char *__pyx_t_5; + void *__pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); - /* "View.MemoryView":404 - * - * def __getitem__(memoryview self, object index): - * if index is Ellipsis: # <<<<<<<<<<<<<< - * return self + /* "View.MemoryView":519 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError("Cannot create writable memory view from read-only memoryview") * */ - __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); - __pyx_t_2 = (__pyx_t_1 != 0); + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->view.readonly != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":405 - * def __getitem__(memoryview self, object index): - * if index is Ellipsis: - * return self # <<<<<<<<<<<<<< - * - * have_slices, indices = _unellipsify(index, self.view.ndim) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __pyx_r = ((PyObject *)__pyx_v_self); - goto __pyx_L0; - - /* "View.MemoryView":404 - * - * def __getitem__(memoryview self, object index): - * if index is Ellipsis: # <<<<<<<<<<<<<< - * return self + /* "View.MemoryView":520 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< * + * if flags & PyBUF_ND: */ - } + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 520, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 520, __pyx_L1_error) - /* "View.MemoryView":407 - * return self - * - * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + /* "View.MemoryView":519 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError("Cannot create writable memory view from read-only memoryview") * - * cdef char *itemp */ - __pyx_t_3 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 407, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (likely(__pyx_t_3 != Py_None)) { - PyObject* sequence = __pyx_t_3; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(2, 407, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - #else - __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 407, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 407, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 407, __pyx_L1_error) } - __pyx_v_have_slices = __pyx_t_4; - __pyx_t_4 = 0; - __pyx_v_indices = __pyx_t_5; - __pyx_t_5 = 0; - /* "View.MemoryView":410 + /* "View.MemoryView":522 + * raise ValueError("Cannot create writable memory view from read-only memoryview") * - * cdef char *itemp - * if have_slices: # <<<<<<<<<<<<<< - * return memview_slice(self, indices) + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape * else: */ - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 410, __pyx_L1_error) - if (__pyx_t_2) { + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":411 - * cdef char *itemp - * if have_slices: - * return memview_slice(self, indices) # <<<<<<<<<<<<<< + /* "View.MemoryView":523 + * + * if flags & PyBUF_ND: + * info.shape = self.view.shape # <<<<<<<<<<<<<< * else: - * itemp = self.get_item_pointer(indices) + * info.shape = NULL */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 411, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; + __pyx_t_4 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_4; - /* "View.MemoryView":410 + /* "View.MemoryView":522 + * raise ValueError("Cannot create writable memory view from read-only memoryview") * - * cdef char *itemp - * if have_slices: # <<<<<<<<<<<<<< - * return memview_slice(self, indices) + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape * else: */ + goto __pyx_L6; } - /* "View.MemoryView":413 - * return memview_slice(self, indices) + /* "View.MemoryView":525 + * info.shape = self.view.shape * else: - * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< - * return self.convert_item_to_object(itemp) + * info.shape = NULL # <<<<<<<<<<<<<< * + * if flags & PyBUF_STRIDES: */ /*else*/ { - __pyx_t_6 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_6 == ((char *)NULL))) __PYX_ERR(2, 413, __pyx_L1_error) - __pyx_v_itemp = __pyx_t_6; + __pyx_v_info->shape = NULL; + } + __pyx_L6:; - /* "View.MemoryView":414 - * else: - * itemp = self.get_item_pointer(indices) - * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + /* "View.MemoryView":527 + * info.shape = NULL * - * def __setitem__(memoryview self, object index, object value): + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 414, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - } + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":403 - * + /* "View.MemoryView":528 * - * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< - * if index is Ellipsis: - * return self + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL */ + __pyx_t_4 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_4; - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_have_slices); - __Pyx_XDECREF(__pyx_v_indices); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":416 - * return self.convert_item_to_object(itemp) + /* "View.MemoryView":527 + * info.shape = NULL * - * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< - * if self.view.readonly: - * raise TypeError("Cannot assign to read-only memoryview") + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: */ + goto __pyx_L7; + } -/* Python wrapper */ -static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { - PyObject *__pyx_v_have_slices = NULL; - PyObject *__pyx_v_obj = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - __Pyx_RefNannySetupContext("__setitem__", 0); - __Pyx_INCREF(__pyx_v_index); - - /* "View.MemoryView":417 - * - * def __setitem__(memoryview self, object index, object value): - * if self.view.readonly: # <<<<<<<<<<<<<< - * raise TypeError("Cannot assign to read-only memoryview") + /* "View.MemoryView":530 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< * + * if flags & PyBUF_INDIRECT: */ - __pyx_t_1 = (__pyx_v_self->view.readonly != 0); - if (unlikely(__pyx_t_1)) { + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; - /* "View.MemoryView":418 - * def __setitem__(memoryview self, object index, object value): - * if self.view.readonly: - * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< + /* "View.MemoryView":532 + * info.strides = NULL * - * have_slices, index = _unellipsify(index, self.view.ndim) + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 418, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 418, __pyx_L1_error) + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":417 + /* "View.MemoryView":533 * - * def __setitem__(memoryview self, object index, object value): - * if self.view.readonly: # <<<<<<<<<<<<<< - * raise TypeError("Cannot assign to read-only memoryview") + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_4 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_4; + + /* "View.MemoryView":532 + * info.strides = NULL * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: */ + goto __pyx_L8; } - /* "View.MemoryView":420 - * raise TypeError("Cannot assign to read-only memoryview") + /* "View.MemoryView":535 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< * - * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":537 + * info.suboffsets = NULL * - * if have_slices: + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: */ - __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 420, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (likely(__pyx_t_2 != Py_None)) { - PyObject* sequence = __pyx_t_2; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(2, 420, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 420, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 420, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - #endif - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 420, __pyx_L1_error) - } - __pyx_v_have_slices = __pyx_t_3; - __pyx_t_3 = 0; - __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_4); - __pyx_t_4 = 0; + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":422 - * have_slices, index = _unellipsify(index, self.view.ndim) + /* "View.MemoryView":538 * - * if have_slices: # <<<<<<<<<<<<<< - * obj = self.is_slice(value) - * if obj: + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 422, __pyx_L1_error) - if (__pyx_t_1) { + __pyx_t_5 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_5; - /* "View.MemoryView":423 + /* "View.MemoryView":537 + * info.suboffsets = NULL * - * if have_slices: - * obj = self.is_slice(value) # <<<<<<<<<<<<<< - * if obj: - * self.setitem_slice_assignment(self[index], obj) + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: */ - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 423, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v_obj = __pyx_t_2; - __pyx_t_2 = 0; + goto __pyx_L9; + } - /* "View.MemoryView":424 - * if have_slices: - * obj = self.is_slice(value) - * if obj: # <<<<<<<<<<<<<< - * self.setitem_slice_assignment(self[index], obj) - * else: + /* "View.MemoryView":540 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 424, __pyx_L1_error) - if (__pyx_t_1) { + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; - /* "View.MemoryView":425 - * obj = self.is_slice(value) - * if obj: - * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< - * else: - * self.setitem_slice_assign_scalar(self[index], value) + /* "View.MemoryView":542 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize */ - __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 425, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_2, __pyx_v_obj); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 425, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_6; - /* "View.MemoryView":424 - * if have_slices: - * obj = self.is_slice(value) - * if obj: # <<<<<<<<<<<<<< - * self.setitem_slice_assignment(self[index], obj) - * else: + /* "View.MemoryView":543 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len */ - goto __pyx_L5; - } + __pyx_t_7 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_7; - /* "View.MemoryView":427 - * self.setitem_slice_assignment(self[index], obj) - * else: - * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< - * else: - * self.setitem_indexed(index, value) + /* "View.MemoryView":544 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly */ - /*else*/ { - __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 427, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_memoryview_type))))) __PYX_ERR(2, 427, __pyx_L1_error) - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_4), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 427, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } - __pyx_L5:; + __pyx_t_8 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_8; - /* "View.MemoryView":422 - * have_slices, index = _unellipsify(index, self.view.ndim) + /* "View.MemoryView":545 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_8 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_8; + + /* "View.MemoryView":546 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self * - * if have_slices: # <<<<<<<<<<<<<< - * obj = self.is_slice(value) - * if obj: */ - goto __pyx_L4; - } + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; - /* "View.MemoryView":429 - * self.setitem_slice_assign_scalar(self[index], value) - * else: - * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + /* "View.MemoryView":547 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< * - * cdef is_slice(self, obj): + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") */ - /*else*/ { - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 429, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } - __pyx_L4:; + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "View.MemoryView":416 - * return self.convert_item_to_object(itemp) + /* "View.MemoryView":518 * - * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< - * if self.view.readonly: - * raise TypeError("Cannot assign to read-only memoryview") + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_have_slices); - __Pyx_XDECREF(__pyx_v_obj); - __Pyx_XDECREF(__pyx_v_index); + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":431 - * self.setitem_indexed(index, value) +/* "View.MemoryView":553 * - * cdef is_slice(self, obj): # <<<<<<<<<<<<<< - * if not isinstance(obj, memoryview): - * try: + * @property + * def T(self): # <<<<<<<<<<<<<< + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) */ -static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; + PyObject *__pyx_t_1 = NULL; int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_t_9; - __Pyx_RefNannySetupContext("is_slice", 0); - __Pyx_INCREF(__pyx_v_obj); + __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":432 - * - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + /* "View.MemoryView":554 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result */ - __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); - __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); - if (__pyx_t_2) { + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 554, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(1, 554, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; - /* "View.MemoryView":433 - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): - * try: # <<<<<<<<<<<<<< - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_5); - /*try:*/ { - - /* "View.MemoryView":434 - * if not isinstance(obj, memoryview): - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< - * self.dtype_is_object) - * except TypeError: - */ - __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 434, __pyx_L4_error) - __Pyx_GOTREF(__pyx_t_6); - - /* "View.MemoryView":435 - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) # <<<<<<<<<<<<<< - * except TypeError: - * return None - */ - __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 435, __pyx_L4_error) - __Pyx_GOTREF(__pyx_t_7); - - /* "View.MemoryView":434 - * if not isinstance(obj, memoryview): - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< - * self.dtype_is_object) - * except TypeError: - */ - __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 434, __pyx_L4_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_INCREF(__pyx_v_obj); - __Pyx_GIVEREF(__pyx_v_obj); - PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6); - __Pyx_GIVEREF(__pyx_t_7); - PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7); - __pyx_t_6 = 0; - __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 434, __pyx_L4_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); - __pyx_t_7 = 0; - - /* "View.MemoryView":433 - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): - * try: # <<<<<<<<<<<<<< - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) - */ - } - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - goto __pyx_L9_try_end; - __pyx_L4_error:; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - - /* "View.MemoryView":436 - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) - * except TypeError: # <<<<<<<<<<<<<< - * return None - * - */ - __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); - if (__pyx_t_9) { - __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(2, 436, __pyx_L6_except_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GOTREF(__pyx_t_8); - __Pyx_GOTREF(__pyx_t_6); - - /* "View.MemoryView":437 - * self.dtype_is_object) - * except TypeError: - * return None # <<<<<<<<<<<<<< - * - * return obj - */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - goto __pyx_L7_except_return; - } - goto __pyx_L6_except_error; - __pyx_L6_except_error:; - - /* "View.MemoryView":433 - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): - * try: # <<<<<<<<<<<<<< - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) - */ - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); - goto __pyx_L1_error; - __pyx_L7_except_return:; - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); - goto __pyx_L0; - __pyx_L9_try_end:; - } - - /* "View.MemoryView":432 + /* "View.MemoryView":555 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result * - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, */ - } + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 555, __pyx_L1_error) - /* "View.MemoryView":439 - * return None - * - * return obj # <<<<<<<<<<<<<< + /* "View.MemoryView":556 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< * - * cdef setitem_slice_assignment(self, dst, src): + * @property */ __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_obj); - __pyx_r = __pyx_v_obj; + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); goto __pyx_L0; - /* "View.MemoryView":431 - * self.setitem_indexed(index, value) + /* "View.MemoryView":553 * - * cdef is_slice(self, obj): # <<<<<<<<<<<<<< - * if not isinstance(obj, memoryview): - * try: + * @property + * def T(self): # <<<<<<<<<<<<<< + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF((PyObject *)__pyx_v_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":441 - * return obj +/* "View.MemoryView":559 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.obj * - * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice dst_slice - * cdef __Pyx_memviewslice src_slice */ -static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { - __Pyx_memviewslice __pyx_v_dst_slice; - __Pyx_memviewslice __pyx_v_src_slice; - PyObject *__pyx_r = NULL; +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_memviewslice *__pyx_t_1; - __Pyx_memviewslice *__pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - __Pyx_RefNannySetupContext("setitem_slice_assignment", 0); + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - /* "View.MemoryView":445 - * cdef __Pyx_memviewslice src_slice - * - * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< - * get_slice_from_memview(dst, &dst_slice)[0], - * src.ndim, dst.ndim, self.dtype_is_object) - */ - if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(2, 445, __pyx_L1_error) - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 445, __pyx_L1_error) + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":446 - * - * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], - * get_slice_from_memview(dst, &dst_slice)[0], # <<<<<<<<<<<<<< - * src.ndim, dst.ndim, self.dtype_is_object) - * - */ - if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(2, 446, __pyx_L1_error) - __pyx_t_2 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_2 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 446, __pyx_L1_error) +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":447 - * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], - * get_slice_from_memview(dst, &dst_slice)[0], - * src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + /* "View.MemoryView":560 + * @property + * def base(self): + * return self.obj # <<<<<<<<<<<<<< * - * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * @property */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 447, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 447, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 447, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 447, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; - /* "View.MemoryView":445 - * cdef __Pyx_memviewslice src_slice + /* "View.MemoryView":559 * - * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< - * get_slice_from_memview(dst, &dst_slice)[0], - * src.ndim, dst.ndim, self.dtype_is_object) - */ - __pyx_t_6 = __pyx_memoryview_copy_contents((__pyx_t_1[0]), (__pyx_t_2[0]), __pyx_t_4, __pyx_t_5, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 445, __pyx_L1_error) - - /* "View.MemoryView":441 - * return obj + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.obj * - * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice dst_slice - * cdef __Pyx_memviewslice src_slice */ /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":449 - * src.ndim, dst.ndim, self.dtype_is_object) +/* "View.MemoryView":563 + * + * @property + * def shape(self): # <<<<<<<<<<<<<< + * return tuple([length for length in self.view.shape[:self.view.ndim]]) * - * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< - * cdef int array[128] - * cdef void *tmp = NULL */ -static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { - int __pyx_v_array[0x80]; - void *__pyx_v_tmp; - void *__pyx_v_item; - __Pyx_memviewslice *__pyx_v_dst_slice; - __Pyx_memviewslice __pyx_v_tmp_slice; +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_length; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - __Pyx_memviewslice *__pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - int __pyx_t_5; - char const *__pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 0); + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":451 - * cdef setitem_slice_assign_scalar(self, memoryview dst, value): - * cdef int array[128] - * cdef void *tmp = NULL # <<<<<<<<<<<<<< - * cdef void *item + /* "View.MemoryView":564 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< * + * @property */ - __pyx_v_tmp = NULL; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 564, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 564, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 564, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 564, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; - /* "View.MemoryView":456 - * cdef __Pyx_memviewslice *dst_slice - * cdef __Pyx_memviewslice tmp_slice - * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + /* "View.MemoryView":563 * - * if self.view.itemsize > sizeof(array): - */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 456, __pyx_L1_error) - __pyx_v_dst_slice = __pyx_t_1; - - /* "View.MemoryView":458 - * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * @property + * def shape(self): # <<<<<<<<<<<<<< + * return tuple([length for length in self.view.shape[:self.view.ndim]]) * - * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: */ - __pyx_t_2 = ((((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))) != 0); - if (__pyx_t_2) { - /* "View.MemoryView":459 + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":567 + * + * @property + * def strides(self): # <<<<<<<<<<<<<< + * if self.view.strides == NULL: * - * if self.view.itemsize > sizeof(array): - * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< - * if tmp == NULL: - * raise MemoryError */ - __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); - /* "View.MemoryView":460 - * if self.view.itemsize > sizeof(array): - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: # <<<<<<<<<<<<<< - * raise MemoryError - * item = tmp - */ - __pyx_t_2 = ((__pyx_v_tmp == NULL) != 0); - if (unlikely(__pyx_t_2)) { +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - /* "View.MemoryView":461 - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: - * raise MemoryError # <<<<<<<<<<<<<< - * item = tmp - * else: - */ - PyErr_NoMemory(); __PYX_ERR(2, 461, __pyx_L1_error) + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":460 - * if self.view.itemsize > sizeof(array): - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: # <<<<<<<<<<<<<< - * raise MemoryError - * item = tmp - */ - } +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":462 - * if tmp == NULL: - * raise MemoryError - * item = tmp # <<<<<<<<<<<<<< - * else: - * item = array + /* "View.MemoryView":568 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError("Buffer view does not expose strides") */ - __pyx_v_item = __pyx_v_tmp; + __pyx_t_1 = ((__pyx_v_self->view.strides == NULL) != 0); + if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":458 - * dst_slice = get_slice_from_memview(dst, &tmp_slice) + /* "View.MemoryView":570 + * if self.view.strides == NULL: * - * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: + * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) */ - goto __pyx_L3; - } + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 570, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 570, __pyx_L1_error) - /* "View.MemoryView":464 - * item = tmp - * else: - * item = array # <<<<<<<<<<<<<< + /* "View.MemoryView":568 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< * - * try: + * raise ValueError("Buffer view does not expose strides") */ - /*else*/ { - __pyx_v_item = ((void *)__pyx_v_array); } - __pyx_L3:; - /* "View.MemoryView":466 - * item = array + /* "View.MemoryView":572 + * raise ValueError("Buffer view does not expose strides") * - * try: # <<<<<<<<<<<<<< - * if self.dtype_is_object: - * ( item)[0] = value - */ - /*try:*/ { - - /* "View.MemoryView":467 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< * - * try: - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * ( item)[0] = value - * else: + * @property */ - __pyx_t_2 = (__pyx_v_self->dtype_is_object != 0); - if (__pyx_t_2) { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 572, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; - /* "View.MemoryView":468 - * try: - * if self.dtype_is_object: - * ( item)[0] = value # <<<<<<<<<<<<<< - * else: - * self.assign_item_from_object( item, value) + /* "View.MemoryView":567 + * + * @property + * def strides(self): # <<<<<<<<<<<<<< + * if self.view.strides == NULL: + * */ - (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); - /* "View.MemoryView":467 - * - * try: - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * ( item)[0] = value - * else: - */ - goto __pyx_L8; - } + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":470 - * ( item)[0] = value - * else: - * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< - * +/* "View.MemoryView":575 * + * @property + * def suboffsets(self): # <<<<<<<<<<<<<< + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim */ - /*else*/ { - __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 470, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } - __pyx_L8:; - /* "View.MemoryView":474 - * - * - * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< - * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) - * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, - */ - __pyx_t_2 = ((__pyx_v_self->view.suboffsets != NULL) != 0); - if (__pyx_t_2) { +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - /* "View.MemoryView":475 + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + Py_ssize_t *__pyx_t_6; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":576 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim * - * if self.view.suboffsets != NULL: - * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< - * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, - * item, self.dtype_is_object) */ - __pyx_t_3 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 475, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_1 = ((__pyx_v_self->view.suboffsets == NULL) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":474 - * + /* "View.MemoryView":577 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< * - * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< - * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) - * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) */ - } + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__12, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; - /* "View.MemoryView":476 - * if self.view.suboffsets != NULL: - * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) - * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< - * item, self.dtype_is_object) - * finally: + /* "View.MemoryView":576 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * */ - __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); } - /* "View.MemoryView":479 - * item, self.dtype_is_object) - * finally: - * PyMem_Free(tmp) # <<<<<<<<<<<<<< + /* "View.MemoryView":579 + * return (-1,) * self.view.ndim * - * cdef setitem_indexed(self, index, value): + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property */ - /*finally:*/ { - /*normal exit:*/{ - PyMem_Free(__pyx_v_tmp); - goto __pyx_L7; - } - __pyx_L6_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); - __Pyx_XGOTREF(__pyx_t_7); - __Pyx_XGOTREF(__pyx_t_8); - __Pyx_XGOTREF(__pyx_t_9); - __Pyx_XGOTREF(__pyx_t_10); - __Pyx_XGOTREF(__pyx_t_11); - __Pyx_XGOTREF(__pyx_t_12); - __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; - { - PyMem_Free(__pyx_v_tmp); - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_10); - __Pyx_XGIVEREF(__pyx_t_11); - __Pyx_XGIVEREF(__pyx_t_12); - __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); - } - __Pyx_XGIVEREF(__pyx_t_7); - __Pyx_XGIVEREF(__pyx_t_8); - __Pyx_XGIVEREF(__pyx_t_9); - __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); - __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; - __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; - goto __pyx_L1_error; - } - __pyx_L7:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 579, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_6 = __pyx_v_self->view.suboffsets; __pyx_t_6 < __pyx_t_5; __pyx_t_6++) { + __pyx_t_4 = __pyx_t_6; + __pyx_v_suboffset = (__pyx_t_4[0]); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_suboffset); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 579, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) __PYX_ERR(1, 579, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } + __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 579, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; - /* "View.MemoryView":449 - * src.ndim, dst.ndim, self.dtype_is_object) + /* "View.MemoryView":575 * - * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< - * cdef int array[128] - * cdef void *tmp = NULL + * @property + * def suboffsets(self): # <<<<<<<<<<<<<< + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim */ /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":481 - * PyMem_Free(tmp) +/* "View.MemoryView":582 + * + * @property + * def ndim(self): # <<<<<<<<<<<<<< + * return self.view.ndim * - * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< - * cdef char *itemp = self.get_item_pointer(index) - * self.assign_item_from_object(itemp, value) */ -static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { - char *__pyx_v_itemp; +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - char *__pyx_t_1; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("setitem_indexed", 0); + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":482 - * - * cdef setitem_indexed(self, index, value): - * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< - * self.assign_item_from_object(itemp, value) + /* "View.MemoryView":583 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< * + * @property */ - __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(2, 482, __pyx_L1_error) - __pyx_v_itemp = __pyx_t_1; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 583, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; - /* "View.MemoryView":483 - * cdef setitem_indexed(self, index, value): - * cdef char *itemp = self.get_item_pointer(index) - * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + /* "View.MemoryView":582 * - * cdef convert_item_to_object(self, char *itemp): - */ - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 483, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "View.MemoryView":481 - * PyMem_Free(tmp) + * @property + * def ndim(self): # <<<<<<<<<<<<<< + * return self.view.ndim * - * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< - * cdef char *itemp = self.get_item_pointer(index) - * self.assign_item_from_object(itemp, value) */ /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":485 - * self.assign_item_from_object(itemp, value) +/* "View.MemoryView":586 + * + * @property + * def itemsize(self): # <<<<<<<<<<<<<< + * return self.view.itemsize * - * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" */ -static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { - PyObject *__pyx_v_struct = NULL; - PyObject *__pyx_v_bytesitem = 0; - PyObject *__pyx_v_result = NULL; +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_t_8; - PyObject *__pyx_t_9 = NULL; - size_t __pyx_t_10; - int __pyx_t_11; - __Pyx_RefNannySetupContext("convert_item_to_object", 0); + __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":488 - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" - * import struct # <<<<<<<<<<<<<< - * cdef bytes bytesitem + /* "View.MemoryView":587 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< * + * @property */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L1_error) + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 587, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_v_struct = __pyx_t_1; + __pyx_r = __pyx_t_1; __pyx_t_1 = 0; + goto __pyx_L0; - /* "View.MemoryView":491 - * cdef bytes bytesitem + /* "View.MemoryView":586 * - * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< - * try: - * result = struct.unpack(self.view.format, bytesitem) - */ - __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 491, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "View.MemoryView":492 + * @property + * def itemsize(self): # <<<<<<<<<<<<<< + * return self.view.itemsize * - * bytesitem = itemp[:self.view.itemsize] - * try: # <<<<<<<<<<<<<< - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - /* "View.MemoryView":493 - * bytesitem = itemp[:self.view.itemsize] - * try: - * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< - * except struct.error: - * raise ValueError("Unable to convert item to object") - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = NULL; - __pyx_t_8 = 0; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { - __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); - if (likely(__pyx_t_7)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); - __Pyx_INCREF(__pyx_t_7); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_5, function); - __pyx_t_8 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - { - __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_9); - if (__pyx_t_7) { - __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; - } - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_6); - __Pyx_INCREF(__pyx_v_bytesitem); - __Pyx_GIVEREF(__pyx_v_bytesitem); - PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_bytesitem); - __pyx_t_6 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_v_result = __pyx_t_1; - __pyx_t_1 = 0; + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":492 +/* "View.MemoryView":590 + * + * @property + * def nbytes(self): # <<<<<<<<<<<<<< + * return self.size * self.view.itemsize * - * bytesitem = itemp[:self.view.itemsize] - * try: # <<<<<<<<<<<<<< - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: */ - } - /* "View.MemoryView":497 - * raise ValueError("Unable to convert item to object") - * else: - * if len(self.view.format) == 1: # <<<<<<<<<<<<<< - * return result[0] - * return result - */ - /*else:*/ { - __pyx_t_10 = strlen(__pyx_v_self->view.format); - __pyx_t_11 = ((__pyx_t_10 == 1) != 0); - if (__pyx_t_11) { +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - /* "View.MemoryView":498 - * else: - * if len(self.view.format) == 1: - * return result[0] # <<<<<<<<<<<<<< - * return result + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":591 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< * + * @property */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 498, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L6_except_return; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 591, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 591, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 591, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; - /* "View.MemoryView":497 - * raise ValueError("Unable to convert item to object") - * else: - * if len(self.view.format) == 1: # <<<<<<<<<<<<<< - * return result[0] - * return result + /* "View.MemoryView":590 + * + * @property + * def nbytes(self): # <<<<<<<<<<<<<< + * return self.size * self.view.itemsize + * */ - } - /* "View.MemoryView":499 - * if len(self.view.format) == 1: - * return result[0] - * return result # <<<<<<<<<<<<<< + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":594 * - * cdef assign_item_from_object(self, char *itemp, object value): + * @property + * def size(self): # <<<<<<<<<<<<<< + * if self._size is None: + * result = 1 */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_result); - __pyx_r = __pyx_v_result; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - /* "View.MemoryView":494 - * try: - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: # <<<<<<<<<<<<<< - * raise ValueError("Unable to convert item to object") - * else: +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":595 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * */ - __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 494, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_6); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_9); - __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_9 = 0; - if (__pyx_t_8) { - __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(2, 494, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_1); + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { - /* "View.MemoryView":495 - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: - * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< - * else: - * if len(self.view.format) == 1: + /* "View.MemoryView":596 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":598 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * */ - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 495, __pyx_L5_except_error) + __pyx_t_4 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.shape; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_t_6 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 598, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_Raise(__pyx_t_6, 0, 0, 0); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __PYX_ERR(2, 495, __pyx_L5_except_error) + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_6); + __pyx_t_6 = 0; + + /* "View.MemoryView":599 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_6 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 599, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_6); + __pyx_t_6 = 0; } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - /* "View.MemoryView":492 + /* "View.MemoryView":601 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":595 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 * - * bytesitem = itemp[:self.view.itemsize] - * try: # <<<<<<<<<<<<<< - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; } - /* "View.MemoryView":485 - * self.assign_item_from_object(itemp, value) + /* "View.MemoryView":603 + * self._size = result * - * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":594 + * + * @property + * def size(self): # <<<<<<<<<<<<<< + * if self._size is None: + * result = 1 */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_struct); - __Pyx_XDECREF(__pyx_v_bytesitem); __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":501 - * return result +/* "View.MemoryView":605 + * return self._size * - * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] */ -static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { - PyObject *__pyx_v_struct = NULL; - char __pyx_v_c; - PyObject *__pyx_v_bytesvalue = 0; - Py_ssize_t __pyx_v_i; - PyObject *__pyx_r = NULL; +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + Py_ssize_t __pyx_r; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - int __pyx_t_7; - PyObject *__pyx_t_8 = NULL; - Py_ssize_t __pyx_t_9; - PyObject *__pyx_t_10 = NULL; - char *__pyx_t_11; - char *__pyx_t_12; - char *__pyx_t_13; - char *__pyx_t_14; - __Pyx_RefNannySetupContext("assign_item_from_object", 0); + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - /* "View.MemoryView":504 - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" - * import struct # <<<<<<<<<<<<<< - * cdef char c - * cdef bytes bytesvalue - */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 504, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_struct = __pyx_t_1; - __pyx_t_1 = 0; + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":509 - * cdef Py_ssize_t i +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__len__", 0); + + /* "View.MemoryView":606 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] * - * if isinstance(value, tuple): # <<<<<<<<<<<<<< - * bytesvalue = struct.pack(self.view.format, *value) - * else: */ - __pyx_t_2 = PyTuple_Check(__pyx_v_value); - __pyx_t_3 = (__pyx_t_2 != 0); - if (__pyx_t_3) { + __pyx_t_1 = ((__pyx_v_self->view.ndim >= 1) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":510 + /* "View.MemoryView":607 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< * - * if isinstance(value, tuple): - * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< - * else: - * bytesvalue = struct.pack(self.view.format, value) + * return 0 */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); - __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 510, __pyx_L1_error) - __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); - __pyx_t_4 = 0; + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; - /* "View.MemoryView":509 - * cdef Py_ssize_t i + /* "View.MemoryView":606 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] * - * if isinstance(value, tuple): # <<<<<<<<<<<<<< - * bytesvalue = struct.pack(self.view.format, *value) - * else: */ - goto __pyx_L3; } - /* "View.MemoryView":512 - * bytesvalue = struct.pack(self.view.format, *value) - * else: - * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + /* "View.MemoryView":609 + * return self.view.shape[0] * - * for i, c in enumerate(bytesvalue): + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): */ - /*else*/ { - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = NULL; - __pyx_t_7 = 0; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_6, function); - __pyx_t_7 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } else - #endif - { - __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - if (__pyx_t_5) { - __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; - } - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_1); - __Pyx_INCREF(__pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_v_value); - __pyx_t_1 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - } - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 512, __pyx_L1_error) - __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); - __pyx_t_4 = 0; - } - __pyx_L3:; + __pyx_r = 0; + goto __pyx_L0; - /* "View.MemoryView":514 - * bytesvalue = struct.pack(self.view.format, value) + /* "View.MemoryView":605 + * return self._size * - * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< - * itemp[i] = c + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":611 + * return 0 * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) */ - __pyx_t_9 = 0; - if (unlikely(__pyx_v_bytesvalue == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); - __PYX_ERR(2, 514, __pyx_L1_error) - } - __Pyx_INCREF(__pyx_v_bytesvalue); - __pyx_t_10 = __pyx_v_bytesvalue; - __pyx_t_12 = PyBytes_AS_STRING(__pyx_t_10); - __pyx_t_13 = (__pyx_t_12 + PyBytes_GET_SIZE(__pyx_t_10)); - for (__pyx_t_14 = __pyx_t_12; __pyx_t_14 < __pyx_t_13; __pyx_t_14++) { - __pyx_t_11 = __pyx_t_14; - __pyx_v_c = (__pyx_t_11[0]); - /* "View.MemoryView":515 +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "View.MemoryView":612 * - * for i, c in enumerate(bytesvalue): - * itemp[i] = c # <<<<<<<<<<<<<< + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) * - * @cname('getbuffer') */ - __pyx_v_i = __pyx_t_9; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 612, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 612, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 612, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "View.MemoryView":514 - * bytesvalue = struct.pack(self.view.format, value) - * - * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< - * itemp[i] = c + /* "View.MemoryView":613 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< * + * def __str__(self): */ - __pyx_t_9 = (__pyx_t_9 + 1); + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 613, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); - /* "View.MemoryView":515 + /* "View.MemoryView":612 * - * for i, c in enumerate(bytesvalue): - * itemp[i] = c # <<<<<<<<<<<<<< + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) * - * @cname('getbuffer') */ - (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; - } - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 612, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 612, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; - /* "View.MemoryView":501 - * return result + /* "View.MemoryView":611 + * return 0 * - * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) */ /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_struct); - __Pyx_XDECREF(__pyx_v_bytesvalue); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":518 +/* "View.MemoryView":615 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) * - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< - * if flags & PyBUF_WRITABLE and self.view.readonly: - * raise ValueError("Cannot create writable memory view from read-only memoryview") */ /* Python wrapper */ -static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ -static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_r; +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_r; +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - Py_ssize_t *__pyx_t_4; - char *__pyx_t_5; - void *__pyx_t_6; - int __pyx_t_7; - Py_ssize_t __pyx_t_8; - if (__pyx_v_info == NULL) { - PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); - return -1; - } - __Pyx_RefNannySetupContext("__getbuffer__", 0); - __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(__pyx_v_info->obj); + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__str__", 0); - /* "View.MemoryView":519 - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): - * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< - * raise ValueError("Cannot create writable memory view from read-only memoryview") + /* "View.MemoryView":616 * - */ - __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = (__pyx_v_self->view.readonly != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":520 - * def __getbuffer__(self, Py_buffer *info, int flags): - * if flags & PyBUF_WRITABLE and self.view.readonly: - * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< * - * if flags & PyBUF_ND: - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 520, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 520, __pyx_L1_error) - - /* "View.MemoryView":519 - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): - * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< - * raise ValueError("Cannot create writable memory view from read-only memoryview") * */ - } + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 616, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 616, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 616, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 616, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 616, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; - /* "View.MemoryView":522 - * raise ValueError("Cannot create writable memory view from read-only memoryview") + /* "View.MemoryView":615 + * id(self)) * - * if flags & PyBUF_ND: # <<<<<<<<<<<<<< - * info.shape = self.view.shape - * else: - */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":523 + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) * - * if flags & PyBUF_ND: - * info.shape = self.view.shape # <<<<<<<<<<<<<< - * else: - * info.shape = NULL */ - __pyx_t_4 = __pyx_v_self->view.shape; - __pyx_v_info->shape = __pyx_t_4; - /* "View.MemoryView":522 - * raise ValueError("Cannot create writable memory view from read-only memoryview") - * - * if flags & PyBUF_ND: # <<<<<<<<<<<<<< - * info.shape = self.view.shape - * else: - */ - goto __pyx_L6; - } + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":525 - * info.shape = self.view.shape - * else: - * info.shape = NULL # <<<<<<<<<<<<<< +/* "View.MemoryView":619 * - * if flags & PyBUF_STRIDES: + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp */ - /*else*/ { - __pyx_v_info->shape = NULL; - } - __pyx_L6:; - /* "View.MemoryView":527 - * info.shape = NULL +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("is_c_contig", 0); + + /* "View.MemoryView":622 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) * - * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< - * info.strides = self.view.strides - * else: */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); - if (__pyx_t_1) { + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 622, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; - /* "View.MemoryView":528 + /* "View.MemoryView":623 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< * - * if flags & PyBUF_STRIDES: - * info.strides = self.view.strides # <<<<<<<<<<<<<< - * else: - * info.strides = NULL + * def is_f_contig(self): */ - __pyx_t_4 = __pyx_v_self->view.strides; - __pyx_v_info->strides = __pyx_t_4; + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 623, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; - /* "View.MemoryView":527 - * info.shape = NULL + /* "View.MemoryView":619 * - * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< - * info.strides = self.view.strides - * else: + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp */ - goto __pyx_L7; - } - /* "View.MemoryView":530 - * info.strides = self.view.strides - * else: - * info.strides = NULL # <<<<<<<<<<<<<< + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":625 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) * - * if flags & PyBUF_INDIRECT: + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp */ - /*else*/ { - __pyx_v_info->strides = NULL; - } - __pyx_L7:; - /* "View.MemoryView":532 - * info.strides = NULL +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("is_f_contig", 0); + + /* "View.MemoryView":628 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) * - * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< - * info.suboffsets = self.view.suboffsets - * else: */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); - if (__pyx_t_1) { + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 628, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; - /* "View.MemoryView":533 + /* "View.MemoryView":629 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< * - * if flags & PyBUF_INDIRECT: - * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< - * else: - * info.suboffsets = NULL + * def copy(self): */ - __pyx_t_4 = __pyx_v_self->view.suboffsets; - __pyx_v_info->suboffsets = __pyx_t_4; + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 629, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; - /* "View.MemoryView":532 - * info.strides = NULL + /* "View.MemoryView":625 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) * - * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< - * info.suboffsets = self.view.suboffsets - * else: + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp */ - goto __pyx_L8; - } - /* "View.MemoryView":535 - * info.suboffsets = self.view.suboffsets - * else: - * info.suboffsets = NULL # <<<<<<<<<<<<<< - * - * if flags & PyBUF_FORMAT: - */ - /*else*/ { - __pyx_v_info->suboffsets = NULL; - } - __pyx_L8:; + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":537 - * info.suboffsets = NULL +/* "View.MemoryView":631 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * info.format = self.view.format - * else: + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); - if (__pyx_t_1) { - /* "View.MemoryView":538 - * - * if flags & PyBUF_FORMAT: - * info.format = self.view.format # <<<<<<<<<<<<<< - * else: - * info.format = NULL - */ - __pyx_t_5 = __pyx_v_self->view.format; - __pyx_v_info->format = __pyx_t_5; +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); - /* "View.MemoryView":537 - * info.suboffsets = NULL - * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * info.format = self.view.format - * else: - */ - goto __pyx_L9; - } + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":540 - * info.format = self.view.format - * else: - * info.format = NULL # <<<<<<<<<<<<<< - * - * info.buf = self.view.buf - */ - /*else*/ { - __pyx_v_info->format = NULL; - } - __pyx_L9:; +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("copy", 0); - /* "View.MemoryView":542 - * info.format = NULL + /* "View.MemoryView":633 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< * - * info.buf = self.view.buf # <<<<<<<<<<<<<< - * info.ndim = self.view.ndim - * info.itemsize = self.view.itemsize + * slice_copy(self, &mslice) */ - __pyx_t_6 = __pyx_v_self->view.buf; - __pyx_v_info->buf = __pyx_t_6; + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); - /* "View.MemoryView":543 + /* "View.MemoryView":635 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS * - * info.buf = self.view.buf - * info.ndim = self.view.ndim # <<<<<<<<<<<<<< - * info.itemsize = self.view.itemsize - * info.len = self.view.len - */ - __pyx_t_7 = __pyx_v_self->view.ndim; - __pyx_v_info->ndim = __pyx_t_7; - - /* "View.MemoryView":544 - * info.buf = self.view.buf - * info.ndim = self.view.ndim - * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< - * info.len = self.view.len - * info.readonly = self.view.readonly - */ - __pyx_t_8 = __pyx_v_self->view.itemsize; - __pyx_v_info->itemsize = __pyx_t_8; - - /* "View.MemoryView":545 - * info.ndim = self.view.ndim - * info.itemsize = self.view.itemsize - * info.len = self.view.len # <<<<<<<<<<<<<< - * info.readonly = self.view.readonly - * info.obj = self + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, */ - __pyx_t_8 = __pyx_v_self->view.len; - __pyx_v_info->len = __pyx_t_8; + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); - /* "View.MemoryView":546 - * info.itemsize = self.view.itemsize - * info.len = self.view.len - * info.readonly = self.view.readonly # <<<<<<<<<<<<<< - * info.obj = self + /* "View.MemoryView":636 * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, */ - __pyx_t_1 = __pyx_v_self->view.readonly; - __pyx_v_info->readonly = __pyx_t_1; + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 636, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; - /* "View.MemoryView":547 - * info.len = self.view.len - * info.readonly = self.view.readonly - * info.obj = self # <<<<<<<<<<<<<< + /* "View.MemoryView":641 + * self.dtype_is_object) * - * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): */ - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); - __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 641, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; - /* "View.MemoryView":518 + /* "View.MemoryView":631 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) * - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< - * if flags & PyBUF_WRITABLE and self.view.readonly: - * raise ValueError("Cannot create writable memory view from read-only memoryview") + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS */ /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - if (__pyx_v_info->obj != NULL) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - goto __pyx_L2; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; - if (__pyx_v_info->obj == Py_None) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":553 +/* "View.MemoryView":643 + * return memoryview_copy_from_slice(self, &mslice) * - * @property - * def T(self): # <<<<<<<<<<<<<< - * cdef _memoryviewslice result = memoryview_copy(self) - * transpose_memslice(&result.from_slice) + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS */ /* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("copy_fortran", 0); - /* "View.MemoryView":554 - * @property - * def T(self): - * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< - * transpose_memslice(&result.from_slice) - * return result + /* "View.MemoryView":645 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) */ - __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 554, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(2, 554, __pyx_L1_error) - __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); - __pyx_t_1 = 0; + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); - /* "View.MemoryView":555 - * def T(self): - * cdef _memoryviewslice result = memoryview_copy(self) - * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< - * return result + /* "View.MemoryView":647 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, */ - __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 555, __pyx_L1_error) + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); - /* "View.MemoryView":556 - * cdef _memoryviewslice result = memoryview_copy(self) - * transpose_memslice(&result.from_slice) - * return result # <<<<<<<<<<<<<< + /* "View.MemoryView":648 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 648, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":653 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * * - * @property */ __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_result)); - __pyx_r = ((PyObject *)__pyx_v_result); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":553 + /* "View.MemoryView":643 + * return memoryview_copy_from_slice(self, &mslice) * - * @property - * def T(self): # <<<<<<<<<<<<<< - * cdef _memoryviewslice result = memoryview_copy(self) - * transpose_memslice(&result.from_slice) + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":559 - * - * @property - * def base(self): # <<<<<<<<<<<<<< - * return self.obj - * +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): */ /* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); - /* "View.MemoryView":560 - * @property - * def base(self): - * return self.obj # <<<<<<<<<<<<<< - * - * @property + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->obj); - __pyx_r = __pyx_v_self->obj; - goto __pyx_L0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) - /* "View.MemoryView":559 - * - * @property - * def base(self): # <<<<<<<<<<<<<< - * return self.obj - * + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): */ /* function exit code */ - __pyx_L0:; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":563 - * - * @property - * def shape(self): # <<<<<<<<<<<<<< - * return tuple([length for length in self.view.shape[:self.view.ndim]]) - * +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ /* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - Py_ssize_t __pyx_v_length; +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; - Py_ssize_t *__pyx_t_2; - Py_ssize_t *__pyx_t_3; - Py_ssize_t *__pyx_t_4; - PyObject *__pyx_t_5 = NULL; - __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_RefNannySetupContext("__setstate_cython__", 0); - /* "View.MemoryView":564 - * @property - * def shape(self): - * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< - * - * @property + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 564, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); - for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { - __pyx_t_2 = __pyx_t_4; - __pyx_v_length = (__pyx_t_2[0]); - __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 564, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 564, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } - __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 564, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L0; + __PYX_ERR(1, 4, __pyx_L1_error) - /* "View.MemoryView":563 - * - * @property - * def shape(self): # <<<<<<<<<<<<<< - * return tuple([length for length in self.view.shape[:self.view.ndim]]) - * + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; - __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":567 - * - * @property - * def strides(self): # <<<<<<<<<<<<<< - * if self.view.strides == NULL: +/* "View.MemoryView":657 * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo */ -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - Py_ssize_t __pyx_v_stride; +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; + PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; - Py_ssize_t *__pyx_t_3; - Py_ssize_t *__pyx_t_4; - Py_ssize_t *__pyx_t_5; - PyObject *__pyx_t_6 = NULL; - __Pyx_RefNannySetupContext("__get__", 0); + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 0); - /* "View.MemoryView":568 - * @property - * def strides(self): - * if self.view.strides == NULL: # <<<<<<<<<<<<<< - * - * raise ValueError("Buffer view does not expose strides") + /* "View.MemoryView":658 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result */ - __pyx_t_1 = ((__pyx_v_self->view.strides == NULL) != 0); - if (unlikely(__pyx_t_1)) { + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; - /* "View.MemoryView":570 - * if self.view.strides == NULL: - * - * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< + /* "View.MemoryView":659 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result * - * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 570, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 570, __pyx_L1_error) + __pyx_v_result->typeinfo = __pyx_v_typeinfo; - /* "View.MemoryView":568 - * @property - * def strides(self): - * if self.view.strides == NULL: # <<<<<<<<<<<<<< + /* "View.MemoryView":660 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< * - * raise ValueError("Buffer view does not expose strides") + * @cname('__pyx_memoryview_check') */ - } + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; - /* "View.MemoryView":572 - * raise ValueError("Buffer view does not expose strides") - * - * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); - for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { - __pyx_t_3 = __pyx_t_5; - __pyx_v_stride = (__pyx_t_3[0]); - __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } - __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_6; - __pyx_t_6 = 0; - goto __pyx_L0; - - /* "View.MemoryView":567 - * - * @property - * def strides(self): # <<<<<<<<<<<<<< - * if self.view.strides == NULL: + /* "View.MemoryView":657 * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo */ /* function exit code */ __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":575 +/* "View.MemoryView":663 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) * - * @property - * def suboffsets(self): # <<<<<<<<<<<<<< - * if self.view.suboffsets == NULL: - * return (-1,) * self.view.ndim */ -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + int __pyx_t_1; + __Pyx_RefNannySetupContext("memoryview_check", 0); + + /* "View.MemoryView":664 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":663 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ /* function exit code */ + __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - Py_ssize_t __pyx_v_suboffset; +/* "View.MemoryView":666 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + CYTHON_UNUSED PyObject *__pyx_v_idx = NULL; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; + int __pyx_t_2; PyObject *__pyx_t_3 = NULL; - Py_ssize_t *__pyx_t_4; - Py_ssize_t *__pyx_t_5; - Py_ssize_t *__pyx_t_6; - __Pyx_RefNannySetupContext("__get__", 0); + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; + PyObject *(*__pyx_t_6)(PyObject *); + PyObject *__pyx_t_7 = NULL; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("_unellipsify", 0); - /* "View.MemoryView":576 - * @property - * def suboffsets(self): - * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< - * return (-1,) * self.view.ndim - * + /* "View.MemoryView":671 + * full slices. + * """ + * if not isinstance(index, tuple): # <<<<<<<<<<<<<< + * tup = (index,) + * else: */ - __pyx_t_1 = ((__pyx_v_self->view.suboffsets == NULL) != 0); - if (__pyx_t_1) { + __pyx_t_1 = PyTuple_Check(__pyx_v_index); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":577 - * def suboffsets(self): - * if self.view.suboffsets == NULL: - * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< - * - * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + /* "View.MemoryView":672 + * """ + * if not isinstance(index, tuple): + * tup = (index,) # <<<<<<<<<<<<<< + * else: + * tup = index */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 577, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__12, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 577, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 672, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_3; + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index); + __pyx_v_tup = __pyx_t_3; __pyx_t_3 = 0; - goto __pyx_L0; - /* "View.MemoryView":576 - * @property - * def suboffsets(self): - * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< - * return (-1,) * self.view.ndim - * + /* "View.MemoryView":671 + * full slices. + * """ + * if not isinstance(index, tuple): # <<<<<<<<<<<<<< + * tup = (index,) + * else: */ + goto __pyx_L3; } - /* "View.MemoryView":579 - * return (-1,) * self.view.ndim - * - * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + /* "View.MemoryView":674 + * tup = (index,) + * else: + * tup = index # <<<<<<<<<<<<<< * - * @property + * result = [] */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 579, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); - for (__pyx_t_6 = __pyx_v_self->view.suboffsets; __pyx_t_6 < __pyx_t_5; __pyx_t_6++) { - __pyx_t_4 = __pyx_t_6; - __pyx_v_suboffset = (__pyx_t_4[0]); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_suboffset); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 579, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) __PYX_ERR(2, 579, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + /*else*/ { + __Pyx_INCREF(__pyx_v_index); + __pyx_v_tup = __pyx_v_index; } - __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 579, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + __pyx_L3:; - /* "View.MemoryView":575 + /* "View.MemoryView":676 + * tup = index * - * @property - * def suboffsets(self): # <<<<<<<<<<<<<< - * if self.view.suboffsets == NULL: - * return (-1,) * self.view.ndim + * result = [] # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False */ + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 676, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_result = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":582 - * - * @property - * def ndim(self): # <<<<<<<<<<<<<< - * return self.view.ndim + /* "View.MemoryView":677 * + * result = [] + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * for idx, item in enumerate(tup): */ + __pyx_v_have_slices = 0; -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":583 - * @property - * def ndim(self): - * return self.view.ndim # <<<<<<<<<<<<<< - * - * @property + /* "View.MemoryView":678 + * result = [] + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * for idx, item in enumerate(tup): + * if item is Ellipsis: */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 583, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; + __pyx_v_seen_ellipsis = 0; - /* "View.MemoryView":582 - * - * @property - * def ndim(self): # <<<<<<<<<<<<<< - * return self.view.ndim - * + /* "View.MemoryView":679 + * have_slices = False + * seen_ellipsis = False + * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: */ + __Pyx_INCREF(__pyx_int_0); + __pyx_t_3 = __pyx_int_0; + if (likely(PyList_CheckExact(__pyx_v_tup)) || PyTuple_CheckExact(__pyx_v_tup)) { + __pyx_t_4 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + } else { + __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_tup); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 679, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_6)) { + if (likely(PyList_CheckExact(__pyx_t_4))) { + if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(1, 679, __pyx_L1_error) + #else + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } else { + if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(1, 679, __pyx_L1_error) + #else + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } + } else { + __pyx_t_7 = __pyx_t_6(__pyx_t_4); + if (unlikely(!__pyx_t_7)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 679, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_7); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_3); + __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); + __pyx_t_3 = __pyx_t_7; + __pyx_t_7 = 0; - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":680 + * seen_ellipsis = False + * for idx, item in enumerate(tup): + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { -/* "View.MemoryView":586 - * - * @property - * def itemsize(self): # <<<<<<<<<<<<<< - * return self.view.itemsize - * + /* "View.MemoryView":681 + * for idx, item in enumerate(tup): + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True */ + __pyx_t_1 = ((!(__pyx_v_seen_ellipsis != 0)) != 0); + if (__pyx_t_1) { -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + /* "View.MemoryView":682 + * if item is Ellipsis: + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * else: + */ + __pyx_t_8 = PyObject_Length(__pyx_v_tup); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(1, 682, __pyx_L1_error) + __pyx_t_7 = PyList_New(1 * ((((__pyx_v_ndim - __pyx_t_8) + 1)<0) ? 0:((__pyx_v_ndim - __pyx_t_8) + 1))); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 682, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < ((__pyx_v_ndim - __pyx_t_8) + 1); __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__15); + __Pyx_GIVEREF(__pyx_slice__15); + PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__15); + } + } + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 682, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":683 + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * else: + * result.append(slice(None)) + */ + __pyx_v_seen_ellipsis = 1; -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__get__", 0); + /* "View.MemoryView":681 + * for idx, item in enumerate(tup): + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True + */ + goto __pyx_L7; + } - /* "View.MemoryView":587 - * @property - * def itemsize(self): - * return self.view.itemsize # <<<<<<<<<<<<<< + /* "View.MemoryView":685 + * seen_ellipsis = True + * else: + * result.append(slice(None)) # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + /*else*/ { + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__15); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 685, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":686 + * else: + * result.append(slice(None)) + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":680 + * seen_ellipsis = False + * for idx, item in enumerate(tup): + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + */ + goto __pyx_L6; + } + + /* "View.MemoryView":688 + * have_slices = True + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError("Cannot index with type '%s'" % type(item)) * - * @property */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 587, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + __pyx_t_10 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = ((!(PyIndex_Check(__pyx_v_item) != 0)) != 0); + __pyx_t_1 = __pyx_t_10; + __pyx_L9_bool_binop_done:; + if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":586 + /* "View.MemoryView":689 + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): + * raise TypeError("Cannot index with type '%s'" % type(item)) # <<<<<<<<<<<<<< * - * @property - * def itemsize(self): # <<<<<<<<<<<<<< - * return self.view.itemsize + * have_slices = have_slices or isinstance(item, slice) + */ + __pyx_t_7 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Cannot_index_with_type_s, ((PyObject *)Py_TYPE(__pyx_v_item))); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 689, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 689, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_11, 0, 0, 0); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __PYX_ERR(1, 689, __pyx_L1_error) + + /* "View.MemoryView":688 + * have_slices = True + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError("Cannot index with type '%s'" % type(item)) * */ + } - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":691 + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + * have_slices = have_slices or isinstance(item, slice) # <<<<<<<<<<<<<< + * result.append(item) + * + */ + __pyx_t_10 = (__pyx_v_have_slices != 0); + if (!__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_10 = PySlice_Check(__pyx_v_item); + __pyx_t_2 = (__pyx_t_10 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L11_bool_binop_done:; + __pyx_v_have_slices = __pyx_t_1; -/* "View.MemoryView":590 + /* "View.MemoryView":692 * - * @property - * def nbytes(self): # <<<<<<<<<<<<<< - * return self.size * self.view.itemsize + * have_slices = have_slices or isinstance(item, slice) + * result.append(item) # <<<<<<<<<<<<<< * + * nslices = ndim - len(result) */ + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_v_item); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 692, __pyx_L1_error) + } + __pyx_L6:; -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + /* "View.MemoryView":679 + * have_slices = False + * seen_ellipsis = False + * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":694 + * result.append(item) + * + * nslices = ndim - len(result) # <<<<<<<<<<<<<< + * if nslices: + * result.extend([slice(None)] * nslices) + */ + __pyx_t_5 = PyList_GET_SIZE(__pyx_v_result); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(1, 694, __pyx_L1_error) + __pyx_v_nslices = (__pyx_v_ndim - __pyx_t_5); -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - __Pyx_RefNannySetupContext("__get__", 0); + /* "View.MemoryView":695 + * + * nslices = ndim - len(result) + * if nslices: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * nslices) + * + */ + __pyx_t_1 = (__pyx_v_nslices != 0); + if (__pyx_t_1) { - /* "View.MemoryView":591 - * @property - * def nbytes(self): - * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + /* "View.MemoryView":696 + * nslices = ndim - len(result) + * if nslices: + * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< * - * @property + * return have_slices or nslices, tuple(result) + */ + __pyx_t_3 = PyList_New(1 * ((__pyx_v_nslices<0) ? 0:__pyx_v_nslices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 696, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_nslices; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__15); + __Pyx_GIVEREF(__pyx_slice__15); + PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__15); + } + } + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 696, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":695 + * + * nslices = ndim - len(result) + * if nslices: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * nslices) + * + */ + } + + /* "View.MemoryView":698 + * result.extend([slice(None)] * nslices) + * + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 591, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 591, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 591, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_3; + if (!__pyx_v_have_slices) { + } else { + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_L14_bool_binop_done:; + __pyx_t_4 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_4); __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_r = ((PyObject*)__pyx_t_11); + __pyx_t_11 = 0; goto __pyx_L0; - /* "View.MemoryView":590 - * - * @property - * def nbytes(self): # <<<<<<<<<<<<<< - * return self.size * self.view.itemsize + /* "View.MemoryView":666 + * return isinstance(o, memoryview) * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_XDECREF(__pyx_v_item); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":594 +/* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) * - * @property - * def size(self): # <<<<<<<<<<<<<< - * if self._size is None: - * result = 1 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: */ -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_v_result = NULL; - PyObject *__pyx_v_length = NULL; +static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; Py_ssize_t *__pyx_t_3; - Py_ssize_t *__pyx_t_4; - Py_ssize_t *__pyx_t_5; - PyObject *__pyx_t_6 = NULL; - __Pyx_RefNannySetupContext("__get__", 0); + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("assert_direct_dimensions", 0); - /* "View.MemoryView":595 - * @property - * def size(self): - * if self._size is None: # <<<<<<<<<<<<<< - * result = 1 + /* "View.MemoryView":701 * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") */ - __pyx_t_1 = (__pyx_v_self->_size == Py_None); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); - /* "View.MemoryView":596 - * def size(self): - * if self._size is None: - * result = 1 # <<<<<<<<<<<<<< + /* "View.MemoryView":702 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError("Indirect dimensions not supported") * - * for length in self.view.shape[:self.view.ndim]: */ - __Pyx_INCREF(__pyx_int_1); - __pyx_v_result = __pyx_int_1; + __pyx_t_4 = ((__pyx_v_suboffset >= 0) != 0); + if (unlikely(__pyx_t_4)) { - /* "View.MemoryView":598 - * result = 1 + /* "View.MemoryView":703 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< * - * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< - * result *= length * */ - __pyx_t_4 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); - for (__pyx_t_5 = __pyx_v_self->view.shape; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { - __pyx_t_3 = __pyx_t_5; - __pyx_t_6 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 598, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_6); - __pyx_t_6 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(1, 703, __pyx_L1_error) - /* "View.MemoryView":599 - * - * for length in self.view.shape[:self.view.ndim]: - * result *= length # <<<<<<<<<<<<<< + /* "View.MemoryView":702 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError("Indirect dimensions not supported") * - * self._size = result */ - __pyx_t_6 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 599, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_6); - __pyx_t_6 = 0; } + } - /* "View.MemoryView":601 - * result *= length - * - * self._size = result # <<<<<<<<<<<<<< - * - * return self._size - */ - __Pyx_INCREF(__pyx_v_result); - __Pyx_GIVEREF(__pyx_v_result); - __Pyx_GOTREF(__pyx_v_self->_size); - __Pyx_DECREF(__pyx_v_self->_size); - __pyx_v_self->_size = __pyx_v_result; - - /* "View.MemoryView":595 - * @property - * def size(self): - * if self._size is None: # <<<<<<<<<<<<<< - * result = 1 + /* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) * - */ - } - - /* "View.MemoryView":603 - * self._size = result - * - * return self._size # <<<<<<<<<<<<<< - * - * def __len__(self): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->_size); - __pyx_r = __pyx_v_self->_size; - goto __pyx_L0; - - /* "View.MemoryView":594 - * - * @property - * def size(self): # <<<<<<<<<<<<<< - * if self._size is None: - * result = 1 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: */ /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; - __Pyx_XDECREF(__pyx_v_result); - __Pyx_XDECREF(__pyx_v_length); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":605 - * return self._size +/* "View.MemoryView":710 * - * def __len__(self): # <<<<<<<<<<<<<< - * if self.view.ndim >= 1: - * return self.view.shape[0] + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step */ -/* Python wrapper */ -static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ -static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { - Py_ssize_t __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { - Py_ssize_t __pyx_r; +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; - __Pyx_RefNannySetupContext("__len__", 0); + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + struct __pyx_memoryview_obj *__pyx_t_4; + char *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *(*__pyx_t_8)(PyObject *); + PyObject *__pyx_t_9 = NULL; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + Py_ssize_t __pyx_t_12; + __Pyx_RefNannySetupContext("memview_slice", 0); - /* "View.MemoryView":606 - * - * def __len__(self): - * if self.view.ndim >= 1: # <<<<<<<<<<<<<< - * return self.view.shape[0] - * + /* "View.MemoryView":711 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst */ - __pyx_t_1 = ((__pyx_v_self->view.ndim >= 1) != 0); - if (__pyx_t_1) { + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; - /* "View.MemoryView":607 - * def __len__(self): - * if self.view.ndim >= 1: - * return self.view.shape[0] # <<<<<<<<<<<<<< + /* "View.MemoryView":718 * - * return 0 + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj */ - __pyx_r = (__pyx_v_self->view.shape[0]); - goto __pyx_L0; + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); - /* "View.MemoryView":606 + /* "View.MemoryView":722 + * cdef _memoryviewslice memviewsliceobj * - * def __len__(self): - * if self.view.ndim >= 1: # <<<<<<<<<<<<<< - * return self.view.shape[0] + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< * + * if isinstance(memview, _memoryviewslice): */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(!Py_OptimizeFlag)) { + if (unlikely(!((__pyx_v_memview->view.ndim > 0) != 0))) { + PyErr_SetNone(PyExc_AssertionError); + __PYX_ERR(1, 722, __pyx_L1_error) + } } + #endif - /* "View.MemoryView":609 - * return self.view.shape[0] - * - * return 0 # <<<<<<<<<<<<<< + /* "View.MemoryView":724 + * assert memview.view.ndim > 0 * - * def __repr__(self): + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice */ - __pyx_r = 0; - goto __pyx_L0; + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { - /* "View.MemoryView":605 - * return self._size + /* "View.MemoryView":725 * - * def __len__(self): # <<<<<<<<<<<<<< - * if self.view.ndim >= 1: - * return self.view.shape[0] + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 725, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); + __pyx_t_3 = 0; - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":726 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); -/* "View.MemoryView":611 - * return 0 + /* "View.MemoryView":724 + * assert memview.view.ndim > 0 * - * def __repr__(self): # <<<<<<<<<<<<<< - * return "" % (self.base.__class__.__name__, - * id(self)) + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice */ + goto __pyx_L3; + } -/* Python wrapper */ -static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":728 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - __Pyx_RefNannySetupContext("__repr__", 0); + /* "View.MemoryView":729 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; - /* "View.MemoryView":612 + /* "View.MemoryView":735 * - * def __repr__(self): - * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< - * id(self)) + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data * */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_4; - /* "View.MemoryView":613 - * def __repr__(self): - * return "" % (self.base.__class__.__name__, - * id(self)) # <<<<<<<<<<<<<< + /* "View.MemoryView":736 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * * - * def __str__(self): */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 613, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_5; - /* "View.MemoryView":612 + /* "View.MemoryView":741 * - * def __repr__(self): - * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< - * id(self)) * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + __pyx_v_p_dst = (&__pyx_v_dst); - /* "View.MemoryView":611 - * return 0 + /* "View.MemoryView":742 * - * def __repr__(self): # <<<<<<<<<<<<<< - * return "" % (self.base.__class__.__name__, - * id(self)) + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step + * cdef bint have_start, have_stop, have_step */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":615 - * id(self)) - * - * def __str__(self): # <<<<<<<<<<<<<< - * return "" % (self.base.__class__.__name__,) + /* "View.MemoryView":746 + * cdef bint have_start, have_stop, have_step * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * slice_memviewslice( */ + __pyx_t_6 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_3 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0; + __pyx_t_8 = NULL; + } else { + __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 746, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 746, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_8)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_9 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(1, 746, __pyx_L1_error) + #else + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 746, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + } else { + if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(1, 746, __pyx_L1_error) + #else + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 746, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + } + } else { + __pyx_t_9 = __pyx_t_8(__pyx_t_3); + if (unlikely(!__pyx_t_9)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 746, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_9); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_9); + __pyx_t_9 = 0; + __pyx_v_dim = __pyx_t_6; + __pyx_t_6 = (__pyx_t_6 + 1); -/* Python wrapper */ -static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("__str__", 0); - - /* "View.MemoryView":616 - * - * def __str__(self): - * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< - * + /* "View.MemoryView":747 * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); - __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; + __pyx_t_2 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":615 - * id(self)) - * - * def __str__(self): # <<<<<<<<<<<<<< - * return "" % (self.base.__class__.__name__,) - * + /* "View.MemoryView":751 + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + * index, 0, 0, # start, stop, step # <<<<<<<<<<<<<< + * 0, 0, 0, # have_{start,stop,step} + * False) */ + __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 751, __pyx_L1_error) - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":748 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_t_10, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(1, 748, __pyx_L1_error) -/* "View.MemoryView":619 - * + /* "View.MemoryView":747 * - * def is_c_contig(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], */ + goto __pyx_L6; + } -/* Python wrapper */ -static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":754 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_2 = (__pyx_v_index == Py_None); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { - __Pyx_memviewslice *__pyx_v_mslice; - __Pyx_memviewslice __pyx_v_tmp; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice *__pyx_t_1; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("is_c_contig", 0); + /* "View.MemoryView":755 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; - /* "View.MemoryView":622 - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp - * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< - * return slice_is_contig(mslice[0], 'C', self.view.ndim) - * + /* "View.MemoryView":756 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 622, __pyx_L1_error) - __pyx_v_mslice = __pyx_t_1; + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; - /* "View.MemoryView":623 - * cdef __Pyx_memviewslice tmp - * mslice = get_slice_from_memview(self, &tmp) - * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< - * - * def is_f_contig(self): + /* "View.MemoryView":757 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 623, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; - /* "View.MemoryView":619 - * - * - * def is_c_contig(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp + /* "View.MemoryView":758 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":625 - * return slice_is_contig(mslice[0], 'C', self.view.ndim) - * - * def is_f_contig(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp + /* "View.MemoryView":754 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 */ + goto __pyx_L6; + } -/* Python wrapper */ -static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { - __Pyx_memviewslice *__pyx_v_mslice; - __Pyx_memviewslice __pyx_v_tmp; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice *__pyx_t_1; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("is_f_contig", 0); + /* "View.MemoryView":760 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 760, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 760, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 760, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_10; - /* "View.MemoryView":628 - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp - * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< - * return slice_is_contig(mslice[0], 'F', self.view.ndim) + /* "View.MemoryView":761 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 * */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 628, __pyx_L1_error) - __pyx_v_mslice = __pyx_t_1; + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 761, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 761, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 761, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_10; - /* "View.MemoryView":629 - * cdef __Pyx_memviewslice tmp - * mslice = get_slice_from_memview(self, &tmp) - * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + /* "View.MemoryView":762 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< * - * def copy(self): + * have_start = index.start is not None */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 629, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 762, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 762, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 762, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_10; - /* "View.MemoryView":625 - * return slice_is_contig(mslice[0], 'C', self.view.ndim) + /* "View.MemoryView":764 + * step = index.step or 0 * - * def is_f_contig(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 764, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_start = __pyx_t_1; - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":631 - * return slice_is_contig(mslice[0], 'F', self.view.ndim) + /* "View.MemoryView":765 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None * - * def copy(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice mslice - * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 765, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_stop = __pyx_t_1; -/* Python wrapper */ -static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("copy (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { - __Pyx_memviewslice __pyx_v_mslice; - int __pyx_v_flags; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("copy", 0); - - /* "View.MemoryView":633 - * def copy(self): - * cdef __Pyx_memviewslice mslice - * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + /* "View.MemoryView":766 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< * - * slice_copy(self, &mslice) + * slice_memviewslice( */ - __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_step = __pyx_t_1; - /* "View.MemoryView":635 - * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + /* "View.MemoryView":768 + * have_step = index.step is not None * - * slice_copy(self, &mslice) # <<<<<<<<<<<<<< - * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, - * self.view.itemsize, + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, */ - __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(1, 768, __pyx_L1_error) - /* "View.MemoryView":636 + /* "View.MemoryView":774 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< * - * slice_copy(self, &mslice) - * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< - * self.view.itemsize, - * flags|PyBUF_C_CONTIGUOUS, + * if isinstance(memview, _memoryviewslice): */ - __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 636, __pyx_L1_error) - __pyx_v_mslice = __pyx_t_1; + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; - /* "View.MemoryView":641 - * self.dtype_is_object) - * - * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + /* "View.MemoryView":746 + * cdef bint have_start, have_stop, have_step * - * def copy_fortran(self): + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * slice_memviewslice( */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 641, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":631 - * return slice_is_contig(mslice[0], 'F', self.view.ndim) + /* "View.MemoryView":776 + * new_ndim += 1 * - * def copy(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice mslice - * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":643 - * return memoryview_copy_from_slice(self, &mslice) + /* "View.MemoryView":777 * - * def copy_fortran(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice src, dst - * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, */ + __Pyx_XDECREF(((PyObject *)__pyx_r)); -/* Python wrapper */ -static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":778 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 778, __pyx_L1_error) } -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { - __Pyx_memviewslice __pyx_v_src; - __Pyx_memviewslice __pyx_v_dst; - int __pyx_v_flags; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("copy_fortran", 0); + /* "View.MemoryView":779 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 779, __pyx_L1_error) } - /* "View.MemoryView":645 - * def copy_fortran(self): - * cdef __Pyx_memviewslice src, dst - * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + /* "View.MemoryView":777 * - * slice_copy(self, &src) + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, */ - __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 777, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; - /* "View.MemoryView":647 - * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + /* "View.MemoryView":776 + * new_ndim += 1 * - * slice_copy(self, &src) # <<<<<<<<<<<<<< - * dst = slice_copy_contig(&src, "fortran", self.view.ndim, - * self.view.itemsize, + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, */ - __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + } - /* "View.MemoryView":648 + /* "View.MemoryView":782 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) * - * slice_copy(self, &src) - * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< - * self.view.itemsize, - * flags|PyBUF_F_CONTIGUOUS, */ - __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 648, __pyx_L1_error) - __pyx_v_dst = __pyx_t_1; + /*else*/ { + __Pyx_XDECREF(((PyObject *)__pyx_r)); - /* "View.MemoryView":653 - * self.dtype_is_object) + /* "View.MemoryView":783 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< * - * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< * + */ + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + + /* "View.MemoryView":782 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) * */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 653, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 782, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + } - /* "View.MemoryView":643 - * return memoryview_copy_from_slice(self, &mslice) + /* "View.MemoryView":710 * - * def copy_fortran(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice src, dst - * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): +/* "View.MemoryView":807 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, */ -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":827 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = ((!(__pyx_v_is_slice != 0)) != 0); + if (__pyx_t_1) { -static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); + /* "View.MemoryView":829 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_1) { - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + /* "View.MemoryView":830 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): + /* "View.MemoryView":829 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: */ + } - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":831 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + /* "View.MemoryView":832 + * start += shape + * if not 0 <= start < shape: + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"Index out of bounds (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 832, __pyx_L1_error) -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + /* "View.MemoryView":831 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + /* "View.MemoryView":827 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 4, __pyx_L1_error) + goto __pyx_L3; + } - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + /* "View.MemoryView":835 + * else: + * + * negative_step = have_step != 0 and step < 0 # <<<<<<<<<<<<<< + * + * if have_step and step == 0: */ + /*else*/ { + __pyx_t_1 = ((__pyx_v_have_step != 0) != 0); + if (__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_step < 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L6_bool_binop_done:; + __pyx_v_negative_step = __pyx_t_2; - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":657 + /* "View.MemoryView":837 + * negative_step = have_step != 0 and step < 0 + * + * if have_step and step == 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) * - * @cname('__pyx_memoryview_new') - * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< - * cdef memoryview result = memoryview(o, flags, dtype_is_object) - * result.typeinfo = typeinfo */ + __pyx_t_1 = (__pyx_v_have_step != 0); + if (__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_step == 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L9_bool_binop_done:; + if (__pyx_t_2) { -static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { - struct __pyx_memoryview_obj *__pyx_v_result = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - __Pyx_RefNannySetupContext("memoryview_cwrapper", 0); - - /* "View.MemoryView":658 - * @cname('__pyx_memoryview_new') - * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): - * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< - * result.typeinfo = typeinfo - * return result + /* "View.MemoryView":838 + * + * if have_step and step == 0: + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * + * */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 658, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 658, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 658, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_o); - __Pyx_GIVEREF(__pyx_v_o); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 658, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); - __pyx_t_2 = 0; + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Step may not be zero (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 838, __pyx_L1_error) - /* "View.MemoryView":659 - * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): - * cdef memoryview result = memoryview(o, flags, dtype_is_object) - * result.typeinfo = typeinfo # <<<<<<<<<<<<<< - * return result + /* "View.MemoryView":837 + * negative_step = have_step != 0 and step < 0 + * + * if have_step and step == 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) * */ - __pyx_v_result->typeinfo = __pyx_v_typeinfo; + } - /* "View.MemoryView":660 - * cdef memoryview result = memoryview(o, flags, dtype_is_object) - * result.typeinfo = typeinfo - * return result # <<<<<<<<<<<<<< + /* "View.MemoryView":841 * - * @cname('__pyx_memoryview_check') + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_result)); - __pyx_r = ((PyObject *)__pyx_v_result); - goto __pyx_L0; + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { - /* "View.MemoryView":657 + /* "View.MemoryView":842 * - * @cname('__pyx_memoryview_new') - * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< - * cdef memoryview result = memoryview(o, flags, dtype_is_object) - * result.typeinfo = typeinfo + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: */ + __pyx_t_2 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_2) { - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":843 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); -/* "View.MemoryView":663 - * - * @cname('__pyx_memoryview_check') - * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< - * return isinstance(o, memoryview) - * + /* "View.MemoryView":844 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: */ + __pyx_t_2 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_2) { -static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("memoryview_check", 0); + /* "View.MemoryView":845 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; - /* "View.MemoryView":664 - * @cname('__pyx_memoryview_check') - * cdef inline bint memoryview_check(object o): - * return isinstance(o, memoryview) # <<<<<<<<<<<<<< - * - * cdef tuple _unellipsify(object index, int ndim): + /* "View.MemoryView":844 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: */ - __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); - __pyx_r = __pyx_t_1; - goto __pyx_L0; + } - /* "View.MemoryView":663 - * - * @cname('__pyx_memoryview_check') - * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< - * return isinstance(o, memoryview) + /* "View.MemoryView":842 * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: */ + goto __pyx_L12; + } - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} + /* "View.MemoryView":846 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = ((__pyx_v_start >= __pyx_v_shape) != 0); + if (__pyx_t_2) { -/* "View.MemoryView":666 - * return isinstance(o, memoryview) - * - * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< - * """ - * Replace all ellipses with full slices and fill incomplete indices with + /* "View.MemoryView":847 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: */ + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { -static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { - PyObject *__pyx_v_tup = NULL; - PyObject *__pyx_v_result = NULL; - int __pyx_v_have_slices; - int __pyx_v_seen_ellipsis; - CYTHON_UNUSED PyObject *__pyx_v_idx = NULL; - PyObject *__pyx_v_item = NULL; - Py_ssize_t __pyx_v_nslices; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - Py_ssize_t __pyx_t_5; - PyObject *(*__pyx_t_6)(PyObject *); - PyObject *__pyx_t_7 = NULL; - Py_ssize_t __pyx_t_8; - int __pyx_t_9; - int __pyx_t_10; - PyObject *__pyx_t_11 = NULL; - __Pyx_RefNannySetupContext("_unellipsify", 0); - - /* "View.MemoryView":671 - * full slices. - * """ - * if not isinstance(index, tuple): # <<<<<<<<<<<<<< - * tup = (index,) - * else: + /* "View.MemoryView":848 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape */ - __pyx_t_1 = PyTuple_Check(__pyx_v_index); - __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); - if (__pyx_t_2) { + __pyx_v_start = (__pyx_v_shape - 1); - /* "View.MemoryView":672 - * """ - * if not isinstance(index, tuple): - * tup = (index,) # <<<<<<<<<<<<<< - * else: - * tup = index + /* "View.MemoryView":847 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: */ - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 672, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_index); - __Pyx_GIVEREF(__pyx_v_index); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index); - __pyx_v_tup = __pyx_t_3; - __pyx_t_3 = 0; + goto __pyx_L14; + } - /* "View.MemoryView":671 - * full slices. - * """ - * if not isinstance(index, tuple): # <<<<<<<<<<<<<< - * tup = (index,) - * else: + /* "View.MemoryView":850 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: */ - goto __pyx_L3; - } + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L14:; - /* "View.MemoryView":674 - * tup = (index,) - * else: - * tup = index # <<<<<<<<<<<<<< - * - * result = [] + /* "View.MemoryView":846 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 */ - /*else*/ { - __Pyx_INCREF(__pyx_v_index); - __pyx_v_tup = __pyx_v_index; - } - __pyx_L3:; + } + __pyx_L12:; - /* "View.MemoryView":676 - * tup = index + /* "View.MemoryView":841 * - * result = [] # <<<<<<<<<<<<<< - * have_slices = False - * seen_ellipsis = False - */ - __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 676, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_result = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":677 * - * result = [] - * have_slices = False # <<<<<<<<<<<<<< - * seen_ellipsis = False - * for idx, item in enumerate(tup): - */ - __pyx_v_have_slices = 0; - - /* "View.MemoryView":678 - * result = [] - * have_slices = False - * seen_ellipsis = False # <<<<<<<<<<<<<< - * for idx, item in enumerate(tup): - * if item is Ellipsis: - */ - __pyx_v_seen_ellipsis = 0; - - /* "View.MemoryView":679 - * have_slices = False - * seen_ellipsis = False - * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< - * if item is Ellipsis: - * if not seen_ellipsis: + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape */ - __Pyx_INCREF(__pyx_int_0); - __pyx_t_3 = __pyx_int_0; - if (likely(PyList_CheckExact(__pyx_v_tup)) || PyTuple_CheckExact(__pyx_v_tup)) { - __pyx_t_4 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; - __pyx_t_6 = NULL; - } else { - __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_tup); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 679, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 679, __pyx_L1_error) - } - for (;;) { - if (likely(!__pyx_t_6)) { - if (likely(PyList_CheckExact(__pyx_t_4))) { - if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 679, __pyx_L1_error) - #else - __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - #endif - } else { - if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 679, __pyx_L1_error) - #else - __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - #endif - } - } else { - __pyx_t_7 = __pyx_t_6(__pyx_t_4); - if (unlikely(!__pyx_t_7)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 679, __pyx_L1_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_7); + goto __pyx_L11; } - __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_7); - __pyx_t_7 = 0; - __Pyx_INCREF(__pyx_t_3); - __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_3); - __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_3); - __pyx_t_3 = __pyx_t_7; - __pyx_t_7 = 0; - - /* "View.MemoryView":680 - * seen_ellipsis = False - * for idx, item in enumerate(tup): - * if item is Ellipsis: # <<<<<<<<<<<<<< - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - */ - __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); - __pyx_t_1 = (__pyx_t_2 != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":681 - * for idx, item in enumerate(tup): - * if item is Ellipsis: - * if not seen_ellipsis: # <<<<<<<<<<<<<< - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - * seen_ellipsis = True - */ - __pyx_t_1 = ((!(__pyx_v_seen_ellipsis != 0)) != 0); - if (__pyx_t_1) { - /* "View.MemoryView":682 - * if item is Ellipsis: - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< - * seen_ellipsis = True + /* "View.MemoryView":852 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 * else: */ - __pyx_t_8 = PyObject_Length(__pyx_v_tup); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(2, 682, __pyx_L1_error) - __pyx_t_7 = PyList_New(1 * ((((__pyx_v_ndim - __pyx_t_8) + 1)<0) ? 0:((__pyx_v_ndim - __pyx_t_8) + 1))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 682, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - { Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < ((__pyx_v_ndim - __pyx_t_8) + 1); __pyx_temp++) { - __Pyx_INCREF(__pyx_slice__15); - __Pyx_GIVEREF(__pyx_slice__15); - PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__15); - } - } - __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 682, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + /*else*/ { + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { - /* "View.MemoryView":683 - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - * seen_ellipsis = True # <<<<<<<<<<<<<< + /* "View.MemoryView":853 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< * else: - * result.append(slice(None)) + * start = 0 */ - __pyx_v_seen_ellipsis = 1; + __pyx_v_start = (__pyx_v_shape - 1); - /* "View.MemoryView":681 - * for idx, item in enumerate(tup): - * if item is Ellipsis: - * if not seen_ellipsis: # <<<<<<<<<<<<<< - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - * seen_ellipsis = True + /* "View.MemoryView":852 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: */ - goto __pyx_L7; + goto __pyx_L15; } - /* "View.MemoryView":685 - * seen_ellipsis = True + /* "View.MemoryView":855 + * start = shape - 1 * else: - * result.append(slice(None)) # <<<<<<<<<<<<<< - * have_slices = True - * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: */ /*else*/ { - __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__15); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 685, __pyx_L1_error) + __pyx_v_start = 0; } - __pyx_L7:; - - /* "View.MemoryView":686 - * else: - * result.append(slice(None)) - * have_slices = True # <<<<<<<<<<<<<< - * else: - * if not isinstance(item, slice) and not PyIndex_Check(item): + __pyx_L15:; + } + __pyx_L11:; + + /* "View.MemoryView":857 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape */ - __pyx_v_have_slices = 1; + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { - /* "View.MemoryView":680 - * seen_ellipsis = False - * for idx, item in enumerate(tup): - * if item is Ellipsis: # <<<<<<<<<<<<<< - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) + /* "View.MemoryView":858 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: */ - goto __pyx_L6; - } + __pyx_t_2 = ((__pyx_v_stop < 0) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":688 - * have_slices = True - * else: - * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< - * raise TypeError("Cannot index with type '%s'" % type(item)) + /* "View.MemoryView":859 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":860 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = ((__pyx_v_stop < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":861 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":860 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":858 * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: */ - /*else*/ { - __pyx_t_2 = PySlice_Check(__pyx_v_item); - __pyx_t_10 = ((!(__pyx_t_2 != 0)) != 0); - if (__pyx_t_10) { - } else { - __pyx_t_1 = __pyx_t_10; - goto __pyx_L9_bool_binop_done; + goto __pyx_L17; } - __pyx_t_10 = ((!(PyIndex_Check(__pyx_v_item) != 0)) != 0); - __pyx_t_1 = __pyx_t_10; - __pyx_L9_bool_binop_done:; - if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":689 + /* "View.MemoryView":862 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape * else: - * if not isinstance(item, slice) and not PyIndex_Check(item): - * raise TypeError("Cannot index with type '%s'" % type(item)) # <<<<<<<<<<<<<< - * - * have_slices = have_slices or isinstance(item, slice) */ - __pyx_t_7 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Cannot_index_with_type_s, ((PyObject *)Py_TYPE(__pyx_v_item))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 689, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 689, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_Raise(__pyx_t_11, 0, 0, 0); - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __PYX_ERR(2, 689, __pyx_L1_error) + __pyx_t_2 = ((__pyx_v_stop > __pyx_v_shape) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":688 - * have_slices = True + /* "View.MemoryView":863 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< * else: - * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< - * raise TypeError("Cannot index with type '%s'" % type(item)) - * + * if negative_step: */ - } + __pyx_v_stop = __pyx_v_shape; - /* "View.MemoryView":691 - * raise TypeError("Cannot index with type '%s'" % type(item)) - * - * have_slices = have_slices or isinstance(item, slice) # <<<<<<<<<<<<<< - * result.append(item) - * + /* "View.MemoryView":862 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: */ - __pyx_t_10 = (__pyx_v_have_slices != 0); - if (!__pyx_t_10) { - } else { - __pyx_t_1 = __pyx_t_10; - goto __pyx_L11_bool_binop_done; } - __pyx_t_10 = PySlice_Check(__pyx_v_item); - __pyx_t_2 = (__pyx_t_10 != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L11_bool_binop_done:; - __pyx_v_have_slices = __pyx_t_1; + __pyx_L17:; - /* "View.MemoryView":692 - * - * have_slices = have_slices or isinstance(item, slice) - * result.append(item) # <<<<<<<<<<<<<< + /* "View.MemoryView":857 + * start = 0 * - * nslices = ndim - len(result) + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape */ - __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_v_item); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 692, __pyx_L1_error) + goto __pyx_L16; } - __pyx_L6:; - /* "View.MemoryView":679 - * have_slices = False - * seen_ellipsis = False - * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< - * if item is Ellipsis: - * if not seen_ellipsis: + /* "View.MemoryView":865 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: */ - } - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + /*else*/ { + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { - /* "View.MemoryView":694 - * result.append(item) - * - * nslices = ndim - len(result) # <<<<<<<<<<<<<< - * if nslices: - * result.extend([slice(None)] * nslices) + /* "View.MemoryView":866 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape */ - __pyx_t_5 = PyList_GET_SIZE(__pyx_v_result); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(2, 694, __pyx_L1_error) - __pyx_v_nslices = (__pyx_v_ndim - __pyx_t_5); + __pyx_v_stop = -1L; - /* "View.MemoryView":695 - * - * nslices = ndim - len(result) - * if nslices: # <<<<<<<<<<<<<< - * result.extend([slice(None)] * nslices) - * + /* "View.MemoryView":865 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: */ - __pyx_t_1 = (__pyx_v_nslices != 0); - if (__pyx_t_1) { + goto __pyx_L19; + } - /* "View.MemoryView":696 - * nslices = ndim - len(result) - * if nslices: - * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< + /* "View.MemoryView":868 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< * - * return have_slices or nslices, tuple(result) + * if not have_step: */ - __pyx_t_3 = PyList_New(1 * ((__pyx_v_nslices<0) ? 0:__pyx_v_nslices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 696, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - { Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < __pyx_v_nslices; __pyx_temp++) { - __Pyx_INCREF(__pyx_slice__15); - __Pyx_GIVEREF(__pyx_slice__15); - PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__15); + /*else*/ { + __pyx_v_stop = __pyx_v_shape; } + __pyx_L19:; } - __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 696, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_L16:; - /* "View.MemoryView":695 + /* "View.MemoryView":870 + * stop = shape * - * nslices = ndim - len(result) - * if nslices: # <<<<<<<<<<<<<< - * result.extend([slice(None)] * nslices) + * if not have_step: # <<<<<<<<<<<<<< + * step = 1 * */ - } + __pyx_t_2 = ((!(__pyx_v_have_step != 0)) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":698 - * result.extend([slice(None)] * nslices) + /* "View.MemoryView":871 + * + * if not have_step: + * step = 1 # <<<<<<<<<<<<<< * - * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< * - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): */ - __Pyx_XDECREF(__pyx_r); - if (!__pyx_v_have_slices) { - } else { - __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __pyx_t_4; - __pyx_t_4 = 0; - goto __pyx_L14_bool_binop_done; - } - __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __pyx_t_4; - __pyx_t_4 = 0; - __pyx_L14_bool_binop_done:; - __pyx_t_4 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_4); - __pyx_t_3 = 0; - __pyx_t_4 = 0; - __pyx_r = ((PyObject*)__pyx_t_11); - __pyx_t_11 = 0; - goto __pyx_L0; + __pyx_v_step = 1; - /* "View.MemoryView":666 - * return isinstance(o, memoryview) + /* "View.MemoryView":870 + * stop = shape * - * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< - * """ - * Replace all ellipses with full slices and fill incomplete indices with - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_tup); - __Pyx_XDECREF(__pyx_v_result); - __Pyx_XDECREF(__pyx_v_idx); - __Pyx_XDECREF(__pyx_v_item); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":700 - * return have_slices or nslices, tuple(result) + * if not have_step: # <<<<<<<<<<<<<< + * step = 1 * - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: */ + } -static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { - Py_ssize_t __pyx_v_suboffset; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - Py_ssize_t *__pyx_t_1; - Py_ssize_t *__pyx_t_2; - Py_ssize_t *__pyx_t_3; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - __Pyx_RefNannySetupContext("assert_direct_dimensions", 0); - - /* "View.MemoryView":701 + /* "View.MemoryView":875 * - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): - * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< - * if suboffset >= 0: - * raise ValueError("Indirect dimensions not supported") + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: */ - __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); - for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { - __pyx_t_1 = __pyx_t_3; - __pyx_v_suboffset = (__pyx_t_1[0]); + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); - /* "View.MemoryView":702 - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: # <<<<<<<<<<<<<< - * raise ValueError("Indirect dimensions not supported") + /* "View.MemoryView":877 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 * */ - __pyx_t_4 = ((__pyx_v_suboffset >= 0) != 0); - if (unlikely(__pyx_t_4)) { + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":703 - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: - * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< + /* "View.MemoryView":878 * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< * + * if new_shape < 0: */ - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 703, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_Raise(__pyx_t_5, 0, 0, 0); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(2, 703, __pyx_L1_error) + __pyx_v_new_shape = (__pyx_v_new_shape + 1); - /* "View.MemoryView":702 - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: # <<<<<<<<<<<<<< - * raise ValueError("Indirect dimensions not supported") + /* "View.MemoryView":877 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 * */ } - } - /* "View.MemoryView":700 - * return have_slices or nslices, tuple(result) + /* "View.MemoryView":880 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 * - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: */ + __pyx_t_2 = ((__pyx_v_new_shape < 0) != 0); + if (__pyx_t_2) { - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":710 + /* "View.MemoryView":881 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * * - * @cname('__pyx_memview_slice') - * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< - * cdef int new_ndim = 0, suboffset_dim = -1, dim - * cdef bint negative_step */ + __pyx_v_new_shape = 0; -static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { - int __pyx_v_new_ndim; - int __pyx_v_suboffset_dim; - int __pyx_v_dim; - __Pyx_memviewslice __pyx_v_src; - __Pyx_memviewslice __pyx_v_dst; - __Pyx_memviewslice *__pyx_v_p_src; - struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; - __Pyx_memviewslice *__pyx_v_p_dst; - int *__pyx_v_p_suboffset_dim; - Py_ssize_t __pyx_v_start; - Py_ssize_t __pyx_v_stop; - Py_ssize_t __pyx_v_step; - int __pyx_v_have_start; - int __pyx_v_have_stop; - int __pyx_v_have_step; - PyObject *__pyx_v_index = NULL; - struct __pyx_memoryview_obj *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - struct __pyx_memoryview_obj *__pyx_t_4; - char *__pyx_t_5; - int __pyx_t_6; - Py_ssize_t __pyx_t_7; - PyObject *(*__pyx_t_8)(PyObject *); - PyObject *__pyx_t_9 = NULL; - Py_ssize_t __pyx_t_10; - int __pyx_t_11; - Py_ssize_t __pyx_t_12; - __Pyx_RefNannySetupContext("memview_slice", 0); - - /* "View.MemoryView":711 - * @cname('__pyx_memview_slice') - * cdef memoryview memview_slice(memoryview memview, object indices): - * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< - * cdef bint negative_step - * cdef __Pyx_memviewslice src, dst + /* "View.MemoryView":880 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * */ - __pyx_v_new_ndim = 0; - __pyx_v_suboffset_dim = -1; + } - /* "View.MemoryView":718 + /* "View.MemoryView":884 * * - * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":885 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset * - * cdef _memoryviewslice memviewsliceobj */ - (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; - /* "View.MemoryView":722 - * cdef _memoryviewslice memviewsliceobj + /* "View.MemoryView":886 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< * - * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< * - * if isinstance(memview, _memoryviewslice): */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(!Py_OptimizeFlag)) { - if (unlikely(!((__pyx_v_memview->view.ndim > 0) != 0))) { - PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(2, 722, __pyx_L1_error) - } + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; } - #endif + __pyx_L3:; - /* "View.MemoryView":724 - * assert memview.view.ndim > 0 + /* "View.MemoryView":889 * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * memviewsliceobj = memview - * p_src = &memviewsliceobj.from_slice + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: */ - __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); - __pyx_t_2 = (__pyx_t_1 != 0); + __pyx_t_2 = (((__pyx_v_suboffset_dim[0]) < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":725 + /* "View.MemoryView":890 * - * if isinstance(memview, _memoryviewslice): - * memviewsliceobj = memview # <<<<<<<<<<<<<< - * p_src = &memviewsliceobj.from_slice + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride */ - if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 725, __pyx_L1_error) - __pyx_t_3 = ((PyObject *)__pyx_v_memview); - __Pyx_INCREF(__pyx_t_3); - __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); - __pyx_t_3 = 0; + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); - /* "View.MemoryView":726 - * if isinstance(memview, _memoryviewslice): - * memviewsliceobj = memview - * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< - * else: - * slice_copy(memview, &src) - */ - __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); - - /* "View.MemoryView":724 - * assert memview.view.ndim > 0 + /* "View.MemoryView":889 * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * memviewsliceobj = memview - * p_src = &memviewsliceobj.from_slice + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: */ - goto __pyx_L3; + goto __pyx_L23; } - /* "View.MemoryView":728 - * p_src = &memviewsliceobj.from_slice + /* "View.MemoryView":892 + * dst.data += start * stride * else: - * slice_copy(memview, &src) # <<<<<<<<<<<<<< - * p_src = &src + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< * + * if suboffset >= 0: */ /*else*/ { - __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); - - /* "View.MemoryView":729 - * else: - * slice_copy(memview, &src) - * p_src = &src # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_p_src = (&__pyx_v_src); + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); } - __pyx_L3:; + __pyx_L23:; - /* "View.MemoryView":735 - * - * - * dst.memview = p_src.memview # <<<<<<<<<<<<<< - * dst.data = p_src.data + /* "View.MemoryView":894 + * dst.suboffsets[suboffset_dim[0]] += start * stride * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: */ - __pyx_t_4 = __pyx_v_p_src->memview; - __pyx_v_dst.memview = __pyx_t_4; + __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":736 - * - * dst.memview = p_src.memview - * dst.data = p_src.data # <<<<<<<<<<<<<< - * + /* "View.MemoryView":895 * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset */ - __pyx_t_5 = __pyx_v_p_src->data; - __pyx_v_dst.data = __pyx_t_5; + __pyx_t_2 = ((!(__pyx_v_is_slice != 0)) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":741 - * - * - * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< - * cdef int *p_suboffset_dim = &suboffset_dim - * cdef Py_ssize_t start, stop, step + /* "View.MemoryView":896 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: */ - __pyx_v_p_dst = (&__pyx_v_dst); + __pyx_t_2 = ((__pyx_v_new_ndim == 0) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":742 - * - * cdef __Pyx_memviewslice *p_dst = &dst - * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< - * cdef Py_ssize_t start, stop, step - * cdef bint have_start, have_stop, have_step + /* "View.MemoryView":897 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " */ - __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); - /* "View.MemoryView":746 - * cdef bint have_start, have_stop, have_step - * - * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< - * if PyIndex_Check(index): - * slice_memviewslice( + /* "View.MemoryView":896 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: */ - __pyx_t_6 = 0; - if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { - __pyx_t_3 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0; - __pyx_t_8 = NULL; - } else { - __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 746, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 746, __pyx_L1_error) - } - for (;;) { - if (likely(!__pyx_t_8)) { - if (likely(PyList_CheckExact(__pyx_t_3))) { - if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 746, __pyx_L1_error) - #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 746, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - #endif - } else { - if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 746, __pyx_L1_error) - #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 746, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - #endif - } - } else { - __pyx_t_9 = __pyx_t_8(__pyx_t_3); - if (unlikely(!__pyx_t_9)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 746, __pyx_L1_error) - } - break; + goto __pyx_L26; } - __Pyx_GOTREF(__pyx_t_9); - } - __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_9); - __pyx_t_9 = 0; - __pyx_v_dim = __pyx_t_6; - __pyx_t_6 = (__pyx_t_6 + 1); - /* "View.MemoryView":747 - * - * for dim, index in enumerate(indices): - * if PyIndex_Check(index): # <<<<<<<<<<<<<< - * slice_memviewslice( - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + /* "View.MemoryView":899 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: */ - __pyx_t_2 = (PyIndex_Check(__pyx_v_index) != 0); - if (__pyx_t_2) { + /*else*/ { - /* "View.MemoryView":751 - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], - * dim, new_ndim, p_suboffset_dim, - * index, 0, 0, # start, stop, step # <<<<<<<<<<<<<< - * 0, 0, 0, # have_{start,stop,step} - * False) + /* "View.MemoryView":900 + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim */ - __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 751, __pyx_L1_error) + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"All dimensions preceding dimension %d must be indexed and not sliced"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 899, __pyx_L1_error) + } + __pyx_L26:; - /* "View.MemoryView":748 - * for dim, index in enumerate(indices): - * if PyIndex_Check(index): - * slice_memviewslice( # <<<<<<<<<<<<<< - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], - * dim, new_ndim, p_suboffset_dim, + /* "View.MemoryView":895 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset */ - __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_t_10, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 748, __pyx_L1_error) + goto __pyx_L25; + } - /* "View.MemoryView":747 + /* "View.MemoryView":902 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< * - * for dim, index in enumerate(indices): - * if PyIndex_Check(index): # <<<<<<<<<<<<<< - * slice_memviewslice( - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * return 0 */ - goto __pyx_L6; + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; } + __pyx_L25:; - /* "View.MemoryView":754 - * 0, 0, 0, # have_{start,stop,step} - * False) - * elif index is None: # <<<<<<<<<<<<<< - * p_dst.shape[new_ndim] = 1 - * p_dst.strides[new_ndim] = 0 + /* "View.MemoryView":894 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: */ - __pyx_t_2 = (__pyx_v_index == Py_None); - __pyx_t_1 = (__pyx_t_2 != 0); - if (__pyx_t_1) { + } - /* "View.MemoryView":755 - * False) - * elif index is None: - * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< - * p_dst.strides[new_ndim] = 0 - * p_dst.suboffsets[new_ndim] = -1 + /* "View.MemoryView":904 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * */ - (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + __pyx_r = 0; + goto __pyx_L0; - /* "View.MemoryView":756 - * elif index is None: - * p_dst.shape[new_ndim] = 1 - * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< - * p_dst.suboffsets[new_ndim] = -1 - * new_ndim += 1 + /* "View.MemoryView":807 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, */ - (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; - /* "View.MemoryView":757 - * p_dst.shape[new_ndim] = 1 - * p_dst.strides[new_ndim] = 0 - * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< - * new_ndim += 1 - * else: - */ - (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} - /* "View.MemoryView":758 - * p_dst.strides[new_ndim] = 0 - * p_dst.suboffsets[new_ndim] = -1 - * new_ndim += 1 # <<<<<<<<<<<<<< - * else: - * start = index.start or 0 +/* "View.MemoryView":910 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 */ - __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); - /* "View.MemoryView":754 - * 0, 0, 0, # have_{start,stop,step} - * False) - * elif index is None: # <<<<<<<<<<<<<< - * p_dst.shape[new_ndim] = 1 - * p_dst.strides[new_ndim] = 0 - */ - goto __pyx_L6; - } +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("pybuffer_index", 0); - /* "View.MemoryView":760 - * new_ndim += 1 - * else: - * start = index.start or 0 # <<<<<<<<<<<<<< - * stop = index.stop or 0 - * step = index.step or 0 + /* "View.MemoryView":912 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp */ - /*else*/ { - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 760, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 760, __pyx_L1_error) - if (!__pyx_t_1) { - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 760, __pyx_L1_error) - __pyx_t_10 = __pyx_t_12; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L7_bool_binop_done; - } - __pyx_t_10 = 0; - __pyx_L7_bool_binop_done:; - __pyx_v_start = __pyx_t_10; + __pyx_v_suboffset = -1L; - /* "View.MemoryView":761 - * else: - * start = index.start or 0 - * stop = index.stop or 0 # <<<<<<<<<<<<<< - * step = index.step or 0 + /* "View.MemoryView":913 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp * */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 761, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 761, __pyx_L1_error) - if (!__pyx_t_1) { - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 761, __pyx_L1_error) - __pyx_t_10 = __pyx_t_12; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L9_bool_binop_done; - } - __pyx_t_10 = 0; - __pyx_L9_bool_binop_done:; - __pyx_v_stop = __pyx_t_10; + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; - /* "View.MemoryView":762 - * start = index.start or 0 - * stop = index.stop or 0 - * step = index.step or 0 # <<<<<<<<<<<<<< + /* "View.MemoryView":916 + * cdef char *resultp * - * have_start = index.start is not None + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len / itemsize + * stride = itemsize */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 762, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 762, __pyx_L1_error) - if (!__pyx_t_1) { - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 762, __pyx_L1_error) - __pyx_t_10 = __pyx_t_12; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L11_bool_binop_done; - } - __pyx_t_10 = 0; - __pyx_L11_bool_binop_done:; - __pyx_v_step = __pyx_t_10; + __pyx_t_2 = ((__pyx_v_view->ndim == 0) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":764 - * step = index.step or 0 + /* "View.MemoryView":917 * - * have_start = index.start is not None # <<<<<<<<<<<<<< - * have_stop = index.stop is not None - * have_step = index.step is not None + * if view.ndim == 0: + * shape = view.len / itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 764, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = (__pyx_t_9 != Py_None); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_v_have_start = __pyx_t_1; + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 917, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 917, __pyx_L1_error) + } + __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); - /* "View.MemoryView":765 - * - * have_start = index.start is not None - * have_stop = index.stop is not None # <<<<<<<<<<<<<< - * have_step = index.step is not None - * + /* "View.MemoryView":918 + * if view.ndim == 0: + * shape = view.len / itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 765, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = (__pyx_t_9 != Py_None); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_v_have_stop = __pyx_t_1; + __pyx_v_stride = __pyx_v_itemsize; - /* "View.MemoryView":766 - * have_start = index.start is not None - * have_stop = index.stop is not None - * have_step = index.step is not None # <<<<<<<<<<<<<< + /* "View.MemoryView":916 + * cdef char *resultp * - * slice_memviewslice( + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len / itemsize + * stride = itemsize */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 766, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = (__pyx_t_9 != Py_None); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_v_have_step = __pyx_t_1; + goto __pyx_L3; + } - /* "View.MemoryView":768 - * have_step = index.step is not None + /* "View.MemoryView":920 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":921 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":922 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] * - * slice_memviewslice( # <<<<<<<<<<<<<< - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], - * dim, new_ndim, p_suboffset_dim, */ - __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 768, __pyx_L1_error) + __pyx_t_2 = ((__pyx_v_view->suboffsets != NULL) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":774 - * have_start, have_stop, have_step, - * True) - * new_ndim += 1 # <<<<<<<<<<<<<< + /* "View.MemoryView":923 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< * - * if isinstance(memview, _memoryviewslice): + * if index < 0: */ - __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); - } - __pyx_L6:; + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); - /* "View.MemoryView":746 - * cdef bint have_start, have_stop, have_step + /* "View.MemoryView":922 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] * - * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< - * if PyIndex_Check(index): - * slice_memviewslice( */ + } } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_L3:; - /* "View.MemoryView":776 - * new_ndim += 1 + /* "View.MemoryView":925 + * suboffset = view.suboffsets[dim] * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * return memoryview_fromslice(dst, new_ndim, - * memviewsliceobj.to_object_func, + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: */ - __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); - __pyx_t_2 = (__pyx_t_1 != 0); + __pyx_t_2 = ((__pyx_v_index < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":777 + /* "View.MemoryView":926 * - * if isinstance(memview, _memoryviewslice): - * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< - * memviewsliceobj.to_object_func, - * memviewsliceobj.to_dtype_func, - */ - __Pyx_XDECREF(((PyObject *)__pyx_r)); - - /* "View.MemoryView":778 - * if isinstance(memview, _memoryviewslice): - * return memoryview_fromslice(dst, new_ndim, - * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< - * memviewsliceobj.to_dtype_func, - * memview.dtype_is_object) + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) */ - if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 778, __pyx_L1_error) } + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); - /* "View.MemoryView":779 - * return memoryview_fromslice(dst, new_ndim, - * memviewsliceobj.to_object_func, - * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< - * memview.dtype_is_object) - * else: + /* "View.MemoryView":927 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * */ - if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 779, __pyx_L1_error) } + __pyx_t_2 = ((__pyx_v_index < 0) != 0); + if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":777 + /* "View.MemoryView":928 + * index += view.shape[dim] + * if index < 0: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< * - * if isinstance(memview, _memoryviewslice): - * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< - * memviewsliceobj.to_object_func, - * memviewsliceobj.to_dtype_func, + * if index >= shape: */ - __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 777, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 777, __pyx_L1_error) - __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); - __pyx_t_3 = 0; - goto __pyx_L0; + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 928, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 928, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 928, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 928, __pyx_L1_error) - /* "View.MemoryView":776 - * new_ndim += 1 + /* "View.MemoryView":927 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * return memoryview_fromslice(dst, new_ndim, - * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":925 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: */ } - /* "View.MemoryView":782 - * memview.dtype_is_object) - * else: - * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< - * memview.dtype_is_object) + /* "View.MemoryView":930 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) * */ - /*else*/ { - __Pyx_XDECREF(((PyObject *)__pyx_r)); + __pyx_t_2 = ((__pyx_v_index >= __pyx_v_shape) != 0); + if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":783 - * else: - * return memoryview_fromslice(dst, new_ndim, NULL, NULL, - * memview.dtype_is_object) # <<<<<<<<<<<<<< + /* "View.MemoryView":931 * + * if index >= shape: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< * + * resultp = bufp + index * stride */ - __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 782, __pyx_L1_error) + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 931, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 931, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 931, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 931, __pyx_L1_error) - /* "View.MemoryView":782 - * memview.dtype_is_object) - * else: - * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< - * memview.dtype_is_object) + /* "View.MemoryView":930 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) * */ - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 782, __pyx_L1_error) - __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); - __pyx_t_3 = 0; - goto __pyx_L0; } - /* "View.MemoryView":710 + /* "View.MemoryView":933 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) * - * @cname('__pyx_memview_slice') - * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< - * cdef int new_ndim = 0, suboffset_dim = -1, dim - * cdef bint negative_step + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":934 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":935 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":934 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":937 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":910 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); - __Pyx_XDECREF(__pyx_v_index); - __Pyx_XGIVEREF((PyObject *)__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":807 +/* "View.MemoryView":943 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim * - * @cname('__pyx_memoryview_slice_memviewslice') - * cdef int slice_memviewslice( # <<<<<<<<<<<<<< - * __Pyx_memviewslice *dst, - * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, */ -static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { - Py_ssize_t __pyx_v_new_shape; - int __pyx_v_negative_step; +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; int __pyx_r; int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; - /* "View.MemoryView":827 - * cdef bint negative_step - * - * if not is_slice: # <<<<<<<<<<<<<< + /* "View.MemoryView":944 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< * - * if start < 0: + * cdef Py_ssize_t *shape = memslice.shape */ - __pyx_t_1 = ((!(__pyx_v_is_slice != 0)) != 0); - if (__pyx_t_1) { + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; - /* "View.MemoryView":829 - * if not is_slice: + /* "View.MemoryView":946 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides * - * if start < 0: # <<<<<<<<<<<<<< - * start += shape - * if not 0 <= start < shape: */ - __pyx_t_1 = ((__pyx_v_start < 0) != 0); - if (__pyx_t_1) { + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; - /* "View.MemoryView":830 + /* "View.MemoryView":947 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * * - * if start < 0: - * start += shape # <<<<<<<<<<<<<< - * if not 0 <= start < shape: - * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) */ - __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; - /* "View.MemoryView":829 - * if not is_slice: + /* "View.MemoryView":951 * - * if start < 0: # <<<<<<<<<<<<<< - * start += shape - * if not 0 <= start < shape: + * cdef int i, j + * for i in range(ndim / 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] */ - } - - /* "View.MemoryView":831 - * if start < 0: - * start += shape - * if not 0 <= start < shape: # <<<<<<<<<<<<<< - * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) - * else: - */ - __pyx_t_1 = (0 <= __pyx_v_start); - if (__pyx_t_1) { - __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); - } - __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); - if (__pyx_t_2) { + __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; - /* "View.MemoryView":832 - * start += shape - * if not 0 <= start < shape: - * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< - * else: - * + /* "View.MemoryView":952 + * cdef int i, j + * for i in range(ndim / 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"Index out of bounds (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 832, __pyx_L1_error) + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); - /* "View.MemoryView":831 - * if start < 0: - * start += shape - * if not 0 <= start < shape: # <<<<<<<<<<<<<< - * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) - * else: + /* "View.MemoryView":953 + * for i in range(ndim / 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * */ - } + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; - /* "View.MemoryView":827 - * cdef bint negative_step - * - * if not is_slice: # <<<<<<<<<<<<<< + /* "View.MemoryView":954 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< * - * if start < 0: + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: */ - goto __pyx_L3; - } + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; - /* "View.MemoryView":835 - * else: + /* "View.MemoryView":956 + * shape[i], shape[j] = shape[j], shape[i] * - * negative_step = have_step != 0 and step < 0 # <<<<<<<<<<<<<< + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") * - * if have_step and step == 0: */ - /*else*/ { - __pyx_t_1 = ((__pyx_v_have_step != 0) != 0); - if (__pyx_t_1) { + __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0) != 0); + if (!__pyx_t_8) { } else { - __pyx_t_2 = __pyx_t_1; + __pyx_t_7 = __pyx_t_8; goto __pyx_L6_bool_binop_done; } - __pyx_t_1 = ((__pyx_v_step < 0) != 0); - __pyx_t_2 = __pyx_t_1; + __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0) != 0); + __pyx_t_7 = __pyx_t_8; __pyx_L6_bool_binop_done:; - __pyx_v_negative_step = __pyx_t_2; + if (__pyx_t_7) { - /* "View.MemoryView":837 - * negative_step = have_step != 0 and step < 0 + /* "View.MemoryView":957 * - * if have_step and step == 0: # <<<<<<<<<<<<<< - * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< * + * return 1 */ - __pyx_t_1 = (__pyx_v_have_step != 0); - if (__pyx_t_1) { - } else { - __pyx_t_2 = __pyx_t_1; - goto __pyx_L9_bool_binop_done; - } - __pyx_t_1 = ((__pyx_v_step == 0) != 0); - __pyx_t_2 = __pyx_t_1; - __pyx_L9_bool_binop_done:; - if (__pyx_t_2) { + __pyx_t_9 = __pyx_memoryview_err(__pyx_builtin_ValueError, ((char *)"Cannot transpose memoryview with indirect dimensions")); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 957, __pyx_L1_error) - /* "View.MemoryView":838 - * - * if have_step and step == 0: - * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + /* "View.MemoryView":956 + * shape[i], shape[j] = shape[j], shape[i] * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") * */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Step may not be zero (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 838, __pyx_L1_error) + } + } - /* "View.MemoryView":837 - * negative_step = have_step != 0 and step < 0 + /* "View.MemoryView":959 + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 1 # <<<<<<<<<<<<<< * - * if have_step and step == 0: # <<<<<<<<<<<<<< - * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) * */ - } + __pyx_r = 1; + goto __pyx_L0; - /* "View.MemoryView":841 + /* "View.MemoryView":943 * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim * - * if have_start: # <<<<<<<<<<<<<< - * if start < 0: - * start += shape */ - __pyx_t_2 = (__pyx_v_have_start != 0); - if (__pyx_t_2) { - /* "View.MemoryView":842 + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = 0; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":976 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) * - * if have_start: - * if start < 0: # <<<<<<<<<<<<<< - * start += shape - * if start < 0: */ - __pyx_t_2 = ((__pyx_v_start < 0) != 0); - if (__pyx_t_2) { - /* "View.MemoryView":843 - * if have_start: - * if start < 0: - * start += shape # <<<<<<<<<<<<<< - * if start < 0: - * start = 0 - */ - __pyx_v_start = (__pyx_v_start + __pyx_v_shape); +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - /* "View.MemoryView":844 - * if start < 0: - * start += shape - * if start < 0: # <<<<<<<<<<<<<< - * start = 0 - * elif start >= shape: - */ - __pyx_t_2 = ((__pyx_v_start < 0) != 0); - if (__pyx_t_2) { + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} - /* "View.MemoryView":845 - * start += shape - * if start < 0: - * start = 0 # <<<<<<<<<<<<<< - * elif start >= shape: - * if negative_step: - */ - __pyx_v_start = 0; +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "View.MemoryView":844 - * if start < 0: - * start += shape - * if start < 0: # <<<<<<<<<<<<<< - * start = 0 - * elif start >= shape: + /* "View.MemoryView":977 + * + * def __dealloc__(self): + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): */ - } + __PYX_XDEC_MEMVIEW((&__pyx_v_self->from_slice), 1); - /* "View.MemoryView":842 + /* "View.MemoryView":976 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) * - * if have_start: - * if start < 0: # <<<<<<<<<<<<<< - * start += shape - * if start < 0: */ - goto __pyx_L12; - } - /* "View.MemoryView":846 - * if start < 0: - * start = 0 - * elif start >= shape: # <<<<<<<<<<<<<< - * if negative_step: - * start = shape - 1 - */ - __pyx_t_2 = ((__pyx_v_start >= __pyx_v_shape) != 0); - if (__pyx_t_2) { + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} - /* "View.MemoryView":847 - * start = 0 - * elif start >= shape: - * if negative_step: # <<<<<<<<<<<<<< - * start = shape - 1 - * else: +/* "View.MemoryView":979 + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) */ - __pyx_t_2 = (__pyx_v_negative_step != 0); - if (__pyx_t_2) { - /* "View.MemoryView":848 - * elif start >= shape: - * if negative_step: - * start = shape - 1 # <<<<<<<<<<<<<< - * else: - * start = shape - */ - __pyx_v_start = (__pyx_v_shape - 1); - - /* "View.MemoryView":847 - * start = 0 - * elif start >= shape: - * if negative_step: # <<<<<<<<<<<<<< - * start = shape - 1 - * else: - */ - goto __pyx_L14; - } - - /* "View.MemoryView":850 - * start = shape - 1 - * else: - * start = shape # <<<<<<<<<<<<<< - * else: - * if negative_step: - */ - /*else*/ { - __pyx_v_start = __pyx_v_shape; - } - __pyx_L14:; - - /* "View.MemoryView":846 - * if start < 0: - * start = 0 - * elif start >= shape: # <<<<<<<<<<<<<< - * if negative_step: - * start = shape - 1 - */ - } - __pyx_L12:; +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("convert_item_to_object", 0); - /* "View.MemoryView":841 - * + /* "View.MemoryView":980 * - * if have_start: # <<<<<<<<<<<<<< - * if start < 0: - * start += shape - */ - goto __pyx_L11; - } - - /* "View.MemoryView":852 - * start = shape - * else: - * if negative_step: # <<<<<<<<<<<<<< - * start = shape - 1 - * else: - */ - /*else*/ { - __pyx_t_2 = (__pyx_v_negative_step != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":853 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) * else: - * if negative_step: - * start = shape - 1 # <<<<<<<<<<<<<< - * else: - * start = 0 */ - __pyx_v_start = (__pyx_v_shape - 1); + __pyx_t_1 = ((__pyx_v_self->to_object_func != NULL) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":852 - * start = shape + /* "View.MemoryView":981 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< * else: - * if negative_step: # <<<<<<<<<<<<<< - * start = shape - 1 - * else: + * return memoryview.convert_item_to_object(self, itemp) */ - goto __pyx_L15; - } + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 981, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; - /* "View.MemoryView":855 - * start = shape - 1 - * else: - * start = 0 # <<<<<<<<<<<<<< + /* "View.MemoryView":980 * - * if have_stop: + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: */ - /*else*/ { - __pyx_v_start = 0; - } - __pyx_L15:; - } - __pyx_L11:; + } - /* "View.MemoryView":857 - * start = 0 + /* "View.MemoryView":983 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< * - * if have_stop: # <<<<<<<<<<<<<< - * if stop < 0: - * stop += shape + * cdef assign_item_from_object(self, char *itemp, object value): */ - __pyx_t_2 = (__pyx_v_have_stop != 0); - if (__pyx_t_2) { + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 983, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } - /* "View.MemoryView":858 + /* "View.MemoryView":979 + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) * - * if have_stop: - * if stop < 0: # <<<<<<<<<<<<<< - * stop += shape - * if stop < 0: - */ - __pyx_t_2 = ((__pyx_v_stop < 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":859 - * if have_stop: - * if stop < 0: - * stop += shape # <<<<<<<<<<<<<< - * if stop < 0: - * stop = 0 + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) */ - __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); - /* "View.MemoryView":860 - * if stop < 0: - * stop += shape - * if stop < 0: # <<<<<<<<<<<<<< - * stop = 0 - * elif stop > shape: - */ - __pyx_t_2 = ((__pyx_v_stop < 0) != 0); - if (__pyx_t_2) { + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":861 - * stop += shape - * if stop < 0: - * stop = 0 # <<<<<<<<<<<<<< - * elif stop > shape: - * stop = shape +/* "View.MemoryView":985 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) */ - __pyx_v_stop = 0; - /* "View.MemoryView":860 - * if stop < 0: - * stop += shape - * if stop < 0: # <<<<<<<<<<<<<< - * stop = 0 - * elif stop > shape: - */ - } +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("assign_item_from_object", 0); - /* "View.MemoryView":858 + /* "View.MemoryView":986 * - * if have_stop: - * if stop < 0: # <<<<<<<<<<<<<< - * stop += shape - * if stop < 0: - */ - goto __pyx_L17; - } - - /* "View.MemoryView":862 - * if stop < 0: - * stop = 0 - * elif stop > shape: # <<<<<<<<<<<<<< - * stop = shape + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) * else: */ - __pyx_t_2 = ((__pyx_v_stop > __pyx_v_shape) != 0); - if (__pyx_t_2) { + __pyx_t_1 = ((__pyx_v_self->to_dtype_func != NULL) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":863 - * stop = 0 - * elif stop > shape: - * stop = shape # <<<<<<<<<<<<<< + /* "View.MemoryView":987 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< * else: - * if negative_step: + * memoryview.assign_item_from_object(self, itemp, value) */ - __pyx_v_stop = __pyx_v_shape; + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 987, __pyx_L1_error) - /* "View.MemoryView":862 - * if stop < 0: - * stop = 0 - * elif stop > shape: # <<<<<<<<<<<<<< - * stop = shape + /* "View.MemoryView":986 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) * else: */ - } - __pyx_L17:; + goto __pyx_L3; + } - /* "View.MemoryView":857 - * start = 0 + /* "View.MemoryView":989 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< * - * if have_stop: # <<<<<<<<<<<<<< - * if stop < 0: - * stop += shape + * @property */ - goto __pyx_L16; - } + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 989, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; - /* "View.MemoryView":865 - * stop = shape - * else: - * if negative_step: # <<<<<<<<<<<<<< - * stop = -1 - * else: - */ - /*else*/ { - __pyx_t_2 = (__pyx_v_negative_step != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":866 - * else: - * if negative_step: - * stop = -1 # <<<<<<<<<<<<<< - * else: - * stop = shape - */ - __pyx_v_stop = -1L; - - /* "View.MemoryView":865 - * stop = shape - * else: - * if negative_step: # <<<<<<<<<<<<<< - * stop = -1 - * else: - */ - goto __pyx_L19; - } - - /* "View.MemoryView":868 - * stop = -1 - * else: - * stop = shape # <<<<<<<<<<<<<< + /* "View.MemoryView":985 + * return memoryview.convert_item_to_object(self, itemp) * - * if not have_step: + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) */ - /*else*/ { - __pyx_v_stop = __pyx_v_shape; - } - __pyx_L19:; - } - __pyx_L16:; - /* "View.MemoryView":870 - * stop = shape - * - * if not have_step: # <<<<<<<<<<<<<< - * step = 1 - * - */ - __pyx_t_2 = ((!(__pyx_v_have_step != 0)) != 0); - if (__pyx_t_2) { + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":871 - * - * if not have_step: - * step = 1 # <<<<<<<<<<<<<< +/* "View.MemoryView":992 * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.from_object * */ - __pyx_v_step = 1; - /* "View.MemoryView":870 - * stop = shape - * - * if not have_step: # <<<<<<<<<<<<<< - * step = 1 - * - */ - } +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - /* "View.MemoryView":875 - * - * with cython.cdivision(True): - * new_shape = (stop - start) // step # <<<<<<<<<<<<<< - * - * if (stop - start) - step * new_shape: - */ - __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":877 - * new_shape = (stop - start) // step - * - * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< - * new_shape += 1 - * - */ - __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); - if (__pyx_t_2) { +static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":878 - * - * if (stop - start) - step * new_shape: - * new_shape += 1 # <<<<<<<<<<<<<< + /* "View.MemoryView":993 + * @property + * def base(self): + * return self.from_object # <<<<<<<<<<<<<< * - * if new_shape < 0: + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") */ - __pyx_v_new_shape = (__pyx_v_new_shape + 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; - /* "View.MemoryView":877 - * new_shape = (stop - start) // step + /* "View.MemoryView":992 * - * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< - * new_shape += 1 + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.from_object * */ - } - /* "View.MemoryView":880 - * new_shape += 1 - * - * if new_shape < 0: # <<<<<<<<<<<<<< - * new_shape = 0 - * - */ - __pyx_t_2 = ((__pyx_v_new_shape < 0) != 0); - if (__pyx_t_2) { + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":881 - * - * if new_shape < 0: - * new_shape = 0 # <<<<<<<<<<<<<< - * - * +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): */ - __pyx_v_new_shape = 0; - /* "View.MemoryView":880 - * new_shape += 1 - * - * if new_shape < 0: # <<<<<<<<<<<<<< - * new_shape = 0 - * - */ - } +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - /* "View.MemoryView":884 - * - * - * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< - * dst.shape[new_ndim] = new_shape - * dst.suboffsets[new_ndim] = suboffset - */ - (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":885 - * - * dst.strides[new_ndim] = stride * step - * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< - * dst.suboffsets[new_ndim] = suboffset - * - */ - (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); - /* "View.MemoryView":886 - * dst.strides[new_ndim] = stride * step - * dst.shape[new_ndim] = new_shape - * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< - * - * + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; - } - __pyx_L3:; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) - /* "View.MemoryView":889 - * - * - * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< - * dst.data += start * stride - * else: + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): */ - __pyx_t_2 = (((__pyx_v_suboffset_dim[0]) < 0) != 0); - if (__pyx_t_2) { - /* "View.MemoryView":890 - * - * if suboffset_dim[0] < 0: - * dst.data += start * stride # <<<<<<<<<<<<<< - * else: - * dst.suboffsets[suboffset_dim[0]] += start * stride + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); - /* "View.MemoryView":889 - * - * - * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< - * dst.data += start * stride - * else: - */ - goto __pyx_L23; - } +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - /* "View.MemoryView":892 - * dst.data += start * stride - * else: - * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< - * - * if suboffset >= 0: + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - /*else*/ { - __pyx_t_3 = (__pyx_v_suboffset_dim[0]); - (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); - } - __pyx_L23:; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) - /* "View.MemoryView":894 - * dst.suboffsets[suboffset_dim[0]] += start * stride - * - * if suboffset >= 0: # <<<<<<<<<<<<<< - * if not is_slice: - * if new_ndim == 0: + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); - if (__pyx_t_2) { - /* "View.MemoryView":895 + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":999 * - * if suboffset >= 0: - * if not is_slice: # <<<<<<<<<<<<<< - * if new_ndim == 0: - * dst.data = ( dst.data)[0] + suboffset + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), */ - __pyx_t_2 = ((!(__pyx_v_is_slice != 0)) != 0); - if (__pyx_t_2) { - /* "View.MemoryView":896 - * if suboffset >= 0: - * if not is_slice: - * if new_ndim == 0: # <<<<<<<<<<<<<< - * dst.data = ( dst.data)[0] + suboffset - * else: - */ - __pyx_t_2 = ((__pyx_v_new_ndim == 0) != 0); - if (__pyx_t_2) { +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + __Pyx_RefNannySetupContext("memoryview_fromslice", 0); - /* "View.MemoryView":897 - * if not is_slice: - * if new_ndim == 0: - * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< - * else: - * _err_dim(IndexError, "All dimensions preceding dimension %d " + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * */ - __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + __pyx_t_1 = ((((PyObject *)__pyx_v_memviewslice.memview) == Py_None) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":896 - * if suboffset >= 0: - * if not is_slice: - * if new_ndim == 0: # <<<<<<<<<<<<<< - * dst.data = ( dst.data)[0] + suboffset - * else: + /* "View.MemoryView":1008 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * */ - goto __pyx_L26; - } + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; - /* "View.MemoryView":899 - * dst.data = ( dst.data)[0] + suboffset - * else: - * _err_dim(IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< - * "must be indexed and not sliced", dim) - * else: + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * */ - /*else*/ { + } - /* "View.MemoryView":900 - * else: - * _err_dim(IndexError, "All dimensions preceding dimension %d " - * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< - * else: - * suboffset_dim[0] = new_ndim + /* "View.MemoryView":1013 + * + * + * result = _memoryviewslice(None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"All dimensions preceding dimension %d must be indexed and not sliced"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 899, __pyx_L1_error) - } - __pyx_L26:; + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; - /* "View.MemoryView":895 + /* "View.MemoryView":1015 + * result = _memoryviewslice(None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) * - * if suboffset >= 0: - * if not is_slice: # <<<<<<<<<<<<<< - * if new_ndim == 0: - * dst.data = ( dst.data)[0] + suboffset */ - goto __pyx_L25; - } + __pyx_v_result->from_slice = __pyx_v_memviewslice; - /* "View.MemoryView":902 - * "must be indexed and not sliced", dim) - * else: - * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + /* "View.MemoryView":1016 * - * return 0 + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview).base */ - /*else*/ { - (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; - } - __pyx_L25:; + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); - /* "View.MemoryView":894 - * dst.suboffsets[suboffset_dim[0]] += start * stride + /* "View.MemoryView":1018 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview).base # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo * - * if suboffset >= 0: # <<<<<<<<<<<<<< - * if not is_slice: - * if new_ndim == 0: */ - } + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_memviewslice.memview), __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1018, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; - /* "View.MemoryView":904 - * suboffset_dim[0] = new_ndim + /* "View.MemoryView":1019 * - * return 0 # <<<<<<<<<<<<<< + * result.from_object = ( memviewslice.memview).base + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1021 + * result.typeinfo = memviewslice.memview.typeinfo * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim */ - __pyx_r = 0; - goto __pyx_L0; + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; - /* "View.MemoryView":807 + /* "View.MemoryView":1022 * - * @cname('__pyx_memoryview_slice_memviewslice') - * cdef int slice_memviewslice( # <<<<<<<<<<<<<< - * __Pyx_memviewslice *dst, - * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); - /* function exit code */ - __pyx_L1_error:; - { - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - } - __pyx_r = -1; - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":910 - * - * @cname('__pyx_pybuffer_index') - * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< - * Py_ssize_t dim) except NULL: - * cdef Py_ssize_t shape, stride, suboffset = -1 - */ - -static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { - Py_ssize_t __pyx_v_shape; - Py_ssize_t __pyx_v_stride; - Py_ssize_t __pyx_v_suboffset; - Py_ssize_t __pyx_v_itemsize; - char *__pyx_v_resultp; - char *__pyx_r; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - __Pyx_RefNannySetupContext("pybuffer_index", 0); - - /* "View.MemoryView":912 - * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, - * Py_ssize_t dim) except NULL: - * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< - * cdef Py_ssize_t itemsize = view.itemsize - * cdef char *resultp + /* "View.MemoryView":1023 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) */ - __pyx_v_suboffset = -1L; + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; - /* "View.MemoryView":913 - * Py_ssize_t dim) except NULL: - * cdef Py_ssize_t shape, stride, suboffset = -1 - * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< - * cdef char *resultp + /* "View.MemoryView":1024 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) * */ - __pyx_t_1 = __pyx_v_view->itemsize; - __pyx_v_itemsize = __pyx_t_1; + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; - /* "View.MemoryView":916 - * cdef char *resultp + /* "View.MemoryView":1025 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< * - * if view.ndim == 0: # <<<<<<<<<<<<<< - * shape = view.len / itemsize - * stride = itemsize + * if (memviewslice.memview).flags & PyBUF_WRITABLE: */ - __pyx_t_2 = ((__pyx_v_view->ndim == 0) != 0); - if (__pyx_t_2) { + Py_INCREF(Py_None); - /* "View.MemoryView":917 + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) * - * if view.ndim == 0: - * shape = view.len / itemsize # <<<<<<<<<<<<<< - * stride = itemsize + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS * else: */ - if (unlikely(__pyx_v_itemsize == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); - __PYX_ERR(2, 917, __pyx_L1_error) - } - else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { - PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); - __PYX_ERR(2, 917, __pyx_L1_error) - } - __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":918 - * if view.ndim == 0: - * shape = view.len / itemsize - * stride = itemsize # <<<<<<<<<<<<<< + /* "View.MemoryView":1028 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< * else: - * shape = view.shape[dim] + * result.flags = PyBUF_RECORDS_RO */ - __pyx_v_stride = __pyx_v_itemsize; + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; - /* "View.MemoryView":916 - * cdef char *resultp + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) * - * if view.ndim == 0: # <<<<<<<<<<<<<< - * shape = view.len / itemsize - * stride = itemsize + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: */ - goto __pyx_L3; + goto __pyx_L4; } - /* "View.MemoryView":920 - * stride = itemsize + /* "View.MemoryView":1030 + * result.flags = PyBUF_RECORDS * else: - * shape = view.shape[dim] # <<<<<<<<<<<<<< - * stride = view.strides[dim] - * if view.suboffsets != NULL: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape */ /*else*/ { - __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); - - /* "View.MemoryView":921 - * else: - * shape = view.shape[dim] - * stride = view.strides[dim] # <<<<<<<<<<<<<< - * if view.suboffsets != NULL: - * suboffset = view.suboffsets[dim] - */ - __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; - /* "View.MemoryView":922 - * shape = view.shape[dim] - * stride = view.strides[dim] - * if view.suboffsets != NULL: # <<<<<<<<<<<<<< - * suboffset = view.suboffsets[dim] + /* "View.MemoryView":1032 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides * */ - __pyx_t_2 = ((__pyx_v_view->suboffsets != NULL) != 0); - if (__pyx_t_2) { + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); - /* "View.MemoryView":923 - * stride = view.strides[dim] - * if view.suboffsets != NULL: - * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + /* "View.MemoryView":1033 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * * - * if index < 0: */ - __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); - /* "View.MemoryView":922 - * shape = view.shape[dim] - * stride = view.strides[dim] - * if view.suboffsets != NULL: # <<<<<<<<<<<<<< - * suboffset = view.suboffsets[dim] + /* "View.MemoryView":1036 + * * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: */ - } - } - __pyx_L3:; + __pyx_v_result->__pyx_base.view.suboffsets = NULL; - /* "View.MemoryView":925 - * suboffset = view.suboffsets[dim] + /* "View.MemoryView":1037 * - * if index < 0: # <<<<<<<<<<<<<< - * index += view.shape[dim] - * if index < 0: + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets */ - __pyx_t_2 = ((__pyx_v_index < 0) != 0); - if (__pyx_t_2) { + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); - /* "View.MemoryView":926 - * - * if index < 0: - * index += view.shape[dim] # <<<<<<<<<<<<<< - * if index < 0: - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break */ - __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + __pyx_t_1 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":927 - * if index < 0: - * index += view.shape[dim] - * if index < 0: # <<<<<<<<<<<<<< - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + /* "View.MemoryView":1039 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break * */ - __pyx_t_2 = ((__pyx_v_index < 0) != 0); - if (unlikely(__pyx_t_2)) { + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); - /* "View.MemoryView":928 - * index += view.shape[dim] - * if index < 0: - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< + /* "View.MemoryView":1040 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< * - * if index >= shape: + * result.view.len = result.view.itemsize */ - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 928, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 928, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 928, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 928, __pyx_L1_error) + goto __pyx_L6_break; - /* "View.MemoryView":927 - * if index < 0: - * index += view.shape[dim] - * if index < 0: # <<<<<<<<<<<<<< - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - * + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break */ } - - /* "View.MemoryView":925 - * suboffset = view.suboffsets[dim] + } + __pyx_L6_break:; + + /* "View.MemoryView":1042 + * break * - * if index < 0: # <<<<<<<<<<<<<< - * index += view.shape[dim] - * if index < 0: + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length */ - } + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; - /* "View.MemoryView":930 - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + /* "View.MemoryView":1043 * - * if index >= shape: # <<<<<<<<<<<<<< - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length * */ - __pyx_t_2 = ((__pyx_v_index >= __pyx_v_shape) != 0); - if (unlikely(__pyx_t_2)) { + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1043, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; - /* "View.MemoryView":931 - * - * if index >= shape: - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< + /* "View.MemoryView":1044 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< * - * resultp = bufp + index * stride + * result.to_object_func = to_object_func */ - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 931, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 931, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 931, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1044, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 1044, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 931, __pyx_L1_error) + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } - /* "View.MemoryView":930 - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + /* "View.MemoryView":1046 + * result.view.len *= length * - * if index >= shape: # <<<<<<<<<<<<<< - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func * */ - } + __pyx_v_result->to_object_func = __pyx_v_to_object_func; - /* "View.MemoryView":933 - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + /* "View.MemoryView":1047 * - * resultp = bufp + index * stride # <<<<<<<<<<<<<< - * if suboffset >= 0: - * resultp = ( resultp)[0] + suboffset + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result */ - __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; - /* "View.MemoryView":934 + /* "View.MemoryView":1049 + * result.to_dtype_func = to_dtype_func * - * resultp = bufp + index * stride - * if suboffset >= 0: # <<<<<<<<<<<<<< - * resultp = ( resultp)[0] + suboffset + * return result # <<<<<<<<<<<<<< * + * @cname('__pyx_memoryview_get_slice_from_memoryview') */ - __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); - if (__pyx_t_2) { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; - /* "View.MemoryView":935 - * resultp = bufp + index * stride - * if suboffset >= 0: - * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + /* "View.MemoryView":999 * - * return resultp + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), */ - __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); - /* "View.MemoryView":934 - * - * resultp = bufp + index * stride - * if suboffset >= 0: # <<<<<<<<<<<<<< - * resultp = ( resultp)[0] + suboffset + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1052 * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_slice_from_memview", 0); + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1056 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 1056, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":1057 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice */ } - /* "View.MemoryView":937 - * resultp = ( resultp)[0] + suboffset - * - * return resultp # <<<<<<<<<<<<<< + /* "View.MemoryView":1059 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1060 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< * + * @cname('__pyx_memoryview_slice_copy') */ - __pyx_r = __pyx_v_resultp; - goto __pyx_L0; + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } - /* "View.MemoryView":910 + /* "View.MemoryView":1052 * - * @cname('__pyx_pybuffer_index') - * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< - * Py_ssize_t dim) except NULL: - * cdef Py_ssize_t shape, stride, suboffset = -1 + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":943 - * - * @cname('__pyx_memslice_transpose') - * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< - * cdef int ndim = memslice.memview.view.ndim +/* "View.MemoryView":1063 * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets */ -static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { - int __pyx_v_ndim; +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; Py_ssize_t *__pyx_v_shape; Py_ssize_t *__pyx_v_strides; - int __pyx_v_i; - int __pyx_v_j; - int __pyx_r; - int __pyx_t_1; - Py_ssize_t *__pyx_t_2; - long __pyx_t_3; - long __pyx_t_4; + Py_ssize_t *__pyx_v_suboffsets; + __Pyx_RefNannyDeclarations + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; Py_ssize_t __pyx_t_5; - Py_ssize_t __pyx_t_6; - int __pyx_t_7; - int __pyx_t_8; - int __pyx_t_9; + __Pyx_RefNannySetupContext("slice_copy", 0); - /* "View.MemoryView":944 - * @cname('__pyx_memslice_transpose') - * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: - * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + /* "View.MemoryView":1067 + * cdef (Py_ssize_t*) shape, strides, suboffsets * - * cdef Py_ssize_t *shape = memslice.shape + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets */ - __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; - __pyx_v_ndim = __pyx_t_1; + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; - /* "View.MemoryView":946 - * cdef int ndim = memslice.memview.view.ndim + /* "View.MemoryView":1068 * - * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< - * cdef Py_ssize_t *strides = memslice.strides + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets * */ - __pyx_t_2 = __pyx_v_memslice->shape; - __pyx_v_shape = __pyx_t_2; + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; - /* "View.MemoryView":947 - * - * cdef Py_ssize_t *shape = memslice.shape - * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< - * + /* "View.MemoryView":1069 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< * + * dst.memview = <__pyx_memoryview *> memview */ - __pyx_t_2 = __pyx_v_memslice->strides; - __pyx_v_strides = __pyx_t_2; + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; - /* "View.MemoryView":951 + /* "View.MemoryView":1071 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf * - * cdef int i, j - * for i in range(ndim / 2): # <<<<<<<<<<<<<< - * j = ndim - 1 - i - * strides[i], strides[j] = strides[j], strides[i] - */ - __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); - __pyx_t_4 = __pyx_t_3; - for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { - __pyx_v_i = __pyx_t_1; - - /* "View.MemoryView":952 - * cdef int i, j - * for i in range(ndim / 2): - * j = ndim - 1 - i # <<<<<<<<<<<<<< - * strides[i], strides[j] = strides[j], strides[i] - * shape[i], shape[j] = shape[j], shape[i] */ - __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); - /* "View.MemoryView":953 - * for i in range(ndim / 2): - * j = ndim - 1 - i - * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< - * shape[i], shape[j] = shape[j], shape[i] + /* "View.MemoryView":1072 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< * + * for dim in range(memview.view.ndim): */ - __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); - __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); - (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; - (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); - /* "View.MemoryView":954 - * j = ndim - 1 - i - * strides[i], strides[j] = strides[j], strides[i] - * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + /* "View.MemoryView":1074 + * dst.data = memview.view.buf * - * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] */ - __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); - __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); - (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; - (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; - /* "View.MemoryView":956 - * shape[i], shape[j] = shape[j], shape[i] - * - * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< - * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + /* "View.MemoryView":1075 * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 */ - __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0) != 0); - if (!__pyx_t_8) { - } else { - __pyx_t_7 = __pyx_t_8; - goto __pyx_L6_bool_binop_done; - } - __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0) != 0); - __pyx_t_7 = __pyx_t_8; - __pyx_L6_bool_binop_done:; - if (__pyx_t_7) { + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); - /* "View.MemoryView":957 - * - * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: - * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + /* "View.MemoryView":1076 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 * - * return 1 */ - __pyx_t_9 = __pyx_memoryview_err(__pyx_builtin_ValueError, ((char *)"Cannot transpose memoryview with indirect dimensions")); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 957, __pyx_L1_error) + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); - /* "View.MemoryView":956 - * shape[i], shape[j] = shape[j], shape[i] - * - * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< - * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + /* "View.MemoryView":1077 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< * + * @cname('__pyx_memoryview_copy_object') */ + if ((__pyx_v_suboffsets != 0)) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; } - /* "View.MemoryView":959 - * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") - * - * return 1 # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = 1; - goto __pyx_L0; - - /* "View.MemoryView":943 - * - * @cname('__pyx_memslice_transpose') - * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< - * cdef int ndim = memslice.memview.view.ndim + /* "View.MemoryView":1063 * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets */ /* function exit code */ - __pyx_L1_error:; - { - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - } - __pyx_r = 0; - __pyx_L0:; - return __pyx_r; + __Pyx_RefNannyFinishContext(); } -/* "View.MemoryView":976 - * cdef int (*to_dtype_func)(char *, object) except 0 - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) +/* "View.MemoryView":1080 * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice */ -/* Python wrapper */ -static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__", 0); + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("memoryview_copy", 0); - /* "View.MemoryView":977 - * - * def __dealloc__(self): - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + /* "View.MemoryView":1083 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) * - * cdef convert_item_to_object(self, char *itemp): */ - __PYX_XDEC_MEMVIEW((&__pyx_v_self->from_slice), 1); + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); - /* "View.MemoryView":976 - * cdef int (*to_dtype_func)(char *, object) except 0 + /* "View.MemoryView":1084 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1084, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1080 * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice */ /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); + return __pyx_r; } -/* "View.MemoryView":979 - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) +/* "View.MemoryView":1087 * - * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< - * if self.to_object_func != NULL: - * return self.to_object_func(itemp) + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. */ -static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannySetupContext("convert_item_to_object", 0); + int __pyx_t_2; + PyObject *(*__pyx_t_3)(char *); + int (*__pyx_t_4)(char *, PyObject *); + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 0); - /* "View.MemoryView":980 + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 * - * cdef convert_item_to_object(self, char *itemp): - * if self.to_object_func != NULL: # <<<<<<<<<<<<<< - * return self.to_object_func(itemp) - * else: + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func */ - __pyx_t_1 = ((__pyx_v_self->to_object_func != NULL) != 0); - if (__pyx_t_1) { + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { - /* "View.MemoryView":981 - * cdef convert_item_to_object(self, char *itemp): - * if self.to_object_func != NULL: - * return self.to_object_func(itemp) # <<<<<<<<<<<<<< - * else: - * return memoryview.convert_item_to_object(self, itemp) + /* "View.MemoryView":1095 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 981, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_3; - /* "View.MemoryView":980 + /* "View.MemoryView":1096 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_4 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_4; + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 * - * cdef convert_item_to_object(self, char *itemp): - * if self.to_object_func != NULL: # <<<<<<<<<<<<<< - * return self.to_object_func(itemp) - * else: + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func */ + goto __pyx_L3; } - /* "View.MemoryView":983 - * return self.to_object_func(itemp) - * else: - * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + /* "View.MemoryView":1098 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL * - * cdef assign_item_from_object(self, char *itemp, object value): */ /*else*/ { - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 983, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1099 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; } + __pyx_L3:; - /* "View.MemoryView":979 - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + /* "View.MemoryView":1101 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1103 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * * - * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< - * if self.to_object_func != NULL: - * return self.to_object_func(itemp) + */ + __pyx_t_5 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 1101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); @@ -14576,1986 +13444,1806 @@ static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memor return __pyx_r; } -/* "View.MemoryView":985 - * return memoryview.convert_item_to_object(self, itemp) +/* "View.MemoryView":1109 * - * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< - * if self.to_dtype_func != NULL: - * self.to_dtype_func(itemp, value) + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< + * if arg < 0: + * return -arg */ -static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - __Pyx_RefNannySetupContext("assign_item_from_object", 0); - /* "View.MemoryView":986 + /* "View.MemoryView":1110 * - * cdef assign_item_from_object(self, char *itemp, object value): - * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< - * self.to_dtype_func(itemp, value) - * else: + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: # <<<<<<<<<<<<<< + * return -arg + * else: */ - __pyx_t_1 = ((__pyx_v_self->to_dtype_func != NULL) != 0); + __pyx_t_1 = ((__pyx_v_arg < 0) != 0); if (__pyx_t_1) { - /* "View.MemoryView":987 - * cdef assign_item_from_object(self, char *itemp, object value): - * if self.to_dtype_func != NULL: - * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< - * else: - * memoryview.assign_item_from_object(self, itemp, value) + /* "View.MemoryView":1111 + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: + * return -arg # <<<<<<<<<<<<<< + * else: + * return arg */ - __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 987, __pyx_L1_error) + __pyx_r = (-__pyx_v_arg); + goto __pyx_L0; - /* "View.MemoryView":986 + /* "View.MemoryView":1110 * - * cdef assign_item_from_object(self, char *itemp, object value): - * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< - * self.to_dtype_func(itemp, value) - * else: + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: # <<<<<<<<<<<<<< + * return -arg + * else: */ - goto __pyx_L3; } - /* "View.MemoryView":989 - * self.to_dtype_func(itemp, value) - * else: - * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + /* "View.MemoryView":1113 + * return -arg + * else: + * return arg # <<<<<<<<<<<<<< * - * @property + * @cname('__pyx_get_best_slice_order') */ /*else*/ { - __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 989, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_v_arg; + goto __pyx_L0; } - __pyx_L3:; - /* "View.MemoryView":985 - * return memoryview.convert_item_to_object(self, itemp) + /* "View.MemoryView":1109 * - * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< - * if self.to_dtype_func != NULL: - * self.to_dtype_func(itemp, value) + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< + * if arg < 0: + * return -arg */ /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":992 - * - * @property - * def base(self): # <<<<<<<<<<<<<< - * return self.from_object +/* "View.MemoryView":1116 * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. */ -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; - /* "View.MemoryView":993 - * @property - * def base(self): - * return self.from_object # <<<<<<<<<<<<<< + /* "View.MemoryView":1121 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 * - * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->from_object); - __pyx_r = __pyx_v_self->from_object; - goto __pyx_L0; + __pyx_v_c_stride = 0; - /* "View.MemoryView":992 - * - * @property - * def base(self): # <<<<<<<<<<<<<< - * return self.from_object + /* "View.MemoryView":1122 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< * + * for i in range(ndim - 1, -1, -1): */ + __pyx_v_f_stride = 0; - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): + /* "View.MemoryView":1124 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + /* "View.MemoryView":1125 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); + if (__pyx_t_2) { - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): + /* "View.MemoryView":1126 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + /* "View.MemoryView":1127 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): */ + goto __pyx_L4_break; -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + /* "View.MemoryView":1125 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 4, __pyx_L1_error) + } + } + __pyx_L4_break:; - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + /* "View.MemoryView":1129 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":999 + /* "View.MemoryView":1130 * - * @cname('__pyx_memoryview_fromslice') - * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< - * int ndim, - * object (*to_object_func)(char *), + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break */ + __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); + if (__pyx_t_2) { -static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { - struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; - Py_ssize_t __pyx_v_suboffset; - PyObject *__pyx_v_length = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - __Pyx_TypeInfo *__pyx_t_4; - Py_buffer __pyx_t_5; - Py_ssize_t *__pyx_t_6; - Py_ssize_t *__pyx_t_7; - Py_ssize_t *__pyx_t_8; - Py_ssize_t __pyx_t_9; - __Pyx_RefNannySetupContext("memoryview_fromslice", 0); - - /* "View.MemoryView":1007 - * cdef _memoryviewslice result + /* "View.MemoryView":1131 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break * - * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< - * return None + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1132 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): */ - __pyx_t_1 = ((((PyObject *)__pyx_v_memviewslice.memview) == Py_None) != 0); - if (__pyx_t_1) { + goto __pyx_L7_break; - /* "View.MemoryView":1008 + /* "View.MemoryView":1130 * - * if memviewslice.memview == Py_None: - * return None # <<<<<<<<<<<<<< + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1134 + * break * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = ((abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1135 * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __pyx_r = 'C'; goto __pyx_L0; - /* "View.MemoryView":1007 - * cdef _memoryviewslice result - * - * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< - * return None + /* "View.MemoryView":1134 + * break * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: */ } - /* "View.MemoryView":1013 - * - * - * result = _memoryviewslice(None, 0, dtype_is_object) # <<<<<<<<<<<<<< + /* "View.MemoryView":1137 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< * - * result.from_slice = memviewslice + * @cython.cdivision(True) */ - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1013, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1013, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None); - __Pyx_INCREF(__pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); - __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1013, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); - __pyx_t_2 = 0; - - /* "View.MemoryView":1015 - * result = _memoryviewslice(None, 0, dtype_is_object) - * - * result.from_slice = memviewslice # <<<<<<<<<<<<<< - * __PYX_INC_MEMVIEW(&memviewslice, 1) - * - */ - __pyx_v_result->from_slice = __pyx_v_memviewslice; + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } - /* "View.MemoryView":1016 - * - * result.from_slice = memviewslice - * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + /* "View.MemoryView":1116 * - * result.from_object = ( memviewslice.memview).base + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. */ - __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); - /* "View.MemoryView":1018 - * __PYX_INC_MEMVIEW(&memviewslice, 1) - * - * result.from_object = ( memviewslice.memview).base # <<<<<<<<<<<<<< - * result.typeinfo = memviewslice.memview.typeinfo - * - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_memviewslice.memview), __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1018, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __Pyx_GOTREF(__pyx_v_result->from_object); - __Pyx_DECREF(__pyx_v_result->from_object); - __pyx_v_result->from_object = __pyx_t_2; - __pyx_t_2 = 0; + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} - /* "View.MemoryView":1019 - * - * result.from_object = ( memviewslice.memview).base - * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< +/* "View.MemoryView":1140 * - * result.view = memviewslice.memview.view + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, */ - __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; - __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; - /* "View.MemoryView":1021 - * result.typeinfo = memviewslice.memview.typeinfo - * - * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< - * result.view.buf = memviewslice.data - * result.view.ndim = ndim - */ - __pyx_t_5 = __pyx_v_memviewslice.memview->view; - __pyx_v_result->__pyx_base.view = __pyx_t_5; +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; - /* "View.MemoryView":1022 + /* "View.MemoryView":1147 * - * result.view = memviewslice.memview.view - * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< - * result.view.ndim = ndim - * (<__pyx_buffer *> &result.view).obj = Py_None + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] */ - __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + __pyx_v_src_extent = (__pyx_v_src_shape[0]); - /* "View.MemoryView":1023 - * result.view = memviewslice.memview.view - * result.view.buf = memviewslice.data - * result.view.ndim = ndim # <<<<<<<<<<<<<< - * (<__pyx_buffer *> &result.view).obj = Py_None - * Py_INCREF(Py_None) + /* "View.MemoryView":1148 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] */ - __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); - /* "View.MemoryView":1024 - * result.view.buf = memviewslice.data - * result.view.ndim = ndim - * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< - * Py_INCREF(Py_None) + /* "View.MemoryView":1149 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] * */ - ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + __pyx_v_src_stride = (__pyx_v_src_strides[0]); - /* "View.MemoryView":1025 - * result.view.ndim = ndim - * (<__pyx_buffer *> &result.view).obj = Py_None - * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + /* "View.MemoryView":1150 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< * - * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * if ndim == 1: */ - Py_INCREF(Py_None); + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); - /* "View.MemoryView":1027 - * Py_INCREF(Py_None) + /* "View.MemoryView":1152 + * cdef Py_ssize_t dst_stride = dst_strides[0] * - * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< - * result.flags = PyBUF_RECORDS - * else: + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): */ - __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); if (__pyx_t_1) { - /* "View.MemoryView":1028 + /* "View.MemoryView":1153 * - * if (memviewslice.memview).flags & PyBUF_WRITABLE: - * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< - * else: - * result.flags = PyBUF_RECORDS_RO + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) */ - __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + __pyx_t_2 = ((__pyx_v_src_stride > 0) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_dst_stride > 0) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } - /* "View.MemoryView":1027 - * Py_INCREF(Py_None) - * - * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< - * result.flags = PyBUF_RECORDS - * else: + /* "View.MemoryView":1154 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: */ - goto __pyx_L4; - } + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_3 = (__pyx_t_2 != 0); + __pyx_t_1 = __pyx_t_3; + __pyx_L5_bool_binop_done:; - /* "View.MemoryView":1030 - * result.flags = PyBUF_RECORDS - * else: - * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + /* "View.MemoryView":1153 * - * result.view.shape = result.from_slice.shape + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) */ - /*else*/ { - __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; - } - __pyx_L4:; + if (__pyx_t_1) { - /* "View.MemoryView":1032 - * result.flags = PyBUF_RECORDS_RO - * - * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< - * result.view.strides = result.from_slice.strides - * + /* "View.MemoryView":1155 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): */ - __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); - /* "View.MemoryView":1033 - * - * result.view.shape = result.from_slice.shape - * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< - * + /* "View.MemoryView":1153 * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) */ - __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + goto __pyx_L4; + } - /* "View.MemoryView":1036 - * - * - * result.view.suboffsets = NULL # <<<<<<<<<<<<<< - * for suboffset in result.from_slice.suboffsets[:ndim]: - * if suboffset >= 0: + /* "View.MemoryView":1157 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride */ - __pyx_v_result->__pyx_base.view.suboffsets = NULL; + /*else*/ { + __pyx_t_4 = __pyx_v_dst_extent; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; - /* "View.MemoryView":1037 - * - * result.view.suboffsets = NULL - * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< - * if suboffset >= 0: - * result.view.suboffsets = result.from_slice.suboffsets + /* "View.MemoryView":1158 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride */ - __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); - for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { - __pyx_t_6 = __pyx_t_8; - __pyx_v_suboffset = (__pyx_t_6[0]); + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); - /* "View.MemoryView":1038 - * result.view.suboffsets = NULL - * for suboffset in result.from_slice.suboffsets[:ndim]: - * if suboffset >= 0: # <<<<<<<<<<<<<< - * result.view.suboffsets = result.from_slice.suboffsets - * break + /* "View.MemoryView":1159 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: */ - __pyx_t_1 = ((__pyx_v_suboffset >= 0) != 0); - if (__pyx_t_1) { + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); - /* "View.MemoryView":1039 - * for suboffset in result.from_slice.suboffsets[:ndim]: - * if suboffset >= 0: - * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< - * break + /* "View.MemoryView":1160 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1152 + * cdef Py_ssize_t dst_stride = dst_strides[0] * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): */ - __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + goto __pyx_L3; + } - /* "View.MemoryView":1040 - * if suboffset >= 0: - * result.view.suboffsets = result.from_slice.suboffsets - * break # <<<<<<<<<<<<<< + /* "View.MemoryView":1162 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_4 = __pyx_v_dst_extent; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1163 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1167 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride * - * result.view.len = result.view.itemsize */ - goto __pyx_L6_break; + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); - /* "View.MemoryView":1038 - * result.view.suboffsets = NULL - * for suboffset in result.from_slice.suboffsets[:ndim]: - * if suboffset >= 0: # <<<<<<<<<<<<<< - * result.view.suboffsets = result.from_slice.suboffsets - * break + /* "View.MemoryView":1168 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); } } - __pyx_L6_break:; + __pyx_L3:; - /* "View.MemoryView":1042 - * break + /* "View.MemoryView":1140 * - * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< - * for length in result.view.shape[:ndim]: - * result.view.len *= length + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, */ - __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; - __pyx_v_result->__pyx_base.view.len = __pyx_t_9; - /* "View.MemoryView":1043 + /* function exit code */ +} + +/* "View.MemoryView":1170 + * dst_data += dst_stride * - * result.view.len = result.view.itemsize - * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< - * result.view.len *= length + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1173 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) * */ - __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); - for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { - __pyx_t_6 = __pyx_t_8; - __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1043, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); - __pyx_t_2 = 0; + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); - /* "View.MemoryView":1044 - * result.view.len = result.view.itemsize - * for length in result.view.shape[:ndim]: - * result.view.len *= length # <<<<<<<<<<<<<< + /* "View.MemoryView":1170 + * dst_data += dst_stride * - * result.to_object_func = to_object_func + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: */ - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1044, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1044, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 1044, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_result->__pyx_base.view.len = __pyx_t_9; - } - /* "View.MemoryView":1046 - * result.view.len *= length + /* function exit code */ +} + +/* "View.MemoryView":1177 * - * result.to_object_func = to_object_func # <<<<<<<<<<<<<< - * result.to_dtype_func = to_dtype_func + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + + /* "View.MemoryView":1179 + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< * + * for shape in src.shape[:ndim]: */ - __pyx_v_result->to_object_func = __pyx_v_to_object_func; + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; - /* "View.MemoryView":1047 + /* "View.MemoryView":1181 + * cdef Py_ssize_t shape, size = src.memview.view.itemsize * - * result.to_object_func = to_object_func - * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< + * size *= shape * - * return result */ - __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + __pyx_t_3 = (__pyx_v_src->shape + __pyx_v_ndim); + for (__pyx_t_4 = __pyx_v_src->shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_shape = (__pyx_t_2[0]); - /* "View.MemoryView":1049 - * result.to_dtype_func = to_dtype_func + /* "View.MemoryView":1182 * - * return result # <<<<<<<<<<<<<< + * for shape in src.shape[:ndim]: + * size *= shape # <<<<<<<<<<<<<< * - * @cname('__pyx_memoryview_get_slice_from_memoryview') + * return size */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_result)); - __pyx_r = ((PyObject *)__pyx_v_result); + __pyx_v_size = (__pyx_v_size * __pyx_v_shape); + } + + /* "View.MemoryView":1184 + * size *= shape + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; goto __pyx_L0; - /* "View.MemoryView":999 + /* "View.MemoryView":1177 * - * @cname('__pyx_memoryview_fromslice') - * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< - * int ndim, - * object (*to_object_func)(char *), + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize */ /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_result); - __Pyx_XDECREF(__pyx_v_length); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":1052 +/* "View.MemoryView":1187 * - * @cname('__pyx_memoryview_get_slice_from_memoryview') - * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *mslice) except NULL: - * cdef _memoryviewslice obj + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) nogil: */ -static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { - struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; - __Pyx_memviewslice *__pyx_r; - __Pyx_RefNannyDeclarations +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; int __pyx_t_1; int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - __Pyx_RefNannySetupContext("get_slice_from_memview", 0); + int __pyx_t_3; + int __pyx_t_4; - /* "View.MemoryView":1055 - * __Pyx_memviewslice *mslice) except NULL: - * cdef _memoryviewslice obj - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * obj = memview - * return &obj.from_slice + /* "View.MemoryView":1196 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride */ - __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { + __pyx_t_1 = ((__pyx_v_order == 'F') != 0); + if (__pyx_t_1) { - /* "View.MemoryView":1056 - * cdef _memoryviewslice obj - * if isinstance(memview, _memoryviewslice): - * obj = memview # <<<<<<<<<<<<<< - * return &obj.from_slice + /* "View.MemoryView":1197 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1198 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] * else: */ - if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 1056, __pyx_L1_error) - __pyx_t_3 = ((PyObject *)__pyx_v_memview); - __Pyx_INCREF(__pyx_t_3); - __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); - __pyx_t_3 = 0; + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; - /* "View.MemoryView":1057 - * if isinstance(memview, _memoryviewslice): - * obj = memview - * return &obj.from_slice # <<<<<<<<<<<<<< + /* "View.MemoryView":1199 + * for idx in range(ndim): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< * else: - * slice_copy(memview, mslice) + * for idx in range(ndim - 1, -1, -1): */ - __pyx_r = (&__pyx_v_obj->from_slice); - goto __pyx_L0; + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } - /* "View.MemoryView":1055 - * __Pyx_memviewslice *mslice) except NULL: - * cdef _memoryviewslice obj - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * obj = memview - * return &obj.from_slice + /* "View.MemoryView":1196 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride */ + goto __pyx_L3; } - /* "View.MemoryView":1059 - * return &obj.from_slice + /* "View.MemoryView":1201 + * stride *= shape[idx] * else: - * slice_copy(memview, mslice) # <<<<<<<<<<<<<< - * return mslice - * + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] */ /*else*/ { - __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; - /* "View.MemoryView":1060 + /* "View.MemoryView":1202 * else: - * slice_copy(memview, mslice) - * return mslice # <<<<<<<<<<<<<< + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] * - * @cname('__pyx_memoryview_slice_copy') */ - __pyx_r = __pyx_v_mslice; - goto __pyx_L0; + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1203 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } } + __pyx_L3:; - /* "View.MemoryView":1052 + /* "View.MemoryView":1205 + * stride *= shape[idx] * - * @cname('__pyx_memoryview_get_slice_from_memoryview') - * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *mslice) except NULL: - * cdef _memoryviewslice obj + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1187 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) nogil: */ /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_obj); - __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":1063 +/* "View.MemoryView":1208 * - * @cname('__pyx_memoryview_slice_copy') - * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< - * cdef int dim - * cdef (Py_ssize_t*) shape, strides, suboffsets + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, */ -static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { - int __pyx_v_dim; - Py_ssize_t *__pyx_v_shape; - Py_ssize_t *__pyx_v_strides; - Py_ssize_t *__pyx_v_suboffsets; - __Pyx_RefNannyDeclarations - Py_ssize_t *__pyx_t_1; +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; int __pyx_t_2; int __pyx_t_3; - int __pyx_t_4; - Py_ssize_t __pyx_t_5; - __Pyx_RefNannySetupContext("slice_copy", 0); + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; - /* "View.MemoryView":1067 - * cdef (Py_ssize_t*) shape, strides, suboffsets + /* "View.MemoryView":1219 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) * - * shape = memview.view.shape # <<<<<<<<<<<<<< - * strides = memview.view.strides - * suboffsets = memview.view.suboffsets */ - __pyx_t_1 = __pyx_v_memview->view.shape; - __pyx_v_shape = __pyx_t_1; + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; - /* "View.MemoryView":1068 + /* "View.MemoryView":1220 * - * shape = memview.view.shape - * strides = memview.view.strides # <<<<<<<<<<<<<< - * suboffsets = memview.view.suboffsets + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< * + * result = malloc(size) */ - __pyx_t_1 = __pyx_v_memview->view.strides; - __pyx_v_strides = __pyx_t_1; + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); - /* "View.MemoryView":1069 - * shape = memview.view.shape - * strides = memview.view.strides - * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + /* "View.MemoryView":1222 + * cdef size_t size = slice_get_size(src, ndim) * - * dst.memview = <__pyx_memoryview *> memview + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err(MemoryError, NULL) */ - __pyx_t_1 = __pyx_v_memview->view.suboffsets; - __pyx_v_suboffsets = __pyx_t_1; + __pyx_v_result = malloc(__pyx_v_size); - /* "View.MemoryView":1071 - * suboffsets = memview.view.suboffsets + /* "View.MemoryView":1223 * - * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< - * dst.data = memview.view.buf + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err(MemoryError, NULL) * */ - __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + __pyx_t_2 = ((!(__pyx_v_result != 0)) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1072 + /* "View.MemoryView":1224 + * result = malloc(size) + * if not result: + * _err(MemoryError, NULL) # <<<<<<<<<<<<<< * - * dst.memview = <__pyx_memoryview *> memview - * dst.data = memview.view.buf # <<<<<<<<<<<<<< * - * for dim in range(memview.view.ndim): */ - __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + __pyx_t_3 = __pyx_memoryview_err(__pyx_builtin_MemoryError, NULL); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 1224, __pyx_L1_error) - /* "View.MemoryView":1074 - * dst.data = memview.view.buf + /* "View.MemoryView":1223 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err(MemoryError, NULL) * - * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< - * dst.shape[dim] = shape[dim] - * dst.strides[dim] = strides[dim] */ - __pyx_t_2 = __pyx_v_memview->view.ndim; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_dim = __pyx_t_4; + } - /* "View.MemoryView":1075 + /* "View.MemoryView":1227 * - * for dim in range(memview.view.ndim): - * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< - * dst.strides[dim] = strides[dim] - * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): */ - (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); - /* "View.MemoryView":1076 - * for dim in range(memview.view.ndim): - * dst.shape[dim] = shape[dim] - * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< - * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + /* "View.MemoryView":1228 * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] */ - (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; - /* "View.MemoryView":1077 - * dst.shape[dim] = shape[dim] - * dst.strides[dim] = strides[dim] - * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_copy_object') + /* "View.MemoryView":1229 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 */ - if ((__pyx_v_suboffsets != 0)) { - __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); - } else { - __pyx_t_5 = -1L; - } - (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; - } + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; - /* "View.MemoryView":1063 + /* "View.MemoryView":1230 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 * - * @cname('__pyx_memoryview_slice_copy') - * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< - * cdef int dim - * cdef (Py_ssize_t*) shape, strides, suboffsets */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "View.MemoryView":1080 + /* "View.MemoryView":1231 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< * - * @cname('__pyx_memoryview_copy_object') - * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< - * "Create a new memoryview object" - * cdef __Pyx_memviewslice memviewslice + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } -static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { - __Pyx_memviewslice __pyx_v_memviewslice; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("memoryview_copy", 0); - - /* "View.MemoryView":1083 - * "Create a new memoryview object" - * cdef __Pyx_memviewslice memviewslice - * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< - * return memoryview_copy_from_slice(memview, &memviewslice) + /* "View.MemoryView":1233 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, # <<<<<<<<<<<<<< + * ndim, order) * */ - __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); - /* "View.MemoryView":1084 - * cdef __Pyx_memviewslice memviewslice - * slice_copy(memview, &memviewslice) - * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + /* "View.MemoryView":1237 * - * @cname('__pyx_memoryview_copy_object_from_slice') + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1084, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; - /* "View.MemoryView":1080 + /* "View.MemoryView":1238 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 * - * @cname('__pyx_memoryview_copy_object') - * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< - * "Create a new memoryview object" - * cdef __Pyx_memviewslice memviewslice */ + __pyx_t_2 = (((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1) != 0); + if (__pyx_t_2) { - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":1087 + /* "View.MemoryView":1239 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< * - * @cname('__pyx_memoryview_copy_object_from_slice') - * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< - * """ - * Create a new memoryview object from a given memoryview object and slice. + * if slice_is_contig(src[0], order, ndim): */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; -static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { - PyObject *(*__pyx_v_to_object_func)(char *); - int (*__pyx_v_to_dtype_func)(char *, PyObject *); - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *(*__pyx_t_3)(char *); - int (*__pyx_t_4)(char *, PyObject *); - PyObject *__pyx_t_5 = NULL; - __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 0); - - /* "View.MemoryView":1094 - * cdef int (*to_dtype_func)(char *, object) except 0 + /* "View.MemoryView":1238 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * to_object_func = (<_memoryviewslice> memview).to_object_func - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func */ - __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { + } + } - /* "View.MemoryView":1095 + /* "View.MemoryView":1241 + * tmpslice.strides[i] = 0 * - * if isinstance(memview, _memoryviewslice): - * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) * else: */ - __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; - __pyx_v_to_object_func = __pyx_t_3; + __pyx_t_2 = (__pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1096 - * if isinstance(memview, _memoryviewslice): - * to_object_func = (<_memoryviewslice> memview).to_object_func - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + /* "View.MemoryView":1242 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< * else: - * to_object_func = NULL + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) */ - __pyx_t_4 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; - __pyx_v_to_dtype_func = __pyx_t_4; + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); - /* "View.MemoryView":1094 - * cdef int (*to_dtype_func)(char *, object) except 0 + /* "View.MemoryView":1241 + * tmpslice.strides[i] = 0 * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * to_object_func = (<_memoryviewslice> memview).to_object_func - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: */ - goto __pyx_L3; + goto __pyx_L9; } - /* "View.MemoryView":1098 - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + /* "View.MemoryView":1244 + * memcpy(result, src.data, size) * else: - * to_object_func = NULL # <<<<<<<<<<<<<< - * to_dtype_func = NULL + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< * + * return result */ /*else*/ { - __pyx_v_to_object_func = NULL; - - /* "View.MemoryView":1099 - * else: - * to_object_func = NULL - * to_dtype_func = NULL # <<<<<<<<<<<<<< - * - * return memoryview_fromslice(memviewslice[0], memview.view.ndim, - */ - __pyx_v_to_dtype_func = NULL; + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); } - __pyx_L3:; + __pyx_L9:; - /* "View.MemoryView":1101 - * to_dtype_func = NULL + /* "View.MemoryView":1246 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) * - * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< - * to_object_func, to_dtype_func, - * memview.dtype_is_object) - */ - __Pyx_XDECREF(__pyx_r); - - /* "View.MemoryView":1103 - * return memoryview_fromslice(memviewslice[0], memview.view.ndim, - * to_object_func, to_dtype_func, - * memview.dtype_is_object) # <<<<<<<<<<<<<< + * return result # <<<<<<<<<<<<<< * * */ - __pyx_t_5 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1101, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; + __pyx_r = __pyx_v_result; goto __pyx_L0; - /* "View.MemoryView":1087 + /* "View.MemoryView":1208 * - * @cname('__pyx_memoryview_copy_object_from_slice') - * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< - * """ - * Create a new memoryview object from a given memoryview object and slice. + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, */ /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":1109 - * - * - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< - * if arg < 0: - * return -arg - */ - -static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { - Py_ssize_t __pyx_r; - int __pyx_t_1; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = NULL; + __pyx_L0:; + return __pyx_r; +} - /* "View.MemoryView":1110 +/* "View.MemoryView":1251 * - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: - * if arg < 0: # <<<<<<<<<<<<<< - * return -arg - * else: + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % */ - __pyx_t_1 = ((__pyx_v_arg < 0) != 0); - if (__pyx_t_1) { - /* "View.MemoryView":1111 - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: - * if arg < 0: - * return -arg # <<<<<<<<<<<<<< - * else: - * return arg - */ - __pyx_r = (-__pyx_v_arg); - goto __pyx_L0; +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); - /* "View.MemoryView":1110 + /* "View.MemoryView":1254 + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + * (i, extent1, extent2)) # <<<<<<<<<<<<<< * - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: - * if arg < 0: # <<<<<<<<<<<<<< - * return -arg - * else: + * @cname('__pyx_memoryview_err_dim') */ - } + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_extent1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_extent2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; - /* "View.MemoryView":1113 - * return -arg - * else: - * return arg # <<<<<<<<<<<<<< + /* "View.MemoryView":1253 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % # <<<<<<<<<<<<<< + * (i, extent1, extent2)) * - * @cname('__pyx_get_best_slice_order') */ - /*else*/ { - __pyx_r = __pyx_v_arg; - goto __pyx_L0; - } + __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 1253, __pyx_L1_error) - /* "View.MemoryView":1109 - * + /* "View.MemoryView":1251 * - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< - * if arg < 0: - * return -arg + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % */ /* function exit code */ - __pyx_L0:; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif return __pyx_r; } -/* "View.MemoryView":1116 +/* "View.MemoryView":1257 * - * @cname('__pyx_get_best_slice_order') - * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< - * """ - * Figure out the best memory access order for a given slice. - */ - -static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { - int __pyx_v_i; - Py_ssize_t __pyx_v_c_stride; - Py_ssize_t __pyx_v_f_stride; - char __pyx_r; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - - /* "View.MemoryView":1121 - * """ - * cdef int i - * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< - * cdef Py_ssize_t f_stride = 0 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii') % dim) * */ - __pyx_v_c_stride = 0; - /* "View.MemoryView":1122 - * cdef int i - * cdef Py_ssize_t c_stride = 0 - * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< - * - * for i in range(ndim - 1, -1, -1): - */ - __pyx_v_f_stride = 0; +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_error); - /* "View.MemoryView":1124 - * cdef Py_ssize_t f_stride = 0 + /* "View.MemoryView":1258 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: + * raise error(msg.decode('ascii') % dim) # <<<<<<<<<<<<<< * - * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< - * if mslice.shape[i] > 1: - * c_stride = mslice.strides[i] + * @cname('__pyx_memoryview_err') */ - for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { - __pyx_v_i = __pyx_t_1; + __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1258, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1258, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyUnicode_Format(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1258, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_v_error); + __pyx_t_3 = __pyx_v_error; __pyx_t_2 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1258, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 1258, __pyx_L1_error) - /* "View.MemoryView":1125 + /* "View.MemoryView":1257 * - * for i in range(ndim - 1, -1, -1): - * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< - * c_stride = mslice.strides[i] - * break - */ - __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1126 - * for i in range(ndim - 1, -1, -1): - * if mslice.shape[i] > 1: - * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< - * break + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii') % dim) * */ - __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); - /* "View.MemoryView":1127 - * if mslice.shape[i] > 1: - * c_stride = mslice.strides[i] - * break # <<<<<<<<<<<<<< - * - * for i in range(ndim): - */ - goto __pyx_L4_break; + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} - /* "View.MemoryView":1125 +/* "View.MemoryView":1261 * - * for i in range(ndim - 1, -1, -1): - * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< - * c_stride = mslice.strides[i] - * break + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< + * if msg != NULL: + * raise error(msg.decode('ascii')) */ - } - } - __pyx_L4_break:; - - /* "View.MemoryView":1129 - * break - * - * for i in range(ndim): # <<<<<<<<<<<<<< - * if mslice.shape[i] > 1: - * f_stride = mslice.strides[i] - */ - __pyx_t_1 = __pyx_v_ndim; - __pyx_t_3 = __pyx_t_1; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; - - /* "View.MemoryView":1130 - * - * for i in range(ndim): - * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< - * f_stride = mslice.strides[i] - * break - */ - __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1131 - * for i in range(ndim): - * if mslice.shape[i] > 1: - * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< - * break - * - */ - __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); - - /* "View.MemoryView":1132 - * if mslice.shape[i] > 1: - * f_stride = mslice.strides[i] - * break # <<<<<<<<<<<<<< - * - * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): - */ - goto __pyx_L7_break; - /* "View.MemoryView":1130 - * - * for i in range(ndim): - * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< - * f_stride = mslice.strides[i] - * break - */ - } - } - __pyx_L7_break:; +static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_error); - /* "View.MemoryView":1134 - * break - * - * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< - * return 'C' + /* "View.MemoryView":1262 + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii')) * else: */ - __pyx_t_2 = ((abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)) != 0); - if (__pyx_t_2) { + __pyx_t_1 = ((__pyx_v_msg != NULL) != 0); + if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":1135 - * - * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): - * return 'C' # <<<<<<<<<<<<<< + /* "View.MemoryView":1263 + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: + * raise error(msg.decode('ascii')) # <<<<<<<<<<<<<< * else: - * return 'F' + * raise error */ - __pyx_r = 'C'; - goto __pyx_L0; + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_error); + __pyx_t_4 = __pyx_v_error; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 1263, __pyx_L1_error) - /* "View.MemoryView":1134 - * break - * - * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< - * return 'C' + /* "View.MemoryView":1262 + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii')) * else: */ } - /* "View.MemoryView":1137 - * return 'C' + /* "View.MemoryView":1265 + * raise error(msg.decode('ascii')) * else: - * return 'F' # <<<<<<<<<<<<<< + * raise error # <<<<<<<<<<<<<< * - * @cython.cdivision(True) + * @cname('__pyx_memoryview_copy_contents') */ /*else*/ { - __pyx_r = 'F'; - goto __pyx_L0; + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + __PYX_ERR(1, 1265, __pyx_L1_error) } - /* "View.MemoryView":1116 + /* "View.MemoryView":1261 * - * @cname('__pyx_get_best_slice_order') - * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< - * """ - * Figure out the best memory access order for a given slice. + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< + * if msg != NULL: + * raise error(msg.decode('ascii')) */ /* function exit code */ - __pyx_L0:; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif return __pyx_r; } -/* "View.MemoryView":1140 +/* "View.MemoryView":1268 * - * @cython.cdivision(True) - * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< - * char *dst_data, Py_ssize_t *dst_strides, - * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, */ -static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { - CYTHON_UNUSED Py_ssize_t __pyx_v_i; - CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; - Py_ssize_t __pyx_v_dst_extent; - Py_ssize_t __pyx_v_src_stride; - Py_ssize_t __pyx_v_dst_stride; - int __pyx_t_1; +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; int __pyx_t_2; int __pyx_t_3; - Py_ssize_t __pyx_t_4; - Py_ssize_t __pyx_t_5; - Py_ssize_t __pyx_t_6; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_t_8; - /* "View.MemoryView":1147 - * - * cdef Py_ssize_t i - * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< - * cdef Py_ssize_t dst_extent = dst_shape[0] - * cdef Py_ssize_t src_stride = src_strides[0] + /* "View.MemoryView":1276 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i */ - __pyx_v_src_extent = (__pyx_v_src_shape[0]); + __pyx_v_tmpdata = NULL; - /* "View.MemoryView":1148 - * cdef Py_ssize_t i - * cdef Py_ssize_t src_extent = src_shape[0] - * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< - * cdef Py_ssize_t src_stride = src_strides[0] - * cdef Py_ssize_t dst_stride = dst_strides[0] + /* "View.MemoryView":1277 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) */ - __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; - /* "View.MemoryView":1149 - * cdef Py_ssize_t src_extent = src_shape[0] - * cdef Py_ssize_t dst_extent = dst_shape[0] - * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< - * cdef Py_ssize_t dst_stride = dst_strides[0] - * + /* "View.MemoryView":1279 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False */ - __pyx_v_src_stride = (__pyx_v_src_strides[0]); + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); - /* "View.MemoryView":1150 - * cdef Py_ssize_t dst_extent = dst_shape[0] - * cdef Py_ssize_t src_stride = src_strides[0] - * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< - * - * if ndim == 1: + /* "View.MemoryView":1280 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp */ - __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + __pyx_v_broadcasting = 0; - /* "View.MemoryView":1152 - * cdef Py_ssize_t dst_stride = dst_strides[0] + /* "View.MemoryView":1281 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp * - * if ndim == 1: # <<<<<<<<<<<<<< - * if (src_stride > 0 and dst_stride > 0 and - * src_stride == itemsize == dst_stride): */ - __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); - if (__pyx_t_1) { + __pyx_v_direct_copy = 0; - /* "View.MemoryView":1153 + /* "View.MemoryView":1284 + * cdef __Pyx_memviewslice tmp * - * if ndim == 1: - * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< - * src_stride == itemsize == dst_stride): - * memcpy(dst_data, src_data, itemsize * dst_extent) + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: */ - __pyx_t_2 = ((__pyx_v_src_stride > 0) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L5_bool_binop_done; - } - __pyx_t_2 = ((__pyx_v_dst_stride > 0) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L5_bool_binop_done; - } + __pyx_t_2 = ((__pyx_v_src_ndim < __pyx_v_dst_ndim) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1154 - * if ndim == 1: - * if (src_stride > 0 and dst_stride > 0 and - * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< - * memcpy(dst_data, src_data, itemsize * dst_extent) - * else: + /* "View.MemoryView":1285 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) */ - __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); - if (__pyx_t_2) { - __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); - } - __pyx_t_3 = (__pyx_t_2 != 0); - __pyx_t_1 = __pyx_t_3; - __pyx_L5_bool_binop_done:; + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); - /* "View.MemoryView":1153 + /* "View.MemoryView":1284 + * cdef __Pyx_memviewslice tmp * - * if ndim == 1: - * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< - * src_stride == itemsize == dst_stride): - * memcpy(dst_data, src_data, itemsize * dst_extent) + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: */ - if (__pyx_t_1) { + goto __pyx_L3; + } - /* "View.MemoryView":1155 - * if (src_stride > 0 and dst_stride > 0 and - * src_stride == itemsize == dst_stride): - * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< - * else: - * for i in range(dst_extent): + /* "View.MemoryView":1286 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * */ - (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + __pyx_t_2 = ((__pyx_v_dst_ndim < __pyx_v_src_ndim) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1153 + /* "View.MemoryView":1287 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< * - * if ndim == 1: - * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< - * src_stride == itemsize == dst_stride): - * memcpy(dst_data, src_data, itemsize * dst_extent) + * cdef int ndim = max(src_ndim, dst_ndim) */ - goto __pyx_L4; - } + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); - /* "View.MemoryView":1157 - * memcpy(dst_data, src_data, itemsize * dst_extent) - * else: - * for i in range(dst_extent): # <<<<<<<<<<<<<< - * memcpy(dst_data, src_data, itemsize) - * src_data += src_stride + /* "View.MemoryView":1286 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * */ - /*else*/ { - __pyx_t_4 = __pyx_v_dst_extent; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; + } + __pyx_L3:; - /* "View.MemoryView":1158 - * else: - * for i in range(dst_extent): - * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< - * src_data += src_stride - * dst_data += dst_stride + /* "View.MemoryView":1289 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): */ - (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + if (((__pyx_t_3 > __pyx_t_4) != 0)) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; - /* "View.MemoryView":1159 - * for i in range(dst_extent): - * memcpy(dst_data, src_data, itemsize) - * src_data += src_stride # <<<<<<<<<<<<<< - * dst_data += dst_stride - * else: + /* "View.MemoryView":1291 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: */ - __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; - /* "View.MemoryView":1160 - * memcpy(dst_data, src_data, itemsize) - * src_data += src_stride - * dst_data += dst_stride # <<<<<<<<<<<<<< - * else: - * for i in range(dst_extent): + /* "View.MemoryView":1292 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True */ - __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); - } - } - __pyx_L4:; + __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1152 - * cdef Py_ssize_t dst_stride = dst_strides[0] - * - * if ndim == 1: # <<<<<<<<<<<<<< - * if (src_stride > 0 and dst_stride > 0 and - * src_stride == itemsize == dst_stride): + /* "View.MemoryView":1293 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 */ - goto __pyx_L3; - } + __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) == 1) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1162 - * dst_data += dst_stride - * else: - * for i in range(dst_extent): # <<<<<<<<<<<<<< - * _copy_strided_to_strided(src_data, src_strides + 1, - * dst_data, dst_strides + 1, + /* "View.MemoryView":1294 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: */ - /*else*/ { - __pyx_t_4 = __pyx_v_dst_extent; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; + __pyx_v_broadcasting = 1; - /* "View.MemoryView":1163 - * else: - * for i in range(dst_extent): - * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< - * dst_data, dst_strides + 1, - * src_shape + 1, dst_shape + 1, + /* "View.MemoryView":1295 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) */ - _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + (__pyx_v_src.strides[__pyx_v_i]) = 0; - /* "View.MemoryView":1167 - * src_shape + 1, dst_shape + 1, - * ndim - 1, itemsize) - * src_data += src_stride # <<<<<<<<<<<<<< - * dst_data += dst_stride - * + /* "View.MemoryView":1293 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 */ - __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + goto __pyx_L7; + } - /* "View.MemoryView":1168 - * ndim - 1, itemsize) - * src_data += src_stride - * dst_data += dst_stride # <<<<<<<<<<<<<< + /* "View.MemoryView":1297 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< * - * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + * if src.suboffsets[i] >= 0: */ - __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); - } - } - __pyx_L3:; + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1297, __pyx_L1_error) + } + __pyx_L7:; - /* "View.MemoryView":1140 + /* "View.MemoryView":1292 * - * @cython.cdivision(True) - * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< - * char *dst_data, Py_ssize_t *dst_strides, - * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True */ + } - /* function exit code */ -} - -/* "View.MemoryView":1170 - * dst_data += dst_stride + /* "View.MemoryView":1299 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Dimension %d is not direct", i) * - * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *dst, - * int ndim, size_t itemsize) nogil: */ + __pyx_t_2 = (((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0) != 0); + if (__pyx_t_2) { -static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { - - /* "View.MemoryView":1173 - * __Pyx_memviewslice *dst, - * int ndim, size_t itemsize) nogil: - * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< - * src.shape, dst.shape, ndim, itemsize) + /* "View.MemoryView":1300 + * + * if src.suboffsets[i] >= 0: + * _err_dim(ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< * + * if slices_overlap(&src, &dst, ndim, itemsize): */ - _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + __pyx_t_6 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Dimension %d is not direct"), __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1300, __pyx_L1_error) - /* "View.MemoryView":1170 - * dst_data += dst_stride + /* "View.MemoryView":1299 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Dimension %d is not direct", i) * - * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *dst, - * int ndim, size_t itemsize) nogil: */ + } + } - /* function exit code */ -} - -/* "View.MemoryView":1177 + /* "View.MemoryView":1302 + * _err_dim(ValueError, "Dimension %d is not direct", i) * - * @cname('__pyx_memoryview_slice_get_size') - * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< - * "Return the size of the memory occupied by the slice in number of bytes" - * cdef Py_ssize_t shape, size = src.memview.view.itemsize + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): */ + __pyx_t_2 = (__pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize) != 0); + if (__pyx_t_2) { -static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { - Py_ssize_t __pyx_v_shape; - Py_ssize_t __pyx_v_size; - Py_ssize_t __pyx_r; - Py_ssize_t __pyx_t_1; - Py_ssize_t *__pyx_t_2; - Py_ssize_t *__pyx_t_3; - Py_ssize_t *__pyx_t_4; - - /* "View.MemoryView":1179 - * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: - * "Return the size of the memory occupied by the slice in number of bytes" - * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< + /* "View.MemoryView":1304 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) * - * for shape in src.shape[:ndim]: */ - __pyx_t_1 = __pyx_v_src->memview->view.itemsize; - __pyx_v_size = __pyx_t_1; + __pyx_t_2 = ((!(__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim) != 0)) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1181 - * cdef Py_ssize_t shape, size = src.memview.view.itemsize + /* "View.MemoryView":1305 * - * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< - * size *= shape + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) */ - __pyx_t_3 = (__pyx_v_src->shape + __pyx_v_ndim); - for (__pyx_t_4 = __pyx_v_src->shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { - __pyx_t_2 = __pyx_t_4; - __pyx_v_shape = (__pyx_t_2[0]); + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); - /* "View.MemoryView":1182 + /* "View.MemoryView":1304 + * if slices_overlap(&src, &dst, ndim, itemsize): * - * for shape in src.shape[:ndim]: - * size *= shape # <<<<<<<<<<<<<< + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) * - * return size */ - __pyx_v_size = (__pyx_v_size * __pyx_v_shape); - } + } - /* "View.MemoryView":1184 - * size *= shape + /* "View.MemoryView":1307 + * order = get_best_order(&dst, ndim) * - * return size # <<<<<<<<<<<<<< + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp * - * @cname('__pyx_fill_contig_strides_array') */ - __pyx_r = __pyx_v_size; - goto __pyx_L0; + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(1, 1307, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; - /* "View.MemoryView":1177 + /* "View.MemoryView":1308 * - * @cname('__pyx_memoryview_slice_get_size') - * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< - * "Return the size of the memory occupied by the slice in number of bytes" - * cdef Py_ssize_t shape, size = src.memview.view.itemsize + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: */ + __pyx_v_src = __pyx_v_tmp; - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":1187 + /* "View.MemoryView":1302 + * _err_dim(ValueError, "Dimension %d is not direct", i) * - * @cname('__pyx_fill_contig_strides_array') - * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< - * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, - * int ndim, char order) nogil: + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): */ + } -static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { - int __pyx_v_idx; - Py_ssize_t __pyx_r; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - - /* "View.MemoryView":1196 - * cdef int idx + /* "View.MemoryView":1310 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * * - * if order == 'F': # <<<<<<<<<<<<<< - * for idx in range(ndim): - * strides[idx] = stride */ - __pyx_t_1 = ((__pyx_v_order == 'F') != 0); - if (__pyx_t_1) { + __pyx_t_2 = ((!(__pyx_v_broadcasting != 0)) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1197 + /* "View.MemoryView":1313 * - * if order == 'F': - * for idx in range(ndim): # <<<<<<<<<<<<<< - * strides[idx] = stride - * stride *= shape[idx] + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): */ - __pyx_t_2 = __pyx_v_ndim; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_idx = __pyx_t_4; + __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1198 - * if order == 'F': - * for idx in range(ndim): - * strides[idx] = stride # <<<<<<<<<<<<<< - * stride *= shape[idx] - * else: + /* "View.MemoryView":1314 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) */ - (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); - /* "View.MemoryView":1199 - * for idx in range(ndim): - * strides[idx] = stride - * stride *= shape[idx] # <<<<<<<<<<<<<< - * else: - * for idx in range(ndim - 1, -1, -1): + /* "View.MemoryView":1313 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): */ - __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + goto __pyx_L12; } - /* "View.MemoryView":1196 - * cdef int idx + /* "View.MemoryView":1315 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) * - * if order == 'F': # <<<<<<<<<<<<<< - * for idx in range(ndim): - * strides[idx] = stride - */ - goto __pyx_L3; - } - - /* "View.MemoryView":1201 - * stride *= shape[idx] - * else: - * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< - * strides[idx] = stride - * stride *= shape[idx] */ - /*else*/ { - for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { - __pyx_v_idx = __pyx_t_2; + __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim) != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1202 - * else: - * for idx in range(ndim - 1, -1, -1): - * strides[idx] = stride # <<<<<<<<<<<<<< - * stride *= shape[idx] + /* "View.MemoryView":1316 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< * + * if direct_copy: */ - (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); - /* "View.MemoryView":1203 - * for idx in range(ndim - 1, -1, -1): - * strides[idx] = stride - * stride *= shape[idx] # <<<<<<<<<<<<<< + /* "View.MemoryView":1315 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) * - * return stride */ - __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); } - } - __pyx_L3:; + __pyx_L12:; - /* "View.MemoryView":1205 - * stride *= shape[idx] + /* "View.MemoryView":1318 + * direct_copy = slice_is_contig(dst, 'F', ndim) * - * return stride # <<<<<<<<<<<<<< + * if direct_copy: # <<<<<<<<<<<<<< * - * @cname('__pyx_memoryview_copy_data_to_temp') + * refcount_copying(&dst, dtype_is_object, ndim, False) */ - __pyx_r = __pyx_v_stride; - goto __pyx_L0; + __pyx_t_2 = (__pyx_v_direct_copy != 0); + if (__pyx_t_2) { - /* "View.MemoryView":1187 + /* "View.MemoryView":1320 + * if direct_copy: * - * @cname('__pyx_fill_contig_strides_array') - * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< - * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, - * int ndim, char order) nogil: + * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":1208 + /* "View.MemoryView":1321 * - * @cname('__pyx_memoryview_copy_data_to_temp') - * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *tmpslice, - * char order, + * refcount_copying(&dst, dtype_is_object, ndim, False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); -static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { - int __pyx_v_i; - void *__pyx_v_result; - size_t __pyx_v_itemsize; - size_t __pyx_v_size; - void *__pyx_r; - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - struct __pyx_memoryview_obj *__pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - - /* "View.MemoryView":1219 - * cdef void *result - * - * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< - * cdef size_t size = slice_get_size(src, ndim) - * + /* "View.MemoryView":1322 + * refcount_copying(&dst, dtype_is_object, ndim, False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 */ - __pyx_t_1 = __pyx_v_src->memview->view.itemsize; - __pyx_v_itemsize = __pyx_t_1; + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - /* "View.MemoryView":1220 - * - * cdef size_t itemsize = src.memview.view.itemsize - * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + /* "View.MemoryView":1323 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 * - * result = malloc(size) */ - __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + free(__pyx_v_tmpdata); - /* "View.MemoryView":1222 - * cdef size_t size = slice_get_size(src, ndim) + /* "View.MemoryView":1324 + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< * - * result = malloc(size) # <<<<<<<<<<<<<< - * if not result: - * _err(MemoryError, NULL) + * if order == 'F' == get_best_order(&dst, ndim): */ - __pyx_v_result = malloc(__pyx_v_size); + __pyx_r = 0; + goto __pyx_L0; - /* "View.MemoryView":1223 + /* "View.MemoryView":1318 + * direct_copy = slice_is_contig(dst, 'F', ndim) * - * result = malloc(size) - * if not result: # <<<<<<<<<<<<<< - * _err(MemoryError, NULL) + * if direct_copy: # <<<<<<<<<<<<<< * + * refcount_copying(&dst, dtype_is_object, ndim, False) */ - __pyx_t_2 = ((!(__pyx_v_result != 0)) != 0); - if (__pyx_t_2) { + } - /* "View.MemoryView":1224 - * result = malloc(size) - * if not result: - * _err(MemoryError, NULL) # <<<<<<<<<<<<<< + /* "View.MemoryView":1310 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< * * */ - __pyx_t_3 = __pyx_memoryview_err(__pyx_builtin_MemoryError, NULL); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 1224, __pyx_L1_error) + } - /* "View.MemoryView":1223 + /* "View.MemoryView":1326 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< * - * result = malloc(size) - * if not result: # <<<<<<<<<<<<<< - * _err(MemoryError, NULL) * */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); } + __pyx_t_8 = (__pyx_t_2 != 0); + if (__pyx_t_8) { - /* "View.MemoryView":1227 + /* "View.MemoryView":1329 * * - * tmpslice.data = result # <<<<<<<<<<<<<< - * tmpslice.memview = src.memview - * for i in range(ndim): - */ - __pyx_v_tmpslice->data = ((char *)__pyx_v_result); - - /* "View.MemoryView":1228 + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) * - * tmpslice.data = result - * tmpslice.memview = src.memview # <<<<<<<<<<<<<< - * for i in range(ndim): - * tmpslice.shape[i] = src.shape[i] - */ - __pyx_t_4 = __pyx_v_src->memview; - __pyx_v_tmpslice->memview = __pyx_t_4; - - /* "View.MemoryView":1229 - * tmpslice.data = result - * tmpslice.memview = src.memview - * for i in range(ndim): # <<<<<<<<<<<<<< - * tmpslice.shape[i] = src.shape[i] - * tmpslice.suboffsets[i] = -1 */ - __pyx_t_3 = __pyx_v_ndim; - __pyx_t_5 = __pyx_t_3; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(1, 1329, __pyx_L1_error) - /* "View.MemoryView":1230 - * tmpslice.memview = src.memview - * for i in range(ndim): - * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< - * tmpslice.suboffsets[i] = -1 + /* "View.MemoryView":1330 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< * + * refcount_copying(&dst, dtype_is_object, ndim, False) */ - (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(1, 1330, __pyx_L1_error) - /* "View.MemoryView":1231 - * for i in range(ndim): - * tmpslice.shape[i] = src.shape[i] - * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + /* "View.MemoryView":1326 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * * - * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, */ - (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; } - /* "View.MemoryView":1233 - * tmpslice.suboffsets[i] = -1 - * - * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, # <<<<<<<<<<<<<< - * ndim, order) + /* "View.MemoryView":1332 + * transpose_memslice(&dst) * + * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, True) */ - (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - /* "View.MemoryView":1237 + /* "View.MemoryView":1333 * + * refcount_copying(&dst, dtype_is_object, ndim, False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, True) * - * for i in range(ndim): # <<<<<<<<<<<<<< - * if tmpslice.shape[i] == 1: - * tmpslice.strides[i] = 0 */ - __pyx_t_3 = __pyx_v_ndim; - __pyx_t_5 = __pyx_t_3; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); - /* "View.MemoryView":1238 - * - * for i in range(ndim): - * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< - * tmpslice.strides[i] = 0 + /* "View.MemoryView":1334 + * refcount_copying(&dst, dtype_is_object, ndim, False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< * + * free(tmpdata) */ - __pyx_t_2 = (((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1) != 0); - if (__pyx_t_2) { + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - /* "View.MemoryView":1239 - * for i in range(ndim): - * if tmpslice.shape[i] == 1: - * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + /* "View.MemoryView":1336 + * refcount_copying(&dst, dtype_is_object, ndim, True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 * - * if slice_is_contig(src[0], order, ndim): */ - (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + free(__pyx_v_tmpdata); - /* "View.MemoryView":1238 + /* "View.MemoryView":1337 * - * for i in range(ndim): - * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< - * tmpslice.strides[i] = 0 + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< * + * @cname('__pyx_memoryview_broadcast_leading') */ - } - } + __pyx_r = 0; + goto __pyx_L0; - /* "View.MemoryView":1241 - * tmpslice.strides[i] = 0 + /* "View.MemoryView":1268 * - * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< - * memcpy(result, src.data, size) - * else: - */ - __pyx_t_2 = (__pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1242 - * - * if slice_is_contig(src[0], order, ndim): - * memcpy(result, src.data, size) # <<<<<<<<<<<<<< - * else: - * copy_strided_to_strided(src, tmpslice, ndim, itemsize) - */ - (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); - - /* "View.MemoryView":1241 - * tmpslice.strides[i] = 0 - * - * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< - * memcpy(result, src.data, size) - * else: - */ - goto __pyx_L9; - } - - /* "View.MemoryView":1244 - * memcpy(result, src.data, size) - * else: - * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< - * - * return result - */ - /*else*/ { - copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); - } - __pyx_L9:; - - /* "View.MemoryView":1246 - * copy_strided_to_strided(src, tmpslice, ndim, itemsize) - * - * return result # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __pyx_v_result; - goto __pyx_L0; - - /* "View.MemoryView":1208 - * - * @cname('__pyx_memoryview_copy_data_to_temp') - * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *tmpslice, - * char order, + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, */ /* function exit code */ @@ -16564,1766 +15252,917 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); #endif - __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); #ifdef WITH_THREAD __Pyx_PyGILState_Release(__pyx_gilstate_save); #endif } - __pyx_r = NULL; + __pyx_r = -1; __pyx_L0:; return __pyx_r; } -/* "View.MemoryView":1251 +/* "View.MemoryView":1340 * - * @cname('__pyx_memoryview_err_extents') - * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< - * Py_ssize_t extent2) except -1 with gil: - * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) nogil: */ -static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_RefNannySetupContext("_err_extents", 0); +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; - /* "View.MemoryView":1254 - * Py_ssize_t extent2) except -1 with gil: - * raise ValueError("got differing extents in dimension %d (got %d and %d)" % - * (i, extent1, extent2)) # <<<<<<<<<<<<<< + /* "View.MemoryView":1344 + * int ndim_other) nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< * - * @cname('__pyx_memoryview_err_dim') + * for i in range(ndim - 1, -1, -1): */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_extent1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_extent2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_3 = 0; + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); - /* "View.MemoryView":1253 - * cdef int _err_extents(int i, Py_ssize_t extent1, - * Py_ssize_t extent2) except -1 with gil: - * raise ValueError("got differing extents in dimension %d (got %d and %d)" % # <<<<<<<<<<<<<< - * (i, extent1, extent2)) + /* "View.MemoryView":1346 + * cdef int offset = ndim_other - ndim * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] */ - __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1253, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1253, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(2, 1253, __pyx_L1_error) + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; - /* "View.MemoryView":1251 + /* "View.MemoryView":1347 * - * @cname('__pyx_memoryview_err_extents') - * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< - * Py_ssize_t extent2) except -1 with gil: - * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __Pyx_RefNannyFinishContext(); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - return __pyx_r; -} - -/* "View.MemoryView":1257 - * - * @cname('__pyx_memoryview_err_dim') - * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< - * raise error(msg.decode('ascii') % dim) + /* "View.MemoryView":1348 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] * */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); -static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, int __pyx_v_dim) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_RefNannySetupContext("_err_dim", 0); - __Pyx_INCREF(__pyx_v_error); - - /* "View.MemoryView":1258 - * @cname('__pyx_memoryview_err_dim') - * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: - * raise error(msg.decode('ascii') % dim) # <<<<<<<<<<<<<< + /* "View.MemoryView":1349 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< * - * @cname('__pyx_memoryview_err') + * for i in range(offset): */ - __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1258, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1258, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyUnicode_Format(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1258, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_INCREF(__pyx_v_error); - __pyx_t_3 = __pyx_v_error; __pyx_t_2 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_2)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_2); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - } + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); } - __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1258, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 1258, __pyx_L1_error) - /* "View.MemoryView":1257 + /* "View.MemoryView":1351 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] * - * @cname('__pyx_memoryview_err_dim') - * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< - * raise error(msg.decode('ascii') % dim) + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1352 * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __Pyx_XDECREF(__pyx_v_error); - __Pyx_RefNannyFinishContext(); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - return __pyx_r; -} + /* "View.MemoryView":1353 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); -/* "View.MemoryView":1261 + /* "View.MemoryView":1354 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * * - * @cname('__pyx_memoryview_err') - * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< - * if msg != NULL: - * raise error(msg.decode('ascii')) */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } -static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { - int __pyx_r; - __Pyx_RefNannyDeclarations + /* "View.MemoryView":1340 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1362 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< + * int ndim, bint inc) nogil: + * + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_RefNannySetupContext("_err", 0); - __Pyx_INCREF(__pyx_v_error); - /* "View.MemoryView":1262 - * @cname('__pyx_memoryview_err') - * cdef int _err(object error, char *msg) except -1 with gil: - * if msg != NULL: # <<<<<<<<<<<<<< - * raise error(msg.decode('ascii')) - * else: + /* "View.MemoryView":1366 + * + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, + * dst.strides, ndim, inc) */ - __pyx_t_1 = ((__pyx_v_msg != NULL) != 0); - if (unlikely(__pyx_t_1)) { + __pyx_t_1 = (__pyx_v_dtype_is_object != 0); + if (__pyx_t_1) { - /* "View.MemoryView":1263 - * cdef int _err(object error, char *msg) except -1 with gil: - * if msg != NULL: - * raise error(msg.decode('ascii')) # <<<<<<<<<<<<<< - * else: - * raise error + /* "View.MemoryView":1367 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, # <<<<<<<<<<<<<< + * dst.strides, ndim, inc) + * */ - __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1263, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_error); - __pyx_t_4 = __pyx_v_error; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1263, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 1263, __pyx_L1_error) + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); - /* "View.MemoryView":1262 - * @cname('__pyx_memoryview_err') - * cdef int _err(object error, char *msg) except -1 with gil: - * if msg != NULL: # <<<<<<<<<<<<<< - * raise error(msg.decode('ascii')) - * else: + /* "View.MemoryView":1366 + * + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, + * dst.strides, ndim, inc) */ } - /* "View.MemoryView":1265 - * raise error(msg.decode('ascii')) - * else: - * raise error # <<<<<<<<<<<<<< + /* "View.MemoryView":1362 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< + * int ndim, bint inc) nogil: * - * @cname('__pyx_memoryview_copy_contents') */ - /*else*/ { - __Pyx_Raise(__pyx_v_error, 0, 0, 0); - __PYX_ERR(2, 1265, __pyx_L1_error) - } - /* "View.MemoryView":1261 + /* function exit code */ +} + +/* "View.MemoryView":1371 * - * @cname('__pyx_memoryview_err') - * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< - * if msg != NULL: - * raise error(msg.decode('ascii')) + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + __Pyx_RefNannyDeclarations + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("refcount_objects_in_slice_with_gil", 0); + + /* "View.MemoryView":1374 + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: */ /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __Pyx_XDECREF(__pyx_v_error); __Pyx_RefNannyFinishContext(); #ifdef WITH_THREAD __Pyx_PyGILState_Release(__pyx_gilstate_save); #endif - return __pyx_r; } -/* "View.MemoryView":1268 +/* "View.MemoryView":1377 * - * @cname('__pyx_memoryview_copy_contents') - * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice dst, - * int src_ndim, int dst_ndim, + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc): + * cdef Py_ssize_t i */ -static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { - void *__pyx_v_tmpdata; - size_t __pyx_v_itemsize; - int __pyx_v_i; - char __pyx_v_order; - int __pyx_v_broadcasting; - int __pyx_v_direct_copy; - __Pyx_memviewslice __pyx_v_tmp; - int __pyx_v_ndim; - int __pyx_r; +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; int __pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - void *__pyx_t_7; - int __pyx_t_8; - - /* "View.MemoryView":1276 - * Check for overlapping memory and verify the shapes. - * """ - * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< - * cdef size_t itemsize = src.memview.view.itemsize - * cdef int i - */ - __pyx_v_tmpdata = NULL; + __Pyx_RefNannySetupContext("refcount_objects_in_slice", 0); - /* "View.MemoryView":1277 - * """ - * cdef void *tmpdata = NULL - * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< - * cdef int i - * cdef char order = get_best_order(&src, src_ndim) + /* "View.MemoryView":1381 + * cdef Py_ssize_t i + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: */ - __pyx_t_1 = __pyx_v_src.memview->view.itemsize; - __pyx_v_itemsize = __pyx_t_1; + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; - /* "View.MemoryView":1279 - * cdef size_t itemsize = src.memview.view.itemsize - * cdef int i - * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< - * cdef bint broadcasting = False - * cdef bint direct_copy = False + /* "View.MemoryView":1382 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) */ - __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + __pyx_t_4 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_4) { - /* "View.MemoryView":1280 - * cdef int i - * cdef char order = get_best_order(&src, src_ndim) - * cdef bint broadcasting = False # <<<<<<<<<<<<<< - * cdef bint direct_copy = False - * cdef __Pyx_memviewslice tmp + /* "View.MemoryView":1383 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: */ - __pyx_v_broadcasting = 0; + __pyx_t_4 = (__pyx_v_inc != 0); + if (__pyx_t_4) { - /* "View.MemoryView":1281 - * cdef char order = get_best_order(&src, src_ndim) - * cdef bint broadcasting = False - * cdef bint direct_copy = False # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice tmp - * + /* "View.MemoryView":1384 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) */ - __pyx_v_direct_copy = 0; + Py_INCREF((((PyObject **)__pyx_v_data)[0])); - /* "View.MemoryView":1284 - * cdef __Pyx_memviewslice tmp - * - * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: + /* "View.MemoryView":1383 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: */ - __pyx_t_2 = ((__pyx_v_src_ndim < __pyx_v_dst_ndim) != 0); - if (__pyx_t_2) { + goto __pyx_L6; + } - /* "View.MemoryView":1285 - * - * if src_ndim < dst_ndim: - * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< - * elif dst_ndim < src_ndim: - * broadcast_leading(&dst, dst_ndim, src_ndim) + /* "View.MemoryView":1386 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, */ - __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; - /* "View.MemoryView":1284 - * cdef __Pyx_memviewslice tmp + /* "View.MemoryView":1382 * - * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) */ - goto __pyx_L3; - } + goto __pyx_L5; + } - /* "View.MemoryView":1286 - * if src_ndim < dst_ndim: - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< - * broadcast_leading(&dst, dst_ndim, src_ndim) + /* "View.MemoryView":1388 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< + * ndim - 1, inc) * */ - __pyx_t_2 = ((__pyx_v_dst_ndim < __pyx_v_src_ndim) != 0); - if (__pyx_t_2) { + /*else*/ { - /* "View.MemoryView":1287 - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: - * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + /* "View.MemoryView":1389 + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, + * ndim - 1, inc) # <<<<<<<<<<<<<< * - * cdef int ndim = max(src_ndim, dst_ndim) + * data += strides[0] */ - __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; - /* "View.MemoryView":1286 - * if src_ndim < dst_ndim: - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< - * broadcast_leading(&dst, dst_ndim, src_ndim) + /* "View.MemoryView":1391 + * ndim - 1, inc) * - */ - } - __pyx_L3:; - - /* "View.MemoryView":1289 - * broadcast_leading(&dst, dst_ndim, src_ndim) + * data += strides[0] # <<<<<<<<<<<<<< * - * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< * - * for i in range(ndim): */ - __pyx_t_3 = __pyx_v_dst_ndim; - __pyx_t_4 = __pyx_v_src_ndim; - if (((__pyx_t_3 > __pyx_t_4) != 0)) { - __pyx_t_5 = __pyx_t_3; - } else { - __pyx_t_5 = __pyx_t_4; + __pyx_v_data = (__pyx_v_data + (__pyx_v_strides[0])); } - __pyx_v_ndim = __pyx_t_5; - /* "View.MemoryView":1291 - * cdef int ndim = max(src_ndim, dst_ndim) + /* "View.MemoryView":1377 * - * for i in range(ndim): # <<<<<<<<<<<<<< - * if src.shape[i] != dst.shape[i]: - * if src.shape[i] == 1: + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc): + * cdef Py_ssize_t i */ - __pyx_t_5 = __pyx_v_ndim; - __pyx_t_3 = __pyx_t_5; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; - /* "View.MemoryView":1292 + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":1397 * - * for i in range(ndim): - * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< - * if src.shape[i] == 1: - * broadcasting = True + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: */ - __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])) != 0); - if (__pyx_t_2) { - /* "View.MemoryView":1293 - * for i in range(ndim): - * if src.shape[i] != dst.shape[i]: - * if src.shape[i] == 1: # <<<<<<<<<<<<<< - * broadcasting = True - * src.strides[i] = 0 - */ - __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) == 1) != 0); - if (__pyx_t_2) { +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { - /* "View.MemoryView":1294 - * if src.shape[i] != dst.shape[i]: - * if src.shape[i] == 1: - * broadcasting = True # <<<<<<<<<<<<<< - * src.strides[i] = 0 - * else: + /* "View.MemoryView":1400 + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + * refcount_copying(dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, + * itemsize, item) */ - __pyx_v_broadcasting = 1; + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - /* "View.MemoryView":1295 - * if src.shape[i] == 1: - * broadcasting = True - * src.strides[i] = 0 # <<<<<<<<<<<<<< - * else: - * _err_extents(i, dst.shape[i], src.shape[i]) + /* "View.MemoryView":1401 + * bint dtype_is_object) nogil: + * refcount_copying(dst, dtype_is_object, ndim, False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, # <<<<<<<<<<<<<< + * itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, True) */ - (__pyx_v_src.strides[__pyx_v_i]) = 0; + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); - /* "View.MemoryView":1293 - * for i in range(ndim): - * if src.shape[i] != dst.shape[i]: - * if src.shape[i] == 1: # <<<<<<<<<<<<<< - * broadcasting = True - * src.strides[i] = 0 + /* "View.MemoryView":1403 + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, + * itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * + * */ - goto __pyx_L7; - } + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - /* "View.MemoryView":1297 - * src.strides[i] = 0 - * else: - * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + /* "View.MemoryView":1397 * - * if src.suboffsets[i] >= 0: + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: */ - /*else*/ { - __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1297, __pyx_L1_error) - } - __pyx_L7:; - /* "View.MemoryView":1292 + /* function exit code */ +} + +/* "View.MemoryView":1407 * - * for i in range(ndim): - * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< - * if src.shape[i] == 1: - * broadcasting = True + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) nogil: */ - } - /* "View.MemoryView":1299 - * _err_extents(i, dst.shape[i], src.shape[i]) - * - * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< - * _err_dim(ValueError, "Dimension %d is not direct", i) +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1411 + * size_t itemsize, void *item) nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] * */ - __pyx_t_2 = (((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0) != 0); - if (__pyx_t_2) { + __pyx_v_stride = (__pyx_v_strides[0]); - /* "View.MemoryView":1300 - * - * if src.suboffsets[i] >= 0: - * _err_dim(ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + /* "View.MemoryView":1412 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< * - * if slices_overlap(&src, &dst, ndim, itemsize): + * if ndim == 1: */ - __pyx_t_6 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Dimension %d is not direct"), __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1300, __pyx_L1_error) + __pyx_v_extent = (__pyx_v_shape[0]); - /* "View.MemoryView":1299 - * _err_extents(i, dst.shape[i], src.shape[i]) - * - * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< - * _err_dim(ValueError, "Dimension %d is not direct", i) + /* "View.MemoryView":1414 + * cdef Py_ssize_t extent = shape[0] * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) */ - } - } + __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":1302 - * _err_dim(ValueError, "Dimension %d is not direct", i) + /* "View.MemoryView":1415 * - * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< - * - * if not slice_is_contig(src, order, ndim): + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride */ - __pyx_t_2 = (__pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize) != 0); - if (__pyx_t_2) { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; - /* "View.MemoryView":1304 - * if slices_overlap(&src, &dst, ndim, itemsize): - * - * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< - * order = get_best_order(&dst, ndim) - * + /* "View.MemoryView":1416 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: */ - __pyx_t_2 = ((!(__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim) != 0)) != 0); - if (__pyx_t_2) { + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); - /* "View.MemoryView":1305 - * - * if not slice_is_contig(src, order, ndim): - * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< - * - * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + /* "View.MemoryView":1417 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): */ - __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } - /* "View.MemoryView":1304 - * if slices_overlap(&src, &dst, ndim, itemsize): - * - * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< - * order = get_best_order(&dst, ndim) + /* "View.MemoryView":1414 + * cdef Py_ssize_t extent = shape[0] * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) */ - } + goto __pyx_L3; + } - /* "View.MemoryView":1307 - * order = get_best_order(&dst, ndim) - * - * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< - * src = tmp - * + /* "View.MemoryView":1419 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, + * ndim - 1, itemsize, item) */ - __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(2, 1307, __pyx_L1_error) - __pyx_v_tmpdata = __pyx_t_7; + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; - /* "View.MemoryView":1308 - * - * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) - * src = tmp # <<<<<<<<<<<<<< - * - * if not broadcasting: + /* "View.MemoryView":1420 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< + * ndim - 1, itemsize, item) + * data += stride */ - __pyx_v_src = __pyx_v_tmp; + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); - /* "View.MemoryView":1302 - * _err_dim(ValueError, "Dimension %d is not direct", i) + /* "View.MemoryView":1422 + * _slice_assign_scalar(data, shape + 1, strides + 1, + * ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< * - * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< * - * if not slice_is_contig(src, order, ndim): */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } } + __pyx_L3:; - /* "View.MemoryView":1310 - * src = tmp - * - * if not broadcasting: # <<<<<<<<<<<<<< - * + /* "View.MemoryView":1407 * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) nogil: */ - __pyx_t_2 = ((!(__pyx_v_broadcasting != 0)) != 0); - if (__pyx_t_2) { - /* "View.MemoryView":1313 - * - * - * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): - */ - __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim) != 0); - if (__pyx_t_2) { + /* function exit code */ +} - /* "View.MemoryView":1314 - * - * if slice_is_contig(src, 'C', ndim): - * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< - * elif slice_is_contig(src, 'F', ndim): - * direct_copy = slice_is_contig(dst, 'F', ndim) +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result */ - __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); - /* "View.MemoryView":1313 - * - * - * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): - */ - goto __pyx_L12; +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); - /* "View.MemoryView":1315 - * if slice_is_contig(src, 'C', ndim): - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< - * direct_copy = slice_is_contig(dst, 'F', ndim) - * - */ - __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim) != 0); - if (__pyx_t_2) { + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "View.MemoryView":1316 - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): - * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< - * - * if direct_copy: - */ - __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 0); - /* "View.MemoryView":1315 - * if slice_is_contig(src, 'C', ndim): - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< - * direct_copy = slice_is_contig(dst, 'F', ndim) - * + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) */ - } - __pyx_L12:; + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xb068931) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":1318 - * direct_copy = slice_is_contig(dst, 'F', ndim) - * - * if direct_copy: # <<<<<<<<<<<<<< - * - * refcount_copying(&dst, dtype_is_object, ndim, False) - */ - __pyx_t_2 = (__pyx_v_direct_copy != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1320 - * if direct_copy: - * - * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< - * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) - * refcount_copying(&dst, dtype_is_object, ndim, True) - */ - __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - - /* "View.MemoryView":1321 - * - * refcount_copying(&dst, dtype_is_object, ndim, False) - * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< - * refcount_copying(&dst, dtype_is_object, ndim, True) - * free(tmpdata) - */ - (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); - - /* "View.MemoryView":1322 - * refcount_copying(&dst, dtype_is_object, ndim, False) - * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) - * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< - * free(tmpdata) - * return 0 - */ - __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - - /* "View.MemoryView":1323 - * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) - * refcount_copying(&dst, dtype_is_object, ndim, True) - * free(tmpdata) # <<<<<<<<<<<<<< - * return 0 - * - */ - free(__pyx_v_tmpdata); - - /* "View.MemoryView":1324 - * refcount_copying(&dst, dtype_is_object, ndim, True) - * free(tmpdata) - * return 0 # <<<<<<<<<<<<<< - * - * if order == 'F' == get_best_order(&dst, ndim): + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) */ - __pyx_r = 0; - goto __pyx_L0; + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":1318 - * direct_copy = slice_is_contig(dst, 'F', ndim) - * - * if direct_copy: # <<<<<<<<<<<<<< - * - * refcount_copying(&dst, dtype_is_object, ndim, False) + /* "(tree fragment)":6 + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } } + __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) - /* "View.MemoryView":1310 - * src = tmp - * - * if not broadcasting: # <<<<<<<<<<<<<< - * - * + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) */ } - /* "View.MemoryView":1326 - * return 0 - * - * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< - * - * + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) */ - __pyx_t_2 = (__pyx_v_order == 'F'); - if (__pyx_t_2) { - __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } } - __pyx_t_8 = (__pyx_t_2 != 0); - if (__pyx_t_8) { + __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; - /* "View.MemoryView":1329 - * - * - * transpose_memslice(&src) # <<<<<<<<<<<<<< - * transpose_memslice(&dst) - * + /* "(tree fragment)":8 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result */ - __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1329, __pyx_L1_error) + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_6 = (__pyx_t_1 != 0); + if (__pyx_t_6) { - /* "View.MemoryView":1330 - * - * transpose_memslice(&src) - * transpose_memslice(&dst) # <<<<<<<<<<<<<< - * - * refcount_copying(&dst, dtype_is_object, ndim, False) + /* "(tree fragment)":9 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): */ - __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1330, __pyx_L1_error) + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_3 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":1326 - * return 0 - * - * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< - * - * + /* "(tree fragment)":8 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result */ } - /* "View.MemoryView":1332 - * transpose_memslice(&dst) - * - * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< - * copy_strided_to_strided(&src, &dst, ndim, itemsize) - * refcount_copying(&dst, dtype_is_object, ndim, True) - */ - __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - - /* "View.MemoryView":1333 - * - * refcount_copying(&dst, dtype_is_object, ndim, False) - * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< - * refcount_copying(&dst, dtype_is_object, ndim, True) - * - */ - copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); - - /* "View.MemoryView":1334 - * refcount_copying(&dst, dtype_is_object, ndim, False) - * copy_strided_to_strided(&src, &dst, ndim, itemsize) - * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< - * - * free(tmpdata) - */ - __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - - /* "View.MemoryView":1336 - * refcount_copying(&dst, dtype_is_object, ndim, True) - * - * free(tmpdata) # <<<<<<<<<<<<<< - * return 0 - * - */ - free(__pyx_v_tmpdata); - - /* "View.MemoryView":1337 - * - * free(tmpdata) - * return 0 # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_broadcast_leading') + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] */ - __pyx_r = 0; + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; - /* "View.MemoryView":1268 - * - * @cname('__pyx_memoryview_copy_contents') - * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice dst, - * int src_ndim, int dst_ndim, + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; - { - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - } - __pyx_r = -1; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":1340 - * - * @cname('__pyx_memoryview_broadcast_leading') - * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< - * int ndim, - * int ndim_other) nogil: +/* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): */ -static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { - int __pyx_v_i; - int __pyx_v_offset; - int __pyx_t_1; +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; int __pyx_t_2; - int __pyx_t_3; - - /* "View.MemoryView":1344 - * int ndim_other) nogil: - * cdef int i - * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< - * - * for i in range(ndim - 1, -1, -1): - */ - __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); - - /* "View.MemoryView":1346 - * cdef int offset = ndim_other - ndim - * - * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< - * mslice.shape[i + offset] = mslice.shape[i] - * mslice.strides[i + offset] = mslice.strides[i] - */ - for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { - __pyx_v_i = __pyx_t_1; - - /* "View.MemoryView":1347 - * - * for i in range(ndim - 1, -1, -1): - * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< - * mslice.strides[i + offset] = mslice.strides[i] - * mslice.suboffsets[i + offset] = mslice.suboffsets[i] - */ - (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); - - /* "View.MemoryView":1348 - * for i in range(ndim - 1, -1, -1): - * mslice.shape[i + offset] = mslice.shape[i] - * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< - * mslice.suboffsets[i + offset] = mslice.suboffsets[i] - * - */ - (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 0); - /* "View.MemoryView":1349 - * mslice.shape[i + offset] = mslice.shape[i] - * mslice.strides[i + offset] = mslice.strides[i] - * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< - * - * for i in range(offset): + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) */ - (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; - /* "View.MemoryView":1351 - * mslice.suboffsets[i + offset] = mslice.suboffsets[i] - * - * for i in range(offset): # <<<<<<<<<<<<<< - * mslice.shape[i] = 1 - * mslice.strides[i] = mslice.strides[0] - */ - __pyx_t_1 = __pyx_v_offset; - __pyx_t_2 = __pyx_t_1; - for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { - __pyx_v_i = __pyx_t_3; - - /* "View.MemoryView":1352 - * - * for i in range(offset): - * mslice.shape[i] = 1 # <<<<<<<<<<<<<< - * mslice.strides[i] = mslice.strides[0] - * mslice.suboffsets[i] = -1 - */ - (__pyx_v_mslice->shape[__pyx_v_i]) = 1; - - /* "View.MemoryView":1353 - * for i in range(offset): - * mslice.shape[i] = 1 - * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< - * mslice.suboffsets[i] = -1 - * - */ - (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); - - /* "View.MemoryView":1354 - * mslice.shape[i] = 1 - * mslice.strides[i] = mslice.strides[0] - * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< - * - * + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) */ - (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) } + __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = ((__pyx_t_3 > 1) != 0); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 != 0); + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { - /* "View.MemoryView":1340 - * - * @cname('__pyx_memoryview_broadcast_leading') - * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< - * int ndim, - * int ndim_other) nogil: - */ - - /* function exit code */ -} - -/* "View.MemoryView":1362 - * - * @cname('__pyx_memoryview_refcount_copying') - * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< - * int ndim, bint inc) nogil: - * - */ - -static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { - int __pyx_t_1; - - /* "View.MemoryView":1366 - * - * - * if dtype_is_object: # <<<<<<<<<<<<<< - * refcount_objects_in_slice_with_gil(dst.data, dst.shape, - * dst.strides, ndim, inc) - */ - __pyx_t_1 = (__pyx_v_dtype_is_object != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1367 - * - * if dtype_is_object: - * refcount_objects_in_slice_with_gil(dst.data, dst.shape, # <<<<<<<<<<<<<< - * dst.strides, ndim, inc) - * + /* "(tree fragment)":14 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< */ - __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":1366 - * - * - * if dtype_is_object: # <<<<<<<<<<<<<< - * refcount_objects_in_slice_with_gil(dst.data, dst.shape, - * dst.strides, ndim, inc) + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) */ } - /* "View.MemoryView":1362 - * - * @cname('__pyx_memoryview_refcount_copying') - * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< - * int ndim, bint inc) nogil: - * + /* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; } - -/* "View.MemoryView":1371 - * - * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') - * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, - * bint inc) with gil: - */ - -static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { - __Pyx_RefNannyDeclarations - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_RefNannySetupContext("refcount_objects_in_slice_with_gil", 0); - - /* "View.MemoryView":1374 - * Py_ssize_t *strides, int ndim, - * bint inc) with gil: - * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_refcount_objects_in_slice') - */ - __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); - - /* "View.MemoryView":1371 - * - * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') - * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, - * bint inc) with gil: - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif -} - -/* "View.MemoryView":1377 - * - * @cname('__pyx_memoryview_refcount_objects_in_slice') - * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, bint inc): - * cdef Py_ssize_t i - */ - -static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { - CYTHON_UNUSED Py_ssize_t __pyx_v_i; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - Py_ssize_t __pyx_t_2; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - __Pyx_RefNannySetupContext("refcount_objects_in_slice", 0); - - /* "View.MemoryView":1381 - * cdef Py_ssize_t i - * - * for i in range(shape[0]): # <<<<<<<<<<<<<< - * if ndim == 1: - * if inc: - */ - __pyx_t_1 = (__pyx_v_shape[0]); - __pyx_t_2 = __pyx_t_1; - for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { - __pyx_v_i = __pyx_t_3; - - /* "View.MemoryView":1382 - * - * for i in range(shape[0]): - * if ndim == 1: # <<<<<<<<<<<<<< - * if inc: - * Py_INCREF(( data)[0]) - */ - __pyx_t_4 = ((__pyx_v_ndim == 1) != 0); - if (__pyx_t_4) { - - /* "View.MemoryView":1383 - * for i in range(shape[0]): - * if ndim == 1: - * if inc: # <<<<<<<<<<<<<< - * Py_INCREF(( data)[0]) - * else: - */ - __pyx_t_4 = (__pyx_v_inc != 0); - if (__pyx_t_4) { - - /* "View.MemoryView":1384 - * if ndim == 1: - * if inc: - * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< - * else: - * Py_DECREF(( data)[0]) - */ - Py_INCREF((((PyObject **)__pyx_v_data)[0])); - - /* "View.MemoryView":1383 - * for i in range(shape[0]): - * if ndim == 1: - * if inc: # <<<<<<<<<<<<<< - * Py_INCREF(( data)[0]) - * else: - */ - goto __pyx_L6; - } - - /* "View.MemoryView":1386 - * Py_INCREF(( data)[0]) - * else: - * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< - * else: - * refcount_objects_in_slice(data, shape + 1, strides + 1, - */ - /*else*/ { - Py_DECREF((((PyObject **)__pyx_v_data)[0])); - } - __pyx_L6:; - - /* "View.MemoryView":1382 - * - * for i in range(shape[0]): - * if ndim == 1: # <<<<<<<<<<<<<< - * if inc: - * Py_INCREF(( data)[0]) - */ - goto __pyx_L5; - } - - /* "View.MemoryView":1388 - * Py_DECREF(( data)[0]) - * else: - * refcount_objects_in_slice(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< - * ndim - 1, inc) - * - */ - /*else*/ { - - /* "View.MemoryView":1389 - * else: - * refcount_objects_in_slice(data, shape + 1, strides + 1, - * ndim - 1, inc) # <<<<<<<<<<<<<< - * - * data += strides[0] - */ - __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); - } - __pyx_L5:; - - /* "View.MemoryView":1391 - * ndim - 1, inc) - * - * data += strides[0] # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_data = (__pyx_v_data + (__pyx_v_strides[0])); - } - - /* "View.MemoryView":1377 - * - * @cname('__pyx_memoryview_refcount_objects_in_slice') - * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, bint inc): - * cdef Py_ssize_t i - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "View.MemoryView":1397 - * - * @cname('__pyx_memoryview_slice_assign_scalar') - * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< - * size_t itemsize, void *item, - * bint dtype_is_object) nogil: - */ - -static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { - - /* "View.MemoryView":1400 - * size_t itemsize, void *item, - * bint dtype_is_object) nogil: - * refcount_copying(dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< - * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, - * itemsize, item) - */ - __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - - /* "View.MemoryView":1401 - * bint dtype_is_object) nogil: - * refcount_copying(dst, dtype_is_object, ndim, False) - * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, # <<<<<<<<<<<<<< - * itemsize, item) - * refcount_copying(dst, dtype_is_object, ndim, True) - */ - __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); - - /* "View.MemoryView":1403 - * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, - * itemsize, item) - * refcount_copying(dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< - * - * - */ - __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - - /* "View.MemoryView":1397 - * - * @cname('__pyx_memoryview_slice_assign_scalar') - * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< - * size_t itemsize, void *item, - * bint dtype_is_object) nogil: - */ - - /* function exit code */ -} - -/* "View.MemoryView":1407 - * - * @cname('__pyx_memoryview__slice_assign_scalar') - * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, - * size_t itemsize, void *item) nogil: - */ - -static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { - CYTHON_UNUSED Py_ssize_t __pyx_v_i; - Py_ssize_t __pyx_v_stride; - Py_ssize_t __pyx_v_extent; - int __pyx_t_1; - Py_ssize_t __pyx_t_2; - Py_ssize_t __pyx_t_3; - Py_ssize_t __pyx_t_4; - - /* "View.MemoryView":1411 - * size_t itemsize, void *item) nogil: - * cdef Py_ssize_t i - * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< - * cdef Py_ssize_t extent = shape[0] - * - */ - __pyx_v_stride = (__pyx_v_strides[0]); - - /* "View.MemoryView":1412 - * cdef Py_ssize_t i - * cdef Py_ssize_t stride = strides[0] - * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< - * - * if ndim == 1: - */ - __pyx_v_extent = (__pyx_v_shape[0]); - - /* "View.MemoryView":1414 - * cdef Py_ssize_t extent = shape[0] - * - * if ndim == 1: # <<<<<<<<<<<<<< - * for i in range(extent): - * memcpy(data, item, itemsize) - */ - __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1415 - * - * if ndim == 1: - * for i in range(extent): # <<<<<<<<<<<<<< - * memcpy(data, item, itemsize) - * data += stride - */ - __pyx_t_2 = __pyx_v_extent; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; - - /* "View.MemoryView":1416 - * if ndim == 1: - * for i in range(extent): - * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< - * data += stride - * else: - */ - (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); - - /* "View.MemoryView":1417 - * for i in range(extent): - * memcpy(data, item, itemsize) - * data += stride # <<<<<<<<<<<<<< - * else: - * for i in range(extent): - */ - __pyx_v_data = (__pyx_v_data + __pyx_v_stride); - } - - /* "View.MemoryView":1414 - * cdef Py_ssize_t extent = shape[0] - * - * if ndim == 1: # <<<<<<<<<<<<<< - * for i in range(extent): - * memcpy(data, item, itemsize) - */ - goto __pyx_L3; - } - - /* "View.MemoryView":1419 - * data += stride - * else: - * for i in range(extent): # <<<<<<<<<<<<<< - * _slice_assign_scalar(data, shape + 1, strides + 1, - * ndim - 1, itemsize, item) - */ - /*else*/ { - __pyx_t_2 = __pyx_v_extent; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; - - /* "View.MemoryView":1420 - * else: - * for i in range(extent): - * _slice_assign_scalar(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< - * ndim - 1, itemsize, item) - * data += stride - */ - __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); - - /* "View.MemoryView":1422 - * _slice_assign_scalar(data, shape + 1, strides + 1, - * ndim - 1, itemsize, item) - * data += stride # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_data = (__pyx_v_data + __pyx_v_stride); - } - } - __pyx_L3:; - - /* "View.MemoryView":1407 - * - * @cname('__pyx_memoryview__slice_assign_scalar') - * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, - * size_t itemsize, void *item) nogil: - */ - - /* function exit code */ -} - -/* "(tree fragment)":1 - * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v___pyx_type = 0; - long __pyx_v___pyx_checksum; - PyObject *__pyx_v___pyx_state = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; - PyObject* values[3] = {0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - } - __pyx_v___pyx_type = values[0]; - __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) - __pyx_v___pyx_state = values[2]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 1, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_v___pyx_PickleError = 0; - PyObject *__pyx_v___pyx_result = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_t_6; - __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 0); - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - */ - __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xb068931) != 0); - if (__pyx_t_1) { - - /* "(tree fragment)":5 - * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: - * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - * __pyx_result = Enum.__new__(__pyx_type) - */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_PickleError); - __Pyx_GIVEREF(__pyx_n_s_PickleError); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); - __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_t_2); - __pyx_v___pyx_PickleError = __pyx_t_2; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":6 - * if __pyx_checksum != 0xb068931: - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) # <<<<<<<<<<<<<< - * __pyx_result = Enum.__new__(__pyx_type) - * if __pyx_state is not None: - */ - __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_INCREF(__pyx_v___pyx_PickleError); - __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 6, __pyx_L1_error) - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - */ - } - - /* "(tree fragment)":7 - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< - * if __pyx_state is not None: - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v___pyx_result = __pyx_t_3; - __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - * __pyx_result = Enum.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - __pyx_t_1 = (__pyx_v___pyx_state != Py_None); - __pyx_t_6 = (__pyx_t_1 != 0); - if (__pyx_t_6) { - - /* "(tree fragment)":9 - * __pyx_result = Enum.__new__(__pyx_type) - * if __pyx_state is not None: - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< - * return __pyx_result - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 9, __pyx_L1_error) - __pyx_t_3 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - * __pyx_result = Enum.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - } - - /* "(tree fragment)":10 - * if __pyx_state is not None: - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result # <<<<<<<<<<<<<< - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0] - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v___pyx_result); - __pyx_r = __pyx_v___pyx_result; - goto __pyx_L0; - - /* "(tree fragment)":1 - * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v___pyx_PickleError); - __Pyx_XDECREF(__pyx_v___pyx_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":11 - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): - */ - -static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 0); - - /* "(tree fragment)":12 - * return __pyx_result - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[1]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(2, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->name); - __Pyx_DECREF(__pyx_v___pyx_result->name); - __pyx_v___pyx_result->name = __pyx_t_1; - __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[1]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(2, 13, __pyx_L1_error) - } - __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) - __pyx_t_4 = ((__pyx_t_3 > 1) != 0); - if (__pyx_t_4) { - } else { - __pyx_t_2 = __pyx_t_4; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) - __pyx_t_5 = (__pyx_t_4 != 0); - __pyx_t_2 = __pyx_t_5; - __pyx_L4_bool_binop_done:; - if (__pyx_t_2) { - - /* "(tree fragment)":14 - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< - */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(2, 14, __pyx_L1_error) - } - __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_8)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_8); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - } - } - __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[1]) - */ - } - - /* "(tree fragment)":11 - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} -static struct __pyx_vtabstruct_array __pyx_vtable_array; +static struct __pyx_vtabstruct_array __pyx_vtable_array; static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_array_obj *p; @@ -18446,7 +16285,7 @@ static PyBufferProcs __pyx_tp_as_buffer_array = { static PyTypeObject __pyx_type___pyx_array = { PyVarObject_HEAD_INIT(0, 0) - "indicators.array", /*tp_name*/ + "test.array", /*tp_name*/ sizeof(struct __pyx_array_obj), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_array, /*tp_dealloc*/ @@ -18565,7 +16404,7 @@ static PyMethodDef __pyx_methods_Enum[] = { static PyTypeObject __pyx_type___pyx_MemviewEnum = { PyVarObject_HEAD_INIT(0, 0) - "indicators.Enum", /*tp_name*/ + "test.Enum", /*tp_name*/ sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_Enum, /*tp_dealloc*/ @@ -18826,7 +16665,7 @@ static PyBufferProcs __pyx_tp_as_buffer_memoryview = { static PyTypeObject __pyx_type___pyx_memoryview = { PyVarObject_HEAD_INIT(0, 0) - "indicators.memoryview", /*tp_name*/ + "test.memoryview", /*tp_name*/ sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ @@ -18964,7 +16803,7 @@ static struct PyGetSetDef __pyx_getsets__memoryviewslice[] = { static PyTypeObject __pyx_type___pyx_memoryviewslice = { PyVarObject_HEAD_INIT(0, 0) - "indicators._memoryviewslice", /*tp_name*/ + "test._memoryviewslice", /*tp_name*/ sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ @@ -19040,32 +16879,28 @@ static PyTypeObject __pyx_type___pyx_memoryviewslice = { }; static PyMethodDef __pyx_methods[] = { - {"SMA", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_1SMA, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_SMA}, - {"SDV", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_3SDV, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_2SDV}, - {"FIB", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_5FIB, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_4FIB}, - {"BOLINGER_BANDS", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_7BOLINGER_BANDS, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_6BOLINGER_BANDS}, - {"MOMENTUM", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_9MOMENTUM, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_8MOMENTUM}, - {"WMA", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_11WMA, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_10WMA}, - {"DERIVATIVE", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_13DERIVATIVE, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_12DERIVATIVE}, - {"EMA", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_15EMA, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_14EMA}, - {"FIB_BANDS", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10indicators_17FIB_BANDS, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10indicators_16FIB_BANDS}, + {"SMA", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4test_1SMA, METH_VARARGS|METH_KEYWORDS, 0}, + {"UPTREND", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4test_3UPTREND, METH_VARARGS|METH_KEYWORDS, 0}, + {"FIB", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4test_5FIB, METH_VARARGS|METH_KEYWORDS, 0}, + {"BOLINGER_BANDES", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4test_7BOLINGER_BANDES, METH_VARARGS|METH_KEYWORDS, 0}, + {"MOMENTUM", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4test_9MOMENTUM, METH_VARARGS|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec_indicators(PyObject* module); /*proto*/ +static int __pyx_pymod_exec_test(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec_indicators}, + {Py_mod_exec, (void*)__pyx_pymod_exec_test}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, - "indicators", + "test", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ @@ -19118,24 +16953,21 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, - {&__pyx_n_s_alpha, __pyx_k_alpha, sizeof(__pyx_k_alpha), 0, 0, 1, 1}, {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_candles, __pyx_k_candles, sizeof(__pyx_k_candles), 0, 0, 1, 1}, {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1}, {&__pyx_n_s_closes, __pyx_k_closes, sizeof(__pyx_k_closes), 0, 0, 1, 1}, {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, - {&__pyx_n_s_diff, __pyx_k_diff, sizeof(__pyx_k_diff), 0, 0, 1, 1}, {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, - {&__pyx_n_s_end, __pyx_k_end, sizeof(__pyx_k_end), 0, 0, 1, 1}, {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, - {&__pyx_n_s_epsilon, __pyx_k_epsilon, sizeof(__pyx_k_epsilon), 0, 0, 1, 1}, {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, - {&__pyx_n_s_file, __pyx_k_file, sizeof(__pyx_k_file), 0, 0, 1, 1}, {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, @@ -19149,23 +16981,18 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, - {&__pyx_n_s_numberOfSDV, __pyx_k_numberOfSDV, sizeof(__pyx_k_numberOfSDV), 0, 0, 1, 1}, {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, - {&__pyx_kp_s_out_of_range_alpha_s, __pyx_k_out_of_range_alpha_s, sizeof(__pyx_k_out_of_range_alpha_s), 0, 0, 1, 0}, - {&__pyx_kp_s_out_of_range_epsilon_s, __pyx_k_out_of_range_epsilon_s, sizeof(__pyx_k_out_of_range_epsilon_s), 0, 0, 1, 0}, - {&__pyx_kp_s_out_of_range_period_s, __pyx_k_out_of_range_period_s, sizeof(__pyx_k_out_of_range_period_s), 0, 0, 1, 0}, - {&__pyx_kp_s_out_of_range_period_s_2, __pyx_k_out_of_range_period_s_2, sizeof(__pyx_k_out_of_range_period_s_2), 0, 0, 1, 0}, {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, {&__pyx_n_s_period, __pyx_k_period, sizeof(__pyx_k_period), 0, 0, 1, 1}, {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, - {&__pyx_n_s_print, __pyx_k_print, sizeof(__pyx_k_print), 0, 0, 1, 1}, {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, {&__pyx_n_s_pyx_getbuffer, __pyx_k_pyx_getbuffer, sizeof(__pyx_k_pyx_getbuffer), 0, 0, 1, 1}, @@ -19195,26 +17022,23 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, - {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1}, - {&__pyx_n_s_weightedFactor, __pyx_k_weightedFactor, sizeof(__pyx_k_weightedFactor), 0, 0, 1, 1}, {&__pyx_n_s_xrange, __pyx_k_xrange, sizeof(__pyx_k_xrange), 0, 0, 1, 1}, - {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { #if PY_MAJOR_VERSION >= 3 - __pyx_builtin_xrange = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_xrange) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_builtin_xrange = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_xrange) __PYX_ERR(0, 7, __pyx_L1_error) #else - __pyx_builtin_xrange = __Pyx_GetBuiltinName(__pyx_n_s_xrange); if (!__pyx_builtin_xrange) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_builtin_xrange = __Pyx_GetBuiltinName(__pyx_n_s_xrange); if (!__pyx_builtin_xrange) __PYX_ERR(0, 7, __pyx_L1_error) #endif - __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(1, 109, __pyx_L1_error) - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(2, 133, __pyx_L1_error) - __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(2, 151, __pyx_L1_error) - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(2, 180, __pyx_L1_error) - __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(2, 2, __pyx_L1_error) - __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(2, 404, __pyx_L1_error) - __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(2, 613, __pyx_L1_error) - __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(2, 832, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 133, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(1, 148, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 151, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(1, 180, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(1, 404, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(1, 613, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 832, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; @@ -19231,7 +17055,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * if itemsize <= 0: */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple_)) __PYX_ERR(2, 133, __pyx_L1_error) + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 133, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); @@ -19242,7 +17066,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * if not isinstance(format, bytes): */ - __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(2, 136, __pyx_L1_error) + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 136, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); @@ -19253,7 +17077,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * */ - __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(2, 148, __pyx_L1_error) + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(1, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); @@ -19264,7 +17088,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * if self.dtype_is_object: */ - __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(2, 176, __pyx_L1_error) + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 176, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); @@ -19275,7 +17099,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * info.buf = self.data * info.len = self.len */ - __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(2, 192, __pyx_L1_error) + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 192, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); @@ -19285,7 +17109,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); @@ -19294,7 +17118,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); @@ -19305,7 +17129,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * have_slices, index = _unellipsify(index, self.view.ndim) */ - __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(2, 418, __pyx_L1_error) + __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); @@ -19316,7 +17140,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * else: * if len(self.view.format) == 1: */ - __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 495, __pyx_L1_error) + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 495, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); @@ -19327,7 +17151,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * if flags & PyBUF_ND: */ - __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 520, __pyx_L1_error) + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 520, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); @@ -19338,7 +17162,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) */ - __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(2, 570, __pyx_L1_error) + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 570, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11); @@ -19349,7 +17173,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) */ - __pyx_tuple__12 = PyTuple_New(1); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(2, 577, __pyx_L1_error) + __pyx_tuple__12 = PyTuple_New(1); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 577, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__12); __Pyx_INCREF(__pyx_int_neg_1); __Pyx_GIVEREF(__pyx_int_neg_1); @@ -19362,7 +17186,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__13); __Pyx_GIVEREF(__pyx_tuple__13); @@ -19371,7 +17195,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__14); __Pyx_GIVEREF(__pyx_tuple__14); @@ -19382,7 +17206,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * seen_ellipsis = True * else: */ - __pyx_slice__15 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__15)) __PYX_ERR(2, 682, __pyx_L1_error) + __pyx_slice__15 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__15)) __PYX_ERR(1, 682, __pyx_L1_error) __Pyx_GOTREF(__pyx_slice__15); __Pyx_GIVEREF(__pyx_slice__15); @@ -19393,7 +17217,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * */ - __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(2, 703, __pyx_L1_error) + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 703, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__16); __Pyx_GIVEREF(__pyx_tuple__16); @@ -19403,7 +17227,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__17); __Pyx_GIVEREF(__pyx_tuple__17); @@ -19412,7 +17236,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__18); __Pyx_GIVEREF(__pyx_tuple__18); @@ -19423,7 +17247,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * cdef strided = Enum("") # default * cdef indirect = Enum("") */ - __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(2, 286, __pyx_L1_error) + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 286, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__19); __Pyx_GIVEREF(__pyx_tuple__19); @@ -19434,7 +17258,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * cdef indirect = Enum("") * */ - __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(2, 287, __pyx_L1_error) + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 287, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__20); __Pyx_GIVEREF(__pyx_tuple__20); @@ -19445,7 +17269,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * */ - __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(2, 288, __pyx_L1_error) + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 288, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__21); __Pyx_GIVEREF(__pyx_tuple__21); @@ -19456,7 +17280,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * cdef indirect_contiguous = Enum("") * */ - __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(2, 291, __pyx_L1_error) + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 291, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__22); __Pyx_GIVEREF(__pyx_tuple__22); @@ -19467,7 +17291,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * */ - __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(2, 292, __pyx_L1_error) + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 292, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__23); __Pyx_GIVEREF(__pyx_tuple__23); @@ -19476,10 +17300,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * cdef object __pyx_PickleError * cdef object __pyx_result */ - __pyx_tuple__24 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_tuple__24 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__24); __Pyx_GIVEREF(__pyx_tuple__24); - __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -19489,9 +17313,9 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - __pyx_float_0_0 = PyFloat_FromDouble(0.0); if (unlikely(!__pyx_float_0_0)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; @@ -19542,21 +17366,21 @@ static int __Pyx_modinit_type_init_code(void) { /*--- Type init code ---*/ __pyx_vtabptr_array = &__pyx_vtable_array; __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; - if (PyType_Ready(&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) + if (PyType_Ready(&__pyx_type___pyx_array) < 0) __PYX_ERR(1, 105, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type___pyx_array.tp_print = 0; #endif - if (__Pyx_SetVtable(__pyx_type___pyx_array.tp_dict, __pyx_vtabptr_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_type___pyx_array.tp_dict, __pyx_vtabptr_array) < 0) __PYX_ERR(1, 105, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_array) < 0) __PYX_ERR(1, 105, __pyx_L1_error) __pyx_array_type = &__pyx_type___pyx_array; - if (PyType_Ready(&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 279, __pyx_L1_error) + if (PyType_Ready(&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(1, 279, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type___pyx_MemviewEnum.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_MemviewEnum.tp_dictoffset && __pyx_type___pyx_MemviewEnum.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type___pyx_MemviewEnum.tp_getattro = __Pyx_PyObject_GenericGetAttr; } - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 279, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(1, 279, __pyx_L1_error) __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; @@ -19566,30 +17390,30 @@ static int __Pyx_modinit_type_init_code(void) { __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; - if (PyType_Ready(&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) + if (PyType_Ready(&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(1, 330, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type___pyx_memoryview.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryview.tp_dictoffset && __pyx_type___pyx_memoryview.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type___pyx_memoryview.tp_getattro = __Pyx_PyObject_GenericGetAttr; } - if (__Pyx_SetVtable(__pyx_type___pyx_memoryview.tp_dict, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_type___pyx_memoryview.tp_dict, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(1, 330, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(1, 330, __pyx_L1_error) __pyx_memoryview_type = &__pyx_type___pyx_memoryview; __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; __pyx_type___pyx_memoryviewslice.tp_base = __pyx_memoryview_type; - if (PyType_Ready(&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) + if (PyType_Ready(&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(1, 965, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type___pyx_memoryviewslice.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryviewslice.tp_dictoffset && __pyx_type___pyx_memoryviewslice.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type___pyx_memoryviewslice.tp_getattro = __Pyx_PyObject_GenericGetAttr; } - if (__Pyx_SetVtable(__pyx_type___pyx_memoryviewslice.tp_dict, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_type___pyx_memoryviewslice.tp_dict, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(1, 965, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(1, 965, __pyx_L1_error) __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; __Pyx_RefNannyFinishContext(); return 0; @@ -19600,41 +17424,10 @@ static int __Pyx_modinit_type_init_code(void) { static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", - #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), - #else - sizeof(PyHeapTypeObject), - #endif - __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(4, 8, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(5, 15, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule("array"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 58, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_5array_array = __Pyx_ImportType(__pyx_t_1, "array", "array", sizeof(arrayobject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_5array_array) __PYX_ERR(1, 58, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_RefNannyFinishContext(); - return -1; } static int __Pyx_modinit_variable_import_code(void) { @@ -19670,11 +17463,11 @@ static int __Pyx_modinit_function_import_code(void) { #if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC initindicators(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC initindicators(void) +__Pyx_PyMODINIT_FUNC inittest(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC inittest(void) #else -__Pyx_PyMODINIT_FUNC PyInit_indicators(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit_indicators(void) +__Pyx_PyMODINIT_FUNC PyInit_test(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_test(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); @@ -19741,7 +17534,7 @@ static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNU } -static CYTHON_SMALL_CODE int __pyx_pymod_exec_indicators(PyObject *__pyx_pyinit_module) +static CYTHON_SMALL_CODE int __pyx_pymod_exec_test(PyObject *__pyx_pyinit_module) #endif #endif { @@ -19751,7 +17544,7 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_indicators(PyObject *__pyx_pyinit_ #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module 'indicators' has already been imported. Re-initialisation is not supported."); + PyErr_SetString(PyExc_RuntimeError, "Module 'test' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 @@ -19766,7 +17559,7 @@ if (!__Pyx_RefNanny) { Py_FatalError("failed to import 'refnanny' module"); } #endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_indicators(void)", 0); + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_test(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); @@ -19805,7 +17598,7 @@ if (!__Pyx_RefNanny) { Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("indicators", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + __pyx_m = Py_InitModule4("test", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif @@ -19823,14 +17616,14 @@ if (!__Pyx_RefNanny) { #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif - if (__pyx_module_is_main_indicators) { + if (__pyx_module_is_main_test) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name_2, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "indicators")) { - if (unlikely(PyDict_SetItemString(modules, "indicators", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "test")) { + if (unlikely(PyDict_SetItemString(modules, "test", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif @@ -19843,7 +17636,7 @@ if (!__Pyx_RefNanny) { (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); if (unlikely(__Pyx_modinit_type_init_code() != 0)) goto __pyx_L1_error; - if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; + (void)__Pyx_modinit_type_import_code(); (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ @@ -19853,20 +17646,20 @@ if (!__Pyx_RefNanny) { /* "indicators.pyx":1 * import numpy as np # <<<<<<<<<<<<<< - * from libc.math cimport sqrt - * from libc.stdlib cimport malloc, free + * + * cpdef SMA(double[:] closes, int period): */ __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "indicators.pyx":160 + /* "indicators.pyx":62 * * - * cpdef (float, float, float, float, float, float, float, float, float) FIB_BANDS(double[:] closes, int period): # <<<<<<<<<<<<<< - * """ - * Fibonacci Bolinger Bands function ... does retracements between ma/upper-band & ma/lower-band + * cpdef MOMENTUM(double [:] closes, int period): # <<<<<<<<<<<<<< + * cdef length = closes.shape[0] + * return closes[length] - closes[length-period] */ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); @@ -19880,9 +17673,9 @@ if (!__Pyx_RefNanny) { * * def __dealloc__(array self): */ - __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_array_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 209, __pyx_L1_error) + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_array_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem((PyObject *)__pyx_array_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 209, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_array_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(1, 209, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; PyType_Modified(__pyx_array_type); @@ -19893,7 +17686,7 @@ if (!__Pyx_RefNanny) { * cdef strided = Enum("") # default * cdef indirect = Enum("") */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 286, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 286, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(generic); __Pyx_DECREF_SET(generic, __pyx_t_1); @@ -19907,7 +17700,7 @@ if (!__Pyx_RefNanny) { * cdef indirect = Enum("") * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 287, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 287, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(strided); __Pyx_DECREF_SET(strided, __pyx_t_1); @@ -19921,7 +17714,7 @@ if (!__Pyx_RefNanny) { * * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 288, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 288, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(indirect); __Pyx_DECREF_SET(indirect, __pyx_t_1); @@ -19935,7 +17728,7 @@ if (!__Pyx_RefNanny) { * cdef indirect_contiguous = Enum("") * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 291, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 291, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(contiguous); __Pyx_DECREF_SET(contiguous, __pyx_t_1); @@ -19949,7 +17742,7 @@ if (!__Pyx_RefNanny) { * * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 292, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 292, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(indirect_contiguous); __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_1); @@ -19989,9 +17782,9 @@ if (!__Pyx_RefNanny) { * * */ - __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 549, __pyx_L1_error) + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 549, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem((PyObject *)__pyx_memoryview_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 549, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_memoryview_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(1, 549, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; PyType_Modified(__pyx_memoryview_type); @@ -20002,9 +17795,9 @@ if (!__Pyx_RefNanny) { * * */ - __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 995, __pyx_L1_error) + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 995, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem((PyObject *)__pyx_memoryviewslice_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 995, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_memoryviewslice_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(1, 995, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; PyType_Modified(__pyx_memoryviewslice_type); @@ -20013,9 +17806,9 @@ if (!__Pyx_RefNanny) { * cdef object __pyx_PickleError * cdef object __pyx_result */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_1) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":11 @@ -20033,11 +17826,11 @@ if (!__Pyx_RefNanny) { __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { if (__pyx_d) { - __Pyx_AddTraceback("init indicators", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("init test", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init indicators"); + PyErr_SetString(PyExc_ImportError, "init test"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); @@ -20077,95 +17870,29 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* BufferIndexError */ -static void __Pyx_RaiseBufferIndexError(int axis) { - PyErr_Format(PyExc_IndexError, - "Out of bounds on buffer access (axis %d)", axis); -} - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; +#endif + return PyObject_GetAttr(obj, attr_name); } #endif -/* WriteUnraisableException */ -static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, - CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, - int full_traceback, CYTHON_UNUSED int nogil) { - PyObject *old_exc, *old_val, *old_tb; - PyObject *ctx; - __Pyx_PyThreadState_declare -#ifdef WITH_THREAD - PyGILState_STATE state; - if (nogil) - state = PyGILState_Ensure(); -#ifdef _MSC_VER - else state = (PyGILState_STATE)-1; -#endif +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); - if (full_traceback) { - Py_XINCREF(old_exc); - Py_XINCREF(old_val); - Py_XINCREF(old_tb); - __Pyx_ErrRestore(old_exc, old_val, old_tb); - PyErr_PrintEx(1); } - #if PY_MAJOR_VERSION < 3 - ctx = PyString_FromString(name); - #else - ctx = PyUnicode_FromString(name); - #endif - __Pyx_ErrRestore(old_exc, old_val, old_tb); - if (!ctx) { - PyErr_WriteUnraisable(Py_None); - } else { - PyErr_WriteUnraisable(ctx); - Py_DECREF(ctx); - } -#ifdef WITH_THREAD - if (nogil) - PyGILState_Release(state); -#endif + return result; +} + +/* BufferIndexError */ +static void __Pyx_RaiseBufferIndexError(int axis) { + PyErr_Format(PyExc_IndexError, + "Out of bounds on buffer access (axis %d)", axis); } /* RaiseArgTupleInvalid */ @@ -20425,630 +18152,333 @@ static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) { int last_time; struct __pyx_memoryview_obj *memview = memslice->memview; - if (!memview ) { - return; - } else if ((PyObject *) memview == Py_None) { - memslice->memview = NULL; - return; - } - if (__pyx_get_slice_count(memview) <= 0) - __pyx_fatalerror("Acquisition count is %d (line %d)", - __pyx_get_slice_count(memview), lineno); - last_time = __pyx_sub_acquisition_count(memview) == 1; - memslice->data = NULL; - if (last_time) { - if (have_gil) { - Py_CLEAR(memslice->memview); - } else { - PyGILState_STATE _gilstate = PyGILState_Ensure(); - Py_CLEAR(memslice->memview); - PyGILState_Release(_gilstate); - } - } else { - memslice->memview = NULL; - } -} - -/* PyIntBinop */ -#if !CYTHON_COMPILING_IN_PYPY -static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, int inplace, int zerodivision_check) { - (void)inplace; - (void)zerodivision_check; - #if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(op1))) { - const long b = intval; - long x; - long a = PyInt_AS_LONG(op1); - x = (long)((unsigned long)a - b); - if (likely((x^a) >= 0 || (x^~b) >= 0)) - return PyInt_FromLong(x); - return PyLong_Type.tp_as_number->nb_subtract(op1, op2); - } - #endif - #if CYTHON_USE_PYLONG_INTERNALS - if (likely(PyLong_CheckExact(op1))) { - const long b = intval; - long a, x; -#ifdef HAVE_LONG_LONG - const PY_LONG_LONG llb = intval; - PY_LONG_LONG lla, llx; -#endif - const digit* digits = ((PyLongObject*)op1)->ob_digit; - const Py_ssize_t size = Py_SIZE(op1); - if (likely(__Pyx_sst_abs(size) <= 1)) { - a = likely(size) ? digits[0] : 0; - if (size == -1) a = -a; - } else { - switch (size) { - case -2: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 2: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case -3: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 3: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case -4: - if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 4: - if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - default: return PyLong_Type.tp_as_number->nb_subtract(op1, op2); - } - } - x = a - b; - return PyLong_FromLong(x); -#ifdef HAVE_LONG_LONG - long_long: - llx = lla - llb; - return PyLong_FromLongLong(llx); -#endif - - - } - #endif - if (PyFloat_CheckExact(op1)) { - const long b = intval; - double a = PyFloat_AS_DOUBLE(op1); - double result; - PyFPE_START_PROTECT("subtract", return NULL) - result = ((double)a) - (double)b; - PyFPE_END_PROTECT(result) - return PyFloat_FromDouble(result); - } - return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2); -} -#endif - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* GetModuleGlobalName */ -#if CYTHON_USE_DICT_VERSIONS -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) -#else -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) -#endif -{ - PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 - result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } else if (unlikely(PyErr_Occurred())) { - return NULL; - } -#else - result = PyDict_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } -#endif -#else - result = PyObject_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } - PyErr_Clear(); -#endif - return __Pyx_GetBuiltinName(name); -} - -/* PyCFunctionFastCall */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { - PyCFunctionObject *func = (PyCFunctionObject*)func_obj; - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - int flags = PyCFunction_GET_FLAGS(func); - assert(PyCFunction_Check(func)); - assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { - return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); + if (!memview ) { + return; + } else if ((PyObject *) memview == Py_None) { + memslice->memview = NULL; + return; + } + if (__pyx_get_slice_count(memview) <= 0) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + last_time = __pyx_sub_acquisition_count(memview) == 1; + memslice->data = NULL; + if (last_time) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } } else { - return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); + memslice->memview = NULL; } } -#endif -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); #endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { - return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); #endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; } } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); #else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } #endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } -#endif -#endif -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = func->ob_type->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +/* ObjectGetItem */ +#if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { + PyObject *runerr; + Py_ssize_t key_value; + PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; + if (unlikely(!(m && m->sq_item))) { + PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCall2Args */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { - PyObject *args, *result = NULL; - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyFunction_FastCall(function, args, 2); } - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyCFunction_FastCall(function, args, 2); + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); } - #endif - args = PyTuple_New(2); - if (unlikely(!args)) goto done; - Py_INCREF(arg1); - PyTuple_SET_ITEM(args, 0, arg1); - Py_INCREF(arg2); - PyTuple_SET_ITEM(args, 1, arg2); - Py_INCREF(function); - result = __Pyx_PyObject_Call(function, args, NULL); - Py_DECREF(args); - Py_DECREF(function); -done: - return result; + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { + PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; + if (likely(m && m->mp_subscript)) { + return m->mp_subscript(obj, key); + } + return __Pyx_PyObject_GetIndex(obj, key); } +#endif -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +/* DictGetItem */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); } - return result; + Py_INCREF(value); + return value; } #endif -/* PyObjectCallOneArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_New(1); - if (unlikely(!args)) return NULL; - Py_INCREF(arg); - PyTuple_SET_ITEM(args, 0, arg); - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, &arg, 1); +/* PyIntBinop */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, int inplace, int zerodivision_check) { + (void)inplace; + (void)zerodivision_check; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + x = (long)((unsigned long)a - b); + if (likely((x^a) >= 0 || (x^~b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_subtract(op1, op2); } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; #endif - if (likely(PyCFunction_Check(func))) { - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, arg); -#if CYTHON_FAST_PYCCALL - } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); + const digit* digits = ((PyLongObject*)op1)->ob_digit; + const Py_ssize_t size = Py_SIZE(op1); + if (likely(__Pyx_sst_abs(size) <= 1)) { + a = likely(size) ? digits[0] : 0; + if (size == -1) a = -a; + } else { + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; #endif - } - } - return __Pyx__PyObject_CallOneArg(func, arg); -} -#else -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_Pack(1, arg); - if (unlikely(!args)) return NULL; - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; #endif - -/* GetException */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; #endif -{ - PyObject *local_type, *local_value, *local_tb; -#if CYTHON_FAST_THREAD_STATE - PyObject *tmp_type, *tmp_value, *tmp_tb; - local_type = tstate->curexc_type; - local_value = tstate->curexc_value; - local_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -#else - PyErr_Fetch(&local_type, &local_value, &local_tb); + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; #endif - PyErr_NormalizeException(&local_type, &local_value, &local_tb); -#if CYTHON_FAST_THREAD_STATE - if (unlikely(tstate->curexc_type)) -#else - if (unlikely(PyErr_Occurred())) + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; #endif - goto bad; - #if PY_MAJOR_VERSION >= 3 - if (local_tb) { - if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) - goto bad; - } - #endif - Py_XINCREF(local_tb); - Py_XINCREF(local_type); - Py_XINCREF(local_value); - *type = local_type; - *value = local_value; - *tb = local_tb; -#if CYTHON_FAST_THREAD_STATE - #if CYTHON_USE_EXC_INFO_STACK - { - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = local_type; - exc_info->exc_value = local_value; - exc_info->exc_traceback = local_tb; - } - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = local_type; - tstate->exc_value = local_value; - tstate->exc_traceback = local_tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#else - PyErr_SetExcInfo(local_type, local_value, local_tb); + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; #endif - return 0; -bad: - *type = 0; - *value = 0; - *tb = 0; - Py_XDECREF(local_type); - Py_XDECREF(local_value); - Py_XDECREF(local_tb); - return -1; -} - -/* SwapException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = *type; - exc_info->exc_value = *value; - exc_info->exc_traceback = *tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = *type; - tstate->exc_value = *value; - tstate->exc_traceback = *tb; + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_subtract(op1, op2); + } + } + x = a - b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla - llb; + return PyLong_FromLongLong(llx); +#endif + + + } #endif - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); - PyErr_SetExcInfo(*type, *value, *tb); - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; + if (PyFloat_CheckExact(op1)) { + const long b = intval; + double a = PyFloat_AS_DOUBLE(op1); + double result; + PyFPE_START_PROTECT("subtract", return NULL) + result = ((double)a) - (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2); } #endif -/* GetTopmostException */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * -__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) -{ - _PyErr_StackItem *exc_info = tstate->exc_info; - while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && - exc_info->previous_item != NULL) - { - exc_info = exc_info->previous_item; +/* pyobject_as_double */ +static double __Pyx__PyObject_AsDouble(PyObject* obj) { + PyObject* float_value; +#if !CYTHON_USE_TYPE_SLOTS + float_value = PyNumber_Float(obj); if ((0)) goto bad; +#else + PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number; + if (likely(nb) && likely(nb->nb_float)) { + float_value = nb->nb_float(obj); + if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) { + PyErr_Format(PyExc_TypeError, + "__float__ returned non-float (type %.200s)", + Py_TYPE(float_value)->tp_name); + Py_DECREF(float_value); + goto bad; + } + } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) { +#if PY_MAJOR_VERSION >= 3 + float_value = PyFloat_FromString(obj); +#else + float_value = PyFloat_FromString(obj, 0); +#endif + } else { + PyObject* args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + PyTuple_SET_ITEM(args, 0, obj); + float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0); + PyTuple_SET_ITEM(args, 0, 0); + Py_DECREF(args); } - return exc_info; -} #endif - -/* SaveResetException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - *type = exc_info->exc_type; - *value = exc_info->exc_value; - *tb = exc_info->exc_traceback; - #else - *type = tstate->exc_type; - *value = tstate->exc_value; - *tb = tstate->exc_traceback; - #endif - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); -} -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = type; - exc_info->exc_value = value; - exc_info->exc_traceback = tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); + if (likely(float_value)) { + double value = PyFloat_AS_DOUBLE(float_value); + Py_DECREF(float_value); + return value; + } +bad: + return (double)-1; } -#endif /* ArgTypeTest */ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) @@ -21071,6 +18501,50 @@ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *nam return 0; } +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, @@ -21204,29 +18678,260 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject "BaseException"); goto bad; } - PyException_SetCause(value, fixed_cause); + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* PyCFunctionFastCall */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); + } +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; } - PyErr_SetObject(type, value); - if (tb) { -#if CYTHON_COMPILING_IN_PYPY - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); - Py_INCREF(tb); - PyErr_Restore(tmp_type, tmp_value, tb); - Py_XDECREF(tmp_tb); + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); #else - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); - } + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif #endif + +/* PyObjectCall2Args */ +static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { + PyObject *args, *result = NULL; + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(function)) { + PyObject *args[2] = {arg1, arg2}; + return __Pyx_PyFunction_FastCall(function, args, 2); } -bad: - Py_XDECREF(owned_instance); - return; + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(function)) { + PyObject *args[2] = {arg1, arg2}; + return __Pyx_PyCFunction_FastCall(function, args, 2); + } + #endif + args = PyTuple_New(2); + if (unlikely(!args)) goto done; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + Py_INCREF(function); + result = __Pyx_PyObject_Call(function, args, NULL); + Py_DECREF(args); + Py_DECREF(function); +done: + return result; +} + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; } #endif @@ -21370,151 +19075,35 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif - return (equals == Py_EQ); -return_ne: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_NE); -#endif -} - -/* None */ -static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { - Py_ssize_t q = a / b; - Py_ssize_t r = a - q*b; - q -= ((r != 0) & ((r ^ b) < 0)); - return q; -} - -/* GetAttr */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { -#if CYTHON_USE_TYPE_SLOTS -#if PY_MAJOR_VERSION >= 3 - if (likely(PyUnicode_Check(n))) -#else - if (likely(PyString_Check(n))) -#endif - return __Pyx_PyObject_GetAttrStr(o, n); -#endif - return PyObject_GetAttr(o, n); -} - -/* GetItemInt */ -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { - PyObject *r; - if (!j) return NULL; - r = PyObject_GetItem(o, j); - Py_DECREF(j); - return r; -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyList_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { - PyObject *r = PyList_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyTuple_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS - if (is_list || PyList_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); - if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { - PyObject *r = PyList_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } - else if (PyTuple_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); - if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } else { - PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; - if (likely(m && m->sq_item)) { - if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { - Py_ssize_t l = m->sq_length(o); - if (likely(l >= 0)) { - i += l; - } else { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) - return NULL; - PyErr_Clear(); - } - } - return m->sq_item(o, i); - } - } -#else - if (is_list || PySequence_Check(o)) { - return PySequence_GetItem(o, i); - } + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); #endif - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } -/* ObjectGetItem */ -#if CYTHON_USE_TYPE_SLOTS -static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { - PyObject *runerr; - Py_ssize_t key_value; - PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; - if (unlikely(!(m && m->sq_item))) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); - return NULL; - } - key_value = __Pyx_PyIndex_AsSsize_t(index); - if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { - return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); - } - if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { - PyErr_Clear(); - PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); - } - return NULL; -} -static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { - PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; - if (likely(m && m->mp_subscript)) { - return m->mp_subscript(obj, key); - } - return __Pyx_PyObject_GetIndex(obj, key); +/* None */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; } + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); #endif + return PyObject_GetAttr(o, n); +} /* decode_c_string */ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( @@ -21547,78 +19136,304 @@ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( } else { return PyUnicode_Decode(cstring, length, encoding, errors); } -} - -/* PyErrExceptionMatches */ +} + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; icurexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; + if (unlikely(PyTuple_Check(err))) + return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); +} +#endif + +/* GetAttr3 */ +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r = __Pyx_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + #endif + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; #if CYTHON_FAST_THREAD_STATE -static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; iexc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); #endif - for (i=0; icurexc_type; - if (exc_type == err) return 1; - if (unlikely(!exc_type)) return 0; - if (unlikely(PyTuple_Check(err))) - return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); - return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); -} -#endif - -/* GetAttr3 */ -static PyObject *__Pyx_GetAttr3Default(PyObject *d) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - return NULL; - __Pyx_PyErr_Clear(); - Py_INCREF(d); - return d; -} -static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { - PyObject *r = __Pyx_GetAttr(o, n); - return (likely(r)) ? r : __Pyx_GetAttr3Default(d); -} - -/* RaiseTooManyValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); -} - -/* RaiseNeedMoreValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { - PyErr_Format(PyExc_ValueError, - "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", - index, (index == 1) ? "" : "s"); +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; } -/* RaiseNoneIterError */ -static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; } - -/* ExtTypeTest */ -static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { - if (unlikely(!type)) { - PyErr_SetString(PyExc_SystemError, "Missing type object"); - return 0; - } - if (likely(__Pyx_TypeCheck(obj, type))) - return 1; - PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", - Py_TYPE(obj)->tp_name, type->tp_name); - return 0; +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; } +#endif /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { @@ -22044,43 +19859,43 @@ static int __Pyx_setup_reduce(PyObject* type_obj) { PyObject *setstate = NULL; PyObject *setstate_cython = NULL; #if CYTHON_USE_PYTYPE_LOOKUP - if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; + if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; #else - if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; + if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; #endif #if CYTHON_USE_PYTYPE_LOOKUP - object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #else - object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #endif - reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; if (reduce_ex == object_reduce_ex) { #if CYTHON_USE_PYTYPE_LOOKUP - object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #else - object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #endif - reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto BAD; + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { - reduce_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; + reduce_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto __PYX_BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); if (!setstate) PyErr_Clear(); if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { - setstate_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; + setstate_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto __PYX_BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } PyType_Modified((PyTypeObject*)type_obj); } } - goto GOOD; -BAD: + goto __PYX_GOOD; +__PYX_BAD: if (!PyErr_Occurred()) PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); ret = -1; -GOOD: +__PYX_GOOD: #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); @@ -22093,70 +19908,9 @@ static int __Pyx_setup_reduce(PyObject* type_obj) { return ret; } -/* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType -#define __PYX_HAVE_RT_ImportType -static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, - size_t size, enum __Pyx_ImportType_CheckSize check_size) -{ - PyObject *result = 0; - char warning[200]; - Py_ssize_t basicsize; -#ifdef Py_LIMITED_API - PyObject *py_basicsize; -#endif - result = PyObject_GetAttrString(module, class_name); - if (!result) - goto bad; - if (!PyType_Check(result)) { - PyErr_Format(PyExc_TypeError, - "%.200s.%.200s is not a type object", - module_name, class_name); - goto bad; - } -#ifndef Py_LIMITED_API - basicsize = ((PyTypeObject *)result)->tp_basicsize; -#else - py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); - if (!py_basicsize) - goto bad; - basicsize = PyLong_AsSsize_t(py_basicsize); - Py_DECREF(py_basicsize); - py_basicsize = 0; - if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) - goto bad; -#endif - if ((size_t)basicsize < size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { - PyOS_snprintf(warning, sizeof(warning), - "%s.%s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; - } - return (PyTypeObject *)result; -bad: - Py_XDECREF(result); - return NULL; -} -#endif - /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { +static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON @@ -22260,7 +20014,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } @@ -22364,7 +20118,6 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); - if (__Pyx_TypeCheck(obj, __pyx_ptype_7cpython_5array_array)) return __pyx_pw_7cpython_5array_5array_1__getbuffer__(obj, view, flags); if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); @@ -22378,7 +20131,6 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { return; } if ((0)) {} - else if (__Pyx_TypeCheck(obj, __pyx_ptype_7cpython_5array_array)) __pyx_pw_7cpython_5array_5array_3__releasebuffer__(obj, view); view->obj = NULL; Py_DECREF(obj); } @@ -23238,6 +20990,18 @@ static int __Pyx_ValidateAndInit_memviewslice( return (target_type) value;\ } +/* MemviewDtypeToObject */ + static CYTHON_INLINE PyObject *__pyx_memview_get_double(const char *itemp) { + return (PyObject *) PyFloat_FromDouble(*(double *) itemp); +} +static CYTHON_INLINE int __pyx_memview_set_double(const char *itemp, PyObject *obj) { + double value = __pyx_PyFloat_AsDouble(obj); + if ((value == (double)-1) && PyErr_Occurred()) + return 0; + *(double *) itemp = value; + return 1; +} + /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; @@ -23300,184 +21064,6 @@ static int __Pyx_ValidateAndInit_memviewslice( } } -/* ToPyCTupleUtility */ - static PyObject* __pyx_convert__to_py___pyx_ctuple_float__and_float__and_float(__pyx_ctuple_float__and_float__and_float value) { - PyObject* item = NULL; - PyObject* result = PyTuple_New(3); - if (!result) goto bad; - item = PyFloat_FromDouble(value.f0); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 0, item); - item = PyFloat_FromDouble(value.f1); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 1, item); - item = PyFloat_FromDouble(value.f2); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 2, item); - return result; -bad: - Py_XDECREF(item); - Py_XDECREF(result); - return NULL; -} - -/* MemviewDtypeToObject */ - static CYTHON_INLINE PyObject *__pyx_memview_get_double(const char *itemp) { - return (PyObject *) PyFloat_FromDouble(*(double *) itemp); -} -static CYTHON_INLINE int __pyx_memview_set_double(const char *itemp, PyObject *obj) { - double value = __pyx_PyFloat_AsDouble(obj); - if ((value == (double)-1) && PyErr_Occurred()) - return 0; - *(double *) itemp = value; - return 1; -} - -/* Print */ - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3 -static PyObject *__Pyx_GetStdout(void) { - PyObject *f = PySys_GetObject((char *)"stdout"); - if (!f) { - PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); - } - return f; -} -static int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) { - int i; - if (!f) { - if (!(f = __Pyx_GetStdout())) - return -1; - } - Py_INCREF(f); - for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) { - PyObject* v; - if (PyFile_SoftSpace(f, 1)) { - if (PyFile_WriteString(" ", f) < 0) - goto error; - } - v = PyTuple_GET_ITEM(arg_tuple, i); - if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) - goto error; - if (PyString_Check(v)) { - char *s = PyString_AsString(v); - Py_ssize_t len = PyString_Size(v); - if (len > 0) { - switch (s[len-1]) { - case ' ': break; - case '\f': case '\r': case '\n': case '\t': case '\v': - PyFile_SoftSpace(f, 0); - break; - default: break; - } - } - } - } - if (newline) { - if (PyFile_WriteString("\n", f) < 0) - goto error; - PyFile_SoftSpace(f, 0); - } - Py_DECREF(f); - return 0; -error: - Py_DECREF(f); - return -1; -} -#else -static int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) { - PyObject* kwargs = 0; - PyObject* result = 0; - PyObject* end_string; - if (unlikely(!__pyx_print)) { - __pyx_print = PyObject_GetAttr(__pyx_b, __pyx_n_s_print); - if (!__pyx_print) - return -1; - } - if (stream) { - kwargs = PyDict_New(); - if (unlikely(!kwargs)) - return -1; - if (unlikely(PyDict_SetItem(kwargs, __pyx_n_s_file, stream) < 0)) - goto bad; - if (!newline) { - end_string = PyUnicode_FromStringAndSize(" ", 1); - if (unlikely(!end_string)) - goto bad; - if (PyDict_SetItem(kwargs, __pyx_n_s_end, end_string) < 0) { - Py_DECREF(end_string); - goto bad; - } - Py_DECREF(end_string); - } - } else if (!newline) { - if (unlikely(!__pyx_print_kwargs)) { - __pyx_print_kwargs = PyDict_New(); - if (unlikely(!__pyx_print_kwargs)) - return -1; - end_string = PyUnicode_FromStringAndSize(" ", 1); - if (unlikely(!end_string)) - return -1; - if (PyDict_SetItem(__pyx_print_kwargs, __pyx_n_s_end, end_string) < 0) { - Py_DECREF(end_string); - return -1; - } - Py_DECREF(end_string); - } - kwargs = __pyx_print_kwargs; - } - result = PyObject_Call(__pyx_print, arg_tuple, kwargs); - if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs)) - Py_DECREF(kwargs); - if (!result) - return -1; - Py_DECREF(result); - return 0; -bad: - if (kwargs != __pyx_print_kwargs) - Py_XDECREF(kwargs); - return -1; -} -#endif - -/* ToPyCTupleUtility */ - static PyObject* __pyx_convert__to_py___pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc(__pyx_ctuple_c850b__float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__and_float__etc value) { - PyObject* item = NULL; - PyObject* result = PyTuple_New(9); - if (!result) goto bad; - item = PyFloat_FromDouble(value.f0); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 0, item); - item = PyFloat_FromDouble(value.f1); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 1, item); - item = PyFloat_FromDouble(value.f2); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 2, item); - item = PyFloat_FromDouble(value.f3); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 3, item); - item = PyFloat_FromDouble(value.f4); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 4, item); - item = PyFloat_FromDouble(value.f5); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 5, item); - item = PyFloat_FromDouble(value.f6); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 6, item); - item = PyFloat_FromDouble(value.f7); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 7, item); - item = PyFloat_FromDouble(value.f8); - if (!item) goto bad; - PyTuple_SET_ITEM(result, 8, item); - return result; -bad: - Py_XDECREF(item); - Py_XDECREF(result); - return NULL; -} - /* MemviewSliceCopyTemplate */ static __Pyx_memviewslice __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, @@ -23923,43 +21509,6 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, return (long) -1; } -/* PrintOne */ - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3 -static int __Pyx_PrintOne(PyObject* f, PyObject *o) { - if (!f) { - if (!(f = __Pyx_GetStdout())) - return -1; - } - Py_INCREF(f); - if (PyFile_SoftSpace(f, 0)) { - if (PyFile_WriteString(" ", f) < 0) - goto error; - } - if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0) - goto error; - if (PyFile_WriteString("\n", f) < 0) - goto error; - Py_DECREF(f); - return 0; -error: - Py_DECREF(f); - return -1; - /* the line below is just to avoid C compiler - * warnings about unused functions */ - return __Pyx_Print(f, NULL, 0); -} -#else -static int __Pyx_PrintOne(PyObject* stream, PyObject *o) { - int res; - PyObject* arg_tuple = PyTuple_Pack(1, o); - if (unlikely(!arg_tuple)) - return -1; - res = __Pyx_Print(stream, arg_tuple, 1); - Py_DECREF(arg_tuple); - return res; -} -#endif - /* CIntFromPy */ static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { const char neg_one = (char) ((char) 0 - (char) 1), const_zero = (char) 0; diff --git a/src/indicators.pyx b/src/indicators.pyx index 7c70d88..a962185 100644 --- a/src/indicators.pyx +++ b/src/indicators.pyx @@ -1,7 +1,5 @@ import numpy as np from libc.math cimport sqrt -from libc.stdlib cimport malloc, free -from cpython cimport array cpdef float SMA(double[:] closes, int period): """ @@ -32,7 +30,7 @@ cpdef float SDV(double[:] closes, int period): return float(sqrt(x_i/(period-1))) #TODO add lower retracement -cpdef (float, float, float) FIB(double[:] closes, int period): +cpdef FIB(double[:] closes, int period): """ Fibonacci retracement equation; currently only support upper retracement @param closes: list of candle dictionaries in format {''} @@ -54,7 +52,7 @@ cpdef (float, float, float) FIB(double[:] closes, int period): -cpdef (float, float, float) BOLINGER_BANDS(double[:] closes, int period, int numberOfSDV): +cpdef BOLINGER_BANDS(double[:] closes, int period): """ Bolinger Band calculations function @param closes: list of closing candle prices @@ -62,7 +60,7 @@ cpdef (float, float, float) BOLINGER_BANDS(double[:] closes, int period, int num """ cdef float sdv = SDV(closes, period) cdef float sma = SMA(closes, period) - return (sma), (sma + sdv * numberOfSDV), (sma - sdv * numberOfSDV) + return (sma), (sma + sdv*2), (sma - sdv*2) cpdef float MOMENTUM(double [:] closes, int period): @@ -94,100 +92,17 @@ cpdef float WMA(double[:] closes, int period, float weightedFactor): return ma -cpdef DERIVATIVE(double[:] values, int period): #TODO additional testing - """ - Derivate function... interpolates a list of values, derives the list, and returns d/dx list - @param values: to interpolate & derive - @param period: period to calculate for - """ - cdef int length = values.shape[0] - cdef int j = 0 - cdef double[:] xvals = np.zeros((length-period,)) - cdef double[:] yvals = np.zeros((length-period,)) - for i in xrange(length - period, length): - xvals[j] = j - yvals[j] = SMA(values[0 : i], period) - j+=1 - dx = np.diff(xvals) - dy = np.diff(yvals) - - return (dy/dx) - -cpdef list EMA(double[:] closes, int period, float alpha = .3, int epsilon = 0): - """ - Exponential moving average function - @param closes: list of closing candle prices - @param period: period to calculate for - @param alpha: alpha value - @param epsilon: epsilon value - """ - - assert(0 < alpha < 1, ("out of range, alpha='%s'" % alpha)) - - assert(not 0 <= epsilon < alpha, ("out of range, epsilon='%s'" % epsilon)) - - assert(period>0, ("out of range, period='%s'" %period)) - cdef float currentWeight - cdef float numerator - cdef float denominator - cdef int i - cdef int j - cdef int k = 0 - cdef int length = closes.shape[0] - cdef double *results = malloc(sizeof(double)* (period+1)) - - for i in xrange(length-period, length): - currentWeight = 1.0 - numerator = 0.0 - denominator = 0.0 - for j in xrange(i, 0, -1): - numerator += closes[j] * currentWeight - denominator += currentWeight - currentWeight *= alpha - if currentWeight < epsilon: - break - results[k] = numerator / denominator - k+=1 - try: - return [e for e in results[:period]] - - finally: - free(results) - - - -cpdef (float, float, float, float, float, float, float, float, float) FIB_BANDS(double[:] closes, int period): - """ - Fibonacci Bolinger Bands function ... does retracements between ma/upper-band & ma/lower-band - @param closes: list of closing prices - @param period: period to calculate for - """ - assert(period>0, ("out of range period='%s'" %period)) +cpdef FIB_BANDS(double[:] closes, int bb_period): cdef float ma cdef float upper cdef float lower cdef float upperOn - ma, upper, lower = BOLINGER_BANDS(closes, period, 2) + ma, upper, lower = BOLINGER_BANDS(closes, bb_period) cdef float diff = upper - lower upperOne, upperTwo, upperThree = float(ma - (0.236 * diff)), float(ma - (0.382 * diff)), float(ma - (0.618 * diff)) lowerOne, lowerTwo, lowerThree = float(ma+ (0.236 * diff)), float(ma + (0.382 * diff)), float(ma + (0.618 * diff)) return lower, lowerThree, lowerTwo, lowerOne, ma, upperOne , upperTwo, upperThree, upper - - - -# cpdef (float, float, float) MACD(double[:] closes, int period): -# """ -# Moving Average Convergence Divergence............................................ -# @param closes: list of closing prices -# @param period: period to calculate for - -# """ -# float ema_26 = EMA(closes, 26) -# float ema_13 = EMA(closes, 13) -# float ema_5 = - - #TODO implement # cpdef float TMA(double[:] closes, int period): # """ diff --git a/test/__pycache__/test_functions.cpython-36.pyc b/test/__pycache__/test_functions.cpython-36.pyc index e0b31c3d46d3017c0d87adf644a387c81c147b45..136f0043bee2b72eeef3108349817e7b74424865 100644 GIT binary patch delta 185 zcmew(`k!Cfn3tDJ)NN^;7Aph8V+JI^24p(`ak1A#WqpMd_7sj5hA1|7h7`^et`>$A zu2hCB_GacNjuggV22JjXZN?Lyon*9`yn)e{1t`F`nUQHPvsn4Q`BM6KJsr}IC~PRo z5Oi}$F9V8fzQQ_#k=aj^b21y3^W?J%!FHgoiPOc9qsVEqjUrLK_^`0*52_c$+(l%RK<*vX<(C%TXC) z9tVbuPEu=qDb(i_EQv~*6``$eUas7zF3&Ahmn+-Gqq`3`8un>xT(Y8)<^SNtPQq!} z&L7@MO4xz|0~KN*V6(79goTZ@Rp-I_nmzqD{dWhldXrYrfkQx6kAPGus;HqJdeMw{ zgU%>JzF>zek!E13DJaFmrdx^&nD(gUw&JLmaTVDtp?!1>gyR8J^^CZ+Qq-R?=JjL5wo3kO0LBWL