From 3ed89ee6dcb5ab463e9c96f49c7c234c11ada666 Mon Sep 17 00:00:00 2001 From: Davide Bongiovanni Date: Sat, 24 Nov 2018 21:54:49 +0100 Subject: [PATCH 1/9] Some changes --- stream/stest.py | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/stream/stest.py b/stream/stest.py index 7fcd7d3..8866fd1 100644 --- a/stream/stest.py +++ b/stream/stest.py @@ -1,10 +1,12 @@ import cv2 import time +import serial from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler from threading import Thread +import numpy as np -cap = cv2.VideoCapture(0) +cap = cv2.VideoCapture(-1) font = cv2.FONT_HERSHEY_SIMPLEX list_img = cv2.imread('list.jpg') list_img = cv2.resize(list_img,None,fx=0.8, fy=0.8, interpolation = cv2.INTER_CUBIC) @@ -28,6 +30,15 @@ IMG_H = 720 rect_w = 220 rect_h = 52 +weight = [] +weight.append(1.0) +weight.append(1.0) +weight.append(1.0) +weight.append(1.0) + +ARDUPORT = 'COM12' +# serial = serial.Serial(ARDUPORT, 115200, timeout=1) + test_candy_stat = [] s = {} s['img_idx'] = 0 @@ -68,9 +79,9 @@ def print_stats(img, stats): # draw_rectangles(img, len(stats)) img[0:list_img.shape[0], IMG_W-list_img.shape[1]:IMG_W, :] = list_img[:] for i in range(len(stats)): - cv2.putText(frame,str(stats[i]['loaded']),(IMG_W - 130,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) - cv2.putText(frame,"/",(IMG_W - 90,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) - cv2.putText(frame,str(stats[i]['required']),(IMG_W - 50,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) + cv2.putText(img,str(stats[i]['loaded']),(IMG_W - 130,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) + cv2.putText(img,"/",(IMG_W - 90,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) + cv2.putText(img,str(stats[i]['required']),(IMG_W - 50,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) img[150+(rect_h + 5)*i:150+(rect_h + 5)*i + target_w, IMG_W-130-target_w-20:IMG_W-130-20, :] = img_list[stats[i]['img_idx']][:] cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN) @@ -86,12 +97,23 @@ with SimpleXMLRPCServer(('localhost', 8000), # Run the server's main loop t = Thread(target=async_server_megahack, args=(server,)) t.start() + frame_counter = 0 + weight = 0 + canvas = np.zeros((720, 1280, 3)).astype(np.uint8) while True: + frame_counter += 1 + if frame_counter == 75: + # serial.write(b'e') + # weight = -float(serial.readline()[:-2]) + frame_counter = 0 + print(weight) + # check weights + # check game satus ret, frame = cap.read() - frame = cv2.resize(frame,None,fx=2, fy=1.5, interpolation = cv2.INTER_CUBIC) - print_stats(frame, test_candy_stat) - print(frame.shape) - cv2.imshow("window", frame) + frame = cv2.resize(frame,None,fx=1.5, fy=1.5, interpolation = cv2.INTER_CUBIC) + canvas[0:720, 0:960, :] = frame[:] + print_stats(canvas, test_candy_stat) + cv2.imshow("window", canvas) if cv2.waitKey(1) & 0xFF == ord('q'): break From ea4b383e66cb258ff09dbff44bbc18476a674925 Mon Sep 17 00:00:00 2001 From: Marek Baczynski Date: Sun, 25 Nov 2018 00:01:11 +0200 Subject: [PATCH 2/9] fixed the numeric picker --- order_site/static/picker.js | 53 ++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/order_site/static/picker.js b/order_site/static/picker.js index 337e9ef..c17de50 100644 --- a/order_site/static/picker.js +++ b/order_site/static/picker.js @@ -1,36 +1,39 @@ + $(document).ready(function(){ var quantitiy=0; - $('.quantity-right-plus').click(function(e){ - - // Stop acting like a button - e.preventDefault(); - // Get the field name - var quantity = parseInt($('#quantity').val()); - - // If is not undefined - - $('#quantity').val(quantity + 1); - + $('.quantity-right-plus').click(function(e){ + + // Stop acting like a button + e.preventDefault(); + // Get the field name + var quantity = parseInt( $(this).parent().siblings('input').val() ) ; + + // If is not undefined - // Increment - - }); + // $('#quantity').val(quantity + 1); + + $(this).parent().siblings('input').val(quantity + 1) - $('.quantity-left-minus').click(function(e){ - // Stop acting like a button - e.preventDefault(); - // Get the field name - var quantity = parseInt($('#quantity').val()); - // If is not undefined + // Increment + + }); + + $('.quantity-left-minus').click(function(e){ + // Stop acting like a button + e.preventDefault(); + // Get the field name + var quantity = parseInt( $(this).parent().siblings('input').val() ) ; - // Increment - if(quantity>0){ - $('#quantity').val(quantity - 1); - } - }); + // If is not undefined + // Increment + if(quantity>0){ + $(this).parent().siblings('input').val(quantity - 1); + } + }); + }); function submitOrder(){ From 7d22bc3b8679f5b255f1de2c7e174b63bd552442 Mon Sep 17 00:00:00 2001 From: Wilhelm Westermark Date: Sat, 24 Nov 2018 23:41:36 +0100 Subject: [PATCH 3/9] Updated for mobile --- order_site/templates/.index.html.swp | Bin 0 -> 1024 bytes order_site/templates/index.html | 11 ++++++----- 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 order_site/templates/.index.html.swp diff --git a/order_site/templates/.index.html.swp b/order_site/templates/.index.html.swp new file mode 100644 index 0000000000000000000000000000000000000000..f556e67d7cdd7eef2ec2b1956f1e6747128f79f5 GIT binary patch literal 1024 zcmeH@!41MN3`H{v3#3NCCcqiFiA5qgag-RfOv*YO=%uJIL45oFKgrS?_ZhS7j>EyM z?sYO|iX4d3s^1C=XBmr1*&;q21W5!74QF{&M{t>a9g3P)dbS YsX@%1<{@a}-w*oI4Rizl3|zm*Hv}jsEdT%j literal 0 HcmV?d00001 diff --git a/order_site/templates/index.html b/order_site/templates/index.html index 09395e5..f161699 100644 --- a/order_site/templates/index.html +++ b/order_site/templates/index.html @@ -2,6 +2,7 @@ + Alepa Twitch Grabs Candy @@ -13,7 +14,7 @@
-

Simple Quantity increment buttons with Javascript

+

Choose your sweets with a wicked system made out of an awesome humanless deployment process

Tasty treats
@@ -84,10 +85,10 @@
-
-
- -
+
+
+ +
From ccaee0bddd8e6e548febba33e8f2894a86c3bd8e Mon Sep 17 00:00:00 2001 From: Wilhelm Westermark Date: Sat, 24 Nov 2018 23:42:10 +0100 Subject: [PATCH 4/9] Remove faulty file --- order_site/templates/.index.html.swp | Bin 1024 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 order_site/templates/.index.html.swp diff --git a/order_site/templates/.index.html.swp b/order_site/templates/.index.html.swp deleted file mode 100644 index f556e67d7cdd7eef2ec2b1956f1e6747128f79f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmeH@!41MN3`H{v3#3NCCcqiFiA5qgag-RfOv*YO=%uJIL45oFKgrS?_ZhS7j>EyM z?sYO|iX4d3s^1C=XBmr1*&;q21W5!74QF{&M{t>a9g3P)dbS YsX@%1<{@a}-w*oI4Rizl3|zm*Hv}jsEdT%j From 46801a586f4925be0f8e88f74c207204bbe5fd92 Mon Sep 17 00:00:00 2001 From: Wilhelm Westermark Date: Sat, 24 Nov 2018 23:53:50 +0100 Subject: [PATCH 5/9] Final fast code for the scale --- scale/scale.ino | 53 +++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/scale/scale.ino b/scale/scale.ino index 8d90c47..0eeb557 100644 --- a/scale/scale.ino +++ b/scale/scale.ino @@ -4,48 +4,48 @@ HX711 scale; void setup() { - Serial.begin(38400); - Serial.println("HX711 Demo"); + Serial.begin(115200); + //Serial.println("HX711 Demo"); - Serial.println("Initializing the scale"); + //Serial.println("Initializing the scale"); // parameter "gain" is ommited; the default value 128 is used by the library // HX711.DOUT - pin #A1 // HX711.PD_SCK - pin #A0 scale.begin(2, 3); - Serial.println("Before setting up the scale:"); - Serial.print("read: \t\t"); - Serial.println(scale.read()); // print a raw reading from the ADC + //Serial.println("Before setting up the scale:"); + //Serial.print("read: \t\t"); + //Serial.println(scale.read()); // print a raw reading from the ADC - Serial.print("read average: \t\t"); - Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC + //Serial.print("read average: \t\t"); + //Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC - Serial.print("get value: \t\t"); - Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet) + //Serial.print("get value: \t\t"); + //Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet) - Serial.print("get units: \t\t"); - Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided + //Serial.print("get units: \t\t"); + //Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided // by the SCALE parameter (not set yet) scale.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details scale.tare(); // reset the scale to 0 - Serial.println("After setting up the scale:"); + //Serial.println("After setting up the scale:"); - Serial.print("read: \t\t"); - Serial.println(scale.read()); // print a raw reading from the ADC + //Serial.print("read: \t\t"); + //Serial.println(scale.read()); // print a raw reading from the ADC - Serial.print("read average: \t\t"); - Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC + //Serial.print("read average: \t\t"); + //Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC - Serial.print("get value: \t\t"); - Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare() + //Serial.print("get value: \t\t"); + //Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare() - Serial.print("get units: \t\t"); - Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided + //Serial.print("get units: \t\t"); + //Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided // by the SCALE parameter set with set_scale - Serial.println("Readings:"); + //Serial.println("Readings:"); } void loop() { @@ -53,10 +53,11 @@ void loop() { //Serial.print(scale.get_units(), 1); //Serial.print("\t| average:\t"); if (Serial.available() > 0) { - Serial.println(scale.get_units(10), 1); + Serial.read(); + Serial.println(scale.get_units(), 1); - scale.power_down(); // put the ADC in sleep mode - delay(100); - scale.power_up(); + //scale.power_down(); // put the ADC in sleep mode + //delay(100); + //scale.power_up(); } } From da94ed3e15eeda226b3c3bc87b79aa696c5e59e0 Mon Sep 17 00:00:00 2001 From: Davide Bongiovanni Date: Sun, 25 Nov 2018 00:02:15 +0100 Subject: [PATCH 6/9] Added candy count code --- stream/stest.py | 105 +++++++++++++++++++++++++++++++----------------- 1 file changed, 68 insertions(+), 37 deletions(-) diff --git a/stream/stest.py b/stream/stest.py index 8866fd1..7407e0b 100644 --- a/stream/stest.py +++ b/stream/stest.py @@ -30,39 +30,37 @@ IMG_H = 720 rect_w = 220 rect_h = 52 -weight = [] -weight.append(1.0) -weight.append(1.0) -weight.append(1.0) -weight.append(1.0) +weights_list = [37.0, 4.8, 8.8, 2.5] ARDUPORT = 'COM12' -# serial = serial.Serial(ARDUPORT, 115200, timeout=1) - -test_candy_stat = [] -s = {} -s['img_idx'] = 0 -s['loaded'] = 0 -s['required'] = 4 -test_candy_stat.append(s) -s = {} -s['img_idx'] = 1 -s['loaded'] = 2 -s['required'] = 2 -test_candy_stat.append(s) -s = {} -s['img_idx'] = 2 -s['loaded'] = 1 -s['required'] = 6 -test_candy_stat.append(s) -s = {} -s['img_idx'] = 3 -s['loaded'] = 6 -s['required'] = 9 -test_candy_stat.append(s) +serial = serial.Serial(ARDUPORT, 115200, timeout=1) + +candy_stat = [] +# s = {} +# s['img_idx'] = 0 +# s['loaded'] = 0 +# s['required'] = 4 +# candy_stat.append(s) +# s = {} +# s['img_idx'] = 1 +# s['loaded'] = 0 +# s['required'] = 2 +# candy_stat.append(s) +# s = {} +# s['img_idx'] = 2 +# s['loaded'] = 0 +# s['required'] = 6 +# candy_stat.append(s) +# s = {} +# s['img_idx'] = 3 +# s['loaded'] = 0 +# s['required'] = 9 +# candy_stat.append(s) + +previous_weight = 0 def new_order(params): - pass + candy_stat = params def async_server_megahack(server): server.serve_forever() @@ -71,6 +69,33 @@ def async_server_megahack(server): class RequestHandler(SimpleXMLRPCRequestHandler): rpc_paths = ('/RPC2',) +def check_endgame(params): + for s in candy_stat: + if s['required'] != s['loaded']: + return False + return True +def is_equal_with_tolerance(v1, v2, t): + return (v2 * (1-t) < v1) and (v2 * (1+t) > v1) + +did_change = False +def check_weights(params, new_weight): + global previous_weight, did_change + weight_diff = new_weight - previous_weight + if weight_diff < 0.3: + return + elif not did_change: + did_change = True + else: + for i in range(4): + if is_equal_with_tolerance(weight_diff, weights_list[i], 0.1): + params[i]['loaded'] += 1 + previous_weight = new_weight + did_change = False + break + if did_change: + did_change = False + previous_weight = new_weight + def draw_rectangles(img, n): for i in range(n): cv2.rectangle(img, (IMG_W - 5 - rect_w,5 + (rect_h + 5)*i), (IMG_W - 5, 5 + (rect_h + 5)*i + rect_h), (255, 255, 255), -1) @@ -90,29 +115,35 @@ with SimpleXMLRPCServer(('localhost', 8000), requestHandler=RequestHandler) as server: server.register_introspection_functions() - # Register pow() function; this will use the value of - # pow.__name__ as the name, which is just 'pow'. server.register_function(new_order) - # Run the server's main loop t = Thread(target=async_server_megahack, args=(server,)) t.start() + # serial.write(b'e') + # line = serial.readline()[:-2] + # print (line) + # weight = -float(line) + # previous_weight = weight frame_counter = 0 weight = 0 canvas = np.zeros((720, 1280, 3)).astype(np.uint8) while True: + frame_counter += 1 if frame_counter == 75: - # serial.write(b'e') - # weight = -float(serial.readline()[:-2]) + serial.write(b'e') + weight = -float(serial.readline()[:-2]) frame_counter = 0 print(weight) - # check weights - # check game satus + check_weights(candy_stat, weight) + if check_endgame(candy_stat): + candy_stat = [] + # TODO: do funny gif ret, frame = cap.read() frame = cv2.resize(frame,None,fx=1.5, fy=1.5, interpolation = cv2.INTER_CUBIC) canvas[0:720, 0:960, :] = frame[:] - print_stats(canvas, test_candy_stat) + if (len(candy_stat) > 0): + print_stats(canvas, candy_stat) cv2.imshow("window", canvas) if cv2.waitKey(1) & 0xFF == ord('q'): break From 6c45e791370b80dedef90d34d09b05ad6037056e Mon Sep 17 00:00:00 2001 From: Davide Bongiovanni Date: Sun, 25 Nov 2018 00:02:33 +0100 Subject: [PATCH 7/9] Parsing new order --- order_site/server.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/order_site/server.py b/order_site/server.py index f532c51..bd6a385 100644 --- a/order_site/server.py +++ b/order_site/server.py @@ -19,8 +19,26 @@ def order(): candy3 = int(request.form['candy3']) candy4 = int(request.form['candy4']) print ("test {} {} {} {} ".format(candy1, candy2, candy3, candy4)) + params = [] + s = {} + s['img_idx'] = 0 + s['loaded'] = 0 + s['required'] = candy1 + test_candy_stat.append(s) + s['img_idx'] = 1 + s['loaded'] = 0 + s['required'] = candy2 + test_candy_stat.append(s) + s['img_idx'] = 2 + s['loaded'] = 0 + s['required'] = candy3 + test_candy_stat.append(s) + s['img_idx'] = 3 + s['loaded'] = 0 + s['required'] = candy4 + test_candy_stat.append(s) + s.new_order(params) return '{"status":"ok"}' - #s.new_order(params) if __name__ == '__main__': From 2e4a3e9e074d58d77e5bf9c44192097f6a01b2c1 Mon Sep 17 00:00:00 2001 From: Davide Bongiovanni Date: Sun, 25 Nov 2018 08:26:25 +0100 Subject: [PATCH 8/9] Fixed order placing --- stream/stest.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stream/stest.py b/stream/stest.py index 7407e0b..bea115a 100644 --- a/stream/stest.py +++ b/stream/stest.py @@ -60,7 +60,11 @@ candy_stat = [] previous_weight = 0 def new_order(params): + global candy_stat + print ('Got order ') + print(params) candy_stat = params + return True def async_server_megahack(server): server.serve_forever() From be72ed2dfdd4ecc35e540f4a391e23bcacbc899a Mon Sep 17 00:00:00 2001 From: Wilhelm Westermark Date: Sun, 25 Nov 2018 08:26:37 +0100 Subject: [PATCH 9/9] 3D models for scale rig --- scale/bag-holder.stl | Bin 0 -> 60284 bytes scale/scale-holder.stl | Bin 0 -> 40284 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 scale/bag-holder.stl create mode 100644 scale/scale-holder.stl diff --git a/scale/bag-holder.stl b/scale/bag-holder.stl new file mode 100644 index 0000000000000000000000000000000000000000..218fcccd7510e8f8b3d6d667de289cf22c5ed245 GIT binary patch literal 60284 zcmb`Q3$SiQb?0|{jE|ToapDt`t3d??lqe$C@$8)&MHCQ05#KK?F-nj`5kwvvWz>Q~ zL}ipR=!c>(3dm@Pa&I_$dr+fjz(*odQwAg&ofxAT(P$ZE*1vnN?qBco_2o;|e8oMt z+1D#eJ$&Me-aYA)Dp;FYgPB^U+r0WFhE!)BINOg^Q)F@-BA3L0g z(MoGj=5GUrH{){U$Lf;8GfjTJx9`0%cpdZXX*S|MtG?tFA!n$ z`ber?*J>`qM>)>~F>}IYke-N{49*O%Niy_&xeO=f8mj#C>5Uwk?^j|6H;ge6KD z7k=Q(@wjh2JrIRFM|u&g_YJT9lkqKgJ~0r~)&c!p$~boav&T!W|KmVVULtxCtoMK3 z^F`zJXPg{})nr_>>p9~=`#e4nlvm1Ny(e!yd_4EMAx7`N@SXCNrAl)-vG z^}qwhC!f`?BqPr18$R?7E4^hUBF;V%)UecwnmqM8`~N4kQoZZf-8*PSc}a#Pe9U7z z)IV2Vcb7nrt`i!yD_-(*TLDc&x=v^={r;102?Xgnp&9=35B+T*NY@Fi;4{9mJrJbp zgx2Hd?(@+=kggM2U4OLweSs)wAZ71rt=xL+Ie{PzU^X6_`A7ZiErB4Nh+ZRj+av$) z;QN)OTTg%aSHFS1YhnVy97}h;!~NS$zloiQ#H`*#u%@Ye_^Z^aIscZ{_e9o|h(653 z^KTiv)Qm{&D~Xd%|NFuBK@yhEH8~Pw%v#&|zFTiOb1a>Rx4!#6*il`G+Ci->-7eM8 zfuPmX9`L2X_gWIH$$@x&%rxnIZ?9`b8J2FB$tz_Xd-gSh@6IGxQ%M~8;|He`z|x(c z24{S3FYMYA)2pwjFA3HZ%3JB!awAe}NwB6sOh5X8?XYyatWAmNr4{Qn-8(;VmbSyt zQpQogSa1Erp}bOtl^VR%j7Ys62-7IGoSN8a(D@m)R4b$UfoBGZrKfWsSQiP_Wcs8} zKd>Da9d~u>=OEjZi%TmjWjk6tEoVgPkwjP`%J7p+^?I5$l>~EUMAEP%G)w&K)2Mk` z?Q?l0!JHY9G%N|N96v3!qC8F6CBd8-ku)p`?HPW)YA^9LWtRkVW<=7kB(%T!iL8Cs z)0ABjMNUa14NF3&nxEl1Gdx|$24ZI|w3-n~LjX3fbb9%zuam*klwA_cnGsn-ApM~8 z!|ep^+McFt05h#-MAEP%wD-AXq5aX*lwA_cnGs3DlF*LqwutsePg8bDFlR<24NF41 z&p+HEtEp+U+j*L@OM*EwB57C>+R1MG@Ed~+?Qou^?2=&4j7S1j6j|&d(1LWlbc^2k3m?B~jKyLap^vhJ>XzyiK8e zZ$Ir%KbXg|lqhQo%tV;ymCjenC~G2NR&lZ{NR%~^FxxrV3?#~$NSJ+|EIkrsO(e_* zNLDe4vL+JdXLN3>lPGH?2XuL_+QGlZ-@J6A87@&m|INO(fKd>68h*8{1LVL_#CwX9i`I zHIdM4@DqSUSrZA(IN#4nlr@pitoGfRL|GGw%{xPEd8A{+BA3@Ju^ih0SSqF!vG5(W zPOy|BFTT&$36`Q)ToSC8Ew|mLqE(rbXS?>R?%z(eX1Ul;eczrM!~xQhMrX5p@}? zi-fmNbpB|bs+9g#j!H4D*?#+km!dq#u=SB5*d{}|OU4#UQ`^mi>QyNcOImJq>Ekm) z`g%G%pX4bWKa#GGmkI<*u}4f-)89Xd7$fbwfj^Js=0xb93bC-~@#B>0V!eUxOrB}z z&u0X3oL+!X`lg3Ir@iHocN_lY#Iv^B9-d-|=j?LU_@eW^t2TCa8l-4s(_H$&quX0= zyK()`K6UU`=8&)xCq+D)<{6hCKJ0$XF73XDT)yLy7yaw-hi`hxsCqwt)z^o^_B|w| z<(K4B`^JYpXZYbG@7DhK)U&oThlISPY$qOc`Qh!OkJ)AT?!lMuc=jvL82{pz>p^#F z#r8GL_75ICeEPN<*FJRV!CP4uWytHxHtNSuJ#Bc-d;64%BiX$Zrz2%H1G|e;~>u<90U=9h!2AbxwQ%`F@ zHq8?D3EnPrNLxE5LM`u^gLJ2wa$ilod$oEOebP}Ywl9oFYvXbC7oT$F4))JnMz(5A zhKMI#YXnP)_PJYXHO-Q>Lv5BYhlFNNp1W7u8oa{xl5HP5cq@BRYsGh;A}Z2Mb9e13 zo4c%wGBoCS)&9NhCI4nS+}{0J+gTT7Fe;K(?YdSidz1vVZJLkTp7f5&Oe#>^a%T73JJ99{Azsh^!w2Kapwq2B(Xh-$ku58DV-IIq$?fnPC zyU#gmD|1LNR+CoLnpPBhlv=TUP4mjNM-7V$whqVaanp9zMHyuj=kV^y?Y?{eLHnh5 zoVArL)UNF(gZT#O?Q)ROnvC|p?tasD=8!Po0Pk_8)1bZCP6O&rg0h?D?>@7~@YxI6 z;a!Jc9L^~3(feP0*YUaE{y;cO%69DXhWiZv>w$+3_dn_4t;`|82$CImm;7w~^+&v9 zxcnZ!w}Uw(7!PV1lhK-t_9drWyp=8d-nJ9QXWjF-(RPf^d>p)wdd4L`Tl@1PUebQ_ z?!UK#IV8--!CRScerAt$<$Svf+bwdjAgUez(&f zG#>i9XNJBi+p+zmzh3{FJ0Cl&-EaF==8#~Ns%ai`$*JqZttSlM*zK?#%pt*;Q`3C; zq`zLf=FZ2q?eA{i$`=0nsV^I!^V5?;U&$--_bp9xk4sKn`^>E;w7Wn2upP`HA)m_M zY&6X=KlGXo93lQHtW0p@|58Pue@d}_1))y$ByTH>Xgt|rGNFV z-#&i*H_kb6xcFu7+`-n8U`6`;C`hvz7W@f7L)>Mtj&%@7zJ%Nw6lHXLdH7c-v{iRmYyOgZhf_c9fo_wR}x2f3CHhIV2>b@a}?) z?Iwe*B|+IitH!iyx4-6$9c-a!Z@Gxva_g&g_0>16ub4wZy_?5eQd|c6hXiGZxx1#h z`wupE*+TWSuaD9{xAn2+>w`HYG_P`u!)A#_Fw7G64++W+vwdB&eT&U@wor4-*N0YG zULUri*0rJ@Yb%O5B($3Sy=v3gywcna^NRgLg0jP&xTZbv8ru`uLai>}ceRh@c+j*b z4!haD%N!EguX4=E_Nz7RS0A=j%l;uj*_+Rhfz-_iM)<8#wlJB)VLGKWOz z71?Pp=rs6=od(o|ep{)Pot&*s&bQmi$sVN)YHQZL*$f}C^ZakjW?)^EAzLEHeJ4w% z{eW3A%ppNPG5DOV`JBV#bGCk-o8{EHWoZQ7d6}Kq%1(TM*@?^{VfG{5#F>>bn9tcx zK4<4Ar&%1GTYc8Mh(?>e+sfYE%j{j&MHyyU;*Fx&iG%FK_nMu^x+uf!N4zmHTXc{u z`aQEnnM1;CIJ|o?|6_2E#Vq~KBiKmG|3JjsJg>n#uV5##Ub7iH_YF!JX15RKbFNK3 zXOd3B?0LN3F>hippL1>UIa3Y^X_dVq^VM4Oo!2MdIrXC1@GZPMyc0J6yfyzkSo$0T z66JW92icmpy*_!{sV)-cdEwo*d%~0FmHKDiySW|Hcmz+FEhK@ooljF=txuj;8Y%Ua zw_LrO-#|>`u|D}xDTjncFu#E?|Gf3+2U}?VXFJW94r$YBB7$Gb9HbR5N%uff)ZpsL z=k%G_QLAz$PF`y8ggFLt8QHI$MsRJ40VL_7)7-@km=FWdyjq)L0O@WF3C)u1b6SjS zP>k%279(RXYOVP0qqUje)>s^FP#o@i7KdXF39bM9w#NPQDF%?nfLfKkJFVIfFJX^T z2DJ^Iu+~S2U$I`T72n~?mRnSfh)gm%8{30thM^;jQsNN7LKp76Bq4wHA6 zdelyw&iDDUuk0Kg%;y{?pELC$2|FM0X3NgnL1*n~XDxF`*r|p$TXsgZ=54o=x1IF0 zGphBI!OpI9^Dvx)td=*K);s# zLxQrKhF&UlH(#W4f3R!^Jz?gMFh2_K2kF;RU-K+Fcz3uGX z!kIqU^rLUzbKnKz(~f!b z7~jSFd*DU)gn#-U;{}gCb9$bczPaWiJ+9sl` ziG=3Qi(hudCZeo~gl6^ryT4--QPxC4Ywhw2UcQMaYa*c?-~n&kdlOOCL_#a|fCGQE zKJTltCK6ibUq1O`n~1U|5?V#ydEsH3h_WUU_c{8a)_1atzIEo{yPZ8B{CO^~HE5+; zFEt}lO(pTU?~kqTiLBS25B_|oM5>o`NnG~SKWTjzwe;X=YFH<>-up>|?~kPG1nXsw zltk0q-1<&kw)W=1pYN1N{Z`VM>08sib=_y}NIjCvYXnJL^WKLIzH5^%iFYlUE}sUu zP1e3jJ7z>GWzTW0WGQ`XnzXLTv$|ad-{+}eF0XcwU@5k*B+lIRcRD|DsEIvKC(%xc z)C;6b!gOz4_gOnq`%2=)`|Z~G8AVO(c{;mxN~AWCE{VT;=ABwU)hs=Dni|##mSX!# z!cLsd&q21S-i{fOTFbMmlwtqZ=99Cr{WqSXY*U?JDfUQ7C?}tTS;kCug8G((WK?Jn z>P0^}NwB6=+!B3DLgTTFE(xsRK!I&0l#&`IWL(shERsBKB;taU3xXNIRKuTHQO zwJiyqYS}KidGIvl)d`lOwk4tS!z~%@wVu|A%#e+CdqVT_?2HE~87ryoPP@ z7WAUyuD!FJx*(D-QujY7!#tLBmQY?@EAzb4DN4Fdm_L|KPSSP4?CWF!kggMEd3SE< zk**VF-FMk4&UBqH52ABhy`(cEzbuc3c`2RS@T7Bj&0P}a33YB$ldcoyZFO#!lCBfx z(RFSClCBfxHFj=mk**WwnRagbkggNvd3SDQkX}Zp&*a5tf_+#gRByH!NN2{!Bg&BO zZUK~ZjZpvic}_Z)&to2CXbk*xCS4~q&VKHat`nL|esYqo6PmAna+0nSS`&T_lCBe4 zwSLNwt`l0@`HaeRov@j)5qo^mDL&(Sa7mOonNXa`&ytcTb26dmm!EJYQRZZ#j3#8J zoQc$sXGtzUpI0oUy?uGh~hN|L6ZB!BU=HbfGwi<51TtmZY~-3DxCR26u#fBLGDLV<`K0y# z%L&%Iq#Z*fl@lVHW7I@xd3gRjmeNoE)|Tq^Ql3_RosjM>L%KWd#9|b$kIP^V375BJ z48=jPl*>~Yf9~b83@;_=o+beq^Lb^2G}JhW_O$5u@e%Yf&{I#V-Z~+DMXQvwn#+*9 z_;DE|yk3=}ypr&G^^~-yV`=?#86-R{8BR#s{Lv^<6B2qpT4~YwQ!BRSXV$5ky*!{gR&f6xuC5iTx zN?nnjX9?1Z1WTEHHN6p<%TQD$+MiAMW|-e@QzRr>vU7qmSg+j{OW*k_wX%Bv>83sV zt=@7HETwaId0&xWDS4AIGC6Mt36_$_>Z4hddo?$lp+W*sy=TAiL#W( z+vkMcFihVjHamKH|J8J6g->tKc1Exid%A2nWv~?cup|`OjNVqcKDch`gxxT;eR9ia zC5qKm5}M)B9*p~k&$0TvvKtWTI|l6O{5E6WS0q?Uv8?E;&k55p>CSerN6L2CjfC`_ zYK|a#y-t`XG`+!WI?^Sfwe5Yy{?R;Mz6MFKr%9JGax}ZqZROMpR*LBah3NSdF^}Wy zYko$9P@FPGJerPUQy&lW`=g}+*IO&@~?6-PfQ3mVP>hgPQrB>!uPjADU zaGNH2^i4+BM1-5J-VVJhh;gxU1Ua&$ z4E3VlZqiD1TC>vULY-hKjg7B@lAu;VOBwl1j9Qrct=?Dp9aNm{E`zd589Kdu_Q_^&t5_CC zj1JFxmjp|3t&}p!7T>Y}`opueQu+5ISvW}RRu&V`bYmFo3! zCURu!1bsDm7Vh=c36`R~lAtHVajx4}BsgP8moikB-)ZM))<@9J@N^5_&i3goS+F0b zcWm=jOG57*-D@<3^v+h>Y@ z2Rku+PopH%CvL0T3ZCwoG@V&w)7_SN?~-7t+4v_heM^F+W^)0A&G7WC1om6KDEx~UTuBk6nv+wPjacUuyg;qG&Cj%lqd_c`s%NZ*xUPuux1y-T0>6$zFy%V~O- zJ}2@!+D5-CDz$?>Qntg+)bw2mjv#xzPMBpe-7ji7(j}p_?R~}m(L7$>S0vceq)QoU zp~u45a`s4_&^Y^=FX_zmt=a0+jf7w!r_rpBhgmYy-6)G1ps(2LS%PM}b~TUnuovom zWwu)9o)>2fwJl|sw>909Xgbn$LMtb}myavT`-;6@%FvGE{yE!JZ--fW=^IY$w|ZYu z2J6-8TJE2l#X8+1YdXrH?6MtZ<4pGp%9gW7>V#Qg>08E}V2oZWZkXqGaxTgH1UYGLlTdS7W)$J;b0I^1oT(&2W3rSnJkCiGrje=jVDZ}R!R{=w&-Hk`Ekv36ToAHRnf-k+!YiKQh2 zqR&M5UScBhbM0eC?t1dD|5x|1@2E8m>&kY*LT`AJ6;%*@CRmE{B;)IA#}8ND@XjEE zb>-7?(dG1v=rh4mlqceG_j>j4i)*h9GFVqWGZuRLnojM4=rh4mlqVTq{p1UWdxZC9 zO~bnKe!kG#zI1jKM4t(kqCCmC^~ghpm)>;0p|KC^%6siXZ_LuUQV@M6Sc>u_W1oGu z4yRrAs33!N<^3^yTRQFe1<_}Mr6^A_{_5=AhSMMTq#z^L8=~jw_9yrGg6K1`P`o`6 z`MG3VaOpjUx7~6?kdaF%$4}=4(lesZ1WQq#h+lufAm^A$v&36`Qf$#}=Zj#)qP{%;5}SXcIO7P{|~ ze7J(>Gr>}nCmFkK{P60Vo^)!E!Md_P81B|4pSmFWOt2K?Nk;s{+f=#UCVUGb`s(o; z5$?B#^1bb~(yGq{OHtm`jwgCM=*8!FN%&?5`pR0qgkUMko5o|!$0OIvSYP-S4946> za0$UulqVTBuhx8CEk6erdRK_KyPRMt%99M6?Q6b1%DUVlTUaSi*9n%QJQ0ga@6o<> zTIZ}QTl$MGr|SeuQJ#pa&fcv(b=t33SN66Sh38!(Sc>u_;}QFAZQnZWyR0`ySV-3i z#$*;ne5PrBbmSrJ(bM_CdUKR(HG*-m#Vkg4<0oI(-get<;jCr7IWD>y!FcOp7JJ?A zUaxL{GM(qFH%C%eBbtsxPOEqScJ27~+ml_Aa~6o0FF@A`#@I=Vc;T)mx7U3o+E+Qo zzUXrFd^Mseh)heymUB;QkJuyHi8*IsIZYcQ!jxAhl#_{^2Ju9Ds!vg`e}gAKuM@Ey zPS8(?eRb_u_F0nv=49U>_Eq*K)VrGrmWnO+_eSvAuCVWm7>Cs>N|MBMX>-(9=k=UyIU zu&x|uh$m-`Oe`l@it;3*HJjm+=NuPgu-@$blCBfclJVc}kZBPYnk93>{ofE|Fh_Qf z|K^39t`pJTae_4k%Tg9ukiok08{TM<r{jurIakMP6 z3?usJ_uFs7Oz+}Zit;4Gw31C7WaN6o-P+VwvYhjK=jBASqrIF5)LPUSS3Dy+m)w<6s)+O&H&e!O%* zyo>H!`;sEQMc zam2KUDJBzS~gayg-x zlUoKcMt0R?m*kun<%;$W?~VLiuFDAtI@v7IWb!27Fm8S8OwqjFgZOV`b-4dFcJB=2#Yfe9%o=( zW;3SW4wKU}qR&LI4HJ={i?Ddf;PH~OF27a0uu`6$5q&0DityBE+l`k)MlTT$FX0%{YDEBv^e@dPek_U@6KI zFS$&XUL~s8|t3DIK7EMHc zK53ProUF?%z0_AZT_=Jqnh4eu#v?^JS(n+2X#{gxG8h-lM6eALk)MlTl#_Lt&6s9l zPS=TG8zzD^m2uIsF26~>Fikuy8H}W6f~6==guVZ0{rv~)GMjPwHczkSmgV#fu3#soZ*$cMmZCh#kVo(Dqs$gf^_p!seT$BCod~vQA~G$)EX&s4 ztL2+jEV&cbr87(FhUpVtZHWFn_QOmWd%O7*&hyb2N9 z;Y6k-Lw)6TJ9E@;u=MdQh~-4=Q72ea9CP<3a=meuz+*|@7^)F*W;nr`f>+eKAEkNa z-jC)nJTH6`$^57#M4aJHu%@&IgFl$-jjI+OWcr?8jfgAN3D%VM68AY%UD{XR3FG^N z)9y1P;*R5lc8u)Tnz!A$f1c}&`>w|Tv{x1${SqSXoKCQ&5NBvT&cM2~&m%H{@Ag@o zVF?lUb0=6+h?le;FUj?4R{OV|7D(&4MOc;)EJb-D$|$GT+u&PN@#M_0rR4-mQJ!Ql zE~?YnV^%u#J>r$0*NGS$X!m?iD+Lr!J5jrDC?3H7UPuB0?aW> zvtCmqH4`jFdD1F=Vq7%W8|__}A*yZi(r(Kb;(QdIhNCPBKlEIu%?%HK!joESCmojO0S6OG=>r{CY6(;}u=Mwsn6Cq_T~#L3U=M5Fie>36H= zw1_Dt6W$NzoEXLNlQTcB6OG=>r{Bh&(;^gG^7ouMCq|>(0?5znM5DLt({Jb@EyCW{ z4*tHDr4;3IOC~?B6OG>LCnBdsDAwn1k#kOr4!T8_pVx`-Zae)hZ^im@Ty%$& zEnQi!%h2=XGMtbMeVmB@=RXyl@Ej5P4OXEYme%v2p{4W33C|%>{{AbK^iL`^=HHT~ zJbxa`&50nRLTs_;rt1i{(Y3D*?aA28<(H_Cab6Kpb68Kw*oPuCLW=5D5gqBK+5c#}>9lcH*hRm2-vc);c--AXJDTRejW{d%5zj4e1)?L}G{4yGu=aop z?;ZN;iq}1LV~>ZtHpoD0JESdd1!6=^M(p+BlZFGI^Ni3}yMO=rsU7SeJdZ@{#E)Kd zVCr48wnKU~86D*Xt!_`o2-zlM?ck%@*S!4)>y3SW{PhDj-n9N=d)jwsEz_$JBWg0j zMsV;kZ<-hQICo|Lr01&vLDqeGQ_u9nvOa1tPR#swoqpuT&e03ujGCU8 zL{lNc?vv;4u69O!X2;%bV;`MM-}vJ_!}-BpK-y%iK!me)s>ul3uLj?*bVB;xP7RSR ziM~RNcy7c$o6Yb$=N%B*Av@vePx)u-w|Lfio6x@1h!HgzVJFVuXOyfLKhL2_umGm^ zl|)}5Mm#s-wRgO8`-C0O3+?!CuQ+7m^QWH^+5t_19W=FXHDW|fMwpc`xLxw>uRkZ* zSI{I_XH)x1qOTAmo*VJzUw&!rkn3I*+HvJap1yI*_4f|#fF>Q%s}Un=GQzCB!R^FD zK6_-c4WUVgbV>9TV#ISJKJ}0@*RDDJ^`RXP|Mx>TuHWm~w&wc|nlQZ@F`_0T-gw75 z50BgNyrHqrXU~83#&_=W9(&q%(1hud=qtpC=SDo>HNUxb{spImb{ulpVH>ae#k&1l zDSZb`m|l$-QIip`|K*p~554YHp&bW3_lS+tU-~|K+IP@|>5}Lx#E9oc*r&JuLOVWr z`QfP@(4<3p6rj&ei4ir8O>@yh&RqZe>8}s%xbd#f+PLVM`nNOt4w^7s5`Bdj@!SX- zk98jp<@mgUCLPkN5kbaOlMyd58SlN|l+X^(1vDHAH$fBJ3qoO-9)HG5GnR{lm{ev?=Ux#rbi2L|C=C z9kxE!e0^vi^mWcQA#GZ%K!m-0s>ujD&j&xxwTJr|jy8o8CtDdS5MdY1Ew}w@&G##v zMZWK{O-P$oD-hwVooX_|tfj&2E1j=yS+Y$?uSNu$A=`;|ezbmmFh;^QA#E~NAcE~P zMO%zmA&L_$vg}PX>C?BEeH?>uI{V0`;+E)J`e*R_>DP88K`V@w3@m^dfqjWHd?#9w zz-~~`rB*8C>x1Vx&%}~|bsyp|ZuPT$b%L#>ygI>pNtXoe1np67KWN|ebe&)+_F+lD z*YDsvF~VZc^QUh~aK^w(-3h@`@CSE7l%I6%1j@5~B3~DQi?V#=@ou%|G=P1t-^_$y|xxDrg z65Ll{$#ivsrC>AcgkULJA9WclrP<@}cj^RJEqkF(uz%PKiRk4Ys9v`RVWZ3}%fuLg z-VKpvkG*NO=eQ3E*dj&DN^@aq`IyT0(u$g3eJs~15U@oGACNUA8J37Gck2#48a$S4 zy=JB#7@@Ic{&Vaz8RWyG#+>HO&j_76^(upaZ99}--(bHZ0} zE-$S(f+Q%rBsjxK)Mq<$NKo4(qnB1VKZQR~k5oS}hgxxeoOB9*m3>8m?Mp zEmG{xINQfWSVDVAvJDCX7RQWW4mH^{<`UFP2K$`^Wvg)b^dhJ)3Dz`~kI=v~gY%Vp zOi6J6Afb`Xai7e@G4~u2usFtCUhQBG30NF6f;l8K{+mu`6IPy_B-kURR_qfJ?2$4i zV>`n(zv*IU_%=V0@!ZP#-Lgn@d9%i5#x}Rrpot zCxh2yTJbK9Su&{|>>oUjM7k$q`%>y%v{rWlyr$J;D6Zi(ttLY@3JBiCv2$=6qIKTd zu59@Vgx>0VO{P_O7w149DaFOm+Vp%iVn*|3jimb;L~9lOK+9JkLOZfWHW9kd(5NoI z`+?Rf;)#~8K!owg_ZfH>NB!gXJcX6~1d_2$#@+|y$Ni@g_bICO%o%XBHyVzyI zN_C>t%1*U(7e~8{zcFD?BW+rhcX85AMj2KrJ-74aYcd(Ui(@vYTSdVN^EQ=Qf#@rQd@8TWWbiJIS*hFn9X&MB8!TwG z0-<;GUX#h-T^zHi-5%_q3DYIfR|t8mUXu~Li(@wRHor3gO>{23ca<@mgUCVCSGtyUm{jOBN6RF}WigC-r)rWJ1Q^c5oXRldW*yEy6-U*~KS z(k5dCB8>U+yEqzWZwEC*+GNB}yo*yI!raa6;9VTeQQvpjCZtWq3Pf0g`3?*3;%Ke; zyrPCkn~W8Ru$L^qi=+L+&q1^)>~O{Tk?!JDh_GsNJ9x83d!Mg!wh3u##|lK)+dcA9 z-o?>=?sf?@3@1*uGI$rKLWEs3x12X?bQbwt9JUE*YsU&iIBPw2Qr^YUnd+7$HALEE z@b*rH2sT5u6M3@+aglJodYjNblaW7tiY>6#f!@a{8QINzg)qWx>;V zMqtn2?AwV}B(PEoy3|UgeD3nB#Thlz3bu2Ik+?<9_LVY7Xq-KkMR|3C^^z_LoZH1Y zs6Elo`8vT;?8B0PAKt;QVf4eE=TF~~;EaI>xf6n=;H&L~C`%>JYeryS;@KC@T0d8E zD>U0l;FJkHy_|qONSi9i^K-tGp;_XQJNdFX!j>Wkvv$B6WsD@mGCYn_${>MA8lxXO zkue`Z*S0Q$GrvCDsTE66!@3OYoQ02D67-$mbI@*|wH%&e*wsAR0#A5GXr+27`LaF+ z9NAJU%AkgvJ#~Vm>Z_JA*jMcJx(wD!x+Ivx^NKxECm8WU6sM~bEX6riC(1FXtthsG zx|ej8(zl$WJWJGXZrkPZ+Dk}qUxAg;)d`ludA<{ZrDz${Ww4ZHkDpg{f~%IjP$$?w z?1e=1)>nh-bz2QK%FOCZj1lPF5C!(P?3(R4CPMEoYp*C6#M&W~bNTG{yN)w{4o!kBws zVb>m~^5L&=55O&%;_ZTZJ-?O7Ou1@tE)^>{mzP!?K@uFBlHd#{QJ?M1A;CQ+$>^mO z&X1zylpP2w9oGkJks{K}u?fWVBixyAE2D_9ORMY;dU0t5TO{lT{eL=jBZhzcSv1(BQLo6&%RLI@}Vi6{b9XvCFh)?F6Z9hDM_ zEnFTFp>*LBP>4L-U{JW%{bq1OR8&|rf>a6@QPipgA8{pG1~=#5-KWq0%$?q7RlX{g z-s%3G)9*f~XS(-@L*97ko=5z@{qeM2pHRuK?eJ&(ZR+LkwS{~6`?RSleU9*A0;%vr zsv!{~!XK(7_@v%eK zH8-t0B@j%Pi9i40KQzxfbFV-!T_*0nV{P-=Lm!)=ewZ#3RdrtT^|P)I1k+{W-EUjn z{NRM60>N~dc>nj`-8}Z3`!*m~o;C(;ZEapvOB!u|rY${UrB3?SpZ1|X_6F@^q2&F# zea=tMjT!1#--sTiC9FN)6UYgE=%YxD-?TY@mp|&YOz~O#6FQ9GR1(g$;0dYs{;WMN z>>*cLjq+|~@&wCb9hXe2-rB~Pwq}A;Ntjxb365c+svfMh$5{HA@$)0=kQt!gbl0hi za^-W&gp7lJhh>*1!t|AO$h_3Q=(aa6(&2Tp4jDQ9^y*Ip!t2{4&&GPY%$EI=e|YdB z9bPx<_~cjqrhnioR|JCfmCGS>c>mH%UcN|&*UdWC9dTIy*AHA72-a8DQB~_DbspOi zj-~awS;xsYzcTA!ePtbQJ7Cvba;D2fj6sjYT*7U@x#e6jfxe_G4tl$;C6+#|YQ4^! z=oz}IFxZreKJO29`h1&2t_4pU)7FyrTJt_AM=qbGM+-8s@v;|px-u~BiA!Xqw-v|oF3)Kt zGN!EuM6Ly_)Z-zxdf0BWrzf<3~h5y8{-MsKH4*ww)8_Cyp}LsCV1s!+7oCg zUG>r1H9V-d47D{AoNCZcL}28oEy6ljQcf;`IF~4axkSTEmkG?AYArGC3Cv5HYCz=N zdID>d+HFj*q%wguYK-;-Rxh;&u{vv*=`z8oIJcgVp3$fs%`;JX_F+PLc%wEv(`6mf z!!yBjnUEfy=SQZ?g!J${Co)|o#0tyn2h(K&dnCGAGF>LbnrzHMGP+D)uSYFCPaA`| z#I<1dUgDUK9+IWUh=O&eHZ`m;4RaqW6R>yGzGk{iuw3rbo)C+^QR|gU&gJujZrADnKrptu*OO4tkOqU6aHC;1g^=V=$!~Rua zH%dILM%Q!JSJr{isVf=l@Vc#j(GzX&jrEmvM7eS0WF20&*MZVT0<(eU5aZlxq(rb> zrY${WV+J5=DeK#o4vfK=E0o-<466~-glA=l7>S@Rxyb`V?tFu-r4=_0ImoPg)TO&aDFYzt^$!zzh28?*5BF zu)a*RAXx4{ZvWQ)?sLux#P6o#nqAiRZ`k)$fna@J2g^Nc?&$uakF5SZbX@!D3;WmX z`?5f=KCgr2eqra=_J^!#e-9n^U45aXM$fD&)`!1`UyHh8xrhDWz-{XY1gARZjy<=F{^K8UAQH^q)UH z~WTp)Nheu>mL8rjkn;> zH~(SIiS~35UJ{&cIPIJJ2kO^ElBm_Tp;?n9Wj@H4_o zim~{!?J%P5|J0d_2rr2VjM_26OJV|Z$ylzuBqlJ!jg{O>N<@otprv$;l5nkIw1=%% zOmK{Z8%>4wu+@i&f!s{6q?BH=gj`jZKh)*5@A8Lg4RdZYApu_wp_#~K%0$pH$a|xC zFPCHG2fp3uYANAb!!Ea3$*>#)BIhswlA~C1(VlZ6{k74xwwx=DVFJBfY08w;)#6^l z77nM4VT=o#qvH5jJWDVa*K?genDDw2)1t0k|GcktY9~mz)-cz)*TFFZ!rBIi$d9$l z^&?}uQ7dD#u7rxSkJcg+m>HB7>G9WsSbD+6F54m(Y^*iRFv_azsaiChbrXhEF( z>shC^h=gkmv+hg;9ULWKriL>W`$hpmg1Uvz`x{5OG z3FJys4T!9}OrUmkZD-mOs4Go1AhPZ>C1#`QQ?v*AC|Ssj z#(7El6a>b>7~v%`fw4B0D=&!&tooK;E4i1%1gs3QeHxAPlJqIc0jp2_Gp=1Pi3wP* z*$1Td@RFEtGba&V(tyY_HRsApV#2qr?i5xP#<|r96D&7|qh;wOF@e6T7C`K;k?{SP z35*Y2&zbO&n7|m+)tLz|i3yBzU2B=}l9<3;qN^GcUJ?_SukvacW}H}ZFNq1vqSi|= zw@1QDVgmE4^+Y4QBqn^@8sQ}|!R^c?_mY_KZEHFrZEI~PT^mWHLJW3ghXm5$d9Dux z^Bk^(%4Iqv41Yj|_HYnO`WP3&@^}0Yw%-_`Ibk{yh`~>_Lzaf|e2M&B)8Oy+H%+BE z(Ns#{`3o*u-L2ehseBKC-})xy-+c>iJL#3g6VVzm{CeCZiM6%MS>1v6>?_|iR~5^` z`wxA$ZDHsjqBWxQwK|AzO_p`H+;?%%!LslkN8eOictEs9OdCtZ`arz$neXa;ednD) zho!0-yj{|_))pQRtr1g4*mDr~eC~v9yYNLtRk19*^U^of79J3-5!1#}u|5!6jyZR# zeEx!6yASMqaL~cB@QzmBj9Pd=v_?!DOU3#?th-^m?!1SN2|6qlV(iO)3lE6ah^Zs& zIf&nW<>A>bcbpP*uq?dK)~_2aJRn*lhTs2d4ne%``JbKLy!P~{qwucs^Pbm7EVMf^DcL#MBX9()5Py>T}aLXIX=98`5_U&@oO-8zxv%Ro!;MuJx)kUsNhj?yiCM$D1qF@FbLGuotyTZKmo^~e)QWP3zv!5 zf=aL?d50-&{_uSl2OTU6?W|uUSr|ITiP#gBU`es>{_4&K*X6r36_*+25IZ6Vp*6!^eZ$ALr0oR21J~%lwe80 z7OmSG_YMTh!mOs>^;sA?#Cjbe;=HQ_ORA~`ncL6W`QV^~Wnp&KuMI5>9pgk?Ka^le zRrOI>qt-rjOwi$F*%=C~IPrT(=olxa5~HbDABgS0`tanrcbpP*SgI*RKmj0A-`7l0E~$C zt`hb<dXKSGKR}U^lO!1NmX^L_|9#buS{0-eszYk=g=`uRN*AN67Z>G7{mdx2e2Z|yA~67 z4Rofq=Vc=9OeldpfEWgm_A)}>wV1g3p(~C(FB4VRFHr(}88HkZ?a2fk787?>bmg?? zWg_krDS^G37zVMw>@7W()^m%AyHRQZ*z+<`h5aifu(uS$Ah1VvTe3?mChl^nC1cOa zL=|q0Py%~rF$@Abcl+HF?JJ9kyMtBvxMv4~W)?U=?S=o`Vouv{SpCWr?Mi&-_?;K(s~# zTQn2)9EA8Eo%$avODw&7g2%!GqBSDeqM5MgAjGol)Q@6WV(H~GKNcPktr5W%&4fJ% zA(myQ{vgW|OD~_`vG9OsjR>}AChR!~u`E0FYgv|9dil(cg$G1yM6g9OVb4K`x813K z&a%YP%jZ8VJRn*lf-RZ}dk#W&4LaRtU|C`_<`W|p9uTb&!8XiTeBG`tRU`c*o)XU;~6f_JSypw9gRAMw0>jNS0 zKWcsdVX1;Gns0XyJ28dJM6g9O!IHvzoLb-Guq?3+^PLkGh7Ni2GeQLGH4`i;di44} zie-synD6?qFmzxKU@;M_*G#aaV2jrJUd?0$TXf`Z5$F)>b%Y4EXePw6OkogWi`M#n z&|-ouI&vFHnFzLMCd9H#VG#13v)1>V787jIk^4)^M6g9OA(mwdgAiM^*7vm*6Kv6u z8&AqauthT=mSqZq5L>j?_s$j*Y{QW|Qp!ZIMKd85X9|N5%d*z@=N2=SnDxExi`w%t zffyq!OhnojwN#L+7V_^x#BwNMG<2Y@)Nbb()Eim)DO@IE3o5~qVwS_q_AsH>pla^!tAU&6Bb4}WS?P#i0g+EEGg`l)Vg2dW%12l8io$pVHqK& z5~HbD9|*rMs;Mg6xYz4Wk%h}dTwj$ieIR(3lVxGm*Bvhlmx*YXD8Z8aE~m+g){^er z*>mXNeNm2qy`zMMLGZpP$G{5H9Y_n8iD)M(!IG-`<}Mu-aU==1$x76yTDqx5~0#l&3$ovH14nW*rNKHo=XVGwCA zBdi7%6L&v!#j)pQqQX1+e1n;VL8LvI@V3ul;x3M^oc6p-gm?7$b}{V9*uE(Cmh`Qq z#l+nxwE*lnbc_?>9euvX3wujy8HBg5oxZQNn7FH^mW(}z4tZZYLWFnp`BpCMk=ec| z_WJa_v&F>SLAA*2IdqH@aR*Wf?DfSkh_q)J>_m&1N=((MEo#rp1Y(S^aCjcSa*~Jm z;cL}>ULArVjQJS)^f|)G|3^T6h>5edg_#J6@*mi1&@W=~a7jb7gctvm$T}od4)>P+ z4L2R#?Q_}=^}~nXwD9J4oYTDggC`=kS-ZoU=BWLT2w^_uQB~i5(Q)<9_jqdeymrkz zpK$uu+rCx5_0oqWr&Z(6NBz}JN7uWZwnMl75jQPd_tu}(pZLuzq+)_4Rn_-ibX@nq z9#5?=TfSzVwR5icBuQ0mxa!n;{nq z@Y$29ded9p)BW~>TPEB8^5z9j^@O>#&3&&sAk>v7R<3wox936gmU=0TDszW_1OnpFqrg{QIK^ef4#>EO2Ru<*?H{spMgtbDc0jVX2?bu3B9mm+FeO)A`DV!a}6> zm>ntY!L^7SYF+tL5J?Ae)v_!KH_&b6NWElsoAeTv#X9`C38|}E>T1Jbhu*TlH9FK` z=R#8LZn#rwm+GWp9bCSuN-a2fj7y5Eld3KF1}*=+apfvyz>UyI*F}M`VWk*{U`39K!_WL_33*X6o)i znW;G^n6-6A^(9Z^e1dV#rDYwQ+p0RcIi%ZvuNQV-yKv1M%VHh=tjyBM-rdL7&2{}t zHqUbm6aK8svCSd%-g~{U{^;5@b6i5K47&Q@M3tRaJbAKr{podc^_OdRIgVk%pZRI7dvx~xV@~XD+U`#lIED#-=0|kYqN6_X>}%(^ggb3`O7o`ePY*LS zPPpk^4N~&!9-X}Rm=o*IJnc^wIED#6^t@`OB zvx{#ysk`clS1fSe|9jO*&5_SOKh%{k$Nb7K&c6JlrQPJY^K%@-gg@c-itAR*x-HAQ zdv`r*fn%8P=ODkn@{5y=Pg+{n&z_&-5m6A_T^5doC z9K*!oQ>K!udj37%#Wu>>z(A$?tZ|4%CSL*n{NVD-F zBWi{bwV#YAj$s0$S?>dpUA)-aL%-tsVS;ssxnzR5dTSl-ELQz+gTRt@aKeO-ko9I{b!kXSr+TSoNqIA zT0g?v&M{12UD5l5!Wva$jrxeJQJfR@seG>9AuH!pR_D`X<>VM9{OM&`4LYm_zmU~{ zbHcu%&sAE_yDMcqXIZSndv}tnPI6Um6`O%&u@2Z0W&tF-r0&Ho;TR^^PYf17Cq8GL ze9lf+HL(Udwa6q_o!M7nS=O*D|5GeWk(F;^6I-h%Ta@lw6N{`C-?>Y^bFVf76D&z~ zio|+VtBdSWv zRh8I@o%n;nPUKW#Gj?j}dqOPzPW-`1@&~glCd32i)B_0KL?`~>B>96mh6%C4>0TW1 zqdN7~#BP_BGVXv-7=9GpKqLNnE&h41+qr(khVRu^^K~VjS1tbeEcxfT7MT!_jPAb^ zf3Oz+e3tz49K(e8QFQ-Z^1Ooo!KEFR!~DTi^5EBUoiIURS)arcu5}N9wTq|Mr+RBB zEQEM>XpdR)?s6?6hqg`vYQ2xueKrW z0pwO2>R9a8ChtyrNy9pPFG(#pNgjR9FIrH0JKEg(Zt5kItwaKH;?aaCI?UBZL*!SW3VI7>? zs**jj8hd2llsz&oAx4+ZqL`J;ua%v<8asD4%FZ3fFo8MI=3VjCFjIHQSIhMy>qn5Y>a+)t+kgpQyX@C;-o<|C)xPrO zNOno^YdMAqv5Dx`O7?3xh6%CM=+??)Uj^HTODGmcuNIluM7>!{?ALM(6JmGK4S(#{ za{VyDy1ie^c^A91SG(PpgZ)~LVM45Px`UGaT8?2tJOH}qlKomPp;)p#+3mgA?d;cz z-JWBZ5G$N+y=A|a>xT)}?fqKLyZAf3`h&h4?ALM(6XHkFouKU3a(>0L=*he5&AVg2 zmh;X8OOl0<{94Wl2rY-tl@jo4Ife=GEU6sq*K!OK$d%p0glwtL2|`PV9BRp-Tc67n z!Q|I+3=^pJale-9hY8m0{aVgDYFfvKF9-Xz9K!^9sNE;Uel5o^fu3l$C$V44B}A{( z@qv+MaF^=Sp^+YwS9II(m>f zzf54QwcDZCujQOzP1M!d=PIq|UGh1zEY{(@JK3l1uuuKv=xyf`vJTi1W&tF-q)xtb zj$wlRM9d5N!`ocE2gZA6esip0#3O9KF+x*8l7?d_+`1?*#~_^FbEk0B0akxQLgSd$ zw9q9ZD(}|G*EIPos(ihZ&RtfGr5_TUO1>#dr$L8=_)Dm-UgXf}{*Wp^_d1x6n4C(! z9H4Xb#YcI?wOeEImpt^KPyyuD5c@nc!6NjaQ+r znBY|MYO3Dk*trt%d^`gf4Rwzh)6&*V_*8mwc32Ma z=<>H1^5s$bm!ZP}|)0QXnMApHnxYj)(UqR>7i#$Gf+>{B~188&v zGwliV@c3`A#1re<$IAUmR-C*G%rz~$+38zOuqTOfCo4 zh^0sE$_kLbli?QRS}zmwMO*rpy25vBx&1wXv8{E*^@DyqJ_ecKnr7PTKnZoMaml$x z$^_b3$GoSFX>0ikI-j=YwkfxVd{vll7vj3&S~m@756o)Xm$(+nbtQH}{+fz&#kuu5 zhp;GA$j z_5|zTnl9I_oCV0Eh}*y1uUH4m<+ky;f-K!5feyVf3A*F?hGB1Kf>W{IR@T9zi}iVe z{Ux^axHZcJr^1NRzTgS=u(&63%a#fD)!?<1+gD6* zk73&DfGpiZ=pse9}*HPBNbRMU|?WF1a&#;#;!KuV@N~e;BgjjdITK8hT(8<#E z`MEC#6MX6uw4DVoCj9Hb`6Pn0O@6m6?Lns?m|z_&S9)cBS7_OJ=uDBM;C1-+D ziG5wDD<(LVKka1s^10$v(&o7}Ej`MCR#STyZLYl%Wg7PlP$z1u%LvYAoW&xev&g2U zt(o9dzWqxCr{Z?9^eBh)@VpDm^;Rx96P!v$S2`s&?7K|(RCj(XKd<-(dHO;io6-uc7IhUMkq)eclb<7Xw426H+Ih_Cu7IJRQa(jp+ zlkTqwcb?_C;#$uNB+%BF)pWk%S}50**lKy_pL>jW7CEp(54w~cYG{y9eQxPQ(Br$W7r`{$f1lwAEC z?qfbzIO(bD1lJYUx+gFXst3vSR<0|wt@`I&rgAx$;8f^6CI8%V#W}%v9QV&zhnH)2 z5e!SNcluNf_gC2uDD-x;hx+GSyIkvK9XwW8pC?!c+FAW`*5?V#mgb*Zy_M?c^{Q}I~wI#7!$i+ekd0#9ImRsWpJ!R7M==ZbT}{n!(% zgKN56ySPt6XCK)w>2-9K`xWb8xm+fnE66hc+|r=l`(ZU;o~iL8$#c>>xs6-usQltXoUVwfu>wB9T=LZJnF zYjZ6vYE