From 42c6a53148eb5d8de356d08103ff30d7e58125b8 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 11 Sep 2013 22:03:33 -0700 Subject: [PATCH 1/2] Implement getters and setters for img width and height properties --- src/components/main/layout/box.rs | 58 +++++++++++++- src/components/main/layout/inline.rs | 6 +- .../script/dom/bindings/codegen/Bindings.conf | 7 +- .../dom/bindings/codegen/CodegenRust.py | 15 +++- src/components/script/dom/htmlimageelement.rs | 75 ++++++++++++++++-- src/components/script/dom/window.rs | 7 +- src/test/html/content/test.png | Bin 0 -> 1151 bytes .../html/content/test_img_width_height.html | 10 +++ .../html/content/test_img_width_height.js | 21 +++++ 9 files changed, 174 insertions(+), 25 deletions(-) create mode 100644 src/test/html/content/test.png create mode 100644 src/test/html/content/test_img_width_height.html create mode 100644 src/test/html/content/test_img_width_height.js diff --git a/src/components/main/layout/box.rs b/src/components/main/layout/box.rs index 32d38b3116a..5a016d7e8ed 100644 --- a/src/components/main/layout/box.rs +++ b/src/components/main/layout/box.rs @@ -426,9 +426,7 @@ impl RenderBox { GenericRenderBoxClass(*) => Au(0), ImageRenderBoxClass(image_box) => { - // TODO: Consult the CSS `width` property as well as margins and borders. - // TODO: If the image isn't available, consult `width`. - Au::from_px(image_box.image.get_size().unwrap_or_default(Size2D(0, 0)).width) + self.image_width(image_box) } TextRenderBoxClass(text_box) => { @@ -449,7 +447,7 @@ impl RenderBox { GenericRenderBoxClass(*) => Au(0), ImageRenderBoxClass(image_box) => { - Au::from_px(image_box.image.get_size().unwrap_or_default(Size2D(0, 0)).width) + self.image_width(image_box) } TextRenderBoxClass(text_box) => { @@ -472,6 +470,58 @@ impl RenderBox { } } + // Calculate the width of an image, accounting for the width attribute + // TODO: This could probably go somewhere else + pub fn image_width(&self, image_box: @mut ImageRenderBox) -> Au { + let attr_width: Option = do self.with_base |base| { + do base.node.with_imm_element |elt| { + match elt.get_attr("width") { + Some(width) => { + FromStr::from_str(width) + } + None => { + None + } + } + } + }; + + // TODO: Consult margins and borders? + let px_width = if attr_width.is_some() { + attr_width.unwrap() + } else { + image_box.image.get_size().unwrap_or_default(Size2D(0, 0)).width + }; + + Au::from_px(px_width) + } + + // Calculate the height of an image, accounting for the height attribute + // TODO: This could probably go somewhere else + pub fn image_height(&self, image_box: @mut ImageRenderBox) -> Au { + let attr_height: Option = do self.with_base |base| { + do base.node.with_imm_element |elt| { + match elt.get_attr("height") { + Some(height) => { + FromStr::from_str(height) + } + None => { + None + } + } + } + }; + + // TODO: Consult margins and borders? + let px_height = if attr_height.is_some() { + attr_height.unwrap() + } else { + image_box.image.get_size().unwrap_or_default(Size2D(0, 0)).height + }; + + Au::from_px(px_height) + } + /// Returns the amount of left and right "fringe" used by this box. This is based on margins, /// borders, padding, and width. pub fn get_used_width(&self) -> (Au, Au) { diff --git a/src/components/main/layout/inline.rs b/src/components/main/layout/inline.rs index 96312846d84..33fe8ca335f 100644 --- a/src/components/main/layout/inline.rs +++ b/src/components/main/layout/inline.rs @@ -553,8 +553,7 @@ impl InlineFlowData { for &box in this.boxes.iter() { match box { ImageRenderBoxClass(image_box) => { - let size = image_box.image.get_size(); - let width = Au::from_px(size.unwrap_or_default(Size2D(0, 0)).width); + let width = box.image_width(image_box); image_box.base.position.size.width = width; } TextRenderBoxClass(_) => { @@ -684,8 +683,7 @@ impl InlineFlowData { let (top_from_base, bottom_from_base, ascent) = match cur_box { ImageRenderBoxClass(image_box) => { - let size = image_box.image.get_size(); - let mut height = Au::from_px(size.unwrap_or_default(Size2D(0, 0)).height); + let mut height = cur_box.image_height(image_box); // TODO: margin, border, padding's top and bottom should be calculated in advance, // since baseline of image is bottom margin edge. diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 0ef1d9d502a..0bd49b5d1c7 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -547,12 +547,13 @@ def addExternalIface(iface, nativeType=None, headerFile=None, pointerType=None): domInterface['pointerType'] = pointerType DOMInterfaces[iface] = domInterface -def addHTMLElement(element, concrete=None): +def addHTMLElement(element, concrete=None, needsAbstract=[]): DOMInterfaces[element] = { 'nativeType': 'AbstractNode', 'pointerType': '', 'concreteType': concrete if concrete else element, - 'customTrace': 'trace' + 'customTrace': 'trace', + 'needsAbstract': needsAbstract } addHTMLElement('Comment') @@ -585,7 +586,7 @@ addHTMLElement('HTMLHeadingElement') addHTMLElement('HTMLHtmlElement') addHTMLElement('HTMLHRElement') addHTMLElement('HTMLIFrameElement') -addHTMLElement('HTMLImageElement') +addHTMLElement('HTMLImageElement', needsAbstract=['width', 'height']) addHTMLElement('HTMLInputElement') addHTMLElement('HTMLLabelElement') addHTMLElement('HTMLLegendElement') diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 0e01fcef059..a26fff7d82a 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -3115,8 +3115,8 @@ class CGGetterCall(CGPerSignatureCall): A class to generate a native object getter call for a particular IDL getter. """ - def __init__(self, returnType, nativeMethodName, descriptor, attr): - CGPerSignatureCall.__init__(self, returnType, [], [], + def __init__(self, argsPre, returnType, nativeMethodName, descriptor, attr): + CGPerSignatureCall.__init__(self, returnType, argsPre, [], nativeMethodName, False, descriptor, attr, getter=True) @@ -3290,6 +3290,8 @@ class CGSpecializedGetter(CGAbstractExternMethod): def definition_body(self): name = self.attr.identifier.name nativeName = MakeNativeName(self.descriptor.binaryNames.get(name, name)) + extraPre = '' + argsPre = [] # resultOutParam does not depend on whether resultAlreadyAddRefed is set (_, resultOutParam) = getRetvalDeclarationForType(self.attr.type, self.descriptor, @@ -3297,11 +3299,16 @@ class CGSpecializedGetter(CGAbstractExternMethod): infallible = ('infallible' in self.descriptor.getExtendedAttributes(self.attr, getter=True)) + if name in self.descriptor.needsAbstract: + abstractName = re.sub(r'<\w+>', '', self.descriptor.nativeType) + extraPre = ' let abstract_this = %s::from_box(this);\n' % abstractName + argsPre = ['abstract_this'] if resultOutParam or self.attr.type.nullable() or not infallible: nativeName = "Get" + nativeName - return CGWrapper(CGIndenter(CGGetterCall(self.attr.type, nativeName, + return CGWrapper(CGIndenter(CGGetterCall(argsPre, self.attr.type, nativeName, self.descriptor, self.attr)), - pre=" let obj = (*obj.unnamed);\n" + + pre=extraPre + + " let obj = (*obj.unnamed);\n" + " let this = &mut (*this).payload;\n").define() class CGGenericSetter(CGAbstractBindingMethod): diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs index f345d59a8b8..e90086103fc 100644 --- a/src/components/script/dom/htmlimageelement.rs +++ b/src/components/script/dom/htmlimageelement.rs @@ -2,9 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::bindings::utils::{DOMString, null_string, ErrorResult}; +use dom::bindings::utils::{DOMString, str, null_string, ErrorResult}; use dom::htmlelement::HTMLElement; +use dom::node::{ScriptView, AbstractNode}; use extra::url::Url; +use layout_interface::{ContentBoxQuery, ContentBoxResponse}; +use gfx::geometry::to_px; pub struct HTMLImageElement { parent: HTMLElement, @@ -47,18 +50,74 @@ impl HTMLImageElement { pub fn SetIsMap(&self, _is_map: bool, _rv: &mut ErrorResult) { } - pub fn Width(&self) -> u32 { - 0 + pub fn Width(&self, abstract_self: AbstractNode) -> u32 { + let node = &self.parent.parent.parent; + match node.owner_doc { + Some(doc) => { + match doc.with_base(|doc| doc.window) { + Some(win) => { + unsafe { + let page = win.page; + let (port, chan) = stream(); + match (*page).query_layout(ContentBoxQuery(abstract_self, chan), port) { + ContentBoxResponse(rect) => { + to_px(rect.size.width) as u32 + } + } + } + } + None => { + debug!("no window"); + 0 + } + } + } + None => { + debug!("no document"); + 0 + } + } } - pub fn SetWidth(&mut self, _width: u32, _rv: &mut ErrorResult) { + pub fn SetWidth(&mut self, width: u32, _rv: &mut ErrorResult) { + let node = &mut self.parent.parent; + node.set_attr(&str(~"width"), + &str(width.to_str())); } - pub fn Height(&self) -> u32 { - 0 + pub fn Height(&self, abstract_self: AbstractNode) -> u32 { + let node = &self.parent.parent.parent; + match node.owner_doc { + Some(doc) => { + match doc.with_base(|doc| doc.window) { + Some(win) => { + unsafe { + let page = win.page; + let (port, chan) = stream(); + match (*page).query_layout(ContentBoxQuery(abstract_self, chan), port) { + ContentBoxResponse(rect) => { + to_px(rect.size.height) as u32 + } + } + } + } + None => { + debug!("no window"); + 0 + } + } + } + None => { + debug!("no document"); + 0 + } + } } - pub fn SetHeight(&mut self, _height: u32, _rv: &mut ErrorResult) { + pub fn SetHeight(&mut self, height: u32, _rv: &mut ErrorResult) { + let node = &mut self.parent.parent; + node.set_attr(&str(~"height"), + &str(height.to_str())); } pub fn NaturalWidth(&self) -> u32 { @@ -114,4 +173,4 @@ impl HTMLImageElement { pub fn SetBorder(&mut self, _border: &DOMString, _rv: &mut ErrorResult) { } -} \ No newline at end of file +} diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 00c4b63f539..8b36ce7ce95 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -9,7 +9,7 @@ use dom::document::AbstractDocument; use dom::node::{AbstractNode, ScriptView}; use dom::navigator::Navigator; -use layout_interface::ReflowForScriptQuery; +use layout_interface::ReflowForDisplay; use script_task::{ExitMsg, FireTimerMsg, Page, ScriptChan}; use servo_msg::compositor_msg::ScriptListener; @@ -168,7 +168,10 @@ impl Window { pub fn content_changed(&self) { unsafe { - (*self.page).reflow_all(ReflowForScriptQuery, self.script_chan.clone(), self.compositor); + // FIXME This should probably be ReflowForQuery, not Display. All queries currently + // currently rely on the display list, which means we can't destroy it by + // doing a query reflow. + (*self.page).reflow_all(ReflowForDisplay, self.script_chan.clone(), self.compositor); } } diff --git a/src/test/html/content/test.png b/src/test/html/content/test.png new file mode 100644 index 0000000000000000000000000000000000000000..353869b3c49d19b768ea414e3e3549cde0cdef5a GIT binary patch literal 1151 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8aRUAw}kpw>5QXs`y;1OBOz`&mf!i+2ImuCV6 z*-JcqUD@w)^01hTxn&$xWME*C^K@|xskrs_ilZQq$KWV(G0snQ&zZcI>KMOrh7aDJ z3<>WTW>_;k<7?Q-3}nJ+un?-$3~PuIm}(deQw5{37z7kTQH^TQsI`dj9}Q$^Ld22) q(bA?6a=IN2HzLCgDJvG_Gy1AB- + + + + + + + + + diff --git a/src/test/html/content/test_img_width_height.js b/src/test/html/content/test_img_width_height.js new file mode 100644 index 00000000000..cb1a076113a --- /dev/null +++ b/src/test/html/content/test_img_width_height.js @@ -0,0 +1,21 @@ +// Testing get/set of image width/height properties + +var img = window.document.getElementsByTagName("img")[0]; + +function wait_for_img_load(f) { + if (img.width != 0) { + f(); + } else { + window.setTimeout(function() { wait_for_img_load(f) }, 1); + } +} + +wait_for_img_load(function() { + is(img.width, 500); + is(img.height, 378); + img.width = 200; + img.height = 100; + is(img.width, 200); + is(img.height, 100); + finish(); +}); From db38639c172903459859c34fa181aa9156c5f825 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 11 Sep 2013 22:03:39 -0700 Subject: [PATCH 2/2] Longcat demo --- src/test/html/longcat.html | 10 ++++++++++ src/test/html/longcat.js | 23 +++++++++++++++++++++++ src/test/html/longcatbot.png | Bin 0 -> 17588 bytes src/test/html/longcatmid.png | Bin 0 -> 329 bytes src/test/html/longcattop.png | Bin 0 -> 17457 bytes 5 files changed, 33 insertions(+) create mode 100644 src/test/html/longcat.html create mode 100644 src/test/html/longcat.js create mode 100644 src/test/html/longcatbot.png create mode 100644 src/test/html/longcatmid.png create mode 100644 src/test/html/longcattop.png diff --git a/src/test/html/longcat.html b/src/test/html/longcat.html new file mode 100644 index 00000000000..53e13c3fcee --- /dev/null +++ b/src/test/html/longcat.html @@ -0,0 +1,10 @@ + + + + +

+

+

+ + + diff --git a/src/test/html/longcat.js b/src/test/html/longcat.js new file mode 100644 index 00000000000..d492c3417c4 --- /dev/null +++ b/src/test/html/longcat.js @@ -0,0 +1,23 @@ +var longcats = window.document.getElementsByTagName("img"); +var longcat_top = longcats[0]; +var longcat_mid = longcats[1]; +var longcat_bot = longcats[2]; + +function wait_for_img_load(f) { + if (longcat_top.width != 0 && longcat_mid.width != 0 && longcat_bot.width != 0) { + f(); + } else { + window.setTimeout(function() { wait_for_img_load(f) }, 1); + } +} + +wait_for_img_load(function() { + var count = 0; + function elongate() { + let height = Math.round((Math.sin(count) + 1) * 70 + 20); + count += 0.2; + longcat_mid.height = height; + window.setTimeout(function() { elongate() }, 100); + } + elongate(); +}); diff --git a/src/test/html/longcatbot.png b/src/test/html/longcatbot.png new file mode 100644 index 0000000000000000000000000000000000000000..10b897e88a8b4dcc0e9fb5408c40e04db6964345 GIT binary patch literal 17588 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 wnV;YE%5whR~{ism-x;hl=@Lqty}`=1T# zqrHNpbr@>8OdgcgbjVZFAI`3Rj%KOxLHCV zdk}TM$SIYm=eRcQ8HGtg!v6XxP5Ysk8_j{{Zmn1W4sf<}8OWBc zf#H-Y^8=7ZG4Dr!&6O*C$FFa|+i*I&XV4zHVk?*o0lc@yw(F&prDh{SX9TSuT`-wg z1IFm+=vOXJL@+o)*FymGya<}7q5R{;oq^btc-vdN;UQptboud&`+Uy+Vd`}Z|3g?J zF(Ob`w*z3n@U$p7Q0#AB#xtP9aC?bbH|{tWX#SuAfU-Uv&EQd85Pv?33^jBzvH1gR!WL+OlPB zQ7dW5+t40MQIbXk%f0afUFkNwl zK{QE{3^oUq(iB(+$oI`kWt|L~Y zczb~?eBQP!=}8U8dn`F-6xOxZIAB&xeP~4}%`02})n)%W+e6l7-*Zgcor-Y-AS0Db zTICk!cLKwe=r7A83EC~aUHD}5)NBB3I1vfSVhD38S*+2oms7PaoYrrDVkJ{kOGfmg z@^U@ksHBV(y&wt=Pjj`x3YBNKd?oQhDpd$DzJElb4nA8WmvkikKQv}TE(=r#^&LSK?NkSr74yav@8FS2vd{;8^l zMj$wN_*KwpGk1DI8IIZ{fKMdy+jN9+HUy846-mF5@2M{NqFDnGsQr_b=beoR*^Xdm ze_e%l`r$84!P{yAEu7A;l=r1o0V4s<@lzS@pWcUoS-Er|;1;-FI~C~EQ%qOxJ(G9f zCg|Tsf+$110?A3#KAI{vXx;Z5cl*H1p;a4 zWSkBNObi?X_&E@K{K5TYEq^KS1tXgN-|sN=Bn9sU{`>xadehy<{!efHKfUSyuj~2W a;$l($@m`7+;Re4<1Ok;-k}8tW^Zg&+VEP#V literal 0 HcmV?d00001 diff --git a/src/test/html/longcatmid.png b/src/test/html/longcatmid.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9a921ac6478a00c1ddf0bbf1fd78d82f2a8acc GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0y~yV2S{;Svc5$WYAW}N+89S|H(?D8gCb z5n0T@z%2~Ij105pNB{-dOFVsD+3#}lu!t+jgq27Eg(OQ{BTAg}b8}PkN*J7rQWHy3 zQxwWGOEMJPJ$(bh8~Mb6iZ*(>IEG~0dwXNAV3UDF`$u!Bq~ph3dK!vXC?_Z@uV_BO zVIdHa^&m-gc{*3_qC2+xKk5EA;SW4#sm}0WVQ}o}O&Tt&?bgmvfATVc*5AbHC3^)qKoi!qeQb=fC{ymdKI;Vst0LXE60ssI2 literal 0 HcmV?d00001 diff --git a/src/test/html/longcattop.png b/src/test/html/longcattop.png new file mode 100644 index 0000000000000000000000000000000000000000..beb85663d3a06d68d361a9ed90ab2e070700ffe7 GIT binary patch literal 17457 zcmd6PWmr{P*zKl~?kS^IAd~0)f>4|9_8+2)=JLc|iX_G?bN= zfIL8dWi;m|fLET_zSeYrKu~d^zhNL>Q;EQfNRDshB#{=LpurO`quo5Q1uqdhN@_TY z+gMwhd~}3}+nX3Tnix~Ld~h_Ul71tnsP2bB2!T*R-bje5xX$h^xM;jHdqDidpCSkk zqof3{qGD^=rFv0gF;P=9Ik7W0n{T}|Rnt0ou)g&RqgZXOLEB7~%zS}V6uY)=Iwdyt zcjOW!G7hYoVw{~%Nkl)BwEgRrSAqP)ZbKJJJr&FWq2Rv*Qd(IN2?>cGzLNjXcL_8N z@XG)7{eShQzd!cBdh7q{P5*yg&mze;)FS*dhZ$Cj6B7pID}PcRn+~g&of8xI?Q$s@ z>ZOZYW4SzJ)Hv91 z1lUS2&AKsmYxK*d!c!udDxx_pjl|d$%;Hs_NB^_dwwkTOcG?*?U=It0i3nwoF6|EO zrtFTkp3C^Pm7(|vD+?YbHb+^y8ou(0!TSb%4_96?GBOPnYDQdL$=4DS;Z!I@{O6i` z(>3T8#ZGncCdB?T@S}#J3+`uFMB_w5Lqk_{5~CKv7R4Ay=lh*0Hh0OAwA6^q)CDt( z-ka}>^lAwhi-#;48BnlTOwmXL;OA;=I=8nNQibrN66m9iHjpUWt?|vmL@ESE~~Kv8|=XGP`Yr; zr1dN{D=TInwK_bCDXy-o9plFE4FyEMT*LO@){WCBR(YM<&2 zj`5q0doPdC{CD&OsiF7y(q*A}eJO%w7-;p^hAVxMbaDYl>xAiqA8(9i?9HoZl{@hv zm)F;Zx0gq;IdkgxjEOQm@u7)@YL(NE={&J?wmVgB*d@ad9$0wm=SH0Fb^bgxH5CG3 zQZMP~O`sp;W!TcYcxBfCZ@#}5{tZV(|K@zZOoN%34;qk4XEny#Ha$aqfig~w?;6e7 zv$Zdz**&M(AR?#v?_9mE9h)v!QC+HsHwIHO-#4DCIh230;2P57jj1#nF5mjQgyh~& zK2DUjH=p#{tA2eL`ws?!h6pDWO%~+sb+b6JrRvw>b*<5=$(V>WU`i(F92rFa7)34T z2XhgX(6l`80w z^zS3nDk>_=O)Pmc>h8Gd!l}u~zOlKFzlOB2Mi8_cavNOlmL|GAEb8j!>6KDYX(AO_ zPL;G9zdS;q%Hmh9gqPsz-X6=v_Bdz$HO8^Lx*F*#6@^7chGu5A$#|jTd@vn$Njg+Xtq>TY;tl40xCh4W$l6aLW9$ni&EwM<;~5IccV&@Lh%K$@n6HMsvIw` zCs$x3p+%T$X4Yw!&EwpP?3FuSQdTyr3_c0>AMsZ2JGKwMXsT?cO8NwH@tM?N8Tgt7 zm$sC$ArOA&1Bu%~($9jHYV|%+ch_gdADI$me*gYW#l;l_%ECctE^=4_yJphSb=3zV zc2C~(!#O0SPZ^UtD6J}t_^Ty9R&ptQBs4V41o%Iat*)*z-kmfMQ^r`&)rw~}E!=>d zs+%YX5`{y8g(NY*Mw-g+P?K_BQRaqF$x^$Y?I2K6 zQW_f@>z`~467kwn>AZj6f9KHD+-$vr0D0c~T%ax#)VVx5K5XK!VWAr|l*Cy&jl@gS z3>C5BiKoxmpC|~P(a^n34Nc*(QES*VdHJPGe??40sp>-YzI9mOjuWz+F6f~@vdixH zXW8RgQ&+cIc0TP>>JPZcP@=L>i!8U3P4TkNnT$1ok^0=4UYe{(aCy~Qd7N6e4X*5b zj(edtt#<^70hzx9N+lx*)^zrW^SEX^th4l`MD($)&jxKU8tm5S7*s6+gBIpG2GS_f zd^>6g)jU06G1;gM+o%gZME(@Gt-PVcJG6b#|1vH8C4vvLc5tcbpjb>=GnFh3e5KQz z-|f2)z8_1G-G!ws;TYuntDEUQQqIoj;%-9q_4U(@E|j|NSNKgwlPO?}Czq)DiG;n$ z_V&s3xl^!PtVuigT%-aJ(GRva-Cf81)y&Lr%W!aU-D0sv$)EpTJtUJ*S%2SRkMJ~; z#ekCpRk{rHhUV+jcF;76T6n0bVINZ1;iO~8{FIBIA2}L|LQs*>eoU7e9Sw{rJfoso z_7gZSDq@~*a>FHL)$Pb1%eB3|e3BX&-jUd!45R5UmQzELh>HMIEg)da$44S0w8-nl zhxqg<3)@2o<)03pdk2LWTK4Bp2DJmJ1O>@=v`?DB0=#a{q%S8~1V%#hRIJ8CRM5X1 zzr})YZ|HobXvlMtCg`!6zR-Ad(0FKgFtsFt#jHrU&4Q5e=R7BZkp1NDg56_C=k#!n zP(fG_vDxDyI6K>@o?>(G(lwRWE~`vI1mxx-{d)JVXz@j5MTIML^X%Xw@a#=Ld$qW24yD>WE_Z4^^=LeGRT1QDpC=3%1LhO1;CLoz8w()|==W5$W zN3lPA_+UQINrX7_B%)d^3x$4HSH_PU#{PT0+c zbZCAoF|(WJPcT9ldnzJj318?BrOtf58RRjaszDD%r;Lu?pX==GggZY!S7c0NOBrPQ zGQjKk8=2sRjxTO^%;w?ie1Dn3fGo6Oxp;uKh5{^$9n?qKnldltinkLJKb zLwfuL6Qswd@Yl{B76CzU@_#J=7WvHYc-)-shk%_m_|X%0>2S8=QIg3Jj%+ap&~) z%K5;++rW?zaWk`!?qCcSG?Cut&oA#TmX3ByTUS*a9q)OVR9(oLpVt|dFYo8*>$&jl z)4#!?QGz$#t-)rjMr>(mL4NYVk3!Hr!)B=k8U4v~JIWYz(rEPEDHzDlNH-GDW&LAf z6zVM*`d`l09QyXGbz5!ZJTb+cb=eCoPT|Q`E7lTNeyofCU7Czi3-El19}JDt=gzE2 zCglD&9~w>0r?FsmvcWRlXhTUS{6KblcZXU_SS75{;P|}8X34K;Ao6xZr7tnWMH~xW z1PA7~!uQhs?J!V|+n1Io<-T%CRW9pue)xq40}};$-f`(oL_|a<5~Zhar*!o4?G@^u z{mKfOcpw+@BpQyUj8PD}Cwdm~Etm=U zQ^-r5g?V<{We6G>8&+oK(>#F1y@=6q;9$I2g0)=U99XLmc?jVzj`TtJG!LyH%; zL)gZ^w}|br{|shNw=Zu`hBKe9e_AeI>pt52%B4|j05_B-sLo66MDLAGvb@c%VD#&I z7-mtrn%&II3>!(5t*xzZWu?QH!&cCRn$Bk}*@#Yx5@kG1&X=dToA2qcE0M7Dqx!#MPDe`h45Sp%s)H!`1I$wl1YX-}q}fhlfjL z1oSkM4zFdpDu{#)sFQ9RrmqXcL`C%VsdU}eO$09H9m<&2p1+3nxGcuKUpcZ{qm_gu zdab6_8WkWEt#2@R9rb;})RAiHe{hdq`n6YPTEMsh1u1LOhcDS}Z z0$I6o2QzrEjY!1d9b-BO3DxQ)I;s{4L!ZV~sw^f*inXdc{)-}|=-E*z9s5sC z+)xZQRYzyEXNeL_QGS(`9AFo;wD{uV<6~0_r8|Ss*)7Hy1O!dd1Ox>7ZYy7MaE#V{ z;P_5MuPNusN>b(MeEyl=Wk|3z=ry!fs06)rTS2(JU5io6tp{E08=p)2eY1xQx`K9R zCwqpE&)!TU;rm9%e7s>3Fd8ifeBl7sH-GE(fl(_sIEk;7>FHCL5DfB;>oZc@`wq9$ z!zIen=4%oioj&euuN_%dgZn18oO3uPbKxTZve-c91GhdQ@e+H2cdAq`dBM`H2PH>F z&C;ntt1uzaBC1HS;J4S!d7`_p5}wH+U&}E-x$5DY<@zhEFClKd@i`_fHaa?~w;iag zeNUfe9v`nW^*Ju>?O9!Q<-arGad9E`MGLAZiKkP=ZUv%8FU5_5*4}7i^9U0tAbh;Bq`aVEXeI zZJKGN1~Zld!G# zseb468F#{xq>`^p{*MNy-J(e!nyekUUL356x9#oiTZ_&7G)K;*jEPbKKQ2?IiLsSd zy*Nqaa*);Y^Yb;z?eQ1gHurBTTEWC*q%Hw(XlTf0b!q$g?SC&9mWGEhcPC4_`b(Qo zMh&G#hl?2#N&F?-rpt#{C5&k>1s;?0AkBT}dEp$w+Kb&Oo4oNDkGb=G#e9_uC%3O7 zBZ@_LmMrJ{3lUSgKFtFc>I`_7=P9K}zxr9{0-3ATA|g*Y(MULvQ||9mkSHF9C9}Jm zvmg%^%uq?b67kHol7+^&gzVBL7|S{5Dm3)wLWGR|EWOs2&s-iD-nT1AMH=-5Iyc~= zHf$EBxL7vD!>;_s+p(WxLo>xGJAZ^FV3Csc!^J`whk|DSum?I}1n3ywi6m+TkWQ7Z zY>j3op4&-FOJ_@#BNQAaZ;$DACn!X<2R^~IUGGbLxuln=s6WbzI(if*A2cX!6T-}b zCqqlXste!@|Ee%+lP?FF7Brm_gLckyv&2I%T(1(< zV^iZh^sKTh0@bmV6XVn3`~du4nbJ$9+BnVsCHyLn%X~TmhQjUpGeiusP+dWfj_&T< zABTx1#IIhx>gn$n*G+rk<|eh};9$@*2x^~1v=9>XZw3d0bW5ex)VS>(&PH|};t~=9 z$h#!Q?|sKN z>$2r5|E=TCRJvuKYDj-_>GDzBGrO0^@SiN?3^s4G;6>qSV4`4Q0o*!~)xnI1c1eoQ zV3J)0{FeB9Vn0OR;gzRSJdG&M#~8AS^JA%Wp=Nf|0V09fX8!nugmR-zdC)K^et_hy zs^a{;P7KH{|1QH`8)^M=2*Y8i^k}#0vCy~{x##Y9+2@$-YhTtCxo^@cm&yF$Xih$dn;9t)jvq{$2K79%7^9zQsN`FNo)6Lt zq^jZ$y^j*!Q&}94TAyUr$raXnDpG}C=BOmq1<#A$m%%CF`T0NDM4^QZfE~@g$tGg6 zg)}%GM9x-Q3dg25+fOhGT>Zf1w#01_cAztDdGHRJT-i(~)bIP$tG0Xl#FS%iZ{Ke9 zk{uoi$!Piy_UqTL+rS{g^qXCinZT3FlAz`O+LHIxtCjU+y`K&VbnP=U^#eE8mitgaWBA6ZfL!Ny%krfcK$0K0TjjXGyyV2TZ(XL6V zTL5rJOwU0S@96IK%GTb_ud&g?pm|)2Fab>zZyUu$}DoEf(lvF^i z*+AROv_{iq2kPgGy9@JCYIr^GGyK!*it0)z;o^L_7}PphB009Kk8GNtI?N0JPNGzV z9wDn(>0-0p?T;rd#8|4LWbIip+i$Iy`J7P1oz)1&wTjOu4MZU{*f4&6pLy-5gE2{i z!2vyc_6#n$R7Vtyndb)!A7MjRnzU?Ci$DuhL=xUweCw zWwn(dL-I)c{2sj1bE0NuNKsmF5H{_Bk&?ev_7t!Sc5;7Ui>I1 zPpHlVx-7=s&4qNSZu3Z%q=PxwW;*K;QDXw2d7J*MsuXF}!-AVD9R>`;Wwo^-YK1{k+0VIt5JyQFo0?KTe@>jts`nFM zBrJULsL!8?bix{86Gk=uYoiUNwzUi+tyT;9Pws1mc5Ml0lt{DH))B$zq>E0?tykyT zP3Jp>+_^|dnB?J6yHiU?Ez&U*osq;Gw$v|i_`YF?2c!K=*7LOMo?4fWrWB5L-k)8m zUGnZ;c@}bX=d!ebp+SJUb9qh8y}=2Xv!lx%C0;Nmy?EaQK|%@%ac%;9y8hxVr9Rv5 z)d_Vy7Il{^o<&d8N;5CjRU|)uOguOw^bUUnRK{CCTo|@xSs3m&IDzo38%$+tw-W1? z<^v_bTf*Gj{L8u9(W+#TZZo2f&0^$bApE$!i*yLaKD%uj#Bp!>$Zyd4nujjoN%D*L z9dXa3%Uzaq$#`uco2)ubUI^c1(9c>U!|_@Tf6Yvw%aQO%6@s~?L6xZr`Ga3Zo5=X{ zbxeohMXxf;&3(2MVTHj+z;7FEjb!HB&z}&!pkii5`;edStBmj(2SR*@h}QNKoiyWl z_lN1NE%Pd?862PD_YuE;8{eAs;pJ5~bi}T#X%m9^-oLStAA>?5w5*KH^Ll3U^HJ-A z(COMaV74yrVod(zsiFe$M*QyO`S!KNq*c?|WQs5IoM%}qRF@&)`QU%HJDL4qjLtKg z3d}f+DQV3fMpHxIxSufsqPKISl_$~C&`wDz8ykd0;&FY-Te?(`#@LO{PXz?Xx}(XZ zoz*sqm(*xgNYL;1Y2p~dW4p3WhVk;&x5L2sXKC8L3k(j<0;s~A3=h6oEuvCSYZKwC8@B>JY%gMr+=Lz&{ zV+ul2W6P#>c6TIAO@jBvdBy|+x zNh&ely;CVK#GTM0S0P~m0Q93yV{p8X5ds3j!jawkW@mKb5BWqK8_!SoW^nDxBj62( z(MoaGlH$Zl68`T>aeh<%+WK#&B*aC#=OIpm!N;PT7#pX$1u;iHkigoiAz z?u3I?f_N?)yl6e!Amw#Crcqal{P0dE-YeNPd3tZGZ;l=PIU0vO? z+#)uZ<*_j^Ft#R(Nx`6oNcEty8ka3yZnGprCg_d^keq~;3`$Ybwh}|8N?~SG#8~*3 zFPbj5KA4!8kSlcy3}OLznZ#L(?>WmmeaG$x^>4No8VS$$X5fOv!T^NJ&|PTA3GV6w z;?R(M28Q)eoR?w5wzv4M7gO@tLX^sST4b%e?h)F+vyA+Vcm|H+X;f#>&}98srT z$4r@=U?F-^hmC=*TeqbXLjOFRRWjxRPB0x8PFmYChE<_-|Bn}dudm=j=_FQBLNblP zAtv)HGvLVyS#?C-4iHO7O0SIPzpJx7!U5nqLe6*i5L>MZu0@}FWyWr;{P$E>&cTuu z_p>rP+{>$p?iN80fK-GHW+;8A%Iu6l*Tf;`bC&oKO^$!x#A7q#Z@scoXU9P?^J<1I zWgwR331R>Y@s}@k-uooXrnn8lvv5mZ7c630Re3n2n}4O$Sozq z!lU7DtkWuIF{8Xp=n^4cYHy|a{5*sJ+1pq`WV%pUA8-sH!a07Iw z+f$fxH6Km zRUa?a!(>Wkl^)h@F26dI8`*YDysmHk(-EQ3V@{QC7PocY+Y!>ChQe?iZuLImF!a4t}_ zhFT#_qA-c&@UpqLx7YRI?xKAAa4^>72@niB1}>ID3JWb0T}$8)F#@}&^}EllRjJWJ zs;q)!30XyoM;H0vU_uFS)rxd_QAI-;iEBP&$UGZ1_U|>Ws6QU;9gXYC7ZG$908EgR zI;xC^o7+kVrFR>UO0ZnkQ8tFYyff**hZJeFknwz6Y)ki1yNB4=*u=cSrT?8<;IGhA z>#Yii3rue{I%uPd`zDW6tY&!@B9^JR3Yull=&oi4%IeAr41k9;G&J*PUR7Gfa^eF8 zZNM8*s8-aLTxt50mNw^?@Z!G*iSfRq>6QpeAFaYaktkf-?G+IBBU!QJAY`x3X$U|9PUys_` zDQM$twElpwyTp(rn~$auzT4y zt=_TWX>=<2aS4e*AoTv;HRB3qV=le-^@?%j^0^7E_r zZSEf&L<31BFh=MenJyv!SBntP+@ur}{=H}Xs*Jpus;psX%+^npuKZEo2>$;G7YJi?HJZe9FzFG-M zJZIl=bCe$xqzVr+Yi8?zIoVp82yz!SRE*WoM_U3cm;{|d- zgjshq%h(;@?XmIkgJyMgeZ|5e2i`K^qd4wPqO-PKiY01tu+q@L1MNfHLW@M}Ubb=~ zq-$sqqxFR*Y|!dCAg38R7TaMI1ls@0mcS(CuYZ>V6eaK5ZF0#gas5;Us!qQ5M$?;o&5|&+Ar9E_(U$l8RW?f)QKUR2Nn8)xn+O_pwojueUg;co4SeN5vS~g-G}e^5koKVR z+)a{c^^{j4CMG7jo@TqfT*EY9EYi&J@O1Zj@wM9AZ+EJMz}cB_z!aYQW8~PVl4`-E z#6;Xz+KfK=e3jKMLftl?RUCn-#Gu_DVPx|+L{TJXblTAy=~%iJWs-v#SqB8?)ddsU zd+v)qo2X(%js15?CdQ`5RQErfexwQo{VCRlK+dD(&523;!F+D?BXk8B1EYkS>*D-a zOv{}QUX;NFPAO4Ym3PG*HUj#{kMBZMtJvKVBM48ov)^62sW)e)3 zNR|dj31F%iCqWGps{@;H|9+agm$1l@JI1nKPR@zaS;=ye|dF2q!OFbzM4{-;~fp`hU5zpFH zuqYUJRk-C+xV!c=E3wF(a8_1UKC`b`pB{`60zpb7Q*j+4y~q@&bl79qweY zc7z`s;_@hkVA=LzYoTM*-R({%H8QWqxz5#+&L^4M+c5=XWR#9{RoC(Zwzw|+*Cp|Bf$CR(69zRv#6N!g08->h9k5@31;(XV`aWkZEjtU4$?*pr4BEuxQ2~z%7?8YAGFy9&Z0lcQ z)6${?f56W-5yzw!4a~IzG1(5|Gjl)ivY9*az5VhM;jrlhqp7*6K;@23=zQ znnQ8E(>p6$0k9a8WtEkkQx2P}Gv!7GW@hT^(YbkB=1l-FK-rqK6wY#Gf&XY_lMQd{ z>=Z3+hHY>M=x)z%4qZ34bFb(`pvPB^vSHB+`P4;Mo%|EPHxO{S^663%KVDcZwUD#t zo=i!pjC0j+Tfy z6#Ey*51a0|K{KG(S-ZO0MELyDq(ZJu>tr+C)$<4PeHOHws|uP{5O*kZSxTJON_HOtAYS%Eh!qKiJPu=A<>ezA7;QGBY+VE^JEA1HIY(qCE_kp7HGD z>+S7{`E(xke{$*3DLnl(5PLvT?@X13B+x4uc3d8*(&^CB(k@IiBvDXMd=|KJ3v}8E zdk#xiro88NEuNG-7dogIvw~AYS*arZN4<_(H9VQL#erKenRPW+q=+OuafCR%Bt5A z3Al&sj|&aJO7OnK%hkg}_44~gynnq+ad0%ynZUg@*gH9Osq1-%Ei^i3$|jct4Js6i zC264pJ}oaHj)>D1>!-losUX*dr{cyyT9BIc?DE~kJtmV{Ndb3h9FUuVxM{oGCVILv zf$CJyV>n(***dyY!`!b}H~}0e0FxHn^EtW0H#$q|1N#Ed(}8bwCe`AdrITX8ghq=M zF`v*e@;#3cA`T7?)1U)XGwQ=$(gHMkCi+rEvv$3GQPrmCW<#YSVnKgk0!$ z>lr}TD&d@llKUK`9>qZCZeWxR;{0U%E5sfLBRU+`(|1bhhINckC1D*hJz<^fsf0R&?DCD-bCGvJ*Vg9*0yuI^#Pp$;8XDXS6YY~%miSbUHP@%9~u<}d;z(( z8*iC`OB8D10zt`Xz8nH9NY9GKo|#XTkdyFW_{-#!uy@OVLiRNz5DevVd0byRd?y-h z^sF#3H(4JIyoq>KY9%^hhns_)M@HR{jPc$-BKOI`N58`+!V5+8_WpBx>|dF{u}8j_smNeZ{yB4M7l_-^ zz^(OhzRnLgpqGymnO?t<52oq=bNWXFXr@}#7GX8Ox6R234>l2halEqP&Fi-k5wTd` zbInAG)d&%buw!C=q+6<;Btsobp)$|HskyDDL$8Dfx`#rMd$N!jRD*mJWtDBuoyLfLofZ247-c~zR+?``Is9fsv1IFcfnzA|50 zIio5gz}uTv4i94pz{IFpm;`N#x3{-_RgQ9UcH74$fi+eL*`peDY}LR;bsHF_(X>TK z@VKOdpMGF`I`K!)08;2nj$bgJysxnsc!SKJqiI(+dySM>lR~FBa(+hPb#!!K5fX-&^d}o#9pm$QS&DhS$<{&%g59C^qXks8Hn+{sq`?#zi0+~g zG75@Ve^RFT+Q2Wyshl_y;w&mig-V@V{$vJd638D$Vc$18i`JGbjQl6J zYcHpqi*$H6n8FT-xI(43?N%N0rLFCjr7az>*n-B77YF4RG;d#!_f!C5rPNxrf93Kq z1YV+%P2(jQIojbVWd^(;^)!6Ig-w;}cAXX4P2XP7iR6nV&_zM5JJ6!_jnBz&lqoJU zGO}Z;f*~59Aq<^}*gTRy0Hgwu(_lAgkeApEcF9K=^X?kcH>HpXzB2!hZ2b3MOK6{D zphn`qDx?ZyYD82Q0FGG>Qy+m*ivIrgL?JY*$6p1N_;v82A|EQ@k2h`CLs){u{6KFs_}vqSygN_q zbALvNdKU}OOX6t(6uIG~21u%i1Kt<7;R%2u(Yewo4b`an)k~bgJ+aMY{5B6B$SoB#l8Q@1s_W)%Cij zG6byME|%7^cIgX4`EUM!hD3dQ8X<84V5_n}$$Dj;SK+rC|K-55v|GVuw4L(&w{|it z)M%9J*5Fb>lkL>#92zcQP(9*cdqNN@MBICgs|uU?TV5i^V(dTkjp39KzzeQcPw56E zWEKTiDamj?@Co-Hys@e_EfJZ~n14ir|rkhkAAo|=EJC6J7J2_JtFf-;kMH&V{oG4+ zb@c(DA>4vTA4bf_)t+fGR+DHFZ(m*}C}`#(fplqM8_+^3YGB5AG!r4M{fz1))boUS zQ%Z9L6YUx{;5*a^7 zN_k#QFcWNfL!Yg%f=!Y#3*mF(MS^0y(1KyoFy*i>97{-eD23JN_>5eWMVbK-gskPS zFGkM{pJ~K1w0BM51L@@7V(7hYPDRs&yilhY;US4K2w*gpO?qMCcYrI3WxKW^w;NRf zopb&Iuh4>Qp2g1}Il>Vb%D_YcU@pOy&}#(+X?tay3>8i5QuW#woFwRfgJ?ny;Hl99 zC(=*?*%fZ!^m5o7TJ4F;W*+gvqD=P%luZhS2096+z8%yVlgFo=uj0DXOAo>O5(0KT ziN@;5QXlLBlKSc@mDT_^3=;!GY}Zq0Z0uN!WQdOJ>=j)b!nA?Tp^A#7G&yk4&hPevf$AozgNE?A)fZi6Gt2$in#zV^MFxnb6u26}CPipgXiAqh=WA+< zsSRz zmb0Mz-XH;dn`Wwg1F?-@d$WGH_WPxO@i_r6A1&W?oCpgHGoaZS+4Vj5f$wKD6wO!e zoa;{cyQZ&gi|vba`e9kfqIlpcGH>5jHL$$F*&`=g-d<^6#RBD0DazGB>CgVUx9poY zP^4;sXd}-@SmYVPK$Q z2J|_MD5*}^zcy8UHj*Nqo|m8{@kb{o=$3})mey{s{_Ta(PnL@-9Ik$%;mk+w$j48R zD*(g9LkRR4l$^6UXYW?_zj>tq*so1v!X*@7w40vU*2u8$>FxCc62Ol`uoQR=n8U*_N~|`?M3FKgOW=kM3@9wz(m~0`-^( zoMe9e^&Q#ykCimof1fUMJlj!))MT@ulY(67%de8Guuh_(ezZBJz0j%CchXKW5y=$k z3`WzqVAAicNTn>>BQAUVXenNwMLuZEOVgW;Uz|YCvh>r?B_GS2?&A?v(<8∾8@L zEk_`E>FSYF8FkqevAQR3)Dg0PnkjS@(;Bb=q*l zC))TrA&)jj3xBAwfS&_bCb7@L1JDf`sUC{6t1}1=<&SWypgb>+0a7uDAIPE|3{npo ziz*b|G3jN{umO%&F)=alBW-bvkN1@+q4Wdb?JC-jtU}6v zox+1))7E5kQqSOBG{wf~9{A|QyALjx{-jrUn9fg_tuui>Nya2|GlRWX!Sb4 zv|aXf`NcCfHpq(?FTmZ{J3GIy^Kf>?h!BTv#>7NW1Yz8lI2hIPCkHHFYxRK!=pU=q zM5$(Kiums>s(_ZElI6yo7Z;ytzw@?ratcx|29cPb|KVQ^P|sE9)>ud~Ay#A<&3ZLO z)kHbJFt2X|eS%3@Sy_YZadS(;6>JG5u|FOhn2(2oyF!BIUSl07xrO^cO#62!X+Rg( z*{{F!rOrj7#RdkFkmO`SR7XnS^MW$mvBhv|%Jwh68)im4Mj8p=4H0p06EYaM+nena zV+X&xFj7`)S(B>a%K%cAnx8)f;W6)aHozRjMvSh=SiGeCl?&C>?%>%{LklQ4IDq?p z{YK8@Z$D^w1t`^f%3DKqEJP#+|C_t<3{kjU9@`uoH$*sqnKb|2%tylr7u#eSfGIdJ zP>jK~9)j=HYER&bfgz3e-vOkc626#*XLh;J%F}BVig3__Qxk{O3`()SZy5NS=1zv3 zBzF7PTzIYiWl#>~^wikzARE9cQL{~b+_D$C4L$$f7$5sN^!sza89$ka;Fb@8PqtAx=+h^>AM`Y3fBTd*?4;!GmGIR`03I^( zGR`YZu{FbX)qEAu2B;2X$o@qLoj!hw{$m{`U+HE-rVOQv0_W7;vl0}Mx+VV@XFq{O zyZB>&7P0~`5O{c0@?wgJ=tJ;iat0FvH;29%{aZc|V5G!61@yTdWTf8f=>aEVxd^7O z-rY4Ya|JMjtIe_6!~aDbAwVAfo|7w@S@m&L(en*qgHKaa)AHIH-0Ml0-JOX-=yS4v zd!y44cm({jWn)ietB*LrCd{Zg7=1U@_rB=_{rFDv-G0>UF+Q)M4_3r$apKv~id?8? z8>*W#sxlgzn6CaDO!*g_PIh+c#UBaZHf=obKw@GTX$UJ+&h({0G5iY-mS8 z)p~uFsccF0Cf=zneC=!CV-?H^%L)x#?XT>?vG8#3SXlUm;O^_`=?Ux_7Pw_4@0-CG z25mj6Nr{Qza{&N+uBPLIu zaU}fh#|4Z}g0c_Z$9>&Kj+tEN`4uS73tJQ9!j9XQ zs;-`&q76MVe_4!7&)Itc8Tbb1WCoZ;D62a=U-d4u`*HDstK9H!P%(mu1>7A&Qki0* z8p~t5$8T#Ng;AVs3EDk#|F;-w;EsumM9Y}Q53Cjx1j>&_28w>}m}rjjT%yFp z78Lgb%OxlAI!PeDboQu-W(RW8jMe{qmW+ZzNV|U7w%__7NCfvb#`~{-qYxXEOCV6B z2yX~+_t%aDDBq4#JvLhWHr0#TpA#Two{r)BIJCNxNW>H6W%A)>t(q?GDC{ jMOK=DtYXWR^33>(Z>A`)bHKmk0eK@SFHs_<@Be=QVu{Q5 literal 0 HcmV?d00001