From d9f4a2f154f8d4242572a2fcebdf76b91ed86348 Mon Sep 17 00:00:00 2001 From: Josh Fyne Date: Thu, 16 Feb 2017 13:25:55 -0500 Subject: [PATCH 1/3] Standardize input and output --- excelize.go | 34 +++++++++++++++++-------- file.go | 72 ++++++++++++++++++++++++----------------------------- lib.go | 8 ------ 3 files changed, 57 insertions(+), 57 deletions(-) diff --git a/excelize.go b/excelize.go index bc37c0a4..3c81db28 100644 --- a/excelize.go +++ b/excelize.go @@ -4,6 +4,9 @@ import ( "archive/zip" "bytes" "encoding/xml" + "io" + "io/ioutil" + "os" "strconv" "strings" ) @@ -19,20 +22,31 @@ type File struct { // OpenFile take the name of an XLSX file and returns a populated XLSX file // struct for it. func OpenFile(filename string) (*File, error) { - var f *zip.ReadCloser - var err error - file := make(map[string]string) - c := make(map[string]bool) - sheetCount := 0 - f, err = zip.OpenReader(filename) + file, err := os.Open(filename) if err != nil { - return &File{}, err + return nil, err + } + b, err := ioutil.ReadAll(file) + if err != nil { + return nil, err + } + return OpenReader(bytes.NewReader(b), int64(len(b))) +} + +// OpenReader take an io.Reader and return a populated XLSX file. +func OpenReader(r io.ReaderAt, size int64) (*File, error) { + zr, err := zip.NewReader(r, size) + if err != nil { + return nil, err + } + file, sheetCount, err := ReadZipReader(zr) + if err != nil { + return nil, err } - file, sheetCount, _ = ReadZip(f) return &File{ - checked: c, + checked: make(map[string]bool), XLSX: file, - Path: filename, + Path: "", SheetCount: sheetCount, }, nil } diff --git a/file.go b/file.go index 2a044f00..17a8bbaa 100644 --- a/file.go +++ b/file.go @@ -3,6 +3,8 @@ package excelize import ( "archive/zip" "bytes" + "fmt" + "io" "os" ) @@ -29,53 +31,45 @@ func CreateFile() *File { // Save provides function to override the xlsx file with origin path. func (f *File) Save() error { - buf := new(bytes.Buffer) - w := zip.NewWriter(buf) - for path, content := range f.XLSX { - f, err := w.Create(path) - if err != nil { - return err - } - _, err = f.Write([]byte(content)) - if err != nil { - return err - } + if f.Path == "" { + return fmt.Errorf("No path defined for file, consider File.WriteTo or File.Write") } - err := w.Close() - if err != nil { - return err - } - file, err := os.OpenFile(f.Path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666) - if err != nil { - return err - } - buf.WriteTo(file) - return err + return f.WriteTo(f.Path) } // WriteTo provides function to create or update to an xlsx file at the provided // path. func (f *File) WriteTo(name string) error { - buf := new(bytes.Buffer) - w := zip.NewWriter(buf) - for path, content := range f.XLSX { - f, err := w.Create(path) - if err != nil { - return err - } - _, err = f.Write([]byte(content)) - if err != nil { - return err - } - } - err := w.Close() - if err != nil { - return err - } file, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666) if err != nil { return err } - buf.WriteTo(file) - return err + defer file.Close() + return f.Write(file) +} + +// Write provides function to write to an io.Writer. +func (f *File) Write(w io.Writer) error { + buf := new(bytes.Buffer) + zw := zip.NewWriter(buf) + for path, content := range f.XLSX { + fi, err := zw.Create(path) + if err != nil { + return err + } + _, err = fi.Write([]byte(content)) + if err != nil { + return err + } + } + err := zw.Close() + if err != nil { + return err + } + + if _, err := buf.WriteTo(w); err != nil { + return err + } + + return nil } diff --git a/lib.go b/lib.go index c3767e3f..8c56f1b7 100644 --- a/lib.go +++ b/lib.go @@ -8,14 +8,6 @@ import ( "math" ) -// ReadZip takes a pointer to a zip.ReadCloser and returns a xlsx.File struct -// populated with its contents. In most cases ReadZip is not used directly, but -// is called internally by OpenFile. -func ReadZip(f *zip.ReadCloser) (map[string]string, int, error) { - defer f.Close() - return ReadZipReader(&f.Reader) -} - // ReadZipReader can be used to read an XLSX in memory without touching the // filesystem. func ReadZipReader(r *zip.Reader) (map[string]string, int, error) { From e8ba09d0c532edbfea22467379db9566308671c5 Mon Sep 17 00:00:00 2001 From: Josh Fyne Date: Thu, 16 Feb 2017 13:30:05 -0500 Subject: [PATCH 2/3] io.Reader not io.ReaderAt --- excelize.go | 17 ++++++++++------- test/Workbook1.xlsx | Bin 23055 -> 46045 bytes 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/excelize.go b/excelize.go index 3c81db28..46e0a846 100644 --- a/excelize.go +++ b/excelize.go @@ -26,19 +26,22 @@ func OpenFile(filename string) (*File, error) { if err != nil { return nil, err } - b, err := ioutil.ReadAll(file) - if err != nil { - return nil, err - } - return OpenReader(bytes.NewReader(b), int64(len(b))) + defer file.Close() + return OpenReader(file) } // OpenReader take an io.Reader and return a populated XLSX file. -func OpenReader(r io.ReaderAt, size int64) (*File, error) { - zr, err := zip.NewReader(r, size) +func OpenReader(r io.Reader) (*File, error) { + b, err := ioutil.ReadAll(r) if err != nil { return nil, err } + + zr, err := zip.NewReader(bytes.NewReader(b), int64(len(b))) + if err != nil { + return nil, err + } + file, sheetCount, err := ReadZipReader(zr) if err != nil { return nil, err diff --git a/test/Workbook1.xlsx b/test/Workbook1.xlsx index ee52187124e68a3a95cee012b591cf9f1a574ad5..f5417e903efa035ca9e2666f6869f5b8feea17fa 100644 GIT binary patch literal 46045 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

X$8#iuel36KbMoAS_~Rj zWPTWC>9*=CDOE|*k|HUODk$P+zC6Y4^v-;uIU1(X`}0!eYg3{IMm>Z=QO&DQ~0hf8c#?O=Z#x*7B7kvkJukHLe{C9eHQJ{nA0w-NkSpK%wbmZIa z-?b(^8=Ir0ri5-`X&{OQ>g3*mKl_%IGR}4SN^xA6Bd%t~U}(pCPs1CAO-1mnM<|Qs z&9P|I%jIM0MSOY@AGqqZKpw)F6aoc#KDRNyzwUzZCm&yxjJO13$NqH_;}xTWP6072n&z^mL0i>00NeBMeu%9|{Q<3`lG9*}=U( ztPFR%1}YmQ8$jyo%?f|7mUmld{9f~z^ImE9)-!8Jxs!9Xo2%oq)aA?o9v+;*5Na#x zgPkAK?uYZBntQC{{56^au4NT2u4PWoR`cWM18QK0rKL53g7BaFGo797@qiSZ?qybp ztJBWUhS}NmjS!wKmF@`;q{3<2)qQJq_1nS1?9N_urn|PFyK_bP?#c*tMNQ>TF3adG zl~Nqyn&g#+-qM8C?bVs3jm`<`eD~@aC&wLlXl8t6ZuCeqbe`H8Byi|744onG8AjIkqta&jcj6kB*O3 z?=P0-FK)!>jBD-h|6FOHHgVnBHFDj#4I0(aI$UXok0saa6u-3It2kU^Td(48S2+Byq(L5ABlxJ{QotqtNTyO7f+$*iA z8XRfYfgD=1B~!V(3AE))mQyG(Xa=thhQ#TF#I?)&>a$9A>VV9g1k4yE3H>uDN?hSt z8yi_A0Na3F-|j~G`@!`0c8aM(ZSo_7A;UT$!$%-C$t4}of}_9!0{}{=cmjadH?oQW zP?ufb&PF;{kcmSM&Ns#6o@~L_3ijI0bE_X`vYQPi__xS#suv=3I24oJ?%>ok_2%zx zt6(c3_K~EddgLGziuNPjA$#nY!X(lNRuT@vBIC>&26HI7foXmG@N%RSv6UG6R8v!Z zbBF;}>^o+U%Tk#n8^QgeLDW=`vR!!&O}Nbr6iS^3QN&gOjk@XFpCDODM4TX7fu*iC zG=xk*)MO54CYk(m8LY%saT}E){im4x$>sUQYzZ^;%lxM$uHwjRif5DLrIq0|ie6Qb zXY%_aYoyb2PJp3FQ#_VjevYQ?2xm`dWF;00Wv~atbtpxa?=dpLNqm#jSG=!6!p-($ zpw#vo>G~c0A?2$ER1hHd=THI7HHA2B134fH9zzbAn`+jCXOY-%7+C!oV6=trCSQQBMex*AutYCs8j zbEKd$XrL+N$u^KPHL1f@$w32C&FVml%r^`y_f?_P=0J-8#*$S7a)`wdKne7|Da3Lc z$eEgy;X`Dg_fyTv06=5Izg#M7?)foy1ko(&zgSwhR?6-lOsYwma zOAh+K0DR}J=fc;g{~+@`v49eD{ZUJHs0K}Qz16LR9!*|7wgh$(IaTaTE6#)-V_rS3 zgaR_Tn9G?~JPAEEyn1{I?38jtS2C^m6MCF^^#l_NsO3m-Gp&RZdVF~GL=)Jr%c>XMol8%=h+5I>+SvKuXNK?YfZ0T?Y@;{z(2VC zG`QP^AI*t%E#b?EtYFBR<}6>keY7=nr>es~Zl1f_wpwd`oxj^H30Z)6_i0);xqzf| z-p_<@BZ-1I8=4Dz{r0)bP0kr5+A)iDG}xO9L@pVv+C$&#Xx?lt7`tSQX_Ne@qq%MQ zEl_F(hMit8j8zP)7}GW_BYx>(gFXVQSk*R#5zhfMa&-l&j%htHx2p|0b9Du&j%hQo zA3!TqSKQJu?I0ciXqV~=VI9*?#5de*(9^3clypo7h@S#M}?gbBPH%I zKyP?dxC&)c<02v1pksJe_z5vy$7KR&O3#W=p=>(bM*z*?SrI41coWwdpv65aUI}G0 z;-(?lJT{sbC5@^_N@W4mC&~)Iid;aVVFT1B$zsNi#79o$0MsYVYR8Vei%i1>s85z< zemPPfIh7mWC(pvV66udj!w2wFX60UqEJ9Ab2k=v6N#jHgBhv^1{M1>CIFU#wsX_q% zwX6W#NG22-QGow?7BgPtBa~Ee1SmJeBIP#I2D(Tn!WEha;6XYDaSV|tge$4iVB#AL zQ5Yg|K)D=P-YlspqKCYetfK=-Dwnt^l3eBJ=`P)eQ!Sc=@|JwT78uv&u`$bD)7 zdO9V~7VJ;q(+1GN7lIH@(r1n`u z1Y9i8ly+q)g3x!6d3_K>v=CDxh0rgf@cLkiXkAL}6Go>2=&K@HSgBV<(eD5>m53H@ zs-hVB1At}_(IQNZ6i3$rXigC=veZ5abX$Pt7tx|ly?P(r7oa6XwCGY5AE3tqG+0E7 zF*Q;O{VhPNi)gW?_DQ4Hq3}Aa6{jyjC86>Xw-K*A+($6o!szLfA?ZZn4K%LTx;^#( zo@RltR^Dd1LvW-}daTW$4DbIq?NTRPJ>{W7u@a1|ZTE59E;OHSQUI;$s|OF|PZdhK z^aH!kh=IH9PtX$Ocj}S32tsmF95({I#=Ef+1)y3!hbA}Y;KQOL~T*G3`)E-=RfORtQ>iG33 z%VR{etBPUj>;H`M`sN&@>Zmob?7}gHPfK;FY^$?*i-=0i4jw^X*Ao^BQuT2x!!8Jc z^tWh@Ha@5I%|(<5PJ-NHjYzdED8Ytp=y7js|8rb?Bnh`tfwQWeTPtMI5c^v? z{;fAPJOfTr;RupmB!Q0;d=Llh{PFMSzQ;Wh7$-aT zx|ql~V~aBkw;uA-=ECeTT4Tv{*BbLLxEElZ`yOs59}CgY#R8{Rj-!h~8Es z(^iA~zy!01D-?(7vZ@ecbZf(C)=ewB%f=9kZ-sA!%qf^zw1WMqbx7v{DSi zD*nv+Y4ZyHlDeSLtka#U#;mPF>4s!l)~5Ht{cc0ZJc)~Ty|LWETPXvfKdUeMJEL-r zYQ%(pPDfDD9#Yfczxlv-HntYayBBXOY&WYgo*UWZ^*gc2mzHA6W>%rvjRf>aGJN1l zo=^KhsAb768vN@w(TEUVuz^2hB;}%BR(Vl0muzVFIllN#BInXaft$t2S@Cb1SQN2# zK-2ey=lzo{Ll0&LW>DTv{?KZ#j!qVOw#@T%T$xJ*{G#$r5;NC8qi9d(3y^Uc2v@SYrGm!piyezj7r$zLTr8UkQm!BVL zd%{Crfa3|Kl_|!R;7s=iy#3H*-XgRYKE9OjO@~V3O&Iu3Z-_&e}lZR3*v3F#0VYY=&*F-_c0 z(~|FUh1{`c$>&YAF{=??qG}!83C~Fwt(yCLZwB96BTH5h?;rR4*j!UhqvyVA z8tQ)i^2JJGM&{n{G$4=o@$9D#`QOK(| z=`MqOqS0bZOpeb-(6}Xhny;twUtTR!~Hs^@_k{dtSd4e7GA;%iBlVic!%; zsshEGmRbCqYLv}O%a?`BLA!s~M1jWsY8)a<3ywQs;NHKkDo~V>+xXlQ+2<=v7jKk6q4onVN$BR>9r}4`0CNhtD(9_GYn47ie%RA#`Gb~f&kxKDeQ38W|bLv;v zd?~Q<+NZrctes6wnc91#0EwGlxGww-0 zVQylc7tW)?SGOsrYq~vV$i6gEj1k{WU*%lLYeb$j9h-(fJKWibcTd%UY;VHj593yI zf~oP74kC~a!3bJBj$1XQAo%v?*x@03eajkqrP}8KB}C3X?IW$7Z<0Sn86!e$%fn*c zZVzsjYXp2G9<+&fJVJ*NT;^#nI?$+ThOER*{%SPO0Zzr!+pcxXnKVw5h zRJhO(yWU5k*|k`fi4gsI=#%mb$#pdeJ2N{{qgTS~7|3}v^a+m@M+u01NIJB^!!3)9 zK^b8EoKIN(mxO{C`7#MCxt)dVbqm<>_`6fW;(O;GUyEslhiY<%)hg)Ti1xYD<48S6 zW=Ct#qDJY2boX``Kj2Iv%qD|=C6e7!0z!6muUgf=Kjs@C*Cjvo}@8 z7vmb7@sjn7?0S2Pubc5O>%Db$#bLS97)$B1w0YyNmXTF#*|q|fi(7)D)Zh{*`}{-n zZkdnyX>g@?hda}l&ghk$0 zE|(3!lFIvn!z42I_{=Pq%#dd~i7GH{CwI9eI66f5jZ!%L*VXX#mA>96h=lSEw2K{5 z8O1)xfTk2-Dv#$hB`e6%>2u-OmTF&W;u#&5Yd)}R-T2PNWVzdhk5U^0(ziDVGfCOmjqe-K{w$yR}D%i>xhjA?U+dxwm9u%nH~Oe=pc zOlx|RTqH<+P^R;a!bs_}(J9XqBG#b@o_TMVo?B17m(3309ny4+y;>3$;~on@cZu3X_H!7%6cHQxq6fZ3rD&svlT=lW zHnHajok@z=Ny(8P61Bd^{y})IB^NsQZRZDKAomy22zDplhD3Pl9clSGo`lPh9>Q?-i%TpJBXu&%@R=rH+ilNSNF6_PKA9aR` zSU5gL_-x6H=E;;5=vnICc*A@LX8=M!A#S~uP^+~?a?owCy=p^zGbH)nok1}TBXu8u zE_(adkFNi`*4P6F<%|p!9PCW3OirAJ^>mw!2;p8@aY z-RLmt3CTcU$?hrZnBAYN+ET{s#$+}^r->$CS$pRQXIf8c947l&{w6klhGEUJ4Jgnb`W?`>X6j} z;w0#2$goDJN{B0m)7&h(gjFtc*LL2gigIUtZ?I;>+T9&eQwg`*nlX=NjqEor4(i=Q zEwQ7bx6lX?rooA8`rdKHc>Qy5RKdEi@t_K|NadXKvlWqbqdks3a($y< zQOa=BTQ~Oj+@@PxSP#&CnfuVbZBGm^s=I(=DzG#n(p7}hry>%jdceaM0>XFTA?e8A z&nMs+=}hpAlMCR)Rn^f)_G9zEDDX%CaA_Td z7xB)>JKRTGT`G|;HU^tt-;wSfXBa_#<;jB>4M230Gf4vILO|HR%KQy^ zzV*H*NJ}F_Q$4o7!H%x5(^Pi?`!A#LHwggbOhN}n{>cI8k zNOiICeJ8MgtmV{BE=qvk)MvT|s9XwI*ZIcVQ2e&>caE-@i&9GU?zmhAq>KSS=Lcbc z@ zBko^g0BlJ;lLTlH5PpBTgI(q7mH|!~pi-#rjX;m0qm>Z1AR|m*LYyEBxDFUl#=&0e%ho(N^Qrq$7H)!aot8{)RgW?{u0H zPH<-?jf>c`agEN;@na|0f5!f#(~f^RzGi-FNM|GV(4J}mP&;DB4LGC7iNMo2?6(5{ zJSY|t7YF4e?9avaopnKeqI_;@Fgrcb{IAa&{f}d@EFA{!1%lb983g@@?#-)3I&acE`4D+qT)UZ95&?w%xIvmvhg#_}zQod*l86GRBweu}AGM zW7n)zt7gqwvJ$``NB{r;5CAWd$v-q_*N(;j0RS2x0RRxc?rI3ySUVb7JL)L9*%~=$ z(YRV!4kV9B-_pScJ^s4;CAd#*uBnO_xLUVe2ST(BD9L3d>6I{)_;8-eM(!UTpD3iS zz}h(VY#jZYC?TS8W(5j}!ld|&4YwY~a;Km!g51Ns13j}ACcj4B)I@KT#rI7A;d5)> zZV!-AUL&K9LBwa09fcUpuk}{f%=p6pdmK%lzlR*v0MOHjtLG@R3E?tZcoKNJRFy7` zw$pgk(w&1A|6%qmbB%3wfA9lwbr@m;fbR% zfRk_)!T5|j75)zL_HXcfdwPK+RT+t9u*su)a&r&Z=PI%Ybspb$E9ne}mePK;)_6Kw zr&fDB1n~IAssah+-!dJFkgfS;qY%pUU3Uk0KH;hkjo>bPKcVA$U*QcmoCE4_nepwE z(`m1iS{p8ez{AzgVWe{f%wc|Q!E1}g{XOb~y+)19dmaN5Z4{}wzk$GLQdE&CVt z000BlqT*k0|KkVj>q^Jo$kKuK?=}!$cklsZJ*9hoe_cre0RTY%!-nP$%c%GX^FBHl z-^+l`fSFFa)gH8bXx_&WFUbr5o5r zhYcfP!~D#qb+BGt4!eeBr;D|eZ?z_;N<|SI$x5h2)dPQ)=Q}2TIAX1(yk&Yb&_HfX zptf~kr3H2nx~M@4J~7XNv&wn_|J^75>9?_{#0C3me-&;1s5G@ajY^o$RA&=$g)QJqnM-`tDw`7&Rh$eSmeZms5q# z{<`_gQgT_q>8|5D9PR$aGwbx6O~Q@Dhzig6PjlC+7s$UO`)9N}iPdNcd_m^%746^u z6*2=Gd!s)v3yRm0=%Yglz6AXg9PvsiNMILS^Bb+gf^sI?47ziKX2B(zvHsj_T5H=O z(GGrOmziYGaBPxux`UmR$Y&H11rg2(A}`c7GF2PjBMUWg4rlme)(A zgVWBa-S!8;Z6rBQtwC20(M2EBuHd)hHHX{?PO=LRc{ovCw!a=x@kJCMQRUwz{)Xk! zy9_7NppvXFyGpC_=r6BZ!tV!%GxvQ!l*L!!L!Uo8BUU`PGAQC0AL}?O1$dchq6FQ= zbcuK1GNO3NdtUX_S_McpE7>0soC__5w!n5UokD0zi5OH!;v3BXsZjGo+G~v|s?HCx z%Vrioc3EmxZhJl2-vaonw#zqf z=K2FdvJBiWydY~#*o9ioC4`bkBdH#K$cZzca7u+;&J3iFhDbXk<|cQtcxdI1&p8tJ zF#(6yOV&~&2U@v7>$BcHrC91HMfI52@NhVK<_g$n44{<=MpbO%#TX~|)5WHsUnCpi z;iwmU-z_;hy+o~S=Foi}#P7Na)Hk2%tw;`}Z)28GX0--kS95@0iHFzWIU6Ckfv~F+ z!--zmiu+`g{D3B$a;|v-{NDor^{3+uO!e#?|C!AG6Nf*N*%uCf+5I;--oWFYN58CM zz97NQ%>RL1s*_tU`#U;1CdA6n0y@e8qR1mK-1ErCOvG{BOi#-jIkb)E=U zxUcW=_IYky;mTx_mwl_iBGaJL`UX{BOuxUg~ajZ1u=Hr$$hFG6vrw2fQF zZ|95c7$N@%-apfcJMc5h*#FH94F5YfJm3+eU+}{}l>G({bX)~XkQ|25-`cz*Slrmd z`9wc_4gR!!i{|&z(~}wDTWZLmW5@7HgZ0eN!Oh~UU1nP4gM_UZw#B-*gtI}bm?zZs zG*%)HgQX&PRg=v9Go0i)=U+sqfpo%zDo}y;S*5T|tXf@}|&kHTcWA zv)t~VLH4H~uzSu3PeB0yHqik9{wO{F89e_Cgafq=n>jjoAJJVOi0`|g$fRcVvjP!q zk@)>fLeH+wh@?@6%RSD^P`f@ymPh%x0Zs;Z@U*3uo?V=u7nAJ8G1(cY^UsojDk<%{W7Qu3GZv6AQZ{cF)b{C>k@4_S+{ib`Eopkfp9pQXJqI0k-Dzee!_|z@1MfGds1>fliHX8mbOH9# zJio`7D1PtZQ|eCzvS`d6&=x~h%}_R?JrstVq_$5hPqJHLZp$YQ@nW+XDW*Ubl3riN zW#a3$9TJEe@|Vae1J9`y$pus>$Ic5OtGNaM&e5Y<2uEng--5nNmbF-Fv5h3x+I~Xn zUkcKgvBuE?7;KotXOwNt>(}qtO=1|fAC|yl6~G%qr1y#(io`uiB;YQv4DiE%`=NkP zo+58nq-92xsR0X}RUsWn*fKkctu{E+8hc8dduHJ=swG;%*yBgKz!gR33y9(P4GClDJccuP|KR_5;# z2Bm-?!PG*5#2j=OBwC?X-__AwS!#tXP68lSq#+)mz0vRrgGrErUXvi5Bu5Idl;6{5f4rT)fV$)u%+! zu9&k*A)=8N((1XuCCv&4i%%#g?FT?Bz=5*xbiFyaOBlm3XyXx`;^rdEYjX;G8Wb#3 zh!LUdB8I=2`(WDutKijn{D{lsnE3h;z3qOG=EA0(k zp3ARcx#wDmS_ex%r<((Pt>Ak6XnMo7S-S%)z@J%yclDA20Abd8Y;C-&a4=G5H}r;Q!U9Ki>}T@&YYtjNqJ|FQ#+JLE%%?#1h1B0$B4%58Qc zV>;t*d&%A^oQ@vb*BqNCEJlcR*U2vi*Yjb!^$-OglCz1$3GAGi8NP%K(1nK;3AozX z*=fGm#n8UrJ+0PJ@2iRt9SnPEW`}Lt;~qR6l5(R97Ik$q;c01M{FPEFDn0FzB`9Un zbd*`4GX|!8i7=9rd>7K${aR}Ht5&9`iagG^^ zvx;uQi25*%nY#{ueczxShV^vESkMZ1#B2}7G>iG14F+~HvrKpuq}iftTP4#vju{i2 zcAzkE3N~pu6Mqy_DT#ig?Dz-+TfmigoVXW0v~ij0R`-XtJbu5RRm~L9>$*}Ffo@#BGMz705pf&GMLZBdo3&wkMHt z;zk2%n1|W+mi;UVXtgCD5nh0?BpUAVn|v zT%|jvA78UjcGUroF+ujp@)us;5+BvljOnv#TgK^=L?DJheq8ygngrQa_Z%V++0os2 zOlk-XR$aP>i@|H50~KW!LksR#6hKNBMJm`DMDWH`ONRDm_?M99BQ&US-X?G*5q`8$ zanO%J(^;p+NoJWjXiI)QWD?H5TKM@SXtEh2f-nkm65gJPzt^@3m-fC>M*agw+n0M<0ui z7O#>}x-b5-R%tlMJ~0dFRPQli`;K0fa1+>K3)~}l)mL&&Ia&*9rI;bkq`EeZdLDwT zx~H%k{Zu8knn}Mjo1FOX3_{oCuZ(Cp21Wkm?y#zko#<7Es@+@J|v7x=|^L@4tzd zxUMSne>ZLiijQQKjKCmL+0}s-`O~rQpq+19hdn9o%to7}-m8s=y4irT>+r3rGLVDf zVUikOQ}3E6h@hdabq`>8snx9zFlOm)=9O^&bli=xD-$_s9KbL@*KT3!L@VhmboL6z zLvzQphhi36m2A{VfGd#~Xp~yAwk_GYVu9I#9D6B_+f|~d#MNj8TNCCOrBKN-vF}vP z2cnd6m*Wdg^;4kBWxnWx9iTV#)J=}9z(;-BU^!I3t0@|*SY0b|K?@UiTLS@Iu4W{> ziupM+J%B;nLXvGPww>UV&6#o#aSEi zAVIt=tp-8%mn!LH1~K`wL89*!KfK>D5uz;4&Jz>j=4|+Ic-m=80LgFSF7-v88_Y|5 z`HHwo`3>_a=5`F$!xA-v6Xo-%lCpJ|IdE6dg;VNH@eac-qFos_gJCVGjdWeq4Uz&?DwO3;}@>j@?VR~y=&!gODt_GuGq?Rze ztd=kuI2TJe`tJ>w7FU&$8?{$P-2^gS08YpvHA$6!qyWk4{zQc&!qaM`SZ4KW@<3~N zpW`e4#oVRp)6x0v#zFGXTox|X6A{O?=@6*0{XJvW?I}bfhBKz=H9DBE2CF{(_L)9w z`evLy=+e(XQ){fz^=W&6J}c`Wwf`sXUKrKX2IgZ-?Hwh3L~(=xS3r0%*|1!CNYX^Y zYeexkYg_|NwWbjJsOJ&v3|Mjyk@snat%x&8VP|FGMf-&~X52i5oA?0G9jQuN!&}?=l<~tM_I>;YVr&OHPmHO&8!$g6DzUg2L(TKZK#c zI&l=&-;=DDu|?!)Pc@V#NVBCgM-Fe}6)$1HW1oG;bY)&1hOZ9MJ7ZYXFHj8fc=*z> zF+iP&lEd?WT`5zf6HE-2if|njDnLH@g?*wDIN;db2c8nByuEO(BNEBxJW_?}4xaKr z+%ch%q=QM%wy7l?=mg}SKBm~w1Nun!u0*pULpX1xx0ZZ(s{}s*oB4i~mw#x``0Y}b z*&!uNcn>Z`C@GZCglX$r_f#8eG)7a6faFw~auhHlcM#UBmx?ED(1wj4+CUmEDf3%U zK+Edc77)ExAPA}>@3BlF+?0E4>BQ}9UV!=7#l2lv_c5bUD`2zqeA>f&c0R_WZS5+?mN+if@nd@WFke$sz9CYPdZi z|FZt-k|6(29%f@{WAE@cMqZd8XWdH&6I?BS0MJ6+kWMi=mQ~Ds29lgUE%qZaJ~C>J zwoq~vO$g}5`16^EGOnX&`a9;s<+ZNiwNaEr)N};>pcXj1X(CErulWs@>HughsIquM zV9#E$vqs5S85qXQP`+>m)6-Nh=ZSpLvPNX--5PEP^N4(tt{kVFD*BN2v>!<-j=Nlv ze*NIZaUAU+ss~diAHj(}@wU0LNu3dihEW|!LL+&4mt%~!!Tj0eC?pf^LsCep`IsXK znD^Ew;}oNV`7d(j=HH@?c%(N2T2^*L$(XOjQZ;7eQ~|gwVy!B>yD3bs?Dun$t|4d$0vOzTl$p0 zCq~=K3&{?Uu#w3)U z5E?2S#EU6Rzlx%&4}9kGhrv?l2|?SAHv#4YC-!uFxDN>`A|VP4lyzAygW5N8uA|*&XtAxEGb7J0?q*D_*R>~&i+3feiu~;$Sp{3Qg(e*`4{1G|s3>p; z$-elk&$HF*I~w*<{-km9I4A>}Dj+c(;vjm3UeAI|UhgaXfNH`5Q=&p?yg#x7r15-| zh!R7Zb<=7Kc=!2yF7!F;L&;0mGUiw9}@vrcq0w)EATJiMC$29RzVGO z{a={G!g_%#yP$d;>UlC2vVr;=Iug)|(7Q3O)}M48F2CJ)xyUY^VxY3U3Z{`J=(us( zOIL?4=GR7RI8hMR(LKzUWw3a_kzoNh*=zPkO*kVNN^lFC^%6B(6~+->icE_PkD!AF zypCxr(X~Q3_bo7D8YsQ;u8*VIeh7Cv1{)6;St>em!x;Y70#2PW5Q%#y~fo!Hx|_kSnFTEflT%K>ly7l~F8cRs71JB^2p-Cfm$ZIi`bV-g5OsZhpv& zzB`LAZ$v=gK*Bb$LodoLj8U0QSXzJ-$hbqPwP2 z&M3_>s6OII)d&4J-d-{hyi;2My*)T>j?#xMCLP2#uRvq)n{eIYn4qz&x>rL^Mn?89 z+Hws#XDx=6!cWiJ{{wSu88?A~|-4l7dWQTvxv7BKIA`(P&LEs_kR z6`I_3IM*oI^WwBpVhhTp*tbg|&e z7_#PD1)&86)+FSO1_7KyT$QaslZF_M(qbA%z&c>FMS4zwPBY z{cM-yxen&n)x-rEl=9s;pRMz^lYEBk7h!>@!Y82Mzui>hmV#oXDqMYq; zj6#}q_H9Q;BWK$^-zCRoNu_mhG7g2*P?N_jx);nl36u;HI5gT zolNW0U*cU8^_u)Zq$!g(V{U32+1Ec0lqXwC<&&YxWYgV2L)0+rIBrSfpd?Xar@|}t z?fKt2#>P*FmJlES0C~j!HOKzRhQD&`SEuxYGR_C!0{UE8C{7mwvNQlP_UVj7+QRnC z*7>AOXNp)VZOMsTim~n5taWUl%j4oY^ZcUGLc3K0?4f)^>|z~EKDSqLWOnrmxo}YH z#y1t!&z2wad=0ex(v9lJebB3^EhjOzfI$*%K?PasrNff4RpV%)pDczg z!UKhKtj-TxZ$@_FhbG+e1B#Z#O=VV`dv`YRypOY2je9z!xpgu!BZq-o_w`SE;ON%$ zc*s>wUiK35lW*}hlzMIBH$lM@8uM8W>m(h1PYMSW`L48i+gd2nVYI0OLwNm~n2mUF z3DAN4jbSG0P?x|W%hMCyo#`o$Eox~1cj9hwO8ev=Ke%juwh7cZQ=U@W9)hg)4fGex z|CZrMJHNGo!{fRjYD<;nT8N`zt5G@SKU^olrAE&x!=gC;hq2l&#@myb?Ll zdd8ro#7A=qh|Z+(^BcGp1Y<%K!ETkMORWd5j8fu*ob0NHs`gV&ZhL^c3vHV1qwQc` zkERDE6Mz+A12$qCE(jW@!QdvHuBikT6$eWh7tbQTX0m)>znXaqHNl3u ziE3nE%iEiL28b6|M|zUzsGyI7?VEVESRclzUwWehxw{OpP%0<~XiSk;=cD?W4d2Py z*_x)5z(__hsTCP{;6_+JTO>vh25kq~AXA;N%|gKASPEqx0HKV07|otO*59_=Ge+ca z%lm7VHs+gXB;C^>C@|x9#zv}i{BCe8C3g^TA-QvYO;d=uO)vv%cANt~{(KYDr?Cc; zhBbrIRbn;3tU!of0da`BZ2?+8w$$&(9s=`cMCp2_@qO*~XC%5doF@)(;3Gb@vGm>y zsYjAVzMMW$*qT6bI6P@|AIfQe+W|YViNT?^1a&~fQY}&6-uQ^ZrZ(yW#?~J?b~VG6 zw^r9i>T_orlA2yu=^9ntHPa9*&hRnRjmbUX(H&FWt>t$KJ@rbTACCgnE*F!0WqzG0 zG>FN#Kx9T$2W6`Meu~bo8FN)273kthGa$)Z&SSehv50?+QoBFCcU6(YtrtO^KZ2_1 zwgKc}xW)Mt&V*_}=Hw~3uGRhM^lLmJWBSU!6mbYa2L`-n;uE(8qs=X^XfyQaS@FF8 z)2TkQO-*2qCpWw8buU!L!E;y@+2ZHU3=XMXGD>fgFSAmUYvwwXbd>e(OTuP}%bSvB z5{Z#2!wK#aejRh$yi)dys)}Cm&?8}0h5lxP_obsGV@X{(02y4v?$KrvE{PKTICBCv zP2MW(>?E}MQ%VJ^55WKIqqQM+x1oK>ZI@r4zYBCWR#so5Jb#w;m2wh)=$;#>?%=sz zgrpG&{^zn#xk1U!Ggy4JL$xJ5#>N;KSzQL4(loO0`aCk1W}EwKJg!baL@D~YDG`#C zp-N?1Tqy3JjUK8N!j=YBUg5IGjIo=^k1lRW0=~lqfq3${8i&>fFiO-Q5)t$KiP8yl zs>w((!5knO3eep>=}O7mX}VhTM%F$pQeqCWUF}eag~1D=b1hKwSpW_WC*rm}Q`xQ# zUwRKdQ;@fMWkZ^6wNoymoZc~LkUh@<2bsd*UAgq)*g8WKI+~}zfj%tvaQ?l0#V!rx z?@*7XP3-9?BgR?VXZs6)&WNpWKQ>mb2IEYhI5etFSrf`@9WEqV=^P_)6>7#PV-oPe zW8-n^{F`ro_u_xboG^bfBtv^W7c*;<|C1n!@Nbs?O%natx7O3~Wmoxy58;2c|LY(9 zQx@%v9fRtngBO1E|AaTTnRUh|DB1{}uAKjdHhTiRMnoicwuLF%BY;|^IjMO#zJn7! z#8$(}zJ*DRe*j50J38NKO{`fqXAC|LKFPJ(r7b9Lay_%YYtx+aWIf=xt8mYOv@Mw_@ zky*W+AX)6TufC8v6at%%)h7QaA$)(G=mT%e*&esg4QZqmv%UDh3gj zOaqGoWCRT2GuI2U?U`0s)j?QW7-7xM+Jl zIt|A9`54(U9x4dDJYgjW=cdk6p<;TPkKJ@dNHQfLM`qPF!0Vtjq`8~~*nMY*WnGsC z*TsEpyv+BEQms=dQijsGeM8$;gvFDi(u1lkDGjI+s%MaoSTvqtn%tUJcw);X9?^8_ znmro;K`opxGEt(yRaLfztlzM6FK2pZpGz+@z#^N3V@fVlpH)uclNe{OQMdwd1%sGV z`1jsrAfY*VnqP}P-p|WE=Baq4`Dm2(v{K?0(^;)Y|LZto#*ri|Ro|3(j{H;sMKD6K zx5_?Il&UJd>b;G|h;KSgUO(m8tbc7R;ZD2HjtgyL zZoMBq*+rS>qw*FXDdsgKbH|b&DV95 z;)wMc9egM1F)#cnJ}R{OE(W;)CYk)*B8q9+1KRZNvc7;Fh#l3~^9x)fn;kq7GoE|$ zqj6!w83pB&opw{X=@#2b1Ommu-Y62R`?|cQF7eu^$mLd)*c&QBvxY+V)8qKbM*y%E zAnmN8rrZz3F``n%>-M^4?&m7{nKXWh#4bfF{}q z(Y%6haTx=uv}^o@2C%)yN{(BFZ|%ig6NGYjEUW3Hs={tfVsmOfBK`*RSiHIdo9c3{ z;bo4=tAIC)sm^qY=<@ObF?cxBY%-$Ik}M!niITqXa%UKYuxzK${XL*gYZouhDt3Dqx7Bbz zbyQOa4p|!JJc2gjmx=fhY}v^Wsk+CXgQ;A9JG5SoPLpzZhU;<+I0P8#l*DKqw z(-|z>KN_#-(Hl`~XtfH7=6c4;N!n*lvp5#mX^>f56R$ZLT>qWkc z5VpAv+^Y}e1C7F_TRl5ty!r5i`qo4xaT%se%tYUt9np;iG27UGN_hHdBzXkH%h+C2 zrw{8F#cw}A(lN*z#BaYdT00%)BBeS+*d032dB;Mb=_Ci68p0GYgXY;GczkaldmR+xvh~&p^_WhycyQ#1UF(7 zx-k=zLbP1mD2G5VOlzGz(Gm?9x#7m1xf#q9d^}+VC1JRD1Oa|3`M!CEM3JVjDRvCu zXsf~6-pU5={1x zf1m(}Z*MNAZ@#YWPdqs>Bp^RN{22kVM0kvP4OdnXm=bYnnj?+M6w*-omRtuyaV~)*lZN)k#3Je*S`*4uXw2nesN&(055xeH z>EV*tP+y1mWaKNzt?Jl4lsxOPo=Z&O$#sm|E+Z7}COLq!5DQ6Nvi;wVVb*z3Pil<% zA5kjqrMy&)Q#gK4{>=UrqXBp{^Gh~o@wmXH{WMtJ_o?Kf8DRFaJFrije8(LmVAY%1 z1d+fm;e^TFVKGhFi&dCo9MV+BaL_z7m=Ei6rJzc}1qpw--?Q~#ukMXvavz}?f4Jn9 z&{s>AAQycm3+Y!QjAxXfaf?M~Tj}d&Q&e!kLSemmv)etl-s>+~#w8M?DHiJ0(($Qn z+Abvnb`~u_dY%J2fV&SSEx)`c-hnsFoUK9-gO8OUdS~-z=~ja6oex1^?_z$ChR<)8URJ{G^oB%Z-df;vt3+b62f$O*`9Od+FrRUcR(L5Dlt?v z@@6qI3fN_@igf=iFiEe%g(#mkybDbT9#3RWXvsZm}#es}thqa*3JcS(|;&ysj+B=|n^c8j!} zmQ{Jo^F7OfF8Nwp^I@Gwr0gOozqn#a^N`T7kT?>1g;D8+6Jc_f2DL)9A1WsAbk zAGjx%<^zYO%H@|@>*(PmNCOpdjEcGE65-jGOl%|tqhC|Y`lK9aqFMvpDw{{eSY*>rk0n~WyF^QyspgkAR5 z7KVX%LO{3MCg%b2L|s=SjfvS}{iW_7ta|xpTDf`Q3}JxtI=9vW8w`=!1zT5?_<(_& zkYU>|^h;WMifp2Z0-jEkGgm?bA@GQK$N`?=a3+-egdKp;{J!W}k}|MH#X-#YGnb04 zR*Y&cDIV&BFJg}I$(TExC8(0njj#p0Nvu<<)tl?{vx$t((1gwgZ^YcuAU9UDGVMcV z(|*=)S%$u8Dk$St3z z(K!i)F3Zcwa+f-)!e|5Ip|>34&LjESzRt^UZit@ZxY8uShOvh?UNHmx8ci5=*OnRw zQ=!E;tSE3Ww-ZMx0|^94*A-V@GNTQsBweOa)}_>^A`k7WB|kxJi8s;Twuj2=a)yN) zVQ7EFg5Ko^1Uwc z+dVOL z-roWFR1Ngt$?j%9nFYyU^B@(_Dxd%PD1UmD%GnXN6hp-5h-}4-h^LQAMjSC0upT9` z7nglBCjZUYEE2R}G>`nc6HVP0848DxOY66uv3ues=6*JD>g2^9Bh|F~dWp(l9kEoL zkeA) z>ewGjWQu;OEFOODQ+LbE$qh40XEsP=F#23D-;T<>X(U+7lt#@8ywvfMi%_C3QD&wb zCm=sfn`AcAkaE%mVNGaI?U2iKP4s)i$}{mFz?yDCy|oc2Axkmo&F2nGeXvuULQ#LO zD}mPZzTERbc@Gf$ zH1EVW3;x$rA3VRkt9WP$4Ci&YSDWVB*HdTC^!;XVpMM-+fB-Ff`uaTjGqx~OL_m7FxfrJ@xLi(>schm=L0h)&@V`C7l_0;d@Rq7?`C7sJ- zXH4fH45alVsrp{fJsz|jNM3+F&2o3tTn57Ul}iE$!;eRAKHEem4`xQolI+#ghFsba zYznf=wZUeCqNE;~*%@w$bjgGMqfeS{U70?g$?h?c<~=4ILKV${SHh(fCrg%H4Fq{d9ZRnU^9@L0LNVgYGIE*qfWa5xb8V*u%iH}KO!dzaxq0T z_s#U8oM6ahzMF@w)%!*eetT?|aY>0`Rhe=*np#4wH zzIyI%kJgrjNGM6DsK-GvD(O$pBvLPZqkD=NNH1?BH_K+jff2ZQmHCBR*9F9>fRBBF z1t%){ioaQEk)OP6%cQ9vWG|65Bil;}r!y@hdh}=WJ2dgt&oX zHp?f5iO_7lTd??sxN>0{(y|ZOa)`YR2;TvV-~k>rGDGZqNhYl-3Dxg`_N?cqXR1Gm9N)iauyad$5yU8eU)iT2B2gHjC zY28+LEB)!fed7UO#Rs0E*|8Ir>JM6xHz??Iu7wYkHT*?>>5vu0WPqu`vYqVuYa-YM z5+#XiH?imiQYJ6uqn0`1zmrY50}IxRplr%Kyss7G>hNxPdivZR^nndJ1{d_U^`1F4 z6D1Bf?vws7_4$lSx`Ls#Wx099Om@OHIR*U$8uv!>MG&`H%iH4|a)mfAt=)%2)BYL* zNv7Zt~ zu~>2yv#XNoA{rQnYapYJnO3J`9EG3&5uLAVY1o>bFaiR)hoK43SzUSvCJC-bz8tV? z-m-r5$du-Vd)4!t4bN}{-bFf#Hj=YM<`e`J>4f7nVE@U9dh476fTrMXU7~%oVBIQV z7U$tPiBKfNxCSxZc0X-t$LvVAXj=i>0@dNS_R6^~tc_?XZDSJ`JsMAgs7F~*VUmcH zvD0R%n7%0~W)GWtNR)1Dw?KU}0hK4JGOZd=QkwH_0($sXRS_n&CV<-k$n+zs4M~y; zw}94D(#y|c%=ng7!{^|hjbZ3K$W3xOc=#kkmd)3tk=xfeqHXWDnbjt$a~pfy4%S3z zR|%<~8MAjZBZJAc)x3l~u_N-qV0j6!gg@$wq}l8JVSMCUGigG=(-Tpc`n&C{jT2|f zQn*LLo^rJZ6FZOeE*(_NCi5mIXNNOdT{Ds|3{nu;Nm=DWwuTPzFTIS^^7`{+c*i~; zE#Vq>nrNSYtg8Pch<_c0aMaVcH2P=f@6XlOtjFvD`IS94zCM3t&%f;c_UCW?JEPbM z>A#&a5$gzObU9@Tfhr^7MiLePf@|RN{lOAN{3)~vOKcM}$G6Zh^v+e!xo3H65cM?3 zx7v=C903B-HoCNmZU3~M@+}50G^sr48qNVNR##zt%c!CYCj8hrQE+U%vap~`xZHGy z)A73Sx`!g#fKBWas4Pugs7a*gM_s(K8MwgGH5Ej$<$4!x%3$f@JUVm7lx{akh*g^= zZ!snOnHu`b)sWWj7RR>o|Tv)VZ<4tq|cW0LRjHx)L^;8ehIREG*_6R(4X5ed>ueDXV%;pkIhTdLp9 zu-H3%w(vb=iHV3I?ik(RAESgy2l(d_=|gL|x>1P&YSB^2m8X#%94M}+Ytk9!YAd=W z=_guXUM>OFX?eHgqoT3moJN1rq?1>3UrlrPTz@AcX zG*CyZjPQaB{r$T1kbQ#Po?=_&^vy%8rEKKiklihUG&jia`aNy(kKMXZVOSnAXT335 z;f8wH$ZRnIq78nQZuGwNZQAaqEJHO|pIXNB##t;~JH1*%^IqM4f^Ak_X+!g-3Z*>okIjS+n|6d|h&lB`1Zi~W308o~ ze2J_uYGp>%cEkiqE8jGL=s^U zVo$C^k!^utki48wMlb1DOj|Xq<-2Vuh%0Gi{&k{Q=^Q(yGHe@ZZrkykcUt8vi9DHm ze$@E0-RAPzn@HleWA1@ueL*xgjZHVgz%iDJIzmU6;3&^Npb6)kS1Q82*V+q$BHlaD zh-k7vGcknC#Sn73o;(_B^QfD6ef8o)W!c5&Y1s$#@8_xNePDk2*Weee?T_d(?%uI8 ztdaOn;a8uT57G$d+7us&(yFq0HHt;+vy(~a*GL9u{z^1<;)pgHJ@+|ChzRN21~(p6 zqG_sitDQq2R4byEHUTAj{2pjq1I&ROkU1k@>XyKSo@KLkHnrpvGal-~CM}+L6ev|C z`?0Oz9W41mCJ5Fk?IgG3gR0*k_8XV@wa$wqJLY167tL`smDvM%#dlMQd6-a*sMF%%JVbqI?rZ&TN+}*5%9rKo0UGjFUGhQVep$u za!{;!ppkrUc&_~ixsni`h=S^GB@BCIWY#svO5POBsh3*<6Km4cabqH7P9i1LL3_fe znQX90PEW`JTB11((-`UjHyFPgLC$a6iQ-B^^=F|IyH%og<(g_Duf=ud5&BJHS1&>< zNVl+DHY$!c+5-*TlnSW5ozMFw8ErZ$s}yORaIvx~1K!v8ItB-)YR{|cOTRBTh`TBg zeER%k^A{Hs9Pa0xGqHKE1!NsiTiPc>bsRA)tJUkBtH(XgT@XAkIV#@1YpSG3j@+z# zvTzX!{nklv;LI+Z)@+`ZpYF07x&hbTf07$Iec6jXa#t??{cU}+`%%l|Y;Do>cs(em zgsAa-_7Nn@WZC?Ev@o_=yS*U0dIelRE3KmiJUz(%dUe3r`Ij@lBUA&B$*hA%U(TEZ zctSKQhBId;8Je>QKTy5u%Gvcz`{525tF>nr|do<%!FTcwf z>;+0Kjq%5`2ll4DdI!q$5PO zot7$pY~W}8%es#oDx8^oQs}$ z)y}?dMIMg4M}JjQMsn5eI%U`oqytsC+!6NDp2cmj zcGz%;XlcF)+_d*R_%7a?l(kVHfW~wDA`dz;^0OD42>Z2MBjvRK0STEZ$)W6eJs)AQ zX4LIT&fT2m-o>yQAon?vh~uGzE{nQ;WfN7ie!tlb=}DeG*V$gw1%*Kg9cY71)^BA1 zs-2#Y40hI?AM+mIV;5hi&E>s2KTzFBOT%e#0m9qbQ%VoJ>X9qq;9n~P;n(AXb(^st zoAq+0o!A9bUwnPLDM}Na6yoyi2$i07VbcalC5s{qTwEW|eQpQqxOGgcg_WPPwZ>12 z-{b)3w~++D$E!(dvNW>d#Gr^ZMn{1@&fk33%|{L-WXxny0m`dvE1%;>YV%Hd^vdi@ zgM2(>*fcS_LiBC#o&kD}D=S#VjstRT!978HqRuc?(ub#+?!6sMgpmvL69gbN8`gH@ zTSJ_8@o`+WMNVSu4<2-;n+M{hNTPJh%s`?wk{yOMA-xPzqVYNEky&JXGm)&8vIi?g zWFy&->#RdZqSDpp**f!PxTbgCWp}C zxiJ)QXWTP@+D&8BSay6t{q4znK}ACi9IgA~0hayE7`|E+W_|+UQ%=T&n79cMAZ3PP z)9~=o#r;JX5xzZTt1}9Ny+7Y#`C9q`xG9dE0+|vrf@Cc|p;6=lqXGX{OEaemC_?(8 zW9NHHmo73YxHdrglri+-E4m@`uw)Yhp*Q8_k2+4Jt8B}ZBk}IRuvOnE)M#DNeAXO1u!FXNoq5nyuiEEj~AEuEQtiN&%<5#ZvOOyT=hyT;n zQHoYFUt;A4Wfrg1tZ5pbpRyHvzJMSGqWaLoic>~^+4-1dapCJd=TRX!9Z^@m%TfE0 z+l8fx_k98K3e<0+pP*5q2I7G`u|E{3j`yb45+uYkOh^o%B2}k5ZSN>DFT1TZ$pcAM zZPxvhH&yD%>^qRsTE8pyZcD={GsaX=6R4>5)D?-9lcC2<5q|YIsC&n|z=3Zx?Q21_ zE%ZF0^@H?r7TV>Nt3>DCxNXx`q_i?^r;!CJ3gf-EeC6|=&#LHjSJd^EWUkToxSega z`z%JN*@oXCb~tjYJ+egRAmV1-NNNM<9QB2}a+a6mDJT8g*s`#mw*&)Djqd!AcQMxlH*%cXcaW9<(&5_#m+AjkC+7my)RD&V zL@k5_P&m~P5TueI1#Bs(D=0@EfmA6E^&lYBXHgIzEAkQ$C{it0jFq>$6$BRuQIWS@ z-}nHxH9$~teIQD$&_<$5kQg8A&AkqHCO5I&)pPvxc+USf-#2q-hM8|ZpR0SgjP<8B zU&#%!A7G941y+sJcX2E)8@;erHJ1$U=9RRE9e-_9{lIxRvaE8~Gkw`PW>~&eMPApH zqZc2SMGW)KBv{3*-jf{8>YkIbvh%NBNVDcvU(7t5a&4jClW7T;*WLfHAjC03nv~#c z;>xe}HjB2@YmQF+OxR4XxckO5@Uz2J;E@Q##rHy5?W5-nwHx;| zc-OgPCtmK2+@A8f?d8-}wJ94|(bJdC6tq4cnBW%_ye*}=bCdB-BdfWitFi<6xBGrr zc5tFn5*_ONQ-bnS^Y*)cDd%5QroD`9I45#4)6Ber`xf4F{W9w ztYV|`>W^(sFi?#QKkT0F>UGf8W@=1S=BjFsM6qy2q2OvM-%}Llam2*H{^(}*2?uHB zE&dmweiotEIJMbXA3yl9{BizQZlV(r4~8qZ`u|HWp2eVBptHMVzbBMUmu2mF(L@aFC*vHLe2eKga~ zac4jft*3rz$mkenSL(gCw&Vo|oGxtpmMi9M6zu(dVVCL6+$58kf?d?_P;- zF*6%<+1I>}F=DQWI=|_NeoL9YjpBlr+{R7b={4DRU1bFZXBKx~8_fOkX}P$#=U3(@ryh--TGt&Md;GQkwEVlbZr^(@%WO(7 zh%f3l-zF-Q4TQ8NM%w&6=T|pVx9=`ZG{1VVDS6UZ?d-f~$~|H9Qj>f!M-d|_md#Qb z?NFJ8zroJ0=@S;=r!CsbR&lY_SpCZy|5IxbE9SfZq+{RFV2;INMYxo%f9CDzFl0#x zb-~x80f;)e?lrbh6N@;k+qGz4iQd;zI

W)Flp((3(m>Hv`kP#=dnz7q3+Ui_<*n zyCa@d)93dSjRuw!r#9LEY4jZI#CW_^5iAYb3+$l}=t^~5NNJ+oXh9>m-QlqGyYfab z0W`kKkx&L!lYrLWfeFUgDm~tKP>tt*Lr~*05s6PamYjy2G{K_W@?5+}fsOGcf={-a zDvAcZj1c|f!9wj%BIsyk8#p9wu(W#Xg4DTz-2mZ#V=#sfcwpb>1`~-5RxJ*y+5u~W zK?AHZjbOY_dkUg$hiLzCr0f)$1R_#s(HS^WE3^>E$|E{IH8%?y{v7~IxpfB=a%GcQ3 zr$NCT(nbM30INws-y*`4r)-2mzD(4HNo^sV0rt;h46$M~kTW<&r#E0!1FMNa-^Rh- zIACYkB!+w`r_GtrXu=s_H7V%p5SSvwsw`S zI0P&iHe$X(v#4R{23s_2Fb)nOm;yE&AO;$+nj|!r7bY#SLrEH$z1m>l(*%};QTq#B zJb$ytVMP8VENz^!2Va+grLM~i8a0^{_+gFhv`iczX(+W5retvZ?yL8SJGT(4KCq+% z+R`at%7_b2p(Izpl!jjAf7H81&=Rn^gT!Ny0g^Q;E!1AEW+nk71 z6IfE7+6(B~&vM1(-`#P-+F)A*tgaOWy)lKG?t*BO_opxgcmTGgz`oA|bR2DUBRs&b z8ewVBaA0*!@92dj>_7o5OmVCEHJY-ss^s4B792w;$f)X#;?+1(pO* zyVw|+7#+OF0q>3|VSNxCVC5m28!)Q=hlqX%MV~tL0(D@GuWM3>Frf#faG0`nP{^}9 zol`G>0ZWFCL8BfP0;o0i@u~Qlp(Al{5KoNg%jG+ybTGt#g-O&SADDDlpp`^f=YLK! gYYd8$(t$6)2Kjw}{lq|{&BA{3vD=lVCF+0u7g{&$@c;k- From bd817ea8907386371f123426b66d7ee936f931c1 Mon Sep 17 00:00:00 2001 From: Josh Fyne Date: Thu, 16 Feb 2017 13:38:57 -0500 Subject: [PATCH 3/3] Put path back into a file --- excelize.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/excelize.go b/excelize.go index 46e0a846..58eb092e 100644 --- a/excelize.go +++ b/excelize.go @@ -27,7 +27,12 @@ func OpenFile(filename string) (*File, error) { return nil, err } defer file.Close() - return OpenReader(file) + f, err := OpenReader(file) + if err != nil { + return nil, err + } + f.Path = filename + return f, nil } // OpenReader take an io.Reader and return a populated XLSX file.