From 37700e58475ed322493528025057272abe302323 Mon Sep 17 00:00:00 2001
From: Tue Herlau <tuhe@dtu.dk>
Date: Fri, 10 Jun 2022 12:22:49 +0200
Subject: [PATCH] updates

---
 docs/codesnipper.bib                          |   8 ++--
 examples/multicut/multicut.py                 |  45 ++++++++++++++++++
 setup.py                                      |   2 +-
 src/snipper/__pycache__/fix_bf.cpython-38.pyc | Bin 3751 -> 3786 bytes
 .../__pycache__/fix_cite.cpython-38.pyc       | Bin 2505 -> 2537 bytes
 src/snipper/__pycache__/fix_o.cpython-38.pyc  | Bin 1420 -> 1408 bytes
 .../__pycache__/snip_dir.cpython-38.pyc       | Bin 2057 -> 2227 bytes
 .../__pycache__/snipper_main.cpython-38.pyc   | Bin 2729 -> 2789 bytes
 src/snipper/fix_bf.py                         |  13 +++--
 src/snipper/fix_cite.py                       |   2 +
 src/snipper/fix_o.py                          |   2 -
 src/snipper/snip_dir.py                       |  23 ++++++---
 src/snipper/snipper_main.py                   |  28 +++--------
 13 files changed, 84 insertions(+), 39 deletions(-)
 create mode 100644 examples/multicut/multicut.py

diff --git a/docs/codesnipper.bib b/docs/codesnipper.bib
index 9fd8984..257b363 100644
--- a/docs/codesnipper.bib
+++ b/docs/codesnipper.bib
@@ -1,9 +1,9 @@
 @online{codesnipper,
-	title={Codesnipper (0.1.0): \texttt{pip install codesnipper}},
+	title={Codesnipper (0.1.7): \texttt{pip install codesnipper}},
 	url={https://lab.compute.dtu.dk/tuhe/snipper},
-	urldate = {2021-09-07}, 
+	urldate = {2022-05-19}, 
 	month={9},
 	publisher={Technical University of Denmark (DTU)},
 	author={Tue Herlau},
-	year={2021},
-}
\ No newline at end of file
+	year={2022},
+} 
\ No newline at end of file
diff --git a/examples/multicut/multicut.py b/examples/multicut/multicut.py
new file mode 100644
index 0000000..c9cbff3
--- /dev/null
+++ b/examples/multicut/multicut.py
@@ -0,0 +1,45 @@
+def primes_sieve(limit):
+    limitn = limit+1 #!b
+    primes = range(2, limitn)
+
+    for i in primes:
+        factors = list(range(i, limitn, i))
+        for f in factors[1:]:
+            if f in primes:
+                primes.remove(f)
+    return primes #!b
+
+
+def primes_sieve(limit):
+    limitn = limit+1 #!b;
+    primes = range(2, limitn)
+
+    for i in primes:
+        factors = list(range(i, limitn, i))
+        for f in factors[1:]:
+            if f in primes:
+                primes.remove(f)
+    return primes #!b
+
+
+def primes_sieve(limit):
+    limitn = limit+1 #!b
+    primes = range(2, limitn)
+
+    for i in primes:
+        factors = list(range(i, limitn, i))
+        for f in factors[1:]:
+            if f in primes:
+                primes.remove(f)
+    return primes #!b
+
+def primes_sieve(limit):
+    limitn = limit+1 #!b
+    primes = range(2, limitn)
+
+    for i in primes:
+        factors = list(range(i, limitn, i))
+        for f in factors[1:]:
+            if f in primes:
+                primes.remove(f)
+    return primes #!b
diff --git a/setup.py b/setup.py
index 5d605ec..aa492a2 100644
--- a/setup.py
+++ b/setup.py
@@ -1,5 +1,5 @@
 # Use this guide:
-# Use:  pipreqs.exe slider --no-pin --force for requirements.txt
+# Use:  pipreqs.exe slider --no-pin --force for requirements_pip.txt
 # https://packaging.python.org/tutorials/packaging-projects/
 # py -m build && twine upload dist/*
 
diff --git a/src/snipper/__pycache__/fix_bf.cpython-38.pyc b/src/snipper/__pycache__/fix_bf.cpython-38.pyc
index d658b0d20470302c45daa0e3245fa0823a229ac8..cde78db9fdc1de042e6d4859666771c801ae6339 100644
GIT binary patch
delta 1024
zcmZWoO=uHA6rMLbn`D#S&2Q6GsTC`hR&C=+#Zo9%4AzVIb10TdGi`}!(`K@YmRX9X
zy$FWZId~9Daw?*?LN9_RPvY6b>d}jcAYKG7`lhY4=)w+f-hA(S-<$Vlqw`&-d);xO
z1i$x!PCkmSxm!IM+?n{F$G`T35;8-4gM-f`^N1vMD3etxLTg_S!VeXOGfRHNGbQ7!
zop7^GN62`=w>;u8Nu<?*_&WGeY3cLbcv^cSqi9Domsr$Zjcn2uqB)eASOijiTire3
zEJya8Qt?@{<%n<bP%|W#$WC%;t<VnA0zW31w90f9gzbfSxDF3NT0Zk4GFFG1)VF;{
z+9)&QyV8(u6KPs-8jD<o>R}$?)-sV!Guk2}D94Y>IEN0xqwPdngSrUh)G{%{Z5dvw
zP#*IW5);<e@zBwA=x_uvEu*%Mf%Z-X%@}uDfWECAA9rQq8F@~($?ZW>=|g`U)9v@i
z2l1|UIqVksi$(Eql&xOTe6oS*sc3i(Pt*a3=csSA>p~JCNhC{RYY0#2`|(qF+5h^|
zo+Hydjl`*TlnvP6>Il!Q(ptlF)fHp(9K&I_ss}<(#|$=X-1b32leEYht+K1+1?hz#
zBx;^0E%efW_U8kb6&9k^N236Jn@8CLmW~I;>{KOS)1?Xz%x$pRid+hZW_Rr0ksM@H
z&N@YDNnNytyEK7ta0$%m(!Gi4Fq*X+xDa5#nA)&<T_Z&kkTvp<qgjmpWF3J1&7W2`
zI0?jk!3ie6;K-QjiCqq*aU<H){aF6wF*E~OECzIHN}SOC?PPlyqZ5;}^TqPS^qopU
zeTa<~8VJJ2K=CmcdT2T2#$&1<1}9}I4po;q<0eiI;~{J}>`ss=X_KNatfv!uW2hN>
z0GN7ecSBsgwyzCnRlSCYX%WY93E=L3Vg`As=oRPZ7KXSQa&Dzep?eaTC2wl3CbDR&
lm(E#x@2)1t)psWwav={9s%&=*`qhlv365HEyNuyz+aJDg@lpT)

delta 1017
zcmZWnO^6gn6n?L|W~Zm8y60!d*;&G}i$Zjibw>~q$)d!#AThTX1ktQIH6zWgvpdzL
zh*a;Aok&dZFiVkB5N5m>&ypN+2n0NZkh^^pK_oX1IRpZEwJTAyn|i$Z-rx6Lz29dZ
z%tT*=VF2{SeChJuXgm6O|0LaVbUZrA76Z5nsV6bzhHEe|z!eyx`g{AY_wcFB<A<By
zg3cK(`4q_9fSrPir&C{p<_3&EP5uK+3&wZ$SMe<Q)f6<`*~z7DIn;TM*q9KBD_q?|
z=s)hivPj;5H>^xObJ-e@`f_44VK!m6xbbhZX&7S~7;gL(MkIyK%lrVh(D*6Wz6l0+
zfu+S%m?F`vrJ?amI4a1AF@8Wz4zWM?4RlfZvhcNU#3&fUDWa4{CXzS}GMECVExJZ1
zucJD|P1Q5`9+SniWT<FzpNzuw;=;*^J1WV23KY9tjEXWGBVoVnVlpzNAK)I_NiG(l
zS0}tg<=(_gi$G)}N0ah<M2h!)<BdFH|6p^K4Jyslh8D6sKm;x9zif7?Od(}TRH3H<
zS#|SCD>Ur4v8ooPDkq5mdAj%^>mQZ1Axk!NXfJzbPPm0|i;*-)T%`xQSWfW{7#zVE
zreK@(`RDKunwaGht>X12%h=&ohN}-TW3jZ)z0>&qqZa>)SE9^Y?esF<jeAnL-LsGV
zPaC;)758)&eVim6rQ@~Ul2U7`IcX0Uj@WkL#B4~Oszf5ob>o}M-8`wuSrUMpe*0UY
zxu4asjCHSt4bprJSU{&iT9xn`)>w`1YW~q=un)s3g}$KmhJSExW<M!@HnE2;DzM)d
zTk{dA8EdyQ*6FB24ln#Kc1Q%vS60{BE6d&My_5E3@eJOz$Hg3O*=5lXw2=8}ptoY0
z+1p|PJ^Pc`hZXxooLz8Lnw~1Ud<RKnc;lVqi!yHO_S&`e<6qhf;iZr(?mTm`?p#ak
upW(3suP1Tk9GQ|jiJeI>LH#nUqretvb|E^C^Y*)F221wGXx95E*z+G^&FO*w

diff --git a/src/snipper/__pycache__/fix_cite.cpython-38.pyc b/src/snipper/__pycache__/fix_cite.cpython-38.pyc
index 41ff88198ed4802e312744218929d4693baa9cdc..47a9c15573eb1db93ac169ce7f6f128ad0310a9a 100644
GIT binary patch
delta 517
zcmZ9HOG_L<5XZZEdwQNbpnI5XE+&EpC9Dtd6)^-7Js1r_2#Dw*&?Bq^yK8R?9%>O>
zyf5inM9_=(kWZ0&4q?C#kegpXu-cUzY^Y!T>q+(R+P_-*wOWlBz0d9YZ?EH@>8wbr
z6iTuWWZfORB^FNqphPHqy^HXX?I*p!a18nY?C8CzC=X@E`fvsaDC?{jVyK*tl#kH`
zyX5FAR)qRY1?Xq2#Z{Ow6=kd!Q)f(_2_`6L{|$;Ofyp&(My?oE&Uu|-Z0|(2=3(3i
znyDO(8V^Mu6feX8^fvM<Y5Z##K$jc;f+-mCQXr>(PW8a}L)r~*4MIEcHleh)-Z9MC
zFLI?8mEy47Y-vtkF1?O!wv7EDSD|YE%EmqvWku%)dcswOHYY~EA*o0HW7MgHP$%oo
z5g0@uK=2n304ED5P9FXEQ}hZ_o<j0#&wmMxDVkWHgfb}dypy+7cT(yG<sL86GfquA
txYc^z-UMSS3r;RNEIBMYyd~`NTo3PCb*X1Zj#2L2_wW;ae=|gwcmUO2X`TQ8

delta 505
zcmZ9I%Sr<=6ozv$nari*fORp}jiR_HqEx)!R$dU)r7i>oA){!e)^r3HrwSJLLfna<
z;0uWO0xkq!p>H69AijVn7F-zkzd8Bm&*3ER9d8}+dRtq_Xl;E=?YxJN@vw*^+Dg(q
zskUI&#Q6CON`$hfmou(hlnHCV1t6d-u)2@Fvfn^?7~HU1j-F!WKv$KIUcxF|1qoAO
z!s;O<bCk?s4h40)Mseq0?jC?4R}7s?USLQ`<mjr1PBH5wY`M<S$pnTCpf=8No@&tm
z#mnLf^epl_H<R~J`^@AGQ_$kAKu&2+f4xk$Xtv!&@Xdp}3Y+H3J%N(hlQU7!6bDE9
z70v0!=2^}`WWMFlhNIJ6-A`Uq=<GDp161nvKjdv?AFDvB4G|cGAVBa=@PU&ek`KMV
z450^N9z*za=5;}-Na>{_H2rd#R?~{A6{Q{|?{@}mn>F34-mhf3WZe<->UYnK+H%Zd
g++xCFlCa5B-I{LNTK`7uCU4gC1S@ps!vLZ02chz2ivR!s

diff --git a/src/snipper/__pycache__/fix_o.cpython-38.pyc b/src/snipper/__pycache__/fix_o.cpython-38.pyc
index 8d8bcdc423001db8f393bfa2700ce0c32dfc6295..6c1ee228e8069b0b263670f0d5c2b8ba66939e00 100644
GIT binary patch
delta 100
zcmeC-Zs6t(<>lpK0D_QdPZK33@=ju8n7E*lsp!vSSw?m4RV6GbT+NJ(40%D5{TV$s
wFJSay)>H#2XXM~uVpL%iVB})tVB}*IV`2fad4Q0MNq|ubC<YXrEXrCA08<YUK>z>%

delta 96
zcmZqR?&0PQ<>lpK0D?P5OcQe_@=jvpnz*2nWddUn+hl1*b?!AKEGb;gjEoF<QImZc
uJ=s}m_(8nQQyIOP88s$9WDyl*V-#TI0YWY&0Y)iC4j|-X;+V|IS`Gk6`4dq9

diff --git a/src/snipper/__pycache__/snip_dir.cpython-38.pyc b/src/snipper/__pycache__/snip_dir.cpython-38.pyc
index f19c4b3b4d60e3eb2edd09eecf507974dbf6878e..92f601c91ee6ce8f8213a03afd26e8be41197e57 100644
GIT binary patch
delta 1364
zcmYjR&5zqe6rVSC;>2;B#G9{Ox+N+Uh$_l~!%8SxDin#H_CS|QXm^!noUGZzNylEb
zgfT&+66%3fDuX~ONC~H2;KGf+pc3LA@C|WA;)<3FZze(QjONYzn%{eG-q??dzm%?h
zn9rL8$8SgU?%x(6e@fxSA+0xX1xJsswO=MoA7)2p#{}Y<EW^^wcnEXo<QUu{&FtgP
zc4tjUj0qq2y`g*9Q`j50ZQOIXG>P^jB_t#a1esGH0vI`^{Iw94bVVXS3uT&sxrR1P
z*;*m)j0`Y?ue3-Ly3*bpkVr>9HGn<jLjB`xYMB<Wg5V^!p}F@Rs#43WAS+<$8i}Zq
zGlH&Q!<z!buPFaD%rRpQUw}yQXR!~p85Ssr2T=~w$%-7yY?CL1nZkTRe$eLtL}96D
z3*dHWE%P!m>aC@{Mn%4`EV7)^mO=+hg5?&oR=7tNCZ88po7{OXvK3ZY(TcETMza+>
zB43g|uspLLW`y1*c&H%q%c`)$nkdY{B7H0b$O7)|vqDt#NK_Je1blj%MozS);OfFz
z!2*Kwa9cPSeuovM%%968B|k%ybFn2Ym{{4Hk*I=|J9r3N6uu;!K8UoS!Vn-dkr7$8
z^}Qh~-_moyaMh?Ls;qFTFDP$>L{#yv%EH0B(&Sx<nkcOkXc18qRcu#L1(fN2famL*
zbTguky{U_>-hu`#Rly~xLfA>DFLxym#J{wut<EYnY%W?`ssYNnp!Ztp4OP|aDvDB{
z;`^)}Ozm5~H<`G+(f1yB{vd8@Pj_-31#9J<cN$Z@@#cPG@M-zy_y3rF9jEjo$i_^+
z2{+=O^mofs=l}Eg#CvWKNQ}Sq*W)XxSN9UD=la2zAIrBNOzD2(0^Uk=Hul}-<s>!X
zo*yQe&>c;rLt>0hnG|9#^}D^Dn8Emr_uOOV@g#1iUzv3(y`kInkC_{Up5G0<G4dYg
zCH#K4BS}S)Dw0GSpM?oMxu4Ks&@sEco;wM<cQFVI6Bs4nCr0lqM5iEuev)20bn?M?
zc&2cNUJxef)B9aM2s*mY-BI$kh9^1(AE|P9R>sOpQjh^N^2%g7QXhPdgjgnxFVa_M
z)C3(ev<^0y)WYRR8LHqwo$AP2a2;tHmkuUal!BW7>S=mm8YcQ#sKtdoHgb+c0^Y_L
z&Fle=!^6Xa!=}Y|QNynyNy?iJUJv~E8{_hWH>5@WeE5zuSB9SN9&i3i{CM(7@1)B|
sT$c_Kc3qt+QIU0tt<jjB4c&b}kKhWDqD%}+krUIV1k@y(9mqfb0cG}7jQ{`u

delta 1116
zcmYjQ&1)M+6rZ;{`ypxdX~|A%sR)c)MA`;Ipio*Rw1$Qfe5l<VlsHCcR?61WN|_zE
z#Jt6!4wM996!uWkv>-tbg<c9hwTIq&C_Pu#{0lww>(DoAn`Van&71e$yx(s=_J{Jr
z(uI%m`7EP$=ePH|Pjiet*OM2UOOvbgMVn79Y!n?~3Ht$bG6J?(%YAa(INa`KUdUf2
zo60a#FBuw)Aqci-$hu-Pn6ns^AwU=iM<y^d)7T|NqhJFj%*SSIB2T^T0gE}=d;o8f
zrTE9z%tn|)bX)P6qb*>HCs&}6KTe|=WOEQ!5<p|?dzBOR5qt({$)A-s%b(?+twe}3
z!a){5oFz>zW`%Q}J!2w+nP=>4ew0=}<D7!z$?vdwm`z#BszN(}*^<c3X^eBE)x+Ed
z+j%$6r&_8h)=={rb9l%;XMGT!$UktAZ!lU@KyS8;d9{LtBk)+CvVcwD?qyMki|A3U
z<6A~tipy!Gb6A?g6b_^N>O7W+`Xy1+4*CB)O^`oPiThaA5fW7iSiGcGvD62&(Le`D
zIGX5+@>dQnePJ9!T*ay=?D44~xiYXyM^M2M9f7Hj0E<|q<1eOFy^ULJ=R;CeJ5}Xk
zZ4Pmb=#1!O$93(YQrGB?8rlXH)=zg(6H6;}Llmv1H<CuD#@#9w=`mF|lSk&am)CDb
zVKABaa;Ld<FYMis<1jb~!a-96((kFU4E*S=<^gZM-fj-Qe5%`z$#s4k+~hlc4c<xq
z;8&9Otyc^AXgu6k!8qI<29Zie*819k(Qf_?7h5kcT;-1@{b1-XoY9`plZ7>rL8y{n
ztX~VuooqDTmpy-%NIS_l_S$QUT5srg!(HJ=DhRu2T?)z)y>nUCP$O8F<9*dh{<Iq(
zK!0I(dp&=mWJO2py-&Mx5OsJc{ZYq}qg_oe_3tG;4F#R$>dk9b{ZB=o5U^Zw&sjGi
zYb0~0e%*sNfP+mR2M>&s{x7$Te{4Go74qqBLjgRaLMYo*qUCN<+uq*ZY-QytIpi8a
xC#krt8?Wf8W|J!#boz;?R9Olq%HAH0#s1K517$>Yf>KK50(H(H?d){?>p$JY55fQd

diff --git a/src/snipper/__pycache__/snipper_main.cpython-38.pyc b/src/snipper/__pycache__/snipper_main.cpython-38.pyc
index bf692bfec5b10c0f396eee21b21d79be8ddc833f..b48e5ac78a1965c3f70213163c0198d2fc870a0d 100644
GIT binary patch
delta 906
zcmZ8f&1(};5TEz<Gn-`dwc9kQXbZI%#fu=s62zhui&$!{G{$PFeWt{uNxJ)@P~KW-
zdhilzSv-gc$-#r*K@Z*(J&7m(fZ$2+s_4;^v#IvrgL!Xec7C%nznK^IH`}}xjT(UG
zQ<dKS8s0Pa#!@W8qC2FNWEP9DIBF@DV96aQS&UqToc;R48@e^UI)DXGJVPj9l=CR=
zGzAbkgDQ0*74Y;m@C-)0Fb4sQGKt9@=@Hre;zdNHOM2i%MYK!*z7kV<#51`p%r?0I
zHz${<7xUsG-c^{|BTTExj>FY00Z)PHB8GS9ncOA>FhpYp3-_onMXUfD7dMk!M_m^h
zi*zK<T!eaF1|F&!&SwH%g1}~$t0EDgxyqsf+7$C7w#g!#28Iz25=FQUby@^L+`hoF
zoqK{}YezzXik&3|EeCZT_fjI+HF)@Lq#G3}zax*#d>2WkWdO@U9<eO63YZ9yMIOV#
zVE;QybR;Yw{=aAccRV3X|EHYZGFb{IVy{VU>X|~pEN{7mm~ddTA#P*&q^hF-B{q{D
zG&K~kxP+~HmS@yurg;`m2R>wYICuj-5%DXq*l-3j{PPI2Yp_fYsbLCsWcnLQ`b?H*
zge^k&M|&{MEE@@?xf>tMGAryLJ|OQ3%mb2U38PGLXAb%Al#k<mwYjpozEUsAE?X%(
zF<cfW*qT1Mzp1o%`D8vf;y+P$mA>S1$3LdcB}=hJi#J<**=^KXywa%m{fAm!9z~S@
zUOVCc(2homXn?L0naadJtmm^P(McQ)T^c0@v8X`|8YdQU=KPxec=R%cJDGzki(20(
z)G97tZLBxXF8gDlQ}cy^*KO7+yjH2-adXtU6hLMUaDxm1*qOrX7K)3D4?qTXjx6Lt
l3$qK;D6_LU+nMyAhhC|37~o9#H;f4~;cpw`3W49oxj&;(*%bf)

delta 870
zcmZ8f&1(}u6n`_j$?i_Fo6X0zO$4b>r0G!*sup^%Afl97BdxJTq)$uQkl4+5DKiF4
zucem7lL(0i!CO6eE8?jK{{WF9c=F=Sqj>R6Dk|>s=6%e(-}}vb^EG-M1-E=(0DT*;
z=I*s~`@#O10%p<QVf6wQF~A&IMGP^&1N9QJn@}yidH<Go*M?aplfDs>49R7Z&Ljs=
zF2W{{vklNLGA$%1K#msLyVg^-cce2a(`N(FS(WYc-`c{|fN5Xa%I~o`SiQKyb)a)9
z*H2-3z|h&W<CaV-cn;WgRY1ynVfPpVI^v+f%z!Ij1v9WUw_T7f*{*UhyK8BG30l)O
zNN-cb9~kJ6!FGk9LX$1i=qu=P!U><SB{&aACmx5(a2r~D85HY$R75+D6{l-?#_Fzv
z&MW@F@SM^GmG29g*~s>NRT%0(!GQHG3=How4ETTwZGBUD;}O{$hD4UU8G<Lkn#>Vh
zIN8Viu0^!M|05?PWM28QYl;;pAx$tG3&Vt>@@ZxzjMl9l*S<;-@Jm@D7-4)FnZ~YA
zH*`^#S~fbmC`U|;_C}31EvB4L#>0^^{EaBTFL2ac0#kHJ|2j=7GOfA+i$E>%hK=Dd
z$T1ZukIF^EnU7)F%zQ5#PQ0ul1MyE@kseef`J6gR4$={;BuDAJr0y()$9|{Xd?Xv~
z*4<{KBkRebGoAc!rg%J_jJuO!kzN`&F0*-3bEi**+-C0RI1{YI1rt1EB^J-qku{!t
zcZ<n8SF>x$jCY!~lRMtI#Y?nxEIJRH4cTn8?suv@zDl9^ido8kmWr`vX=#yk=v@P_
mp<iXSs#lvo`RA)qd?ESb9i&agcs6+^&a#Q*P)t}q#lkO#s?bLO

diff --git a/src/snipper/fix_bf.py b/src/snipper/fix_bf.py
index d06de2f..8326139 100644
--- a/src/snipper/fix_bf.py
+++ b/src/snipper/fix_bf.py
@@ -7,6 +7,9 @@ from snipper.block_parsing import block_split, block_join
 def fix_f(lines, debug, keep=False):
     lines2 = []
     i = 0
+    # if "GymPacmanEnvironment" in lines[0]:
+    #     print("\n".join(lines))
+    #     z = 324
     while i < len(lines):
         l = lines[i]
         dx = l.find("#!f")
@@ -35,15 +38,18 @@ def fix_f(lines, debug, keep=False):
             for c in comments:
                 lines2 += c.split("\n")
             # print(funrem)
-            f = [id + l.strip() for l in funrem.splitlines()]
+            # f = [id + l.strip() for l in funrem.splitlines()] # note sure. mangles function body.
+            f = [l.rstrip() for l in funrem.splitlines()]
+
             f[0] = f[0] + "#!b"
             errm = l_head if len(l_head) > 0 else "Implement function body"
 
             """ If function body is more than 1 line long and ends with a return we keep the return. """
             if keep or (len( funrem.strip().splitlines() ) == 1 or not f[-1].strip().startswith("return ")):
-                f[-1] = f[-1] + f' #!b {errm}'
+                f[-1] = f[-1] + f' #!b {errm}' # Indent of last line may be wrong.
             else:
                 f[-2] = f[-2] + f' #!b {errm}'
+                f[-1] = id + f[-1].lstrip()  # Fix indent of last line to match function scope
             lines2 += f
             i = len(lines2)
         else:
@@ -92,9 +98,10 @@ def fix_b(lines, keep=False):
         if b == None:
             break
         args = {k:v for k, v in b['start_tag_args'].items() if len(k) > 0}
-        cutout += b['block']
+        cutout.append( b['block'] )
         b['block'], dn = _block_fun(b['block'], start_extra=b['arg1'], end_extra=b['arg2'], **args, keep=keep)
         lines = block_join(b)
+        # cutout +_=
         n += dn
 
     # lines2, _, _, cutout = block_process(lines, tag="#!b", block_fun=functools.partial(block_fun, stats=stats))
diff --git a/src/snipper/fix_cite.py b/src/snipper/fix_cite.py
index 4b49641..0d46a3e 100644
--- a/src/snipper/fix_cite.py
+++ b/src/snipper/fix_cite.py
@@ -31,6 +31,8 @@ def fix_bibtex(lines, bibtex):
         if i < 0:
             break
         if reference not in bibtex:
+            for k in bibtex:
+                print(k)
             raise IndexError("no such reference: " + reference)
         ref = bibtex[reference]
         label = ref['label']
diff --git a/src/snipper/fix_o.py b/src/snipper/fix_o.py
index 04689e4..58f3251 100644
--- a/src/snipper/fix_o.py
+++ b/src/snipper/fix_o.py
@@ -32,6 +32,4 @@ def run_o(lines, file, output):
             cmd = "python " + file_run
             import subprocess
             s = subprocess.check_output(cmd, shell=True)
-            # s,ok = execute_command(cmd.split(), shell=True)
-            print(s)
             os.remove(file_run)
\ No newline at end of file
diff --git a/src/snipper/snip_dir.py b/src/snipper/snip_dir.py
index 40b084f..ba98cd7 100644
--- a/src/snipper/snip_dir.py
+++ b/src/snipper/snip_dir.py
@@ -4,8 +4,9 @@ from pathlib import Path
 import time
 import fnmatch
 import tempfile
+from line_profiler_pycharm import profile
 
-
+@profile
 def snip_dir(source_dir,  # Sources
              dest_dir=None,  # Will write to this directory
              output_dir=None, # Where snippets are going to be stored
@@ -14,8 +15,10 @@ def snip_dir(source_dir,  # Sources
              run_files=True,  # Run #!o tags and #!i tags
              cut_files=True,   # censor files.
              license_head=None,
+             censor_files=True,
              ):
 
+    print("Snipper fixing", source_dir)
 
     if dest_dir == None:
         dest_dir = tempfile.mkdtemp()
@@ -42,17 +45,17 @@ def snip_dir(source_dir,  # Sources
 
     if clean_destination_dir:
         shutil.rmtree(dest_dir)
-    os.makedirs(dest_dir)
 
+    os.makedirs(dest_dir)
     out = dest_dir
     hw = {'base': source_dir}
 
-    print(f"[snipper] Synchronizing directories: {hw['base']} -> {out}")
+    print(f"[snipper]: {hw['base']} -> {out}")
     if os.path.exists(dest_dir):
         shutil.rmtree(dest_dir)
 
     shutil.copytree(source_dir, dest_dir)
-    time.sleep(0.1)
+    time.sleep(0.02)
 
     ls = list(Path(dest_dir).glob('**/*'))
     acceptable = []
@@ -62,21 +65,26 @@ def snip_dir(source_dir,  # Sources
         acceptable.append( (l, not any(m) ))
 
     n = 0
+    cutouts = {}
     for f, accept in acceptable:
         if os.path.isdir(f) or not str(f).endswith(".py") or  str(f).endswith("_grade.py"):
             continue
         if accept:
             solution_list = []
             kwargs = {}
-            nrem = censor_file(f, run_files=run_files, run_out_dirs=output_dir, cut_files=cut_files,
-                               solution_list=solution_list,
+            print("Snipper processing", f)
+            nrem, cut = censor_file(f, run_files=run_files, run_out_dirs=output_dir, cut_files=cut_files,
+                               # solution_list=solution_list,
                                base_path=dest_dir,
                                references=references,
                                license_head=license_head,
+                               censor_files=censor_files,
                                **kwargs)
             if nrem > 0:
                 print(f"{nrem}> {f}")
+            cutouts[str(f)] = cut
             n += nrem
+    # print("[snipper]", "removing")
     for rm_file, accept in acceptable:
         rm_file = os.path.abspath(rm_file)
         if not accept:
@@ -85,4 +93,5 @@ def snip_dir(source_dir,  # Sources
             else:
                 if os.path.isdir(rm_file+"/"):
                     shutil.rmtree(rm_file)
-    return n
+    print("[snipper]", "done")
+    return n, cutouts
diff --git a/src/snipper/snipper_main.py b/src/snipper/snipper_main.py
index 762bfbc..9e02bfc 100644
--- a/src/snipper/snipper_main.py
+++ b/src/snipper/snipper_main.py
@@ -27,7 +27,8 @@ def censor_code(lines, keep=True):
     return lines
 
 
-def censor_file(file, run_files=True, run_out_dirs=None, cut_files=True, solution_list=None,
+def censor_file(file, run_files=True, run_out_dirs=None, cut_files=True,
+                output_solution=False,
                 censor_files=True,
                 base_path=None,
                 strict=True,
@@ -37,6 +38,7 @@ def censor_file(file, run_files=True, run_out_dirs=None, cut_files=True, solutio
     if references == None:
         references = {}
 
+    cut = []
     dbug = False
     with open(file, 'r', encoding='utf8') as f:
         s = f.read()
@@ -69,31 +71,13 @@ def censor_file(file, run_files=True, run_out_dirs=None, cut_files=True, solutio
 
         if censor_files:
             lines = fix_f(lines, dbug)
+            if "pacman" in str(file):
+                print("sdaf")
             lines, nB, cut = fix_b(lines)
         else:
             nB = 0
         lines = fix_r(lines)
 
-        # if censor_files and len(cut) > 0 and solution_list is not None:
-        #     # fname = file.__str__()
-        #     # i = fname.find("irlc")
-        #     # wk = fname[i+5:fname.find("\\", i+6)]
-        #     # sp = paths['02450students'] +"/solutions/"
-        #     # if not os.path.exists(sp):
-        #     #     os.mkdir(sp)
-        #     # sp = sp + wk
-        #     # if not os.path.exists(sp):
-        #     #     os.mkdir(sp)
-        #     sols = []
-        #     stext = ["\n".join(lines) for lines in cut]
-        #     # for i,sol in enumerate(stext):
-        #     #     # sols.append( (sol,) )
-        #     #     # sout = sp + f"/{os.path.basename(fname)[:-3]}_TODO_{i+1}.py"
-        #     #     # wsol = any([True for s in solution_list if os.path.basename(sout).startswith(s)])
-        #     #     # print(sout, "(published)" if wsol else "")
-        #     #     # if wsol:
-        #     #     #     with open(sout, "w") as f:
-        #     #     #         f.write(sol)
 
         if len(lines) > 0 and len(lines[-1])>0:
             lines.append("")
@@ -104,7 +88,7 @@ def censor_file(file, run_files=True, run_out_dirs=None, cut_files=True, solutio
 
     with open(file, 'w', encoding='utf-8') as f:
         f.write(s2)
-    return nB
+    return nB, cut
 
 
 def fix_copyright(s, license_head):
-- 
GitLab