diff --git a/.gitignore b/.gitignore index 4c8e19f..a151067 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,10 @@ __pycache__/ *.pyc .idea/ data +!scopesim_templates/extragalactic/data/ +!scopesim_templates/extragalactic/data/*.fits +!scopesim_templates/tests/test_extragalactic/data/ +!scopesim_templates/tests/test_extragalactic/data/*.fits *.tar.gz build/ dist/ diff --git a/scopesim_templates/__init__.py b/scopesim_templates/__init__.py index 76a97c4..4a98e0b 100644 --- a/scopesim_templates/__init__.py +++ b/scopesim_templates/__init__.py @@ -19,6 +19,7 @@ from .stellar.clusters import cluster from .stellar.galactic_centre import galactic_centre from .extragalactic.galaxies import galaxy, galaxy3d, elliptical +from .extragalactic.deep_field import hubble_ultra_deep_field from .calibration.calibration import empty_sky from .micado import darkness, flatlamp from . import micado diff --git a/scopesim_templates/extragalactic/__init__.py b/scopesim_templates/extragalactic/__init__.py index 2320e39..cca72e0 100644 --- a/scopesim_templates/extragalactic/__init__.py +++ b/scopesim_templates/extragalactic/__init__.py @@ -5,3 +5,4 @@ from .clusters import * from .agns import * from .quasars import * +from .deep_field import hubble_ultra_deep_field diff --git a/scopesim_templates/extragalactic/_make_hudf_catalogue.py b/scopesim_templates/extragalactic/_make_hudf_catalogue.py new file mode 100644 index 0000000..e4473d2 --- /dev/null +++ b/scopesim_templates/extragalactic/_make_hudf_catalogue.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +""" +Off-tree generator for the vendored HUDF catalogue used by +``hubble_ultra_deep_field()``. + +Pulls the 3D-HST GOODS-South master photometry (Skelton+ 2014, +CDS J/ApJS/214/24) and the van der Wel+ 2012 CANDELS structural +catalogue (J/ApJS/203/24), cross-matches by phot_id within the HUDF +footprint, applies quality + magnitude cuts, and writes a small FITS +table to ``data/hudf_catalogue.fits`` next to this script. + +This script is **not** part of the public API. It runs once and the +resulting FITS is committed alongside the package. Re-run it only to +refresh the vendored catalogue. + +Usage:: + + python -m scopesim_templates.extragalactic._make_hudf_catalogue +""" + +from pathlib import Path + +import numpy as np +from astropy import units as u +from astropy.coordinates import SkyCoord +from astropy.table import Table + + +HUDF_CENTER = SkyCoord(ra=53.1625 * u.deg, dec=-27.7914 * u.deg, frame="icrs") +HUDF_RADIUS = 2.0 * u.arcmin # cone radius covering the HUDF footprint +MAG_LIMIT = 28.0 # m_F160W upper cap +OUT_PATH = Path(__file__).parent / "data" / "hudf_catalogue.fits" + + +def _fetch_skelton(): + """Fetch the 3D-HST cone around the HUDF centre (Skelton+ 2014).""" + from astroquery.vizier import Vizier + + v = Vizier(columns=["**"], row_limit=-1, timeout=600) + result = v.query_region( + HUDF_CENTER, radius=HUDF_RADIUS, catalog="J/ApJS/214/24/3dhstall") + if not result: + raise RuntimeError("Empty result from Vizier for Skelton 3D-HST.") + tbl = result[0] + # The Skelton 3D-HST master catalog mixes all five CANDELS fields; + # GOODS-S photometry has Field == 'goodss' (or similar). Filter by sky + # alone is sufficient since the HUDF cone is uniquely in GOODS-S. + return tbl + + +def _fetch_vdw_h_band(): + """Fetch the van der Wel+ 2012 F160W (H-band) structural fits.""" + from astroquery.vizier import Vizier + + v = Vizier(columns=["**"], row_limit=-1, timeout=600) + result = v.query_region( + HUDF_CENTER, radius=HUDF_RADIUS, catalog="J/ApJS/203/24") + if not result: + raise RuntimeError("Empty result from Vizier for van der Wel.") + tbl = result[0] + # Keep only F160W (H-band) rows. + mask = np.asarray(tbl["F"]) == "H" + return tbl[mask] + + +def _cross_match(skelton, vdw): + """Spatial match (0.5" tolerance) — integer IDs differ between releases.""" + sky_sk = SkyCoord(skelton["RAJ2000"], skelton["DEJ2000"], unit="deg") + sky_vd = SkyCoord(vdw["RAJ2000"], vdw["DEJ2000"], unit="deg") + idx, sep, _ = sky_vd.match_to_catalog_sky(sky_sk) + keep = sep < 0.5 * u.arcsec + vd = vdw[keep] + sk = skelton[idx[keep]] + return sk, vd + + +def build_catalogue(): + OUT_PATH.parent.mkdir(parents=True, exist_ok=True) + + print(f"Fetching Skelton+2014 within {HUDF_RADIUS} of " + f"{HUDF_CENTER.to_string('hmsdms')}...") + skelton = _fetch_skelton() + print(f" {len(skelton)} rows") + print("Fetching van der Wel+2012 (H-band) ...") + vdw = _fetch_vdw_h_band() + print(f" {len(vdw)} rows") + + print("Cross-matching ...") + sk, vd = _cross_match(skelton, vdw) + print(f" {len(sk)} matched rows") + + # Prefer Skelton's spec-z where available, fall back to peak photo-z. + z = np.where(np.isfinite(np.asarray(sk["zsp"])) & (np.asarray(sk["zsp"]) > 0), + np.asarray(sk["zsp"]), + np.asarray(sk["zpk"])) + z = np.where(np.isfinite(z) & (z > 0), z, 0.0) + + ra = np.asarray(vd["RAJ2000"], dtype=float) + dec = np.asarray(vd["DEJ2000"], dtype=float) + m_f160w = np.asarray(vd["mag"], dtype=float) + r_eff = np.asarray(vd["r"], dtype=float) # arcsec + sersic_n = np.asarray(vd["n"], dtype=float) + q = np.asarray(vd["q"], dtype=float) + pa = np.asarray(vd["PA"], dtype=float) # deg + qflag = np.asarray(vd["Q"], dtype=int) + + mask = (qflag <= 1) & (m_f160w < MAG_LIMIT) + mask &= np.isfinite(r_eff) & (r_eff > 0) + mask &= np.isfinite(sersic_n) & (sersic_n > 0) + mask &= np.isfinite(q) & (q > 0) + + print(f" {mask.sum()} rows after quality + mag<{MAG_LIMIT} cuts") + + out = Table( + data={ + "id": np.arange(int(mask.sum()), dtype=np.int32), + "ra": ra[mask], + "dec": dec[mask], + "z": z[mask], + "m_F160W": m_f160w[mask], + "r_eff_arcsec": r_eff[mask], + "sersic_n": sersic_n[mask], + "axis_ratio": q[mask], + "position_angle_deg": pa[mask], + }, + ) + out["ra"].unit = u.deg + out["dec"].unit = u.deg + out["m_F160W"].unit = u.mag + out["r_eff_arcsec"].unit = u.arcsec + out["position_angle_deg"].unit = u.deg + + out.meta["origin"] = ("Skelton+2014 (J/ApJS/214/24) cross-matched with " + "van der Wel+2012 (J/ApJS/203/24).") + out.meta["footprint"] = ( + f"cone r={HUDF_RADIUS.to_value(u.arcmin):.2f} arcmin around HUDF centre") + out.meta["mag_limit"] = MAG_LIMIT + out.meta["filter"] = "HST/WFC3.F160W" + + out.write(OUT_PATH, overwrite=True) + print(f"Wrote {OUT_PATH} ({OUT_PATH.stat().st_size / 1024:.1f} kB)") + return out + + +if __name__ == "__main__": + build_catalogue() diff --git a/scopesim_templates/extragalactic/data/hudf_catalogue.fits b/scopesim_templates/extragalactic/data/hudf_catalogue.fits new file mode 100644 index 0000000..0a15cb1 --- /dev/null +++ b/scopesim_templates/extragalactic/data/hudf_catalogue.fits @@ -0,0 +1,306 @@ +SIMPLE = T / conforms to FITS standard BITPIX = 8 / array data type NAXIS = 0 / number of array dimensions EXTEND = T END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 68 / length of dimension 1 NAXIS2 = 2378 / length of dimension 2 PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups TFIELDS = 9 / number of table fields TTYPE1 = 'id ' TFORM1 = 'J ' TTYPE2 = 'ra ' TFORM2 = 'D ' TUNIT2 = 'deg ' TTYPE3 = 'dec ' TFORM3 = 'D ' TUNIT3 = 'deg ' TTYPE4 = 'z ' TFORM4 = 'D ' TTYPE5 = 'm_F160W ' TFORM5 = 'D ' TUNIT5 = 'mag ' TTYPE6 = 'r_eff_arcsec' TFORM6 = 'D ' TUNIT6 = 'arcsec ' TTYPE7 = 'sersic_n' TFORM7 = 'D ' TTYPE8 = 'axis_ratio' TFORM8 = 'D ' TTYPE9 = 'position_angle_deg' TFORM9 = 'D ' TUNIT9 = 'deg ' ORIGIN = 'Skelton+2014 (J/ApJS/214/24) cross-matched with van der Wel+2012 &' CONTINUE '(J/ApJS/203/24).' HIERARCH footprint = 'cone r=2.00 arcmin around HUDF centre' HIERARCH mag_limit = 28.0 FILTER = 'HST/WFC3.F160W' END @J^;p\m?+ @5$?=p@ @?$ @Ps3@@J$;@Y+ @9h?ӕ?ۅ?7KVFf`@JD;c{?- q@:?ҟ?(?֗@@P@JJ;ˀ3r?F]cf@8\ ? ?`?׍OKff`@J/;ɼ0?@8n?ݲ-?`?Ƨ53@@JM7;ˋ?GE84@9"?ě?\ ?@Rf`@J;,=?<쿱[@:ؓ??x??|@C3@@J"`;q?#@8r-?n??|?T@E3@@J";;C|V?#x@7+??C?5?S @J$w;%?գn.3@9l?@z@? Lٙ +@J/;Vsyt?+ @7?M?A@?=p@K @J3Ko;ˈD?\>@:Q?-??EHf` @J7ML;9?,<쿱@9n?ǍO?`@?* @J9-*;V`^i?,@8 @?Ł ?5?? I@@J>;_'?/{J#:@6`?֗@?+?bMJff`@JBcQ;Ҁjk?PH@96? ?|?vQ@JC?;ˈD?*0U2@8r?b@?M?"@ ff`@JE6z@:?@b@?+@O@Jh]k<;6?*0U@78Q?C@?~@V@@JiQX;hwe?9XbM@85@?Ͳ-?㕁? +@@& @Jj㣨;b煶@ +=p@9 ?v?`?xBs3@!@Jk<;k*@QX@:n ??5?? @533@"@Jl;?9D@8=?? +=?ܼj@Jf`#@Jn~bn;&q@˒:*@8?n? ?և+@J $@Jq?|;Ǹ?ěS@6`?š@X`?+=%@Jq?|;C؜@=K^@7 ?x?x?-`$;;?j~#@:" @?7@@I`?ٙ>(@Jw>$;]@Sa@O@: ??t?p>)@J{Ž; d#?!R<@:5??ě?@;33@*@J|c';ǒ:)z?Zݘ@8 ?`@]/ ?pSs3@+@J}^o;y[5?ěS@6T?&?t`?~U,@J<;#_?E@9??? IIL-@J p;)?+@9?T@n?(@.@J);@~\N<@9l?ݑh?"?hr$/@J c;n9?tj~@933@?+?A@?\ I0@J@B;?c?lC@8?T?C?`@>L1@J1Q;ḍ?n.2@7=?׍O? ?`@@S2@J";]|?*0U2@:a ?-`@ +@?CPL3@J};R?˒:)@9@?(@ dZ ?ƧKff`4@J[vh;,s-?A7Kƨ@:?° @`@?A@Q5@J+;̱N@4m@7 ?z??O&f`6@JC;?73@:У???;`@ 7@J=-;Ȏ%?TɆ@9(@?G ? ?ա.33@8@J=-;ǴP?@9?X`?C?b@233@9@J^o;̔@O M@8M?`A?Q? @@!:@J@;ȹQ?0 (@7`?Η@?/ ?G@L;@J#l;?D@: @? Ġ?z@?1&(ff`<@Jb0v;A,@^҈p;@8 A?S??`@T=@Jaf;Gb!@tj~@9? @?l@?bM@Oٙ>@JG;@n&?s@9 +@?t?/?"@Rf`?@J]Av;HC?Q@:7?t`?\ ?hrA@@JJ;?C,zx@9t9`?KƠ?hr?M&A@JTɆ;`Ɋ?n.3@7_|?t@p?@TB@J9m;-?A7Kƨ@:m`?۶E?t`?ȴ@@FC@J%(; ? +L/{@:=/ ?z@? ?-`R,D@J;ɪU?g8}H@9h?r @v?l@@Bf`E@J}Vl;<٥"d?ěS@6B @?z@??1 P,F@JB;Ȳ3? qu"@8`?E?KƠ?ڰ @P3@G@J|n?;Ơ7@Q_p@7kƠ? Ġ?O@?Sff`H@Ji<;1d?E@:?ɺ^@?x?܋C I@Jh;Ǚj@43@7`?T?A@? @DJ@J?;̫`kz?-@:?"??@AK@J?;t:d@ (@7K?z@?/ ?-`@4ff`L@J{0;NF?GzH@4I?=p? ?*ff`M@Jvݭ;ޗl?73@6O?t??Qf`N@J@Bo;8إ?>BZc @8j?У?X`?l!O@J\f;˚@Q@9;d`?ȓt??O@Mf`P@J\ ;#-+?`A7K@6׍@?ə? ?VR3@Q@J;Q~w$?rGE8@7R-?ա@ ?R`R@JƼS;;C,?跀4m@9+? +@??@Bf`S@J1;gF@@5?@ ?ZTT@Jȣr`p;/%?:S&@:P`?&@L?+@EU@J|;2]J]?$/@9^?9X ?h?(IV@Jg;h@[9?C,zx@8?@V ?@EW@J_t;D@ )@:vE?M?ٺ^@?@33@X@J4U;Ίar @]cA@:u?`?hr?b@@QLY@Jc;̭%g@m8Y@8 ?͑h?`@?€@Z@JD;yC?@8)`?+@?@+[@JԀu;}?!-w1@9?@ ?r @P \@Jb +;SXl?阮&@7 ?"?ě?9`=L]@J#;QzF<@ +=p@:;Ϙc8|?;dZ@6?E?;`?X`LLl@J +|[;E@ 6E@8 ?X`?E?`933@m@J@;}-? qu"@:r-?~?bM?+=n@JzN{;Ƚ +Ri@@8???"?`?33@o@JC؜;;v?_Ft@9? ?KƠ?`A@Op@J~E=;ˇH^=?W&@:dZ ? @?|? @q@J~E=;{՝V? '@7~?$@7@?7@Uf`r@JLQ;N/f?v_ح@9?@ ?G Bs@J};ȼ'cX@ &x@9"??|@V ?@6ff`t@J`,;Żj?4m8@9? @?KƠ@Pf`u@J ;Æ@ nt@9 ?`?柾?$ @,ff`v@J;Cc?A7Kƨ@8|)?b@?;d`? &w@J s`;D?ć#@9}/ ?T?n?~Px@J +Z;伭@B@8I?`?7@?l@F3@y@J wt;ǠU@ Q@8\ ?ۅ?щ7@?̬@;,~@tj@7?@@?VS@J'ܽۘ; @q @7?A@@?@93@@J*{Ԍ;Έ72?RT`d@7)?9X ?`? Ġ@D@J+nz1;"x?zG{@:)? @ I?1 ;f`@J- ;c{?-w1@:@?ȴ@?^5@?bM=ff`@J-"; # @ߤ@@;-?E@ +-?x@K @J.@+N;&#?S@9 ?V?+?(@?L@J0ߛj;A?Q@4c?(?I`?t@R3@@J0ߛj;?e+a@9?`?v?j@3@J6>;.?y=b@93@? @?`@?/ @J @J6?W-;,d?`A7@8?(? ?/ @A@J6+o;\<?C@6^`?I`@?;`>ff`@J7GM;¤T?y=b@:?˅?Ԭ@?1 D@@J8|N;ɃF?Ov_خ@9-?`??$M@J:i;ᰉ?$@:$? +@?`?ȓtP@J6z@9X ?;d`?Z?/@P@J=dR;̛8:@l>B[@:t?`@ dZ ?ߝ @B@J=TF;]ce?@9`?n?/?އ+T@JA [; ҉@C@9&?@j? @J@@JAcw;i' ?y (@8?M@{`?Eff`@JF2;$ ?O;dZ@;(1 ?p??蛥Iff`@JGMA;ao?n.3@:d`?Ͳ-?V?ZR @JH˒:;ln?\N<@8"?b@??\)K33@@JLԻ;GA)?oiDg8@7+?5???=@JM@$>;"?JL@9"?x@;d`?t`@JL@JM߆;˦z:?dZ1@9@?M@+?l.@JNwm;Ȇz2?#9@:?9X ?S? @@J@JOag#%;6?S@;"??|?θQ?I`@Eٙ@JOf;*?_o @6?|?@?7@QY@JV!t;ȯ 8?+ I@9?l?`?v;3@@JZ;̳!?홙@: ?X`?T?AY@J\|ؘ;H.?ըXy=@:@? ?€?pR@J\|ؘ;Ϯ?˕$/@;Z ?G ?"?@@@J]:*;Io?o@8o@'n@ /?7@F3@@J]_V;ƈ72?ڒS&@7.?7K?+?l@23@@J^6;6e?M@8T?ě?ޗ@??|@I? (@8 @gl@cT?j@Rs3@@Jcb;:5?F]cf@9bM? @?x?Aٙ@Jd8;_'p@l"h ԕ@9Ƨ?`@P`?ěJ@Jf—;:>/0@$tT@9+?Гt@/ ?ղ-@=3@@Jg l;!x?Q@9Z ?(?Z?܋CR@Jha)$;D|0?n.2@6t`?r ??;d`@B@Jha)$;s*?1o@:?"?A@?33@R33@@Jhwe;ύT? +=p +@9R ?KƠ@ ?l@:@Jk"ɂ;{Ž??@8g ?v@H@?t`Pl@Jkb +;4z[@u!@:? @$ ?`AU,@JnJ;cZ?9XbM@86?Ӆ?`?n@(33@@Jo~=;̀ )? '/@9}/ ?v?hr?`@C33@@JoXD;j7?TɅ@:3@?~@?b@@P @Jp +=;q@Xe+@:a@?Õ?"?ɺ^@@;@Jq {;۹Ϛ?@N@8St?/ ?X`?-`B@Jqk+;"h?@9 ?v? +=?@8L@Jr)Zl; ?!-w2@8=?Q?7K?(@S @JuB<;e.a?>BZc@7`@?˥`?/? T@Juv}5;Մ+sK?VϪ͟@:_?Ƨ?KƠ?Sf`@Jv[;˨-?C,zx@9Z ??^@?&5f`@Jv);Λ{?>6z@:H1 ? ??zC33@@JwBV;z:?3@8z?x@ I?@R@Jwc;Ii?܎qi@8? I?@?v@@ @J|p;ɦ@=p +@;p?ə?z@?;`@Q@J}c-;y@W'@:Z ??1 ??@J}|,I;ϗxW)?@9=/ ?v?r ?b@T @J~T~; tC?S&@;#`?A@?^5@?n2@J;?lC@3.? Ġ?;d`?1&@D3@@J3@@J!Z;غ@?:)y@8s@?G ??@ @JU=;F#п?n.3@7A@?;d`?`?hr$@J+;y?Fs@;I`?@t?nU`@J!5ڭ;ȴ'?_F@;Z ?bM@^5@?T@J[=`;HZ ?N;6@9@?`A?\)?O@A3@@J%f;$>?oiDg8@97@?д9`?l?Ƨ@A3@@J%f;BP?\(@;?X`??׮@JL@J>lLY; _?vȴ9X@9{?j?z?l@@Sf`@J;V3&?u%@8b@?v?hr?l@@S@J}0G;ť~k@@1&x@83@?1&@Ġ?+%ff`@J_A; G?Gz@:v?ǍO?? &@J;z?qu!@8?€?n?ȴ@F33@@J=M;U>?ᰉ'R@:?I`@X ?Ӆ@2@J_c<;/p@;5Xy@75@?Ƨ?+?`@Bs3@@Ji;f#J?/{J#:@93t?Õ?n?+@CY@JC|W;Eg]?ɅoiD@8x?1&? ?V @/@Jy;4&x9?Չ7KƧ@;?n?O@?@J3@@JZ-s;&+9@a'R@8!G?ff`?`?`E33@@J];ɋ @J#9@;d`?`@@ @?QRf`@J};Ou?n.@:-?7K?n?z@@Qٙ@J:l;y|ß?'RT`@;n?n?7K?`@F&f`@Jo;f?T`d@9?У?33@?ᙙ@P@JbA=;٥"c?S@:X`?T?(?@H3@@Jn/;@R?ʳg l@:X??|?h@FY@Jwd;̩ymn?;dZ@8M?ۅ?ě?ȓtT3@@J;?D*0@;\ ?-`?Ƨ?ݲ-@ff`@JH;AxpT&?NT@8?l@?dZ ?z@N@J]B;;?PH@:Y?;d`?;d`?p@P@Ja;8\g@$/@9@? +@? ? +@@!@JýYC;ɕ?tj@; ?dZ ?Q? Ġ@Kff`@Jğס<;:pe?͎!R<@:r ?X`?щ7@?^5@O@JɣL;%t-?7KƧ@:? @?(33@@J[D;R&=k@p:@;ؓ?G@?;`M&f`@Jݹ;ПD?F]cf@:)??-?;d`@S3@@JcA ;uL ?lC@:??öE?dZ ?@f`@JłV;fDw%@:)_@9M`?33@?`?E;L@J"f;AvSC?֡af@9 @?@?"?~@A@J >c;N? '/@;=p?5??j? +@Rٙ@JA;\ +V?qu!@9?@ j?Η@63@@JӀE4;~I?@7?~?b@? @E3@@Ju;46?s@9?ff`?x?9`@L33@@JbC;$G?e+a@9" @?/ @ ?|?أR @JԿ ;;X?w1@6+??l@?A@@+ff` +@J#g;q?9?vȴ9@6+ ?;`??j@Tff` @JBZ@8?M?`?ԛ@Qf`&@J~D;_?qiB@8?`?33@?zT'@J\P;ɩl@ `A@;I? ?n? @Q (@Jpa;]tO]?@7?Ǯ?;d`?@Ds3@)@J/;٭?lD@9z^@??&?噙 *@J޽;ޗl@#S&@8r?^5@?hr?ӕK@+@J;;˭ +?'RTa@70`? +=?`?~!33@,@J;7`]y?tj@8?/@M?z@R-@J ;#[N/@ +PH@;^@?t?1&?ӅE.@J; #!?F]cf@8v?1 @?=/@Jd;E,Y?lC@6\ ?Ցh@Z ? +@Q0@Jݏ;GN?{J#9@;Ơ?? I?`@@G33@1@Jh;i +?NT@9`?KƠ?7@?z@ff`2@J @1H;A["?j~"@:`?\ ?/?^5@@@JD~;a?~($ x@:?"?+?ղ-@8L?@J~E;\FQ? ҈@:?ļj?M?@M@@J~E;JͯK?- qv@:R-?bM?1&?噙@Rf`A@J;z$LD?+ I^@7?v?Ұ ?1&@@s3@B@J"[t;ˊ;W?@9;`? @@?GU C@Jv;C?|?@9??@&?ӶE@ff`D@Jw;ĒK?ߤ?@;'l? ??CE@JBfs;Z%@:@8v? @@?+@KF@J _;f?1&@7@?p?1 ? P3@G@J `;!ݠY?,zxl"@;n ?Q@ @?j@D3@H@J 8*; +A%@!.I@7€?? ?~#I@J!9 ;bfe@ >BZ@:3@?A@??R,J@J">i;>B[@ =K^@;~5@?O@|?`@@@s3@K@J"_X;=-?L_@7p?? ?Dff`L@J#cW;̼@ATɅo@:gl?t?&?9`P M@J#ᆘ5;}=B@O;@;b?l?t?M@O N@J%|K;+Z!?Q_@9?ff`??\)@R3@O@J'Ӻ;m3 ?R<6@:f`?`?l@?ۅ@LYP@J(};ɟ¨?ߋq @:h1 ?`@T?t`@HQ@J)AA;@?Q @:z^@?/@h?G @>R@J)b;L]D@YJ@:?+@ +?@:S@J)&;QXq?Vu@9?`?"?KƠI3@T@J*#;=]@~$@:G?`@KƠ? @KU@J*^x[[;Ș=yS?|hr@;?`@@`?j@NV@J*L;v_ح?ۋq @8#T? ??Q.ff`W@J,H;7l?lC@9Y ?˥`?V?@M@X@J-;<`@o@:`?A@?9X ?E@Af`Y@J-@;V\-'?@:yX ? ? Ġ?ȴ@8Z@J-@;#@FA@Bѷ@9?`?z@?S[@J.‹*k;ǟ@H@:7 +@?`@ @?T@P`\@J.;k<?겕ᰊ@:O?33@?ff`?x23@]@J/@_k;D@-V@8`?`? ?;d`^@J0͚R;e<?Vu@4)`? ??@@L_@J1Z>:;R@de@6j?C?`?TI`@J2f?e+@;@?+?`?;d`@?f@J7ML;̚w?fA@9?`?j?&@Ef`g@J8f;O;u?&IQ@:@??r ? I@C h@J9W;6?Fs@;E?bM?t?KƠ@i@J:8? ;f8C=?\(\@4.?? +@?9`@.j@J;>o;ƻ#W?>BZc @8 ?n?l? @@"33@k@J;`(^;?{m]@9??I`?@+l@J>;D,?H˒:@8Z ? Ġ?? +@>3@m@JA*2;6G? k@:Ġ?t?`A?"@Ef`n@JAy;0X:@($ xG@:A?ԋC?`@?t`To@JA!;GN@Ϫ͟@;5@?1 @?|?`%p@JDAxpT;ν?'/V@;W +@?z@@7@? R&f`q@JE#N;uL?g l@:?7K?=p?33@Mr@JE;>?1-@89 ?r ? Ġ? @Bf`s@JG#;۹Ϛ?YJ@;a???x@Hf`t@JG@JA;̢G'?!.H@:;"??|?/ ?VJ@J<;5;K/?Q_p@9K?̬@?"?`A7@JP"W;gΕ@*0U2a@8T9`?dZ ?`?@1@J@ ;2&?u!.@6} ? Ġ?z@?ղ-@(@J]V,;P?ڹZ@:?д9`?dZ ?l@E @J#;Ƌ\w?N;5@;#`?`?E?/ I@J'RT;Oag#%?u%F +@8?`?"?QE@J];Ь@Fs@8Q?և+?G ?@<@J];25?Zc @:`?Гt? ?t@DY@J";#B$h?͞&@9V?hr@?T@L@J;2Y?r ě@:a?z@@ Ġ?"@:@Ji;;׭_?;5Xy@;q&?"@P`?Ƨ@Es3@@J.#);nj!@`A7@8?r ?7@?ش9`@Uf`@J!j;&Z?qiB@8@?E?`?`<33@@J>;?ᙙ@8l?ڰ ??^@Ps3@@J\(;ʖ6l?$/@:?O@@?E@Ef`@J};?Ff?(@8f`?l?hr?n@O@JD,;@$@ h ԕ@;?Ͼv@ ?G:@J3n;?B@6 @?ם ?A@?땁@3@J>[b;RC?Q@6K?|?9`? @J>[b;q8?ڹZ@9Ձ?5???r @Df`@JS&;нk?P{@8@?bM?^5@?V@A @J/Ɨ;c?H@:bM?`@??1 @J/Ɨ;ţKۡ?,=@;z?`??@5@J;;Ͳi? ԕ*@9y ?"@ S?T@Jɴ;|^0?D*@;_;`?Q? ?X`533@@JEx;ȩދ;2?lD@:?`?^5@?@Ry@J B;$\?O;dZ@5??KƠ?j@133@@J_;Jѫ@:)_@:`?j?h?Rf`@J_;ʷ^7?*0@7@?|?=p?MEٙ@JL;ɂ_?~($ x@:p?1&?@?ָQJ&f`@JeD;aܓ-?Ўqi@9= ?$ ?ڰ ??@J);jn3@ -w1@;??|?z?~@U`@J);ǝ't?L_@8Ġ?Гt?1&?l@8f`@J&;I N]?g @89`?7K? @?VT@J@W;@ +~\N<@:{?@??E5@J@;Lab,?ѷX@;?l?O?7@@8@Jfl;ɓm?$tSM@:p`?1&?+?zIf`@J1;ȧ?E84֡@: `?ա?p?-`@33@@J;;̄]@$?@89`? ??@N@J};ˋ?Z@9? +=?C?P3@@J@ ;e@tj~@8@@ f`@1 ?ə33@@J]Av;>?Fs@;~5@?I`?z@?T3@@Jy|;̰&?_حV@;7K?v@x?EB@JW;ſzԲt?tSMj@9s???ޗ@As3@@Jz;qC?u!.@: ?l@@E?I`@A@J\_|g;˚3@ Eoi@;g?\ @@?ؓt<@J}k;ɪU?柾vȴ9@; +@?v?"?b@@4ff`@JY%;q?zG@;€?+@0 ?@S@J?;dz?O;dZ@;x?A@?䛥?`@F3@@JB鉜;պ?JL@;?V?C?ؓt@R3@@JK;łU?z@8E?I`??dZ ?33@@J;˧ڤ?⻘A@:0`?Q??-`@?ff`@J; S.?S&@;@?@??|?`Iff`@JfM<;BNY)?L/{J#@9q?E?|?|@@JfM<;9C?@9`@?/ ?z?\)I3@@J!;ȼ?w1@7^@?щ7@?? +@R @J&;f?nO;@9?`?O@?G @:@J_;ʥi4@ tj~@9?33@?^@?ěFs3@@JN;s>r@|Q@7?G ?1 ?zO33@@Jc;d'&?@N@:Ѫ?@?އ+@33@@J|n?;863@p:~@;X`?@E?Ƨ@9@JM];=??Q@7?5???Ƨ@F@J!;q`l ? ҈@8?ļj?+?д9`@$33@@JA3;zcsm?~($ x@;Q??I`?@A33@@J;ǦXĽ4@=K^@7N?KƠ? ?SMY@J b;bZh+c?Vu@6 +@? +@@ ?z@Q@@J#;ɿzԲt?&IR@9`?`? Ġ?@=ff`@J=;ρi?s@: C?n?^5@?E>33@@Jl;GX?@:?`?hr?ߍOS3@@JqG;˔BA@Q@:?@?&@T,@JqG;$FE_?㢜wkQ@8b@?`?"?KƠ@+@J@;˟f?c @: +@?r ?O@?nLY@J@;^?$ xF@;u??t@t?@C@J@;vA?j~#@9$?A@@Ġ?|:@J{;?Q 9?q @8?`@@B`?ա@E33@@J .;@ H˒:*@;R?€@`? Pf`@J .; ?1-@:h?~?`? I@U3@@J];įk?`A7@:Y ??X`?Q@43@@J"i;eK@g@: ?t`@G? @J< ;AA\?Y|@:K ?;d`?l?j@Qf`@JHD;C?=b@9!G?Ձ ?b@?Ԭ@@'ff`@J‚=; /^?Z@;]p?X`?(?Ƈ+@U33@@J`퀡; +^?8}H@8 +@?Q@`?@Q@JCk;I?4֡a@;n?θQ@A@?I@J~#N;?_-@حV@:f`?A@??33@@Iٙ@J?;̏P?cA [@9?öE?9`?€S@J?;g?hr @;;?-@Ƨ?V A3@@J*";ʇ]V,?]cA @:?KƠ@V ?|T@J*";Y@(\@7s3@?C@y ?ff`@Jd;ʪ J,@iᰉ'@:y?@?Sff`@J` ; ??@:=?ȴ@?-`?A@633@@JC;,@Ъ?t@:3@?G ?@?(K@ @J;<>t?Xy=c@95€?€@ /?hr@A +@J;M*[@ `A7L@:`?Гt?z@?Q@B&f` @J̢a;Kjb?v_ح@:?;d`?;`? @@ ff` @J̼,;ɇ@)y @9l@?ם ?E? +@2ff` @J!;Ρl??@9j=?r @?VE@JB=2;"F{T?)_@8?ԋC?ff`?ӕ@P@J©;Ǽ“?sP@:v??|?M?@H@J΁;z@ g @;y ?@9`?EP3@@J΢a;Rş?҈p;@8`?ļj??G O&f`@J4U; :2*?jfB@8?^5@?t?T@<3@@JA;_ND1?@4n@:??5??@@@JϞ8d;w@aGz@;?`@@`?R3@@J=B;>RY?$tS@;d? @A@?㝲 @I@J_(;?-w1@8-?=p?dZ ?|DY@J|^0;"BJ'k?䎊@7G?ם ?t`?5?=ff`@JA[#;F]c?A7Kƨ@7d ?ӕ?33@?X`@9@J;S;c$?q @8$? +=@ě?@5@JF;ijY[?L_@;? I??ݲ-@9@Jb +;ʁ#?w1@:$?`@?? Tff`@J<3;К.@Z@9] ?Q@!?V@#33@@J֡a; s?)^@6?Q?l?-Q3@@JG;f?*0U@;^@?@?/ @U@J@n;@G,@o@;@?ȴ9`@t?v@C @JbR;>BZ@XbM@; ? I@ C?$ L!@J`?z@??CC#@J;٩T"?ӼZ@:A?E?`?ەCٙ$@Ja;}At>?ߤ?@:f? @ ?QS9%@Ja;o`h?@4@:? Ġ?`?`:&@JEk;?dZ1@:Ġ?dZ ??|?/@BL'@Jѷ;4i?Q@:K?bM?j?""(@Jѷ;ɱc|?@:G? ?`A?֗@@Rs3@)@J] ;3z?*0U2a@8T9`?ӶE? ?C*@J] ;bYt@b}V@8?p@?@Py+@Jޠ3;>A@%1@; ?n?S?\ Cf`,@J(;*'? @8?&@T?7KU3@-@J"&;fA?D@:?&??ƧR.@J\̉;n"z?n@9?ě@?ꗍ@@R/@J?J;b(D?ۋq @8?b@?? @4L0@Jfw-;͋@ M;@9? +@@?Η@@/33@1@J*;ZS2?&I@9 ?7K?X`?QN 2@JZ;h?W&@:+?p@Y?ָQ@73@JQi;~?vȴ9X@;v? +=@S?hr@T3@4@JX;ʲi<?T`d@:H?? ?If`5@J弇+;Χ +?@:F?և+@?1 @F3@6@JB1;g?S@;n?"?9X ?bML7@J<[;F?ڏ\(@:?|??|??@QFf`8@JHZ ; ^T@12W@9T?1 ?X`?ղ-@G9@J;fA?D*@;CT?`@v? Qs3@:@J ;;!1?`A7K@6?$@?@Qٙ;@Jc;V2<@r@7?€?|?h@03@<@J||;,Bf@Rp:@:Z ?V@t`?Ѻ^@@A=@J?J;(ܘ?hr Ĝ@5? ?/?j@1ff`>@J;̹#x? +L/{@7B?~@@ ?@R?@J|Iz;Į!?\N<@9G+?Гt?G ?ڏ\ Kf`@@J{~ ;\ޗ?qiC@87@?͑h?򟾀? @D&f`A@J#*g;ɥ{?n.3@71 ?"?旍@?dZ @T&f`B@J&Z;Q\?a@N@8??|?`@?-`ff`C@JPO;m3 ?KƧ@;xQ?Ԭ@?=p?Ѓ`@OD@Jl;},?m\@9޸`?v?"?9X @B3@E@JH;ő]?a@O@:o@?V ? ?@&33@F@J#x ;ds?$/@8? @ ?b@@G@J];FA,?Q@;`?9X @`@?l@@G H@Js};"?dZ1@5$?O@E?€NٙI@J\);Ѣ@ +~$@9Z?щ7@@x?@P9J@JG;f@;z9?L_@8 ?`?ݑh?~333@]@J; 5?ݗ+j@7;`?⟾?Ցh?zS^@Jo;Crq7?ᰉ@:q&?O@?V?/ @B_@J~;(;?ʬ>B[@5?O?\)?\ @Cf``@Joi;ǫ+'?,<@9+?V ?n? +@@I a@JB_ !;r`o`?@:??|?j?t@Tb@JP;8&?L/{J#@93@?^5@?|?M@Aff`c@J#;4a0?S@:?\ ??j<d@J ;Hbo`@oi@9&?д9`?(?^5@@,e@Jc;TR?%1@9O?r @@?陙@T3@f@J_Js;>K@%F +L@;wK?v?v?@Eg@J :2+;Ɗ@ +JL@9(r?ȴ@?އ+?lh@J cV;ĥ&?=b@;?-?ě?$ 33@i@J +^;,=?+j@7?7@?9`? J3@j@J +`Ï;ŎC$A@2W@:l?l@?33@/ff`k@J ҉;fP?Ov_خ@:\?? +@?/ l@J \;4E0@-@6. ?bM?C?@Rf`m@JW; +Z?@7? @ ?G񙙠n@J<%;ʩ?Q @;f`? ? ?@U3@o@J^ ; +6P@R<6@8K?I`@ ?=p@:p@J^ ;Y ?iDg8~@;:?t?/?ݑh@As3@q@J~E;̸jr?GzH@3?|?ە@`?\ 8r@Jb(E;q\c%@lC@9>?t`?~?zPٙs@Jb(E;4hY?- q@9C??`?؃`@)t@JC; ?/w@: ?$?j?tAu@Jg;.fDw?)^ @7_|?? I?θQ4v@J>a;~~?qiC@8?A@?Q? @:33@w@J[;&]?W>6z@:K?hr?G ? @Ex@J[;ʸ?KƧ@:??M? Dy@J[;@?tj@;?Q@?Uf`z@J[;833@~@Jk;} [?睲-V@6{`?1&@b@? B@@J\;ɱ ?}Vl@83@?$@z?+@Iff`@Jd;/@jf@8޸`??l?Z@>3@@Jd;Ǩj?!.H@9Q?hr@l@? ĠR3@@J7X;ʝԝ@ D@8/ ??"?V@F@@J7X;_?84֡b@7+ ?ڏ\ ?`?@!@J\FR;z?JL_@:ٙ? ?? F&f`@Ju;??8YK@6o@?M?7K?◍@Tf`@J;7 ?<64@: @?ļj@;d`?b@@Q @J;`?hr @:o?`?~? @@J~;TXG?!-w1@:?T?@? @Iff`@J!9; j@ +=p@8c@(@;d`?KƠ,@J"W; M?P{@:aG?ղ-@C?"@P33@@J$A;{=@ ?|h@:n?S?ղ-?TPf`@J&z;<3"?֡af@:5??`??O@K@J'=[";\@@7@A?7@?Ձ ?=p@Uy@J(b;ҁG?@7?O@?\ ?ļj@O@J*{Ԍ;8C?u%@9?=p? ?xOY@J*b{;X?nO;@7?-`@9X ?ԼjTf`@J,@Ъ;:?zG@:A?A@?j?ݲ-@I3@@J/uK;dM?!-w1@;Z@?t?Ұ ?G@&33@@J/];b~ +?l@5 ?Ƨ@ ?€@T@J0aǛ5;ġr?-w1@:\j?KƠ?I`?Z@S3@@J1)˫;[DT@z@7@?9X ?hr?`A@3L@J3l ;>_?H@;f`?@?\)?@)@J3\[K;e=>?}H˒@;??`?x'33@@J5;Oa;e ?Q@9 ?@?$? @$@J6޹^[;вQ?@4m@8Qh?v@`?^@A&f`@J77mU;:%?lC@7`?=p@X ?p@R@J8? ;Ɛy_go@ *0U2@;)??땁?hr?33@@J:};Š?Q@:?n@?Q@G@J: ;[>?tSMj@;2n?"? +=??|@>@J:i;Gw@S&@;6 ?ļj@?|?Ǯ@K @J;B-k;46?d7@;.?@?ZD@J>P3; ?R<6@9?KƠ@`?pD33@@J? ?u;d"&?%1@; ?/@/?1&@FY@J? ?u;PS@hr!@:ؓ?ě?-? IR@J?{;]H@ 1@;d`?ff`?z@? +=Rf`@JAcw;2@wk@9x?ȴ@@ ?n@SFf`@JB=1;˴=J?/v@8b@?ӶE?"? 2ff`@JBI;u@K]c@:?v?㕁?@'@JBQ~;\ G?6C@;Q?j@ @??|R@JC @;ǝ;̫`kz?oiDg8@:r?"@"?K@JD0;WiJ?<64@9G?Q@ x?^@2@JD0;n&NHb?/{J#:@8Hr?G?`A?`A@S@JFB_;9?/{J#:@;? Ġ?z@? ?ff`@JF; @/v@:?/ ? ?Z@T@@JF2;ŊڹZ?lC@59`?v?dZ ?&@533@@JFR;; ??@8/ ?Q@?G @D@@JH.;=B?nO;@;F?ʟ?G ?@ff`@JIbI4;ҤevG?4m9@7`?T?hr?l@Uf`@JI(;$A?Љ'RTa@;6E?t`?33@?CL@JJ›c; _$R@sP@;`?`@?`T@@JK;;W@+ I@7?O@?-`?` @JKc;U?g8}H@7?`A?+?7@@M@JLaJ;9yQ?W>6z@8?`@? U@JMa;x>?As@;?Ƨ@ I?`A@I3@@JMk2;yF=?K]d@8? ?ڰ ?r O@JN;%eL?ʈp:@9p???܋CJf`@JN"7;™L?lC@5O\ ?G@A@? +=@73@@JN~+;~?üZ@:`? @ @?dZ @%@JN~+;ż+4@}Vl@7`@ @O?x@US3@@JO;̀5?kP{@:b@?ff`?$ ?/O33@@JP"WB;ȣax ?t@:]p?-`@"?ěK @JPC2; ;o ?C,zxl@;??t`@?-`<@JU`;6O?As@7@?z@?h?1&@@JU;ǑĹ@hۋq @;Ġ? +=?33@?33@H@JVE;?ײ?'/V@:r ?"??@M@JW>6z;+E((=?}Vl@;?-`?ff`?T@?3@@JW f;ً͒?>BZc@:?j?ڰ ?A@@Gf`@JWV2;6s g?sPH@9X ?|?hr?7@Rf`@JY;9櫛$?y (@7?V ?O?QNٙ@JZc;wkP?=K^@7A?S? ? @JZ;إH#?4J@7`??n?+@Q@J[>7;aFN?p:@9? +@?"?ꗍ@@2@J[x;ⴕ?SMj@9v ?I`?C?4@J[x;zp? k~@9t?ff`??`Q@J[W~;5;K/@ 6z@;p?M?(? ĠR@J\c%B;@-?zG@7f`?5??ff`?MU@J\fw;-@?QR@:&$?(?b@?A@@:@J]=ȸk; ?>B@:`? ?`?C@R@J];mZ?sP@: ?9X ?5?? @@Ds3@@J]#;Qi?O;dZ@9Q?33@?(??|>@J^cb;2@YJ@;?@(?I`T3@@J_mX;EgD? +=p@66 ? +@?1 ?ᙙ@L@J`A7L; ;?lD@8r ?t`?I`?C@P,@J`|A;\|ؙ?<64@;J=??dZ ?Vs3@@Ja$FE;_x5@~m\@8O? ?v? I@!@Ja=1;ˇH^=@@:?@|?`@G3@@JaM9;˱s.@+~($@;=? Ġ@1&?L33@@Ja!o;̽# @cA @9|?b@@1 ?Vy@JbȰ;ȮG?索3@:3@??Ƨ?^@?33@@Jb{;ʅݘ?BZc@8`?@5??h@7@Jc-ת;~1U?@8 ?;d`??h@G@JcHj;gM?v@9= ?v@Ƨ??|@K3@@Jd@8;,g?Q_@:&f`? +=? ?ᙙ@!@Jd@8;i?#wk@9m`? +=@?@@IL@Jd8;^1 ?W'@:V?/ @E?ա@K@Jd8;Ǣߓx?Ү}Vl@;8`?n?KƠ?G3@@Jdy;#*g?eO@9x?t`?S?띲 UY@Jdy;u?- @:`??~?=pUf`@JdTi;Tz?H˒:*@9)?O@ Z?ʟ@ @JdTi;:N?rGE9@7`?ݲ-?M?ٺ^@?陙@JeXO;{[?C$@4??t`?`T@JeD;ͽ@g?ȴ9Xb@8 ?ə@ ?z@Sf`@Jey; 5;@ B\(@:h?`?$?`?ə@Jf—;̱]=?1&x@7`?€?󙙠?K @Jg#$6;ͧz3?C\N@9f$??j?F@@JhJ;?l'?}H˒@6F$???Q?33@@Jha)$;F]c@ᰉ'R@;@? ?T?@T3@@Ji];ϕ$@MjO@7/ ??+?t`6ff`@JjG;?,@7=/ ? +=@?1 TL@Jl?;.;BP?YJE@9@?(?`?`@:@Jm"BJ';vF:;@ +S&@:G?Z@`?G @R@Jmz;"$?QR@6!@?^@?`@?13@@Jn̒;@ ^5?|@9\ @ "@E?l@L@@JnL ;"BJ'k?!R<@;U?"??@L@Jo!;θ1f?>6z@9 ?Ԭ@?n?ղ-Uf`@JoC;ɚV?*0 @;z?@1&?Гt?33@@JoC;im7;?5Xy=@7?˥`??"@N@Jo\-;Ƃ@4?n@5Ǯ ?t`?9X ?"R@Jo ;{|x!?s@9??9X ?bMP@Jo];'(b?#@:?l??pUFf`@Jo];;u/@ߤ?@:?׾v?|?@R@@JpM8;>?Ƨ-@9|?`@??;d`@S@Jp?-B[@:t? @ +x?p@Pf`@J{ 1ί;Óݗ+?+ J@:?ě@#?;d`I33@@J{|x ;^?_o@;Ff`?O@?ݑh?I`@=@J|ݩ;j]k@ u@:?1&?V ?j@TY@J|ßa;ņDR?h?xl"h @;@?l?b@?\)G3@@J}At>;& %9?}Vl!@7-?l@n?@DY@J}o ;ɸU @4K@8h? I@ `?߾vPf`@J}o ;$[)?Q_@7$ ?@?`?hM@@J~d^N;|<@eO@: @M@Ƨ?`@E3@@Jo0;'x ?,<@8@?&?G?$ @Df`@Jo0; ?N;5X@6`?@/?@-@J^_0;O&N@F]c@9 ?v?t`?33@@J#[N;¦\{?p:~@:Õ?-`??L @J½R;"4H@> (@9 ?V?ӕ?@A!@J{;[vh5@?Q?;`?@?f`7@JU;ǵ?A7Kƨ@849`?Ӆ?A@?M@8@J`4P;~1U@@7f`??`A?^5@@"33@9@Jӕ>;F8u)?E@8N ?l@@j?\)*:@Js;as@ r@;3@?p?€?v@K;@J_x5;Wx-?|@:?д9`?x?@A33@<@J$;/ ?iDg8~@:gl?S?Ͳ-?ާ@)33@=@Jʅ;϶.n?ꎊqi@:Ձ?`?=p?h@->@JH;Sy4?ߤ?@:~v? ?v?@D&f`?@J ;f@ + L_@:/?n?$?G @Py@@J^6;;?=K]@7\?Z??`@@333@A@Jo&);ħh?YJ@;k?O@ȴ@?ӕB@J^;!Z?TɅo@:3?? ??|@6LC@Ji;Q@6C-@9ix?X`@ ?`D@Ji;˴;ͨ\?g @9?p??t@PX@J>˴;^|@ݗ+@9??KƠ?E@93@Y@JӪ7;?vȴ@:z?v?"?Ƨ@PS3@Z@JB;F ?ceO@;&??Z?^5@@33@[@J}|,;e8h?+ J@6kƠ? @?`@P3@\@J;ÅQ?g8}H@8(?`A??hr@CL]@J|;NzVC?u!@95@?A@?hr?R^@Jݾ;[S @]ce@9?ϝ ??畁3_@Jݾ;JYe?=p +=@6v?ȴ@@?9`@Cf``@Jݾ;n;F@K]d@7r-?r @`?l@Aa@J> ;ƾ?ae@7x??"?^5@@Hb@J_c<;Xp^?ѷY@9C??v?@MLc@J ;Kր?8YJ@;5@?t`@ Ġ?陙@Sd@J3;٩T"?#x@;u?ě?V ?dZ S3@e@J3;CO@&@;d?ѩ?€?Ԭ@@Rf`f@J D;̎y?M:@8@?x?T?1&:3@g@Jc#;Ў:!d?ߤ?@9M?t`??`@h@Jc#;_QzF?͞%@7L@?v? ? 0i@J^>2;ȧayW?@4@8|? ?㝲 ?~<j@JZ-s;EkD?MjOv@9`?33@? ?n@:ff`k@J;Ⱦ]?PH@91h?٩?l?Z/l@J.n;ɦD?6@9O?"??ݡ@J m@J|;w\?BZc@74`?Z??E9n@Ja; hUS?/v@:wK? @&?-Bo@Ja;aՈ@wk@;<?G?x?QR p@JN;}z=?ԕ*1@;1?-`?`?nGq@JT;gȖ?,@9`?l?? :r@J`H;>݋`@ +r䎊q@:o\ @?|@ ?ff`@S3@s@J;ˋ&9O?@9?bM?`@?33@83@t@J5@? @@1&?xNff`y@J@g;{A?+jf@9? Ġ?^@?`@@V@z@JH;̫`kz?_Ft@8^@?柾?I`?Ł U3@{@JH;L<?*0U2@8?KƠ?@?^@&|@J;bh?2W@;E?5?@1&?&@7}@Jb;.(?(\)@7U??Ցh??ܛS33@~@J~1U;˒s?j~"@9@@z?աPY@J # ;LƂ/?QR@7??E?`@2ff`@J?9ѳ;ԥ":?}Vl@7?? Ġ?b@@7@JłU6;|ßa@*0U2@6 ?O@??ݡ@333@@J#;F]c?b}Vm@:E?7K?E?p@U @J#;A0P?g k@:t? +=@aG?z@?ff`@J>RY;ǛN??vȴ9X@7?Լj?݁ ?733@@J!laR;#cW? +=p@;~v?@ +dZ ?@A@JΑ;?8}H@;(1 ?Õ??ěO@J\ +;@m\@;Ġ? ?(?v@B33@@JpL;H@MjO@:?33@??`8L@J;ů߃?䎊q@: ?\)@9X ?д9`1@Jɼw4;]U?֚,<@7Z?`?h?Q3@J! ;Ôg@!.@;`@?KƠ@`@?@S3@@J>WS;&?KƧ@6\ ??ȴ@?@JY@Jˣ!h;?wkP@;F?&?+?lPf`@Jͻ;D`@,zxl@;Ӷ@?x@?;d`@J3@@JΞ^$y;U@ '0@;`?b@??S@PY@Jο;G^cc??@74?$ ?bM?TML@J|;ǂ +0@_o@:t? +=?33@?ff`@ @Jп`;YW?RT`d@:z?z@=p?b@@Gٙ@Jì;҄S?4J@:-`?@ @?GM@Jc;E??@:?I`?E? J @JG;螺?ѷY@:C??S?@Ks3@@Ja@;ɟ?n@dZ ?`A@Q@@J֝0';Τ;?R<6@9b?S@^@? @@J^ F;Y?I^5?}@8?(?`?@Hٙ@J;C@m8@;-`?`@@?$Ss3@@J8;6z@:d?v?(?`(@J@f;~Ǝ?MjOv@6`??`?`@Rf`@J7 ;Ew?nO@:3@?ٙ??KƠ(@J#R_;}$ =?dZ1@7?V ?7K?x @J]A;F?'RT`@9~v?`?+?/533@@J]A;&dA?S&@7`?`?1 ?@T @J]A;#w?5Xy>@7Z?(@t`?"@@J;3j9?v_ح@:-?KƠ?n?Sf`@J";M"?ݗ+k@:e?hr??ȴ@Q,@J";ݤe?*0U2a|@; ?@?|?v@I@J?^W;\?ԕ*1@8?v??S@J` ;g{9\B@As@;R-??;d`?1 @S@J½;Ƙx1j?zxl"h +@93@? Ġ?أ?x@;ff`@J`N;F2?a|Q@9h@??$?A@7L@J;ef&?bM@;? @V?|9L@J ;L<?As@:?ާ?ȴ@?◍@Sl@J;~ѿ?qiB@8B?@-`? +=V @J>x;̉'RT@!o@81?v@h?E@N@Jd;Đ>?T`d@9?Q@`??|@Ql@JE;ϐwK?GzH@4_;`?`??@@F@Jᛐ;O?g @; I?^5@@/ ?p@$ff`@J;އ ?g8}H@9? @?OQ@J43 ;Ǘw?M:@8`@?۶E?n?Ұ ;@JP;6v?E@9q?5?@ `?ff`@@J w;|AC?2W@9?Z@ff`?@U@J ;;ʍ!j?l"h ԕ@9 ? ?7@?G33@@JQ;9.?|hr@;ؓ?-?߾v?畁@J!-w2;M&??{m]@7b@? ?t`?T:L@J +;i?.H@5ȴ@?`A??`A@@L@J ;ɱo"@ + qu@;׍@?x@?1&C@J!}(I;bT?ۋq @9?ě?(?@M@J!}(I;gU:?u@7Z ?`?t?ۅ8ff`@J!}(I;me^(?hr @;`?`?O@?ۥ`@ff`@J!D(N;W?<64@9Ӷ@?;d`?E?l@,ff`@J"4H;'c@iB@:?|?Ƈ+?€?/ @33@@J#j; ֶ[?1.@9z?;d`@I`?д9`@J$=);oڃn@ S&@;/ ? ? ?\)@G @J$Ȭ; j?bM@8?/?ě? @Vs3@@J$v;"h?{J#9@9?Ցh? ?@DL@J$/;Į!?8YJ@7@?z?S?KƠ&@J%|K;[K?\(@: ?/?t`? +@@G3@@J&q;Cx$?'/V@:h?ȴ@?x?~V@J'a?;\ ?C,@8+ ??j?;d`@M@J(mz;q?|?TɆ@;?̬@?V?C@K3@@J)AA;˚vW@,<쿱@9? @Z? @RL @J,<;Ҧ*?[6@8?߮? Ġ?9X ?33@ +@J. +;ȇen@4J@: ?$ ?I`?n@Aff` @J/aZ;c,?S&@8Z^@?v@?`J @J/{J#;=ݱ @/hۋ@;e???C!ff` @J2;γg ?73@9+ ?ə@;d`?=pSf`@J3aV\-;){Lb?Fs@5x?`@/ ?@I3@@J3Ko;ГI?E84֡@7b@??G ?Q@Tf`@J3*b; /^@{J#9@9T9`?dZ ?bM?1&@733@@J4;V`^i@ @:?@V ? Q3@@J46;|ؘ?S&@8>v?bM?n?U3@@J4a;yB =K? @9H1 ?T@n?ѩS33@@J5&V;@??'/W@:q?ff`??=ff`@J9`s;ƙc?ѷX@9V?ᙙ@C?V&f`@J:!c;弇+@m\@; +@??"?5?$33@@J:}O;=SH?Q @;n?ʟ??(@H@J:8? ;ɖ.?䎊r@;t?Õ?ȴ@?`@Cs3@@J<}^p;½Q@F]c@:`? ?"?+@8ff`@J<쿱;Ŭ?Q@:F?j? I?x@Q33@@J@9j=??|?1&?&Df`@J=v;?쀝IQ@8 ?&??G@C&f`@J>//;SeX?73@9/ ??7K?l@M3@@J>//;?hr @5?V?n?t@E@J@U;p\m@W@8 +@@ ?/?5?33@ @JA;e@x?Gz@:.V?O@? ?vPf`!@JBA;~7?$/@9s3@?t`?€? Ġ"@JB +A;[>?$/@8L@? ?KƠ?S#@JC^a[;djHs? +=p@;^v?`??z@6$@JCä/;z-?Z@; Ơ??|?"?Z%@JDAxpT;&?E@:Z^@?"?/ ?(@?f`&@JDAxpT;̝ZzJ?u%@:X?n??lIL'@JEh ;Ĭ}N?ᰉ'R@91?z??b@@ (@JEX;=?@ }Vl!@:p ?I`?9X ?T@N&f`)@JF2/;з^~?"`A@9?9X ??@1*@JGA);Ƿ]??|hs@:{?`??׮@H+@JI3;ţ@6C@;&?z@??ԛ@833@,@JJb#;͎d1@?s@;?`@@p?*ff`-@JJj3{;ȏ&9?c @;?z@?j? @B.@JK]c;T@ }!.H@;ě? I??^@US3@/@JKZS3;ѵA̅?$tT@:;`? ?z?I33@0@JQ;ДG ?MjOv@:???$ ?@UFf`1@JQe;@?ﯷr@6?"?dZ ?j)2@JSX;zyl?b}Vm@9C??hr?׮@<3@JSE ;Y?\(@6 A?&@@?t`@Lf`4@JT?u;ݵR]?tSMj@:?/?bM?&@G5@JT~;?[W>6z@8?G?I`?;`-6@JV3&;%J4@~$t@;`?v@5??Qff`7@JW?$;N"7?@;gl?t`??EA8@JX;̗AЄ?ߤ@@;]/ ?`?? JY9@JXUP;3?u%F@:A?n@ +@?@Aٙ:@JY!;͊b0@_p@;׍@?KƠ@bM?EO;@JYBu;A?;dZ@;`?Q?=p?b@@Ps3@<@J\ +V;ǹ{0?@;`@?$?-?@;33@=@J] l;_ô?TɅo@9?T?G?r @S`>@J^ڵ;$?eO@;h?+@ ?Q>?@J^ڵ;\ +V?=b@;e`?|@ ?Q,@@J_ !;R?73@7?|?\ ?/@ff`A@J`G;o0?:S@:@?`?`?և+@"B@Jb#ᆘ;XdE? I^5@;?`@7K?ٙC@Jc{Z;M@?A7Kƨ@; ?T@7@?G RD@JdY2;z$@ᰉ@6@/`@`?"!ff`E@Jd7;͖}?\(@; ?ě??ff`@,ff`F@Je@x;bEo?=K]@;?@?b@?@FYG@Je;h?tj~@7?Ƨ? I?`0H@Jf#J;G^cb?5?|h@9?33@?v?ޗ@@Rf`I@Jf?b}V@9?Q?n?ҟ@Fs3@J@Jgb;v?oi@8]p?I`??`JU@Jmr;о3?5Xy>@9@?`@?@?Q@Uff`V@Jn9;??S@;4?hr@?C@Mf`W@Jn~;ʈs?&IR@9`?7@@`? @9X@Jn 2;̊X;{(?v_ح@;F?"?9`? @<]@Jt}^_;Ρ@W%?#x@8o@?ם ? ??|@ff`^@Jt<;d^Nj?҈p@9|?(?€?V _@Jt*,#;a Ec?u!R@95@? ? +=?@T3@`@JuK;?@:$?Q?Q?T@ELa@Ju`;G^cb?kP{@:Z ? +=?z@?t`@5b@Jv}4;)W?=K]@9`?Q@u€?ě@?33@c@Jv}4;OQC?%F +L0@7V ?ա?$ ?`<33@d@Jw?;L"A?%1@;@?Ƈ+?Ͳ-?ȴ9`@B e@Jx>-;Dž t?U2a|@:`?E@V ?֧@Of@JyK!;*") ?I^5?}@:P ?`?/ ?O@@g@Jyɟ;},?Vl!-@91h?/ @/ ? @Ah@JzA};̵$9,?sPH@::?l@dZ ?z@B&f`i@Jzcsl;ܠf?m\@7?z?I`?`Af`j@J{՝V;`c&?m@9z?z@?bM?$.k@J{;[c?N;6@7xQ??@?&@=l@J{0;Ύ`sX?9XbM@8K?? ?Z:m@J|c';TCN?$/@:E?&?? +=@@ n@J}=B;ץm2@K]cA@9Q&?"?b@?`Eo@J}^o;ƿDN @NT@7F?5?@ ?@Rp@J~AN~;ğb0v?VϪ͟@;|?G?ff`?$@Es3@q@JuM;ƈC[?Q@4?€@ +Z?n1Lr@Je0;??`d8@9Z ?^5@@?E@Qf`u@J>;ȴ?+ I@3;`?A@@ ?@Nv@J8;3U?xF@:'?\)?l@?"13@w@JT;UnŰ?+jg@7F?X`?I`?nDx@JaN;J)?ݗ+j@8? I@?TTyy@JC;W?ěS@:b?@?ff`?=p@M z@J\w;φ;Ø?- qv@9y?&@7@?д9`@C{@J};8d[?,<@;???|?n?ؓtNs3@|@JY;қ?64K@8€?G@ I?`T }@JD;`+?ᰉ'R@:>`?Ұ ??A@@;33@~@J`sX;,G?7KƧ@8 ?;d`?S?Ցh@L@J`sX;ưcz)@$/@7`? @?@?Q33@@J;ł@@ /Vϫ@;??j@z@?@J@J`;!x?^5?|@:`?I`@/? Ġ&@J +;ʯ6d@)y @7ff`?ȴ9`@`?t`@D3@@J$t;јZ8?\N<@:???Q2@JB;ş]?_o@:"? @@?Q@Ff`@J}ke;Ѷ=>N@ ?H˒:@9?-@7K?홙03@@JD,;MrO@ (@; ?@@+?^5@@T@J_t;-Dܨ?L/{J#@;N???dZ >@Jwc;;o?@8k???G @Rf`@J ٔ[;˝^J82?1&x@:Pb@?1 @ff`?θQFf`@J;;vy?Z@8Լ`??5??O@@8ff`@J_I;vݬ?<쿱[@:? @@ ?`@Us3@@J%;MYO&?Z1'@;r?hr@1 ?@S3@@JBC;~dž;?Ƨ-@4Ġ??l?@J33@@Je;D#@ ݗ+@9???@IL@J7;u6 ?qiB@;8?5??1&??@J$;XB4?(\)@6@?׍O?Q?@Kff`@J^w:;h?C$@9?hr@ "? I@N3@@J{;̥J?R<6@;`?@`@?\ L@Jb;Ûˣ??@:??l@?Q@Q@JŤ;•c?($ xG@:D??7K?E@M&f`@J@;AS*?{@7`@?&? +@?;`@C@J4X;Ҧڜ?%@:l?д9`?"?@ff`@J݋a;'@:)y@:??$?Լj@Tf`@J?;W}W?>B[@91 ?׍O? Ġ?$(33@@Jͫ;Ă{o?Ov_@7.?Гt@x?`@J}N;ι䒼0@$tS@8`?z?`?EE33@@J;;.;*?@9E?Ͼv@y ?€@33@@J+;ѿzԲ?O;dZ@4_;`?ff`??9X @4f`@JB +B;J? ? I^5@:?`?+?@!@Jbk/;M@$>@䎊@;?ȴ9`?@?G?3@@J ě;Ǿf?䎊@4*? @5??@?ff`@Jᴻ^;Œ?}H@7=p@2?|@€?j@P@J_;ɕ$?%@6l?A@? +@?S@ff`@J yL; +D ?D*@:/ ?E?G?`@Us3@@J|n?;׭_@+ @; A??|?ȴ@?@S@J!;ѻ?S@6`@?G ?T?t`S@J=;Üb? ҈@;2n?`@?T@JJ;ћy +@9@: +@?V?`??|O@J;&2?궮}Vl@5P ?š@ G ?-F@J b;k1)?-V@7S3@@`?+?5?@Tf`@JÛˣ;H.?g @9N?`A?7@?dZ R&f`@JDN;e{??@9 ?=p?|?أ6@J4m;&_Z?/V@8@?"@/?;`ff`@J4m;Ɂ?K]cA@9?˥`?5??◍@Vl@J=;у +?r ě@8$Z ?;d`@%`?̋C@VY@J=;d"&@D*@;x`?;`?Q?z,@Jγ;ΛZc? '@:b @?9X ?`@?h@K @J;ğס?C,zx@;z?z@?C?^5@D@J;˗$tS?Vu@9&?5??1&?+Mf`@JOY;ѯ{ @֡a@9Ȓ;EgD?73@79`?ȴ@?z?@V&f`@Jȁq.;h<){@䎊r@:YX ??ە?$+@JBԐ;U?$tSM@;h?O@^5@?,33@@J};Ňa@ F]c@;e`? ?@?+ff`@J>}Q;@ 6C-@;?° @  ?1 @.@Jʣ&;ȋ?N@xF@;?+?~?@@<@J "K;̣,?y (@7޸`@ @l@?-`@&ff`@J "K;Z[(? @849`?Ұ ?򟾀?ڰ T3@@J_8;UW?g @:5@?C@9`?"H@J|; 9d@K)^ @7`?9X ??@Os3@@J©;Ĉ皮m?w1@:`??T? Ġ3@J΁;s@ae@:J?x?ě?I`@T3@@J΢a;H!v@ }H@;r-?l@?~? U@JѢ;Øc8|?)_@8@@$b@@\ ?TR@JHE;2`=W?JD@9@?@?땁?އ+Pf`@JA;îM?{m@;`Ġ??\)? @R33@@J=B;ھ'?%@:? @Ƨ?7@@E @JŹ;py,@2m\@:v ???`DL@J5;'?j~#@;p ?9X ? Ġ?x/33@@J$$w;+?v_ح@:?t`?€?@=3@@J$$w;cw@nO@:?v@t? @S3@@Jbd;ǴOz?'RT`e@8(?dZ ??ȴ@@ @J՝U;F?W>6z@:-`?@?֧GL@Jվ;E?nO@9z?(@j?CQL@JG;ͪU@ & '@:y ?r ?/? Ġ@V3@@J׾V;CE@',@;z?`A@t?@P@JƋ;v^@ O;d@:?dZ @?щ7@@@JڠC;bU??n@9:^@?T@^5@?=p@R3@@JEk; ܇T?q @;1 ?Õ?t?hrA3@@JS;3aV\-?zG@7+? @?ާP@J?_;>@u!R@:@?? ?x@33@@J(;iaiw?iB@:wK?V?I`?`@@L@Ja$F;? '/@:%`?? +=?@V33@@J߽jY:;ʰ.?!-w1@:q?ě??j@$@J\̉;HZ ?C]@7?ff`?ڰ ?z@S@Ji;]x??@;ܬ?ٺ^@@@?hr?ff`@J?J;ه2?+jg@:`?A@@?9`Pf`@Jfw-;__ (?{m@; ?;d`@M?ǍO@D3@@J;Ľ&0?o@9~5@?̬@@9X ?S@Hff`@J\ +W;?^W?4J@2 +?@BZ@94z?ě? Ġ?(@Lf`@J> ;\f?&x@;-`?v@E?° @R3@@J!h/;ίF}@ |#x@;,@?ӥ`@t`?v6ff`@JB;Ɍ; E?#@7z?? +@?Q@J>;?j~#@: ?l@?`?֗@*33@ @J!:;C,z?}Vl@:i?Q?G ?S!@J!:;Qv?g k@:? @ ^5@?\)@:"@J ;̀S!;&01?O M@9?š?C?L$@Joi;ˡ]B@ s@;`?ě?"?L33@%@J'c;цP?NT@8\j?`??"@P&@J;e{ۜ?O M;@:v?z@??|@-'@J.3;ϒ8?~($ x@6} ?p? ?G@ (@J_Js; # @ r䎊q@9*?\)@ (?@0ff`)@J7;“;?o@:`?b@@O@?bM@Pٙ*@J :2+;ʷx?٣n.3@;?`@`?7@@+@J |;Ź?tj~@8t?j@?S ,@J PG;ο2/'?"`B@;,?Ƈ+?$ ?QL-@J A;pGJ?S&@:8Q?ԛ?^5@?@Jff`.@J A;Q?!.H@7?ա?KƠ?+@P3@/@J A;Ó +@K]d@8>5@@1`@_;`? @Pf`0@J ܇T;кK?ڹY@5A?͑h@ p?9X =1@J;yJE@zxl"@;?`?l@?\ C3@2@J;:"`?GE84@9n?Ͼv?`A?O@U@3@J;z-?B@:V?\ ?^5@?b@@P3@4@Ju;'ͻ?0 (@;X ??/?݁ Kf`5@JR;ĞD?ԕ*1@9? +@?~?KƠ@R 6@J@N;@[9z?sg@8l?Լj@G?@A7@J>a;˄ۜsi?Xe+@:\?ȴ@@/?E@C8@JD#;$@5?@7?1&@b@?\)89@JD#;}?Q_p@9z?x@ j?7KOf`:@J~dž<;??|hs@3?۶E@ě?7@;@Jq;?!-w1@:[`?&@G?\)Q3@<@Jd;z+ϒ?@@5\ ??@?pG3@=@J;?l@KƧ@9$@%7K@`?ȴ@@J3@>@JȽ;[?$tS@8y ?1&??`Qy?@J`;G^cb?Xe@: O?Ӆ?`?@UL@@Ju;T? @8XQ?Q??ܛ2f`A@J!9;ނ׶5@ 0 ě@7@?l@?+@B@Jrn;SX?B@:Ơ?M@^@?`@Cf`C@J>';s恩?$/@:@?X`?z?`@IٙD@JB& ;q?As@9B? @ff`?@ff`E@J'x; oz?\(\@3dZ ?t@v?\)@V9F@JCV;I8X6"?@;A ??n?ٺ^@4G@J`;( +,?H˒:@9?/ ??I`@OٙH@J!~;-^T@(@8"M?`?1&?;33@I@J#Y;Iҍ?@:`??|?"?E@VyJ@J$ p;[S??1.@;l?Ł ?O?"@Iff`K@J$ p;.b?nO@4X ?@?xL@J$| +;?s@8?̬@?Ͼv?n@LM@J$| +;Ÿ@*0U2a@9 ?M??`UYN@J$G;I?8}H@;$?G ?O? @IO@J$G;7w+@$ xF@9e`@?/ ?أ?@A3@P@J%=*|;Ŧ(F?\(@;`?/ ?Гt? Jff`Q@J%=*|;Х?u!@;3@?@V ?`R@J%P@;;Ę?/V@: ?v?A@?@Uf`_@J+#8;˕"`?1.@9;`?-??ݑh2`@J+^R;ͬ+?`A7@9?/ ?z?;d`a@J+^R;á]9~@>@:h?O@5@?\ J3@b@J+&;F?\N<@9Ơ?&?"?@Cc@J,@Ъ;dz S\? ě@:? ?|?A@@:Ld@J,+;̧ayW?C]@9;`?\)?v?ěAe@J-";}r?nO@:?/?7@? @f@J.}A;|?s@:9?/ ?33@?V@33@g@J/];'c?ԕ*1@;\ ?\ ??l@=ff`h@J0@9;~1U@4m@8V?ە? I?|Mf`i@J1)˫;WU>?Xe,@9h?ʟ?$?-Gj@J1;.^;Q@eO@5;`?KƠ@Z?`Lk@J2a|;Ո]13?@NU@9@?ҏ\ ?€?V @Js3@l@J24~;Ö9?4m@;m`? I?j?7@Um@J3@|;㸡?'RT`@;`? @? I?Jff`n@J3@|;mHIE?"`B@:?/?`?1 ?o@J3μ;Ǵ3?e+a@;$Z ?ϝ @ G ?&@Cf`p@J5m;ʸ1f@vȴ@:Q&?@@?Ƨ@B3@q@J6`&;;@=ڹZ@:Ġ?`@`?`@ILr@J6;LƂ/@8Y@;@?@?-`RLs@J6޹^[;ŎC$A@@N@;@?7@@?jH&f`t@J7GM;ҡ?(\)@9K?z@@\)?޸Q@Pf`u@J7GM;Ǣ'?ѷX@:?l?ȴ@?Z9ff`v@J7~;p*?'RT`@:A?ѩ?dZ ?v@F&f`w@J8' ;ܘ?o@:?n?€?n@SFf`x@J8m;+ ?,zxl"@:" @?z@n? +=@My@J:pe;ѭ~?[W>6z@80 ?C?9`?+8z@J<;֔?g k@6?O@?/?~VS3@{@J<`;ΙL?ڜwkP@9Ġ???O@|@J<};̺@$?u%F @8T?`?@?`@O}@J<};?ۈeO@:b@???@~@J>p;͙?֡af@;???l@P@J? ?u;`؇?zG{@8b@?dZ ??ܼj6@J?|h;+ +a?P{@;2 ?l?Q?Q@J@n&;d@rᰊ@;S3@? ?dZ ? +@3@JAA\;EkD?@:?&@9`?b@@@JA0P;pI?qiC@6q&?@ ?Ƈ+@?@JAK;]9?#9@8Ƨ? I?`?5?Ef`@JB;rif?84֡b@9`?G ?`A?+@E@JBI;şU?vȴ9X@;? @`?Ұ U @JB;F!@\(@;`??|@~?ff`@#33@@JBb=;?m@:|?9X @bM?€@U@JEAR;ɚ ?O;dZ@4d`?V?dZ ? @(@JEAR;ƤLj@6@9G?`A?€?Ѓ`@Ff`@JFB_;δA3?҈p;@:6 ?z@?`?t`@R33@@JF^"S;? ?u?1&y@7W +@?׾v? ?S$ff`@JF;PB?K]c@;@?Ł ?l@?G@R@JF;Ϫ%ם@~"@:>v?(?ڟ?(@JL@JF]c;О?\N<@9M?;d`?$ ?V@KY@JHp;a^?|@:V ??`?܋C@Eff`@JI;yF<3?_o @;r?д9`??z@U3@@JJB[@;@? +=?-`?@JW f;ȁUO?_o@:I7@?˅? @?`@ff`@JY_a;"P&?nO@:E?O?1 ?C@ @JY3U;шh?@7Õ??j?MU@JY3U;;?˒:)@:X?Ƈ+?V?`@L@J[0H;\N@\?@;7@?O?7K?@I&f`@J[;ÙË@q[W>6@;Hr??ff`?@33@@J[vh<;62?-V@7/ ??`? @JL@J\ F;u?)y @9&?r ? ?@P,@J\fw;z?+@5?;d`?t?`M&f`@J]U;g?!.H@7E?7@??@Jf`@J]:*;љgD@@NU@:?n@?z@H@J]r/;.@O;d@9㕀?^5@@Q?ᙙ@Q@@J^|Y;a?E@9?ա?&?"G@J_=}9;⟜?64K@7^@? ?X`?+@Fff`@J_';Ǻ#|@nO@;?? ? @ @J_';'Ӻ?wkQ@;r?dZ @w?~@U@J`H +;Z}$ @@:WK?ղ-?33@?`:L@J`c&;If{_?Ov_@9 +@?Õ?9`? @U@J`|A;e7@ 1@;˅ ?-`@;`?˅?@JayW;'w@ $ xF@:?;d`??A@@$@Ja!o;J)@ #9@;ؓ?Q@^@?`?@Jb{;I3@eO@:5@?X`@ ?vff`@Jc#;NL@+ I@;v?"@t? @Ef`@Jc;ǃ{?v@; +=?n@$ ?"@J@Jd8;!F?C,zx@;^v?/?\)?bMU@Je;†<`@_vȴ9@8X ?V @z?9X @2ff`@JeD;/#:G@iB@:?˥`?/ ?ӕ@JY@Jex;Ǻ{q?tj~@;~?Q?x?5?6f`@Jex;G@O;dZ@:M?`@;d`?t`@9@Jf@=;H@:)y@;cT?v@ O?P@Jg;'sP@JM@;A?E?ff`?@P@Jg?[`;- q?/v@; ?@ ? -@JiKY;c8|t?@4m@:€?G?l@?$ JY@Jj; D5?kP{@8 @(@=? IU@Jjq;_i?ѷX@:N ??`?@A@Jk@;īi?5?|h@7@?|@?@Rf`@JkD;ʷw?- @7e`??? @33@@Jkb +;Om"B?o@:M?33@@?ff`@?@JlaR*o;ЋC?rG@9 ?/?ȴ@?`Rٙ@JlaR*o;}@|hs@: ?`?A@?۶EPٙ@JlaR*o;ǎru?- @;?@,@? Ġ@ 33@@Jm\;D3@@Jm\Q;XB4?C,z@: ?$?;`?@@8@Jo~=;&E?c @9?`?֗@? S@Jo ;J? ?1&x@; C?\)@1&?v@33@@J#;(}?+@6 ?̬@? +=?"H@@J}Q?)^@;&f`?C@z@?Ӆ@&33@@J\I;ЮG?GzH@:J?֗@? ?@(@J"x;v :?4J@;hr? +=?/ ?`@@&f`@JC;k"ɂ?oi@:0b@? ??€RY@JC;ʁE?ѷX@:A@?@ n?Լj)33@@J\$;m@& '@8 ?V??׮(@J;ߏG@Ov_خ@9?@?@Rf`@JM; ?&@;\?n?ě??|@Q@JT;Ʒx? @:?I`??~I@JT;ĭ%g@ z@;d?l@?(@9f`@JT;µ)?1&@6?`?l?O@@.@J4"F;ъeI/@^@;+C?-??`@@Jzt:;`=Wyd?'RT`@:x?@"?`N @Jj;ACg?ℵ?@7Q?~? ? U@@J>i;-Y^l@.2X@;/?@? ?C3@ @Jv.;>@eO@;v ?@ p?`233@ +@J;flf?Ov_ح@:˅ ?~@Z?̬@Q  @J>E;ŝ;D?<쿱[@9;`?`@?`?dZ @R @Jqd;N&Ԁ@l!-@;=?š?z?^@@N @Jӕ>;Ȩ~8? M:@;i7@?Z? +=?ѩS@Jӕ>;ȏBQ@ %2@;;`?Q@?l:33@@J}c;6?"`@;&f`?n?/?׾v@@@J_ô;ʣS&?5Xy=@8`@?`?ě??@Jߓy;@bM@:?n@  ?M@D@J Ԯ;޽?l@9f`?@1 ?`@.@JLv;ü]#?e@:T`?t`@~?"@P3@@JdN;Ff#?3@;X?@l?bMQ,@J׿;Dž}3?1-@;? +=??ԛ@U@Jw;vB||R@ѷX@;9X ?t`?=p?^5@@G@J;Ъ[@5sg@9=?p@ +@?@ ff`@JCg^;ĸjr?Ov_@:T?"@ +@?`@933@@J?Q;.? '@8j?;d`@O?ԛ?陙@J#Հ;Ϛ? ěT@;y ?@??^5@@'33@@Jf;Q@1&x@;D ? Ġ@?އ+@J;Y ?}Vl!@7ff`@0t@?ě@7@J@1Hw;KƤ?O;dZ@:x?Q? ?ļj@C @J;; $ @qu!S@8"? @-`?b@@8@Jw);A,@L@:??E?7K@. @JCX;6@qiB@;3@?/?z@?@D3@!@J`ܹ;Jw?@;?"@? A"@J# ;ʯF}?_o@7T?䛥?\)? Ġ@R#@Jް; EU@hr!@;t9`??T?33@@A$@Ju[;RG?'RT`e@8@?`?33@?|F%@J;ˡA(?,=@: ?bM?߮?ݑh@TS3@&@Jj;^~j?$tS@87??r ?+'@Jqy;6@ZY@9?"??/Pf`(@J>˴;V\-'?g8}H@:?G@D?:ff`)@J!5ڭ;@$?qiB@:š?G?n?@=L*@J}0G;pޏl@2a|Q@7ff`??n?Vs3@+@Jݾ;y@J;_x5?C,@8b @?ݡ?j?$ R33@?@J oz;aiv?{@3e?5??h?jAٙ@@J"^;ɅYp?@4m@:޸`?ȴ@@,@?@Of`A@J~య;nC?*0U2a|@8W?`A@-`?@*B@J~య;ıxp@Y>BZ@9KƠ?`A?E?׮@,C@J"[;̇H^>?3@:d`??T?j;LD@J;!F?y=b@:8?׮??ݡEE@Jä/;8%;?s@:8??@?1 @CLF@Jğס<;5Gib?e+a@: ?$ @`?-`JٙG@J0;Іh?[W>@75€?݁ ?M?@Qf`H@JCE;NZ? (@:@?Q?`A?1&@II@J!laR;ѵA̅@f,<@:?KƠ?+?7K@*ff`J@JɁ;ڋ1@-V@;m?1&?/ ?E@P@K@J};@@K]d@:?S?Q?ҏ\ >3@L@J> J;D?8YJ@7?A@?9`? @I M@JϢj";̉'RT?Q_@:?1&@ +=?j@$N@JϢj";ʍ!j?hr @9Tz@$??M(33@O@JAS*;1a?iB@9w@?`A@=p?-@P@J|;?m\@;Ơ?z@?dZ ?r 23@Q@J|;*?'/W@8?\)@n?QJf`R@J_;},{?&@5(r?`?t`?&@FS@J ;S?҈p:@9? ?$ ?Ұ @ET@Jc; +6P?g k@:??j?&?l@$33@U@Jp;$[)@e+@8,@@!9X @I?׮V@J;#@FA? ěT@9?O@ bM?Ͼv@;W@J֝0';6V@C,z@8?٩?I`?If`X@J֝0';J@Ƨ@;G ?n@ 33@?Q?Y@J^ F;9?D*@8׍@?`@/?ȴ@Eff`Z@Jb,E;½?C$@99?ě?-?1&Iٙ[@JBZ;L?RT`d@;?öE? Ġ? @@D3@s@J_J0;D9?*0@:@?/@?7@@>f`t@Jݤe;БE?՗+j@3e??\)?ļj@Qu@JcHk;i?KƧ@7޸`@Z @?7K@BYv@J鞔;HY|@8YJ@:'?ϝ @^5@? +=Ulw@J.;ʖ=Ć?6z@:`?ȴ@@p?QU3@x@J.;g#$6?بTɅ@:l??/ ?1 @Sy@JB;۠&@TɅo@;޸`?b@?p?G@#z@Jc;j]V@ 3@;`?"@&?۶ER{@Jc;GNΚ?ᰉ@:?`@@?@,ff`|@J;2z@ D*@:yX ?KƠ?`A? +=Uy}@J )k3;ōzt:?ԕ*1@7???v?@Kf`~@J;=Fk?S&@8?ȓt?z@?pS@@J=_;Q~x?\(\@7d?x??ě@Ty@J^!;- q?zxl"h@:C?/?\ ?dZ @J@J-;L?sP@:?v?r ?׍O@"@J^L;_@@;F??"?dZ C3@@J#j;ȵ`@<64@;Ġ?O@+?`@S@J<}^;}w@(Xy=@:7@?hr@ ?I`Df`@JM; Fd@)^@9ٙ?ܼj@,@?xU3@@JaM;˂½R?7KƧ@;f`??E?33@@ff`@J~;w>%?wkP@:`?=p@??ؓt@ @J~;mr@.}Vl@8?T?C?$ @M3@@J](;Ғ>[b?'/V@: ?1&?G ?Oٙ@J](;V-?oiDg8@:+? +@@I`??|@@JD;u@@4n@8?1&?^@?ӕ@UY@Ja4>;`Ï6i?+@6?Z@t`?I`T@Ja4>;D(M?`A7L@:i?ļj?x?z@@U@J{ 2;+^R?nO@;@?n??€@T@J"$;Q@IQ@9v?A@@`?@D@J ;ĎT?!R<6@;`? +@?և+?T@Tf`@J?;-@9?? @? @1@J 2;YSXm?W>6z@65€@h??9`D3@@J 7!;KCW?Fs@8?33@?홙?M>L@J}s;d?|?@9 ?X`?"? +@@S3@@J}s;Ub?nP@6s3@?@@?&ff`@J#r;ѽ@ ,<@:?G?KƠ??|ff`@J@;pޏl?6C-@;?ɺ^@?E?V @O&f`@J5;>oo?C$@8^@?j@`A?@;@J9s?m\@; +@??`?ۥ`7ff`@J\W;'H@Z1'@;? @,@?+O@J\W;3Ko@=!.H@;pb@?ə@ n?V @0f`@J;ǎ}ܤ?- @;?@?$?@'@J4;'c?<64@9`@?`?33@?O@@E@J!u;ȣV?=p +=@:?@@?`Q@JCRe(;'$18@`u!@9\???&43@@J;ʟ{Z1?(\)@7t?"@h8;ƿe@쿱[@8,?X`?홙?$@Jm;;yR5?Z@;6 ?@2-?I`@ 33@@J ;J㎰?Ӡ k@9:?@n?C@Nff`@J! ;$h#@Y+ @;$?öE?7K?`I&f`@J">i;HS@^҈p;@8f?E@ɺ`?-`Qff`@J"z;ȟ/+g?C\@:&?^5@??v@&@J$>;{?ҀIQ@9?C? ?t`@S@J$_Zj;CG?0U2a|@8|?`A?׮?@R3@@J$_Zj;!>>)0?E@6ٙ?G? @?Ds3@@J'Ai +;z W\?IJᰊ@; ?͑h?`?I`@R@J';[W?~$t@7`@( @ C?$@@J(^ڶ;`Ï6i?1&y@:?bM?x?n;f`@J)*;˯"Y@1o@:`?öE? ?VP33@@J)&;6?M@6#?/???33@@J*9;^Vl?Zݘ@6??$ ?V;ff`@J+ʫ;`Ɋ"?lC@8?C?7K?`@@LY@J. +;ĊG?[W>6@:t9`?hr?ݲ-?܋CM33@@J.]\;1"?$tSM@8x`? @?$ ?7KLs3@@J.oK;̛A94?a@N@7[?Ԭ@??;d`@B @J.;Ȩ~8?˘@@:@?b@@O@?@A@J/aZ;ߛi@-U=@:`?Q@S?€@;@J/;_Ë?eO @8=?~?`?և+@Dff`@J0OY;ȾγW??@:)?`@?t?V@I@J0͚R;C? [6@;vE?E??ȴ@@.@J0͚R;|^/@ I^5@;)7@?`@ +=? Bf`@J2;Z? '0@8$ ?Q?ȴ@?p@P&f`@J2i;!n@sh@8! ?E?^5@?v%@J6C;YW!?o@9+Ơ?33@@0 ?P3@@J6~AN;yW@,"h ԕ@;~`?hr?\)?M@J8!;ǵ92P?+ @;_|?n@?~@43@@J9-*;U.r?8YK@;-`?n??9X @"@J9`; ?ᰉ'R@6?;d`?M?`Sff`@J:!c;7X?᫟U=@8;`?;d`?t`? @T9@J:}O;IM?S@6`?|@@?(@B@J:}O;g?=K^@:q&?@'?b@J@J:T;!:?H@: @???S@Mf`@J:T;5Gib?@7r?&?I`?233@@J<}^p;c$?73@8?|?`?lA@@J=>N(;g@@ӎMj@;u??@? ?`Q@J=ݱ ;i?bM@8T9`?`A@ "?+R33@@J>@W;?u%@8Z ?t??J3@@J?eE;ӝf@U=K@;ix? ?€?Q@ff`@J@|ѻ;˘ƣ? k@:?@?x?O@@'@JA=s;ڜ([?P{@8$?&??"ٙ@JA; +#@_o@9ɺ`?`?`?݁ 33@@JCg;}o ?!R<6@:b?Η@? ?S&f`@JCނ;D^ԡ@ȴ9X@9O?=p??G@P@JC=lr;ˁ?Xe+@:@??$?O@JDH;Β͖ @`A7@8Z ?ě?"?@R @JE6z@6?^5@??C@JQe;Ã?e+@:??1&?Q@J @JR_;\?C,zxl@8_|?n??Ձ N@JR%S;'?$tS@7Z ?͑h?V ?"K@JS!;"?C%@8.?p??ؓt@&@JSCs;Ƹ\J?E@:?ə?hr? @JT8T;S?a@N@6ݲ ? ?z?\ Pf`@JU!{;ðݾ?_Ft@8R-?O@z@?D@JV>';СY{?RT`d@5/ ?׾v? @?x@ @JV7];U +?@:?`? ?@ff`@JW?$;]B?I^5?}@:R?У??T:3@@JXD;"XZ?xF@:??|@5??`B @JY}I׺;Ȗx|`?O M@;E?^5@?+?@#@JYe=;˝8@33333@8j?I`?9`? @R3@@J]\;Yy?Ϫ͞@8Ġ@E@G?$ G&f`@J_ !;̠]+?a@N@3 ?Ƨ??7@&@Jabf;@n?"h ԕ@8 ???O@@U3@@Jc ;$? k~@;D ?Q@h?Z$ff`@Jd;E,Y?xl"h @;G?Ƨ?"?T@B@ @Je@x;ٺ?>BZc @9?9X ?Z?Ѓ`!@JeWm;P+@Z@; ?Q?"?E@S"@Jf+;??l"h ԕ@9?@1 ?`@VY#@Jl] l;:?㞃%@9E?^5@?Q?G/ff`$@Jl] l;ɘZ8@^5?|@;lI?b@?؃`?vU3@%@JmZ;jf@S&@8C??`A?ەQ&@JmZ;! ?O;d@:}/ ?@??`@2L'@Jo?R&;Ȇh?{m@;? @ I?\ @23@(@Jp*;@@6k ???|?;`Mf`)@Jqy;`x?Q@9+? Ġ?"?@O*@Jq۾;łU?Ş%@9Ұ ?r ?̬@?Ƨ@33@+@Js`I;ϑU?- qv@9?@?&? I:,@Js*;8:?g k@9?$ @n?׮@K-@Jt<;)AA?ѷY@9] ?? +=?/@/.@Jwl ;ˋ?u%F @:#???ٺ^@9/@JxB0;ΐ 53?s@8?C??O@@S0@Jy=c;9$@ + J@:?? Ġ?V@Df`1@Jy_gn;ϬӪ7?Zc @9 ??b@?`A@*2@Jy_gn;~?Z@8?M? ?ܬ@@@ٙ3@Jy];$@ aGz@97@?Z@?M&f`4@Jy;;ƔWU?S&@;l?9X ??@@VY5@Jzcsl;ɑF? ѷ@;z??;d`?-`@O33@6@JzG;J!?@8DZ ? ??r '7@J{՝V;Ǔ|@x@;`?;d`?E?ff`#8@J{=;}2f@F]cf@9{d`?`@X`?Z@59@J~|;K@ (@;z^@?ě@ `? U:@J@; b?u%F +@8 ?ȴ@@?޸Q@D3@;@J;s?@+ J@9̋@?dZ @-`?Q@Dff`<@J);L8?oh@:?v??Q1=@J);(b?qiB@9A?t`?`A?㕁@N@>@J;ɷa?@:(r??l@?-ff`?@J—;#-+@{J#9@8[?r ?\ ?Q@Cff`@@JL@J;¾ac@]/w@9ȴ@?`@?@?ZT A@Jrѯ;Nx@思IQ@9YX @A@@,@?@UB@J72;?S@5|?`?I`?@ff`C@J72;LJA?"`@9V? ? ? @SٙD@J] s;#j?a@N@8??ě? ĠAf`E@J'RT;8⟝@H˒:*@;+?ě?"?@A F@Jޠ3;>oo?K]d@8?V?|?@Bs3@G@J~d^;Ϣj"? qu@4;`?€?`?+@VLH@J`sX;ȝ{i@ k@;?;d`?`?@Ps3@I@J};}Z?1-@:|j?€?Q?"TS3@J@J`;˖[ ?Ʈ}Vl@9_;`?Ͼv?G ?A@@?PH@:?̬@@?^5@@K@T@Jf;[BE?+jf@9}/ ?ȴ@??1 @IٙU@JBZc @9v?\ ? Ġ?G @LLV@JZ;̶b?)^@1"? ?S?C@I33@W@Ji;{{?l@9@?9`@y ?VTX@J'gM; !?_F@:??;`?1&@DY@J~;H?"`A@;m`??7@?V @JLZ@J];Ͱ$Y?u"@9$?=p?`?7@@2[@J2.;ǜK?3@:A?`@?Q$\@JaM;?5?'/V@;d`?/@-`?J]@Jh;H8}?$ xF@;9?b@?^5@?<^@Jh;˳@ ѷ@: ?v@9`?Ƨ_@J\;j7>?oh@:,I?-@?O@5`@J~8;R@84֡@:o@?@??-`@S@a@Jދ;2;u?⍸@9|?dZ ??&T&f`b@J*s;ìax@ R<6@8l@?hr@ě?x@Q3@c@J٩T;Y4@Y|@;S3@?ȴ@@?V@2d@JB +B;]9@j~@8޸`?@Z?ԛN33@e@J\6;˅?tj~@9+?b@?l?dZ A@f@J);ɍXB5@iDg8@8?~?/ ?܋C*ff`g@JZq;٩T"?3@:?Ѓ`@r?&@;h@J=;5H?U=@;?t@?Ұ @ff`i@J=;Ñ>E?ˎMj@5?X`@C?7@JLj@Jn;/uK?*0U@9` ?`@ ?@@Ek@J;0?/{J#:@9ڟ?š?^5@?~@Sll@Jb;@Ov_خ@9A? ? Ġ?QTm@Jb|;Ϧz:?]cA @7?t`?€?O@6n@Jbfe;_8?1&@9'?E@`?@@o@J;ʌ@m\@; ?$ ?`?C?񙙠p@JQ;ŋ)oe?qiB@:S3@?E?Ƨ?@Rf`q@JP;Ôcϳ1?tj~@4)?z@?Z? I@Tr@Jn;vF:;?|@8?|?͑h?`?ӕ@>3@s@JDP;}?L/{J@:<?hr?ě?p@ +ff`t@J!y;1KL@*0@:-?ě@1&?`I&f`u@JQv;b= @ $/@;^@?(? @?S3@v@JQv;ưS@@:?@Ƨ?1 @Q,w@Jʣ&;x>-?($ xG@;R ?V @ Ġ?dZ @?33@x@J "K;#*g?E@6?`@?t@Ly@JB;}wa?A@;c?+? ?@-z@Jy1D;db(?y (@9 `? ?ݑh?SP{@Jy1D;A?8}H@;1 ?KƠ?`?z@P|@Jcˁs;f?B@5 ?n??@VL}@JX%[;Ŗ}@1&x@:?bM@?(@P33@~@J_t;" 8*?H˒:*@8(?O@@ ?dZ @733@@J΢a;Ơۭ:`?p +=q@8`?^5@@(?$@E@J d#;oŊ,?쿱[W?@9 ?+@?C@233@@JTCN;w݇/4?\(@6?dZ ?n?bMG @J=B;9W?a@N@;l??7K? @K3@@J_(;Kf/@Zu%F @9?ղ-@ ?ȴ9`@@J_(;οLP?8YJ@7?^5@?`@?@P@JЀs;MW&?Ov_ح@:M? @$?ɺ^@@U@JЀs;ɋś$?tSMj@83@?KƠ?E?׍O3f`@JŹ;ʹ䒼0@@;?M?`A?G @Cٙ@J;\@҈p:@83@?@s@?V 0@JҀjk; +?&IQ@:`?E?G?`F@JF;ƅz?Y|@8?`@?;`?4@J;ĪPy? k@3?v?"?◍@@If`@Jb +;AvSC?:)y@9p?@?x?݁ @(@Jվ;űH?u!@:?Ǯ?? +=V@JG;ˣe5@@9Ơ?r ??@@Of`@J6;y!?`A7L@8ݲ ?Ͳ-?bM?@Q@J&E;<[/?䎊@7k?`A?`@?ӶEE3@@J;)t?E@9@?dZ ?/ ?Гt0@J]g;~?!-w1@8Ơ?j?`?1&0f`@J!1;BcQ?r ě@:)?`?bM? @JB1;ŶZ-s?_o @;E??|?`?`@Mf`@Jd;uK?ѷX@7C?1&?dZ ?v9f`@Ji;@R@U=K@9? ?`?1 =3@@J;>??Ov_ح@7?bM?`? Ġ@T @Jj;?Q 9@O;dZ@9@?`@?G ?@E@@J;ۃH@Z@;5@?&@ ?@Oٙ@J O*;gf@?tj~@5"?l?z@?޸QQL@J_;K?#9@99`?Լj@b@?+C@Jl;}z>??@:)`?Ƈ+?KƠ?@K@J@;ǾV{?:S&@7 ?\)@X`?xF@Jz;4&x9@tSM@9@?Z@?C@7@J!-w;fb4~??@9e?C@ 7@?@2f`@J];7?zG@6:?ȴ@@ ?`@Q@Js}; xN7?q @; ?@@^@?U@JG;νm:?N;6@9?KƠ?Q?Q@JG;![Z@B74@;9X ?`@@G?ߝ @@J'L;'w@0 ě@9 +@?KƠ@bM?1&@K@J'L;;S?iDg8~@;C?-`? Ġ?ܛM@Ja E;`Q?@9W?`A?9X ?xM@JaZ;~4E?lC@:$?$ ??`@J;Ɏ"@Q_p@:?O?n?>ff`@J. ;##e?$/@8t?x??E,@Jb;s!_?Q@:Ġ?z@@ ?@B33@@J]V;ϟf?4m9@9?E@ v?ȓt@P33@@J*;!?P{@8$?޸Q?@?ff`1@J*;:@S@;?Ƨ?Z?v@8@JN;Dg8~@#@94z?ԋC?Ƨ?(@Ty@JQ~x;ÐI ?XbM@9Ġ?1&?|?`R@JΧ;Ϟ8d?B@7e`? Ġ?G ?EP3@@J};J{NT?%@; ? @KƠ?v@3@@JHo;œ?fA@;f`?Ł @Õ?E@P @Jrv;:lX?L_@8r??E?n@3@J!:;"?M:@91 ? ?j?&@3L@J}c.;M㸡?C\@9`?`A@L?E/@J4;%_5@-8Y@: @?° ?A@?x:3@@J_';*?Q@5x?r @ 33@?S&f`@J;l +"@u@8?`?E?ղ-?@J;%ԥ@kP|@;`?@@?`@Uf`@J 4;m?s@;x?`?~? @T@Jne8;˨ņn?~$@9?j?n?ݲ-@Q @JC;̆z2?O M;@3?@7K?S@C@@JqT;&z?@9p?l?9`?`@Q@Jd;]F,4;?\(@:} ?(@!?)33@@J^;ϣY%5@7rG@:-O???1&O@J;ǘA;@N_o @7 ?b@?C? I@J<;ѺQ?j~#@:p ?`@ G?ǮC@J`;<@.zG@:?? ?C@?@J];?S&@;G??j? Qٙ@J ;X@m@;`? @? Ġ?ٺ^@Hff`@J!_r;ˠ k?zxl"h +@7o?ě?-?أ@C@J"W;(V`_?oiDg8@9?`@?3@J#Y;!F?H˒:@8\ @@`?ěK@J#Ɏ;HE/?T`d@8l@?`??t@@J$ p;QG0Y?ې@9|j?ԋC?G?p@<3@@J%;:;ɎC$A?p:@8?̋C@`A? @;@J%J4;-@?ߤ?@:?n?/ ?vCٙ@J&Y.;cfץn?p +=q@9`?"?l?љVFf`@J(b;y^@ݗ+@:?C@=p?E@@@J(;ɨg@0U2a|@9ɺ`??7K?A@@H@@J)K;ZGA?L_@:{`?t@?@0@J*k8;lQ?H@;o?`? ?$@C@J+#8;7a?+a@@:@?Ł ?$ ?v@Ty@J,@Ъ;1DE.?(\)@6}?n@ \ ?@M3@@J,+;Ƴg ?,=@5cT?1 ?Z?ش9`V@@J/];q {? (@7 ?-??Z@@J/Y;z:@JM@8f$?Ƨ@hr?&I@J/p;}9@JL_@7|j?㕁@5??S4@J0;C؜? @:?hr? I?"D@J1]p;y1DF?Q@5>5@?t?S?b@@ ff`@J2m;xʼ?Xy=c@8F$?33@@C?Z@B@J5m;-?JM@:?ݡ@ S?C@2@J7GM; +=p@O͞@8??`?O@@Ds3@@J8? ;9?L_@;p?O@ +E??|@<@J9}w;͚{$d? I^5@9?;`?"?5?@*@J;[;"H?n.2@9<@T@ ?@@@JA:;ѩ>!? +=p +@9a? ?`?ݡ@2@J>q;;D=G?~$@;?ٙ@n?r M@J?c;`sW? ěT@;J? ?X`?€@8@J?|h;"BJ'k?ڹY@5?€?$?@Qff`@J@n&;=su?c @9?@z@@h?٩@JBb=;r:7?'RT`@6??V?ە@33@@JC @;Kf/?)^@9?Q?5??I33@@JDܨ;<@8YJ@:?@hr?KƠ@Gf`@JH#@F;ȝH?*0@9lI?n@Q?~@5ff`@JJ]#;awi?~($ x@;?hr?l@?bMPY@JKa!;i@ѷ@90?\)?`?`A@@L@JK; ?.2X@;l? ?G?G @PL@JL<;XĽ3?C\@9bM?ļj?x? +=AY@JLPr;ǐdf@а{@7???=pSf`@JLԻ;Ź?zxl"h +@;}? ??|?5?ff`@JM@$>;ɲ,(?^5?|@9,@ff`@Y?j@TFf`@JND0y;oeP?@NU@;4z?/?Ƨ?`4ff`@JND0y;̳!@ +:S@;? @ ě?`5L@JNUa;"zB?,<쿱@;?/@Q?SG@JP];G8@?@;?x? ? Ġ@JQ};FsB?ȴ9Xb@8 ?z?S?I`G@JR\&5;CA0?c @8$?S?j?^@Uf` @JR;9?IQ@8t?@ix?;`0ff` +@JS;ȇ"y?+jg@8?ם ?C?@T@ @JY>_ ;9@vȴ@7&f`@ +=@?$ @Ns3@ @JYO;Ʃ?{m@;`???7K@D @J^|Y;Ȏ8 +?ߤ@@9K?Ƨ??lM@J^|Y;=އ?@;`A?ə?|?t@Uf`@J_';?L_@; ?b@@;d`?TT@@J`H +;ɋ?A [@:Ұ ? ?x?n@V3@@J`A7L;DI?'/V@;ě?G@`?`@U @JcZ;Py }?- @9 ?x?h?xC&f`@JeD;PO?iB@: ?KƠ?G ?z@@0@Jf@=;ƫy?xF]d@;CT?b@@p?`@@TS3@@Jfzr;h@[9?g k@;0?M?dZ ? @@Mff`@Jk@;>'?hۋq@;Z?;d`@Q?G @P @Jk}:;׾W?#wk@8{d`@t@ff`?ǍOP@Jl;@TɅ@:/ ?b@??tP3@@Jo];Ǿ"?%2@;I? @ +@?I`@733@@Jp`+;8K? xF]@;?Η@?S? +@Af`@Jp +=;ɂZ?~"@8?$ ??`>@Jq}g;ɣ;?6@80 ?\)?"?/@@3@@JrC;P+@oi@;r?hr@|?X`K@Js4 N;ƔWU?Ov_@7~?Ѓ`?hr?C@<@Jw;4@mhr!@:Ǯ ?$ @@?`@@9 @Jw;?e@I^5?}@7???(@Lf`!@JxF];ǖBZc @;7@?O?^5@??|C*@J_;>q?A [7@;?Ͳ-?`?1&33@+@JY +@/O M@;Z ? Ġ??p7ff`,@J;LB@_o@8?-`?Ƨ?`A-@Jߨq;X?u!R@9$ ?z@??@=L.@J]|;n>h?N;5@; ?(@~??f`/@J]|;y@6Fs@;z?ȴ@?\)?lC0@JU;@x@3@8Q?\ ?p?9X H 1@J; +=p? k@8@?ա@z?@=33@2@J~";<}^p?5Xy>@:/ ?@??"@I3@J~";Ǧn?C,zx@8?$@ 9X ?7K;L4@J!S7;,+@ 0 )@:?I`?z@?(@B5@JD;LJ?͞&@:?/?`?+PL6@JD;ő%Vў?@:5@?θQ?S?=p@Q 7@J}%W;] A@[@;7?E?n? +@GY8@J T ;ʢXS?Q@6L@??Гt?߮R9@Jӕ>;c?畁$/@5 ?ȴ9`? ?tDL:@Js;ǝ.Y?u%F +@7?ԛ?hr?l:;@J%m;##e?<64@8 ?`@%`?zS<@J Ԯ;ȓf8C@7KƧ@8A?щ7@@}?M@F3@=@J_,A;/?H@9;`?l?l@?-@U@>@Jք;L ?5Xy=@: ?X`?z?@B@?@J/;ƾߤ??l!-w@; ?/?㕁?zP@@JË;ʐ +@䎊r@9?`?և+?݁ FA@JCg^;ƖnTq?R<6@:L?z@@ ȴ@?⟾R,B@JvW;:W?@5n@$`@@&?`@?3@C@J#T;x@e+a@:߾?ǍO@~?\)@4D@J#;D@ xF]@;7@?l@?j?V @TyE@J#;Ů*?L/{J@7ܬ??? K3@F@Jh;΃—?ۋq @9j? ?? ĠHG@Jh;E84?\N<@9G??bM?5?Ts3@H@J¨;XUP@`A7K@9Z?`?l@?ϝ II@J`O;ȇ+4a?>B@8X`?öE@33@?٩@J@JA(;{R@@4m9@;n?b@@^5@?\)K@J;ȩXS~,?@4@;ܬ?n@€?V Gf`L@J;;h?B@9?@  ?ZRf`M@J;;ɚA_E?傩 @8^@? @@  ?r @*ff`N@JG;C?֡af@;`@?KƠ? ?@U3@O@Jz3;9`?{m]@6\ ??|@ I?x?P@Jz3;9$?g l@6? I??7KQQ@J# ;Qa?Vu@9?O@?~?33@@;ff`R@J!Z; S.?֡af@7n?+?O@?5?DS@J];ő]@%u@;???@,33@T@Jc|;[>8?4m@:X`?`?v?I`@Of`U@J|-;=:2@?nO;@6;"?S?hr?E@T@V@J +;&+8?~"@3q?ڟ??7@PW@Jk;6]@K)^ @;`?`?bM?ȓt;X@J;b= @x@;m? @?/ ? ISY@J;Ľ# ?Z@7?ꗍ@@|?`@@,Z@Jܠg;]g#}?_Ft@:1&?͑h?Z?◍@7[@JE;zNz@z^5?|@;?Ł @n?@Uff`\@J!;>B[@)^@8`@@\ ?x@V@]@Jb;ϣ ?"h ԕ@7|? ?33@?1L^@Jup; @ 빌~($@9\)??^5@?Ƨ@"ff`_@J;")@@:l@? Ġ?V ? @R33@`@J`;ț8:@74m@;`@?@ Ġ?EC3@a@J}2;2%?jOv`@:S?@@?ěA@b@Jȟ@;?sPH@9D?G?A@?-`PYc@J>;Y@vȴ9X@7\j?;d`? ?=d@JɁ;%}R?^@9?ʟ@A@?$2e@Jݹ;ƍ֥?`A7@66E?M?Ƨ?`@@6f@JB҅;Ȅƣ@ק&@;3@?KƠ?G ?7K@)ff`g@JϢj";bZh+c?Vt@:@?ě@`?;d`Th@JϢj";ȳJ@[q @8!?A@@ +? I0Li@J >c;?>p?SMj@:? ?x?E@T33@j@JAS*;Z?˥S@7 ?$?;d`? @Tlk@J;ѝq?N;5@7?X`??~@Iٙl@J#g;@R<6@;?t@\)?"@<m@J@U;ˁ?u!R@:h?? ?"Rf`n@J܃#5;QeMa?-V@7?$ @`?G @(o@Ji;ͣ]g#?ohۋ@:`?"?9X ?jE p@J"f;xF]@wrG@;r?=p?@?q@J~˷;M/@73@9T`?x@l@?\)H3@r@J~˷;=d?C,zx@9&? Ġ?C?ղ-Ts@JC;X?oiDg8@;n?`??X` t@Jߠ';ߗ?!-w2@9?@@?@J@u@Ji;+6+?_Ft@9 +@?⟾?E?"@Iv@J&;:[h?m@9t? ? ?"@Rw@J\;O?ڹY@:?@>)?]cA @:4z?7@?z@?9`Sy@Jz;e ?a@O@7@ȴ@@`?$ 4ff`@J{ 2;uE?rGE8@9p ?j@M?`Tf`@J\P;QzFR? (@5š??ɺ^@?z@@@J +c0Q;ʞ#-?E@66E?$ ??-*@J #^;{Z1b?MjOv@8Õ??h?x@'@Jߤ@;=jΫ?1&x@3 ?;d`??=pV3@@J;?p +=q@:0b@???QK@J^AԷ;^Vl?sP@949`?7K@ +=? @J3;*2 h?ֽ<64@9/ ?t??!33@@J@tdV;łZ@ +e@9+?S?O?/ @J"sP;˵|N/8?jfB@7 ?V?hr?@R@Jƴ;Φ?1@9?x@W +@?EE@JT;6r@w+@9M`?C??և+V@J;?bM@;3t? @ ?^5@@I@JOv`;Wn?g @;D ?-@?@@J\|ؙ;̔>?s@8Ơ? ? ?@4@J`;6?؎qi@9o?t??=p@Py@JJ;fzr?S&@:\?r ?v?ۥ`UY@J!x;I@.}Vl@;/?@v?j@R@J[;/uK?($ xG@5;9}w?R<64@;I`?7@?`?ڏ\ @?ff`@J%);W}@kP@:8?X`?? @@9ff`@J%); l+?@; ?`?/?~C3@@J)&;]uq? qu@8?@ff`?33@@Rf`@J+ʫ;^_0?@@8X ?`A?X`?T@J,C;ʚ^w:?O M@89?"@1&?jAf`@J.]\;;D=G?+ @9`A? @`?GJ33@@J2"@;̼,?h ԕ+@:}/ ?@ +=?٩@ff`@J3?l;S?B5/?:~@: ?S??ղ-@Pf`@J3aV\-; {j?Ɛ$tT@8}?֧@KƠ?€S@J:}O;@R@_?@9 ?-`?@? Ġ@#33@@J;D=G;dTi?'RT`e@:@?n?$?bM@/33@@J<}^p;^h?:~@90b@?/?ꟾ?߾v@F3@@J?OQ;]*?ک @7;`?܋C?n?F@J?OQ; ^?-V@:Ұ ?hr?M??|@O@J@q;%_5?ג:)y@9>5@?@??9`@O@JB0;Ƿ]?tj~@:e`@?v@ ?v@@f`@JB0;s!_?O M@:X? ?"?ܛ6@JC\;;?)^@;V?"??O@@H3@@JD|0;ϥ8L?L_@8s@?^5@@?ȴ@@U&f`@JE^;0IA?+a@@9?x@?@U@JG;Ǎ?fA@:7@?@??Ԭ@@OY@JG;M΁?-V@9 ?X`@ +?33@Gs3@@JK#?;C$A?NT@:P`? ?G ?"@7@JM:;0#̎?C\N@9o??O?ӕNL@JP%;QQ?=K^@;>`?`A? @?x9@JPaAcx;ů?U=@8?1&?ꟾ?Ցh@Of`@JP;1N@ $TɆ@:Z??I`?Q@L@JR_;p&@cwk@:*=?̬@@ ?@R@JSX;u?=b@:X?33@@S?B@JVu;#?+jf@9Z ? Ġ?9X ?`@@JVԪ;dTi?#9@:^5@?M??|@Jٙ@JV7];>h?O;d@9 ? ?Ƨ?@@JW?$;[ @@4n@8Hr?`@6E?^5@@T@JXUP;3!@a|Q@8?dZ ?r ?ى7@@7@JYBu;{{?{J#9@8A?ȴ@@ j? @NL@J\ +V;7y ?%F +L0@:5€?;d`@? R9@J]η;0͚R?Ov_@6?ě@ě?S@O@J^v;ǫCII?&x@8Rn?5??ݲ-?`F@J`^h;@P??@9 ?̋C?`? I@2ff`@JdY2;?Vl!-@:?̬@?У?ff`NY@Jf;b(?d7@:*=?`??O@@:@JhI;#g?YJ@9 @?"?Ƨ?K3@@Jha9;ҿU?m\@9 ? @V ?=p@Hff`@Ji{);Ņb?4m9@9/@?t`?^5@?ěI@Jjd;ͷZt?@N@4tz?(@ +=?vJ@Jj;-°@_;dZ@9z?ȴ@@;`?OL@Jm?{;T`d@d7@:3@?33@?n?O@P@Jw|;w>?8YJ@8`?ȴ@@C?n@13@@J}$ =;ʮrKw?<64@8`?"@?ě@G@J~;w\@LcA \@9;`?Q??^5@>@J>;œq?_F@9\j?@??@V@J! ;Ο8? ?]ce@;KC?t?ě?$ @T@J;ǒa?L_@:T?Ͳ-?-?ǍOL3@@J;C|V?bM@:<?l@z?"ff`@J—;ȩދ;2@ԕ*1@9"M?ԋC??/ Qٙ@J;a@cA @8??x?r @4@J@l;w?>BZc @8&?֧@?5?@'33@@J@l;bU??'/V@93@?`@?`@@J@B;]D?sPH@68Q?/ ??`@J@Jft;NzVC?1@: ? @`?N33@@J~c;Ż~@ T*1@9? ?^5@?M3@@JT;pC?˒:)@8 ? @??C@33@@J>;ϭ $?g k@9n?`@?r @@JbV6;ɄS?dZ1@6 x?9X ?◍@?5?Qٙ@Ji' ;&E?nO;@7? Ġ@V ?$NY@J܏o;8%;@!-w@7`?9X ?V?(@4f`@JFJ;Ag\?u%F +@7`?bM?z?`@@Jh@!-w1@: ?z@?33@?SI33@ @JK;t?B@8_;`?~?b@?hrA3@ @JA";z?E@9"?+??+Tf` @JbT;ʡr?O M@9o?b@?Ƨ? Ġ@" @J;$h#?"`A@:?^5@?z@?`A @J@;{z@sMjO@93@? I@?ָQU @J]V;|J?JD@9?ܛ@h?xF @J0;˖Xu @ %@;V ?@ ?Ͼv@F @J~E=;ҝ%?ᰉ'@8`?`@@ ?+- @J> ;&|?3ߤ@9{`?G?-`?`@ @J;~mH@u"@9>v?`? ?Z@Bf` @J}c.;D`?kP{@8ܬ?@ ?A@@E @Jc;ȣ}?%F +L0@9?;d`?\ ?dZ @QY @JB;ˊ;W@K]@:;`?G@?;`@;3@ @J +N;u?]cA @:?Ƨ?? I@Q @J;ՙ;Ǜ @ }Vl!@9E?1&@ ? 0 @JW;̴h?C,@9(r@9X @ O?l@Nff` @J;ʿDN @JM@8j?`@t?tPS3@ @J";̙|=h@?$/@:?`?`A?v陙 @J";Ǻ@ߤ@@9/\ ?hr@?@033@ @J;R~Rw?64K@87K?Ԭ@?v?x@C @JLf +;h?ěS@9p?öE?t? J !@J!jf;CH?XbM@:`?ȴ@@ `?C@L "@J!ݠY;{?*0U@9e`@?E?ff`?٩5 #@J"h;l {?!R<6@6;?33@@?Q@M $@J#=;\ +V?ѷX@:3@?T@ȴ@?ļj@Qf` %@J#Y;̾@Bo?\>@9`?`?x?(@, &@J#w;62?As@9u??7@?@R '@J% Z;eD7?|?@9\)?Q@z?x@ (@J&Y.;/jQ?θQ@8|? ?b@?=pQFf` )@J'Ho;v?C\N@: ?X`?z?€3 *@J(ٺ;ʶ(Eg?@:`?M?x?S@@ +@J(;;KDs@@H@9@Ġ?ҏ\ ??֗@@.ff` 0@J24~;i?SMj@8 +@?;d`?睲 ? @SS3@ 1@J3"l;;Y}I?1&x@9o\ ?"? I?(@U 2@J7Cc,;#co?O;dZ@7^@?Õ??@M 3@J9}w; 7!?)@:? @?€?ff`B 4@J?-@p?˥`R 9@JP~;˶>?Xe+@9`?`@`?Q@? :@JTR;̕bV6@1[W>6@9(r?@?z@?S@I ;@JWV2;e.?JL@6?և+?z?p@B <@JY>_ ;o!?A [7@8?bM@ +M?\ @R` =@JZc;xʼ@ߊ @9/ ?KƠ?^@?Ƨ@Kff` >@Ja^; q2@ bM@9 ?ǍO?\)?J33@ ?@Jf@=;_?|@7C`?t?ӶE?睲 L @@Jh;@|ѻ@(\@9cT?\ ?$ ?`@@P&f` A@Jih;ˇH^=?ƃ%2@9?`@?\ ?@T, B@Js!_;;[@oi@:1h?j?`?U C@Jz,;Z_?m\@:?/@j?\)@;f` D@JV!u;˭^?($ xG@8(?@@ +v? @M@ E@J*b;ԝ{j@+a@:ϝ??l@?l@% F@Ja0n;tN?.H@8€?b@?X`?"Pٙ G@J>(;!.@8YJ@9 ?° @ + ? @P H@J;˰_A?+ I@:@? +@?t`?ǮB I@J$(5;ʳ-@ zG{@9!G?G? ?vT&f` \ No newline at end of file diff --git a/scopesim_templates/extragalactic/deep_field.py b/scopesim_templates/extragalactic/deep_field.py new file mode 100644 index 0000000..e2d1c89 --- /dev/null +++ b/scopesim_templates/extragalactic/deep_field.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- +"""Hubble Ultra Deep Field analogue, built from a vendored HUDF catalogue.""" + +from pathlib import Path + +import numpy as np +from astropy import units as u +from astropy.coordinates import SkyCoord +from astropy.table import Table + +from ..rc import Source +from ..utils.general_utils import add_function_call_str +from .galaxies import galaxy + + +__all__ = ["hubble_ultra_deep_field"] + + +_DEFAULT_CATALOGUE = Path(__file__).parent / "data" / "hudf_catalogue.fits" + +HUDF_RA = 53.1625 # deg +HUDF_DEC = -27.7914 # deg + + +def _select_rows(tbl, ra_center, dec_center, fov, mag_limit, mag_col): + """Return a boolean mask for the square FOV + magnitude cut.""" + mask = np.ones(len(tbl), dtype=bool) + if mag_limit is not None: + mask &= np.asarray(tbl[mag_col]) <= float(mag_limit) + if fov is not None: + half = 0.5 * float(fov) * u.arcsec + ctr = SkyCoord(ra=ra_center * u.deg, dec=dec_center * u.deg) + rows = SkyCoord(ra=np.asarray(tbl["ra"]) * u.deg, + dec=np.asarray(tbl["dec"]) * u.deg) + dra, ddec = ctr.spherical_offsets_to(rows) + mask &= (np.abs(dra) <= half) & (np.abs(ddec) <= half) + return mask + + +@add_function_call_str +def hubble_ultra_deep_field(pixel_scale=0.06, + fov=None, + ra_center=HUDF_RA, + dec_center=HUDF_DEC, + mag_limit=None, + filter_name="HST/WFC3_IR.F160W", + sed_early="brown/NGC0584", + sed_late="brown/NGC4254", + n_cut=2.5, + catalogue_path=None): + """ + Source of an HUDF-analogue galaxy field. + + Loads a vendored catalogue of HUDF galaxies (Skelton+2014 photometry + cross-matched with van der Wel+2012 F160W structural fits), trims it + to a square FOV and magnitude limit, and assembles one + ``scopesim.Source`` by summing the per-galaxy Sersic profiles produced + by :func:`scopesim_templates.extragalactic.galaxy`. + + Each galaxy gets one of two user-supplied spextra SEDs based on a + Sersic-index cut (``n > n_cut`` is treated as early-type), redshifted + to the catalogue ``z`` and scaled to the catalogue ``m_F160W`` in + ``filter_name``. + + Parameters + ---------- + pixel_scale : float + Output pixel scale in arcsec/pixel. Default 0.06 (HST WFC3 NIR). + fov : float, optional + Side length of the square FOV in arcsec. ``None`` (default) uses + the full extent of the vendored catalogue (~4 arcmin diameter + around the HUDF centre). + ra_center, dec_center : float + FOV centre, degrees. Default is the HUDF pointing. + mag_limit : float, optional + Drop galaxies fainter than this F160W AB mag. ``None`` uses the + catalogue's own limit (28.0 mag for the default file). + filter_name : str + SVO filter ID used to scale the SEDs. Default ``"HST/WFC3_IR.F160W"`` + matches the GALFIT magnitude column in the vendored catalogue. + sed_early, sed_late : str + spextra SED names for ``n > n_cut`` and ``n <= n_cut`` galaxies. + Defaults are Brown+2014 archetypes: ``NGC0584`` (E0) and + ``NGC4254`` (Sc spiral). The kc96 library is *not* suitable + here because it only extends to ~1 um. + n_cut : float + Sersic-index threshold separating early- and late-type SED + assignment. + catalogue_path : str or Path, optional + Override the vendored FITS catalogue. The file must contain the + same columns: ``ra, dec, z, m_F160W, r_eff_arcsec, sersic_n, + axis_ratio, position_angle_deg``. + + Returns + ------- + scopesim.Source + + Examples + -------- + >>> from scopesim_templates.extragalactic import hubble_ultra_deep_field + >>> src = hubble_ultra_deep_field(fov=20.0, mag_limit=25.0) + """ + path = Path(catalogue_path) if catalogue_path is not None else _DEFAULT_CATALOGUE + tbl = Table.read(path) + + mask = _select_rows(tbl, ra_center, dec_center, fov, mag_limit, "m_F160W") + sel = tbl[mask] + if len(sel) == 0: + raise ValueError( + f"hubble_ultra_deep_field: zero galaxies after fov={fov} and " + f"mag_limit={mag_limit} cuts on {path}." + ) + + srcs = [] + for row in sel: + n = float(row["sersic_n"]) + sed = sed_early if n > n_cut else sed_late + q = float(row["axis_ratio"]) + srcs.append(galaxy( + sed=sed, + z=float(row["z"]), + amplitude=float(row["m_F160W"]) * u.ABmag, + filter_curve=filter_name, + pixel_scale=pixel_scale, + r_eff=float(row["r_eff_arcsec"]), + n=n, + ellip=1.0 - q, + theta=float(row["position_angle_deg"]), + ra=float(row["ra"]), + dec=float(row["dec"]), + )) + + src = sum(srcs[1:], start=srcs[0]) + src.meta.update({ + "object": "Hubble Ultra Deep Field analogue", + "ra_center": ra_center, + "dec_center": dec_center, + "fov": fov, + "mag_limit": mag_limit, + "filter_name": filter_name, + "sed_early": sed_early, + "sed_late": sed_late, + "n_cut": n_cut, + "n_galaxies": len(sel), + "catalogue": str(path), + }) + return src diff --git a/scopesim_templates/tests/test_extragalactic/data/toy_hudf.fits b/scopesim_templates/tests/test_extragalactic/data/toy_hudf.fits new file mode 100644 index 0000000..4a039ed Binary files /dev/null and b/scopesim_templates/tests/test_extragalactic/data/toy_hudf.fits differ diff --git a/scopesim_templates/tests/test_extragalactic/test_deep_field.py b/scopesim_templates/tests/test_extragalactic/test_deep_field.py new file mode 100644 index 0000000..5c9b216 --- /dev/null +++ b/scopesim_templates/tests/test_extragalactic/test_deep_field.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +import warnings +from pathlib import Path + +import numpy as np +import pytest +from astropy.table import Table + +from scopesim_templates.rc import Source +from scopesim_templates.extragalactic import hubble_ultra_deep_field + + +TOY_CATALOGUE = Path(__file__).parent / "data" / "toy_hudf.fits" + + +def _call(**kwargs): + """Default to the toy fixture so most tests run offline-cheap.""" + kwargs.setdefault("catalogue_path", str(TOY_CATALOGUE)) + return hubble_ultra_deep_field(**kwargs) + + +@pytest.mark.webtest +class TestHUDF: + + def test_returns_source(self): + src = _call() + assert isinstance(src, Source) + assert len(src.fields) >= 1 + + def test_galaxy_count_matches_catalogue(self): + src = _call() + tbl = Table.read(TOY_CATALOGUE) + assert len(src.fields) == len(tbl) + + def test_positions_within_fov(self): + """A 6-arcsec FOV around the catalogue centre should drop the two + offset (±5") galaxies but keep the central one.""" + src = _call(fov=6.0) + assert src.meta["n_galaxies"] == 1 + + def test_early_late_split_by_n_cut(self): + """Toy catalogue has 2 rows with n>2.5 and 1 row with n<=2.5.""" + src = _call(n_cut=2.5) + assert src.meta["n_galaxies"] == 3 + # Each per-galaxy sub-source carries one spectrum; the SED string + # is recorded on the Source's stamped meta from add_function_call_str. + # Easier check: count via the source catalogue. + tbl = Table.read(TOY_CATALOGUE) + n_early = int((np.asarray(tbl["sersic_n"]) > 2.5).sum()) + n_late = len(tbl) - n_early + assert n_early == 2 and n_late == 1 + + def test_amplitude_passes_through(self): + """The brightest catalogue row (22.0 mag) should drive the + brightest spectrum scaling.""" + src = _call() + tbl = Table.read(TOY_CATALOGUE) + i_bright = int(np.argmin(np.asarray(tbl["m_F160W"]))) + # spextra spectra carry their amplitude implicitly; verify the + # spectrum exists and is callable on a wavelength grid. + sp = src.spectra[i_bright] + wave = np.linspace(1.4e4, 1.7e4, 50) # H-band, Angstrom + assert np.all(np.isfinite(sp(wave))) + + def test_mag_limit_drops_faint_galaxies(self): + """Toy row 1 has m=26.5; cutting at 24.0 should drop it.""" + src = _call(mag_limit=24.0) + assert src.meta["n_galaxies"] == 2 + + def test_custom_catalogue_path(self): + """Pointing at the toy file should give exactly 3 galaxies.""" + src = hubble_ultra_deep_field(catalogue_path=str(TOY_CATALOGUE)) + assert src.meta["n_galaxies"] == 3 + assert src.meta["catalogue"] == str(TOY_CATALOGUE) diff --git a/scopesim_templates/tests/visual_inspection/hubble_ultra_deep_field.png b/scopesim_templates/tests/visual_inspection/hubble_ultra_deep_field.png new file mode 100644 index 0000000..fc88dc1 Binary files /dev/null and b/scopesim_templates/tests/visual_inspection/hubble_ultra_deep_field.png differ diff --git a/scopesim_templates/tests/visual_inspection/plot_hubble_ultra_deep_field.py b/scopesim_templates/tests/visual_inspection/plot_hubble_ultra_deep_field.py new file mode 100644 index 0000000..a89d7ca --- /dev/null +++ b/scopesim_templates/tests/visual_inspection/plot_hubble_ultra_deep_field.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +"""Render the HUDF analogue Source onto a single mosaic PNG. + +Visual inspection only — verifies that +``extragalactic.hubble_ultra_deep_field`` builds a sensible scene at +the chosen pixel scale. Each catalogue galaxy contributes one image +HDU with its own WCS; this script paints them onto a common pixel +grid centred on the catalogue centre and saves a log-stretched PNG. + +Run from the repo root:: + + python scopesim_templates/tests/visual_inspection/plot_hubble_ultra_deep_field.py +""" + +from pathlib import Path + +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.colors import LogNorm +from astropy.table import Table +from astropy.wcs import WCS + +from scopesim_templates.extragalactic import hubble_ultra_deep_field +from scopesim_templates.extragalactic.deep_field import _DEFAULT_CATALOGUE + + +PIXEL_SCALE = 0.06 # arcsec / pixel +FOV_ARCSEC = 60.0 # square side +MAG_LIMIT = 27.0 +OUT_PATH = Path(__file__).resolve().parent / "hubble_ultra_deep_field.png" + + +def _paint_field(field, canvas, canvas_wcs, flux): + """Drop one galaxy field onto the shared canvas via WCS-aware shift. + + ``flux`` is the linear (10^(-0.4*mag)) scaling that compensates for + the per-stamp sum-normalisation done inside galaxy(). + """ + data = field.data * float(flux) + h, w = data.shape + src_wcs = WCS(field.header) + cx, cy = (w - 1) / 2.0, (h - 1) / 2.0 + sky = src_wcs.pixel_to_world(cx, cy) + px, py = canvas_wcs.world_to_pixel(sky) + ix, iy = int(round(float(px))), int(round(float(py))) + + x0 = ix - w // 2 + y0 = iy - h // 2 + x1 = x0 + w + y1 = y0 + h + cx0 = max(0, x0) + cy0 = max(0, y0) + cx1 = min(canvas.shape[1], x1) + cy1 = min(canvas.shape[0], y1) + if cx0 >= cx1 or cy0 >= cy1: + return + + sx0 = cx0 - x0 + sy0 = cy0 - y0 + sx1 = sx0 + (cx1 - cx0) + sy1 = sy0 + (cy1 - cy0) + canvas[cy0:cy1, cx0:cx1] += data[sy0:sy1, sx0:sx1] + + +def main(): + print(f"Building HUDF Source (fov={FOV_ARCSEC}\", mag_limit={MAG_LIMIT})...") + src = hubble_ultra_deep_field( + pixel_scale=PIXEL_SCALE, + fov=FOV_ARCSEC, + mag_limit=MAG_LIMIT, + ) + n_gal = src.meta["n_galaxies"] + print(f" {n_gal} galaxies") + + npix = int(round(FOV_ARCSEC / PIXEL_SCALE)) + canvas = np.zeros((npix, npix), dtype=float) + + # Canvas WCS centred on the catalogue centre. + canvas_wcs = WCS(naxis=2) + canvas_wcs.wcs.crpix = [(npix + 1) / 2, (npix + 1) / 2] + canvas_wcs.wcs.cdelt = [-PIXEL_SCALE / 3600.0, PIXEL_SCALE / 3600.0] + canvas_wcs.wcs.crval = [src.meta["ra_center"], src.meta["dec_center"]] + canvas_wcs.wcs.ctype = ["RA---TAN", "DEC--TAN"] + canvas_wcs.wcs.cunit = ["deg", "deg"] + + # Pull the same row order back from the catalogue to recover each + # galaxy's apparent F160W magnitude (Source.fields holds the + # normalised stamps; the magnitudes live on the catalogue, not on + # the field headers). + tbl = Table.read(_DEFAULT_CATALOGUE) + half = FOV_ARCSEC / 2 / 3600.0 + cra, cdec = src.meta["ra_center"], src.meta["dec_center"] + cdec_rad = np.deg2rad(cdec) + sel = ( + (np.abs((np.asarray(tbl["ra"]) - cra) * np.cos(cdec_rad)) <= half) + & (np.abs(np.asarray(tbl["dec"]) - cdec) <= half) + & (np.asarray(tbl["m_F160W"]) <= MAG_LIMIT) + ) + mags = np.asarray(tbl["m_F160W"])[sel] + if len(mags) != n_gal: + raise RuntimeError( + f"catalogue selection ({len(mags)}) != Source.n_galaxies ({n_gal})") + fluxes = 10.0 ** (-0.4 * mags) + + for i, (field, flux) in enumerate(zip(src.fields, fluxes)): + _paint_field(field, canvas, canvas_wcs, flux) + if (i + 1) % 200 == 0: + print(f" painted {i + 1}/{n_gal}") + + floor = max(canvas[canvas > 0].min() * 1e-2, 1e-12) if (canvas > 0).any() else 1e-12 + fig, ax = plt.subplots(figsize=(8, 8), dpi=120) + ax.imshow( + np.clip(canvas, floor, None), + origin="lower", + norm=LogNorm(vmin=floor, vmax=canvas.max() or 1.0), + cmap="afmhot", + extent=[-FOV_ARCSEC / 2, FOV_ARCSEC / 2, + -FOV_ARCSEC / 2, FOV_ARCSEC / 2], + ) + ax.set_xlabel(r"$\Delta$RA [arcsec]") + ax.set_ylabel(r"$\Delta$Dec [arcsec]") + ax.set_title( + f"HUDF analogue: {n_gal} galaxies, m_F160W < {MAG_LIMIT}\n" + f"pixel scale = {PIXEL_SCALE}\"/pix, FOV = {FOV_ARCSEC}\"" + ) + fig.tight_layout() + fig.savefig(OUT_PATH) + print(f"Saved {OUT_PATH}") + + +if __name__ == "__main__": + main()