Minimal notebook showing a workflow using PySpice with Jupyter and Matplotlib.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

987 lines
84 KiB

  1. {
  2. "cells": [
  3. {
  4. "cell_type": "code",
  5. "execution_count": 1,
  6. "metadata": {},
  7. "outputs": [],
  8. "source": [
  9. "%matplotlib notebook\n",
  10. "%config InlineBackend.figure_format = 'svg'\n",
  11. "\n",
  12. "import matplotlib.pyplot as plt\n",
  13. "import numpy as np"
  14. ]
  15. },
  16. {
  17. "cell_type": "code",
  18. "execution_count": 2,
  19. "metadata": {},
  20. "outputs": [
  21. {
  22. "name": "stderr",
  23. "output_type": "stream",
  24. "text": [
  25. "/Users/cypheon/.local/share/virtualenvs/pyspice-notebook-JSLbnKOc/lib/python3.7/site-packages/PySpice/Logging/Logging.py:47: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.\n",
  26. " logging_config = yaml.load(open(logging_config_file_name, 'r'))\n"
  27. ]
  28. }
  29. ],
  30. "source": [
  31. "import PySpice.Logging.Logging as Logging\n",
  32. "logger = Logging.setup_logging()"
  33. ]
  34. },
  35. {
  36. "cell_type": "code",
  37. "execution_count": 3,
  38. "metadata": {},
  39. "outputs": [],
  40. "source": [
  41. "from PySpice.Spice.Netlist import Circuit, SubCircuit, SubCircuitFactory\n",
  42. "from PySpice.Unit import *\n",
  43. "from PySpice.Spice.Parser import SpiceParser\n",
  44. "from PySpice.Probe.Plot import plot"
  45. ]
  46. },
  47. {
  48. "cell_type": "code",
  49. "execution_count": 4,
  50. "metadata": {},
  51. "outputs": [
  52. {
  53. "data": {
  54. "text/plain": [
  55. "PieceWiseLinearVoltageSource Vvin"
  56. ]
  57. },
  58. "execution_count": 4,
  59. "metadata": {},
  60. "output_type": "execute_result"
  61. }
  62. ],
  63. "source": [
  64. "# define a small circuit in code, you could also read a file and load the netlist from a string (see below)\n",
  65. "circ = Circuit('small test')\n",
  66. "\n",
  67. "circ.R('1', 1, 2, 10@u_kOhm)\n",
  68. "circ.C('2', 2, 0, 100@u_nF)\n",
  69. "circ.PieceWiseLinearVoltageSource('vin', 1, 0, [(0@u_ms, 0@u_V), (10@u_ms, 0@u_V), (11@u_ms, 5@u_V), (20@u_ms, 5@u_V)])"
  70. ]
  71. },
  72. {
  73. "cell_type": "code",
  74. "execution_count": 5,
  75. "metadata": {},
  76. "outputs": [
  77. {
  78. "name": "stdout",
  79. "output_type": "stream",
  80. "text": [
  81. ".title small test\n",
  82. "R1 1 2 10kOhm\n",
  83. "C2 2 0 100nF\n",
  84. "Vvin 1 0 PWL(0ms 0V 10ms 0V 11ms 5V 20ms 5V r=0s td=0.0s)\n",
  85. "\n"
  86. ]
  87. }
  88. ],
  89. "source": [
  90. "# check the generated netlist\n",
  91. "netlist = str(circ)\n",
  92. "print(netlist)"
  93. ]
  94. },
  95. {
  96. "cell_type": "code",
  97. "execution_count": 6,
  98. "metadata": {},
  99. "outputs": [],
  100. "source": [
  101. "# re-parse the stringified netlist into a netlist again\n",
  102. "parser = SpiceParser(source=netlist)\n",
  103. "parsed_circuit = parser.build_circuit()"
  104. ]
  105. },
  106. {
  107. "cell_type": "code",
  108. "execution_count": 7,
  109. "metadata": {},
  110. "outputs": [
  111. {
  112. "name": "stdout",
  113. "output_type": "stream",
  114. "text": [
  115. ".title small test\n",
  116. "R1 1 2 10kOhm\n",
  117. "C2 2 0 100nF\n",
  118. "Vvin 1 0 PWL(0ms 0V 10ms 0V 11ms 5V 20ms 5V r=0s td=0.0s)\n",
  119. "\n"
  120. ]
  121. }
  122. ],
  123. "source": [
  124. "# this netlist output string should be equivalent to the one above\n",
  125. "print(str(parsed_circuit))"
  126. ]
  127. },
  128. {
  129. "cell_type": "code",
  130. "execution_count": 8,
  131. "metadata": {},
  132. "outputs": [
  133. {
  134. "name": "stdout",
  135. "output_type": "stream",
  136. "text": [
  137. "<ESC>[1;32m2020-04-02 20:21:27,600<ESC>[0m - <ESC>[1;34mPySpice.Spice.NgSpice.Shared.NgSpiceShared.new_instance<ESC>[0m - <ESC>[1;31mINFO<ESC>[0m - New instance for id 0\n",
  138. "<ESC>[1;32m2020-04-02 20:21:27,650<ESC>[0m - <ESC>[1;34mPySpice.Spice.NgSpice.Shared.NgSpiceShared._init_ngspice<ESC>[0m - <ESC>[1;31mWARNING<ESC>[0m - Unsupported Ngspice version 31\n",
  139. "<ESC>[1;32m2020-04-02 20:21:27,656<ESC>[0m - <ESC>[1;34mPySpice.Spice.NgSpice.Shared.NgSpiceShared._send_char<ESC>[0m - <ESC>[1;31mERROR<ESC>[0m - Warning: vvin: no DC value, transient time 0 value used\n",
  140. "CPU times: user 12.6 ms, sys: 3.56 ms, total: 16.2 ms\n",
  141. "Wall time: 15.9 ms\n"
  142. ]
  143. }
  144. ],
  145. "source": [
  146. "# create a simulator\n",
  147. "sim = circ.simulator()\n",
  148. "\n",
  149. "# perform the analysis (and time it)\n",
  150. "%time analysis = sim.transient(100@u_us, 50@u_ms)"
  151. ]
  152. },
  153. {
  154. "cell_type": "code",
  155. "execution_count": 9,
  156. "metadata": {
  157. "scrolled": false
  158. },
  159. "outputs": [
  160. {
  161. "data": {
  162. "application/javascript": [
  163. "/* Put everything inside the global mpl namespace */\n",
  164. "window.mpl = {};\n",
  165. "\n",
  166. "\n",
  167. "mpl.get_websocket_type = function() {\n",
  168. " if (typeof(WebSocket) !== 'undefined') {\n",
  169. " return WebSocket;\n",
  170. " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
  171. " return MozWebSocket;\n",
  172. " } else {\n",
  173. " alert('Your browser does not have WebSocket support. ' +\n",
  174. " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
  175. " 'Firefox 4 and 5 are also supported but you ' +\n",
  176. " 'have to enable WebSockets in about:config.');\n",
  177. " };\n",
  178. "}\n",
  179. "\n",
  180. "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
  181. " this.id = figure_id;\n",
  182. "\n",
  183. " this.ws = websocket;\n",
  184. "\n",
  185. " this.supports_binary = (this.ws.binaryType != undefined);\n",
  186. "\n",
  187. " if (!this.supports_binary) {\n",
  188. " var warnings = document.getElementById(\"mpl-warnings\");\n",
  189. " if (warnings) {\n",
  190. " warnings.style.display = 'block';\n",
  191. " warnings.textContent = (\n",
  192. " \"This browser does not support binary websocket messages. \" +\n",
  193. " \"Performance may be slow.\");\n",
  194. " }\n",
  195. " }\n",
  196. "\n",
  197. " this.imageObj = new Image();\n",
  198. "\n",
  199. " this.context = undefined;\n",
  200. " this.message = undefined;\n",
  201. " this.canvas = undefined;\n",
  202. " this.rubberband_canvas = undefined;\n",
  203. " this.rubberband_context = undefined;\n",
  204. " this.format_dropdown = undefined;\n",
  205. "\n",
  206. " this.image_mode = 'full';\n",
  207. "\n",
  208. " this.root = $('<div/>');\n",
  209. " this._root_extra_style(this.root)\n",
  210. " this.root.attr('style', 'display: inline-block');\n",
  211. "\n",
  212. " $(parent_element).append(this.root);\n",
  213. "\n",
  214. " this._init_header(this);\n",
  215. " this._init_canvas(this);\n",
  216. " this._init_toolbar(this);\n",
  217. "\n",
  218. " var fig = this;\n",
  219. "\n",
  220. " this.waiting = false;\n",
  221. "\n",
  222. " this.ws.onopen = function () {\n",
  223. " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
  224. " fig.send_message(\"send_image_mode\", {});\n",
  225. " if (mpl.ratio != 1) {\n",
  226. " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
  227. " }\n",
  228. " fig.send_message(\"refresh\", {});\n",
  229. " }\n",
  230. "\n",
  231. " this.imageObj.onload = function() {\n",
  232. " if (fig.image_mode == 'full') {\n",
  233. " // Full images could contain transparency (where diff images\n",
  234. " // almost always do), so we need to clear the canvas so that\n",
  235. " // there is no ghosting.\n",
  236. " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
  237. " }\n",
  238. " fig.context.drawImage(fig.imageObj, 0, 0);\n",
  239. " };\n",
  240. "\n",
  241. " this.imageObj.onunload = function() {\n",
  242. " fig.ws.close();\n",
  243. " }\n",
  244. "\n",
  245. " this.ws.onmessage = this._make_on_message_function(this);\n",
  246. "\n",
  247. " this.ondownload = ondownload;\n",
  248. "}\n",
  249. "\n",
  250. "mpl.figure.prototype._init_header = function() {\n",
  251. " var titlebar = $(\n",
  252. " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
  253. " 'ui-helper-clearfix\"/>');\n",
  254. " var titletext = $(\n",
  255. " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
  256. " 'text-align: center; padding: 3px;\"/>');\n",
  257. " titlebar.append(titletext)\n",
  258. " this.root.append(titlebar);\n",
  259. " this.header = titletext[0];\n",
  260. "}\n",
  261. "\n",
  262. "\n",
  263. "\n",
  264. "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
  265. "\n",
  266. "}\n",
  267. "\n",
  268. "\n",
  269. "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
  270. "\n",
  271. "}\n",
  272. "\n",
  273. "mpl.figure.prototype._init_canvas = function() {\n",
  274. " var fig = this;\n",
  275. "\n",
  276. " var canvas_div = $('<div/>');\n",
  277. "\n",
  278. " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
  279. "\n",
  280. " function canvas_keyboard_event(event) {\n",
  281. " return fig.key_event(event, event['data']);\n",
  282. " }\n",
  283. "\n",
  284. " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
  285. " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
  286. " this.canvas_div = canvas_div\n",
  287. " this._canvas_extra_style(canvas_div)\n",
  288. " this.root.append(canvas_div);\n",
  289. "\n",
  290. " var canvas = $('<canvas/>');\n",
  291. " canvas.addClass('mpl-canvas');\n",
  292. " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
  293. "\n",
  294. " this.canvas = canvas[0];\n",
  295. " this.context = canvas[0].getContext(\"2d\");\n",
  296. "\n",
  297. " var backingStore = this.context.backingStorePixelRatio ||\n",
  298. "\tthis.context.webkitBackingStorePixelRatio ||\n",
  299. "\tthis.context.mozBackingStorePixelRatio ||\n",
  300. "\tthis.context.msBackingStorePixelRatio ||\n",
  301. "\tthis.context.oBackingStorePixelRatio ||\n",
  302. "\tthis.context.backingStorePixelRatio || 1;\n",
  303. "\n",
  304. " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
  305. "\n",
  306. " var rubberband = $('<canvas/>');\n",
  307. " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
  308. "\n",
  309. " var pass_mouse_events = true;\n",
  310. "\n",
  311. " canvas_div.resizable({\n",
  312. " start: function(event, ui) {\n",
  313. " pass_mouse_events = false;\n",
  314. " },\n",
  315. " resize: function(event, ui) {\n",
  316. " fig.request_resize(ui.size.width, ui.size.height);\n",
  317. " },\n",
  318. " stop: function(event, ui) {\n",
  319. " pass_mouse_events = true;\n",
  320. " fig.request_resize(ui.size.width, ui.size.height);\n",
  321. " },\n",
  322. " });\n",
  323. "\n",
  324. " function mouse_event_fn(event) {\n",
  325. " if (pass_mouse_events)\n",
  326. " return fig.mouse_event(event, event['data']);\n",
  327. " }\n",
  328. "\n",
  329. " rubberband.mousedown('button_press', mouse_event_fn);\n",
  330. " rubberband.mouseup('button_release', mouse_event_fn);\n",
  331. " // Throttle sequential mouse events to 1 every 20ms.\n",
  332. " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
  333. "\n",
  334. " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
  335. " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
  336. "\n",
  337. " canvas_div.on(\"wheel\", function (event) {\n",
  338. " event = event.originalEvent;\n",
  339. " event['data'] = 'scroll'\n",
  340. " if (event.deltaY < 0) {\n",
  341. " event.step = 1;\n",
  342. " } else {\n",
  343. " event.step = -1;\n",
  344. " }\n",
  345. " mouse_event_fn(event);\n",
  346. " });\n",
  347. "\n",
  348. " canvas_div.append(canvas);\n",
  349. " canvas_div.append(rubberband);\n",
  350. "\n",
  351. " this.rubberband = rubberband;\n",
  352. " this.rubberband_canvas = rubberband[0];\n",
  353. " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
  354. " this.rubberband_context.strokeStyle = \"#000000\";\n",
  355. "\n",
  356. " this._resize_canvas = function(width, height) {\n",
  357. " // Keep the size of the canvas, canvas container, and rubber band\n",
  358. " // canvas in synch.\n",
  359. " canvas_div.css('width', width)\n",
  360. " canvas_div.css('height', height)\n",
  361. "\n",
  362. " canvas.attr('width', width * mpl.ratio);\n",
  363. " canvas.attr('height', height * mpl.ratio);\n",
  364. " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
  365. "\n",
  366. " rubberband.attr('width', width);\n",
  367. " rubberband.attr('height', height);\n",
  368. " }\n",
  369. "\n",
  370. " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
  371. " // upon first draw.\n",
  372. " this._resize_canvas(600, 600);\n",
  373. "\n",
  374. " // Disable right mouse context menu.\n",
  375. " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
  376. " return false;\n",
  377. " });\n",
  378. "\n",
  379. " function set_focus () {\n",
  380. " canvas.focus();\n",
  381. " canvas_div.focus();\n",
  382. " }\n",
  383. "\n",
  384. " window.setTimeout(set_focus, 100);\n",
  385. "}\n",
  386. "\n",
  387. "mpl.figure.prototype._init_toolbar = function() {\n",
  388. " var fig = this;\n",
  389. "\n",
  390. " var nav_element = $('<div/>');\n",
  391. " nav_element.attr('style', 'width: 100%');\n",
  392. " this.root.append(nav_element);\n",
  393. "\n",
  394. " // Define a callback function for later on.\n",
  395. " function toolbar_event(event) {\n",
  396. " return fig.toolbar_button_onclick(event['data']);\n",
  397. " }\n",
  398. " function toolbar_mouse_event(event) {\n",
  399. " return fig.toolbar_button_onmouseover(event['data']);\n",
  400. " }\n",
  401. "\n",
  402. " for(var toolbar_ind in mpl.toolbar_items) {\n",
  403. " var name = mpl.toolbar_items[toolbar_ind][0];\n",
  404. " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
  405. " var image = mpl.toolbar_items[toolbar_ind][2];\n",
  406. " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
  407. "\n",
  408. " if (!name) {\n",
  409. " // put a spacer in here.\n",
  410. " continue;\n",
  411. " }\n",
  412. " var button = $('<button/>');\n",
  413. " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
  414. " 'ui-button-icon-only');\n",
  415. " button.attr('role', 'button');\n",
  416. " button.attr('aria-disabled', 'false');\n",
  417. " button.click(method_name, toolbar_event);\n",
  418. " button.mouseover(tooltip, toolbar_mouse_event);\n",
  419. "\n",
  420. " var icon_img = $('<span/>');\n",
  421. " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
  422. " icon_img.addClass(image);\n",
  423. " icon_img.addClass('ui-corner-all');\n",
  424. "\n",
  425. " var tooltip_span = $('<span/>');\n",
  426. " tooltip_span.addClass('ui-button-text');\n",
  427. " tooltip_span.html(tooltip);\n",
  428. "\n",
  429. " button.append(icon_img);\n",
  430. " button.append(tooltip_span);\n",
  431. "\n",
  432. " nav_element.append(button);\n",
  433. " }\n",
  434. "\n",
  435. " var fmt_picker_span = $('<span/>');\n",
  436. "\n",
  437. " var fmt_picker = $('<select/>');\n",
  438. " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
  439. " fmt_picker_span.append(fmt_picker);\n",
  440. " nav_element.append(fmt_picker_span);\n",
  441. " this.format_dropdown = fmt_picker[0];\n",
  442. "\n",
  443. " for (var ind in mpl.extensions) {\n",
  444. " var fmt = mpl.extensions[ind];\n",
  445. " var option = $(\n",
  446. " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
  447. " fmt_picker.append(option);\n",
  448. " }\n",
  449. "\n",
  450. " // Add hover states to the ui-buttons\n",
  451. " $( \".ui-button\" ).hover(\n",
  452. " function() { $(this).addClass(\"ui-state-hover\");},\n",
  453. " function() { $(this).removeClass(\"ui-state-hover\");}\n",
  454. " );\n",
  455. "\n",
  456. " var status_bar = $('<span class=\"mpl-message\"/>');\n",
  457. " nav_element.append(status_bar);\n",
  458. " this.message = status_bar[0];\n",
  459. "}\n",
  460. "\n",
  461. "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
  462. " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
  463. " // which will in turn request a refresh of the image.\n",
  464. " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
  465. "}\n",
  466. "\n",
  467. "mpl.figure.prototype.send_message = function(type, properties) {\n",
  468. " properties['type'] = type;\n",
  469. " properties['figure_id'] = this.id;\n",
  470. " this.ws.send(JSON.stringify(properties));\n",
  471. "}\n",
  472. "\n",
  473. "mpl.figure.prototype.send_draw_message = function() {\n",
  474. " if (!this.waiting) {\n",
  475. " this.waiting = true;\n",
  476. " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
  477. " }\n",
  478. "}\n",
  479. "\n",
  480. "\n",
  481. "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
  482. " var format_dropdown = fig.format_dropdown;\n",
  483. " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
  484. " fig.ondownload(fig, format);\n",
  485. "}\n",
  486. "\n",
  487. "\n",
  488. "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
  489. " var size = msg['size'];\n",
  490. " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
  491. " fig._resize_canvas(size[0], size[1]);\n",
  492. " fig.send_message(\"refresh\", {});\n",
  493. " };\n",
  494. "}\n",
  495. "\n",
  496. "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
  497. " var x0 = msg['x0'] / mpl.ratio;\n",
  498. " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
  499. " var x1 = msg['x1'] / mpl.ratio;\n",
  500. " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
  501. " x0 = Math.floor(x0) + 0.5;\n",
  502. " y0 = Math.floor(y0) + 0.5;\n",
  503. " x1 = Math.floor(x1) + 0.5;\n",
  504. " y1 = Math.floor(y1) + 0.5;\n",
  505. " var min_x = Math.min(x0, x1);\n",
  506. " var min_y = Math.min(y0, y1);\n",
  507. " var width = Math.abs(x1 - x0);\n",
  508. " var height = Math.abs(y1 - y0);\n",
  509. "\n",
  510. " fig.rubberband_context.clearRect(\n",
  511. " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
  512. "\n",
  513. " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
  514. "}\n",
  515. "\n",
  516. "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
  517. " // Updates the figure title.\n",
  518. " fig.header.textContent = msg['label'];\n",
  519. "}\n",
  520. "\n",
  521. "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
  522. " var cursor = msg['cursor'];\n",
  523. " switch(cursor)\n",
  524. " {\n",
  525. " case 0:\n",
  526. " cursor = 'pointer';\n",
  527. " break;\n",
  528. " case 1:\n",
  529. " cursor = 'default';\n",
  530. " break;\n",
  531. " case 2:\n",
  532. " cursor = 'crosshair';\n",
  533. " break;\n",
  534. " case 3:\n",
  535. " cursor = 'move';\n",
  536. " break;\n",
  537. " }\n",
  538. " fig.rubberband_canvas.style.cursor = cursor;\n",
  539. "}\n",
  540. "\n",
  541. "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
  542. " fig.message.textContent = msg['message'];\n",
  543. "}\n",
  544. "\n",
  545. "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
  546. " // Request the server to send over a new figure.\n",
  547. " fig.send_draw_message();\n",
  548. "}\n",
  549. "\n",
  550. "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
  551. " fig.image_mode = msg['mode'];\n",
  552. "}\n",
  553. "\n",
  554. "mpl.figure.prototype.updated_canvas_event = function() {\n",
  555. " // Called whenever the canvas gets updated.\n",
  556. " this.send_message(\"ack\", {});\n",
  557. "}\n",
  558. "\n",
  559. "// A function to construct a web socket function for onmessage handling.\n",
  560. "// Called in the figure constructor.\n",
  561. "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
  562. " return function socket_on_message(evt) {\n",
  563. " if (evt.data instanceof Blob) {\n",
  564. " /* FIXME: We get \"Resource interpreted as Image but\n",
  565. " * transferred with MIME type text/plain:\" errors on\n",
  566. " * Chrome. But how to set the MIME type? It doesn't seem\n",
  567. " * to be part of the websocket stream */\n",
  568. " evt.data.type = \"image/png\";\n",
  569. "\n",
  570. " /* Free the memory for the previous frames */\n",
  571. " if (fig.imageObj.src) {\n",
  572. " (window.URL || window.webkitURL).revokeObjectURL(\n",
  573. " fig.imageObj.src);\n",
  574. " }\n",
  575. "\n",
  576. " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
  577. " evt.data);\n",
  578. " fig.updated_canvas_event();\n",
  579. " fig.waiting = false;\n",
  580. " return;\n",
  581. " }\n",
  582. " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
  583. " fig.imageObj.src = evt.data;\n",
  584. " fig.updated_canvas_event();\n",
  585. " fig.waiting = false;\n",
  586. " return;\n",
  587. " }\n",
  588. "\n",
  589. " var msg = JSON.parse(evt.data);\n",
  590. " var msg_type = msg['type'];\n",
  591. "\n",
  592. " // Call the \"handle_{type}\" callback, which takes\n",
  593. " // the figure and JSON message as its only arguments.\n",
  594. " try {\n",
  595. " var callback = fig[\"handle_\" + msg_type];\n",
  596. " } catch (e) {\n",
  597. " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
  598. " return;\n",
  599. " }\n",
  600. "\n",
  601. " if (callback) {\n",
  602. " try {\n",
  603. " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
  604. " callback(fig, msg);\n",
  605. " } catch (e) {\n",
  606. " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
  607. " }\n",
  608. " }\n",
  609. " };\n",
  610. "}\n",
  611. "\n",
  612. "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
  613. "mpl.findpos = function(e) {\n",
  614. " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
  615. " var targ;\n",
  616. " if (!e)\n",
  617. " e = window.event;\n",
  618. " if (e.target)\n",
  619. " targ = e.target;\n",
  620. " else if (e.srcElement)\n",
  621. " targ = e.srcElement;\n",
  622. " if (targ.nodeType == 3) // defeat Safari bug\n",
  623. " targ = targ.parentNode;\n",
  624. "\n",
  625. " // jQuery normalizes the pageX and pageY\n",
  626. " // pageX,Y are the mouse positions relative to the document\n",
  627. " // offset() returns the position of the element relative to the document\n",
  628. " var x = e.pageX - $(targ).offset().left;\n",
  629. " var y = e.pageY - $(targ).offset().top;\n",
  630. "\n",
  631. " return {\"x\": x, \"y\": y};\n",
  632. "};\n",
  633. "\n",
  634. "/*\n",
  635. " * return a copy of an object with only non-object keys\n",
  636. " * we need this to avoid circular references\n",
  637. " * http://stackoverflow.com/a/24161582/3208463\n",
  638. " */\n",
  639. "function simpleKeys (original) {\n",
  640. " return Object.keys(original).reduce(function (obj, key) {\n",
  641. " if (typeof original[key] !== 'object')\n",
  642. " obj[key] = original[key]\n",
  643. " return obj;\n",
  644. " }, {});\n",
  645. "}\n",
  646. "\n",
  647. "mpl.figure.prototype.mouse_event = function(event, name) {\n",
  648. " var canvas_pos = mpl.findpos(event)\n",
  649. "\n",
  650. " if (name === 'button_press')\n",
  651. " {\n",
  652. " this.canvas.focus();\n",
  653. " this.canvas_div.focus();\n",
  654. " }\n",
  655. "\n",
  656. " var x = canvas_pos.x * mpl.ratio;\n",
  657. " var y = canvas_pos.y * mpl.ratio;\n",
  658. "\n",
  659. " this.send_message(name, {x: x, y: y, button: event.button,\n",
  660. " step: event.step,\n",
  661. " guiEvent: simpleKeys(event)});\n",
  662. "\n",
  663. " /* This prevents the web browser from automatically changing to\n",
  664. " * the text insertion cursor when the button is pressed. We want\n",
  665. " * to control all of the cursor setting manually through the\n",
  666. " * 'cursor' event from matplotlib */\n",
  667. " event.preventDefault();\n",
  668. " return false;\n",
  669. "}\n",
  670. "\n",
  671. "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
  672. " // Handle any extra behaviour associated with a key event\n",
  673. "}\n",
  674. "\n",
  675. "mpl.figure.prototype.key_event = function(event, name) {\n",
  676. "\n",
  677. " // Prevent repeat events\n",
  678. " if (name == 'key_press')\n",
  679. " {\n",
  680. " if (event.which === this._key)\n",
  681. " return;\n",
  682. " else\n",
  683. " this._key = event.which;\n",
  684. " }\n",
  685. " if (name == 'key_release')\n",
  686. " this._key = null;\n",
  687. "\n",
  688. " var value = '';\n",
  689. " if (event.ctrlKey && event.which != 17)\n",
  690. " value += \"ctrl+\";\n",
  691. " if (event.altKey && event.which != 18)\n",
  692. " value += \"alt+\";\n",
  693. " if (event.shiftKey && event.which != 16)\n",
  694. " value += \"shift+\";\n",
  695. "\n",
  696. " value += 'k';\n",
  697. " value += event.which.toString();\n",
  698. "\n",
  699. " this._key_event_extra(event, name);\n",
  700. "\n",
  701. " this.send_message(name, {key: value,\n",
  702. " guiEvent: simpleKeys(event)});\n",
  703. " return false;\n",
  704. "}\n",
  705. "\n",
  706. "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
  707. " if (name == 'download') {\n",
  708. " this.handle_save(this, null);\n",
  709. " } else {\n",
  710. " this.send_message(\"toolbar_button\", {name: name});\n",
  711. " }\n",
  712. "};\n",
  713. "\n",
  714. "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
  715. " this.message.textContent = tooltip;\n",
  716. "};\n",
  717. "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
  718. "\n",
  719. "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
  720. "\n",
  721. "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
  722. " // Create a \"websocket\"-like object which calls the given IPython comm\n",
  723. " // object with the appropriate methods. Currently this is a non binary\n",
  724. " // socket, so there is still some room for performance tuning.\n",
  725. " var ws = {};\n",
  726. "\n",
  727. " ws.close = function() {\n",
  728. " comm.close()\n",
  729. " };\n",
  730. " ws.send = function(m) {\n",
  731. " //console.log('sending', m);\n",
  732. " comm.send(m);\n",
  733. " };\n",
  734. " // Register the callback with on_msg.\n",
  735. " comm.on_msg(function(msg) {\n",
  736. " //console.log('receiving', msg['content']['data'], msg);\n",
  737. " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
  738. " ws.onmessage(msg['content']['data'])\n",
  739. " });\n",
  740. " return ws;\n",
  741. "}\n",
  742. "\n",
  743. "mpl.mpl_figure_comm = function(comm, msg) {\n",
  744. " // This is the function which gets called when the mpl process\n",
  745. " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
  746. "\n",
  747. " var id = msg.content.data.id;\n",
  748. " // Get hold of the div created by the display call when the Comm\n",
  749. " // socket was opened in Python.\n",
  750. " var element = $(\"#\" + id);\n",
  751. " var ws_proxy = comm_websocket_adapter(comm)\n",
  752. "\n",
  753. " function ondownload(figure, format) {\n",
  754. " window.open(figure.imageObj.src);\n",
  755. " }\n",
  756. "\n",
  757. " var fig = new mpl.figure(id, ws_proxy,\n",
  758. " ondownload,\n",
  759. " element.get(0));\n",
  760. "\n",
  761. " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
  762. " // web socket which is closed, not our websocket->open comm proxy.\n",
  763. " ws_proxy.onopen();\n",
  764. "\n",
  765. " fig.parent_element = element.get(0);\n",
  766. " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
  767. " if (!fig.cell_info) {\n",
  768. " console.error(\"Failed to find cell for figure\", id, fig);\n",
  769. " return;\n",
  770. " }\n",
  771. "\n",
  772. " var output_index = fig.cell_info[2]\n",
  773. " var cell = fig.cell_info[0];\n",
  774. "\n",
  775. "};\n",
  776. "\n",
  777. "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
  778. " var width = fig.canvas.width/mpl.ratio\n",
  779. " fig.root.unbind('remove')\n",
  780. "\n",
  781. " // Update the output cell to use the data from the current canvas.\n",
  782. " fig.push_to_output();\n",
  783. " var dataURL = fig.canvas.toDataURL();\n",
  784. " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
  785. " // the notebook keyboard shortcuts fail.\n",
  786. " IPython.keyboard_manager.enable()\n",
  787. " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
  788. " fig.close_ws(fig, msg);\n",
  789. "}\n",
  790. "\n",
  791. "mpl.figure.prototype.close_ws = function(fig, msg){\n",
  792. " fig.send_message('closing', msg);\n",
  793. " // fig.ws.close()\n",
  794. "}\n",
  795. "\n",
  796. "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
  797. " // Turn the data on the canvas into data in the output cell.\n",
  798. " var width = this.canvas.width/mpl.ratio\n",
  799. " var dataURL = this.canvas.toDataURL();\n",
  800. " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
  801. "}\n",
  802. "\n",
  803. "mpl.figure.prototype.updated_canvas_event = function() {\n",
  804. " // Tell IPython that the notebook contents must change.\n",
  805. " IPython.notebook.set_dirty(true);\n",
  806. " this.send_message(\"ack\", {});\n",
  807. " var fig = this;\n",
  808. " // Wait a second, then push the new image to the DOM so\n",
  809. " // that it is saved nicely (might be nice to debounce this).\n",
  810. " setTimeout(function () { fig.push_to_output() }, 1000);\n",
  811. "}\n",
  812. "\n",
  813. "mpl.figure.prototype._init_toolbar = function() {\n",
  814. " var fig = this;\n",
  815. "\n",
  816. " var nav_element = $('<div/>');\n",
  817. " nav_element.attr('style', 'width: 100%');\n",
  818. " this.root.append(nav_element);\n",
  819. "\n",
  820. " // Define a callback function for later on.\n",
  821. " function toolbar_event(event) {\n",
  822. " return fig.toolbar_button_onclick(event['data']);\n",
  823. " }\n",
  824. " function toolbar_mouse_event(event) {\n",
  825. " return fig.toolbar_button_onmouseover(event['data']);\n",
  826. " }\n",
  827. "\n",
  828. " for(var toolbar_ind in mpl.toolbar_items){\n",
  829. " var name = mpl.toolbar_items[toolbar_ind][0];\n",
  830. " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
  831. " var image = mpl.toolbar_items[toolbar_ind][2];\n",
  832. " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
  833. "\n",
  834. " if (!name) { continue; };\n",
  835. "\n",
  836. " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
  837. " button.click(method_name, toolbar_event);\n",
  838. " button.mouseover(tooltip, toolbar_mouse_event);\n",
  839. " nav_element.append(button);\n",
  840. " }\n",
  841. "\n",
  842. " // Add the status bar.\n",
  843. " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
  844. " nav_element.append(status_bar);\n",
  845. " this.message = status_bar[0];\n",
  846. "\n",
  847. " // Add the close button to the window.\n",
  848. " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
  849. " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
  850. " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
  851. " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
  852. " buttongrp.append(button);\n",
  853. " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
  854. " titlebar.prepend(buttongrp);\n",
  855. "}\n",
  856. "\n",
  857. "mpl.figure.prototype._root_extra_style = function(el){\n",
  858. " var fig = this\n",
  859. " el.on(\"remove\", function(){\n",
  860. "\tfig.close_ws(fig, {});\n",
  861. " });\n",
  862. "}\n",
  863. "\n",
  864. "mpl.figure.prototype._canvas_extra_style = function(el){\n",
  865. " // this is important to make the div 'focusable\n",
  866. " el.attr('tabindex', 0)\n",
  867. " // reach out to IPython and tell the keyboard manager to turn it's self\n",
  868. " // off when our div gets focus\n",
  869. "\n",
  870. " // location in version 3\n",
  871. " if (IPython.notebook.keyboard_manager) {\n",
  872. " IPython.notebook.keyboard_manager.register_events(el);\n",
  873. " }\n",
  874. " else {\n",
  875. " // location in version 2\n",
  876. " IPython.keyboard_manager.register_events(el);\n",
  877. " }\n",
  878. "\n",
  879. "}\n",
  880. "\n",
  881. "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
  882. " var manager = IPython.notebook.keyboard_manager;\n",
  883. " if (!manager)\n",
  884. " manager = IPython.keyboard_manager;\n",
  885. "\n",
  886. " // Check for shift+enter\n",
  887. " if (event.shiftKey && event.which == 13) {\n",
  888. " this.canvas_div.blur();\n",
  889. " // select the cell after this one\n",
  890. " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
  891. " IPython.notebook.select(index + 1);\n",
  892. " }\n",
  893. "}\n",
  894. "\n",
  895. "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
  896. " fig.ondownload(fig, null);\n",
  897. "}\n",
  898. "\n",
  899. "\n",
  900. "mpl.find_output_cell = function(html_output) {\n",
  901. " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
  902. " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
  903. " // IPython event is triggered only after the cells have been serialised, which for\n",
  904. " // our purposes (turning an active figure into a static one), is too late.\n",
  905. " var cells = IPython.notebook.get_cells();\n",
  906. " var ncells = cells.length;\n",
  907. " for (var i=0; i<ncells; i++) {\n",
  908. " var cell = cells[i];\n",
  909. " if (cell.cell_type === 'code'){\n",
  910. " for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
  911. " var data = cell.output_area.outputs[j];\n",
  912. " if (data.data) {\n",
  913. " // IPython >= 3 moved mimebundle to data attribute of output\n",
  914. " data = data.data;\n",
  915. " }\n",
  916. " if (data['text/html'] == html_output) {\n",
  917. " return [cell, data, j];\n",
  918. " }\n",
  919. " }\n",
  920. " }\n",
  921. " }\n",
  922. "}\n",
  923. "\n",
  924. "// Register the function which deals with the matplotlib target/channel.\n",
  925. "// The kernel may be null if the page has been refreshed.\n",
  926. "if (IPython.notebook.kernel != null) {\n",
  927. " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
  928. "}\n"
  929. ],
  930. "text/plain": [
  931. "<IPython.core.display.Javascript object>"
  932. ]
  933. },
  934. "metadata": {},
  935. "output_type": "display_data"
  936. },
  937. {
  938. "data": {
  939. "text/html": [
  940. "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdd3QU1/k+cBKfX87JNwmOHTuJE9tjx7Ed22A7LnHBJe523FtwxyW49zZ00UH0IqrovdeRKBKogKhCAlWQKCogkBCggnp5fn/cXa1W2l3taqS5zMzzOWfPSTSzy8ud67kP2t37dgARERER2UoH2QUQERERkbEYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgGQiIiIyGYYAImIiIhshgFQh7q6OuTm5qKoqAjFxcV88MEHH3zwwYcJHkVFRcjNzUVdXZ3sKCENA6AOubm56NChAx988MEHH3zwYcJHbm6u7CghDQOgDkVFRQ0TSPa/Zvjggw8++OCDD/8ezl/gFBUVyY4S0jAA6lBcXIwOHTqguLhYdilERETkJ67fDIC6cAIRERGZD9dvBkBdOIGIiIjMh+s3A6AunEBERETmw/WbAVAXTiAiIpKtvr4e1dXVqKio4MPxqK6uRn19vdcx4/rNAKgLJxAREclUVVWFrKwspKWl8dHkkZWVhaqqKo/jxvWbAVAXTiAiIpKlrq4OBw8eRGZmJoqKilBeXi79N28XwqO8vBxFRUXIzMzEwYMHPW72zPWbAVAXTiAiIpKloqICaWlpKCsrk13KBamsrAxpaWmoqKhodozrNwOgLpxAREQkizMAego45Ht8uH4zAOrCCURERLIwAPrGAOibrQNgUFBQs76AN954o9/P5wQiIiJZGAB9YwD0zfYB8JZbbsHJkycbHqdPn/b7+ZxAREQkCwOgbwyAvtk+AN52222tfj4nEBERyWL2AHjzzTejX79+Ho8NHToUl156KQoLC1v9+gyAvtk+AP7f//0frrjiClx77bV46623kJ2d7fX8yspKFBcXNzxyc3NtP4Gsrr6+HuMiMvDN4gRLPb5btAc9F0RhwNwwBM9ehvEz52Bq6GTMnDYWc6eNxIKpQ7F4ykAsn9wXqyb1xLqQHxE28VtsnPAFIsZ/iojxnyBy/MfYMv5/iBr3EaLHfYDocR8gZmw3xI59D9vHvoPtY99G3Ji3sGPMG9ge0h0Fed7/2yLj5JdUoM/qZOlzsC0f3y6Kx88LtqHfvE0YOmc1xsxagEkzpmPG9PGYPW005k0djkVTBmPp5CCsnNQLa0J+hjbxO2yY8BU2T/is0Xzujq3j/oeocR+K+TzufcSOfQ/bxr7baD6/iR1j38T+mDWyL6XpA2DXrl3xyiuvNPt5Xl4efvvb3yIkJETX6zMA+mbrABgeHo5ly5bhwIED2LhxI+677z5cffXVKCkp8Xi+p88M2n0CWV3qiWIoqmaqx3XqGjzaYxo+6jkAQ3p9gjm9X0V4n8cQ3/dO5PS9DuX9LgOCOhr+2Dmnp+zLSQAmRWVKn6OBPdbjLnU+uvYcgZ69vsOU3m9hVZ9nsL3PfcjoexPO9btCynzOHnCT7Etp+gA4ZMgQ3HDDDc1+/v7776Nz586ora3V9foMgL7ZOgA2de7cOXTs2BEzZszweJy/AbSfXUcKoaga7hi4GaGxRy7Ix4KIPYhaOh6p0z/C6VH3oK7/pX4vYtUD/oiyIdeiaHgnnB51D/LGPozj4x5HzoRncGziCzgy6VVkTnkDB6e+i7TpHyAltDuSZnyGpJmf48DML7F/1tfYP+trJM76Fgmzv8e+2T9g35wfET/nZ+ydq2Lv3J5IGXw/ENQR8dM+lX05CcBgLRWKquHN6Tulz11Pj5nRBxG2ZhH2zf4BOeOfRsWgK/2ez3X9L0XFoKtQMuxGnBl5J06NeQAnxj6K3PFPIXviczga8hIOT34dh6a8hfRp3ZA6/X9IDv2k2ZxOnPUNEmd/12hO/+SY0z2wY1J3IKgjioL+IvtSegw49fX1KKuqkfLw1XrNk3Xr1uGiiy5yqz8+Ph6//OUvERUV1S7j48QAyADYzF133YUePXr4dS4nkPXFZhRAUTU8NTZGdinuivOA2FHAtH97XgwHXwFMeQBY/gEQOQDYPR1IXQNk7wLOHAXKzwK1NYaUGjnleyCoIw5M7mbIn0e+9ViZBEXVMD4yQ3YpLjWVQMoqYPFbwJC/NJ/P/X8PjLsNmP8qEP4zsH0csH8JcCQKyE8HSvOB6nIgwADSGklpqUBQR9QEXWLIn+eLp4BTVlUj7be1ZVWB3VOysrLQoUMHJCYmNvzsgQcewOuvv97w/7ds2YJRo0a12fg4cf1mAHRTWlqKSy65BOPHj/frfE4g64tMOwVF1fD8xG2ySxGLzdEYYGFXsSA2XiCnPghs7CUW0XPZ0hemxsKm9QaCOiJt4ustn0zt7stFCVBUDTO3HZVdiviHzKbeQPC17vN5xN+Bld3FP1xOJIqAeIHYfzjHVWeV3A4cZg+AAHDxxRdj/vz5AIAlS5bg17/+tc/P4usdHyeu3zYPgD/88AOio6Nx7NgxxMXF4fHHH8dll12GgoICv57PCWR94Ul5UFQNr06Ok1vI8X3ArGfcF8mZTwPxc4CSk3Jra8GaGUOAoI7IHP+c7FIIwPuzdkNRNSzdkyOviIoiYENPYODlrvk86kbx2+oTCYCH3q0XioSsQtT1u1jUXHJKai1mfwsYALp06QJVVVFRUQFFUdC/f3+3488//zySkpIAAM888wz69u2L+++/H9deey2Sk5MDHh8nrt82D4Bdu3bFFVdcgV/96lf461//iq5du+Lw4cN+P58TyPrWJB5v+LyUFFXnAe0HIMix4Ay8TPz/gkNy6mmFZbPGiA/Nj3lUdikE4PUpO6CoGsKS8uQUkLJa/IbPGfxmPAmkhxn2kQS9EnPOobjfn0Ttp+W+jW72L4EAwGeffYZnn30WgwYNgqIoKC8vdzt+/fXXo7q6GgBw1VVXITQ0FAAwduxYDB482OdrMwD6ZusAqBcnkPUt25sDRdXQbdZu4//w/DRg4t2uhXJld6DouPF16LRg7hQgqCPyRt4nuxQC8PS4WCiqhphD/r3T0Waqy4F1X7vm84Q7gMyIC+rjCv7Yn3MOx/s53rI+Hi+1FisEwMmTJ+Pyyy/Hb37zGyxfvtztWElJCTp37gxArLdXX311w7ERI0a0uE0MA6BvDIA6cAJZ34JdWVBUDd3n7jX2D86MFF/kcL41diTK2D+/Dc2aPwcI6ojTw1u/6Tq1nQeCt0BRNezLPmvcH1p2Bpj+qCP8XSze6r2APtcXiP0553Cw783i73J4q9RarBAAt2/fjg4dOuCRRx5pdmznzp144403AABxcXF49dVXG469++67LX5TmAHQNwZAHTiBrG/W9qNQVA1fLNxn3B+avBIY8AexwMx5Dig1+Dc1bWzqwmVAUEcUD2m+3xcZ7/YBm6CoGg6d8rzfaZsrPuH6Tfawq4HDW4z5c9vJgdxz2Nv3LvH3SV0rtRYrBEBfpk+fjiFDhgAApk2bhoEDBzYcu/3221vsEsIA6BsDoA6cQNY3NfowFFXDd0sTWz65LWRsBvpfIhaXZe8DNVXG/LntaOISDQjqiPJBV8ouhQBc3ysciqrhxLnylk/Wq/wsEPIvMZ9H3yS2bDG5pNwiRPV5UPydEhZIrcXqAfCrr77C2rVrG/73mjWi+0pNTQ2uueaaFp/PAOgbA6AOnEDWNyEyA4qqocfKA+3/hx2PBwb/2fV5vwv4m5CBGL18CxDUEbX9L5Vdiu1V1tQ2bNlRXFHdvn9YdYX4prrzYwxns9r3zzNIUm4R1vV5Uvy9dk6WWovVA6BeDIC+MQDqwAlkfaM2HYSiaui3xvd2A7qVnQFGOz5XNO8lS/zmz2nYyp2uD/5b6O9lRoWllQ0BsLaunb98of0grvnQK4FTKe37Zxko+XgRFvZ+UfzdooOl1sIA6BsDoG8MgDpwAlnf0LA0KKqGwVpq+/0h9fWiA0JQR2D87UCFtebTwNUJrgBYUSS7HFvLKjwPRdVwU98N7fsHpa13XfOMze37Zxks+XgRpvZ+U/zdNvaSWgsDoG8MgL4xAOrACWR9QWtToKgaRmxsx88uxYtvyWLAH0TXA4sJWpPsCgMm/0KL2aWcKIKiarh7cET7/SGl+cBwRVzvTb3b78+RJPl4EUb1+lD8/dZ+JbUWBkDfGAB9YwDUgRPI+nquEn1Tx0W004avZWdci+V2/1oQmk3/dSmo7Of4VvM5id0nCLuOFEJRNTwyKqr9/pBVn4prPeUBS77ln3KiCEG9vnR8Uaub1FoYAH1jAPSNAVAHTiDr+2HZfiiqhslR/neICYhzY9zJ95umE0Kg+q9LQXE/x5dbTmfKLsfW2r23dbbz854XA7lyN0luL6knivFDr5/E33P+K1JrYQD0jQHQNwZAHTiBrO+rRQlQVA0zth1t+xfP2+9q8ZYluddwO+q/LgUF/a4Uf08LfRnAjNq1tWFdnfitX1BHYO2Xbf/6F4i0vGJ83LOfo43dE1JrYQD0jQHQNwZAHTiBrO+TefFQVA3zdhxr+xdf5Pgg+fIP2/61LyAD1qUit9/fLojWWXa3aHc2FFXDR3P2tP2LO7/4MeSvwHnfG/SaWVpeMbr1HCz+rlMfkloLA6BvDIC+MQDqwAlkfR/M3gNF1bBkT3bbvnDeAddbZZIbyre3AetScbjvjZb/TacZzIk7BkXV8PmCNu5sU1/v+u1f5MCWzzex9JPFeKNnsPi7htwjtRYGQN8YAH1jANSBE8j63g7dBUXVsCoht21feMk7jt/+fdC2r3sBGrg+FWl9b7kgeqfa3fSYI1BUDd8uaeNvmx/aKK7v4CvEF5ss7ODJErzcY4z4+46T29+aAdA3BkDfGAB14ASyvten7ICiatAO5LXdixYedm2Lkp/Wdq97gRq4PhWJfW8Xf9+D7bz/HPkUsjUTiqrhp+X72/aFnR0/Nvdt29e9AB08WYL/9Jjo6HDyD6m1MAD6xgDoGwOgDpxA1vdCyHYoqobNqafa7kU39XF8g/DVtnvNC9ig9anY3fdu8XdOWS27HFsbvfkQFFVD79VJbfei+Wni2va/BChuw38oXaAOnSrBYz2mir/z8Jb70bYnswfAm2++Gf369fN4bOjQobj00ktRWNj6z5MyAPrGAKgDJ5D1PTMuFoqqIfpQG21gXFMJBF8rFo90rW1e8wI3aH0qYvvcL/7OB5bKLsfWhoWnQ1E1DFjXhp1twn8W13bxW233mhewjFMleKDHTNdb3hKZPQB27doVr7zSfCudvLw8/Pa3v0VISIiu12cA9I0BUAdOIOt7bHQ0FFXDjsNt9K3GpOWut44suu9fU4PWpyKiz8Pi771vruxybG3AulQoqoZh4W3U2aa6HBh2lbi2me3YXeQCknGqBHer812/9ZTI7AFwyJAhuOGGG5r9/P3330fnzp1RW1ur6/UZAH1jANSBE8j6HgzeCkXVEJ91tm1ecPazYuHYOqRtXs8EBmupCOvzuPh7754uuxxb67M6GYqqYfTmQ23zgomLxHUd20nsA2gDmfkluFVd4vocr8R/yJk9AK5btw4XXXSRW/3x8fH45S9/iaioKN2vzwDoGwOgDpxA1nfPkEgoqobk40X6X6z4hGvRsFFLtMFaKlb1eUb8veMmyi7H1n5efgCKqiFkaxt1ZJn3sriu0SPa5vVMIDO/FDeqK13/LVeWSqvFY8Cprweqzst51NcHVH9WVhY6dOiAxETXt9IfeOABvP76627nzZ49G3fccQduu+02dO7cGXPmzGn9+Dhw/WYA1IUTyPr+OXAzFFXDoVMl+l9s1zSxYIQ+rv+1TGRIWBqW9H5B/N1jRsoux9a+XZIIRdUwPeaI/hcrOwMMuNR2Lf4y80txrbrOFQAlbnrtMeBUnXfVZvSj6nzAf4eLL74Y8+fPBwAsWbIEv/71r5Gd7dp3derUqXjwwQdx+vRpAEBhYSFmz57d+vFx4PrNAKgLJ5D13dJvIxRVw7HTgd/Ympnl+C3YDn0fbDabIWFpmNv7Vdu99X0h+nzBPiiqhjlxx/S/WMJ8Vx9rGzlcUApF1VAddIn4+xcdl1aLFQJgly5doKoqKioqoCgK+vfv33Ds7NmzuOyyy3DixIm2Gx8Hrt8MgLpwAlnf9b3CoagaTpwr1/dCJadcfX9t9PYvIALg9N5v2GafuAvZR3P2QlE1LNzVBp1tFrxmu7d/AeCIIwCWBv1J/P0LD0urxexvAQPAZ599hmeffRaDBg2CoigoL3fda2fOnNns7WDd4+PA9ZsBUBdOIGurr6+HompQVA2nSyv1vdieULFYTH+0bYozkaFhaQjp7eh8Ev6z7HJs7d2Zu6GoGpbH6+xsU34OGPAHcU0L2ugLJSZx9PR5KKqGwn5Xir//qTbcUidAZv8SCABMnjwZl19+OX7zm99g+fLlbse+++47DBnS+ncNGAB9YwDUgRPI2iprahsCYHFFtb4Xm/uiWCy2j2ub4kxkaFgaRvf6UPz9130juxxb6zpNdLZZu791b6k1OLDM0Qv3X21TmIk4A2BeP8d+nsfbuK9yAKwQALdv344OHTrgkUceaXasT58+GDRokMfnLVu2DN27d8drr72G5ORkj+cwAPrGAKgDJ5C1lVRUNwTAimod+1FVlwMDL3f8tuRg2xVoEkPD0zC01yfi77/qU9nl2NrLk0Rnmw3JJ/W90KpPbfuW/jFHADzW70YxBlk7pNVihQDoS1xcHG666aaGbiDFxcUNXxhxSkxMRHBwsMfnMwD6xgCoAyeQtRWWVjYEwLq6wD/b0uDwFtfmz634jIzZDQ1PQ/9eX4gxWPa+7HJs7bkJ26CoGram57f+RerrgVGO8HN4a9sVZxJZhSIAHuzXSfoYWD0AAkBoaCg6d+6MTp06oXPnzpg1a1bDsbq6OnTv3h25uZ4/0sAA6BsDoA6cQNaWV1QORdVwXc8wfS/k7P27+rO2KcxkhoWno2ev72zVLuxC9eSYGCiqhu2Zp1v/Ivnp4loO+iNQbd3g4Y0zAB7o908xDoc2SqvFDgHQm7q6Onz99ddISEjweg4DoG8MgDpwAlmb80Z/U98N+l5oShdb98EdFp6OH3r9JMZgfvO+n2Scf4+MgqJq2HPsTOtfZOdkcS3nvth2hZlIdmEZFFXD3n7/EuOQukZaLXYOgMHBwbjvvvvwySefYMWKFR7PYQD0jQFQB04ga8s4VQJF1XDbgE2tf5HSAtceWaU63nYzsWHh6fiyZy8xBrOflV2Ord0/bAsUVcP+nHOtf5EFr9v2C00AkHNGBMDt/R6Q/g87OwdAfzAA+sYAqAMnkLUlHy+Comq4e7COJvdJy225WW5jwzeko3vPIFt2QbnQ3DkoAoqqIfVEK+9ZNVXA4CvEtcw70LbFmYQzAG7p94gYh31zpdXCAOgbA6BvDIA6cAJZ277ss1BUDV2Gb2n9i6z/ViwSG3u1XWEmM3xDOrr1HCzGYcoDssuxtc5BorNNZn4r+9fm7BHXcfg1QF1d2xZnEs4AGN73STEWu6dLq4UB0DcGQN8YAHXgBLK2XUcKoagaHhkV1foXmdxF+ueEZAvekI43egbbdt+4C8mNfURnm5wzZa17gR2TxHVc2LVtCzOR3LMiAK7p+x8xFnETpNXCAOgbA6BvDIA6cAJZW2xGARRVw1NjY1r3ApWlQP/fi0WiOK9tizOR4A3peLnHGDEO426VXY6t/a1nGBRVw6niVgaGZd3EdYwZ2aZ1mYkzAC7t+5JjLOS1wmMA9I0B0DcGQB04gawtMu0UFFXDCxO3te4FjsaIBWL0zW1bmMkEb0jHf3pMdOyFeKPscmyrts7V2vDs+arWvciYW8R1PNrKfxRZwPFzYnuoeX0dX4bZ4rlThRGcAadx/1xyKS8vZwD0gQFQB04gawtPyoOianhtSlzrXiB2lGPz425tWpfZjNiYjsd6THV9doykKK9ytTY8X1kT+AsU54lr2P/34rfbNnXCEQBD+7wlxmNTb2m11NbWIi0traFTBrkrLCxEWloaamubd3Li+s0AqAsnkLWtSTwORdXwVujO1r3Awq5igdgR0raFmcyIjel4sMdMMRaDr5Bdjm0VlblaG1bXtuILHKlrHd9o79L2xZmIMwCG9OkmxiPsR6n15OXlNYTA8vJyVFRU2P5RXl7eEP7y8jx//IbrNwOgLpxA1rZ0bw4UVcP7s3YH/uT6eiD4b2KByNnT9sWZyMiNB/EvdZ7jt0eXyC7HtvJLKqCoGq7poaG+NS0JN/UW13DdN21fnIk4OwSN7vM/MR5rv5RaT319fUMI5MP9kZeX53Wuc/1mANSFE8ja5u/MgqJq+Hje3sCffOaIWBwGXgbUVLZ9cSYycuNB3KYudm2IXduKtx9JN+eXF67vHd66F5j5lLh+CQvatjCTOVkkgvTQ3p+J8VjZXXZJAMTbwbJ/83YhPTy97dsY128GQF04gaxt5rajUFQNXy7y3mvSK+cG0NMfbfvCTGbkxoO4SV3hCoBV52WXZEtHCkqhqBo69WtF79q6WmDQn8T1KzjU9sWZyKliEQD79f5GjMfSd2WXRK3A9ZsBUBdOIGubEn0Yiqrh+6X7A39yRJBYHNZ/29Zlmc6oTQfxN3WtKwCW6ehDS62WfrIYiqrhjoGbA3/y6QzHZzj/LMKgjTkDoNr7R8eeiP+VXRK1AtdvBkBdOIGsbXxkBhRVQ4+VSYE/ecFrYnHYE9r2hZnMqE0Hoaga6oK4J6JMSbmiteG9QyMDf3LySsdvtB9p+8JMJt8RAL/t1UOMydwXZJdErcD1mwFQF04gaxu5UQSXoLUpgT951D/E4pDdym8QW8hoRwCsGvBHMSZnjsouyZbis85AUTU8NGJr4E+OHOj4wsNXbV+YyTi/TPNpr35iTGY+JbskagWu3wyAunACWduQsDQoqobBWmpgTyw743q7s4JzwxkAywZe6fgM2UHZJdlS3OHTUFQNj4+ODvzJzi2Ndk1r+8JMxhkA3+85SIzJtIdll0StwPWbAVAXTiBrC1qbAkXVMGJjemBPPBorFoaxndunMJMZvfkQFFVD8aBrxbjkteIzlaRb1MF8KKqG/4yPDfzJYzqJa3dse9sXZjIFJZVQVA1v9hwuxmTSfbJLolbg+s0AqAsnkLX1WJkERdUwLiIjsCfunCIWhkVvtk9hJuMMgGeGON4Wz2nFvoqk26aUk1BUDS+GBBjiys+5fqNdfrZ9ijOR06UiAL7SY7QYk/H/lF0StQLXbwZAXTiBrO37pfuhqBomRx0O7IlrPnf0CB3cPoWZjDMA5g+91dFHthW/gSLd1h84AUXV8PrUHYE9MSuOPa0bcQbAZ3tM4LiYGNdvBkBdOIGs7ctFCVBUDTO2BfilhWkPi4UhZXV7lGU6YxwB8MTwO8W4ZETILsmWVu7LhaJqeGfGrsCeuHs6tztppNARAB939rcO/pvskqgVuH4zAOrCCWRtn8yLh6JqmLczy/8n1dUCgxzfdi0M8DeHFuUMgNnB94lxSVsnuyRbWrw7G4qq4cPZAbYmXPuVuG6RA9qnMJM5c74Kiqq5+lsP+avskqgVuH4zAOrCCWRtH8zeA0XVsHRPjv9PKjwsFoVBf7L9hrlOYyNEADwy8t9ibJKWyy7JlubtOCa2L5kfH9gTQx/ndWvEGQDvUeeKcRnwB9klUStw/WYA1IUTyNreDt0FRdWwOuG4/086tFEsCpO7tF9hJuMMgAdHOXrJ7psnuyRbCo09AkXV8PXiAFsbDr/G8e3tA+1TmMmcdQTA29VFri/H8B97psP1mwFQF04ga3t9yg4oqoawpAA6V+wIcfQHfa/9CjMZZwBMHvOCGJvd02WXZEuTojKhqBp+XBbANjyN97SsLG2/4kzkXJkIgO79rctkl0UB4vrNAKgLJ5C1vRCyHYqqISL1lP9PWv8tPy/VxLgI0VIvYdzrYmy2j5ddki05g3ivVQG0NszZI67ZqH+0X2EmU1RWDUXV2N/a5Lh+MwDqwglkbU+Pi4Wiaog5VOD/k+Y8JxaExIXtV5jJOAPg7vFvi7GJDpZdki0Fb0gPvLXh/sXims1+tv0KMxlnAFRUDfX9L2F/a5Pi+s0AqAsnkLU9OioKiqph55FC/580+iZudtzE+EgRAOMmfijGJqK/7JJsadD6VCiqhqFhaf4/aYuj3dm6b9qvMJMpKm8UAAdfwf7WJsX1mwFQF04ga3sgeAsUVcO+bD+7H1Sd51tCHjgDYFTIZ2JsNvSQXZIt9V2TDEXVMGpTAL2Yl3UT1yxuQrvVZTbFFY0CoPMLMvkBtosk6bh+MwDqwglkbf8aEiG+vHC8yL8nnEwSi8FwpV3rMhtnAIyY/C1/mySRuuIAFFXDhMgAWhtO6SKu2cHw9ivMZNwC4KgbxficSJRdFgWI6zcDYINhw4ahQ4cO+OYb/xcnTiBru33AJiiqhoxTJf49IWWVWAxCH2vfwkxmgiMAhk/5WYzPqk9kl2RL3y1NhKJqmBrt5wbl9fWA8y3O0wH2w7awkkYBsG7cbWJ8sgPsrkLScf1mAAQA7NmzB3805TcAACAASURBVNdccw1uvfVWBkBqcHPfDVBUDVmF5/17QswIBhwPnAFw7bS+3CJHoi8W7oOiapi13c/PqxXnievV/xKgpqp9izOR0soaVwAM+ZcYoyPRssuiAHH9ZgBEaWkprr/+ekRERODhhx9mAKQGf+8VJnrYniv37wmrPhWLQcyI9i3MZCZuEQFwxfTB7CkrUfe5e6GoGhbs8rO14dFYcb3G396+hZmMWwCc8pAYo0ObZJdFAeL6zQCI9957D99++y0AMABSg7q6+oab/OnSSv+e5GyZlbKqfYszGWcAXBw6UozPnOdll2RL3WbthqJqWLbXz9aGe2eJ67XgtfYtzGTONwqAtaFPiDFKXSu7LAoQ12+bB8DFixejU6dOqKioANByAKysrERxcXHDIzc31/YTyKoqqmsbbvLFFdX+PSn4WrbM8iBkq+hAMW/mBDE+M56QXZItvTl9JxRVw5pEP1sbbuotrle42r6FmUxZVaMAOPs59kk2KQZAGwfAnJwc/PGPf8SBA67FuqUAGBQUhA4dOjR72HkCWVXjb/pVVPvR57PxFjAVfn5r2CacAXDmrGlifKY8ILskW3p1cpz4Mo6/rQ2Xviuu187J7VuYyTQOgDXzXhNjlDBfdlkUIAZAGwfA1atXo0OHDrjooosaHh06dMAvfvELXHTRRaitbb7o8zeA9nG6tNL1OZ+6+pafkJ8uFoKhV7V/cSbjDIBTZ88RYzTxLtkl2dLzE7dBUTVEpvnZ2nDav8X1SlvfvoWZTHmV692BmkWO7jZ7QmWXRQFiALRxACwpKUFycrLb46677sI777yD5ORkv16DE8i68orKoaga/t4rzL8nZGwWC8Hk+9u3MBNyBsAJcxeJMRrTSXZJtvTU2BgoqobYDD9bG464zvGRhv3tW5jJNP54SPUyR3ebHSGyy6IAcf22cQD0hF8CIaeswvNQVA03993g3xP2zHB8w7Vr+xZmQs4AOHr+SjFGI66TXZItPeJobbjLn9aG1eXsauNF4wBYtdLR3SZ2lOyyKEBcvxkA3TAAklPGqRIoqobbB/i5vUNEkFgIwn5sz7JMaVKUCIDBC9aLMRryV9kl2VKX4aK1YYI/rQ1PZziu1V/EhtDUwC0Arv1OjNPWIbLLogBx/WYA1IUTyLqSjxdBUTX8a0iEf09Y7ngraPv49i3MhJwBcNBCx9vkAy6VXZIt3T1YtDZMOeHHl5QyI8W1Crmn/QszmcoaVwCs1FQxTpv7yi6LAsT1mwFQF04g69qXfRaKquGB4C3+PWHGE9wD0AtnAOy3KMb1tmKtn1vrUJu5zdHaMDPfj9aG8bO5B6AXVTV1rh0CNgY5fvP/k+yyKEBcvxkAdeEEsq6dRwqhqBoeHRXl3xNG/UMsBLnx7VqXGU2OOgxF1dBjya5GW+Xwvxmj3RRIa8PIgeI6rf+u/QszGbcAGDlcjNPaL2WXRQHi+s0AqAsnkHXFHCqAomp4elxsyyfXVAFBF4uFoDS//YszGWcA/HFpgisAcpwMd11P0dowr8iP1oYru4vrtG1M+xdmMtW1rgBYHj1ejNOKj2SXRQHi+s0AqAsnkHVFpJ6Comp4IWR7yyefOSoWgUF/5AfmPZgSLQLgD8v2AwMvF2N11s9+tNQmGrc2LPSnteHMp9nhwouaRgGwbLtjc/PFb8kuiwLE9ZsBUBdOIOsKS8qDomp4fcqOlk8+6vhs24Q72r8wE3IGwO+X7geGXSXGquCg7LJspfE3V0v8aW045hZxnXJ2t39xJtM4AJ7fPU+M07yXZZdFAeL6zQCoCyeQda1OOA5F1fB26K6WT05YIBaBuS+2f2Em5BYAR94gxupEouyybKVxa8PKmhZaG9bWAP0vEdep2M+2cTZS2+i3qaX7lotxmvm07LIoQFy/GQB14QSyrqV7cqCoGj6Yvaflk6OG8YPgPkx1BMDvliYC424VY5W9U3ZZttK4tWF9Sx9TOJctrtHAy4C6OmMKNJHGb6eXJGlirKY+JLssChDXbwZAXTiBrGveziwoqoaP5+1t+eTVn4tFIHpE+xdmQm4BMOQeMVaHt8ouy1ZOnBOtDa/vFd7yyce2i2s07rb2L8yEGgfAolTnfon/kl0WBYjrNwOgLpxA1jVj21EoqoYvFyW0fPKc58UikLio/QszoWkxjgC4JBGY9rAYq4N+BBFqM8dOB9DacP8ScY1mP9v+hZlQfX2jAJgRJ8ZqLPtbmw3XbwZAXTiBrMu5dcn3S/e3fPLEu8UicCSqvcsyJbcA6Px2afJK2WXZyqFAWhtuGyuu0cqP278wk3IGwLNHE9jf2qS4fjMA6sIJZF3jIjLE5sUrk1o+md9s9Wl6zBFXAJz3kuO3pQtll2UrAbU23NCD7c1a0LClTk66q2cymQrXbwZAXTiBrGvExnQoqoagtSm+T6wud21uXH7OmOJMxhkAv12SKPZLC+oI7Jkhuyxbic8KoLXhsm7iGu2Y1O51mVVDAMzLEmPV/xLuAWoyXL8ZAHXhBLKuIWFpUFQNQ8LSfJ/ITaBb5BYAl3/oCBchssuylYBaG/Jt+hZd00MEwIKCU65/ANZUyS6LAsD1mwFQF04g6wpamwJF1TByYwtv62bvdHxj8lZjCjOh0FgRAL9ZnACscXxjOmak7LJsJaDWhuNvF9coK679CzOpax0BMP9sMd8BMCmu3wyAunACWVePlUlQVA3jIzN8n5iyWtz8ZzxpTGEm5BYAtR/EeG0ZJLssW/G7tWF9PTD4z+IaFR42pjgTagiAReVA/9+L8So5KbssCgDXbwZAXTiBrOv7pfuhqBqmRLewCO6cIm7+S981pjATcguAm3qL8drYS3ZZtuJ3a8OKRr/RqjpvTHEm9LeeYVBUDaeKK8QXQII6AmeOyC6LAsD1mwFQF04g6/pyUQIUVcPMbUd9nxgRJG7+4T8bUZYpOQPg14sTgC2DxXhp38suy1acrQ3fCm2hA8vpDHF9hl5pTGEmdZ0jAJ4sqhBbwAR1BE618IUxuqBw/WYA1IUTyLo+nrcXiqph/s4s3yeu+lTc/GNHG1OYCbkFwNhRYrxWfy67LFtxtjZ8f9Zu3ycejRHXZ8KdxhRmUm4BcGwnMWa5fnQNogsG128GQF04gazr/Vm7oagalu7N8X3i3Be5r10LnF1VvlqUILYWCeoILP9Adlm24ndrwwPL2AXED3/vJQJgXlG5ayP4o358wYYuGFy/GQB14QSyrrdCd0JRNaxJPO77xEn3Onrb+rG/mk25BcC9M8V4LXpTdlm24ndrw7gJ4vqs+MiYwkzq+l7hUFQNJ86VA1MfEmN2yI8uK3TB4PrNAKgLJ5B1vTYlDoqqITwpz/eJw69xfP4n1ZjCTGhm4wCYuEiM17yXZJdlK1Oi/WxtuLEXv6TjB7cA6Nw3MWW17LIoAFy/GQB14QSyrhcmboOiaohMO+X9pJpK1zcmy84YV5zJzGz826eUVWK8Zj4tuyxbGR/pZ2tD50bdcRONKcykru8tAuDxc+WN2hsukl0WBYDrNwOgLpxA1vXU2BgoqobYjALvJ53LFjf+gZexC4gPbgHw4AYxZtMell2WrYzceNC/1oaznxXXJ2m5MYWZ1A2OAJh7tszV3nDvTNllUQC4fjMA6sIJZF2PjIqComrYeaTQ+0k5u8WNf0wn4wozoVnbRQD8YuE+4EiUGLOQe2SXZSt+tzaccAe/0OAHZwDMOVMmPi/J9oamw/WbAVAXTiDr6jJ8CxRVw77ss95PSl0rbvyhjxtXmAm5BcDsXWydJ4GzteGIjem+TxzyV3F9TmcaU5hJ3dinUQBc+6WjveEI2WVRALh+MwDqwglkXXcPjoCiakg+XuT9pN3TxY1/ydvGFWZCsx0B8POF+4C8/WLMRt4guyxbcbY2HBfho7VhZanrM62VJcYVZ0L/6LPBFQDDfhJjFjlQdlkUAK7fDIC6cAJZ120DNkFRNWSc8rEQRg50dLX4wbjCTMgtABYcEmM27CrZZdmKs7Xh5CgfrQ0LD4trM/gK4wozKWcAzC4sAzb3E+O2oafssigAXL8ZAHXhBLKum/qKG3xWoY9+qGu/Ejf+qOHGFWZCc+KOuQJgwxdnLpddlq04WxvO8NXaMHsn3573k/P+kF1YJv77D+oIrPtGdlkUAK7fDIC6cAJZl9tO/944v/23J9S4wkyoIQAu2AeUFrjeZqyrk12abXwyLx6KqmGer9aG6Zq4LtMfNa4wk7q58T8Qt48T47byY9llUQC4fjMA6sIJZE11dfVQVA2KqqGwtNL7iTOe5AawfnALgJUlrgBYVSa7NNv4YPYe0dpwj4/WhvFzxHVZ8LpxhZnULf02QlE1HDt93vVZ4KXvyi6LAsD1mwFQF04ga6qorm0IgCUV1d5PnHCnuPEf22ZccSY0d4cIgJ8tiAdqa7h5tgRvh+6CompYneCjtWHsKHFdVn9mXGEm5RYAE+Y7gvNrssuiAHD9ZgDUhRPImoorqhsCYGVNrfcThyvixp/fwt5qNucWAAFgwB/EuBW10GeZ2szrU3ZAUTWE+WptuKGnuC6b+hhXmEl1cgTAo6fPA8krxLjNflZ2WRQArt8MgLpwAlnT6dLKhgBY763DR+PfZJX66BZCmNc0AA69yrHXnI8tSahNvRCyHYqqYXOqj9aGKz8W12X7OOMKM6lOQSIAHikoBdLD+NlJE+L6zQCoCyeQNZ04Vw5F1XB9r3DvJ5XmOwLgxUCdj98SUkMA/HS+IwCOulGM3YlEuYXZyNPjYqGoGqIP+fjHyvxXxHVJmG9cYSblFgAPbxXjNuk+2WVRALh+MwDqwglkTcdOn4eiaril30bvJ+WniZv+8GuMK8ykmgXA8f8UY5cVJ7cwG3nU0dpwx2EfrQ2nPiSuy8ENxhVmUp0dAfBwQWmj7ja3yS6LAsD1mwFQF04gazp0qgSKquGfAzd7P+lorLjpT7jTuMJMat7OLCiqhk/mOQLglC5i7DIi5BZmIw8Gb4WiaojP8tHacMwt4rrk7jWuMJO6tb/YKD4zvxTIO8DuNibE9ZsBUBdOIGtKPl4ERdVwz5BI7yelrBI3/ZlPGVeYSTULgM7tc1LXyC3MRu4ZEtlya8PBfxbX5cwR4wozKbcAeDqD3W1MiOs3A6AunEDWFJ91Foqq4cHgrd5Pcu79tfgt4wozqflNA+C8l8TYJS6SW5iN/HPgZiiqhkPeWhtWlbm+1FTB+1lLnK0iM/NLgKJcR3eby2SXRQHg+s0AqAsnkDXtOFwIRdXw2Oho7yc1tH/62rjCTMoZAD+e53hrkR1UDOe2b50nDS36LgO8ffOdGtzeuFd42RlXeK6tkV0a+YnrNwOgLpxA1hR9qACKquHpcbHeTwr7UdzwIwcYV5hJNQuAK7s7thsZL7cwG7m+VzgUVcOJc15aG55IENdk1D+MLcyknAHw0KkS99+eVnr5DStdcLh+MwDqwglkTZtTT0FRNbwQst37ScveFzf8HZOMK8ykFuwSAbD7XEcAXPeNGLuoYXILs4n6eldrw4ISL60NMyLENZncxdjiTMrtLfW6Ou4JakJcvxkAdeEEsibtQB4UVcPrU3Z4P2nOc+KGf2CpcYWZVLMAuLEXO04YqLLG1dqwqNxLa8P9i8U1mfuCscWZ1B2OAHjwpOM3foP+JMbvbJbcwshvXL8ZAHXhBLKmVQm5UFQNb4fu8n7SpPvEDT/TxzeFCQCwcFc2FFXD/5wBcMtgMXba93ILs4mSRq0NK6q9bFoeN1Fck+UfGlucSd05SATA9JOOe//waxxtIdPlFkZ+4/rNAKgLJ5A1LdkjAssHs/d4P2nkDexm4admAXDbGDF2qz6VW5hNnDlf1RAA6+q8fMEjor+4JuE/G1ucSTULgKNvctwPEuQWRn7j+s0AqAsnkDU127euqfp6YMAfxA2/KNfY4kxo0e4mAXDXNDF2S9+VW5hNnCyqgKJquK5nmPeT1n4prkl0sHGFmdidgyKgqBrS8hz3/gl3sLuNyXD9ZgDUhRPImmZsOwpF1fDVIi//mi8/5/rQd3WFscWZkDMAfjTHEQAT5ouxm/+q3MJsIruwDIqq4aa+Plq8LXrTsTXPDOMKM7G7BosAmHrCce93drfJZHcbs+D6zQCoCyeQNU2OOgxF1fDDsv2eTyg8LG72Q/5ibGEm1SwAJq8U4zfrGbmF2URmvmhteNuATd5PmvEEu7MEoFkADH1cjF/aOrmFkd+4fjMA6sIJZE3jIjKgqBp6rkryfELObnGzH9vJ2MJManFDAHR8pvLQRjF+Ux+SW5hNpJwQrQ3vGuzjt1POtzCPbTOuMBO72xEAU044WuvNeZ67ApgM128GQF04gaxpxMZ0KKqGoLUpnk9IDxM3+2n/NrYwk2oWAI/GivGbeJfcwmwiIVu0Nrx/2BbvJw27mt9iDcC/hkS491Ze9IYYv/jZUusi/3H9ZgDUhRPImgZrqVBUDUPD0jyf0PAZtleMLcyknN+qbgiAx+PF+I2+WW5hNrHriGht+MjIKM8n1NU22sg439DazKpZAFzxkWNj+BC5hZHfuH4zAOrCCWRN/dYkQ1E1jNp00PMJ3DMtIM4A+KFzW52Cg2L8hitS67KL2AzR2vCpsTGeT3DrZetlo2hyc8+QSPcAuO5rfovaZLh+MwDqwglkTT1WHoCiapgQmeH5hC2DuJFxAJoFwHM5YvwGXia3MJvYki5aGz4/0cvn+84cEddj8BXGFmZi9w4VATAp1xEAnd1tNveVWxj5jes3A6AunEDW9N3SRCiqhqnRhz2foP0gbvaRA40tzKSW7slx31jb7TdONXKLs4ENyaK14auTvexRd3yf4y35m4wtzMSaBcCtQ/iPQpPh+s0AqAsnkDV9sXAfFFXDrO1HPZ/g/LxP3ARjCzOpZgGwusIVACuK5BZnA2sSj0NRNbw5fafnEw5vEddi0n3GFmZi9zkC4IHcc+IH28Y6utt8Ircw8hvXbwZAXTiBrKn73L1QVA0Ldnlp7D7/VXGz3zfP2MJMauneJgGwvh7o/3sxhsV5couzgWWO8e82a7fnE7gvY8DuH7YFiqphf44jAO6eLsZwyTtyCyO/cf1mANSFE8iaus3aDUXVsHRvjucTQh/jpq8BcAbA9xsHkCF/FWNY6OVtdmozC3Zlubfia2rvTHEtFr1pbGEm1iwAJi4SYzjvZbmFkd+4fts8AE6ePBmdO3fG7373O/zud7/Dvffei/DwcL+fzwlkTW9O3wlF1bAm8bjnEybcKW72R2ONLcykPAbAkdeLMcw7IK8wm5i1XbQ2/HzhPs8nxI4W12L1Z8YWZmLOAJjoDICpa8UYznhSbmHkN67fNg+A69atQ1hYGDIyMnDo0CH06tUL/+///T+kpHjZALgJTiBrenVyHBRVQ3iSl7cnR1wnbvYnvXQKITce34Icd5sYw2wvn0ujNjM1WrQ2/G5JoucTNvcV12JDT2MLM7Euw0UATMg+K36QGSnGcHIXuYWR37h+2zwAenLJJZdgxgz/GqJzAlnT8xO3QVE1RKadan6wvh4Y8Adxsz/n5S1icuMxAE6+X4xhZqS8wmxiQqRobaiu8PLb1rVfcQ+7AD0QLALgPmcAzN4lxnDcbXILI79x/WYAbFBbW4vFixfjV7/6FVJTU/16DieQNT01NgaKqiE2o6D5warzrm+wVpYYX5wJLY/PhaJqeG9mowAY+jg/R2mQ0ZsOQlE19F2T7PmEpe+Ka7FrmrGFmVizAHgyWYzhiL/LLYz8xvWbARBJSUn4zW9+g4suuggXX3wxwsLCvJ5bWVmJ4uLihkdubq7tJ5AVPTIqCoqqYdeRwuYHi46LG33/S8RvA6lFHgPg3BfEOO5fIq8wmxgangZF1TBovZd/2M55XlyLA0uNLczEHgzeCkXVEJ/lCIBnjnIzbZNhAGQARFVVFTIzMxEfH48ePXrgsssu8/obwKCgIHTo0KHZw84TyIqafb6nsVMp4kYffK3xhZnUCk8BcNGbYhz3zpRXmE30X5cCRdUQvCHd8wlTHxTX4tAmYwszsYdGOAPgGfGD0nzXOwN1dXKLI78wADIANvPYY4/h448/9niMvwG0h7sHi0bvKSc8bFJ8bLu4yY//p/GFmZQzAL7bOAA2bKY9UV5hNtFrVRIUVcPYiEOeTxjbWVyLHC/7BFIzzQKg20dDSuUWR35hAGQAbOaRRx5Bt27d/DqXE8iabhuwCYqqITPfw2f80jVxk5/+iPGFmZTHAMgvHhjmx2X7oagaQrZmej5h2FXiWhR4CYjUzMOOALj3mCMA1tUBQReLcSzNl1sc+YXrt80DYI8ePRATE4Njx44hKSkJPXr0wC9+8Qts3rzZr+dzAlnTTX03QFE1ZBeWNT+YsIAbvgZo5T4RAN+Zscv1ww09xDhu7ievMJv4enECFFVDaOyR5gcZXFrl3yPF54T3OAMgAAz5ixjHMx7GmS44XL9tHgA//PBDKIqCX/3qV7j88svx2GOP+R3+AE4gq7quZxgUVcPJoormB3eEiJv88g+ML8ykPAbAyIFiHMN+lFeYTXw6Px6KqmHujmPND5afdb11WVNleG1m5TEAOjc35/6gpsD12+YBUC9OIOupq6uHompQVA1nzntYELcMFjf59d8ZX5xJrUrwEABjRzm6T3wurzCb+HD2HiiqhsW7s5sfbPj26p+NL8zEHnEEwN1HGwXA8bdzc3MT4frNAKgLJ5D1VFTXNgTA0sqa5ieE/Shu8pEDjC/OpDwGwJ1TxDgu6yatLrt4Z8YuKKqGlftymx88kSCuw6h/GF+YiXncKmpKF8fm5hHyCiO/cf1mANSFE8h6isqrGwJgVY2H7RxW/E/c5LePN744k/IYAPfNFeO44HV5hdnEf6fugKJqWH/gRPODh7eK6zDpXuMLMzGPAXDmU2IsU9fIK4z8xvWbAVAXTiDrKSipbAiA9Z42el7wmrjJ75trfHEmtTrhOBRVw9uhjQJg0nIxjrOflVeYTbw0aTsUVcOmlJPND6asEtdh5tPGF2ZijzoC4M7GAXDey2IsExfKK4z8xvWbAVAXTiDrOX6uHIqq4fre4Z5PcLYwS11rbGEm5jEAHgwX4zjt3/IKs4n/jI+FomqIOujhW757Z4nrsOgN4wszscdGR0NRNew43CgALnlHjOXu6fIKI79x/WYA1IUTyHqOnj4PRdVwS7+Nnk+YeJe4yR+NMbYwE1uT6CEAHokW4xjyL3mF2cTjjrASl3m6+cFtY8R1WPWp8YWZ2OOeAuCqT8VYbhsrrzDyG9dvBkBdOIGs5+DJEiiqhn8O9LId0Ii/c6uHADkD4Fuhjb4dmbtXjOOYTvIKs4mHmm5a3NjmfuI6bOhhfGEm1hCqDzcK1doPYiy3DJZXGPmN6zcDoC6cQNaTlFsERdVwz5DI5gfr64GBl4mb/Lkc44szKY8BMD9NjOPwa+QVZhP3Do2Eomo4kHuu+cF1X4vrEDXc+MJM7IkxHn6r2hCme8orjPzG9ZsBUBdOIOuJzzoDRdXwYPDW5geryhr1+/TQJo48cgbAN6c3CoDncsQ4DrxMXmE2ceegzVBUDeknPdynlr4nrsOuqcYXZmJPjomBomrY3jgARo8QY7n2K3mFkd+4fjMA6sIJZD1xh09DUTU8Njq6+cHiE+IG3/8S8dtA8ovHAOjWgaJSXnE20CloIxRVw5GC0uYH574grsH+JcYXZmIeA+COSY4uQR/KK4z8xvWbAVAXTiDriT5UAEXV8My42OYH89Mdb1sqhtdlZmv3n4CianhjWqMAWFvjCoDnC70/mXS7oXc4FFVD7lkPva2n/Vtcg4MbjC/MxJ4aKwLgtoxGATB+jhjLhV3lFUZ+4/rNAKgLJ5D1bE49BUXV8GLI9uYHc/aIG/zYzsYXZmIeAyAADPqTGM+zx6TUZQf19fW4pofY1zK/xENv6wl3imtwzMN8J6+cATA2o8D1Q+5taSpcvxkAdeEEsh7tQB4UVcPrU3c0P5gZKW7wk7sYX5iJrfMWAPmN6nZXXVvXsLF5UVl18xNG3iCuQd4B44szMY8BkHtbmgrXbwZAXTiBrMdj2zKnlNXsmtAKzgDYdVqTUD3+djGeWR7CNrWJ85U1DQGwrMpDb+vBV4hrcOao8cWZ2NPjxObaMYcaBcCjMdzb0kS4fjMA6sIJZD1L9mRDUTV8OHtP84P75rF/bSt4DYBTHxTjeWiTnMJs4Oz5qoYAWFPbpLd1XS0/h9lKzzgCYHTjAHg83rG35S3yCiO/cf1mANSFE8h65u04BkXV8On8+OYHd07mt/xaYf0BEQD/2/Rt9Vn/EeOZvEJOYTZwqrgCiqrh2h5a84Pl5/hN7FbyGAALDvJLYibC9ZsBUBdOIOsJjT0CRdXw9eKE5gejg8UNft03xhdmYl4D4MKuYjzj58gpzAZyzpRBUTXc2MdDb+uGvRgvN74wk/PYX7kol3tbmgjXbwZAXTiBrGdSVCYUVcOPy/Y3P7ipt7jBb+pjfGEm5vxiTbMAuOIjMZ5xE+UUZgOHC0qhqBo6B3nobX0qVYx/8N+ML8zknp0gAuDWxgHQbW/LKnnFkV+4fjMA6sIJZD1jIw5BUTX0WuXhm6nOtlnRwcYXZmJev1m9/ltHG7JhcgqzgbS8YiiqhjsHRTQ/mL1LjP+424wvzOQ8BsCaKlcALD8rrzjyC9dvBkBdOIGsJ3hDOhRVQ/91Kc0PLv9A3Nx3Tja+MBPzGgA39RHjubGXnMJsYH/OOSiqhvuHbWl+MCNCjP+UB4wvzOSem7BNBMD0fPcDA/4gxrQoV05h5Deu3wyAunACWc+g9alQVA1Dw9OaH1zwmri5J8w3vjATC0tyBMApTQIge6e2uz3HRG/rh0d46G2dvFKM/6xnjC/M5J6fKALglvRT7geGXS3GND9dTmHkN67fDIC6cAJZT981yVBUDaM2HWx+cOZT4uaeusb4Z/C0EwAAIABJREFUwkzMawB0fqt62ftyCrOB7Zmit/UTYzz0tt4319G67L/GF2ZyL3gLgGNuEWOa62EXAbqgcP1mANSFE8h61BUHoKgaJkRmND84+X5xcz/s4e008ircWwBMmO/YV/E1OYXZwNb0fCiqhmcneOhtvSNEjP+Kj4wvzOScATAyrUkAnHQf7xEmwfWbAVAXTiDr+W5JIhRVw9Tow80Pju3k+Nf9XuMLMzFnAHxtSpz7gYbOKk/JKcwGNiSfhKJqeHmSh16/UcPE+K//1vjCTO6FkO1QVA0RqU0C4Iwn+S6BSXD9ZgDUhRPIej5fuA+KqmHWdg+tsYYr4uZe4OHtYfLKawDMjGBv5XbmtQsLIL58E9QR2NzX+MJM7kVHANzcNAA6Pye8b56cwshvXL8ZAHXhBLKe/83dC0XVsGBXlvuB+npgwKXi5l58Qk5xJrUhWQTAVyc3CYA5ux3bkNwqpzAbWBEvelu/O3N384NrvxTjHzPC+MJMzmsAdO4UsGOSnMLIb1y/GQB14QSynm6zdkNRNSzbm+N+oLrctcdXZYmc4kzKawBs2Ij4WjmF2cCi3aK39UdzPHxsYVk3Mf67phpel9m9NEkEwE0pJ90PrPuGe1uaBNdvBkBdOIGs583pO6GoGtYkHnc/UJrvCIAXA3V1coozKefn0F5pGgDZiqzdzYkTva0/X7Cv+cH5r4jxT1xofGEm97IjAG5sGgC5t6VpcP1mANSFE8h6Xp0cB0XVsCE5z/1A4WFxYx96pZzCTMxrAGTrrHY3PUb0tv7GU2/rGU84vrCw1vjCTM5rAIxx7G255gs5hZHfuH4zAOrCCWQ9Xjd4PZEobuyjb5JTmIltTPESAGtrXAGw7Iyc4iwuZKvobf3Tcg+9rSfd69iyxMMm0eTTKw3/UGwSAHdNFWO69D05hZHfuH4zAOrCCWQ9T42NgaJq2JZx2v3A0VhxYw/5l5zCTMwZAD1uRTLoT2Jczx4zvC47GL1Z9LbuvdpDb2tuWtxqXt8pSFwkxnTeS3IKI79x/WYA1IUTyHoeGRkFRdWw+2iT30ilh4kbe+hjcgozMZ8BcMTfxbieTDa+MBsYFi56Ww9Yl+rhoKNtWcEh4wszOa8BMG097xMmwfWbAVAXTiDruX/YFiiqhsScc+4H9i/hv+xbaZMjAL7kKQCOv12Ma5aHfepIt4GO3tbDwpv0pq2vB/pf4tjWKM/zk8mr16aIABie1GTsjsaIMZ14t5zCyG9cvxkAdeEEsp67BkdAUTWknmhyTXdPFzf2Je/IKczEfAbAqQ+Kcc3YbHxhNtBntehtPXpzk9/yVZU12taoVE5xJvb6lB1QVA1hTQPgiQQxpqP+Iacw8hvXbwZAXTiBrOfW/pugqBoy85ssirGjxY199edyCjOxzamnvAfAWf8R45q80vjCbODn5aK3dcjWTPcDJadc2xrV18spzsRen+olADp3CxjyFzmFkd+4fjMA6sIJZD3/6LMBiqoh50yZ+4GI/uLGHq7KKczEnAHwxRAPAXBhVzGu8XOML8wGvnX0tp4ec8T9wOlMx7ZGV8kpzOScAVA70CQAnj/t+s1qXa2c4sgvXL8ZAHXhBLKev/UMg6JqOFVc4X5A+0Hc1LcMllOYifkMgCs+crTOCjG+MBv4fIHobT27aW/r4/sc2xrdLKcwk/uvIwCuP9CkLWRNpSsAlp/z/GS6IHD9ZgDUhRPIWmrr6qGoGhRVw5nzTTYmXvmxuKlvHy+nOBOLcATAFzwFwPXfsnVWO/pojuhtvXBXtvuBI9Hc1kiHrtO8BEBAdLYJ6ig63dAFi+s3A6AunEDWUl5V2xAASytr3A8uelPc1PfOklOcifkMgGyd1a7enSl6Wy+Pz3U/wO1KdHEGwHX7PQTA4L+JsT2VYnxh5Deu3wyAunACWUtRWXVDAKyqadLvd/az4qaetFxOcSYWmeYjAEY7Wmet/cr4wmzAGVTWNg0q3LBYlzem7fQ8roBra6PsncYXRn7j+s0AqAsnkLXkl1Q0BMD6pt+MnPawuKkf2iSjNFNrCIATtzU/uHOyGNflHxhfmA14b1k2zdGy7F05hZncm9NFAFyTeLz5QefWRrxXXNC4fjMA6sIJZC25Z8ugqBqu7x3e/OCEO7hhcSv5DIAJ88W4LnjN+MJs4LkJorf11vR89wOxo8S4r+G2Rq3hMwDy3QJT4PrNAKgLJ5C1HD19HoqqoVO/jc0PjryeLctaaUu6CIDPewqAqWvFuM54wvjCbODJMaK39fbMJr2tI4LEuG/oIaMs03sr1EcAbPi88EzjCyO/cf1mANSFE8haDp4sgaJquGOgh64Ug/8sbupnjjY/Rj75DIDO1ln8Nmq7+Lejt/WeY016W2vfc1sjHd4O3QVF1bA6wUMAXPWJY8eAccYXRn7j+s0AqAsnkLUk5RZBUTXcOzTS/UBdnWtvr/OnPT+ZvNqang9F1fDcBA8BMG+/GNeRNxhfmA147W3tDCnbxsopzOR8BsCwH8XYRg40vjDyG9dvBkBdOIGsJT7rDBRVw0MjtrofqCx1BcDqcjnFmZjPAHg2S4zroD8ZX5gN3DnIS2/rJW+Lcd89XU5hJvfODBEAVyXkNj8YOVCMbdhPxhdGfuP6zQCoCyeQtcQdPg1F1fD46Gj3A+ybqsvWgz4CYPk5V7iuqTS+OIvrHLTRc2/reS+LMU9cJKcwk3MGwJX7PATAbWPF2K76xPjCyG9cvxkAdeEEspYoR1D5z/hY9wMNDd7/Kqcwk3MGwGcnxDY/WFcngnVQR6A0v/lx0sVrb+sZT4oxT10jpzCT8xkA984UY7v4LeMLI79x/WYA1IUTyFo2pZyEomp4aVKTDYtPJvFzajr4DIAAMOwqMb4Fh4wtzAa89rae3EWMeWaEnMJMztlhZUXTDiuA2P4lqKPYDoYuWFy/GQB14QSylvUHTkBRNfx3apO9/rJ3ihv6+NvlFGZyXn+z6jS2kxjfnD3GFmZxjXtbn23a25rdKnR5z1uLPUBsAB3UEZj6kPGFkd+4fjMA6sIJZC0r9+VCUTW8M2OX+4HMCHFDn9JFTmEm12IAnPKAGN8MD9vvUKs17m19vmlva+e+lnkH5BRnct1m+QiAWTv4D0YT4PrNAKgLJ5C1LN6dDUXV8NGcJr+JSl0jbugzn5JTmMlFHyrwHQDZOaFdNO5tXV3bpLf1kL+KMS88LKc4k3MGwGV7c5ofPJUixnbEdcYXRn7j+s0AqAsnkLXM3XEMiqrhswXx7gcSF4kb+ryX5RRmcs4A+Mw4LwHQuSXJnlBjC7M4r72t6+tdX7wpOen9Bcir9x0BcKmnAHguW4ztwMuNL4z8xvWbAVAXTiBrCY09AkXV8PXiBPcDu6eLG/qSd+QUZnItBsA1n4vxjRlpbGEW57W3dVWZa+udyhI5xZncB7P3eA+AFcXcN9QEuH4zAOrCCWQtIVszoagafly23/1Aw75en8opzORiHAHwaW8BcGMvMb6b+hhbmMUdKSj13Nv6/GlXQKmrlVOcyTUEwD0eAmB9PdD/EjG+xXnGF0d+4frNAKgLJ5C1jNl8CIqqodeqJPcDW4eIm7n2g5zCTK7FABg9Qozv2i+NLczivPa2PnuM3Vd0+tARAJfsyfZ8QvC1YoxPpRpbGPmN6zcDoC6cQNYyfEM6FFVD/3Up7gecv6Ha3FdOYSYXm9FCAHS+xb70XWMLszivva2dX1II/pucwizgozktBMAJd4gxPrbd83GSjus3A6AunEDWMnB9KhRVw9DwNPcD674WN/PoYDmFmZwzAD41NsbzCQeWivGd87yxhVmc197WOXvEeI/tLKcwC3AGwMW7vQTA0MfEGKetN7Yw8hvXb5sHwKFDh+Kuu+7Cb3/7W1x++eV48cUXcfDgQb+fzwlkLX3XJENRNYze1GQOrPhI3Mx3hMgpzORaDIDcOLddeO1tfXirGO9J98opzAI+mrMXiqphkbcAuOA1McYJ840tjPzG9dvmAfCpp57C7NmzkZKSgv379+M///kPrr76apw/f96v53MCWYu64gAUVcPELRnuBxa9KW7me2fJKczktmWc9h0As3eJ8R13q7GFWZxzA+5m375OWy/GO/QxOYVZwP/migC4cJeXALjif2KM4yYYWxj5jeu3zQNgUwUFBejQoQNiYrwsVE1wAlnLd0sSoagapsU02Rx3zvPiZn5gmZzCTK7FAJifLsZ3uGJoXVbn7G39YkiTz6E533Kf+4KcwiygxQAY9pMY48gBxhZGfuP6zQDoJjMzEx06dEBycrLH45WVlSguLm545Obm2n4CWcnnC/dBUTXM3n7U/cD0R8XNPD1MTmEmtz1TBMAnx3gJgCUnxfj2/z1QV+f5HAqYs7f16017W++dKcZ70ZtyCrOA7o4AuGBXlucTtg4VY7z+O2MLI78xADIANqirq8Ozzz6LLl2893sNCgpChw4dmj3sPIGsxOu/6ifdK27mR6JklGV6LQbA6nLXvnQV/G+prXjtbR03UYz1iv/JKcwCPp4n7hXzd3oJgDsnizFe9r6xhZHfGAAZABt8+umnUBQFubkemns78DeA1vbeTC8N3sd2Ejfz3L1yCjO5uJYCICDaZgV1FG20qE0s2SN6W384u0lv66jhYqzXfSOnMAv4ZF687wC4f7HjbfYXjS2M/MYAyAAIAPjiiy9w5ZVX4ujRoy2f3AgnkLW8MW0nFFXD2v0n3A84N3XNT/P8RPLJGQCfGBPt/aQRfxdjfDLJ+zkUkHmO3tafzm/S23pTHzHWG3vJKcwCnAFwnrcAeGgjv9l+geP6bfMAWF9fjy+++AJ/+ctfkJGR0fITmuAEspZXJsdBUTVsSD7pfmDQH8XN/KyXmz355FcAnHiXY+PcbcYVZnFee1tr34ux3jpETmEW8Ol8RwDccczzCTm7+c32CxzXb5sHwM8++wwXX3wxoqOjcfLkyYZHebl/Dbw5gazluQnboKgatqbnu35YV+v6fNr5QnnFmZjX/ega48a5bW5SlJfe1qs+EWO9baycwizgswUtBMCCQ2KMh11laF3kP67fNg+Anr7Q0aFDB8yePduv53MCWcuTY2KgqBq2Z552/bCi2BUAqyvkFWdifgXA+a86Ns5dYFxhFjc2QvS27tm0t/WSt8VY754upzALcAbAud4CYGmB675RV2tobeQfrt82D4B6cQJZy79HRkFRNew5dsb1w+I8xxYllwD19fKKM7EdhwtbDoDLP2S3lTYW7OhtHbS2SW/reS+LsU5cJKcwC/h8gdgyak7cMc8n1Fa7AmDZGc/nkFRcvxkAdeEEspb7h22BompIzDnn+uHpTHETH3qlvMJMzhkAH/MVANd/J8Z5y2DjCrO4Qc7e1mFNvrw040kx1qlr5BRmAc49Q70GQAAY8hcxzoWHvZ9D0nD9ZgDUhRPIWu4cFAFF1ZB6otH1zNsvbuKjbpRXmMn5FQC3DBbjrH1vXGEW5+xtPappb+vJXcRYZ0bIKcwCvG4a39iYWxzbR8V7P4ek4frNAKgLJ5C1dA7aCEXVkJlf6vphVpy4iU+4Q15hJrfziAiAj46K8nHSFMfGud2MKsvyeqwUva0nRDbZ4WD87WKss3fKKcwCvnAEwFm+AuAUR9DOYNC+EHH9ZgDUhRPIWm7sEw5F1ZBzpsz1w4zN4iY+5QF5hZmcXwHwwDIxznOeM6wuq/tuqehtPTW6yVuQI68XY513QE5hFvDlooSWA+Cc59hD/ALG9ZsBUBdOIGu5tocGRdVwqrjRt31TVoub+Myn5RVmcrscAfARXwEwM1KM8+T7DavL6rz+lmrIX/nZNJ2cAXDmNh8BcMk7/Lb1BYzrNwOgLpxA1lFTWwdFFQHw7Pkq14GEBeImPv9VecWZnF8B8EQiP2vZxro7elsv2NVoA/P6eiDoYjHWJafkFWdyXzkC4AxfAXDtV2Kco4ONK4z8xvWbAVAXTiDrKK+qbQiA5ytrXAd2TRM38aXvySvO5PwKgOdyxDgPvIzb7bSRbrNEb+ule3NcP6wqc21PUlkirziT+3qxCIChsUe8n7S5nxjnDT2MK4z8xvWbAVAXTiDrKCqrbgiA1bV1rgOxo8VNfPVn8oozud1Hz4gAODLK+0kMJm3uzemit/WaxOOuH54/zQ2K24BfAXDbGDHOqz41rjDyG9dvBkBdOIGsI7+kAoqq4ZoeGuob/wZqyyBxEw/7UV5xJudXAASAQX9y9Fw+ZkRZlveqo7d1eFKe64dnj4kxHvxnaXVZwTf+BMD42WKsF3Y1rC7yH9dvBkBdOIGsI/dsGRRVww29w90PbOghbuIRQTLKsoQ9x0QA/HdLAXD0zWKsj3PftLbwwkTR2zoyrdFn/U6liDEO/pu8wizg2yXiG9bTY3wEwNQ1YqxnPGFcYeQ3rt8MgLpwAlnHkYJSKKqGTkEb3Q+s/dLxQe4RcgqzAL8D4JQHHPumbTakLqt7aqzobR2bUeD6Yc4eMcZjO8srzAK+8ycAHtvGPUQvYFy/GQB14QSyjvSTxVBUDXcOahI+ln/g6FE7SU5hFrDX3wA47yUx1vsXG1KX1T0ySvS23nWk0PXDw1vFGE+6V15hFuAMgNNifGylU3BQjPWwq40rjPzG9ZsBUBdOIOs4kHsOiqrhvqGR7gcWdhU38fg5cgqzAGcAfHjEVt8nrvhIjHXcRGMKs7guw0Vv64Tss64fpq0XYxz6mLzCLMDrJtuNnS90feGmpsr7eSQF128GQF04gazDa0iZ/ay4gSctl1OYBfgdAMN/dnzesr8xhVnc3YNFb+uUE0WuHx5YKsZ47gvyCrOA75fubzkA1tUB/X8vxrs4z/t5JAXXbwZAXTiBrCMu8zQUVcMTY6LdD0z7t7iBHwz3/ERqUXyWCIAPtRQAo4PFWK/9ypjCLO62AZugqBoyTjXaVmfvTDHGi96UV5gFOAPgFF8BEABG/F2M98kkYwojv3H9ZgDUhRPIOrYezIeianh2Qqz7gYl3ixv40Rg5hVmA3wFwT6gY68VvGVOYxd3UdwMUVUNW4XnXD+MmiDFe2V1eYRbwwzIRACdHtRAAJ90rxvvwFmMKI79x/WYA1IUTyDo2ppyEomp4adJ29wNjbuHWJDrFZ531LwCmrGLf5TZ0Xc8wKKqGvKJy1w+jhokxXv+tvMIs4Ed/A+Cc58R4H1hqTGHkN67fDIC6cAJZx7r9J6CoGv47dYf7geGKuIEXHJRSlxU4A+CDwS0EwKMxYqwn3m1MYRZWV1ff0NmmsLTSdWBTbzHGm3rLK84CnAFwUlSm7xOXvc9dBC5QXL8ZAHXhBLKOFfG5UFQN78zY5X5g4GXiBn4ux/MTqUV+B0BuUtxmKqpdva1LKqpdB9Z/K8Y4api84izgp+UiAIZsbSEAhv3ELzZdoLh+MwDqwglkHYt2Z0NRNXw0Z4/rh7XVrm0cys7IK87k9mWLAPhAcAufgyo5Kca6/+/FNyip1YorXL2tK2sa9fxd2d2x1c4EecVZwM/LD/gXAKNHOL7Y9KUxhZHfuH4zAOrCCWQdc+KOQVE1fLag0Wf9ys9xH6824HcArKli4G4jp0srGwKgW2/rxW+J8d07U15xFuB3AGz41vUbxhRGfuP6zQCoCyeQdUyPOQJF1fDN4gTXD4uOi5v3gD/IK8wCEhwBsMtwP74JOfRKMeanW1hYyacT58qhqBqu79Vk+6K5L/BLCW1AXSEC4MQtGb5PTFvHjbcvUFy/GQB14QSyjpCtmVBUDT8t3+/6YcEhRyunq+QVZgEBBcBxt4kxz97V8rnk1bHT56GoGm7uu8H9QOhjYnz/f3t3Hl1FlecBPI4jzOk5B5geN9C21FZoW9RW2tjqjEsDaotC29Nit63SLqiNjvZ0q8Ue1iQkEPZ9i0hCCEsgFAESCATIQggkkA0IIUAIEMKSEEIW8vKdP+57qYRFXlJVr/Lu+37OqT+45L383q1L3S/1qm7la/YUJonBq0QAnLb5JgHwWKro7ylPeKYwchvnbwZAQziA5BEWfxCKqmFYTJMFW0v2ioP3pEfsK0wCLQqA837LgGKCg6cvQlE1/Gr0puZ/4VqXrnCrHWVJY/Cq/e4FwLIC0d/j7/FMYeQ2zt8MgIZwAMkjeEM+FFXD6NhcvbFoh3NZkl/bV5gEMo+L5yw/F+RGAIz8E69RM0H2iXIoqgb/8QnN/2Jyd9G/xbvtKUwSrgA49WYBsOl1xHXVnimO3ML5mwHQEA4geYxZlwtF1RAUl683HtwoDtxzXrCvMAm0KADGfsVlSkxwwxtvJjwg+rc0z57CJDFktQiAUxJuEgAbGsQ1xAEdgPJizxRHbuH8zQBoCAeQPIbHZENRNUyKP6g3Zq8UB+5Fr9tXmASyWhIAEwNFn8d+bX1hEkstPAtF1fDbiVub/8XYO53rWh6zpS5ZDHU3AALAxG6iz0v23vxnyWM4fzMAGsIBJI/rLuuwZ4k4cC99277CJNCiAJi+wLlsxp+tL0xiSQfPQFE1vDalybOt669wmR2TuALg5ISDN//h2c+LPj+UcPOfJY/h/M0AaAgHkDz+HpUJRdUwL6lQb0ydLQ7c0X+1rzAJ7CtuQQDM10Sfz3vZ+sIklpB7Goqqoe+MJs+2ri5vsq5lzY1fTDc1LEYEwLB4NwLg9/1En2dGWl8YuY3zNwOgIRxA8hi0dA8UVUN4cpHemBQqDtxrBtlWlwxcAfDZwM03/+Hi3c47r39pfWESW7//JBRVwx9nJ+uNFSXOdS1/Kq5No1ZzXTLiVgBc+Yno951TrS+M3Mb5mwHQEA4geXwcvhuKqiFyV5NroxJGiQN33Hf2FSaBFgXAC8f1xbcZUlotZu8JKKqGd+en6o1lh7iupUmue83wjWwYIvo9foT1hZHbOH8zABrCASSP9xfugqJqWJnR5E69uO/EgXvzaPsKk8D+YrEkyW/cCYBXanidmgmWpx+Homr466JdeiPXtTTNiDXOALjpwM1/eEeY6PdVn1pfGLmN8zcDoCEcQPJ4Z24KFFXD2qwSvXHNIHHg3j7RvsIk0KIACADBCpcqMWhJ6lEoqoZPlzRZ7+/Idq5raZKRLQmAWctEv4e/aX1h5DbO3wyAhnAAyeOtmTuhqBo2ZJ/SG6MHiAN36mzb6pKBa1FitwPgDH/R74cTrS1MYgt3HIGiavgyssnSIwc2iH6d+6JdZUnDFQAnuhMAC7c5g/fT1hdGbuP8zQBoCAeQPPpM2w5F1ZCYX6o3Lv2jOHDvWWJfYRJwBcBnxrsZAMPfFP2etczawiQ2e9thKKqGfyxv8mzr/StEvy7uY19hkghYmwNF1RC60Y0A6HqmeOC91hdGbuP8zQBoCAeQPHqHbYOiathZUKY3LnpdHLizV9lXmARaHABXDXTeNTnF2sIkNnXzISiqhsGrmjzbOiNc9GtEf/sKk0SLAmB1hX5da02l9cWRWzh/MwAawgEkjxdDEqGoGtKLmtx4MOcFcdA+uMm+wiRww+fS3simYaLfNwyxtjCJhW48AEXVELA2R29MmSn6dcWH9hUmCVcADNmYf/MfBoDxXUTfnz1sbWHkNs7fDICGcADJ49nAzVBUDVnHL+iN03qIg3bRDvsKk0CLA2DydGdQ+cjawiQ2fn0eFFXDOC1Xb9wWIvp17Zf2FSaJUbEiAE7Y4GYAnPaU6Psj22/+s+QRnL8ZAA3hAJJHj7EJUFQNeSeb7MtJj/AZnibIKREB8OlxbgbAfdG8Vs2g656hih/pPLM62L7CJDE6NheKqiHY3QC4uI/o+33R1hZGbuP8zQBoCAeQPB4L2AhF1XD4TJNrdIJ+Jg7aZW488J1uqMUB8EgSlysxaPAq8aiyKQlNxq72T9GvW8baV5gkxqxrYQBsfBoIr2ttKzh/MwAawgEkj27D46CoGo6fqxINDQ3ikVkBHYDyE/YW5+VaHADPHHDeNcknVrTWP5ZnQVE1zNra5Jqz1Z+Lft0RZl9hknAFwKA4NwPgpuE8+9rGcP5mADSEA0geDwzWoKgaSiuqRUPTJ1JcvvDjL6YflVtSAUXV8Gt3A+DlC3rf1122tjhJ/W/kXiiqhgU7juiNUe+JPt01z77CJDHWGQAD49xcrDx1luj75R9YWxi5jfM3A6AhHEByuFLvgKKKAHihqlY0Vp3TQ0h9nb0FerkWB8CGBmDsnaLvzxVaW5ykPluSAUXVsCT1qN645C3Rp5mR9hUmiXFaCwNgzmrR9wtesbYwchvnbwZAQziA5FBVe6UxAFbVXhGNF46LA/aYO+wtTgJ5J0UA7DHWzQAIAFOf5B3YBny4OB2KqmF5+nG9ccErok9z19pXmCQaA+B6NwPgsTTR95Mfs7YwchvnbwZAQziA5HChqrYxAF6pd4jG0nxxwA5WbK1NBq0KgHwaiCF/mZ8GRdUQs7fJ9auznhd9WuDmgtx0Q65ldsa7GwDPH9X/Q9nQYG1x5BbO3wyAhnAAyaG0ohqKquGBwZreWJwhDthhj9pXmCTyT7UiAMYMEv2fFGJdYRJ7e3YKFFWDtu+k3jjlCdGnx9LsK0wSgS0NgE2vKa46d/OfJ8tx/mYANIQDSA7Hz1VBUTV0Gx6nN7qWIpnhb19hktADYLz7L0oMFP0f+5V1hUms74ydUFQN8bmn9caQh0Sfnsq2rzBJBF5voe2bmfAA+78N4fzNAGgIB5AcDp+phKJqeCxgo954IE4crOe9bF9hkmhVANyzRPT/D3+wrjCJvTZlOxRVw7aDZ/TGcZ2dN9YcufELyS2BcSIAjl3XggA46znR/4dacCacLMP5mwHQEA4gOejXqDUJKPtX8GkUJjlw6iIUVcNTY1oQAA8n8gysAT0nbYOiakg5fFY0OBz6V5CVZ378xXRTQXH5LQ+AP/yP6P+McOsKI7dx/mYANIQDSA5Zxy9AUTU8G9jk4viMxeJgHfGObXXJolUBsKxA9P/4LrxovhX+e0LjB0v+AAAgAElEQVQiFFVDxtHzoqGmUg+AtVX2FicBVwAc05IAuO7vfBJLG8L5mwHQEA4gOaQXnYOiangxJFFvTJ4uDtYrPrKvMEkcPN2KAFh3uclC3OetK05Sz4zfDEXVkH2iXDRcPO3sz44M1CYI3iAC4OjYFgTAHWFiH6waaF1h5DbO3wyAhnAAyWFnQRkUVUPvsG16o+smhHV/t68wSbgC4JMtCYAAMOFB50Xz+60pTGJPjomHomo4ePqiaDh72HlG9R57C5PEhNYEwOxVXAy6DeH8zQBoCAeQHBLzS6GoGvpM2643bhgiDtbxI+wrTBKtDoBzXhD74EDczX+Wmnl05EYoqoaiskui4WSW6MvQh+0tTBIhG0UAHBWb4/6LXEtLTfyFdYWR2zh/MwAawgEkhw3Zp6CoGt6auVNvXPMF16EzySFnAPzV6E0te+Gyd/ns2lZ6eGgcFFXDiQvOZykX7RB9Oa2HvYVJwhUAA9a2IABWntG/hr9SY11x5BbO3wyAhnAAySE2qwSKquGduSl64/IPxME6ba59hUmi1QEwTuVZ2FZoaGhofLLNmYvOoOFa1mjuS/YWJ4nQjQdaHgAbGoBxd4v9cPawdcWRWzh/MwAawgEkh5UZxVBUDe8v3KU3LnlLHKgzI+0rTBIFpSIAPtHSANh4I86H1hQmqZor9Y0BsPxynWjMihJ9+X1fe4uTxMRNrQiAgFjWKKADcHiLNYWR2zh/+3gATEpKwhtvvIHOnTvDz88PMTExLXo9B5AcIncdg6Jq+Dh8t944v5c4UOets68wSbQ6AObEOC+a721NYZKqrLnSGACr6+pF4655oi+j/mJvcZJwBcCRa1r4VI+lf3SuBbjYkrrIfZy/fTwAxsXFYdiwYVi9ejUDoA8LTy6ComoYtHSP3uj6n3rhthu/kNzS6gDIi+Zb5dyl2sYA6HA4l3zZPkn0Zcwge4uTxCRnABzR0gCo/VPsh82jrSmM3Mb528cDYFMMgL5rXlIhFFXD36My9cZJj4gD9Yk9N34huaWgVDxq7/FRLQyAl8r0tQDrLltTnIROlVdDUTX8fMh6vTEhQPRjnGpXWVKZFH+wdQFw51SuL9pGcP5mAGzkTgCsqalBRUVF41ZcXOzzA0gGMxILoKgavluxT28MvFccqMsK7CtMEq0OgA0N+n4ozbOmOAkdO1sFRdXwyIgNeqP2D+dTKMbZV5hEXAFweEwLA6Drsob5vawpjNzGAMgA2MidABgQEAA/P79rNl8eQDK45mDucIilGgI6AJWl9hYngcNnRAB8LGBjy1/sWgswXzO/MEld9yv3lZ+IfkyeZl9hEglzHjOGxbRwkfKSvc71GLtaUxi5jQGQAbARzwD6rmue61lzkV89mshQAFzxodgPO6eaX5ikckrKoagafj0uQW+MeIc3H5hockIrA2DVOR5b2ggGQAbARrwG0HeNjs2FomoI3pAvGipKxAF69E/53FQTFBoJgFvGin0R+5X5hUlq77HzUFQNzwU1WWpk0euiH7NX2VeYRFwBcOjqFgbAhgZgfBexL84ctKY4cgvnbwbARgyAvmtYzH4oqoaweOcBuTRfHKCDFVvrkoUrAHZvTQDMjBT7IvwN8wuTVFrhWSiqhpdDt+qNs58X/Xgo4YavI/dNSTgERdUwpKUBEND3BR9xaCvO3z4eACsrK5GZmYnMzEz4+fkhLCwMmZmZOHbsmFuv5wCSw7crsqCoGmYkOm/4OJ4uDtCTu9tbmCQMBcBjaWJfTPql+YVJasehMiiqhlcnJ+mNUx4X/Xh8141fSG6butlAAIz+Ky9raAM4f/t4ANy6det1b+oYMGCAW6/nAJLD18v2QlE1zEsqFA0Fm8UBetbz9hYmiSNll0QAHNmKAMilYFpsS/5pKKqGN6fv0BuD7+fd1CZyBcDBq1oRABMDxb5Y84X5hZHbOH/7eAA0igNIDn9bmgFF1RCeXCQaXEs1LHzN1rpkYSgAcimYFtuQfRKKquF/ZiWLhoYGYPR/ij4sL7a3OElMawyA+27+w1fbv8J5fHnV/MLIbZy/GQAN4QCSw8fh6VBUDZG7nF/971kiDtBL37a3MEkUGQmAAJeCaaE1mSegqBr+PC9VNNRV62dRq3msMsP0LQYC4MkssS8mPGB+YeQ2zt8MgIZwAMnhvQVpUFQNKzOcZ0dSZnK1fhO5AuCjrQ2AXAqmRaJ3H4eiavhgofN6v8pSZwDsKNa4JMNci8erK1sRAGsv6YG86pz5xZFbOH8zABrCASSH/nNSoKgaYrNKRMPWYOfSI1/bW5gkDAdALgXTIkvTjkJRNXzy/W7RcPaw6L/Ae+0tTCLXfXpQS0z6pdgnx9LMLYzcxvmbAdAQDiA5vDVzJxRVw8acU6Jh41BxcN403N7CJHH0rAiAv2z6aLKWcC0Fs+h1cwuT1KKdR6CoGgZFOJ9jfWKP807qR+wtTCKGA+D3fcU+2fuDuYWR2zh/MwAawgEkhz7TtkNRNSQecD72be2X4uCcFGJvYZIwHABdj88Kvp8Lc7thzrbDUFQN/xeVKRoKt4n+m/GMvYVJZOZWEQC/XZHVujdY/43YJ/EjzC2M3Mb5mwHQEA4gOfQO2wZF1ZBcUCYaogeIg3PaHFvrksWxs1VQVA2PtDYA1l3Wn8188bS5xUnIdYNC4/VpebGi7+b3srcwibgC4DfRrQyAaXPFPon8s7mFkds4fzMAGsIBJIcXQxKhqBp2FzkvyP7hD+LgnBlhb2GSMBwAAWDqk2KfHN5y85/1cZM2HYCiahixJls0ZEaIvlvylr2FSWTWVnGW9Z+tDYCHt4h9Mq2HuYWR2zh/MwAawgEkh2cDN0NRNewrviAaFvQWB+e8WHsLk4QpATDqL2KfpMwwrzBJBcblQVE1jF2XKxrS5oi+ix5ga10ymb3NYAAsL9afN36lxtziyC2cvxkADeEAkkOPsfFQVA35p5z7ceZvxMG5cKudZUnj+DkRAH8x3EAAdD09IWaQeYVJalRsDhRVw4QN+aJhW4jou7Vf2luYRFwB8B/LWxkAGxqAoJ+J/XKylTeSkCGcvxkADeEAkkP3gI1QVA2FZypFQ9ij4sB8IsPewiRhSgDMXSP2ydwXzSpLWkNX74eiagiLPygaNg0XfbdxqL2FSaTxRpvlma1/k8V9nHcCLzWvMHIb528GQEM4gOTQdVgcFFVD8fkq0RDo/J95WYG9hUnCFQC7DY9r/ZuUFYh9MvYuwFFvXnES+iY6C4qqYUaic/zGfiX6bmuwvYVJZG6SCQFww2CxX+JU8wojt3H+ZgA0hAPI+zU0NOD+wRoUVUPpxWrx1QzvODWVKQHQUQ+MvVPsl7OHzStOQl8t2wtF1TB/e6FocD1JJXWWvYVJpDEARhkIgK6bcxb9zrzCyG2cvxkADeEA8n519Q4oqgiA5VV1QE2l/pim2iq7y5NC8XkTAiAAzPlv3pzjhs9/yICiavg+pUg0LP0jFx022bykQiiqhr8bCYCn9utPaOH6lh7H+ZsB0BAOIO93qeZKYwCsqr0CVJwUB+VR/8GDsklcAbDrMIMBcPXnzq8yg8wpTFIfh6dDUTUs23VMNCx4RfRb7hp7C5PI/O0mBMArtcCY28W+OV9kWm3kHs7fDICGcAB5v/OXahsD4JV6B3DmoDggB91nd2nSMC0Aps4W+yaivzmFSeq9BWlQVA2r9hSLhpnPOtdQTLS3MIm4AuDXy/Yae6PZ/8Wz2jbh/M0AaAgHkPc7XVENRdXwwGBNNBTvFgfksO72FiaRExcuQ1E1PGw0AB5PF/tmwoM8O/sj+s9JgaJqWLevRDS47mov5l3tZnEFwK+MBsCYQWLfJI43pzByG+dvBkBDOIC83zU3KBxKEAfk2c/bW5hETAuAddXA6P/kV2Y38fuZO6GoGjblnBINrvXmyg7ZW5hEFuw4Yk4AbDyr/Y45hZHbOH8zABrCAeT9CkoroagaHgvYKBr2rxAH5MV97C1MIiVmBUAAmPuS2D/ZK42/l6Ren7odiqoh8UCpOFM6qpPzrvZTdpcmjYXOAPi/kQYD4NEUsW9CHuJZbQ/j/M0AaAgHkPfLLamAomroMTZBNOyaJw7IUX+xtzCJNAbAoSYEQO2fYv9sGGL8vSTVa9I2KKqG5IIyoLpcv6u9rtru0qThCoBfGg2AdZf1s9rnCs0pjtzC+ZsB0BAOIO+XdfwCFFXDc0FbREOS87FZa76wtzCJmBoAs5aJ/bOgt/H3ktQLIYlQVA27i84B54/qC2iTaRbtNCkAAsD8nmIfZUYafy9yG+dvBkBDOIC8X3rROSiqhpdCt4qGjUPFwXjTMFvrksnJchEAHxq63vibNT4R5E6gvs74+0no2cDNUFQN+4ovACWZor8mdrO7LKksdgbALyL2GH8z1zEn9ivj70Vu4/zNAGgIB5D321lQBkXV8EpYkmhY47wrLynU3sIkYmoAdDj0mxpKDKzBJrEeY+OhqBryT1WIpV8COgAzf2N3WVJxBcBBZgTAvFjuIxtw/mYANIQDyPsl5pdCUTW8MW2HaFj2rjgYp8+3tzCJnCoXS+38fIgJARAAlrzFR5v9iO4BG6GoGgrPVAI5q0VfLXzN7rKkEp5cJALgUhMCYGWp8zrNjsDlC8bfj9zC+ZsB0BAOIO+3IfsUFFXDH2Yli4ZFr4uD8f4V9hYmEdMD4I4wsY8i/2TO+0mm67A4KKqG4vNVwO6Fzr76s91lSeX7FBMDIABM/ZXYT4fizXk/uinO3wyAhnAAeb+1WSVQVA1/mpsqGmY9Jw7EBQn2FiYR12LbpgXAE3v0Z6jWXzHnPSXR0NCA+weLJ9uUXqwGtk8SfRXzN7tLk4orAP5tqUmLa7sec7h5tDnvRzfF+ZsB0BAOIO+3IqMYiqrhg4W7RMOkX/KpCSZzBcAHzQqAjnr9OsDi3ea8pyTq6h2Njza8UFULbBou+mnjULtLk8oSZwD8/AeTjhN7loj9NO+35rwf3RTnbwZAQziAvF9E2jEoqoZPvncGifFdxIH47GF7C5OI6QEQ0K/V3D7RvPeUwKWaK40BsKr2CrD2S9FP20LsLk0qS1KPmhsAK0r06wCrzpnznvSjOH8zABrCAeT9mt3NV1+nL5p76azdpUmj9OrnLZshba7YT+FvmveeEjh/qbYxAF6pd4gFzQM6iAXOyTSuAPjZEhO/KZj5LK8/9iDO3wyAhnAAeb+5SYehqBr+LyoTuFSmB0BeW2YaSwLgmQP6eoB8wkWja/p6cR+GCgv84AyAny4x8RKETcPEvlr9uXnvSTfE+ZsB0BAOIO83fcshKKqG71bsA8oO6TcXkGlKL1oQABsagIm/EPvr4Cbz3tfLHT9XBUXV0G2486krs57nTU0WWJpmQQAs3Ko/F9jhMO996bo4fzMAGsIB5P0mbToARdUwPCZbfzD7lCfsLksqrgB4v5kBENCfC8zH9jU6fKYSiqrhsYCNooE3NVnCde3wwO9NDIBXaoBxd4v9dXKfee9L18X5mwHQEA4g7xcYlwdF1TBmXS6Qt4534lnAsgBYuFXsrwkPiDuDCXknK6CoGnqMdZ7xG3uX6KNzR+wtTDLX3Dxm2hv3F/tra5C570vX4PzNAGgIB5D3GxWbA0XVELwhH8gIFwffiP52lyWVMxdrGm9MMFV9HRCsiH1WtMPc9/ZSWccvQFE1PBe0Bai9pF/TWnPR7tKkErnLogCYGSH21/SnxWUOZBnO3wyAhnAAeb+hq/dDUTWExR/korkWsSwAAvoCunGq+e/thdKLzkFRNbwYkgicPyr6ZswdDBMmW+YMgB+HmxwAq8uBMbeL/XY6x9z3pmY4fzMAGsIB5P2+ic6ComqYkVggFssN6CDuxiPTlFVaGADz14t9NukRXjgPYGdBGRRVQ++wbcCJDL1vyFR6AEy34M3f5VNBPIDzNwOgIRxA3u/rZXuhqBrmby/UzybtCLO7LKlYGgDrqvWnghzeYv77e5nE/FIoqoY+07aLu6MDOgCz/8vusqQTlW5hAMxe6bwZ7XGeubUQ528GQEM4gLzf35ZmQFE1fJ9SBCz9ozjw7llid1lSsTQAAsD6b8R+ix5gzft7kY05p6CoGt6auRPIjBT98n0/u8uSzvL041BUDR8ttiAA1l7S7wY+lmb++xMAzt8AA6AhHEDe7+PwdCiqhmW7jgHzXhYH3XwTH1lGONskADZYcUbj5D6x30b/p88/wSU2qwSKquGduSlA8jTRLys/trss6bgC4IdWBEBAXIcc0AFY+Yk170+cv8EAaAgHkPd7b0EaFFXDqj3F4isX/q/bdJYHQACY84LYdykzrHl/L7EyoxiKquH9hbuA+JG8QcYiy3eLAPjXRbus+QUn9jhv4LkdqDxjze/wcZy/GQAN4QDyfv3npEBRNazbVyKeABLQASgrsLssqZxr8nxah8OiAJi+QF/E24cf4xfZ9O7UNYNEnySF2F2WdKKtDoCA/o1EUqh1v8OHcf5mADSEA8j7/X7mTiiqhvh9x/Q10y6ft7ssqXgkANZUAsH3+/xzb8OTi6CoGv62NAOIeEf0x+5FdpclHVcAHGBlAMxapt/FfaXWut/jozh/MwAawgHk/V6fuh2KqiE1Yw/XTLPIeU8EQADYGiz24aznfHYfzksqhKJq+HrZXmB+T9EfebF2lyWdFc6v2j9YaGEArKsGQh8W+zB9gXW/x0dx/mYANIQDyPv1mrQNiqphX6pzyYzJ3e0uSTpNA2C9lQGw6hwwvovYjwc2WPd72rAZiQVQVA3frsgCwrqLvjhu0Y0KPmylJwIgAKTNEftw4i9EICTTcP5mADSEA8j7vRCSCEXVcHjbUnGgnd/L7pKk47EACACbhov9OOMZn7wWcFL8QSiqhuGrs8Rd0QEdgAvH7S5LOs1utrFSXbX4CjigA5A629rf5WM4fzMAGsIB5P1+E7gZiqqhZOMUcZCNes/ukqRzoUoPgFfqLX5ax+Xz+rWAaXOt/V1t0Jh1uVBUDVPW7nRe09pRPDOZTLVqjwiA7y3wwIoBuxeKfRl8v88vc2Qmzt8MgIZwAHm/p8bEQ1E1lK1xPgZu/Td2lyQdjwZAAEifL/Zl0H0+N2GqK/eJdS3XrhN9EPKQ3SVJafVeDwbA+jpxXWtAB/G0IjIF528GQEM4gLxf95EboagaLi77RBxgt0+0uyTplFfVeTYAOur1CTPqPZ+6IWRQxB4oqoaEmHA+Bs5CMXtPeC4AAuI6zoCOYp8WbvPM75Qc528GQEM4gLzfw8PioKgaqhf1FQfXvUvtLkk6TQNgnScCIACU7AVG/9TnHu33wcJdUFQNu1dOEp89or/dJUnJFQD/Mt+Di8Zr/9BvCOHi0IZx/mYANIQDyLs1NDToZ6amPyMOrgWb7S5LOrYEQADY7gxB4zoDp/Z77vfa6H9mJUNRNRREDRafPfZru0uS0ppMGwJgTSUw/Wnn8537ijPd1GqcvxkADeEA8m61Vxz6+nRBijiwns6xuyzplF/WA2DtFQ8GQEc9EP6mftakosRzv9smr05OgqJqOLXEeUnDtgl2lyQlVwB8d36qZ39xaT4w7m6xb7V/+tTlDWbj/M0AaAgHkHerrLkCRdXwmLpcfwpITaXdZUnHtgAIiLuCp/9a7NuZzwKVpZ79/R72XNAWKKqGinlv+NzX357kCoB/nufhAAgA2av06wG3jPX875cE528GQEM4gLyba326PoOniYNp6MN2lySlimobAyAAnC/Sn6gw7Smp18V7fNQm8VX7JOci0EeT7S5JSmuzSuwLgIB+p3tAB2DDEMBhw78rL8f5mwHQEA4g73a6ohqKquF/hzkXD17wit0lSalpAKy5YtN1S2cPA2GP6kujFO2wpw4LNTQ04OdD1qOruhoNrjNEkp/xtEusMwD+aa5NARAAkqfpIXDZu8DlC/bV4oU4fzMAGsIB5N2On6uComoIG/Ep19iyUJsIgIA48zfzWbGvR3UCNo+R6vFa1XX1UFQNvQY7Hx8W+DNeI2YRVwB8Z26KvYXsXwGMuV3s77DuwJHt9tbjRTh/MwAawgHk3QpKK6GoGmIC+vGCeQtdbBIAq+tsvnOxtgpY/Zl+5mTqk0DuGimC0pmLNVBUDZ8NHSk+29yX7C5JWuv2iQDYf47NARAAijOAKY/rY3rFR8D5o3ZX1eZx/mYANIQDyLvlllRAUTXsGeVcAmb/CrtLklKbCoCACHu5a4HQrvqkOft5ICPcq28COlJ2SZzRHvm5+EwrP7G7JGlp+062nQAIANUVwLq/6zeHjPoP8Y1G8W4p/nNjBc7fDICYMWMGFEVB+/bt4e/vj1273H+4NweQd8s8fgEPqLG4FHCXOGj6yFpxnua627rNBECX6nJgyzhgfBc9CI6/B4gZBOTFel0YzD5RLp4CMvo15xntELtLkpYrAL7dVgKgy8ks4Pt++ngO6CDugk8KAUoyebNIE5y/fTwARkVFoV27dli0aBFyc3MxcOBAdOrUCaWl7l04zQHk3XYdOYffDZ6hT/xcWNUSbTYAulSdA3ZOBab+qvnEOeZ2YH4vYONQsfTG6dw2fc1gyuGzeFBdi4oAZ6A95sFFin3M+v3OADi7jQVAl+IMYNVAYOxdzcd0yM+BqL+IQHgoHrh42mfPEHL+9vEA6O/vjy+++KLxzw6HA126dEFQUJBbr+cA8m47DpVh+NCvnCvr97O7HGldausB0MXhEBfRx6nNr6lquo3qBEx5QiwwvepTIH4EkDoLyF4JFCSIZ7aW5otFp2sqPXrGJT73NP4w2Pn0k2CF/6GxUFxbD4Au1RViLcjIPzU/0910G99F3BwV+Wdg/TfiWujdC8VlEkeTxTcj5wrFHeW1l6QJjJy/fTgA1tbW4tZbb0VMTEyz9g8++AB9+/a97mtqampQUVHRuBUXF1sygPZuDMfuSX9o3DImvdVs2zPx91dt/a7Z9l6z9W22ZU5886rtjWZbVujVW59rtn2hrzfb9of+7ke37NDXmm8hrzbbckJeuemWG9K72ZYX0uuqrWezLf/qbcJvG7d9gS/pB8Ekfl1mlaYB8IuIPfh62d62v0XuwdjvY/HDnGDsmPw+ioKeweXRna8/gd5kqw/4D9SMuhOXRt+LC2MfRNm4bjg9vjtOBD6JY0FP42jQMygK+g0Kg5/D4eD/QkHwf+PghBdxYMLLyA/pibyQXsgJeQXZoa9hf+jvnP/+xL9L8e9V/BtODuyDwhFd9RsByDIbskUAfGpMvP1j1c3tH5G7MHVhOGJmDsbuSX/A6fHd4XBdM9iCzRHQEdWj70LlmHtRPuZ+nB/7EMrG/QKnxz+KksAncDywB44GPYPC4OdwaMILODjhJRyY8FKT8SzGdG5IbzGuQ15tHNv7Ql9vHN+ZE99wzlf9sHfDItP3IQOgDwfAkpIS+Pn5ISWl+f/gvv32W/j7+1/3NQEBAfDz87tmM3sApSz8plUTDbfWbdWj7gQunjJ1H5Ku9ooDj4zY0BgCvXdbhx5qBPoPDsXXQwYjcOhnWDisP9YNfwVpI/yRO+IxHB/xc1wY2Rn1I1s+sZq1lY99ACg7ZPdul1pq4dk2MB6Nb13V1Xh58DwMGDIOw4d+henD3kfksH7YNPxlZIzogSMjHkbpyPtQOfJOW4/RKQu/MX0fMgAyALYoAHrqDGB++makLB1z1Ta2+RbRfEuOGHedbXyzbWdEYPMtMuhHtx2RwVdtE67Zti8LuWoL/dEtKWriVdukZtu2qLCrtsnXbsubb1uXT7lqm3rVNq3Zlhg9vXHbtmI6Th0vMHX/0bX2HDuP+dsLfWdLOozFidlYsjkDEfGpiNq4DSvi4rF6/XqsWReDdWuXIy5mKTasDsfG1YuxadUCxK+cj4SVc7F5xWxsiZ6JxOgZ2Lp8mhjnUWFIipqI7ctCsCMyuPm/Vee/5+SI8UhZHoKyU/I+6aStcDgasG5fif3jzKNjugCLt+ZgaUJ643hetT4OMVos1q5bjXVro7F+TSQ2xCzBplWLkLByHrasmIUt0TOQGD0DidHTncfjKc4x3XRcu+aIq8Z3RCCSI8Yhb3ei6fuQAdCHA2BrvgK+GgcQERGR9+H87cMBEBA3gXz55ZeNf3Y4HLjnnnt4EwgREZHEOH/7eACMiopC+/btER4ejry8PHz66afo1KkTTp8+7dbrOYCIiIi8D+dvHw+AADB9+nTcd999aNeuHfz9/ZGW5v7aWRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIRxARERE3ofzNwOgIeXl5fDz80NxcTEqKiq4cePGjRs3bl6wFRcXw8/PD+Xl5XZHCdswABrgGkDcuHHjxo0bN+/biouL7Y4StmEANMDhcKC4uBjl5eWW/e+EZxc9879A9jP7WYaN/cx+lmmzsp/Ly8tRXFwMh8Nhd5SwDQNgG1VRwesTPIH97BnsZ89gP3sG+9kz2M/WYgBsozjwPYP97BnsZ89gP3sG+9kz2M/WYgBsozjwPYP97BnsZ89gP3sG+9kz2M/WYgBso2pqahAQEICamhq7S5Ea+9kz2M+ewX72DPazZ7CfrcUASERERORjGACJiIiIfAwDIBEREZGPYQAkIiIi8jEMgEREREQ+hgHQQ2bMmAFFUdC+fXv4+/tj165dP/rz0dHR6NatG9q3b4/u3btj/fr1zf6+oaEBI0aMwN13341/+7d/Q8+ePXHo0CErP4JXMLufV61ahd69e+OnP/0p/Pz8kJmZaWX5XsPMfq6rq8N3332H7t274yc/+Qk6d+6M999/HyUlJVZ/DK9g9pgOCAhAt27d8JOf/ASdOnVCz549kZaWZuVH8OEDYzAAAAZ0SURBVApm93NTn332Gfz8/DB58mSzy/Y6ZvfzgAEDrnm826uvvmrlR5AGA6AHREVFoV27dli0aBFyc3MxcOBAdOrUCaWlpdf9+eTkZNx6660ICQlBXl4ehg8fjttuuw3Z2dmNPxMcHIyOHTtizZo12LdvH/r27YsHHngA1dXVnvpYbY4V/bxkyRKMHj0a8+fPZwB0Mrufy8vL0atXLyxfvhwHDhxAamoq/P390aNHD09+rDbJijEdERGBhIQEFBYWIicnBx9//DE6dOiAM2fOeOpjtTlW9LPL6tWr8cQTT6BLly4+HwCt6OcBAwbgtddew6lTpxq38+fPe+ojeTUGQA/w9/fHF1980fhnh8OBLl26ICgo6Lo/379/f/Tp06dZ2zPPPIPPPvsMgDj7d/fddyM0NLTx78vLy9G+fXssW7bMgk/gHczu56aKiooYAJ2s7GeX9PR0+Pn54dixY+YU7aU80deuxXY3b95sTtFeyKp+PnHiBO655x7k5ORAURSfD4BW9POAAQPQr18/awqWHAOgxWpra3HrrbciJiamWfsHH3yAvn37Xvc1P/vZz645UIwcORKPP/44AKCwsPC6YeSFF17AV199ZWL13sOKfm6KAVCwup9dEhIScMstt/j0EwA80de1tbUIDQ1Fx44dUVZWZk7hXsaqfnY4HHj55ZcxZcoUAPD5AGhVPw8YMAAdO3bEHXfcga5du+Lzzz/H2bNnzf8AEmIAtFhJSQn8/PyQkpLSrP3bb7+Fv7//dV9z2223ITIyslnbzJkzceeddwIQp8X9/Pxw8uTJZj/z9ttvo3///iZW7z2s6OemGAAFq/sZAKqrq/HUU0/h3XffNadoL2VlX69btw7//u//jltuuQVdunRBenq6ucV7Eav6OTAwEL1790ZDQwMABkCr+nnZsmVYu3Yt9u/fj5iYGDzyyCN4+umnUV9fb/6HkAwDoMUYAD2DAdAzrO7nuro6vPnmm3jyySd9+uwfYG1fX7p0CQUFBUhNTcVHH32E+++//4bXYcnOin7OyMjAXXfd1exGJgZA6//zCOjfkPnyJQ3uYgC0GL8C9gx+BewZVvZzXV0dfv/73+Pxxx/nVzjw3NftAPDQQw8hMDDQWMFeyop+njx5Mm655RbceuutjZufnx/+5V/+BYqiWPI52jpPjufbb78dc+bMMVawD2AA9AB/f398+eWXjX92OBy45557fvTC1zfeeKNZ27PPPnvNTSATJ05s/PuKigreBGJyPzfFAKizop9d4e/RRx/16btRr2blmG7qwQcfREBAgOF6vZXZ/Xz27FlkZ2c327p06QJVVXHgwAHrPkgb54nxXFxcjFtuuQVr1641p2iJMQB6QFRUFNq3b4/w8HDk5eXh008/RadOnXD69GkAwPvvv4/Bgwc3/nxycjL+9V//FRMnTkR+fj4CAgKuuwxMp06dGq996NevH5eBsaCfz507h8zMTKxfvx5+fn6IiopCZmYmTp065fHP11aY3c91dXXo27cv7r33XmRlZTVbzqG2ttaWz9hWmN3Xly5dwpAhQ5CamoqjR48iIyMDH374Idq3b4+cnBxbPmNbYMWx42q+/hUwYH4/V1ZW4ptvvkFqaiqKioqwefNmPPXUU3j44YdRU1Njy2f0JgyAHjJ9+nTcd999aNeuHfz9/ZstvPriiy9iwIABzX4+OjoaXbt2Rbt27fDoo4/ecCHou+66C+3bt0fPnj1x8OBBT3yUNs3sfl68ePE1i4z6+fn59NkSwNx+dp1dvd62detWD32itsvMvq6ursZbb72FLl26oF27dujcuTP69u3r0zeBuJh97LgaA6BgZj9fvnwZr7zyCu644w7cdtttUBQFAwcObAyU9OMYAImIiIh8DAMgERERkY9hACQiIiLyMQyARERERD6GAZCIiIjIxzAAEhEREfkYBkAiIiIiH8MASERERORjGACJiIiIfAwDIBEREZGPYQAkIiIi8jEMgEREREQ+hgGQiIiIyMcwABIRERH5GAZAIiIiIh/DAEhERETkYxgAiYiIiHwMAyARERGRj2EAJCIiIvIxDIBEREREPoYBkIiIiMjHMAASERER+RgGQCIiIiIfwwBIRERE5GMYAImIiIh8DAMgERERkY9hACQiIiLyMQyARERERD6GAZCIiIjIxzAAEhEREfkYBkAiIiIiH8MASERERORj/h9GTTMv6YdZ0wAAAABJRU5ErkJggg==\" width=\"640\">"
  941. ],
  942. "text/plain": [
  943. "<IPython.core.display.HTML object>"
  944. ]
  945. },
  946. "metadata": {},
  947. "output_type": "display_data"
  948. }
  949. ],
  950. "source": [
  951. "axe = plt.subplot()\n",
  952. "plot(analysis['1'], label=r'$V_{in}$')\n",
  953. "plot(analysis['2'], label=r'$V_{C_2}$')\n",
  954. "axe.legend();"
  955. ]
  956. },
  957. {
  958. "cell_type": "code",
  959. "execution_count": null,
  960. "metadata": {},
  961. "outputs": [],
  962. "source": []
  963. }
  964. ],
  965. "metadata": {
  966. "kernelspec": {
  967. "display_name": "Python 3",
  968. "language": "python",
  969. "name": "python3"
  970. },
  971. "language_info": {
  972. "codemirror_mode": {
  973. "name": "ipython",
  974. "version": 3
  975. },
  976. "file_extension": ".py",
  977. "mimetype": "text/x-python",
  978. "name": "python",
  979. "nbconvert_exporter": "python",
  980. "pygments_lexer": "ipython3",
  981. "version": "3.7.7"
  982. }
  983. },
  984. "nbformat": 4,
  985. "nbformat_minor": 2
  986. }