From 79e6fc986db59fcecac0fca26086257134483efc Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Tue, 23 Feb 2016 17:00:08 -0800 Subject: [PATCH] huge npm refactor of all visualizations. table views are broken due to broken shimming for jquery/jquery-ui, dashboards are broken due to refactor of explore views. --- panoramix/assets/html/base.html | 9 +- panoramix/assets/html/explore.html | 6 - panoramix/assets/html/viz.html | 16 - panoramix/assets/javascripts/explore.js | 57 +- .../assets/javascripts/modules/panoramix.js | 9 +- panoramix/assets/package.json | 6 +- .../bootstrap-toggle.min.css | 0 .../bootstrap-toggle}/bootstrap-toggle.min.js | 0 .../dataTables/dataTables.bootstrap.css | 0 .../dataTables/dataTables.bootstrap.js | 2 +- .../dataTables/jquery.dataTables.min.css | 0 .../dataTables/jquery.dataTables.min.js | 0 .../vendor/datamaps}/datamaps.all.js | 4 +- .../vendor/datamaps}/datamaps.world.min.js | 0 .../jquery-ui}/jquery-ui.min.css | 0 .../jquery-ui}/jquery-ui.min.js | 0 .../lib => assets/vendor}/nvd3/nv.d3.css | 0 .../lib => assets/vendor}/nvd3/nv.d3.min.js | 0 .../parallel_coordinates}/d3.parcoords.css | 19 +- .../parallel_coordinates/d3.parcoords.js | 2224 +++ .../vendor/parallel_coordinates}/divgrid.js | 4 +- .../lib => assets/vendor}/pygments.css | 0 .../vendor/select2.sortable.js | 0 .../visualizations/big_number.css} | 0 .../visualizations/big_number.js} | 15 +- .../visualizations/directed_force.css} | 0 .../assets/visualizations/directed_force.js | 165 + .../visualizations/filter_box.css} | 0 .../visualizations/filter_box.js} | 37 +- .../visualizations/heatmap.css} | 26 +- .../visualizations/heatmap.js} | 94 +- panoramix/assets/visualizations/iframe.js | 25 + panoramix/assets/visualizations/markup.js | 23 + panoramix/assets/visualizations/nvd3_vis.js | 209 + .../visualizations/parallel_coordinates.js} | 24 +- .../assets/visualizations/pivot_table.css | 4 + .../assets/visualizations/pivot_table.js | 40 + .../visualizations/sankey.css} | 2 - panoramix/assets/visualizations/sankey.js | 108 + .../visualizations/sunburst.css} | 0 .../visualizations/sunburst.js} | 141 +- .../visualizations/table.css} | 5 +- .../visualizations/table.js} | 28 +- .../visualizations/word_cloud.js} | 17 +- panoramix/assets/visualizations/world_map.css | 3 + .../visualizations/world_map.js} | 41 +- panoramix/assets/webpack.config.js | 14 +- panoramix/static/earth.png | Bin 342298 -> 0 bytes panoramix/static/lib/bootstrap-toggle.min.js | 9 - panoramix/static/lib/d3-sankey.js | 294 - panoramix/static/lib/d3.layout.cloud.js | 387 - panoramix/static/lib/d3.min.js | 5 - panoramix/static/lib/d3.tip.js | 324 - .../lib/jquery-ui/external/jquery/jquery.js | 9789 --------- .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 418 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 312 -> 0 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 205 -> 0 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 348 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 5815 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 278 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 328 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_228ef1_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes panoramix/static/lib/jquery-ui/index.html | 513 - panoramix/static/lib/jquery-ui/jquery-ui.css | 1225 -- panoramix/static/lib/jquery-ui/jquery-ui.js | 16617 ---------------- .../static/lib/jquery-ui/jquery-ui.min.css | 7 - .../static/lib/jquery-ui/jquery-ui.min.js | 13 - .../lib/jquery-ui/jquery-ui.structure.css | 833 - .../lib/jquery-ui/jquery-ui.structure.min.css | 5 - .../static/lib/jquery-ui/jquery-ui.theme.css | 410 - .../lib/jquery-ui/jquery-ui.theme.min.css | 5 - panoramix/static/lib/para/d3.parcoords.js | 2219 --- panoramix/static/lib/select2.sortable.js | 146 - .../static/lib/select2/select2-bootstrap.css | 495 - panoramix/static/lib/select2/select2.min.css | 1 - panoramix/static/lib/select2/select2.min.js | 2 - panoramix/static/lib/topojson.min.js | 1 - .../static/panoramix-bootstrap-theme.css | 6487 ------ panoramix/static/panoramix.css | 246 - panoramix/static/panoramix.js | 623 - .../static/widgets/viz_directed_force.js | 159 - panoramix/static/widgets/viz_heatmap.css | 22 - panoramix/static/widgets/viz_iframe.js | 22 - panoramix/static/widgets/viz_markup.js | 17 - panoramix/static/widgets/viz_nvd3.css | 3 - panoramix/static/widgets/viz_nvd3.js | 185 - panoramix/static/widgets/viz_pivot_table.css | 3 - panoramix/static/widgets/viz_pivot_table.js | 25 - panoramix/static/widgets/viz_sankey.js | 104 - panoramix/static/widgets/viz_world_map.css | 3 - 96 files changed, 3172 insertions(+), 41404 deletions(-) rename panoramix/{static/lib => assets/vendor/bootstrap-toggle}/bootstrap-toggle.min.css (100%) rename panoramix/assets/{javascripts/vendor => vendor/bootstrap-toggle}/bootstrap-toggle.min.js (100%) rename panoramix/{static/lib => assets/vendor}/dataTables/dataTables.bootstrap.css (100%) rename panoramix/{static/lib => assets/vendor}/dataTables/dataTables.bootstrap.js (99%) rename panoramix/{static/lib => assets/vendor}/dataTables/jquery.dataTables.min.css (100%) rename panoramix/{static/lib => assets/vendor}/dataTables/jquery.dataTables.min.js (100%) rename panoramix/{static/lib => assets/vendor/datamaps}/datamaps.all.js (99%) rename panoramix/{static/lib => assets/vendor/datamaps}/datamaps.world.min.js (100%) rename panoramix/assets/{stylesheets/vendor => vendor/jquery-ui}/jquery-ui.min.css (100%) rename panoramix/assets/{javascripts/vendor => vendor/jquery-ui}/jquery-ui.min.js (100%) rename panoramix/{static/lib => assets/vendor}/nvd3/nv.d3.css (100%) rename panoramix/{static/lib => assets/vendor}/nvd3/nv.d3.min.js (100%) rename panoramix/{static/lib/para => assets/vendor/parallel_coordinates}/d3.parcoords.css (81%) create mode 100644 panoramix/assets/vendor/parallel_coordinates/d3.parcoords.js rename panoramix/{static/lib/para => assets/vendor/parallel_coordinates}/divgrid.js (94%) rename panoramix/{static/lib => assets/vendor}/pygments.css (100%) rename panoramix/assets/{javascripts => }/vendor/select2.sortable.js (100%) rename panoramix/{static/widgets/viz_bignumber.css => assets/visualizations/big_number.css} (100%) rename panoramix/{static/widgets/viz_bignumber.js => assets/visualizations/big_number.js} (95%) rename panoramix/{static/widgets/viz_directed_force.css => assets/visualizations/directed_force.css} (100%) create mode 100644 panoramix/assets/visualizations/directed_force.js rename panoramix/{static/widgets/viz_filter_box.css => assets/visualizations/filter_box.css} (100%) rename panoramix/{static/widgets/viz_filter_box.js => assets/visualizations/filter_box.js} (75%) rename panoramix/{static/lib/d3.tip.css => assets/visualizations/heatmap.css} (54%) rename panoramix/{static/widgets/viz_heatmap.js => assets/visualizations/heatmap.js} (72%) create mode 100644 panoramix/assets/visualizations/iframe.js create mode 100644 panoramix/assets/visualizations/markup.js create mode 100644 panoramix/assets/visualizations/nvd3_vis.js rename panoramix/{static/widgets/viz_para.js => assets/visualizations/parallel_coordinates.js} (82%) create mode 100644 panoramix/assets/visualizations/pivot_table.css create mode 100644 panoramix/assets/visualizations/pivot_table.js rename panoramix/{static/widgets/viz_sankey.css => assets/visualizations/sankey.css} (99%) create mode 100644 panoramix/assets/visualizations/sankey.js rename panoramix/{static/widgets/viz_sunburst.css => assets/visualizations/sunburst.css} (100%) rename panoramix/{static/widgets/viz_sunburst.js => assets/visualizations/sunburst.js} (69%) rename panoramix/{static/widgets/viz_table.css => assets/visualizations/table.css} (51%) rename panoramix/{static/widgets/viz_table.js => assets/visualizations/table.js} (81%) rename panoramix/{static/widgets/viz_wordcloud.js => assets/visualizations/word_cloud.js} (87%) create mode 100644 panoramix/assets/visualizations/world_map.css rename panoramix/{static/widgets/viz_world_map.js => assets/visualizations/world_map.js} (82%) delete mode 100644 panoramix/static/earth.png delete mode 100644 panoramix/static/lib/bootstrap-toggle.min.js delete mode 100644 panoramix/static/lib/d3-sankey.js delete mode 100644 panoramix/static/lib/d3.layout.cloud.js delete mode 100644 panoramix/static/lib/d3.min.js delete mode 100644 panoramix/static/lib/d3.tip.js delete mode 100755 panoramix/static/lib/jquery-ui/external/jquery/jquery.js delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_flat_10_000000_40x100.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-icons_222222_256x240.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-icons_228ef1_256x240.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-icons_ef8c08_256x240.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-icons_ffd27a_256x240.png delete mode 100755 panoramix/static/lib/jquery-ui/images/ui-icons_ffffff_256x240.png delete mode 100755 panoramix/static/lib/jquery-ui/index.html delete mode 100755 panoramix/static/lib/jquery-ui/jquery-ui.css delete mode 100755 panoramix/static/lib/jquery-ui/jquery-ui.js delete mode 100755 panoramix/static/lib/jquery-ui/jquery-ui.min.css delete mode 100755 panoramix/static/lib/jquery-ui/jquery-ui.min.js delete mode 100755 panoramix/static/lib/jquery-ui/jquery-ui.structure.css delete mode 100755 panoramix/static/lib/jquery-ui/jquery-ui.structure.min.css delete mode 100755 panoramix/static/lib/jquery-ui/jquery-ui.theme.css delete mode 100755 panoramix/static/lib/jquery-ui/jquery-ui.theme.min.css delete mode 100644 panoramix/static/lib/para/d3.parcoords.js delete mode 100644 panoramix/static/lib/select2.sortable.js delete mode 100644 panoramix/static/lib/select2/select2-bootstrap.css delete mode 100644 panoramix/static/lib/select2/select2.min.css delete mode 100644 panoramix/static/lib/select2/select2.min.js delete mode 100644 panoramix/static/lib/topojson.min.js delete mode 100644 panoramix/static/panoramix-bootstrap-theme.css delete mode 100644 panoramix/static/panoramix.css delete mode 100644 panoramix/static/panoramix.js delete mode 100644 panoramix/static/widgets/viz_directed_force.js delete mode 100644 panoramix/static/widgets/viz_heatmap.css delete mode 100644 panoramix/static/widgets/viz_iframe.js delete mode 100644 panoramix/static/widgets/viz_markup.js delete mode 100644 panoramix/static/widgets/viz_nvd3.css delete mode 100644 panoramix/static/widgets/viz_nvd3.js delete mode 100644 panoramix/static/widgets/viz_pivot_table.css delete mode 100644 panoramix/static/widgets/viz_pivot_table.js delete mode 100644 panoramix/static/widgets/viz_sankey.js delete mode 100644 panoramix/static/widgets/viz_world_map.css diff --git a/panoramix/assets/html/base.html b/panoramix/assets/html/base.html index b6b3b9c53fb3..4baa4648e167 100644 --- a/panoramix/assets/html/base.html +++ b/panoramix/assets/html/base.html @@ -4,7 +4,7 @@ {% block head_css %} {{super()}} - + @@ -13,9 +13,8 @@ {% endblock %} {% block body %} - - {% include 'appbuilder/general/confirm.html' %} - {% include 'appbuilder/general/alert.html' %} + {% include 'appbuilder/general/confirm.html' %} + {% include 'appbuilder/general/alert.html' %} {% block navbar %}
@@ -42,6 +41,6 @@ {% block tail_js %} {{ super() }} - + {% endblock %} diff --git a/panoramix/assets/html/explore.html b/panoramix/assets/html/explore.html index f3b8282f655a..27f49b0a0129 100644 --- a/panoramix/assets/html/explore.html +++ b/panoramix/assets/html/explore.html @@ -1,11 +1,5 @@ {% extends "refactor/base.html" %} -{% block head_css %} - {{super()}} - - -{% endblock %} - {% block content_fluid %} {% set datasource = viz.datasource %} {% set form = viz.form %} diff --git a/panoramix/assets/html/viz.html b/panoramix/assets/html/viz.html index 7a8cb1e7424a..4b35018beb9e 100644 --- a/panoramix/assets/html/viz.html +++ b/panoramix/assets/html/viz.html @@ -8,20 +8,4 @@ {% extends 'refactor/explore.html' %} {% endif %} - - {% block head_css %} - {{super()}} - {% for css in viz.css_files %} - - {% endfor %} - {% endblock %} - - - {% block tail %} - {{super()}} - {% for js in viz.js_files %} - - {% endfor %} - {% endblock %} - {% endif %} diff --git a/panoramix/assets/javascripts/explore.js b/panoramix/assets/javascripts/explore.js index 50096be3c526..aa0b30fff943 100644 --- a/panoramix/assets/javascripts/explore.js +++ b/panoramix/assets/javascripts/explore.js @@ -1,17 +1,70 @@ +// Javascript for the explorer page +// Init explorer view -> load vis dependencies -> read data (from dynamic html) -> render slice +// nb: to add a new vis, you must also add a Python fn in viz.py + +// css +require('../vendor/pygments.css'); +require('../vendor/bootstrap-toggle/bootstrap-toggle.min.css'); + +// js +var $ = window.$ || require('jquery'); +var px = window.px || require('./modules/panoramix.js'); require('select2'); -require('./vendor/bootstrap-toggle.min.js'); -require('./vendor/select2.sortable.js'); +require('../vendor/bootstrap-toggle/bootstrap-toggle.min.js'); +require('../vendor/select2.sortable.js'); + +// vis sources +var sourceMap = { + area: 'nvd3_vis.js', + bar: 'nvd3_vis.js', + bubble: 'nvd3_vis.js', + big_number: 'big_number.js', + compare: 'nvd3_vis.js', + dist_bar: 'nvd3_vis.js', + directed_force: 'directed_force.js', + filter_box: 'filter_box.js', + heatmap: 'heatmap.js', + iframe: 'iframe.js', + line: 'nvd3_vis.js', + markup: 'markup.js', + para: 'parallel_coordinates.js', + pie: 'nvd3_vis.js', + // pivot_table: undefined, + sankey: 'sankey.js', + sunburst: 'sunburst.js', + table: 'table.js', + word_cloud: 'word_cloud.js', + world_map: 'world_map.js', +}; $(document).ready(function() { px.initExploreView(); + // Dynamically register this visualization + var visType = window.viz_type.value; + var visSource = sourceMap[visType]; + + if (visSource) { + var visFactory = require('../visualizations/' + visSource); + if (typeof visFactory === 'function') { + // @TODO handle px.registerViz here instead of in each file? + px.registerViz(visType, visFactory); + } + } + else { + console.error("require(", visType, ") failed."); + } + var data = $('.slice').data('slice'); var slice = px.Slice(data); + // $('.slice').data('slice', slice); + // call vis render method, which issues ajax px.renderSlice(); + // make checkbox inputs display as toggles $(':checkbox') .addClass('pull-right') .attr("data-onstyle", "default") diff --git a/panoramix/assets/javascripts/modules/panoramix.js b/panoramix/assets/javascripts/modules/panoramix.js index 26512be12f91..e6924cbe5ecf 100644 --- a/panoramix/assets/javascripts/modules/panoramix.js +++ b/panoramix/assets/javascripts/modules/panoramix.js @@ -1,3 +1,6 @@ +var $ = window.$ || require('jquery'); +var d3 = window.d3 || require('d3'); + var color = function(){ // Color related utility functions go in this object var bnbColors = [ @@ -7,8 +10,8 @@ var color = function(){ '#ff3339', '#ff1ab1', '#005c66', '#00b3a5', '#55d12e', '#b37e00', '#988b4e', ]; var spectrums = { - 'fire': ['white', 'yellow', 'red', 'black'], 'blue_white_yellow': ['#00d1c1', 'white', '#ffb400'], + 'fire': ['white', 'yellow', 'red', 'black'], 'white_black': ['white', 'black'], 'black_white': ['black', 'white'], } @@ -346,6 +349,7 @@ var px = (function() { }); }); $("#viz_type").change(function() {$("#query").submit();}); + var collapsed_fieldsets = get_collapsed_fieldsets(); for(var i=0; i < collapsed_fieldsets.length; i++){ toggle_fieldset($('legend:contains("' + collapsed_fieldsets[i] + '")'), false); @@ -382,6 +386,7 @@ var px = (function() { $(this).parent().parent().remove(); }); } + $(window).bind("popstate", function(event) { // Browser back button var returnLocation = history.location || document.location; @@ -409,7 +414,7 @@ var px = (function() { $("#query").submit(); } }); - add_filter(); + $(".druidify").click(druidify); function create_choices(term, data) { diff --git a/panoramix/assets/package.json b/panoramix/assets/package.json index af295987e50f..10a743d6bc7d 100644 --- a/panoramix/assets/package.json +++ b/panoramix/assets/package.json @@ -38,13 +38,17 @@ "babel-preset-es2015": "^6.3.13", "babel-preset-react": "^6.3.13", "bootstrap": "^3.3.6", + "bootstrap-datepicker": "^1.6.0", "brace": "^0.7.0", "d3": "^3.5.14", "d3-cloud": "^1.2.1", "d3-sankey": "^0.2.1", "d3-tip": "^0.6.7", + "d3.layout.cloud": "^1.2.0", + "exports-loader": "^0.6.3", "gridster": "^0.5.6", - "jquery": "^2.2.0", + "imports-loader": "^0.6.5", + "jquery": "^2.2.1", "jquery-ui": "^1.10.5", "react": "^0.14.7", "react-bootstrap": "^0.28.3", diff --git a/panoramix/static/lib/bootstrap-toggle.min.css b/panoramix/assets/vendor/bootstrap-toggle/bootstrap-toggle.min.css similarity index 100% rename from panoramix/static/lib/bootstrap-toggle.min.css rename to panoramix/assets/vendor/bootstrap-toggle/bootstrap-toggle.min.css diff --git a/panoramix/assets/javascripts/vendor/bootstrap-toggle.min.js b/panoramix/assets/vendor/bootstrap-toggle/bootstrap-toggle.min.js similarity index 100% rename from panoramix/assets/javascripts/vendor/bootstrap-toggle.min.js rename to panoramix/assets/vendor/bootstrap-toggle/bootstrap-toggle.min.js diff --git a/panoramix/static/lib/dataTables/dataTables.bootstrap.css b/panoramix/assets/vendor/dataTables/dataTables.bootstrap.css similarity index 100% rename from panoramix/static/lib/dataTables/dataTables.bootstrap.css rename to panoramix/assets/vendor/dataTables/dataTables.bootstrap.css diff --git a/panoramix/static/lib/dataTables/dataTables.bootstrap.js b/panoramix/assets/vendor/dataTables/dataTables.bootstrap.js similarity index 99% rename from panoramix/static/lib/dataTables/dataTables.bootstrap.js rename to panoramix/assets/vendor/dataTables/dataTables.bootstrap.js index dcc561fcfd90..122f96076153 100644 --- a/panoramix/static/lib/dataTables/dataTables.bootstrap.js +++ b/panoramix/assets/vendor/dataTables/dataTables.bootstrap.js @@ -125,7 +125,7 @@ DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, bu }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/panoramix/static/lib/dataTables/jquery.dataTables.min.css b/panoramix/assets/vendor/dataTables/jquery.dataTables.min.css similarity index 100% rename from panoramix/static/lib/dataTables/jquery.dataTables.min.css rename to panoramix/assets/vendor/dataTables/jquery.dataTables.min.css diff --git a/panoramix/static/lib/dataTables/jquery.dataTables.min.js b/panoramix/assets/vendor/dataTables/jquery.dataTables.min.js similarity index 100% rename from panoramix/static/lib/dataTables/jquery.dataTables.min.js rename to panoramix/assets/vendor/dataTables/jquery.dataTables.min.js diff --git a/panoramix/static/lib/datamaps.all.js b/panoramix/assets/vendor/datamaps/datamaps.all.js similarity index 99% rename from panoramix/static/lib/datamaps.all.js rename to panoramix/assets/vendor/datamaps/datamaps.all.js index e3a9b36d1b5c..6b27f7781f61 100644 --- a/panoramix/static/lib/datamaps.all.js +++ b/panoramix/assets/vendor/datamaps/datamaps.all.js @@ -12131,8 +12131,8 @@ "scale": [0.036003600360036005, 0.016927109510951093], "translate": [-180, -85.609038] } -} -; + }; + Datamap.prototype.abwTopo = '__ABW__'; Datamap.prototype.afgTopo = '__AFG__'; Datamap.prototype.agoTopo = '__AGO__'; diff --git a/panoramix/static/lib/datamaps.world.min.js b/panoramix/assets/vendor/datamaps/datamaps.world.min.js similarity index 100% rename from panoramix/static/lib/datamaps.world.min.js rename to panoramix/assets/vendor/datamaps/datamaps.world.min.js diff --git a/panoramix/assets/stylesheets/vendor/jquery-ui.min.css b/panoramix/assets/vendor/jquery-ui/jquery-ui.min.css similarity index 100% rename from panoramix/assets/stylesheets/vendor/jquery-ui.min.css rename to panoramix/assets/vendor/jquery-ui/jquery-ui.min.css diff --git a/panoramix/assets/javascripts/vendor/jquery-ui.min.js b/panoramix/assets/vendor/jquery-ui/jquery-ui.min.js similarity index 100% rename from panoramix/assets/javascripts/vendor/jquery-ui.min.js rename to panoramix/assets/vendor/jquery-ui/jquery-ui.min.js diff --git a/panoramix/static/lib/nvd3/nv.d3.css b/panoramix/assets/vendor/nvd3/nv.d3.css similarity index 100% rename from panoramix/static/lib/nvd3/nv.d3.css rename to panoramix/assets/vendor/nvd3/nv.d3.css diff --git a/panoramix/static/lib/nvd3/nv.d3.min.js b/panoramix/assets/vendor/nvd3/nv.d3.min.js similarity index 100% rename from panoramix/static/lib/nvd3/nv.d3.min.js rename to panoramix/assets/vendor/nvd3/nv.d3.min.js diff --git a/panoramix/static/lib/para/d3.parcoords.css b/panoramix/assets/vendor/parallel_coordinates/d3.parcoords.css similarity index 81% rename from panoramix/static/lib/para/d3.parcoords.css rename to panoramix/assets/vendor/parallel_coordinates/d3.parcoords.css index cccc1072d26e..b53849c3673b 100644 --- a/panoramix/static/lib/para/d3.parcoords.css +++ b/panoramix/assets/vendor/parallel_coordinates/d3.parcoords.css @@ -54,7 +54,18 @@ clear: left; font-size: 12px; line-height: 18px; height: 18px; margin: 0px; } -.parcoords .row:nth-child(odd) { background: rgba(0,0,0,0.05); } -.parcoords .header { font-weight: bold; } -.parcoords .cell { float: left; overflow: hidden; white-space: nowrap; width: 100px; height: 18px; } -.parcoords .col-0 { width: 180px; } +.parcoords .row:nth-child(odd) { + background: rgba(0,0,0,0.05); +} +.parcoords .header { + font-weight: bold; +} +.parcoords .cell { + float: left; + overflow: hidden; + white-space: nowrap; + width: 100px; height: 18px; +} +.parcoords .col-0 { + width: 180px; +} diff --git a/panoramix/assets/vendor/parallel_coordinates/d3.parcoords.js b/panoramix/assets/vendor/parallel_coordinates/d3.parcoords.js new file mode 100644 index 000000000000..04095f106e4a --- /dev/null +++ b/panoramix/assets/vendor/parallel_coordinates/d3.parcoords.js @@ -0,0 +1,2224 @@ +module.exports = function(config) { + var __ = { + data: [], + highlighted: [], + dimensions: [], + dimensionTitles: {}, + dimensionTitleRotation: 0, + types: {}, + brushed: false, + brushedColor: null, + alphaOnBrushed: 0.0, + mode: "default", + rate: 20, + width: 600, + height: 300, + margin: { top: 24, right: 0, bottom: 12, left: 0 }, + nullValueSeparator: "undefined", // set to "top" or "bottom" + nullValueSeparatorPadding: { top: 8, right: 0, bottom: 8, left: 0 }, + color: "#069", + composite: "source-over", + alpha: 0.7, + bundlingStrength: 0.5, + bundleDimension: null, + smoothness: 0.0, + showControlPoints: false, + hideAxis : [] + }; + + extend(__, config); + + var pc = function(selection) { + selection = pc.selection = d3.select(selection); + + __.width = selection[0][0].clientWidth; + __.height = selection[0][0].clientHeight; + + // canvas data layers + ["marks", "foreground", "brushed", "highlight"].forEach(function(layer) { + canvas[layer] = selection + .append("canvas") + .attr("class", layer)[0][0]; + ctx[layer] = canvas[layer].getContext("2d"); + }); + + // svg tick and brush layers + pc.svg = selection + .append("svg") + .attr("width", __.width) + .attr("height", __.height) + .append("svg:g") + .attr("transform", "translate(" + __.margin.left + "," + __.margin.top + ")"); + + return pc; + }; + var events = d3.dispatch.apply(this,["render", "resize", "highlight", "brush", "brushend", "axesreorder"].concat(d3.keys(__))), + w = function() { return __.width - __.margin.right - __.margin.left; }, + h = function() { return __.height - __.margin.top - __.margin.bottom; }, + flags = { + brushable: false, + reorderable: false, + axes: false, + interactive: false, + debug: false + }, + xscale = d3.scale.ordinal(), + yscale = {}, + dragging = {}, + line = d3.svg.line(), + axis = d3.svg.axis().orient("left").ticks(5), + g, // groups for axes, brushes + ctx = {}, + canvas = {}, + clusterCentroids = []; + + // side effects for setters + var side_effects = d3.dispatch.apply(this,d3.keys(__)) + .on("composite", function(d) { + ctx.foreground.globalCompositeOperation = d.value; + ctx.brushed.globalCompositeOperation = d.value; + }) + .on("alpha", function(d) { + ctx.foreground.globalAlpha = d.value; + ctx.brushed.globalAlpha = d.value; + }) + .on("brushedColor", function (d) { + ctx.brushed.strokeStyle = d.value; + }) + .on("width", function(d) { pc.resize(); }) + .on("height", function(d) { pc.resize(); }) + .on("margin", function(d) { pc.resize(); }) + .on("rate", function(d) { + brushedQueue.rate(d.value); + foregroundQueue.rate(d.value); + }) + .on("dimensions", function(d) { + xscale.domain(__.dimensions); + if (flags.interactive){pc.render().updateAxes();} + }) + .on("bundleDimension", function(d) { + if (!__.dimensions.length) pc.detectDimensions(); + if (!(__.dimensions[0] in yscale)) pc.autoscale(); + if (typeof d.value === "number") { + if (d.value < __.dimensions.length) { + __.bundleDimension = __.dimensions[d.value]; + } else if (d.value < __.hideAxis.length) { + __.bundleDimension = __.hideAxis[d.value]; + } + } else { + __.bundleDimension = d.value; + } + + __.clusterCentroids = compute_cluster_centroids(__.bundleDimension); + }) + .on("hideAxis", function(d) { + if (!__.dimensions.length) pc.detectDimensions(); + pc.dimensions(without(__.dimensions, d.value)); + }); + + // expose the state of the chart + pc.state = __; + pc.flags = flags; + + // create getter/setters + getset(pc, __, events); + + // expose events + d3.rebind(pc, events, "on"); + + // getter/setter with event firing + function getset(obj,state,events) { + d3.keys(state).forEach(function(key) { + obj[key] = function(x) { + if (!arguments.length) { + return state[key]; + } + var old = state[key]; + state[key] = x; + side_effects[key].call(pc,{"value": x, "previous": old}); + events[key].call(pc,{"value": x, "previous": old}); + return obj; + }; + }); + }; + + function extend(target, source) { + for (var key in source) { + target[key] = source[key]; + } + return target; + }; + + function without(arr, item) { + return arr.filter(function(elem) { return item.indexOf(elem) === -1; }) + }; + /** adjusts an axis' default range [h()+1, 1] if a NullValueSeparator is set */ + function getRange() { + if (__.nullValueSeparator=="bottom") { + return [h()+1-__.nullValueSeparatorPadding.bottom-__.nullValueSeparatorPadding.top, 1]; + } else if (__.nullValueSeparator=="top") { + return [h()+1, 1+__.nullValueSeparatorPadding.bottom+__.nullValueSeparatorPadding.top]; + } + return [h()+1, 1]; + }; + + pc.autoscale = function() { + // yscale + var defaultScales = { + "date": function(k) { + var extent = d3.extent(__.data, function(d) { + return d[k] ? d[k].getTime() : null; + }); + + // special case if single value + if (extent[0] === extent[1]) { + return d3.scale.ordinal() + .domain([extent[0]]) + .rangePoints(getRange()); + } + + return d3.time.scale() + .domain(extent) + .range(getRange()); + }, + "number": function(k) { + var extent = d3.extent(__.data, function(d) { return +d[k]; }); + + // special case if single value + if (extent[0] === extent[1]) { + return d3.scale.ordinal() + .domain([extent[0]]) + .rangePoints(getRange()); + } + + return d3.scale.linear() + .domain(extent) + .range(getRange()); + }, + "string": function(k) { + var counts = {}, + domain = []; + + // Let's get the count for each value so that we can sort the domain based + // on the number of items for each value. + __.data.map(function(p) { + if (p[k] === undefined && __.nullValueSeparator!== "undefined"){ + return; // null values will be drawn beyond the horizontal null value separator! + } + if (counts[p[k]] === undefined) { + counts[p[k]] = 1; + } else { + counts[p[k]] = counts[p[k]] + 1; + } + }); + + domain = Object.getOwnPropertyNames(counts).sort(function(a, b) { + return counts[a] - counts[b]; + }); + + return d3.scale.ordinal() + .domain(domain) + .rangePoints(getRange()); + } + }; + + __.dimensions.forEach(function(k) { + yscale[k] = defaultScales[__.types[k]](k); + }); + + __.hideAxis.forEach(function(k) { + yscale[k] = defaultScales[__.types[k]](k); + }); + + // xscale + xscale.rangePoints([0, w()], 1); + + // canvas sizes + pc.selection.selectAll("canvas") + .style("margin-top", __.margin.top + "px") + .style("margin-left", __.margin.left + "px") + .attr("width", w()+2) + .attr("height", h()+2); + + // default styles, needs to be set when canvas width changes + ctx.foreground.strokeStyle = __.color; + ctx.foreground.lineWidth = 1.4; + ctx.foreground.globalCompositeOperation = __.composite; + ctx.foreground.globalAlpha = __.alpha; + ctx.brushed.strokeStyle = __.brushedColor; + ctx.brushed.lineWidth = 1.4; + ctx.brushed.globalCompositeOperation = __.composite; + ctx.brushed.globalAlpha = __.alpha; + ctx.highlight.lineWidth = 3; + + return this; + }; + + pc.scale = function(d, domain) { + yscale[d].domain(domain); + + return this; + }; + + pc.flip = function(d) { + //yscale[d].domain().reverse(); // does not work + yscale[d].domain(yscale[d].domain().reverse()); // works + + return this; + }; + + pc.commonScale = function(global, type) { + var t = type || "number"; + if (typeof global === 'undefined') { + global = true; + } + + // scales of the same type + var scales = __.dimensions.concat(__.hideAxis).filter(function(p) { + return __.types[p] == t; + }); + + if (global) { + var extent = d3.extent(scales.map(function(p,i) { + return yscale[p].domain(); + }).reduce(function(a,b) { + return a.concat(b); + })); + + scales.forEach(function(d) { + yscale[d].domain(extent); + }); + + } else { + scales.forEach(function(k) { + yscale[k].domain(d3.extent(__.data, function(d) { return +d[k]; })); + }); + } + + // update centroids + if (__.bundleDimension !== null) { + pc.bundleDimension(__.bundleDimension); + } + + return this; + }; + pc.detectDimensions = function() { + pc.types(pc.detectDimensionTypes(__.data)); + pc.dimensions(d3.keys(pc.types())); + return this; + }; + + // a better "typeof" from this post: http://stackoverflow.com/questions/7390426/better-way-to-get-type-of-a-javascript-variable + pc.toType = function(v) { + return ({}).toString.call(v).match(/\s([a-zA-Z]+)/)[1].toLowerCase(); + }; + + // try to coerce to number before returning type + pc.toTypeCoerceNumbers = function(v) { + if ((parseFloat(v) == v) && (v != null)) { + return "number"; + } + return pc.toType(v); + }; + + // attempt to determine types of each dimension based on first row of data + pc.detectDimensionTypes = function(data) { + var types = {}; + d3.keys(data[0]) + .forEach(function(col) { + types[col] = pc.toTypeCoerceNumbers(data[0][col]); + }); + return types; + }; + pc.render = function() { + // try to autodetect dimensions and create scales + if (!__.dimensions.length) pc.detectDimensions(); + if (!(__.dimensions[0] in yscale)) pc.autoscale(); + + pc.render[__.mode](); + + events.render.call(this); + return this; + }; + + pc.renderBrushed = function() { + if (!__.dimensions.length) pc.detectDimensions(); + if (!(__.dimensions[0] in yscale)) pc.autoscale(); + + pc.renderBrushed[__.mode](); + + events.render.call(this); + return this; + }; + + function isBrushed() { + if (__.brushed && __.brushed.length !== __.data.length) + return true; + + var object = brush.currentMode().brushState(); + + for (var key in object) { + if (object.hasOwnProperty(key)) { + return true; + } + } + return false; + }; + + pc.render.default = function() { + pc.clear('foreground'); + pc.clear('highlight'); + + pc.renderBrushed.default(); + + __.data.forEach(path_foreground); + }; + + var foregroundQueue = d3.renderQueue(path_foreground) + .rate(50) + .clear(function() { + pc.clear('foreground'); + pc.clear('highlight'); + }); + + pc.render.queue = function() { + pc.renderBrushed.queue(); + + foregroundQueue(__.data); + }; + + pc.renderBrushed.default = function() { + pc.clear('brushed'); + + if (isBrushed()) { + __.brushed.forEach(path_brushed); + } + }; + + var brushedQueue = d3.renderQueue(path_brushed) + .rate(50) + .clear(function() { + pc.clear('brushed'); + }); + + pc.renderBrushed.queue = function() { + if (isBrushed()) { + brushedQueue(__.brushed); + } else { + brushedQueue([]); // This is needed to clear the currently brushed items + } + }; + function compute_cluster_centroids(d) { + + var clusterCentroids = d3.map(); + var clusterCounts = d3.map(); + // determine clusterCounts + __.data.forEach(function(row) { + var scaled = yscale[d](row[d]); + if (!clusterCounts.has(scaled)) { + clusterCounts.set(scaled, 0); + } + var count = clusterCounts.get(scaled); + clusterCounts.set(scaled, count + 1); + }); + + __.data.forEach(function(row) { + __.dimensions.map(function(p, i) { + var scaled = yscale[d](row[d]); + if (!clusterCentroids.has(scaled)) { + var map = d3.map(); + clusterCentroids.set(scaled, map); + } + if (!clusterCentroids.get(scaled).has(p)) { + clusterCentroids.get(scaled).set(p, 0); + } + var value = clusterCentroids.get(scaled).get(p); + value += yscale[p](row[p]) / clusterCounts.get(scaled); + clusterCentroids.get(scaled).set(p, value); + }); + }); + + return clusterCentroids; + + } + + function compute_centroids(row) { + var centroids = []; + + var p = __.dimensions; + var cols = p.length; + var a = 0.5; // center between axes + for (var i = 0; i < cols; ++i) { + // centroids on 'real' axes + var x = position(p[i]); + var y = yscale[p[i]](row[p[i]]); + centroids.push($V([x, y])); + + // centroids on 'virtual' axes + if (i < cols - 1) { + var cx = x + a * (position(p[i+1]) - x); + var cy = y + a * (yscale[p[i+1]](row[p[i+1]]) - y); + if (__.bundleDimension !== null) { + var leftCentroid = __.clusterCentroids.get(yscale[__.bundleDimension](row[__.bundleDimension])).get(p[i]); + var rightCentroid = __.clusterCentroids.get(yscale[__.bundleDimension](row[__.bundleDimension])).get(p[i+1]); + var centroid = 0.5 * (leftCentroid + rightCentroid); + cy = centroid + (1 - __.bundlingStrength) * (cy - centroid); + } + centroids.push($V([cx, cy])); + } + } + + return centroids; + } + + function compute_control_points(centroids) { + + var cols = centroids.length; + var a = __.smoothness; + var cps = []; + + cps.push(centroids[0]); + cps.push($V([centroids[0].e(1) + a*2*(centroids[1].e(1)-centroids[0].e(1)), centroids[0].e(2)])); + for (var col = 1; col < cols - 1; ++col) { + var mid = centroids[col]; + var left = centroids[col - 1]; + var right = centroids[col + 1]; + + var diff = left.subtract(right); + cps.push(mid.add(diff.x(a))); + cps.push(mid); + cps.push(mid.subtract(diff.x(a))); + } + cps.push($V([centroids[cols-1].e(1) + a*2*(centroids[cols-2].e(1)-centroids[cols-1].e(1)), centroids[cols-1].e(2)])); + cps.push(centroids[cols - 1]); + + return cps; + + }; + + pc.shadows = function() { + flags.shadows = true; + pc.alphaOnBrushed(0.1); + pc.render(); + return this; + }; + + // draw dots with radius r on the axis line where data intersects + pc.axisDots = function(r) { + var r = r || 0.1; + var ctx = pc.ctx.marks; + var startAngle = 0; + var endAngle = 2 * Math.PI; + ctx.globalAlpha = d3.min([ 1 / Math.pow(__.data.length, 1 / 2), 1 ]); + __.data.forEach(function(d) { + __.dimensions.map(function(p, i) { + ctx.beginPath(); + ctx.arc(position(p), yscale[p](d[p]), r, startAngle, endAngle); + ctx.stroke(); + ctx.fill(); + }); + }); + return this; + }; + + // draw single cubic bezier curve + function single_curve(d, ctx) { + + var centroids = compute_centroids(d); + var cps = compute_control_points(centroids); + + ctx.moveTo(cps[0].e(1), cps[0].e(2)); + for (var i = 1; i < cps.length; i += 3) { + if (__.showControlPoints) { + for (var j = 0; j < 3; j++) { + ctx.fillRect(cps[i+j].e(1), cps[i+j].e(2), 2, 2); + } + } + ctx.bezierCurveTo(cps[i].e(1), cps[i].e(2), cps[i+1].e(1), cps[i+1].e(2), cps[i+2].e(1), cps[i+2].e(2)); + } + }; + + // draw single polyline + function color_path(d, ctx) { + ctx.beginPath(); + if ((__.bundleDimension !== null && __.bundlingStrength > 0) || __.smoothness > 0) { + single_curve(d, ctx); + } else { + single_path(d, ctx); + } + ctx.stroke(); + }; + + // draw many polylines of the same color + function paths(data, ctx) { + ctx.clearRect(-1, -1, w() + 2, h() + 2); + ctx.beginPath(); + data.forEach(function(d) { + if ((__.bundleDimension !== null && __.bundlingStrength > 0) || __.smoothness > 0) { + single_curve(d, ctx); + } else { + single_path(d, ctx); + } + }); + ctx.stroke(); + }; + + // returns the y-position just beyond the separating null value line + function getNullPosition() { + if (__.nullValueSeparator=="bottom") { + return h()+1; + } else if (__.nullValueSeparator=="top") { + return 1; + } else { + console.log("A value is NULL, but nullValueSeparator is not set; set it to 'bottom' or 'top'."); + } + return h()+1; + }; + + function single_path(d, ctx) { + __.dimensions.map(function(p, i) { + if (i == 0) { + ctx.moveTo(position(p), typeof d[p] =='undefined' ? getNullPosition() : yscale[p](d[p])); + } else { + ctx.lineTo(position(p), typeof d[p] =='undefined' ? getNullPosition() : yscale[p](d[p])); + } + }); + }; + + function path_brushed(d, i) { + if (__.brushedColor !== null) { + ctx.brushed.strokeStyle = d3.functor(__.brushedColor)(d, i); + } else { + ctx.brushed.strokeStyle = d3.functor(__.color)(d, i); + } + return color_path(d, ctx.brushed) + }; + + function path_foreground(d, i) { + ctx.foreground.strokeStyle = d3.functor(__.color)(d, i); + return color_path(d, ctx.foreground); + }; + + function path_highlight(d, i) { + ctx.highlight.strokeStyle = d3.functor(__.color)(d, i); + return color_path(d, ctx.highlight); + }; + pc.clear = function(layer) { + ctx[layer].clearRect(0, 0, w() + 2, h() + 2); + + // This will make sure that the foreground items are transparent + // without the need for changing the opacity style of the foreground canvas + // as this would stop the css styling from working + if(layer === "brushed" && isBrushed()) { + ctx.brushed.fillStyle = pc.selection.style("background-color"); + ctx.brushed.globalAlpha = 1 - __.alphaOnBrushed; + ctx.brushed.fillRect(0, 0, w() + 2, h() + 2); + ctx.brushed.globalAlpha = __.alpha; + } + return this; + }; + + d3.rebind(pc, axis, "ticks", "orient", "tickValues", "tickSubdivide", "tickSize", "tickPadding", "tickFormat"); + + function flipAxisAndUpdatePCP(dimension) { + var g = pc.svg.selectAll(".dimension"); + + pc.flip(dimension); + + d3.select(this.parentElement) + .transition() + .duration(1100) + .call(axis.scale(yscale[dimension])); + + pc.render(); + } + + function rotateLabels() { + var delta = d3.event.deltaY; + delta = delta < 0 ? -5 : delta; + delta = delta > 0 ? 5 : delta; + + __.dimensionTitleRotation += delta; + pc.svg.selectAll("text.label") + .attr("transform", "translate(0,-5) rotate(" + __.dimensionTitleRotation + ")"); + d3.event.preventDefault(); + } + + function dimensionLabels(d) { + return d in __.dimensionTitles ? __.dimensionTitles[d] : d; // dimension display names + } + + pc.createAxes = function() { + if (g) pc.removeAxes(); + + // Add a group element for each dimension. + g = pc.svg.selectAll(".dimension") + .data(__.dimensions, function(d) { return d; }) + .enter().append("svg:g") + .attr("class", "dimension") + .attr("transform", function(d) { return "translate(" + xscale(d) + ")"; }); + + // Add an axis and title. + g.append("svg:g") + .attr("class", "axis") + .attr("transform", "translate(0,0)") + .each(function(d) { d3.select(this).call(axis.scale(yscale[d])); }) + .append("svg:text") + .attr({ + "text-anchor": "middle", + "y": 0, + "transform": "translate(0,-5) rotate(" + __.dimensionTitleRotation + ")", + "x": 0, + "class": "label" + }) + .text(dimensionLabels) + .on("dblclick", flipAxisAndUpdatePCP) + .on("wheel", rotateLabels); + + if (__.nullValueSeparator=="top") { + pc.svg.append("line") + .attr("x1", 0) + .attr("y1", 1+__.nullValueSeparatorPadding.top) + .attr("x2", w()) + .attr("y2", 1+__.nullValueSeparatorPadding.top) + .attr("stroke-width", 1) + .attr("stroke", "#777") + .attr("fill", "none") + .attr("shape-rendering", "crispEdges"); + } else if (__.nullValueSeparator=="bottom") { + pc.svg.append("line") + .attr("x1", 0) + .attr("y1", h()+1-__.nullValueSeparatorPadding.bottom) + .attr("x2", w()) + .attr("y2", h()+1-__.nullValueSeparatorPadding.bottom) + .attr("stroke-width", 1) + .attr("stroke", "#777") + .attr("fill", "none") + .attr("shape-rendering", "crispEdges"); + } + + flags.axes= true; + return this; + }; + + pc.removeAxes = function() { + g.remove(); + return this; + }; + + pc.updateAxes = function() { + var g_data = pc.svg.selectAll(".dimension").data(__.dimensions); + + // Enter + g_data.enter().append("svg:g") + .attr("class", "dimension") + .attr("transform", function(p) { return "translate(" + position(p) + ")"; }) + .style("opacity", 0) + .append("svg:g") + .attr("class", "axis") + .attr("transform", "translate(0,0)") + .each(function(d) { d3.select(this).call(axis.scale(yscale[d])); }) + .append("svg:text") + .attr({ + "text-anchor": "middle", + "y": 0, + "transform": "translate(0,-5) rotate(" + __.dimensionTitleRotation + ")", + "x": 0, + "class": "label" + }) + .text(dimensionLabels) + .on("dblclick", flipAxisAndUpdatePCP) + .on("wheel", rotateLabels); + + // Update + g_data.attr("opacity", 0); + g_data.select(".axis") + .transition() + .duration(1100) + .each(function(d) { + d3.select(this).call(axis.scale(yscale[d])); + }); + g_data.select(".label") + .transition() + .duration(1100) + .text(dimensionLabels) + .attr("transform", "translate(0,-5) rotate(" + __.dimensionTitleRotation + ")"); + + // Exit + g_data.exit().remove(); + + g = pc.svg.selectAll(".dimension"); + g.transition().duration(1100) + .attr("transform", function(p) { return "translate(" + position(p) + ")"; }) + .style("opacity", 1); + + pc.svg.selectAll(".axis") + .transition() + .duration(1100) + .each(function(d) { d3.select(this).call(axis.scale(yscale[d])); }); + + if (flags.brushable) pc.brushable(); + if (flags.reorderable) pc.reorderable(); + if (pc.brushMode() !== "None") { + var mode = pc.brushMode(); + pc.brushMode("None"); + pc.brushMode(mode); + } + return this; + }; + + // Jason Davies, http://bl.ocks.org/1341281 + pc.reorderable = function() { + if (!g) pc.createAxes(); + + g.style("cursor", "move") + .call(d3.behavior.drag() + .on("dragstart", function(d) { + dragging[d] = this.__origin__ = xscale(d); + }) + .on("drag", function(d) { + dragging[d] = Math.min(w(), Math.max(0, this.__origin__ += d3.event.dx)); + __.dimensions.sort(function(a, b) { return position(a) - position(b); }); + xscale.domain(__.dimensions); + pc.render(); + g.attr("transform", function(d) { return "translate(" + position(d) + ")"; }); + }) + .on("dragend", function(d) { + // Let's see if the order has changed and send out an event if so. + var i = 0, + j = __.dimensions.indexOf(d), + elem = this, + parent = this.parentElement; + + while((elem = elem.previousElementSibling) != null) ++i; + if (i !== j) { + events.axesreorder.call(pc, __.dimensions); + // We now also want to reorder the actual dom elements that represent + // the axes. That is, the g.dimension elements. If we don't do this, + // we get a weird and confusing transition when updateAxes is called. + // This is due to the fact that, initially the nth g.dimension element + // represents the nth axis. However, after a manual reordering, + // without reordering the dom elements, the nth dom elements no longer + // necessarily represents the nth axis. + // + // i is the original index of the dom element + // j is the new index of the dom element + if (i > j) { // Element moved left + parent.insertBefore(this, parent.children[j - 1]); + } else { // Element moved right + if ((j + 1) < parent.children.length) { + parent.insertBefore(this, parent.children[j + 1]); + } else { + parent.appendChild(this); + } + } + } + + delete this.__origin__; + delete dragging[d]; + d3.select(this).transition().attr("transform", "translate(" + xscale(d) + ")"); + pc.render(); + })); + flags.reorderable = true; + return this; + }; + + // Reorder dimensions, such that the highest value (visually) is on the left and + // the lowest on the right. Visual values are determined by the data values in + // the given row. + pc.reorder = function(rowdata) { + var dims = __.dimensions.slice(0); + __.dimensions.sort(function(a, b) { + var pixelDifference = yscale[a](rowdata[a]) - yscale[b](rowdata[b]); + + // Array.sort is not necessarily stable, this means that if pixelDifference is zero + // the ordering of dimensions might change unexpectedly. This is solved by sorting on + // variable name in that case. + if (pixelDifference === 0) { + return a.localeCompare(b); + } // else + return pixelDifference; + }); + + // NOTE: this is relatively cheap given that: + // number of dimensions < number of data items + // Thus we check equality of order to prevent rerendering when this is the case. + var reordered = false; + dims.some(function(val, index) { + reordered = val !== __.dimensions[index]; + return reordered; + }); + + if (reordered) { + xscale.domain(__.dimensions); + var highlighted = __.highlighted.slice(0); + pc.unhighlight(); + + g.transition() + .duration(1500) + .attr("transform", function(d) { + return "translate(" + xscale(d) + ")"; + }); + pc.render(); + + // pc.highlight() does not check whether highlighted is length zero, so we do that here. + if (highlighted.length !== 0) { + pc.highlight(highlighted); + } + } + } + + // pairs of adjacent dimensions + pc.adjacent_pairs = function(arr) { + var ret = []; + for (var i = 0; i < arr.length-1; i++) { + ret.push([arr[i],arr[i+1]]); + }; + return ret; + }; + + var brush = { + modes: { + "None": { + install: function(pc) {}, // Nothing to be done. + uninstall: function(pc) {}, // Nothing to be done. + selected: function() { return []; }, // Nothing to return + brushState: function() { return {}; } + } + }, + mode: "None", + predicate: "AND", + currentMode: function() { + return this.modes[this.mode]; + } + }; + + // This function can be used for 'live' updates of brushes. That is, during the + // specification of a brush, this method can be called to update the view. + // + // @param newSelection - The new set of data items that is currently contained + // by the brushes + function brushUpdated(newSelection) { + __.brushed = newSelection; + events.brush.call(pc,__.brushed); + pc.renderBrushed(); + } + + function brushPredicate(predicate) { + if (!arguments.length) { return brush.predicate; } + + predicate = String(predicate).toUpperCase(); + if (predicate !== "AND" && predicate !== "OR") { + throw "Invalid predicate " + predicate; + } + + brush.predicate = predicate; + __.brushed = brush.currentMode().selected(); + pc.renderBrushed(); + return pc; + } + + pc.brushModes = function() { + return Object.getOwnPropertyNames(brush.modes); + }; + + pc.brushMode = function(mode) { + if (arguments.length === 0) { + return brush.mode; + } + + if (pc.brushModes().indexOf(mode) === -1) { + throw "pc.brushmode: Unsupported brush mode: " + mode; + } + + // Make sure that we don't trigger unnecessary events by checking if the mode + // actually changes. + if (mode !== brush.mode) { + // When changing brush modes, the first thing we need to do is clearing any + // brushes from the current mode, if any. + if (brush.mode !== "None") { + pc.brushReset(); + } + + // Next, we need to 'uninstall' the current brushMode. + brush.modes[brush.mode].uninstall(pc); + // Finally, we can install the requested one. + brush.mode = mode; + brush.modes[brush.mode].install(); + if (mode === "None") { + delete pc.brushPredicate; + } else { + pc.brushPredicate = brushPredicate; + } + } + + return pc; + }; + + // brush mode: 1D-Axes + + (function() { + var brushes = {}; + + function is_brushed(p) { + return !brushes[p].empty(); + } + + // data within extents + function selected() { + var actives = __.dimensions.filter(is_brushed), + extents = actives.map(function(p) { return brushes[p].extent(); }); + + // We don't want to return the full data set when there are no axes brushed. + // Actually, when there are no axes brushed, by definition, no items are + // selected. So, let's avoid the filtering and just return false. + //if (actives.length === 0) return false; + + // Resolves broken examples for now. They expect to get the full dataset back from empty brushes + if (actives.length === 0) return __.data; + + // test if within range + var within = { + "date": function(d,p,dimension) { + if (typeof yscale[p].rangePoints === "function") { // if it is ordinal + return extents[dimension][0] <= yscale[p](d[p]) && yscale[p](d[p]) <= extents[dimension][1] + } else { + return extents[dimension][0] <= d[p] && d[p] <= extents[dimension][1] + } + }, + "number": function(d,p,dimension) { + if (typeof yscale[p].rangePoints === "function") { // if it is ordinal + return extents[dimension][0] <= yscale[p](d[p]) && yscale[p](d[p]) <= extents[dimension][1] + } else { + return extents[dimension][0] <= d[p] && d[p] <= extents[dimension][1] + } + }, + "string": function(d,p,dimension) { + return extents[dimension][0] <= yscale[p](d[p]) && yscale[p](d[p]) <= extents[dimension][1] + } + }; + + return __.data + .filter(function(d) { + switch(brush.predicate) { + case "AND": + return actives.every(function(p, dimension) { + return within[__.types[p]](d,p,dimension); + }); + case "OR": + return actives.some(function(p, dimension) { + return within[__.types[p]](d,p,dimension); + }); + default: + throw "Unknown brush predicate " + __.brushPredicate; + } + }); + }; + + function brushExtents(extents) { + if(typeof(extents) === 'undefined') + { + var extents = {}; + __.dimensions.forEach(function(d) { + var brush = brushes[d]; + if (brush !== undefined && !brush.empty()) { + var extent = brush.extent(); + extent.sort(d3.ascending); + extents[d] = extent; + } + }); + return extents; + } + else + { + //first get all the brush selections + var brushSelections = {}; + g.selectAll('.brush') + .each(function(d) { + brushSelections[d] = d3.select(this); + + }); + + // loop over each dimension and update appropriately (if it was passed in through extents) + __.dimensions.forEach(function(d) { + if (extents[d] === undefined){ + return; + } + + var brush = brushes[d]; + if (brush !== undefined) { + //update the extent + brush.extent(extents[d]); + + //redraw the brush + brush(brushSelections[d]); + + //fire some events + brush.event(brushSelections[d]); + } + }); + + //redraw the chart + pc.renderBrushed(); + } + } + function brushFor(axis) { + var brush = d3.svg.brush(); + + brush + .y(yscale[axis]) + .on("brushstart", function() { + if(d3.event.sourceEvent !== null) { + d3.event.sourceEvent.stopPropagation(); + } + }) + .on("brush", function() { + brushUpdated(selected()); + }) + .on("brushend", function() { + events.brushend.call(pc, __.brushed); + }); + + brushes[axis] = brush; + return brush; + }; + function brushReset(dimension) { + __.brushed = false; + if (g) { + g.selectAll('.brush') + .each(function(d) { + d3.select(this).call( + brushes[d].clear() + ); + }); + pc.renderBrushed(); + } + return this; + }; + + function install() { + if (!g) pc.createAxes(); + + // Add and store a brush for each axis. + g.append("svg:g") + .attr("class", "brush") + .each(function(d) { + d3.select(this).call(brushFor(d)); + }) + .selectAll("rect") + .style("visibility", null) + .attr("x", -15) + .attr("width", 30); + + pc.brushExtents = brushExtents; + pc.brushReset = brushReset; + return pc; + }; + + brush.modes["1D-axes"] = { + install: install, + uninstall: function() { + g.selectAll(".brush").remove(); + brushes = {}; + delete pc.brushExtents; + delete pc.brushReset; + }, + selected: selected, + brushState: brushExtents + } + })(); + // brush mode: 2D-strums + // bl.ocks.org/syntagmatic/5441022 + + (function() { + var strums = {}, + strumRect; + + function drawStrum(strum, activePoint) { + var svg = pc.selection.select("svg").select("g#strums"), + id = strum.dims.i, + points = [strum.p1, strum.p2], + line = svg.selectAll("line#strum-" + id).data([strum]), + circles = svg.selectAll("circle#strum-" + id).data(points), + drag = d3.behavior.drag(); + + line.enter() + .append("line") + .attr("id", "strum-" + id) + .attr("class", "strum"); + + line + .attr("x1", function(d) { return d.p1[0]; }) + .attr("y1", function(d) { return d.p1[1]; }) + .attr("x2", function(d) { return d.p2[0]; }) + .attr("y2", function(d) { return d.p2[1]; }) + .attr("stroke", "black") + .attr("stroke-width", 2); + + drag + .on("drag", function(d, i) { + var ev = d3.event; + i = i + 1; + strum["p" + i][0] = Math.min(Math.max(strum.minX + 1, ev.x), strum.maxX); + strum["p" + i][1] = Math.min(Math.max(strum.minY, ev.y), strum.maxY); + drawStrum(strum, i - 1); + }) + .on("dragend", onDragEnd()); + + circles.enter() + .append("circle") + .attr("id", "strum-" + id) + .attr("class", "strum"); + + circles + .attr("cx", function(d) { return d[0]; }) + .attr("cy", function(d) { return d[1]; }) + .attr("r", 5) + .style("opacity", function(d, i) { + return (activePoint !== undefined && i === activePoint) ? 0.8 : 0; + }) + .on("mouseover", function() { + d3.select(this).style("opacity", 0.8); + }) + .on("mouseout", function() { + d3.select(this).style("opacity", 0); + }) + .call(drag); + } + + function dimensionsForPoint(p) { + var dims = { i: -1, left: undefined, right: undefined }; + __.dimensions.some(function(dim, i) { + if (xscale(dim) < p[0]) { + var next = __.dimensions[i + 1]; + dims.i = i; + dims.left = dim; + dims.right = next; + return false; + } + return true; + }); + + if (dims.left === undefined) { + // Event on the left side of the first axis. + dims.i = 0; + dims.left = __.dimensions[0]; + dims.right = __.dimensions[1]; + } else if (dims.right === undefined) { + // Event on the right side of the last axis + dims.i = __.dimensions.length - 1; + dims.right = dims.left; + dims.left = __.dimensions[__.dimensions.length - 2]; + } + + return dims; + } + + function onDragStart() { + // First we need to determine between which two axes the sturm was started. + // This will determine the freedom of movement, because a strum can + // logically only happen between two axes, so no movement outside these axes + // should be allowed. + return function() { + var p = d3.mouse(strumRect[0][0]), + dims, + strum; + + p[0] = p[0] - __.margin.left; + p[1] = p[1] - __.margin.top; + + dims = dimensionsForPoint(p), + strum = { + p1: p, + dims: dims, + minX: xscale(dims.left), + maxX: xscale(dims.right), + minY: 0, + maxY: h() + }; + + strums[dims.i] = strum; + strums.active = dims.i; + + // Make sure that the point is within the bounds + strum.p1[0] = Math.min(Math.max(strum.minX, p[0]), strum.maxX); + strum.p2 = strum.p1.slice(); + }; + } + + function onDrag() { + return function() { + var ev = d3.event, + strum = strums[strums.active]; + + // Make sure that the point is within the bounds + strum.p2[0] = Math.min(Math.max(strum.minX + 1, ev.x - __.margin.left), strum.maxX); + strum.p2[1] = Math.min(Math.max(strum.minY, ev.y - __.margin.top), strum.maxY); + drawStrum(strum, 1); + }; + } + + function containmentTest(strum, width) { + var p1 = [strum.p1[0] - strum.minX, strum.p1[1] - strum.minX], + p2 = [strum.p2[0] - strum.minX, strum.p2[1] - strum.minX], + m1 = 1 - width / p1[0], + b1 = p1[1] * (1 - m1), + m2 = 1 - width / p2[0], + b2 = p2[1] * (1 - m2); + + // test if point falls between lines + return function(p) { + var x = p[0], + y = p[1], + y1 = m1 * x + b1, + y2 = m2 * x + b2; + + if (y > Math.min(y1, y2) && y < Math.max(y1, y2)) { + return true; + } + + return false; + }; + } + + function selected() { + var ids = Object.getOwnPropertyNames(strums), + brushed = __.data; + + // Get the ids of the currently active strums. + ids = ids.filter(function(d) { + return !isNaN(d); + }); + + function crossesStrum(d, id) { + var strum = strums[id], + test = containmentTest(strum, strums.width(id)), + d1 = strum.dims.left, + d2 = strum.dims.right, + y1 = yscale[d1], + y2 = yscale[d2], + point = [y1(d[d1]) - strum.minX, y2(d[d2]) - strum.minX]; + return test(point); + } + + if (ids.length === 0) { return brushed; } + + return brushed.filter(function(d) { + switch(brush.predicate) { + case "AND": + return ids.every(function(id) { return crossesStrum(d, id); }); + case "OR": + return ids.some(function(id) { return crossesStrum(d, id); }); + default: + throw "Unknown brush predicate " + __.brushPredicate; + } + }); + } + + function removeStrum() { + var strum = strums[strums.active], + svg = pc.selection.select("svg").select("g#strums"); + + delete strums[strums.active]; + strums.active = undefined; + svg.selectAll("line#strum-" + strum.dims.i).remove(); + svg.selectAll("circle#strum-" + strum.dims.i).remove(); + } + + function onDragEnd() { + return function() { + var brushed = __.data, + strum = strums[strums.active]; + + // Okay, somewhat unexpected, but not totally unsurprising, a mousclick is + // considered a drag without move. So we have to deal with that case + if (strum && strum.p1[0] === strum.p2[0] && strum.p1[1] === strum.p2[1]) { + removeStrum(strums); + } + + brushed = selected(strums); + strums.active = undefined; + __.brushed = brushed; + pc.renderBrushed(); + events.brushend.call(pc, __.brushed); + }; + } + + function brushReset(strums) { + return function() { + var ids = Object.getOwnPropertyNames(strums).filter(function(d) { + return !isNaN(d); + }); + + ids.forEach(function(d) { + strums.active = d; + removeStrum(strums); + }); + onDragEnd(strums)(); + }; + } + + function install() { + var drag = d3.behavior.drag(); + + // Map of current strums. Strums are stored per segment of the PC. A segment, + // being the area between two axes. The left most area is indexed at 0. + strums.active = undefined; + // Returns the width of the PC segment where currently a strum is being + // placed. NOTE: even though they are evenly spaced in our current + // implementation, we keep for when non-even spaced segments are supported as + // well. + strums.width = function(id) { + var strum = strums[id]; + + if (strum === undefined) { + return undefined; + } + + return strum.maxX - strum.minX; + }; + + pc.on("axesreorder.strums", function() { + var ids = Object.getOwnPropertyNames(strums).filter(function(d) { + return !isNaN(d); + }); + + // Checks if the first dimension is directly left of the second dimension. + function consecutive(first, second) { + var length = __.dimensions.length; + return __.dimensions.some(function(d, i) { + return (d === first) + ? i + i < length && __.dimensions[i + 1] === second + : false; + }); + } + + if (ids.length > 0) { // We have some strums, which might need to be removed. + ids.forEach(function(d) { + var dims = strums[d].dims; + strums.active = d; + // If the two dimensions of the current strum are not next to each other + // any more, than we'll need to remove the strum. Otherwise we keep it. + if (!consecutive(dims.left, dims.right)) { + removeStrum(strums); + } + }); + onDragEnd(strums)(); + } + }); + + // Add a new svg group in which we draw the strums. + pc.selection.select("svg").append("g") + .attr("id", "strums") + .attr("transform", "translate(" + __.margin.left + "," + __.margin.top + ")"); + + // Install the required brushReset function + pc.brushReset = brushReset(strums); + + drag + .on("dragstart", onDragStart(strums)) + .on("drag", onDrag(strums)) + .on("dragend", onDragEnd(strums)); + + // NOTE: The styling needs to be done here and not in the css. This is because + // for 1D brushing, the canvas layers should not listen to + // pointer-events. + strumRect = pc.selection.select("svg").insert("rect", "g#strums") + .attr("id", "strum-events") + .attr("x", __.margin.left) + .attr("y", __.margin.top) + .attr("width", w()) + .attr("height", h() + 2) + .style("opacity", 0) + .call(drag); + } + + brush.modes["2D-strums"] = { + install: install, + uninstall: function() { + pc.selection.select("svg").select("g#strums").remove(); + pc.selection.select("svg").select("rect#strum-events").remove(); + pc.on("axesreorder.strums", undefined); + delete pc.brushReset; + + strumRect = undefined; + }, + selected: selected, + brushState: function () { return strums; } + }; + + }()); + + // brush mode: 1D-Axes with multiple extents + // requires d3.svg.multibrush + + (function() { + if (typeof d3.svg.multibrush !== 'function') { + return; + } + var brushes = {}; + + function is_brushed(p) { + return !brushes[p].empty(); + } + + // data within extents + function selected() { + var actives = __.dimensions.filter(is_brushed), + extents = actives.map(function(p) { return brushes[p].extent(); }); + + // We don't want to return the full data set when there are no axes brushed. + // Actually, when there are no axes brushed, by definition, no items are + // selected. So, let's avoid the filtering and just return false. + //if (actives.length === 0) return false; + + // Resolves broken examples for now. They expect to get the full dataset back from empty brushes + if (actives.length === 0) return __.data; + + // test if within range + var within = { + "date": function(d,p,dimension,b) { + if (typeof yscale[p].rangePoints === "function") { // if it is ordinal + return b[0] <= yscale[p](d[p]) && yscale[p](d[p]) <= b[1] + } else { + return b[0] <= d[p] && d[p] <= b[1] + } + }, + "number": function(d,p,dimension,b) { + if (typeof yscale[p].rangePoints === "function") { // if it is ordinal + return b[0] <= yscale[p](d[p]) && yscale[p](d[p]) <= b[1] + } else { + return b[0] <= d[p] && d[p] <= b[1] + } + }, + "string": function(d,p,dimension,b) { + return b[0] <= yscale[p](d[p]) && yscale[p](d[p]) <= b[1] + } + }; + + return __.data + .filter(function(d) { + switch(brush.predicate) { + case "AND": + return actives.every(function(p, dimension) { + return extents[dimension].some(function(b) { + return within[__.types[p]](d,p,dimension,b); + }); + }); + case "OR": + return actives.some(function(p, dimension) { + return extents[dimension].some(function(b) { + return within[__.types[p]](d,p,dimension,b); + }); + }); + default: + throw "Unknown brush predicate " + __.brushPredicate; + } + }); + }; + + function brushExtents() { + var extents = {}; + __.dimensions.forEach(function(d) { + var brush = brushes[d]; + if (brush !== undefined && !brush.empty()) { + var extent = brush.extent(); + extents[d] = extent; + } + }); + return extents; + } + + function brushFor(axis) { + var brush = d3.svg.multibrush(); + + brush + .y(yscale[axis]) + .on("brushstart", function() { + if(d3.event.sourceEvent !== null) { + d3.event.sourceEvent.stopPropagation(); + } + }) + .on("brush", function() { + brushUpdated(selected()); + }) + .on("brushend", function() { + // d3.svg.multibrush clears extents just before calling 'brushend' + // so we have to update here again. + // This fixes issue #103 for now, but should be changed in d3.svg.multibrush + // to avoid unnecessary computation. + brushUpdated(selected()); + events.brushend.call(pc, __.brushed); + }) + .extentAdaption(function(selection) { + selection + .style("visibility", null) + .attr("x", -15) + .attr("width", 30); + }) + .resizeAdaption(function(selection) { + selection + .selectAll("rect") + .attr("x", -15) + .attr("width", 30); + }); + + brushes[axis] = brush; + return brush; + } + + function brushReset(dimension) { + __.brushed = false; + if (g) { + g.selectAll('.brush') + .each(function(d) { + d3.select(this).call( + brushes[d].clear() + ); + }); + pc.renderBrushed(); + } + return this; + }; + + function install() { + if (!g) pc.createAxes(); + + // Add and store a brush for each axis. + g.append("svg:g") + .attr("class", "brush") + .each(function(d) { + d3.select(this).call(brushFor(d)); + }) + .selectAll("rect") + .style("visibility", null) + .attr("x", -15) + .attr("width", 30); + + pc.brushExtents = brushExtents; + pc.brushReset = brushReset; + return pc; + } + + brush.modes["1D-axes-multi"] = { + install: install, + uninstall: function() { + g.selectAll(".brush").remove(); + brushes = {}; + delete pc.brushExtents; + delete pc.brushReset; + }, + selected: selected, + brushState: brushExtents + } + })(); + // brush mode: angular + // code based on 2D.strums.js + + (function() { + var arcs = {}, + strumRect; + + function drawStrum(arc, activePoint) { + var svg = pc.selection.select("svg").select("g#arcs"), + id = arc.dims.i, + points = [arc.p2, arc.p3], + line = svg.selectAll("line#arc-" + id).data([{p1:arc.p1,p2:arc.p2},{p1:arc.p1,p2:arc.p3}]), + circles = svg.selectAll("circle#arc-" + id).data(points), + drag = d3.behavior.drag(), + path = svg.selectAll("path#arc-" + id).data([arc]); + + path.enter() + .append("path") + .attr("id", "arc-" + id) + .attr("class", "arc") + .style("fill", "orange") + .style("opacity", 0.5); + + path + .attr("d", arc.arc) + .attr("transform", "translate(" + arc.p1[0] + "," + arc.p1[1] + ")"); + + line.enter() + .append("line") + .attr("id", "arc-" + id) + .attr("class", "arc"); + + line + .attr("x1", function(d) { return d.p1[0]; }) + .attr("y1", function(d) { return d.p1[1]; }) + .attr("x2", function(d) { return d.p2[0]; }) + .attr("y2", function(d) { return d.p2[1]; }) + .attr("stroke", "black") + .attr("stroke-width", 2); + + drag + .on("drag", function(d, i) { + var ev = d3.event, + angle = 0; + + i = i + 2; + + arc["p" + i][0] = Math.min(Math.max(arc.minX + 1, ev.x), arc.maxX); + arc["p" + i][1] = Math.min(Math.max(arc.minY, ev.y), arc.maxY); + + angle = i === 3 ? arcs.startAngle(id) : arcs.endAngle(id); + + if ((arc.startAngle < Math.PI && arc.endAngle < Math.PI && angle < Math.PI) || + (arc.startAngle >= Math.PI && arc.endAngle >= Math.PI && angle >= Math.PI)) { + + if (i === 2) { + arc.endAngle = angle; + arc.arc.endAngle(angle); + } else if (i === 3) { + arc.startAngle = angle; + arc.arc.startAngle(angle); + } + + } + + drawStrum(arc, i - 2); + }) + .on("dragend", onDragEnd()); + + circles.enter() + .append("circle") + .attr("id", "arc-" + id) + .attr("class", "arc"); + + circles + .attr("cx", function(d) { return d[0]; }) + .attr("cy", function(d) { return d[1]; }) + .attr("r", 5) + .style("opacity", function(d, i) { + return (activePoint !== undefined && i === activePoint) ? 0.8 : 0; + }) + .on("mouseover", function() { + d3.select(this).style("opacity", 0.8); + }) + .on("mouseout", function() { + d3.select(this).style("opacity", 0); + }) + .call(drag); + } + + function dimensionsForPoint(p) { + var dims = { i: -1, left: undefined, right: undefined }; + __.dimensions.some(function(dim, i) { + if (xscale(dim) < p[0]) { + var next = __.dimensions[i + 1]; + dims.i = i; + dims.left = dim; + dims.right = next; + return false; + } + return true; + }); + + if (dims.left === undefined) { + // Event on the left side of the first axis. + dims.i = 0; + dims.left = __.dimensions[0]; + dims.right = __.dimensions[1]; + } else if (dims.right === undefined) { + // Event on the right side of the last axis + dims.i = __.dimensions.length - 1; + dims.right = dims.left; + dims.left = __.dimensions[__.dimensions.length - 2]; + } + + return dims; + } + + function onDragStart() { + // First we need to determine between which two axes the arc was started. + // This will determine the freedom of movement, because a arc can + // logically only happen between two axes, so no movement outside these axes + // should be allowed. + return function() { + var p = d3.mouse(strumRect[0][0]), + dims, + arc; + + p[0] = p[0] - __.margin.left; + p[1] = p[1] - __.margin.top; + + dims = dimensionsForPoint(p), + arc = { + p1: p, + dims: dims, + minX: xscale(dims.left), + maxX: xscale(dims.right), + minY: 0, + maxY: h(), + startAngle: undefined, + endAngle: undefined, + arc: d3.svg.arc().innerRadius(0) + }; + + arcs[dims.i] = arc; + arcs.active = dims.i; + + // Make sure that the point is within the bounds + arc.p1[0] = Math.min(Math.max(arc.minX, p[0]), arc.maxX); + arc.p2 = arc.p1.slice(); + arc.p3 = arc.p1.slice(); + }; + } + + function onDrag() { + return function() { + var ev = d3.event, + arc = arcs[arcs.active]; + + // Make sure that the point is within the bounds + arc.p2[0] = Math.min(Math.max(arc.minX + 1, ev.x - __.margin.left), arc.maxX); + arc.p2[1] = Math.min(Math.max(arc.minY, ev.y - __.margin.top), arc.maxY); + arc.p3 = arc.p2.slice(); + // console.log(arcs.angle(arcs.active)); + // console.log(signedAngle(arcs.unsignedAngle(arcs.active))); + drawStrum(arc, 1); + }; + } + + // some helper functions + function hypothenuse(a, b) { + return Math.sqrt(a*a + b*b); + } + + var rad = (function() { + var c = Math.PI / 180; + return function(angle) { + return angle * c; + }; + })(); + + var deg = (function() { + var c = 180 / Math.PI; + return function(angle) { + return angle * c; + }; + })(); + + // [0, 2*PI] -> [-PI/2, PI/2] + var signedAngle = function(angle) { + var ret = angle; + if (angle > Math.PI) { + ret = angle - 1.5 * Math.PI; + ret = angle - 1.5 * Math.PI; + } else { + ret = angle - 0.5 * Math.PI; + ret = angle - 0.5 * Math.PI; + } + return -ret; + } + + /** + * angles are stored in radians from in [0, 2*PI], where 0 in 12 o'clock. + * However, one can only select lines from 0 to PI, so we compute the + * 'signed' angle, where 0 is the horizontal line (3 o'clock), and +/- PI/2 + * are 12 and 6 o'clock respectively. + */ + function containmentTest(arc) { + var startAngle = signedAngle(arc.startAngle); + var endAngle = signedAngle(arc.endAngle); + + if (startAngle > endAngle) { + var tmp = startAngle; + startAngle = endAngle; + endAngle = tmp; + } + + // test if segment angle is contained in angle interval + return function(a) { + + if (a >= startAngle && a <= endAngle) { + return true; + } + + return false; + }; + } + + function selected() { + var ids = Object.getOwnPropertyNames(arcs), + brushed = __.data; + + // Get the ids of the currently active arcs. + ids = ids.filter(function(d) { + return !isNaN(d); + }); + + function crossesStrum(d, id) { + var arc = arcs[id], + test = containmentTest(arc), + d1 = arc.dims.left, + d2 = arc.dims.right, + y1 = yscale[d1], + y2 = yscale[d2], + a = arcs.width(id), + b = y1(d[d1]) - y2(d[d2]), + c = hypothenuse(a, b), + angle = Math.asin(b/c); // rad in [-PI/2, PI/2] + return test(angle); + } + + if (ids.length === 0) { return brushed; } + + return brushed.filter(function(d) { + switch(brush.predicate) { + case "AND": + return ids.every(function(id) { return crossesStrum(d, id); }); + case "OR": + return ids.some(function(id) { return crossesStrum(d, id); }); + default: + throw "Unknown brush predicate " + __.brushPredicate; + } + }); + } + + function removeStrum() { + var arc = arcs[arcs.active], + svg = pc.selection.select("svg").select("g#arcs"); + + delete arcs[arcs.active]; + arcs.active = undefined; + svg.selectAll("line#arc-" + arc.dims.i).remove(); + svg.selectAll("circle#arc-" + arc.dims.i).remove(); + svg.selectAll("path#arc-" + arc.dims.i).remove(); + } + + function onDragEnd() { + return function() { + var brushed = __.data, + arc = arcs[arcs.active]; + + // Okay, somewhat unexpected, but not totally unsurprising, a mousclick is + // considered a drag without move. So we have to deal with that case + if (arc && arc.p1[0] === arc.p2[0] && arc.p1[1] === arc.p2[1]) { + removeStrum(arcs); + } + + if (arc) { + var angle = arcs.startAngle(arcs.active); + + arc.startAngle = angle; + arc.endAngle = angle; + arc.arc + .outerRadius(arcs.length(arcs.active)) + .startAngle(angle) + .endAngle(angle); + } + + + brushed = selected(arcs); + arcs.active = undefined; + __.brushed = brushed; + pc.renderBrushed(); + events.brushend.call(pc, __.brushed); + }; + } + + function brushReset(arcs) { + return function() { + var ids = Object.getOwnPropertyNames(arcs).filter(function(d) { + return !isNaN(d); + }); + + ids.forEach(function(d) { + arcs.active = d; + removeStrum(arcs); + }); + onDragEnd(arcs)(); + }; + } + + function install() { + var drag = d3.behavior.drag(); + + // Map of current arcs. arcs are stored per segment of the PC. A segment, + // being the area between two axes. The left most area is indexed at 0. + arcs.active = undefined; + // Returns the width of the PC segment where currently a arc is being + // placed. NOTE: even though they are evenly spaced in our current + // implementation, we keep for when non-even spaced segments are supported as + // well. + arcs.width = function(id) { + var arc = arcs[id]; + + if (arc === undefined) { + return undefined; + } + + return arc.maxX - arc.minX; + }; + + // returns angles in [-PI/2, PI/2] + angle = function(p1, p2) { + var a = p1[0] - p2[0], + b = p1[1] - p2[1], + c = hypothenuse(a, b); + + return Math.asin(b/c); + } + + // returns angles in [0, 2 * PI] + arcs.endAngle = function(id) { + var arc = arcs[id]; + if (arc === undefined) { + return undefined; + } + var sAngle = angle(arc.p1, arc.p2), + uAngle = -sAngle + Math.PI / 2; + + if (arc.p1[0] > arc.p2[0]) { + uAngle = 2 * Math.PI - uAngle; + } + + return uAngle; + } + + arcs.startAngle = function(id) { + var arc = arcs[id]; + if (arc === undefined) { + return undefined; + } + + var sAngle = angle(arc.p1, arc.p3), + uAngle = -sAngle + Math.PI / 2; + + if (arc.p1[0] > arc.p3[0]) { + uAngle = 2 * Math.PI - uAngle; + } + + return uAngle; + } + + arcs.length = function(id) { + var arc = arcs[id]; + + if (arc === undefined) { + return undefined; + } + + var a = arc.p1[0] - arc.p2[0], + b = arc.p1[1] - arc.p2[1], + c = hypothenuse(a, b); + + return(c); + } + + pc.on("axesreorder.arcs", function() { + var ids = Object.getOwnPropertyNames(arcs).filter(function(d) { + return !isNaN(d); + }); + + // Checks if the first dimension is directly left of the second dimension. + function consecutive(first, second) { + var length = __.dimensions.length; + return __.dimensions.some(function(d, i) { + return (d === first) + ? i + i < length && __.dimensions[i + 1] === second + : false; + }); + } + + if (ids.length > 0) { // We have some arcs, which might need to be removed. + ids.forEach(function(d) { + var dims = arcs[d].dims; + arcs.active = d; + // If the two dimensions of the current arc are not next to each other + // any more, than we'll need to remove the arc. Otherwise we keep it. + if (!consecutive(dims.left, dims.right)) { + removeStrum(arcs); + } + }); + onDragEnd(arcs)(); + } + }); + + // Add a new svg group in which we draw the arcs. + pc.selection.select("svg").append("g") + .attr("id", "arcs") + .attr("transform", "translate(" + __.margin.left + "," + __.margin.top + ")"); + + // Install the required brushReset function + pc.brushReset = brushReset(arcs); + + drag + .on("dragstart", onDragStart(arcs)) + .on("drag", onDrag(arcs)) + .on("dragend", onDragEnd(arcs)); + + // NOTE: The styling needs to be done here and not in the css. This is because + // for 1D brushing, the canvas layers should not listen to + // pointer-events. + strumRect = pc.selection.select("svg").insert("rect", "g#arcs") + .attr("id", "arc-events") + .attr("x", __.margin.left) + .attr("y", __.margin.top) + .attr("width", w()) + .attr("height", h() + 2) + .style("opacity", 0) + .call(drag); + } + + brush.modes["angular"] = { + install: install, + uninstall: function() { + pc.selection.select("svg").select("g#arcs").remove(); + pc.selection.select("svg").select("rect#arc-events").remove(); + pc.on("axesreorder.arcs", undefined); + delete pc.brushReset; + + strumRect = undefined; + }, + selected: selected, + brushState: function () { return arcs; } + }; + + }()); + + pc.interactive = function() { + flags.interactive = true; + return this; + }; + + // expose a few objects + pc.xscale = xscale; + pc.yscale = yscale; + pc.ctx = ctx; + pc.canvas = canvas; + pc.g = function() { return g; }; + + // rescale for height, width and margins + // TODO currently assumes chart is brushable, and destroys old brushes + pc.resize = function() { + // selection size + pc.selection.select("svg") + .attr("width", __.width) + .attr("height", __.height) + pc.svg.attr("transform", "translate(" + __.margin.left + "," + __.margin.top + ")"); + + // FIXME: the current brush state should pass through + if (flags.brushable) pc.brushReset(); + + // scales + pc.autoscale(); + + // axes, destroys old brushes. + if (g) pc.createAxes(); + if (flags.brushable) pc.brushable(); + if (flags.reorderable) pc.reorderable(); + + events.resize.call(this, {width: __.width, height: __.height, margin: __.margin}); + return this; + }; + + // highlight an array of data + pc.highlight = function(data) { + if (arguments.length === 0) { + return __.highlighted; + } + + __.highlighted = data; + pc.clear("highlight"); + d3.selectAll([canvas.foreground, canvas.brushed]).classed("faded", true); + data.forEach(path_highlight); + events.highlight.call(this, data); + return this; + }; + + // clear highlighting + pc.unhighlight = function() { + __.highlighted = []; + pc.clear("highlight"); + d3.selectAll([canvas.foreground, canvas.brushed]).classed("faded", false); + return this; + }; + + // calculate 2d intersection of line a->b with line c->d + // points are objects with x and y properties + pc.intersection = function(a, b, c, d) { + return { + x: ((a.x * b.y - a.y * b.x) * (c.x - d.x) - (a.x - b.x) * (c.x * d.y - c.y * d.x)) / ((a.x - b.x) * (c.y - d.y) - (a.y - b.y) * (c.x - d.x)), + y: ((a.x * b.y - a.y * b.x) * (c.y - d.y) - (a.y - b.y) * (c.x * d.y - c.y * d.x)) / ((a.x - b.x) * (c.y - d.y) - (a.y - b.y) * (c.x - d.x)) + }; + }; + + function position(d) { + var v = dragging[d]; + return v == null ? xscale(d) : v; + } + pc.version = "0.7.0"; + // this descriptive text should live with other introspective methods + pc.toString = function() { return "Parallel Coordinates: " + __.dimensions.length + " dimensions (" + d3.keys(__.data[0]).length + " total) , " + __.data.length + " rows"; }; + + return pc; + }; + + d3.renderQueue = (function(func) { + var _queue = [], // data to be rendered + _rate = 10, // number of calls per frame + _clear = function() {}, // clearing function + _i = 0; // current iteration + + var rq = function(data) { + if (data) rq.data(data); + rq.invalidate(); + _clear(); + rq.render(); + }; + + rq.render = function() { + _i = 0; + var valid = true; + rq.invalidate = function() { valid = false; }; + + function doFrame() { + if (!valid) return true; + if (_i > _queue.length) return true; + + // Typical d3 behavior is to pass a data item *and* its index. As the + // render queue splits the original data set, we'll have to be slightly + // more carefull about passing the correct index with the data item. + var end = Math.min(_i + _rate, _queue.length); + for (var i = _i; i < end; i++) { + func(_queue[i], i); + } + _i += _rate; + } + + d3.timer(doFrame); + }; + + rq.data = function(data) { + rq.invalidate(); + _queue = data.slice(0); + return rq; + }; + + rq.rate = function(value) { + if (!arguments.length) return _rate; + _rate = value; + return rq; + }; + + rq.remaining = function() { + return _queue.length - _i; + }; + + // clear the canvas + rq.clear = function(func) { + if (!arguments.length) { + _clear(); + return rq; + } + _clear = func; + return rq; + }; + + rq.invalidate = function() {}; + + return rq; + }); diff --git a/panoramix/static/lib/para/divgrid.js b/panoramix/assets/vendor/parallel_coordinates/divgrid.js similarity index 94% rename from panoramix/static/lib/para/divgrid.js rename to panoramix/assets/vendor/parallel_coordinates/divgrid.js index 532a63d9c175..e4086e8bae5b 100644 --- a/panoramix/static/lib/para/divgrid.js +++ b/panoramix/assets/vendor/parallel_coordinates/divgrid.js @@ -1,5 +1,5 @@ -// http://bl.ocks.org/3687826 -d3.divgrid = function(config) { +// from http://bl.ocks.org/3687826 +module.exports = function(config) { var columns = []; var dg = function(selection) { diff --git a/panoramix/static/lib/pygments.css b/panoramix/assets/vendor/pygments.css similarity index 100% rename from panoramix/static/lib/pygments.css rename to panoramix/assets/vendor/pygments.css diff --git a/panoramix/assets/javascripts/vendor/select2.sortable.js b/panoramix/assets/vendor/select2.sortable.js similarity index 100% rename from panoramix/assets/javascripts/vendor/select2.sortable.js rename to panoramix/assets/vendor/select2.sortable.js diff --git a/panoramix/static/widgets/viz_bignumber.css b/panoramix/assets/visualizations/big_number.css similarity index 100% rename from panoramix/static/widgets/viz_bignumber.css rename to panoramix/assets/visualizations/big_number.css diff --git a/panoramix/static/widgets/viz_bignumber.js b/panoramix/assets/visualizations/big_number.js similarity index 95% rename from panoramix/static/widgets/viz_bignumber.js rename to panoramix/assets/visualizations/big_number.js index 4d76a2f9fc22..78850c960821 100644 --- a/panoramix/static/widgets/viz_bignumber.js +++ b/panoramix/assets/visualizations/big_number.js @@ -1,4 +1,10 @@ -px.registerViz('big_number', function(slice) { +// JS +var d3 = window.d3 || require('d3'); + +// CSS +require('./big_number.css'); + +function bigNumberVis(slice) { var data_attribute = slice.data; var div = d3.select(slice.selector); @@ -22,12 +28,12 @@ px.registerViz('big_number', function(slice) { var svg = div.append('svg'); svg.attr("width", width); svg.attr("height", height); - data = json.data; + var data = json.data; var compare_suffix = ' ' + json.compare_suffix; var v_compare = null; var v = data[data.length - 1][1]; if (json.compare_lag > 0){ - pos = data.length - (json.compare_lag + 1); + var pos = data.length - (json.compare_lag + 1); if (pos >= 0){ v_compare = (v / data[pos][1]) - 1; } @@ -141,5 +147,6 @@ px.registerViz('big_number', function(slice) { render: render, resize: render, } +}; -}); +module.exports = bigNumberVis; diff --git a/panoramix/static/widgets/viz_directed_force.css b/panoramix/assets/visualizations/directed_force.css similarity index 100% rename from panoramix/static/widgets/viz_directed_force.css rename to panoramix/assets/visualizations/directed_force.css diff --git a/panoramix/assets/visualizations/directed_force.js b/panoramix/assets/visualizations/directed_force.js new file mode 100644 index 000000000000..812cc769eded --- /dev/null +++ b/panoramix/assets/visualizations/directed_force.js @@ -0,0 +1,165 @@ +// JS +var d3 = window.d3 || require('d3'); + +// CSS +require('./directed_force.css'); + +/* Modified from http://bl.ocks.org/d3noob/5141278 */ +function directedForceVis(slice) { + var div = d3.select(slice.selector); + var link_length = slice.data.form_data['link_length'] || 200; + var charge = slice.data.form_data['charge'] || -500; + + var render = function() { + var width = slice.width(); + var height = slice.height() - 25; + d3.json(slice.jsonEndpoint(), function(error, json) { + + if (error != null){ + slice.error(error.responseText); + return ''; + } + var links = json.data; + var nodes = {}; + // Compute the distinct nodes from the links. + links.forEach(function(link) { + link.source = nodes[link.source] || (nodes[link.source] = {name: link.source}); + link.target = nodes[link.target] || (nodes[link.target] = {name: link.target}); + link.value = +link.value; + + var target_name = link.target.name; + var source_name = link.source.name; + + if (nodes[target_name]['total'] === undefined) { + nodes[target_name]['total'] = link.value; + } + if (nodes[source_name]['total'] === undefined) { + nodes[source_name]['total'] = 0; + } + if (nodes[target_name]['max'] === undefined) { + nodes[target_name]['max'] = 0; + } + if (link.value > nodes[target_name]['max']) { + nodes[target_name]['max'] = link.value; + } + if (nodes[target_name]['min'] === undefined) { + nodes[target_name]['min'] = 0; + } + if (link.value > nodes[target_name]['min']) { + nodes[target_name]['min'] = link.value; + } + + nodes[target_name]['total'] += link.value; + }); + + var force = d3.layout.force() + .nodes(d3.values(nodes)) + .links(links) + .size([width, height]) + .linkDistance(link_length) + .charge(charge) + .on("tick", tick) + .start(); + + var svg = div.append("svg") + .attr("width", width) + .attr("height", height); + + // build the arrow. + svg.append("svg:defs").selectAll("marker") + .data(["end"]) // Different link/path types can be defined here + .enter().append("svg:marker") // This section adds in the arrows + .attr("id", String) + .attr("viewBox", "0 -5 10 10") + .attr("refX", 15) + .attr("refY", -1.5) + .attr("markerWidth", 6) + .attr("markerHeight", 6) + .attr("orient", "auto") + .append("svg:path") + .attr("d", "M0,-5L10,0L0,5"); + + var edgeScale = d3.scale.linear() + .range([0.1, 0.5]); + // add the links and the arrows + var path = svg.append("svg:g").selectAll("path") + .data(force.links()) + .enter().append("svg:path") + .attr("class", "link") + .style("opacity", function(d){ + return edgeScale(d.value/d.target.max); + }) + .attr("marker-end", "url(#end)"); + + // define the nodes + var node = svg.selectAll(".node") + .data(force.nodes()) + .enter().append("g") + .attr("class", "node") + .on("mouseenter", function(d){ + d3.select(this) + .select("circle") + .transition() + .style('stroke-width', 5); + + d3.select(this) + .select("text") + .transition() + .style('font-size', 25); + }) + .on("mouseleave", function(d){ + d3.select(this) + .select("circle") + .transition() + .style('stroke-width', 1.5); + d3.select(this) + .select("text") + .transition() + .style('font-size', 12); + }) + .call(force.drag); + + // add the nodes + var ext = d3.extent(d3.values(nodes), function(d) { return Math.sqrt(d.total); }); + var circleScale = d3.scale.linear() + .domain(ext) + .range([3, 30]); + + node.append("circle") + .attr("r", function(d){return circleScale(Math.sqrt(d.total));}); + + // add the text + node.append("text") + .attr("x", 6) + .attr("dy", ".35em") + .text(function(d) { return d.name; }); + + // add the curvy lines + function tick() { + path.attr("d", function(d) { + var dx = d.target.x - d.source.x, + dy = d.target.y - d.source.y, + dr = Math.sqrt(dx * dx + dy * dy); + return "M" + + d.source.x + "," + + d.source.y + "A" + + dr + "," + dr + " 0 0,1 " + + d.target.x + "," + + d.target.y; + }); + + node.attr("transform", function(d) { + return "translate(" + d.x + "," + d.y + ")"; + }); + } + + slice.done(json); + }); + }; + return { + render: render, + resize: render, + }; +} + +module.exports = directedForceVis; diff --git a/panoramix/static/widgets/viz_filter_box.css b/panoramix/assets/visualizations/filter_box.css similarity index 100% rename from panoramix/static/widgets/viz_filter_box.css rename to panoramix/assets/visualizations/filter_box.css diff --git a/panoramix/static/widgets/viz_filter_box.js b/panoramix/assets/visualizations/filter_box.js similarity index 75% rename from panoramix/static/widgets/viz_filter_box.js rename to panoramix/assets/visualizations/filter_box.js index 2e7e4dfc0064..5ced2eacd347 100644 --- a/panoramix/static/widgets/viz_filter_box.js +++ b/panoramix/assets/visualizations/filter_box.js @@ -1,15 +1,21 @@ -px.registerViz('filter_box', function(slice) { +// JS +var d3 = window.d3 || require('d3'); + +// CSS +require('./filter_box.css'); + +function filterBox(slice) { var slice = slice; var filtersObj = {}; - d3token = d3.select(slice.selector); + var d3token = d3.select(slice.selector); var fltChanged = function() { - filters = [] - for(flt in filtersObj) { - obj = filtersObj[flt]; - val = obj.val() - if(val !== ''){ - filters.push([flt, val.split(',')]); + var filters = [] + for (var filter in filtersObj) { + var obj = filtersObj[filter]; + var val = obj.val(); + if (val !== '') { + filters.push([filter, val.split(',')]); } } slice.addFilter(filters); @@ -20,9 +26,10 @@ px.registerViz('filter_box', function(slice) { var container = d3token .append('div') .classed('padded', true); + $.getJSON(slice.jsonEndpoint(), function(payload) { var maxes = {}; - for (filter in payload.data){ + for (var filter in payload.data) { var data = payload.data[filter]; maxes[filter] = d3.max(data, function(d){return d.metric}); var id = 'fltbox__' + filter; @@ -54,14 +61,6 @@ px.registerViz('filter_box', function(slice) { }, }) .on('change', fltChanged); - /* - .style('background-image', function(d){ - if (d.isMetric){ - var perc = Math.round((d.val / maxes[d.col]) * 100); - return "linear-gradient(to right, lightgrey, lightgrey " + perc + "%, rgba(0,0,0,0) " + perc + "%"; - } - }) - */ } slice.done(); }) @@ -73,4 +72,6 @@ px.registerViz('filter_box', function(slice) { render: refresh, resize: refresh, }; -}); +} + +module.exports = filterBox; diff --git a/panoramix/static/lib/d3.tip.css b/panoramix/assets/visualizations/heatmap.css similarity index 54% rename from panoramix/static/lib/d3.tip.css rename to panoramix/assets/visualizations/heatmap.css index bb9a5451a99b..bce124821230 100644 --- a/panoramix/static/lib/d3.tip.css +++ b/panoramix/assets/visualizations/heatmap.css @@ -1,6 +1,30 @@ +.heatmap .axis text { + font: 10px sans-serif; +} + +.heatmap .axis path, +.heatmap .axis line { + fill: none; + stroke: #000; + shape-rendering: crispEdges; +} + +.heatmap svg { +} + +.heatmap canvas, .heatmap img { + image-rendering: optimizeSpeed; /* Older versions of FF */ + image-rendering: -moz-crisp-edges; /* FF 6.0+ */ + image-rendering: -webkit-optimize-contrast; /* Safari */ + image-rendering: -o-crisp-edges; /* OS X & Windows Opera (12.02+) */ + image-rendering: pixelated; /* Awesome future-browsers */ + -ms-interpolation-mode: nearest-neighbor; /* IE */ +} + +/* from d3-tip */ .d3-tip { line-height: 1; - font-size: 12px; + font-weight: bold; padding: 12px; background: rgba(0, 0, 0, 0.8); color: #fff; diff --git a/panoramix/static/widgets/viz_heatmap.js b/panoramix/assets/visualizations/heatmap.js similarity index 72% rename from panoramix/static/widgets/viz_heatmap.js rename to panoramix/assets/visualizations/heatmap.js index 8a04ab0581ee..039a2c507c6c 100644 --- a/panoramix/static/widgets/viz_heatmap.js +++ b/panoramix/assets/visualizations/heatmap.js @@ -1,7 +1,17 @@ +// JS +var $ = window.$ || require('jquery'); +var px = window.px || require('../javascripts/modules/panoramix.js'); +var d3 = require('d3'); + +d3.tip = require('d3-tip'); //using window.d3 doesn't capture events properly bc of multiple instances + +// CSS +require('./heatmap.css'); + // Inspired from http://bl.ocks.org/mbostock/3074470 // https://jsfiddle.net/cyril123/h0reyumq/ -px.registerViz('heatmap', function(slice) { - var margins = {t:0, r:0, b:50, l:50}; +function heatmapVis(slice) { + var margins = {t:10, r:10, b:50, l:60}; function refresh() { var width = slice.width(); var height = slice.height(); @@ -17,15 +27,19 @@ px.registerViz('heatmap', function(slice) { var fd = payload.form_data; var data = payload.data; function ordScale(k, rangeBands, reverse) { - if (reverse === undefined) + if (reverse === undefined) { reverse = false; - domain = {}; + } + var domain = {}; $.each(data, function(i, d){ domain[d[k]] = true; }); - domain = Object.keys(domain).sort(); - if (reverse) + domain = Object.keys(domain).sort(function(a, b) { + return b - a; + }); + if (reverse) { domain.reverse(); + } if (rangeBands === undefined) { return d3.scale.ordinal().domain(domain).range(d3.range(domain.length)); } @@ -52,34 +66,34 @@ px.registerViz('heatmap', function(slice) { ]; var container = d3.select(slice.selector) - .style("left", "0px") - .style("position", "relative") - .style("top", "0px"); + .style("left", "0px") + .style("position", "relative") + .style("top", "0px"); var canvas = container.append("canvas") - .attr("width", heatmapDim[X]) - .attr("height", heatmapDim[Y]) - .style("width", hmWidth + "px") - .style("height", hmHeight + "px") - .style("image-rendering", fd.canvas_image_rendering) - .style("left", margins.l + "px") - .style("top", margins.t + "px") - .style("position", "absolute"); + .attr("width", heatmapDim[X]) + .attr("height", heatmapDim[Y]) + .style("width", hmWidth + "px") + .style("height", hmHeight + "px") + .style("image-rendering", fd.canvas_image_rendering) + .style("left", margins.l + "px") + .style("top", margins.t + "px") + .style("position", "absolute"); var svg = container.append("svg") - .attr("width", width) - .attr("height", height) - .style("left", "0px") - .style("top", "0px") - .style("position", "absolute"); + .attr("width", width) + .attr("height", height) + .style("left", "0px") + .style("top", "0px") + .style("position", "absolute"); var rect = svg.append('g') - .attr("transform", "translate(" + margins.l + "," + margins.t + ")") + .attr("transform", "translate(" + margins.l + "," + margins.t + ")") .append('rect') - .style('fill-opacity', 0) - .attr('stroke', 'black') - .attr("width", hmWidth) - .attr("height", hmHeight); + .style('fill-opacity', 0) + .attr('stroke', 'black') + .attr("width", hmWidth) + .attr("height", hmHeight); var tip = d3.tip() .attr('class', 'd3-tip') @@ -101,23 +115,25 @@ px.registerViz('heatmap', function(slice) { s += "
%: " + fp(obj.perc) + "
" return s; } - }) + }); + rect.call(tip); + var xscale_skip = 2; var yscale_skip = 2; - xAxis = d3.svg.axis() + var xAxis = d3.svg.axis() .scale(xRbScale) .tickValues(xRbScale.domain().filter( function(d, i) { return !(i % (parseInt(fd.xscale_interval))); })) .orient("bottom"); - yAxis = d3.svg.axis() + var yAxis = d3.svg.axis() .scale(yRbScale) .tickValues(yRbScale.domain().filter( function(d, i) { return !(i % (parseInt(fd.yscale_interval))); })) .orient("left"); - svg.append("g") + svg.append("g") .attr("class", "x axis") .attr("transform", "translate(" + margins.l + "," + (margins.t + hmHeight) + ")") .call(xAxis) @@ -125,7 +141,8 @@ px.registerViz('heatmap', function(slice) { .style("text-anchor", "end") .attr("transform", "rotate(-45)") .style("font-weight", "bold"); - svg.append("g") + + svg.append("g") .attr("class", "y axis") .attr("transform", "translate(" + margins.l + ", 0)") .call(yAxis); @@ -142,8 +159,8 @@ px.registerViz('heatmap', function(slice) { // Compute the pixel colors; scaled by CSS. function createImageObj() { - imageObj = new Image(); - image = context.createImageData(heatmapDim[0], heatmapDim[1]); + var imageObj = new Image(); + var image = context.createImageData(heatmapDim[0], heatmapDim[1]); var pixs = {}; $.each(data, function(i, d) { var c = d3.rgb(color(d.perc)); @@ -156,9 +173,9 @@ px.registerViz('heatmap', function(slice) { matrix[x][y] = d; }); - p = -1; - for(var i=0; i< heatmapDim[0] * heatmapDim[1]; i++){ - c = pixs[i]; + var p = -1; + for(var i = 0; i < heatmapDim[0] * heatmapDim[1]; i++){ + var c = pixs[i]; var alpha = 255; if (c === undefined){ c = d3.rgb('#F00'); @@ -180,5 +197,6 @@ px.registerViz('heatmap', function(slice) { render: refresh, resize: refresh, }; -}); +} +module.exports = heatmapVis; diff --git a/panoramix/assets/visualizations/iframe.js b/panoramix/assets/visualizations/iframe.js new file mode 100644 index 000000000000..546c28230f4a --- /dev/null +++ b/panoramix/assets/visualizations/iframe.js @@ -0,0 +1,25 @@ +var $ = window.$ || require('jquery'); + +function iframeWidget(slice) { + + function refresh() { + $('#code').attr('rows', '15') + $.getJSON(slice.jsonEndpoint(), function(payload) { + slice.container.html(''); + var iframe = slice.container.find('iframe'); + iframe.css('height', slice.height()); + iframe.attr('src', payload.form_data.url); + slice.done(); + }) + .fail(function(xhr) { + slice.error(xhr.responseText); + }); + }; + + return { + render: refresh, + resize: refresh, + }; +} + +module.exports = iframeWidget diff --git a/panoramix/assets/visualizations/markup.js b/panoramix/assets/visualizations/markup.js new file mode 100644 index 000000000000..4fe808b4e4d3 --- /dev/null +++ b/panoramix/assets/visualizations/markup.js @@ -0,0 +1,23 @@ +var $ = window.$ || require('jquery'); + +function markupWidget(slice) { + + function refresh() { + $('#code').attr('rows', '15'); + + $.getJSON(slice.jsonEndpoint(), function(payload) { + slice.container.html(payload.data.html); + slice.done(); + }) + .fail(function(xhr) { + slice.error(xhr.responseText); + }); + }; + + return { + render: refresh, + resize: refresh, + }; +} + +module.exports = markupWidget; diff --git a/panoramix/assets/visualizations/nvd3_vis.js b/panoramix/assets/visualizations/nvd3_vis.js new file mode 100644 index 000000000000..665a47b62b38 --- /dev/null +++ b/panoramix/assets/visualizations/nvd3_vis.js @@ -0,0 +1,209 @@ +// JS +var $ = window.$ || require('jquery'); +var px = window.px || require('../javascripts/modules/panoramix.js'); +require('../vendor/nvd3/nv.d3.min.js'); + +// CSS +require('../vendor/nvd3/nv.d3.css'); + +function nvd3Vis(slice) { + var chart = undefined; + var data = {}; + + var render = function() { + $.getJSON(slice.jsonEndpoint(), function(payload) { + var fd = payload.form_data; + var viz_type = fd.viz_type; + + var f = d3.format('.3s'); + var colorKey = 'key'; + + nv.addGraph(function() { + switch (viz_type) { + + case 'line': + if (fd.show_brush) { + chart = nv.models.lineWithFocusChart(); + chart.lines2.xScale(d3.time.scale.utc()); + chart.x2Axis + .showMaxMin(fd.x_axis_showminmax) + .staggerLabels(true); + } else { + chart = nv.models.lineChart() + } + // To alter the tooltip header + // chart.interactiveLayer.tooltip.headerFormatter(function(){return '';}); + chart.xScale(d3.time.scale.utc()); + chart.interpolate(fd.line_interpolation); + chart.xAxis + .showMaxMin(fd.x_axis_showminmax) + .staggerLabels(true); + break; + + case 'bar': + chart = nv.models.multiBarChart() + .showControls(true) + .groupSpacing(0.1); + + chart.xAxis + .showMaxMin(false) + .staggerLabels(true); + + chart.stacked(fd.bar_stacked); + break; + + case 'dist_bar': + chart = nv.models.multiBarChart() + .showControls(true) //Allow user to switch between 'Grouped' and 'Stacked' mode. + .reduceXTicks(false) + .rotateLabels(45) + .groupSpacing(0.1); //Distance between each group of bars. + + chart.xAxis + .showMaxMin(false); + + chart.stacked(fd.bar_stacked); + break; + + case 'pie': + chart = nv.models.pieChart() + colorKey = 'x'; + chart.valueFormat(f); + if (fd.donut) { + chart.donut(true); + chart.labelsOutside(true); + } + chart.labelsOutside(true); + chart.cornerRadius(true); + break; + + case 'column': + chart = nv.models.multiBarChart() + .reduceXTicks(false) + .rotateLabels(45); + break; + + case 'compare': + chart = nv.models.cumulativeLineChart(); + chart.xScale(d3.time.scale.utc()); + chart.xAxis + .showMaxMin(false) + .staggerLabels(true); + break; + + case 'bubble': + var row = function(col1, col2) { + return "" + col1 + "" + col2 + ""; + }; + chart = nv.models.scatterChart(); + chart.showDistX(true); + chart.showDistY(true); + chart.tooltip.contentGenerator(function (obj) { + var p = obj.point; + var s = ""; + s += ''; + s += row(fd.x, f(p.x)); + s += row(fd.y, f(p.y)); + s += row(fd.size, f(p.size)); + s += "
' + p[fd.entity] + ' (' + p.group + ')
"; + return s; + }); + chart.pointRange([5, fd.max_bubble_size * fd.max_bubble_size]); + break; + + case 'area': + chart = nv.models.stackedAreaChart(); + chart.style(fd.stacked_style); + chart.xScale(d3.time.scale.utc()); + chart.xAxis + .showMaxMin(false) + .staggerLabels(true); + break; + + default: + console.error("unrecognized visualization for nvd3", viz_type); + } + + if ("showLegend" in chart && typeof fd.show_legend !== 'undefined') { + chart.showLegend(fd.show_legend); + } + + var height = slice.height(); + + if(chart.hasOwnProperty("x2Axis")) { + height += 30; + } + chart.height(height); + slice.container.css('height', height + 'px'); + + if ((viz_type === "line" || viz_type === "area") && fd.rich_tooltip) { + chart.useInteractiveGuideline(true); + } + if (fd.y_axis_zero) { + chart.forceY([0, 1]); + } + else if (fd.y_log_scale) { + chart.yScale(d3.scale.log()); + } + if (fd.x_log_scale) { + chart.xScale(d3.scale.log()); + } + if (viz_type === 'bubble') { + chart.xAxis.tickFormat(d3.format('.3s')); + } + else if (fd.x_axis_format == 'smart_date') { + chart.xAxis.tickFormat(px.formatDate); + } + else if (fd.x_axis_format !== undefined) { + chart.xAxis.tickFormat(px.timeFormatFactory(fd.x_axis_format)); + } + if (chart.yAxis !== undefined) { + chart.yAxis.tickFormat(d3.format('.3s')); + } + + if (fd.contribution || fd.num_period_compare || viz_type == 'compare') { + chart.yAxis.tickFormat(d3.format('.3p')); + if (chart.y2Axis != undefined) { + chart.y2Axis.tickFormat(d3.format('.3p')); + } + } else if (fd.y_axis_format) { + chart.yAxis.tickFormat(d3.format(fd.y_axis_format)); + + if (chart.y2Axis != undefined) { + chart.y2Axis.tickFormat(d3.format(fd.y_axis_format)); + } + } + + chart.color(function(d, i){ + return px.color.category21(d[colorKey]); + }); + + d3.select(slice.selector).append("svg") + .datum(payload.data) + .transition().duration(500) + .attr('height', height) + .call(chart); + + return chart; + }); + + slice.done(payload); + }) + .fail(function(xhr) { + slice.error(xhr.responseText); + }); + }; + + var update = function() { + if (chart && chart.update) { + chart.update(); + } + }; + + return { + render: render, + resize: update, + }; +}; + +module.exports = nvd3Vis; diff --git a/panoramix/static/widgets/viz_para.js b/panoramix/assets/visualizations/parallel_coordinates.js similarity index 82% rename from panoramix/static/widgets/viz_para.js rename to panoramix/assets/visualizations/parallel_coordinates.js index 9dd22e985fa2..fa80224bd1c8 100644 --- a/panoramix/static/widgets/viz_para.js +++ b/panoramix/assets/visualizations/parallel_coordinates.js @@ -1,11 +1,19 @@ -px.registerViz('para', function(slice) { +// JS +var d3 = window.d3 || require('d3'); +d3.parcoords = require('../vendor/parallel_coordinates/d3.parcoords.js'); +d3.divgrid = require('../vendor/parallel_coordinates/divgrid.js'); + +// CSS +require('../vendor/parallel_coordinates/d3.parcoords.css'); + +function parallelCoordVis(slice) { function refresh() { $('#code').attr('rows', '15') $.getJSON(slice.jsonEndpoint(), function(payload) { var data = payload.data; var fd = payload.form_data; - ext = d3.extent(data, function(d){ + var ext = d3.extent(data, function(d){ return d[fd.secondary_metric]; }); ext = [ext[0], (ext[1]-ext[0])/2,ext[1]]; @@ -13,17 +21,16 @@ px.registerViz('para', function(slice) { .domain(ext) .range(['red', 'grey', 'blue']) .interpolate(d3.interpolateLab); + var color = function(d){return cScale(d[fd.secondary_metric])}; var container = d3.select(slice.selector); - if (fd.show_datatable) - var eff_height = slice.height() / 2; - else - var eff_height = slice.height(); + var eff_height = fd.show_datatable ? (slice.height() / 2) : slice.height(); var div = container.append('div') .attr('id', 'parcoords_' + slice.container_id) .style('height', eff_height + 'px') .classed("parcoords", true); + var parcoords = d3.parcoords()('#parcoords_' + slice.container_id) .width(slice.width()) .color(color) @@ -68,8 +75,11 @@ px.registerViz('para', function(slice) { slice.error(xhr.responseText); }); }; + return { render: refresh, resize: refresh, }; -}); +}; + +module.exports = parallelCoordVis; diff --git a/panoramix/assets/visualizations/pivot_table.css b/panoramix/assets/visualizations/pivot_table.css new file mode 100644 index 000000000000..6a35fdab24b7 --- /dev/null +++ b/panoramix/assets/visualizations/pivot_table.css @@ -0,0 +1,4 @@ +.gridster li.widget.pivot_table, +div.widget.pivot_table{ + overflow: auto !important; +} diff --git a/panoramix/assets/visualizations/pivot_table.js b/panoramix/assets/visualizations/pivot_table.js new file mode 100644 index 000000000000..8fff0ff78760 --- /dev/null +++ b/panoramix/assets/visualizations/pivot_table.js @@ -0,0 +1,40 @@ +// // This is a hack because shimming for $ extensions is not working. +// $('body').append([ +// '', +// '', +// ]); + +// // require('datatables'); +// // console.log(jQuery.fn.dataTable); +// // require('../vendor/dataTables/jquery.dataTables.min.js'); +// // require('../vendor/dataTables/dataTables.bootstrap.js'); + +// // CSS +// require('./pivot_table.css'); +// require('../vendor/dataTables/dataTables.bootstrap.css'); + +// module.exports = function(slice) { +// var container = slice.container; +// var form_data = slice.data.form_data; + +// function refresh() { +// $.getJSON(slice.jsonEndpoint(), function(json){ +// container.html(json.data); +// if (form_data.groupby.length == 1){ +// var table = container.find('table').DataTable({ +// paging: false, +// searching: false, +// }); +// table.column('-1').order( 'desc' ).draw(); +// } +// slice.done(json); +// }).fail(function(xhr){ +// slice.error(xhr.responseText); +// }); +// } +// return { +// render: refresh, +// resize: refresh, +// }; + +// }; diff --git a/panoramix/static/widgets/viz_sankey.css b/panoramix/assets/visualizations/sankey.css similarity index 99% rename from panoramix/static/widgets/viz_sankey.css rename to panoramix/assets/visualizations/sankey.css index 866a4de42865..9a2a0c88ae2e 100644 --- a/panoramix/static/widgets/viz_sankey.css +++ b/panoramix/assets/visualizations/sankey.css @@ -18,5 +18,3 @@ .sankey .link:hover { stroke-opacity: .5; } - - diff --git a/panoramix/assets/visualizations/sankey.js b/panoramix/assets/visualizations/sankey.js new file mode 100644 index 000000000000..dc6cd76b972e --- /dev/null +++ b/panoramix/assets/visualizations/sankey.js @@ -0,0 +1,108 @@ +// CSS +require('./sankey.css'); +// JS +var px = window.px || require('../javascripts/modules/panoramix.js'); +var d3 = window.d3 || require('d3'); +d3.sankey = require('d3-sankey').sankey; + +function sankeyVis(slice) { + var div = d3.select(slice.selector); + + var render = function() { + var margin = {top: 5, right: 5, bottom: 5, left: 5}; + var width = slice.width() - margin.left - margin.right; + var height = slice.height() - margin.top - margin.bottom; + + var formatNumber = d3.format(",.0f"), + format = function(d) { return formatNumber(d) + " TWh"; }; + + var svg = div.append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + var sankey = d3.sankey() + .nodeWidth(15) + .nodePadding(10) + .size([width, height]); + + var path = sankey.link(); + + d3.json(slice.jsonEndpoint(), function(error, json) { + if (error != null){ + slice.error(error.responseText); + return ''; + } + var links = json.data; + var nodes = {}; + // Compute the distinct nodes from the links. + links.forEach(function(link) { + link.source = nodes[link.source] || + (nodes[link.source] = {name: link.source}); + link.target = nodes[link.target] || + (nodes[link.target] = {name: link.target}); + link.value = +link.value; + }); + nodes = d3.values(nodes); + + sankey + .nodes(nodes) + .links(links) + .layout(32); + + var link = svg.append("g").selectAll(".link") + .data(links) + .enter().append("path") + .attr("class", "link") + .attr("d", path) + .style("stroke-width", function(d) { return Math.max(1, d.dy); }) + .sort(function(a, b) { return b.dy - a.dy; }); + + link.append("title") + .text(function(d) { return d.source.name + " → " + d.target.name + "\n" + format(d.value); }); + + var node = svg.append("g").selectAll(".node") + .data(nodes) + .enter().append("g") + .attr("class", "node") + .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }) + .call(d3.behavior.drag() + .origin(function(d) { return d; }) + .on("dragstart", function() { this.parentNode.appendChild(this); }) + .on("drag", dragmove)); + + node.append("rect") + .attr("height", function(d) { return d.dy; }) + .attr("width", sankey.nodeWidth()) + .style("fill", function(d) { return d.color = px.color.category21(d.name.replace(/ .*/, "")); }) + .style("stroke", function(d) { return d3.rgb(d.color).darker(2); }) + .append("title") + .text(function(d) { return d.name + "\n" + format(d.value); }); + + node.append("text") + .attr("x", -6) + .attr("y", function(d) { return d.dy / 2; }) + .attr("dy", ".35em") + .attr("text-anchor", "end") + .attr("transform", null) + .text(function(d) { return d.name; }) + .filter(function(d) { return d.x < width / 2; }) + .attr("x", 6 + sankey.nodeWidth()) + .attr("text-anchor", "start"); + + function dragmove(d) { + d3.select(this).attr("transform", "translate(" + d.x + "," + (d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))) + ")"); + sankey.relayout(); + link.attr("d", path); + } + slice.done(json); + }); + } + return { + render: render, + resize: render, + }; +} + +module.exports = sankeyVis; diff --git a/panoramix/static/widgets/viz_sunburst.css b/panoramix/assets/visualizations/sunburst.css similarity index 100% rename from panoramix/static/widgets/viz_sunburst.css rename to panoramix/assets/visualizations/sunburst.css diff --git a/panoramix/static/widgets/viz_sunburst.js b/panoramix/assets/visualizations/sunburst.js similarity index 69% rename from panoramix/static/widgets/viz_sunburst.js rename to panoramix/assets/visualizations/sunburst.js index 0546a6ea2d7b..e9435478e050 100644 --- a/panoramix/static/widgets/viz_sunburst.js +++ b/panoramix/assets/visualizations/sunburst.js @@ -1,8 +1,9 @@ -/* - Modified from http://bl.ocks.org/kerryrodden/7090426 - */ +require('./sunburst.css'); -function viz_sunburst(slice) { +/* + Modified from http://bl.ocks.org/kerryrodden/7090426 + */ +function sunburstVis(slice) { var container = d3.select(slice.selector); var render = function() { var width = slice.width(); @@ -13,25 +14,26 @@ function viz_sunburst(slice) { var radius = Math.min(width, height) / 2; container.select("svg").remove(); + var vis = container.append("svg:svg") - .attr("width", width) - .attr("height", height) - .append("svg:g") - .attr("id", "container") - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); + .attr("width", width) + .attr("height", height) + .append("svg:g") + .attr("id", "container") + .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); var arcs = vis.append("svg:g").attr("id", "arcs"); var gMiddleText = vis.append("svg:g").attr("id", "gMiddleText"); var partition = d3.layout.partition() - .size([2 * Math.PI, radius * radius]) - .value(function(d) { return d.m1; }); + .size([2 * Math.PI, radius * radius]) + .value(function(d) { return d.m1; }); var arc = d3.svg.arc() - .startAngle(function(d) { return d.x; }) - .endAngle(function(d) { return d.x + d.dx; }) - .innerRadius(function(d) { return Math.sqrt(d.y); }) - .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); }); + .startAngle(function(d) { return d.x; }) + .endAngle(function(d) { return d.x + d.dx; }) + .innerRadius(function(d) { return Math.sqrt(d.y); }) + .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); }); var ext; d3.json(slice.jsonEndpoint(), function(error, json){ @@ -41,6 +43,7 @@ function viz_sunburst(slice) { return ''; } var tree = buildHierarchy(json.data); + createVisualization(tree); slice.done(json); }); @@ -51,31 +54,31 @@ function viz_sunburst(slice) { // Bounding circle underneath the sunburst, to make it easier to detect // when the mouse leaves the parent g. arcs.append("svg:circle") - .attr("r", radius) - .style("opacity", 0); + .attr("r", radius) + .style("opacity", 0); // For efficiency, filter nodes to keep only those large enough to see. var nodes = partition.nodes(json) - .filter(function(d) { - return (d.dx > 0.005); // 0.005 radians = 0.29 degrees - }); + .filter(function(d) { + return (d.dx > 0.005); // 0.005 radians = 0.29 degrees + }); ext = d3.extent(nodes, function(d){return d.m2 / d.m1;}); var colorScale = d3.scale.linear() - .domain([ext[0], ext[0] + ((ext[1] - ext[0]) / 2), ext[1]]) - .range(["#00D1C1", "white","#FFB400"]); + .domain([ext[0], ext[0] + ((ext[1] - ext[0]) / 2), ext[1]]) + .range(["#00D1C1", "white","#FFB400"]); var path = arcs.data([json]).selectAll("path") - .data(nodes) - .enter().append("svg:path") - .attr("display", function(d) { return d.depth ? null : "none"; }) - .attr("d", arc) - .attr("fill-rule", "evenodd") - .style("stroke", "grey") - .style("stroke-width", "1px") - .style("fill", function(d) { return colorScale(d.m2/d.m1); }) - .style("opacity", 1) - .on("mouseenter", mouseenter); + .data(nodes) + .enter().append("svg:path") + .attr("display", function(d) { return d.depth ? null : "none"; }) + .attr("d", arc) + .attr("fill-rule", "evenodd") + .style("stroke", "grey") + .style("stroke-width", "1px") + .style("fill", function(d) { return colorScale(d.m2/d.m1); }) + .style("opacity", 1) + .on("mouseenter", mouseenter); // Add the mouseleave handler to the bounding circle. @@ -84,8 +87,9 @@ function viz_sunburst(slice) { // Get total size of the tree = value of root node from partition. totalSize = path.node().__data__.value; }; - f = d3.format(".3s"); - fp = d3.format(".3p"); + var f = d3.format(".3s"); + var fp = d3.format(".3p"); + // Fade all but the current sequence, and show it in the breadcrumb trail. function mouseenter(d) { @@ -94,19 +98,19 @@ function viz_sunburst(slice) { gMiddleText.selectAll("*").remove(); gMiddleText.append("text") - .classed("middle", true) - .style("font-size", "50px") - .text(percentageString); + .classed("middle", true) + .style("font-size", "50px") + .text(percentageString); gMiddleText.append("text") - .classed("middle", true) - .style("font-size", "20px") - .attr("y", "25") - .text("m1: " + f(d.m1) + " | m2: " + f(d.m2)); + .classed("middle", true) + .style("font-size", "20px") + .attr("y", "25") + .text("m1: " + f(d.m1) + " | m2: " + f(d.m2)); gMiddleText.append("text") - .classed("middle", true) - .style("font-size", "15px") - .attr("y", "50") - .text("m2/m1: " + fp(d.m2/d.m1)); + .classed("middle", true) + .style("font-size", "15px") + .attr("y", "50") + .text("m2/m1: " + fp(d.m2/d.m1)); var sequenceArray = getAncestors(d); function breadcrumbPoints(d, i) { @@ -124,13 +128,15 @@ function viz_sunburst(slice) { // Update the breadcrumb trail to show the current sequence and percentage. function updateBreadcrumbs(nodeArray, percentageString) { - l = []; + var l = []; for(var i=0; i ') - gMiddleText.append("text").text(s).classed("middle", true) - .attr("y", -75); + var s = l.join(' > ') + gMiddleText.append("text") + .text(s) + .classed("middle", true) + .attr("y", -75); } updateBreadcrumbs(sequenceArray, percentageString); @@ -141,12 +147,12 @@ function viz_sunburst(slice) { // Then highlight only those that are an ancestor of the current segment. arcs.selectAll("path") - .filter(function(node) { - return (sequenceArray.indexOf(node) >= 0); - }) - .style("opacity", 1) - .style("stroke", "#888") - .style("stroke-width", "2px"); + .filter(function(node) { + return (sequenceArray.indexOf(node) >= 0); + }) + .style("opacity", 1) + .style("stroke", "#888") + .style("stroke-width", "2px"); } // Restore everything to full opacity when moving off the visualization. @@ -154,7 +160,8 @@ function viz_sunburst(slice) { // Hide the breadcrumb trail arcs.select("#trail") - .style("visibility", "hidden"); + .style("visibility", "hidden"); + gMiddleText.selectAll("*").remove(); // Deactivate all segments during transition. @@ -163,14 +170,14 @@ function viz_sunburst(slice) { // Transition each segment to full opacity and then reactivate it. arcs.selectAll("path") - .transition() - .duration(200) - .style("opacity", 1) - .style("stroke", "grey") - .style("stroke-width", "1px") - .each("end", function() { - d3.select(this).on("mouseenter", mouseenter); - }); + .transition() + .duration(200) + .style("opacity", 1) + .style("stroke", "grey") + .style("stroke-width", "1px") + .each("end", function() { + d3.select(this).on("mouseenter", mouseenter); + }); } // Given a node in a partition layout, return an array of all of its ancestor @@ -225,6 +232,7 @@ function viz_sunburst(slice) { } function recurse(node){ if (node.children){ + var sums; var m1 = 0; var m2 = 0; for (var i=0; i', + '', +]); + +// require('datatables'); +// console.log(jQuery.fn.dataTable); +// require('../vendor/dataTables/jquery.dataTables.min.js'); +// require('../vendor/dataTables/dataTables.bootstrap.js'); + +// CSS +require('./table.css'); +require('../vendor/dataTables/dataTables.bootstrap.css'); + +function tableVis(slice) { var data = slice.data; var form_data = data.form_data; var f = d3.format('.3s'); @@ -9,23 +24,26 @@ px.registerViz('table', function(slice) { var data = json.data; var metrics = json.form_data.metrics; function col(c){ - arr = []; + var arr = []; for (var i=0; iG}0m6-7P8IwIB^j=Yn*Dba%Hj2n*5z((Td>E8X2)-{brK{_i)# z&M*wKyU%@JajtXD6``ggi;hBs^6J$qba^=`(5qK)0 z(rXthh{i`ExmS!3S2#Hv2#(%C(X1eH`nT7E{X2EOJU3@{(!$6N60TRt)w}P;5-V&9PT8f;QK0C%@QOiW1 z423C16LOmT&Klr!B+@Mr=a}()^wnod`6JIL6hyI`0=f=1p08*)hV!bQ6%oh0F_bqoHIw01X9m}s%3L9HQ(B4fnypzAk1;+WC!;v5AH$1{5F zZ`#l$eEfu{;1}#t?f5E)$<69?otjC2QxnV@NmQbfF9sD&Stkw^S^4zWvaAWbE3u|3 z?&Ux$N|s~n`(4c$E%z5a@D+qt9P@j!1Y>azhn=4?Cj9h)tIx_@gIJ}hR*;|ikGRZSSU1Cl4I+n4x9}FYIk;rDi zMS0ulA9Z1!9ilnV`#+Bq@INOSMUrN=aX?otSdsZSCH6GcUn+W4?$^VCK(y(RG3ymE z>otAzr2Zvd?nA0W<3vIN77G+aN=oWwW+vtC<~BJuC+px)y?cCI(%P!;;_jZLQYuZA z(AfxPfnukc1CN+$p5I`fFtI(SXPXSN^noPXJS}JW+GD#>s*qL{CztvxJz726U)(gz zLQdY?w#V&wdgO+kJhT{9Z+MawgXC3JRk^vj3rkB%(lawBO-)UeR8+Y5_~;Dg@SL5U zolH#DA)|S43Z2N%+IOgwz|VD7Ni%@}e(2hK#~uHR#iRer$%`-BLv%L3e5U`hsR=0% zM(H01fbd4J{P8E#`5_UfT=R#jZ5xsfPUu=K1(FtXG5#CFj}Og!i7KV2aR%;8e3PwaTG|~%v}t{>D36I z$B7Bn1O46Dif?`JHtA~klyN9~8GB(o%1TqcwUwz%%QO$=nvp|8$j|o<M&)nd0@ z82dFfoWAS5$R(wv8M(Q$i0??gthD={pRV;xx-Rj;Ql?NKX!UGTQ0ParEbBl`sAS^7?Zi1!vF`qi>Y`T>E}0R z9acd>!AszArgwK4psB1=%-U7B)YQ}_U%#qdUR@<9(S;Zjrk6y3ew24&hY}6c%(r>7 zV~AX0X7PXS*`KKx+_@+{)|5O0C&KP%+}jtu@5k7Zbw1a=VcmM)dw=h?e0E8hIjH1<*hHtOKcS{6H)J(m5em7A*w9C`t#&G6+0+qC5x)3D_> z?>9?vS<;O#%Ihvgg5ZjK^NrW_M;>qYg<$TlzxIH#7DmQjxG0K-t{q=vDlcP)e>$yX^d2xqdcML6wjQo&3XsqP8JqLI_{}L~bMB)8YgsGo zb{D}Bf{t71#YLyTUwd4KNAS`!GD?m;2|*AKX;F0t zh9ps1jwmW6a1Kh!%7vHmJzwkD6Tp47kfi((iE-GHGG7)g5*+prO`C{_8Q1&v>xSxy zxw(O(rj^m*VKj;G&@EaiMrF)fOA=_^@r?Cs{N1zTR5a)ncLtiTuP@|4#AX*bZ|uGIV!5m(j1hp7g%F85etT#~y;W)%u)Y)$y$7dR1cEyXb1$cRK!a zcmEi(9mD^0+|N$pSTBQ$l8RWOOk&lnySF)fF)Lx~?mF=9txL=$a#8ZXdd|-uh6_gv zUn~(oD&$uC#UtFnn?BS$UXDi1SdK3#zo{wh?n%%j@Fj~)dO(tr15;3=IiRRu==IUNP$Smye=!iBAN?BY4fk4b} zkb2@NkWPJHDhHk+Niis;imbM@{{uD?ph z>0{LS{Mm*jZ2XsXW;J2xSvKan^?+j|9!khwy4wF`-LLEo$t0dU;~_#45)uadr~{x` zUl|iFe>5A|1wYkbRvI)XR#dex{j#{QsIj@yeZ15&5f!7xqooC~x&e z)GatG)%{$fDW+h2`sso^e;cRKB2r32-9AwW!mBYgm8?kHKQN%Kpk6K$fDy}DgTsjM zK;2FrO4-xXqm$bA^!Y(>Eg=Vyb+%8e>zxx*Iwv;8;g%u*eWqGZ{9eOC zJZ_~7jT7~sS+y(j^4ph9N>*e<4*WJcssdCF0Zu;r97Xupq)r7Ij$rW_h|_7Oahv5B zTiekL#OpwjeNWrSv#(N3`)M+2tSX z!cNr4O0NHD(ia)q6Nd5m=;3(;I83BUb0Zf6cXxhmL)Vm+>qXm{hB+fau z8tm>HUz-M^2E7oQnZBDh@T<%*rt*r{W!1j$X!Q`h3u|cw>BdS;gDC_d=r_S0Y^FJUeUu^8F@6 zyv%ul1w-tffwcJ@pP?__ozI$gpm3fjxoMY!oDy^SPx16{Rf-5g#q<2R0mP12W1Lo^F^_^`%uO(qgS7df$)$BX^)(%eZ^ z(YqpHr_I4VdM6-K3D9~xlwj95M&{|bA|hJfuc+4IUvf!m+0L}>T`yKNmt~_L&ji4HGpOt0x0a7y5_}GS z#1w_J=HWKtL>TzJ*`zheK!Fy7Gi{7pR1`sOd;2{3k2DF4GDBft}IKSjF)SJ7c zle>W*d%O;QkcJYYY7G{A0AvEO8EMiCXSK+sTieVBijZRdK$D}gF>4UnK$K5zqK{qY zC>k=(!%x5zlAA^YpfE-pmL3j0LxLa*E9K7G1(w*2)fToe4Dwm_-=_s$mlFYk&6Tr7kS2Ev-UaqO9ct)VN>dpr@tJL{5dr-fk zC%(K{n48;^j!uO`h+9%H<9lfn2IJd3m(1s9BT%^#lo`fiCZxaE-zUK+Ets&&?5Wf=xLWwW1cc1Sk(|%oy3JscZdF0+S8eP~8bXYe4?P1RKOgJtg0-33S zs8}Mwq$XUydTM4#^7Cgg-={Vg3vTs$S;EHfuNPiIb8cBM(Y87hZj~`tL#7lIkV0at zWQ#F-xfav!8p}Apy%2)wr<;|rBvlb}P1P&4wBls;#m1}epz9{#>PtOmxJ93=>`bx$ z8&ft6!|(2zj5W#+fcl%Ale2{O7yYk{<|BRL5Y53{^-ik3J+edlokg41mCXVS#=K)m z!jJ5nglkxd0vo2V$A4I8j5&EohMM>H4`k$KEH?I@E-o&Xlce4BYE5M}2V_|vj z(Nq$hgzOiuokgRm z9gz-a6McOE#{(e)RFxFn9ED=wxCLT+hV63aj9?|XKIfcQGu40T8y)>DX&s*&V4{#KbR6xS)ebpe%%UlTmaJ}ad_j#kfc78S9kQD==%1%Fuy zcynJfkf*uw*gtn=8Yk-H)ja?J5>*B3l^ub8>SB=fqrr`tuvFiFr{i<;cR*%it#TVr zjkQdxLV41Mdpu*vOsCBY9XOnrmgoC}nft2)Gk^b%uPlnm#KFb7m+m#G(RXIjZ)8mG z0Kiy3J8i=oOD6Isfm#-+8*{*MaLb9ss6O0)EzFt_-gusgNhqf?%s8A}N@}o%746M( z#H9d)cgQReXxMe`C!)vg4{ShlZ`BH!)k~72@i^@Y(`mA2eR_KORrL^yE5|oxI&#Gc z#u-RP60i7Dzi{@`dJjvYKy&b~L9St|y9VSF^6$YpVL`#}z_+NtgaDD@8VT=e@?yVW zC6_=V8L)Ph*Hl<*v4_g$s1#eB>;mM2h2_p=lz!7bV*8!))wm?apC|9@;g#{qb8VsVe9|4!UI}8l?2r^dD%N_(CnssWVzBCW`TjP{ralfd8R+c#ocA~?z#1NU0oqz z#A2b&5`$hPdv#Rk#LUg@nv{Ahms|})BC#=IA)MT&&KHbj0PB_)u=;nSxQevb$1qvW z&z-eOGBN~{Q%lO0mWUE^!qv;Qq-~#2&+md;tXa8~lNuZO0x3FO4S&oq0jvWB(xBO7 zQ6l4Zr1|ynQU$r!E~V?qj@a0-VfEOGnl93rCRM^M$|*z-;`U{EEVF~ay95{n{s)w` zzbR@a@L)exU$ubNa-rh0tVS|dt`@G}L@uqiShwUSq5Dy7zh3}fN+1e+w$8tDAaLpP8KWf9UX!1 zat^NUJsGDkw?6T+3O0h9eor+Uy!)PDYeb!*5HDAx=g-ggq4?zCkMBPD%Ne)u^L$}x zy!9$Ftnoyd1{(u6s&6P=>Hk$D15utd-yqMTX7pdAx35=47VJvAUAmAeW-E;_K#+r8RjXIJ z3QmC88iZn}Y#Mw_?4qf|FaV$$1zxDsX-K?|eOH^|k_3YC=sqUD4L8^i;YdDQ*$8h_`-}l zUlIV-vZ|Iv|3%)(!@lo+d$nH%M8ApXd1xlmx`%^|OZfs706B3=N=mppZLCSZZaMyA z?KTQdMr5e@@`;KTD4AY8zFy6B5#$vX{{3xYLOqpDpX?nP8VAQXJunA^%zlBXyE&<< z@&n&2Iwl4ylrq$qlb;`IVEj&!h;?QhT;?3gLo|f=;ZQ2@d3iZC?8B+>K6=(a{*p)8 z!otGi>1vJr(u3@xQ{2o`X809DTi5EKl^+rR%rL(1KZ`&j(M2gSHiVK^ zoDd?aMDSyJpA6N@=~r&tWG2TnLxGaR9O@v=k&JUHl)KBi@uiWa;!~L*CubKh@dKn7 zEz%n&Fu2mFEfZ)UKvG}qBT?$Vji@>(Xt40{AsM?!XU1jNMxD5#36Ip1oH@0#b!sjP z@gxj|M63bt08q%IqwfS;TIA>70p!VKobYwJ*L`{Ee4Fjuw@4M8pU#`Thh z%x?Sn$-W%5G@!jhQ>&P1Kah915Ei|fo+{#gU$yv^HbjCFq!*A$ZX(B_qb8cy-<-;Rvz+eIBEul}W5pw{eS(xlhU9L$&_UBJCTi;@x37PV}T7`t(QhyY8o_ zJYZ?%hY(O?bMpr}dioDvS6`9lEM2;|a|#Luo;;9)~z(15_VWQpn6;KpPu|K<8I(TOVL$!XjQ*2uUS zCHyqpbl3T?a+3;wZzpE`*zH~1(#Iu?vmQ*!f(WhdRFW*F^VKMChFPC$k{k(JE5$_?qQmw6hQdo%3*=97 zGw45+&N^LJsV}y@Ml9+xQn^^cO-7$M@B6c{r>(K zZB8B@+`jquGBhtXOA0|Bv|%?F8DDu%BC1AJoQ{sHD9fe|-0WZ_?S3oTGdm}3+Q&<+ zO`cO8ou=iQ`{dXWy>qJ2biN1;;r}RzmtbQaIpukuK{)^tCM~oz#$%2LL%4%z?4iE?cF;ywzP#BXZjfhbSU3YLsOl{8beT!Bp_t%^SM(lFDkxe z?1CWPDkRmiqB-u#*Uv`A#1Zgt!1_viK6 zgrM~k{ZxLlQO{pOT-YKEg{Mm&5r^xP4~=HaGAGui`67)CT>(sSJ8KjMmd5866v4 zf1Y14vrn6a$y7|06@fV)tIU*Az&aO!AJ}b>3t{glYWFzVnf^zm*6FbDz8nT8pI1ak zt#i-VTRY6s&(D&Y9|FZjzMeNQ-!;cQ`hWUwvW4L1uoy>r__#{*;5cFk*hN znac!dA@=}NA>=kdasHG7m9mB;%!Mn$To<^UKU+>vK1WK7$C5uJp0ePNKmA|)j8+;@ z8R1EfNGpx%GOw@QG^q<0ct*-v-lYN+H;YxERGyR8h!6_fxFE|iTs@2^?{sO=owNa-Su)4*57#Pmcz(F5G^ z;UHKvtZ!T$v3Xp@tlCNt-~(gr0@bV)8U)LBAG8WP#~Q(89;>fK0c8mDmQ2q&IN1s! zH=j`2tX6I;H*_FNSA!n(w(Y~an31z_#fJ}qDLaodNAo`|0m!y647v$T9<4(^32X~^g0 z^z`e==_yBrcGa{tc(G`;DoYXCeuRkQyoji%wfJ(MUMOI(R*P# zBk?aaI%al0iN4^3;@Z!Lo$r8xx+0nxM-le{fLNMuh$Aj=l#T} z%m?dlBJ&EzW7g*2;P`gpJ)b%O3gu1M`HQ(;+sDMycE|`@U8Z-dwRa>}3~gonbdVm} zc_W!^7TMBLvIbH%IDX|59G@=nB_lEICg!62A+NMa z1nU2kpdTMn*YmiuxT-*gyrYJaG?y5IBtOSt51Fcf4T2FfABe~H?U+cFj zdkG}$a`@P-)d$g5w<8lk{&aD_;o#wsb8zR+Xl%qs_N0$QD~89j`Qw_GY-*~2bT!n) zzSs^&Ma!p|@YKnL{?{vcpE8&NNwOXR$}_IlH0YtPp9-9q8Ut?gRccm7Mus$sV`{SjGlB5$fB})8Y(2^A%d0_1TL%5T*>2Dwy7MvgVarHi-_~XX|-?`u4 zlqL(v7!p&5zN!*;+}xFVc)=+Bj!pS%ZHm%r4|0SKFI z=mXCLmBq};e z?C`tma+t)|SHz&f_zl1mJ2gk|c&1G+=M(ou0Ia+oU1L%&2Md}cwuh^c$FuI$T;4PB zQ!%@*^)vd53y^nNW?Xm0o<@7~%m2wZ9@@*==R6Ibc&9i+X6GA#PyjGMEMFFC%?;YD zO+B_k(Vf10)$zzL(PGT+eg)+LKn&sb5dM7CK|AZ@UmrQ*P;sV|?nYKR`clv1W=rJm z_y*fKE&(1AtoHGNi^nJ`VP&du77MhVcoFYwjt?KC^VPn0bi@@arcF*wNw*zqxGu>V zc0^0*!6`@csfgk18|7=r85lv4Neu7kPLG5gPBn+ES;$w-Wx=m7^I9)2I0 zu!;@MH2Cto?GW>PFL_11F7%%7aYztDq{sf1eojDqLyAsc|$huqp zqqqPj2eXF*n64lXTP9W2YPN|n+aKF^YJ3M&-jU3!`umFkL|tiH8|lhTIq*+NZHi7z zDKdM5LAmm!ogCu|CJXqnV8_iHu&=2p8A%(bA8h$5rEEi=hpsEtLi37)#MeBPmIm z{E>mrz|vJvmrI#?&0Rb>$)pqP;y^G+QOZ&$;&W+vX_El7Q zi|7>v1sYFxcw@PQGM%+7I;fs5P33&P0`Yc(T`bC6?s&dFnY`Il1Q}MKR&F?5SgJdn z?n1&cuy%XK>2~~ArO#Ej#ssKVEd5+)j}%tAnQSv3tc(USlp?*BEMeD2{}8J|<=_D@ba>^(fv*VeH3>~zTO zmw)TB83-`>u$~^cqA|)Z;;V24%&MzY!+!Gf=rez|5?_7atBV90qCx74B^46*dP)H_ zJOE8iu1v-7fPc*Vk;bv~C3_PA`k_8-(Kv~IO)fk*3KptK!q=|SA6s30RSdcVGkZct zos7e=G2u~GwBZ%jbg-cu3^T%ulYEWFjl%^F^xTUaX!}=!aU#!zH@|OkQ>(9poH$V! zG!6V-oL4ML47T|F&)dwTa?*^J`n`|6FzTG|%AE78fr0i9Zydxs_Tutd(&uHwR(C$D z@bKQHiPrP9ukCTEr`ib?O6#*;$j>3F5uW*-r)nruzw{Up5V|tSzsLnl#@DhqEx;!^ zo3~$Xs^l&@h8G7J`dp?m>(u>BizHqRqwM!oNzY`R4#6Z5af|l#z5!KxSL)VfhM*D@ z^l*Rzh@o(4w&w-O{Tws^C~49%wR4Irl#S)${m?a|?O^8OLV4vyI_JvXYzWBdfGrCE zW+pX*hX${qj=KkY`K(zM1F@v{Q+dzz_hJ6Gh^F@TRd=OhG}sYh4h{}4>$kTa+_Tij zE`Q88VjoV5uMmcjZrUk^mf zH3Ngq*Y8A)2^%91ws-nQ{a<~SyRO7kmrSt0%`w*{5ps*(`RtJZ$X8V@P9n_)v0iN| zGp-ZpuFA5+UP*H?^G;>d#6e&gv!VEjF?dWSB4s+2ky1d8CvKe2ysm)uL1hL!oDO?4% zj=LmxlZ-@;X*o(g-HD8%sTNVHhj-Jzze$?bDd8~*w>=^G5w1T__SxhR&&HltA2$<) z6zH6d!$o`U{JJA6un!^X;TUXaa=sm>%=JF@T!g`NTU?L(~L2Xx@>8WDK7&FiUbMCxOa= zNWfx8dr!7oSlXJjF`&9z?Xy*}uaS43>;o{2nf&X1u*R3g+DcWxQL-`ON$%KX{2!Jj z4Hhr#yB7Ap=-4|rct`-^(GC6GyIQlM#II8&$_B182!%~e7~cTHh!)nG-F-&Zu%uCU zKeaKTj5S;Yd{`Wb>CS+nA4dpkM|L4HG!%AH^_1WD!_cotCQ}2< zW!}2z$=WbTo#;B-L>nlQsuuqQX945V@N(OOPNNGWV6CFgQPC(*E_~dqEAs@&z>s>v zf3~*A&0@W;V|gPP8Cp;^wkW7)TlR}=FPU^pszaG*qJG}zA`8Q5&U;z1j7{}PtFHKZ zXixsq=<>I^p_TX~=dShGIja9Ng~RW2VUeiW@tM^8YVH`!%%_3vL2a8`GSLVl5bEJi7JDL1x|JM0_)P zDFBZ9x_fGD-?C?M|KMFd^H&RcbfVdlyUknKK$qe2HJb)dBF!IS!Gs_ufLZ^?3bEjy z`MxA> z@V>uv`>rU9wPz!+=fBRoMLDWxOB-zEloAta{5U;6K0biYW{^%oNciO{lXtBli$7|n zLTl(a*IwZhLC5jhtRd1P1B$XVhOem+VoMYI>%CA_?mx*nSy>yfF=0hQgi8I^RDiqu z-6C78C!L9KUeGvBF`>7Cpq|!J#CWEe>`;lDF2nO4seuj&FZMlFX)W;=U4(00l)+3X z!K9)1v7Ln`2l9b9a!V_#Z~%{)=;Eg+ynQvr^Nj(E8mYVNbPPAfEZXWpB0JAt7cO9O zS{Q)L#)Ru=*pOEf6k$kDB{V{4l7JJ?V>JK~=!owDNcbI8Zr~JXnSqeXh!rlg7}n2K za3IecYgrbK{fX=S^Y*gC>2za|**yV>l>j+#cSI;ve6lv3?bGcky7p-j`QPD==gl?} zvaz7?%T2Dw`?w_)Z$5EMCL8;4P&%|qw!7vh+5*#`%GsxWN$EP*73B8oL;HOrObFVr zkUaozaKkhsH`Xarab-nH~%YP;8&sgy~C-V{J?Cb5NMNTdKEx>uW~Z85=xn zIrzjA3U^UxFiT`mJ!w`DBF1?)Dm$kDPjBee!Jq|Kvflfn^#bxXljWU{jP;=ORB^Vf z9(kJd?A#JfK(=_})QlG7+m>F^6~*3O^n5t>tmJ=Pmj}KpDo)Ph9=Rmwek5cM1FIJF=;l-W{J0_P#vS6+C9##rG_PQ3ZE ztaabCP}s)_l&tX7*WvW|GmVh|)m(gOYX&SN;P*&K%vWi7^&@54*7b)yUNQWRE!1xN zA@{jiI&hm7lr3R0Jv8)@n?&W+r_YoTcI4`GKSd=!&FY!z;sZjCLUH$KPPOytxOmla zeZm$rRij*sL5nF^{Ib9;NiLE*iF1@d8QTydJEE28U!55|$R$6IpyB+fe!K{0^utgy zDAJ5;Xnvj$*66VFbmC18_$?E?jFlNP*glm{@9UI^*MR8LkZmXj;pKUp#*5oBPGfn;&RQPh)TT};(-gc=<5A`*MoT(mmI#wi43LC z(O5T@p6_Zb@$AWEEv{VUG(m6Lia_rhPyXh=Jia`c-!}PQXj?$Gu@lT4J2I3W9n~sC zuyOwLG4#_?j$S;DygC`%auVYf7WR1lNoueo%xMS4?3c4{XB+K@0t;BlKE zTf_Qq8n5#>quQTg!j9qC)P=k!Kw+fy!(5;BzemVO9*M}n9wKK%-2o z%TD$8!(>neh0B=WrY%*&A_lJY030P!GTo6*CCQP+QMaEUEYYR0_$QkDWR04_#d-UN z@cH>`H}VVw3iGT9Gx5Ns%ju3Q^iYD}O(>h>(~=syi6&hc198gxULKkTy%eQMi@QKJ zEw)|bqUxNFj9jrJAGK3``e=~~sb;o)FI5<(YA0$953Di?gRxdFiI=}l@yOF80m9Xs zk!MD81|vSZ{?MN-DAK2o4WKA3^KIUx=J*FOBo(hGEUbhoPf=tcaZAg0Fdp$RrJX2T zRP)72WH0YlD~FTK)BK=&4gb5Qebtx4v1l9PlDi*q|1hD8;f?Kus=89qf80EQVzyW| zbnE#dkyg>3kc80e%h!(%i}mt`&Lg}|0725tL33x4qR^lK(W6AdYXqCF{rgkdl?T9bLinvWhvop5b8&TZT5{F@$pSFlM6UW-115nSy{ME)9EFF= zUg6eKC{_0H8FKPM@|EoLnXcaJEWui~A^JC1p#d8L!^$J4lTh}_l{x74$Xr3P&4M7? z+Yc$A)jP^7itpSxRGOI&dA>o~H*qy~KcmRoO-1riRwn65d9|!JX0$)|UHCQ{IHNm< zbiIb*>;C%7_|)jp2x^~8)@|>7&L`E4R}#lS*9;VrR*_>Y06fWhgSDkn?%^Z z@4t=N=1dF*pC;WHC@HDG zyHU5zzL;u9{QgO92?KzAX5ExIqg*-c`EYS2&1ju!pZUQ@Ifr6=`5j+R+V;nuH{-U3 zZzr~)A~|w2ek-m^)xA>xG0%=hy`H(BBwvvq@9y6Ac88!kkdTp;babeK+ufp;e|y$V zOu@pekpe$*Cb6qkG#6!;F@5F(k$ntkuQ$6iBLjy5#B1*THMc-x-%J+Y#MG2zvyTnh z-$yp@5n@q0sXuQ6BEwBFzYrma69T>yWr7*Cn;lTijJtcStcA zbEmMIX6!I1;UL`dx_H7(wBf?t1crGtZWoIm=BUvOyZl+Yx(6ddfCu%lTAChvA5 zYqkX&mnIycehe!cFI~S^M|FbHEM)t= zH=lYOeAdi#rO@yoxPVbN#8_&GI+gJZE(A;ztY@ki5kDODP4j!p(Z2QBtx2}9K*<@us`(CXur#_$2tYoBE*oWsFp}@Ol@WVL->`w?^mgt4UWaw^?seUtgTUc z-QUm5WL3{JEjvYVa&QD|i5e{xYL9(1dE7(}`dR@XZ zXpS8{mU=rdV6-tB1J&W09x|9{qsRl7@#Y*I3131SCg!GkfN3aShediIqYP@0G@p~5 z&VVMFs2~+V0V0&sP-AM_)tJ#G`EnuD2Y!VmN}P8 z5{wIsf>4>3g<7xRvjyyfG_;?<=onH94iRC?SjhlNE( zxn)i}I-=8}MAtK#BjgE&xyj(8)p=fQr>3ld7`3s)1j~QF&F{vTW@Kuiq=_}Bhzb4U zhUH+W@DUY-7ei4FH!_%1SCOi~@z^xsD+%EBf4Cw2a!|p}Ey&fqJ(2}Dl&7=MS&E_~ z35g@CzLmX}ne0!bi);7#);3^yyE|e#-?9V$*~0|!AnhF{{A>N2=(7{i`iu(gcj^o? zt5ira)|tPmpc<;8L*6Hz>{a@4(+X3ai2!$Z1}ELkl>qvZfekTUIeQseG`z`{ZAd-dX&brF7haz*Bi<`?=A3Kt*8Tk^B%Z-b(NlWj` z)1_Fb|AXa={;LX7;0b8OPB;hbxSu>UWLQGlQO=OldI!`zudcoqVvId&Gk`rT{5 z04O6PGo8vh=Qxn#KDd@|%#?y%SI4dSgV%un9KR%S)^nh^Ehj9;m~hkS17KM2c)lZe z^=q$$*xD8fVo6;Fxz6Zy042;5GPS=%v4@qCc!2_0y1{s!Si_x15Q{>>NVp) zZ~S^Pd|XqJNemsQgj}xAKJt$(6d=~#7#fPeUlH-HIOwQT72{*!8IloYZ858MblE-( zOkgH(GM0J2{xsIZrQ~-O=3p|UMsHe2I~f~e9f_Jtvnzw$^KTCTaB-3@xMU_%XRtO; z6Xnh=$D;K`MjgDJeu~ctqq}Pj``lkMoVv$ntdB$~w>WWAujK$PPN37=88>=A@c~8r zNl18_-)&yudxdj6`5XF>UBZY>_pPRD_Sy?6>72Sgl$WQ^OVX;|L<4-~53g@T+mjHD z{z}RU27q%}G^h16+(h=TUIBJ3w8g}COU<|y1lP4*#_Sa`-U&z&#bq;Z{fBH~O8|MDQPRKo_4>A-TOshb-d zHk;X4jc%;UNX^YI+JNPs=rQRcnlu$EVw6@Z8u9edO#)FjYSjD14CdzVyv2GsjrBp} z1pV*y`hu(N`nZ&< z@})F9#7$?s{JSw9}n?n$v>WC&-d8T=<32_CZ3^8)S zB;}x*aBIciio3y!=e>d;onbSsEFFr^d7Y}-O%Ov~EAIy(T}=WeX-tNF@oxvxto?JW z$CeWx>E9UY;$Jr;L1};il8BUd#(Gl+DuWe75FFFp1${^dL?bgUd8(8zunL$5z_;nt zdpP2H?;vVcq(B#0=+GqXV00-8#*2IbJJN;<%;sJ#t-JesJu|0b{x5Mej156>4PYXQINjQ`gpAmW}wED`=)TxvF>n|(L4}jDNLFS$I2rQ{fHzlg2djku3{SlEWlwS1I9Hd zwEB1V;4T9(znv9tf@RD{^NA6rV@3WYt~E};Z>zA=K4M((sN{s%b)JPivD zjN`QDr+M`+%oKz0@IiW#s8S=LLH=A=Oa-l9*;jfDoM{CYR)ZNU7S6C0wF1(q-Wp{z zPcEoC$)A=h3d}E!g!@o7gt((($I>oC3az;8kWYxb~!% zMccibG({!uroPm+6@^wh6*lFoik7@jrxovQ#vbE?=zv7reqD08RD zDM1pCv0Gl~oUPRllb8NO%zUuIM1uS&1UzsT)zO-!DNCMltrFdTS+N)W;VIEZ&;GKH zgYR|vyJWiYfUrZIZ`ZcjarZvwUXjc0OBkn*uLiiVcGSMmq8|haTc1VfRWM6HIJ0q& zr^Q{`0#$CP6W>hKrOI%UQTgaGYy$JV4jOBuyM*6ggmVOywBS&o{ zy?uT>U{|kfN#|nvDl%7N)88G@KV18Mrd0j5y@)MVQSVI)z zZD#|s&iIr}@$u)x;j;_M+7SzhjU*i5i{ZM>TJT>d=m=mN*m+1R9z4DD9TzOxW(3w? z(v*P}T^X(nv&UXeryLO_C6%+Gl^3zK&yPbdHjS^Vi5s8x#xF#XNo-=MMTZkf1L`yUd`Sd( z=;M)O_0OkH01XMhSGJtToSmqX?R3HfqY}MdeAW#Uru=SD!9BmwKla$^>f&yuW<2e* zbm6O}cI9I?P{3-PB)@nl%+a+0!?<8S)`_duEMnjvE!098;IdMsyPZNb+G^g(Ev{?J zp;!nxKS(0A5&))R#n@DYw3_~=@MA9bayU# zfpm8_NF&|dAl)DxN|$uEG}7HEwWt5LuYK(^&Nx_e&Ud_H+|NCbN1HwOTK3Zk$o6yE z&Iju4fK-85lj~S6%3?>nb)lU%O-465bRao-+Ial&(VwQp`>Qbji>}^Dpg!S7DANK4 z=~MSFZ!kE75}z43HEksNy0R3P=X7&7o}UJJJdE*T_JsX5@T&C$!JWE- zEYMX=15U)mgGR>-RVV8mVN5#JW`{GyV-pklcL=-1eh2hbt+{bVfx;Z|V=e>{_H08pHybx_{G?Klt}s zf1y$-_IYtRWT?R2bP6I&WVqj#%B7Zrgcu^K=X_AaYt6I?JqNOX?1_QQPFnNjLIVOvf4nB{aK5MoC}Z5ySuc2BHiFAVk`$>ZxJTWg9A zE}!%^c2h~~M4Nu>3qLbMjk|=KIuHH(QnUVrlR>(zP9e#7so$#XR4mAfuxhBM^_*Qu z$BfdTH!(5c)jcr+$AvxV#M6YoGL^|}se;p^T5hg?no^BW7^Q5%r^twdmh>Nu6CHZ0 zp4u-4R61MSSQPf)=Z244hjR_UL#1^K|sMZAq zV*rW{fOh_03@C#k6$6sk$SALhA!YMYwd-1$pGQL+1#X%!5V(NMiSa1QkAJRZ43h8N zN_zWiUvVb;`Su$>gGA+&t-E{bAenz)Y^-8++nIJza@F0Ww*Qx9#4PkPn!`khvWsA# z$R8fOW;3qjCriv19i4lpw}v)4jpKyGV#-_(1MkpVIrxW*n956WNhKZRVxk;*61R<6 zMDr_Lce1R#-40rwPoLi*4bsX{W8)#M2;A~;J|jXG?1X7U=?Or&6D|p%j7V1|38nAx zriyJMMAj2|>Wfz$OqA5x1u0uy6%+aq6sYYCy4gl8iG?%)|7yCex6qq7xE_eFzMAL}Zb<(?ixD;#L+4$g6E$H>T7B0rJaj_2Q)55%?{Zp|R#nL=o zm&f9`jgf)fps~-^04)&F!e&&4i5NSHLvUzU%AY1ij;NMAKp7%IgoiGC!&(duxz*6` z2j1gdseS%;!YFm9Nw&*99I*Y)f>+${6-Me>&NJvpKAvg@YhwpfAPpLORrfyVekgTP z02OQqZ?_wq7-0ui;5+tPvIyU;$C%Ed8I=vukYL5)er%i*OpG0N;g7qTyAzk+wNX2A z^Ly?f(h~YD*|{Z^@Wt^G@0-i22^a)4qyWf%FxLZmwDI44(1|$Axn-4*mU-TN-vE7l z5jV!1t$IHx{fobJ#^u!7d_VcNbIfa|}5mX=bSugR#Hs zf2FKmz@uES#=EXokISvNe(OP$Ww@Z?7;}heJGb0&m}roUZfd zfC&HtpzHWISn9i7th1b^>)(20klR2#a-EG-xrRoekm02XA6ltYn@jIyL!FV$N^>XM zmQ(6fY*D8*l1_~RuhFVe90rTe)IDsvF{mK(tzZ>lp`~bNm;N9#8VvXp*~Ax0@yTrG zi~B^B2xmjsM?QZJYsQ%d#(I~si|^uj6mXezY|Ow9%SKr+)M-9yTjgp>f2R2u?jzxpI6>;? z_##tXh+(Rfq}C1_aIQOvDz#k}DsPlkNG$spjrSeXFY5%nII z##fKe{A~I%psDlj=<2^d0KPUPY;$ZOSv^Tf&ALTzu?boD1k~F)9I`FMV*Q~)k9{InRj?*r3{SVB| zk(*q&#Nr`aztJW;9w?Krx7*)d&Jn7VWPgW;XIefMPKE-E3qfe9fN3AAK$Q$LIEg2h z*%#kyGoe0#1~cAqLLfBNEM9@HOp5yVRG_`k%dW-avk5;?H)C+M7in8PvqBnll`tz< zt+(xvfngd(5y|^ewmp)lD9cUbkNJ)$r+647QQgk#Y*e1F6yBAmRwNyhSqm(CK)`_U z#3oK#(VJp8xR1r>N@<8c$X0VE4qkuR4TS|!r)qWuqPXqVnm)k+->M%vB46nC<+LE| zUIb(vQ@{&?i#0O>Pf5f`KC>3>dHwVoax~z!_e?dli)@+7xA6dJsRm%AmzXvy_i=oT zwW|ZL;K>fZ;6Cifa2y>P^TGg>uVzCFJG*MSx(zu|Dg`$B-D>$`4lg_256doXo<~hV zu4byiF}SFMT(Z3CYD2V}zvLrUs&&Usvr^fnGANQ7FJI!F$D<s^a_~GCG#l<<2I(#eZhK!3#>rTv zI%tJ67XP}2Ino#D{ZuF4;5H5~8gBLh$Rq$6>xVw!XYpJ9u512rabIA10$6ryHtdYmh0<7i{4qA=F0aW!GWnDyoME)#8_rnw|qd_UbDXy z4pg!aw!nF{s`@0K1oL#~^!$q;#5f>^hzo;0Wd9LS{418shuuGDsOSmufal^OI;?Ub z6KLnuFWE9=i-RQDGJZ9m;$5Nze(k=`7ab6sFzG!!PjjGT(+vNK(=6Ydz-?H5kvRcBz#ukNjlHIAbZ& zC-9L{BDE8#0MC{&ppJ<4RQHo!)JiC^iupxj|dHPc$GZ&IEYGJ-CP@GEHyOn1$}*CbEGK~^4i+? z`S8RzD3>^L_M4mym8|@n@r;>Z=Z=gdpoy_Zd6v|qI4RfVRaxie2i~6k%K6+S*ts?p zV_@})B*_2%z4v9tYsU73VyfXugfDy|1fvx-LaV*1r&0I%cdczalSXu{pOY}|Vj)YK zdG+4)x&J+Ywn}D_z4pYhva?I`Wr%=9y}5e+L{J*|yW_hV)SY%C+0KgD+|uaqRT+f* z$t%65Wb@rLW#;kS4vfuh?5>?^K)|FIac6=fDG+-z<$A~|-_s9;5Ur#7dwhASY*gHD>PY%}Ro-@IzLkuHE!%;T~+P4kC4698iY z`Pl_zbr-CpTn4tR-2R+W_qH5qB@KM3ZPE#|h8v*cqr;V*O%mgN2+)5jMy``jok|$6 z31;GmMOK>&zCOh=D+?ctB?v-YU0tVUXZys_1&f3)Bb0)@?@m4esDck2V&EIPhtunC zQsJ%te139KkM1%0oBs&iE`v^=7SG)jjnMm5m$;vQLWzo!6McmI;h~Zt%GF+$Yt&9O z5HRD4)Vq0L{`y%b>xA=+19PHX`L3w9cQutku5FD2hAa$us02o_# zgx?J3kXvYDfyYt{DVaLrTE=%KHc@sD%p68z{^)<-B~gacY}MF`s_%S$)SoCqosQ>qhY>8AJTo2M z<;~w`oUExlcrCubd`6X~`0qFN*$(OOIc}oTUDMm=_S+kz^F*#HI7`hrPE<%&^Udw@ zf8f+#Vqc(>nYCC-gO5m*nyV*5?fvQnr^gp?phc>1q>WACixlQXqW5HvsYi@38%smB zFT>?|Um$xI5nC5u)n{QTnGf0BYbt#1PE|ou+TnFS;o)5DPsCc`8Y+Rv?~W!z5C8b0 zq*Ac}3?0qK&3e5>FjOjRMHTOYu(v3~kAUGJ$NuLv31cREh^Ypa7N8l?Hf&25Vs z>*oG8L57D%u|Tq<2{Lyql+r3aQ|D-V+?djCS+Ksb5tp2(xV@=V|OpU)x#h%E8eQW$xtmliw&`ezLV^ z_8NInA(LEhv$D1-eF|O52u>v2-RVl)0tHD1PG>6dH%1rN=7E4iKC3|>j+qxsk`QeE z)D(`IQ*eVskq%OSm?Z1SK^+ZEr%$d!2?Fx`q`o&Q$RU*Ho|D;t0jEmcd)C%sjXcYN zw=!M2J1ayg)Tj~h=GiXTXb33ev~7S7S?qButZ4Vm7)OZ_K>7ocBdCAwMgaS5ZgywO zfCaxF`HY{B3s1;`sHpymjr*H~=hNU_kjV)z8vp?F0(p8n!j1kpump9h0L-qFg!?;) zUIL+S4*>9U$1^yu{8UIt;vh8GL6l6VDv5^}$9LhPeKfnn_1oJueu2<;DIIr{_D zGdXuRk9L#t5<808%Gn`m2$b_k`3UZ*>Xi~zN^R=pLukzd*y~`)^9PJDD!J4~-9#_@~UEwkaNQOU@&&=-up6|vV`+!bh))J?M zzTbk(GiFlgFJU$)EZAi8De}-bB=_kzs;wrUOg_YhGenj~zLz{Rc)TXegB_47@%=9p zH%RLLEdlQRPy10k@a|Q46MD>Y+@22y$X0<_@yDgAYV3oEtfOC!@39Huz`h*Hjal+3M22`$8F!_~u<)C4;k{&I#Q82J=e#7aU_ zJXnbSMnn_wgQs@e3Nbu>m9cg6S1aU-fQW3F1eQfYNjHc753pqzrzuo5bw&jiXp~q> z;jp3l+l$c$Z|a0bAA1y~Hn68Rq@69Ums1@&1sS0Fom|~$AT1%5w)<;0h$^)E+YqiH z=ebDIs&1EQQB)u9Oo>APE+npH|0?zSLnB7AjgbFy#CaimR*|mTr7u~PThY)_iGhI$ zLE>vHN?eCmywchmWkzxk1zbZv;c@ECWt6ZF_O^@JG6ad#!;jm6IAiO{p*64{h9tRS z-E%`sv`mHu>vwa1(8gc9RF0p=)%QROXWg}(cSUoWm^Sm*V*U4pqW1q;UU>bUdBWmI zCE=iMTf>Y9fK(hX3z1QB5bkA_U8XTQP_4?T$O|))0a}uP5pR&xTOL5tUTuH6>`#n!01`kULoxmudJ0QxvyF|{smRGfuupvqgO9O-D??0msp zR@PPAcTUwCW0=|U7;b}K;hoJL8F%3Z0-}Jc9Ue3bxO0lWo>%6*QTnDSRmg8w5r$x+ zKXF|F)N`E46?#nnZ8=zN~9sefD^|E}A)^}RoEBPF>|^x`uCr1}YH8XcNaYNy)M zO$3~?3$lynD;pX+CoZ+{(sRZ|64hJx8#i)1hSA<9fs3hTN(z+^_AYUl##JTyL%@?Z zx4$=SAspI_#|uuK?R|MtG7)%Kg1+yHA`XaS5b+47Z-|dEPE+$!rNjIrI!`!yCnS(- zGDKu#ZQvKkOIo#VEO?X&quLMbV5%tR!gCD{+SClG^IZifJz9D~!*nQvrwP`GtSi-3 zRE#^IMVY+N`J#~xvl*#f5NBg?tc$0{oA*OQa+aeUXTn!8VEw3g#eEj9G8Vk?RWc*) z^e#rHI~V0*?(N9OOgRErNotc+pvQb9z1BIs|N0typL=W~Ys*epCoZ;rQJ{?i+W-u_ zT7K`j-=1tFXPPa&?D(zhN5;<{m%A#pU%6wtd2cCgCDO& zF$9P!r~m5>WEn(3D`&`?=jk%P;ay-8E!ONsRyM=x4?6cLxgzJoG$LP!M-b7eqnkfW z4T#bV(kP2y)Q1Ae{Cy2sm$nMp;|Q$1h0&Y1X9W z!7*mY1%zUpHOHIf=<*;~{f>c?F`UV+)~GOj50V=79x!#!Fh%A96vGlZZGtZ_Pm27E zJ{YTxnyfBU5Xki7EJ2nRzidRmV05Z+I>f|sL-LL>Zce=>x_T@?BO)`IdKptuB0WLf zqyS?=)oCBpUrKC<-A>=i5pbZtO4*L@--~jyvwqMN|E=Thh$GiQRd7+_bzNJCav|}6 znAa}clwSsh^A(;lL23uDy~_4*w3L;b7AfX_{sJV8osH#zn~WSk{y9KGXKtoL>#L`_ zKaYc_B6yy!>)v5QPKQr){C5576+pOiWZ4o}uG?}w6YF&xBn?{qM9MfowALTGYHNZF zo*%}kiK8wUNfemG9UVuCxh?W>pZjMAJ&Y%bC*^Zy= zbqb-@Hq5%|Z%Grr12AU3#h_`nMOIMZ})sxAqoE+JuR2&F(owU5XXh&rFwsx^cX^bH#OnQ5XbNn;TugA)bs?6dQi zQ@6pIV3ecWTWASL+Sxff+NN^H%70R=aPshpJ>K&*C;*aL&16yuFO)djPGiEJ``RuCv!~xFe6A9IscrmADMhxQo7)P~gL?c1-$qy|FG%^TBOYAlF;>-C^>0&Fk(D9zMN1hAi{ZOt=Tp zq5NUqU_3^mGvh-;e7zP9y(Q`%tNUE|#FCv$LH6%QlWe~aYc1M)OG$-CW;!|EE@M@$ z%(|v2loN(c0b@7fq|iMvkP__xiWMO0YDSinX%d71J<9fpDQkTl3LL^~Zf?Qj`oJ27 zMoO6^%g)OBt3a|aJv6{d%hlZ-E0m(^F{`Uw=y6yHS%e_eNzLZPAQ_UI^)?nxmi_ND zvYks$XtNf4=<4+oQvQs-xvf#HHL+~t@IEkSzQp1O6%6|6-gJsqFdAj{c&)M`e`iL4 z+I88yu2((M0@In*_#&hicNs6-ESjn9GX=7@s4X$=L*j?9UNx)P=c1vLnIM7oFap zU5!vE3SlwzSSY+TBz86`3*0>DA6v<}gWwsa>Hdz2)W26Fxq-tX%o*jt9876n@vrLf&g_}iD7Y(6IkEE`p^W#BI4jfeyq1*jN;tZaFg z7UF+uy98;{UElMzFkR-w$f@>rlO)R+B2f%OEt(cxgibQh-K|&l@USeHp#w{@NAS!U%pp z1d~p>&O(WL&r-M}t<5E@tAMeU_0aWd&HEhyrW(Bf1X9c`D`!| zE&Uzg(qC>(X*=(XlBaReN&~YzGMeiLW!UmL#g07FRZKYSDC(319K%t|CpFs!h8Zjm zZV2AcSCdWUxGP$<_|6Dn;BK_I#YGH*gxuFCL!A@*25Epr0~XUmtU#>uW7crIEX{8> zk8ine4K=el^(tv*W!Cc0@{sS#EMZS?V_iN?R!go}&2*bKJwAT?g zW|ZSqf#ae6I!~OA@5^e9MrBM3BVrCEk~nuKN4q=Ie|BE4wkfNAZ+ZSf))oXLwZ~E` zRlLuC5Z)A#rzu|Oyj}3<*@0en1&ILYRCAosbN=VdzT`y5{Iimk;Q9F^^)DlW#0k@k z%*?GG1hTCXq8bYTjyV6>^qsfb_5O}ch%3Sj87l%72x$Z4=gtiZ{||@#-*ts5t80Nq zXRX(QGN8xojYpDOhOR3HzRa$0CyHN_48^bZuMO0GMFamth5pEk-`=Uwrw~@DS9T%z z+(hC={dU|I%s=XyaWsQg$&gBoEi6`uKgy3)DBeq`gX8{AWHwt5<;CBi87iv8EZJK( z1$J@tiKT5O*;!eMQ!e|dCWsEAmgNWFC6uLu-Y-rgQOSYjEyy-_w^ufA&+3p2lt~BQ z7$86$LH3$Y1`7)$r|Jjh^k%f8lL5b*U)eBql?(kvD9#C4mYIgMOpk@Ri;M%wA-@{-*`Sv3DVFpub4zIFJ;`C2j6a&qy?*2W3PyWB`cP(@=yzxqpcu(6k^R-)YKTfjF*?|F4Et>OwFi&61l@Y!#a)=H--Q0D| zrs3eq_2xw$opRnSBI3qp#y0ROPd~PO%#V|D$Q(Ms8iB!g#>+YKUboXENOSx>V#?OO z{{ao&?GM#k=;$A<=N}K0YpT)!g+emy%=6d6docLg_iG)1xdUP^1!Geo{EGuPm^=F2NqoS8h0f)o^wj!Ls$m8jaj9uD|wgfi@ysJ4EmW#g=+z%IF zLg5(D8#U7N&*#v9Vs;(|8aGiv`Ra~6C1-(H@ zB@ihS8D{hnLh|OjX?RAj8hE%xZMkp)hL8<^AI!kEvIW$-#2-f1Cw>mMPtcnFog*cK zT_t`qCR(dHbO(2kC-er*J84rt9g=S8o^OzZ(Ll!78+wNEC9fyxRyUUgyb&|=t z1vc!;+2RbiFN_Hx63l$Uf$B`bLZvj`kEAvQmr59+z?9~Etv;~dm*mFX+;K8Uga`up zJ`YOO!@G0agzx#dq*IIoE?0*sejIV`O^n9(dA)qxUTrdpck`vWUweBer(R`tTk#p_ z#eH#YVnl=ni~yhHv&s*x7-5RyJv!s&FGO@wLp1Jr936#Oy8hDl8)tZ*bw&YX&eibS ztL%$h*J@;YR`Se)WN~ko(8~wx|FutiYIH5I5P=wgNV(cym`xLyH4@#oPBLWGpvo99 z2)#+GB42dgmUeNvzlj09#r~FjRNCvJJzlJ7Kt!5Itk<-2q^FJ-2sfIp^dJqCya$Xr zOlC=}3XM}`atG1u#ncAnb$O-P8xIjHfYH7Ec^OUL>+z$|-87kmjjyap!8+2_$s-h? zH_4L!78W8IFQ5K9w5O*|3$PR&x7QvMfCg!@!&~_~d7UuEQmvminQR^pm~40jGD-!r zfd_@c=)(yw-+1NI054xgsq(EOmaJHnasU}9J|#oOs&U5fBW8qdQFIOjhh`)2=g5%1 zE=vJ2b{?Q*ODLmLesoB%TOEo_3;8-SZ%Mg0ZO6u7CJt%eKYBd8jdJB zxs}R-3KyAOZW{Tu=@zbWPp7X&IE(ir%p@8Pul~5wk5vUWpcbq$9Qu+fvC^!dqZ3O-J0QzT6KnPd0Sb^l{bzk>0ka({r)T|3jzR7P z*Ifpy1fIt#pMMy<-8$O7DHb{@3YGrBmXIZJvi~1|^RN!d2KE&w6NJ7Y5VRP-gkDtW ztg|rWV9Y*3o3qIo{$O8S8NS!+`gU)t`%5ib73{tVl9 zC*6H;#Vp2=9i%+eB!Cp8wC>=36cZ`lQ>}V>e$dmnoL=Fsb$hbU@qgv*e52Y3gS37o zxK=N^ZKDv>fUZ7Qy%%SbeL`u{A403M{ut_8Y^&1RIpo{JC}D78CRG$(2#f@i_p zsn)lKGh8!mbwYiF zl-Lq_8yVl}E*7gZZ6jnFJYESM<>xV3DS!9UR1CbYaZF!(q9ps<{R9Mt{yC|U-l?eM zOBy(^#BN{w&3U0F!5(ErOrb>SD;rX=Dv8AX%ja@)?+U3(_Vip)wB}565NL{#?s|!4 zKJ!%^-;08Ggndxz*7(0STOXye2@$-9^KSolKVQz!gGZ}Zje&DNDC2A^?7Srh(j+y4 z_dIl}0jX&5IUHVmyi#>=^eO2s*%kM>Szw?`J@z@Pvm3*+F@>PX4%(_E8W>`3!X;P$ z#3;eZ$dwCOTR_jcVr;a66F|9ci<5Z>XSjxft0E~-_tM6*W7N3jQ(S&P$7x^v{nMW^ zCJSO!*jDHtDrx(Lj=NN}W?fGsk<5%ikJ}Mzr0gaLL5foAl>&|XPM&Q!ka=aCHFKnb zCJ)_&O07#c?F9{gmc{^Z!Bgxct4@WnY>+M&CZ@aFjI|5Akxg?69;J3~jbf0FEl%=B zjEpn7dK64dtF?m>3%-LR;$%hOo|158)!1Hbu!BL@-8fZ@R5n50nkq$m9$4KIdhT&Y z-a8@IdMv=6Pc*Jc&u&>m4C=y{$om{5U~@BPFYyE|<0i58$b6*9K|@O~vLE+VL(-Kc z%4codSZ-Q5O9d!=N3k(^Q`K=$)6c9pyr(fQ7dATbkwfDFYEZY!JlX%H#|B^zUwn4U z7aynZ_4))CtG0hXa1=WySdaH{z|OELDt>Q@ov~=;A1X@Rk;ApNpM%#8sYuA9ljTA3 zYF(xp)toO@W~M3*z?s^Z1(r^vH%m4_`dCqHSB!0KzbS_RIXN7xQ8qwk4 zH`BgCzDxZ}GDd$P(uN}`v0BFp{X=F`wMeZBx}7F_CdjI3)3O&YC2O@~QtE7v z1LBu&hX~c%8K=^ZQ3(1w-4OzE@XIa7nY%pAJ;0>S#JF0X`7mB4-I9r!$Vy0$6Rj^E z81z?ZFj+hr#+H)#2Lr`hMs+nQ5Ku=H?I3NOTM0+ZUFsWS`<11BWYb+2E#m~i_xqIs zJ&C@4tw4!%p`md%NoR#Lra+9*dZ3Xj|Dg}OMM4NCRkSx@Nxfa`T0fy;z85s*eyxTRSagUi(@FM{YOu@(Hka5tYSS0~rn zA@^l^e{-5HVW(K z=v?B9q;b>BD)DdEg*jk`0h)6FdDE0RdNRh5YNuM!N^N_MgSB?D^RWEt)OmAr{9Svh zAEEiX@q8i$kR6kIKFVE}v)X!B{K8U}#}h`@w6z+sAPgrk(cXLeFirdqpYO~vf`&3o zFL|^P#dt<0Ph---d;T5w7W`O8_6&6wgL`;9WQcK~H z&u!@TG-?zqCwvp5-b(STsEM*fRk-Kx9PBS6$d$)ZE7C*zl{(MqY3@3E2W+Yf{qy3S z>!RbK8_J)#%7Za}mk0#OSy4;`k(Ni{Z3a_YWBOJT>525;%5d-nONOKnuCU1hDYNnE zVQBxisY+X6o{3aWD!@_Y;#x1FvrKWQnMTchSCq1QnlrlB$&qXY>Zy@h-^xRaU~J_J ztHlcMoZoE0SfKp)G-GL{lDxW#sq9w-e_TTQBoL-j5@1U5T@gKkLzG|E{r1#4HTKRayr&w6-p z+Tcjsw16{|uIEb~0Kz>Cmdrna+zX^KYl~n6%YcAoAHUpe%0&KnF&mWu;YPq?g$-*| zxLLDg`ztmw{@4w=I3ChWb6%BUQ7D4JQNjTrTDyfrQl{5abisI4M1IX%`GN7}U=gh) zAIoiwP_*=PCRR=z$|*p=-ov0{U_MCH_ArDX{B@THHXu&IkWj@11o{Oh`*YlQ>k;^b zAyTAgXMfBZ2eiJ$kn+o?7)E!f;!Nq8`r7ZFG2a@=vzluaf+hv(W2E(ky1Rb52$Hq9 z3HrZma=jh}q%Czg2>07SZN7Nb}xw7D=880%G~1gaw5N0(1dnp_(N-sSNnn5oDby*xvd^r^{}P zI`xQ?Rq={^Knia*a_bU>%4?H=vR;y7EvpK>YI1wqZi?6U%q|bE-tc$xu;pb zmhB*;gN_0-lthaM1xcMIlSHqg+Kc|Hgf~^j79uqt;idIHFFOX7UJi6=jOTFYx80)% z#oERKq(F|IVNRdk{X%VN6(28a?gBdkHo>%b0d92|l=rL9t!$WDL8}72m6U&Lf=!=f z<66D$mmwkV7T;^Od3;r12&2>RElQ@g4N{|zG5ZKCo-5E~{KTDBs#~2G;3Zg*Ftq=k z4i_}8vacF}5l9}cZYB}L!#!+~Bs1!{fiKoPki>revZo0{sG!qJozyr~%=mgY97LQ8 zs>@@SZLW%WttJN60?^}feQyginf-Woy4(X`1_~_@Q5ji`P;yvNg68k~3JG~mdzcW) zV5x(o?Qcc|u&ATjz zOM}VqB~j@0;{D{s*0J=%BiU-8GATPVb(p$KvRcXUF&VoVw+5RK0f*9hzM`MlSF%u`)Vgss1>Tm+!Y_6^8!uCK0#{Q(GVDEo zo(ecxs+cs(YOdT@x0hO9P8JOZ}bO?9``2 z*Nm`5#Mr8l3#OZGq}tN!J6DWjr{b>6qV6nKWmm`}NeSaHzV(__OI2s5W%+y(MXi`K zl-~ru%DZt1bR03(@NUF@cx;#!O&$QMCp9z<Q z!|F6;_NN4r!UVf*yM+CL=1c{};MmM5oLJEgWJTnJLm;men<{C3H{M_y+@6ImBuOQ% z4<3$$TLUb^hzeyKNGlRDvTP|*TrzbSf&U}36V@u7gmX^aSlplt@;Lb8Qif?zU;Xc1 z`E{$0h0gnhZBDs-_iiHBiQbFUh6C>1TdCm!Gacs$5`HI@s|H_(#A6;sQ~tZAY|X_8 zDxI@bCN1>_KFQCJ6Wn*x-n`w1W`EC)?+2IJ_us+Fe5DqF@I_4ukfZI5oz&lHpL;Dn z`EJ;bZ3M&^ZgR3kEx<)y;g~dTtW?Mim=NH$*X`9HYUjEcoSh4VrAUM$ZArib7^;=MY5l>8r_1u9&zfunSLLpVYJqZ97jXfL}n5N z3^X?1GN4dgbs+MW@+)mpLf~MrI9*`Bqx25zXa3s#{8OqyK4^G}&%pcUok;^H7xQs{ zvwR>qHHx6Fa6yAAKGcBIs=lF4>ip|dip;xYv3MsGTe$*bQHu#`sf0SFE2}7nGg2xv zfz;bQx>UaOZ&eq&Bqlz$oeu0%v%?GHHg#sv`_jP?45900*ognMgGG1W&W!pEe6_JBnB0l zp^Ihya-q%V0+`N9Q5|9$?+NWR#wnDhAy-N^673n~tT}tqnYq`QP&lV(?IA3KInL<` zvfg2cy)jE(**`fE$aYm~B=L@j6Wp<$=;E}h4Tqh_+NNi;}f&WQ1}$nnH#=s3*we+3PaC)NM#0GCii{%fWN^K&un!nRTn&?ha zMdE;m?!F-9Lp9lD@}$c0nQgZyIJYo{K!6>5N~%@!8I>IIp{d`~Lq&hSiuALPo5hzq9lNLJblDocc&4SB|*YvXg zIJ`^`Mz@_mem&rT=4;@}^)zI8JHC!%RkfSZ8#^Gm9z`o-j;Tu(W7YZ6^0J)L{xX32 zE%O_&sMzIs2Sn<7f^_D0-&V#=$RY=|mNJma$xXhkNg#_E56N6=Igb!mBO)y^%iCJK zQY?XH2&(wD5bgXX)lt$GuOdsM-AN|u@Rf$m&V_ z2|rC<#^u9zW#z0D#;)qpe*5?KL1iem&%{=HVf5h!51e=q@%3?kA@8z6d4=! zEco&lugkKr&VNrz^FpdEB85;WpX&kBa5|Iw`(in-2m2cwnwDBFsiN9L$q1%VM$~9qx`$TtI z=9GOQs~WnXFY<>+=CkoOjqKJhE_8nBxFbA52HgNM-Iw-wzNBzY|8#A*;<`fgUL2zdxEubF-7oA@~KBG*_;j)Xe}vsh3& zIk_Z3MDrucPZzH`6+-aur=8y^ThAD$-;S#q-x_6bm6N0~+zAg&4^z5%&X5Jc7K5vQJi@j<5whWbRAOz)93JlaH&F3ptgXNH|`QUVUf;6?$~!| z8`j-A7~v#vp`LBH1-@NoAb6UdBMq1ze^KNySKb?YIdf$f z3lzGsGEfm`e*R8E7hjLUI7pK_o-kp$9PLG)A_kVtR~7+BBmvv7LCF1-ei*>=m^!BS z>>r}Ex!hWtwGIZsU|_NMk|nSc4U`fo621Qz5tFSz1!CmT2?;r^Q^cTNZ0TwcDV{c6 z$u#0(I^Ui4r9!!PkLNNWUFGjXb?`~jO+YUwq*devU!qa`!rIhf1oPpoP=3|7P5Thj zOih#(vKa-wbSM8?p8IBYDfjk=%K20TL5s?;VC!ly*E{^_3u$R-vZzeJ#0geenoVRo zb#bW2#QBlQ^dE|p&^SA-)fP8gF%b)Cg!}b-1urk}-;GXGyUw_M@inOM+K9mbHkyN< zAiE^t^v$-0f$#dm>t7qCy6YjjmPQvzMkp3JB{lLQbK&_pOo>VOwKiintC4pU%TAln z7>Wo*@0W9`KNUuyi7N%!GF0t;poaqFz$%D+qOvgbg_-3s&=P(aOLZuJcADJuajXx; zDwi8?U%&!CT;9LmUA!?kede{bt4FleqHNT><(ZqFDk&_ieIJyWog)}hp>&wL(o)1C zvHwjx8bf>IJ2bv^QrQybOR6nP!BmZJ%{In-{RH+FR*eg6XwcaGW)822A#R!1r%p0U z{sT=T8JLLlFFwjON777C)9^rPlf%c_8#I|?Xxl7B%LZfVco=oF(zi|Ta zG!cXXgHK>LUIHX>avvZ)0mh#>jVkHuXJ7|o(JT%!9B_t}mQmmz>BVr+-X46#wvf7)cWE@+arNPKzae&v1RS51tIux#-NXIsT7|Smbk3Y3evSZL_5~0 z(7w#*RHTOm}QMrMkdUejC@4{9>f&KM(#dCe#zbR?{JGwefg3YfiP@dBO7`}(;3Ud4h^m`AdKy^!t9?LqF(dF~~x|o4;f**>jJs!dgXag@$QSNaZ#e;mG z?o~1}b`%_1lQNd-(YQRB1m_?S7hmF0OKG%0@TaMa-GmO>$7Ao@l4QA#yG0jB0S&sC zl`>49Tq2!rc#3^7ehJ1Bb36?_a`k`_SLU61{sfQfD6L+An?jHEN;@eTU0)}l2*8IB0pXRIIvo^06nl$r3!!#wjNUg z!q@)`(VdV7zOW-`cDY`0_83iDWPvG401||;BxENOQ_B~CnO2TYHFV6+)j4hA*%-;) zzIGE~gtLX|Op}*3y{sRO!DaY0)=mQ1Z^;+&8f{XZdpMhnANxoj7(>!1_`z40(xsTD z$x$ld=XnJNwe(PjgZFVSlE`X3#H0hnxyp#C5mj$tAH)Cd>GtLD+udFwEuNA?K40Dq zKR7r#23Hv9woZeA=^ze);fYR9^jckPvrczXHJ@FA!1J6-%SHNTQJnhUU$pL{JZ+({ zByNr0ximC8?Fh((aMlNyX;#1e(PyDa&x+#xd5XX7<9)AJNArRRm4M`m*Ij^y0vQ~Z z#^pP5ZyMGY5w+ii78Av8+5ifbMNj>17V_tqnvJ%Ni6IOndia5)gC)=6OCD3fI;Tcl z1P&}$BHSiDM5a5l`!*~%m$as_F(U?p-3wRvbL<<>uO~K^oO=97pqCE)J5(7D6CwM*U@qF@Z3ErRRgXhfMQ}5*>LePU{^ub zg(E58|BdU!q@Rz1XvHgT)E;^@#?fW3q?IW8^vB>Xym-kRA6z?fB8_uA^2(01mM0?&X1!A++`c(#(>XHg58GY@E=D6)+RfD672kQ{4&NC2bE6yQ<|Tc z+2uU?jVX^ddwa9%#QpsppXYH&HCsrQIFG9(oNO0`0J=(>RdQwFj{$D^7&jqfLkIV! z%&O#96Ifc{#-@z#t+T2-VkA{TbUHIP*bKbq7Er|F~dAbQ5*T&m`afF@n@;4 zqb`pXaDBA|NY^1_lUvLN7~7+S5rk%u)Yo;lEa1j)J=xPJQNrVR|caeJH*_2(l$?bMr&_e)Hlt_ zT0r>UP1JaPb=alE>+pzNp6ocQ`7hSa^7V3OU7(?{Si(fYPqW#2OGftv?q>#Si{9I} zr-lIhtZ_>mMA)LDq7|J9t8W(SR>l9NdnNqGVdR}`&neWUwUm+$yJ!QDjWg=snN%6b z0*y<`<%ox+t47_j*n&`ve%P7=>%0HjA4{F($u7)YI$h=wlkO`7lQis)Yj8IevF9E- zJ3oJw@8TyCYe*spW3@Rk#wM9Sf(WbH#-)Z6JR&|;j}M}ER$zA;uu7A zmtea-7HMcG9CkOf>25baOEUgRW-U|>ZC@opb`yo-Ea6+LITrZts#I|DzJ~!5Xypp( z7A$c-_OOim`)E>i*CR&8W@ZMfTYmNAsZNWBDbTR#*#2c9(eqKldcS8H)APa){&DoP zcZ_(w6v^3Tr}pquJ)?kMLR_}@tO|=+M6~z4P^jljQzCDDaFqghf=6DLO_g}_uNcFbtG$%z&i=}k{h-=l&U(gzzV>N6;n zvCu{J>KHJs++d_hP^3t9nY67hAN|mYmfSM$O?$Jx+b1>yNX zLR@QGxz7jbYe_#-L349@=1=~=)o;t3>g`A0`Ja(oND6X54vN$}xZ#CRPqJyTtodhG zQgpvdyf#fn<0t^crtB;^vIvkBddd6wgl_W#?0>|B44_G9BEiuTp+6)6D>C| zC?te&;N?cJIO&rDnjSFmii``140G~9X#g2-t50ARD9Y#Yy8rc_u_M#xgN)N*b=4=3 zir9x7MwVpYYvJ5as7+%bg(Xrpwf}W*ooLTyXFl&Np&v8~N&X{h_5pUQ>%;}cDTP1; znHshb)^pb#-^V+~Rfpa38pv}z$ow|3W+)dhtO92-6Z zC^XP);Yc}oF;_TKE>dQCLjzSaLF|Z1|p}O~ucwZYr&h4Ve;L z*72|~{iHi#`uI1?yLaLtm)pYCBo21-yW32~;toDIj+v=l)}FT!8Q zt(Mpdqbeqhnd|EViV3HENY5|NHH7eA#H`M;4N^UiVxc{+df%wAl8n$OB$v_PK*9vD z)qm3cB%3BD%X6iA61hJ+5VWNM&7och(IY#GO8PJTW`8;q-wTWIQrJ2xueU(9+ z47Iw^rwb*!nQ|PBwobGjm6h`4Op-Kye`eRpcXiJnd8Le0&|c?1exS99=C?CHF9xIr zJU$8Dx>dzg;7loLu&F9lA0 zwTDF~*UVbzgR`LLPNa?|-NSmd&*>zX+K}$RoI&_VEX!&YVXG%sM6D>5so8dC?~~Tz zJPRpIqq{cv7{O0(`S$+Sv}j(c)_orF+N?7@acm!ma`pHrdwnPIaP=>D_LPT1p25m? z5}(82EKNuS*%6S|10^U4g${1xa6MBf!mb*8V@XOBC^q25nOW8BGBxvye6;*!RXS&# z(>TP~voyfo`?$O4iZol*YU~K9FsS#;8945hH4v>ZgLYa~MjPQUTJzq3z^SaOZ zgI&?Mq&SoWyv~#6Ju>o$)%`kg@;LapD{=GfE&9L2z!1AuUfSD2G@qh`XC^ed6f&IE z|D9wjB3dXCCgdGr!A{7~n6IhbM*%yL)!mR1>~?RLU#>)wK=nYrBj^F@^_#SQ5237x zxdr*B#I|H61r5w}nbpbNyjY0P1G+N)$V2tw0JgYcVF+)mT>Zi9*S|bWh2)`Zm^)k? zMS7$dO!R>OE*)|5hRf@j&B4Jzl7>dLJk+pUnMO=kmpIsrH1PNGj8Oqd16rLLtH$bu z4vq)8|A|blNl^2HXc%!UZVr#X``tvBEGjp~F7#JMjbwGw+Yk<^<=&GIB@ToQ2_~i( zJbM?sBEiB0dh90Akn+?NMxe^JCX#P6+d@%3n6JHL7BWblD8r-`N25>7gmsbm_X--D zLi`JQz~YoNQ3tQcVItJjXsZlnUX1Ch`k$_G_gst+Fw>~8uI6-Im(oq3*3{flWG=k- zFWu@TO{PKW8i(hHT?9RouyHo+AmqEEvCBA;jk??sKZD|yn+eYNBuMQ+g02h9L1u4U zAcMF^*uL-|I=uRmOlCO0RTqj@3_Ie0|Vrkn3zjV zz#$@V*k=jW+j$}abaS#CB10@{jrw1MGk5ls1Aeai#CTCrjTRDGuW&S$j0pSG^vJh4Cy9u* zhc^L;{A+sqlP>WG&-)YWM@5#~ap}^Hmk5GgH|RK^XT-nN{(rr5)6xobAHJ^-L~x;A zQ0=;r^X4tTb*CMEU-fR#)fcC{7%6EL0@`D_=r){~pF9<(7r-M(Wf9z_HoYmtFbkFC zZxS74cd;9yK+REoy4!2=bIKHMsmZenYzH+nx8yDQfOsaDL%Ji`Scrp}NNLll$JhP* zu1US9jTgynSAmO{OG=~|;=AKg*iG4nHr`4(YF z@`GnJuCKgcL#qD@R~dH{?n;{Jm{A|O#0pApx%oZ6rSR5-E|1^)2RXGE{NDo1ukyS; znNp&E!v-i3oTe?Yf^mz)l70RNJVtkm(#Z`K(I%WQ1Si}&@7p^qC5$1S7V+U9oI~n(fs>6 z1r;6mFwmXe-a2}mn$j1nvSSGUR$u7Y4FWytEj9H4vqLs-v{{)*VeQ&>(Gbo@Ff{_yD|V4 zYEg0VD%hC;$tsN!2%EE#O2<+#doHlT9Gf%fT=+dKDy?AEf(w=O@Nl`;8~-}Ln6&#%a4Ue9hF!-ny@bRGZ;9%SqZjfry`iUB=&oPwh zfee(1TL>BIiN{}H1x*37i^w#vBXT*(1-kf5XtL{mHti6}|owEBonz6Y~ z+^kNISV=v$!(=CC9!0oHI9dpZ%TF)0V!0-$S*IS0!l~9$m7y|KSOjF@%3Jq9K1uL( zzyG2uY-56;JvuVhnT~`0gyPQ^pPM@>H`hrT$^&yO7Stj=Eg_Nih}NAId4^DZbGc|P z6#$`j&mQo)({A%Evo0mIe0o*D7u@>q-@k^`1&8dbB!|gX0ZwG-VY`((Z1Fl;a2t`| z;s6K5!^Q_p_Tzz);lI!X8Zw@uc~qGporO@Ql?#r?&vQIC*P=S;SjK)mSl)8&M(Iwi$O+4X{0JnikkeHvbSKd zZFmn7yuJ~xP^+z|9?+$-JL)W48|&fkmIg!8IE8P{F^g`lB!9~cojiZH8sgSd(BwW! zGSWKC6(;uQF5?Z>YC?g!KtxVgP4m;S&HN?n`3igkH(HUrE}N6$ck$~tt2bBwlq>@U z+oNHcK)(}?ODfbGT7eJNic`kll0pndv$te~cbTrWU?uFtwqey=QchbvN%Dk>+^0W!XePdMkt*NT=P@aMowXUmASz z0@Rpe-$oSzE~BEN>LHpEw%nP8uwo~<&bS;`n~u)U5B{aH;(|!!;*I-_ zTB=8yvw8b~?g=e80n6SD2Ec+7ZF=~ZCp%w-Z9aeVx$S=c12W-!c{q&{c*pS}!L0e< zkuKfzJlASl!iK!ne-W~&6b{7-?S{JB6*R2q5EGYEy{%aJSJ~X96967N^;)Ylv~Y)P zERy)kv0PITqS;Jma`GX`oTee7|CX7Fo^T06=MzNd zR)$%ttybxUT)uIXf1+4I@V63rUpV@@vuo2@6sobcTEdRA`}C*fb{iAVGFfJDg9YA> zT01?EmDuazOknU(%N!LsevHL4`%UGyloW#jm6TgGy}p99P-ki56m;f~4cmE^4ZB@; z5Dk1mSiC)k66Uh}6Ow-pJ-8)7_&iCgf;QV&ziL9j+k$E`E5)#BdpdQDB)-J*3!MAa z!LL|5$x;WJpH`GGzu z-Sou^TlhLzhHOkgB?eCpcVAQIn}{zv9g>TmD%McgIUt%XmF(Ed%3R}o90lCoIkIpA z1Z5GZO)6PX_e9p-9zwu7ELH`^{0$W%ln>cs5(}gjj zUZG;&0C~}xX-pmYMVA>FpdJzbNdw>tsAoyy$L%Tgay1QF5(5wBPMn^fpGWrXW##3Y zKKPJDfQb5VQUEyvM9N!18$c*Y|3yhou+pdSo~0jh_w;IVi^|;Cb4}BO|=i$-hdK#S+LUT zboc#ZFmow zf`JEGrcBRY?F0W&aNeltDTKojMS*1ib@(SzZ6FyDBak%PxrUxhkH&`y-n{Y@O&O0t zui~+k)5^$A7e0!9xuzkx=tRlt87l&oB^5afJZ;Hg#*vP53-a!=Q_dYJwj@|J1Wzlz zAMvzvxf^3IewO3`0^ed-A`Q{a(2#`aEb$z62O6ai1IkOIG68uR6InD@R8K?C1j%gX zqcq6c6>Ek=B=hTr%NU%s8mDM&c{-3$f1An*_=K=Tfzmy8+}Ml_&uXeX!5jw*FL=7C z^M*GXU`$a`QHAB13e{4~@nvTim<{nG06Jr?D3SbW(@C6Qy)8F>fO-s=yc8~rvtNjG zAK&@8BfcVj4WYV^uBqS|rt&!n@O;tS+&k(FY1xgm*%BdsR^Vb~HNXqDBZr*+$>4uT zT-AiT|JLtRO}1r?rV9ZlYRAN)x~?D0x_hhj24}t8l{#gCHiR?98-e4>x0x)165P*Z zT((A@UgvspXYo|%qC5Fq$Tx>alorX39h9>0!9^1$5`zy z7rR%(#9&|}0aQ#`?~okYPV5$oR)(W-g%z6hY55YL>%os);%(4MZjxL7lp}#9ew=)2 z1<^TNkJP_MU3%`n)G7sp5t$N0z+=TLCczNoIbY?cYbfD{8YgLav=*MEP(mA&qR&J( zw`Qizo6Nv4rPIvT4fdb_Z$!m-qccva*mp%yFHT?|7mCT!#`3-&yXoY4Z9K9gK#P{a zd~dPWifBOJKz^Fwm!0jaMF#eymP3@gYKEXD>9GY)oPO9A$yps5S$jGAMsF&cTe3rs3t!^y8(M&04J7fQucdC@jsqZR7v z@G?1lS0j7lP!PI-Q8N5Pl%0K<{Lmlu&W7yVTz*S^OPQT#{%=6D+~=eX$UcA-e@m52 z{c^#y>6RN2Fc5?IH$MKKbOQ~>>PINaZN}^+G=V1c1-1+yuw3obvGGwMkN{$9S(K`N zYofa7bo;sIPvpPIlLi@%+j73h%U(_UJfn6$*9-L7N(3|dyz%ot5Bty&yC3G7dU|%q zAY4IiLDX=jTHqid;rv&bK$_}9y1pB2T|h|OS4EHCx!`S&@;T}{@HA_622)=$$T#)E z9?ZfJH*zQy&P{hBiWP1%t2)I7_X6gz{l$$B?hV&F`#d#fO_x>ZR>`s_9P92T!FsDz zK=A_nd3u2Jfv>+xyWRElYM9IOk*VrrW_h`HUe#v1t#VbZ)}Df}5aWB4-8$vGJK-=} z3SVpXL&uw(vv7DB zV7>(3M_DJKFIzLsra@v;N}jmsP@Aj~|e@!!~l`Adf=W;q6a zJ29MLoh>r9aE#QlS}-IcYP9@KBo!)2(B4p_3^R&Ut41-X5&+DN>|YzQq&Cr!B0%*q z@m5C+I}ClzISS%#DJ2^Nx?cO2Mq0PsdD;?AXaKz$^xLy);%C>9hWBt)66@8v)caF=DtL*58jO$6v<<;li>eCMTeZUwM|o*rn`tS%5aBS zAcXR#fh<;lR}O4|fsP9|m@N$j6qN;?;h0oe{v6g9V}cqzW9zlRcu~9^@_L``354GH z5OP)!@7VBP{q#IF_>dstcBJNaJXAn@RHWH&03FwgS>E+SS7EPyw$?PQzv1bzfvDB0 zLoqnhW?8y2;^yp*;#_OUoU%Ih?@cb1poX=^oiTluq*3Qw8yrthvhNSp19JG-I(#+A zBrTIBCRv(i-ezd5;@MeQ`%9IIxx9B^s!sGYvAv+ZDl}TdLA9Z~1qgi*o1a7deQ^`X zagNdAJ^3f=+nw!hA3u3NQ=RAXs%|d|cr(Jw%K;sMtSa8?FmY#M>=B}_&nX&EPG$zN z5x+cK48+ALl&bFeg&Bx(Sk2ygT8{0Fq<-apehLW_31ZXPmUyhoOU3<%Y<`a`39s0K zOCy5eIa3yqd`-}8x>7r1l06Jn$q4mY=57187+qemm|!UPz0;WD>Eq_h9F0|oNebiD zD0?q`zNhL7s9W@FPL17F$0f%4HgL_aACx^QnET)CWhMEg)2YxWsg0 zNInKDeh^3yy5T&4df*9TQbo^W%2;|B9gOuPIia8s!ev&nvL9}wZ8diiaIw}7A{J-U zCKi}GN&zV3%HM;mR)HI-5M;J$fk?7~?SiAFPx&wrhcR4RLodQQ?>*u-JBw9E({@9H zJhrXd^+?fVxzh71os;C#vYX+bkN2<(U~thcD0q&-qcc-=(QJw?vHkX z;Yg9V?x#KQQ@+5ni1#k1H`)8+umI|}AhhoCgy%`RAs@#7q(^CRlgz*U9~~4v5JUIM zIHe7q_Vg(M^}r|3tD0V8kV zv7JcY%2Ebd6^HJoXjBfJ^LYSw9YWOE)U>+(Q=JhI!yh+ptSG(hMwA8KRg3#$fIh(N z#7Q2tL#`#SCrK!OIhp+i^{{rszatqd_m$Vf(%**9DX>)|zTIYd{y5r zY%UA<$R9g7x1Xy2RLCJ5G8q2g<^VQ$Uyvz?*o8m#Ym+Gyb_k)ke^$-7@v^P52E~oL3Bthv#Ac440X4 z&)+rm3D2zZ!*d!Bnoyt$gV7 zEGfi!FCZ0`s=QZ0--l`@Q{#QQjbSFM8+8SnEOv|h9_fh~aN6RqwpmB1~4W&gsB^wpS_f%s*{fY<2|*iXn_bCE|-nfWC= zPl#tFA-nxTNK?j#6l#laUayNJ_Ly}BCCMW;$i|0-g>lq(*`BLC78|Lb<^A)SRde@9|_UkxB16p#7~mQxJ72~fN8F~=68<<%=CZi{!SH1L_T~)!O)+1 zbE|#|)}A3|sMfukSBwQoT7zdU8-8C}TNDGQ5tUqjv;{&;MyoBT?lt=ypaOetDk|DX zAwY2hEbdSyZKz^tNNg?BExF}z#WJ{^!pS6}m{qd?Q^K?RON;S|3OAygt*clSN!ZfD;qB)VE&66Om4NRmQ-*A z>v+KWC^RPzdD9u=PFDS`;skMHCssK_24v?|{I7>%89caQ6Lw>6dG=T?U@}>~RFgH#DWeUitAit-* zL7c|$Y0G>aQ>`s=`d3afe@&rzD#s45DZ$2GYy0={<$*d`Mh@kvxy7!+?eKh#{0b%d zgaxJ5WtfumP}!r?U33s*ig~<3wy0yZ5bPZ+Qr?XVn_cRW$_U06Q#St2Ab;V5C6y{h0RWb?U{LUQN4ijMR29sKj|w7TaV-bP!!!fs8tu znVl1u>05hW4R46LsB+RSTK=}SP7=?bmbd2Hv}<-|)bvvUtRR8XOdR||{6-d^Eecmo zolH!q^7Exkr+;J@C-gPR+S5doYV;%%Ee|(mEltj8WomDFW^_N_=o(0s^?p2$b%QV7 zuXkVj1>S)SgUb++o&=CLd(|@=etYArcW%M&NBbkM>Uw_&Qy$Fy^_W3l4Yi2` zmk@t{Y8o@+hXbC7bP~O;ypJw1A0MAuQrN2L4n>naePvedH@{<>bFZ|E3+`A;-98U% zokN95Ma>ixJGPLZ6nETBA_FcV4FiBepZoa*? zVuT?WA_DHF*mGY;#el1)bZ58f=-4!qoEzxm%^~Y;sObj9#!r_gp%Y)E@N(_$fdEFZ z`8rPBm{eff^~sIDPP6c-g&^H8Q3BYTZiA%}6=c^om_|F%2lLJrGdJD5iR-V{y5$SG zW5hZ|ZTrx~;>?M`5u*Q%#$CF-G0Q{R55E^&y#nkQJ_|Zr0s=!|)Ic!~X-5!0Zu|q- zG*1FlG>?m}bRa7L4P%%^iU-c;zL4r^#o%Rh3HvA^$Vf5}3#p@R*KIVBO(-pe)Y#ZO zuEMs}PL67^N?W+LJzF?e(#3_d$ZW=v_t6yg1=i!9ln8-p*Njt@SlBd5yo{RFh*B&u$<{^s^xxImTWWn<1{(P z1-g0No2SrGb~cisTr3^SKds!LB82A#AbOb?o1gOV4PU&iX?L8hQ1I3oaBg~DO0m#{ zRBA5Furdu?ZlQUjZF%r}qkT&uCdilER)eD%wuG++R9oFIOP#=Tn!rM{##Es3AjLz8 zGFiO#hem@)z~_X?#%;AdB`eEYp7%5{eeZzLm4Jry3%WRSQG%;bpdLbCj9SqE3pwkr zWQm6?{WDt}S~%{JBFE_*8Vcg4ke6jI%RfGrn2A_H z?Q^1Mjy2Bhh9jra(_ae1JtIB}Hdm#l0>KzfG7`?&sy>9eraxRc%GdSBgEDkm8sIW> zQfsE+U>M5yml<@F6PZUGsREk>Q-S<~Pt={%()$3%sIc*{47N&>`*iH<^YyWHa6+J> z?D*ZMzEEI9EH~!ic7e}PThSb_tbyrA8l@jDMt^2X@!Yv&rwG8J;uU_DNfOs8yzhIZ3BWa)P#M=Xot%|A5Xp>+9sAOukXVk^1 zEpy5qDbbgegsnzpMsUfE37N@Cv@8^FHR4dGuopx?@w|`Cb+EIKvE$~QGvQFxCn!pE zHAk}7^Q&Y@w{^Y_F!--oT@*5DZ>GqiLFMxZ!r5{FMACU2k0lJb1~`dMQ%KRw2xQWk z+IutD@$s`~dD3HbKs)Rmm3<4aOQj2`vBMuDSupqEeBSN|Uq^L)A~&{Co!{1dwjSOu zqepQNUyDB;ed-;+4Cer`)z;8(AORFb@$LCa46XCO*?&1E@1`GGwn%B-$eq~G`~xnR z+s^K1%ytIN&1*8c3;UAxUZYs6j6ovmT%nkTTk-=Hv`Cs)<4oXUt2J3MZ2AfsF}mbS zZq{jz``lrNxtuV*BpXR6LCM9;Jk}MjwB~R^X}!c0h#%4Hgg!f=mZixc{-GuTn|6oObyKeWVu>`s^ z8kRN9oNYKjrY>9?YL*5J0U4MqN69pHk6L{lNk**So}MOsvOarmK?AoA2ND4-GL5Yz z<}h0f$kx5A4_HIN^F;qarwuxR#i}nyo!p7 z0o_h9_2hUgEmq4x89hL%iJvemSv&!LqccHlk8GikjSGAs2y)dK(9+~OB@Z7&>*6aWs+_V&m5%}33q%{D)qcc1Qm)$hg8HI60Oy3d0?V~+zc z!~j++4@lJoFzI!mW3QfO9HHCK;+nVLUwa`ZFCh8h_eAZuSgO3c{W3}UpJ41d`-<8( zhST2Z?uvZA_Bzy2SaYwaa+n@hF14Z~@F_RJ=UY$|pM+IvY0Q+ctMRN2`g|<&-2Hye zGbls0tXC2#R`x#kPSEDu;d$XJC0eT4G%WV0qUyiGOGRNoN`=yEJ*n;1zdS0ES!fhE{F(H1|4C6FRCew0|H?agpB8Bt`- zq~%&O&(cR9A=OHQ5DTW(PPo~Hb1J*BpFF-yzEg|Cqz$X#wsoPh@T9+l4}h#ZYr`f9#)%yS z^Vu!cT#lk)(q?2oB%QA$l?A?RiMN9VKD1msjt7mCtb>S_V+Gr=ylr6e2Y&CEMw#|j zr!na?Z_&;prBanoo}Y*7BnxK?W{;c|05d^K(Q?#O)NYC+cV({?h7QIsb7mpN3n~G5 z;>6VEV#JBt*;A1b84e70&EOpwcZ8YsMni(jMnf!nzjj7i3DXbNek9?UDE5n>$iC0| z-fz&&HP$U5!QgFY$$s4-5jKD7Gg&(2` z=z`|2@KAus&FZQQ!7#8Pvu`Dc6wmMc?RuWV2y96V>%Ru-v1nFZ2A8YY4dXW{Sc_xP z4-&ep4Lx){Xh&so4MuXV^>|!(M|%RFl6<9N`NANy3kjJY_mmC~c|60U(49*e{VJcT4ppumoW1?N$*a?v) zcs-+rA$CNJI#7M2T?N8!N*5?Ato1t}&jv9Bnc)Iw>|w1f3{VC>-Lnn@5AKAg_{l@c zX5OE;G7D_UugD}NY<%9wqUh>or}}Bd)n&vq6qX z!{QC7nW6BWvZ<+CT`jCYMSelc%R40Sbtfvi_%Rcs#-o?;^Z0@W)$F%74f3`ajfzGU zanS}ldT>&PC<7Z$9p>KAC5;h#zT0WaSqMBE+nNI$v@;WcRY3{T>CeK zSwH1Z+lFx_Ji*k$jlG4Q8)F;(S(CNpd&1wpoxO~oeoA0#Jb#1r%E>-JK6K&V=~I?J>PEP$CGF2ge;p z&-1Uk4{Lu@Q;*f7oy%Kzfk6WkwseeYiIxWvSRcAyIN`Xr~51ydJ_NrNI#0GIy$ zwGogad+~A>dDCYWF452W8j8hK(diXyT5EZ?~>t9?n-_cKCO_U8OC@+4f?yU@zE3S~=8I z9y4o6X!5?f#%ukX+~V$jBxKlK=$gKD9|XG##xMT-kYgbJgbU#am2X(=-K{Z!UgV=y z1G7H{%Yo+49@mLn_Qg5Z-`MFNbx~scR+x;xEi~<#as0o7(*8t6qPMeecrW5hrXntO zKlVw{P=F8u6#!F$D53!Jr~DK(v(jKAT&^ZR1N9W7W=@=f;!c7kbxjqiKBgVwu2xJl zNm&{lsPrr>jYiSnN;d9Pti2$HGUkY~pXM||1}dxlZtN&rGlZeS-SS5=E=M(=$qFmC zb`)5H6m!6EP9)}!q!St=f#c3j=<2WbgVN1SXDDZkR!i=Fizy^!k@@DB2;D`PuWhPF zg2|(Ap;3j5ekfgPLmFl>jMaI5R^NSKaZRC>CE2_YS{->vXG_l@)9Xu)vA*9c`oSkv zDt!%-%>si>it?$Ai_QTWI?Cd3gDf%)vo^Odf?J(?{0?xX)Ay|>em4CDK|$j76uJ0KxK#`YcqXbnTJ+R_fDU; z9w*DXP^w-WHDRgHZvO8)ZgZgmw3VGy6K4SSC}N_DBzlqB&Ezh<-pc%L$>nL0dwctZ%hUqekRP1(?M;{){$k2bb#C0x}hWByhu;d-k#V_~y> zw`fIq>q&ZNk8(wyDlV<5&JI?nm&jqxZ$98jBCX?V3#CE@FLT@JU49FkqEQ{Ghp01> zv|q;hIy}>IiV>}(K~rWhylhw2Cn|FNEGN?9?JA@qBpoAsocE;=!5?Aqv)x4>2XLG(2H3x4o20nhb!sDAZSD<}l($f9<9OkHzdo5w1)f;Uo5n>;V z*vex}4R=sBL?N0p>N0Z$1yw2OKvz;m3GOdq39R5-|4SoSIWRBI3`})ZcJvr(&X=XH zJ6B#KTFFgk5uRSv^?VxqyPOT@EgYyiU;6}Q=#V{xW_FiAv5N>Q;?9tAQeUI*88Ve(ASb(8W_Gt^3x@Z%UB7t~9aO^UJVNt>6 z?!1D7i9(}d$xpw{x%CyMJL|v(3@Z+#0)}c7LHeMa1gDfz4q!q9&&AC>M!2dnoj7?2 z8(rPmO+Pl!B!_HvSaR`ScE}3%wsAdhlcw3m#GRj8^G<>X!geckI@>CRynA^PeYe_( z(FU2Db=%{rgwrJMGs%ro5lU-N0wf-yZO4zjgFO(H(>FRY&91+Kr1M1M(1X#}*Vij_ zyR#@{l9+fn#|)wcMq~R!sIjH7WGJ|Kqycxv-X6JdsI!m}Fc1Pn?1XLh{5!=e<-l%m zbl<+Eib3o2^jNRuw*m^XbA~lj?S-9=%NTtI7hf;mg-`e65ZNRPyS?(K-c?9q*Wc(7 z{|y$Mje6>3dv0tXyHP~#mrn|`-o*Vhh0;)auOxCz_?p)|F*zWG=C0+viBL7Pw^maa z571_&#Ka*IXG@kbR}^zwU=%f=oOJ^JP+y(w2MMDdM2nX?P<0x9m-aRDT!7jl)kX^( zD2a}{(4FW~Qd+C=4z2RUV+;qwTOOS4_c0BjK&^c%I5H~@V?$<%3NuJuN}9tT(D!rx zkxC1@QwMpdLM`Y*G6tA$&ONS~nv8S?tp0$T>rpgM!h)u9aU*}wHNTi~x_)uvDBC|BWF${S^6zHN=gxmoxB(kgT)N$i z&A5@Fi95IXLg|O7w`6_1v-<|jVP`? zMhVGmsv7sG&o+|0g&KFO=LbP6$7=_nFmnD&qbk63(?aiX3N!Y6PLH||qPxf?T{$q< zGjKoWPlETmq9mYsyB@n}jm>r&Qvr(d)kPG$yT6dA85xFoGeG>$P1m_J)k$g6s(2U9 z^mocm0;Dg~?mCG&2;xF76oM8tteI(r45)%dN&)*hVP%s!W%(s54GT}h=%J#2$>X1W z2XJ22n1venMs#6WKeg2`0wx`Tbj)}M&xfP@1bdpMiqm4y4IA`X2-{kW+MpFph~D8L zeOztnv?)1qqfDm`RrWp!u1JL>B8 zBRFHAX*=QBpvdC$Oqs7~}lfmuef}BywBiGGVB?Y2sY~4Z%1>8AI@x2q_8d_%>ovn<5-2BkD z?>c448L+@i*T7>Z0fZsOtXFZiZC$H!e$;?Qs~ov>dkW{C zzIM{iG+@FB_4yiePmt|$ZQ9XOd$SR&3mE9)#3fFeQm&33hh8ev&?x+g^Crl`vBd}p z-C?@=hi*%&aQHK7fB&e?gs`2dcRrrEbWKcJl|hkcR@$9lQ-=X*7MvomZ_N~ zDkfNP=?8H2ktGgSCelofPp9DZhI%273E^VrGL5cKc6&ZV1`3Ucw#qkd*Sfc)`&AKa zx*bq^;{q15Ku}v*uOyUKLF|arEA7(aM631p1(t%Ed17Qj?X07Ph%qhBK6wl6MokKa zY?7+~W9b~@D*gVipKB&e)@0Y@PPRSSn(Uf5ak6dKP(?}nV(BH+(b)1pYc&0l zstg`@i!Hja#?x`cE&|+N7`>CH_PD{jj@&4xD}&d2;G>fhp!r4@pMs@CJD^0)OO+cL z0KtSv6e+SS7Wvtxjn1ZfJ*1IyB@ee0@&_t;2`jEcT`*Kx0I@%3XGS{%@<>RxH@B5* zd^fiu-MbkyrRN zSJ%6hHf4?E?}TrX#B5O*l|t?NeXG_|Lg5x101g?p#-H>z zHoqb@AazVKJYKFjKc0C<=Q1#-zmu6;`t=1Nv7tWy-OpTiWXzGa>5$VSNV-@k*KU-= z3Hekb#Dt%dKt-)jsYe`WC}jIN?&LfDRo{~zHG{j1jD1B2k<~s7sHof8*O0U&#acQ% zX&x~wSwejxbi!vH%EUpFiL953Y(a9xV6$B#)GRtUr_ag4 zAJP^%1o&FDOZ%8-bJ`k!E6H~<339~o;gT&61+P)2Qv{V~GbBEf# zHaK~cA@sLoGlej2oJvVbs!t#oA{ql6lk~>*DKxm7;V70WY~~6;b_whWOB@5Ndh?qS z=NvOArk88(>@s0&op1)l;uzs@5RjllvC?dk6UfPdiZhu}PlhfD2$r^D+9$ENfNGme zlT;c#)6v*o z+$s&3X$tU-3ck+>I=tPVaeW5_p~;->Px3}BM8o{N*$94|pGjG}yd(bE{8vq;5K|72 zyyMPRLFU%%GpaDIRr>iEk`|C~J(57LoNuPH%UXc+#-k-Va3$!o7cym_v1XOn29?I} z0@HvX8c7pgbUfdj&2o+6c?Fq-rI`>C!J&yxZ(g8U@jr45pqW3dvqYGVjxxo^9Y~sD z=}g6z2(J_gpAe{y`Hw^epfzz316d}R%l<&leNr`+v1e#CRjf&-az-L`d<%6JZZ(FW zi^e`o&IwSP*nl;d0;5x+pc!vs#xpp&G)9UYZ(@l}+k?sfUelCv7b6n!CR_6I7ysR( ziCaK1+A6noaWP~r#1x^3bZZggbBJ|2Pt;G8Dkl8w)L0khmfO(no;}PJ_mke_kLdFG zmlO(kw43Aj`T4peVR6W*ut8M62;3G4_@%xnDCzj$t%?4@Cv0k#)ppXH533zPyiJw+ zcRI;+<(+*ooety=tF_r*Iq0|2$G*Dl%XKB1D^|>19*i@yyT&)C(Kgy^DRgL3Bn$)b zb#I0AbHU)B3V_3tmE$BnS9+CR)BzU_p5~5@FkI)Yu;DV&ORU_v+p=Z0(UxKc_MBj( z;t!p9eR2y6e@=&`HUe8f@^Jr+!(K(kqcY_tlTkZre|Vy)a%J=C!>keq(~03)yxp<> z-wKh045M@?aDBDBo&_Oo=yoV`WP`Uk*#x)4HU*%KH}vobr-{_$;S4A^c%KnR!`y%+t3>af?AHKv-m|B1`0OgUSBz&@|Qq{u5w74v7iFz4; z$J*us9&e=HA6{OWBnbbGOUqEZa(rHQ+TQP~BxR&0|6WHobz*6xU6%|Jq4?k5S`yIQ= z(B+9l+}MYlNqICxTK=YWV!vElF~-MX*Uez)@@MWe{XQC8{8u10cZV^E6y|5~^{!J} zbN?pbAXH>|;0yWtCR@yQ!3^&7tk76l9)J{UMyu!rfm$hn<0%3p#bv?x#JbUk++fsm zZG4t#3%{@|k9ZfsXHjz-?so&*Tm&&76Xb{Z6EWJ8M&vHN{Km5Nk6iXzvv>K0~Y2A+WkrHCar%$M@!ZQ0qs59MCUMCL(txp${Uo< z?{}&Nzr={UQRTAbDr_(jxW!rUqj9yMIB_p!!--t*_uyRl*K@<_x~|gh@AFJ2-Hr5S z){Jw(gNo+K7XnV9Io>aKx~&e-05@f=J)q6_#gWKo+aY_cHD`F(L8hN9O(d?jxcG6n zwbBrLt>5w5=YXF8kP))NKAgI&dzZHP#KR5${Ng}@cJ%fbWL$}mq7I51)7l1HnS7<> zrx>)zMftzrq`GduQ9LLfLY*7UZ*@?AQ5h;)tgZbrfqWNDl}TxhA@U<_IeZ+o1+{Jc z=kPw_>0)z0)X4%Q@P#=#IwnVpWH&qFt*{;)4N>v>Bv-OK&`(E;57f|_sDzzsDO&z3 z$3HZB38vI-u=1@EbVV(6zG@~8B*0DEA6uv(Rc29AzHy?hSic=IQ{KICfA;WPYO@5w zERFf@b`yX+`pn8oI{@59n*s)O+`z(Hzbc3FOO34#ukY>+FzhTy1Z-**>b)*{cFlWt zZrR|bi`Eq0^M46T&8+%$<7Z79<0hhE{0f5DpSn+koS_YL{!jW-AII&$gG~&57a?R} z=ve9>X&X$c8u8ni52*C8gn2 z`s%0~g1Ildn9=mWXit!1%qwXHn@s5oOiqyQW3ay-nKZbDWZTLd3jF3)!}>f%=RNj@ zX8OzTXvG@IX`k_DFR-NjG<9aYXb&95JuAu?Gc&jl($MqFu|)9G9prEf&oO5Q?r!24 zsSwDw`?*=$Abfv!d;aqs{=QvVWBXSgEk+;$6|UBvzh{)>6q9VBkbTXG{JHfMNm*QO zltXjgVEfnab9vo{+8nEy;^|93&u0np&f}7xfKZSU=GePDx)1;#=Q6JQoba5txKg(3 z!KRaePbyo}xBT?+ND_`U>%&3DR-^y7VV@3 z6Q?H(!B@Q?7ek{;94!I~Gv0<787J)v6172+zvQR%n)7X|`ALaxuzN(GnUTUyLY#MJ zR%=|?F`U>52Kkt_CK;1Zf9Rl#%E%Ow6;EUqoqO!cWCa?Iz8jlAjz{mjP6-Nj<$Efy zaOmyLilu4NqU5A?yFg1&eM|gG6m#}mVy09uvj@i+zh7vb-Qg2j-49mUUKL;+g*-@RqArYIYaNe?2-q-E7@>Ba)0EDpaIV zq`_oH3IH7Ez#(LgbWL>E(7;KPgPXWPNa)iUbN~blq&ul{PaMQAFHDmOQJSs4*&3{p z7Js>K@NUp`H2qSJCR)dW;`Bd+@2Cx((tjhdt!ek@c7l1e2XaUz7avhnZf*VdBY(@% zg`{&yf!Ib|E*?KUBVx-dcp7&wmzCD5<~Qu|d+I6#HVcRqiNfcJF;p!3E8XPB+gIzyT1NAqygMZ;Ocq|G2`!SHwa>b z=z%KJh%qpUh@=gz(HcOrJ}~q!Q_ZtjU7z9ekbMHU*hlC21C>?NiPrj&qRgaFB~z6F zxGZ2u6u8S;%Sl#K*ZEJPhP@D5?)^>Lz=K%ywR3)!hyu1XZIs*;ATCZE1EV*hVSim zCh?o;dCS}P0V-;my;=fp{(i~#tya()D(rtiSXd>3nV-<~GbEgM&>t)G51;qPdFL&3_6W@r+sN6b5w4BbzqC3oy?aTTA3wZ z)hNL|1G&=~z?2ghy8{`$Mm0m;4{L*4 zHfWnVJJ-M6(1be>Wav_jb-o?qFiT|bemocEx$LNa?KyJyFn8T~-Jh?412%kOrxGNe9ywjv&WjI;^}|QLP_d>5 zF4?p~xA|Ldf!)h?G@+q;=Y=M#sCCxax6_P=vRy)_l?iu^DAA+pbbsgvbJ?n_9F!d8 z|G*7hZ}8Yce@3Lh|HKvUCAEhZWcc;~yrKdTpP|n#4GR;*zZ^Wm8vKZxp(DebIDqyZ z?UHpRS?j{%ud>)-X=~`8GBFNDNezO2|K=&~XQ6*Zv!^c)+aw zD>4+V^P8_}8ds4p?$N(z$@}P^ZYJqpIxi&VkzAB5pQS{%L(l*aLUQeFI-}nO28@7g zGE$wxjs%D8dZb47ZpOo!q=o_xJPP5?6?A^VjkvS2WhkbglYbBv{~laglzhzV~aDmY<1!56gs5*}>v$ z!+VGQ$M5+n14&GAH{qeuT*i46m#ZYn2bB??L`O^I#`}d%rxmNBZ^*#9S&~s+QXq<0 z?39adBmw^W&92|f>O&u?oG7b~rLwgLzSlQ#+~Cw;liq70o?1L3ao*o;?B^pl%+z!> z%8_K^&FX`{^dLMuJOC2#5fDHKHtG#V27J~~8#iv3x$sNP#_-nj<;E5ku_C!bj4Ao5 zbPmtAmIaAG`2Yw$ff5%+z!0~_=!hf$Hsa&8r1)_}(8u5BF87P#;c<6G(y&&z^M&L4 zo`LHS7p^VKl=$Ylc=`XL1`7QS1TAooDt$6&;W#Y!<)zNJt+Zi6h)9~w%^L0XBMvwX zQtxF8@c$^zNdDn2GsW-UaxWQ>MJeU_mG`el8NyQNkZg@r-2nm&tlPS0LL}XvCvl@K zV;$%{WYS#4A0oKfg2*B{}D?!dHF%$w{&(6r?U(GMc0sF#OpzZJ(1Cw8es%FZyx*uhE%}Uaay<+J)#G6}uY> zK8{B9FWL?J!!svf@3{Io&$GdG#e#u;LMJgp%3QU8KS37!#{<8O?osWpJju3{{jg36 zY$a_loS+qH0`5spYXx(LZmnkg%?87sm%kA!73wUzwI1PIzjc(B7+nnRVxAz=^?m~N z#IM)BA5vnKDU0K5o<_utw73NN(Z(|Al@Z1nw!X76gY+gUUhjVVZ3lN>QI!>KVQhaS z)XHyb8Y288C_59sa3=y-ZptNnksQ=U7O67TQjztcq0<4jougv1lirLnH1%e zK+NBa^A=eVp$w+AyLxFT4H8-18X%#YExtvO^9DlMVYSZJWQ0c5VosP`i@M(+xGKXZOZ_F+%6J*vU>;R@AM*yA zkkBGm>`K~qCt~vy^xLarBdV*uAt)o9bVZ)PLyEQrDc~v%e`CW5Fh_VNMth~Z$hKOx zY>BJcGQsqSAOJGt9>ut^MI7gIi<2~*YP8A|$Hz-U*VEN86$SqO(NX#!qih}f_8{xZ z<(|6*{r{*T8&7?|08NF?=ZXUi5smXsY>%tL^<$GJ(bi5)nqMf#3Cm7=C}{npfEvO& zDroli+#VYVCYjo_av)B7)}Lki+So8AM<*0^7Z^X0TdMV~+^UUljF{#N*83b`*;xTG;+J z&-`7687Z@JSEy8A8`lG4%&&`c!M5LhKy^z%iC3soCxA(A_`S}{HhL`Ns-2IR+uPsV zvOTd|{|2%8*DT>{RN;5YiiA2^X4s5KP`v?3Jd`@(8UVcRbhSAF7&@&wf*Ei{nA@CT zS1LQgJEG~yCGQ+Zmjsa?UywO6o$ivw)feoo8uK_ z|MBpuEwzX-oRIH{hD~U?Po-aAE}#e} z1Jdh&@fM*oKpqE@uL2Dh=V<`KF@V}CG6WW`AqVgUDjdS7sDmuPP)w#!q;AP3V9TR@ zd~=f|gVPp(jzv~&coM^ZAp&#(oo`QLWSES|r$^NiL=3ncd;9|Aa8W!gNN?FfTsbiwP62ed(!?1QZq zM&yP3*`=`o`3(0pU_j+%m5DJJqnyDbN|!Z-@=aN}^0?wR802glfSD>$D|iciwVFx2 zC?2%z!?Tcq3C1S*9BPfBh$q~vruQ{=AG5&e+pxc9yYJb2kvAE<7sNFzjL-QY{ZH7`gnu2f)O& zDoE=xls@Cis?|1gG!)BT_Ufhkg7=u7mf(6G{XJ_Zhg@urlmLFUIepM~9 zg*Mw`la%V4i-79|(dTBQoTvGj*W0rbya^`54ZlyMC*(E$oD@x4t)J9Gwf=`aZRmDF zcopoD^i{0v=uMPuvTll+cWnouLiHFcOgG)3064OI2Z5VMY?4?JNfK&U|5|%*qa&=2 z&>z7X7^(V~=!gME@etw5Tx1y#VL?3n=%;&{Ag`R7C7y)}ygt@39GEGG@}D*lz4kemh4Z|nInoa zl-Iwz?;+(eKcd@A1b&aW`TBR*8-LTaDqUeAFyceE*S{-hX(!aLEM7F~08$Z**B^_( z8zF@i+iw_{Ale6+=M&+2U#*PrEoju0jExXTJXo|m<6Hxx4m8mCt=Y*f4{lxJ>8sOp z6|1S}3rzF(zmr`Dgo&@gLeyh|-eP~P)@N^>lL02xy1mbLi`&n(3(TCny$?i>0$=B= ziu3cK0TltDL*^GBNW+l+H_LF^uvtn~8KLN?vB&}pNt>WJh z#q|?>rAWuzhmJQbQhkbZ5n>wgDtrh_n zOE(bECDc4`;%*Q&E&?|Q`joHk9X9`++O&~?&&`)1gA=G{R(MQkVdR+#*mAbdI4jK; zrdWX43Z|1~$H(cXHj?dQHE+P13UDw1X90T|yxZ|6o4zQ zZ_u`dz6JiTLVYLrq^h{HDFnXb!`t;@2|5-NYZ;L9em5q-$2W4dix$a^7{^?7>xDai zTYu|wzTT{ZcR$Wu^SX{}Uv-^xBq9_YQq}&OhQacacN6*xz5n5VYvpmciB6c;FC-xK zHM1d8P6YfqL;~i-#&X^#kh&xj=c+SX%|bzYYYrDSLczSf2i9yKBttPh(xJ>dmyr0D zwIs?|xCNfF z%>P5{AAU2n1cI+b{G55@F$Ygq8WOxG1bVNGC22LRZB`niDs-A^9d-r^G?{HqcD1ij z{%0Tr2p|f83|fSA2eto3JerA6qEoXqG6j*X2^7LQ#UZO|OF(CwuEs7Wb`ajkpY>UX zl<8^-1sbv9ej7FJe6kx;m@w{aZcAVrHd9m^){>zl2$k6zQ!Pu%-@m1P)^h7t=OnU4 zP&qF4)hr~kqr7={-8|24?u!R3>Y6PC)w{^(b5}5tiO5CbmKY9!Ds(oT(pD znl~+GbJ~g{Pv*Q+rV*+rUN~xm;=3LPluXCEKY^4m03kgCWWQ|Na#ouDEfeyg4G^kv z*nyia!8CX~Ubytm+1fHJNPO%N>$b_#D@7RC`4+H^;9E^t3NsWSXAOs9N=$;qU^mg-uQ&(j){z4goI%I^1VrR`rX zlcMQ@>B|PJY_~fAAy&XrWtxN&f-oZily{!-M&nTMUT{oEX=SZI`-`6qeq7}G%3+hYWJ6MDBWoLo z3Ti_bWL>Op%elA^$nDi7h~OU_aGMy*xE&X{<~780T5u_2DcF2z{T}NmX9JdUg;yaU zNHc0VzTQ8XpS<-)jDCB@y?xYSOaUmvQy+qyA(oneK2~SPmt_@ARBPCI?eZ81m z=kt`D+;4{i5ZFXqD=>Si1Jn8OAb&xsbQ%Bus>$CRIa?6s6&7_Ei}S1F)0qFjt^YPU ztSbsTa7faORtPVs%m*F~GutQ)G344!i;H4JOp&JAm7#%HhzG%;@t~f-uDRhbLfK`A zJ+CBN5rof6n1h4hQ$C&n0H^RHqjv01gEl5D0l1(l(exrr8sKl*QSIZG6P)htm#LE@ z1+29`Ty6$@VRd|E#^N;bVGo(%?u%)^;h+awT3>0;Z8GfV^&bKVD6f4#Z?9)h055Km z7amQy#6jwFJqE5ic7+Tr(TYHB_FX^`^RP8Q8iZ_4FN1~RCO)B8=`}s zir(Q#rf@S>>LPpzI?yr0;hqUNg&|^oD|`DJG#mK{Yg98KklA<9?1*36&QsaePg3^S z%w)7SxFdwaY1YaV?H(gKbZ2EYU1lwR2kZK$AXksWU$N%pkt<|kbUIE}Wr$mDBKhdz z!u+kpg@D^5@xn*YFrSy#5|nY^0%7G|#T)FG7z^Hen%3wD2FU^0V7!2%nh9baq-gU@ z8WjwFrld?pMxNxZ&Qt@#DW#SlvAFH00nW<($4OqhEn7~z%`{PRpv-cRV}rbBvPgeh zhMQsFOy!zX{(|%-xBG$?M0&QY1O%;kLeZH!)0!8Fg84S%`N4&li;WaHE=Z zy~?25@g-h#b~aTgIRyY$gKL#NU2RBkIZ;0u)a@^zuj3zYm}b;Ka-O_}CR%p#j}{3o zB6ge`5#XpgEIvOLPq##n6LoxRp~SpF0Z7KI94gdVwFn~p@!3${o@EFKvkY%WIs!4# zaL#pxb2=^(0OL3(K5o&hoJaW%IG?7c(H7V)Iy)x<dV7A`p%`EPv8iryx&;->JkzsUH8nvf-j zb#Q-HbfW&l`dQiPrMbs&H6j!TQa4D*tVPLq!ar+j9ef4#ab2hX=?8m5f!_#C zo;e}eLhBzQA^m5TRFu;HE+db5tM>cC>d-OT3WMLmCqseUoHL5V3qqQD1tqQohe0E! zS0-f}+%aWAdGkmX9;6LLgV`7ft1o?|HnP{xV_;N~X*p0ikQ~tulJB^_s{(#aJbZjW zOQyQxM=;xE=5?Qg$K~Nj*w(S z;FsDA$$Lcu_}X{0-j8G-u1YS>jS2{MxGeo?M5y$xp5Cr}6uTNUtDUCfk^4hcQIzmS z%vzn5tX+`yzYFD;&%n+QdO$8cw?{zCRE%MQLBm`e$+T&iWml(HpNLjG!~dfW0W62u zcJt#*ZkNn8b1NGyb~#Cb{x~)^Os6B)k0@ht9@E^!O&tY7(j842BcdfI|6t;3cX#5Y zMDZEKPd&Iyq5s@>Smzl}s1Tr{qsGz1(cl#nZW_PNJ1n?Z|9pd>)qiwPR-Tr__HEXU zwkixa)dH>h+APcPWfB4pL54g%xCan7{IOlJ}LH z9~$@dA)y?a7pl@J*>l7?L{=-?tW}41z7_kBjUpMXz}Yf%3gJLKRH6mS=a%l!btCio zdH?UO{;2jpSn*?mNIu<&T)k8e<9*0flF`KT&;PPjzBeNzwa<_-wsn!q9E@9_rwNI2^r$eoYT zwl=!+bwb|x*}Yz3GF!OXGw&M$4uZ&>6lbYn&O3V|Qz;&u`hjdRWMPU2BcRy7lagau zVrt_g%CKS!GK5Hw+IDd;BB3}ZC?tXBJHg1!`hY*Yx)y;tB3wkwk&&(@3?n&N?e7&o zg5jZf5lAuDECO~Ly)vK!TSj|xUa^iE?JWcKZv-EX?Lsj?++=}&`W+a~=r}viN*Q-# zwbIkz>r2Y+JB_bOs8#iW(!-2q7VP$nu6!pb}g_7@)RNv2abr<9UQ=ZIa{eDjkSE= zu6u|>H2<4yK7=FtuZAR)0(qeqb=jlJ#b%=ad7E$TjgkvaZ}!nGEqQd9D{sy_&h-|E zCAXkO@lRObP2QXNdoAUejrv{L=Z`A7O#P*j&v{*`qAhh|qGhZs?_#o_A%d6S?xI-G zRl*<_h;T}4#0j{_1)eIhc|!lAj)_3r~-T<w&G7I9Ekf*}rHr}EJh?pNpOg~=MG3m%(rGK+y?!gNMU&W<_(TvA;UvHWu}bI?7^>?hxkITD|C1vx&+A2P&>3lU#tx+3|^!caGgejH{G(IOKCV6Eb~bT z&4pF4Z0{^v@XMym8_KrJYaa%pzTy%R?#*c!=XXpV)2Y!xO2@{hCl@en(92F7>)OD*hb z;w!>3c%0oYhwV+p>h6quYmG1Y91~QNY)-(BgxDiZc{3xw*C42Y^Bwz##LP;nk2Qj_D?qq-Hh`?cQL zqP!0T+a@z8e!0T-Uvv(aPiUrfYIC{i8ok5Zq|DnqQS!OF2rWU_6~SQ`o7hPpX!+); zNJ6+KU-c$cEdr0d7=iUj1jlQbo=Do^NiXM#gXo1*5;CRY^PRRdYv?Uc3s>yC202sK z)ZpRpaUMIZ_2@~Muh>mLUq*n-(AG>#hatVPrlmFRssyPx9Ins{ZY`TicWrdB4}_Ru z{m5z19Pl1z`F`A-)mGP;GhPHrS9GEdFmbiLC5wG6iqGvp zp8n#<5L`4zZykwB`=zd$McT!d5CDJMBS3*jC!K8@l^whn1{Fqbv+~nW`1W8D{)$p$ zOpem*4#uXb#1g9~$LB7VTaPEfEK5-+A4*M#yNRRE$tRA$79pa{1ff@59Pd@Md-L6m z3lFfuPKOOGg#{-W7=rs)k>IFV+Zu{fI9+p0EXW4;lg_+8+Vk7$s#16tm`r(6s4w|M zlKqe<^idUE6Bjyj%NCy_qDs=jC4tRuWhKgj!%y9mSWEvOjVXoA&1t%foGX!B#`X*I z^AfCSCKeW`}+jh(X>pP=vXj#P0$ zd3ia_G{b~@=JhnnR}HnWHtnO}wvo=(bi<=EiOS)fA7W_35_{BM^LSU0hyg-IyaEg^ z(nM{hc*B~Bj&|`M?{n0{`!}Ehj6=1G$J~M*ua07W8nctky0cI>Vc+0Q1A*U&WvwT} zSf_Qmuz|jsi)2P=rvltP&K-T=6@}~ljs%cu|2GY%HzS+MK|^tiqH7!`b5gcH6d1!2 zV)aFisZMbROQw1k_OxoTp=Rijgkrc#lxMj7d1R$!E8R`sCX~GDCs;&=l(D(zBIeuh zkCK=^vJapXd&zLuL)2#~3P>JtxCt_&+ym`=RY(Lq;=Q~`4VsNvV%BQ>O=f#$*$D)@ zZlIj?$gx?udANkt_~hj2Mr!<|QII1YJeK$OE(H5i^%dk@7&<>NnriauvgOvd8nUQ0 zCw1k$c_cPv9ZfSr0TBw1@J~a3Ss7^xbW)<2n=yOuh-$3;dxoa#Hyi^BteBfg(Jz37 zl?lICck2c%J$T0>(I)2S5Qz!C6qLXFwN)P3Nmw9*&0zl>-BHdJE-+yWc)4d~{u!>K zf>K2^mQY$ztVtI)f%7+9l9_4nx4~2`CF7M-&Yv^^UdnGZTrDMw=8D%{CHf7?+MmS6 zp!STEMn-Y(7)%(AN`8hbHcu7j}|RmJO}F&HSXES$Fm@0QcB7N zQ$8IdEgk;;+TOTshxf;iN4^OBok+9m`Z=|@NIEU4Tnpou_fro-WITl2Edvup_iRae zZ1ND)k&*vZf&nIn%}+((G1%GJ zF(*V=SzexW$(o8o>v($DC^BDSJ?}XA9^Oy3C6(&)aq;0B+@jray~o7D2O7=0=OKD) zGC0_4y2mJq-tv&4187v92K$mOfv!+^t8kgw0qk~dcFdC>6#Ckxg<<6N2XWnwXy4tR zpQ~`C6q07ftz2VE%TG)`1;-8SF4G zy15&-GnmVq`x;t?Lu0@1L_RptVz5nyw8l=Lf|X;eG#5>vgJq9A6P-vgs9f1G1$mH?%5+J9<}iAkar#c41Ui~{d7`8P<8?8h>E}&p zA;IC-UME6ly_d)23I(zp4$k`i@G@1fm`Y*1QznUE9-Ws&L5~c)%qSyc{A5X*RPmqr zX{m-UBu!y5 zrJmDsvsYf!V&ciw5o2m~xcmfPgl9cq0g|zmXAoJKg00(ZZfWtDZ?v1A(VhX)-)Sk6 zP0>(7XfZ!Oc2p5?(m^t^k$3>%Ofw+J#o8xzK(sX$!PGwL4~uAFZEO1W-0(Uf_~MjY zrR{fO&6Pd4;_1nKyQS0?8&+B7P|41?uzP6uWuj6zl-JiD$`#gW^+%pP#Gwy*nKEUO z4j<$-3KE!&<2BXK(4QANdjbwiWX2(;UH?O&fFaML$Go`yXU(s(Wi@hQ-1Dg#W{ z8q8fLD74c*b17siKJSaQPjhBWg~RIoOoF)6miDKE{MM1L%WZULaVKl|`p@wrRCSDl z@pr+eKRQEO(4pzDbXR9G6>EGI?uzfAp)${BfS+Az}3T5{OzSr(0ujWAF1UoIHPA zerP9-C{B|&a+v;^QE6F4FG`d)EO?F!LuB)x%(sd#-;{@FR%SlAUp+;oCD3S(!0$|9 z;)`l-c}-55l~+NbG!Lt(z40*Rk`)~6vF`q$heF6bQuTVxAe+KH|n3o^BG4SOdLOp7krMh6NQ14%MN^{Nu)x}r9&8;C?FbX zUZ1XY)TF1OPW|lr{+Cl)eIQH;?;yQsU~kfd2$g^^^~Z_d@AcIg@bNiZOL{47qHRx+ zQk)|~IAsipq95%tw~#is9p)!3Qr!h|wIs55!sKBHNC*gNF=5p-sZICw@?HtDIFgL9 zyp!is+&bF~DGL7`E+Fs}*fEs5^5jfR+<)<%)|r6$x9U72@9ffe&1vvPx6uiN=wFAy6 z-DY!-Ktw0ZlPHv~_nU?sT8T2!Y;%S*DoHuQxf_$F(tMRp0Ku~8kAbP<6xDQ?EbDyA zH_4hygKkF3KqIl82J_;YvDzY76L4gM+R%(}FSZY|PM+OJoY&pVoNli|!xZLgpN^^PT*Uqv>^VABy8tOmPQq5oU zsuF`ZjfRHxnUTb5)d)?h1~|3r{xIubRYhldf0;mB!Q2I-RDPix1PmGP6U40Fk6h=SekS&3t``+7;=cQ_4p9(?X3Y2;%ZFD;nBp2;cGt6|3Ih!LnSAw)cdQVVEFgj@RC;E4RKF|zWHEldavrd?rVI^&Yi@eXfnnJp(;204oq1)s=~n zG-pPcN+0sZrC&VX554KcCqV2ESf zrjjg^g6o-ajSv|`L4T^quU%T$!_$j=^xW@CE8qNc6ygwXU}>0?I+`3&g)WU@3PO!= zgq!SgLX6%3($lIHGN;3xwDYZy0aUOfw;yqkL}D(Rh=m%_HGD;H?AworB)dXgzv_IsWdZT@ zrw}(stPyue+Uh}L))jcoHF`hXVbR>-p*!B2$NuiV8-I*Z$1n z9_y1Aq_3%L%JkHFH`@fC=q9|gtLyg5yEuRT1nha8&@$^34Ccssc|z20*r;HqiKX-+ z4;;QhQyV()hud#K6$;?ZXllg2&F1PBTPIB~hcX;n3EI~FKBsUB4;!7Xp{x>eB!)4~ zAmWNC$Oh3bJ;@MS0OT8gO?J!-D{RhgX-Knhr%h^dUIY!{5Zawv7Ur`=?Rc0kk!u$T zFDfgCdo5KwYHJK&se;DwvoA1e%eCO#2X24|8-L@07CQo>j%cbz6G?9YkC?c)q{MQ5 z-EQD~{NZh>19Ic$ul?TxgZG8bgFV}jBhA`i*eKe2pGzuZ6)j*7Irs*M%KL6X7)$7S zV{`NdlS2>LZeJ8+oH0TR(1xk>qKO>+?!qZIvFx~z(J`NaQ`TG4@t$=$nKgozy+3AgPF<_TA{G(Pak3k zGL5piyRl5%UV9zvUcbStLe-AK(58c=*b#M}2aFyb$v|7-)E!u4jX6SOD9bVc?8nCz z9+b0?RA}7WF1OIoYY=jpjR_~-H(@z!mwjz{Qv!b&s!+%BgsJ-La`gV{e1KW93HH2b z4gvi4v14ZDy#YYnIbWD&Fzj$Wma|JmV3N^g>Stn z{!P4#?je!v9|0^$)asVHWS^%!g{!3(`-9}Yv($T-5R}tiP~f%Pe1$bRWcq<>`@PDk zw)fEJ#L&_^Dq5MaYC|3+J_$nXOndBCrE@}c-L=+j7_!WFweT9$e~z7Z5%v}8?6OU-X^-ePq8qMOOub92EGfy=qzAe> zsp1*Hi%3sIog`zdMOC92sYx%P#`>KqVTUQ(J7!rmF@XB}OopG1U3*&V0@Hrg$G&yB zc3pB|1Wp3jY#7THf5zc_wJnmrJwFmTGC%F_?69Ip0tU6$=Jy{^ZWnN&9gu%MYWxo* zg}tyY8!A_vE4&l_fLtIib&pI?s4rtW!U_1h!v}w7xq%|}#?@-4DmgWua7B~_MkF&| z>af5iS_tJwBkJ^?_*&zn#qg>D>b3eVzrQMBrEYnK%V*`QWM7EOsLuRow7@`4hNyg%)}>%J{XP?onr>vtPMG#J z%`~$_>(8oOELO^=lIK9iyRN=FqI{?GG%RuK;y7}6v@j|$dGmhLoy-H?8$EBF+zdJ^ z-pg2(x6&HsOx0+@=_(k>&?RQhI|uaK5CjPnGOHG}T$t%!`;?;pNP3y%OdLLk1!^Lb z{ft!}jV7g~RC!{Z3q#ORcfM>DbcA;)p%Gu{zw;W2RzQUT#Cp*L{D3ko?Jk@DAstDN z8o>+bXpr%czVBL8Rc$+Eq+FeGKHMa|s0Z90X|2i&@DAtpN@}%wum|-lu_Epn5TT-k zg!S(%7D6fT-FV-htqm4Mef@WE&O7DeG~aQeOSO8(=d5S`_I!tV?f(1n^`^eDae8u6 zs75pMp*=GSjuTm=$Ouk0`j`6Cn~Z@zYPEy(w>5@_K2iJ~748<^mB*i5h6^Qp4uTP! z{GqXb;YE|$uS5%^SJ5x-p+Z2whiT|qm)-xY=`F2iq*=GwGQtL9YLCK z=Vum9+mb-Le3<3cSMBtWf~1%3(?(WowCCkEUmlgwRq>zqqs#Clmdh;)5KVCeA;5}T z!fckQPM_id%^r3HAmVm$VGlMO9nVsv2{ich0?eToqeWeE2r!nCHBNz(0+3 zx_#2a!IJoy4K0JgYyj`?z9Cowg-&Nj$;uf_Aeak!oI@m8a+a_cxpai%eHM}xfWKx`}6(%3-{~3uJbz2^Elpz0+U`tLMyP$_9DXd z@}9~n6@TKV#Y6X$>_%^v2z;`FhO9k(KP~3cy8cXozIv z&#o&s_S_D)5i^xkAI*z0GCPOfcKwSJ4Q6a*Q_pD6g#lSj2_a`fQ;CgWhGFS1H2p!n zhK@FrP>3z&r$|7MjX)kFMe*MYa_j*3W#_eYTz>|`T8JrnR_`KzPmhUwn%WAAK9Rtm zo4+olBI2-ds6JQ=z9ss;L)F~O-TB;$<`cB$imGx#^oO*xoB=5yLvj{+_%^5T zmSV|8uKj5d95ut=QX`D7jJDM{pPEKLU{p!=S7LP4aLqdzaZ5y|XUZs`taG?k;;H>s zvK1YWCHf1l4GC_jfbN~waStq%Sh3_V-d!T;i1ZMWXfe_73J9ohSUC)8veP86w(|p1 z$K$HeVPk;3HVk;}a?3r4V@H81m?A?JRU}9Jo~w5xu8H!mbrh)oAoyeLmtbyC&4hSS_wBMN9jIc9 zFzZWv*mgUy6xTPR4csQ~23s}CoN??ZQ*}c_kVxTBm8L9cN=#_8D^RC!g!;ruYw`vYrm2&AIm>z_k{(WIe~Z}QKB98!$^ zaYs-6-^tH)zdAZ!n!XoBLpq4~{K9Hf{)OOWo$E1a60-V`4SV>vgg?=1-+O4uyznjPpm4J{NrqqOQZWl)Eqto}TAqH(Ij z9*#hZ&W%K#rfI^au60eFe|vlTt25r9@k0Rp47yOjoW$-98v@_5sIrD9ChY4q)@3>) zzr%?wrG8UvBr^aNY33O*elwwUzBntR!RWa?_*fHeeN}kLcqNodui7L`(&2~?+Ay@y-fWI;~N-jBvv4h>y z?<%DgP2lfNNPCot=>A7?5r>RbnL>SHxLb0`?V(-JrR=4Jfbk(~;g-BTC~Sav z;cuwaQd3;uIzAZzEL24$L(ApzWE!>N70i1=^^8fsAwrXZoA5S}n#?aMkq3mbbPu%S z>P2~6EVSuqMYaqfr?IUMw@Xu(+p(=^H@ne8lOd&Ks;Jmt=-CKN)vqDvMFhFpnxWz& z)yT)YdwYJc8vi7n{P9*Otq#9t#8pfsQxf1(VltmziMV3&2P#B1NzEZhJ`F4GXHFd{ zD&3N$L@>uYMnBVKDL5Ey_6+x9@2JKA2|u-Gc1%;I8B=B@rTw$WS}&Mk>U!KO1nqoP zs{o>K$Hk|`mzN}Yj}NsB4z3(fSLKY>2Z&>BB+|c482{=Y6HEdWhHSyt|IqLY)P>o5 zh+^|t$%&I)>;$4o5;?eY1|F$ptkJ}sMAuZ5uji96jQlP?{J!n;zFI9vN6s%8M7EV< z72{&UQX;x9)vuJXX$^U$;f2-)=29xh485_62_U%jlF7bT0% zhTqV%I$f4S}NngV)j$O{f_YDw2h! z2LG&f87x`%6iK?9uO#4>DGT=^1 za=>c5EUm>9uyRy+Mv%V3f#!66h)23I9C+6L_ePj8Hd?9ceh{iRE7bBh^P_fJEAh=o z9qznLLxq;_9syCPp=QKdb|#Uo1$coNlqL1~Fk&>wymk0d}auHl+v@i<}2ycv$NG~EXl2C5UrLK>AhZrkzlY{@*3 z(CebRfzKP+AnC|3YTe3oP`{Stx<3yKRP?Kp-0T$A4jTeM@D^)nqYF_+mka9#`WM%` zV>K`#L5!3+Y)|B)ENJeBaG@sCxV@l?OHpuw@$0w@7nM;r(^pmV>HU|f_mI}DplnT! z5eSI4-txAlskK?Fx>GZxAKy_#iaFhEg<9++{RpPGGy~Z3Yu6e`Q{W!NmK8v{x_)2QVR<^`NY$dNqw3@eYQ;LzE4H4+b2O5!wddpuN=3}d#B z4P+T?JMc{?avYiBqT22&=l48ByeD0$iFbq+SV?}WNcB%jvQ>;w%!$M5aDz$Zeg4Jb z6OG+_UwG^%x!h^Lo04?-vQx|2rhE2LVWMKi53ukbM$pi$v84Wp)T;l@s0G&TgRm1) z?6v=4qN}T_GWYZQZ_2R$3HwH`!1od%H@o%LK6wK$+en`C@kj|^)Np+({MQyrik>X} zbsXEaCh2C;_!Ul2)F-|x0H;Jhg%Uo8;CRo2X1ulKkF^owc}yLD zyWNYCVzxHxsN1o?fL^*?33B*4qZGR2^{8%)V=km&!QtFkL@wQB<9;;{I~DAbQ1`nb z8buNO^qmouaJ+%UwdxS1ErDv=|IgPbrUy-MPblRxU z%+p)A##6pMw^FaIs35#-5PxEy9fV~nb9F(ndM7`?Cp#Cj8d-@y>OFbvEZTDI_0cT_ zKN|(4!9o~>Kl8I;w|LiJ&A!05u3KY5x&B$NCqjFp0@bn2G{QL?H%wJC^UqZA6RS=b zE<;2q+qXAXuuOK^h(Qi%n>Y3EwY2vA0&3JWf}XW* zrI>hs?qOjy5}YB)GeOfMMk^^$doSXfi`*cR!va>ptSsCw zU%P+f;kmC>P> z=s88$BO$i)i;I_S4ka8~E3udu~;r-|?^R3Z_06dy!{w z;#?V+s!7W4|Ha5OTWlvuwUd=2^**PHf?{-TL#xY^9t~zW?Rl2CnS8)bxLB z8}L!kll_(CSE*h8BDs{X9HMb@^M!gTB9*%(Hzd%_Nx4x;XD{cX?8+RK1RWAlp{4df zW~WU{cehW{+#bJO8vEw*93b&RN17<NcS)2?PM?qt&KZ6bNP%7vq?wggY-IX3m$#9f3 zrgtMw@hJNc2ST*lx2eN|zY1N)cZ81<@kEkHz>&DwkWzdpr6Mdy%xg{-)B#hn+`8Ug z4dP~=Q*MbT5lhWKl1aEqRU3s`m6hZfHT0n`e?s`I9eIE@(PP%Y0e6sxh9Jh7GWXAB zgl1ZaXsU+;nWxUC>=z6Fn$)r?&R(M7uh)P2@HTZSGpab01U$ACikK*bHefP~(*!Hx zu7`E_2+#OPpo4Ij!F{jo(wFv(Sj3AX^a=AXTD;*DXbU;qF-n59Zs>s|iPK&0E^oo|)>NIS-*WsmgEl9H~qSn6pxbi4l z#2u?68Evkyhy=96$Ik^~AfRx-XL6|6S;V2R8#FcgV8v7W&k`n*TP@oIQqJWlORANNQDCVsIDpD z$U>9Y*2H8bGhux~a7l7(?L#p&tXU9xEi{J5#g;jNp=p7);(*)7Hc8-YhCBV7S%CYS zW788Eq{`HRb3$CAj)*MDKRZr^LeQ>Uf9~e4Lil~ox9jc3Ndl5&YGXZ-ioab8)ux`q zy4f6eQathNtfNBli&R>3z+*)jzu~7nerl<994?qZ2i7liVKIx9cB|w4$V6@&lQ7=v zCHbo_T}QC%h<7l8P9euHewL7@n}mUp&}4dmRW9Y1?m!Ot`qJ2^@$qfD?9cw8 zWle&0+_CkOqGF|)DIkeD`j}x@n0B%K3?(4}vCz=TEUqa{l6-l%nXPhmd30>WthC*c zecz(3kC5f6rkobt!Pw2z?0NmHlqWUsAyzGJOC9<1wJ(kIzH#r9&>6X0YZXHpgkDC8 zbN)rpcYx}pg`liF$^@h4BPawz4Vl|*G1`wN2b4rCGtVqeX=1@J#2R2lS=i>wKIfb3 zB1elrhJkYZ_H8b}$0wxk-=17iy};!20BBzkm3$61Kv@ObRzAA^CS2%hx~$$Y*M(1L zEDRAUX^(?LWb&?`Z%F0gHhap6+9Bj33`;?6Hr>IfIp+Pk3XNSPvs9I7$Cu^){=W0y z!Tcfo~e-)rQLnG_dtQ z#D~?Ph>fUI=Q+5H{$72q`yWb)|4-4C}2 zIy`K|T^!aLm>4zTQu*!CUH-9sF?mbBPDw|u+zU75Kw1fw7oJ=t z#m5k7cXv*JrSr2^-&U1-GHfTuEXRT=0QZEAlSMHp-q1_FpOTB0n}dTxNlOcCAd+mz z5ff(wldO&q??aQXgmr|- zcSHJLEAuwLFeDLbec8aQVD?x2E)+O8E8E)5jCt1;F2`NWT?bQ#92(Eo_j7<=Vv|dl z@Upu(9#5Y3l{PU?OMdf{IDM6wX}*GiN4p{S`ClW;y&cS2boI=|jXXDN1nSJpS=q$x zUkFfCtn~qcK_Pq3x>-FIkQmF;uTfru`hO*`)Rw+Zt}$Jf?^u%>3~BasiAjDfGU>30 zLmg;{-}C*O`H?qOPBmSboy`aA9DE5(pan;cNM4AzQJ7(!a(YtbWjH=INM{?2h~pI* zV(BE?3*knf%6#Sz()_s1^+>l-qTk*P@vYeq&#=tT`}47kZ>_`!BEexkqh*@^eIZ7- z#?B@IGCyeaIou7^jZ!u5LusY2v*%mfOdMhNC5F1PLRt4*R7A|)GvnigR>mj` z#8#ChTW@(|qC>wGQ-#XL&aPOqVd_)y&t)P6eH!Yc^X1DYwxOaA!QMJ}@whCzFH^#@ z-&8G5W~up-+_ln@@M+YRaO{m4I+nYVYYRycN#uSAla^3n^L!o6oPljx)HeMLy`)1< zm=l0Mgoa=t#%F=fAT$xM=f(T8KfC9!I`GxL^3GkbjyY!KnedQ3ARkE4Qyv(o7_M z^^O#&2y=6D5&y-avm@tEFbW=@l$SYk^=eLM!s^mx%{I8>TpJUk}dY(uD- zoN7$lkI~U=nT%&A8n@n1gWB=ue$0cZkefW1T(=4?u`Y0kdv5MuLVjO-Hk zSboPN0mAi%D`v7j6ze2la7h}{w)6puyg+6YhvLh{*;%me5WS`@t)9GRIxOv$l)YiN zoOeiiq43vu)r2Bv_zlLzlv>AL&$kMj!lU|f1?;t=XwBP+Wi?B*Oa~cFR#k%D?p$+1 zp5&L}iYCT8HVPuqG2_Sf3pG5GACOzip!*q=*VjJ6&pDHvd}<~E?J?iZ5Xh(R8#lDL zx^H1 z0>(Er+H=NQ_u85TMA1lT1F8}ez)NY(gMq+!^Y9o+&5oWjsU?#rnn##dy3VoHaE!U!S{gS*v;T?znuOazDc8VMf#! zC{2rwhzlQneLM!7<6H!$8>`I@YhCF;Hfw|3f6+H!;VDBg|@YSz2YGXt#Kbb*1oh zgjMgpqt6`V#gm(QP7Lfaqa(gwQxeHE}xZG^!@m#8t6^m!{xcTvNk37@~qcdo|CnTEj`rdzM=5lAruTI zD4wAMtPE2ch#5hptn(ZwfRrgUMng*rNCH$#Y!(}yuc)iC$W~j0a}uwe;lewgu!tcg?JK=cOX$yvZhh1pESwr9yBgEWkr@S{M#W*FIfM&1sJ$GD-_OTzBorknK5S{3-e zf7VAsPKh(#On)}VPq)JUWIkNqmtrHP>B(T*KSa+x0|EqyfP!!!0zTUu@hBu!PmGvM zI9h4s`|&AyMX%C4-9=C*lWe0{;MB3iWqH16M87?_87C!7b0H=F<3wnN5p7B1# zmMnwk_bNtHD=;%-kOVmjdy#dsojBAU^-)Sz>vv=gZzX|VOfd{FXj%(DjamUhK%OQZU_7!-Z(j+AXCjabF zc6R(m%l|-`rrM)il=c*d6=#AtaP*@>$Nxw6a#A#2NQHglQq9DVj=cQU=j%Thm|RFX z_^KgGU#|m1U%8zmK`p>WFxn?Ndg7?rB6sZ}2E z9*0JG9W!te%cSBgET^Nv4Y=`z6y`jTC228Z(c=fOQ<4T^q$HHAZ+yhX5kAqefQ8Dk(k$VF)CY~upluG+`}Of zU0Ds!Ja`_K;tGKtYhG6Kf4kZavTbQL;KAd5s=}^E9+Bl+az;Pg>tVw)-^Ws7SW_ev zJPdo)9{oQ5OvTJ^e)7;LMuGmK@6Wu!YHJUx?nX4m21RFn;Tbo!PRHK>;c7C5kUw2( zVla}=;3_Ktunl!_Lok%oRom}(4cmb^uCdQV-eKZR`d})JsC@D5yERTT$^_p5ro;10X=4qMnpruz$RbJ(ChDMycZlY-4zC4*az_L;_vy zdA1(eLFpD8BmbSDx5(_P(y0yajR_#N5j~lfE?Z$go_e}puewmmSL*VT_+WXPiZ+@P zIpJWMJ27~9)>-;8j~^vRBL<>n_x*m9^zz$e97UO*I4{QaU|i7KsGjrGWBsp?%zV$L z1!|Xb%p8Nz7#0K%m>bF%DPoEYDWn1Xae0y8M?YN87GOr#dvhRc9dv&;4fp|7rZ}|g z40?K8#T^5gdF#F?fgFiZ?meqd^yHW@WZ}|)E5F`nM1qEf27p*f^gzykcK)hM7JdE$ z|LICvayX7=>lT`1d3vBu#1G53)Bah1xxv>IqPN?A zcIs+L$O)M2+$A`&RM;t2eyXYPK;j4J5+t3?Z5T)jnav7vfY8gWa~an%hzh&2 zZNNXP?+%}<6LAn_gLI(;FJ2**OGtlz2k(l!l9@clVx+0X8&r(LoZ;Ov7Iws9NowSM z22mc{Q2+m1&UVnmub14mXp&{3Ir+` z7#JxEj40(onI)9UG<6GI>Lth>I>x)Z z$$-Y0foZsfaY{1s9Tt;^$#y3cq$p2S#mCL1KxQg!P3ee2Pc)TF&F^72)IyBhS5hG$ z&+v8E_X%(19Dc1`7J^Gt&s@=Rtg&V})7zVVBd|@VT+GLjP z(TthI_#3SqqShn~w%>L5V{2{d-h6YGNq5G$Mv0G<8uLZyhb#F)EZZfiNaBU>dQ)}e z*6S`aa*{Rcr#w$X+WgwyN0_eLjY~HE{GA^7Kh}NE_j33t6NfI0xC-QBMY?YFN{-s= zJbelu<-XWy?8ottlHgNV7&25J`H{379_Q04OV|Qo*9wLumsj;!Ii4D}8D-B?B`8J< zPzu04@hSFY@#aO;74NZHzdP%ISm@s-2F(qR8jNLRwvE^`iNy2Yt}#bp=6Na!pCpu7 zN@F@8KfT`3|3Rl-(@f7Er}q(22yg1vD)*m~;fVkmF@Nu9!NGDt^f$r;%Q$3}gA=Dp ztC#w@{ZUlNw{P|YIh_+>5U%$V>puh2o`aBhJVz!RuuO%4*~sod=fkQ!lfh5)u?DNT z#lt>J8429ThH&lr^bSn^p@aoPM@MEx?Ypb}bQN;0#L3A?-^QI=)9-gwo?%KohaHzh`@zDGRqf?ZJbI zlFJ22e_h>cb$PwR21dpOq(#B|UD1q&NDQF6Cw3{mZ~H{<1;1($X>O_itW8g_iZsOb z!C;+V5`Tn!bk^<1yVRQie@rAI1@D`@1C>#3gLF$;N?ie0Z<1^%sXQp$hM-!m)OAVp zdvjO6Fc%7O#CD<~tzKh!tl7x73Yv+(`>>G`slbyJT?|0|x72Ds3E7AF7>w`&PM-Ai zbgA!Zz&;-spBXO24(%bMpwK6BrCCrUoxvj~tDvJqTcH&dWMnvION@L|70?J|T1K@z zIu~{r4E~ierLnZ!|7h%!>S@2^`abAXu;~{w)5YFfLDywo6)sa8YqB3gk%>9+_pikb z|JyNda9E{Bv(M8(HVpkiSx9Rr)_Tkfpqi_jvxnIJASMs`z){LwBWCPT2O;9stga$j zg)zdfc~QPnX!J6*&g%QXjNL~lAmy(}i9)PMmwhu@u|t66Pm1L4GouqJ&m%cn=Ua&u zTuI8j0K0(HgJ4*yxyKRjzs=wsVX=oVSa|jiQ-f^m&eThChImjvKl zCqvN8bK|hPzUz>s2b^=w@_!8120X6M2YYh(E47{oij`@FfqSpst(Skbj!!wg1HW|8-k%I)v&8E)o+2Odt z!EcFn@)5Hf?=?=#2-HfDeRC@JnVc%=a&FE@R>hjQ56ibVOWctoZW`rT1?`)^CC=#X z8sOyO6OkS=f4s(!fqX&+9oW_=YH{#2#Vu-&i>xILGPqfyt=+~<2z7|5XDT=NFFAqr z!GM~>r$FFGvnK6|Ye0;ltP0>ULN+vK(1AvLKhklM{S>KxnSV=xe!SGD_c<|hKK1&1+94$XRQ3i8PXdLl2O_;@bKN73G_w={%r zz0F>5m6(@cVJH_AnAlK6TWZfz!RTC|XhZLMGQ>~|hRuUA-E?Q5jBkQ|k~n(Gzg-=P zeC!SzBnZ0EIQ!{;0lmoVw9DDbWF>EpQq_^`W3op9>;n8%l2Q}Cl72@@{vfK#LUawe zUA89Y`Xrs(9G`1jS7kO42DiDgHTCVy)k%LvUc-~f7!Ht5V7f_1U&yLpA?h{S3wOcC zLKMixxZKX!X6ePLP^_vO;0^phsSOl?;#a#5dqTH=$hEx|<{E#5$5z-P_f=O{0C-B= zDV=Wm9HlhYeQPN9Z>k@PT3WIkcogZd!PMN)^sy1WC26i4bNH6`bP>>(I4=SYx`8CvnH$4<((-cvy#XNn0wV($zVa@9J}X_U*kX*ZHM zxhDoo?_ZbkL}?$0g~q>0Mtgwf{$#5M5tg%s{!hCX=vbkLGR*)AACoTb;av<+E6dZM zW?)pFZp9HItZ@u)SWm-KP*-O!G&@HaXdc#;fm{IoDRWfss=*%1qkP zOl77|@farx^=tVoY?l6pWn>aRVMx){E+3zDqS}CqRK0AglWud3*T*5$6Q84^ypwAA z5Xdk&z7A(T#UHiY_OC_fuw=Lh6>1@!0)T3BaS5m+1puD17e+ z9hVKZu8PvKtizd(X|b^3;o%6d6CluXOIi^yNH?e-f9rCExLcNFa6$H77tx%pv~*z1 zb9(h^p|jzB@BlM3i=o>5<920#eZo?8+s$sR5q{(wYIsH7X%AQFXkHNDVME(s`+1O+ z%kOnZr@!?c!d<0<@hQ?O+(_gTAqp@)%OtVx$b^%FF@&f82&phVW>BqQ!Lc?G8oOOf zLPyb0u>ABoE_wFk{QDLC(b*uz)W!md=U$5)^C^*l@hDOO2g0F>vKrs{XgJ~F5 z+)2}SCprxWJy7JsJi{KPPQ!_w>eP|*897G1OXr87TLe9tq_gyqH7Ta>_DVX%HG5yj zM|lqET$|-rpH(C-LkxLk@yJrx2j4UCmFu6*hP>RdpTDJu1AWpE+>q~U63#poCD646 zkv+{rB9)ZzeBZY}T-%h-D%F_F;el*yP81qUT|W(?hU@gkEEVOLMqHA!x{!KajFW54 zX~Jwv)%MRW+5v|fPFSiULq}vG^K|572C?KQtybINHsJwqu8baV069ni*N!5!NR@8e zmn5n-eZmR|l3VovyVZ-W+%t5|5`ZDbsZI1GEqnreBY*d~e&1id;cW@#9UV%eyiWHK z`ntZjD&#=R%vWj(1xPg@2A{LF=TlGHf1bqg*@rm&3EnonUPog6yJv1LPu>r=ZNL75 z_rEfA4V0-XwA33#go#F;x1a1CTZ+ls`-14o49V6&w*b9sKmgB7)JH5VuOW#8GGwIB zp0X~i<9YQY@g-aOXfVeA8%yRhf~MP=2kBQesSSykMS4hG?{GYjc~}WVCxyn8XxbVX z8Ovu+XZ%~Q3v|LN{OyS-so~rC2|?s+W-LUCYg`as`5J!9FI%kl*dtZe*>H49w6lPC zD9WZr9tdyFvQ*R8S9CTe-Fln!j-}NQ`nwHNZ7>t=xR#+%I(Dj3n(?(=X5^tB83ojg zNgmPd87M$dr8}!WF(#;@X=cI79#-q~{g)VK0lGq=weIjMtlK_Wu_-;pmuQdp#wUdA z&4mG3*0%9flT#}MR?gA8zidVe(8v`8-JdKMTq@q$eufc}UA=|~>UbB~69^MGBY?i^ zHl#*Lv#m_Qm&Hl#$wM0_D)vp&3y?h4T~@`0Bl zBD5a8c_E5bxL5(aOew(oQ?ZtXR}p@~_H1sRUzj%$oa_v#stz$R#KKl!5R;j!t5(s} zati=J-T?c($J4OD_Yj|ekbr^5ztn!00gD490SVPWG(psZm|?=iUNZ9hyYtD~df#$Z z^}^9G$d6G4&EV1Oqbn?+a)OZC-zqul%Yj1uEtOBdkGQSmbknU9{xaw>bYrW~n(GP9Py# zr-}HF?uPU*hfm;=Jg`RJdrq)a$RLU~BL}1d5wkVN6;`k7uo}NQTwqXkxplMjbRVH zdvJbVycKc|HT`@|hEQ-61t@Srx}qM3;k!P(Vr=7Ak@ChYP5EK@|2IQF7O&EW_4>10 zorf-Gik?7HZ2gb9@^n5=$#A7Z1)(3c@xj-} zG7&U3b)X_!0e}PnG^=<u%~w=QTumC}SnQXRkH!Gp>#+bc&2?`Lb><+di8pUXNK>s2m~YW*+! zIFOU>k{eq(Vl$CWSGIT+mbq$=)ww_^BiR7m#Nn`v#7Jf2A?AyK6Io1zN0c9$>4KM= zgGtzriV|+|gQCXY&Ix}8xvtA2FPy3?U0*}Mny}>@&3F=sE;`pd(`i(fc=;U#tG1IhcoqEKe5OMj_4 z?GVx+uL@bJv`9<(h~)G3l)daRH^?|kUKO5i1h9G$@SkzUmaM3l0oBdqq%wf4_c=W& zt7nS;Q(L>z*C$I@%PAkF@JE$N5CO`HT32!oR(kDV`9vP|E^%f>bzmvz)?E%ZRxT!B zg&HUR!>DChGtU6v6W|vvpe7K&%5$|s#I97r@v$?a((h&jY=ey65LM*6m}g#&ulbx& zwOkk8HG17~lYS0Mg#h%hDxebahB`ZvdEs;WBw>egrFDRzap)?Ro8)LFLk3?JtL33s zCUcf=pbo1&9?!IPp#_7E#8PJ7;C((sjd~-pH68A*~ zl~aIyLbD4t)~dz9K!wef$om{N9LsWCiWuy)y~^`(ZD;JUX19!VU987z+1m|U0}l}1 zywGw4x?BN>cd+U0YRINtZna7~CsG6B8Al z)#^t%8H5=v*GkX*a1^CI(X-VHXm_r{Ka8<`{ycV7_jc5%l!P-QjmT(5c9y$x{U@mF zH7D2S{NW(r-^t@OH_9&xEOHlgtqavrGIv^jpLNrP1}i81rM|Gp_~x=gzfq(xlSYUw zd})S%+qY<->WQ8P>91&HL94)IZTePCe_2B6#2gOU?$-zWZZo>$=1@$3M~3X0bI6b=_s!RqlF!mO&=<2ER|?0@_At^?|s$falp)p5pe zpFenvc=_%h4m2&44(kw^0byd#`4WnL37WRF#EefKk)U+2Ma0IC zEE`v%?yKYBq@d=&L2S4ANT`>n9l&z*70NPC=QU$K_RgZo>+K1V z6AKpcJb+w6E7fmYTQCC9aZGLQQAS7}Qb%>F>ML)T7ZtdCQrJr&hNG?f&#QI?Z4=WA@_GZ%ksaCZ-uf{oB2I753{YQp0%*P zw%65klycCY##Wd2UjX1WtGRzPoM@$km=(R`lz^QpU-a*ZzfF~*+hw~GW-8ky$+;|9 zIY?$@OK>!7kV|pR&Luz|7!);oHt)Op0!^9%HTA~N`M;VITMDP&Y*){NIdc*!skDPc zzWAa>riIgR*`?PjeC!`8 z58Nh&2bNtCKk2yI)~801{+X1*v2cN&6mbVr_oB7b4L}_n&X2++m*sNy{iXIzyBxt} zM`H>FGr36LD(J3sFLFK~*sHz$9v(x3HZXR(owc$!cxSzLUShG?pIji;9FXk%af{8b z!{+KnI@R^}Q+#{7&sC4g%<8JbH`VT%2pNNX8l6bfuTe>RPdGnl*gW#{hoV;8-C#jB zjc=_I2qh`EedXC&Uo;0}NhEfwXoM+C%&dqB`S(^Bj+lko1+u<~b=hzl{=lCC#JQlW z9A?JyRw5_cC7)OKWLG?kr2BpV5rC9v`?2G$%pu=P#)F8O+$ zPI}`n>L&;e0W`Dw(_EltM4_p|z{zW$JOK8D-okWxYR3*cU-tcP!PK07vdjJ*mDV-7 zzjD&eI=t-D)s<}&tveS4i^&0m)r|ZfbiNR0#ZYzh+CStgqWm)5(yRNil6GaJw1+=a-DQ;PG52es`ifd;+ zfBt<3m@cLEc&tlP)Y@m8(^)lbCL0T1f8xXwsyz)~p^gN6klWft ztLr7GiVdlZ?KZsHs4XGu5Z7SJltW{`C6kzIiRS6;B|0_=1wCwYhhD^gP2rRf49xvg zcTA&X2k8Y->*fBYnH$YDt=P!{IuA!4CN0#W+OvWM3mZEE^0|HvSd~uq5HUC=yNVjF z0)<_*_<)(6{D1#mR~kt<1Pr@9iQST7om9xfKTsNh&|y1o-Z0*NZ@m&Z6XTn0_aj&_ zRUd|+Z?6pd2upb52i;QlIvTDwm1O3&I$&HnZ7{&Y!}Ye;I%lcBG4q;r0o%2z0QwEi z-6=5-Wo*=6BdU-E-W@Sd1M;|~t7;)+iAY&QQ`5(8h#w>d9 zy3D2F8m)R_u4xgrzYd4*<+&C|cTZA8qlq=h>nXRDCVOJyIb=&uEClQ%9jwpJ4b};J zA+<8wmv~>o3*8(a(RYX(G$bac;UXtk|BZdW<0>0;>#wbxQ5XOe1mu_)rK0oWY@SNM zjm!Oc2D|Q3NZHIvGMC>-5op>T9use8AJQF!*}CDQ;eG#v@167Wk6P3!T^@4*T(^(( zw$9}g1RPh4rAGABGd39jVM^hEgE5QcaK-!a*4vqAo3QTB-gb9{nX-7OnX#Ll(9op0 zB+wAzf1a2Y>btR)hDl0TMP@q7O)W(Yddq5_1;~)BXx2X6t+^GP&tHAuY5sGQ8rYAQ^HNS zig+19?`cpe3d01u?gYe>4}9FuJY z=2Cn+Kfbl1A;xvo3gjfA#f3`6pa+Yb{2 zhm`0P0a~hO<^z9@(qx$32Udg_Steyvm0Q8!Cumk@(Vn+1jMdY$ehFMa&wHx_n3w8; ze&k;(rTS1sSlT5hS?5=*e4DJ|KJ+GZ*5%>4LM;*aOr$KCiMHyzZv%*oq>qcl-|C}CdPsidl2z? zQ}XO5B1Q!qFE8sAlLwM0ue|>{?MBhY;XahMGd5prn{>2>^w z&GyO@TWYFej51JK#Y!SaqGWRg_zeccR-KrnI^nI5ijb%jrz_F-fxh*&%KXJus)ZAV zw^!%4q)dD5Mh92CHM9rJ~u^Akw%|W2T~u zURQWFEzw>J6&44&`U}!im!^Sat>IrDNlkzcvpW!9`!iOB_z$ws)X;qZ_0dlSbmr22 zSE4KyJtcQ@%B{d%d4binikg~IO%`KZgULrfPe2lz*;IN?_s<7C{?Tcb_PKiihpHn=FODg%c|~-n#u}&7562_5-Ey4uE$vYd2$kUb#-;*@Y8xraiXJaRE(@dhCw!E zVBh-hmhj?>VnR5%fqi`lPaRB4?HQ2v2dH3x;txm(f!q+1Wb?I$>UlZ1G%2orpyTv; z?4}3XVG*6n`CW z?n_sw9aR(3C^W+tLsOTgTM-KxaW-$1MJ|+IyTAEi!h}W1bUf&@3||5L&>d&1d^t!S zF0C-wh8bv%>Xi;ywzcwbtwP)Zz+k>|z2gvzQNXn{kAv=1zW1hdF$0JtSBw5=NgfML z!M@6#fKuZllceki!$d7$$VaueQf#Mg4SBxSqIjsl7(LB-fY~()E$$+5@#y9qonn4`33|J&?(&wh_Vbmuy8n9R$aAt1smDo%5 z!lkB&^I51i7zQ0hJMZn};@x&fu_WbzErc{o)cjFe_P!&9p2-8CVf^I!%Wd(+Y9n#O z-reSn!2LK>a>ZOvs}!7hW-j@zZNRRFcfGLXmk|l#&LECfAJE!0)50c)1@N)U^Rc=F zyw18qNUXn=xG+mwYD3cuYjv*-V`ZDyPT|_ZBx@bglOktWC?-`QraF!v=NZJ=6j$y3yFWJeZ|2vcKYyNb1?)4hVQJr~9D}G0*%31OW)gxMK8z}d zm?E%PPzcVYl%F3uXxHf}3K$M}|9&w{A{CUGx;fBX(wtjJp>jBR9sS;VrNeq|C9h9> zhR4mBuMwzNdt{z-+xnh2BO2XjYG-ecApzh#u7#W*ruofFt-%6y4uZ;L)F)D(QF^3m zBR&vq4RIx`SV;7#suz#s#UCoc5KtIIR($kHno3PYo_dQWJ=nG=_;pDdxt#L>FG8%H zM+U^%mTJ2hbSq8L_F|=7V<@?T*bjf{j1uw^VjW8U{~{^h8(Y(e2c}`|8VFM003|^w zeONlqgnMTY3HYdSYaRu**)QubX@Jk@3X$iFkTnLk){lrhKIIhQngDrb?z&kfR zXJU*0-VJ(!L{(k z^GOFhBwhFtv%qC5l8g4I?jn?w3|j#49eo%rIPE|%MOjIvSxS*rxxEup?J+qxVdj~k zg3lS}D50L|r-j{9f)K4tv$Zv2Xq|$DMv_D@5Yii)UWgN&h3drplFf>VoJqu6lUuBi zdOfu13px}Lly;-=68lzKgqq;W{?DFK0LZaR+q26v*%`O_4LIDqwiLkk^t{7E0a;^1 z!}aB{%2TbIo`t{7KgPzjTV2APUY~LYi;^Un66+4frR|KEBY^kUYLi^C>L1<41j`&x zoXrQFb`SCa(_;epLiM|mJ4g!h;Dqxsbr10COlML;Tz=sx!KVLZ1b>$Pwi}dc0{x2O z!RWB49CqwJQ)}j|VwPa{$opqqUESYRRl?EBf)D%8pXcS~MW1(Kcl-Nrt&`ql!Kz$8 z#?Ar~9H3n`mTbdh;q>@(NNaYNte<7r{}`<)8fXwHsZC%vonxR7s#8sl!-s%KEe zMQA4xr-~MsGpPQH4^*FdM}P+YndX;^Ha?&=Sy}KJs?ZGckKTIU477cNx=fjZX6aMv)YjR^Q0*(lCxCvH8Vf=rJH zw&Mm$d8$p#DP(;4lwSinS?;%}-OQgu6Cz z5g#x&v*LdRf6OW$C$U2fZ33xqfcsn(;F+T{jSNxR-^&mQ7;;Sw9^^WaF@DuNug}r% z0dP5d8QT*vJe8|4T=>Wq_E+!qUehZL1Pwntz$1W5>U{xp@v#K5#>;xG*aEt>ke%+@ zzd>pxC=9>D=)X6!xw_+!gt#|XC86y#=gsntnQCD?ZZX?s5W$#yHW(`JCr`w{MSZQ^ zh1~Zo*yl3xlFh>_LeH@!)cc|xbMj$i-(`_Z_u*zA3xL2RC9TTzvnRo5%HK$(u9SZP z?mg}Gmsr=o-QcHO(rIZqHR_0$t1+rGG|LmtiN-2HoV-;#IO9v61HCk`%7=J-t-8G94q z<5}(|&;W>!5a!_db!5(BOt>VqK!>9vaaA?7zCcJ=EBmU$>^?Ka{iw%eNd@Q6d8P#X zuwFw;-lj?CGT}>}c4;T(zgE<-hQMh5c+=pJlxQ*7hf|5)cmHne|91(SC#GHYyyX;l z;W*=SO%Q?wT@7ASl)!1v=}L_JtWJw$S!NLvEuOwP5p6(&7;*+EvdDxB;1%0y4mP%t zmB#;Cb?X0o$ncLL4&xAsr+lR{Hzgn_u8RiE;KN#4uTj^^M({k`UawpvQWfMgE-a=J zfdn*Noqi}Yio8t02sh?uzRwm4w)jT)-z9=fp}1K)ZwPkH3YiSs@n$(|&%vmN7;f5p zY=YyN-rkX6;;EgJS{$@)kWrWn{gl%lfuE9}Iuz9k8E{Nqwr8>IK|Bw4H^C2}{{Yd@ zG1g7QLgU^qu(H&>fE{H|fu(VTZqxVl)3Ha$el~JinC7%s#S!>NF)_zBEwCdrxjUIB z5&{aBfSuxicuwraz*=iv;sfd}@FH84?>wscZh|QeiR`R#Ix{yn_lNa%X$cRgl#rz0 zBb+v#+2N(dGc^=6qimH2{YHZKk9J>0Wu9M}u#{t|tyRg1D-D z6{B^(3)Az*LA!!V-2%}}380BHW3~Zp!GLMD=&af2x(fSs)RHF;9{A5E6%z(|FS^Z$ zWLQvWi6cCQhA&?KK&{@dn$LcHpcUD=>+q#2JRHo+ZQ)g#o%*De<}oXAG;Kp0*-22;wSLnuIjP{60k(Cb7t0U2f-~d@1q$uC`4w$`hF`{~T7ZUhILo z+L9+7b)+?zejUC5)}C$UoaX?aX%i3jNk#$XsdarNC3c|S*pkOn^Fl#5x0W-4!UD{-p`L)-$XhnX9XLqod>uMMu&>5Gq4asmmx_+%hU@1;}#H$ zIde%bIKSB%XMEi1mirp>9WVp|xacWKnAtBA_fI&+$NZE!u;YwDdgA@3aXB$K2y8!H zLIwbnS-ITItd2}M%K)K(G8)`e3`cf4fv{Lzd^W8N{e#2d^$=-khj*>VK^ZLs{XR|K z7ZfP5n*W0XSsSFEx*d>@{&s*BsOSdkAPyFT4j}?B6?Fd~ zX%I6y>p$=pUl~9G`4-zp3GeuyD3uQIR0M~|hp)Bf;kk&3tj^23w58`ZIk<)MQ|LbjDsHH-H&WUFGToADV!3s}6 zyxEN_g?zNHmV{`af5oPOIdadRh{@ zSDyU0&ae~UAI=Yyvs)rQn^#tn4bCja;fuxT|VS$I< zw-4E-vxD;u#f1Q)!twl)mITp2J2x7**MvyGlvIJ=x7E~#3hQHH#Xk9(;lB?hUe^D0 zhgx-pPlstO!MKE=pXLfQNe2#S$uFU}wtHoNAExyajpu`4+PkaU7x&YRkg45=lar0^ zWuT{X4tHBg02`*6lW`o+rbqUCg%)7FtY&!Evx;M82p~nywg>a{6;M*QBvgnyxDqS< zzI@OAiwgWTfr|hH{Xy4++5UEAzWaJF3m_Vql@ z!}4n`5-xZj59=4Ujg{4*YLQNSaw))@DPl>>Ub z9n_}StgFw^e)xq!AK)2>EadC-Sd<5@Rx%&g=zor~xWs~3eA=y;1yJu38Sbv@yRODe ztvuAv)@lvp=`TNbA}hK`p#G=3ESq2#GxTH1wkWDM!b(qCHf(is#Mwzz7{Eb`sB%unbg~_2$U(37kcZX8yfxyG5p^#;p>d`xCm!N4u!tM|`+2W4U@+zQ62Du) zdQJ&P1(f!@rW*N0Adj^@P0WgH1rxVcCNAbwm_==2>T zrs(KrF-jvBof+M6TW_!Qf60;KO7d-cfsDVHzV-o7SqW5%X(+>Z5G|(+n_3fL9OH`O zp}qcQwH>?efV^V4vyhi|OMqlW%@{RsjQHKWb7=!hy=R7A_pe@h%hzy4Mcnunr-5Qf z28I5d5`beFu;>0K_uot;!Wj^U9@gEf$|G2SLY1s9wC6`Y-jbO^vgCvxraE3%EEf|Q zSI&fm#oZM$)R}shTmut!XP46oXzjR{i`P)vzf?Bl-GUWm{KsKgjC4X7Mr9S0`K!STv-Zxvph{Sn<+_6G zFjt~gWEQ?os=Q-<@^vz;IySd+rk1(+04sXx{km~rnw<*S@>UiE5;>(VM`@)$A~f+^ z0Yzq*a{_YGa-6ZRn;qFjickdZx11z!+kQWLS&d8^%tF|EJqWV40&GK61>}A&3VLul zFgc`X6`X5#F&1TVl2>m5fH@!7;1e!X7HYGAU%``!iW<|?8&z3!g1D>K$99SwUvf-7 zMpR7Wr(|r_1Ye}nZMv9#Y28k4wBL_Dt%c)r`wvQe7u4H%LXEu=5b=R!wG)^ydNYOv ztv6+v1t+$5lq!cphe}YH;^g37y*8Pt5A*@IQvGW%4sPYzKG^f*4tJD=2C=85kx00=%+#bFCRE1dR>pk$>pi#4 zE4kmP(MOKQ@xWnletv#h)v0Y!lF=?Ei+Bg%JK6BwqU`?&O%g%Luv~ve4D-LSmu!Ws zG>N?7??l)tlyBzO=%G?_!+4 z%yDq*5Pw4&5UpxkbqJ{qf)%GtfC2U65VSEU+2mpPdOlD!_Y)GqVt|EPec;GO{-)2p zYKzBz?`v2%%+px4FCxB&&;FQ*BAq##P&QwMqK5%&U5QGQP?QC3-&CZGV$jx%g)}|3 zUZri&Zr?2Mj0dq6-)MErE!CP1zy4SBq&q9`CVD-(Xx#qKQSc~ZP_lCv^0e(~oYk&` z27Q3t4WPJOE20m9;X^591rS43B;VK@@)SqzAM;mJuPZO%=iIvu`Qp@6=wrb8 z_;nsp0QgLNy!<7xFi{{Fy5r-@DOCUYlssv-1xS-*-E*7(F{@2@Y{ljYZ1lpJ?-atb zu_@)-yYs&4Aok3CZIxEt*^mk8YbMxaK_4F%nU6@sV=QKdjq0fXFX3J{#eLy=rz!DB zeD^;294HmrL66oRR_E4?M{68`gWTl<*4;ZM(L4`1J3wv9POO_kI`6tdT}jU7`|0Ac zn@_|Mc0YGG^ZqAOt0=yC1`~>H`MBYI6itfxpsX`$A_e0xGeyOH{IubllZ(X1PID7A z0;AF8+rDVF*bEeMAPn~tE}c|}O&JbIeHGT%Cjz{tP5=#C+E|=kQbH3oF!oXvjo^Wz zCrxck+e~GKKo@7g_ou7*4XUG0?eUAULI=kWQJwa5B;|uNmZgTdemO~rUrM-7JpN#Y zU^5*+Jo(OUM1$T$x6BQ=i9^@d8ycH#fLCgr_oSif2$hnO5^t4~ncFWlGo6j)MP)&+ z%1^EXoh%%1nvyyl6FkWG1!^C?{^WsH0|L(j_Cw8P8n6;uAdhk^sC$h;;~gy3LX}l)-JT}n8+n~3F&{t6eYND<9AGACq98uCXsj=ukZs zYZ1@ymZ*8y9%0PgMv#Fm+hbl|gy_0uZ1qw0&yu;2a_Z9_XYvOAVK{0BM8`HW)w{b< zS24Ez`Q*xl|F-@14NuKls}XVD{Z53Q?4xi4wlOUcKSZ+c&o2o~f~v#+jC(h+UPwxm zX@@#uaNpnZAn98yq|GV8^smI3U8}QQ4z)_aIz_SNiG213N2s?>r8gxOqNTufb zdoTmgw|W;b;)m+X1GUq(7RNUTntBTqlFIk9_svhWvcTzQ z<-Iq?&BJP&-%%C|35zoQO-%|AVUJ&cExD(?7HQL|nya9L;mW9bXMb5O5-iN1wc-$d zIuigDyU<@3Q&S4+^0pUIZugCtR*Z-2Fl+bsh>O&Z7owGZEWB)={JY8D{UE|S2+UE- ze&%tLo3$A{!fQhx9xjYJBEO2|8W^?v4)_E9HU7xL?aZh}t1W=q9YP!VE?z=rlMcA9 zfU#_H{S>$6Ph(g?VFolSN`crcbZbc>>vAgJ+<2F`8bk8$$}$rZcic%qFq5i$YilcD zF2seJmQP>-^cf}v>zu>PR=Rk+j4%tlGd{LIMIzgt>K-iDv7|%<0IsLrS&n13g~I># z;WB}K88AqM9%O{bd(3evs?nx00zv5IW)sM1?WDgOKH>R2pSd^N<7qbq26F|kQSzhQ z?;7=fx$c>>Qp{^!ZzV3;qr*{YxAp+r%+0r(^Vh-M%$DNPm~qAxo%#9UOmDAA*&M2+ zDg{6o4|mj6tlCqzQ)GQVZycRWeet<24)=F4(;_L91R1*{j3G8C1RIDzyv|x`KfD9v_RlIK?DR!_ zNaA%4@^lzyO!06mi5L|yLMUY^G2(*XQjKV}>LNK=B%7(ti=TnV`D<2=sa0L~&VmgM zyVUa#JEtbClkfiZ*$Wyd4WK6+9cv*Vm~A&Ep8rF&iAuOA_@D)53yI-Jg8Ue?kHx*Fu5IW z@Bm8q&>KshMIaUhd{dQ3B*-K0dQuxrScY!pZhJDll%=l1w0DDPl=D&&8bb9@?>Sa}_>-p@?`$otn-xQ_vaN$v6-?#AQ6D*hOCWY?b5qM+M zimrmSJ8I&Y$5xZfRdIo-lAGC<8iU=_Vn`077R@hj2GSc?I~Xnv2Zha&>9oJK4({CFHDk3C-*4Sv{=V$zVhCTMBP@@57$7l4CfA-HrH zXEa2Dfm|cAHtCG;AlkiptCUoGXs~$P$MNOU#r0bnayB+D6rKYILp?N$;asxdcFd{FMAOw2OpJz+?))`GY@=qGw9X+BSU?2K1e)4xbdXeG* z8=p$IMiv>ALN`0rm>;Cu#>JmmVC3RUYZ-!YZB=8@Omm7(r0Ty_2~tUknZirMg-Cz# zQ)GkUGKete@PIa_uDncy&aR#t`B-})i^s+fce;6;)(sn^DJzRYXXk7stk9m;keR+d z$X2B(E&@797Tq3KHvO_y^M@r+{h~A&wb^YEh3eq)1dIc?A(HfEfyFn@=R9sPt}HHqHwNCHK&hXfFZr7o|I_cc#}8gm@Z@L zh;-ze9(KN+H13R=dDO==6)s_SZA6dr&HgUJelCBy z(+xPnkNz7&$bI$xatZ#hyzJ`RYn@z~{7<`3+FjJz3`Ym7AHc3lcKgWH73$ThP z(x03~g`8TaJ*&C*T5Ma$@qN(-NIy;Xf_VXyLi;F&VU7HKLL(Vux%eLg-|vwDdC^}!}e!~Ry&v> z7*%!Z!a#!#S_L6iT8oI}_8G#8pp9_f?BIUIKv>Dsl3MWaCm{6))rjp}(xf!>C9)VJgZsvRuyD}&5GDq^j^m|YL6UG#ub&jYei^eJoo9vSa z`+7JL?l}5zJH)Z|7)M}%D7lpw|L*o4sG*wBK zz8pD+CK)t<9|w@FujkYzYg~_29Xjp~A}8!MR9N9p1v{OAw&$wDM5J`9R<8+*{fE7W z(4hPZ!RrHZBrZGwviPCD;zbm3&)O{t!b#XtUozmCfD^(7rptTCBEzQ)gR1)Sm`dN&kyB{^Om&LebOYLK4m?fyJFRaZ%~_QAD??H# zTYIj54vS%j+-D>NIOO z;bl><3m{#4g^(`MXOzfO5EM94^)!cCi3m0TRP#ygCQmJc_~~w-oi*k0QMt3O7-t`Xx+4p@sErPsU#)7krr!=MX3C^Q5~ji!@ewf zH_06fEJV+uOS3i>`xp%-tBS*XE%(HF10)S<60V~o;(;&f{H-z`zFM?@^|=wpoUasK z0uILlY8U1sZ3_Q3n&1)4B+8aXSf=FDocvCb5PXgvvbM6ytE@aP@QeY0W&!k` zt^{;T!T6w%LBGUch%N&GJO0;0eEEHC;flcJO1Fk2vBA0{qMIvwM2$ri#q7>b^n21X zG0E}SDT~tTv-0w8df7itd_Nx?-e-Bgkx9)AzH zSo;J0t;E~4P=ixK=LXBdMAdG!-ziGnlVI#AW^`K8z&K|5hNW?rx>UOCL+hm_s;p+lGncioUy)4(vn?An`fnhyI_V!Dh1vf~Xvk0L7yK3hSt zU>4KrNbD*KXHoG&g*5X_nfSfy?|UpS+~Vgj#c9=sSqP-@7#JBnfg+6G<>lr*y;8Dm zq7oWGo@(WuC+8@2(3TKBauB)upz2H|UnvMBm56Y+(Or|US!lxz=cI!D8%JeFT63s? zwtR-zQ!hLIsd1yt7npL2DK}^-x;^G_%O;}leH*)Q^INeNciJtS-~-lP1{{d>AJYf> z215`dalDZhH-dnZvCH?A9r(d^ivxG$dNt{bx_#{n3=T#d(ExXfeh=$BGZ6V9Kq|NN91!9ZYlE6BCEP%B$;F8i*vW05|6Btn8G)2*C5+Y_nJ)1QFlF0}#<$CoeNK+S0X zoHfT3Qg96ens^J@6d~`!W5XPc^(6s7RstqW{iK$1II*QE`O`!)wHnXI7~k8{n-C?T zDK11Y1tt8yRT(`w6Q4=E>`BMx<*>M%sN<_*B7lBRo8eorCenDjPbv_-hj*QCs*e56 zQ%aIWE(O-!>>?QyblTkYdKEg{9bxKKvYwuNKqImBY{~Xx0-qWIJ&5kteiTydf!uyH zRiO#WU92$yKWdkAK+ZPSDNe&q3Xy~9b~i$`G2fAHo;To^DBTc@D1%MOtBs4)V7eM0 z)VzA>dh*1uz+MB-=CV(T3P#RlwT<=JvnmFBx}C_} zSWuI$4P(I`kywksaOp*RyfQ^D_q9&HYkZ z-V^%DjBKbnkK@13h-UCIi{Ga|7}xwpa@@b=`yjsknkm!qG%^!IOA5wNN#qv_C$w$u zzjwn3)OA^srSx`};KgsI-Xb@6VOnsdwNJTW$~<@}gE1PNO@Jdp8QnpzN=LVN{==_{M~T*K~Jzqn^-R= ztrUA7Tl?lD0@y+hUyjO0Wt)Zx+uDwZC!F$ZBXEDZ-Yk{;^t*liO0wY;koxnd%hu8t zRtJI6T}R@*WP_pR%VMEdQ!@c!H10gE+Qi9t^W9Q>U~T&g28@BX$iYW$-_~Dzmti}T?y?qbL(bVM5W$i zd>)Rcq)VQS-%Z^4Gg5*ZNJ6To6qRak7)MAGtrE(;=G2Yw6@1Vn# zc$%U_Ny4_&aEX^gi~kjyE;_Tlqbt)5QP=v9Jk+Edy3gsxB77!42LU4;Ka1Hi1Z*sF z!h{}gm9hqVFHhG`$e4LHRWmbnO%3Nax5aC~B6G9$W0KANLZ5(;u$Bq2Iw`;--?jk@ zLQRccn*|s*(H0+6)Tw_HWpSod8}Mg`+Bg1g?dek%9J};=Lc#fGy|bPA03|u;sjm9< zvr>c|YQ8H`c0A2qRzfK=_bD_9tqg!1yQ@v6dC6~p2m<)8nX*ir*NV!sI%*C}b7 z9Kb}%T_$ko<6%;MQf8Qw@ipatoF<4%9bOh6?e>Hqb^I+vSE}(VPjNw~Svt7o?LT)C>$drR2 zZnw7rkBxTLL;tXJv74jGL>)bTX$z09qf(12t*d}uwODWe&RGc+ zq`-3ofaiZY>w|*MRT~V}uD`y{D*Ee~7Cnc_M5^Xl$P)^nxB;uGM6V@*UGo`5G=id5 zi0Z3Ef-!y8DIWKG&~@PiV!(9iPEKhh@Nhae9!b z^>3h&Il)5CZk3!MCSjy#1lJ%cMS{Yv#^x(Wbm{!{!8^-f9nOeVM9@A4JLdwc6}eHv z)BEh|<3P#JcOW%Or%h5@Gx6~}!f1Dim&cAy102U3#TlEeZqOrEa0c_kI5*}$JgZu7 z(LdCCxmaUFoLXcv{VZA)8578A31jf}9+iMT;o(cev<^ahl z`6b<2s~>$Ui-$#@-|bP^aak0FJXOE9hA?!_IR=Q}b;7brqMSwo5_0tY?L}zw;Sf?L z;JnL*>{$z56hwQ-2?6>bX#8tC(^ z3p2_11-v>-TKOV~;_oQEaLEuV{VzJ{w9~}q7)GsVSa!4#W(HH;`N6O{%~ot>>L(32 zKY-9SLOM{_%H8oq0}{ID)iSKjVO*%D&HkFmio+Upc*tkeg`sUyjL3~4D=8kK8Zjtk zd19YAI?8Zzdg5`5tIY0V$C~@`dgy7RhYEAS7n>W+NfKgAl}$^){n)2my&pTzQETTO zBqeZ{EjK!rKqT}t3y__iUMl~7VdszfhE;S)NzGd&W9F8H+}1XX6-CVhsRMz}KN2A) zXqN!oRK!2?-YeuI?`|WD1B}e0OZ1a`ItY5#SfaJbdcc@?R!J%NbRf1NI2BXHU{!v@ zBCfKC)f&#OU;8`x`3BE(HTzLQ0~;>`0TVuimY^f3Hzg|~?BPum!X$&h0zG??`_f_w z1fUGVsu=ZcUVou&wFQzol@ppsZ(!RL(Lqc;z!L^)-L14J0mIP9>O|Yd-J|z6b)W%y z4-q9Eqr%$+%(#TZE=9PBS|0W@U-pLrM~u?A;Oo?6I=cnJ{{B90nl9Z{v9g**kU==? zFwXhRv-3=Q+8(t!y#~#m_qg6BGQkH1@;AKDX-cv;QNkF(Xti*tdC^!`sLv$2d&JmU zJ?5K5)>cTrzFSwY(k722PGG02YDsA+UrJg?!v*ep0NLi*OokR0F+#_`q=(x68CH^J zyasz83?H@;kDsjEHc!#@YyX2xf4}H7|4Q zI}gk@3nhJtQsy8qB^{lg@0W^nfHW#t{xkI3aeMdd0TlVGYGsG~Lhlfd+x2i01C1Je z5VAMOc~ar!$jb3>)Pm!;t(7FU@Pl9rw(=qk!9g)vvlQW^%QvOBKQ%m7Qz>~BKJVpx z>hs)a(NcUqdo@Rwr>Wi8-9n-nM)^s-M%bT(a=4FzAIWR5l)%X;V_3!Czn77p>;zIw zf+MBO=F+7EIU>K^jwCzD!k5ED#S)z(janfiqFwVlAqG~?nM16AIlH@(a)CySec4Sq z0gxr{MrU-HT4`Lw(3So}Qs}=2Uj~LzC!$pE%QldHRd=a~8!iCZ|Mlw^)O%KHoSP;# z^yGuwpDamn6tVGq2aNDQC2{&+Y|^ z^msoPM5nkJ+6IvEw$CTa02b*`BRjjHL^0QUzVT><){rRU+#3VQcJ5CT>3*_zFusD8 zriIu-WO;RO5#{)S#3xTD`>egl<>kGD9R`ARCL$v>6Imrx&_e>DS7^l&R{WM~=%~)S zQTPq+$kWq8@>RxWZ6t`L3pf83`iMwn6aU&d7zsu9sOMO45WwLRWZt_0zY{oez8R6h z)t5F;TYp^OOS76rU)^+)6uF}hJ^vVX043><50@J;Ni`nV1*#3NEiclbHq^kar%K{q zMPNKjUL@OcaZjd@e8RK!hRkeYVtwCzT^#Pz+Irg%32#v0fCL$oL(g|jJ?6^0WLMG? zsYqbcFB6)da878p9)+J2j(tL)_eEX9ZmGG)-GGN7Bn{#9Pe|i?aNv8ydMT_A%Hw4~ z#oWL7xw6ylM%EJ(IhAfVABHi^q!G6EZ&Ken1y6V0h5h{LRq;0mPFJGPY_@9ht+ue9 zL`Rueq_qDDd@6`4GRq6FNmKU-X3}j)^ARTH+?R_q!BbaP|8G76-_9!6TWyOwbUx9X zC7L#~(*LNU+lvki)nu~EGonh3nf29QEUv3dI2o1a?&wIzHS~zzd_2*D&twR13tO7! zldQ6WbsoL+(b(DPZ0cT|FKl9(=z6_SQm3JCMJ>J#-E!6JQI#J}aQ3_1_13Pp!PcrW z4BHVPGd5KzIU(pgt6s+SOEPs! zLGbP)RRK-d&vL2k0y?Z{9N?v{Xr0~rhPtM#x2n!CHb###35vuKkE=I0VJINFAU0d= z*_dUIz_mv2kY$R)6#VTWG~*s80Sjr{t8Eb(7f)LyF&z&Hi)JyNmzlVBNjd34hCtvo z|BRhSw1jTUN0LCseZp zqX3|e3#{j1swUt$HaMlx8z#+ZnqG06;7eVy}o`~}jUh1w7$pvFI_a{Ixz#?kxCmFm2;MZRzB z-G=y24QoFy$%VFyLN(S1`je31*WZ+J4w8~|^bOFYsC%XxQeVF%epZ|LhCb-3_83Xi z?=78fDC?;JGeIJal};>re=b#KBca|19S(8q>vVq1l22s5w#cF9N(Vae`A`-fx*%RH zbF}N{R3e(BOqY$DJoLOe6rs%=ziFBDjZHZKoRsjomQtU^rqpqu3PZkOZT#&5r*q$n zHmS%-NI-&w-g#L&A1RC;UoGK7CCoYafEsX>`*a?3;(W#1(+}iY z4R~YNBiME`e6|!*`5l%?=frP7CWH=TZ)f=sFBZlDjq(t4tqig|c-MLWFO^6L*0%)9 za5wze9BW%%+mPsS@!Y8l{_i_tPgPSQ$ORd-QF|@mHu+w(bLJS@;81Y$sa*EZC^WrS z`ckW)4cG6modLb$s648K;g<#CD~PnSx6`c8=c!}>DP|vk3FaHRgisi9f`2(p%T|^NO9tURStw?Wa#&KPGS5pk*UTU|+VOv1AvyS31`y+jSsnQP?Pjh- zhTKN>PjpYqYCP)CGgHQ=jHk!j8gKccGORHf(+Uhwg*pSqMUwh$MYdpS8byxJgzYytva zzh%g>j~e+s*?v=S9G~pc9=I3(8#{pIn%FJ|>nUhdJdo^6)`9{7W? zk{`Qu+&IeBW?vPk?cFS>C=a0U1XfaaN?9*^?x^yo;LnZn5}A&(Kd*x6mo6j=$GuVY z#Hy??+50#%tz9SvohB#~8NbyCA;e1j?)Oq4FH@9kcH2j~&=!d1`a$R{IMQh*k=7b@ z{)|^1R6?IL)OQ=Rx8#zCI|i8(R_7ev61GQ^P?_{6&x!7IlvJ=ax=3 zlAxm7-JXcG#zI{oIaMKQv4~WC3=27oA8n+>y)s4>W+uw=FVR8RzCEWFEg;E$=hnKq zvVB=zm>$ZnLbqWk=$C+T!>-+m`;}+hLKajDp72(~g4Td@k%Ap_k(HJxZub5VLQMw{ zhbk&!z{%nF-aW}CLBsJ~kur5G8@#OxC)NWG!B(=Ubrr1y8>t^+bpzIyWIeM?mZgdR z&1zjJfIeN`eW<4rFA+|r68)_&b;lmWYp$AQ5& zyo{ftCPH>r9y6u&tOJ(ShQlI4_c(3*!DL0(Y%~hOr%mUo8aVqW#eiNzyB8?t7^KXf z{e7d|b52tWoS6Hb6daCHXF7nOuF+FB!E%iES1o&4e_+;;7)eqkiuc?$1?t`}R$b1G zm_l7A)F1?w=WJirC@RS!|AZiR|C@?d52^2gOKGp@BkhjQIOI1}Y5U=R`=p&t3o$b@=y0IV{f^Sz)(A2i5 zMLQn~2VTGm{Zq{j$LbC`e8GIo$>ujGU7lbJl!sWrS|OpP?yAvq?SqgKe(q(CfYVy? zb;%MM`}1{9MR^G<&X3xfk=D?0bMQU=uiQh=Id!c%H*h8}+p_$OX z0;%mM0I+fNt;WEP$JjF}b||>|@{r^7aOWwZGTbXt3dwHBg4duMR?&c3t-sUkL(^a>aJtvJz8{=9t0h!MAic6K|5fWs0bPnzDjp2D4>~uqss}d`c27 zXMNP6hiNXcg*tqBY+2l>U*=IsGL&MZgRdrw>_x#mhFA4%~VHuf;a^wf};gZ1OyCb4el{lw+9mDH{7t^(jMOaJTfmsyuxYX zbO_Az@F5WCK4e@obH?p454JejWCX;YBab{NFZf^z;lygSsnQjJNk`T1{fhF_zbv+3 z@qDKVGF^0vICCi^!zHh@toTP`{e^wMJnfL-T709M)8fS6~)l@fM!)$=i4M!Um?3m7SZ z2v0poY^X4wV(?z#jp&SonuKjqI~_|l#DSfcH>6?qXr6hG9bferq8y#q8BT**Bx(De z@gOlGqhT)Py1$7M>F>i9Jp`vcMSz?Nw8KV89ZiqX>oeC;hIs!MG=y8!m^z1Z8$f|e z#x?Sp#uR7zbPv(?6rsQ;Jo?GYCq0n)Z0V0pUxJ@J=ND&2Tm7I_U6^C)-nP z!Ag|4&k~_|jg9a=BOkAu{sX;F;AZfIz?ERCB8~Tm&f#?^msSl#*GXDrL6ls)T|1`W zkSW{y`R03!kMLw_=Pk8M3(>_$OtLCj@#GG^o88iC==tO8R@cU0(1LD?QuS^M_H6pB zDiF=%2l`k6s<_i8-gKOpy%ds!nl@iyPHc|KS^{$7p@K^&rtzcVmV^cb_roYOGgFqX z0)u5T!#l=gaz6!4XuccVwTqhhsP0-anO+@*{XF=q z39jYhXtDc>S*E`Q>3cp?251>iuD3A>^!(;voG!m}@%OF7iWVP3Od(30ds0H0cND_k z*S2ngxnqYs*H5;o;^YIJeM3((Lymh3`^@^adC5&->fNWY5Dm}WmVRVc7(vfICb`44+|OE>9`*41&X4IwOTKnkGsT*r!@`m)7&%PTC)#< za;I;^MLyEV?-3pcok0Vwesv!X(4gcY(&GbP-0+>U`Ua2NxtncmLbzV^;T-c4T{Mxj1@zz*xU zTy(>Iz7A+^3*?3y(<50aHoCS6vOy){vs2UR(5rXA?F=g)jhm}?FqCU2DnY~x?XBY% z@W{pY^oZfG8u}P2HUPcLwuwZ9vb7zBtZ?Gbc@#&p9Rib|IS6>&u+)aD#_8O^L2*Qr zPy0r780xV=mBB9=o-@nSeBmlx&g7ah03|O@&t;ift|N?Jce_9~GO`t5=lEOtg+jFPgDE^6>@(LjO@iz0Q>$ZJHJUfq<_GQZ4b z3XcmO$L$ho5>UecvFqyG@q>8UDofe#hGpjXwhhODy!(bK`5KMUl8Zfq<%^>{b{R%+ z8C+f(Ynm= z)Z?K2SY$|$c`xsIY)0yDqQ^~#gaPI;)^^88osM3afNmS3^O z_+vWi{ggfr|D)(E*s5BiAdIviDGkyM(#@f}yQGzt?w0QEZV-^}?(R}bN;srQNh93v z{sZONXYaMv%)E1S3c1%7^r*?4t~KsW$eVXn?x=MjQLL*SPH3)Ap3Ptg31B zR6+}*fA?*&h>pkiqcrJ?e>Qz2YSgdvd^$ykhxHryaHg&+oPw=xNF4PkLh_UWEwuk9 zCN(9k%)^M)8IklN?Em2ZpxU2xA+tv8`L&x(8TvZYB^8W;r)^+|QN>~Zzm#pXL8!6x}Xm42m^+a`>E8cqr-RREjXv?ES^{o{ZH~_8(iaM8aQD-YLnTCd481+-3fPP(vS16gq^;_P83nR zQ9799Wrfx-?eCPMWVg7IH*Y7LwhO-twib5z4r{PAc%?k1VZeH*(GLBwKD;4v7kDP1 zEWX&pxOGc*Pv1C4rUfI!ve8C#C)l@~=KF!hz-R%P=}auS3qRWV;kqA5lftU1x=-a6 zDVF2R$0?;CG;x?65Y6dv7XhijQV7}LiD)x?pUN-c&iCTjYs#iFL-sIg`0d}nu3*I8 zl+kcO_3(RAp1^i8^1Ido-Su8Z%nMS41yMn}-X&K&rW$nEStQXN9zh3TVThpa?&Xs8 zCCK{N_ogx5!qc;Suhu8a-tAS|DK-Z;OZG-YS*0gUZlwyQSEsu@XJnn&3YRWNH{Rl$ zs#dD**!H~A>Gog^72NN`!>=98L(BFb#PtpNMZWln)JLe<40zp|wj6?d`Ee*UB_i>y z8+ba92#F>&QW&>z$P!{g`uLQww8k9TkMcu#udPq$-5{fw_F7V|dSqI4Im?%eWd9z!7 z{{+Cj?e7~)dI3^%_GC1l&ify5#P_W)zNjA6*}-<5VD_O zB}4Zv5zLMVneD%s8!6zbbo-T;T=i&j3P;@2s>hKCz*_t@+??C}rZU6@YizG&&h@F@ zUJUgG{6|EUh6*607TOv#pZ9s#t9wY4v>2j8$M@{O?T|~Ul#*1SV*cdgwoKqj2VdM^ z*7t8Kb*5B8LPE?&ByA5lr@IPry32eE>AwKoo@narg{gr#+zR=lJ5^SiL>HbO0ouo| zw{C%@l?Qnp+=johH6_V+BLRuf4Q*a9XD1Kei}fi-{FbmF7ute5 zi@KEZK{f_{QaQj~`CEWPl-Ud(iQ`qx!Q0oFzR$-9^ilNH?7JDF{ny>(8nRd^!vp0} z;(E+{At6(k%NvgW{|kTmoXutkSI3ToAv(AJw9Ysbov1IbPJ=dP>2frNQVGHRMYoI$ zyN;YFJyYO9ATdo6Xu)Xi+Sx$jejQfx3;ke>>i!PuB71=Prt}hw>iIo3!o@9<`)EjW z*rt%9x3O8ir)gj{{3RDjNt0CuutKt1#g#=d_o#Rb@xqsN2anI#+uYmdGPsgoa9;hr zYvRV57$pCk5++4&mmV#8Ta~vP&xf?++koE#GwTv5RkSq1{qwhM!m~#|S_ns7FX!M` z&&HUdh|MWUgl5hXz32F6Pv5z>$XZ$njU@hePxg76z8Uphu|!dgC)GNh_t#24y(ixT zf@e-(;47l+td&Mfj0(*tLQV@+W<1u{5kLl-bQ;GsOj3JWY{tOlRg#ziGYf2-z5ixB z=xgZ@Zr1HBU0qXLV$Dfa)_lGOS3@6k{6Cu3glK%GjA{Q)cv%$5e61?Jy@%xzqezZHX@W8judbZ>7e8%~<#fz6Yd*s)V z+g{WR19S4hBX}@e|HfUi#@m&(Kqf$OJ=$cM({jh^-}wFcCDAl&4C1HL;Ox7N`0Bmm zVGVxa3^7VN5_On2TBR+N{qgx514}5W{4N%67lSQYY6`hV!#TLLXaH}VcfB(rYlH@L z-Ke^S*pQEQV4BCiqVmg8vKR8 z+wI`6j{s}&&XIj?H)KYa4w?Hr+#Myt)2<+q)JCS9NU~C4&0X0xA>EUS@Jm%#Wy9_m zOxkHuOxQ|WZS*zp!_>&BH^J$}(fNU`qV(OUJa&P`dzR5Fcz4o22dc9K7h|s((lNK? zB5OYT-W=b1_Qaofmq+z!;#MY^KA%=pKMltl{kj&)Ww!Z7Woz~G>WKwBh3I9=bdlwx zoEFoiEiGYW|L$ZwYbKAse;c=GyzBWg(L){J`lF}?GSYmKR`iHhdwM){Mcq-R7^C(I zS&_)#W(@_S zO_D)RL2A7%Rv|K%*03{#ONl0bw!s-HFCZA-;BjUogL?QJORv_SfKWgK(@VO9yf4 zKJ=+e0kKAefDAY#Gl&p$psC&6BwNja*3GYb?n+rfuAbnX0)o4C++dMZwC8cfSK17{ zWj8upNuaIOSef#Zj_V%!rKiq9clpq#r>B7z;dx(wtEj#(P*C`WU3zqc1-pO%gC6-O zrmIpevaY^Bcig>3W#)$N_;I^Zxjg36#lTH*SIZ+`WO?N7eaWTvc<sH7?&DuVqlZ^JnxN)j2fq(Q33{R%rx@f)3)&2JH&7|G%(veIfh zMgS$4*UV#ZlPmj?di6Vvs=RW*VXGx4N-`q|T9Br`kRTRhVoo{ra+b);zrYJ*8jd8E z^ZYXdIVBGH&DRUBKba=)!dd%2T-y7e{4js>^-6WYJ0Id|$Z8UUDDC{_#?56Kntt)m zlIN=P<%!u;g6iXOS3_g6p$t-F=o{$O(j)M&PkK>W9_!FSX#8`hAaDd?b7%@{-s#Qv&-6Re z75R%rlK%?XFs$Nngx0Ckd=tmIla4kv(v86kDz`5999V6jtHZw}G?22!k@YPZ=NCQ8e}1)WE4AJB*S zYG!qR{5op=|LxiR|Ay)#h;#_lu&W8ey(@&Q?CkcB|571;=csH~J3>>Lbc(ErhJRJC zZ%0v%nYpy}nDj3ZS#WEg-({a3RtnUAxmPdB#zGWazlb4-^7l^1SzK~@lwtqIbpN}V z>G1baF(s)vU#bj!(E9S!PB`mnp>C7d;)#lKlvMG@!JT;$m3dC zDp54>96?9Q2fq*6P$88&Ab^pLoUMn-E>SUlO(#NlC)^bqbeZ(bQW!qpMKUsHWUt?v z!Rmj*5*8M&Qjh9vm@Z2lV+!723@cAyXDi`zq%Sp1npwRQrY zT6>ig6i{2Y`~?AXHQ8BJHAVDuPNTsuid=*K!b85pECH<5oQRC4z55ODU{E07Fo$1X z>6gby9TF*~+l~e0fBno@iA_CoFD|hrWmbvGXqhw%#)CJ`2-&S`KK#N77UZd4Aw($D z><0mg)PZjXorFLjMRhy-)?u$vXR5TGL%Ga~s+5|L-OF4DA2=&zrNzN;a3|K+zi`wH z(k|ILQ)cri&NpXUlO2=GfVsi$n%dDopf!$MOc)(3^r*%$b;31e}6ce3t5FXNdUWa}#<*8U&M7AhKF=M9pDd&)}H&1SAU z^^eDlkqIOD|0X4#Y)>$6A-%!1TWu*K_fsE;7(X%t){GXa{{58Jl^%HIjBY_>1uVh$ z_~XKIR#K+~ec*C0FO0!i;#4txklB)`hSnRUQV6LyIWY4}EaQlGNRKV?uZfH#9bGSJ zOA;zV+0bIgMJoYYB9!u*w&BS9jIxp6KQwK_mZXpMeEp%aeNKLwQf$>dISwLqiAZ3D zRr10)Go(w!;OkLUGCM<;{O+nctzJHH7deg2WjtOcy1?$tSDsO6!O(wBc}j?X9`U5! zQJ#WrsKvh`q&POG%T>)&?sz9A@$)85nCJHqB`J?`r+w6Z*Rt zzC#*zU|ybw@RHP$>k3T|`@1gv*#1LY={iy?8`f+O%nUSst?@0+LFN-mPNZY#kB*k-AgWI z!zfH}j_-;$wbtuAAAckpy_6@>sAh#S_EHwPO=nDG zFjt$j6I4c>tZ8a%v%4K@UJSiex$8NrMI?nqypPaZ_gkXGAJu<+!NAn6EGt}^ev7l1 zjGU)3WnG9ol@OOsCiR*ocrnkph9e?rG##`Lb|%0fsb;4k9w{3oM)Li{xc-*;n`rZn zGiC>)Y4`f{t8qn{&6>DDXTaIGMqhnpWeJDg{#4fZ`5{5)?K|>JMFZDIJ}EWFQZr^t zQzFKTa{h{>Sf`eu7CV4FlpWc9I`w#tqftn6oSfzbzIrz6aCioq)gTEDB3+VLkM7Q% z_}z}f4tW7fr#egc$&34eR8-HqFF%J{d%U?RgywWmp_P()^pBT&p;Cyv z74S6c4H@HbwWrV>-ZkqAx$W1XzBU<`mmEz=Xoc`$99~6bGq=x^)6CgwqyK9E$l$_; zP=oXJAC2|9J!9c1GXFEF=jX&$hIkoFaf(z{=j&hEj2}&-;yfn!e>(fNkP-IDU~|X5 z9(hS&FQDg(Q_>Ezs)%ZEmM4t;ZeEoEAW|lrY-yHU8bcQl=>>l6nW_U`2fc}=G88VU ze%2#CTq!XfTurU^JEnv)ar(#)JP7=b`9d;c4Y{^OuQD+nG)~NVK&HC?i`knx0>15h_z}8cYAzXH| zwze*;tVG$mB^<}O+v{kjrlN>y!S6zW73@qX%)5Ri_nLq)d%cs-{V$)3#q0o=QdF9h zonA`t1{JvY3b>>-?UbULbh@II27TtY_IqIMrjpP6RV-bo_y3_^T`prLb7Ena7GHzS9{;x&RGKA}!hS+q;G z9yNtdnU#j%pY5LK^1VFo;^d$28O=Sm<-PZr53wbls$z-iMZAO9#XI%X=yv;4b>aGk zP`}Zz1j-dhm3vQNqbmS5=`=QQ%vR4f0;-!FDhxL?Jss9-K&p1<y5^ur*Km z;L3yk0PT0hhBad8lZ@4Bipx3>#n8;02s0J!={_9jx_1K^4}K&zLQlI)Co< zLFTIfl>)L`h2UW~A)<+0NN02KV0ZD9eT}3B!fMbzme!!?miux>P&?=Q`$pf1B>c?p z%zon6Yei1S%=&lnwwwE43taqpduarcNHr(jqp-d_s$SNp;T%?%V*6p3xOTFgDSY%Q zS01IvH`THsNu^zDZ?WV5%CSpoo!b3d8iHK8CVU|r2n zeCT;sn&JEcOIptg7inZ@9uqhZ>3vjD0qt_1B&iT<4)VPf0GSyz8xc**$^YS(^7Hwh z12D!m98v7gWRHG%-q?a3ea+wZ*?J^(b91AQ3bM{Bubcqk^`3*oMuX#TAFGU4CS+-i zqaM=kdK8%T(C#T{JBVi4Y6d9Y22R$08nv>qq5a=*$pXD#i#xdR@u-0vh4%XI(hB?i zv*FA3pbnAY-@9*iE(ffSTtNm)$Ddz-7>RvryURYovJbofJrZy@S`5qHf z%hDiPom;|0MfmYeAl=8IrHUHnQH5*r0cgSTS?-i;gOuSio@5n@S}QrdNl7hh@uWLrXuf=_&gs1R*l%PR4Bx|4(hiVS2KTHAa59zeW@adoOJJv}`a zU_WX~QE1q#aG;(375>37cUV~|uEa6mu+b4ymIYsl`SW%{xP|1nv{^t*z=1u71q5uc zC$YG4?%_`9wH8Io%V9^H(XT#Kwz*&6kUO3_LV7i8Qf2q_-ooS3L>z13vbm!5;?y`z z7cn$_Pgkph`?1VgpOwA-xY7o~qE-Z37#U86T7|OZfVpGS?U^iF29Fai-8Z_(&?AQhKK%o#_&&?O9nScpkLlcWKLtE+PQH znzziQukER#feKjnE8_Sge>kO?*V}*$>ARD?ShQ^2CM(lOhFe{}>a-ojylSLJ+Mkxf zIAnS#XGHc$oEJ6c*_=J7vuH$8Z)3%d&$cPd_yRM?(}!5?W>s+lp>17m1>wOP5+$g3 zD%~6Xf2iO&E`-crOkhGg4! zME;)|KK@qQU^|Rb$;iZjgYx(9U&X^mEvdpD%9*zgq>>u&QH-MWvQnmpD`JvTlSeeA zu)YlRIJWkNoWxokK+v$Vw=YwrPx-sdXm<^L0>SVaLrCZ(zM>c!-B`(p{6E&fo~>J& znzOe&Z-CZnXJEXkw*^C8c#Ba?kkm$$)zwaDfJro-ohP2=X>LCZWW$_OK>N;U%C^;T%DdK7XygQZ2 z84j}d1@tHyWlcb|U?p&5L@`6*A&*S;m7?=$CP134uC5019q-G&gKqCL3X6WbvwDAH z5xs6p@QK1NirttuJ_T=6z}Ntk3T$>a@9@T_vqzqb^DsEyqqR`q$Ir`k;JUloHNDfr zuK6m8P|57^y)P%cHKLBOW<^ZsF| zOg(r{H+-2TeeOpmt$%KLo%-5nb2aiy(rgnvWmw#)ywQeBj=V#_xGUA}qHm6(Zt+!lPl3e3Fx+?farqf{ zKc3&GzhoT}u!-1R_oP;sS&;)2WdBbP#$H}6-z=!6np`Xqc_W3l`)&vzA|l>h#QRG! z<9+&GsrBZ~8^wTwA}B|3MUZX3#qKjH2m?n39Y4OgA(f)d#&qst^tZWbHMP>+7+fjq zKmEMV#+O!{Fq;cs^uEY6m^e*k^qMB@+|e(;W9?5jX>5xzHwGEGV?_-dc-;{zgU2s5Lmr@O&e8L+eOb)Xx ziE?@i>~Avsy0w)GnNT~%N3@Q$$7J|yMI>LJU-ICr63LDy*Pny}LL{M}ndui$?X6 zlC1a0=JMXa#N#WYCM}g`&#XuO=6IT);goH~{(kD>{j-bU{px2QHO!1Kypr@t^>Dw< zU&$x?j{h2Xq#M76F~W~q5dn9?hstD7dE*4B zqHu8`cCV&^QLiIP6r-a-ylwx-)1UjVX>V0kOae2Q1jJmlE7blDI9eZNO~F5(zmn{F z4r;uAYRh0!^xsSB-3f%ELnrd&>yM>&l07N( zQRJlTa9`04yXm*@|G}PF(Id-vT}}swpyj%uW)YGq)tim0r!ngdiM(9(s%jf4D=18c z7&o!P5l>c{rTm|>;DT2#x4Mh@OF9_+gJMq*qqH=*iSpbwo^`7}37kvEacq5OX|ksm ze*TmM&ZyLBwZsT)9c^IYbXp5WEX?yw2D=!3(!Q=c#o zGllGX8L^VR(us?Q4It$eeqvx#s>o(aWjMi!`gA~=arr!Z2rs z;=EAQsaFVB^AI8m4rh$<7 z1tufwp=KSM5}7D+^pmD$$`vRTYjmH^dJUdUL?YcIB-EOUZ?drK+*-&GW5nMrC&@GG zk^=&!8og%Qt4<`KUdNF+y7yt9SFg*AU8mM~_IwOEsz`ZlC>h>_28$H5m;%g z-OPd9;`yr@eW1)6n~FM7d~Tj|04ysY(7P#TRHq(PhEn!}*2`&B?IT5S1Ra(hs;b$N0}jX5Xb{%rp2`8JG0cYEZgVS=8&aK;xH!9SD{BNH2Z^ta*7M_3>= z`Y;Pl>kN$X)O)zI(38&RK&!T zvPqcMbl-d+_1u2-@Q9?_`o|d*WY?VS-UHX-)la6uAHWv@e2 z0j&%${B?hC^%|2xJXPO{PhI-G$oRsWk&wB=2yOD+=_P!D@q9>{t&lwQz8b$@9zs8SsJ5l8FbH`%GC?ZLjw_ z;iga9m<>+})EEndX6q;)bd*;A>~Kcp9%m!IxmI-~L1`J%kl5?EF){O*J2@yAsl+O6 z5T>zkW=s9lpF-q+HUss&e~?;Amr0OSG#nHvcGsZDpIzkfBQiAHAQAd8K7fEaZov_v z6bn3#oQlLppk6E(ceOwPcG9j?WI-L}<&hzEE+QDi1`*MT(v`rYT zTFa}zzcjf_*l0&qS>9p~_FL)TTpaXnC?Xmg?sGd!tlRezAB?NtKa_3O_IGg`$zkat za-ip@TWw*ihMfta8sFMMNq7DSk#JU{&Vc{zETMMXd(kYjwny7^tbfFHw9=Hn4Z8=A z^cBE8|AfQ`m)nK*-d&u$DRCa6Jc}VqM;;FN2_uDMp_o50^+3%(2_*(ie)zdWKmXow+$p z=|-s=cXX!{bIt^0mi#SA5HM4z&L5;(o;Cj$ga@p@4Zs#wS6KM%*y~T+?&h31n>RJ` zQCq;NRv>w`oy~i5cF^SIG>h6=^(fi5$L&kRJgSJ4sM3i^Ts^>NTd;T;>-g<_oG z*pYA+=1?&$tGx(_%(3{N)95Cfrh2=J9zj;Ue z(c?gLZq9Cm0iBfQgutrI>%&n}3ij6A;fhO6^JLk)W^Rdz;9*wSE}vP09uQl`53W4( zWGHQtX4d&yl+2|N;&wrxea;PS_KIPR1?wt=YX(#o));>Cz3tq(_T6#-v7mqy=Y#Ov z&}TNd!wXYFnX!C0Ir9hZh^$OlCKoIsq**__yB@L zZTEvUOZ;IDaqXCiUy_MX(8PNIfq3}}K=!0?pZ<)dU5(}&P5&;FZ$QXaoM)&XyNodr z#$JdBLqlnYbvc-Z4&&z)_q1f~he=-!Q-b^Ag_WedzTVpaiqL5qtgFOrBCf2`=s+7%oS0QOc;4XWO;I0 z(|b2digVL zka_^I9MPyFUrk2haG!8^HLUEHMKrS^U+CmM7eHMWAO}`fuCyrC>z06=Kw=`6rWB3s zG5FpfZlgclEYpa_|yfTl037*g**j5q}gRI5ggDenh@FkhRC% z38{Vm)E1QrU2wlefslc=r-=r>nokm@I3Jt0(_orX0yn*W6BxY+OP<ir%Vb@vi$Yte}HWwK&(u1`~PimJ^N?MpZq%{`8uRz>Rz0&T)G8l3)8JF^gbn zNXddr>pYv6bqB-;&g;K(-c3EM8VJ{By0(m2weY=~oB3PvJ&C&5gG)vR*dEHov?vwZ zs?z949}zIl#xIve*2loGKBMo`albYleYX}H-R5k{)R@HxPNX{xnb)!mm=mR5#c#L0 zCU5{gGkfcacG=M59cT(Sb#!!G=x;O^Y~wg*?^y{)n7sltreCqK#23E(FAur1bAo(B zH-i!(5(46)^OtS@dc?6>?98JWCH!IP&fN)r)ub9!w%cQysA3>YS9eG9 z@-IueP?enMy>;G|m#Y#L3CAH32`wI4V#F}PJ7Ou`Hzi>5dWK&usAOEVO`BxxHF$bD z5V>7Ea&0fO9=QE?ATq`LHyl?qev;J^P6P(WuAdGEiv^!=Sm6VrI?VDdK$9npQyaNc z^BK||%a1F{tD+DKz_0qJ?585X*R;WVDqnHTFTQ^veAdMZvKlj?)-cy;Q96X>~tgFz~M=4cArgg#PHz1rNHK+Cs-R<(QHoriS~aW!nYWUYEky$ zh+Fs~ERBOdmL3=3TRxGNEu_%U(_Ba^6!X@OZzk-YknLtuAU|sQMg3&irDeYHWKczO z2?|dcDVL(8Yb54Th?Rxl;q@e8E) z&zps+@JB&Py7&gd-_kT|B5II$@~Nn(nwpyGd{;T1uZ>?)Rrw}xzv*oAOBro#M3#lC zqDsW95%tVrS?bY+RLu7t@V&R=X3o-9sWHi4awQ3I(bCc37qvFPi@}=plL_9fU9oY@ z!Zm~~E5zmuR(AtlK!+BLU)H91UcXE)SGjuciH%FEx`H%mW6R)6|J3J5fs50G{@#21 zb+m~FK(UsOjE zw5_B}NQQjFSLvS%axSF%*GDLY7>CzUV{#}!Awgw(NDwB^_}P@dRGNQu_yUpuE2TyI zq!^m;cDUH7fC;lI$53Tu$A0LHnQF!t zEU^tKNwTt*xAS5~>wY;6o}QF`YFH?6N09vXkEF}2*%RNR*W3J$G;!1#+;glLQ$X*| z?#8*6mX_^COK95ukAPIh(D*SzBpd?;#cs{{p^8Dc|$U4|CtnVGuyqwWm$w?FjiN z`{z>n1{S`iU=qVGmQ%vemEpm|j7N7}w)d1k@P4gHX|#FW<7n6D&a8mf#OY&%riz5J z)fd*lmqWcTO~|m_-mMfi77|U22?Rzc;u9_)Y`s0V)XJ)>@Tr-`hx$dwEFZG|IT_fe z4r=mdbJEr{eqc$djX|AL($ig5&C{K3H?|Hu9YkKBtv#~sJ6B6-%GjF(gK=^3-XmK2 z^xJrbADhjejt+iMz5eYrEZ6&0ml-=!a?UOHf8LypRaR7xO3R_ThSA93A$?+<*u2xZ znQ9=R$dDxmVH&G3ON-t5J{iCBkSb28n*4p^3#eSY$r9RT+|CAB=zmp2@GL3JA6N>N zvQxHwlA?4&WU0fF|Dd``7di)7^xG8>M1;|7>z>VdM7rpG_c!lrX0}f8o2A2339`JJ z3&yDP{2=tXrZYFM=T(_zs6xxf^MM=XwApgd%7Tp*?71SUh7cJ6SST8qZ`ANmO%I8n z?2UWqm`^iiOVosDSQyz{nj>CzD)_T@C)A|h8Td$R{w9(>fegqD{#jcXZ|k35*R3rL zuB*<@?aY~7!KURQuCYbX?P!z2^TcFYI})VX_wU~ycFb(~9|$t*b!8CSw*~h1_siK4 zg!Co7uY*}+mq$v8{`Wdm{0#<1qt}VHedo3ILIqc4rD~HQa1AzEC{sm7$hBB;miEMu z3AIK`2o>|?#TPQswD(1(dQz4;KP|n7yBD+5<2r{$BpH>V9LEK{xqtxzA3{)0c6)C%YF}TgY^LC34FVgu=mM)6X%GTCo zE75!Nbfb)Q0jW#P|G`%mhjVuz4ydo+p^%jO<5LK#%OiynV=Bh;a^{o zDzp}Qp;N@IzGW42%F;u*aYL?291dE0bVq>-7Isqi@Nif5|^ zoeT}Uj&qqxnS)j7ho*VAhPrPzCU+#l+fRO+cy6cq?a9P_!YVsNozYCu3JtPcD~?}d#_oMAK^OB7X9EW#&Hy4fwXmWx@tPTkU;Bxf(UJ0+>I0a=

NsQQBKkN3H@XNL#%O79>Ih3~Yq0AeIdGUUwnpN+i{d+d9pM@N$I&ox~+O2oYC z^dFXfaPPL`&Hqn)1Xgb5l0~7E;iV<)emAGBMLth^dz%3^*Z(z$xt~9$nwJfx`}+2R zEw$8Sabe4t&s%!#PI686UXMIorC!V?*a2wu-jG_jF9w1eO zsUw%1A!X~xkZK4_W25)Nxbq;OrnFDyv$*DnA2{9QE!by#eNow@_uE&*0XkYbii z-Z`bN;w^hq!2EJ^(iD73lE&!WzdP9)JxFTjk7?8SzeK|I{w(VlH{fg~PwgrU^Bp7U zcZsOQWAMoDtGeds41vygw4F{;U>iwn1_@Xp1WtA5JvQ#xqPJWG$H^t(=tqoT4#e-h zrhhpaxz}u+*;_p@E>dJl^R4YhT|r?TAXRhzX;SjGin++&A0}^hpOKw#ea`b7g*+)% ztmmn(r?39gz_Iev#A#|2Yzvc`X6Wa1MH<^f&&|$n%2C)WGyHLbXuLoBCTqJUdUDs> zpf~HDH>qfRA0mpFV2OtpA*52skVzUWjH}QSJoUPqMT6*||I;zR>H`Pvsba~6y9MNg z1Vlw0Wu!_0hRnb20xkc+M;5{>>u_4mm|0nkZPkAYrwqxUDt!_@AU%H$ge@i$zR}a_ z2|0LCrO*0W^CF~0u27+ck2RDF>Sp{bnl-WFXzP(~f^k$yBqS^0zM?S+j+?XHW9ibG zMIy+NBdrB%_V1e)5aBqliaPvO0HhYLDR{z^*u_wCuHkFg`2Da6`eHrQgtnd`H$N`! zImX8x6_Blw9NNB94fCBB(+W{6@hlKEQ+3c-mS8V zip2OWFC^gCIoNpPPJ!CCd$(s7ZpOvMu)TUkZ9Yyg+Tr8%8^3q^<^FVwGIu;DOb(3) z-B82HAfFJ;9CEkz>UsUvh}zcbY0$xNHmHKTq+xiWQ|MwIClpwZB$p&LMh9KwRjW(F z-&yJ?Y=p_`*_0%L7#2HMsMT1(7iI-!Teh5utL87hadYRSDQl|*A();xb{;{^I$EKR z&wJ>uAVts>@JiqaOCGC=A{LiD&-W4Y%Vn@mxpEktXhlj=ULrG78SlA%E2}wuDxHR- z?vnO!&<`SM7rcwQz>|9#!M?s|{@m6vd_zi#Sk0CQ`!K@a{Nl?OyT1Dx9_&0EQ?Xy% zMcxS&cb!kqs*%R4Hoep2roU2t!z5DhOU2)a4qp$rT=eVC1I<=S4m--l9h*dkTO|A- zy}R__GN$5PPWSo4>~|L(?nFcVARNdvt7}^*#lC z|0|s!b|n1w@82bh)xyHU>fVPt4w*UlAaRx{(d84C`j}*xaYdEo>WcVo(UG9T)qzyU ztP{z1wix3^yGNNERe~oZI3YO`5yVS>@`{-@#8T(1zL_+xVf>>#uUANG$7b-RwCB?C zgJWtbX{ngi@PaR|&Rd=eSP3}jHwaD5UPwU?d|3_33i7h}vKFQor}CI){pfC{R;aEl z-N$3G3`yBhXJ17yk=sZr#_CGa89Z1*%v4>4fU|lhL7Bq>fR8|$$EL!}&I;w75Ci&6 z3{dGxz;h5GCy+df&xm%d)OGW;tGTqKZfF>~{|L;Mp69XueqJq*#{DhD5?@eXFznHJ zyW7q-8@HQcMvVCKaQ31MA>Ccff1vK}?oOV8FwsbJXw=DtpoQe*%$E={wwMFL^XBBJ zeQ&B2SCD!4`Zv!UoGVBqD}_#71yl6pKYVwm^-4nD>#)$jZ%W~Wt_05{5dXZXPl!91 zjJzy9kl?Uk%VPN0{w(Qw(}t%vwoMok8*u-xGkg;a-POQWw>LU_wgWZXNSS1R(iLJ% znzv2-u?7z)mCKHCK~U$_DQ}xeDp!oJ3~QuPlZ7Vy00dqH#e8j@(J`?B{EBxbh!Pqq z18hNNT#~bnSu(t&d!eT?Ue+=|iE+POuBb)D^0eqNWoa z!n6M2o7fWRNG?A0;Wt9Q=>FQ8Jb@P(swm(sv)WdhO`N906k6UU`yy#@zj~g+O4ETS zo5`g_j%>!jnZ>x`T$gU#3D%Eiy9GNp)7FW!v<3cmh@#(&Y+mw=T!sNL{ zrfnoO+qh%$JLAlEQNqk7oA-P5#4k3J;{b@Vv&k1x$>HNy9?l&?A_YFBltE?-M@qO= zd5eky#=f&CUr*#4R^Oyoe^8Rr%Rys>D1SAK`xdGSIpOkTNKi#lqTx)~ZwRdhp0o4^ zzai_)Lr^kEn`~-kR_b90G01M@PCcM=__@CL?GD=Tswl>e<$ zzd*21IHbj$j25OE;dkT1);V-kihk!C>L1PeSu+G)IrChPCwk)ttIC417Sha98FxEr zMZ@Tb6oj`%_vEfvUjh^icER00`u7@a6e%^Qx3=m6WP0!W68WB(qxh~s&uVOAoO<3q z>YTh&&+hgTtKZq{V3Ms4omny%_mq(@7FQQ+Qv}8Lf zbb3f!dak4#)UZn};s6?5zx(~D@&Bl@o5Yw*g0%`F7X}KmV@Zj?AHB>L39KEEYj>o? zgnq}efSL+O_dVMew=G2f=Lz8jgzRCv=BJBWV{oA#1xIC66+2<^mkX+{4W=Wq@gfGs ztg?l9L1|#5FYo~;gJyMo(!u1w&XM+<7cH6ur?$KyE-n!6R^=vQ`~>MZBCiNiDm(-L z?$>&eMQm7kE*~J8S@Cx)l-dYKe@uo^XvFe5QwHa7!!)Gw*1a=M(v@}|XzWT{ZWz?F zoDNGW8S_}{bGJXRwoJyP1agR};ouaqeX9sEMC!Df%?LsLcc(27(RPzFUi;ygR#(sL zWz%FDcY?5Kq_@Pb{O=z%Zb>gDjzy%*JkdWK)>zwQeckHF1}eY2gaJ1{@YMU@@;x$z z?AOI9!#d2ZiAI+}&KQfqL)`CUoNcK`l|k7PyWwcUEf#ncwikw1duEtIe~``Bc`7us zTm@oPHHnUG#`Z2j4TX9Ib7Gy>gaOgAdaY6Sho4_w{`vD{SI@Z#ojpD?(NrB=QQZ0J z!ZfLS7fj3EzwKMv-(ZpK(uV)=9!ja0gu3xWBh4&Vx*jjMhF1R}gcPOfIAj#bnC42s zfVu=;D5$AnY{IXDYgcG9{oN{fHjLlY{;xelLpT=-o#L2Xq~@ zi@sot3p1ZUI3Wf~X_zUHHrV>N{~hPF&qKQ#0Mq^H|Nog{qhFnQe94#Po5Jrs_X6KK zTEiAB2$C!=v!d1@qylSC=pY1g+im!=ISyEU|zd9z?>yzFb%$ z^M`Eu>TW%}Tv=L9(p6Kbu!UKg<0JNKLV}K`2zBWm)9KgWo-wE%##xZOqm4BD#C zR+Y{Zu7qUxJt1`!p9D!4i6`!E91NzXM&xTg{G52t^z|Z@7~g3$EAuxWr0+I=eb}V3 zZ&EN08+|mQjcVvEG^Ch)TC08dakunrK{Pu1u~ zTZ>XW`E=?+xL<%do($_-9`$3}g&S|k6dF>ClbeeeMm|E5F)W+ch%v>8;I+bznG}JQ zj3i?pa=sM)zj=xx9H|5b-KDhQ`<1NBz5ggWr@*|nAPR?#&BnGHCyi}1R%6?4Y^$-Y z# z2-*41tn`w7=r|&rc3J~TA)EC&l6%ugE8UMpT|3z*_2OM$EjCpWk zIthLmA?F*S?%udc5Un#iGN40A71>+7D7fCa<9BXhXOvIt!h9(}=kkdTUN1=h4@Y3U;2k`C)CE?CGCjnZ zb(}1*yI*g6OV8zR>~>QTp8tZY_-J53U;`9*jB6LomqsG zWx?d7vb^fRW&ISWA~|NmtP^Jv9R6zJ?#1wR1OrX8%#4YYb$sER<;v{lkOIxnBPrk~ z%}*#QgHW~@qgrLCI%6(xiDz?6e_lRK)voy$1V}mnr>snmJ>@Dmx@ZOoEwWV3N~Wsb zWbMg=Q%pe(UW}Xi5Gz|?EYQ?9yRzD`)L4xxpm+W4b=EOz_UirUNkNrG!!DCzv8jDp zCQ_W+4-cZ3fKfH4%eLM(FAFzrE3udkJaOl%1d^l1OAJ2~EimOOca{ZkmhMh)WKh_g zKd+U`0aU~P?(R^12&+=$~f+@{ewE$O@R@kT%2~*u5A%*q?=CWRy_9;QYmQ^7d}JI=wI+4w!F~ zy(eW)m81-6ux&dYD8|&P4ky=acPO_$#KWnPx@y07sS6|;sqOvVaMV7vi1#`eBsYRP z;{Rlo%~z)b_U&diR{f7e2{@$a+-wSxis--`3TOq88N1$VmzI{W6jj)03cb$xLGA}2 zr%?aGy~7dJi)Q}{M8UkW{`e7=APk!*f!btAsmLMv;%^BywIf4lh9W|xYT<%H*cv`V z?w*wk;cyMI|4pH&0)}-Oa3!fjPjx;;h6qx1N>k~E8HikaxRAs@P?beraIXLJqH#>4 z1u*IEZT1-;Q&E62Ti(Y3>BK3G(Q5~;VD3cPqpKxPn8e{S8n+B}JL7VOM8!U!HdIVQ zof2g+Gz}+>hKW^hSV1z_c~po-mhIr)$=TufTHmJm(nC!7ig+V7KDMg%MS<|^`WUk{ zq!vE<06YX*nG}Z^8W%@&DBqK_FRl~)EgBFUCHL_@9ui;rS`%*hnot5VhMO+m4_F&b z<|w@`7ve70Ay^x&9|=5aQ-H&<3D76?0qbI!QrTI}gzjl@osKK0%^mr6=TMnRu^5rz zN5aAyXBywzmxuLcCmO(&mb?cL<{E$3S-6mPGXCF#uZC0EUY_X>jC&N#C&dBXxfnbP zWO|thwyX+ZS<0!R8=czX6riz1VF3$)9=idPUr6{%y>>!2C=yUwv=>Cex*iDtmQO}jz_n)7d}wwW$}S$!l8PzQhwyvcgs%p zzbFdJl>o>GBUbLS?@$_+C2B*Jk{m^;4%&GHxj)%)lpm&zTOd|GGV_HMR{6W6i6MeP zTS#FjC((^8sBGQ{tmft;I@6_zFc+y~LNu5PgO{H0Ozl{OIgLohwBm&E|A>gtGG=Au z_wyzY3O}9;%uj;;#QfuYL%eJk2;E(aBG`Wx+tC&<7QJM5@~^wlxFQG{pe3q}+a6kS zFc=dh@l=-;0ec#<-l~nZ(vp&#(w4Y2o6czKYCb8Ngk1YW1F;afeJBZP!8zf z;0r}Nf?TG2^pF2B1XzV+WgqSl5z!WtTxChNo@SggU+#_~-Y(nZrKqveie6%m+ye-| zA%EzD{_k%f{U=eHwL?3%NQ)MUtV7UY)iW=Jh}BF)5(KJI-d z*kqT`8$FyBh^EgpXLmJOUP>T0pxU>VY&^ae8^Z2d<{K{06zz1K3ea|c(F7Lyaf}&1 z4Y;Y8rGWZ(SjASSsM0gj$qXQa9YjN9CI@Ln^~Gf~6{sY7!~cE@E&|dO-mCT6{P{oc zX>e%v#x1IHSZo~rnI`(WJzE2X^avPuWp^}YH?4WDxEuWeR&%64*!KM(=;uqAwbxf_ zX5=BAjIuc7pa*xe*8;%ovRwL2B57RN&C|+yh(AS%GyBp+=}IK+5WCgsO&t~*CXxr~ zKcJMC9a2W~K7ypXla!fRk+IVK^tFvyrNff6c{sNS4 z&MZ9uyqxBYM>u8=6T+&yx;f%^sYnv+pN%gl$(|7_gnazBPBaA2FY;7pO?`ciSgwEE zBeGv!8E`89UO1E-kC{C?X@~44-TpO5{ub2RpKtQ(IbO6*;mClmA!J|MFT+t~f zptQ_sD2gQgFa+Az{7w?F83ZyrAPA=usi+7-kWdp_j0eSd0(#0v-sIhAy37(5&>N04 z@htn4{LlC^xKRrdYTW*vhUHs+?>zz#FWtxYC4AF1GKEDVyI(}f zEOLDbsc=X%Z$1U<6LWBWAH{jMfloM6-S|<`%e8U7*!&x!NRRCcA?8ON<|&veNWK0- z#XkGvo!sB|ZR>T_*-tBGFMH_>2Wpzf_0q^f3pe@#NI7_JVDtu^sSAo)ds2eu$cHfn zD?Lr~=Sj}5D2fF3ssQ#+M}ZNDlw3~6m`7+p?)V5GGuTmnOt7cFe}B0f$olE|E({Ef zg+l+QU%exNc-vP^fhU9eLgg^LCX%4bZu4{nhB1Oq+YH_yb%n>GuGEHyGK2-O^6C)< z;ryE(5wkm=b7_-1Jn+sr(GrEqC5q`l$R*3O(e3sbMyiP(a3s?HR_3?VgiAgnF!gsJ zZxI#l+Cfa<34|stoU2!|RY693PGI z!J#l^v)KpGnkN6KWFJp9G$+_%9?xi{;@_Me`*Ppml)u2)&#esLZ8Qv3i^i0Aay5*3 zoNhIvSKdR7dHN=dN~O*K#LsZhWsk15$U=)wYh#$&Yh8#;hXVAFTG8Ywv)@daLr>&s zBxY5Tb}JQPpC>i+?VWF&jkppr!9PR+LF&$nbtc~FcY5=3M*zVDHD$#$UPT%JOt`|4 z|F*&kiMF~^6%7A%hQCLgRrp@qP=z=2V5g0w_YH(aqE{Ix^3@ydf74ZEXh9p%S_KrP zu<0T~fKUp`P2S;bFB^L4;w3bsbRfE__iha_p(z9AXKop^SS=)?bIdJ(prlL_?U%d~ z9nGQbvZU%u26~oUCYBAfW(fOU<*6s~)*>dR_lTrA96&mSclmt}s>>G_;P>m_ z`RVexKJdaOkM(RS3Z;oescuI(`{BUO!cO@G@o}k(GvZfyh|G)4Tsvo!19uGNTg ztK!(nJxI3KB}*$mli+Hcf1 zj_u$HN)B=DTJeimH4ZFqI}sqh_xaI0?w zJ-hx+R^s1M(^REaH#9|*O|^RbwQz&f0dIm{>5Nd7L`=XEDmtFyF7>K_Ek=ejSx3E> zV%X(6(p_icf3;1x=C8CFSdxXJ{_ef}Kr57JU^a$Q7RFZ}vd0x*?5O#7E|$!+qbbr5 zj~8g$^38D=+pke^Ijr|-yB^8u);h_?9sj9A2?E_lSkOe+8TZwXAb6+IGm~V;qgkBA ziHhyJ^3!1+zO`u6(&#g?KANr1bFjm;wU{c9ow*0i@C(s6>MPBL!sPzw)Rw zY73lKzbqOWjjLUk1c7|p+p~rxb8BhDvz*^r$@HnCVO*3p0nV8Y)j1-E}#Os|onmx~aM#W|4! zGF3@Z6xKyDx8sG6_u{9jULht{4I@R!Au!Ia$sDuJTMz4u`vG1{sM2(m8QVZ-`fPe)La?! z{d%rkZ!#fJf(0VMzd^W=ff~Lcvt9gXJ>hAng(eQ=WMA=uWQ2A%UsI%j!$>`c zA0w!-P>&>s6m-_6=Zd&_=*7F&-QpM78YT+~sq5Ds!Xs_~(MF?2aZyFsi?AEo4jI=?ycZs_>Yp!p0obW&U8uR!e3E zj=`LY&fMPUckF8#j#4UozTuvT_7NFot2&*-1lv;R%#31#`5c9`)JksRYf6ILv)Ycd z?f~sjSv<9C-h=m__&eY6-YGr5R2}22!hqE$R+2ft^L7-Pgau#JVk@=X=iZEf@=T3V z;S@Apai!yT=+kN1LF4=)xY3n6^kxo}63kw_Z}AArm1En>Vw=m}$Q)Th*-(L5RBO(=M7i570`H@0d?dws1oFTZci(;nH>s>(%oha<=ddc z`%S=E%ZFO$=w+w~xO)|2leuKH|m4LRlD1vV|4Q;t<`@9m~o zL2Su%^T56|CNer$v$F4oUe+T)G5RrT6> zIpKF*cbK(e$95iB&NU(z7i6-D@HNh-ZSG4UTZ^NRy8!4bHYr(pN@Gu!nkaT~4PW20P6%yN${39y+) z)Qzr@dF-*D0MdxJL9v|Xj@OT1HSD;(Co)OzuyV#o`2$f9GOfyQmEnG8sf_!i|9ss_ zx5s*z4Eb9>-ViI^+m7hUu9U_@KYtCV2K49v%Yjg|-uw8K0J*@05Bz#b3#h#{;FX}% zx(!oL!K5jur$~@tV&eQGD`Dvgm2^9DD>hbpe06oC=5wG%CjcpEmu{xm?Dg-#dqu`^6tAz-U>Wt6#RoceI5>Kjke_j5^TdG{^5ex`g zS?{{U;rrOc{U4Uwh=)_efFVp;RQ)6AfM^g&zc8IT1T%U5eXQE|&svHrb5~_>XB=JE z-NKPZS6y~-BSFz_2@ge_pzzV{N!281h}4Z2MJ*S3b|&Ti)(Ssm*YWQIFnE?764TJ`$tHZLUpBe2i2{8i0ck!`2{d|QU3H@Yt$k05LN!xAfZ#_QIR zzu-J%z0QL#p#}COT%P50GL6698s^qGe@(BcA^@228MxK{AvJz*p=BcCOcQ*vWu6u2 ze?fv*zFAKYpAl|Dv8F9ob+*O0_8O%v5vagiFF2_NB~^r#cj|40_w1+Z3|jQx2?J|l zxY*YzKT-s;e|#K-psm&p7nXDlPvXfnaW{HppRXaqU#|E zOMGZq`L%Ppvc1I%(mKkwb`@~_11zy_*D$%IZ0?8?XYvu{#%(Tr^$VUPp5?Vh3NbJv zI(&jGUuDi4v<$2ervI10Vg~qexgw&H@%aXJnJ*ei1rd*`nnraCPD1%MfgH5cvA*~& z{3{H>>kd-0zTl5LOgfVEiEIcPxkT&dtf84s()T^J&fZMd&5?#B-996Bo{jH6pJYOe zYSjnh;!7+YsmanocB{xR>XtoNrw)ZRJ}*=A+w1wqIN0HDXS3{;QgPltt)a*CJquH> zIvrw7A7yTrc9HLtHL^QMabeTCH>R=jKZK6B)6p^&_!S$-4aJZ*2@Ax>ldnnDVsI7SN#) zYdls?55L)2t2zL;#IkcUi|0U$Vq#VNt?!B7braX%mdkw+OB5)1b7nqicXjGc^%Fyn z;h(i6$?5fQFgW@c-%QCwx0~O=&xiGz_5`mJCy>g-A_|nfWjDVR*ZYLX7BdK;v$FY$ z1AigOqQRjWvaIT57q`FJ&4!W--ubKDC9-IyrMqa(7jWE>vOjsK1LNE!!VEQxA_y3* zc>V{AIvP<)&nKDjL{pjeFye0Q&!NIHR#2E#N)C{;ciP6TiX=X5)g%t-t?9|eTlJ|O zDr|>@ODq^0H7@Fvu7&oItezYCakPbXs9|iF6gV|A@1gP4LhU5M$Fbpm_H39sOCz;=jq} zAo!FxH82<^EHaPT(->ZbAvY|4&gKyD5hbt|no#t4LLYI*8*)|EBwSs&dKv_f{W0`I z0bKXTRb2`7$f(Lv96dTpG1F9`L7X<<6#sjl+Vgb?Uw^H!G^5t&_OIN>cMv^l3)C67 zRu_I!Y-E2w$r!@~jL)?t*PHENV#JuFu$K7NW?2e?gXIG8x#w>-o-Dy=*^p zKM%34^mQ!}vRhp-9!{`>W>+q9-xXApS!AOm`?Uec#9l(SZ>RxzcLSh^lQ$KP&-OWT z7CW{7_ED#lX2yoSpU!yM+elB6EYgN@->)cAdy@A^j?izw{z2-Fx3=5rJ^|s^;xYaA zccQ_{Q2g&~bZH;FJxONr4NgxDix9EU zc~ujJxJb1oK0hWJV5;<{$KM+@{S{E0@o&kIhT;!F*vljHizvPqHnH__=q-m?r{ZGl z@$Lw=u9$g>KM|jL$bke?!j~Bb;BsK*`hd+H{j) zIq-!<(?V2DfpQMr8S}Y~HLSNc2l#~9Cdtgg+L$Fh(*+(? z2>a@IQqG{}ugB|2ap9sz?&7O-u{P!hKgdt;$CrHFq{kzD2 zbds#eaF8dYnS1DW3uHxt(wtbt`fFtCQqo0^qWwKR0wxz+#ZnK1m>1}dQ=ntoBPG~L z(yAdDec9ADxTyYuK}(8hw;SPZc|XITCJEZ;v?Y7B_^XB=9-7>~@OEC^`F=fKHD5ex zX*3$a^pTRL#JGP0D;!SoVyS`NA)i#Klnos{3#s#Z&309~$C&l^bycSAdg#>k*{Ndi zxqW=8@ZIHk9~`>e=J$2O*P(uHLJ)ojVCr|NZyq;bvRn!&@92>x%gtfS3swAuQE=j0 z649H7ILNQOZ#C4XLE-Y__Ug>lsRuu0*PV5+q&>BU<)U|whF&)Go`JlB2+OrIvogu+ zGd+*+tIDmup(}ME-qTwk(uq3Ji|^wT_t<bsJKzFViY<$ z>fmJ}yE*k~t3KB6=KcEz&<8gZ--6AGF86H{vhQk|m!z@*g#QiIhS! zn`jj7TX*zkylIxkmh*E{d|<^ATk{!R4{yah=w_u8)xn)oGn=?!Mxl)HBZqXYJm2Zw zCeuPhL~*8fLdJ0y=8AX>k1gQ=hx6Wn0xv(cyFJGZad&p*k2aoJh^07Pg~%n@#S!B@ zU9F4!f(WXW*Rl@x9->&bck5TjJf*q5qm8u^QL7bu%RDJz$2i?%5T_9#^u|{RO+Gku zyTiQ$`!ydP&@?wPhTz&n&G zM16a@;wSx+RfdB0!V=MjV=l+T+qf`<7z{In=+J+1XxKC%F6FKW{~YG1Wq=b&S|vPi z2MwORxX4aHNl}CwW<6%$W#I4Hai(+YnEjRk>z}jHco8L4nyE$#=gr2BVj&DsvIPy4WzgzZeG9jxt^v-sseT{nJ@0VNo4p7Q+nbhUWjD5D-0Hy7 zwa|rH^clOnxxqCfJh^9FLG0LY3Di5=oro!d!>g`)(cKwrz_p^D9A&KWJ_qy*vX-ij zZ`MuB+RH=T=SBzs;Mnx|sgC*)al2%O!<09JK zHCP|RHRHz%DZmH=*70D9TX>oM?~E_!{9foh$$5FKgdNt*2yBvraK=7ohE3PXSL$+| zsK^lEAK+*ZxdwD<`oHtkqjoW{SaE4}B@C_o^CiG5#3+M*6}YP-X7#?XFq5zT89y{{|@l^`s?r|Y#YsXt|IBj+TN5I9q- zr8CNZ@b#gI_6pqesXgwfW70ps2&kp%xUb?}dre3*inN@oF+LWUm%!45z7h;0sM@~o z(~aZHvK%T=y~ym-ystFr9lTtK0}&kovpCdbibE87w~SQt1}4%<3isZhZ$pc5VQs(O zuidu(B5z~KB1IqMg}4Y7tO}fnfCgQ9A}G#!+A}P#h^h>Yp;k73SFrS9=-+tDAr`sAr z!q7(+vPWgUlB)@H7fLs}N%x`iUs$n9=yhE^ zowlgBDWmU)?-yg6%SAy;OW2j~l_#BgeJIamdq8Jrr^Z&~RLgWhf%;=jp*}R@g7aQ~ zDSvF`zZ|Z~B|c~TuQxx@^Y3)GXIsk?{GIbtgG;(Q@;)#5&jVmm=7SM@<*l>89a=Z% zFC<<}VtnlpDT;^{t_oxi%{<+iO%5Nvu!Or{e?~=gD!uUn)M{=l<2E;9r!5|@KNFeW zt(mQa854Dv zneuoY6vA8Mc`+C+-wU+vI1?KiKI;h8j=f5Zrcoa+>e%%O&*q^CZ{dT16H1Iw4(?QHXW(-rMJC)jBkzR2~?C<+g=BF9Z z#xDAas8q67=&;H-cB~7O6lgGC629J1RyEVy_e)LPuD1Z6XKkU^u^*Izlp;-%2~vMn zw%Z^ax-laWhAV@{lUI?kdd1)1+MB#7_0HZ8%cB`f{CsLmyQfUo*a^8`_%XTr)Iyb} zH}F=xc{*!CnnN0?3e=}c%)gT2I+st1ff5sQH(m!|=m%g?Z~7&5H?pd!JP2U-YVEd8 z-SikdUi#QCSk-)05&KQgU7FTMm9Nd~&*iZ1E6+ z{!>96b<*6#SlYLOJruqhLunM8Ugc`H^6u(gC`z^s$lSxUXzo?q`1+;d=g%?Em1fgF zGghgL{H>`^6&ioeG@mvL1Tx|kv&WJKn0PDf zX5pXDINmM2t`J}d@l=^Qb+`6# z<)P!aM))}HXDCx(av{a{1zH^ssVn2sx|GttA$%h7$ddVQ9O)m_X{Fpw+T>O*8jI?= z`;Jd#1ea~*d@BYA1sG+Cd5w+9H#hba6ciFpdPJT4;a`ij%YEynos5ir=Z>SL zIdT+9uv$w8fN?T2GYjU-ACB{5qzdQT%P?Qdgh18Mz<(BccOq5VqCy)#ty_H`iqPnO zG57|;6EAe(OMo&$#Iy7#o8Ok0TVsV`Tn?k$FpW*kc89cU5m`1bG_n zShB|h@P$cIsfR@rG)be9ve^_~!X$p-SiiL}n;0(&@|k71pczKToIR9(r2)ciJ+~_w zA1n8m6Gol`o~)DVGlhiEmGetn!`f|>xCL&NG)}=HdtxH_SjJz^3rHIx($>31r9CjX z?S_&p&@JA8d`sO8P*rC}m1vCt@*1g0P|#B(SAg)VVmw|&M*HnXZT=4`Ek zpqpGrePS%*3!PczPM7bw>TpsN#mZRkt?U081FT(7D_?@r(rcnQX*lkjpjKuR)&sPzmQ8!^4rp~>TPp9S?Ohf zG($uubFdZ1I(`3nnOzgc{D)1ITL=1)u{VmBSETISoe+XUq_1mV$Ng=eEbmXQ)6-M4 zit1ve((w=flz5?)zD7EdXn~2HPhtoNK?!chVy7;jw+DR=V1m#5??CC)vG}Z)_NKmAK4;vNQ>U_N7fU{-KfuJ zk^YS6yEDpd^TBpu6|TO7iO+lV03eiF@h}T?>t|;^iGyfm^1t-O2lhKI8=-vdpmew> z%F%conrDo9vUK+gU^&IhN1lQo+|UOV@1df{_BWHbKZ=xyvIHMG z5H*QCZG&gYC}A!pYm&#ndipZ%(0ow%~F>g(tyJs!i)|cJ<9O>t=bP!Mw5J?fiU-#Xr5)DjP)ZLnvR?@)gjIg8JHqvR__+rb z2`MjN)s=NX#{W~F(}?@Cb!u2giQeR^6;>}eP@%p3j7kYw$v$P(2v4gw&ocQp4?7eR z0U2tT0!>m$X(=&kSnPyJIT22y)yjBfQ&k_M8gvr3DgG@usbhpFU6z*zk1Ds=_S^Y) z?CprIFTI!El+JNL6Xv?*%>jJjSP*%I$YzDZYLQOYBIQcv8tAa@r?~0Ehqvmg4=#F^ zKnxo-|5M8pb)|EP^;$Jmp^IY@r-L>Nx{S)e+bO9tQaC{PO+p_5I?nzJWS3W)udrd!>IKx%LMI)+q(txm>n*pqq22YNr4Hr0l>|GsyxyN&@ zNZ>+MDk)}4FL|L|%>-{=Qogq%PMF_P7iVi? zyj>`6oQVxr>k4JR#0?_;mmezOAQs}SQOIf~ZMRm-0JK&6V@Jt^lGMOJM_WtoEU$Q$ zkn+wLvwmSl3HRvj>}fY7t=TdkvfbV;kdhsLcP0wzxrg>`7~|(79cZp~YqrFWe->k|m-bHh5hFs7#8F~D zr(4UA*t)c--dIg`@$hJwlaXpdbj3OCjnMiO zsyM`!snx57rZLvC6QDG5t{itj}ic0m#IT=VJEgi_2rfE<9@OrFHA)p zv=;5?)m2R(cP~f?bjW_W-u(w{Ra-O>eDMb7WP|D$M)m?6&vVaXA3Tz2PkeJ#pL~}g z7f{UjKCfdwV?{`MZV$#rbOe5;^m2Lwrx3|umdO|v1gPR#FBal~zxgx+X1KQF1RH>~ zEs4VAkRlc-X8-A+1__KmK#pnN#xHXC;iya(#OZps>Gpm|mn&F?k|}~~5px7;yHP?M zz%7bU7lw)J>?$5{=2MaxmFv?eT^F5u@yx;KN!Z07_niq^q9Ng;SA&W0L#eo{ep+D^ z1QM6olE%F>)pT@qpKfZRX_Am>QUis%`Qvd7z+J%s(s^`iYkVgc7a$8w(ZXffObeK} z6NHrn7;Dsx24_WhGo(oI-s~#_yMDrg*r}<~$u(5v6IaA!bVsn9hDEXjNf)avIUOB* zSrvr(=5e)dDQe(5CIlQ%gzfDq)*<36_C|?>S}Ox~jUvk2lffO}WO)qy4@3OFuWIbm zSi;b37Row%{GbXY!COs0a@Yn9Jz2GOf!(sbjx8G8+9}mbkH%OAxh!erw+xH=r+GVb z`s=Rw+H;%+S1g@TvIe7=0$kl7zwZ!;kX3b)nXFMB4bs4@l()I^Kn#KRw%iH#-=oH<)d z&T!dK$jvKd7^y6;+Uef(ZvTAG??2w5eIr7X2lhR)_>vnwzK>F;>2ccJX z+ztvr3<*9HGwHX>N>_>9m&SZ0sn{<<5vICSJ88UVXWz#dvNq*C}|ZyCQ6>oOZN% zZ0KW2|8;SdO{Vr}CNU&uuf;qprxt#Q%)3x+KiaG@D}lo5f%6PYgj4fDLiZ4HoG zlw&n+X96kE+;0q2Z^X<)Tqlph(89q``oj(Q2o+kZJr`p)buBVxFfII5!#9ksjn7cx>uZA{f5I*0C>)Rsh+42cwpfkd(Z zHI9-!SmE<{N|wn5TP0BJ=8FyS@F$dRFh>5$(x~*6w?*HUPQ4Q|+N?_zSck>ox&_UZ zS`!mh2-G9?vg{oDh*%GCsUMF~Cbb=h^Bm>0hC^C#&+Lg$zkrsUl#S|Db$U-g$im{x z!T^CT##3>`mpXMIYsm}q^5A)eiILIKvjErZF_Y(pmOwg%0br{FKFWUlkS<>%w7q=y zyi%%95dxGL;Py`NFK^v(>ZjMEt4~T=8a(jNnapU`YyLOdsc!RJduTAd$ZM#qP4%<< zoW1Q?3|4Ctm=VmJoCN@&nWixDL8`Qx84IV9be4TPZV!gamfl^GaaJ$Hc(%97vZQ2r?reHi;a^3I*j`n zm1VeXiet z&I51D3sKi~N{pS6TYQKf&mZJze$DNr&rcYZQcixKC#lZ|&zRejtyg6VqhOIIDY`K> zqL+%6Bhcz49J16<^!S?}m!8iXTOWGs_G^{%iwgjIbP6udSS2|zywy~s zQ%UOf1xzT2wE@5gA5o`-Q(??*Y|wYzCRLji&VwyEcM%5ffT(f)KCl3phSmQ8kKU}KVvCg|x7D1`oDt~+NmG!H}OB~qZ;OAM5OXhP3b7DDcaAhTJgEFO50 z^JF!!BT)N5Iv*R0=rHDWE@=~nH{~@wSd9iK9UG=2*Jz6DfuWf)&?l+_Dyyf;%O01= z43d;FS*#d!Ix$upfSqBJUsoOhq-znoTrQ7{CehYdzp;+h-}#VI|E2pSF}OaaYF@N_ z^gl!^IvTO6!v*EVOJ8oqRQm6*#ai-m^4}lrtVyR0)^9EVA&QyuF+e#zBNlZn9=M~n zE9CYjq->y*K1{{f9Plun@9eoU9?T#>Ew6BV10#u!vdpGsD)QjWI_D6$E5KFESJUpu zNh&#urT4(YADh!o&td<*W4h^%|8=+5G`o?QS4kX2SmqerLQkGV#Kb@m?Kl{vtr|e` zPSg*_>Rd|I#BjCSurcK3F{Y2I*o0G0ItdqQmlxbT9HY`Oozj%bLtu~1nCyQ30DjKN zGWxW1wUbTY8z4l!{R%np{;tP2T5|*TP>M~?zdZohFUJl1(INV4%H4iqI&c|LBPsY04(7lTXaGtc6y=y2f^M#E<2`3-d(Q3ujQjzMcN_ zKoyW>0VHwE1Y6B9BmP4VaA{FzayhX|zt`B2K8}euZ>n60gK9d`N32t4(*U&&Aiu8D zAJabaWte= zzL-sB_qb9Htzru`JA@B9=#6fMmF;ho>|fu*F{`V~ts5fRaPWZ{qVt_t;j!w^iKpa! zhpjbEePOWGxaN)6JEWKnSX1;FiPS0t5h4ksfS0Ym1cZD!ow->K1AX!FW~@@m%4kB+ zz-sozE9(+?gS71Ny@#T2mJMTS00!Ra*{O^@R}8zRn#RhASCCmh#qM%Sp}k$WHv^_L z@5lHYU?_%y&u1EP6f+mCL5&S-b8K8sR00A!AI~?WiS>RjlqI3VI=V82F0(V*TpKOzimPO`%oBwFE$>}Q7_h4Xh0=tYcrFR7F+LpGdFRPj4Z5+sUo^^8 zs>6r1WC<|6OaE9H67QVKCYv~D^f==EY{Zh$-h;UhXwIpFQuUboM{_J|nZSnX{xuO3w4ZY1S8-TcIk&+GUOv z%^~!~rpW{!W&36sOQ)bliA}A&c#nw6;Na7z?ZK!y*6RcGq3&*whX-dz_9CHB^RL6T z>NBIePh!5$kS)qXP1XWKX!?H;1%@b{ulwwIRefxk5BCVB8tWP%i)mSd@cApK$>^pr zp(%J>#;|<}$+kJ@`3a)B>n@2i+F>H&J4KdSlKnb$Cn~l|fykywHW}dyhE-8m5YIFj ziYpDkVh*O+_JOzaF%`+qig#+;O+T2NhZUi{l;VDwxKCp0kic^h)y+WaBGGH$UT8U4 zw7>CRAQ|(9Q`L+Me2^Ianv|UtZq4KYt25)E3S_}FR*S6VG_mTEEK@7gsK(y7{fgaS z`tKOdxw^Z%&@@DmJ(Bsj6a-Rhz0u~03r=j9(lNFTg!i$zwddX#-Qotmu(RgK$VdaN zc;LpWREn-?IeKu*1zNwj&5619g38!A1BDWz5FjKtZ#_Yfmund|0H;{dm{c@6R zva#y?em?a{2g{t_iOd|Ji5n(Dg>{FAk6rYOF0aAl<@R8AQOg#=@9$Y_m%2BTnw8QB z?Q#XVFLbMoOgZQoHMvkfVU76IEmT1!~iBfJs3~Swm+zN$Jvf92dz&^)qCv;k37_le}^=_{Xfti}i80(}mSOZIb^+qR z{UKGSyKUQzsW#hVqLAZk-DJoH=^2vruYVw@NDWiP+U!7+!#}^SJ7_@G>!|IJP zExUUmWv6Ai)E=FR73O<%C|SimYqNQ~<=@5iXe&pOc!TT6Kj*xc?$DYTb8X37Rk!vN zRQ>eWR~LJ+p9@zc>pPaYc@TQWcO=To;KI=WrBNNk!dtfQQvpEI)j)!!bV0;%+7&cgKmtQvKvE4fdLAg7Ib;xmo$COE~!q0Xh)`#i?boj z9FoI!H>l4|3f~02>-r?&`{&i%;-br7D`%!G9YQKA8uG<5=0k%yA|WmX$`7OQsjv4b ztv`>vSH*sfG|BBGL}yZxobZ1dGrl5KpTeCi&FDQ$*&00?t5;=?Lx5Jknc1;WcXD#| z&CD9dEB;(=P%qY5mAXhXmFuEHehqpj%UrpLPFuh1r!o%VS& zAURBrjQ19&)^Gtv&3Ct87mp_Dh<4L+&r1lhrbN2mz9`|P;M-E8M4@u9;6Lj?hgr^Eu;@C*;K#%?bJ$D4+lUcoUT)zDzWK-ze6(5&hLk56YBW96 zm^LV+Z?8$(8x}Id#c!7JW(-$Xq`TstDBpQS!EWu5S#+qXsilei{d>9 zK3yLC$I&^3=hbLII1L)Bv28ZCZL2|}#vCN7S(s?dnrul zQpGA&dR}NMeUEHI#?`KNI>uJA|+>rZUTi`8If z(jYBl8$IA?9Owr})>4W9dp|t2=H7T|cm$fkstDA2!-}7Emi#Mp#OQ{TT_2$9+*FWB zR`mNX(;0PZCmXfF!q8Fr5%c<&T}g208A~l!EoCNxAAkZ{p}_cN zjjgSt0GA^09WlhtS?VPTcGxkWNZazbJm6o6p!O{jHt%^d*pdacV9)-d!Tb%JLw7w0 zbB>hD)!Kjv`SWdRuUx&B$;Dc8RBUXnGlWH#JX^bp{f7IFce7?@RrJmcy?pd9LP=88 z|C+>_mhSwSz%+;YUS+_{*Xw3)3(eoJLeKzMC$iQk1$ZOdYZJ$^@oM4mj^5aFtNI>~ zS*!c+)58pDv3RPlYGo*-u-Jk|B5;hy{?6(BMH-YDyk1jd9G%DTsA+pDxhO@@ZBe-1%5}MznJPM+4N!l1}d7%@2pKBXG`~zru&2y0d94 zcTM_^J(6T7fF@n7W=o1rx2wbYQ9?-=tu}L13Psf94Eq?;{#hyK5E8_Dm$%~`$>WoA zqxk`-efSXWM;}ZP)f))w^?{s0|Fm+LE5NAmH8fPqXRw0X4U^kJmDSo=XqdC(F~cO7 z{~hh^sX^q)<;}P_ws*MBeNOZ|NY9aN<@S_HKA^wNNjVE=IN?TnQdNbW@}b&%hLM;c4NF_R-C z-{ffkK2HfppznBx0XT_B5C5gb6o@_QMPr9v+cjUb=>c97YGI-Z9(-r)~-<}EO# z8Hmo@Oh6<07bUX|MchJzl5Hu0H5$z-Z4(xs_AZFx^D!vdHM1}A&yKBI)ph_ymX)A$ zvLzaag$XD2b}A)EY$C|}bdSiynbd$CIuV#`Y}P@Gi}JE_3ayfhFeK*XvbV^J*5cB_ zpyr#H7_@R}``OdyeOUovl(@+QpgGsr+Z$*AwAV|0?7s4O>nD2qvTWeT4_F$}BS#tJ zqOUqj&cn#fVDi4;PZns=qDE51^Ar^}%D&wRem36n)hfuei&}M?;{NCv{_+nr`0-Wc4Jy>J!aSw%xCe0zN>Jnd)5*!En61c&F@-{Lr4K_3_20h#mp`um z5(?C3XKi)iz~pcUHn(jdazgmwTO=DFQEMAGxjoJcX#Uk#mjqOMI4lzV$hu#!u=%s1 zzp^>I#orYY5J3uLaLgx$R+{Y6#4nn;V#N8rM{OZ}wp|vE_@fiE+yhZ$Z~r%h6*G^(AG^hJ%|;aDI4(zQ zddgPve1u1R{SYQpl=95|2;PcjZi1YgKUyfHsS4jtTJ;SFXMBMmfxwkMe{6&|4oz&U zGF%jUmcgRLmb*OOmG0uS3%@*H(~eLxoqk?53=bz*JTBTx1+mJ%F2`6dNWzoJx%B3}jVha}*nY7te1$H&Y4D}>$zn`Gzby1^}+)cDd!y9GKDvNrUW zYR#8)%`Zl*=NT01tuDgHy4iq0-ryqDh!kj;=i}wnPBzu|Sx>{{pqVt=3V^86Zw%cW zfeiT_TeJBK6AnsuxwyDEM2g%|CwC(0!M#dpw-UKK#-1Lc={?S6`O$H3Km*PcV#sF; zBCoR2N@pTorZ^4A0)4)>`bK8j^?2Y`$n51a?MDw9xHv_W+Z^4?IZNO%d2RoBKPP+Ko=d&tB zNY%ROD{v;6HxE9b(}-6nc0V|{?`r$N0Q?TXRcD}54JHt*`aX;K&&XqY%GKw!A?D24 zubsfV#@Q4KY^EnQ5qY0K!^j|UeoDRMvaE{o?8vJ$g;I~3kRu>1B>-T;)ehStuC4EC zzN77(&7SYq`qss34VjADk^OhLZBXJSbn=<-#fKybX&410gbeX&YeBvVAXpe7X2wn!rMnmW z1kg$|3Gy`FgjtC{kGZBbQ^Mos;Ycq3m$JS zM6eF70122-g4ph4?2IQiNafEmhmRL1c zc(Tco03SC4UrRj0vMEE}!&|J}9;|9M-#pZTm1&Gf@reT#;4i)J$PIkuBe9rDDjO63 zi}ZM(8xs}kGG=yH>EsRwp>_(5XWM8$<%D5G@4=0MKx4H&7gjP>e?5wKyQ}G#z1Rmn zjFn_f7YdXfs*+2}XFHx?T~(@+w#AfQbHqS1k|0+N0`kKcnhYL-;SDs(;JHIy3#fMC zg)RqixJ7Oe72qv+ZR_j`1~{3Xr!;q2^}lnEiT7yV%V->Zo!bkOZ#;nF8iOIRCxDlf zA+3k`zI+H>doi4Vd8IW!d@UA`kuepu0Bu798|a^ZLl57v)_zmcJhb<{=l$>1AD}6! zW(EmpohUW#H^Y2sPD9EBjt!g;M?1C0~UGN%EKTlc%Q1D-KnB1 zY`coTF;1u>BXAwaP@^5jv+EKzHYPwsj8>yfp4_(c$;y8Wic{M#9o!`GeYVTZtEUWz z8wuD4a*N+i7Y5~;LdAgN;2PisE9+|^&;R57dEn#BQG`wB?ye72%A$X<%nW@TZWSNZ zj?Pach>%XN29r#R;Z!N_=ZV{OiZ(LdLLTtPnwxom^@m)dv6oLm%nMrpTzwHSD9zk% znFN#(;T^K{LY~{@1||3o)ENKV+9uEaJi>ZfHgmlmI}3Z-eCZz2P0hq?y;&@6Ri*dh zS`^*)SpG=D^fcilU3DJtWsOV_Ch3pC(M-&XI^BXSb`bmPEw(4ZD&yP!!l4OP_nWpa zfrE4*=5#Aus?|R#>l@{RYqCqYQxH6cKb~mO`uu2%KY{3wRfR_J?S#*es$j(dN(=$< zDo-xN``$)RRV2op4t6@ zJq@_vwy|JKlsl;ZE*6bfl~@Pn`?OeWOiTmtg?qSIALRu4yf75X6I`~=f32-y8JRtOX%iM3AbDe>8u!MqMbRiO zI~@o`Xuh4W9jI9Ry7>!E8A*7e1u1w9l!i97Hajk4up=NL-R`R@-c3~2?x^#nF#HHj zN{}gLp%dbP5dn_O?x*8aC#TkC{edB@a9HzjMlm5GcggpoPh%OF;KethKCY|X{=sym zqOOH8LkT~pzq<>}WXS5fpO^xr=f*3ak>09kj!qwUDI>wfZ7q-_;q6H9YgYel$%L!+ zaU&Vn!;XDDg?s<$`G_Zw`u5&E)KKGP(>=y$=e!*K^2;sYadgnY;|jzQL%eruiZ|-= z(y`o-;)w*Jek_F6EKyg-j@qxQ7_DPActUyAxNslnW+}9(@rm16g?>7I;_8k9!<9M~ zilOac(amLwiqZ}Gvr35W{L#Zfw)b^P$UkS${8HMl!Obslrm@w~VIHn$h7bRu(cH4r z;R#C#xF?R^%3wn}eo7+w{2Ebo(%s|x#Wq7JR!K15V1lb;kbXGK>a*Xs(!lL7VEhAN zoO}rCT;47)E~#Cl))4HEh{@XgJ06L?=AziErtcZLzo{riByE(a4QCC;AI^-zZUJF4 zpA6mdK%s&r2{2%B2Iwf1lp_)1x=08L+gh0N?68!M7?(QpgDnxH&@F@k5#VRGI%8c+ zI=@Xn$*--}IRMX#QN0v!M+3&mfA{weXVtBMoDNLqh7ec2kDWL~xqU74w-~WyXFnt0 zGv!5e)FvoM>&esA0*xUcj0Qsy!S0%uK1WQEG}^Pk*2Xx4pAe3Dg9((Ec3+F;*Ji#^ zM-|PXg&E$K&EF~n97U!CO(E#gvBe|}?ZvBdELMDFpBe&oTPw81uu%``S(p@fi!$kKY>k>SW1k5o~BG*!hQP?N@|icT_!#| zi;oGVxd_k#!nrgSm#ij67wVRQ@4&C&-)G0?=Y|U<%N`EzvLF){V7pV03^IU=ixDr} zkEF3 zo1*BP?zgG9F;5_DOxMhnv1GIWQ_8*NR&WRJ(sSt5-aV`Q>&;@3;Z8B5G>io{n@vQGC}Bpz?G=cV~ZJx zUE18!0HdcoyMqY&_jO^IXe?TKnhG8}>LeeLV(rGVWUu8ZWBabYLkKc=;jv?rcy~~D z9R=sbm@;&s7i#%Pr2RhE4ZH^O7Yz`3i^4xtBwJA~WwCcYF`L-(XZ`XuFS6Q#7j2ic z@a2qWt~MaSP4wd|@;iP}p^q=r=hNL28BB>}X@g{{uPpdf{=S zZ>eATwr03=s~4Asq8}$55QBlQV}1R1+GIEYnv8&mc+-!(Ig8c%B%Xnrd3!-rnA**b z6wlrt1-LLF!40L@8T2ZNQ3W8-&af8yYDz@slDW$F)X$q_tfvh(&g()%=>Ke_9suYD zrR2*(1G&Nb;-mdm#`9A?sgZ1#P_A>ErPT0B-6OVv-!H5!UsoyyL}^=tCF%O}dEHDg zx{x!OkHZ~K_v7)SaW=QSkS?&F9+yy5MZ||4)`BckvHE{UV>!;v06dQV7H2pdyX2@N zu#>Wt?70V!f-;EJ7UxKSW2#vBH~Zz^wg5pV8olmlg$s4L!(PN~0+Fmr$YBb!2haaz zY2)9D@nupRYh*6yM;{&Wx`x_&U?s6tM~!}T&*y-Y%O3^_jf4wPkjr$S==gbXknTM( z4+3$5P!aFkC`abuy4Exe@rz@uD7(7zIrGpNssg05kTGTdWuY-X-sJ6$%W}hgA4=!z zi1x-`p>ljBYV>ePYZ2X^>%UkhcoR3Xvll=2Hidn!A{CW09iJl&+QMG#^u;z@s5Jr` zL&f1q>TEK-1r&jT3;^y;jjq-1Na6Qy)NkmWsEg=_j+{y45GfXP-n2$lT{aBxv|Df0 z2SL0(!jlYnM-}UxILfz7Lgkg7iwk^x<0Wpw>>m6!4?5R^lU`pTBk=C$vgNw56iv+< zy!Q+IEa1RXASGl6twjhHvJF|y7kUx@^*pfcEio#gdQ}eUjO#wD$eqnyhw^Fe{THQ4 zFSc+T->o!5x~73U8jTa3Envq_IGJ*6Q?t{v$WJ}_W$J!yb?S2ZN}BQx1F$5ba|WUb zw`fBES2KD{3tP+GlFX&Ja4L_7_9OR$MMOY0#>K-0yu9hZY7`-N%sfL3r9|}z6b0@O zgv&fWU$-X5#*T5m^j09{qAXgN!?JwOY_pozKr?(4iig-UMT$vjvk_*PUHYTZ`_^W4he=Zcvg2w_bu z&vL=xNqAAS&UmhUB0(KBdfh>#^_8;n2^^8jDkOvYxW+q!4GlkcsJLe%z3L z9zZPLC0@1X+}q*r%>7JRen4{6vm-119dTeQCH{N}@AY)v+a=_rm!-z?n~3&f*9*`6 z`dJTnFdFl^Q-I9JZfkE#Kxnv~kU^L25?+p~1J-EEI414+Io@7z_B-Fpi*V09klI`G zh&nssoR5o$k7;LHB$pDy|ArbCs)pZs3SQUH8h_vU;^BB_XqgZX-|K*))@#7v>CObG z+w~^5LtsfVsCu|$_!}|Q(PXEd`4;i*!*`Qi7UW1G*saBKbe?Z8JlDjlT%6GkFM-&V zoY1PQ6h~66K%ps|m!?pH!Ens;3-|N-hq&V z@M;rgkJ1JG1P&b21wS{A+<||xZ2tM4)J%t6w$~b5ATjZ`NHQBdg3#S~NkZ6wCR6Rs zrlrg_xfIt_cp*iXrFV)siUhj}7Um-v8w4k^du!Iszb?rkmdpC2^7tfI5V3TP+#7&}ic`hyqBU}vJ&~B_6*Eh+(7IyH%B;=hI`{zlQTZXuKwDXme`8vIl6h9{!Y4Z<} z1)Ab=wU_&MmmrtfMy158fAYFTgi3z9rC<-uv_+0c1GSgRMj)nU5Ui7Nh0rKB5JDAFY^fLnK?`m^=Vy zg%u!o9@|b`M<2P}81z1oBc5QZz>o*#kAur(azDPs6neiFck{L0!<5T`xAFx@V5bjK zfW9gxA4$j9)!x@KXXh2}kJ}oCbfBxaP?d%i1w+lT7 zd%`fWp(;4Rt@~RslFqp$znRoT@%Jmlj|zcNTXjonM$v2^G}a|mPQ*XLL#&IL*POr(D#DzFBzSkfaN6J>|+OaKBAs9m~cJCgct$pAw;32r{<`Dm^O_7#56gVwukS zkkMnT_9XBJ$_85?M1eH|H98&JlqoA+OwkHR83Ap1V8Bt~vg=L(Xn1<+fAs6?e(a7l z67ZVATXO0aDUO1Ot&5Pb(f9L7B*eu{&^eRXmhB2*n^W~nV(+^G)4IC^f_>0|vd*Jr zBhF`oXQ%_hO|@k&*ZRKQ=>YWtG~!_0Xc~?N?+V$4pX5}E{cKPYhfWpqpJ?ueH{BSQ z`i0LxuD|U?>T7U>X=#Gwqn*URn#u%?Mvy%Xq;We7@IU+9$vHrmC1hu3-*;?p4Ai87 z($Bm05tru^asT4*hYI`zsM3&>gg&!v4}rSFs&l*2C-m4?b}Gh-RMON`B#qD0WmKFL zEs1&rfVCbE>1N?WMpZpKo|KKN3)tGSLiyiVlo77I#oa`cyeak-2?fRkYXwItp@C#p zCB!){y^5-7QLKWy_xqx7Pp?IqT^Gj~XYS=*&ROQush^hcIP$or+?OjNrVM*z3ln(H zn6u)uj;?>Z@KrzDSXCy{+1+x?EahVp*=jHVQRxyuwwMgIo7XJ?8^Vz^S((_3t9k5D~+T$Cn%15{f~Gy`M}UAe4S zyhz%N>!ffc7#vxNM0P+(lFCom1#YIwJ1LmxIXO;rZIQUzr=$rIv=EjSQ&b1?V;Umo z=!%ch%14?~Oq#4?*c1z_FC|SJo}hT2;{h(m zegdT#z3*Rz@*U_i)2wnGo2mWhu%Bbk15MDd4x1b!NN5!BC(wc+eneXvPaHkVYhKsR zHJ34$I{CPF-*~zjkNPw))wjUI7XOyCa|-Q!9d?tS%~Ycme?aj6_Y{=?sNO|rmr3dU z;-L3EA)ee>w1_rczxR7xuM76`_1;`fPV3!dO#^YTyQ9Yh1+zF6Le3#*-|Ir6o4)tQ zJ+Dpe$gHn9fB9!-KPMGlM(F^PPA1N{EXBO0dgWUY+JIfv ztMkLc-qp4>GE0B2p+{zW43J8F;OjI6F%2oSTg1xgB z<#R8sjpTWYU9_gaOAHsKx2e@LWzr)u4}bFpR!lrsax$BeuwxznqL$VB@$3d{PUpvX z2P;|u;l_Jw39NeG0N*L#c~Ty2uY)R8H0JG# zDF}k=U_=`!ogcBJPe~Il z=vV>!91wlt^?RZ66SH%};_vRpq6lMEP$4W=12=5ncTB|RcO=Kh#cgP!nGxJ(X>*uj z_s_8;w1)h^4cFG=ghj2yAWh(#g}vZg#`(kHnLAiZaE%t$MDcrPNl^) zxL^TjJ1j1o>n+TU39x1BNF_u-qM1pPGy$%#oBAU1)3u{y+bKvXycXg3$pb*AJ4<2O z8)3IPKD9n-Ugo%-a+-B|nj;BD0XPEx4HCw&g2HULJE3^C#F>-X^s^chiP`q5x>vQ>XWzU5dsGfLlIp{--}=&St7sI=x&V9yTy#fuK_7ScS9^BssU(9Mja?1`8<#igTxPQ6pj~-ba^*TrKHb9bkS+>aDmn zvh7K0QTK@$_vfiygR$RX4}nM?0(IGFdEUV@!%AyYFVeX{iiQR=vJ|7Ce9yV(JTZp1 z(RQ5!st7&=eAp=7nP)JA-OAj~O5CbHblJe{eUb?+mdf2{PeR}(LUH@`qX}bkRmiyo zzoCj@e4vFKRr6adM@X?TW{t6fdC}0;2gu0xG=-z%)VRyc1LDzOOYR5dfYJ=roF~u2 z`nQo5CRB$w$4k5PWR?H7)`j8V_tJT$N+R2=-e%F09kiDBI>=f!vNr0 z*yQ7}u3PbCfj3xNi#Q((Mk4Qmi=m42I010KmT=WbMv=#)?ecPA@_Qh<+U?k+Ou1*f z?#aZw-fPt#d|hVT9|V5Rb{XSbX)O-+`i(jQF1CNM7-ImH4@Ca-lpP5;QFgX}rgV>v zjAQVV#`p-6z^OV}9L~P#ZvBwwgbMQCg&Fvb@?azM1SJI`vFt!~xvPNXNT#(vl$R3F z6|$+CKou)N41EkV5HZn_+h}#C)5@Cp-j;Jp_j_4A{TT79*!nzoOGI{p-M{ol*S!T! zDG{kIVsb&mJVk71hB^YgUZulTg7>H+x~F`e=}c{lXaX0U6+r;`h6YqtF>7=2!t+zy zWm?JzewWvjkuFyvR^1X4)kFOJmt1?@2Z1an%g>kq?2vM)B}ux~tU>dD;h0Oki^6l4Tv@X4=#&0+aNI z+$eq_SL?nJmNNo(GotJyqf-c@T7H2P+-2LtWHkC$A|gI4vfp$Tn$y@$AKdro0|=%-(??E@ zZB4H)M)pOv_sOKeud4tE_Z&%5!qV>UY#`=<9s1PcCvoAL|E-~mY}l*TY9E3Q_jyI0 z!Q04&j;JR;J@e2^YX#qo`Ye$l%=~8qw$e4aN>*PG91MCAf368AyRoES6?vpyE2^hQ zKtfVdyTkcJoEO0DU%^X_l3A~D4l%tg8uRsb$C8P1?|y$R__glLvK=ymSlky~&?vfH z5|vwz1kj;F<&tJUOWjZ$=wo6I$CCLPhT%+^`cl4)#_!7z0{I2uGMc3B3JF|V!~Y^& zZz;H!KUi~XO3?3qSgrV)5Am&6c#5ep=+Ki?XpUliSRZivJqCvg@$%RROWOL^`8AT1 z;9(NuVx~a^qo5?kxC!R`(tE*VNFCw*ro0?UxDr!W`0G>2F6iA@Bd44h8i_L?d@(P^ zmhH8>?hr*RGo)w~iF837Pn=(zD^0E6aafRUyO|Ve(3so1xSnB>%Pp(HKt~0Idd1y7 zJh$tWr%5BL@{P6_02u>*>ygpX`inhI$ru|aYxiJYyC0*fihRQ>Ph6Z^-mH6QXj)iG znxzkA=HwEjmZQV{gxoow$@q!f+E`3=)JC~2V- zWl0};^a&(R```t8mJzDKSAvc5F5FM&I?f5j7XG;gR_ZNmx_I_vGVil@CEN3QtJz!7yXxMlJ7Z!NI5Rje(NSM-A=va5g|I?V zRY;AR^SpIOcej7WWSAsn)>=?#J~+^G6RdnI+v}OmAu6a4dKgNk49VMmHZRs@?@jm8 zoZag@d$hN%5~9TwE(B7a!T#RdLh#W(0nq4QlHTH&)mBpGkMR-;aO*FIrmIUeC1THo zV=p)zlSiJ%+{w65jU_d6*#3wh9?nQkZMMJ3tKv=Tlm4kL`;ZTpJ90ptXkBQrr;&5U zmMcXLgZL4rnsKa6G+2@2cZ*F;q`d6(N4_yB(7RoPf{WYa1e9vLepF^rPyypI_7II) z8F3er+#Pj5X9jhk`YItWj|iN5i+UMC@{XZUo;DmtFWxpkKYVO;I#WtQzrwMOp>nyz z(!LVHAI|PAYU<~=y5)FZwwtNfYgxPCA1N1u;@eH~kM!?|19KsR&2@`Vz~il1HWRV# zmQo-Nr2jn`qJgW>Oo{Adbjz4m^$s+8vmyq>mYoP4eLeIao*N-m)Pa1>>95E%Q|L+F zK)~DFyv*~o#I}y(=+D1bkE{?|Y_Pr57simXkaG$<@}R;%g$XH{ z^yS5q(Cf`Xr5wSfxmmZ-95wePHg})@@vo$fJR-8dll;f2-A7Cqp(i8_Lq=w1d3m|8 zM(saH+_R*>GnzE&uUT_Pu1o1u@$SA-pn3(k==3wuU{md2oxPmF#8;yfD^(r^zTN8! ztjB9Wc{Y?4E(4hwF3q-~nTJS$3gHXCTGP(y?DAmNUJ;1tWVIM(1kKz`zgVmP{WdaZ z`?IT0t7WKKmN#uGm76Ey0N}F%^aZpKI6;S_X11ce{RzTb@O_mK86hW|EVU`a0;T>1 za2#p>OmGrq(N3kXrNXZ*{%GQC`jO}Qk>N|Emb~+cK41A{j}W{T5XQq=RbUYz66;b= zL_m44)6j5CV?P&+%qrS6Tfa8MU!_=tp73DV_g?e4+2Ea>lClwi zF~C<`sL0R`lja;XS{}F{AR}JS$9}Z26#sbJ*HuKdLMqJxw+!e7|MoE82KN?-lKv2R zEoIV?FMHvIwAzBdv5&7$r)M2M2P6BInTM$`! z>xTo|p0`j@8?fNOEBoy9fyn@?4SD#=y&**Rz-dkkZ3XS$VA^_{5e;@>&+x-|N zmj8q6Kb{RRE!EU8TK=&hou`&5KRN5B;SiaLn?_73*bO5$LP~`KG~%lOGZ>O_Q?5}CpGTZ%(-YmQA)5uH!K{Z8ah zz0@N7!|vwrf8Gh*<%KalI`to#%k|)&0BY z#0ORyz&K{7f*47WLa#02EYwXkWf)DvcMTTc>{rNJM@NmhcHPX)K z4v!RJP~ng(-M$8_NgBSsDmL$)O00qc{jXK=%may~R}@rSTi+AN{Hu#~#zHD^dT{9y#JNK#CLj7R!|? z-eONlnO{?rQkv@#BSk*Z(QK8L#zy(18q%Odz5OasuNACLr%|`RW>scq{_`=1pYM5p z!FsbJnHWKu@*5D}2kwM*^buFk!TBO*djbn)c$GppR7j&KsTUlpEjEBNX}!g6FXe}A zzAmG|E!%=jBfv)PeK;^%^|ViVQ8W2<_Nyi}Yl*lpPViSoZg9vFE|B7cCyce_8|x^( zDB5H6wZC}?kg=kd1-Rq|jo-zMFoEzm zwFn%c*7~&7nE^Ten)DQrv8ta?K|OqD4Sc+1?T4*-cxrhsoylT+At8Um=ti7Q>S=&C zY}CEFx=6^p=<-7z6%uZ0jL8BNImUOyxQ@K{rI;luEQkhH&K>GtGwcW<$gd&34pPzsHcac z2PR;Bb6}vCW#QnMiRRoK8;QnS?e^ky`|E-Qkeyi*9OX*eHE5k5o$uyEksB``c!wvM z_^@K4VoG$E{}P7oU>;JZ+cUDy;XVlp)w)dcHo?%Ua5;z-*sg7R{jwT&4m%qlMz|20 z>0H!m(hY%Ef(d|=C(XCGk;AeIIG+7)Li~5L`lZ;d6_g6#vzaH5wsFn z=Q!cI>_%=Lz@+BYFXRmWuaOy;G1A2;4f0zD$120Uq zxQx|(a^qiA-Dof!jrb3vZDg=X?GJyY!Omc7EhV2m&qF9to{_8PZTK+{x3o%54Bh4y z9vLhA$$@&sMOlsBBsh`;;b~rizO>`u%)A@85v%?05>D8m&N#4O+AWP0H{6$uH$A z2ldvxc(1w!2D1yZ0+DzT4G$xWatgm@VM$9jL`(i4C98lImm3`q;B4D=zIu9jNs%X7 zZ+4}Z=K92Rdp&$-W0R`aD(dV64yGZhi+GAB$ALo1x8A!kKC8Ap$twS0S}r%F=?Tqt z0)c%F3pr2k2Wc?CQ@z|CXOOfnGIYNWVaVgwN?b6&-k`2vwmem9a@Cf85TtS?JG6D4Q0>aFWv&1$RpVQ@NSH8fhSA%!yBZp~P7_0Wm&r6fVDi23OR- z$s}WW=P84ME#C)K`m|n@*+-fbnXbJKjc=%tk{pD6E%Kzh+L?BPV7tv_<<0}`vp>^9 zpj}rh{Nv%oSc2a(<6QVh@z}OB_Ut3fLgqw4_kci|wmvQQ14GQRMbizqrFs zqC^PXzi6+AgmX@Pe>Kqp0l?MAs*{7AtxpvB6Kucx!RaOtbxzXgtX!i#D zStR~%=i~KmBvZrZwlMIE(qk6aw4|ufM%4YKU11r1kfXmpXEK#%NjKRWi3Tl!<~BDK z+Pxi?^JPS753fhJypuogYMD@@+uLHYgxPb0njMw|E$ErWJqAGaV((2u^h&r)Fi%WG zx}wIE5~e9y)im;aLPODc^-n9jn)Nr^T!3p5Wr0G?0)ONo(;uxiILb7RJ$ozz$wZHH zEv7K}FouFbYoK%&iW(8<74UH2U2a*vc{&Tjo>i9`{@aKz7M&RY!{=-Wsl4EuMdIxQ zlnVHKG7FJgPCrEvNC1`&kL<3O5kt&0^8+$V-Z?U_emdOQ3)bj8xwk3?X#OtfRj$uq z1D=3kwT$tB^Knjvsx#p{rIh_bH(l9$?}r>1k|8$K-3~?o2Sq|*D##^WKv7Jd%Vhu8 zW%;HsjF1!t9cW+WG9$ez54({m7V(mV2GVLML{Hlgy9cTIaIY^hTq-)ohS&o9(ekxM zVEoCOc;d&s;HTBaS3z@F9efs1C+~L@c-d(z@gm4q9O8|}7)gzzwbV6#nu{v`9y%;@ zzdovtj3~sOv*?IgOf`$+!E86>RX}JJs;qh`K^+h3nJlDKltPL4cZyRhfkM!LGTw1FJ8^~WsYio-A z-G>gnn68X}Hi*#@rbE#UXzOE%Wa{jv&L>NYm0*A)Pu62kCO=2;V%<#=wFP|C4~P@# zme`^PqqNn?@)4Gnl!TU@?RsFmK!>ih+t78k+Wvf9iY7OKRWBztY7Spx+*`!2{0?ov zFc%QU!2Z7H0bCIqx;oR17Vk7H%G^mRv08qvQzqN2=c586)42<`zMC#Q!x3B1&NLKl zh($QsiH5T;m<*cwa@eQaSlhLaBmn=1k$lj|=3!*6l2D7ttqYt%)L>uSk=`RN5~qNn zN$S$BjSztmsiyW65WJtkFlW;_aYAagSqD}oTH+RJkA4e&Bps_Hl`8GVP{EHq!NX0j zt6`VFIIE#DGyqSLjh+2wAd;!h@<67bo*ZD&kfDZFU_5ydr(M7r&T?>oiPSCU2Ze~} z$Z#;E?0lG^q`MYoW}GxO;a@u*1~*?5DAA}h{G1Wn&NU32-X1-K#Q$QLcP$!X9Lc)g zRfckoO`f5ICW#Wg9GGh+5mYE@uX=nlczh1F6i6icT8w5wZ0ArrbB8<^6^U&N&fkSc z(P!E5RWF?{=bSmL7MO5{$@m(ZV~KiNhysY`Rc8q%d8jqK6C$vanIR91S2<2)qKlS* zI(j609uY-1svOPqVbS2MuP5!gwmO$;nwqj!R*@Dfbjf2_xA+%CKi6yi^1VD2qQjfw zo?1mvsOUOfhyWQ;3v=_duZO@Y#*CmOlY1!YlaCki<(=|eVxoLI1HQI5KTvKU-><3< z=x~S+UxTFWnxb=|yrPUUAyc->;z~kR$#a$>wY^*0{Nj6AOSs2Mq#sH2)ojsL@%x18 zEU3k%2t}&}NC4CEV`n}_ejqdr{zo!s6g27KJh(Ewq0JnX77GVImJeH*+~ z6{mUX*S4W5PC|!+!o|f67sC$}%Dz7Wu(&|^llMNE;EdnLfx+SD$GyRx2Vu`uZlkYa zfE~%tn_Y^orvay~v%gm<@ltB)v?oUys5r|)Se3|b+w?4vmHDYbT&g7+PV146u`g^j1I^%9kOc9JB)IEZF~|S6XY{zowY(bl9pxa7T#56XcoMFMLT=oJ`ozk{xNR&ztWXNm7jqX!lPdi+XOl+`T)<83mESQf-YvJpK0JUg@_rV$(3E^PAZ2t!wT zg{Gr=6LjaN=d-hy*W@5_duKXwXPRM!c7$I~LpKL}#z=F1x;uj}x6DkaAp_q2{@1Ic zl|Gc*=PA4EBfk$bz$BjQr`T*GAtBMW^8y&&wt8m51aBQK+aLK)y|$i9&_%q_-HnzW zZ?tpbN#Z1+ub|>C=!z@k0+CP^ynjVn|Hi>zwfX0Mf0vikEoIL-n0Q2AOA#=?MKRm% z>m9yGoQ3VV8(05Wi9VZuwX{t>r=N4Zf_eVzmT}0bo-S;dWw_(r>2GBiaFF-FA7-9r zhpQe$no6d53<^qF3Y`4_Rd>0`Gp!m$XwfSOCwf9qOe%}$OltVajTCt}Yj(0b47@P}a?QNG{}Uf#9*B%5 zQ>tMMcb+jUEiI4D?aVg2^aF|WfJ-%y-nM8VMGyr59MYR0RUsuHi->CqpkD#^0`MF= zI^G8M`k`3zoTBmdoWR6da|v15+`{=E!E52^1SPU*4kUwfp*qc}WjGIzz(6D@XS#!m zx9Nb+iWVD^;8pU*ReB#EAM@(f-cPU~(I7bmIU`<5{>JX=XbM@(h532IBD{HOVH72r z)N!*$^opDrU%r83vG|B_(w5|b`U4!S8JsH+*&DD{AAXtTo8hQwxO9mvggfI^e7cy7T8i3t z|CLIUt#tl{e*shALs4M|;kbFBo;!KHadkBW$hfEq;H2#8qh+f9X3gJ(vOkwDvQSQ} zKh13q%OHXBsunZgL*G4ScV7w}u|yAHgk%CmqUf)S>dGofFx$!MZ*`gSRQl`th!vg#vW3D5L8eHF%Z>f&NNeHeXWqD42msK-hx=`Dc@mTdjG z=o-Lh<;5q3)djxOe^k$-S;#Oc<{VjB{^L#l`VTICru`@Um@^${S~T^JH5GdL&twDn z-ZSYkllkGom3DvpJbvOcsSW$RnhXX0Xphmh$8R4(9KyZ6exJA7Qo-q`r>Cr-qsH&# zDl+G%?$pI&hj-LMYTBoAC839hm`gP-*Ig{aD7&v;!jK4d`U2khUjH>h>L`yLNt5q3 zwYbG8P)10Q(d)LMkU&PbXKC>X{JmD8$CNHnQHN&tQDJLe+GQI!0=gcinsKJpp9<}| zWJq_3QG+$b$#1pC5Q_Wb&3Oaiyv5ic)KLCVBn6tYO!$4C(oI>F=L=x$8~~OXC=wsZ z*o0XH6?)C^VW6fnEam}8W6K@_=sj3T3Ax|`1}{L8(Pd1WJV?vR;yd6FiVGJ{r%!o) z(u;f^cVj$2?)`vc0;ED(!Y}!y$iyQ4Siwyu-~MYS3%@`KCJAiZP_vB23f*Y$O0?oV z1JL}hT+GbE@}wg4yJ~`A!7@0OUP{pV%=ArJu<-93od=cZ`GzDNerSfDzf4{yEbUX> z@sQ`my@hKL>OIRYC|5r5HD-AlIc7PwiV%mt4~!RT>2c=M4e!0KflA9>1c7%=OKu}< ze8tDvz={Y4ZGY5;doarAD^W8I>kHrdzxhI+w+X-Z*|&*WpU~G!FJypAu{^POCs(J* zll*J;Qg5ThHhT)RSUFxlzhutl>DI3MfwZ8qR|zkaiGzNN=8tK!Omi}1qQz}e;~t#G z)0LI!6Jw$TZ6F464#eZkdv$chn>BIBIvOovOOeYV+WsF!=NML58%E(K+fBAzlbdYY zoNU`Q+4f}H_Qc7yZJXczexClEu4|w7-4E8f7x&}}q35x1<9A|fXNP%fHM5B5lo&}S z9>CEujDTEILqNBQSUEx$cqB19qMuJKa)wGJ_h;wTiUR3%)-6bhd|$YQjtJfdFn2dJ zfKik04ZcU6dmX0u*lq)N8Bv8=B^gd^Vg+P}&SYv*f_I(JcvFeyPT3cuJaxu_qeljB ziV{hY@k~Ahopy5}4OG00aYGb*Y^~K11K_P3IlAq9o|Og;BXS693#*Z|q^>US2JeOn z4ThfY0mfo=SNQAe>xsq{bsTRKGw@dcxqp9@`C6GAA+Ost#?RlBW%Cw0Gm}6J|9j3N zG_va@t*lWXn>b@NLWW~kR^Ej;>ereaR!Rk{UY8m}LFAr!O%N%oQ30v<;gj1npcb|+G-GAUE~%#KSOr;DOU*xj`9FXz+&f*s ziif|D51%Fc4-OqTV5V57T_YMfS2pL}!#c2UBvm4ZMS#_KwL&jpd(fabkh#m9rm3>5^z z7+abXs}f+4-(d&YW8ZF9#*V1xX^&gqTtXvE_eYH%T!BXYP%Pg4cj`AGM`QQjVZ2wJ zu}aVZS8rr{%yagoQ~Ga!A_M>80>Bksyr1NJQs;b}n{hcGPkTHOZ*i#Awt2@}Rafl< zyz!TIzZWrvF~R$RK0jI`hVn-Cc7nG10(9#3?#=i^-Qh^4!*^|_*(Na26rC}jaWI{jlzl7=}(8T#F!vmb>1j6_i0 zj^ZQX^042_AZ_oif&-;%{&(60k(CmEJ&d&C-AE6vN%&L$>Q&>cbIBUGf+1Ar)dwmOOtJBA zn=t|w@Vb)$>P)WMGpr<iNM#&m!JSX!Q;|7> zFU(5YYVAXrD+}S&n)Oexst0YzUsJ|-WJyk8A;IQ$aOGF3#%txL2zM|&b}K+$O)_Y` zNBYYXi$6^jdNR=;m#64CJ(Nhh?$%7duj=IGBafOg$iCNAt@W^ItFe>&m4@HSYo@>K z4|#lFG=C8MDvN!)7jyAq7cD?qW*|4DR0oL`d@DSKJPYhC8@4C-i=G@ z@>h|`(Iq4+tb3@q5Q)YYi8>FJdAo_0r43ukMd||mr)I7Z#2~8@IiH!-)M^+z3VMQk z=?7Wi!lfnQ1ZFSVoh?R0rlyV5w!U5DS%&Y{b7;RNiF^xs|szx*CQ ze@<4P@mvk|SY5cD-p3#!ClkTMfqP*}J{W4Jn2b3@+O!STp$)q35^N2)qNc7dcR#v> zlm1NcE?Q2B6bVNqkI1J=_{9hkzF9o=ho$7Qe)09AZW4PO1nd`N8sw>)*c+++D3@1F z*JDTaL-*7h&-sQEuORn?N?YeSfcgw02_^;arY&aahVw#VmPJal;L>AAE$OqpYo9Gc z2gr_s(0$PymxEZs+S<5^SPpA8E%E=1r?mhF59jr(;Ev#sOnfu)Ju11yC@BBY52?jxE$ z)TmlZ#GU98OGD}Qux1eB3PDF4 zg#B|I5%5Zh-k`_h|+*C5c5z zWn-UGORYy8ohW_xT2Zp%=N`9l){#!7yR0zifTvv+Nh&kPBd7nWIjf~io&3^5_=eT< zO55`n*nHeDC@t7!xIa8N1Cwr4*vuZS}B|C)@IXt^3pD$fS^p8PSQ(bb9RlR6- zLdYnc2B;vjqLtkU7gwd5VC88s!D-V6_q9bW^{m(Vau?h`Q_@lu^~ltLSKLSI_AI#6 zrC4Skd{&3?XSGGD_}Zy`bBqRmmHJI;-IL9-)oVj2$zHEhhmRin?)qbTLttQkm0Y8-R&}YZSKvz<@T`DbKL)=5Ne~ zQH^?8>v#T&7NVQpa<;3P8@GcG#m5Z{DE0zcuLCmkG7349Gu1$!yT z@lG=&-!1vtV!YY$a-B_)W>G0+z+!^_#p6&4e% z7EfCJyF(`ePaOqcggr^Ry~R+j$DA7aV<{(xSNGh?PkL4mJji6fm*760GS_|RG=3PP zLgafYaubQ+M>U*j4unFaVGy%)Opdp@QY5?t;?AY+&(^C=ua`vr7c{=dx>$$(5fq-Oj$f!Fcizaq$zuK)H+WyKbw_V~ zWNoo)ogsnw)oH+u8iE`jo;DK{Tzv~VUZa;hjh3{ru3h{WOo&K{kPJhGK-|pV$hvJR zidr4Q6ah1tXpM4owW~~@GRo|LH`4;wXm)Tq8aQILY1%L=OYov?vD7sW7d#VZDT>q$ zp3We$)ug~kw~G zEJijJWek_xk(fd7EABfwEnB~N9#?BJ7e{(@`mc)sgyxx*2ReK7l#&v78JPvF<8cR% z(dD}}0gEi6A~Jit1XIc$_FPsg?uPeM@ypyAQt>>U;kKwmWYE7Nb=@V=TkioKFQ>F6 z9-r4tIct7VV3b1^6VK+u!uwE6Mxn@H9aTU6MUXM8vEYknjE=2lGErv#jUp6t)@ulx z%}terYSXG{l#J4GgL{2m>K!BMWaW%;@gH~5rpYg#;zEj^Nu8I`8^@Ae-5X=f+BV~N zroAL55ZZE~P8r?TTD$R%6*=)}OK-0pJDCdvW>`R865$6Ga6{vKe0(^yqf1ejEm&Hw z*9Ktfd!i77CnhF#KJi|q^t}D-p-&)dqfGo)S)*1#Y5Hr47PKewTW;UY);D93F&uKo z4bUus`Rz3BP0@NX|FZ&lzCf(jZ<(6<<+YvXYfkwiuKny;vxhu!X{E3)-{$9;ATgC` z^C9&`ty|F&gVGMYbk4^*F%TIX>8`ty{Qz+YS{JrhFny~p0OL$6BIWu9W6YkoQi$d)8;YqK{^}r!Fd|dvibPzGk zw|(YOWLh7H95B%SnLO&|`stDn62f8~h zbEXHHd^^T+d(;AwC};J@)ix=ltY11vkhVlzH|SyuOtZqtlLBKnZ(BmyPi{g|e?`!& zQXu#(icqj~IAUTP9UEoXuNkTnh|jyq#9_lVk!|Q>jC7U`{(r1r2R-kY^(*HPwEB_> zasLiV7fJAjfflpDW{ut9qNxKTPBLL1KQh=46HI{P821JWWWU!Xx|EFR0hGktVgy8& z$P7#>ox5=nx^2*++WF|dRENdQ<&lue&h4JKMMHNVb-0d2w*)fNV5g~EoaT+Go@Z1r zAD_m?{qTJA!Ar-=B$pbel&v8htLU?K85z0RjX5VxZ)a)g@6OG}nsdpN%tUxgkPys! zarG!6jC*N!c3E685J(`LsMw9aM*Ew8hfzqO)^`uLY_>&vVl^bO`dBS){~~KR_szWP z*K)}W*%?bVo5iCp6^oeLGa*><3u-0M=C!Eml_pl=vNE_R5*vHGy2dLFeZOM~ zJ+YcHVz}KD5}=RzSE%FMAnlzEq!I&!#=XzCE3^LBhxeD94{WQ&%Jh`)SqMew^lf;8 zG~4qhEI{B>l2Ydt*p*$c++Bd?vJ1pFXBG%Pe`dFDoV-8D6qR#Y%M`r>?wol_F`0wW z!dy7mo%07Vc*rX1Namcu6HkB?h9x?GJrztJR7XCS=P@y_e8p_#C(=)=EjEp$n2d&tC zy*xdwg4dx=g_4Gju>B6l-e-JY@%l&VcVu^Ioj24!W*T*~{#f@Xn8;SP?VK$-xcMG) z9N*3G8h?bPu=YG)#@>b3bc)GqALesE{jHlA63c|}%fFE3>X-kxm%m$?;vWSNT7nFz z{ETNdQG(pRWoUA>s^S3uEFk&lgCd9nalqSxfM@kT!JuaX?ly>+FQz!m7d?~ujo*c~ z4U-1{Tz}|Oy`7iLl<12%Up3OesK4h{4M~`aPDFQu^9tfd!Apebi#_VcR)1>Dcw1 zPiall4Qdt%3!2*2Nw zgHte&db;Kh#cI&RC)VGEw;VSyVr(EW(eyoYjXdN*=?}H8G&oOUhaxYMQMHkz&IRvL zf`NC#LHh3O#U@fkpN()4=gfwvZ0~U+)+xb>nJ5W$eNPxOeR%|Q0bdU{J%tSgK9k^~ z%)dD!n1|xzO42ei49^y;4Bs9vU`O7%zw8^*ni4>?)-Dupzk#gy=@wYqhEC1Hg?ZFFcp#+60 zG&Oinnp$sXT9xYXyG!1;0sRW-0z4(9Pzc9YGfwJcg7Rdj8|6!adB*i(R1QGt0x95ZFH2yGy?V=FWOiSN`S}%sQGzi61^Lz@T zZnn@n_33==@7j}%7`1GgzXEg9I^_MpOv8O)r~1|e_4Bq%NebdYH9yDf6knWNJebB&$b_;UF9_sQDIAG zK*kc{iO#X#dN?vrq6PeGOhpF!?b^f{LXFj;vG|~jW4Eq~6GnJycc4UgYjr&LKOFb6 zwo9xbE&3>1k}!)M3fWvs#b5|uYH|*o-eMDA-c6SL)TCxM7l)Q|d{ZVLUD<8x6KrT- zBG6>n?KK}S`@|MmvgDlJpB(_goP~u&dZHOe4G1;(-e6pg`x3$DZpl`kneR>)&*K^4 zekz|g;8AORMo%C7Q_mejWVDo43*Rd7?WGYwE8akE-L2&uJbhkr6_*qH;A_sK2AES5 z+4GXvr0D$CggztsIh}o=&hPj$=iTjUr{k(8<=+e{S}=9>N@wtZq(MYUWe7VcwP>K8 zW3$~+#O0Z4YHiwCP*KrX(>+k)`zYgmW;GyUf0NANQrA@OB6+#Nj^X4Q(}s zvvH)^Y*n!tpw}qO3Tk|qLHIq*XBsPS{&^tTD81G>p$p3oYi?%WeC%C&4&;9Z1B6Rv zgU7{Mv&|Q4oUZSjF?+k5h``bpiqN}Oa<3Khcn8)3PaPJx-@K8{(N^Th9esYcn&LbC zjko}pY?`F#vO@61VY#KrHzEb6cMWYn{XMvwCqhmBz)8&2;%tRJbT@-GtSDSV%)S}J z3`0>aaP-~T1W%c#tu|q&KBYxNmt4AlSr5m@lb?GnP_pUQ?&;sLxJYJ1%$M2KZSDjO zE8o-Dp17#5_%J-Q zTdw4pI5w=SSV`>rKfa~+9;Dd#fOi{}=}MP9JCd826*2!6?yzv~@{gAzg%tF2%T6R! zet*sJ3C?-$XLQ(}C)1@rxy$(YPX6Ry#2Kvk+Zekype{LZ=O1in2<&?WkSg@`cC|TC z^4b6P5=ht)0GGu|tPw5>*jr89FdeJKau@HCiAZ zYxp}wS{Zxm$FNCxAl7-qk;!yHDDm947hf5TJ}fA%+SKRc#I(|wcmgr(ptzv;>=aL( z@YEjyn@90SF+a3Q;}O?2?-{7c9rCYvF}Lo@md;YUCOKpJkB_PNpBcZ%YY2Hp#u$5q zw6)jh+H)3hst~j+c&2D5lcmUA&zFe-K6{}*`_>cTKJZj;VU02c$B;n89(A{vKor^G z(&qafE_%#N{}s6`vlJ=9kz%eShe|AYK2NDPJ@zOl zXi>x%ufUhI<`!2cS*Ccz#l8N2foUmT0zL^Uxj3cmj>!nJ%0_1Q>am%E;ggdKa<$Wl z3M0tO6?oDK^Ex>{@t8AqXT@?+&KR9R;&E2)*DOt=+(zQeN6m)r#3lKtyGi|bbVfXE z(_GS)VIo1wX>@RP7d8bUmA@w|;pyBa7kl_QEv+i^$u-H@aP2YF z*@DhC!L9STs=;B-P?M`&$7ox%TTYdCdi1bI)%J{YW9G8R;3`m&JU6S=78&4hAUQurx~U>vZ^)lnSttq zfrg>nQRs8|I?H%0>RCVDfBd#G!1Q3b<*xT@ zDYAiXupI8g5?p;MT}0FS$rf;>b+LB9OCR72uJ5x8L*Tw`lO$b)F~KJdUiX8O_860_ zmWC+!FBvX}b!{92kz#UU-|fLWX=mntrias%D$6OsG#+N4y?H|%ec@GAuK z+hbueOU^^DRc*LEQH`7TJqX|)^EY-x^;y6@(~+*-)qEs0ZEu+H-YeWOQtX|t!Kh8^ zKf%{>d;WQpmPU2`7`iz$u)jY_ZTE|-zer1j+dlqpr3|E&m17&cJnsVnyX~q7pWQ<( zrj^l*is!XXXphIO>})imtJ92sv*T0=O756Z*drUV_>sw8Q-I7ii(2{3XdN@3f*w)uwD&U44ANnQ@?otKZP>-Z-=5V5%wICt|YNY7WTml?MU z;?zeE;M3119F!wLbFd{hV}fLu~%5 z;3^czU|yAtj7K0dWI-vu&KA%p-%E?UBu`a?l4x<*8<|IvrfvewG&-6CwOf#wG|P7+ z!e=u?EWFj@q>5}7JJmY!OtaE;}Q)-hkgCz!s0qCH`r-z%k2nH_mdt+7y|R z@*R-fNl~*~FB5$p+I@ z;j2~j`)7*ftj8X&{;k~7mqPE%=xt&SGJw{D^m&D-xLa;$m?91kM zfyJCG%bWEEG3?mb|zi5{IUcqNY9A-GdX0^K9)*PsnMrQ>n$Xf3i%m1lL z;CpP7G)i02$&4?DGb>TA-1h^*7N*636+slxZl*$LswYDZ-tJP>8 z1{l06Si@lOf+FaYy8SPmD$%=aH1)XnMiZf?rn6;rvqwiDFiq|81rsVeVU+Mh8(p1e z78k|<*|6ffOiZ0&atw)xflbkouE z)^X&J$GaphCF$k$Q_CuWj5tf~ZaWak5~OJUXARYfQ+k8yHwFq1Xo1Jeq({?8G5G?k z2RCic$xGxe)}%=R74iEE%WLHW3?3qB@aj~~{_o-Fuw2u(t8k`Dt~vwh)PzLCqkEfLz=FtJRl zS#Ilk$N#*lt!_aws!?91;|FDW%qFewoT9XPNmCGrg;2(0dW;c-OQf~LUVo1{ z-wlDE2l7jRr3LiNeLUg8_Q+nO?bwS9fD)rB4odvy6-$WCe=VX9)Y?5Qm-4d@W786?jy_E2k zW--g+y=O9%-k30v8bvC|GCv-;$dke+;)@-Za z@2&6c`OfbF(f2L%5{Rd`4OnZw&U(7q50TwyH1?(#bD`B}rgI1_(quWr)m9C2&^g`^ zblk;`x;|os(0p;wxa|M6j$X_eM1#=Rt0$w;(da3ipfD_2-2vlsiyJ)<-|79UL1J0l zDsU;~Aekf7<2v*+t;g>afm{1W^ngEEj1k^&pUZ}5yv>4EL6YIoBtFmQ^By2s2X<@4 zEK_#fFBI8F@l!|4LqII_a)(=uJ>D>uQS)23-^PI{IU^6hdxt* zf?v45=|>caut^l(}F1$rFg_t>ZE*+eVH$Ngns@3lXz8JInLYk>Dia# zsYf13v=}rCIA=>$1xi(wR8N|}EI>d`dPS?^@DgV;RFLhrdj;9;HrI0#=srK*N3;X?C-h8rfQ z#zx1>zeTR1S2R-Kx6a{aVQiek2sUXQ9OByT;>zhtk;{Dk_ zHjiI(eY_j~denWtMB?wQ@qT9iJW=lne!5(Xx{|as=#~glqBrC^CkLaa>r|x(Fq2P1&)e8YYT7?M-30AZ;UADj0BKI$U)<(FjOU6SnK{cysNn=+((>ek1a9gOzc-nbg`bgf&CP z&%`OFo}__Am6m}*k;yDNo?|3ZrY~K`NjOEHMY)S!P7z-0hEb|Y%S$C%sAokQRlS*A zEGpxHZ6a~pm`G`7zM?xFmAb+f@LG&!4NVb=0C8r*B2^B$Oc~ z=CV+wV*EOt&{B94>Ir0k{HML6PaMsYM57H!XnjOK7Won_vV4G1!p zOb8;AbbsCng%Cg&y-EwVNktam*nnCx9Ona>X&Y=unjF+-h5QX~x?B2j<*iRD-5No8 zXBcQXXYQEE1FCEmhif-DfMHpumDbA#s?10V`ItM3cKlZ|3U~R(nG#%2O}nsRkhJ3= zxyV&h8d-W^dtK08Z*n>=6-4%#{q{B!;n%F-=lRSM7Q?*xzh`MVeJ1}aDDMMW{lo6J zOA5(d)tmWXNugCY4M{4-U?M40xop0{*M~EhetXGMdQ{1L^cpx-AXGEW_>9cwa~SovDPLR|o^)hQ{?n+xGE&;jj;4PT88({a8`9JYauU<8pXS zzp8(1zcT3i9*`YaMzxIKEDZ^4vzLQb2;~2WF#@uD_`0758SAQBz?j}Q`FZ5o5Ax<$ zCQ=u-+Y>Z!D^#Y<6SC+Qmc3+=mTb-q>y?CAbyllmfUV5&Pe%VKR~%qnPJr&`8N~%jnA4<{WR9v`v=8TTUAx`L?#ECC<-v#G_ouoKjM4S zv~0ow%$pL#0C7e}P7d%~#{=XB^wzzYpT?wRjf|NS)dxRxU>KnU0!gpH97(oHM2eMl z;v%LS&k4LC+I+WY>dy5hbzAEOK1-vxK2UEnIt0lj@+2B57Gc|RTU471n!Y^8ug{3U zQWmRiFib0>Lx^JeZs>ljA-rUp#8ql7a~W=F1$2Dx!qFo-+=Vo?`XfoyXnd6 zd!4fkMRVb%R*ab>kh}osXF1NF&G(!LQWhf~GGzIKs9$J~^qwnU-c^ z7t(_2xN3L%+4D5>=3zhOd8+vLW`|@@DyyyxM|mMl|9RSm=Tm#DPv7@E>wWZTYY^&c zGlG^poPDeyl#aXIOLC z`$d8L?VjH|8~ao9cH7b2a}n~9s(KQ0QU&wZ?x$`pykcebE!jEGo^e6Glr+DP)c8my z@;(EPS@r4P6H&Qk=r{t?TX4A}(@OZ-H1T)jAVr=FZ;L=LP+!=#6Wj50%x_SIExSur z$lGt;C&7tiQhRNn!w#h?G{y~@c*E&#-+|t4F@p)7d1!iJVGuCdN|ww4xqD9$r!SeRH^MgST05%@n{sfaL#Z+ub%!w*abn5J(9 zd&9DI4=aa1xH$B1uYaV)2Trfrah22TS3R`PGmKN5KkN*noY~d+s}K4QU$E(->(pYe+ibjaP9Q2JYNRR0D^|raZPF1>?;iMyQx*Mk* zAtEHo7gavEV=0xX0BCFSm_2FJyv$xrDM@{OLSX;U@1iT0!#8m6P(Q*cmt}9sC82_MsG54Ck-oun()Vipze`EMoAxHsk7EWK!{CELLHeh zL)mEYV@lJ|w_-6P#XEaRpWj~!wYuk$8*p_*nC0M8OC%8={KIIzKF&m=obT#}#=>2Bvdl`C3iq?ug`cS04K7$h| za0Xt$P>of{Y@V!ffaoKN*oL{z?^SKY0`Swk^-t)Wi&RV}4y$-t&FHthtT^_Xz**$c z>1q$r4m`&*V({LY?-ipfai%zeBNAemg|^|(1(67Qp|27w86(SK>kUJP+_CTHk;~m7 z7taSpb|B0X8@|+_=SKLZn1_SF3@~Oo;Nq|PqVQ^Mr)badQQQ&dNk4li5%cR*>89?m z@bQ73G4Y?Vf>c)OIEeII*j^eC%K

mK!b5BoqEWn~+dYic%;5MnOy3X+y!~<^THW z^M2|xN`@jD`O$0wQfSzrxbJbpZEM4syc6zPGxyJi&^OlYD@bhq=lj8Cs~3~Ulg^+tkLIh^Dr_N%c$>GMc6Bu#aRv3=VX}Bcu|l=_Q2Gft80rv zWmfy3-z(UqwfJ=CpP7BT+wyovL`?=Yab2_#q#!!wdVLWlaiOY~M)4bfyLZ2z5pVnY zd@BpBD8MmB76C3G#E@hgQ)ix7ttv6ToE*pnT0XnNe@wPb1S+$TFn4R*Fs1t4*fY2Gj5~jXP%W5_na%v&2+9fDYrQG3; z-tD@L(fiw$JR=?HLMe~;S=QQf?AI>C=|SAUh+RU{tZClAM!|LrpTl6tZI(`#=mmHQ zLgh?>EDsd3kE-T+r#>^wM@dWiu!P88kipay^1OXeveFM=8+Cns%}QSY^QR<7eAoa8m|L^! z$-2ze`+Tk8mvnPmVij1@Qf5d!IX^dcbWE_S=~9Cf{N*3reRY)`?ShFZz;SSP35GXQ zr?_KABzf2!&fO=2CtkVHe@^$HsvnpxuJS-!ogc#=xbEF@L6U9+Dh;DpsW3`}d2bvU z@=uU9-^)t4n}W?v_pW?9R`-;w3Otwk4`>0(hPK)_7o%_Ll)2gF6jE$}_~U$Sag6Zu z_+xR>3)^x=%L)K@{jaK#qOR5^Uoop)os!JI!3#|ussI{ID)f;<$A)^MiWBNG%7}tM z(Oc{sLcb}!{BYC-roQ;U<<2AI&k9j&T}+3+r~Z&a3`z|M=+nAg==Hmog*1To>T%TH zVg14w*DowoVz|k=YD3C0*YiBUxP3YAc%n=Qwez-@!?dJf?O zz>Gi+T@+k!8szX0R9OmWB%iCVo)P)pR;G5@lk79Nzk-DV0NMcF@c&k6K-Wp#iz2k% zqM$>EiPa%c@%Bw*Dn?9z?MUVam@O=?FL?Y_%i|o}<$X^CSTOQ->v4g8zh(#KdnZH( z=6V*)U(UWT2-qG{rY6*TYp7vyr0yumCOVlk--Xn6oFxVw85O}S515%AOf)t16)wGJ zpvw9=%t|4N?6Z^r-?PdDn^++&8$qkASHEPzq?fY)tPISC6DHu?m_5xlyaw zva+(Aot**Dwr6{LJ1|rH|GD+`^;!5j(Ik^ZuFK8>+^}Mumz6_w4{E5QR}g?e78u`eCWfkgH6uY9KRBGh9<4?I*%(8tx)*+-vvE zrRia+@YT^xbW7sd0*zG-ON7ac8PrXh$NRVNtU*DZ*mb^y#hkyfeVlHBPSnS)GloK} zuT_no;rF4fKDr%oqCCDDNuUzWPhqcx5bRxE z#!5^?J6~@L1OQa3@jj4Y83MvJF_O5-R|FBLS{@VF|W$`@b@Q)CF-1mDw z^>>_@%d+q(nmBhxD9P$x(7H1ef+q@8V=8B+-Kp~|8Cd84-FRca^+D1ZJ2u7`*8FRx zsF82Trc^-!LtlFtd6st6v?_A#JSn1B5-=@+Ha!H5Ho(Km~uKS=|Z;Y;1gzL~r3N`YPDb&;}(f_jd zR<(WmOI?alxp!G_?U!N>U%WNspED$b*Ow$mytKJ4QTY#I;)N;(bCHo0T!d}ExP$JX zj@z;<+evKgAPp=5t)Cn`L}pajLNut?1s`w;QGJgrRH6<-p1aJJ&9vQmQk2ST%2wC0 z&A_kH?}_=C;^|kG=M@DQ<5JW>j-XZ*Nl-6Vf3a-lKyR-H|CqcIo&1iN8O|1|?15mW*CIJ| z329Cr5QMF}j&4yT;uUEIb9uKAS@X0)vQ#@2D_*|6KVTQp&$nKXBt1MPkFy1-;{z)Pda1V63ZHTt%=q01aa4ks`rI&}Gk2Npt zX9TeG*{^+nv_9FXfSP3b!5%E807FXC6lO_ZjI&~`R)nKmw&qxV#_hyYfj|(tS3ns{ zeCwkYxmhS<4SK#|9yN7`*?&&Gd!h;S`8NHBA=^8!je;)l%?XQ%$Q-beP01E z`W+%rB$FR0{4u}P1c>LJ8H8_DQ@5#KpS-DrkNyPcZU)|1xZ>KH_xLS=^<_qkbgc`vQdCFe=iciN~}?mWV|f@Ww@B7VMZT9!WQK%!{h3 zyWKc?IDat(I5clF7YS{4X>UYRN%kMoKU22ZfBcJIjQU=VM?hmgJjvI6ZAG|k!(lh{ zM7Fln>@?S`N3h(Ht=;^z+mT?!;o>;uVgozQpN3DA^Xqz>Y8 zUM96)=BIixyPN6I4&n}!Qxd_eh1&>72S?Rm@rDh&y%T<3b|&A{G0Xko6y)}C5Jj|s zPwzE(6M)k9d0>5etlrb*u-UcixuN)an440l8b+9~a(daZ)~s)iT9-MH zXT%yjT*^hr6KL??my>Ek6p_!}(pVwD_$Rvrfxc)V+LllL&W9i)0&nZlW@|K_RQ&&@ z)7;K3r`Q4L3oL%#xb?hk$ZB78aMG@LpLEUeh>wDF{i+6wyTC1!JZ-3pLLt%t7SVCq zSE5KgwrsiDOaA5b4A&@Qb;RHA)*Nsk%3Q|*(@aUOQ(_Sw9aE_^(M&FC@YzUkYGbhZ zG+uSUER*RiRlXVKJY|i7pEjK=g^&&`j~R0yqYx@7`*}!hBWO8pq|=2GtnKP-G;)H> zwh{~)w-YtrN5j>wJl_{A|H~z=LiFL(;5bn6OOz<_eEp5I?gA8y6{XB_*nvM5c?K&% zdo!epINh%iJiVZ<)i_Cgi+;7QIQ`&MEMnWc^ZNoM;b$xLtTz|rEv)v5fG z3fvP&qwC(hPqx+wwg(1lYtMf%yL*w|dy$w}S%X-HDQ12h+e$iJ&y&d$VD0B*^ZwQU z9PhyTLj`yZ2-qJRZ!z_~U3NDAj-huSeG$XG6A=?tlX9#F@ZFP3w5*kj>zF)5LjO5q zHP>~TxTzuK<`9zZNlw-VVUGi~lrktx`?xd>IKo&&wt6%~NkO zi~y>~!~NGhPiQn*C5b2t7T^Jzj}=3E|8H~wHq`>s(s2KCG+Z2XQ-Lfwz!OzfRRwtb zbliN)NuBTJrAgx6(T2^aEGQ)A=33_v5D>g~pi zZMh5o*Lq2iD_i)pQPK^XR-c2EiIZT!L_oNDEy2~fkw;0GHo1=7KQrJK*>s=Cabf~t z^X@>m0bRi^sfkfuKu=?ABRi{fMmTL2c}P}!=dnm>q;=Z?;)+&R#syTBCwkc%lcJiH zJ5N2GdxWQ&S24nRbT5|g=?DK^iGEWsjyRJl+{rl9`#O}}VLC@BmwUN@^pG~Ie+AGM zjKv!bW8>iM16lOB8g$h-dNs^(R22@Lv)3gnS-L>8cXC1^Ij<_X)oScIfRc2Ea^M+t z*1N2dl~_O?6D#9jnlH2sGgNH(2ag^l1ctEP3wPEnjKqX^6TXR{kW8|Pm`3=0y5(Z8 zq34$G(fagoKmw*{;`XJ3{WXw&L!(<|A=MP5vt3`-k__lNHL!#Jgu)IS;2FjkQS+4;oOnOB zCglS%8e+qZiPApx%F_h<)Z_J(V)j|#-zP%g3mc-CzrXj2VwUsx87CzjAs5b)Ny;!BD3lK)2s4N7>=*zQeDP9w z@%wt)R*wGdD9|YX`FYtI*l*YUZ>B)J1cNIGdB8yiE2OcxIRcnETjkP6f5jSNxF+tW8(q$?X_PU^3CgnJ&?!ay?nM~4@>wgQ*(iu>!1J5)p-+Xf~ zfeZyW=s=*z)jlKtrvtG2QH)NTDU5jTp5lF4FTiEKoAgLgI}Dz~k?*ktIko~n{4*pl z+@KOrYdYAmM`5x@Bk(iTCj#ML`<}d3hE(yKmJ4b1v2dY3l_b+HEY891bVlXG7PkjFg%;LQwQ^M>}i zso!U?W~gi{RS#4gegf#3I*t8eV7IwnCKxd&>AjUhaNL_Hqe|+#1Hk=CRhFZ)-_}m4`h}$d~9xk z@#l=W`V;NLNGQO;MU;i*1m+LC3~H~kzj>~so4#Wi|HMtVaEixu#4uOZyG4(_u;l%~ zqYB1q-IThbgD%v27G_n;%jJ58W1N7I>4L|{C0Y}9JeI~{H0qhMr1ye}+A~PtwtQwA z2>HoGldbApLOj3>@Yg_y?r{;Pz z+~G&xL13ck(rv@rQ-eW2Brq3|OsLF$moYNi=0M%1aK`(^?xcKOEtd<1)>j22%1pm&U*tA*qpyqOTd=!e=(cEVK`G zJ3F4XVQR7zi|j4_v}>1PJP2eCPc*kbLnckCi_&VuOFtF={954_qE}7UM|;t5v<->Z zhy2R5!!OY*PN{b3`ci!9ef>{wRk4_Kn+*Ke`1$L2XScr5G`9n9D>fW-{Pp4b`cN z*L&?c;{DtWGBjO9!5Z>rc+Qf3RG*!VC!xyIS`$H9S&FEyhPmIaCf$$8K;^Qlmd9i+Q>8Fye_8mp> zDfzxfq9pgal7L*_z%iDkcV?Et*3%Y5y~L?wuIC^F8`(Q120Wzu$Ui1F*jE zsVPM?*G21QqJyCL!^8l1J6<5GR0u+wy2@>a=MG92uqHxS-(p12sv9B6sf1N0f)PRY zJ=PWWvP%1b_k{z_>Q)0`T1p=|HlW{S+k5>+jy z`KJRJeL~BYPd?!}RN$LCx@6fig+&y4z2&|nt}kG7h6ijA5nOUbw2lNwnE$0gtMofV zMe9c%{_x}+Cd%<=5q@RmVw2$7Hr+>I)n~x(o>B#a;}hcs*v>%5>wJmu^n^xb=4}G>|y?;EbwUAsIgeZ>;pW*I1f6s zZiMjNckvFG8Gn-CYk;Lli_sZi zbCMU2Q^X30T3FD?E{9$MD-^EG{TTkU>1c2|9)`}3s~^y5d+1Oz-QOqJB;%o*25`dS zPBYCNf1!zTG)1Ixlrg#FS&mhb_=65my<5aQkz&q1Wf>RPisiRqn<4hiM~0)d0y(LI zFbv~B0m+l^C6@UzF~ZSWKO4WJiF}P0g=bJLk;j&h8#{CXlkVpDzqiUS7^~*M+7aFl zK#zk3d{HSVV_=fKMeFrw6j4>#5XyMp7hJVhdi{klgl{lIM2&#oFp-yh64yhGi`U() z9F|0pxGY9tbrF_m9ERQxVYP#J2q-+MgyFDovj7#Hu1ZBrig^ptbKb+z5U?rpxFha)^-#X_l( zp&1h$biOiaA~uEv&R35v8;P^65eQW#eH%`l-c*Rx2PupZSVO9kDBzC$!es9lD?zYp|tXzT^ zp_(w?>*3Jw@2i@U5vPnR0vib32{9+0t14UMEws z2w$Fw_z9uB*&hAU4l|`3;kRbPaw6TcfHHTpl|QLG5+`gW%9{p?7 zvvT{IQq(K7mC3wU@NAnX?HeFTTi!#E^CxLky3Kqobg%0hO0;?wAISEIVE|y1%6&Ub zeVkM}FXc@9Le%zw~&|I(EL2#b)rL z-ano>bJI`dMkg^H3{?ST}_n$dcS*bVEvhKg>+vT?fWn>nq z-0$G~L{Ma7;v6&(waW*nG|E-te`MKtRE*>d7=&MPPSR<^d~O#+e(oNi`^{xoOfN8$zas!S0M1NQ`&htW&}{ zU@5)NTIfJ_{7L+sv<&Yn5#FB&z<$+E>OIZc;LrVZ1JL-i#;E!gRiTU~PCMbXR#z3v zHKfY%c?Wp6{RoL@k~2pSkA0Wia516AMF+ zpENHeLZYFjZre}M%@8;e1oF9~oT5=}dQfPd`~g3<;UvxZs$ueN5!GZd*!|`soh$Lh zcR@BVvlibytC%HE^V5A(n4fN3!rxAaQf96HDq%@CHOQPXqz_VmD2!kIJP_3rLBNk( z-U5%T+pn6N8Mp##zSG7uC$axY8C9ET~m@+IQKkH;Wq;J?A$ejE`!2Mdv3;5a*gsAUU4BMRh|BiktAsc8p~eu2*1=Tn5%@kg z9xnAhx#EbEW_XD~`5@hD&T?1WkHZf+MZ}VL)g8#>KqfoCwA4ZoiYb^ZV%N%~s^rWC zI26u(hWQ`%Heb*HIveonz=Q>6_7?kfdI2!|w{u`6J+-XmX#}OiRWL{TZJI4FDmBoY zyLWdbwEu~+z;~CJYg|*e;^2#tkxMGCJAP5vk(NWPZ#s`hg!MmJi&-{iSG_t)s;Y{R z+3;!yvFNTC(w`r9&AuwnV!IGCo{i{1}t_HJM!lWljSqO#fN|(^H7KRXhRJ#q0 z5BcM!e|#GbgRp71$@EN{I$kOH8FE(1*>e(iwf@~Cb$$MqyM8K5l%))RmvhC$yPtQO zkM6fBRHkgY9|GTZlG)8xW;b-%P?+H66N1t7c{ki&bqZvI#i#NDk>qwqZVktFf1yZT z03P|K?@6Cbk*qj!Y!tq0Kyt*{gjh%UKX;{$ZYTOY+0@S2;tBBAv}p6l;%ILc7gB{R z!b7nB$R^S%)MK+w$L}xN`4aQ+_Mh@U$^492kCKfzL5^IAJK=V#w*h;ft#`-xKkeT) zy6E%odj}>t6YTC{gN&+~>Z&nZ<|^ zpX__A+C`$>tmg2tJI!C^unGY3Y;D! zJEh^|?9BXpqZ=7B=kT;0M=>RJg(L5_8mhsrFbzHm-VtWvkBWH9aG+J;!OL}}fygI@ zNKyzZMJ)y7%ubnmui>;W$5|oe!^Oi-@(TEeb@hWUMwp4Y%1DWTYL6IQR66bV(SwGrtFducx2Cz(bqPUK&4n@ov;`olp8jH0 zUA{ms4WZf}ps0=hn9Zz`5t&vo}-WAEH1&8Bf4~& zzGdaWDp!1(Q}QlfXUy6REYFW{3g}4|aNN$JiLC^@G>}c&2rQ zg6$Dyq(Y`rceg*1PW$I1-?7$Lv2;w}4SKr{T7PGs`OxT508ezt!1v9np@)C`M3gS%&z6#K2QRbbn?x2fFonWH3m# zm#k8!x2$dlB1mxG5-3}9V9fDg^EkH*6S|>*bZr^@yEfFo5RT%Pj#ll~&h%w1JF3xe zis{=*B5{-tvm(8ZRGo6y&g^>&hL42!aP^C+_h;-%3dk(1hyiP!{0H-MXh`i0sNyJS z88HY(1Qj1O+zK_csLa30VbthL{j$(!bXeW^9jBq!quiWcV(>OS8P)5PaI)B97$uoy zQj|xChDEnY_0hA*Os&W_)!Ou7tw98Aik5ObvYwX21ADS8D-Vw} z4vpVnqpp^s3re_G;4&e@(pT`W;Kqr=5bAvaiT zL8$-*3Sx|WiYA#0{fP3Am%oPw+S-Daj2IoH3<;)Q=TVCq`hEB|Ow7NM&Zp;$>9lfv z?|2;E?{l|4f*Fv94TjwWZ%`9i11M)QVp=#<5m9muJxz;k#}>1zGbZ#3nr2WxRoEU` z8J%Rfza8Zo6!B>vX!bn2TdT0u!tX8Q`0!*ZRFHA6MbhQeRS?hW_sp@wt1_isQl!<3 z0oys}Vav`un0#nP$;V`-Gra!vZ#t95)V2jWX1G z0tpy?w?ta;JZy@|Vp3HjntnvJBKljBC7X6GSjaD~*Yn1W&$-90=3}5v(L*A*ccA-o zM`G^#TNo|mlN0gOjwk1)5}ia9juY|R`oh#U#Gs^`YIurdl^{FKv;bQbiOE1mmPlRW zcm)ecG}1O&cf4k{j7!?6iu^j^n?GhHP->{57!vN`7}KHyVHq#FFI#`1($!$^H6nF{rFJ8!aI$Fflp(P{ALz?B$QRNs zKS6H&IWgkgLcfMMiz*TM2Ov!M@apdq-)X<`=P3ubY(A|b%yNSMy#s&U7?i5WqAL3A zoe&R`rfz=M(X4KOEkEY{sq9iLyc!@qM8r%955xHk(Wl3&YmwJ@nV5W8+z6JbNZSt5 zaQTU)2B%|Xx_HjM}q-@#O5dP9NU zdtaO|2NWxY2=O+^Axxbi7tz)`JbrAOz4SH{%Mvy1@X=pHtXRpjdW0UEh2G&xlX>v?5-a*WST zAJ3o~YYj|IQqnQf$L8R^i3YofCCX5Wpj`dohCJ z|I)50{d^W_Hq*5DkRz6bkK6etzj^=5@EA2q16^246}V(Wz+{N8_ieQFG3NbBY3K23PVGRw8k0$B8YecOi|HmT&E zk9&~FE~G&eqw4MS`Gw#6eY=3J-}TPLt2bRPwd}Ggo=G#6MTPBedSb5jBI+n$t?rzLGnI44s1T!c4qob;q>dMBOp6FpTb2jCf_ z3$d?44r6CBZdF39Fi*WUT;U)8)vcO8@+dNQm?M$nlaiLSwnAn_h{Ga8k;o~hvNPDliB!Za@-kgY6Q5)Y@)6JuCY zG1za+ZbAuPy~JaaHRvmoHl$k@;#r<|BR7D{ac?3lut8o!-?{+XuhQGJN__V0S6PTHwK8knkyxb2IotI+_I1%5%Zq|JZa@AtP? zo^nRrR{LUgdhNGloIO=iU|3$||6SOOBUB9!!$t!eM!=zllz`6Oc%z2_ThoFS>G;dPZwa{W~#4!G|*RXxh zJq))h(}I&8>+_83Y+6}(Ji6*H8mjldu{{Iq4lxOGwR%Bi6vRoamcIMf+9&Xa8lgTb z7Jvl^bS7}pd4-B+9fd>x66^05f#APA_p(isb1<5!_(gE^^V=YbkKen~mCXuK${+XZ z@JOs|BGw@h-Lu?&)&76vIfu0E$fSs={oiUHtL?_M@;dJzfQ5s-Sl@jx8@i6Rdg zysvsRdbw~HTen3X5o@+-(3@F>Tl}!zLOC?nIviV+`5MIg0{dkluE72}Y0><04_XiKCwQv*by@3?WC(dT$*)BXi&%Igg!>R!nRFIJ?EMU zRA>!p@!YoBh39J^{6ZodsKyD@EdtAY;`-Wp5z=A!xE8HVF7GKEuyxQ${=RO5Zd zhqude7@z&?uUBjJG6OmxCc`o80s`{%$;Piww>NipTuBt7KAVS=+!#);XErLM+I~F; zj0Suclt3((gg4h`g+@Jc)Hz#KkUFZ`t_p7McW)aq9a14I*hNDh#;DQf$jf5#TM;HI z?iV3fo3BJ%d$dUuu+Z^Nk2h~dlH;ra44%J{SMme$N9o@o04~%+2}RB1yB@?!dW>kq z&4k_rf4iW5&7c7wFLf3iG6nA=56kM$&>Nxdv3~%}O14LnY8AsTI|hQI{%<#pFS7=| z*KdDgYE8&8mF-@CTD;$2lPZxVW5tHe*V4pJxb{znUvGn(cR zHLgJ7Hkca*`;AAdACH>JDZ$qaKB#94KbGP>_J`G&DOkklw%lIjcY0t_Mf&PK=izdf z={W>Y#8f-U^n4b)q6SS)k z7Q+C>WdM;BC#yoQI6JqlfFJ5oW3ynL91!qmIq5P)C{O zMmt_WbRr<~_e>`g02mBFCn`n`qKgIIYXKDo;+}I$t*q8YeJ-58P9%de3493J_kUzk z=}R#5<}J51NCT}g>t5E;ji*KvNBxr2-dGbF<~a#O-@3!;vLtWL+M0gvI>SbpffJC% zZiCMNZ<*^MC#u2_Y7-A;O2mu1P`!T?%?AGA!>G!}-B$BjSMl$qZ}j^>TFYW8Ya1{G zSXTc9yjklVZY@|q&mU*^deWE~@u3e{RWsaNj7ej;-QQn#ddTF}Y?8&K07(Ih%T>C# zX?Q0pk6aZuFY~*&Z=5RjFl%X8C~%3Suq{iG{$Nxv>Y32{d?~m$$NX{kdsIW$U&{I{ z=WASd>L_CceEOdIfNY-SUpt=ZEQ`@4#4tQ9SOjGtq&9TBWkZR~e85=+6RRU=#ly|W z5d_dtWHjX>fm~0o=Rc^;*G6D&i48IFZb>BdPJ3?B-yV!T<6;n?|h7PRmM;*Ok_&-4;?}KD`v{y=X;^fjn#= zxT}^AcU_l6<5al8^EKveiY^E&m*u%T4B{vTMOJ-TGOosoo@f-hF*9v}sXu@(Q(_v+ zC~oG>9cxkbUOeP&BTz;v_{sk?@f#N-eMqKCevW6%4Y0t-f;?0XswD1#)tkP)eq#ko z#4JEAYo@J7FURZBhc5na-L~h<3m+ExpLloc?fXCVMh4scY-!ZxIkylvVt&QPW7)Uw z<9@&#zGUv(hYqF3gPw*u32265gP1*nXPdpj^i5`Ols(fEE!<>~5Tw#7*2eQR~aDO>vIV)>^g>;nB4~ynXp2!BXF4~&y84lLhxj7M|L_-Zre10Z0 zo+N!%M(*Z=2C?--)hYT6>4@j+IQS^drpGran}b32epmOxQnxp>OpmC*EISa2nw*qC zhKMQ3!o>xuHyOr+oRSzH92dTh)Oz%;BL}_>C=A&;`~c zuedg3@l2qaMEfQ5wQknis7i=LtYq-5Qy}n0RsEPXy@j#&VcR#woL>puRc%*GT4cpT z`Wd}`7P!1ob@l`ad+teC*C&rxN+H`B+W0?nglk9FUtU31z<&*~Gzb%F?=_OLt8t7r zgtyyu5^q6at!w>|Q|qHAA9UaOuw+rcD2I@MIn#ivdI}7>b{sg&X9vS9ovFi4#1#wl zz;$M0LukA}7g3CPpY?kLvkuj*Z>(rO6r#?RS0EYSiADjvi{|&~du$F}gN4C={=l~D z#njic{+A~gsBix3>ix>QL;3QPgYrAOwgPVN=8*gRPWx;4zkMsAabaMu`DAjN~jDk=Dso0(XnPx6jMdnr) zeWNZY!K)Iuy;C9G3ek`Arap{*7L?YHC7 zv+eCxgJJ%=n&uB;6FrAq$`8_XDzeuW@7Mkf9$>V28#g|F{!%*9$t{&yNa=ThDX{!1 zJY6wb4uj=5Y}39fk7yoek~R5|b+!)9M@j1p?$Zg!Z(TgnAv`lhKJCVR$Hq`PbP~jW z31s0LKPnfqY$KfM4D#2U?xb#dpix-R`1s#1X`vc|;+M$V2cv$Hv9JbXGktNy#W53>-A z-C~$4eJ`CAmxmfk#VR?&q%sC&QRu>t;)l2i+d)MPSEQ%`?m$#XeU z^_K1C$L~c}?;A%k1zG+6pInwiVWh*Re0lHQ@^)i>{#c-VnNw}je=cwiq?++W_Kje< z%L&xffnt%1NyeLz5yaEeQw{P_j#KF>0aHN@$M_Pt;;M{c7w{A*DLLfANf?N@RTIaS6rSqEzO1#Hl*ZWt4aCtPv3iq;eL|brF z(*>b|$->ZrwI02r9VO2P^9QH~2X4w+GZ&(+1l2h0d7TCmuM@&7yJ-2FX@)ra#`_Cr zp-PcA?!;lN?oKkj;Ov)%QxM+0SP>3z7q1rN<+^QAmBWFKfcj#_BHG{~he0DH*X3$U z3{G|dS{reIlbTq_HJnmrsnG&MDu#Ib=I>$b5k$Y> zL>#uF74Ojf6T$y25#ti3_o21R)iugz#eh}p)B1>|44Dk-PT)%Y7BBX4TZ>MSG{?&T zFg7{(?BYL8G3HQ|By*dGbuoxDIFaZ;zF`+ssBIxwnk-!w`uF#$e2DqLYoBys&I(@{4LgB$*U=tfhyp{`A9y$Ub3$nQd8X68m)t` z@5#=8KCUZ4U;|h`w^9EMMSZrSykjoZUdHbPc@f;?*OJYh0xO`e@m@ccco^RRIcTec zoQ>?KyCG6m1*rFF%vxsBY-Y2__)UPgBq7_5CU^3=bNwAhQk~j;GXNQU$ zbdD7DLqA+iRt6^oP)QVROu?MKg@3k?csMk+hd*l#PZH^tOFl6bn6vcK2Odhtprt-s z=tJt9PWb34$X^8mb6=-V^;+wLgr62L;=m7R>66J3i46qyKB=;4WD-G(~Q-WpYa?&heleAX~n^EJMW&xq8Nh#uN*)dQ0 zBJSILVXZ1Y^Of59svK`rDN{@`UnMNyO7CewJ?U_M83Ufo&8M42z}41!2LWGfzP<74 z%nIE~v$B34w31VyRhLQH2`Mam8Dy8T1V45;ng;8Q=|1#0Y^1gZx?(1OixV?lA#|TF z4^hF0uK(mhQn>j5{ROhIC4l#pVwwFOAAj&T?m}*?V@gGZs(zB+Gh4{WOB5`s3O!1ADIg4fSd_3P2945@UAxh3FuQAieLih zDk8$BG6mkrol-yCIxSx_ew7qp`*dOrIp!;jP~EA^y|bZVGU2*K4Y^Y5*tUOW_sZIf z9(Lr~MEZ*!&b+8)H8sG(9Zi=dil?|5<=#C(EY#0%&-R-j`QY*Z9`WPZ2Ct#j;el-p zrAFjb%CFRzSf{xZ(i#98FfzY}hM9AsO8*JyBGzmD$qh_~bG;B)l*y7vAWZ^zcrOKF z^_ZmqbmGlammafPwT4UrEFD$N$rODyXFrFI(mlC_+KaBa11@2v#ZRU95>s3L_N>fO%NR5|9ltyG6b1oQLnn*s!^1bW1Zqgh@n== z@XosUEadr7_@!A&Yn8CBg#kRuUbxm?nCo2?ZagG=#(=89y{I5g5rpn!9G)01PJnIV zSWK3C>lD18=w7rnWMUF`sZvpI%ey!)t?>Ocvn|F~iwe`G%Lf^fu0&DJ^Z9@VtH1=s z`r&(5OmrR^#Gp5)+Sd*czvmdN0b5O9qicC01yzoKV<Mz zlC5h6E-f2Ivf6A;Vl;Zlf4`)4$f9%JaShM}*ou4OrH*Q(0Vnw>C)yk+QL&oX{=0mx z4pJok$fYK~Cq=;s{|Gp%XR2d_Lx`7Ps$tTelDZ9kyJoboHO}wWg^z2pKTvV*tq{#f zkxDgHTdD6)n)!!+`-MqNl9lm;Vv49zlHE{K6A!pMks}6LSzFkwSXAK7Bx6jSlw*mK z74JQaeq3{b0BuNAfV;I^oqkSZ^N?C4a_9?C0OFqeM`1AKA653*@!5xU}-wug@6H)#;|8yJ$m3m zEaaV_POm_JL6=-oBBykC2FmQyu~EoZHZ(Sd-n<_*Zv<@Ev&+l84lH(ffsIDviO|AC zOCURw5~4Qicv0kj<~EowmJun*$P!wjuWNo*-vk&;3&U&RUs3^dTh34pLcl> zoi5|ltC~Wm_Im##^S{LSns=pPu+GRqP070VWcc9b>W1Ak9NYD(1HGA_Ly6jC5wCjD zszkc8=NVx_p$51>=HzqI1Dk$tE{JZ)$~LFD{p4P8ch3oDG!9 z6@;$|O1<;EN}hYL@?Sad9NMW&$FT04AgjVg)WKXP1++?FA`7W=z1+)Y#cUEa!|~lA z;>kP<%!3;kI`y5!n+&b(DO&rNs6>_wJcvV4Jpn)o!7)3?EuhpA6uN2s}b_4}yNjKxa z;0DC7?i*z;SnCQa(cyKFT@ZIUGhxj978HSaA&ZNIRRjit|+FRUr8o3#=Eo%)RM3( zI3@i3i6}zo5ft&XAn`QvN$W>6p`uhpxS&1NjS!1y);(vhp3C{ff9=~(Ua4@Ih8^X; zdW^UhW+h;_xn>e)^t#*KZoTQXSdyIzOOktb^AR)K7*`RB1 z5I>A%eNWXsPPL5++vR}`5FV$0HNNkmI(0Oy8XN8v8i^IIBUM7iHhD1bpHY>DAC9!$ zY{|}7qq!h{mgX6+OLQa@@UG1-O6554Ehbfq{kZyo3^aQ5xnYVXC_G0~79IRkUzm$^ zUhz1xn#62FmzGJREx1J9e5*Nm_YjnaD(-VYzFUqtq8B7jkIF^kWQ9stRp z8(IRQmm<`xH*y^a?Jf_qrTjL|UI$a{NZO+UOLZT3<=6MGOU#PZ%*YohBzpX$ z^O0!-bbC`C+NncBmX5j=WKQMe5c9u#%?0!i+J8!(mBT&{E_)*EAuxsu-TM@yIFWEV z;aIG$vO1Z8?yeieW{xHCuIUb`k?54JrgPjZVN?=>qWTakXX_noF!EJhREILx4uK54 zE%5Bx)^N_>U&2z)uS}wDllVspB)Vv!YT`!%cNQ)f$=Z!ddCr z_HVE4=VqKL=0 ze1NmdwXom0#`bwR4?~|f_A5!+Uh4angnfs}ud}M*a^n$h8R2bImON!0HKb48p&fn3 z8${%cv<}X((X8sCHqd}!mS=W~9O8tiC&Rq2UE@BuUCRli6hfz2ICwutp;BW(nF)@vfdVy0Op%Z9X1+CuXC z0^{uU05%6&jX1V!5F(~;=QK@@q`fcHfTw*G2gb{s?d)r3DZ0!38D|tO_?;8tmY$JO z0MMy?gp`21sS|Ni3(=-`8KQ|~+dSs}8c zSoV>z*U|k&FDQ>q-ZdeA;TKR|AGNhYdvSH71}67z3EcfwmGZ;OB;qd_*T-&HS{=l3 zUkqm+T~adMyYE>kAH?6?&`M)Q-eOp{JdXwqB;C*J4Ed1pjP!=s;C@rd;#!i)w;8$M z#r$H?n8QJ{L(Rc~jgezg#akQv|NOaH?h}s3n)`|C+*bQd^kZOtdVd9hp1FAmdpasm z*bbm#fBi-OYwn&wkiK@^Fb6UpjhdOmu@2}<+$!~P4w!6!n1uA_lhV+dl}RC~7?1C- zd;@tfg$%?a8kvWrj<1^Pz{LPx!S)k#^pLOWsrT$YAB zZXstzXrw%aI>D5AxkV4Q*^!;xHBs&c`19*4${k)M)(_1X;YUq}-G0FnUM^KpqV=?o z#*+J@*h5H6-f!&r~=119l{WcsEj-heAf_2m8{0^Ey?oRxwTK%+9I*W}QL zFI_4i&X?u~n)*?*oq0|5Z^@g$wC6LsJ0@%0q3uFfJ(sppAdLuJ)~Q3|Nd_`rx8^wG z&$%tt0GmqJFDqQ%tYCeQz4lhRQxB&Z329kUcYw~Sv9CTy8mc{V*eBP<<*cCqXo5Ml zP>(rR|BwS%0XEZ8k7$+inV^bbI=(!xdOtk@D8T=DumC$gTlxfJ_4|R&w4P@3;+oHi zP|ikgZs&PBLNQLK`{@pQ?jx#fxxNdi=DL;Omr6?j%cg}CHGPl_=3g%5OK6L@maLtp zBsf(~Ov@o+1I-j)^gJ%4W*PBAjj~kDA1!B*lg58$h1$?Yfoi3*yVjtYqo7;|TS*^X zx3qk7fY#6Tu;-i(Z<9<{!qJ|L9;_oGv}Ll{k*dC>Jqh9E62|*2_187SWLS|!fNenE zV|{3EZ_g~?@HgB~h+8R|u52-OP*4!DuwPbxzsLX!W$Jjn`6S_DwXT$h$9>bHdG`;R zm|e*fojBT{6W+s+^pc@AHh44Cfb+O3eZB@d@0HmmGnft?_O_TH1}eZG-cG7k6`W+v zy5KE}v)a^zdAFV!iJ$P8IZa@4Vd3g!fPI8i7E0LO6B4`88FMLnr7-u6=NfQu3a;y$ zHdw(UgkAW)Cz#Lr3drGYaqoc!j2 zf|<5McOr1aIGwBn%_q`S-Fi-*CE@QrB+7*RZtD;)JwF66!cDjkrb?+Y%=|kW~m#<6`FJoM5~$(pn(2 zJ_*ECd0?Y6Ul=T|d&UF8v=K|w8n>dW;xJSz)!}mdjbi}@&}fnoKBOoG0nSN|&zyE$ z*Bw(rQciO9 zGxhIiITy<)N5d`n1QUZn=?Em9=^-^r2Op#-_rX4ew7NyZ;z&?`0dXaUfB{xp+T{tM z^5Vhsyo-j}DO;kODDnlR|I5hugK8EH#&Qvgca9YC@F7)Xa9yNwvUgxmR?OeTL^V@3 zf*nxDt{3T$F&4xP;Qk#}r;CRFg`G}e(#3?{@Z3c!+O6~3m7L*8jm9Mcx7@gc31nc> zf0WgH{3X91(hpc?fr7sjjvlhW>ZTN+UT{LW?H`B|4}J!I*McQvcgr*Uj7gcH%6l#; zM8h_Umw~wP!7Ll}Q-cPRuNCgAlSW#9pti#wYfl0|}A?tQJ0aNp6lO(#1UPH?%fS&zJfL5Hp?n{+SMBY4Xs=6ul z1~I8Q>F0*_l93eq%fvzTk(81)fYV$RlObr%Qmb*jnJ#UX7PBiXH&+m}^>lJrw54_Ix;OCWL|A%QIYFRhr z+dTmWJ3G|nBq@5w^sI`;`pS^^E01R{_jgv+^~Z5|S;=qeNaUFV4hFG={E>~9?qwlW zQRrJ^Lm;ZooVHL)-7wl5kbLx##m|fHStJ-b2EU)8I5!zLc<`?^^1&0Fxai_;;t*>2 zOGT-0PDtDDQv#FctqH3zj^3Vm5V zLyblWE0n6mt~*qyKlBKreB=Jmv6w;R&=r4}e+t7@b074-XyxmxX$rKD=bw2`T=(KB&o%rKmb6I<6XNW6Qu$SUn~pXps!zR zT7K0(P$>b`FW&M!?Bk#PZb*|r=8L%hwQmBWx+1ag)Gb6`>M;wd-ZoZ=B2I=5DbO(E zOoc9$0N{e}m8%g8yG8O;B_c!r7f`1I=8{)H`cOpK3p0|&51k`!I(Ys;JUzG7wY*n= z8JI+KDJTORI3w^tWryAJmMw0_b~ukpjY?Ute2NKru7FreVd{)%h%-}(RxAMhu`zd= zN@alK3Dnz~j=zKoIM@1l)gH5Om+>rMm$Kw>y3Lo+my9M6y$ms^3Bh3?2iCIfq-@$T zBW^cW^KW?N5Z8YNF zUx#CVqrb~79@c9rUY_*6!j(z93}9@I*ZS^ph0;{c7hd-_e(=_1BPL|LPy!R1t!8k& zZ7);2K!hLIq(!>1R}?Ow2SX{SoH%zfqV;{QO3%r!ek!Z&jue?IJ!R5zF+b9sz%Kg> zK23s6K(XYlf=kl>vV+WO;2YDvv)5o3@HJTAnct8hLSz?zfbczQ%&1;kd)H&r$lF)+ z5TaOViyien&Y~keY`T;U19eU*ng&0kn{Bw`fN1;7m>$H;+1c5-rhr~`5$ zZnOZC{_xuWRIz}(toP&QzMA!$VbrqE+0=j_#y6Yxk2t3M%{PrPgu=l$x@03cle5g? z+7c!TvTP*4;U~UnUnW(Rw(^F$%m;wK_3oQWwui2pG|y{hr#j)XdbN+fB4=9JZzA5( zxmv~TEzONIa|b3iK;Ju9_3ODr@YLkv)*p6o-ZWeA2LQt zsQZ(DaB%Q9$iHXyAIGoV4xWL)$x+$xNV)k+v+)$`Hp-GYD&GEW z!Hg0KKW%%- zf@O|tHbUDEi8H{iUj?7o2)JKyZSlX%#tQbu_W0sSg_aOLfp@yn2&j-8P!+C(-yY3! z1bIfj`oGX&8$H|$-*TNTZGau#U$1@sE*BO#|K&{*Vs^F&4zM0k(Di<3S>?L?z4;FH zekt57$#zBE;DJZYIH(KScMe&cEa8EaK0%W0C|0lZ2_AtW_#1o6UmBEc#Ge znj#(6!CDri?T>2^30fan7B7y#>YRuJYeE06>JAI*?b#+mfi#Qbhck4%_h3Y-_faes{{ zQmkWSY@1}KyNSS8P|7s948LZ+fAH@$`s2bhQMT_U{jDi(WwlH|S?DMSOQzHeo|F!~ z+!o)_A3c`e#F8_pGL65%e1PKmPsBt#oa0!=da-7Qq;HG-I!&yjwAceUKdK zqFAtNcvHVF8XvGG`p!)Zw;OCrb|EHl+hqPHt~~4WJV-W%3KIIc%$)fFUpZiKa(~~J3WjT zk$N8)RWv(lP}Rw>GvXiv2{lr>{U)QdMZ(S2A5cd40Fz_6&WIvb@Q%v;Y;81D0fPSk zEn9winDZ_VwQi`vjl<&%BT9qSAr!Le-<|Bq>!2yH873BRq7B_K?J~y3yjsIyDU$00 zzsv?zgK^7nXa>81O2JE6<0Kd~h@a@#7R4j6bP_xNU{a(<=wo%|^JIL+$t>I_*v zaUqehD;QIN)B^1YzNnKkMI5>RTmbHx|Fehxa46I2(UGNvqobu8w56?BjA{#~6}8lj z9y@L|C*WywZWkaS76ely%f`zVAN~86^|nqaQvxg#C@rg1WEFxg(}#_E-qy0ec9i`>%oC;SxwIp?6nVA44ihZPOQk`6n#!40>kN2 zQCM@bR54lnYBk`9Wd+5@#}XoT!-4?WW)Lv(d;Md07Y2&mCu&Z5&OpLHbDf{FH!N6= z#L1Cx>$m~FsO@-)sjlBXAwRQIR<6l&v5?Xc5tHNAaYh88N_26~Bj94hxf z67kx(=QY2Tjb7oqc03qEs0k?cKGdUU0Z(akg!`OMu+V1r-O5SlV&ViC&uMW>PyO;5 zPyI`Sf>mg#Y}Ay-!`x?oZm~JDK}&t8Z{wbW(-|^QECyGeH+aIqHgZ3BScoc-*lOx=LVsv+oeYMBp#~0n251Y4c?auvOD}AMbX)Ar{M_AD=nU~g0ZTQ|6+RO2k%sU@ zMIQzz%iVWQe?ISx9VY!5_4#$if3(GpI)3{8HQT~uzY&6rw)BS&V|kv6R_RMITzLup z1Ebqr*0mI!$>)zx)El}>5J_3ncI9lbPoZ(^ox5#{?Xuu$vyPyu&eY4bd6)lV>71iF zd*830t;x1M*>19%jLELaw(Xj1O}1;YZQHi%IiK(E`L|W8R_}A}`@-I@O(mQ6*XkgU zWf^Bb<_RZjuZL+MNpbc4&L$t{t`{cg(5(AG?OhQ~_lGySh@TohpI4A8-*2K|k?*!0 zTAoZYa2?E~2Jrik*_FXsM?7Ib^6_$$9J)AQKp7kw;&who2Z*cy3re|sK{B(Tgb*7$ zx4SzB*k`0?WB|PiVlgQ~A5`LnyB@gH5^pu?OfAB+)}B^^YVSZi*ihR)A{t2w9UVHPiPnA34Br_o&Z>)bK~vdDuaaX@ zIeX_)>fqMU9}35)A*bo)H>r>3=GJ4R8NZ)TfaVU`<)OyR2(O;vDgjS3nw$TYRGh|^ z8G$S~X*$zBDpDvnMLY$D`4VJ>oWIhdgE?RI;d#OLQQl|AtShqJ6Fe!I@;ZQmp>m1p zg_wDdx0eNsmQFNZ{L9`#)4Qi&A$s7=pP!jtevo|gP&~DHs?;dzpPj9Zq*sQ6RFZ_s;{g@JYeAVH2 z)A`Y^BxJ<;HO7s@ERE)TQdYefA}c~;lD_i}(yd04EX5h%yto?GU^AjqG>BJX`keE% zn>DVM^7KCJCKr+PLp-9%IwIEh0A%5>g1#>+85*RunZ-Y0$?!+8^o&^q7h@V#?*_lO z=0;^aw=nZZwx`FfVY|^Fv`JA%}@Zm<}$Pxa#dl zgmdEl-id5>t*)Z}&oR$60TB*mhTRWy`;jSLhkY1tZ*N4p#kO))z^m~8cZCziZXeN0 zE6iLPzI{zozMprx|9*GwkJVpBoww8|Yk{|m{n z!R5U?1hfWKs39ur`IYwNCsTk2o^ClH7!+(-T=bS ziaR^AE-!5XB>KtmX>Lh(C=e6_l;nUgyQHiv93ZNY#{aX=9CW5Pu0Qh)AU3aA1!986 z4wk#TJqzBn!_MAGFe zHa2zdC0uQ=w~g5I*!LZ_aA8)TS!&w(&&~&ctO<0R_1oja1%v$$)h&#Y2^}U{%_5Fj%j&;UV z!5?y~1w|p9vt6C(qb1!Kjc{TQ0wvFo{UhzZdK}AS^+?ac&G=yTeL8Y*^WW(z=%{`I zhdo2!X(MPAqz015JHuQso*psWPswZPFl%UsCr&a{?)e@jznG(-MXc`Fv)|%zDM1la zav7`3GfQ=aWP9RULrt)Ke$~Dg76R9wPb&1ui}YNHLb;^)G&KyZyT&K2Jcm3rRe@)1 z2!%f6NA84ocXz-wz%h%i03;az%4)#VL6#`5LXD1lqB>%n04#feOf#U4zkhg`+1gU@ z_4O5HnO$3Jr``sP;UalL0y*9J8fRkwE!_%bRng3bB@Mx#!$2eQvpHVb7!`>LKh1cm z*d=`yNe{(9YUU3aFa!s#S+0YYdHm{^Z=8141>6~h45?re%6DXFi)2i;ebfy9;9I?| zsM3N0O?qx-z)Fgxjdglb@LcSl)4aLHQn2YcQH=NlPc_=JZN*cm6ai9ggRPjYcPfc# zK%4jmx4t4wqRdP!IKQKD&s9bJl2&3Mj1AZwPZJQD%VM04IaY2IpMM%EIeE3f3>(Oi zn3xEt$FiQjfWEOrKIaEaB*7ZzcV7LDV_20=d5lQ$^z?LGR|*v$dfbkYAXf^m zFVcWO%5lzaOReMv3epv{*0C4>(h#Ec5Aaln5iL3=j5SwTSy=1@V`Z1rmnZi0AOhr~ zs*yusNUjv)u44o3-eb{%a?ZmeDO$|sErxe9?2uAwLu;=9=*#Z^CN;Fl(%>MB>zVWo zv-R|66~5JhE@O4W2M!u31NZlAfDE)8iJbkHj6X`80|RP`asF`@WZ?m1eyKXHm}hpV z&5D(SN(r-CpyYFP&g#(DNAs0glVTpw!&X(f$Y=4$k;dl&X9O{fxrK#+g9GZ+9b?rA zreYbSYG>HiOAj=_v$)RiePy?lvp7B6?``}|?}*Q^8_30wtBgpJwSQowlJpm}$|QcO zr4Y?xbuMA+^H!<`jQ-%8K|Kr42F2pw12Oc>Hw~I;lGo>@=>v=XL+IVgk0Aby|1EuHw@UxeB-NOJ#*t`?WfNDr53Q*o zHeuxeh(Ge~Z}eaqL!F2F>CxnJL-1s0(x$;rr)$BjNE0vl+tNIUA%o*vmBC4f&Od3M zCX;vmCDcC=c!#H~JLVD&UM_lrI3R&@C`7m2gfTjwl2oDbraVs9DrxnRoJAigK z>h&x-@?olK3_`8&uf_3b`}+!OLC2YT_EC|_owc=0Z7st@NE2J24UHD-<=0Tdx~V$w{2 z|EoDK$wfDZQiz2D-p^GT0De`s+4`}mnAngbiEP3HK8L`)^;`?wx#1s&)CnFGP`45y*O z%+KsXEm4+OLT`+;6E@_nd=5I9W&i3T-RDNribjw%@#wDb;}s)9OoH0|aMGZaENS@G z7ts6pZ@@)B_G&B4_K=RKw$Jnes$&)9j6xl@4RrJy$zu3=1fv%fN!pqHBF%%0+ zz5bX@`X_4((>DBHm9t3zD-4iA1$#4fOQQ!{(fTU^mz#;;zVF9|%=^uhm*2<=YMB#m z5h>vEDv{5!Wb>v(g#~`Cg{38Fmb?mWa*fR!>Qo7=LuoMR*NKtq++tE8L*llTT{PhJ zzU7u&eva=QrMQ7-|HF7Q_jT?g;4p=m(EWH}4W!X`o!+tfezKuSln~n(u^+@eQqE7y zgiY$EZngM2n~%ePy-EvwYT=P8tR9yc9p7-Gczb@U{7_^_Z|}@(!*+{1VfI#XEQ#j4 z&$m8V14F66HzI&MBqyE=$>xhX-fS(5mO~dLQxNb@O6_(JxcFcg$FMre%3WZEJf#Yj zrU5LHB?>u%wG_a7TUJ3~j|EV{qkmB`%_p;+A>CaqOm-AR3k^G!>g3GJd%EOrm+nk6wG?VM9361sOk_|3gny zfl$oWvt&ley?lG2b(CN#1sy_#Lf}=7^DYL@lgkHqB%Bo&*Vp^$s=GuuvVM)FOhiRT zS8HA!d6J>AMliZ# z-*i0#A!DVu+}xC!h^1Bs?|L2E8nt`x6ZpKItKLEVR;(>+H}Z}`x@BZ7tSQ6cFH;&# z*Q!QYx1Fjqlmj*?SBKLIQqc=!(5 zy0ahiGgRY){SJsEF5#(0nqty-t2a`%EAu^3P-lFGqr(+^Q+;=QI!go2x~67kBL{cI z+{_V@6uPr9aQ?CilNn!p|!zzMXsXPlf^(2wP7(ASxqVSb)Z zeP$wik8wsm<3fE;#kA)*wXlTr*sDc>_$gLL^Lb0>)bPzSHR2F-56_xPeJVo9>i2Bv zjCyUG%U}+M?jb_kW(G?NQdKY%30mn*bKC|mB7+MBd`aAo_7rQ8%TFk=G2+vSseB22 zR&nLkRHfyrTn(L`Z>c7*mL{=>pQfK561FDRO&;QPI7@QZ$xMQSZ<}{8$)l^LIq?a^ z^OB$<5$x?=8Yuuhh3(+Z474=aW2GtDL=#9h1k~twdW-)T69WdMG~wfur^#}}pkUR} z!4vRJGOwqnRP>#Rnh3n~!k`7yetljkTnh@g;{O%E9d0Zhb}1fdC^2817UMd*QJ;#P zNp^)5>4a-u3z~6qbuCcs2mCqVL7oe^)TwnvccK&F;iQ5$J^ZR2C~Hk9DWXNzAoqrC zFUnLjlN!aQP9z(I*-WZ8|xglAEi5e8qS{M6c zZZ7@6E?Z!n$ahChY_>Njg;wm0@_xOn1=^yMq)G;TCQ?cmH~K5S>_Z-v|DEOZ8ZE5J zX4nQ9&q79{vkoDY+RuqD--zzCzrL0%w5x6JH^1N6U6&z@?I;_1%tfptQOiCTjKSf@ zv~0Ljujc+&M)%VEeE<5oPG2}pnykb2wlIgyx;bCgH)@kioA>D;&5^s@JX^Mmx2~-k z*+%-vm6er{E2kpmoe%=vG|uS52ly)+fb^*=i9dkpvY&M2i7O3-a=47F0g+FQSawTR!dUfvpUHO(bXKSJ806deG2VK$d(Ot*;?HCtq z>PEXOCw47+WX|{7=t8T42CaIP^*Z_vEkpu~FwLEX*UYvMk35BkGL;g5cVPPKmmi?; z0n#sF1NFw`CmDrDjUTINcTN*=|k`i3+Yr-94v&2MFZzxYs@vYjf2mZuJ3H(98tZ;0Qp z7$<*y;4LbPRZfoYu2%`n>OhJYmpM|BRO#4(l!6`x&qp9usm3}|l4e#4FQ^zZlZin^ znteFYBeNMLUn%s=53uj?B#UTq{I{GzKmgg#r#{uaw!uTf*Y!g`;V62~M=48j!)obG zB!ffbYDPQ06|**L?$ti$N|uc72rys6)X&!Q95C$Um(dDz3LkvL*AMc(n&=Q zfl&~>c}tvcLw7ozszg@(2MvO^wwJzVbmLUWqBQvZRiPu&bz^?)*$eTFWuW9C>jAL2 zF1LO_HN-3yiZ8FAfGOfiM6g>`Y7s3hZMp?kt~KZHK3|tVtY~EvPfHi|=81-K+3!Mt zWN_Hz0|U#hE&&fuPaI%+Sx_E1c}b|1o`G#GcU{CupNKogscLrdqoD32-WqFoGOku zbk9wz#Q$p80H7^Wayil#>GiOBJUmi)r-@T74W=sl zDzK(whkBA0_)7R=5Ke0;zqIXGzYY@Lo;wA7q1yRFGiqk+`#F_h%1k8-XX>e{3|V*B z8S`;#Sc!G#%gmI9x?_$v0@r^x_mCP4SW~K5R-&)on>brb#1b%Df3cU>FMVrSgbNaD zuoH>yBsAjlo~bTj3riZinVZYZq)w2}a519A4)-IZPA}e9^JA$sYd`6_}f~Ojfx*aUyao_ z5C*w7dzO-GT1pRXKmqY+xg%(-e9b!MJOB=mrf#c8SBPp@!AZhHc>L{0_L+-* zuXnXIs#9zyZR+^kMv9G^UfPl!q zPAPo$i1c>52>5|*J>S1cIRe#^h@>%rm12l${Or9=efJomw=r<9Eu!w8kM376s^Y)o z1d((XcNK3ob}Mzs&6_-uq-k2Bs4=W~yx$~Z*P7%8IHNudrxKOn#_Fg69KCYcoi*Z= z(RO2T0nLCFm8tv9HH6@+e+G8;-|JsbOx9GF=bkO!%vj$? z=ZYqJ*M)3xffxf6k`}d5zzP<@cu#q~>>+0+WSoeSsKMwmjW)#lcGn>x_nvy3`sp8o_AWj`S;M7IdDKO5${d-Ar&fVU3Cu9d zTrJ_Xwf6rRR(GFDwI5(Sdu*-$y_1``n4Gwf)oQ#f^x-QVKu^!<2iIV>kL3)R>Gl{W zQmz|q$8fQkFetP*&;BcgTt@Qn>YhpB>^1L)iw@xOlnnx@Mo5WlJn@;|2dqpABBY`0 zZm#PZ$`Re~jo_&%N%Ilxwrjk@Q-C%!CR#sDRgy*=;PM{N6aWp1%fw+oUU@wJH;Bk_`>-uuy{XiXw*~tMnJprA6U`v1>tScb1?-I}z z3iZJ8bq$txq|MC4H{xBRF{P)ermrX`E1tmn*w9ccSYiy><2v9j@eAJ5g`uAWX*T;D zKXr+?I;Q7*&Q%w%uQwGX5_xY$cX%oY8r5SM`4d^_3>nI(qjle$s6VeMbOkNUMNtgw z>IiL%Hla~&GWQsTpNkj5pEVlDrLAUJ2dvVcJ})7(F8cD4F4-8TJ|CH9rPiV_nv@1X z5s>oO3dwZ@k9VUrG$TFIT6Or>3Y66o90M^#dr+k>Sjl7y&eKzbxCh?Nh#Xzw{K!C9 zABSJ1%^L9E43W>?#@qZNB-`RD>CuC^8wX~_qbbyrYy$07V*t&}{mimRndHBg7*?i; zC4!(}3P z9Ab0PpuwmxRM~@gw<3=O*lRqPjYt~apEJ|K)n;G?%~UY%ez$fq!Cc|X%bIB_!F)~(Ja190%Kuj6xCZ^;)aYog(y$w-S-TF9+YLw-HTl)My_gp|oH5ue3b zOW{&gCy5qLLHQaKO0{v+u?~gLX!^Xwc8@Z&zdh$6ulFzOBzM1#YLCldN;VYMGQcMt z4jU(T;@xFtS5*qRPeTYV!=!1>iBWAYgJG1(_*|u>;Q;b?;6V6q%8F@LG+w{Fkx)#L zxbNw6rgSJT|DDtNCeO3^`r~RdoCtSh_&Bqc9$k4lO=cJJTlZ_3_xmc9-oI1J-a1B7 z*V)k)NeYMKQ$ErSL&-?-kpSmosJuq*gBa5Ler;f|5tg0tZ32(@9&34mvE))WhBqvT z83{CvFN`sYw9Y1E*{IWUYU!U>*xQEj5XbyYNpzB$7S@NCO#~YgK^C#9QlF0sj4)%W zRZy6?l9;vxUM&ABh6mIuK)3v5ZGG+)N(%|At&AvAXvLY{ki`W~3=?oyL5s!VsGTyP zV;@tg-RyWBy<~1{@!clDKm&T(qX*$T0$WVr?*wO3S7&)dh+=Nixo}1VoaiX6OFa5p z3GkHQZ0?Zrj-LL|$g_TVQ>ne0{yeS6p=Ff$un_%!r(0H+8w>dAB+;LhYGO_o|2E%2 zJPz4TuTy7|xq}jgVes-)$Bp$(YH(MuXwjCs^%Z(8#%N7AYb=r);eaU43pC(CUd5lS$FK{{Ta=h(-@^lw)TL z*^xETQMS?4ze=!`==%sbn^;Vi}fPn_L$31nLY;kSvPvCLoxoxNW6E_BXoA@jW;2In{n-{#nYb4_E5;gBDdhJ;~-K4NLwyCg%;k`%yw)lnXP3 zf@zZuC1-xr%lCYcBo!mJqYnO`G-l+oZr?<{3|eVHY=KPTaF6G=3Gm_@>!0$`Oe{zu z*qCj1Q1|FG00%q zyaB4FXyVMSqo)%{x|K}O4U%V{xH-DqP>mS*>BBm(sBn*YTS zHEOX7-hKE(t}&_dMTF!aiApx7?~&GO88MN-jf1OXw)IM01*^(~{dI)mGHV-`$Bb;A zlBpqAT6Suw&<&*cwN^%G93%!LblkG-4Dj zT|Iz}+hJ({A(e6E^P5f&MOSG<-yC6Uetx~?RCA08C$L#j9HzF(zY7J3-9&*F7GehnkknHd06)ZB!^~~B z2<`oxh;PKJY>>(O%G+zKuYCd$FZ+l{FOB>_KL2yER^{y6oG3btM>=a#r=Q^KY{t89_ZLLY^KJ%8$oqEl)j>|D6?ACG zkq|unSSCQ9Nn|t8)w+}VJS`KI&H6(*Hy1>}iKge_x+|RgW^L zBn1h@726SW+zQ)zKmuN+*7xLFwuj>O1HO{X$>RLIwyR3_M9o3~22>bw#*?*;%eLVh zYffZni8R=p%j^$d&>>WOVIyUtyyN-ucT4tIh73+%-o{vGzx2ZtM@-V#D7umppHW92 ztL?g_%Bo|hNQzIEGBLwjH0eSmXu z=M$JMY%!PM*z%)#K@x~y8vUgYXMF8=`efj%DNk)paMkmey)CYxOqRYGcbsxO+FZNw z_KlX|M5u$$hgs5F!&?Zc9|=bTwAZNN{p?FZR%{u(vwZI6DR%FbscD3af#}cvEYat^ zTpTc<3zlLwZG)noJkP6Bn^O8R38$*bw;d7_>So{nDxE*a+fHtq>U{2mf4r{=zVR^N zgzA4CA=eyjR=!7udW-{o@ypMxFiELCB+JUqQ^INh3zL?nnGhpdnjh)F@i3TQR%Q{T zmIOZF`*Ba#@r5NY!SuPa^qbd_81l;9jq2-$_tMyn2k8WLn+KDMD&jppeX1+LLKgX$#8i{)p3kpbmlG18fu z@^-~eKsF?%2l&aSRz++;h$9H0b)J)~qcI@3F+F`aRP6b0UN z9=pVdp)q5oIRt$IONS^nYjWVL2^zD$U`tr|q02L3(VYez4Mk~(R)%4xbup*(`DVzA zO|H2gq^H}d6Y(X9EKROs^Ii;is#fBpizedg!-M&_!P~lXK2=GnoA>G z`c1jQqN(HZg4f}d4RF&eH+joxn#;hwrmMWi4k_I5ci-cWd#ty#M=8n(Ykm4-0lCH>QWl0q|W(s(x@7KL2R!@#Sc{{Y?$L#$v`nA>z z&m@PEW~Sii;1(ozp}FcH1-B=jaG{Cz^NP;rn7^G`l|O*llA5qwZ&-J&y$15!^ALL| z$)vzP)T-+`#J!_a7j-_Dy}OtqLCTeV~o zD&0K-1GSOQBKpD_ffZK6SkOI>e(2ZfbTu7W(o!2l+4jBvR&YsISchP*UFfLRnA9Guja{G1vy zQZBQM*oQYxL{hByXQq^()<8Q0^X|uDw5gdEE;y&VJH3;xDRTqzOcw(qizNo-@Y=Zv zh3vLmrFlBYyQR+g;wYoepi~HC5YWlA5zTm#0m_!soL%hA=&=f;Jb_*RGDwnl&!MWGr}94g17$;)x`<-UT?J*BPn zBTh9}$8T#~?Vw{i>`0#Wc7xnlAa)IPWIr8r`hgi@tPY6kEK#KX17jzXpI;PwET*-` z!?<{uTu5Sa4k6djT-({C6gn5 z%1VZlF6$!HK*XY4X}GAVQJrM;^dCQxjyO@W`h8Z|*)nvXP68;_=;DB^H3pwsM8(lj zG}VhHK`KwG4e2hK7BC+JD^R|vcIxY@G46&K^T~s0T0=`ipt&pwLb>>*!}U)sD~On0 zo1{<-@@ReG=jkaru4<6^rNmSwGik<8LnF4`j zK&#DOk70-hu=_77O6L~46<7`tP$WQnQpejCY`SeESwz@!FGW2FdJMqw!w>1^#lbO9uWD?y7CBx@)*_^ed z!d-1BG|k&L7TP>R1y@MKEmhVJ1e`o}NfOQRUq5K}ER|gMG-U9K0di6h3XslNTwGj3 zUp`}AkqUzMsVSYZIHeGE?v-LXi3_#M?#I+OpDb*{M1_S@*VBOy{+|IwY%%d664} zUF^(M><9_?k>0*ol6r#S?2M=!%j1DNF}Eo&+KUH6UpyN z2&JmPpaE_ObG^MWSQmpR4F;7=QF%numnTM-_XA zrPv8lpwC~7d%Kj@cW?f?|E|w9p9+ykb=P*Spe0BQj9~4*Su80p zMtV>Wn1TyLpi#<72bb5A>tp^_`~F)VdzfhDr)CX6@e(W7{yaMt*j-C1+7k6gi}Mb&X`oVq5VbZo6-S zLE)}|!tIc=h0CrBxh4AzpXz73y z1b9uwan%hjf5&E8;GzO!_Q` zRv-~g+bvCq1XYb{zu5dB^80}>l$H)lRc`ePiE=_;qKUk$8jiV~!_gqVCntyF+AlP5 zrb7NbMOaeGNYKV~313&NfMIk0fzz#_Hg&6ySQN0eCMn9qXu$`l0*^gK-MT!GwYpNb zyl{lUWd&(a6G6jV{xMeQL5ne}m-dp_>sEzsX$KWggz>$|-}J?BgehETLHP~E)%-)( zvS|u@&e%G5&MOKbTzK=a@H6YN>3AZKTVM+&rfd~ZAS$EhV(a)p?0~>uPC#3xuvaZGq{ZvP2p@W%ke@b+m3{;IA+G zcuvCii0*P`I=4oh(gH^@3*0WkZLD2~*vFMG1Z!IS_2C86W-6R-ba#mRLJcdh-am7Q;oNNFV2R90m0xVN#~dz`RAA5Fdbx5LFz zUtf=a7<-e4>>UQo7TA%q<&;|J4&gsQz7GH$rY%c51a&*1;BHWE1-d zzD7?oOi7-^G>L_7`lg)UW;d@W&bP%PX z-TP^D=XEn;;L*%h>*|PBolWmx${e&m&^7$2I*J%bX_?9}wBA{!k;)-_9 zmUoYHjV})804wnF(D$BU*Bbo!NMA3GCS8BEOy2#x#H5&A9yeSx&RR#xTSc7m1AP}{ z$B|Rbl=P_E3uA$Gpyt1s-uE!& znJJLmZqN}Qv_x!sFzn_~`x#@#TZqPXg&em#E1mUH&&J8zsq4EZx4YQvv+8e5HLura zAui&-ZFwd7-jE5_owLs}k4~>-7U}4`J2fK>mlPKR8)9QGFMJG|M0EIuh9)+7(uPHN z9P_|pdsg$E{$IUqZQvOe&~*Nc(HYoNxg8)V`Y;1ridn(E%nn1)0C|fmBZ2~_U=dD^sACCY@jp1MejM@%e4JAg zb8)K%DGSXezmJC6qZ&0b#I`KGKutZ7X4 z`gb~Ba!GbH#*_K;xfXe&*s@;GyWdupfNWQH*tK{FpZ=YAZtEqUa%fF(*tK3d==XoV zUvQj=4YxDU&36p0wz~?1o{>x0g7TKR>?y4k=ya!eh$s8P;Q2OhnLjEPPE~k9YwGB0 z9JiCFMc-s)9q&L4`*drs>{bwJbZEA{TCEN+s^UcgZ{t6j^Fs7Q8t#RO7v1`{a8m930F32Dxemz0%rYicX#HMfDzSrF6BSWCCpeIPcL%?xVZ^P zLl(-h)pqn>b}>-3H?{j`AF--X8IJOkVJ^E&AHtd1K9F4EHiu#-e*DmiRq;hUme`Cx z3p$<^y7i0CuKLFKn32|y*O9~w#$PtmU5M10=KZr!~XBggZNKS!P2t+AzmMpth&Sn*~(+}(jD!>*$>aH@l^=ge+0K+Vk~L>)Qy zu3YdDCbrWfT|%D=N;qgONsL&Mf?REOFu@f3Dn^zx`!RHe{|uVQy}& zp7i^PGgdTEr&_O3!hiuREL&TosXLf}ZTcE(O*Jy*cV#LBFn=q}X9K{k0}&_1W2_T- zGe>cL$Ywj*!c5QcGij0Qh5Rj6uI_7rB-_I(>g#i5DUEh9mrSBz7P0ZhgDM?*8qJR6 z^(kGE#=Uhm%w+s47}u;iiqP|$F1{!mGBM|tT|=etgRDz``tSW#*|D15_^=Td(e> zW=AzCt((B6lX63(Q72F9!F-aE$$VZ--#3{h8`l8aaE&9y1R#Bhzkl&y=EC&}jZNaI zDbf4Zw$jQO$_;VMZU4+>!(_qI{f4HP9ijz0)5MNhxWuriwv1=0`^;U{FAf(6#_tZY z(z&({U%RQ%CKDAHXBy)vUZcA|=o!DZ8D66c)Tsd57m5?KEc0c<5z~+aB6)-bui52x z%lBB%bc|3-_ft%g95pI7*75oJ+hyyO9xyLn62BuB8i1EtzKxhYuUZ^yvMDYxTN>W& z;=vbF8QmEHcYGfc^o3tbc<-k|`j#xhVgoxXC*?qMNB=b(_;KG%{v1oR-i!D3BJepB zyV09c$)I|~C-8|ib$9i-ivzV*|GtVW(9e6h9;J^c^k=?bdB(^mU*vn!5ZT`KTWt33 zmhUOG$f|}&^)Qqoj4%oWu>L`T0F{U(GyyyU|0f)>0z{zXRgtZul9;L{L#Z?#15WGpkB;ObEg{pd>w&J>cstR#*n;l^JrQ30*{SzbP7t_o2TG1?>pZ_5^)i zsjG7s6U?RlNd9KiLlK^#QcMTnRgyhM)|-3$?W@nd3YQ0Hg3i2KcQYHM)ceR^kK#U; zQ(cp9Pqw=$7aMLAvCIKi-a{Z?clw(mu2u<_BUA@kFcP<8zK(vJ#pr+8!Y^9X*{Dv1 zp#kzQK!Cu(v0#IwL=A@;>rk!n%Hxig=4voTjhg)Vyb>!o7V7&DiL&;PCReL5`z9v6 zM@gW}fP-p*)v84$Ny|)SY)+=zVN8E(GD#V2kb&k7o~h6+>2|Cn_7|h|4m>Oyk3=~n zNYU~{$VV3p4{k;YO&|7n>x#%0)64$x;6m`s+Uo=V>s$?vujM$e7xquik^Wh{6*q$S;S{>dCw z)|t%}cDzYICDw`9YZPR{q2Gua1nO`te{K`&mqpHZ4LN^;HK9>>OHBo;)bIOp$qUrt zY1FD!=C$a4dt6a+6Vn?j{#Vt=FCj@NgPYw==oRqnK`1aJzje)&F4o$hrsIoQ&u+1% zqEIG0jCm90MdVlv1|Hog7p9p)->;i(j*MI%nf2j+8zJx4y2qx~OW6^be>9(Os+sJ6R7``;?|XlDP`Xg75h ziwI2aaymV0Tz$x3;GOSj?rW8&}Ar!2PIZo-0vcee^krk zB)fHyo-CggoDY4g5$fx`Yy+LD<)1U}+4B`-2h$u9^M~KPMiXw_p4m#+HbO?a&eLu` z9&UY}!NC)x+k}uy1&dKolj7zuk4{whZTVMB-4Pc*qmYc-{%=3x*XP;$aUb6EyuwwH z8Y~T#SAb+~9+M0?`5Xn2RT`df@XAnI3T2|x$>sSWzyhIsHV)=Yj#pl8D#R4?IYOg)MWg{*S`h$MMlK|#`nvW32tgph}{~l+*z!e*ua(L|h z2vPSo$knQ-QvmB=!|6uXZ2z4op9+b%-Hrti=i$$tb^L-c;IPp9rs{{^^4~!ccOfKu z9_pR5Q{DZH@bSU#fUUNQ3Yz}str4I{PwUDiv}Csf0y>yk^6)JQGR@#f zO4VoqG&O)^5A_WZ*LY%zE^g=UVGT8-$@(*7FP@oicB#Uk+Cmem|MrO2Vkg7uQ~IYe zh<-89NCr0Lms=CuH*$uITiG<`*@ot$Qa8|*81jKy79hWc`N`JekV>#7JXT;@f=zdC zeuVqc);ymkxkb`#c(*!<;drtgADbr8`qI?PFo_vK-AuF$GA+nx|5`c_U870EVB?l{ zVaUT)ge5i`?>qf{ohORnG`)@FA#uF$RHhKYE2_u2oYb3@Mu#l_GY^m7e+Pc?^9uL*Xn=_LUkJH__0rM``Xw*EZ(wb1 zcYf_$&6uOcbnJshCDnm808;hYx_A*_0#2+Pc_}DoFiaaltk$yrVO)-m|)>aTY{ z*yBog<5YYz(%)6ft<^vARhWopb4`eVn6$~-qG#DzDo9@L9E0H zo$BK0`K*Q8dhe2h_)L5ImNx?#EBJcEX}`6I+2lfrV=l8BdK%F94~%eS0V;(VnQGx>>zDPGHIkr(75ybZQeyruuC z6TPrD@`)j(=Kz)%ZL^2*1;^r>AnR%;<+km=Oj@I-vl(V4P7_hzJ9l+W; zWW>;*WrWq5t;b?Jy$)Jr0ayVt_g4zDvqTg+g00u!l!=2W7t)TRu@tU{^fwjEREpz+ zJoDI_J{6|!Bq+Vg_k{S6Fc1B4=Q>+G8n$m> zB19{l@ci!c)<4uTuie`Ht&BXW+w4SQyCG-!ji7eOXAYzq)I}R?Sg1%e4vovn#)$Y{ zDba#)PYOG!;R(dQbzPx_kffL>F{T3PT!6q{8BSa4Svtc^KkG!d)GC)@EMK*fWEzpc z**X;mTILrXNTms(kQQuZa2VC#0xc?*L7okCxd{q;#}pgq-{G360TM;H86NXOs0sE<3IftL={37`TumNeJOan9;pK0`2GJp{_*VkG-#ms!IWZ&m-RfrjJ=B zKu}=M!^3lY%5odiMlson>CiyS7k#{9!`8Xk z2sOFn2IP>hL1x?U$8ogrG)ps5FFEDwdSmkZC7rD-R?-h1e31s9Wxs3iMvG=O4OcOeSVJ#Jyt);Q`_T8m--A4lilkmuh<@rC8qQ_HrNmTkA(vaKiEwr#g+Ej$^^ z%eLJzm;K(q_dj^**7rKsIiKVC<<;TW$OnU$-5b133&^&DD(ON@jNuv83IbgrzSDE8 zzzvrcA+KLj%E`aC`_5>0K@XCe&MUb5=e2{!QwyQdv??8s%Rux3(*Pb!`f8cIL7ckS51x=(|<=N?tltW=sB2f_d)> zX4X*0GQ`MQRD#+_8F?=0XGuzsDB})rzJl#6;@%bM4YEcRQerooU209Z=<14x1i7nw zBrsCNF;+bK5o*$0!brDc=gNPQ8XS4aFAINc_cbBpVTCURX{#p4|Le@=9X4G#w3lbQ zIYsRB5zA}mY9__ji>U?)!^D9djf+0aQaPh))aTUvnM)SNBy(D)Zfyp)BNiuo?FBVW zOX_@T0GDjC^CS|SKCl987fGl3O-E-@2-x@=jlUHoNCGpV8XWZ;{8%RWs zHs)Ds0M0Y%lGqp*Kiugxdxh^m*{BtKuU`kqYZFB=COa{h%MpXmz?w~cfiUpK319^HknS{$ zuIY$!;5FaS+~hR(;Sig^rLyN2V!cjBPM|^TbGcY8tL8dap#py_kc<4Brjp5lcRcN7 zmcKX>Tu16UB}3+v-$Xj!n)aIpQ*VaU<{BVoFdZ%e1Yma(mq%c-yt6Qja_& z?(6s;NJv&DHT_`V<3zj6<8ud=xuQ1Z4`h98SW#H{1`qWXOV4p4eh-CE`}AZB^!%Sy zgdzB~7PYzV{(bU3kGEvHt8HFXb`r7~Awy!OtH2p*Oq(_Yk;GXAqy|`Urml-Y>Y#A~ z^mVSRKf+kTO3{p0dmOO-Ck`E;fsYby=fXfs!gMRD?THT;wJ(w1{k%zOjIZsYJfI4Y z))8%)E79bOHQ2M2F&=?RD}Nz9v->SS7-h#?GZ-i z>fnX(UM3KOGQykogqhwGp~UBS!)CW<8J2GBB{#ePZ##6d!u+1{H0jI5ao^CyncO)x zC?SzdaPhFzKnso9bYQJzK(1=^do)cwO zzG1^i9tebdF58m0OpZrMas?0UcSJ*5ma=D-^j9p?Z(g<6T%LP-J>+k8Wc!SmSL4^d zHh#_HWA6#(y1TwNAm~G5U*Or3@HLrPU++6znCm21q8%(_^Db4f`~;|I9_g!1oVcz1jPgxS`m zisr^i))N=kO0o@Az^6RJRn#6 zl+dhni7t|!O;NmbpCsO$eA_yyZOtVOD&IGu%Kdmw<^@h;sv1K}#;Z*pn#e7uP{f@& z9Vc^o9g4jtNRJ)jlHc|N2Yxdls!v^X+nQwg5eR8uW4Kx1R+2Q3v$N0xDdD`H)`m$p zinxA~O`d8RwpDM?ciFHm?%(O2V%Ntd3$?n-&du$wW3XN291nsdE3#&q+S*)kpIPYq=qS>nbz&9S47)ZjcYmkM8nOh6&gzCrNUx>iYVqPQ<`mpxKEG1>FUnx zZfCs{2xg3#e5NE4VVwHC8>SA_OvWd1fmc2MjpqNI z=Ay~qVToSDs%sYNZ+>0VTkEJwc4GV!{l4*RA2Y0GrrIEf6#ZAMJDF21 zoK{F46gjIM!tWwpr_^WX1(DA*%c>qEhMhDri5oGt2_h+a)OK9Scx@2m0e6P*e< zO#7N%Lz-!4N6gdy2EZTk>7>E%5J8%k-`O%qRn?3YFu4^X1{Q&)+MWN1$i!kG!{?`F$MG4H`;8BVhRh!EUb@l~RQiLdbNOt(GKv zjW_~sZtv@J^;^8JwhP+`I=n0B`(Cry=j8R(*&eUC zzQT${co2|&)aYB2u#zv|lG^Nw_F36Bcz-HB1?pHvG5BxS95KL|a+<4pvA3fAsIQ!q zs*+BCL0Iuq@xkD?O<89Wr%Ph)*CI!j2vIR6nNjw2gVd)d&J<-NC=onmi$cDp%z<%a zKlct+v3B!t_t5I8r$QX%^EQ9Cm1V;lWK~G=t zwa+Y3aEVve!^~*eW2=2TQPL;B0*!JH#`*|4EID>l3T*;JuNTt);-G!Z*@`O;@J^$_ z5eu;eF0cDaH4!G4qk(qAOR#aJS~pNB(I zD|LZvfO%EBDoL7Jnv!5bfR2FWirLLNlP|ndn2P>mb#xXlk^<7QH}dxOV6D5aiSEWN zN82A)2KYp5alz>q+`F{ramP)w`fLp#j60=-OxBIT|Fpug>2~qMtU5NzM{u&!_t_F` zWpsb82gDHB_h5lYl==Pny14S6%S)E`ht|of2aWuq=H_^vyR|=eV4b6*<6bl|0QaAF z!0}<{`{Oyr3#q7dg7lnMZLMmQ3-9=}$)KgRbx~_;=+)I#C8v31XPAw|N-DpvDe(wd zq)U{v6?v&+9n)l|;IIbTxZ{1AIW-dT0@b0OD%>9)0x5~!I*-jf1*f83Z?{HPeePLd z0y;B7iO>)hfJ3V2Et`OeZs6w}6e-#*0Q}Ou2UvNP&w1&uuD6SKB_`LbZ5=wwi=yJ3`N(DDH(!(IIE^rpU?pLK+e>EGfePjP`1jdJ@QE{WJa{i~ zb})g<7s2(P*3BuM_{si*xP-okz(ST7a9b%_z%!o^B*li#pMR`Xk>_bRPcG?x!34l9w?AM zUxe7=u&#y@dt!ZcfS)s;l;)|Prqb`{($7Sdp${ka{hVnPsP<)UpGmR35qn^pe$k{9 zt3)r)!#U=v6-j208euLeOp$Jv%+tvu1r_F1TzPH@3kEZ~KP*=dIG_QAPeQ$8V<VGT`D3H|$s4s%vAn-mr_G6xUj==j;Vd!`I>`|(hA>1f zOuL$y(6FQ_RA~{EaDVZjG?IZv^?w_qMYFSqV%lWu!WPw7**}-(k=&R6*4(?*ykHA0 z6+~i(TlWue<-eU@=XI>eez4xcV{yxxo?ECMG_bF5ZF zjf;e8>NpR`i_PPmu($C?TOPyxt@6vAul$<5h*xe`JB8!8rzwZLs;#za3En@iumBQh z!n_ft^_io&k!+6ta1sXzbAK7G2FbRHQu{iRYa)oSW>O+R!@ zSTiqPolIPkLD%&R-2~dw^6w**vphyjdS$0=Auyv_f1&iwOOy<0VxfMkB-jOwP}Ut# z16y@t_Y2mKmQ=Z7)$Rk@+MrPLvgX@dNcQmj+=70;qh_oZA+yilBaE^#S=-~0-H+%C z7@$B9v>bv$F8}cB{km9{Iv?^W)5|^3d*7-{4bX|+U+=Fk`_KT|I*-RCsOI+*(xl)$ z18-D|<0P@&N=Np_hQ96U4_$iYDuDFt^ab$;M;7UfDaOFFm%#576~HbXN60Jc?G3MO zU?4TDA|0jwM?fb_rlDmnC?dtilu-7I1LIwM+GX!yoj@wsYQ`!U0cjq@clS+UDX1x? z&%}OQ=?V+XlRc5LS3vHdkQQou90yjN7h(7LX!JoJ2OJ}ef;~E^QA4V}46(6aeyWOEJ zX3MjcKGl!77Yn!q@x+~lyq+QuD;?P+H@h?qk`@xaUEaLS0zib!lxRtVe>R9@K<4p3 z><_>vL2|C=jth;#L>Rs~C2Vg7{{UHV&Mhhz7puplet(_TA>FQB`(jL|{vtAsQ4$T{ z7^gc%KL}unlE=??61nbZ?cIelZ~C2`!BscPD5(_N<4^XR5?fzu;0YV-I=1x20}Q;R zLHNzqT=%u5!N6@EU7aEhi~dL^xV^e%hMJ4b_$dCn4L<^)lmQ2}+WS`GJWU1J6=ao{kg3OEOZlaf)d;Z=F-#a?Ht_w23 zM+&ZFY3dAmuXI-;4Wz78I4LA;XBk#R0v&A>d5wo%=5sC>O7=J#3PN>U{(P9MQkcYW zCIw+DLcKgVcJf)HJ-iC)*$8Y;&{LSBU4Xe`BDuLVdZL|Fe3z?h_jMNhq6WI*AVY)W z9(T;)N~0*l4LIwN(|11j|^<+eOc4J9#pD^FZ4yu@Y8!_re@fu?6m%8STT*%@aWhfWY$l( zcN|9fi+dlKD>cOvMXAC10=)e-zE7^57l8D9b6wVAZ*fm`96}B3^?{I$!yu76!GO&$ zsSM|aNvD#bogXnB74S*kA0V)&L=jWS$2Z>m^8664_zu%(9oyNdZ`XdS&I#W526Qp& zS4q+_VeV_Ck3zGl7-zW28On(i+_Y^w#_E+rr7r3qk^T8rANHf+;|Tj*C^AmwDD@(& zAE?$-jO+bxP5ku(fx&JW@v?9UY<64H%aQ@{Rz3qO|x*$H~wIb_l~1G|H}hm+WpX~-sk8jAYlz~4ktRBz z6LJkxYg)782(#eSC>uLeJzSAV)Xdv&y#G-lw>YJna2*IewwMzv=1AK92DFG{|DyEr z`}2qF`Sw=`2j@XemdY;u5f*+NAq2b4clEnr;bJ%SuIxo|TyjF$r{G$2WbjEZJ~@E3 z5_B_p4+i)DWef z%P9lmAoTvu3Nx}{*|hUu_i&yJ7*qtI)P(UyjQ2(L zzULBQ)N~NLU17xh;uM*FHJ~j*9!~82IkTdEQX{g}V3U1Ni=-54wUL{LbCUUWBl(82 z%wtjBSM6o1C_qhC23O*n!neyU7&N5{HKt@o{`zvJxo^#l&HuL1eA$#s@JL7w<~8(p zzbNv{Jl5wI15iSspD~qawRv`B9vEo>ip<6HLuVJIo3i17j9{waCWJ074(svx zK=HCSx@;_flIU~+1%r)ABP8b}Kx+k#z140FR#QZgNCYPgHT(1jdaI!LCb8H90y=z7 z%J{+P67QXpqErYR7HOM%u@n$niL+6rS#+T@kYK?J1+FoSfGaE@_Idnu1toX(X2+PV zOCguU=J5utdBl5SAKO@BiWVW-4wl&Ndz1dE%P8!)3T}Gbi4K2wbGH@IjFuDl59B%_ zn(-|F$gg8Wic@qm#9(3xQKri%F{B<{Tv&K{t%Q^pNVhVIbJC(l|RnlR>lgCJ~#1o%D1&rdcYYxmF*H;r4XSys*nEl{jq)7ZzXV2W=0~?LR zQaHZ91#Q=+N!UguwM-Z`RVn1z!w#2QB7`(O1F-~|85u3cG!dZ%&DvEe6>1<+puNI# z(wk)amBfRDt-k)$-&u&c^8wo6Wd~=-y#90v5`DJXJhe6_uBeFCc>zRP5&CK&tNI>b zUg|z;KXFc@9K?muR)C^4Ha^Z~kYQnH_+j$8x)QVZiD<^M*I5BD)5W4nOkNPH||9$kVqUq@v8p8UIzWUuRmo>;E`(hFUC8-($Y@Ur^s1+PA2 z+P5bDTT&LhUQ#ApZTp#oS4EcYGW3H;@a+%T+b)R!su65;?0Q-+grR|R=9BL)nGLq#&75cvzwciD@%1K%DRXq#t7SRsBvD_e=!9vk}JybH@|n%L#Cukbf#qk z4D^Z!26=12E!LxtSUw3KiasP>NGJluQKxO67RSF3Iyg=QXMHP<^B-p)rp_Jf>a zGXwsMfIXt6S`PGJ*3nWo;7vn&v3HsT8q*5>Hw?Po!Ns!@PWO$5JZF_BnTfwfKB>_;=c?d(=FQeY&kS%718Vgi>49HD$dp)#&Xm#ekOjjt zdFPb9iSbXeb#7x$A{~-|kr$paW=CjORT8hA+OJ8qCe2y>IKok8`E@vka?bcP*dR@S z6TP}R3K(?&y*ZXZer2n-u{$YAT8dhd<QdL=VzrLj;Q;|{-5V|Mpo%x5G8nsbPD?(5 z&;4v?Vbu

?&0Dw{+k=A5%3vo{q|t@qs$%i#v&%vC#U3k&Q*y}hHixTda~a1t*ZWBN(tR&tQU_zXv|ig+rJVYfXb-4#PVUGI zss#Y|uSmj$Qhz6}HPk@f?k?6wWIOmPpWbcavJyG#LrrgmR4$y&W)S|Wy>41Vb1zNo z`yWk%%iso1m0TY*;1pkEU&E6LT3n4>Og%S;l?FTmxUEO}m-Nw-%B7@<0cvb*{E?Qc z7&)s0af#5Jj*Ue)>%+t_dC3 z>!w$?e5$2|s)9s~WT98%${C=KT%ar8^CX^IFbI!h>+v5h(oVQzwkqaTY{B*01%wi=}s98b4)Fg^Xpt2Ywy@1jU(XZ z&5^mevG1wq47Q>`$H&+>Ue{r0H8HT|l5HHBrjPRcY%{pr%wdP$L#T<06ZKfrwd zi6Vf4F^&dkU9cj;AlTRe;FK6UwL-ZuuHg&76YI`SoZPfA_UWO#p8)*F#z^#Jyoxge zFZ}h(g!^fM5^6eXQNs*(lf0E*UcA3!n*ZJTnMV(t!o>H-$W0$il~2ur+(RV37j|_r z*}JM7B`l~vWFsZ(f1WLAnDy<*ifG7XZ9WYydfttrpH`a}$?;nMi4M`MMOm>!2@*4@ z`p#>|urIp#!mu88xDqzx^2c!*5hjgdlkh87z^|BH-Wv1V6adJ?NHG059Q9Co&lvlO z*C9mn9pUl{fCDM61BKJWl< zi`~N7(XXIz&QR{BzBosOWfKuLc}`v)F)+<|d1bMnKp3Jw(QxjQ6^ z+a(v0?Gt}AMuMwi*j^RxI9JrXfyO%rT8IC9&E(hXVN{VnzbGj!79PDuk+EIhQj`w= zAT*cV_{eygq5=>Y^8EI#&f5<3>mjPgSybDMux-eC0t}a-nOa;P*ss!A?gSG6q;TNRDx&SZ_Z|7m3UGGaUKjDzr0B_0Wv&+3 zCZ`uy<$4`sB+q$slc|_@4!W$^x^fe2PbMyN-EXHd-81PKC%v_x{YnnUT7BNi&bO8+ z*i12ky8QfduC~cZ-WR=>>&e1RWJF6dbMC)69|fiFa?_U5Vvo4EHEcguT9A}CQvcU!TBWtj?!$)=u!8AT1S$t*whqV}yqFv1gHi_9aj%CSqbl4!6M=cbcx{8NXr zImAj%(yL9FPjq2=!%>~Aoz0vvmU)q4*KzmhI}TwqM~lAh5!Eq54*TAd(k?s@cwsii zdgj#QI|-z#FH;KrdP=ZiqhN(?cDUh#8+eD`j=o8}E^B|Hex4*6BZC!u-46hl=z_ zQ)5}fH1@2!6x9!pLny4{x+A@*+Pi%qo7qCH2vdFJ@3@KTOW!q(=ioUpa03)&AGU=Q z=vGW`EQp@b4{@a-m!H(Ipk!uev&GbzO;1mY07{pH zNFjb*D`P*2-)1a#lWE%?GXX!dPg1m>_;B>nMsiz*ZaQ{tEwT$~V>TD89Py zLAU_L*NVLu{a3#zVe5NBE>}UEpgF$eUzLU_`{2e|)B8dxgZ_=1fMr|VTH-}-5IX{L z;sxh;h=BLRbx2$xr*cWTCwiS#VD)kx;OPM3A;pc<02Z~k5j)6&?qh0Jd>nfd`yb&~ zJ>A7pT_%%NY}r2DWtjHBFF4i(p{>(Sr8G;d)Zw)~Uy6QXxT(fZpXeV4m3(X@HyUK( z_Dy-eRDv#Ty1vif47Z)ka>;Bq>50gOpRce;tb!RBdspe9TlB`*9ZB$A5(UZhpuLY2 zzwFxkAj5#IM)W=MQuTl`5P-OciF9qd!48yTY0WZ$4tTwRelK%#i;AbHxF77zr>&uU z7cHNwIDqIRK)_;Q=kGm)h-Y2!(wg)(D9o+F8Wf>>rtJoMIY7eG*kv#fBl`m(2;RB*ueeB!FJfE z-{i+(51wluH0q5k7aG%1i73ObwghQ>gKpD}hY#u&%yhk6QgQg%`1vo_20QkGw+Bn- zu?Zsui}E<9^n@pxSLUXEnBIfWJEZunKbRa-H$7bKHAI6fnJQ$Tw<7t76t{rl*ipVy`TERWVLvBMBzKQ^!y@fd14Qc&9*brI)R9NDDh6dJ6i?3+F!l>9Ag?t z85+)2zcq7Xh(u}$%dyF3&0SU&XB8Y7YjDWj5)Rj5c<)?8;*!ZUsAkQHhK#4SD5v_B zZ}vp?7To*EgyeML8|_WMrm^D=$mCP)f-s;BOgJo-XOe01U1%3YeI|>WYvO@zV3m3? zfFK2oIZw~e%CcVt1r^8>h3Vu$be#5U!ZWUP9j*u^;*|-yoU4|-?%-kDih((wkA!7{ zGdR}dzu^c*ADmpwRuIODNwH%MdYz?_)JiOe5dmnv%;sQcI?3a*!AA&A>Bp0Mggqp; zJXsO)VBTAdI#&vAy7Gydm!L~d(_f(hEOQ8p`;-2sWGaZ!nMv_f*zk^0@wt0%&*yfh zVT(AV$!b1mazk(@n(z(EC4eGp0hJ9P(gg0;f_J&al|xj>$`nw)^6?G!09;kqf0z^$ z#Vv9F4O6=VB0#6ne@#Y4hqDU{3Nx;V#X|vBRpsh7A%%1qve{eFPX~JVKAD@YJG2WY zD^EVCt1MXz zhZ?lbC43tbBStQ(9q!YbVHXk3=6RPfs4s73Q*^{ zG!I!&EJwJ$a`8!NSitKMRn0ZXdoNg)>S$|cWPjOO!p33_$qG+yIJT-;Sh13CF8Nx( ztVrf%2mLoQU$4jzfviX4rulDqs$7H1-IW-LX9kYnwalLU1?A6g%)ZUe9hfm~SgK~& z(_Mpy_tkDt9dSLbgin$sm>i0@oA=I4UjWQEKf5?Y%@o)r#?E!$-ptU#LJy`LO2h?D zf-zD0fQN4xt~^a;W`0@5-(RSC(~m$!HmaXIRW`I3n27n<`kg0*26qi!e@?d-9-f|- zl(uF9fIg5!)Oa@6?A#ns=|riUPJ4IDkUkn4Lbp5b$!Sv6IN*4yN$=!4;8C+IuTct| z)K)$IRVs4kXk)Vu|F9#V$#@cC%ZypZl>z(>K%Zk~=JwLnE_Yi0Hn*F*mlxb>T|`mD zM72U2FQ4aw-o;+rx{makL(==r!Q^g}DFXE7hkY+`H(d;Zl+U7!TtKYb!n?#C4Jdt7M_pe=z^~|${YT2LaUs&Y&<-XDM>z^6%c)P z&SPZtYg?wlKmXtMquAmW=vI>{10O7)<0T>O4+K_9>VRx&sKGKOEp~XIsixw{eJtZR zk|Mz_OzjhWC>xAxqACFtNcsn9g4c5;SdsU%;8L!qU7YpSJR4R|E zv?}8j`Ubx7?jnRx+{OVM$aQeFQlUk>GB4lHw@NQdC&8MzH($ow@PYK#LZ|{EE zbf#)sckmIYY5e?Nu0Cn}Q*ZI_g3djA77sApG=bytxkV~8_vb29`EMJ`5c?AR0qek! zS-nTz-~yu#V8Sw4=JdAf#3O?pmzOV@u~NfC4<*w_Sz@3A^t0}3Xx1b4QYX)zA3CHA z$iqS%>OXuc!-!kokb=5lji8QP+Mv<^By5@)S*W3#T^tJvPz%NXd|Lk@CSDP!td9X} zdH6}&*dQmW+}z$cJcGTD4lT>t+oM@f2n4HBWwBP9Ja30s=AtYW`|penq)hYCC~DY9 z=_0BSbz$~`k{;cO@>G#Fs{@`?YzAawf?>O2ELX$w-ii{7n081Zl4%X|kEB&(i4w6L z=9Fsd?I_f(IVRmh;XceUosrcOWJ&Upg-Rq~G9}q$ONH(6?~koreu?jI6c^NUAW8H{ z@gj7lG=;KBa@~d?<5EecT%hA7C-0oemZoRzhWqFn+~)n24~Y&^oIIxR7lvir^h1<@ z&IPoDzXfu;5ovO~X=J*|&@ht^*=usTtZBz+g% zk9mNUO~R)`ZGOkaT0dK&uM27Hj#BTJy>uJxWoREQJW(wFLvsIa^%o-GwC%oL$cIz@ zAX1(vO8#pUZT@HQk#pv;Xd&pHR+?c{6Y2KuX3N&0T z-+j2+1x{RGK0*&0q3clSdF|M%E17?-C|Hvwvs;p^N0@qgdi*b!eF#v?ws~o3Ke!|M z4}XrP(%08J2V8Mz$R>}r5R!bkKC*}t9fyV*f z<86m^oQi{`Gxx)tY;17iIG}4DLb%Yg&%3yhJE#Gh)e9+2Ad_PEsns6pMMvF5bt8|w zY@@Id3MwL)q zJ-B$@I+lf0E$`zPed>soaCNn>e5nf1ncI0q&{f#uu=w+PiP=|v{;`J#ZWV+LpA$x4 zn;ZaM4v__D61{tSu%X78SqBi`RZf^l_S21yXdi010*a8ZrY25?QQnjKK9)cCuh$>U zs?>EbZ5L{MTR%KILA9z_FL(Jvo255tDn<4(U6DBSr{YfmG0Y<@pHF|DU>2{uWSd|lrFNeD zOaBG>BQ0nza3di40a5yo9L|Kwd8}=gSbFWFI@3C?iD)xOrR!{O$09Tr2k(G5~8cB5DPnjfx(PY}GE+#9} z+bBcV1H9*ft1x8hd~<8xoljtHU5z{1Jz-w(-M7y)i?Nzjwc-O;XdZ#+ij0Y)O0Ld7 zLn&FYmA^DXZ_vA;_(C_;XDE~Eh3w(=e+7$R3<4lrG1YCH?JdMl+5}rQa{$Fmr963( zY^7Cy_K!*RTzJcKr32*P|>5bOCIq*)^9*@qJkbk-T(IdjJN{&Qf*ZLRxyv2k$jjHAK zZq;)u5S|t|P)y$Vl9Xc3Tj$CPde5qLHGil!14`Ge4NZBf8R@*q5`*M(d8|eLTtz~6 zy)`q7F+qy9JX^QCzE2P}|wv?-=}|3s6+wkg9OM4N^DRiVemB}TFYUzoc1jkyMqp3ADA00C7xwlIe4H+qWN^5K0=F5s;PNfxW>;Ipb2j1_MbuPnzR# z{{USY@_EzKsD&)3wN9;gGK8rDSBV?B3|s%){kqX;gLCBKG`uxg2U{wenXd0e=Z4?=+g`y)<+n?S!K`dP)^9nqMu&R5kW#Am-puExA(t8 z6?|QD6uiCI7%iNJR^wO6ZLLHqNbgfO@C~T?u*y=P8lD(@pW}Yo(bjmIk84xHLXhdh z1@Od+oTYxdW7${`swY9>5cy?y50CnW2sUtbc|0T0bb7-NA1=ytrc&v|Rcjotxh({v zTjo#V1+N*p-YL+M9CUDr1Y-+X34ve92hya=X)#qOs z@c@K@9e>a`21_|N&9|HT|!$U)d7@YF>a@uOv z9C@DSo}W3YG1Fr{u>)sL+?n}V6Z|74vcDjVBBkl&jfuVskHO^`G$?I4)>ekxGon~| zY2Ta}rYWHl3lWe~l{$fmYuNl(6Fdo|MaQKEGvsIe6`cC%g*ru}lo_CYY*WBD$o{uU z!dZvs3#qVl5B$YaH_6NH$u}H+zq1R2;F4(l-KJ6vjZfrcKgpfe4>NbeIFgNH=N6ig zTjGMj+VX^rOmU<$U^q4X_>eMpge0MU`&fLiV59^OKK_j}^z zeMe zrkCAVfjEXjH@I^5tfMZt(T?e>3O-Hx&hml6zvuYQes`gk(8y&ZFt`fPH7fx&)$GE? z1d!5cOSYFrnWg!Y_0LWV4!wvV*3NH@)}xwlsI|*Le`^MEc@PbC=OfsB=q*FH+~BB6 z5wfo`U-L<6^zXkqQ<7U$QR>g(5{!x6%F5EE+I$z@nPJljk&%(eAk3X40vx)@h5B%1 zaSbUx`|_#ozR_Cr6cv!<<@&{v`9C_*SRi{dO56^o{WzNM$-H?JoexvxSRZL-)4Ryp zqK__Ig~^RrzXfl$I{;b1U;9#BwV25lF;yTczWC{8$?wmCd*EH#lv4A=f?QS4c)=$D z^D$)Bv(e^X?T6tA5tx)&u~DSIGE>H#^B$$?)*42Sf_HPWDz2)%IYFsqo`3fk+?%+P zzft4D{}d4)k9S~{X^<9Z0Ia58W@NHS5zt+oS`~~LK1?02tP!H0IP2ZKuq9 zXrnLt6AO10q4trI?|{Ulp?3Zf=HCcx zmlwTS2^e-wi_&kkaI)f6MzGcot*WkqySW#1sddO;9};)^i<5mEE=bLUY(Ja~Khob{ zoSLp0B8MwZ7|Iwu8CAoKHR2X@GB^;~I7p}pdHn+w`CniS$ksGAIti@VBKo0D*Fgz* zf@Dnw>ctBD^#6uCtOUzDf1Fm{%!5C|uxBwOk>2)e6c3K?0j zPc0fJ{sOAowZz}S`<7zbUxau*~reE}y?AT<{-R)CmiJso=jxQu1sUCOS0D zXy!#%V8A536a^}RHC_aDPdlpjU-d_62!I^gFlDMWYGb#%D^Crrip$>Tm;4%%el(6v zzfEfM=pQ6|N``2b8Ooh|7a{x5$D2a>4PF7$X}(=7mvRg(I3Ys!02(}HOyLg^lEd>sO^jc=(gz~@N?$T}s~Z2f zFdf-2{)Db=J;oG6i@#(>>^Lbjm+33cHMU>HFh#%fZ$B-nQnNnqbtAEN3shQ25J$KD= z-hD_{bUNGHA5btJgaCRC5mg+~sJg9I9hGc~bYhC8xbm;QqmIJ#*~w*#i;jhh_(rr5 zlmI9e_--CtTVGORxQzOH{l9vXUW?a)lZG_Xc=5AXe_*FE3Qg9b?oQu}K$)k);ZSpx zjAnwruWbJQkVg>XIot?l(q;Q#E2c=jXftIKTzG7DGej`tEojJkViVc?#aA2)SE{ev z&S3&$SBq5IrA+3|Oy3kV6kJ!&?u^Ripy!Szyu!hHun@%F{Bm}^=ePU z|J*X%hTPr(-7jBL-Yr`&$`&TZw5QvDOytU8l-#(|VkuJ|_WOCegAo5zSUNnJMzPN3 zfT^T_F)(}i*OwGHDQ$3eZ9PMzin7kN@#>?B>^AqO>RpwZ=gN^W8+P(E3I;V8zsn7g zFfSFK-P@BJQw(XcA!=Ku7_7(4&1YiDQ>ukHtbveNR04u^bVHiNBf*T$m|6^kQk;NO zMv^x!$JmUHUfv=TP)YEF-bb$Cu%qDWjvl)!bPSge-gkE6i#~HzQ0U2X1Z^#m!_47v zh@+l<5mB);x?~is$`4W=qvRnk?rMp)E|`~y_ZyncVr{yeHc6be?T;V{{8IUK2?Ngl z_j{>Lim~s~ZJ%TZS3SsnVu+8gF=otuST0Y+4`qs{;0s4-0k0$uV8Dnifz;3iydiFD z(Y*I5(}T8yDD$TQ7=|)8dscgKeFIH8BYcKtOCbRe=^rRnkBJwX(IoW8B10!N9TVQ0 z&%u~-f14W4C2`?J+vU+%@SOnc%4`b+eB%b^7aY2t__Ouikd-7ggPC z`s5qiw-G=Xem{?{na*@Nl5TyOESvc1-K77+Or_7oDfjzB{bbqXm=;u66DH`gdl(#eU&6ZKhF?1E9n> z7%ZX()^)7~ZQ&$_Z^V1;Mjuv0OFn^>|9K-bcdnoi3wWY`^>?Un0AD@NHw0q` zq`dq!c*O2{a@YHLkbm&`!k=$_nKD$Dc-2nmk++n?sC?KXZd%2DaN{#{DOPpv(hmn) z@_;6W;dS`)|9D7%J2k`@(h%iu|3(0tCD4IK%){NC-sv7X*!coCnVUtr%j5I>hnDg* z+q9gMgQ>w7;X68IUBank`T)AXvq-9zP3||Hm257dmzvJ{R8DflVFj1-pHO+Xmn!9@c18QzV{A$fdi|)Z4Q<2W9+bgBb3-SLM7LlRVY1z4I(Z*+*H4j zxLdkaLM*YEwn#@5|ASy}a=fuOp0o>o-Fr~aRBwTbc7d3hW{-l~05$sw7E4plZR}YA zhldP7m&(D#>v6rqZT8FF=7VFHr1{~n*WMQqosp%-Le_t-;FTKGw^kMU3Bk?bvM<^0 z5{ZDs->Vs|Qv+!!*F~lE5LA`O-|HlPTL}MjZU1(NMLnUAur}LRaUKkYsV)X39s;N; z1fy&Y4?Q*A=APT6E?Tp1yDd1bS9szV>tMJ%4iCJ!#`FSq;7uw3k-v8ewjzS-h~px+ zTd2iV5h!^1-dqY7Vsah6$=%aB4eh@zaDN${|4#fsX3CGj#}|RGQ1b-$!M=Ls7gD(T zHhpf?g65U2+RxY+IZwF6Wuu2l0>OkaW#E=QIlnKQ5CX?Fo&KTcb^9ERkpj&O2sXjr zTr;72X?61hAoB29ZvP|cEEuBd+Ad5tNH@sP-QC?FDM(334$aV@bf=W0bO}Ru3ew#j zionp_;dh?*`v=T9n|@oQv*=&Rbfp1Nu+P^w&+A3%8Hb<5m&(x_XG-{sO~7(T z(b=LV;WLQcpI=1%@6L+MYCyY!L7P=0c;VV{REyMG;iZm zM(#vN+J&2hT)Ct0pOfHOQuzgqnUKxWP&70-P=<>q#wxdC`oTgD(QHSi$O%0M%3qU54w#9@yU5IfM3M$H+V?)Gjn93; zCEY$HA)oq~7F4%gnYL(g%|64Oj@V@HYN9-Fa5wQyO;%b<_LCo;*r`I-D{^^8oRzLF zq;3gMPZeDoX^td0)P?s{oMKnpXN_pe_(-RZk#*lyJY(F{zapOGzGCZv+SERqxqXDa z!kUW(`G$secJIk+oa95g0RW>nE~#ZXdAJx{jY6{(iNMNqAcX@on* z!s>Gl1)^9u6D7TqrzAd;vmG?^DAVIfm>!PHg0es1PGLfJRfaP4{ zzhJl%1M)AdQ}8gq5t@e^Y86#Loj{_bfjBPvtU)f<7vhIrcV)-!au)_aeS~kG^{p;F zolF?bBefu85sS2%k!c=sUDfNZ&6lCIl8YomwUYZcoWP2*L$p7+0OxC7vBc%4zNn!! zMY#6d4DPjh^nUY>AXfr-NcCRBmo4W*3uR!Gn!>74EN~-@7lyYbAvEGqHVAmV24MHu zHJ95SnI6GG<1@sHAGIFvQaT+jCWaP~mhk)Fl1~wP?ARBbI+{|nXA#B}O#=plY{e|b zR|Um+c+R?-P!7mYZF=fJCjLNjqhbY7QXKK6$SD3WB8(Z=gU_jJO{P#SB}%;q{`0Km z1O#`cIH7_FFSjH4B~rVr#|9;Ov6@7fLQIw^JWCuklgfss1yRdR2>v+@gq)(ytYLn$ z5sFhO+>ESqZu{lJ{&mc%j9Fi9U2r;_Kw2Wkl`6V05ECstX+9K=g`>GfL*2waK8E&q z&CrfY4VQI*Eu-{4`VFN;xzJc0o5=b4t+`8;Kdz}oP7@pztczCJn0~5oc4w|IdnT1M$nEK^sT53!C%~l8GN}kl*1(-gwjj~7`dwn=&u1A_ptn!5Ainuqb zIoM_`3^-w-P|eUK3r8A??V^=(FozQpz24>Ui%aAz(%~PEQsJ7CuN{NYN=xp0E1hw_ zWnBi4i;0lVGn5>+eP9)srTB)T4Vg&QpcL19zLD&^yV@^G>63bxABMI_DT26lmSxSO zZzV`u*s}vT-?_XKYCdt)6&CcB+hM>*l8JX{YPZ3yZXB$mFVHa|=ek@(?CN~^3F_-i zbQ)R1ruN3^#i85r-S*7CD%z(1Bj9@^q(2r6CK_C(jS)F;*6ny~{@H|bjC44@gqQjG z*J)(_`(<;?OQJ@L`Z2hdLoDTvm3Ysqo*4&8Q!g7qM2^GV)`dlp6qdgx&HkpuEo)k+ zJRKNO0e_PdrL9psFN~9p9d)!V_;f@O9N$O;q94$#?@SD@6XSx-b9S?D1Z?zEz;PGR zxMkKG=+YM|p=j=zuD1e@5i8?WOoN6KMim0|9n&P=Wr`nhI0$DHO{PL0$Ec)5bnk2BQ18rD_0w&p4IGt_%Y$cH^>l40KqQZv ze>m(fg&{)*OtFjGjS%GlUm@Ob)^~I$38asMmGDzkNR>-`Rvb>c0Y47wBJL+3@b)UK z3sD9M@#l9^Pqd#&lkK!68=cULlQb}7v#)WQH8{Wbdv={1U)h}9G%14P_kHCH97eCx z5yY4NM7~{_LcGJl-vb+_o9xrnhvPPWU^Q`9u7YaVV2WEvF=DdA63Ho~?A|R4|zygn_pr194lfWm*Iu=#aCc>XRxeVdFG1 zE2F7Nm&=s*wJQ1@8RW8YlrQCrhr=k>>0kEK;%LW?`zrZ>7Eqf1GlqoMEG5ah&)=pQ zG0wHnb^WS@TsIVu(SGwX%2MoWp^iC|wpCdiSyGBgBbPjuI-i&rbKLGjn$o+vA7Tpg z?yKLw8s*2?xM%;dEg_Ue1H}3hfSgmQ%WNyX797lmC0F~`DHB5^{Z})+{nR{h4%OsU zqNLkfBs__lr+@M;ZO1UNpXJMsT zAo^a)9vDj#hntHodDWEC8Q>cM)dPR923P;5xmQ@*`%VF;p{hdr+eug0=#%c;!omRH z3k2P%s(9zfLN;Y^(I3SGoQkE-C&thBTv7uw8>Zs-)6~zF*xX5hjA5$%CS!c zC5}3Mj^SrL8mMjda&&$;SxC7j&Utn+;*8hBJX&~{upz7sB_;52KX%p|ZK~vB{zi-* zN9j{P*}mCNJMZ-K=cj{j;dgk83U4ZG^e`Mr^eF|d<4JRx#p`uEwJ?0Q%Ayq$ikK#Y zGvW^@DaPM=h%?9ig6jBNJu3bvnBpKn&v<*OlZBoCQJ&u4l4Q7KmsB7L;>5i8Q1ekr z!*;8~yIpa}3EjG=^i9e(yiDG~7P$e^Z*MI0vVqJ>E}x{!3%(UCFr zZ|Cmv{@)dznWU78?I`?|px)-~My88-8JwtW>)@h)Ahv$<0gYO)L$I_mCIS#MMIu@$ zXFu8sazXLYgcJ^GejC4fZJ}6=NXS~8I9gm$4Yt0{zwr1WuKi)RQ=9y-;oBI~Vld~R z9eLxlN7nenH~K$=gvr07Ra-n`F5hDmdWHpVF-1XpK2>THP{nrki=xE&#DY`}18xe0-YYalfkfS!_v1l$o`L?Wi`+I^la6Z7++JXCqu2 z%~V-8Z)BagG6jK4@MLKTK9v8(dyf#jD(snr;*%#FPc0TMel3$iI;(-7x=eE*k$ft* zuViWT!>H_nyrAC*5uzVlh=jot6|su7$~DN3v#}mcTOxBlz%z`sUTiph8O6d2K|g|e zW`!<;BCcUmkoh=^oa4T8axDEa6eaTw0 zf=NKWaOtYvY81pJ;O~ZFgEU&X0bVB6@?BsI>~Rd}Sb3O?sy%x32J3mfSI&nU5UZ^= zx@LkK7(&d%sYeNhH(zY{8cdKq<*3kln|+=NBtw|9kcqN$85a6F6ReuN9hA`EW&a4{ zm&^->Tg}x41CR&63y$nwrH-WutoRFtkpt-FM?%5VyMH43;S67z&3#h-tRoOfo5cQ<{iN<(0? zcKFI)rDmyZxV6@=ac%%(;a_89n&K=R`fHV_=%Q^b>XiwiF4Y+`nGu^(B8#<^ z5(E>4f~!F*VBx6+%FE5f>{TIsm%#H{!+!_U^N}ji&|QtMb(y(NNU(w|C3;Z`%!yx= zdL-!=vW<>T#k*B|p*|J^l@u*Sd}|0rAJMF&I317W-b#P;p_Xu4gu&G;jdGN%P!TKP zQgvty>KavL;?!e9UAUG-RIcakKebbQrMj>m9c9|_*|gnH$OWj2YzhBcZfxJw%ca}Wi0Sdl5NXdYxa8IMW(Z*HXl*#4IA_R5E%|Z=xB2PtsA2J9dm=GgRsj+PC+h!Wp4Gm30M;?hjbY zgOj95c_$xbUtO>xc#Kzrz+GlK*>kCVq=i<)*8>iN^-cwzy~{9tMI|L5evuJN4$vR~ zS&PSOEr7BA?ex~xJJDQ4)wa_Ze3|mvFvlaT#@Q@@IIYmNU2gJVYPKqBW})QpAd_r2 z;|r4HGcorm9WCp2;rjkmaR*pJ5&D%dC{na2HeyoA4+#j2P&3C@TV3d9GnxsKzYp_N zz9Fr&@nzqf=5Lc~jL;K0JiN>2jtji+M{|s|DyD>x4Kvj~7c&97bpi7L(t#u-~z8 zv0t{@TLaR&pM3)IQ}9LJ%#bJ4xcAsOEjd+nw;oz@#ZMq3UmjahmMWaY8mTYgTwRb{ zXro%2juoK6Ia;dm*c~N;e(cfY%#Z_XC@Gm+hzvy41e^m;G8ijJuzoCZh=KaJ;!1BC|{pc6! z0F40)Siyc|{q8}=jH$F`%Oe~Bw|XYnjUsL zy=yPO^|`!yrhI2GGLem;P8@NzC>~+@hwrdJm?d5h3FmFscN*~*>`(UizDsNIX6Af@ zS&ixzGF>6c(8$LKLrcM}KL*Z4D@H=D&~1hir@+%}^?V&P%REGUnt zq~CLX)mIVS#V;mZJBCe*`}?JC`5q$lw_)r@Tn(#-FwbV=5?q&t<$B6Y%U~yO1XD}k zEOe?sII_aK>4<~&;v<`+Fdt5$`&vNav*P5Da5;pB>q79sfv~{s3@mRSY(q;P z+^#kvex5R^h4=(oD{U9Cmi^gvABF1Pn`ycwTq?2Yow9*|aYv(ftSP~_n6kH<3jBfH z(FjMQt@{h^C|H85>c-BY9fKStc7Rj(^4%A5NLc%$sa#X*22Tm0kIMXCWaT^AdOqrF zj(K8ld@6bSS_0U?kECM(igNuBO*|6V>mY$``FuQeqYgVWO(Q$zk|*$3^jL|CQ?YP> z5zT9rsplMAV~B&D3EG+;3n7BNibEP}vlCzj=pg3wu?4-b2n|dWL^GS^I10idlDfWn zcTVu{G&|s^BSXa78f7Sbd68;cymhlhOK~Im6G^*py`o6RNu1{#@1g}-beziU{OBOp zj#pgG{CIj)J<(`%NO@UP8=0UWEm0aJ2r$IJo?&s)AB zIHLqa*k~i+!RHi-_&x=Ug+*>{LPfb6{@~$jveUH9&TsS2Dznqfy4(BlUjlr|JrBX# zrRf<$#xqV-&d~ zpIB&q8w#iYJ$qTaG7%S2sTb0yOh( z555^UM@%+SmaEG&1;G-kJB*E-VS*EuMlbb_a%I|}*4&81?$KVBum~-;vs2E;dTN=* z=T=ur3J{V3)CBZ>%45mYJ9)yUV!@&1pQsLy*iOlkEIWOQ1yH@X>GYZExDlW=127zb zxF4JxSp+y@HQ@`%mK;pb-&g#5FztToWB7_lMhj#;qCt`WEgNh_Ym!>T>?vNufo#~XoYPG*g&0(?la42Z+(QM(3YgDw4c zF*npmraG$gXd{UXup^0?iB6BcUzV@xykdW2n#HeUZ{}x36(UGy-V9OKr=f!Q4ifsb zjtIC_HKuQi1neKv?;1t5#054JnyaY@?*8_pehA1@%ix^Z*qAuo=!h;HZtbk*p<@c7 z(P@Q-&sLt4Y&ot?PZly;J~_mzsj2`cYx`&DUrc1yw9Btdh^oPF<>@7|!E@H#&$(*D z-B=D|82&EjvdzmJdT3^YT8KX$7^hK;0#arU4T^g;^TV)r?Nb!YCTeGr3wDs{o|7r#89AvwA$b{Da-KjEM^2Z z>}GlL3CCF4$hx5z&b}zNe^9_79vLH9rY`r-+4&_@ z`(mEf7&CR4`Xd7ABNe24m}H@L@wi2BmE0k)4%C>PI=N&||99qXu;=m_Zm+p9xI~W9 z85Vjyo1_lvzSS$5nS-I}xqS^r-<3GkXLDeTjz7vp=l5n%G|c;}#4o2=nZ+WP66?y0 zu1TK|=!w;_58d_QF6Ace99s&(pBf{v-Rul+iu0xrUTWEVsVNgPrzct7SOK( z4qrUn+_ifMazn&*8tzXCge8Oke-cZ=HM_7OCz>Mj!%3`f5n%>b;gB&>1DoC{wjht6 z;DPmf;3fN)9ihD49w}cOUe1}2iCwRV`hyc1?y|mUoQ6Su2e0OO0xPwTv(v(}f!ieC zIFLH^#q8jtaez*}Fm}q4%15aFAKHCd$rI#Afh=sdur40FeS%?uhHepcJEquMAig>5 z96wk9mK<4W#{jkS$Em;2B=3@My3=-qxec*W%SPHTl`Iv0?1WeexR7*fw&3DFBNT$U zyec!!j|mK$X#bn}h}WqH7a(NHlhn{|Kyuoa)Q-zfA!G&Ct1|p`6~(`$*m}Zp52JT6 zmm>0;P)tTT60nlabFvdki;;j}s=f?OY44b&g!oI;Dbu~}1gvz1He2p7EUh04t**Zj z{wo}}dcFe%69E!@!p^!5t2!FmpNT54ahMa1a5ydv@_8 zj!pz9Bx!aHeuGauL}I?{bNg$8`IkQ2C?7c}e#6Ro@3xXGZDjRe9gw1E z_P01Nq4wFV%PR9Fm4pWVE1S_JnKtOg969xIJsLo*VVKz|!+VMR@85TsK3|FXG$WPNIZ>=Nw|;(k3_+0Fx-&q^Zy_I(L2El*++SNVS`-N1_r1P_ z@QI7Z?YEbHPc3cf-;t8^3n|MJ4^698J{eCse3zYqR|n5yAtso0zh@Jt)F1N;akZ&p z?UT42wh?W8s1_;DE15&|Rthn_m^MjXaDI&Vvqj1}I(Y08RA_|V#)^DO%QWrF*!YXP z3An)W_Sd!kr+wjWw<^+66-~j-obSVC%bU#jgCcc1W6xoFQxMsC^op z;kXeQx-~Rs{|MXpoj;uxV|!ihjd#}4lxG*^97}gTInH?5ts#FRa#OIpho!N2G!iek zfFq$q^mCjUTcp1)tcoD?RD~3F5`D!5*wqtF<&Ss^M#Ia>$r)S|uCCk^wov3vY~%<4 zYnIn;WG|7Utw08$53S<+ijLKz9o~qsA1#~Fw9mXl3)YFz>-%%89K7|i_n|5`w>6z6 zE^c-3F|zh#S$GXcHQTa6UZ`Cd@5)(U*QE{{YT%}VZo%Odox?+RKtW(560_nUzL zxviKjC)tYBkCC5_Vr&hMUby%k^zWlE(L&cawW3lZP6@YKdQhci8?vog@{J6zZs;F^ zGS5Gq|9-n<=E0&b<>LUka7^b>E^g{##kUeu z-bJ3x#$(^3+bmsPMfVTNuDUShAO}s(-qHMhcsmgkX45e>+K)S>f2az&9wsD)7VfFCsccx zYRhhyVf0N!U9!h8MMkFxzj%q3oD3c<)!&9+6H+k?92|e3(P_|HYqRJ*R7`a%7cW$O zZdfE|VF1WrLBYY{;bF&Mi!L)Jto{}Dd|do!X_k0GcZKZh_o&6>XnmqxU0rMB(;R3y zq4|>q{y1)X<78pD^i(RMzt5{vtjs@5@F}gJEP)ZJ3ld@L;Fw8=2WxyYCp+S~1aQgX z-e1WT%-xD*8wr%DXikV*4(u>?IZ_gc98z^5e z6t*1gd53&c8gV;yi>VUnbRFz`lp$3;(rOnuZ$>RvrKTEY z)Y|{}^8096ht%vEVLG^ujo9O@NXPODafjC@*o0qLa`!N7X^NeKVh-s@FuAH)ogSZ zgJlVnT>CKfQEcQa5J*{xY)NXK@d7zw{u*qB!(_71RM>Tppb;#mS`Eow3qwtv&B1^i zOBA@y@*P=V zKSx@DiG>*Z172yULLtQyYzQ4#d9o+ayy?U=B^SbxH(NYrcM*@7HU|DYI4P?R*t))a zyLa?xhkm0RBCat)SRsB`u_=X`sv`?}Dy@aFI#GaG2QOk?m-!Y8Tu9VL7fY3}KRXG0 z_kXS2-f9yV0)b4gtcZZk@c@Y5GP<3Uu5s`Ug4|8I`>l6z>im(X*U72^ZE`-~kX5q; zRQ|wZ4j4^M_^p9Ud;~mS4D^2Jn{c^>Ua#CP@Y0B)ol|BfG>%2SelHVo3qU9nYHDk> z-H)OiJ5)X?FV8YkuElShi+~rMquTUZ=60f4YhTkG z0X>Qs@hZtsz$1;GvfGbUeO+@y)-+~93}qHK%1Av{71m^$G|iL?lS2z(%s60>kA~1F zm}w7K-n;K&;3OI-P@i8QQHTg%E7ki zUJ%Cn{V(SjOlA}yp5<^Oi0QPkcvzFUV=8HkwGC<MXXJp5T1$9XBo!-MlVy6{nlm|np(kW^81{mXZTF;$`H@@ z!8^Qu&8oU9SEY#vzQ}~_!llUw?6|pdu*}$~<29Od19a+Q-!l|klceuG1c@I=#7;>V zUD1QZ?}2w3a{jQ@=X>`qYbSES=CnmXG~0hAy-v>)Kceq9iF1Rng@xF?#ji;yeVcnO z^DJQHsWN2g{SHGEpShZZ-=G*U`q)e3OUdcXvvv6rV^YygZ|?Z1sDvNiMVk;X5@J~> z1)9v{Ygh3^KqzKlu;hr+u2b>NvW6z#tfnZn(2#vnhoSR+3vh<ZV|1#eFH{itpvj zN__`02;xFg#bJkuea{e<4LGYQOnt$81O2VG2(-hY&PaI73`cTsjoBB43DC-Y@-P;UZRtK-dO_qR>^WlvsV0mWJ z<{lm$jqYdVfmNqMh6f5uezzg0WuHsN(JMQheIe}Smh<*0-YQ2#Dq0P>&0+N&1yY?C zmpQPrv!zxBH)+675`!nm9gH%Y-+2|*e10R~hXCI1+AjI?IrE*yGUsj2ff}E!I8)UE zHibRKPq?1A;Zy!W*>vPx?K(KRsn9kLEwfP%xOQ>-`axFd;zwx;a@6LAm<#s!Puaw1 zLhm`3jiPEEevWArl}*w<;edd`ZU%N#el-=e#`BKLuj7xe+*@A3KDb))S3FD$7F ze$0&z4ad_oyY8kvV&r@J8pTW}@=fBeh=k>}+exphGNty?ct^wU0EkwL<`SH?GimYx zGDq#%KMT0NrJf+@9%x3O=B!yjbm;|D!fn;U8#;_rZAxrQhI?{ddY@9pb#DAF*Vfj6 zd@0$kdPM*5d2uU%;%&gvX9ry(b{67J9t`TX4w7nt&-s=N7`4TnyY^`e1#}i$NLG8c z6%=IqX%Bn9gK@SKIrX8Ta%N$$CE(q<&p(v zMNg=8w-U0DSNr(|lHReP6HX9%YxT^^d}Jz)o(&dB;6fQQTP_0vTlV(%FSq^y&s$Q_ zbU8O>3hkWhm9{+KZy>9Y?Pv8!ifco{?jO|BQQkW ziX{zb;A!|_fJH!4PWoZZQ%%zmBwbzP^K8TxKw?2k{CT9@?Z}+ z$Nd=t=-l@kX}NC7>1?-$@V8%ZM?L#mVXU(lUpYVe9gv3`4MX$j#Y83Ab*PP4Fw&At zSn~fy&Lb$0>dF=KlR1Pv@M-*N#l{%;^$Q6Y15jjzJ8KCSr>9(V!-P}cG|I%CRA61VSm1Xph`0)Q)u@5 z=tbl}lUEzDDGzx(+Ou_TSJ9tcgCu2B>!3H-vnPN=$*<#Y{OwqfAoTY)Op|104Newo zAxC`rpZ_LH1UyT46Qm-rv&567+2X0EJv@6uliZyS3lR7-!_>S73+PUgT-n({<;Zvz z<>ikteuUZ;O7xV7!cHvNg*h{|1XKH0%q6g+qoVgeoS36FyNzf_;0&8TmFny>ecth9 zWKyLU9}8olnnQfX*T5xp#xrjkpw=d(GM(|B)6 z4hQ9B(_UrQ@$T(sX5tjo>J&IpsY1NwgVy{Am>68!Q3Of-SLBwu{0h6kRy|`DD~^%_ z?w+t=ENKX$i;^{0A}9W#o9&$EE9C7{sl(g^`}$Z0%c36r_o5$HIFe{0r!yUu+yT_7T9I9jWyTE2@L7+H(+1xezP{P22*#+1&j!6GZy z8?LpPk~xu#Aq#SbA2_=nNr><2^g1RqNmJ5WkA%XD%!BBX9Qg8f9IZME~(pL zzfp}L*hgF)%ix-uo8vRqYt4fLDnM>g(ZK@$Qy`_onFQb2=28hwCvPIH0%M-ek!9v; zKde?7)f;WtLD#h!LB4X0{>@=YT4<7!YhbKbRH!>Grgo6%g#dsqXbIMf6}&fEwUS0g z@kWQgx$Ki{(>r&)bmg>spHagd`Rip~bQ-D);FOF8eMvRTKVDw+u>p$_jhj9`Bd z5DV`7HY2A`GFEg;_#PMa@S8ezfom;tgU9?&ey%UytbuPJ>bG6#5g}v1|S&c=v zET~RO`Lp=Sb8m=0qU5EduBiLbe^=bKijdUaRZ z8j4BHZ%|3H7ICgzsq@+5KRDU9X+6&M&oXH%;hN!E)IwBr3nR#ezS?k9F_=L$W4f~Q zs(xN&1dAFDVi*%V{qFK!@aANfw~oKlN}cG#1bKlQU}RX&7B>*pz=nt;Y$f?U=KqE^ zfkAeEml>^#j6b2&3~^NQCB?7^xW7=lOYZh2RFL&NFU$>Uzf%swjU%djzGgbx38oV} zAM<2aE1a3m-J5vwbEP~=r*r}U8-Y9qjY1U)qF5T8aznWl4+big$lwI}zz>Pg)KCTn z)>*yhBomQ*Eu8X4j2@^h*pz~_f(OE3546_dvcc+%4U-@2intrAd+SC>gAE__&>U{i z9NS!BN7M7u-;l#gCTN-)(yCpNIO|`^BV45stDM;EtKDof!^;yyZgkaeooaRxqVhC>6!_(kXcGx2JoqUrft^ z3y?kQtA^)KBy@$hrjJdF;uftr zKTP4a_)t3{`UCfHU_oWJVpb1r&=1WTQCy3ZlI91lP{*8jFJlgh4a>EiZ0CaB3-#}AzYEZ12CWXTvsEQ~;AkTzWq0rFZWx zhq%m&m`=!@ufJZH;346mFLg(Ab&bE~Fr&N08s;d0xNDy>GV_-(LfHDyF{U3 zHJ@pfE)M7;G%K!n5e-QP4gWR=A&Oxj3rRB-SX#<;Yf0Px2l#6Lx?Lb&wm3i^!q8lK zFM89G1_DCu3(>yjGU5>numsmSn=XV{NrTVpaTm3jdJsw!7k%IAUDc_du&(iAOk{-- zjjgl^71J7Ru-g=IjvzQ)S(i8fEBHbOz9{HMgz6mWQMwa%t?z}J^iE_f0?hY|GqW2O z_^)`SA}P5-h@Oz&VHLcs+V0mz!RC~fT;z>DGI02cLONr-&rAJ4dJAqZNng}f2g~u3 zB=*QRpgV9#6)oOCS%DFgy_t>3|HL{|V%P$*RSAY7JrDIihFBXb@A<>o|{=VO;O zoH&GH#W|krGt`Pu3UKpHC{|;%m`ip?qg5DqL(26CT&{5>V66R0^^AA~2sBXv= zR-xO`&;9WB1J(#~e?|Yj^_gqqGIY{fA%!#7xN|1ILaQ;nB5iFS~&Q zLAAsWVYEd^!vDb^z=nix^G1BM4zdT=_)UL1DHd*zfsEK zmCy8&WoX5Od&NR**Y&oKzvsMU=aYB}x*1m0QpoUms>}0wDSVl4cYI*qh60()E{Q2})AEGZ7x~aU3TKmDRs7$pE2UtfMxA6Lsk=E^qo8Vhe_Y%4 z+dZL)Tavc+OLnvs+gDxO3AKV`!-C2+eg1%9v-h1<9+N>0Yst&0bvdS6Am)T`DZy*A z=UaUaM%qEjkZi%4U90vn4dJC{A*s0IbqW&q$)W+f>4D$K-|pYL3BCWLRR#w+&0;8Y zwO~T-)?Q2^Zs#S7^=nZJva1_&@14p%1VU^JPD@+k?}&e`!w7E!zsmyvs`!iN{Q1$I zp(f+%x5c{29T|)wPctq~x{oa}YwSWpX@hG1onDS%@1FbSu5Iu;ceJFWo&)`1$}30( z?JR9JD)um(t0OHuVf&1ak3eR4cf@UK3tdPVvyJP#CN96{t^f(zbXnY(`D;UlG zgWiiMnsOTs`ci2R-Oq$cBvY2ypQrr(-nXuQrzNmXDWz$?jT&Tfre<=!XIYeG?Jm^e zE9Eu<7rkJiRofsM^>=q(1d5p@>&Oey(_rBWDty1{X^d!}ZA}Qb!C^N>Fkw+)auiL$ z(Lw8j?M<2D;8)#NqQ*cQ$JXAwk>=>k%xc(%88yz&ZjA@;nIBCQ1J zcTI#<3g&HjjBm=z+$;$l|kyzge)HpB2Mp$K4j@l|)qcfN!q z1SmtMiXe`*Koy>ATAr@{kG^9k#-vSBPBTa`g>?A*x`peK>)+kcy^K7gg@v)D_F(*b za;d0%VotrYS_Ythd)enKm=^LZfpf5sUu~E;m`7=1k)WOa4f19;&1*hi6{C3W~@OQlRZSs^;uDpQ48*gmhvNEKld-LLE$ z2S}<%3W6UzK*~c-j6uprB56e9jFa8J)l{w4>56Hh2+t&W&8r|YPJA~8N~mp!(DDT3 zTWPIe8pC3{6U|!TkDNX~mO-@?rg_r2&%E;(%Sw_Vu-qw6XG;qEIBvN@OjAnJ@}&B- zb6s8M0z;h_4J8!mcX^7(!n|kR`@t?!HJ;TpK{|2KE=D-%GzCOMcsX)c>E-;T)>|N% z?Wq#TGp+klwsy_ync?hYE|Wo-y4Nb#RO!z(RCNJ9l7_Fwst{kwnT9i)N@-ncq0L{v z#Pogd`(Yy<@@3sI0_EUZph;0R z8T#pIdV9Pv20P~t*TGx!s^!qdwONgOnb$NS31Egpm$Vl+!bLqvXnsSZDAf_{r z{OT(PXD5G=n-gvhuXg$7{TPwVZM;{IBs)3iSQ1Y*;ZRd$dzHyFIlYv;P4MQllQBP->h4B;%$#lnq%Kjk2s@Puo~w(eHJ~$M=^pNs);MUo;&jWK@7d;DA@{}&%LJ- z8v(Fjs({OC|F$nKOcuq=da_~j!@}>GtEVw^@~lS<9b?1jGKZJSl~(mK4G?K1&LH&8 zDO&c$xF)%rSLYjnNp2O7czJ9j)IRnb0p@kT)qYapGU+3Y#64_Ig=U+6D=CU!EnG<~ z_jGhbIK1>IpQT^iY@q`n0vlf3ZDZ@1#5C@p9j=0b z=0&ihI$|dlGW~EgXc}3q)4KRq1{4lI@pXyF z2hi8Nffmh#i#A(M-Av~3=w~6ba%%T$jnL(VSv*7NP*bw_ z_b%=M+a9m1r?Z3ox1XQUfLo*24yxF#BgdjK+8`o6|Feke&D9-1ra(T4|2OM;-grZ8 zS-(w(M=y?PJcgW&K9#JPZ4&xE2C-u{;GUzy_c#;NFpy044^k|kETe+06aDJ_?bEgF zp!SnEIz=@!Jqp5A$sMykV};Lo>BTG2e)FWag&=G!*s5}UZCwbip%L@WCfH;ST7@|3 zyHwASCIK~ol;5!)yEx6N<17rjdjMO?QF$qzT4=>~Mpz@sGlGN%@^5QkMXKA& z*t}Y|4h-M)hm$Wa!jDPR>irkm9sk-n4 z5rwKT2|xUmFWy!7`Aa=i{D#f+2G_pV6t)-b5|S6&xO{GmexJS3K*I)zIA`NP7`fuN zoT_a`O8&w5U$>5mLu$_>9tQVwR&>wjcPBrakqdZN1}9TT3|&;O2Dx}8Bs9Feg#g1& zWtJ7dmW_ab0DxVB(q~%%dw4Bo^EE*LOBf#?Hy_9b;&BGXfEFYe5p~#xB7(zGaHN8G zh22ngTSO4*^m}!1QhayilXzsKZOW}9@5L7?<0J@&&V|8h!+~apPlCcgB2Y{hPYl|W z;sdQU?NabjZ6lYOQLe)Id7aQf>8&BjCnym*D^S*{*&dO*Gy5qDaaoNb2dQ z9OZiE@2%$xiq5lF8P0cUWHk!KVg$l0Buu-OWhOasL&KlK=l083p73Uq>A!L&fUVXL zFdJ4}B~XQS3Y|t^uF+Btx5%Ttbf`}U%Bz&5F!T1~tA_7VgZp_M${>RhVrDbn2T||0 zu-$%_mGHOB_zCeOEv7r*?&g%3q2m|-j{96&P6A$A+)pSCVSl&_pP2-Uh-cfjbQi8ex6P{KV$OZS>ZxM z!?I5%)-|P9#-RYAe4B;6lIQg^tKtmo7eC}wHoh}r{YlVcobL(Uax=3(KE7drZP&$Z zF`uxNlW-8U($BtNO=lT}%Sd550h$e5e)EibIEq!9WXoihDL)`Gf+Mqk0Y`uI?VFOjy= z-hG4tl|C&V&W*jhCYiw3c4!8at;1p7PMPFNZ>xxrL&0%juo)P1#79)P?BxEL_&pnJ z%+C{({&RN15x z4V@h5dDs7Obk2X3wQUs7wvCe}YqD)mwrx#Kwmmf&lkLehd2%N=*_>>>`+0vj|G++b z-=F(h*IM6&Joma|Ji(U!@O18MxMwZ$!O)=^8m9otX3Mbx&Tf$#Qhp6Ik?U5W96}Z| z=G42!Vv|x5mk(9Cz;}Odpx%owd?7z;*T9~Ohi=dfxoqQF;djjLfR%x|I1Wg?8wg}y zA?{moEz-7zCd3V9=87iff{6T~?MJ$!av#LIty~gwG@O9S;-xFS?`I)kAY(E)Tx!Tz zx@3+bd(#POg3cuu^Eijpa=R{TCR-ktAD3sTquuD)AZXI{0`r=~Rm+ti*RoL+E^0_p0FpK9 zzBHDbm-S457lw<0=eCL7Crak|qj84RI zhcBvF?0xL87R7=AH?wnox09h~|CE}l=zd!?2#=THigRe7JwAziP>4{$sPqVnb68Gi z=}03*eRdWBJKMk!F_=ajaytz0c-JCQx)^5o39GPV3^XzsEE%TjfgxsrSH=9}{msME zlN~s^2;gvHXw?6}*pbHA5_zDYF6*&rR^9;hs|+9aBb)v2@1Irj2o3`SPN9Cb6Ajt* z-5oQuo8ihsLIdCPpne4K^LGFEhvxNA>T|NkD{}Lf^?E0q{{7APD?$lZsua1a1gX~w z`m7BTr3=#^XA%G4kH;gq+5{X~i*AByR=+71+zVrLP<7fsdot+aseOb`#HjeQW<;2T z9fi=yCeXCOjA$4ec-L!Ori1+SsPDzDSxXF^L$k#CTk`iIx!)sO@5dPpLkq?<7XxKe z-+MaAEb|nnkt@QQBvBYrTxy<{Y_9_cSiVIzw8mRt(B8O`*pNsj|J!O%DHS;f8RWuR zm&W(IfWaq-Y3kpSz*zN~V+8$TIa%#koJ4~}&k?LNktBvKCrG(C68ZEUd zCCW65XOra=aX;uXBgm-zbW*SQ+mO--4+94+=|24@70Ql>%t-eXz~fPhQL)i(-fuIa3j5}zW!Uosp}OE`MW(y zn2n$mwzXpst|G`Qsj^C=&F)knw`7#ISkH&Z(r&Tn!$-kfGU#atwP|hV8^Kwoa`hWM zAW6NVxsRo5g_Gt>){B?78X{;44gaylIcNXlrCXcN(<{p!n}*hn%g!{+gDEFYp>XSF zjQHp4Z+HBs=L$r?F}wZLgl&*j>3Tf@v!ozwJH7pnl(6znhl*P{;!};QgP4%&*_r$` zusJ{cGcqj(7VEf2y|ILyvzfie2mCKbl9|3t6-Ub{vdoG`_I<97R&JU-S8GxMM~3iU zZ#JA_7EJyqC1R)|<9vHjw}F`sd_YnjmiUPY7FWsTxw4#;nb!Bnwc%I^k5^GmQP-G!A3a?(qNaonF7QnBEX&D<)M{$GJ_W`0^;#mb)7odk zd<{#wfcKa5y3j28AoIc2mPAm+1b|}x`+S3ag}M!Xx%x1obqakp1LKXqS&2UG4AFlm zjig*OVwxSAaes=MG92ycoSn;vs_l*&MWf&l*qyg(o6)hBAotGwD`u}jzyY+heqi*w zaeHbz%LR+>zF0AD>vscE_g;c3x%4GOuK{4OkpBs<+=m`QADRAZwhfT_DuqFQU7@#19J|aZ$ zlU!mEEvVwVJ#yV!ztAP|w#Ds~?J1mJrjJhAgnQ$2s=v%bPs@Osp{UM)xZTt3E>A`N zQS_M=)$m1i$%sp9Gxk{A`N*j&oV5fcgFysp<^3x*cml3NiQ+s%RA%(sMr_N4X%X^t z!IVEXU|YHkO%n;-_ z&-coQDx4312?YFO=@wf-H{Z*u>Xb)4xtO_v6(^vezw2d~E zyLI-ojWViv*qz!NwYXi_a6h&8lKPN!GU-e%_6szQ*)E(#402%U+L&z7E z7z=B+^w_*(ISK6)?9znrAX>^@djk4&#Ho>c98bRm>c=Y7RtI5&x_qkZ)LGE##G2f-mOWbys!Ju z^Sw^VOAOBFA9KqLg9eyUL0LUaQaZ*t=nO%=sO&B5BdEXG8u{4%2)r5E z^(Z6hXEyP4)Wri5Q&UqcY2b3&GbADqmlw%y|ELYo#gQxp^KbGVm+#~+`_4Z@qP}>i z$l4a!?3))umL7IOEDl6T_M6gbZ-2bTUtGTjzQKI#{W2~xx_#3BIEM|`Z-&TfKDc&6eWxExc!^VfFmt434ntCFuZoB2$HzC>A!dJS zgy2`~fh@rw z2YXh#PHZ658RLx)Ca5-{^xBB*KAn_)xZY_R^~k3uQYtRgGU%Fd2_=7M71p7@6!dT% zbU@Rqrl3;KvQSCkJfwZf?tL;0IIj!LSMwL83Ipu=erJ=NkN4hno3}@5#r576U*Gq5 z@khqbPUP9NF7eBKo2i0W@L~Z=CEyhtP6&qlIb1lu$~PmEFozUPdw5)y{!$$cC`PA$D*HIK zRL&!aj1!PqTB%3man@Bunrja*Egl~M#6O!^12cyvy?U(|uj0T>3XMEIVM zq;HYL9FPV{WJgo3OvMk^K>mnB-55sqKCjbG*LY(?YUlpnf1^?q$^lv+O}tuM4VIDL z^(y)L`WOG{zQXmHzgssHy@cy{a3^blD6S!j{5qdZK%(GtE`8Z~i+4DNqKb<7N(#Vr z2gYuz%W4qS)BWhWe-1h0)z98*rjNU;o36tT|D3>Q;!R2BPmTJt|D=~K3pnAB1-*DJhoq^CZj39Nw>?h+nE;`K1H&Of-=|OA^M^} z9IZ67YSqZg>ARO`#i2H+nZh0cI3yXkt^setfMt8)QR_>Y zVuah!MU&h)##7QU&*lMWpbn!%qp^K@)@~ zY0?V^3=kf>)|maiu%art@Qe)}&{B}RWR3Rdv+ZSlN}!a6X!$CAB}W`mNyzl%Ix5Z? z!P-Y(o`kf6WtM93?g$cJgqO?6*(c2TD-o$BBn1~nYZ%KzYESczpxz|4EqD95c&^uqy| zq^X~fs%UrD(9#erIZ6QrhvlkYZ&rIV?m{!(sW)pZnLl)uwaD^64mkx!7`9TD;X2da z5LdFaai#cuJ;-9e-w;R0zTE8H%Ng~3b(BE3Ah$CjYyJ0e4K}>9wsJWotahffg|{d{ zb4I-5Zmu0{z2M$9I&ku+c)aV*ACJVJCZ@s(Al3}G7}jPN&wd_ZrDzOoXpVR2hv(tb zsOVGDQ8dam6*Q(Y)n(*1PeR}zmHSb9y_w$=X06}MMas`@aaG0j{PK(;Uabeuzpn=X z6iIsX4nH1VMjr1r{lhbq6LzhHG%ho)wrIDye0C}AlF_iC%3)u(W+B7cTHc#sD(|9d zn@3c-9x&4Usufv_w0?ZQU0d~3I?roJ$5_P7gtX`;>O2_ZLU~dG98?ooIH6RY2kb@L z+V%I{q&{0hw8@%`6YUnQ<6o0#UFkXAj{1L8?ArQ>WuuZor$-WUq*ZY>pHxau?bXlE!9qR&Tt6JcKg1c-#}n?P_6zJL7Wfs4A*oQ_ z-#Z^Q(bNBS_RETKi&>A+#KrP{&$_EI(!#67i`dcwc6{V_Yi8~=!i z2rZgue5ovTuE7@S{8#P7n@Rk-l(jiIj%)}egUd1=im%Paosr2Q#RG}{9{~;u6k(EU zcF@*{v`AdH0n5k{#%FK24a*Q3XAw9!azgIZVV{UQi8(FFWjA zii*D+CAWUMFQIxbm>8!+!?-;WLSy8>414HcSAMQVMb~4-r71KLL+QpPoiE@(1$Rpo zESoL4)qS!+`9u?8ymsJ7S$vgTmx1vXnfwrd1LT}%_pQ~+dhBe3qR9p(!5y9>L5@J# zV$z9OaLseXMPJ5;i-LR_Is1IJnTm5t7C8{QGGpE{lzEmzE3VLls+O{9ag^&1nKpi0 zHhup?hsLRS-LSg+ywJ!bzt8dXiei|X3$#gc0IjDOYkC2yko40#oST9p#vc>NCc4EP zSkk)Y1Gdb>HZij#1eSPkOFK;}`G93L5;(=#Q}PVFps9l0n9b@Lhm8Fn3{`LAPY?7s z)4ap5w2`}uW18BGkPJyUWwz~=K37-iDxN`Etdxq@>xt*S^ZV{;?)7+6T=umrxihfh2R8V_V;~e9DkvA#V?n$nSU-9ubh5Nh8cf!`~(Y@(4=ifvxg#x zZMYC*>hgtfWWWsf!xdFA*5V}_|4S!L;V9XN?D^EmI1}Cj4Mr(SKK7VdpubEpVI6+6 zA85s3C!As>O;&>J% zV36I(y>^6)TNM9ng#~X}j*9^u*^n5}kFs;4@>AI#*Km^1PUg&H1y9@| z!gpw+lLTz;e@z_X2~Qnex;q|gPog~X|A;EIU$x}N_M~$dgChVRZi+8 zt>Wc~01y;vh#5w#S_imEEiAPG5!PQCjtOPigWb7C$&JM{h2vxmTT&a)#MeT*F0e<1 z&o;$0v5yi02|W)G2Lu3c^8#=vCL0ZPGFp0&E0|mPO}Vw` zvzpkH^fk17HZtw_LYG>P57GOHL$5P&Z5@6AqG2?|Q~?pZ!;|09$CH?N1s<~P06YDy zbk#|h5<dJMpfzQrW*ws)9oE$nXa{T>o$kd_bmf#>o-rBVD+xiFbsFCA*EGQLo)}_hkZo_&OO!TKPAEKS`>yBrRcf632Sc@v!ka6 zHU@gki`T^5r>Lq`2T9S&>FYt&-vrmTypmj{JM=yifnR#aeQwR8rq(4hdP4c%eh|u6 zIJq=d*CpJ7E?AhUT<7?f`AbD&1>Io2BF0`-V2RvUZBj;kHl(*klSD3m#0+kl?)$-{PMRXO@RY{62iD=<>Qu(EHp1IDERluggggFm!bBavyQqM+)E? z*i+rmrWhW9!}z-YvXRMDAM9BIQH5GO)v}(5yq+imKhEn>cnpCHu0Fm`*{&@)jl(f7 zwW$2M;SrS(M|Q&h@cj>A*@G*XtM*mH?W4NUM;31wU36Mfk1`qAKXkj`6dRyO55D(> z6Wr-dLmf4w5{(>aJ*|bhoLw5=`9QHoZqV zAI_tz(PhbyD^Z6LtG7_g#+bMs;bEqANRDgKBI*Bv!&y^63#>j1m>jO6FUrQ2ODQJ z*gyD&JD8jkddwhdb`yQ^D6$0U!ja%7F@;9P=vsR1lc=+*oWM|XXBT1)5dcB-)Z7*Zq)zyFl z`41V8hdzlHk;)js>?D^YdqOC(HZ~y9VYeUibqm(pV4@YL765v*G|Y=vO^iMZbncbR z&f%*q2)bPc%*U6~`$o$&Gld~V(@u{+>3Gw0CVlT~gF}DTq>%AZSI^@XJbKFS?OQpI zh>U}(eiIS(xTBFUwz=pip@ADk3Jp02<6Xm_)}Vn7@rjWDc7V^3MASNZVVz(i|GN}G zmEQ#=d+yMUys~rJE{a#JF)!pZPlE7U~RxC;B?w^LGWtO_g5cO#(b}eIobLT%U+jO1~(7*_UrAs_?)YY#f z{t?PbaEl3jQ95f!B|v9J=uZQG%?nk(^#3@k0x)AaQ+wB1S9Vj z22r^e<+w^`25OYs^2X|fikOUc7*FL2tQdKZNB~mq`kyxydJlf`NkjpM%z{n0!@Lz( zj5=aCnKTG2iJaN*@I~NLJxQ}MWyiHpb>}82V{O!T7}n4~40BmyaWHP|i@5_mzYq(E z1&>_Ac;PU(zRuXe@;iu&>PUH@fk@GXd>E#fq`gJ!<9Z!NAchLe60$-0t?6Lf%I+ygBur-1>*k&ZFb8PDT9_Ez)A()pDZ1O70gS^=WK_Et#&yUp_Cfw zhQjAGUSIR`EXwJm+G}}dG77B&c|LBZ*Ame{{cIhcf+~Dnr!M4jBhnT3vT*=4Uf8(r z&Y*d*$piJ~!H31DYZQ38>+9ua}hEnzb}Nc3tZF?7uKr&F=nA&G3<=NZO*M84RdSyPDH zF%bSTViDi_4ZBGW?q$C25JH?B*CHnbkm!%!udP-KgKf>Tb_Qa+Y<-(8k?U_t{5d5IS&8tO+m>aggdF z4RPfA+2HfKVJlg-;| z_5y4vsebiNRKRV!j++%4Xj5@T@qA|QkDV^ChXwRf88l(QElb2%TT{Hd=HXInJRhGQs)XEzXu5J#|tx0&G>)BN6eZRO)@UZ^zk@IDNF$}E- zGpnYleazb&R_f+cMveXjGg4;7Py07jMCR+~g4$9Q*M{Y0{9 z3&b4~;J2*5c%v@*#>4L&53Ca6=1Nkz&E-}Zms0UiZD~;#yX@Av|N2Pkr7Cvr0q&#J zk2@p*0il#yDWQ3sx1_-L;}_BTYTYQ&T@PBHgA&vC-yeRNjpW<>TEwb%cQJ7q4u2CE z8w<6nT<=b}ke+OfzV1T(OvQEht7pk>I({L^bB@=Fp_8yTK5evj@qW$ux`v;yyXuxs zi!B8Z3-^aOf5s^;^A<(Ld^v3ySR7MidOx+7no%<;j|!L_oW|8upPX}6_8>Uyy3z;( zOrW*+n53P6^v3kQ=JvW`_Z{L54SIp6CPUN;!tl>fLYTw3PhpE|e%Ct@Sb+)-jd%`+ z(rUrfBY{~evs|a>$9JDCx~Ys^E#7d zgdR6cSkTd&O$F9VCW`PhoCv_b|%JHvkGSn}DNo-bw!;i;l zR*X+l;O~lf{y>a7J5jhRyIg0Wb+D0Q^<4RSxhdo6{E%fX!!5b7MXW?;K+w$)o>?@E zYbtK95N~VQ40+E^58gmuJ?TVw$E)mdT|{vBqSqxeAx(lgN>x7Dg}Tl-4{l@_tD&pJ z;iuO!!>;Kh;`$FzfjRLxO`z@&yUvg2?-q1`iHZM3sh_7OgayT%{GHA1Lja@Oo7l-+ zr@bZO=KgEj6K)A)T7OFEu>2UeD~r*$YnYLFHYpAKq?Zj-WyXViYP-~UJR_ML9ev>b zqg+JCB6$^Z4V7fyY{dzAyLN$eDhI*!>^sqOl@!_)gNK9 zYIu;sGJND-4E7FDMLzv8C|JQsFYIU|_J|}VRuzgfvza?Q z7pN?1-4H0u5ICt?X(l95J$&If8_k;40#q|7TA)noD$LpGo8Eyr4d zpamL90?na*u_}GmpZ^B$0;i3GpEZXT4BlEXAYi&S%Q4uP`6UhpbM>PE2Vs9P=AG#Ai3}4hIlRsAg~IOLKE4C(v85) ziWNIPcK&fnGE#JNzH^Z5JnP>VG*2(`$*%1NJk1hhuVNS}N8p=sca@@XbF1bu{s|rI z2~u3UNv%<78`uOY`u)l-58H@;%`(hUQO!HKkV-Rfc1MKu!o8SD;t)(puK#p>fuRRNR|!^z%H zz{6moI|_XvPUc4rT6gA{Y-x;M5#LC@F(Yk4-l9h7?c#--BC1~0UtuZ@cFd*reMOm% z87=(9gqlaZYu|t^U(%;sWL3*Z8V=P4bH}6ADWSt0)EdO!9{@LFcb3+#Tpb_-3QJ}< zC6K%)2MNBQ%6d8`r7i18&vNV@;Q7bbPhx&gg&}R$y>$F3^%Jr6Q+>2M(M06Z z7SLA#?=8TY1@7fPu1;tsleH_yNxUZmhj3xz7Q09k#0$P|uc5s7rk-6WxSLi_^uG5a z*6+vU8A>Ic+_wdoMtnRj>w0(%U?U?k6d zsrgLj0=g+mIC4?4_b5nSqp?8?T>P)PZqdA*-Nz1N=F6z7MFyMNYjHk>;c8sO0l4iS z@NvG2>RWu(nW@%1EeP=vq34CPQ$zt}zneX+XtJ}>3o;#1>B-^4$b2*rYBHAPP9Aj( zm{7mk`Rx6R1OQB|y*6u+9@!O?YYgVhupNTYM{DMiQ~O$|ST$IP`+|1~B=c2Kx#$#$ zeguHxLVKU@)2|bOFa7(J16z@n$hHX=5LF$3vQ=tQGJnS(vwra+U*8!n9#`mieN2&f z_J=*f^^KFkQF+uK=g~Jg#H_QK9(o$z&BL$V(=k4ke7y$h?5{wrG}#4uZMlU8asuVN z+t~lr8A>u}sU#;nAyxjGl5WlHeo7}nkB6Wz#OCZq@qL9kiDxaG5<<1vD?}&GK2H$C z4y+m?aQMrVw1|72S!Vk*nT~|{A2jW=R*4-f?@X~zA=M@S%s?HnlYb*4cZojJmcWtT z@4*bo`-4?ZN=&^%nZ#^(_8;jB!t-{FHj3VocV$5-V}|49;4nNVdDXh16D;3!^B7}x zQLBpY^0JrXqg3S5-S@qi>o1doaVL(vVt4~?u3BkuBU;mMl^d18W`AaT5q0><5(C&b zT=@Y@X6PH*e7N(^6RyFhGBNqVnb0VUMJ6<{1qZKYBVI44R09%wO-Z zBZvx~F3c&Uh((&REw-?7OGO-N+Zkj+<8^NfzmlrpM)7pFiMThafc|5uA@6Awu~n{N zM!h<7ZAW+e4ClzF9QTHj{;6~#boopIo6b@lHk6qFME_%0RpEI?TCdV)MM~{%J7oh) z#l%kA(9RIAHmcGo{;uM*(q8bJD#^<0`e=-iEAF`oO(8d+9mjTEXwY{0Rl&sIxOeO} zJ#c)%*UX!*bXkXzXD`hiXk%1asv#0p*dh||LMRwfreC}5Hz5cw#SRzEC_B(RW@$W~ zIe0WUdx6~jZ2e8&Iz=aamQ4#O`Ix7mx&gU&H$^M^v7dwGiyBg;52tXdp$_~;u-{gs z;_uUNYsADrSkEUP1O}_6EQ4^*N5}Kw>@_e{S6Vz=7h0lZzY*?NCj+(Oh7K&hZWw&#zh7YGJreL7FZ9>ii40akX=3V{JRB_^GIQH~zJoHsh*ctZ^=~ZKBz}c|K zL)vSr6l&g>q|>2us=K8f2W##Hf3lX!JRI4>yk`a1Y&nt=X!nE&p0Z*mCjGSNH_pqb zP9#%~aY8dV^^*J$i1IQ6FUlWw*c;CO=6SnJ{}V0sEZkzGx_=_84TV?{es=YTo=x|C zhbC%Uf^A*kYiFICWu>?^c>T*tL2XDl{!OpS*`Nzov=w^DeoUa&(iZF&VHQ&53+M7+J@LIFx zE!8Wu?nWIv_%)CV%Bu5e;57=|s}-mD}PO_(Ue?*%z_SG4h$XIj&>Z zWo73_Pkn{c4Ux%=kb@FzNp^^Xz~*#J+ZoOE-Pyl8kq*_(enD|9KwbZP0Pr<{=T!Qu zVby&utbAtfH=haFaSE-rUjR4pv?EB?6ffrbGZ6hqHohKLtqW>S>Ll+6rbl1}IkQhc zA8rlkt1&&#@=W_P_KkDmQ=C{j(@Xl_1U^F_NGH=Kd-D01h4j7}_r_W~x1Rl&4aNg1 zlJvpDFQs9j%hw+Q~{0T1A2vK;H1%4Wxwn1$D_PNW5Wi_N@rm!YvRduxe z5NYf7s!E=ergf5c_qr-aiO#c!He|mTK3&{&R6QQcTx;xQte#2^yRK5GrS7eN^6%+URi+by&6$POF&eSbTB|sYMZ%~=TFA} zEXe^VXVgXZ7_)(cuP>iM>YWnUxRhKn_qbd5vp28gZByQCSq!tb7sh=yyi{1V=@`fP ziE9IOaI40`^hN(9s-TBCRZ(`zk$3fEP~RgjM*}tPVGeIzHnF8fCzR$>?dqlHCD2Y_ zl6WBUFzV`II!KMf??w5HX6AhXxlJIi&n&{)LkNuoB2Qj7jjIx0F!Kn;^;*>0)#q_b zpx+&!ycdMg42gbSap*D^ZqBC860B*7 zp>|;yZnU>cYJsvrM!>x1nb}tJeB+{tBuhgM`Kcadk;qH%!{$k+7K}*l$ zLhP0_%=ZtkvyvgT;FV=@Hn1;;O+I2n;*cj4t<6Fx)xNGIR_iN=T-y0~U$cLGR|ycw zmCH^ccU0a%OsZ;YprJ0I*m*&}H+d+nfW@q(ne9N0aIp7xnM+lmg``-dCvJm0pTSeA z+132Zex18YjpXrKvZf^T*arkv((?zed3@SYK^T`1f}G< z=BfzPVV?K$NHKY;pIS0bwEQ{0!J52 z<})yVLx@5={KIPj%jK6$Qo|zyWuOR=zY@P1sgTG(wP$tTc6HZF7;FG$!!E-1t<-JF zA?7#o2tCv9GLp;~3&ml5kux$D&vA>F5%$ZDp{KCt1!07VEh&8KGrwe$xjGojf8^Gs zl@c_YYO%4mGWB4C^C|%N7l43nh_DZ%M1cU z^<%O8kJRn#=V@_CVY{=ooJi9pzZzUo;#ygP0CpKa{#d zR|!d~j3(so6x)pXBPXklq6*z{PBHGY(r6fbBkhiSOC(a)01wRkI zbfA(QCJC?T5TfV;qtQrO+j?eBdxnl2dR+RJRMG=A6D7W$qB0Xz6IxBSz1^@I><0f*?e=Xw-vHr_2hcTt% zfR0L_MDTCU=gH~6(zt4{#p83CpNEQCR{mQzScYY0{`M3O!R0mv>-y`Wug$!nL zNJ7|vd0k?C6XWmB#M_(6-QBZ`>C24Gmi*24McAJE9bT|f5iQdE8w8TDk+qwKrV+QN zVD&v7s=vN%wi!L+zcet6-44nltUJ_!C&j%VxmV-J%%b>a^`CeqE;n3uSteQOg3mxK zK*$|%8ixrS+F9~PCD3embS+9{&y(4I6|13~4JH#tyTiIZqMP7dw0|Tq&78Cd)hhnH zOg}$rkNP}3cf>YAbWHpUy1+UWUG`22^q$l447!KTm!4K0j7ZCEdSRpLcSwU-4ZSuOc z-K18WT>R-C90_)ym2lo$;hU%LwjQ?qM+(r?0vHtmlADmSw**-lUwBge-a{5+>_geC zFT|%5)|_2FkSMJzPv?MyN zkw2c%jd$0EY}aawlTC6S9*Lqr3q}nM$6IY^EuSxL7Whokdl?~ z1|twB_1x3kzdX4OiBR(_sI{q#QC*qj%I71h#A>)DDuTltlNsTOMVB{xJuoQyQbH)c zd?}3wgEyZB)r6mBD3TXZJn4>QJHi-t`gIUTQkDV6x*t}86f+9_et%oKQlT25Wx>WpGpQRZFPmF~Wq=Y9N--iz<2*p5kIZq{nG{^Oqad zGG{5mtBvLO(scrVnq=i%n{+GAFDv#`l2mprI`W~8Q&RRj*YDFcIJ_*r2cY6_DBa~o z?Bv_UDE>bMotClTI_;bWE?>PMo41n@o<8gO^AiPV>OQ&bI$&%A2S) z;fkk(d6e2S6oF97y*%Rq?u!JK?b*;`*rJ{{r7bJ-M_^vFrED`;G}lP@=%>JLM31E5 z!K@yeM^kW~yQ7`3dOq=i8iLsRZSOg7Ujlrd=q)52ywNNMk!!fk34L-@USwj_-zbyg z=A2v)Y`iEf=b#GJ;i49483hBqVnl8(Sy+_QTpjHt@+IUoWZS^w4b%(1eb#v$2(=6R z?uD9SVQrK!@JRB)Hos*y8ZrWJ8wN-=G7Ir+#7q8s#iJ1c&{~MvfS$yds%fwU*yqG> zCRw?XP+7H*0%Y|f9>oTa6j7&xjh_|JuixOmRYW2w$l@F{DH}{*fuq^`Ma5*Grjupa zy;lk8*WVj3xek4)OV~k84o!;-j7QhS$#KYIL9l;VBrhN(OYyr{nx-T@HEta&f_Byu zb$Thw#NEe`X!*8FcZyf=a`0=g$h8{rXJ-wrI&4ByoonKDhF9nc?a_KQ(f0T`FhpV2H~R!dS7AdBNP zF|;yMaIj*qM>{v7ecuvi%<1C5Vm0-uMJ3Vh4SeJ!sJNB^bWZSbldwzb1Z*cIE2^kX zy1BRh+x$8i4ONzW`9NmR{{SXw>~3cIrZXhpjleybr+m|p#z zHaJK{M+Ilgsg^Hl!`e9G3%-a+mgx1CK$}9}mSN*%lvR?52!zY7+LY)8vNVe-0@WOL zVHx#LnZ3_i_g-{QGuiO;TF|vhOG$mI#xWn4M?fqla~uZAt%M)P?-Kf7z#K*I+b{Cp ztzm?nc zgCvdB!G$lZ{33D7uFg4ZN%~$!&B}g1mhf%@C!xZ`i#unA)Fe08YYf*aaH%_h2dj36 zbT4!fc`||87l@m}tzLi(*m`o^tpe0R&Em%2Xx^LNq>4J09Uw^Ocu$PsV;BONtB`+Y zNtUsFiA7)nlFzJEX}uxQAnN%TVDOQAd?q)yhC`{duGkrDIa_uz=RK8DlVl*R0NftYt z;sv6dtgI}h%iM)hKPo*;z#mjZIVUVEr%!Tmj%+4oiX-c7@=hmrvi#ludaSK#Hp%Vp zXVv(?v&S;m2eanIROgwxO=F!KcLAH)p;P4f%YZ>&FW$xoIe;+rw8<^;=d`KE3e-`S zm1M`dbj$Fr*G`3=$|R-)shtGV{?%=QkX^5`Ift}Kc0H+o#6sy@B2UI*ORKH9X=>ZnjtsQ9;_YuXm+@1PuDbR{p$)F z^HcvY$uW!?RKtNGjejz7zq#y*eI})9)_kSl9|YGYNkxG6oDA>F(L6}Bb7Jbnq(L>% zDzQCYo`oK{apees)lw~H0HVgxh{ZQhpF!iu>N{~ zm@JUFflo&CXmECg?59j8PEtJEY4aX2Cu{+Y3koH9|B-(G&%e#99pU(t2e}C>A{u7-+E7kPs(xHfn#y31(sBgN_}!RIs2<^|BqwC$9A?w@X6h$ z0}N79PKOIl%g_F=c+ClTLkNmXtyCu&e|t6ln8k$tNOqcNa10YeBvhbGnN1mp%!pUzP^Sp9F6#5>56VR5RHXP#(ypxJnh`uz(!E&`IL*RM#FC6Ja{et#A-Y1?g3 z*5f2|?zQ4W@10RHSIXIsm-CfTm@hLw6W|{Ey+N{6=WM1S14juvWQJIQ6HuU*yfHvv zzH<7>zC=X7NQ7~D-e_R)*Zj>l=e3|Jrs!LEG(Yo^{E?HThTW9tzB7!6LhwE7#w9HqKn4@7BYWT?h(-VxY_ zt!B0pzh$bf<0ILg3Fa*Ft)WB{Q46E6dZoODgPV@=;#5tb!cr-2{VgJprFXHV`XIimL+Dhu__U`BiF);+Ia6FHzHLamA5Rg zYbADvn@i}~WdH=g47L>`#aj3T!FWVymz}6AJXs!nlk=hThp+&TiPOYCpfcogXcRH+ zbS3@2?G`@F5>N6lzE(axq&z^gc+MC0LWmGmjcga&KZAU{ym7ZFHvP!fOgXzb1;qty zU!bP92kHzaw}YX$5F>*f!X4pnKGA=*(H8mennufchLI=p9>ox!6;RzueBVrcJ?1ek z24`EZtV-MMu&{cd=?XdVg*k-Zb9uhb$rue>mz<+`k?vV884k<wy-Z4M>en*=?H0}D$NL=X(!$6)Ld3sYrScT%a%A~t$hf` z$NIKiE%1dDloJ1A1ONP$e`6P%BeH9z=C2qfJCB)uGwQaO=aJ(&nSEMMaQY?U9uZwQ zr0EJz!06RB$hw{jI-D{VahFTAq7nz?d30`;HlM0olw(Z0=m9iq}=&&EKjg{T$wnpqA)b zL+^ID+l};>v&!Q?-?~BajPrUCkxKpd7N~P-=!#1!udI!=865nqQSMJZ|( zEi5}oGS`1&=9f$#Kgo!?%EliV1dQNq{0%S6K$pL?NF{y$0}?^)z7~nexqYwaGRJBS z0?D7e{USd2*+(f9DtK{cjFr4_H=3tDdnF8EB%rA+#fM(GhN7=o-jF0)3b^gFKPK0c z1xJAZr#6m~CvuKLKs@On5-#OH6KhVb?X^lRh_XZl|dx#$VmLi^um4@H=nZ$R*3`7|fLsLY%N!Q$kSo4gEox_guGvWK8mN zuULf;aIi1W-A^24wB+-u%`N=rBZqnL>7$T{S^r{35O)+t81y+K>Em(?AqCQL5y}Hc zQYmYK{18rMh+w!2>5t-IsE9aDx(V5F3B)rvUK$MO>Zwt&e4LVEg81w??hlh|iZDu5 z3hbJ9rpuVcIW896M_d1I>7{L6L86v3YntXbEJjFhlLRk(3)OL{mE=w~ru!`4Yl4cE zM@bJ%7GfDpw%h38P6ZSqtjcu3^GpJ02^>bq2Qd2Pu=5G6w%n$y0k*L_4H*^GO*i~k z2*?j2R$PTF4x$e}f?WM_yX!ckZe|t-ia4n`qywcP>(!~mm<{2=fW8-^93-kn4x`j8 zB8$cGgLT1&#mEzhV?Tc)LtWE`s9%o6fM19-)V+kqo&{Y&Y6GdpDDb5XVrkn?jkcRw z?OWCh0n#vTB_B8R?6JO+bSMRyJ;$=NH^k>u31fYr1!1TsZD%JWWJ^AcX^+qS%9VWl zOWP>>hL{`a<<5i6W))NF(^$|=+)O7vyEfKk<*$G3O5S)`I|q6TWD+qx_r2XbabSqt zP?30J3WPx*2(_6w-vfi|Sm{LEm57+aXoHFFM{7eOhp6 zk}=AI1rUOF?&{+^fA}go>OAr#eadD{2y3xe)lNG~;z(HCn&A^~+e~N-Ewyp>_2zi+ z>0`9i#WBV(ocAdX<{=p)nT$nPP@lA_MtKI>M9YiBNHr$M5K$p|uL!??E zEOOe3VLs!{FEj#5>u7W1%uPE?7Frk}UW4BMATm*pXxlUi{B{oOeAR_UL?07f5X2H5AB0?>@zj1;#M@_K#nQJjn37|A$7q*sd>?M9?pj#uqY>uM4T1IRTu z5qc9Nd`>T676yvO7EX?KqiQ^P%GhGAv{DCQ@4i$CkwQ!gn@Is>-|%nuALLKI z_5w(_Zfzsq{O?`RkibpHEI^+mb3fieYV0@T{#mFEXmH~WGUnp6q%lQJMS~w`;tfe$ zN0L1@$^$$4_^mf=;Q7vBYnwQ>{Ao-S1MZHK4)_{|awP_$`lSgB2XDD@DK&8i zDFvm9=D)Wcj*p2v|fG*zx%$MSh2K&rw`{?*%ar=J>7Knj`Go)*YM$gdy@bD{$BjJi^#-DdWv!- z#C2t~DO{+Ns5tXbFy?qX<#brY1-}$6lC@Gt%t0)H$@U_e*I9XloQqiRacyzR3514Z zJ$lyD(8=){VGsUOcfOIX^tXm!#1t^3L(TAS2cVjUs3k^WqTMEN_fgzpksW*d% z4Cz*Z4iPmin31E$3n*rURMZd#s0}w0KL1UW4y?Uh`6PS0`4}jI$xR}2?GADwgKMFn zGz?8^$0h#FPzx`JW6F~Obsj3?Hk@7t(bjm}m%KQL$@N1RV0vD}1SOEJ^^{FC0%jaj zt&jptSRfIP^N%0A6m2wJLuCpjYhfqmp!!})Nf?F<^!2gkmRl&5N|UnBQ&KRL^Lg{- z9Xx*|%csA+6JqYfU}aKWer`{4EGCv?(@G@>sf?6ug{0?@uJH(sp*UQIN@%UDe2v$d z!Vfe?i%IF!l@dI?yU+grnBtp{A0f894uu$(-Z-<*ZW(FtLk*!uN{Mm=+8BZ`gtW(9 zk9YE>%iCGomZm>jAqWl10Y^DVA;^{e6W*tc8cjua>pGx>L`f(I*6qVlf)C!Xf}1uq zbNi!*Nv9Hg@!=!%W@Z z+Ds2Qlg(yNU~xO_I_D<3MGd%ocs4jb#Lw*Rn zT6A$2Qv1x@sFDzt5l#%}^7jyIy8|cP1gYl8fLqSvK#>vSqR-uLc)|HuFX|cX_-z`j zMo&3Wg!e3NE*1o1eUjuO^eqEXMPsoVM02CnQ!m*X*=P;I$Wcu87-)^@egQ2cGS!Hd zig-;sdtZ$6{~jOWgD+o3EL9<%HiThFp->_SDr525Qp!oO!{^-MLZFlyDn*_7&(GEwkfTmM8WO@awN%%M<$s`Ro^;L3Y%fbzd)qAd!lVF~l)P5o$wt*8898 zvx{-M6LA8lw)X(Bq|2T|!(9J~AMo*8Ht@k$uELc9zoO|KEi#ZVbJ@xU3T59~@14x< zXpJ$N3IYi@u8Wt9BaoD3jE$@7`G>1karX~j;4}ZZ4^`|%8$)HN8+@OwTi0{T)(&pE z=4KN0tsKa@3>QPBfV#Nkb(gQ;@W3#GgM&DZYuSHk17!pPgFUGUH8j`8_|EU&$kCx9 zZ8Zt>vxX16XDg|g!xw(Mk3w%A5;5F_gIG-2TiSvn@_pmTBQg6E;7g44nRlkfSZ9m* z?n}l%ydIP5LHF*)+4?ppj*P2aGt-9_N`YU5O5R%71w}}=pm%*Q1XP4g`y#BmpaAso z$5z}DwJ>}Gq=5tf-&4AYTauHcHDb;)%Q@D2Dgn8YPkViwRjV60aAX*jo+5~zQkS3nxDW!$6%E6sv45&E9;=qu zv7sZwza@f^5uY%uaQEqc}Wf4O3AI4wF8!^-n68Kd^zOvKiG>KJ3BBN zZ}k?=h^9bH%v^>(qNXjfK-)6m;+sgvC{_ag=8ot1{7?2H5M-+k8{JvnaPvC;`u&&E zS1gX%;3+4Dkb+byj^j8eB?$vfJ~zt2J-et&Iz0Z&b8Oq!&EBJfJpN)I#5`2X5&|vo zHolx6{>fW-*_NdQK}g?Fj)9RpZ4H5SrjvrvLYcwg9I;poDJ8D!jBO&1OBHQjcO(?c zAthgviMbTZ0Uvw)deU(RM+!c4(`xSe=@IVu=^+mG=7~9rAVF@7Fw(ZTH1s3THq`+$ zgOlK*2G=unlfp8;^NFC11}}~2+eLVE8*1&Vq9XQik~tY>a(_iC>$)Ljlr-!kf-<`E zaXAi~&S*o-B!ITU$sqV4&_!{$-SqF%G_H~ujaD9_FlcqqlxFUQ3JHD@k!--Z=uNh& zbK}j{8`m$+PmEw7nMqd?|$zG#N%;RtXP4gB?dZr4+5L ztq3733s~{dI;2=E5d=YmkIWdrR!YrUs-Yih(s9Kbwzl#Qdj}Aig+f4y6aIR+WF;8y zdF@&*TT#pMrW7k0leE{xaU6xwnt~tFJ5s{e8W}O3Xed^Kv9gOQqnu7S{NZhz`Ofw( zj`SCZdkVc!3S)JENH$puG{c0XM`#S5s}PMIxnkMYYR42hTY;uDufJ*)iBt^@ZU!%= zh$%sSxF1&v_U?Uwf&N~!HXJ^Dh~aFJOkD%_KG(-jcb2U~O?)NlvTJaa0~kaQ;wsHk zd%F1E(+AjgXqY!$(ZQ9g8W=5WGzKXoz8|ur-X)CsvYuc=CV)y{(8dsV1tFFh?-?o4 zHDn(<6?gc{_g>7(mL$LWxu2ry6=AqYWOAWzB^)}0QqF>zDQ~{!Kohs%-9e^#lTt!h zi8iOZ?c6>eMXDyW9?bbc!lT=8E_tgxaSF=kfXybcC>k9(Z5^;DA<6-fKo1_&rZg&n zt_Yh>J3M8!0CZKxF^X`$jR}4!IQ+PFS~p38GBVkS$qyoGm)ZnDIg^M_SXY904Qj*d z33q=F=hF9p8;@8vF%KPI9WTb3C%F2O9Hcs#C@2g^*Ki^Y^g?5I76@Z~a=VOUsx=Ug zDf&iY+_TH)FWz%A2M3CPAeYP2)pd;h2M!SU0r!3Pdls~o%Xo2*xaZN-+`{^GYY{@Q zeC0|SYikL^5Z84Pk+*ZPSR@Dngb?_?KPJ_XQjUQWqxFP9<&2Le1fvC?*KTR!AHMz~ zp`VReE3h*vomv#wJFJ0hK^g@&md@%7n%inn?jl$`cCbPUrC*YAYky z+mq$UKoRMP1y-nLA|L;#hmA-7)&3|IU@+3fD3^HLN-+xA0xQ-u^DiIVOtZ?eZ`bo2 zK6HS-zCn%+W_faNAKfEm;+YzjEn9&!no?pJow*q0e2hbWBe4wvM;g!pfnPvZ?8O}k zxuW4W|LLdpJ_TY{Q2uhc#3kMZA&|n(UD==+dCK-7&zlFbsRyl5@L|Jj-Wmf zC*fHQx33MkqR%t?hxyF6c7n4A9b$wyo_H7KKrFb0Y(B~0xxPsqSPWzY7=M1owwr=V zfpG7SP-}0BQUYg!*c7M!UMMJyB9irX-EvdtBTq)|8_u^e!6-8*-VLF9hfK7vfJgg_cfvTI z&su>ZgTjMnVjwVP+3eU5B4NB=$FCKdMph$j*(U$z|OI9znmW)kr@K@d<| zTT4w%njp}GL4Yv^-}k8mnoK5x@B3q{UzNqS1&!jg5)mZ@!v&v9me=sE*R17^@9xEI zNn#cT9g9+uO18*lo0_?HO+7n~WdUOuW~5DjK8JbC7;u$jSwoypeRBuo%EX(J1oOgb z>JxdN6TrT)r$cTMf)HFcVxl8WqhA2&UAHjQ$5(63ZhHH$hIvA=@Ptf56)%pg>rUolIOGrFNqmEXk%F2 zgcZuqDBC#)Tjldk4k9dY)|`iy*K_X<5_1%#c#Jz9KgMU?zm-r+a;1PEpC^~god9Ho z5G-A~6r~g!Hf}^I>yR@tGEAvd#&H}D9y&yKS2wwAmjC+dS8=4ogobhu(9+z5L9%xJ zI+nJzvUmS}(&-c{R;=J?*D)OBAOO$v2%`{(N~J=%TpnYtgCMYS5o3LedxwjB`aKuX zmo4$*M-CHjPNB!i=89Hq16LN!?;-LNe#nGtnSEHR6D&1;Jj_TKP z-Hn%WC>`g%7YE3OG5T|52m&A^-d2wee3a4{Q?cug0FjV@YtM1@*`L&CjkM+YJ?DUcXzXP?OI~7*cf=$8iX*UJ%?P$Li8n#3I6uGyZNt24iRYRIXYVX zi=YiZe4&S-Tp2gxp{I3BFki*p(t@O1AJng~wwiK*&W*EqnT2-3Qzbz{F-JFPEO=Hi z^b7YOR$Py$>o_&MY^D)(;DZS;j*D>Pgh!s%Ca6eYHv|twZ)!$?pfd|^%K=IV=XOl+ zM|%JLMz6je;iU+}3eqn{0&hJ#1Ek7CcWgnHh6rB#HqQFj+4MCN%)tU_)81sfj`=C0 zo~6;eXyqUxTA<6|rMNJX=ceEeat_U+HFyb!a>?fp?|6Za-?EOS^$Gg&WrDz*((Ma{ zLIj#e>}?2v<2Yl|jm?`jap~5rC@JxS3SnqaO3~lnPft%TrBab+pL>oY2M;hjJj^4H zKFVi4^Z${}Wl=&AgaONzEv2!sk#f1rid8G=Xloy1s1u0@DdAxJ9ApRV z_aQ-72!{@$YTKZcMR;jM^9CD7oT`Ud26Tw5{(THi7;xXVV^9igbhI+Ku045>LJ|g5 z2Kc0uO+9g^7aYgTfaj6U?#8Z%+AvQCipMl_rvZTt{OgSRP9oMSA!WkglJw5e(v;Oc18+M z737DJE3botj}tuqO`J>L6*1A_+ze6^E)cMGfy+T8phHZ40NJ`ZGLu&enKD>-;QBN_ zvH_zG|8~zVe)wV^fBufmY+71FEH23w0-SMDnbSFM7-Pm5@NvG2sJa~XiCd1GC%m?V{=|(AsFbH^Y=gu)-=pX&y$5i|ZGSWBueuaj{ zMm#r$!4PWAvSlmSuzD%~^Hp`cf5&b{y8H2x4kpoHV`WcxU~ABC0pbL06qc?0;G6-6 zohO6@6KFh7p$I9K?0rrc`4idsoldIahnn{K1YdphFb_X=m_$ddbVD+1tD|-fk2BOJfJ)9@zoJjLY}}Q|cpPK2&Hst+c=9CsiN%|~*65N3M3pS^JfNyj0POfobwV(k^RA>m4TM=N~ho?U$9`+N9<_guoZ zL&JRMvBQWOk3`Ht8;#bS5ai>XO`kq%Q~3;ivDP-YBR_}`=KPr(XL^m8D>;b9j;Cb3 z^@2_`*m{<;Zp^2;0~pUde;c*zYDB||S!SNc5g6qh#5{03bhg{*-dzf)L|Ak(G{}Mh z&=S}Y#U{Q=AAVe`%hxJZw*-^zvC)m?3CQ4?I&~31aTK}c2H5*!%S3Ou*&Y$<@HFi3 zOo7Qr%x=s}6UI!w&nbUZ#6VReT4kB##FPd`M*@;dJQ z-Ivi(pP*}`IHvtP`*nM|3;+QD07*naRNQxZ&uBjgC|7J6jP;r>(A(Qbu~;OTOp-_> zaU2IB1h2a3rZMfa*49Q(N*nM}C=}Sg?*KYVDK{qM`5imiwQDy`8JCY-s`<;icT*lR zIAO`wY{2mZQKKQ2gk<9cQZRwYv?3C9<9%DO|5NUpc3i{zeP#O zXf{i^Tt0PDmx@3e?tJ1Hq~g}qL`T+QLSjaaS&78S-yS7)QW&sg!^s=Xz_+rr>ivr2 zjFV_sal)MHq+9G_Y9iFG+;Qx8lyX^RER%IMDRj8=xPR+de~`!T^Q1navC-Qz(d*0Q z5R{;!IZfY42|rurnoC+a)LQ@rju4bX!-}j18?BN}(q314er~S-pHE2Rn~4 zG(19kT@63p(Z^T5{v5Ps_|)y&K?t053?;b;~dV`=S)M z3uJCw$d@tZ_!>ByH)$g99F_@Q_%^C#T?C#-W*j3o#yUNAtBd?TyZ^gK2Gr5*KxMK z+p^#KWN*Y70+Ui=vfbb%772)+hY4dY8EYAXLcax1ZqgPcP5XvlVyvqOQ%4@XCKcmY z&nR#D>xcOCd$w}znmT$%{b{$=cwnuR8q-h*L4fc3W5t8TV(|p8>FU2T#>zo1x@glF zz*9xeA7**pP#}CqP888x$H!sUtJ($X~wARs$<3&V;!FGJ^01rzpoTd1zc6uGK`Lu ztGa0^nJe@q1(X9#I_dIXzi};Fmez5&KhHp}%*KuyGI58Rgo7U%LT!l06hUZsu5*MZ z_Yd-&XS-S1;PHv~*Wt+!V+1iJcwlEQWIWPwhtRWmh+(MbcIKFC#@YxlGV1;_4cabH z0%{H~GYym;og&2uUbqLf;%Y=)6+Elizey>fQa~4mah6<;sT2tgJ!V@@$}eM2Iu{jy zj-tKwJwP9Yf#$I5MI&1`i15Ip$l?e%u?WP@a_173+Lx;RdV-IT zXLbtH0mL(Q&dv5&JF&2G>Ug=3iHEsdFHe}GW@$sCH8@swrJwy8s(HNy&nK8C%<_6E z9czs&BxIV=Jv$7A0R{9BhWDI+Nf!x#u6jZbA)Ieuf?v}6?hl=n*E%xYgc<2Xv~7gq zECbB(iK2x*7oT%{U-`dS>m$ws-Nh-dX_Aocb;JPkHk9AR3S9i`X1t&{HGNn zr)+jyPvI(Qzuj=gv`KBiiz%|hW&YxxU2JU6&|2$p+Z7%B&#ykmXaC<*P@Ay6%+)z1 z(2$OiXig#!2w}(%mH6~MyD?gF&of6M?~`nfjdML&M5kC&og9s^{liV!(+AlU3DU)k z_kr_oy__XEh_LLi@pCq8X-45zbb=O36Fhe}s{Ilx&n*m{!(2GccF-DP9%kqeGG2r9 zYVZ#{8UhZ&xf>GJR& z>>W58Uk`emPqdlAjx|>O{nCUnZ*mY}nXho<2sbRr<;5&F)Tz0}-&DxoHsaw+r` z_{t-l{I54|;Ki=2b=DAa%0Rj*#W>p8$;OQv2!dcn;=q*>4CQ@pSl`5Z-n^09zqc1v z8^@6+1+2`L6=hh)kpc7#v-M>ym~x(Dy}3!nI7=zVQX7SoD8LU5>sr(N-=DvX5B}4W z3=WkLae1Qa(OjO2ow3W0n)0}pbR>_s2=;JmfX{k$Ct+=TAUMr6EWbrFj z(~OeD67CrXw=tj+4*&G+9pGzFl6Smf6)zkcg_bnQWDGw#W>J7tlF;ZVCD7iZR~zTa z7kYWu?mm>~AnVR%8Mw&mE+#!W+E5zX$HX+h_(EDQXQ3UWu#RALOVLN4fh8PQk4^Uy z#(?WV7!Yi~6Is99nnM(Zrm1;8*LE=WM0w~CqIn%AKT!34HW=~cS%Q3H&54Es3*v6izy1&!1F0DQ^5X-%Vto@AFRw)k7|K=1l|zIuQ?h6i z5x5dUogiD7iTf=DA)o!gC8Ruuf4grF@mddq7;{UQjgOR|jUwAu#A~bNjh8K9I3Eym zoT+a#FqC}F?(PDeLq%}alu{e#Z0J|3HRE-V>w%iKaYj?(r1u12CFHUVjd)7&zu$fl z>s!+l{1AyCG=|!w%N;-Mz47E_g+kG+@b$0+UK)~V(*feNpZw7vJWQbvnW#g!DT2K}jQXPb0-+9>Mft{D z0BAe?g#I1CC&_j-n1Ovp)-4xiXg{Lka;Quc_c@E;p(^KC^)f`f*7`(meJ40^>ytQH z`rzchrX29I=&+0vPe+yM7bb{W5DSP>P#A%rf=D+$v-gV?4fph;4_4 z$qrg3H<5BDU7#i<2oYK81=_}iYmlxWrj(6uPJ8^p`?m7lmn~yBU!i}rf}CQ(rNJr| z0&D`|cb@GAAuP)sE`lL#^ckfkChGEzBly&v&$GKb#~;6S6Zuj|5L%6WCD1fyJd}Wk zclEKXF~Rqq?V*3P0!mDJbQqYYxbyR1jWAKNVi-jKe|Gtim)6U(wZr)TPIHDe2I4hP z$`S0i7q$8ZMEz1I44*o7=c=h4$Ab4{Bf5W&A=j&b!3c96$DoT8Kv#~ z&hLe4^R15A|1e@{%xd4{JPZ;cp)i1G*?ya^1ch>NhDQ)%_H~N|k_E%;ERmw1M|rzl^TI z5`i|TDS~Gq1W8viTC(>(lrQtt!68VvXmfrrb)hym35N$>?BjtajzQ6<+xgU@mME6dg>VIhB&$YB1l0jaAN1a zgInlwshi_M_Rf`Aj z!UTQHGW$Fi0D4@biGKxtQSZB7IU8R`h(_wtEEKey!vrZLlt+e00Q~dpRchfUmY;H{+c_zrFZ?q!fa9Od%64K^SuT5BIUFE5|^#OwVYEKe}xb|L~*zbnPERH6+QE z0=#+;Da7ed4$OrnO|~&p@6d5=M7faQ#Lx#GQGmt-|2kJKI~M@j78Bw>fsl_H9lp%;?F)tDDRTXg zsCq@t(=J@t$zP(jD{dOQA?!bh>R_ID|ThMf9C+NeQOK5dO}LRKBeHxbzO#sM=&O2#nL5= zj%H`Xh2yk9O+rk)nUjdvzfMl}d%BOFM95 zNy0=w@4CDhNyvk{dLhubN=}%1w^-+g<3)S|uO`7WyZgs(`wzdo4H6FVmNZ%$9A%@i z!-;^Lm@J^akihi}Ji9TLu{6`JAe_f;d!F=x(1%2wmDH3*t<3aXii(YfcrB)P7va%o zaMr&T;%OV3J(D3R=iJ;HR01=+4;q#e9^D=qPzd=5MnAzU7Z1)QfCfvY2T1;vke3C! ze~8-hM)creeLBf^1F7Lo2iZFwu<^WQ{mxEWE`J_EKaFM;d%qpTFBG=fMp zo+BHwcmiYQM-DRmZ?Ce_LV{{a@i+JGp>MRzM_;#w=1iQP(Gt!{mV-hFT&W0xxfAtD zEc=}+1soeL@dt0($RisX+1OEwl7g#N)v>fbY3251ZIcm!Kx+>4jPTbRAeWP zspM?9&17Z428h>T2KN&l-G;OEZFZcN3*(5zdCY%sT+Hwh>x+9Ev9CMy00NO;?8bLT;#st5k4?SsQ z+eJ27S;c22)_dChUO_pBh}Ym;{%(TjzJ(0S$d%VYVc>Wv_(I=(zQkCMffZdCKsBwO zBP)VgoG=zVV?90S?ka)XoFqS7=A&PF7C+Fu=Au^Oo}_=YLM1$&4mh9N?U7=@VBxsr ztO|lpr`w)z?w7|m1Xb`XggC1tB@9Cv8XBmrtwkwCKA$I-%MtfHl5vmU{^I@Yf3^!+ zYj8b>`L%yOhk3FZ0S(at?SNTe-qlm??iV6sEslqiiHQQm76}YGFC9N~n4jQC~89f5Y2F!s+BmYR}%a~v!!kTjeDCcr}XoYJg_&o3% zx@)^9>sJ_)8xW#lrL`E7asdn?0YM3rgR}MR1kZmHc4m>QZ-B6T2H)yx2azZJS1hbS za-o20DJ`4jml2sZ`|jqvf6dXvIS1f+`geQwoAd)iJmXO+2mIRKKTgN;I)3S<6};`r z4mui=^b8l#M$hX=8n2I@{!}CIeV>Mg1{xb1DHe+pg6Qhst*fhJ|Ni|LW6)Y7q@+IO z@E?yJX8-O%QmdK>!f+Ab&y)Itt`;b$InCCZ|9SR2lg>$LPyEs?aO^o7P_~#!m^qmo z7f3sp&}MTW(Jy=(VsYfU*FkA8vLuuXW6&5tx|m!a2w}p`CnQjcuw~>5KR2Jb2GA1N zgAn(i!*}YzeSt_fI-+sa{L)IN1JT-tiox0ZX7r&)tXK5KZ-ziZSekezCabf*ITxB@ z5ilu>>LSslq?K@(s-OCzU1ewP5@tbs)r8-y4R~<};W-@Z&+{k${w$xpZ!f=e(;D7! zRXfcY4BF|Tu^U6I#P8Uhu+>^1_uXm9OtxB4k;z&a+xp;ab1^@kr86C7(zN2 zBWOsvkcv_9Ll$SNoE%Sh9!nvn1+EuCJ7^z~XuuFogBV+6&%W5hVoV6JG^RXCxcmFa z=8ecDTcdy!VBTkyaqS=+OL7Kf^hj4^T_^6rm_5;r&KZE7A4<+Re-B{#c1ttb1-@@J zEei@oOS|i;I@yM_$coDpa%uYo)Ax!IOFxafV+DXkwW4TbzxHL=1H3 zgN!kM>e-oUlZDsRVwT>V(H2N2k{*ecBqKSWzq;c^Zurv&_`!4C)FvG2k}-_2E*XBP z(TnW$8e{N%pHiu0nPeeQN}-g(ah%iss{YIvgHkGLV_Ue`(U3%Va&juOMTOwY4& zJf@uM&M?;iI<(jH9|RsVeo5+{ouTnZZIm|pB+b+U7$gG7_aWQ1qB<@i*nTIbe=m6H z6LoqTd#o^g7*)SyTvhpbJXy>;xSr@j*22zYyO3TQVo3-W8-SkE8F^MNG2O2UwI&P= zp68HktHU2T!V^1-eDuF|Q7rp3XFOIlr&wB_B$IF!L@n~9+C>Po*0i*=uw}~@GMUU6 zh@MotgdsxMWIbab5p(#LA0NOBmhc>fsrtR1=UDTC0oRj$yamz@Mnf!Nb+hH%41?(N zqz}wFxIV+X@-mpdJ%qczhg$b4M9mT?jj$jmRIRNgZ8?V-Ivko(P6Cfbm{KxF#e-v5 zejb`Y0s*Lhfbd#9un*I_8?oj_n*cb`9%4QV_=JSg2%>pCPTf+17w<)uv&dD~L$>$0 zHmG`gGB(RaFfYkLCce-~fhoe}!l;B_+;WgJeVx&oKnr5JOwiWGHy%F3Hy_!-s+J5_ ztg7S6m33UQyp|P>33BC-ATTUsb%!wqDJ4TgL)6yR($&?)@bEC6=S>QHpYnaeu%R`> zw_Q2zoMnQSb)g0Eo$n7k=_PRv+d*q^5|-60^dah3fvzxrGJr)c2bq!EJsD6NFapxe z=!1`JV_0CW_r65b8sAea^5 zp~tjXdZiS~v)bd+^`I$vbk3v;g0LOSiQ#O02f_9`Aq3Nq%b zfHA5h4ug|6U*|)0(gIpQW_Uk)w(emal{H>XoZ@JK{YOUGzki531rQoO_=a`-fA87C z!Tti3AViL{iCb{%K%{9taNq#TmMx>UwwC_>eu5x4Z6RTmp_bBm9gm-uFouqXxLx!n z+_;OgG`yL|sUtdhG}_LiQk@SI(ZU@1b5_8pBkl7-Wq}u2ADGG8)f!w6ghKE99=e>x z*>aoJtNX=;YuSqi8AAjWbk`1zUy{HeI_len}c7(x%e&U(kQ|9yX-#1@#e@XZ6F0|NJ)>&?cS(1ZjZSY)4BJGiGOp>fmB5FOp_}zW{{SWrhkak(#lqBKFh?toE zgk@%UIWflIx-MZDa_G<@^7%YVmMl2|9G^PM>x12-M`Dax}pBfVoBtDApZH{XQFd<{RM;^0hB)Ym_f$prgKfJgG4M( z=;K`U24vG(g6HnSggzu{#}yZfMLc0Ff(hcR|0YT|a}(zvr@7EU^*n>?a|B&l+XBK+ zYdlAyGBG~+pU-jqCm-Pd+`ETRLwjA^o_9rm_go4Ns~T)6z>xw+2()JGnltfHN+G4B zzrP>f_i1cw#P|J4g{t_Wp)TpLyC=(!cl1FjMtF`|e=)&fpAeInA7-?2)I_@3$^r&m z7r@*wWpI7E_nE{Lhiy^4K3^MXvD~h)|4r6n@_mFa-iKO!17i8rR_|=|Il{qtSSy7D zZP5E3Fc_nN5eUD)JRU927l5w5tz%%m2#E0TPeTzDEfcXICyCQc5V<~N$5zzRs|cUH z8`Jf?b?DHrxQ_xCIb&Vz)iT=bm|5>E7dW_{<##%XS;`m-auc-)dIyVq_Kp{L&0jvq zWBZ0^t?^jikYaUnie>ednGPmkrmH|(2x!X0Et4Hnc#gz#B}*FPtZ7NnTobpJ@u5Cv zY@oF!2m*p2!1sNEAV4WacXv0jSd3MxR-KlKu1Y(shFZ{)iP2gY=QqFnEMc}n(zDVB zCC@HhQBoj;_1;!O;3$csBuWYbZKwnWA)?S1Y5#muV`4gtwK0pFcsS4Jhsmy&Qa~6Y zYL`NOkn=y@d@=L^fr!^)I-e%o{~&6^s}VJ=P#m=D=O+R^q{d2aQ_y8bPja4s>v5=mQh|;1p|T1?4QFX$?+I zJNn2|gol5MbLG!Q;LV)Jlg61|>jJsOYIsU@_dVmccmZiC=d&HExJt>f3W|v`inK8# zk`5~6GCWk~eSiBH>zCKkQWK*-6=QWviuYZ&loicMdPYhVE5~J5F(qk8$4GlFr66Sc zp%MP$(M}%PHHg82)@2O|mNh20<>EG8y`>pf3i`5T%7I2rf;kPtkVGOuEEYS3We$RX zLZN``x@fIYN}Yr+%^3J@txfWU2M_Us=X=<8aEMr49AgX>tuX~3TuD6UfH25$vJPWF z8%;6qgVuOykK$lq+(iVUCWexN@=)n`<4cK?adDN5;w{JMdyreNs=8FwDam>IzV?ZH95o12b zJQp_2CxF)2s>!_|?*jcZdiRe)XZ>rHS*R7Dr|SbkLd8mOOJvN@U zl3%1cu$gM4dFb29wH}s136W~F#S!Ca%sIKm3vscS#RWu4Ot}zwdYdy|LK~}-PS(T- z0>kdk5q1X}LIZ*3-+pwE-@IilKl`#}bkrsYj7ADU(GPj9bCmBs+sl2=^>FCO2>1pP z&e$~F+nwhrU-ONh9AfS2dVcQ472I}tJ892hAXhnwspS-aoJyr=Z*OO0WaJcp3|7)H zFfef1pGhfEu1hKzXCPPMQ(xH*t^!9<2`YB6bQPDbYvAZWiN4NZh&$j{37crvbtTEV z1n<6fDZl#aRXnt-pZj+YP%H<$dUFfct!>0ng1vn?4)+&Gdk**S9N_Ce-cJyBNTgyI z%oJtHX93seaO!aWjSI6V?pi5{HfNDSX$@}N$^*j6ahCIxN4=2e$yt7OW57!x41`CX zMz(E6Zh8ac`anz}S#Z{FcM@MLBtj^{gO5bGQQZZ>-Uvg63+WBc<)VcDDRd( z6=YhVl!L{TG^PVc)}s$UVUHR7GOB$GqGcl#hfnIP7b1|F!yUMEp^`@*dJMVg^-#%8 zeML5lye-a)KA|C&CV25)oR!x=tTwX6n&f^;O61r9k|AFRAX{d|ntI-I%`#%Hq<5sm zcc1I!;L%a2gy1>E5-zSIG2=D#!UlQ!T2szfpb*fqyq16e@D*(CNON?kG$DxATC;NH zN;*3`DV0hS`aV03GocelTYEe4Sd2n;gg^V*HeP*kEBQi&U-{>!x#prKKKFsGEN@Qo z+~HB4J2Jx3#w0tAW!c@8qd5~}LwlOKl*{Ih47G_E`Ep1iCUK=CG#Y~-TMW=>60Y^u zc9p<$9e(h955Il;bMzh=g_MUIlQ=>UPWPluYe>|h4?lr$TtxdNHjql5p)Sb0G%n^6 zBuFU{0t%G?autX>IG#dI2q6r_GUy%OMy|LHV(G|XYr2nTUYZ*x^;b1`HJJWA=-%Dv zd@r#}--D4v?o?v&bXgrjvKHO-0>PvIY$CvX6|kK-j_zJ)0J;jIH9~$9qu;ESUllqx zd{mL^nK&+cK>}!P0rc)4Aez@BYT605--)bShFte*DD*{D$?`0n>m?vHy>^I>dU6AV zN1nvF=#5Ywojpp+EabL0kNSd}B-r^KoRu%L7EIG{yb%&4fQ%gKT|I{fil>0+N~JW4Oh{K>PHBk|7L3j4`CV z7_pcnmoIbqMQeEe@GyRUi26*N{%o0~r%1&VAaJF$Q>lhP8~jj{D}|K95Mcyiv_TNU zHie4jD1)}4at3NVhlBk^{4nGz4;QU3 z9`7Y^jfw07la1(o_oIi8;$Hf8!hH`Sn${tb^-)UXBI>e6L%NCJ{=W@%?+%5K-@@qI zm`CmN7}>D^-h34At^XQ$b9nd(;f{7;yc+ATj9g@cL)c@hhLt#%zMJ6rucLQ-8)wZ; zRu@*)9WAu5n1$GmQ+al6K)IOVgUC#qMFri5k3w&`HFLgWJygB(cF&aV) z$&`ys$Hu;0N1!>V0$6e8udV{@RINw8P~km)^Cx_B3bGfbD3mn$QZSZQIKC$d0YXZv z*%lxt92|0Nkq9+73R-Iu{PwNu`CqqfWGGwYm%p%$LkCCjnp2qRq_64_k*L9pbRi~P z|1!ZG@lsgKlpa`6U79397z#xnaz3PETy;?kw_V=BhK?F)6AlmU9*A~aXBoF9oPH?B zLJW&ph<(5q@G@Wwdgu3`G>UWa+c7E@g`QmLYiNcFb@W#A_$ERhtQSknOdP3$rw125C8q+eEH!{ zRyHNafPWZp6YvA?{HD=%M4IbT6dbv2O^LLZTCv2v@xpT^2G zkABvRajuL$O4#vGs%VP2GKJneHA#0(-V!KcGaTZY1X^i|d=o`bG-xKcUH(_FN2+EVh`3t1tdHinJXeeco ztFA*dttQ<4Lu7U}a`np~H)w_YlU*s!#U12A-GQGx3N%BR7O)t5F%vn1`m(a$L zj5`z+{NBGlLw~NqZ@z9d$A-%oV;CJBrLL}yY&JVB@C>kWUN^fZfs-BfC$G_qeV#Ph*8Ieh=$-e0F*uuUv67ie_6*jLi{aTd zcnL&dfbihM5&JAZ9Wkp5qCjq;0O*K?4(>z9M=|=kVCQ|Iy6k-lzk7!K3FoMj7!#d? ziQ|_p4BEt>E8a)2{p+yv`^dF7*+QsFVRnwV&ZkLYO01SR$wqL2%OK{gi@xLzGF#&! zGzKrG@arW1-|f#cFk0bH-?53#fxrf^_&!?eQ{uSK1wgM{xssuwA^Q9KC$z(xE_n8R zpCwC{AcUa1yBp8*Xm4+)wzigHu}Gy-p{KVG85Vf-xhy~Y$v)h+^o)heET{oEh2bIu zGtyGhEmuhffzIF-x9`wd+mq?bGok#!h6QexrBFlYX*QV z;JX8r*_V;Fe5SbxKs;2DK&Tc>nvU@p4l*NRGxFafS#Q(Yk8<7U60KjA7k5Z%Ls_f| z1Inab84^?kQ?cSLa195n?2A9WTyL94*$A}h6_J4|*mE5uY;WP)DdZOV7%%G78oR3s zS1Kq?OP~%mdUvbsBGLb8Mc8tws!)**An<84S>YStDKX*T6Ajuy5)X_8AM`wHIj6eG$m|_DYJw5dSBi4=rewHQGx~;_v21&#F2<;1mE!L7)@5phrzqqc&8}MygH<&)aBrP@W=9b z;2G%@W>M_@oBK1iKZ9ma`l_CW^nZkD=p);Ff6fH!D8h36JOX>qm+HEeu@y%`nYHCJ zo3V_{RVqb`7z`aWr7cx~6Dw3APm_nR1A3|xm5`8;qc*A&Z=ifn$YvTAJh&DI@bD_t z$tzp!A~KRNuw=#yPIsKpR@c z1C_@B=8lMyNcrZC#RZ7Lk_9)|qc4sE{U{D2YW&x7TVAw;x4WR)4|p!=<<)L0>H>^k zk-_4FhrZq3m{nM3$5S_T_umrVVsWFRl@gpv*invK`dPaSxi?!rYfKiC$kclujeJM%mp02+}T=K12#&|V{jnDh* z@N*ZW$mWN9XV$6Kov9Pokzhi3%ElI8CAkl|25@-wKa*$F>`zn_gQO zEP6ktYqv2>^ma??SzW}JDFzl7Re^F(5IrC+!}rIM!F@l)^=9emK!{{aLWtg-nVahy z0RZ(NAi1GVu`_Dribf!Cvb+AVj1J?0;MRD3^g4ib7&53cUx=&>gW%>2-}OPbRM#r> zjh?FobhX&+9a-#(8Y|nbN=_2|HqNTk50IiPWLrCqZ%}l-x6Fu|#aI#M~C zI^<;+zn*6Ns0d888vLh7BR!XtYH!UL>6}AvIzG=+{PY%5m4gvXB^V?c%lHhHD<(^L zse8)b0?Lgl(w%v24z!G?mM1{ep1=m{U~-rdiJ?BDVq=W%7Casw8&_XgzBYM+PuK1uE|*1w^4&JE(D~_!vb00|_$$`3 z`=z8%Z5hoUv{=N;j754jNCS%xiS2=cdys;6x?%x~-1l3FbZ*=avl($H09B(*b6Kp8 zee_>H|G&F5ndhfU!l%Zi3Q5or34IKB=q?TVP0M&8dmaxu4%-tE4U?yg&(68k+;ylM4e|2pxsD~0rAh|lbpkfa%L9K| zAIJkGrP~C!3|#->udPEzSN@R+}hIiJImw;}V`QBgi=97h8kh;{#+* zSI%M64V$3$(Ue%0^yd1${n2_py*w+LN%-Aj3EmjG%AoKm@kNZJ)(NWCZP3m-*( z01AvXj>nLZMS{WPUkJ62w87SoHghMYriUgc{K7$}hJG;S_1s)l*vd0S`l*8Z??5%Z zgClj10dlF`6k|f21J8g06mCJ@h;G=;| zL_l|Qb>TCXzhBFP!ljIWZ8sk#6?ZEoorbm!#rO3;=-0;duJ(&RrdXFjp3 zO~fc~-B7R>K1Az#md*d1%VzJBsnCPs(~@RkIGKH56dEyr&m8{Y4G!jEyP_RF{+=h= zV+xdFX2diBSrSP_qzNl~yc#vKv+S=8*335;py_bOOU3k`0ptM=n>?z?R-D!m%lP#}|DSB8_oWUY}5JVbe}u+tHmwY9a?a*e;g zKe&gdC$O$vat4~R02&4R0hUV}K_3Pbc$$3h!-Gpta0gu>AE0gz;Sn89j0eo7JFV}> z3FTvXAOdN`BYO6*oq;9RT^{PmrwG$5H6=xO<}Xj2ta@TmhcheL{dm2}3zdRP`~#al zj}XO zvDQ6Ig#olaGBhj@`5tHsVX>;>kXg;?Dj0CeS$v<34MPtk-&|Rg@TLh~%qbvOLuqx= zU?%k%1Vy7H(IrE2*y9eP%R=@w1~c@wtfI4z^3waw8uoT%? zWEy87;uli3iTn#4bukd|1ykCw>YDtg!2jj=?=Ny_anTiCJdqm9`pe(5EysA#N=A3t zi@|-0Vd@M+xIX*8bX!Z)h==R&i~!jPOOE`z_IGVvt_>I^cu9VlmfNlp9h|HOcXG(1 zGMtw+xMwO&J^Zr{UgeZdHTKocr>ol)fe5=ER(}T|B#XWA&eZD&M5$EC)wCfE;Cy`S z3pu9lP`u`h3t@P}@K-}3mzH(f^)$Dv_9+s7PmD2Vi4i!Hc=gRJ8=W3dg|s_(JzbI< z1~aa;nmP-GrRL@He3z?~VW?fm6U>a>R`OD1E;r`xh`v8{ z+~)K2tC%GQJ1iRyf@eYB!_*HR*ZHfP`)_#GXc*EF!jP>uc(HMChE-cp zDNWbY-A>Tm_eo~-AuuAOqO&sGRBpHBs@ET<$@VK_0)`;AL{vTw?L5nZ5!TIybUn{= zO(?~i%1!q!j95Ej>2T~sO4&B{(dFNdN17>dA+7KY>o6wU-srZ1*Jx|`W%11Sa2#B-!B9QiocixfJGIS+R*99fm(KUEdF!oltPTdc+$~7#Mj5H+w&z zyO7|~WZ9ePHG2nG1p7;3#2!hY=7)UwFOvy41Ofj;=UMn%>lSw%o)hl{R8o6I5G8@hjN|aXgujH ze1TRgfmYfP!gqANO<#Uk+K3x#TDRr$q4o@9jELni>`SeQ=^9qV=oxoV{jv`s!!xS9 zh(E?NP`ce}A|dhGNv(7s_-hBJsTr@`+!UwhR(UXI8Ws(?3{h{$KY%)!D%@J#oC1tr z0c15f-$4S&Otk{46L@}r-sp6!1Oo$uhmW6ITnuY;HjPRuEJ$;hT0xzKF~hA5WANR5 z3R#cX~y3{VcT*do5WAWch*I}^D9qxc%b$LEW$7F^VNoUzQDN^m3Rq`|9v<7)Fa zU8l(oYe~dR)pD`SuXkpZM6w9}@ro!&?Vb*SxwV8O)S>(V4To$5FMLYsJ(i{|$4GZ( z<9I#QiLDpmr%$UJn>)wF*#~vwO&lEYh3fv|t%1q`kGjo?OSV}<#7LAbfV!g&QRs; zg(jAe^nOSw;G$Sz^X&)Sb0n5GM%4}@X=^&+=NT;)19=wXVUhGASQwJ&7TR`PaqO{a zMx|}D2%Slc9M6=vG(A1tfj8Wkm2TROg761Has&6)*K&JX**01Fr`dZs{E27aXn?@u zuulQp zdmT3s78*&Fj3a10n6edMp2U}p@JnM)b%XFusMg=Tjc*0^#!@6KMwFm;1RJw4&7O19 z&g!iAd^@A`AeJJEh-uQ-8=!+n+ghSX!ZN^Wk~{8DlAaFUVV@5aP_E*dZT7sEmPO#Iw?)OC>6g)&X_A!31#pE2d85t{Yc3br%qR`=$E#&WfenX6A%Cil8AK8 zME_M(@QA{l(Zm!vToi7{+9aFkI|ua0;&E?i8}~tkj|)hxYwfR(is1V+BLmpBFMAv7 zpZd5BCbETC&$$=_P~A6+QEzAW;~KLW#syoP8LX7~>9=7hquTWJ%3Mp;7JI%vd!WT; z(-t2c$gosnI#N5g8a|u`b$F|>LefAwYFT##8F(UkbU3bbMbencY;MI|s~^7rad+Q= zAH+XD63X5<{fqR;&Nq(w9$u?v=}*6glAL`D9D#DCj66twp1dG7Q1fS*`ACW=yztw> zH?OVzarKqdJfgs}lPPeRLaaV>fz{PKs2Mc!d5c0kj98`E>Ods32rk}c#oa_cfz;wk z^3l0qsP->1vFyXqjT(?sSKf1X@pYnE#^vy#@=AVl#F2 z`@Zls|JRZVo_K+lUDXp1C==Ga%JMP?b+1V;p&DJLO%<`rXqp`7(i;F9E`fzmLfwtvW2BRC!EKLsid4{B^ ze0OO%rP{=i)*phFWc72p(Awd<-)P+;)2Dj1@xE_cg}@QgChf&gNWrMupg3Ws@mF{J zU6&M2qKkDp_&)0G9=6G0FdRq~Mi3n_FZX?+AHjh%G>cD#F9}SSl)u?ltD=HKrY!XP z(3Z`yzSc44LinoBWid^D{53K5Xe5i7NQQH|?YBpRhNZcAk3CT|@t5$^tSrHXK`)eP zm*}gL$w}?k+k*j8;<^p=&PJ{zy@rv=_S~*WPy4e z2}t7(aTDx#NBhPFE?kiydc6~9IZedEk^yPA6^8k~CY{>96MeoJkI0gf>D3MPN0xs% zn@*zq(rpiGpp-WxRMVT4rBmM&2ir{CKXE55ZW&6=zQS_X^;&**OUha>-#ZACQyxtu zA~xd5{(}4g%=4LqJ`&rwMLZf)JVw@B6v+*_^kV3HT;GWU8@gt4`&OJ7U#@ncrZfm^#gXz_ZnnAaI4hL1FS;ooquxT;sOzma+w9yYz@NV zJZ`+-(TpfAQ8ywV$Mhct-a?n%F8C=GB__kOKOCqh_Zfd(8HP7|9T=#(7|XWBkE?OV zelJu9L@k+UqFhC~30bfR6lDBqesB8)B%b@T?#8gj$9+X3hc53S_BginoA9K!U07Bl zy33z*&u;8ep5qSjVSKNs#5=wlF6e(!=5N>ZR);n}P8Qbd8ljD#UOgOT2jCxq>}4{c zd$bhHD!E}_BcOiNT42)+CQ@Cf7il0!l~mqq>K_y@^B_sYk5V~1JD+W|$3#cF5JEV$ zHDd=opzJZcjg>Fev{8@hH}xSCrni__654jw{jRHiUhwsWVe2^OE^l#{V@#>6D5l4x zMB;{hxzVr4)V)^$(O-LK4-H8>w63QrAIpPj!ik|lH8eNJtVmK|gW%@iVc#@8E5SP^9`i^I5=&EJ`I^wNx910<)qy*#xE_ezS;`2DQCyb6hR9Ta_%SK zP3e+RvFvD$RF#ePp7PQQQ${dLes0JwX=}j4?@ZmIWzv6e&xJhNt^YHd4Q7LaD$JC@ z+)SV}8K7ii3dvy#p&cSjbs8sbaPvD?%@M(qn;APu1zv3 z&_~bq?~uMF8G>^z%v{rKP50Z?*@2+f!!5cp!s~ZtSag!5VT379e%YjZdy2_?Fv->a z0)0KRXoU+O9E>Qq7Z}B$=6+SO`J&0#@?L+e#ob*Cb-w zqhsDi!AH~V<7S$Dd%|82^}vsKX23(KDxN$~>oyon!=j}-9!$-Rv_F<8{u?d0P%b%s z{D9A44=&dqi0_Q4IInvwVCedOMO;ymEhWm@dA0USbrkIUF}AB33=>t29F!M>!fj&x z3b3u{6?PcHD9<-JS8trQA>e8OA<0dU$m@qQ51F3AyuP@Je(5ol#4N13>#uLn*K zm2X1I&d_3LA|yw+1LO-TEJv@#CMWL>$M!(rIug_k?6hEqKgF`~o9P!4AU>jZ*|@j@ zPuqaGl@Ye%I-cjk^N7vIe5g;oNJvEaFO<>Oi5~x5%|m8e@O{x*&0D7jXB`BwQX=tQ zSfnNG#>DQA9%`fmz@pfPZ^qBJz(Ns({QYI|=P($4=QzHA%N)TD{lu05CW((=neX51 zR4T+f3_szY-9zFzwCMjuT{b>AU4v`Y-m5tF*NMOpIG-`M8MIV0;mvNEKoU8Ie7K$X zoKCTJpYJ2aoDK`lXw#BX!JN*kwW<4L5S5ULDbc@B_x4EaXM+YOU|X_64ww8K*d=7h zXYF>pGZhTj6ONo=h6c(<8zM$ppmJ-aRGjVm6!ZPV5uPW6+Mn~At;oLmON4mDDNVq+ zH8E4TU8_f@7eHol7L{i{NQB$#w}I@^THP)42zqsHdePa`x87}6M!G-eu!-;)qKVDS zqnWK=ZH{CP z&cNW*a88lmR8_N^I?bHYkU!huW`)HjnU_Zk@FA-{WhTBkRbeJQ- zH1A3e%qILQh*iB@VA~5DQxM;v8+u%r6$Z@P>lb$~t$*`L{xn~aYjLhmYfX-QQv~O< ze{C}7WMou#7J=gl8uvM$)@G3K3sP^rD`kq6RFjUekh0n2jSV~a_(;mJ_Jw6_&>$0@ zq7dvk8I-a^=mGcQh5YyJ2h%&8Ltmyy1-o*PaG88uKGo;*@AviVfgc|yLRxO)N#{eu4d;>hnk@`(SkldAfIx3 zQIW-{8&ERF0(Mg=zq&7yT=D7iJnVU)KjknMF1Nd~PEJl5b6D`${+mGcx$B4L9>4@Q z!1n)VRU4qlVW>1n^;(*v&9cikrLj+_qUTgNPw#Qe7U)I2hpXEfpDk#QWet_f4%Ibe zzYq0u7D{Lm&+caqRokt_U5~Eusj2ZR&YvnxBA8sXAD;pn%#0QaOdu&z5O|_QM>3Y) zdz7Wd-}oX$6h1D+9`kW|#zMFNKTsiu30ft00VWFIH8?vTBNqa!VSz=KDwbUT_e@BW zda8mY!JWe6^zO9bfjKRRzDfn&UIOv7j|4qPB7Vlo}VzrkHeTA^pd{}c}2@8Ml2GB-_teW zf!`-Y)z)~o7c{SxIhh_jK;_eA(NmGhwK^Z)lH^V$t(`7Z3Ii1e9J=E;;Y&CQ3|($M zQ^bhag??&kO`AgJrNmz48HxcOvo`0Izq?WZyBb(}r99$VGCRy^aOY&Rh z1~{Pgf&AEl0}nH5e&C2JPCP4C%rsOat65p)QSV+SGp5Yx9@>|%#-I%ir2-dkE!pRZ zhjS*aF2k`P-`v@GDx!;xMd(%zUB|JyD^6h4v)c(=yMP0y?Q>(TgIhivgvcqMWMS*g z2ESZ{eErqeFT(9`j2+O|1A&Mimy_RzXOaW zvBR-*q|&GhQT;Hr5&Os51h!k|X-(=ajCMB`4(Fe9G^k+Xu|llCj!#?Pu|a@yy02Ef zbHF?aOvXP=^N|Rqlh&UH*y&!V2;+aw{LAWHTahzxfDBD9{EKLiDfv^5nl4&dy^*P3 z+dF?$jS5Uc!71>g)K9#?+}U2HB)`})|D)=^Gw zu0KQglsu1=tNs0=DNbG**4}g^2LjAN7EqB3bSF|@#-iAPs|;q$Fg~zAuda>(7;v#W z8JW5TiBJF+E*MzT1P2FCJ%345BKqPI+0?{?5eDV$?Ohzz7Bgr_S4dNZ&ZY<_F6?rv zX*2EiHpF~da;^REHAckbvzDp0z!PFdXg{GMq>pVo+A~KcLyB?QEUxv7^Cdb`IbWWu<~wD<1WAns(iRp-U_97QMp%p3zb2wqAPj+6PzKWzCV; zsqGU`rq7A@mP8);6wXNVN{0v?9rzyGlM)$nGgXPC_JAM(AZ_$hdrI0wIuoXDt*YRM#6!?SCG~g!3KY2nf40c`5Q`nP{d8}s z+|{G&#n!C|f6vVjRTbsXUA@4({y^g9p!myEmjdvbiNigdt@QWwfJN`h!`G}J=Qu0f z2*!x#+KHDPwEEd?KCS@Y++(Mg22~d^v{+fH5@iM`F}qbuS$e$DXDbcO@y)l1LV%-| zqpV!OH(OrbX4dj`B6oQ9%Voc{_Sd($W=c%%ksY)`B~f=SvMUKC_>d%P{HpefOk3|a zfsd!AZyh^jC=Af!4k^G4)R7x>`SF45wKcR4(OvDt+3^M}1I`mQ76T?G!h}6Ml zjKT8ic`H~~P8wfp@#TrgRvp)X>!Yb!)1YP0B@=y73+v11AXcO`W1skYGn{>FUk;Ls zw_bu3pN&=%S<^N+#R`^`^;qfT#UVmfP@n?|h=1><+`g$J>T0Xo!^5aBz^Zx83JV2UYD#Zc==If;8_ zdQFLd%z!rGR1&}+b!T-zxP}Kl=r`^Ags|9Dz$d6kl<-5{`^Ns8`vP%2&|Ix14rr>< z2-rXo2123VtdeM7!ksDO**_7eDhTWQi2*90s3vM418pD|Tme21DURgH{WR}ph(L$L@OO>3O+7f@Ean@UDc{xCRXa73v<^l{kN~QCuox6cc zXt9hzM1=Glv6Wl=819;|XqNn8Dd4=pKG!6YilSDnQA%Fi&-ojP(shX*hy_aQ!taPF z_S2VL8Ma<;0$mS(mTvZAw7+>;X8?|Yo3uwgd5+zkM{KvHa@E_(7(JOPEW4U&S$-}) z(3bRQlv%n&5k{hu7iLwd0>9U58q0{Ptj90YIlOORVIF-OB8!Q^)Z#=`^SLd`7FDR@e@QpO{LcKQCmn zVJVd?|M+PzB*_;4#WMn6sr-6W81QwiMEefzN|6mp;lTH?t*xzsTc3~nSPYwtmzx`4 z?TNq~l;?;bNeE6;0*tKj{izcrN@_UDqmr2V^DDU5=;$2}ls182`A|CyV62+xA-Q{~ z&P`ub)bPRd@l9UR&Dg$Y)#?SJcS&y>wz}gw0I%q>-3OoXPXZT}k-5=da2W*fVQEms zFVO8&d5ZYzKH%(0^Wx9J3miyH#j-26Q3Wo%008u-VYE?n0TJGX*Bjh`b?+6@9iAOV z>J1$L6KZamGHhdtknIAGkbx9xBJZo4`Sg$N4o0bd$bR=Y(tanGx=@G8I%qvFUp4FI z8jomCjSZr%@IxENyvGecpoVuw1#(IL{lyJy~z%X3T_nv_P`}GwJPGTJG3rOjKo7;Yv<3c<(bVXc* zn#!bG-qDls$WN&?^0W;qHwpoN;`MC`h=6YlGQaiVW|=x|vN>CxJdKpAvL}|4#UAd% zDTCrhjR8okDDa;zj_q>*(HIG`Vc=+kLGwySLI~}o!Nx?5 z7mbPieD=PfF`cf6q}?XO&*3z1+)8i&UR&ZFx@?VsypmGhJZI6-?WPAz?`;U>>R!Bj+rOz${8K79=BSr@%Iw;{Z1ICXqi4|PqN87(kmg+lE$|!Kf;TIRxKm) zT!@Cr5a^Ym_z4>k>8%?H)+Rt1jQ9T96Vtb`i90p)hx`X(;Tyi_Hj(_DlDMMyJPY-i z2gxyRQHnHQCJl$E0bX25|H=!B{3l7Dw}{vxix^AyPH2!U&pe>DyBZ12=aL96v ze)&T!^~j84m^QNB#@W~k1vajo+kf59^xf`jFg_PA)bmRV0kM0x?qmBmcwl7$xaO7Y znhC6Ox~;8g*nj@;&GUougzYo@wWuJaWx@9m0N8WC3F9dq%M+C$20c|)J{m+viw?nV zRn3DlT%_$DdtPDbqsS8gC+{)yjl8g{idA)P%U({S*ekclmn_lDuXY znMFtmQmSll0D=&pR2XelBINw%E}@eX+Q$NS^;mZ;F? z$JA}d2R8EC@t5YAR0sZ<6cL{tBT+ba@sZKx&R@TG;i8cepZ@B##xGgf6xvqEUTJTI zQo)I913>M0d|sB~O+UC_7%Z+r_E=mkQ%Fbm<+=2fA#jiH1p@T%!o!>*I16U%5J$fx zKJmyehmM+I6nv`et8Jt`7c9EC6` zXT~Bb+xEQQ$pom@NbH3}9Sw~nxVlE)p$rW0>VOSa!y;gG{Yi%f7qB%z!3zmobv|x3 zaBDl*M`e4Px1PDSet_-wY`GcEeiunTp2%x7y+2t%LP3ev=%Y^f3c$?87?SF)m)Xc; zs{#&zU@q{3THee&8GiIWIXQvrk9BC3*U};cTmWoHz@r0HNI5SE#~!O1p9+jPsl!HG*KTp5+X@%!Q||arC|jSg zfUULG3-3TcCXM-naNYzd{-XG#tq3uplx9Mb1jxrcla0py za|lm+i8=`sH@+V_yvxPI!@Sks}u zU-040fMAZq_r6PxZ#kt{5lFdx_b`W*PI$noUYP?;%UX~ zPW8Nk?F!`U=T(`=g5HFgG1TkWR*ytCut z(RUyLwtjwzDlS?MEf@(oij9viROuJfWJP^_0;Nne+w$hLLi6QbeznHv9QQY)!9dOp z6qUz_TD_eoVRw-FPq=Vs(p)Om?v^xI7gR~c$Gz7?_Fy5;hySdQD8vE-Swfz&GzrB= zgN?yG>cxSaqu-%j$^=N84prDZuC~PLR+vEa59e#cM@MvnhH-#IaQTV}vBf#nmwHF6d~Unl0##)O?|B%}Sf0mT3@EtU@4q!NDIG%_b%X-k&hlpWW#(nf>O zQI!_}um|NSSQ^E*`|L6-HWuL1zeFYm)RUBFBh8onL72WBdi$-VrFDF9AxwULA$~i| zK9mFG)ro+oSgMRbPYt|gfPZ`D|F*jR<;B(pwM4kce@%;QeK!5hq z?9no5_1-iaji&}89S@hA3N#7e6_Jqo`ubaed3~cbQxEOAm4$J6*UwMc-Xzf-BeXuJ zkn1-mgc^&n1V~$T}j}P|e=^j8F5P@?)i)}-K7=Q}Q8U>{$nA`#v zQ03XT58`S6c)n;s$D6G^0az+a_^h`)p8X2R5edBa(m|vw1ADb-70&}Y={In)zH?W+ zxYI_Go?Dj!JpAC`Ar4bRf1X;j#c}}=bNnvu>YkMw)2j%mwaWn{;>Mt~?3kP}mu`B+Gj00@!@m0vo zqngaMl8Sgt38##TbWg?2F(kgQ7$YiAPp3;YRm_uBSxk`pzM9anDrr5nM#FYGDS!ga zkTjO~lLXh>HU`X&Cc$8TEC~q}HRdZ15J?`)TOfxugS)pQ3Q;N@=<k!8wU&4vxJkN8c=$!zZn?8lKb2(=5sv9s;=4OcOlcl8{ ziG%3hKz{5^U~U}QqJ#n`n1T)M*_o_&+a?{yzs)Milg0Nu;2%Y>Ms1%V^%DnmMA}R6 z&G8uN=9?+^Sn>01%LLzI49=1j7%&qLE*tS6zau4(ipmZKxcrVC`)6y9W{lMOu@JgV z85lwuLaC6OtQ&2vjhsXTm1NNt9?JQ4O);lAjiBY8C3FS7i&Dq;>KB$;)TbXd?c++C z?fE%)w?B5Ic)iz)?&56H>MqAAcZvxZLWbS^luXv)6Z`?7PGuuW^XDq|+ieW$b&B3< z^yOgal4lMrWpqi?Z}DTaU#s*TS9r{X+^!!(QC!7_i4cUcb19WGUz7~JwbH|R1ikfB zi&0S=Hyt~jNX7&5WvMcLMt2fZk33=>0l5V0lt%lO>d?~?e1n*>p0lg%{tBJ;WJwBk zgS?IBHy~mDDhvdQfmslRM3C>{RXkVJ+Z$4(_0xx?)p$JB=FO>g)lM*VzsDaED?(~@ zbrqN<@9yq0dWr~)%q=bR)tLZf^3lbGG{{{XVyD%E6jn?WI3GvdGK!mR%?>$Zt`#0h zi`H6`zkE)wwHEZ7Ecxd{5hOYcjS%1?mwo>GH|SZVHD*UnHgEbb!?3Ywy31^u#HM9? zA4{&VKET~5M;PD8)iqh0>WH~9(simfSKc~zp`$T;mM&3s26XmA9}@IxsU};o zfxm$vJ_wXDXwGtE8n*fU&U}c_tO;-t{JX*fet&w9NJIyeLY+9F_NCNQ9l>jw4hPf` zMU7xk$TSyMx?IKlPWg`@VIs@jY(CkDqrL*HiYvo-Aa2Z}t2(}+;9Q^22>5wV@R^|o zj8L4vrZgNzzJuIRqA`H@9jl(+bXgMeUVrTSYsgI1ds-w)4vl7bQjMy8;VgyE*37}Z z!y)azshc4r$W{(bLPDtB|7r}yA*-;gE=I0anVCCwPf%=HO472=i1eLGB$>7&b>xlc z?s1pvO2b&apAdk==$_>s5>F|6u$$m_flLx3ooQ$-s9fmh2y7=pfD99Zo%V2dr^t{r zw1*KU88ADG?$I7oYcf9AQZ;^cbrlHK*2Z31SE7=`6o`i?2p{10@bJK%>D)+H^Kv;Q zRR@3)j>RLYqBxRVn&`z- zRkl0r>w-w?vCpAR&(EVwh5eJMRN=o6f2_-OW3D0!z+-EZ2A!QU$1*~%*L1~If2<}M z|1!dYMNEYFR?-%$)Gj_;c^|;z#7Tyz@%{YxTlAvhMY=y^Zeanq^UUVv0Impt$c&y92})BnZI3H~-?45G(EKte{@aj(U+#!>j!1G<82 z_YtnK^c!w=-sLWw;xD|LpF(f7aq5=6n(#d_hxjy$Sili^MT*etWA|Z>?a3zF`@+`7 zy?(88{_p8@E>ULMI!fR#_LM~@=GGzQ`;|OOQ7hj|RK?|+AfCUr1Am<}V%sY}kol8l zZpE7I=>65<43^X<$kw^T0LqB$g03N8>O(N| z73N8Qg+zpO^~-=F{nk*oTj-MZ`~;xFXsjgm{h0YvxjeH_3$3N}Q)|3mWFwd>z1!`O z#s!Fn9hI_FbrnQGzPrD8AQTV^HZ;A&)iB z5SUX)K&QkU4m@B$qAgYKdwl1tYpuU8{gtLxsR=C#h_>)jiMy9VNDwEdC%{6{iU;`9 zG_I#=8bT5Qr_e&V6pUc_w0~bv zyZLzRN{L?O`@HmAb3dAWC!;1@vs7P7KUh|@uv%{c&7@Rc4SbMyz5J#0y4oMND8D@# zRTVltJp6fYE#h%Ucbtw@DW`dSdi|fghb*6p`lp#(ZXXK1L^;(M`X1tI#@Kq+J}3*7MVw`HT9A z8Ygfr4|Uly-?+1R@AOg^0Mfe_2|B}IbQ|apzVU~uz#sm8ojr1u4IC~gjk9xjHiwc@bFb(!kD}bY&e~Yh%T5q<`c+J8K3LT^_=kU6@ zFL&RE<_}-+3$Kp7Pi)p~47b!$E*I{vSNYhpCUiTmPv|&^C%Wu7QTq49i^^GRhC-pr zXC%Y?@3u|lzgirF1_LTRN}Oe7FDV&@zRk_1glVrw_bYDo_^9b`H_vM>j_)r_zBkeL zOqZdYTG!|_UUz~TC9_H64jZc`UhitRZyUs~PkY_AG}uYn^>vx)z8+k7dInJG$iwXczAfEzwA;%$8((>6Er!|-UtVw&Hv&CPODopTOeZr zIFO5qi~snG4Bv7d{&u9=xtae-*m`>5NuMOA?Y)ov)_eKEV?#Bze#S-Vlh*w)%0dU* zvF&X6bk190bg4`&4_UFP1R^w*6NXH~%YJShmuJi@(ce?2xTi^7?4BLUuYCu+xhpCQgDIKsv@(skfpsK65D zT8=ojA%Pje+deMR=XQ9O_Lc{MJ|5+(UXPpm3lK&mFfIq=CR3cXX3CD zDVe!_*zRY;kBj0j$F?!GxxBrrQ&8pY81hNKlsgr1DEy2EDE`=`(m&^LTMNN^ne^cO z@;~sG33(cE3bOr-v7}dqn7d!L9WK`{@LSfm;Q(BB2@U3r>YH zLz3x}jIXbVrse9|+MgtIa;Sx0N!!~7zZwa|;fRLC%KZ$PfvL@Je>|nu^O8&{+!TA( zo~U6Fh+Y9YD8SjQtz`#Nsa2=(@-%;P+}mXGcRC#Q$7mvXGFY^igz^qr(5>cTTe;5A zVqmkpH;aMM15k4+Rr3|;YFsb>(F~9(?01r<0p&2j>VwB-eZ;zXBf7!LrsF!vO1(Qv zma1=J0_i8Gqm$Xrdb>&d#&o2ZT7Zb#t%pE7kc1L$g0hCHGGbS`IsPhh`iHpRcvK7P z$_fZg=rmccNvpX&8t~#aC1RBcn<&)gQGV~rdm8ArhGK-WTo6ow^(HZh?)1Wgu0`^2 z!!(_yL}qDcHm-Ms&6?)+%W_4S`~=J5VzB!y(`~#?=qrQwMYS4&RF2mi=Rij`%*9YW ziC*^6PbB6XXHwHUU|38&*EpX8u@8kCxcc`+3dO8CFxFL~^4nn#)Nj{5SZ>!>aq^Ug zdSGj3zoqZ(R z+f54ZO~RpBjS_lUR=OHDrsV6-vkjqf-_Pc6>vy?~B@3H5WJtGogv8{nHbT(dJ*3^< z%=Osc27hLJmkWd`P%c*~Dk>T==9rk6;M#}2{d;|&_KSF!CJ);4@yzJG4E(>De{T;8 zICFr>1W3mN-<9%(^dwWD1yFouV`FlCohS*kUo#i>vkl=S9^D8@36%IB-=VF&ef01) zGA4$1`(D5EHqNg~vr>sAB}U6esZ#Z8p^|aE2Jq+>y;zY`qKw2^l*-bG(!LkEJv=je zy?)sos-^6>j;cP4mt!f^tc(XN#D}-)$w7%cI;C*G|6*Su@p?ZoBs&k_WmFl;iLLy_ zDg#H?npwaxc$9=T;$jrQknQAq;UMr?uXn7k(Cj>kJrL6Z(L``F!Dk-BwI+^-bl*{N z8c7)vUmKZc53+xJ4VsI}3IF%-($0PDHA8E#;r>*gFzg_i;#tlPi&>8U&4m)n6OdEp zzPZMG6U+rhKN;qqqb8a1PSHG+VUK#+K@1+8nIq8c4m^l{{DY!z6+ zUkf0Cx6*7&Dh>y1VldNVV5ULzR%=!LA4IGjH3`Gnt0PmmE>~5q9lsf?S~39BERvJO z2(ee;D27HY$ zQlZcvQVIK!8tlA-AAN5%Du(i63}ZD~)ah>H;}FTKy*P@>8_l_^(c$He`Wh_r^|63% zspoI_hkRsu@hqMxNO*4KcMpQL7Msr9)4i`3Q3IlQ{Kz0&q~L(msG?ekdwL1uu|)(M z?+$r^xvGp~D^a`aB?@C~llRc{P#i;n%x@XU7W9;r6^;LnYBrKE$@GQOp=scr3E=$5 z5)~&x?l6N^rH%5e*MRSS*#gk53t;a6O>o#AU|Ry4P16Kp_0lBTJut&a@`O3>%4Kdk*|%3mluT|0b>08`7M#2niP}x8E0$9#|Ze$0la#_9Q_h z^o|Cb?;wT(kzh7h+xEzhN;!U;rFze()D`F^Vh|F8BVsC=TMP6pAfe?bjdNtUMg zKf{pIp~d!DD?U5yIS=+CwxCsa-bmqy1z(e8t5EnDncdV396W(PkH@nl_KjOFfx;Dw zXkmG@|D)+EgR<5}g5?rspIQ&74?8l^iVq>=7--_JMSPcCL) z=G^DC_FBg}qE(^^`-}hZ!^0oZoi--;Svab?KM(88&pVqUifYCwSxkgEmk-&QhQs*h zYg6cCz$p)hBFNKVb$rPnotW+D&tr?OB2V~idD|Txlg$b153aId13FHh1YR<{z>lb-@m6cWQkn-{9fYrSGoeKboOjk7_!{kzTKfCeOnH3 zlz6cm0Hhr|cRgKcF@?6SjYvz`*w`qaD=}c@;=mkJXj-<{JP2UU5+Nb5t7XWDtugA# z0jX{SP_5@rV4Rp)SQx&)=hxKKl%`59Pk6T8B1s%kpx#+(9RRoYRM*}5_~Q-!zsAHD zMt{TnIlscTHi0yaNb8W6;7`*3mg)#aFG}(6hk$m^fAOZ-yv8kvG{4xi%Hk-qST}8B zJ^qI`<)`0_P3njhUXa;eLLGFyy3M>teIXp29nm!3?1eBFkm9-(<@FKy7{b3{R@QN0G*OD{R9v!*uH}5b7?^w`8PH4n`CKIr#+1iSCqT%~Dq9@aO61T03?e zxmfC;dswQwQJE3>K_m}c9)hI@xehDU`ggZ}XH@_a+vH!!&ke`uP2l-kGKmTmkWfd- zci+xnOp9?TLMjv=ULLw?3V*jt&_COddJ~T+Z2OX$^3|CoY6%ZD6vB9*44T2HsXO<4 zJ%HTE)>}tJ)a*|)h4@A3h^)>m;of?Edm5>4#Bzt#IpPp+;VC8TJ!4v-wEb}wB!z}z z2n7XREDtH8>TR=aEwKG@^YGvl6dc>yq5#}XZ~#c*P%V0>tF7-9IfR6Kg9@I0;O_{Y zoUeXQOy0&cdQ8a#s>%?JBM25Z44CVin{9qH-`kVEt4_9OH*Wxwf-*e9U_uOG~Nz`{a#|zO9uMIioC^%(#p3dcB_;m1FN&(5t&? z&-7v)g=$)8ljR$B!||6otkBtfA8t@or=VsEJ~w{pMaQZ9FP|iR8qT=`Om3>GUv?%=v!o3=|d6ZgZ_@(Uf9X)Ggn? zYck^@hHQO-TxntkEmpW>a9tfMU<3ij0|N7$i;OczEp8c3_xbPTWd+9cop5}kUgx}b0kmZ}l8PzO(xiEJ7xVQm@M=zL($rYnLu>(< zPQJ(b72afA&CMqLDkF^v$-hFzGs?XGwlk-~zC~%q(ZHtXz(I11h}K=X(?)9KDC_5Z zEeOc*VwQc&L7tiC%$CNf9hiAnW=es*YkammS*n(Z=@gsiw^M|unW5W=zR*Li$dncEj_w@?#|-diD*H9Ey`?12K1>Nx`_A~M)`n1$mVNxNA~kY`tt(u zLW66k7T=)$v((=i-Wn~BaC0-#6p@jvC`glMq*} zc4tutZtkw)&^Jk)P3h`8xM@E%fsdWjNCi)#w>0NLw%gY@K3`xqr7S-d-3hmg7X`o# z&U_75ISOW$C@avT$22^aI!F*n#IS$BL_lWxjyLP;Y@PX$DFRix>Gfr#3!1-h`_T_r zm7LNYZ*!D1pC6G!RIK@D8krx#~47WUYozdg)Qr0zoEFi9I6|2T6u z?`jP+lzg9^NJtNZE5$cL4Yx?Zf1-Yi$! z@%5l(uxJ9yL~H9PYi^&hBs*O^P=5e3?cakRwh=MM_SX^yzLP~}WK3Q~B+8sy+xW#o z^vU=?vLnv)I7(}-o6u|C2ZjcIv*CbW@hVg)O%iHq=E7+2Ri!_hKf~gNW=NnBp-~jW zrapvdkIda8S>NdvIk|h&-q@fIiMfq+2C~ z09_Z^S(Lf^09u@{6G2Ym87`~d8{N-HX5&Vnvh@Xr>j8?Yx#{dfXRl}4Kgt{lb4tb3 zC@(ava4z$ApYf{Z>HcBGHz`@Lc0QFd{E6VBP})88SHp_4hog&`_a!WGb@=fJH~(1z zcONEU+Z#gjE6O5Euc+9T9?9-*e)jZ+7w$;Pgf&- zJG~Z^k+Vd`nHxcbse<>EVHc2n2?;6r`UkLmWo0up)$}BS%Qg}ieFZIN6P8<99&LH~ zomalsSvc78vs4Jix85Hk>&hp*Jt3jQi%*iL{fUqC1nu-`iTPnO>8{y zdb5G`Tzbh7p%b}F10guB#gq}qTD{OO*dZu};jJ@?gPk23hr3n-n)d9+^S%C+~Si?#0XM)(As<5YH64_}5c<%1Rh# z9d->V6Sj|*aT^t>pk7|7OFdlN)Kr9M53p6oi5=1mIgGfLP*h;e9B?-jo-Xa^$UR;C zUdY?g8UgbkpGbMwdpq1v_;oN<_;G1h+8~#&`!c>puQAV>TeeZl%+2lO2jfn=qbCET zQV>1?H%8;20L^I2mqBEla7A%O+t~uee=n2M4YoHq(A@umIhn_Y?pH#ey!P9isoDk= zbD=Y< zZ{`J`Km1dUaZsi=C#xPNDilCACj<=Plmg%4YU5{ zXI0{>@9Ou(n6PvZ&2ErSr3BEVjpk(x{p&0pF)ysq9(r7R>ZPNB*Ug&lPNId=BM!5> zx(wWq|0vim)5WmQ_{x#npRs19efMMP;7W@T7kKaGPWpT`v$0y`b#--BR#q-*u>^2l za&mHc{<>tBXBp4j=_x?+GH90D9pJ@YFV*Prl&w_&#`jj>{0~O3c#4xDabwy)(<6pP4%_QafO9CFLjK{UP z*&txKY!XKamAVuU8@5o*--(IZfVy1a$HTLfjL+V3SE>*yKraTdw`nG(YAvo_&3`j!&y~*q2i79 ziF-;P*Z5H>rEjDC3|ZfkfB8A`Q_MNbWZwi<2Unc^LcfyzGs`LofN^tJyeR5XXuHAOI zZR3dJ^HJ~67%RZ>BRyq=U$lL}%7(ZM0B_JZ&kzs4ksIKqMnXmq67RPVH zhicy69*d#=59RG{q@(Q%TOaV~qy(|Q!ssdYOkcwNThy)`!h>ruodA5H3x7d zW@q1jp#k(lWfc|5FJFZAnrzso7tfaC*U3aiE&uU5Iop_{99lUJ8$B_85|+E!SBns) zIeF`cF&5a|BAj}mNG~AH*R>7*R*4sPm12x(X-j8$tvlGnbmU=YMrkSd+59lu zAAv3=$}@~J{AxJCfii^hsE;{{eNX)QE19Y6H3XjaE5aIKjqOFew&aPM>C}C-5 zYR*(Ic6bQ?;gYvW*QLjNRgg|#TUND;PfKw>Uf|&106;8tqs|EqA4SOjb1?=tHMqU0 zu>=^r9DBQV`TsQOVubYdQFgzao;SI#YTJ)n&R3;(J{g|x^dqxU5XHWy#{n~=3TZ3< zl&hnXLJ_J)ufY(Vy6K!BqnYb`40mNkxCSzxg*+ww0+d;uyQ~FCQ}^>Eo=99!>yJ>mc=k4JWmdk zKo^Ow#BBhd{LzkVXF=#H%M~+b-2t9}dgQ&jDe6J)5C(-#cf$``Xf79sqQOYi01*9U zAMYf>J5j&!V<*f&IAekm2g)4f=O-+4lx2Io5$Ar}T?OeZWRT}#8dnTB%wED%CnqO} z1Fq0HWoe%{PZ6M-U0t95Om%qO7e^jW>^0c;(TQF5tdely>U_hzKTkgL})?$pUNk;QSoU1tfdp`)TV zTiy_j%`?tM#a9t-JT1!+5Hanx%AjrX(F5?|Z{E({U!{&>`ZsjzCz2 zndM^ip>XPJ7~|kCgy_Kh%X0j^hX0Y$_NPR~bERW|viF4;$&=B{Fo-NQ{*Y#iB!>j$@96E! z?KTKr*S~*l053RqvdQnk1<>Vle+G;oPj{0Gs@3X$Px!?7lWSTyRO9GJfGl(l*M|%72@LvL zfOGHN)ccaQD2AVX3fp{Jkd5$|#yVFlQvK%r3*wUZdP8n@=>1xCAev@w+3glSQ62GH z7-E3>!RVIXm-H)K0317*PMlNxsjk@PyH9*>_Aq`BD|4UCRiE~QA5WlMc`Oq2M8aU9 zte{%S2=>9y%o6|6$Zk>3g9pKU09#{?DgmpR1IHAzc47NPBdedl_5zV$4Z#ts`pre! zQkVYtV!YUYdp1OG!b}Y9Ku|r`yYPWt+}&s>w{SPN#$3cwG;d)g>}j{HNv*OfN`^XM zKCd9IrrG~CoB}Iay?QB{){3im)X;gEnQ-J zr6iSh`r2eTzp`as?VbK^Y98ZA)hJ}2i9Ymx+b+#TvckG;os^ibqaUGnFk?Rr(yBj3 zHLlKDr$t92GNuz%Y7r}Zyu68wyr1>=jdrI|gDT(|T$vFfm(HYZWb=C`D|nx{{-tt{ zC2TEbwr9Xw&)X65`jz2F&@4IR+4~MM?!G3Wc!MiOQ{!j65UcLQmTlCpXtR2udy<`~ zRm~W7(1tt03(k48N!Ew9r|qO02J2{Sk^YzZMS`&mswEy`C{G3A!(5{Uv6A@cN9?3? zH-E28eP+dUoj%kgdXwm#Q5-D5i%yLE4g%n$xkUll#MKxoX&M6Fi?DAA?!O4F676cB z0Rjvi>!T84ti*Q`-!Y(Sd4M?b=O?g82NGsL>H2JVmo@Vra!P|u0P_R~|L}?)II(qs zaTxS*T68CByrhNl;0QkR%bd7RQ&vHBwI;Rv0>0u zQLk8LI|K|1LZfZh!DV5Jy3Ru%3_IOagu<)zumr6KF3VK8ug4O0)tT}B9v)I;jsq$z z8p+7^zj3y&wYBj;%%pRNGJTbUxdN0rV54Z{wGA6Ipj}H$Ne32|T8t;}fMS(gtaDFW zRyKk@z1qNiFWtcTp$wQpqSc}T!1VI+XL+3fiimEO-2{dx{anO=k1vz?=x`pkOSX>k zKuU_ZO?j+n0?nbaptU$@B+5^BhX^^@ww-_Dh|i3)>}$;yNM?ACKS+j->P_6TIQjYF zR$ed`hMeGP+4pQhB6EJliw$Hw2~1Z{vjlAz|7c*}SHt`VXFiA8_YzpYw)j>l!@VA6 z{d81_itY8B`uQL!=#p{+^1(`?b@Ty+t#)4V(unYHHx1LTZKDRcV&jHs`k z^|s$nBJf2gvA%{Hs}EZfQ=a!7itPz265B&wJKNhMk}LTk44V76$kBQ|<_@oJl@~L?6>(9s9|uKwAp!iWoxyeK~h2ni@vOAp%vKZ#3dvE4aGvalUu0` zJ6?Q>^6+I>Q1-H}epWV-4rO3pLA?Gx!zW+xAds`D<4THyF$W&X`Ki5JRSF)^|8bqqa- zuD92QU_%psln^Jl>9rc^a~chgI((|{aO3f%yn*OXDc{3dt&J>tq_@0eF~o(DFPVKT z*_w_eEAaH@51ZwFJuQEPSI>sqrf9Om$j7IscFnQ{_%(dX&DS7tj~dBO8Sl)NKSO`9 zEiRSQjP#5-Xrh4^cs|yhq7o*MmX-H8!v&#ZqQOSeB%Rll4o z3Ac9b#lkcpfd_O3DwF|vYAgiGig{ai??Epv>%pd)@^XQ^0BW!S13ZcU#AHC81n3Ck zdj#ac)5Bj2hY1GuG7TquH?LFymLD}_ zh7&_WTV8(Tzls$qfpDDly8vVEH_Bbl;;slQoy*G9;6Q{=@>5#|ef z3MgaoxxCKXGWeK{u-MH!WGlR=hG z5l|DBzS&@7|K<{YnftxeYEl#!WPBfvo-%IPc!ChFk?hhYU719O={{Oks%3|SI=IeG z+i_S~TA;n^0m_#ou?#pI?P}8Bv}z2^)PMNsxR@Cbp(YKMM;g^SkNoJRnOf~Pf5LCP ziIQwz4xS0SVq2IkA2v!Q#>3HtSMI-`eul6E0bGt$er9#H_jiG<#lEk?wD=6tY~;Zg_Y&Nds`We(p8F1cQp46G`S16-gcdQ^wO~03YoYa@Tcd zSfkfWglj#vhZSy?Y~}zb7IfB1FXc*x?vPX7BhtSzMQ|B4^s;IRdJon!HH{nebFA5@ ztbn7+uZO3nG|@tznnz z=9*r?<=?*&mqHbgGeW{CDPGV1@5K&gP%UbG#j$&dkJ7@|Qi^ipdo>KKy=3B*6pf$l zk$Kls&Z7t6pN4A)fgATKvqj1C{Edk>a8n0pwUWpsZ;hknJ+OrDq)w{E5LB=4nPwHk z_4I7ak#?g#Ss`q(2qg@m{#MWQo(Mk>NS0~cjGBYI|Df!R#PvvG`-iZhRHuz6=|qyc zi6Vc7NbTw7hHrLlVmfA$v@_fSG>dgISC7;J;^vnay4crb2*Dn%XAYoOi| z2$KaV%3cML$L-R`=_?T)_d35K%jfejqz%3=L+Dg%FY)mY4kV&A|NR?3XNwCsQr?@s zn^K;h=#4rk4k!ji# z_iGKllhNnf+7K9~6<-vy^I9095|$%UBU~|GKos&{($M%1?+h~6|D^d<+Z}B)kt$!= z<<1|y(PfD9*H0KDi-?ZzszK(YFKzi87z#n>kr#fm`WTlU6%&%}nOkk-ggi~lLDmiG z&{}#7pIL%L9}Tp`Sk<5lVH}YPp6_~(4D5b45-DOwO(4|-S0fg@Y9F$lNcYu~5tqcn zQ6^{aW&J#jy0zF!*MIK(Qor){Ccu4xi8L>V>qndM?_tSFW8y-d>F@j0+>(UU$%$X;A5R_miGA2R!(mocjMT zl}?(XrKxHR8bfl<`C2AROH1WYcx{#@6l{2Ie#zREmw#ObCF5?xQ*7QgUI&ae*?;Ei zyOWt%JHo2aTlAt0OMfr*&)}io{JfPg^toDQWsksJrnl?ZG5s8k(Rpy>$k=VxT9PEm z{t;DP#y$?xqQ73i%T(mo@`syGVwC(;QEX?ZZ`+YHuw#Ij!;`k1Ry`Hj`Ho?^+X1=W z|0bTkerzyrWVp*)dTyBHFHam49i}CfeHW?S-c6JaaherHa_D6(=tADB+3^C> z>L6;lp)-YTrrFgw6qN8%R{L)65ddwY?pWYEyAU~AE6YgUiREL9Z+rL?qdh!4&I+?D zlgcdn!k>uLv0JN_j0G+7tYRt%#Y`b=D9XHF3%PEZ{737Ta18Y;+&-=Bc{`!|7UGZW znzxrNx}5V?DmrEBprL+G7e}5c*#Jg(z#L_mhq0}ds+6`b;A{R^%>nMeyTA+RVcC(3 zkRUD2zG~wuq6~DDBxSnBFqtw9OFuKLT2x7-_Fs-yEBp(4ra>w7#jSy6`K%A}l#NHM z#XqB9`!O163@Zudd)ePtkiDwnxr^gtSOb5ABqh0i#YZX;wXvXgu##EkdRMxf&yUL~ ziRMZqt5n#Hvxl&u2iDwUqlfeXwG&4zc8&2Px0jsdhnP-@Q^pCNzTMev3-`m1=p(ewN4_*Ew-C9!f3 zJUf%+_aO(4!`&w$TZ2cUvvR>^dz4sh>ch$8Xt^^XddJp<{}{jYxkE-Xs6-}~rUgbA z`4!B)tC%Zf9A$^CI_LbfxmV<;Y=e|aF6q!i8WvykvCP5|^-H^CbfWF3NXX08#(O?p zE5tf|Qw}AVy6MRV0`nq+e?{fJSbq1D$M;K2nW^<~_kF*D50Y%SC6P)l5e!dH2`CZ# z{>RQ5Fa%vBQ9PEjA@hjoU7g{Y?|IkBI-k6#vA9kO6KhwPU42``>+7p!vr(IdsjXR) z;{feZ_w)@fx@&*)8l?1;y~L!zAQeYTQo=UIvJ)e81aDwcI98p?23 zd~ybk8+HD!$00wllw!r>O-xUcoZEMVR2Ui>wfA+fgNCs>(o`78L@%{zC7^qyEA&eV z-eZ!dGrteF5q$|gHPPQjD^qy5lGLDbP|ubTd4jHS=c6(^E#{tW!ffQ;a0o2E90R33 ze3twxZpJUD!_@r6qnmu3pG+0yB<5W1ea+Uh`~6!M5)I8@CjOkS9Mns3qWea9G; zub=rmsiSz|)JM-yvl>~VCjJS2)~$UPQ1x}(B{^D|pfmXlt>v#(XTO*+Uu|)U(^N0j zY=Zn9#S<%Reb~=L^RZNz)iVg85M_7DmCSJ5U~7FZ)JlpP)ngMQsh!J!^560*fXqvS zGzb6oo2piae6Jhzo5VxTYaPGSk1wg7M!yG!x)>~($Z*xz82-vG4(Sjb5>2hW@&e%zG+K^Z?oSrsF9YRLol3@!&V@PThCt!kkpmE_-g!xA= z#HFMtTuYB@hd|hFCr^2ddl3E>mayC4J58otr>7#P{4Z0C&}?;qp`?xfXlp%r7DFYn zwT5jiwq@HrO3O+_M_IBdcdOFLR-{oTXf$#{Dm&w>4R+=$`_XHpJ>=zk_DzI>Hr?o{ z8;x5-v^|B2bPPj$v$Br&x!vF|phmTdf|}BR-ot*6`)NckB>5mIcroMvR>Y8*Rd?d~ z4(onvzIY>s%Eb=zRz|))gdxFv|JF2uue8(bzBZbKYChij7@iMKo7?RU;TfYM5t?@j z>7jK^B16=qkmm<)aoHEo`vNQmm@1uJ!+M=z;MYE+B_cDwh%)`5H;Se#>bG8L8Wov4 zV%*Tl9E^WH>7Q5`uy0vmGK?hL9GuwpD*+G>R)BqV?GoqU-FQe6Q%Q6$MNDGOR@m@()Rn#etl&k5m) z(gs-$;ato%VbsCQQvtQt8T`#F8+fq#)*lM>A-W(+S<4qUrK9l8C!F9s18F~RToUU4 zsJx)6nWCU#s8QOCUU??1K?UhL+Tz|v7wLyZWXGf`rsYQBZZ*(7;?=nq!UXZl+VDkP zGp>4ipo=Q;r?BTlt;*7aDnA3{V+^XHZhr&GaX5s*i& zOWggGU*}3cFsPkvsM>Hv_DAA^Qs!_jX>{;Exkj-LGC_8w=_-~|l+3yv(NU(#?>!(N z2hr}W4!b%bF?c9wsLpR9p3N4=9y`$lhWP@3`|G`j%9jMpAY@DLyAuz*P1DuF{1$}Tfq3DDU1e8o{8u0#$)5WB zb0y&Q-VU8h$cQ>4wlqy(hJ$B0ID3Pz|7!0XwpP-S1MrEI-7~hjdz=mn-tbC$6qN4P zpblXptdY$F;3?~QXuZ5Y-x)LAS&3Q@eyBE1vXJHu_x~$|2tcl;^BDCfJth*QS&g87 zje>kd!v#ZU?G-b<-Pey}E#XuYAJ zik=A+OhJJ*)M8h=ExwhS`8k+S$neil!$0_-ndA>Won0~Gf?jY-Pn*Ll%`rnLZB%5;uFbB?pXLrTXVuVrznnfK4@zLfhE`<{G66blg>?qWV3Y_~FE z(6k81tiK@8`kgP&@4s=%E+cr8%f6x2j=3Ti;d^mk&k&Uck_`^{_^8#t&8V!jz3%?P z8R_q+)`p@>@V|jaB~4+9p~cucd_M<$m@jh=qo>w(y!ph3>rEQB7M&t3orq}R?FyTzOgjY1C|L(8MEGw4?=HZ@C!zgn zML?FjA8}mw2ien}MofcxHlM;;$B6*-679Nmm9oOj_@TMDPhyLw>^)WXP|q8AO9AOO z@whO1P4rZ|zXkdb{zUtV$VD#+vzWW5IhH2&JA0p zpzI7K((-ODsU5NAHdxSrPRgMhxB9EuqiMR{13c7th+*LWF9gx%e%XlRTQ;!EUj|~e zzd7&HtXGJ0aewG-Wnmr{d}rdp4xz{pEmJB@g;_F7UvTigQfsNzf%u_K7`xf^WW6Qz zZyVIITgq!NWZjP=q>LN3($aUa$L;qL;#(h<`MAeUu5s)>){956U!1x@G%rM+&8xLE zeZmA>0WN9MVE-U3DRW&s-@7xK)nqAHNTn&TYLP8!DL!FhETAH6i59?7qQw^1)qe2yK8sgL>#!4_6BoGWt2@(xcFc)P@8?# zeaXV*vHsFxRBo`h@@Rk0#&TCXDryxA>3nFPe9JS+5?qZ@2HU0&xxw96J$k6*&30q{=jG#)#rLmRkMC#MdtjBG_yC8y!ILowfe*AlOX~ zpu#D@1_o;#6I&mmdTkmkr3N5zCfTyuxQ7F9?oZ3+oAb*`t+9#8$?$qpl;o(;v=E@% zXw)eJ>SEB2P$iG{lQ}|HR>%~o5On#+jK{+;EA2eQ=$XjN()5$ulYBr3=7<1#zq+1R zAIAA3-9X#VR0AncWvD!5mG?xeDQ;h=f{fJl+jqqx;cS%1{7*o-LihK7zrWr&PhV;3 zD8S=df2Jz(2YpFLS; z71tM|S`Ur-LW#AEK3{eASRC?Ot5y_AndOhSeOo9qVMB&w5o(&HtqHZxg_4ub5EI+U zR>}s!wBxdb;JU1u8oD9_=rwXUmWIqQ0rb)o3{87ZVI2W%OMZv#MTCZ9ln|ByQ=I=q zQfaX=z$BG`gv9K))dAp(!qX#7)XT~dJa*bwDVYXx#>V80IyJ8=kb5q;(?G#REF|8u zHY2Na^wSrPYL;FTTk{$fWoCYUXl@Rt)!#+wn`6Z{Yib@zPP41SDS?$8v}z%991(Yo zRWk==!#YUUA)?kW<$eK}f&(eHT^+uJD~-wzX;m@3)?)><+bf@T&|0=m6j-pMVLI+m zLbPi(8-kev?jpAcsotw=qom0-JXqFPEK;>EQWbYV-5ezB+5E}*7?cL1_6mPnc3z=Bij#9( zJl}{U@<`%xTHP;q&O$iyGgxj*!Uuw@5qH*i`N0zbEy>S%rmR7rMRz$h>bCo{`J%54 z!q8A<1J;N9p^5k+TF)@-T2h(el|Bzl2WSL7v`b}wC#s_}@|G75AJoQOhPEIQRK~Ky6ti=2BWEphYoFk9x8zyNz#V3-OhZkDjmKZsr@UXMyJBfyFUG)MofSpM2j z*eX1WV_VMs#A^2G&JaDz3O{)wo@@EXTz#uMC?JG`j z{6fKZl^^RX)TF9}WprC;fcaY?#aQy5=(!mID6D=}0{8CPT<_DHkC&NZ8$U13baxC9 z(?Bw5Y{dasmp)oVC44aD{+@L=_bZ0Np7`x+VCm8(_dTLs6F`p({|Z{YWJb=CLtI7` z5TD(hztwmcJ*@u1kwx!(hipFjT8%l2(>Ls7R_iUJL&!WGO#Uceec&homyRb~I5zPW zTADMG(6@CS3X?2NDjh$-A~0JXDXL70Io1l(5T62?{97bLLgZx3ys+&>G)6`^v<6k_ zDJY(rBHNZT1X05S`u*JYH_GdJYNQC@J{lzqJ1+CYCMeRr{Cg60nON8var|*f%U`Oo zilFdnCTpe%E$71|2$~fo=lze74UBAoakN(TlQ{r1fKCD{aYRbQkr!B_;!8=rv)|~< zrYrEnf`sWV(P6-h9n$^ofr`o3AC7Nt0-SY#gpqk1tarD)$@KmMlX6kRP)$T_PMdHD zxB(~+1ZvN1bWnvFl9PP)gskjI(O9uM2=C;jSyJA|_5{Ac5}4FsZGrI^Zkq3l`2yw7 zFtE5)La6GNwUL@jrZ%khu1k6EJ)Co(dZiqlq>hYIaK6nT#b~?BkJoQ)IR;r7<*$8C zzuKBTnMtpLZrXL7{(NIaHZ(@V4%Q>q*gl)PI(Ei{qVufNWM&2wSh~-?uZ0T_?~w=9 zM_K2p{cCZXVP~v7xO0#qdpps8D4lxGVX3`*ZLISvq!4R0{>@B1_b)2JT_>7#4v_4? zQR1>84ZSp?{6L&olRtz#$+Y%f$v;7=;lJA>Mn;&A|Ka)pxl5u9!d|)xf5kp5t+-t8 zDQkzCf_(^+J`N*Jbajx7&;gzg(Gh3a+92-BfR}ISkt&5Cv)jFq*VEy^r~}?7=w+l> z-4G!NX2`vm>1pGhIHnsSqxRN({D_f(ARJ7e3nY|a4HbGkNt0Dx55rQDS5lxsqr$|W zzGA?O1?BOq<6IQT)(A;+KiT`G8MKm8GP8D_Xly(rc$%!DJv@`tdp(TL($>IaD$)Sn zsCG36505(nGus#VX6|hVtk@xX93(oJ>2}Ka8TA{Uwl7M|X77&Ta}scU8q&KimfBhY z4d-&1@wZIjjpK7tnur=9V}STP-;azUk$n=Ec@j3^aTx=Grm`>PxMd|&>=9mrRK&=e z_1f(Wx{WNsqDtT67joPLhZbsA56_Q4(lZ(SCSA^H@9IBnH=0EMp{M?UOxsuSV*_)F zb(M>`?{O=4{6WT68I*eS2jH7FG>fq<2Jwt^QD*Yn6Ds+r`E;I53SaK-9Eup@l(w<{ z5#ljhA5eZ|jjp-2a6!aZ@o?eDnGUp3<4{noGhSc&#+M3oW`}4mxG?E29g_N8vIE7l zS<7A9?+$-)_f5eciP4G+Mq?DM`d~N;+IuOZhgHU8d{8@{Gev8t^G!3mmCGdVB5$>L znMOXd@`u}M2d&6dPS|!gsis?NdiKPkxQ)R`pR<(Hp*44m`D*b~TpBo&Zwp%0JiMYW z+yn#N{-G!9-_aRhTpxrlb#Q8Vju-3y^L^adFk)>#>?%I#C0M98jy#rK>h$KS)QXWK z_l*N;XJ$Mwzchh_hVlfUI{i&6H#5AY7=8Lft9pKSLCntlC^z;3q1+s=)eRxdvEZlF zMiXQiw;@AjuriLZO&p>~goH`##nL^b8#Sptp`)_uekrjzSl~@Y^viIp@;u)2{9!U3 z5&(UoAl}O1{y|z3*&qDI=_3)KQ6f@nc*&+?7|y)xO~sb>@wqH`GCh2Bf9R0XwXXHS z5N7(+6bnMMVWtD>`^m3?JCiNC{``7ReUY6(kFjT*UT^_$WUu*1*?M-KICauB2LSzpzrgjai zdO@F8nffwE7qaG5=s$HS;$+E^@OWj9i0ZW2C>^-uBg8<vKf}6O5D#HEt2dL0{%| zJv(xEeomLI%qbucecTRE642fJ7uf^M+`$hqLsSI^rmMFMAG8v+bQkn?hf4`+FZ_EL z-V3Z)ysP-QBhavQNG@md!&%m@@3kQ{LRePnkUu#|zPdY8Bw7h5**LhlVZ=Q>`2cCz zsw)~S(P4{e42w`WR;hB6Osk51MH;*WnDkew#x!Hi7qyfF(#O{VzZgB61eK{9^<}6I zM_59+I$vBZt7H5@Kd%MAJEZg667$l`*BmSieQ-erV^mj`tiP4jD}rflUj_P{Zk&o*?_QiL0LN@V8jadY=kue*Gt5n5ht%=(q+Kx1)DhyX6Y^pvk z?OY{9iH&pUGkJPgRR&S}Psqpe#;1q#X z7@*|>qSA$MB2WYa-C4peNps1H7pb9>I!Z{<@|yMP6HkjIQrg0xnX_%n%6kd@1@w-3 z)b~nxoWDtD-(*Pw0)42q=*qqTS8*C1%x?=;G#KTxBo%SA#)t@Ml$b41b7e$Tb+p)# zZEtCi`ccgpuC!sj9wcPGTdZ|nH@^3PXa*w`5cao+MBwvYfS2f&{~{@$ZL^o>tHrwW zz@wn-%lrJN|8*j4Ii}Xs_XIblVFtnfjEL4=89;0KrZb$dK&}!C-7~;M@zF3*{%*(N z8BY5QDr*CE9X}%RyNc3cpxG(`I_9}JAx2p=#>TfzK~^j1D&j4ooWjUj#`v7ozbEYLBKw1a{!y1`hsYC&v>}UdMKv(bAQ>`I#lzW@wj{<;Q)HkTtF=cZ>>-Rh z3=T?AL#jT{JSo7tM~`;qYE-{)rVQY`PgH3~r8h2`T$RKNP0S4YV``)}`WgD&Ua*tm ziu*4t`0fK+(QhAW_~LV15V`mWSWhG+EznMJlltLG-y?LUOornhcsYMeQNb24avxv< zyuB~gOmbj9D1m|DY^b&FF+~98Kg42g1OighTIgEqBk#odxv!v@#RFDCR(}4FbKcAA zv}945*>r)3I6b+uVP-)A8JIIb>-nS3cPXX{1F+rE8%CjleH^gj0N>zrMcAbKVYy0( zRV32@N7g{Mm*$|xPC2<>mA|j4Sgq#VkK(V~d8tW&p*^(B))|s6kH$Zf$uVo;aIi6rMP2=_d3J;HDY=-F*4J;yp<&ubETB_v0sYPbp{UDD#Nw zKDhe;+z)IOT(%f1rcMKuH;6{y5i+p*HPm7G<^^eEL+j8(I5j>0UP!JEOKqtH<<>pD z|B6}3dU8`gyu@l9Iv21+C$95>(=`2VOlQqQB9V! zvL)Qy6ZVZ2-``Q!Q-o{29Y6YKpP=pTeFz$@>2*A=?)f%MHw^6cri}f!sJ0hDTe61Y1+lsZpH$1A1gusKh`F3_o%E7ZFg^C%MHEYOg zGg4AbEvcT1G(73*D|M_e=^G$5=i#V>iO^mIcj19;aVOn=MsdHtBvtk2PJB0 zWcVqA*z?FG7!PI?J(q-jq9fA;Ljy)^HZrC1)Ak)ghj)yOBdO$y3PPIfsWH_Tac$(R zvFl)V!h0a4DW?9y!Axv8IUV}*VKH4+wi&}oD1?N%^A>=**2k#$tr5;=rnzL39OcQd z8@&|}BCmcgS7dt|6%$2W{l&)SlH|I7r6tiXBFv?}p;n*&dfYq}>!zATbhHng*B^c9 z6P_d0)k2MyKp<9>5p{7O(abSjJS3Udhz23^C^9x$ocJ!>jHRd*@v^0nwMkQN9Xiaz zfTs_@TVR+1>~((s{ypg?39;y&8}J(xUtrS*$aTOK9+>ZhP?&glv?9uPiHLmSbV##& zvD7O*Zinxz<52$qw}@6Ouro>{B@xe_!}Z=ji|`ML>bDJbuL9She8p#P@HI>u zC4985U)A&6%Im$DQ3kH)tbhp_=Tj;p`rpnfvaFDDbT#^J4j5N50($QdMTk0c zN@gZ|c@Y(V3P}VImyj&a9r_{RYsfl+1tBr`GY1ozLRAdY8=BD(b7xp?o3@>U0-in zYJBXH4~Q8HA~7SB*M=KmWIt;(u9k3o1ioBN4u^Zdal`laY&S6wtiYE{;ts1fLmA@E z&MEo-1To3qVc9>{y%##GnKsxDb;q;eL2ZTb`570%HFAgGx-Uj-|7=OIL#R~epI*f7 zleJ!ofL}UBavQN&T=+%_ICg+e^k?i?()>DO1gHr^utRtFsRhv|zB$CZUWbjB)`#eY zvXWbtaYnwujSDEx>QFqgN}7U*6Xm2lC z^KB1dPL#ZLuQ+n-V=>q8Jig~e22;lmd)<)i7)b@EbF zHXw8aJ=?4`&h!<~s6&8GFoeRo-J1IgEvkwubW*xTjZS08&u9hUAGPCbX?f6ajQQtE zK!KuR@R!f6V_aV&GvFb$ZIvLumuT1`rc#RN&q(=N=}oklA#E6&WnN7De=MD4R90QP zg{8Ygx?5Vh42a&hq`ve+FZ)S$pj}=Da4+&PO3D z=n_W7;c9kE8LNtaM1iEJzNR|_QFEtx(y(r5`h>4ZcZV$B*U@0_b7>h(>C!Wa z*bsp)4=u-PFFz6W6;!_ctGA696TbW`P1?33Y3m86+9N%?PU(t0g2Cwm#L96AlqeH@ zXI$G>Co3uRBPWrM4Du>0cP(d&WUVjJZx)2#o0RTS+dtH4=@5U~0k;8|LxB0Uz3$W( z)Gz>IsC=)O=1wd%_e%@Qq@tI>0p1g9T45N5CHEH#O*`4y!40sG%6 zZ{P!A#qWKWG$Su=v&5f}k4SFb_oudPT1owRk-QtCk7H2l6y4w0w_RDhL^jLhY?=QG zL+KD)L?WJ9v?CoqqU2_-`T0jn7EhhyN*fZRH7FOT#`Q-MJeC3}D5mMqJLfazk zG=2|Vj+S$>xj4&zF|HsNJ>!In^)2AxJ$4}`ZW)xT1vw?nK*>A3X*50JI>V~o!3duN z1!hWd%<+|}k%ptC+o7>XVe%;l*rbmQNzH7;dzDf(QZo1Ul(t;QYbFK|T1D9+(l$7Bnkk@WB9q7-k3{ zt$ma$ny_^(nkI4AG)fBFmfD=HPM;!z> zNvBIcVJ?nRdR@aL0!WCJaw8Tjy*6U~zOSGty8@nnFETf3Nm&fp3`8Tv zae(1<4Hu#t~B2TC64zdVbSElaaRf znPeR(fmo~P=B9C`K-5YZsT%m~cc>Ae|KXH-H6L_ zIR3m|3o0ckzPH2ui4+EZa;=PTt4T~r-j{Jx)3(1H@^5~FQ()q#-M!mL*{u}wvB7gG z_l=2kdje^lsmy6vRKko5ZvB4Oe>hscMi>#h(=V8PTL`G{e53UC3V5E}9W~9W7Z+5c! z8;q^N7YctEn+;V6@4~Nd2gZ+qv5HxIna*yU>oXnj)7GE;{u}JtUk+2utW!{g$0C%_g3W<4-?I4c*Ch z56qSt>>u}X13$azMZ8>C20~Z~H=cOyO>YPKqJI1$!5fJ{H$Yeu@<28D<>l$8tNOVL z%amTK4b5sEwmxVbHBJj>Ba=8LLb{H_5z6^n&g#n1%Gv8d{}FPX-je2mU1L3gZ5j&8M~3!*)2oisLB$ZaHes2?mRW zsUTg3j-Fmpr~XLt@sskLs+E@lf_RWxj5(*Qc5%8)caaV=kk@P3ElJsqbpNFp45ED} z{Bx5e7-gwgg+YZOEpegHdZ4PW9-rW`yhGPtP13w$A9KoC!jgXYz`+p-gOu><~8S zPLChkzYv&h$uy#Md@ZvQ_VekBqfsTmwIt~CKfb#%Ivcb2d z3Sg%H0mQ6BF1nPIZcc?T%DKTr57-m{5Ku8M$r7+6fW3<<88OWQ@P!hNn7w3%-y7|w zQsKv*Enkd*a4TgYGJ2JL%-bpphWFpSK4+?leJ9dg*-}GKAT{LKM`g2=kSoohoE%SL zmNB4z!~|n}yOoCcm#3Xvx}}_r#OKo&>ZRm@l-xg~EFb+|I;^uhH=_=Tq6)i$^6yTW zNg&LzfiEvpK8M~Y-TM95LfV$GU?VZ0XnKH|eKt|m=!-inD88BxpBv@$vQu|)o+z)L zJ^wOXVi=BJW+-ubh~Zo_B;IUdQI9`}^Y@*jl!Be4uqR55FO18b`?{u>=IEGB-7IE& zUV(j7=1No!N}igXEWd66H$I&H95EssZ13rd|JDLK+d|s1mu7-d%b7&LQ|yg+O_l); z_o2_%{^T$;UE4U0e^nBo^#g;&gf1_P{I=vZVdnBdybCZhfg=h4{T?1^V77v)%m0(e zc2xX(DMvo5eR5qREr%TUTz#*`k2*>tq_UBQu; z97DzNDRt*rSTJl)^d+kdI*il4_i?hhJ=Z_95rqTRpg96l+Vd# z|5at^xw$a@oR~LqvO)9;PtdCKYp@qGF8Af8T7cRTLL9lf{VFasnL&Xl_@q|=?zoBg zD3HLEkC@Jw=jaVXQWa))A zH@bqjo+kYSm!@G5a&YSZQZ>Gu{f$OLINmHgK5_?JUQZ$j7YwDtXp_`}FsJ?A%}gK&nnDNDj1w8{)ry#*ND2!)PmfBQQS*+^^{Fe1jsym5w*9>STy{6k_6S`hm)Ws_ zMb*$%S^*pQu=&OBuH!w#`c1RH=1&J};mT7piiLNl^KC@+2T+LQZ`(x8qyDo2JcjRP z1!F)NA?3VOcP7Xmlwu$vQ&U1vPzGH=>G@9u!_h=KF^gf?v|7w8nJ8mT$>xJ&YHF(! zf4mr^e@1m`i<#{>V+F$$By(`?5I?IkEIA_|U%`SYi!gSPr?N%uXf)P53fpB?)Foxd z8=}Da`%(?SzBV^EyEo71G;#;>>U(ee0SE$&d^$Qhd?de00%Q381D0ZvNM8&IsGso1 zL>j-K%vBa?U1YK#&`^c6TLDjI6w5dl4bgqjrt>T^8|So%UJ$Mc_hTXcjnvEn!SkKG z(T9^(f4@s=a*(X_DQ>Q8G&)LBSugeF>Ua6F+W{tfyaAc?k7kh{B4d#|8W{U~j-QQ( zl!+r?+f*zg!Am!CP~?t?4+jbS#O^VL%o8a6ePr!zq0f#iKbH)#ZI8T4mvSgEO5?!D z!2Va8OU)C>bV~{QI&EZ0z0vyfUe&wzp`_yJbh?V4K=}}xS-bzjqBw^b_xIz;?}+ra zlE^uu&@Pi)K47!z zy)u#fYL8@-Bb}#G7&xO_{6U_kfaffVhSdFFbtGH!dvCJTh&EpWBpbq(Je#LrY5X;j zRIuTK{^encCWZ0&FGfIaMFmM$7qt}ynX^@_;Nze+kL%RPQnZ`rdYnkK&RGikY024Q zuUIMZ)$omC)!r{O>X5{_OrS5e^sbY0i$%y6MW{i${00;d_=rO_Tkjl$ADs~U4Y4L# zQLlyKG8dy|u7Zt3RH$jq)rswmF6k5`iC3D)_?;AQ)t>nc3s?nk9>An@hGTB|=_f~yt{ zF@T0mOo$770h8beF#ZKl&M&^BY$%5E5n2H`lVGX(o#-oxVt0L%?q`kRVzn#u5+1hR zJiOb%q?iF52SZdK?q&+N*Yn%RZR@TOez@J079C!kc|$;+YbPgQ#~39|({}DS=F|uC z5XE}(?!+H4n=jwqxb1p@LFOhe_g4>SBMc(5DFVse-sJmMuS*?ZGSfxP=E9#@1|5lB z;}zw!%_JRvk1Qe>7rAaG25mFi%du19Qy5847^LEvd#6S{5-E^y zBm_aCPRh2f_d85FZOJTdK*#3XYHQk9;3@R%-#-dUc#Mn)1>%U_{lAw=_B}j2Y5=1` zXiV_Ud1Std$r{NCFG43v!#vAXVI4n<&ScWXKmns?CuS62ytpv9?7({k1vsJu?1X0 zdxGhxmyuvGS18e1jQ-2#W;}bC9A8zv0MkeM=ijVLNiQguFV-Cwe+bKwFaHo;^}XFz zmJk)Z@a-rtLJqT7a(S|)5G881Eqq7<)neYaq_T?0^Wlwhk1)IalD`piR3EOt=Cr|O z>V=a0#3vEF%n*8AHnA9~gO3(9$w##a9~moQAOG*uk6|dG!s-*W?kMVpbn?3)t2(5( zHV_Z7Yj|2?cM=O0HaIagA8DZV1Shr!P(N+zeH7x)te;5KOyA@8W_;MXE4+D-x4ux< zM!jEDDTlue?yQHcV3Fm^%k!imvKY(x4W^nCfE+nLKW|ch7;7)7GDElAvhXJZbET^I z;PBAg$0sH5@$vP1vl#;UlVe-|KWZJwjanqI8$zDR=&WiL94+`|d3R3gTkWbE_mRTu znO+BGF3h&!yz5G6C3e+^zQgQAx3Lv37y9X2-H(0z749jbSc`)t1!k_cM9e_A`DaNZ z#LEOh$`zadO$+#@bAijh=n5vV*#!#A@iuPO(8;^qt%nB2s2x*l?ZbzmUY1sq0Tn&L zwrG<`{#>CH*%`VfO!B^Uk1b=FQ##+_%_p&1pANJyR&9Ofxeei=_ROIxwaK-)3MCm`)JhxAYwU&N|k1*wi-MJ2v z6xdF2q8$`t8P`cuEDA^<(h7|wizqDApVCnyxqvEHivcMiKudJ9?2i$6l^OW8>{r&> z!_k`Y!np;|)&?W;1_X0FbOzA$r2+v^djPJg^Lq+Gs680g$VPV^)lht z8TnKC=|CN3AksF*PKPUa(~{$~;C!kj>Nwg$G0}VdCIi=Vp{3^=^e>Pzh@p9dxt+K_ z+)zh>M*kT?ik(oz%xUE{-he9?o=duUVa<*j$nQmxBn29VROC9# z8aGe(YEP%69EAu{K@Xsg+1=X{mmBEr?tVWZ!W&`n9vq}v$F)}V6bD2aO{1BD;n!nQ zMw2Rta(?A!ev$*~GDr!j5Igbd>a436V-e?B;y1be+k{}tymr}UIDM*+Az~#f*^MPV zEqdUC>Inu`U0ssPm&z}34R!%Hje)WH(t_&hZ*h^sx4HA`@+yTT@``Wo*zEp3_w`X& z<0ytjXV{Dt%o7`uH`@@x?2&=Q0FZYhVKB=m63Wpw^c>cKFT|EVQNy6KytA!^`K8_6 z=cFK5!CijBl_Rwnb1z`HTPsc*05g8@;tm$D8TAGkg~(tpcoN>?O(*<<3hu9{a4i3A z_LyB%g~nmb|J5d=$po@PbZS%1w5=wT=s?2cs`7?{bLhqvR?lot(MnCF>{h?J^oyw9 z5Ye@Q29{}Cg}03ji1YG#zGF$1vjA=~ASR;$VX*_|Rm`#atbOb2#w*`$4)qb@ZM--$ z!Hahv)Sia3LN1VIY}G8M2L_ne#B5*6(GqBhPexQqn6^uy3^9Fp=&A6}qQcEk;_~he zocicL$(;d||K7<-0a)kjmN%44;THiZF_E5({*u69?~e(Z3!MVS!smJWUP=1cxoHx!t+9ma*P9cptMv>&V zXny_sK>QKmxf*IL7v|!?9e^NruMexUGsEcWF7sbRYU=30I$`;N1N3bPG|#=GRnR=(%D#l^FA7YoCw25o*YD?t6R3 zAHd|oZ)>e>bg|y{wm|d|rVtajyu}PK)_#sosb(dlb{Q?#d~9p;23Xraq#UV}88X1O zDAddu3gqi~oG3?6d3Ku}SwuDQft?wNjsNDL<<2&kEF9Zr6wvJCH{`c|>sA&6?v?l& z7xT7;;#E(qhh-wKdcJSQ{iqnrn0a5N|CiSBox+jCZzpq`YcbDyA(yepneI5*y>Sc$Rp8-9r>a@t0hq=I+M_B)#Rw%Oykcka%AS zlql87*yHXcM4?9#5UJt86_!6V~K zsHLcZt!;l?PU^lD5Bg4CY0fFmOhlcV+clSmZ@?JJK_oASjYKRz9ycxW$>yj1lDn_C zI1P551{2G+CbYDSTs;xeT<6!W!B1*n*Nc6|cO!C3(fIV2r=n$F?)mg45F;3X9|?d^ z_0;YaN=J--T%fO0(%RF_PS-($a0u-?#4)-c2(QnOauTU6#VooKE^yt$CI&P?jlEzD z)89Bc>z)E<#jFluR71NTHlOSasnGwD%A{7|OW@d&nB9{7;)u}SHitl+l7%KUAtepch zM}^ghl=@xNgdKCl7#NvQ%;wYEfJsDkY)t|nt%z&l+d4DW@@SW=pxkVk`5-5rJBV8( zZ9AaQwWwn|dLu${IJEk%YHw-&NL0JASg^yl5(~jFQ>wdWUb}@@_?D()>LvW}H^D-n zh0eg0ocuQ;kYl#=l@o4ZD=*O_HW#$iqfAw|gP8W7gjR{{n&;aqm9e<@pMd|4bg3a( zjmHA(n~*S64(DNJg_DVP$U1Jo2T4;?d09(VX`y5)Bi341FXXk0b}KEmlP(^S=t3Bx zx?tmAEEZU+^t=vAmoH7532#NSx-f7BROYdO(ivXj{L9JeuvwyT@2|Bhhl=0VHXud< zaNT+u%3=O8fa*j)7BIlm0==?XmMp7NSg{1_D$B_6obrJtt>ky2snN3ogi0Fx#dKbO zME8+G|GXFvpZx!Y)l5lr@j&6n9!Mf|=Kijn`OASQo%u--?2utG8ju8J-O%(-0 zsFBpQQSfj%<^0tvpUuW9Eu%!M1B@)pP~9gM7E>y2A`@wjfchMpSt8InTDmL00a3GF zQ}Vy=W*zlM`mHj5Pg&H#m!rkT*Qct1))5S!JBk&v@TX-ZWP-2J8Zc$#jiFs7d=Zgk z-lW!RlyZX+{D2!VPVGBGg4OV8sJ)-Dv@rL+z7tGhh+TWEf8{9|(*|kO2h<(vgr0~6 zBv%3Hw{GH#tm|4=;>A;z<95iE?Oo{Fi!e!_iIWqi_0s%xa5%L+>Oz<#=Z7=48`PSu zaQ zFj5T?u{QFbGrlqV1$dd+N440s*-&1)5u6iraSky;g06NrK@wqd~2 z74VUSQ0Sy$0v^OCB^-j-rf96z%TJXx{!2U}mun*ZWrprBV12Ik9k;oYq@|iOBH?FO zP9_ui-JcJw&Nmbug9~eZ{FPCXLZPe9yi$nSXq8>RUTUR;J>?m)q@F1=L~T1RCP_e# zg{>cI)f;f24CUG`TEZgAlT&JQgV)CR^zZ`p(I7#_ZT4!Mp5Ge@i-#~xa?Sc7=Em$= zBxce1HAR({VWgE2erv?_YjT-`SAZs;8maN@ERgzN_i1h5R@kl`u|!V3d9ApqU(M7t z^JcQe$~{Hfa8*iruxE}r#-=Vcg#r;=FBrr;b`)Tdh>atk#BddLOY3TjDbhlJ_@S(3Sq1jxkV*M$?hynlO9fSvvIwI=2+i`Wbm z3|t>Xf_IXYz8#E&#oDf-ftf2%23dHY=1JdmBnBu5kZsYjd2_G@E(`&7Y$O*FPdaYr z_K@3fZ%T@?-w}U<;}^OKJo@o%3NI~6Aq}-uE5=(MafPVdSu4^E>Cg_Ajor@A zBqDxH`RrYR3`^u`gzEFQ<4Zzj6DRr8I09gM!u{hXRaaxip?_rkj`p+RYa8{T&g$mY%MF%P z-w;hRHtanGIbH!}O80QQnN*{3+h1xg&qwm|YoX<;;s?ie?R{IX@y}Rk+g7rCY1bvZ z6sNdVNZm`r!(?-~eX0Hnzlv5p1Z!?m;9^AaH`v_zEB`fDfJP)5J77j56~g^p!k7CBN!^Ge>dj)r9C`maT&I$`u81aP2+i?I<0$3)vn zsaMPe)$|*gdi38>j&aKHh8TiPEszs|fwWwa+S|oDuhur*GOT!rPLm6*>m4+Qbd|*q zg|Dc;?Xj3zJ1|hgb;X*B8GQ4KK3gD}R)pI^F#%{1JbW4upbnd_kUz*&Z=;axlS&QcYwu*Y)9)hVyAF%ue65bdOAUgm#Qg%Fg%DeI@a&&hS<&BeV zc5uKhri+W64bNv;OQ=7$CAju0ll=J<-|&1g{Vc(=EfO+q@t^YvWrYv@Z5!-jQnVlg zjFG=p#@fR*dW4i*w;K8&$%oY%>UF${rIXIqTNbaIm*0~QWQ}54KrMeO^-ndrLIlQi zxiDn#s~@%_OzA}P|JK+R68fS~)NkCXAtyT0em^J>Mzo1a;O<`*81Anv+4zPzflHMJ z#f#NiED}p$k2=q)@!@M4aOj2+2jK_RgPIb5#(I{{@9}6JT`7QGds3gF{zNwp`0r!U}Z$cYdu%U(i%UoSIXufS@+_xPsMXfqBm@W#BuZkf<19w7vNE z;*$H%Vz&7S@0ROj-jU`fwAa%HlLN`vZvPfw&w)J+V9x;wSl{$(U{lG;GV6)K>o(=E zTXN`4)Mmo7TPg1wR9!5^vHk)?fm8 za@LNH^f^(kOZJVf9T8V<=Cxiqp0k(0XF}3PnSRhtFoL5jJksX3XEb0@>-V>-4I-^f zzV*l~^&n$Sdggy0ocHEP<%jj^-2(kxhe7Bt<2&Y!d<^aWbm(kYn*)2DGNXi-`8Fou z%R0E>U~fSu+yDPZVB{OUI)**NS0_-+`lCTnGelb(3VbUl8qp#Ig+ml9kTu#UE9Ckc z=gat+IIoPcce(3ItVs1q8Q{_Ra0A!2X-o7fIy1_p2A9 zp67$wts#D`?cH|44L@-r9!N}7XBNRg(jB>zG1!xjJtQ!}{%C9fi*r6^v56l2sw2%6WH3TWF*= zKekF_3H|-r^J9Jc-DBo3*Su`{*m850e=S+tUGo<65QH%Ef-g%7Xdl8-f4u*NUx^=L zPdzG_9Q7~dR%i^+6ego#tG!6*vCYg~J`bF6-23=OBTCYJz=@SsWvZ({aT6Os$y;c! zOZkoq?qc9@w6vrL-4#f+=L)>u;A-xJ4h#a%8a!PPnhjhHvqXR-sFvy{vKDp>)|bHj z1O9F9<6xfvK@7HdANk6U2D{_J24WwpU-1!yA;J75{5^IgoMnMoDla$@L-#weK0Wx)&^-uUjr9xpevCj@}U!5iaKw*X`mJ92&qXERW5|%Ff~faTt5YA zKman%-rgQ$NuExorvN-!lRh}g9w)2uv(4}KME2m?Sl8HlRlaLrN^o_Vpd+jxv}wV7 zCf4+#gatWbc092s4~NV3u~t+QVHT8-T5nFo5V%-T(e>r&jkaIEJ~k}~C5oKU+$_72 ze>aa)4)_xYbUp*q(_G+-;eMO$6|79RK{AV@M<@efrb_#ZV-%QhvMP$2@UDd=M1V@@ zjgxvtC#=to|88`7@R=Nsgir{_32emwKXD=;Yw04m5D2@)a66@|-$@RNd>-&Hyf4f6 zqk)))vbs#!rCDs^|Jt#y^>8I4Ilg3LL}iHjfmQO_5FSLpArmrXMEU>q) zh+Qq2j?w2lUu`Ch!=wHkSB~*NQ9rW|wCScL$q?zLQ>D98b~8tW42=XZm(IwAclbZ( z%<=}=FO7WY>YW4g)~ThXArNE&_Nu8_D3ab$G#>}R-f-=Cbi^)Tn}2a>s$~zYa$~Tp z;vYIJIa!r?2su!e!TWQRJ!Lo~6Gl|o81;LU;_|1*&eypcd3{n&zf9*P!ZsNGAf6s} zcXIVdiX`SN&O~ju!kGo6jnfX<{Bw=!nOUQ1N_PwOwvcu!8VAVQx5?*ya;tdZHnF*5 zU%YoKm*^~&bitc&r}TLFq>@89?~LJd>HVX=QmoKd(!a(Cx=5LvgpnM}v2Pf?!TgoH zLq^ZW?j(_={l8_E9&YN$x4^oObB1ncQ9&dN3TN6{)ZKD>U zizsc77XR=h;9i~JFyMVk_BcnjdN6b#-4C)v7-TnRU3+Ue7zA6^kBHg00+K(Wk z2Oa?d6z(I)&V>%jjXIIDpO2P2okqB|-@Z+^yc+zZ$S6}#T2cQ$ZT5dg8QDOP%~NqO znLLso55l&2T!zX;O?u9^9ViCKKe-N|Afxn+m zF?viN5vp^}_Hu+S8qQN99@&!(%@XTgJUh7)EcoWZo!`_3V9%Y;eZN_9cU+xA*92g9 zIK9VDvs(zAf`~!kSb&hr<+5%=xy)5EXl++o#!F;_VPjE60-!{Q^bw1oi?(~CVTna* zE7=&=UO@J#KFBezwXTU{`j*Fhr}^}$?#E$TFD7Yv?Pj8dNFqvfdR_h-I zR?;An*`nQ@rI>#3$C3QmxjP|UjL59)FkZf)rh`IKZ&0U-Iy@VDs%=clH}p!ozI>JsSgthDQSoNMTzP@D4l-8Fe97}d#VW8ZN6@d4BIm6An=KphkbP|y0*>Y4~xU>lBAF%cX{9>>j2dzCwE?f#* zr+(i{iZn^A7O!6cQ>nEX33Of~YcEhZo9ZnWM~<8S;9zRi({8f-KRZ`SMBZ4)NTJ(7 zYY5a~lVo1p-evJz{Jog!7U&fFOkG(81zF;#$9}dCthhSehFAATzWpn1>ttI8io7%m zNbJ3LD@+FT8J&72md#k#;^L_;Www zN+3n~pif5b4^YSCle zsQZ^W`5}q0fxvjx66-Kr4dHMLq_E&9YFP*~c7ctpw1jw75LM1+kg^${NKBc0LT(vAa@gWK|kae81qH4QJMR;!sT+5rn# zm#BF=M&Eb0F8^R1yKt*(h7{dSVS(5mjO^&EOgNZBHLh}wn}!LyXp9t03ztCa%p%_X zi7&0a8V(;?a#wK$b}Q8QefH%g{eHY%NX@sX=JTLL>m{Cl=8S%3U^YGc>D&u-|KfP^ zyK9SY^v#Kprl)dFma7;I5;TQ4M~nt~olA}R`-L>xN|yHxqDv352Uity*FJNy2Zdub zbK+X)b1l3pF}L!`!5%Rsw$(A;X3CM$$+=hE2pNZ0&9t zzYf#O7Tw8ENi@+4tILE5Li*YN(TWCaI;0ZgEFY&(-w}1i)2(|JFSIyhy+QM+C zJ{YbK#}xSw5{RW~VtUZ_)ig+#=#aiM*yaSc*&ZWAuS=(7Uj4})H_CSH&k~BNF$L?X zJYfQZs!HD2+Q^);2-1kyt5mZ1RB1?xQ@QG5se$-~Q7u0cQu!pfR%=(!s(_zRw_K`T zSNPz|W59N2KKFuM0&$xw^_;#x-WO8RzPqe&%=m`2D=QH*)NqN764scj{4PHcWndxS za>;aDyA^h5y5cdsuSq|@&-La0H&*$sIXK)Wa$uQ131EmCJX>55spLdj?nQU$zUUWy zM$0i%X*6G)aw3HKU})D+HU$v_ZX+oNJ+WLcfL8KWwWU}0{1G~sh04z)kIeOkAw!$; zFR#k8ylvyN>Tc^HuYu*&P#*hezWad!W?_%1WHzkJf@XiK{CFf8?eeXnc>~TwBkMjD z!9AuHwe{WtE0f8qX#MO*lOJ%4ou=Q#n^g>=s5VnFOMc$MUZ|9yQf*e5{gCOzs;rp|pvNH*|Bzq+OR0Ubw`8g$fM~Mf}%B>YeYu6{AWvwsA>uDH?2c zw`F9-Rbo&A%{wM62>wuwihab6?pC#N70IQ~lD#-BNId(P`xquyG}!aHas%V#;9Gy; zt@1`3)&XmdZrR5ni-$e3J$@S~( zyX&c@|0 z|J(Q-9~Y}+SUx0tdHj2vyRPkT_;R0Xc2%nR_uLx@EE)0T$71-{0;Ed9W3GQhP7;OY zz5Td87Fd-&_PmS9AjxzjFJ&RO<}@9!lo}p z75wTJ9r3l-C$crx;pHfgv^EV0OVwD2@=wDf9E}cV%qGLX?eJmfs*z;xln-BNO4gx^ zGrfLI0x!BmU(QWatMa)UmK(D4wca`VE%l7JqDc6m;qMHN56;hDtmvU;yi0~Do3);X z52nswm5*{Z6AWrw?rIzs-y+Gi3ecy#K?RvDO@&h`y$A79pzTFLK^gnZkb?&(`A7El zLbvTeq{fAZPE60LwsKh%f5K_>zv&g83%mq$q>k@Gx>Lr;yy>+{&~T2!t^T06g`YUAlDi_w=L}V zkYY;WLmAA)bZ*sP8BB3FlDu{lYd|;oaGi%PLUdQC&fk9p$pxbMAJj_BdQC_Q-uO1O zkUnJjuVZjlaG5-pmxf{K;)P4?usRr{cS>KiUxp9VDP+urr4mzbuZtNgjMl_`7Ync% zNSeC)BBO|E%(0cs1g+x0b|C5Q&f9Oz=zMiYfa6*y@nqSH+R^(!Piem5mr@RxOo04s za7T}?t@Ww@@;vJzUj@ufFXEhoQ+e{oSC#%pwtI)W<{v(!>6Tw-N56%zw%Hg1+h(rE z_+nMdn~_E`;vLVn8kkJQB&C6m(ldKMb*dV~j;=*jKluHUoQ^n{3u-etdyZO}XcGfx zC=D_fi}FG`4|D!zn4Ao`^(I&HhCA17tKGtK^|k*c7lAWv8?I$EP15V%=p3GyZ(W0& z<`R?lcpy9b48N%}qljz6IQmjzYpr!8>n;nfR}!Zi`1_iIt*B|gXt;e7m($BPtL}HM zqg=`~|IjkL9r~`q+nab3MdV@&vo_T`oJ+7r;$c$P_nX}A4_mNWTKx&%b#|sm9d|9rzn}6#L1wa#Md2u ztSvy7iRm$q60lZb4D({0%hl-?-K>^DsHn3$hTz1Hm_5T{yTB~_YnaS7mO)vPur0d@ zo^TVfa0AvxF=jM#;kl}63Nn6HtyOrxd)Ku3Ivr*v>yn1Wfa4je7vu0W8Kjt6?Q6Z} z*Ri4BkF^?KUq_PwEpzAt{_VBd=HHL#w)eFfFzym;$M22YioWW{%D4z@@EpR-*x*sZ zf{Ph=0GOXH(aidHTn-m%(3qiCIu83>lho|Y*0zncP z)m;4Ivp>%20|rrnL0Aj%WmfP=nvmYK37%D~z~@+$Ky*qVj3GxMzf0k$eW>?5s+7gi zpr+Ny-ikKhORg`_h(|{Eoux*oY#%1=BncpK_oALuq=K)EYMBfv*&T=d>JOQFmyzio zHTr1+jbAV8gGsep)TOJ{8FP_w9#M^jYjWFnhE>m%SDHpxy9}HTjN;vkx29bZp=vR} z5wWIWbow#U`@~bopzCjz#&oKmFSWWy zt@Jh$blopKyK8i%gf%@O_@FMy#w>01?#oCFT}HlloIdsydh09GRQYHiZ7!I{2)6Hr$BpoBf^j>F!S|sJ)Vek3tA4R^nYI7r64MFx@g%?>s zItEZQ2GJUb>7118@}Yx95;qoZ^$z7EZgW=xorJGH@Uah#gz!tdGfnPocVCn7l?^(n z0E8fdM8FNP&pAmAa0GiZBJTZ|)@3p(!wQ8El#wTM%-vRZ+5$aaBPL~R8W>B7H=wBJ z(Ehv_OU+q5fP}q&CX;%BiM^7T75h-lH+x7~#b*dz+W5kQ0d*7lb5-Mm-qom}#6-1P zOb)l|6kaXFubb+4r3~h@>}zO=f!B!uq?LSIN(F&ja*PZTrfL2HpRov+=@FLos)#w+ zu%@8eVPihNUl*m%+dpRo_X7}%y7E&c`_A^{_d?_@|N6yeorv@o?{Shhd%UuT)ik0` zkHTdMH_prNry-4-07Fq9AD@4@6cq=o?++sW7tZpk3Ivul*saQ0I+CaV&>P}yb%t5{ zb%%fa^FoP7--q$UXHL+oXUJ%@X2S$%h{1*l4TN*c5=0P~IgtP{Hey%RnaG$Y!zX`5 z`9*O#aZA;6Dh!L-^HQ?Q!Qt@jS-p@l?H`qM|^$ZTQD6iQ!lg=uh#j|s|nWk zhUIiT5Bj7fKi#e~4||ukW{r1RLXin;z~^&(k%KmOn2K_pE~CS*5~jAA~;e%mU!8%;WB@N6o}i4kCd zg#FoP!epA2gg3bVio$n}n&dTmnD0r198{@mR9b*cBV-nr6tee_R>%@OWtDHL!Zl1< zWj}9(2rDr6)Pm^to7R(R6TBrtjmMuixeo-a6n{;p@|P`{QRe??aQSLAcSHtj(MYU#V##Mg#FeU92u` zDv*xqCb;{m{w1J<6+()lci%n)`KuQxf8+aGB_h|YKvBgSdBR(KnRY4%L;h>vwS4gf zQm^Nj>sm52dB7gU*8YNKUQyi7EY2hsQoo|zgCh$+zm_}^HaKk32$RCNo9h~f6#-zS z`+3p|Cdu(@TV+Ns@S#snb#;H=H<`kbzufkfXxRepplaC+(V#PdR92`<6R7r3(a|So zXF+*r9uSZN4pUSZ2(YoY2a2(O!PcPHGB7ZJ6&K4>@sbK~k}dQe)|R-}!?~;nPwM1o z+o-KA5h9KKo?M#F;U(iFe82!eUJAyC$vwn}VaTDL?=!f^I{!Oaiuqj}9DkkP%Fy*;tskDkT(bzLO`KVSRd^gIlGL;nUp@dyu`J2C;#>dP= zm#GgZ$AUV<G8;`$cKfn+(tfz}6O|tU0e(X1G!qn|4^f)BbEXxq)M}(7_wPHAyk1 z3Zo9^K$LtSVGk7fHvv)wey=IXVJ>*`BTQ#c?9Sp$)cKfm(4w`@G8RH6Dx(UHMTkW1 z@rHM`wtio3CJeZVS@WdmrZE-1zRMM46FYig%=bk5iS&0|Q-+bF7Jaej%%=C#rUH*FZjspKsB_HDg3I(8U5rMV;;pPtdw zD>+;Cb#KG2W2cSq*Z&YvZ)am#Ru3U^vS0w1H4?%B#3L8|1&KA5V}`{$+fCP{Wk0uJ z=Bj+I;2i#hck+;~Xt%&4U-Om}iFP7A+zx@N1bg}J zwH#?cCuK~@gFcC>cJH>Jo{+o_+~S}2W4|DcjehHN#;9KLjB&JG2BPQ|H*jihm4>>E zr1YtJ5|9RB;a1Y*V+c*Hs+OBhEHfFX7{8QZEjTEckhtGEUv{IzB5xE^OyM(5F-65- zWQ7{AC>^zqFpcks7Q&doaaZG5-j?o?IauWV?ycVf}KI?3LQ~9*Ma;-g$ zWeH4;)(78Iu8%nSP`}Zx5R)4?JR|`zSqcI@ySH4C=<%nMwv~AVuR-ev1Bz~4TcI)E z#hvM;^h*7vnhErlXa2z12neyH_UPs;%T&vW5zkuzEvl8|n1Dup3o|?7XZx48T&~m( z3K@YYx77K5mc*)-|L(9%Q*Jc*KI-;zL~rg=o|2nY;%{#Hv=j~U%;91v#{?+;kei1lWT|_7Sj$@b$zs(7x)t`A;9oM+_nKE$Yw?r1G z@Sz+NsqO;OY3=Mrs&$3>kGk=G@;MemX@Gj*yV&pgg-f1sz?`$LpgvzxiCYI^E1N@FTLS=4 zNmld1a`JsuPII-*43mI>Kt@i^zsz2+lk8*{+B+eJk!5q?eMu+wJX<(97UvJK6A7NA z`y7kI4`~i}+6>G%4G!dBSQGE>>v$A$lE*=)NkfaZM6=zf@)DtGcG&YGDKJXF%@AzbrkYd>F@m^NzKge)93_v5s!HgIx|c??#mY>BPIh?r z!&_L5V0aj6_!fP79^bqICHWxKkDO|XEcvtwIj`P3I|K)gE^4vjffi9te%{RStYwV* zv%0}A@GdXq6l-X<9KBT@&%F5Q#?WWfazLeZRrnq5vl!u{iaHu<-Yf(ih19-^J4mYg zW9LOv_9rN9#JnBB0i_}SFI=H7WRC2g-sQ!A2miWT_N33^vCjihd@?kc63qB#g#CXf4_9j=ZJIzxwW-5C2H5l)&|aqA3J{pLe?JlwF2&MVfT)?;3Z4`2!DR{@M zO9y_x{L322V6jQgasN?gD58fkNb@U8&W%24A~pFfl&V}`nS!@Kndd55OoKS3&n$8( zdGb^dB%m%B0v}^WAq;8V=_c%ox3k83uP#BJ>>znrA=!WyJev{D0YZ>77Q>PJlhCQ= zU>rE_{mZGybNI5*hh5#v@ayMiKK@E7_n+Y4)?yc^#N?HjtflS;C3JiTV~bK9)EE{4 zY){QtYcjNvuW882M+;=l9y?kZmGK;RYsFuG)mfVgW7Q(;)KV0iy(-$1p$ilxD^OFV zD2OJ!m3RK8V26yWph%osC)OX#)&{-=;N#;19MrckF57b89&{5}QTZ$_CFS)PO@DXY z*xFUG^2_?bYUlj5{rZuk|C@B90RB7ugz7VA>;W2Z;_vS6a01AR@C?2fJg(2`H91|` zfRurie*1t5@Wr#^83H(BFcmA-Dys&CH#)fp_~g_3*_%=1dJNE!f}r{GOO1#O~o z#cA9jMG0^}o_|Ghd{MWMQ)i8`Ue^w8Gq0v?thdt?FU|$N02oIbW1toSqQaXZ%5$UEOzL zOV%l+|M69RJ$dq8Tz~U9WeMaY9_qcQ9lo;f|Izf7QBl2L+fvdnba!`$bT>!|NJ@8i zOApOROE*YKcQ+y((%oIs@E(8v_xa{x>5@5fpMCFr?JFvEiZC3?&V{?>NI=LB& zw}LbgJlA7=50@z?o~)Z$rIgIVKuL^9KPc!)3?k$s{8+_pN6nk5M&PSX_aAQ!PO|9L zO6dh$5vLL5wb!CereM9|3RO`N=C+7ngGBPe&lE-^=I9Q+nTZH<^(()rP^V?5Qy@Us z&ri5KPFrE^>b6xW0(W?#JQp9|#K9l@Hjh)l&C4G!?|XcFZ2mi-UFUHskfc8Q0|#k9 zU9wDtHt}DsLEzhKqAo2!#DU0NXaf#F&wGx~@3W7&Tj52HuR%>P+6vA+aCkp0CrIn( zEA(5w0rwqXDV4oXvK!<<4Qxs;iJw(3BdgDLrYbcG1=TUUc?qXa5pY04e`zW`)=3!1 zBwq0g0#W~vVC{QdHT?VuyJTXW7oayL4i@cAdwVZ8O=5ht+qF3z$bem9!n5?5F!gI9 z^~#O%%B^E0uFDH^Sma|b9jq6FlSVF%g#}qLe-LYoq)u!rMI$Q3RR;!Ql2nwZYHTH` z4yQfh4f6G~&*!l*k=Yy46&}YJ-leOXade4bDlU3@<(Es1-2Om^WN8y3twbjCD08<4_9wDWn81KAXDLTq7{xz z*kB7Q{;JaHS|Cc0nWH68O3>S@36zdLh!K2c|E+7CzK8D_8ozP|32#VfT# zmJmzKT;zV1T}xzAt`eYOXsfm+m3N4*g8&>8v(c%}y zuFKbqi-bt#msNXWVuDCoIa9z}a=$wW1|ULVeX}aUmOuakQqq-*Ayzf!$66kzDZA${$SpQ-_ia#Yh?t#Tm8ny|1fyF>pCXhVR>6^K*;8n>us(&+hlt=Fw; zk>7!j2eKn()AyZ$*kyc!+`8_9ajw1R`3*7*b3apo1a^QwtgZmK5UDC``jFy>P{Ao= z3_s9Pq`I~2jv&4s^La`jq_;;P!N@gHhRR;-pz7Lp(C7w+{)yt~LVPX^u&IevV`dI& z45!!`wf9nX{fI4a6P6&8%~KOPrko- zJz@<}%yqOFnHOl2cAPLsWOEDz&$qx(lyocY>U?<9H;e&dl%pd7@b7fCi25RuHD_tI zYQ2S?uwPFcoIPXuK?>GEssK?BxF`QjvPtUy1UX9vfbBNW2das1u?utcy}mpxc6g#k z$e%<#uGePvSZ*5&=*_b{bjap?idfvQ7MJxeA_IBVrY#?s8w;`gQ2Ws>vEMPETj z*tx>X$%bp+^!3P>z+)r$EQ~wI5$5c+iEuw>m3O8SbfSwIsb6Sv%&q{d)?)&-iX0|3 z2>T0wDzWAhepTyn!v5L+!G@6d3g+EebNgb3Wt!4rX7NLBbMTmpJUEU7k+ zN70x6JRIHuxNO2Ni&9Nn;BBvU-j?CDUqcaN%`m-%EC1Z#Li0=}f89y8t*>v^v0GEENO2GIywlG$Swhtf;0s$W`X~&@p?gm=bh67Dq*TRKgjUJMX z_PT>45il?uOi_&S0V3g|*UP_W%uK1k5KK;{?UK zwt4FOv5Yzz^YuuSoW$ibl*zLC_cn!Es@VhBgTPFlcFCefG^`{@xe#py2-(px&5}M; zj$4K;F$b{uuAj7LQo30ql|1EJ8uho$V#63{qirc2t8y7!5gf=(r%WU$7s(ZWo3;4_ zys_Rp5LtR{#xWM=pMmEAfceB{*UK>dwsw{U^L#AG51in?P-dMibPy2|Vu6VVac+u8RSuFnwI-8ny z0o=g^jHm>E&S0r$1d*c{ncu$?-YU8OgDYp20yY$<|6;DxK(zPtv#&+lDoK&b6C_zO zsx(o{5#D4&9l_ts9ZJ{}wvIjS`=1~w2}Uv;sy!c*FkNnjSz{%+{+5g@ib#82d-lsD z^T~ap!q9H`uF&B-S)v|SkLv}^J93)1)c5ITYi9Dr(?YkiPzuPdcFT=fhlkenS`~&J z-+!@nK@UON_YKY|6IC=~KkWhi_qOJqz-Qh;Zp|Hlt!-<|bm-QqX4d@krx@_(r@yC? z40B%3f12AZs@=GbK8yi{7@pKG4ZZ!X13PL!MnU%F4iFpyUWukACcyxuM^+a8(2bCR z=6|$VAZ^&qFH^Tgi7`vcy3dcMP!m<2hML7XRY`psa@%aXjPkZW4`a71toVZ`$jLyn z7@4ahbt5QH%f~0s!2Ok0#vgMG3Kw|+IMDp2Kbar{ixP?I9)!jExqa7y(y#{X{ z)-iD%36|h{0=RS_9Y+sz`U|7uIJeg6FW$AqdA(afsnDj>PP0%nYfR6xv70?qOe7Mf zYX`V7=#OMpRA+u@%2!XSmU*0tflj*lmUe}wI(p*v17@1j zNy83pk9_|?uX*Mu%I?dP*BoIV&1$e}@qyKE*MI#naODAAHZTn_8+B&dFE?^<0b!<3 z$ENc3AXtD(1~35;`au7%Ho%yk5Y8JYtT(r}|2WxzJ(3e~$>yg34M_hzxGlaIDZ`b^(Ejz&istl>kgjAn6vk_hN?t3L&E8z|IaVCa6mBH#);Sb`_}J z%s`*wVALCS>0+UYWaI7ip8TF7Ju^h1ks_3OR+1nTWr$LCf@dq;WexID!NjC6KOB9&|$KouC?zy8;)r>7HGSeD3p$ukDgqWHxGRb|3Mf2)!d zpm^9!VR(HV$M85w6R-C%TdFP96!h6*n1y-co4t-$^@@8XlzG8pk1*M?`(zni$7jDN z`K1PSvO=Z{eypSi1!l12{&ukKWOdq$fnIs2;4e3(5a9JM)BJ*)*@y$dTQd40uSXWA zQJM&e(3fr+Pos}Ep4&#cs9qE zofo=Ldw+D;jN{4SX(l`EXEh(McXFSxawqK;&l1yN#7pAvi2lG~M=nTvpgLfW%XGt1 z>-6o6m(mj*_|}(EMYO}!_4C_dn2Qp*a>&7aB^E$l%FD}>asIMeu(IN223Vi4qYxe9 z{EMYQ{igqM0xZ($(EjTB^ay$MTmN`&IrR7RU)I?6@E;v2MW5AHcUbXmV9!nuG${EJ zl{~=qy}q%Y-Dd|BrjEm+FJXV7FTRv4M{$u%nc*hi{LSd47dPPX4{RY#dPRi1XKpYM zbivoKQ z|Cb?UOxL@B!<(`xiLXXIB(2|_?&6(%*$f|_0H;8kz)NSkpaY$tgU)x>u$mSe0Qra5 z;+5UU20aaw?huWHfBlkhDnYGBKG&EQrKKw99>#k-ApWiAvgCgaK(zHkfD@Y&1g*emqHJx)DjVCOA0SNj3Zs zZ|H_+Q>;^^2f@C-gUxz6diZrK(dJ{>=>shT!25vO0}$i@`7$%$6u}g7zVfjvZ_+Ms zOkezYXKK9Py(DmOQE8U(`?7_7({gg)yRR{utD-@{n|V<6ymreiOi?#j-;z+|d@+qt zc*wZFjq5{CB(|TwiHvM#l*oH}Bd|sMy()z~DPL@KG1-LaxO=>jV7+>>7wA;ig#lDN zT)INJnxR-VrF*pvB7_I+StK^3vsd5Q4dKzY$3C=&&St1z)=}*mIKy|88s2059#Rv! zrMTlPT~1ti^CGib{$Df1z}SV$pjA8yclkcXh^715HEOH#^=59m8Mo zU-hq7uJu%_(ofFJ^c@^ng(#t;pnQqh+~^6Jwc(jQym75H6)Hdc$j~Y%*s@=OKDjV6 z@FV%x2N$yw`sB6`l1q2~wTs-qxg{pe*u3}yTSX;Dr!P=PIwFNc1v}#QzD!cRcvNX| zzwfO*eTeVlx6={K;#T%B=U!jY@|#UM;%@2TSo{|TB`?|Msfwe2i@30XncwTodot@m zQ)~l}9I3;PhkYN-Y$9@0&v3|+fN=z&07r9A#edm$Q%onWee&aKsJO9<2^K!AB4i4Tv`R<7J{HdG%J#KFqAVG zcq-0rkFwMSS%fB)JcXPPg%26y#|mS4>{gPe$gMW~9%YdM*DK<6aAjU5PnLAngI zjt(&9bBhWhez*Nq)7SY@S{;4%S8GM8*7yNGC(W#xNw&2z`{Gc+`LFpPk*Nk4y%R0%vjLwOkk%HkczhQem%M=o zWW10K8nohcyp?PeCrE0Ggs_G_mUa<}m=8rSLA73{Ny~VEx|w5)pDD-4-hYY~`lSL5 zf}m2Zy_+vT21kg@e?NZ*_of91C z4)h;$mQJiF^1UkQIwO5Y^h|D#!njk9X#=hN2n&fY%!eX}!$GRw2VikZS-#-L<^JN5 zqnOea|ACV}Mv3VSTy!!BQWa-;+v^LAT2-c>(5I5TKwV9|2@c}%LP*A_Esr>=*>$Jw z6Au)?4on5;-ZF!JfgUOi2`osJTxg83z?E4F2q8_(UtI|bdE|Cv(5q~(F z#HLEnUW5JEsP#aGgtezr=g1iLM@PS7jz(Rsn*&p@w7#G)POiK>vB`Y7Ab#M&v7&(e zFPIDH4gO)MfZI@k$*BrmlKRcxzb-S%d|V>JeUAPo3;gVy)8yybRF{1TCW|FaT{&~V zBGS{+HZC?L>5G8!L#O#YthsxNe58biDFXhXT<`AEGN%oX^MlLFOKBM5^H68i?CaC^ zh%PboWkhb*q*P`GEfg}cVlE4FHq+4n)%yeS<~LNV*Y_Kgs%N|BSZ7Ooa#(nyS(tjV z1|)(v_?i|8w(Eog8j*PX*0x&ZVPJ0jha;gm%3ibjPx3mvC%ZTJl(FitaSFzJ%$n^nH>n#E#XLl;DfrK!)w6%T>RO1Vw` zWR@4w&Q!@Z?ef>SBbAXv=_w`byNh0SBvSCZ2Oq@Y7&@$cwkg7Y1b0*$KeX@xeCf8HQXX)t12l0E^r4Yn{OAvrWh(-JW z56Em!@eQs8WY~1K?{6=uIeT{jPfZ1dij^RV{1}TyRq0kz$(I*5_Z@=8t{jsxDb92| zHyT(_T!`4@`u8u5*cUmS&B?N4f-y~Y1ldd%O)p{*AN^LpIDG|ezEaUXuXn@7nz+<= zX#K;5e)2b1bryN@NW8Me1dzOY$ewI_q>AHurZoOBz+buT%^Cyk#1)#+88+jInD5A< z8O@8hW!5h@)HEZVxo}d5`)1FL4|urChW>HR53Gr6 z2Cea3YT{(5V}~T|YAiq4K=d;sxMOO|t2PjOs8Q-EDd!DKE&Kfg7daLNLsfKC9I`G| zEeY^{hMcsMw+iO@D_OtS$OI3L^&U*!1|FiZGcGxq3yOzJv(J&sE`sf_GTkcW8ZmfT$bcJAKoKf;HYwoyN8^1YJ za3doq=9)ljX2}kXko$OGTR+pERd7bLDv_reMU=6UFNcFh>?){_=ozSI2$)hR{|@l3 z!&PCGe=Rsev%TdudotrUl4}moLYMU<+?h%(*p`mxV`Gqz@}xRiQ1upIT!}`$RWiml z$d;v6|A%0=u}U?M9IQ~+CY;BvRoR2oDD;{0WeEl$ozbfE2xo!?K{9b3tQKbnl4zq9V< zw_X3zt{7nWT@yLUGP_N5Ny^ZWs{xs-2HAULIZw#_6&E|3W12SpQa}*W(FgLbST#El zT;QNcL14HfdxbuOtB#Stu(*>d)RUS?ufok=h||mZr6db{kat*=wX15i60QYln!M`2 zGOXhwCteT}(T}9st2~aeluDel7e{6nXZ+1)*PjY=%Fh@)RNAo-2s|rd0`;4u=Ma13r0eoA@n$u<@Br-10ozx&Z5@++^c|=p>6+s|M-OlKJ1Los~X|r}9{na$qQwE2# zk_oB=&Mp&?JG5iH$Z-Y%)O{Xpjz`OJqW08xHv*#zhFOVL7g7bXkGge>%p@cv|AUMP z?OSqe_q+GGl|sdA2QDsLUbo(!dGM;1yA_T6c)}h&*OtKs8Bygp<~e@Jo#HOaexJ`n zU*KF=*u^70vhciW@B7g7G}yg!`HiRlZ$^FBDZIO$3>?KPnyCotn8_(2?moX=OxC~y zdDe$+=D}yE3!czxQTC%%o2N>N)5jVYqZ@}!!+Qa1VyL1PD~yzh;AbTGAILxhrxuYd zHg+bvVz*Q2 z402bnP_eDf+#*2WLXNHj@0}d5;NM1XbfV?G!5g0zZ59}bJ9bHa(C*L{ z=vzQ4D4&veu|qV>#{+f&u)D8zS7w(&T92mVv0zs(7}3@YRVI=dr6N+x z6f2PYR2{30)s!D8DsVqq)an@M+-MHH_$j%Qa&_$A^BBtJC@(~D&(4>aYa1sSWjP4f zDDP-;9gH%!YI(iSVQRHA6 zbLN)bwW=k>10B_z4lC(Z$c`o^>=cP=x=Yuzv-N#q(goZh6>^75R<>1IIKlxCu0>zQ zRvEbZgaUN&d}U2y2GLPFkr=dLmX`Gv>wNj*MV#0IFUsCh68kG6?61Ch&9%z^!(LV^Ui*>ZL355#*jJ2C<^z+QmT*!)?6y! z-9MOrkI0$r#k+J|59cvP;%jQRW;EC@8%u_W8!sm8m5Y3z_Gt2th*BLU(+)fMmx=&s z;okzZWCLX! zI@%(&ht7XBx&{`g(W>+>a2qnj56ko~f<7*?vZsxrGOTU7-b4XCd8X1yI7CS%lsDXF zI&!7s6x!|Bje(+!e!4HCrIpPzQXttQhLP zNJZ(b=gsh?mz!!fc-GyRksr6b$D+|?METn#$aHUU;6xqTepmi+x}fd;p;vv{NoWPA zhVI<@ye->8Y&obOEm}OZC2`xCjiIOv1s!s^D4mX_VTAT5ErpV-hY3!^^=fW+Hy15| zZ_ptC8yGO%yZjflP+0fb$JeI}chBllB7FIpSrc1OM$zx?lB3gWU0f-xmk6J>h8^%Z zOHJx}%S+?u3ZZ&KD-sRiyq5hv@c)|xELG*iJ0XQPh70r1r>C@wKA#pL}O1WjIOZuUo$gV;JHw;wPrhQqk^d_!P(JNG|Mu}Spl;z$1+*(B^Y!5=Fq(e zO@!Wk!p#nk$%(7JREm%F^0<9hlHwk$b+u$S|fgg1*<{=Pkucg1A^H zROL1K&x+^wXJ zjxY0cgrlyGj_3xbm18QgTq1fqkQZq*rFdsRTzo>74$l{MKuoSdGSu}}_oIH_kYJ*Q zC-ezU=^l^1;|+hyZsdOe%sxE?_tLDB3@ZTTUN-c}h<)>EF58!+Vc+ny!aK{E)jNag z%3n>k?x&9nr9F4(rxnF@`R2>_nVNb@@_KqdM~F+3okmK_6cj~$Z1B|KGP%Sh8cnw% z(>syKD=1tH_RY8plT;ZZ^aGp)jUEq*s7ZSIgFogT8A#x&O}LL+)B)?i0)UszSRYBp zML?GjN;t|B%egVAp+$R`;6{QXpzs`hEY`=K+trkMy4+OfzwGh4^YImML}rLVa#H^+ zgA{!F)aX1jSVpg0fW2>JSy%Wzbu-DbRQMI{)0(rMzY5%D05HJN(5}q(Gch|i@}C=P z`$pp-9f=4b#ss~hIWb9ignYIwzLV?N)`~@nneopfpTWT?J^aG4m>bkQSDztOkDBMP z5`LnGN5?{MC$M833I!RDVT zl3~#V#0s(qC=mNTd`W;{0g#6Q&;npJP3np=!Rcbc0fJ9V`rm#$g_<+7NrO1Sg-mkI zm=ies2uU3HbzUJ-4F8nPzIUhFId8Y?_p$N*C_~P`BCxrtPcv^Yh)M&czT{G}+5eiq zY+k4=8;bZ4%i*!AYW1Z_=HqFc3wqcyX&QRSD+)X5HKK9k|Np{iUTi`)kTyVRj$eI6 zgP~#!E9pGIz`j%WpqoFd9BwfYWR2n8fpy3WsKid&VHN|e^%2Yy(^bwHk`69U0kYS= z+vXy2faq}{2eK?^4o+&_=i=9X5~>1{co}9e$nU7Ke7HzIX*$VInH7g8x{OcpGZ4&a zjIYj&o1UEwY}za}h3HLtnZfOI=IiWwaoA^}+X>2YfG1`s9XNYHt+2(p9`IOG01}P^ zpF9I6hD855zkmP8fc+0buSR(&H0x7ETStF*@*Vu3GnU{4ZIj_J{kj@xd2_FYC_}zu zu;GU?n*$Y*v8S<&GVtI1jE4)E_wDvWTv0|yDd;m6?lcG$beNHNSUS|D85xY_tM8I4 z1ZG!J&x)@xt^ky%D#=u3}@;6=27We^MJ; z{h%Imj38cw8~io!;ee)nrY z^fN^OmfMZwUOAGHbaj@pfLS7%{DgJ==m!jI2il3a?a8&J(UP}4NAE-T1?S&$+8lrl z&o)23{ehgI+rCiaN5<~0xo23P)I?7XN! zeO`G~`TOycTq{}~4jH_pI$^7i&&dAuzmXa+x1oga8_&DC{x0EFla;LO)+VH&I8?xl z>yOPTotofRS;0?GpA`Kwk@L1#a(H~a>3{Bzt}!$71ykpo! zs9prKJwuQVTMR=arRE(T5-8ZE+$gB(&i0J;)&K%oi*h*zgjnM|P1Bzxv7N6JF;hS! z;+L4nC8LFO%hePLC2YfL)VXe{8dqa(9PcXX#3VDJ$ZfDy6i2S9(KXj{ftCJ3US&ga z*UR$6RnCf5eJcQsCc4BGel$1zXHw%Bp6R zU$&j={66n=_#nHN?{S??m8MUhs9^rN$%o)c7ESH8+)G7MiJlsPTHp*;2Nfp|I-~~& zdICZ%6vVW(V(&ja&pY81Xae|~0`!L0zvpj3jq_Rohp8gN2avvc3rsf;PYzD_!21Wm zv8_9EB-Zel#@B@(GOdh_jZ;04qb*em*Mld!LZ+(ig^V8>Mh%{17<}dt zu;%jzu~oh~J)!5X>%655FPA~v9`b)mz^tcTab`MeZ6aNNH?T$ATq{({3J`4K+jmIR zRQ_UiMUxlha(>!<#JjsJiZ|@dTSOWK55rdQh>+T9p*nl*kQ*Ot`$WZd(Vil|tzM(97S|8{?3k)6Vu_;l) z#6_>UV72nc`YyIny0et(l=qa0oqSl(>jZ92mO|aFabMhhloi;dJp^b{^iNLocI_I#M zA88GHn(%iFm4{Z2CF*4tC2z+Q-b2f4!x3vwth{7to3inzn;A_j)@NP2%TZwltWxqT zy2BY9S7hYv<&k(g@pb=0VN0UrTxoh=l$GvD$x+1^t5+1)STpmOiVoV}0YG%AWc;T7 zjet}u%U@|dnn&+i0=cIArnMOSc4EjmV2V*v=X&(qkSk02z5v2x2))}vqnH~OY9oF9 z)@cpb_3+(%EJY$%mFFyU3`Y?Kg|$Rq_lu21wiIV1RkthLw*$wZ{@nOuB`<}MI(0zX zU*mmE>+ovyj$G8Uy+wfW|E2=BKUp5cBuRlVT*a|3~K$=Q+J_#VC66ex~5LhvNr zq|m_W>XhNZu!a!|M+}6!X9|5f1_dP8NXBze2XISG$+T;RSlHTt%S$q)n-rb$#0;>6gk&-X3>@L5L^X!lj zCm6g408a51a~G@4_UV(Ni>P&dPfpoX7xP3;$F+o(hh=FP(okrj1|ncWI}W)d&};zr zkdIHU(iHJ5;p?M3=%-YjIds1DEkDGQy@tkZ-tG|@J=57+{Qc!s9-QJ5A2d;LiwFLm z!;K8pm{sz>lVcexr$`?2mIeR78hZZ`|MuJ9K*}&ff!|?OV1d&@7tFSKx6xN!nr}Y} zm6QGUWLMxwKxfS)o-cah4}a4#6;q>=)G!W~`1&zVr?;IHh$M_I8_RtjUid2W1@}2> zHmJh>g>j#avwDyb1EJvG&r*nwxIG7Ezp4=iTjzIa)MX{d zPuQi?WStwMoIs2*5<7iBJfjgMYq~Jh zC7W`GEm|Zb^Sb4Hy_B?F?%5<5hXDW~|?_oHxKx zAtBBQ?*Ppu8g2!^VBdtb6kpq|3hN!g8 zN=WuzADq}(E?0G!VXax47AP=;f`Cv>-CFCYl1yV?ThRk@*ytohLWMp z$1p-J#Jfqfmq`6||XHEfw}; znrl%Q?)g<@WfX2jB(dX@FH!yz*WJ3#?2&)??`~R)B)IC+-!GX=pj?24FR3l2WAJSt zMiao@MB{f*KsT;_5T>=y<3@5{+B=Sh{xZ(g>$^U z-_r$kg@Vp|4@iYO@VEp`tPU4y-Ni;bZzbFez{4IviLn(V#w_Y3vEIgs)(qlvpa;^~ z6NG6UzNHq|wcgUN^NJycKBsL(*qXRDX1W^fM_Xt}pTeBXp1C65Ntk*~J@TBa)Vz3` zw=Kv65CRaa%$O{pK#vn;w_2M_w(>%r^Yls;{vycZBY{+(1dVM%$?Zo}*##@~=jPiu z2ay**2Ku+r8MmG_|IykZDT|!r4KjU2@Ztj-@d~tuw}ixf7X*vct3@_KneD@=*P|mt z&ZX;bf>NP|g4n@ea6phxu{%Bq@~&)Pg+SNMrdQe(iaI~oZs^;w*nzxw&5s0zR8gO0 z#&2`55&h120%KoBK)4vE1hxp&+P?m{Jrx+!%DTr4liBaE^zR&Wkin5~}AocxXWMkQ;*8 zc<+LEPSL?^aR#!mBXW7kNY#PC5x4)LRK@peHK+A^T*Z)74?K(lQw&GFr(43vE(0EJ zT6%h~JJ!TOa&nZ-o&E$>#t2|z3UEt^`G4k2Nk*h)v$1pV03m##YxUmc0X9Rt+7CQt zQs0MAwrHKYka~naiUtDs%fBLW+1rXnf@^y5PN2sdxfK0fHMGz>$njL|6D7-42PPX! z*mlr1#nlTqh197IVkA&H&@}WRFnO_=D(^!(hK8P4RlujDYWwYXsRs}038!M`%{Y)_ zNfdqPh7HA8HQqU)On|gVlX2u?lD#gB@>(M?RCgOt zE!O#&OcP%&0cnD?83PbjWaPS&^`=zGh&Xm0LB$PQwBJcLfUM>wC@W*P9|C#oLHL^U z_4<=))4LgEw$s7F#bWFKeIjEuqlx3=^DW6pMNki$$yi%Z^l|)X+^(*hk)4!nSBwb^ ziUfjGC)?3@>X@|QVeSfcyr&4n8r9)FmnVp)716U#kO~?gHX7DmOowJT_IKRhPRYpT zbR39Nh#`r$VD?JHt_R!^z7FYWa~RyDvxFf~08#OP6D;TK`b46jrv|I`f!)YEV%hAB z=yx-R+%5WOz;@c%!+w1bNJX3(AUtJZAz}g+UjhM>|u<@E5G28%lR&bDCrqqbRT(2R&o^266i&ohJ_nF8?j z_sW(9Lh={}dj84ytdX&>Of{in$L=<4tx4D0H6kMTu7>;2dCsrUTB@F4HuQ|~*I;Ik zWSK?8c-t2L|7Y5l5aw^4p%6o^deTjLfQ#`Vnf%n1zq_%k@Yg7O>{bB_JB(q1GA3M! z4v<+upxxdsJcARFW?M1jQ%*Q%UfeyPENL7J7Y?eR;`NRM&e%O=A?# zRlQtp_rX)%xUXVF!RlZ+IT7IGy>2Ko$Md{hBU!iNAhVtQsaMWRZL-J;9V)#vMt;?u`p>yH#zg7K8U zHL~|t9b&F4*(=uIn7LoZJdplZf_t~HjjG)({`fI9!P8yJxZOL%1kiw11yi6GyTnI= z@F;iBL1uR{!`UmO$1bzu^Ou+?Y1q6hIfUSBO@biOZ z$F8il^UgMJav-(Fv#sh$dHpUBL5UmSwt)wK{Qe(4sgvo<*?~moEG*y$FVod7UJSL^ zAv0pmHb~H{xm6UJEeK9uj8~)J%z|f&KG2UGc9&&yRLVTTU|yn3q0GZo3)XHvlv(+; zj%RMJhgMrpE{vcM+7=M{l<%2Sb1xvP5Xzne6PsQ&&6}`IChEq)X0Y0$Pm`;uA;)lG z%OfBtXl-lzFUwVqJmZ%J4kEx4*JS#HMk>(XSh<{TkY?#(7yNgem$hr_KQ)F{Wt!l5 zyW-mhyyyl*mh?jk_d1jQUE3&N1UG7^_?_jywf9dQfd%Id1IHQr^)YspdtJBtMxFFC ztBdq`ahB9BonM`bfWZ-x1`{HqYiYVLC|qtK#7{Ke6d!UH6IloQDVE517E5HKVrY;6 z?oj3CZw5wIIVcNHqSDHqSP@QFk}*DgDJ*?0LjS3l>styYeF!W31{2_?VXg+q3@k3O7_03W1=Bwwt@IH~$vPiR`@|-tE@2RrS#f{e_NleO5BSv!g%IE-L(g9WJgS!fh{= zD|dP^I^CsieE<=yAKYz>wU`&f&cz%sU&Mlh@#I56w54B)Jqk+hq@^RK#T(gxeVdrq zXE}@Q0Ly?v)rifhoDHRKHkA}}!RdeE(uKkLceM1MiH5!faU@vN`CVo3zYyi;&(CBo zRHDM>?JXGbD1BTrH<$em_|Elgdgs{W%F`MUA5JeWid$OZ0Udyn%EZOCpo8W1JW0|I z9v{KwKTab8tjkUxTKsTLW4sUYB5o?1)@%aq`^Z|0)XN@NhJX(ztKhA{nciNmN*^N} zVmtkR^^!)R_*kCwH*Y+e{@nom+E+v)miWT1IaVC@ zH~?)yvGzGQy5+T@dNbJEAFu_{X!AI1J8PC)zX~A()8+WpddpgTt&Eh~l9d4K)h(V# z0=9@;%A%e+N|Qee|F3qs-s_6;;-Ytl^_%nW`PBOe%NQvqIuZ^^{;kq>8ED{#Au1fc zLn@5OUW_MLjj9@#a3=);YAG`TP?->==sO2!%tQJRT{y^`!~;a=4|!(^Sko46k@cqW zoN6f*kmE{8{a)f9XRQynqkAk9>`|oBHbgF3)bRAoWvEqEKy-knA$|_t)aY`;$npA2 z_cXY_*yf9;k(hWwMj#HIY?Ex>7gDHBVEFJOweBdmVJ!7W44J?eAm!b`e}+YLCkXz` z)22c9x(%l&DIU5qADd~jhVhDF2Yh(hMAOL}P@RtX9;s>c^PA4p|ooAsYG6t5d zXf2rAl24SbK{q60a4bGwhP2;*$~V`?0%?vp`~5T&)aIb$w&7!3>Bfu@p12m9!xOAp z9r5AU#CJpD_>wHDX^|Z5Ngt~?2jNb`fBA6lD#XT(JFvE$s2jShx&s&fh5+=0qRYjG zxa;~0`oX#1xyAKC$lXZ#VY(^&n#08P86Y+M8GQnH8 zlqs)az-I5K1Q1j(G1I|;_*i;k!KJE~f3!wE%2ve&xe+JNdotwP;@nG*`#`pladah% zaXOwH#K_tF<|YoX%i{S2F# zj+8d#t3uG`SjLV2cVdyF!#Pohnou2v+^c0S6;#=V(iDRl3$h^&3o3VEx;I^N{2h35 zQ>`eFF{Dr!@efz(sU;kB5t9wjntPOJ->fAC5S=u@^Ttw~FpJ}0Y-9o~Yb0$jCcXx?D)*@-vvC_$K)CK+Nyl3ldjI}c%J}C@XZOwgfnhe!Yvmtm;dXjjW6r= zBNEGi1Vgf>b|@M{q(^i7j%-sL8@|XB9gNX4Iai7CI=8F8xHJ?;2kha{6F9PJ&dC-(Pg^eiuj`YQE1PHKOaO&WGt znUZT2Y$wPcNk2jb>5*>$oP|juzZ&V&{mv5>j3rzL&chjdyuIHvV30KwFpS8stF_>M z?n=C0Qg!UWh>cW0_eTnds{6l^tHEnDi*tmv`^RImm1uIy9N(Qq#z;j&-w6A2Il5V$8cbcBFyQ(>hiasfnrg->l7k;KW1;&5sb% z10r*oFaO{Q*WD-6_=YI|1*p&ftbL84Kt;vckKM5!DcgDRU|J)GEsRm*;3-IYhdSf* z-)KXjG}2*)!gMjX_@H}%*CkIYa=1QWSpQ>zaNF=5Rp{3gk;2r-k*5B89Quz$T!F)- zhZuc3XjpNlDfe7-0@kKg$0D2j;~^5@r*9)W#ehnv3@gSK{@A?n=YO+xuL&aPNGRKr zL!lj^pn9P6S9e9;huwnlK3$&%D-zE9V@j%}h$1TzY|aIi1jNt`u%T{*RToMF<`>F0 zTh&N}g_WLz4-&ad$iwr-09S<^?(F-5Eb15T1RG$cWx=iWK5U+3e?16KbK;xRA|w(0 zOYA+jNWP;hddJ0RCKXB)j|ehU`f@zYDwu7!{Rk}64~?$maM}H zBxo?8GH=`jC3NDItCTGT-p*jwbLK#4sUmTOQ6%LA=(k#v+5zRV`HV^FDv;- zUPkwsI2BAmQTm0k&KWj0ZrIhCSR*qE`JFr97rH+w-r~&coH%So%1Huf%w!t>QUG9G zR3ca(&#Ua%!}jTp_GDk3P@M@WN%T> z>BpRu>($avNL0G-!>kT*IF}jZ%wSb8H))Arr|xNb;YA~SAKEw`UWZNfnE1fO3^CI7 zU13;drHoP&WKo>u$426FV*GM^Epq%}U_tUdP)mS{uAT*om$lULMtZtK*w@LSG149D zE)VC{RYinT&*or1{&( z(5#yGSPJ|9l{04*NnVWOM0e}Ng!3MjYUy7*_;sYSx-p;MqrjA5b-Mf*7}k%+g#^w6 zj$#yoDaZ!dID3=Z!_n*XX2)VD66{u$xL6`eAdDV?AX_bq*ukXYt)U$g4GRj6Fe>L| zr@MY3WrWh?f_@0sl&(Gkg5Pi>MTgyt%to5EQTg!bx8t}i=wq7(HLw(^I!kn?GkETf zA49tJGF3ZVc`R5^>^ zW^VRoKq_?U(nP)Tqslo7d3#F5|n1yGb~WcF)X#4@Pl%JM007E{X@YdY1kvBN7-?HDF3gG}(I zR~6|0ihB#uPSXX?aLasu`-kcLcL5pi7t#J$P)fTQiTqTBUOgZ096os@5%U?<=YtFz z{Cn^TIbHP*mP!X$InjoPa@9iW2MOmX*esenS(er{*bKQ>5wVbnVRRY;0cv`n-y@8E z{5SKr6M?cY(*TR_a%UVulbPMN{`r!c=SN`hH|8Uw%hEgh$8-?*QKlPza&(sOJ#8tW z4L~uU+Q4H^hLiNh)yNvq+=HF-&U>jX)DnpNe*xwJ8UC`}fCdV{5rjMd@&H2YK{~q- z>JUM46pCX{vr&@AY^e0p>>MmCEG#U6wy?0U_!;w6^B*{I`bRT7Xl;ec0O)=k*@rPh zksU-W!bim6X6Dfn6F?eZ&mw{v!l3631B)Dnt65yl|ZbINDL3&8n z6H!;aCgnFGw-Fh~iDTXBwu-oz5mhJMCL-cZO1KKpVPMb!gf&d)8&oy2bA%O)szI$J zsFg55IZDq6%R>8AK~R4BLdfG$1tx$ggqQ$l1R+Kc;t^Uw15I>#L6W67~4$rctC=OzAsv0%aG%f#2200000NkvXXu0mjf D#<+-7 diff --git a/panoramix/static/lib/bootstrap-toggle.min.js b/panoramix/static/lib/bootstrap-toggle.min.js deleted file mode 100644 index 37113200bff5..000000000000 --- a/panoramix/static/lib/bootstrap-toggle.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/*! ======================================================================== - * Bootstrap Toggle: bootstrap-toggle.js v2.2.0 - * http://www.bootstraptoggle.com - * ======================================================================== - * Copyright 2014 Min Hur, The New York Times Company - * Licensed under MIT - * ======================================================================== */ -+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",c=a('

').append(c,d,e),g=a('
').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(b).addClass(this.options.style);this.$element.wrap(g),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:c,$toggleOff:d,$toggleGroup:f}),this.$toggle.append(f);var h=this.options.width||Math.max(c.outerWidth(),d.outerWidth())+e.outerWidth()/2,i=this.options.height||Math.max(c.outerHeight(),d.outerHeight());c.addClass("toggle-on"),d.addClass("toggle-off"),this.$toggle.css({width:h,height:i}),this.options.height&&(c.css("line-height",c.height()+"px"),d.css("line-height",d.height()+"px")),this.update(!0),this.trigger(!0)},c.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},c.prototype.on=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),void(a||this.trigger()))},c.prototype.off=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),void(a||this.trigger()))},c.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},c.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},c.prototype.update=function(a){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(a):this.off(a)},c.prototype.trigger=function(b){this.$element.off("change.bs.toggle"),b||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},c.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var d=a.fn.bootstrapToggle;a.fn.bootstrapToggle=b,a.fn.bootstrapToggle.Constructor=c,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=d,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(b){var c=a(this).find("input[type=checkbox]");c.bootstrapToggle("toggle"),b.preventDefault()})}(jQuery); -//# sourceMappingURL=bootstrap-toggle.min.js.map \ No newline at end of file diff --git a/panoramix/static/lib/d3-sankey.js b/panoramix/static/lib/d3-sankey.js deleted file mode 100644 index abe137b211bf..000000000000 --- a/panoramix/static/lib/d3-sankey.js +++ /dev/null @@ -1,294 +0,0 @@ -d3.sankey = function() { - var sankey = {}, - nodeWidth = 24, - nodePadding = 8, - size = [1, 1], - nodes = [], - links = []; - - sankey.nodeWidth = function(_) { - if (!arguments.length) return nodeWidth; - nodeWidth = +_; - return sankey; - }; - - sankey.nodePadding = function(_) { - if (!arguments.length) return nodePadding; - nodePadding = +_; - return sankey; - }; - - sankey.nodes = function(_) { - if (!arguments.length) return nodes; - nodes = _; - return sankey; - }; - - sankey.links = function(_) { - if (!arguments.length) return links; - links = _; - return sankey; - }; - - sankey.size = function(_) { - if (!arguments.length) return size; - size = _; - return sankey; - }; - - sankey.layout = function(iterations) { - computeNodeLinks(); - computeNodeValues(); - computeNodeBreadths(); - computeNodeDepths(iterations); - computeLinkDepths(); - return sankey; - }; - - sankey.relayout = function() { - computeLinkDepths(); - return sankey; - }; - - sankey.link = function() { - var curvature = .5; - - function link(d) { - var x0 = d.source.x + d.source.dx, - x1 = d.target.x, - xi = d3.interpolateNumber(x0, x1), - x2 = xi(curvature), - x3 = xi(1 - curvature), - y0 = d.source.y + d.sy + d.dy / 2, - y1 = d.target.y + d.ty + d.dy / 2; - return "M" + x0 + "," + y0 - + "C" + x2 + "," + y0 - + " " + x3 + "," + y1 - + " " + x1 + "," + y1; - } - - link.curvature = function(_) { - if (!arguments.length) return curvature; - curvature = +_; - return link; - }; - - return link; - }; - - // Populate the sourceLinks and targetLinks for each node. - // Also, if the source and target are not objects, assume they are indices. - function computeNodeLinks() { - nodes.forEach(function(node) { - node.sourceLinks = []; - node.targetLinks = []; - }); - links.forEach(function(link) { - var source = link.source, - target = link.target; - if (typeof source === "number") source = link.source = nodes[link.source]; - if (typeof target === "number") target = link.target = nodes[link.target]; - source.sourceLinks.push(link); - target.targetLinks.push(link); - }); - } - - // Compute the value (size) of each node by summing the associated links. - function computeNodeValues() { - nodes.forEach(function(node) { - node.value = Math.max( - d3.sum(node.sourceLinks, value), - d3.sum(node.targetLinks, value) - ); - }); - } - - // Iteratively assign the breadth (x-position) for each node. - // Nodes are assigned the maximum breadth of incoming neighbors plus one; - // nodes with no incoming links are assigned breadth zero, while - // nodes with no outgoing links are assigned the maximum breadth. - function computeNodeBreadths() { - var remainingNodes = nodes, - nextNodes, - x = 0; - - while (remainingNodes.length) { - nextNodes = []; - remainingNodes.forEach(function(node) { - node.x = x; - node.dx = nodeWidth; - node.sourceLinks.forEach(function(link) { - if (nextNodes.indexOf(link.target) < 0) { - nextNodes.push(link.target); - } - }); - }); - remainingNodes = nextNodes; - ++x; - } - - // - moveSinksRight(x); - scaleNodeBreadths((size[0] - nodeWidth) / (x - 1)); - } - - function moveSourcesRight() { - nodes.forEach(function(node) { - if (!node.targetLinks.length) { - node.x = d3.min(node.sourceLinks, function(d) { return d.target.x; }) - 1; - } - }); - } - - function moveSinksRight(x) { - nodes.forEach(function(node) { - if (!node.sourceLinks.length) { - node.x = x - 1; - } - }); - } - - function scaleNodeBreadths(kx) { - nodes.forEach(function(node) { - node.x *= kx; - }); - } - - function computeNodeDepths(iterations) { - var nodesByBreadth = d3.nest() - .key(function(d) { return d.x; }) - .sortKeys(d3.ascending) - .entries(nodes) - .map(function(d) { return d.values; }); - - // - initializeNodeDepth(); - resolveCollisions(); - for (var alpha = 1; iterations > 0; --iterations) { - relaxRightToLeft(alpha *= .99); - resolveCollisions(); - relaxLeftToRight(alpha); - resolveCollisions(); - } - - function initializeNodeDepth() { - var ky = d3.min(nodesByBreadth, function(nodes) { - return (size[1] - (nodes.length - 1) * nodePadding) / d3.sum(nodes, value); - }); - - nodesByBreadth.forEach(function(nodes) { - nodes.forEach(function(node, i) { - node.y = i; - node.dy = node.value * ky; - }); - }); - - links.forEach(function(link) { - link.dy = link.value * ky; - }); - } - - function relaxLeftToRight(alpha) { - nodesByBreadth.forEach(function(nodes, breadth) { - nodes.forEach(function(node) { - if (node.targetLinks.length) { - var y = d3.sum(node.targetLinks, weightedSource) / d3.sum(node.targetLinks, value); - node.y += (y - center(node)) * alpha; - } - }); - }); - - function weightedSource(link) { - return center(link.source) * link.value; - } - } - - function relaxRightToLeft(alpha) { - nodesByBreadth.slice().reverse().forEach(function(nodes) { - nodes.forEach(function(node) { - if (node.sourceLinks.length) { - var y = d3.sum(node.sourceLinks, weightedTarget) / d3.sum(node.sourceLinks, value); - node.y += (y - center(node)) * alpha; - } - }); - }); - - function weightedTarget(link) { - return center(link.target) * link.value; - } - } - - function resolveCollisions() { - nodesByBreadth.forEach(function(nodes) { - var node, - dy, - y0 = 0, - n = nodes.length, - i; - - // Push any overlapping nodes down. - nodes.sort(ascendingDepth); - for (i = 0; i < n; ++i) { - node = nodes[i]; - dy = y0 - node.y; - if (dy > 0) node.y += dy; - y0 = node.y + node.dy + nodePadding; - } - - // If the bottommost node goes outside the bounds, push it back up. - dy = y0 - nodePadding - size[1]; - if (dy > 0) { - y0 = node.y -= dy; - - // Push any overlapping nodes back up. - for (i = n - 2; i >= 0; --i) { - node = nodes[i]; - dy = node.y + node.dy + nodePadding - y0; - if (dy > 0) node.y -= dy; - y0 = node.y; - } - } - }); - } - - function ascendingDepth(a, b) { - return a.y - b.y; - } - } - - function computeLinkDepths() { - nodes.forEach(function(node) { - node.sourceLinks.sort(ascendingTargetDepth); - node.targetLinks.sort(ascendingSourceDepth); - }); - nodes.forEach(function(node) { - var sy = 0, ty = 0; - node.sourceLinks.forEach(function(link) { - link.sy = sy; - sy += link.dy; - }); - node.targetLinks.forEach(function(link) { - link.ty = ty; - ty += link.dy; - }); - }); - - function ascendingSourceDepth(a, b) { - return a.source.y - b.source.y; - } - - function ascendingTargetDepth(a, b) { - return a.target.y - b.target.y; - } - } - - function center(node) { - return node.y + node.dy / 2; - } - - function value(link) { - return link.value; - } - - return sankey; -}; diff --git a/panoramix/static/lib/d3.layout.cloud.js b/panoramix/static/lib/d3.layout.cloud.js deleted file mode 100644 index 2a5956caf2b4..000000000000 --- a/panoramix/static/lib/d3.layout.cloud.js +++ /dev/null @@ -1,387 +0,0 @@ -// Word cloud layout by Jason Davies, http://www.jasondavies.com/word-cloud/ -// Algorithm due to Jonathan Feinberg, http://static.mrfeinberg.com/bv_ch03.pdf -(function() { - -if (typeof define === "function" && define.amd) define(["d3"], cloud); -else cloud(this.d3); - -function cloud(d3) { - d3.layout.cloud = function cloud() { - var size = [256, 256], - text = cloudText, - font = cloudFont, - fontSize = cloudFontSize, - fontStyle = cloudFontNormal, - fontWeight = cloudFontNormal, - rotate = cloudRotate, - padding = cloudPadding, - spiral = archimedeanSpiral, - words = [], - timeInterval = Infinity, - event = d3.dispatch("word", "end"), - timer = null, - random = Math.random, - cloud = {}; - - cloud.start = function() { - var board = zeroArray((size[0] >> 5) * size[1]), - bounds = null, - n = words.length, - i = -1, - tags = [], - data = words.map(function(d, i) { - d.text = text.call(this, d, i); - d.font = font.call(this, d, i); - d.style = fontStyle.call(this, d, i); - d.weight = fontWeight.call(this, d, i); - d.rotate = rotate.call(this, d, i); - d.size = ~~fontSize.call(this, d, i); - d.padding = padding.call(this, d, i); - return d; - }).sort(function(a, b) { return b.size - a.size; }); - - if (timer) clearInterval(timer); - timer = setInterval(step, 0); - step(); - - return cloud; - - function step() { - var start = Date.now(); - while (Date.now() - start < timeInterval && ++i < n && timer) { - var d = data[i]; - d.x = (size[0] * (random() + .5)) >> 1; - d.y = (size[1] * (random() + .5)) >> 1; - cloudSprite(d, data, i); - if (d.hasText && place(board, d, bounds)) { - tags.push(d); - event.word(d); - if (bounds) cloudBounds(bounds, d); - else bounds = [{x: d.x + d.x0, y: d.y + d.y0}, {x: d.x + d.x1, y: d.y + d.y1}]; - // Temporary hack - d.x -= size[0] >> 1; - d.y -= size[1] >> 1; - } - } - if (i >= n) { - cloud.stop(); - event.end(tags, bounds); - } - } - } - - cloud.stop = function() { - if (timer) { - clearInterval(timer); - timer = null; - } - return cloud; - }; - - function place(board, tag, bounds) { - var perimeter = [{x: 0, y: 0}, {x: size[0], y: size[1]}], - startX = tag.x, - startY = tag.y, - maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]), - s = spiral(size), - dt = random() < .5 ? 1 : -1, - t = -dt, - dxdy, - dx, - dy; - - while (dxdy = s(t += dt)) { - dx = ~~dxdy[0]; - dy = ~~dxdy[1]; - - if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break; - - tag.x = startX + dx; - tag.y = startY + dy; - - if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || - tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue; - // TODO only check for collisions within current bounds. - if (!bounds || !cloudCollide(tag, board, size[0])) { - if (!bounds || collideRects(tag, bounds)) { - var sprite = tag.sprite, - w = tag.width >> 5, - sw = size[0] >> 5, - lx = tag.x - (w << 4), - sx = lx & 0x7f, - msx = 32 - sx, - h = tag.y1 - tag.y0, - x = (tag.y + tag.y0) * sw + (lx >> 5), - last; - for (var j = 0; j < h; j++) { - last = 0; - for (var i = 0; i <= w; i++) { - board[x + i] |= (last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0); - } - x += sw; - } - delete tag.sprite; - return true; - } - } - } - return false; - } - - cloud.timeInterval = function(_) { - return arguments.length ? (timeInterval = _ == null ? Infinity : _, cloud) : timeInterval; - }; - - cloud.words = function(_) { - return arguments.length ? (words = _, cloud) : words; - }; - - cloud.size = function(_) { - return arguments.length ? (size = [+_[0], +_[1]], cloud) : size; - }; - - cloud.font = function(_) { - return arguments.length ? (font = d3.functor(_), cloud) : font; - }; - - cloud.fontStyle = function(_) { - return arguments.length ? (fontStyle = d3.functor(_), cloud) : fontStyle; - }; - - cloud.fontWeight = function(_) { - return arguments.length ? (fontWeight = d3.functor(_), cloud) : fontWeight; - }; - - cloud.rotate = function(_) { - return arguments.length ? (rotate = d3.functor(_), cloud) : rotate; - }; - - cloud.text = function(_) { - return arguments.length ? (text = d3.functor(_), cloud) : text; - }; - - cloud.spiral = function(_) { - return arguments.length ? (spiral = spirals[_] || _, cloud) : spiral; - }; - - cloud.fontSize = function(_) { - return arguments.length ? (fontSize = d3.functor(_), cloud) : fontSize; - }; - - cloud.padding = function(_) { - return arguments.length ? (padding = d3.functor(_), cloud) : padding; - }; - - cloud.random = function(_) { - return arguments.length ? (random = _, cloud) : random; - }; - - return d3.rebind(cloud, event, "on"); - }; - - function cloudText(d) { - return d.text; - } - - function cloudFont() { - return "serif"; - } - - function cloudFontNormal() { - return "normal"; - } - - function cloudFontSize(d) { - return Math.sqrt(d.value); - } - - function cloudRotate() { - return (~~(Math.random() * 6) - 3) * 30; - } - - function cloudPadding() { - return 1; - } - - // Fetches a monochrome sprite bitmap for the specified text. - // Load in batches for speed. - function cloudSprite(d, data, di) { - if (d.sprite) return; - c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio); - var x = 0, - y = 0, - maxh = 0, - n = data.length; - --di; - while (++di < n) { - d = data[di]; - c.save(); - c.font = d.style + " " + d.weight + " " + ~~((d.size + 1) / ratio) + "px " + d.font; - var w = c.measureText(d.text + "m").width * ratio, - h = d.size << 1; - if (d.rotate) { - var sr = Math.sin(d.rotate * cloudRadians), - cr = Math.cos(d.rotate * cloudRadians), - wcr = w * cr, - wsr = w * sr, - hcr = h * cr, - hsr = h * sr; - w = (Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f) >> 5 << 5; - h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr)); - } else { - w = (w + 0x1f) >> 5 << 5; - } - if (h > maxh) maxh = h; - if (x + w >= (cw << 5)) { - x = 0; - y += maxh; - maxh = 0; - } - if (y + h >= ch) break; - c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio); - if (d.rotate) c.rotate(d.rotate * cloudRadians); - c.fillText(d.text, 0, 0); - if (d.padding) c.lineWidth = 2 * d.padding, c.strokeText(d.text, 0, 0); - c.restore(); - d.width = w; - d.height = h; - d.xoff = x; - d.yoff = y; - d.x1 = w >> 1; - d.y1 = h >> 1; - d.x0 = -d.x1; - d.y0 = -d.y1; - d.hasText = true; - x += w; - } - var pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, - sprite = []; - while (--di >= 0) { - d = data[di]; - if (!d.hasText) continue; - var w = d.width, - w32 = w >> 5, - h = d.y1 - d.y0; - // Zero the buffer - for (var i = 0; i < h * w32; i++) sprite[i] = 0; - x = d.xoff; - if (x == null) return; - y = d.yoff; - var seen = 0, - seenRow = -1; - for (var j = 0; j < h; j++) { - for (var i = 0; i < w; i++) { - var k = w32 * j + (i >> 5), - m = pixels[((y + j) * (cw << 5) + (x + i)) << 2] ? 1 << (31 - (i % 32)) : 0; - sprite[k] |= m; - seen |= m; - } - if (seen) seenRow = j; - else { - d.y0++; - h--; - j--; - y++; - } - } - d.y1 = d.y0 + seenRow; - d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32); - } - } - - // Use mask-based collision detection. - function cloudCollide(tag, board, sw) { - sw >>= 5; - var sprite = tag.sprite, - w = tag.width >> 5, - lx = tag.x - (w << 4), - sx = lx & 0x7f, - msx = 32 - sx, - h = tag.y1 - tag.y0, - x = (tag.y + tag.y0) * sw + (lx >> 5), - last; - for (var j = 0; j < h; j++) { - last = 0; - for (var i = 0; i <= w; i++) { - if (((last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0)) - & board[x + i]) return true; - } - x += sw; - } - return false; - } - - function cloudBounds(bounds, d) { - var b0 = bounds[0], - b1 = bounds[1]; - if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0; - if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0; - if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1; - if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1; - } - - function collideRects(a, b) { - return a.x + a.x1 > b[0].x && a.x + a.x0 < b[1].x && a.y + a.y1 > b[0].y && a.y + a.y0 < b[1].y; - } - - function archimedeanSpiral(size) { - var e = size[0] / size[1]; - return function(t) { - return [e * (t *= .1) * Math.cos(t), t * Math.sin(t)]; - }; - } - - function rectangularSpiral(size) { - var dy = 4, - dx = dy * size[0] / size[1], - x = 0, - y = 0; - return function(t) { - var sign = t < 0 ? -1 : 1; - // See triangular numbers: T_n = n * (n + 1) / 2. - switch ((Math.sqrt(1 + 4 * sign * t) - sign) & 3) { - case 0: x += dx; break; - case 1: y += dy; break; - case 2: x -= dx; break; - default: y -= dy; break; - } - return [x, y]; - }; - } - - // TODO reuse arrays? - function zeroArray(n) { - var a = [], - i = -1; - while (++i < n) a[i] = 0; - return a; - } - - var cloudRadians = Math.PI / 180, - cw = 1 << 11 >> 5, - ch = 1 << 11, - canvas, - ratio = 1; - - if (typeof document !== "undefined") { - canvas = document.createElement("canvas"); - canvas.width = 1; - canvas.height = 1; - ratio = Math.sqrt(canvas.getContext("2d").getImageData(0, 0, 1, 1).data.length >> 2); - canvas.width = (cw << 5) / ratio; - canvas.height = ch / ratio; - } else { - // Attempt to use node-canvas. - canvas = new Canvas(cw << 5, ch); - } - - var c = canvas.getContext("2d"), - spirals = { - archimedean: archimedeanSpiral, - rectangular: rectangularSpiral - }; - c.fillStyle = c.strokeStyle = "red"; - c.textAlign = "center"; -} - -})(); diff --git a/panoramix/static/lib/d3.min.js b/panoramix/static/lib/d3.min.js deleted file mode 100644 index 5571fb8904f3..000000000000 --- a/panoramix/static/lib/d3.min.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function r(n){return null===n?0/0:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function c(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function l(){this._=Object.create(null)}function s(n){return(n+="")===pa||n[0]===va?va+n:n}function f(n){return(n+="")[0]===va?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=da.length;r>e;++e){var u=da[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function Z(n){return ya(n,Sa),n}function V(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var l=ka.get(n);return l&&(n=l,c=B),a?t?u:r:t?b:i}function $(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Aa,u="click"+r,i=ta.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ea&&(Ea="onselectstart"in e?!1:x(e.style,"userSelect")),Ea){var o=n(e).style,a=o[Ea];o[Ea]="none"}return function(n){if(i.on(r,null),Ea&&(o[Ea]=a),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Na){var i=t(n);if(i.scrollX||i.scrollY){r=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Na=!(o.f||o.e),r.remove()}}return Na?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ta.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nt(n){return n>1?0:-1>n?qa:Math.acos(n)}function tt(n){return n>1?Ra:-1>n?-Ra:Math.asin(n)}function et(n){return((n=Math.exp(n))-1/n)/2}function rt(n){return((n=Math.exp(n))+1/n)/2}function ut(n){return((n=Math.exp(2*n))-1)/(n+1)}function it(n){return(n=Math.sin(n/2))*n}function ot(){}function at(n,t,e){return this instanceof at?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof at?new at(n.h,n.s,n.l):bt(""+n,_t,at):new at(n,t,e)}function ct(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new mt(u(n+120),u(n),u(n-120))}function lt(n,t,e){return this instanceof lt?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof lt?new lt(n.h,n.c,n.l):n instanceof ft?gt(n.l,n.a,n.b):gt((n=wt((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new lt(n,t,e)}function st(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new ft(e,Math.cos(n*=Da)*t,Math.sin(n)*t)}function ft(n,t,e){return this instanceof ft?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof ft?new ft(n.l,n.a,n.b):n instanceof lt?st(n.h,n.c,n.l):wt((n=mt(n)).r,n.g,n.b):new ft(n,t,e)}function ht(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=pt(u)*Xa,r=pt(r)*$a,i=pt(i)*Ba,new mt(dt(3.2404542*u-1.5371385*r-.4985314*i),dt(-.969266*u+1.8760108*r+.041556*i),dt(.0556434*u-.2040259*r+1.0572252*i))}function gt(n,t,e){return n>0?new lt(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n):new lt(0/0,0/0,n)}function pt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function dt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mt(n,t,e){return this instanceof mt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mt?new mt(n.r,n.g,n.b):bt(""+n,mt,ct):new mt(n,t,e)}function yt(n){return new mt(n>>16,n>>8&255,255&n)}function Mt(n){return yt(n)+""}function xt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bt(n,t,e){n=n.toLowerCase();var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=Ga.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function _t(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new at(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=vt((.4124564*n+.3575761*t+.1804375*e)/Xa),u=vt((.2126729*n+.7151522*t+.072175*e)/$a),i=vt((.0193339*n+.119192*t+.9503041*e)/Ba);return ft(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Nt(t,e,n,r)}}function Nt(n,t,e,r){function u(){var n,t=c.status;if(!t&&zt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return void o.error.call(i,r)}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(Ct(r))}function Ct(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function zt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qt(){var n=Lt(),t=Tt()-n;t>24?(isFinite(t)&&(clearTimeout(tc),tc=setTimeout(qt,t)),nc=0):(nc=1,rc(qt))}function Lt(){var n=Date.now();for(ec=Ka;ec;)n>=ec.t&&(ec.f=ec.c(n-ec.t)),ec=ec.n;return n}function Tt(){for(var n,t=Ka,e=1/0;t;)t.f?t=n?n.n=t.n:Ka=t.n:(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=ic.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=oc.get(g)||Ut;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new cc(e-1)),1),e}function i(n,e){return t(n=new cc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{cc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{cc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ht(n);return c.floor=c,c.round=Ht(r),c.ceil=Ht(u),c.offset=Ht(i),c.range=a,n}function Ht(n){return function(t,e){try{cc=jt;var r=new jt;return r._=t,n(r,e)._}finally{cc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++aa;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in sc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{cc=jt;var t=new cc;return t._=n,r(t)}finally{cc=Date}}var r=t(n);return e.parse=function(n){try{cc=jt;var t=r.parse(n);return t&&t._}finally{cc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var M=ta.map(),x=Yt(v),b=Zt(v),_=Yt(d),w=Zt(d),S=Yt(m),k=Zt(m),E=Yt(y),A=Zt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return It(n.getDate(),t,2)},e:function(n,t){return It(n.getDate(),t,2)},H:function(n,t){return It(n.getHours(),t,2)},I:function(n,t){return It(n.getHours()%12||12,t,2)},j:function(n,t){return It(1+ac.dayOfYear(n),t,3)},L:function(n,t){return It(n.getMilliseconds(),t,3)},m:function(n,t){return It(n.getMonth()+1,t,2)},M:function(n,t){return It(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return It(n.getSeconds(),t,2)},U:function(n,t){return It(ac.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return It(ac.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return It(n.getFullYear()%100,t,2)},Y:function(n,t){return It(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:s,S:re,U:Xt,w:Vt,W:$t,x:c,X:l,y:Wt,Y:Bt,Z:Jt,"%":oe};return t}function It(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Yt(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Zt(n){for(var t=new l,e=-1,r=n.length;++e68?1900:2e3)}function Kt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=ga(t)/60|0,u=ga(t)%60;return e+It(r,"0",2)+It(u,"0",2)}function oe(n,t,e){hc.lastIndex=0;var r=hc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);yc.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;Mc.point=function(o,a){Mc.point=n,r=(t=o)*Da,u=Math.cos(a=(e=a)*Da/2+qa/4),i=Math.sin(a)},Mc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Me(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function xe(n){return[Math.atan2(n[1],n[0]),tt(n[2])]}function be(n,t){return ga(n[0]-t[0])a;++a)u.point((e=n[a])[0],e[1]);return void u.lineEnd()}var c=new qe(e,n,null,!0),l=new qe(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new qe(r,n,null,!1),l=new qe(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),ze(i),ze(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ze(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Te))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Fe(m,p);g.length?(b||(i.polygonStart(),b=!0),Ce(g,De,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Re(),x=t(M),b=!1;return y}}function Te(n){return n.length>1}function Re(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function De(n,t){return((n=n.x)[0]<0?n[1]-Ra-Ca:Ra-n[1])-((t=t.x)[0]<0?t[1]-Ra-Ca:Ra-t[1])}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?qa:-qa,c=ga(i-e);ga(c-qa)0?Ra:-Ra),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=qa&&(ga(e-u)Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*Ra,r.point(-qa,u),r.point(0,u),r.point(qa,u),r.point(qa,0),r.point(qa,-u),r.point(0,-u),r.point(-qa,-u),r.point(-qa,0),r.point(-qa,u);else if(ga(n[0]-t[0])>Ca){var i=n[0]a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+qa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+qa/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>qa,k=p*M;if(yc.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*La:b,S^h>=e^m>=e){var E=de(pe(f),pe(n));Me(E);var A=de(u,E);Me(A);var N=(S^b>=0?-1:1)*tt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ca>i||Ca>i&&0>yc)^1&o}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?qa:-qa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(be(e,g)||be(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&be(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),M=m*m-y*(ve(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=ye(d,(-m-x)/y);if(me(b,p),b=xe(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=ga(A-qa)A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(ga(b[0]-w)qa^(w<=b[0]&&b[0]<=S)){var z=ye(d,(-m+x)/y);return me(z,p),[b,xe(z)]}}}function u(t,e){var r=o?n:qa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=ga(i)>Ca,c=gr(n,6*Da);return Le(t,e,c,o?[0,-n]:[-qa,n-qa])}function Oe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ie(n,t,e,r){function u(r,u){return ga(r[0]-n)0?0:3:ga(r[0]-e)0?2:1:ga(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Tc,Math.min(Tc,n)),t=Math.max(-Tc,Math.min(Tc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=Re(),N=Oe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Ce(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ye(n){var t=0,e=qa/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*qa/180,e=n[1]*qa/180):[t/qa*180,e/qa*180]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,tt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){Dc+=u*n-r*t,r=n,u=t}var t,e,r,u;Hc.point=function(i,o){Hc.point=n,t=r=i,e=u=o},Hc.lineEnd=function(){n(t,e)}}function Xe(n,t){Pc>n&&(Pc=n),n>jc&&(jc=n),Uc>t&&(Uc=t),t>Fc&&(Fc=t)}function $e(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function We(n,t){_c+=n,wc+=t,++Sc}function Je(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);kc+=o*(t+n)/2,Ec+=o*(e+r)/2,Ac+=o,We(t=n,e=r)}var t,e;Ic.point=function(r,u){Ic.point=n,We(t=r,e=u)}}function Ge(){Ic.point=We}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);kc+=o*(r+n)/2,Ec+=o*(u+t)/2,Ac+=o,o=u*n-r*t,Nc+=o*(r+n),Cc+=o*(u+t),zc+=3*o,We(r=n,u=t)}var t,e,r,u;Ic.point=function(i,o){Ic.point=n,We(t=r=i,e=u=o)},Ic.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,La)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c -},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=ga(ga(w)-1)i||ga((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Da),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Pa,e*Pa])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*Da,n[1]*Da),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Pa,n[1]*Pa]}function r(){a=Ae(o=lr(m,M,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Lc,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=or(b(o,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Lc):He((w=+n)*Da),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Ie(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Da,d=n[1]%360*Da,r()):[v*Pa,d*Pa]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Da,M=n[1]%360*Da,x=n.length>2?n[2]%360*Da:0,r()):[m*Pa,M*Pa,x*Pa]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*Da,e*Da)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>qa?n-La:-qa>n?n+La:n,t]}function lr(n,t,e){return n?t||e?Ae(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function sr(n){return function(t,e){return t+=n,[t>qa?t-La:-qa>t?t+La:t,e]}}function fr(n){var t=sr(n);return t.invert=sr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),tt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),tt(s*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*La)):(u=n+o*La,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=xe([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function pr(n,t){var e=pe(t);e[0]-=n,Me(e);var r=nt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function vr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function Mr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(it(r-t)+u*o*it(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Pa,Math.atan2(o,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function xr(){function n(n,u){var i=Math.sin(u*=Da),o=Math.cos(u),a=ga((n*=Da)-t),c=Math.cos(a);Yc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Zc.point=function(u,i){t=u*Da,e=Math.sin(i*=Da),r=Math.cos(i),Zc.point=n},Zc.lineEnd=function(){Zc.point=Zc.lineEnd=b}}function br(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function _r(n,t){function e(n,t){o>0?-Ra+Ca>t&&(t=-Ra+Ca):t>Ra-Ca&&(t=Ra-Ca);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(qa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ra]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ga(u)u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function zr(n,t){return n[0]-t[0]||n[1]-t[1]}function qr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Lr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Tr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=el.pop()||new Rr;return t.site=n,t}function Pr(n){Xr(n),Qc.remove(n),el.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&ga(e-c.circle.x)s;++s)l=a[s],c=a[s-1],Kr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Jr(c.site,l.site,null,u),Vr(c),Vr(l)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Qc._;a;)if(r=Fr(a,o)-i,r>Ca)a=a.L;else{if(u=i-Hr(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(Qc.insert(t,c),t||e){if(t===e)return Xr(t),e=Dr(t.site),Qc.insert(c,e),c.edge=e.edge=Jr(t.site,c.site),Vr(t),void Vr(e);if(!e)return void(c.edge=Jr(t.site,c.site));Xr(t),Xr(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Kr(e.edge,l,p,x),c.edge=Jr(l,n,null,x),e.edge=Jr(n,p,null,x),Vr(t),Vr(e)}}function Fr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Hr(n,t){var e=n.N;if(e)return Fr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Ir(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Kc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(ga(r-t)>Ca||ga(u-e)>Ca)&&(a.splice(o,0,new Qr(Gr(i.site,s,ga(r-f)Ca?{x:f,y:ga(t-f)Ca?{x:ga(e-p)Ca?{x:h,y:ga(t-h)Ca?{x:ga(e-g)=-za)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=rl.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=tl._;M;)if(m.yd||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.yg){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.xi||f>o||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function gu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+xt(Math.round(e+i*n))+xt(Math.round(r+o*n))+xt(Math.round(u+a*n))}}function pu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=mu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function vu(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function du(n,t){var e,r,u,i=il.lastIndex=ol.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=il.exec(n))&&(r=ol.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:vu(e,r)})),i=ol.lastIndex;return ir;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function mu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function yu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(mu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Mu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function bu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function wu(n){return n*n*n}function Su(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function ku(n){return function(t){return Math.pow(t,n)}}function Eu(n){return 1-Math.cos(n*Ra)}function Au(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Cu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/La*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*La/t)}}function zu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Lu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return st(e+i*n,r+o*n,u+a*n)+""}}function Tu(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ht(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Pu(n){var t=[n.a,n.b],e=[n.c,n.d],r=ju(t),u=Uu(t,e),i=ju(Fu(e,t,-u))||0;t[0]*e[1]180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:vu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:vu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:vu(g[0],p[0])},{i:e-2,x:vu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i=0;)e.push(u[r])}function Qu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++oe;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function si(n){return n.reduce(fi,0)}function fi(n,t){return n+t[1]}function hi(n,t){return gi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function gi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function pi(n){return[ta.min(n),ta.max(n)]}function vi(n,t){return n.value-t.value}function di(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function mi(n,t){n._pack_next=t,t._pack_prev=n}function yi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Mi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(xi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],wi(r,u,i),t(i),di(r,i),r._pack_prev=i,di(i,u),u=r._pack_next,o=3;l>o;o++){wi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(yi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!yi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.ro;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(bi)}}function xi(n){n._pack_next=n._pack_prev=n}function bi(n){delete n._pack_next,delete n._pack_prev}function _i(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Ci(n,t,e){return n.a.parent===t.parent?n.a:e}function zi(n){return 1+ta.max(n,function(n){return n.y})}function qi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Li(n){var t=n.children;return t&&t.length?Li(t[0]):n}function Ti(n){var t,e=n.children;return e&&(t=e.length)?Ti(e[t-1]):n}function Ri(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Di(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Pi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ui(n){return n.rangeExtent?n.rangeExtent():Pi(n.range())}function ji(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Fi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Hi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ml}function Oi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Oi:ji,c=r?Iu:Ou;return o=u(n,t,c,e),a=u(t,n,c,mu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Du)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Xi(n,t)},i.tickFormat=function(t,e){return $i(n,t,e)},i.nice=function(t){return Zi(n,t),u()},i.copy=function(){return Ii(n,t,e,r)},u()}function Yi(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Zi(n,t){return Fi(n,Hi(Vi(n,t)[2]))}function Vi(n,t){null==t&&(t=10);var e=Pi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Xi(n,t){return ta.range.apply(ta,Vi(n,t))}function $i(n,t,e){var r=Vi(n,t);if(e){var u=ic.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(ga(r[0]),ga(r[1])));return u[7]||(u[7]="."+Bi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Wi(u[8],r)),e=u.join("")}else e=",."+Bi(r[2])+"f";return ta.format(e)}function Bi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Wi(n,t){var e=Bi(t[2]);return n in yl?Math.abs(e-Bi(Math.max(ga(t[0]),ga(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ji(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Fi(r.map(u),e?Math:xl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Pi(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++0;h--)o.push(i(l)*h);for(l=0;o[l]c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return Ml;arguments.length<2?t=Ml:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ji(n.copy(),t,e,r)},Yi(o,n)}function Gi(n,t,e){function r(t){return n(u(t))}var u=Ki(t),i=Ki(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Xi(e,n)},r.tickFormat=function(n,t){return $i(e,n,t)},r.nice=function(n){return r.domain(Zi(e,n))},r.exponent=function(o){return arguments.length?(u=Ki(t=o),i=Ki(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Gi(n.copy(),t,e)},Yi(r,n)}function Ki(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new l;for(var i,o=-1,a=r.length;++oe?[0/0,0/0]:[e>0?a[e-1]:n[0],et?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return to(n,t,e)},u()}function eo(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return eo(n,t)},e}function ro(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Xi(n,t)},t.tickFormat=function(t,e){return $i(n,t,e)},t.copy=function(){return ro(n)},t}function uo(){return 0}function io(n){return n.innerRadius}function oo(n){return n.outerRadius}function ao(n){return n.startAngle}function co(n){return n.endAngle}function lo(n){return n&&n.padAngle}function so(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function fo(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function ho(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f1&&u.push("H",r[0]),u.join("")}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?go(n):n[0]+_o(n,Lo(n))}function Ro(n){for(var t,e,r,u=-1,i=n.length;++ur)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,o.event&&o.event.start.call(n,n.__data__,t),o.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return p.c=l(e||1)?Ne:l,1},0,a)}function l(e){if(i.active!==r)return 1;for(var u=e/f,a=h(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=o.delay,p=ec,v=[];return p.t=g+a,u>=g?c(u-g):void(p.c=c)},0,a)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Vl,u);return i==Vl.length?[t.year,Vi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Vl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Pi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Yi(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.6"},ea=[].slice,ra=function(n){return ea.call(n)},ua=this.document;if(ua)try{ra(ua.documentElement.childNodes)[0].nodeType}catch(ia){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),ua)try{ua.createElement("DIV").style.setProperty("opacity",0,"")}catch(oa){var aa=this.Element.prototype,ca=aa.setAttribute,la=aa.setAttributeNS,sa=this.CSSStyleDeclaration.prototype,fa=sa.setProperty;aa.setAttribute=function(n,t){ca.call(this,n,t+"")},aa.setAttributeNS=function(n,t,e){la.call(this,n,t,e+"")},sa.setProperty=function(n,t,e){fa.call(this,n,t+"",e)}}ta.ascending=e,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ur&&(e=r)}else{for(;++u=r){e=r;break}for(;++ur&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ue&&(e=r)}else{for(;++u=r){e=r;break}for(;++ue&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var e,r=0,i=n.length,o=-1;if(1===arguments.length)for(;++o1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ha=i(e);ta.bisectLeft=ha.left,ta.bisect=ta.bisectRight=ha.right,ta.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,o),e=new Array(t);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var ga=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=a(ga(e)),o=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++o)>t;)u.push(r/i);else for(;(r=n+e*++o)=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var c,s,f,h,g=-1,p=o.length,v=i[a++],d=new l;++g=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},c(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(ma,"\\$&")};var ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ya={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ma=function(n,t){return t.querySelector(n)},xa=function(n,t){return t.querySelectorAll(n)},ba=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(ba=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(Ma=function(n,t){return Sizzle(n,t)[0]||null},xa=Sizzle,ba=Sizzle.matchesSelector),ta.selection=function(){return ta.select(ua.documentElement)};var _a=ta.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=N(n);for(var o=-1,a=this.length;++o=0&&(e=n.slice(0,t),n=n.slice(t+1)),wa.hasOwnProperty(e)?{space:wa[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_a.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++uu){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},_a.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},_a.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=j(n),t=N(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(F)},_a.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new l,y=new Array(o);for(r=-1;++rr;++r)p[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,a.push(p),c.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++ii;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return A(u)},_a.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return Y(this,function(){++n}),n};var Sa=[];ta.selection.enter=Z,ta.selection.enter.prototype=Sa,Sa.append=_a.append,Sa.empty=_a.empty,Sa.node=_a.node,Sa.call=_a.call,Sa.size=_a.size,Sa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var ka=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});ua&&ka.forEach(function(n){"on"+n in ua&&ka.remove(n)});var Ea,Aa=0;ta.mouse=function(n){return J(n,k())};var Na=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",o)}function e(n,t,e,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(e(f)).on(i+d,a).on(o+d,c),y=W(f),M=t(h,v);u?(l=u.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var r=E(n,"drag","dragstart","dragend"),u=null,i=e(b,ta.mouse,t,"mousemove","mouseup"),o=e(G,ta.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ta.rebind(n,r,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ra(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Ca=1e-6,za=Ca*Ca,qa=Math.PI,La=2*qa,Ta=La-Ca,Ra=qa/2,Da=qa/180,Pa=180/qa,Ua=Math.SQRT2,ja=2,Fa=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rt(v),o=i/(ja*h)*(e*ut(Ua*t+v)-et(v));return[r+o*l,u+o*s,i*e/rt(Ua*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Ua*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Fa*f)/(2*i*ja*h),p=(c*c-i*i-Fa*f)/(2*c*ja*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ua;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(q,f).on(Oa+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(N[0],Math.min(N[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,o)),i(d=e,r),t=ta.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function c(n){z++||n({type:"zoomstart"})}function l(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:"zoomend"}),d=null)}function f(){function n(){f=1,i(ta.mouse(u),g),l(a)}function r(){h.on(L,null).on(T,null),p(f&&ta.event.target===o),s(a)}var u=this,o=ta.event.target,a=D.of(u,arguments),f=0,h=ta.select(t(u)).on(L,n).on(T,r),g=e(ta.mouse(u)),p=W(u);Dl.call(u),c(a)}function h(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ta.event.target;ta.select(t).on(x,r).on(b,a),_.push(t);for(var e=ta.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var c=n(),l=Date.now();if(1===c.length){if(500>l-M){var s=c[0];o(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=l}else if(c.length>1){var s=c[0],f=c[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,o=ta.touches(p);Dl.call(p);for(var a=0,c=o.length;c>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),l(v)}function a(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(_).on(y,null),w.on(q,f).on(R,h),E(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=ta.select(p),E=W(p);t(),c(v),w.on(q,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Dl.call(this),v=e(d=m||ta.mouse(this)),c(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Ha())*k.k),i(d,v),l(n)}function p(){var n=ta.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ta.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},A=[960,500],N=Ia,C=250,z=0,q="mousedown.zoom",L="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=E(n,"zoomstart","zoom","zoomend");return Oa||(Oa="onwheel"in ua?(Ha=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Ha=function(){return ta.event.wheelDelta},"mousewheel"):(Ha=function(){return-ta.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Tl?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},c(n)}).tween("zoom:zoom",function(){var e=A[0],r=A[1],u=d?d[0]:e/2,i=d?d[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},l(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,c(n),l(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(N=null==t?Ia:[+t[0],+t[1]],n):N},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(A=t&&[+t[0],+t[1]],n):A},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ta.rebind(n,D,"on")};var Ha,Oa,Ia=[0,1/0];ta.color=ot,ot.prototype.toString=function(){return this.rgb()+""},ta.hsl=at;var Ya=at.prototype=new ot;Ya.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,this.l/n)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,n*this.l)},Ya.rgb=function(){return ct(this.h,this.s,this.l)},ta.hcl=lt;var Za=lt.prototype=new ot;Za.brighter=function(n){return new lt(this.h,this.c,Math.min(100,this.l+Va*(arguments.length?n:1)))},Za.darker=function(n){return new lt(this.h,this.c,Math.max(0,this.l-Va*(arguments.length?n:1)))},Za.rgb=function(){return st(this.h,this.c,this.l).rgb()},ta.lab=ft;var Va=18,Xa=.95047,$a=1,Ba=1.08883,Wa=ft.prototype=new ot;Wa.brighter=function(n){return new ft(Math.min(100,this.l+Va*(arguments.length?n:1)),this.a,this.b)},Wa.darker=function(n){return new ft(Math.max(0,this.l-Va*(arguments.length?n:1)),this.a,this.b)},Wa.rgb=function(){return ht(this.l,this.a,this.b)},ta.rgb=mt;var Ja=mt.prototype=new ot;Ja.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new mt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mt(u,u,u)},Ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mt(n*this.r,n*this.g,n*this.b)},Ja.hsl=function(){return _t(this.r,this.g,this.b)},Ja.toString=function(){return"#"+xt(this.r)+xt(this.g)+xt(this.b)};var Ga=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ga.forEach(function(n,t){Ga.set(n,yt(t))}),ta.functor=Et,ta.xhr=At(y),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Nt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var Ka,Qa,nc,tc,ec,rc=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Qa?Qa.n=i:Ka=i,Qa=i,nc||(tc=clearTimeout(tc),nc=1,rc(qt))},ta.timer.flush=function(){Lt(),Tt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var uc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),uc[8+e/3]};var ic=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,oc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),ac=ta.time={},cc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){lc.setUTCDate.apply(this._,arguments)},setDay:function(){lc.setUTCDay.apply(this._,arguments)},setFullYear:function(){lc.setUTCFullYear.apply(this._,arguments)},setHours:function(){lc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){lc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){lc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){lc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){lc.setUTCSeconds.apply(this._,arguments)},setTime:function(){lc.setTime.apply(this._,arguments)}};var lc=Date.prototype;ac.year=Ft(function(n){return n=ac.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ac.years=ac.year.range,ac.years.utc=ac.year.utc.range,ac.day=Ft(function(n){var t=new cc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ac.days=ac.day.range,ac.days.utc=ac.day.utc.range,ac.dayOfYear=function(n){var t=ac.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ac[n]=Ft(function(n){return(n=ac.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ac[n+"s"]=e.range,ac[n+"s"].utc=e.utc.range,ac[n+"OfYear"]=function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)}}),ac.week=ac.sunday,ac.weeks=ac.sunday.range,ac.weeks.utc=ac.sunday.utc.range,ac.weekOfYear=ac.sundayOfYear;var sc={"-":"",_:" ",0:"0"},fc=/^\s*\d+/,hc=/^%/;ta.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var gc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=gc.numberFormat,ta.geo={},ce.prototype={s:0,t:0,add:function(n){le(n,this.t,pc),le(pc.s,this.s,this),this.s?this.t+=pc.t:this.s=pc.t -},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var pc=new ce;ta.geo.stream=function(n,t){n&&vc.hasOwnProperty(n.type)?vc[n.type](n,t):se(n,t)};var vc={Feature:function(n,t){se(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*qa+n:n,Mc.lineStart=Mc.lineEnd=Mc.point=b}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*Da,e*Da]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);Me(o),o=xe(o);var c=t-p,l=c>0?1:-1,v=o[0]*Pa*l,d=ga(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Pa;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Pa;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ga(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Mc.point(n,e),t(n,e)}function i(){Mc.lineStart()}function o(){u(v,d),Mc.lineEnd(),ga(y)>Ca&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nyc?(s=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){xc=bc=_c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,qc);var t=Nc,e=Cc,r=zc,u=t*t+e*e+r*r;return za>u&&(t=kc,e=Ec,r=Ac,Ca>bc&&(t=_c,e=wc,r=Sc),u=t*t+e*e+r*r,za>u)?[0/0,0/0]:[Math.atan2(e,t)*Pa,tt(r/Math.sqrt(u))*Pa]};var xc,bc,_c,wc,Sc,kc,Ec,Ac,Nc,Cc,zc,qc={sphere:b,point:_e,lineStart:Se,lineEnd:ke,polygonStart:function(){qc.lineStart=Ee},polygonEnd:function(){qc.lineStart=Se}},Lc=Le(Ne,Pe,je,[-qa,-qa/2]),Tc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ie(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ye(Ze)}).raw=Ze,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ca,f+.12*l+Ca],[s-.214*l-Ca,f+.234*l-Ca]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ca,f+.166*l+Ca],[s-.115*l-Ca,f+.234*l-Ca]]).stream(c).point,n},n.scale(1070)};var Rc,Dc,Pc,Uc,jc,Fc,Hc={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Dc=0,Hc.lineStart=Ve},polygonEnd:function(){Hc.lineStart=Hc.lineEnd=Hc.point=b,Rc+=ga(Dc/2)}},Oc={point:Xe,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Ic={point:We,lineStart:Je,lineEnd:Ge,polygonStart:function(){Ic.lineStart=Ke},polygonEnd:function(){Ic.point=We,Ic.lineStart=Je,Ic.lineEnd=Ge}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Rc=0,ta.geo.stream(n,u(Hc)),Rc},n.centroid=function(n){return _c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,u(Ic)),zc?[Nc/zc,Cc/zc]:Ac?[kc/Ac,Ec/Ac]:Sc?[_c/Sc,wc/Sc]:[0/0,0/0]},n.bounds=function(n){return jc=Fc=-(Pc=Uc=1/0),ta.geo.stream(n,u(Oc)),[[Pc,Uc],[jc,Fc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new $e:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ur,ta.geo.projectionMutator=ir,(ta.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t}return n=lr(n[0]%360*Da,n[1]*Da,n.length>2?n[2]*Da:0),t.invert=function(t){return t=n.invert(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t},t},cr.invert=ar,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=lr(-n[0]*Da,-n[1]*Da,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*Da,u*Da),n):t},n.precision=function(r){return arguments.length?(e=gr(t*Da,(u=+r)*Da),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Da,u=n[1]*Da,i=t[1]*Da,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ga(n%d)>Ca}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ga(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=vr(a,o,90),f=dr(r,e,y),h=vr(l,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return Mr(n[0]*Da,n[1]*Da,t[0]*Da,t[1]*Da)},ta.geo.length=function(n){return Yc=0,ta.geo.stream(n,Zc),Yc};var Yc,Zc={sphere:b,point:b,lineStart:xr,lineEnd:b,polygonStart:b,polygonEnd:b},Vc=br(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ur(Vc)}).raw=Vc;var Xc=br(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(ta.geo.azimuthalEquidistant=function(){return ur(Xc)}).raw=Xc,(ta.geo.conicConformal=function(){return Ye(_r)}).raw=_r,(ta.geo.conicEquidistant=function(){return Ye(wr)}).raw=wr;var $c=br(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ur($c)}).raw=$c,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ra]},(ta.geo.mercator=function(){return kr(Sr)}).raw=Sr;var Bc=br(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ur(Bc)}).raw=Bc;var Wc=br(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ur(Wc)}).raw=Wc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ra]},(ta.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Er,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(zr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Cr(a),s=Cr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ar,u=Nr,i=r,o=u,a=ul;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Yr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=su()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=Et(a),x=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.xm&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=su();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},k.find=function(n){return hu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=cl.get(e)||al,r=ll.get(r)||y,Mu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Lu,ta.interpolateHsl=Tu,ta.interpolateLab=Ru,ta.interpolateRound=Du,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Pu(e?e.matrix:sl)})(n)},Pu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var sl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Hu,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=fl,h=hl,g=-30,p=gl,v=.1,d=.64,m=[],M=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,y,x,b=m.length,_=M.length;for(e=0;_>e;++e)a=M[e],f=a.source,h=a.target,y=h.x-f.x,x=h.y-f.y,(p=y*y+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,y*=p,x*=p,h.x-=y*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=y*(d=1-d),f.y+=x*d);if((d=r*v)&&(y=l[0]/2,x=l[1]/2,e=-1,d))for(;++e0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=M[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++at;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=M[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,M[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,M[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(y).on("dragstart.force",Xu).on("drag.force",t).on("dragend.force",$u)),arguments.length?void this.on("mouseover.force",Bu).on("mouseout.force",Wu).call(e):e},ta.rebind(a,c,"on")};var fl=20,hl=1,gl=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Qu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ei,e=ni,r=ti;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ku(t,function(n){n.children&&(n.value=0)}),Qu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++lf?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===pl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=pl,r=0,u=La,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var pl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=y,e=ai,r=ci,u=oi,i=ui,o=ii;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:vl.get(t)||ai,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:dl.get(t)||ci,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var vl=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(li),i=n.map(si),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ai}),dl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ci});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=pi,u=hi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return gi(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Qu(a,function(n){n.r=+s(n.value)}),Qu(a,Mi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Qu(a,function(n){n.r+=f}),Qu(a,Mi),Qu(a,function(n){n.r-=f})}return _i(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(vi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Gu(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Qu(h,e),h.parent.m=-h.z,Ku(h,r),l)Ku(f,i);else{var g=f,p=f,v=f;Ku(f,function(n){n.xp.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Ku(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ni(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ei(o),u=ki(u),o&&u;)c=ki(c),i=Ei(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ai(Ci(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ei(i)&&(i.t=o,i.m+=f-s),u&&!ki(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=Si,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Gu(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Qu(c,function(n){var t=n.children;t&&t.length?(n.x=qi(t),n.y=zi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Li(c),f=Ti(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Qu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=Si,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Gu(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++oe&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++ie.dx)&&(s=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var ml={floor:y,ceil:y};ta.scale.linear=function(){return Ii([0,1],[0,1],mu,!1)};var yl={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Ji(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var Ml=ta.format(".0e"),xl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Gi(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return Qi([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(bl)},ta.scale.category20=function(){return ta.scale.ordinal().range(_l)},ta.scale.category20b=function(){return ta.scale.ordinal().range(wl)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Sl)};var bl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Mt),_l=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Mt),wl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Mt),Sl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(Mt);ta.scale.quantile=function(){return no([],[])},ta.scale.quantize=function(){return to(0,1,[0,1])},ta.scale.threshold=function(){return eo([.5],[0,1])},ta.scale.identity=function(){return ro([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-Ra,f=a.apply(this,arguments)-Ra,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ta)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===kl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=tt(d/l*Math.sin(m))),n&&(E=tt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=qa?0:1;if(A&&so(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=qa?0:1;if(E&&so(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Lr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=fo(null==S?[_,w]:[S,k],[y,M],l,H,g),I=fo([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^so(O[1][0],O[1][1],I[1][0],I[1][1]),",",g," ",I[1],"A",H,",",H," 0 0,",v," ",I[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",I[0])}else N.push("M",y,",",M);if(null!=S){var Y=Math.min(p,(n-F)/(j-1)),Z=fo([y,M],[S,k],n,-Y,g),V=fo([_,w],null==x?[y,M]:[x,b],n,-Y,g);p===Y?N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^so(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",Y,",",Y," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=io,r=oo,u=uo,i=kl,o=ao,a=co,c=lo;return n.innerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.outerRadius=function(t){return arguments.length?(r=Et(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=Et(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==kl?kl:Et(t),n):i},n.startAngle=function(t){return arguments.length?(o=Et(t),n):o},n.endAngle=function(t){return arguments.length?(a=Et(t),n):a},n.padAngle=function(t){return arguments.length?(c=Et(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Ra;return[Math.cos(t)*n,Math.sin(t)*n]},n};var kl="auto";ta.svg.line=function(){return ho(y)};var El=ta.map({linear:go,"linear-closed":po,step:vo,"step-before":mo,"step-after":yo,basis:So,"basis-open":ko,"basis-closed":Eo,bundle:Ao,cardinal:bo,"cardinal-open":Mo,"cardinal-closed":xo,monotone:To});El.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Al=[0,2/3,1/3,0],Nl=[0,1/3,2/3,0],Cl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=ho(Ro);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mo.reverse=yo,yo.reverse=mo,ta.svg.area=function(){return Do(y)},ta.svg.area.radial=function(){var n=Do(Ro);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-Ra,s=l.call(n,u,r)-Ra;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>qa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Po,c=ao,l=co;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(l=Et(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Uo;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Uo,e=n.projection;return n.projection=function(n){return arguments.length?e(jo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(zl.get(t.call(this,n,r))||Oo)(e.call(this,n,r))}var t=Ho,e=Fo;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var zl=ta.map({circle:Oo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ll)),e=t*Ll;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=zl.keys();var ql=Math.sqrt(3),Ll=Math.tan(30*Da);_a.transition=function(n){for(var t,e,r=Tl||++Ul,u=Xo(n),i=[],o=Rl||{time:Date.now(),ease:Su,delay:0,duration:250},a=-1,c=this.length;++ai;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Yo(u,this.namespace,this.id)},Pl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Pl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:mu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Pl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Pl.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=mu(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Zo(this,"style."+n,e,i)},Pl.styleTween=function(n,e,r){function u(u,i){var o=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Pl.text=function(n){return Zo(this,"text",n,Vo)},Pl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Pl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),Y(this,function(r){r[e][t].ease=n}))},Pl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Pl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Pl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Rl,i=Tl;try{Tl=e,Y(this,function(t,u,i){Rl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Rl=u,Tl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Pl.transition=function(){for(var n,t,e,r,u=this.id,i=++Ul,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Yo(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):y:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=ta.transition(p.exit()).style("opacity",Ca).remove(),m=ta.transition(p.order()).style("opacity",1),M=Math.max(u,0)+o,x=Ui(f),b=l.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ta.transition(b));v.append("line"),v.append("text");var w,S,k,E,A=v.select("line"),N=m.select("line"),C=p.select("text").text(g),z=v.select("text"),q=m.select("text"),L="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,w="x",k="y",S="x2",E="y2",C.attr("dy",0>L?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+L*i+"V0H"+x[1]+"V"+L*i)):(n=Wo,w="y",k="x",S="y2",E="x2",C.attr("dy",".32em").style("text-anchor",0>L?"end":"start"),_.attr("d","M"+L*i+","+x[0]+"H0V"+x[1]+"H"+L*i)),A.attr(E,L*u),z.attr(k,L*M),N.attr(S,0).attr(E,L*u),q.attr(w,0).attr(k,L*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=jl,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Fl?t+"":jl,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var jl="bottom",Fl={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(t){t.each(function(){var t=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,y);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Hl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var c,f=ta.transition(t),h=ta.transition(o);l&&(c=Ui(l),h.attr("x",c[0]).attr("width",c[1]-c[0]),r(f)),s&&(c=Ui(s),h.attr("y",c[0]).attr("height",c[1]-c[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==ta.event.keyCode&&(C||(M=null,q[0]-=f[1],q[1]-=h[1],C=2),S())}function v(){32==ta.event.keyCode&&2==C&&(q[0]+=f[1],q[1]+=h[1],C=0,S())}function d(){var n=ta.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ta.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),q[0]=f[+(n[0]s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?a=null:o=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),L.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ta.select(ta.event.target),w=c.of(b,arguments),k=ta.select(b),E=_.datum(),A=!/^(n|s)$/.test(E)&&l,N=!/^(e|w)$/.test(E)&&s,C=_.classed("extent"),z=W(b),q=ta.mouse(b),L=ta.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(ta.event.changedTouches?L.on("touchmove.brush",d).on("touchend.brush",y):L.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)q[0]=f[0]-q[0],q[1]=h[0]-q[1];else if(E){var T=+/w$/.test(E),R=+/^n/.test(E);x=[f[1-T]-q[0],h[1-R]-q[1]],q[0]=f[T],q[1]=h[R]}else ta.event.altKey&&(M=q.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,c=E(n,"brushstart","brush","brushend"),l=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=Ol[0];return n.event=function(n){n.each(function(){var n=c.of(this,arguments),t={x:f,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Tl?ta.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=yu(f,t.x),r=yu(h,t.y);return o=a=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(l=t,v=Ol[!l<<1|!s],n):l},n.y=function(t){return arguments.length?(s=t,v=Ol[!l<<1|!s],n):s},n.clamp=function(t){return arguments.length?(l&&s?(g=!!t[0],p=!!t[1]):l?g=!!t:s&&(p=!!t),n):l&&s?[g,p]:l?g:s?p:null},n.extent=function(t){var e,r,u,i,c;return arguments.length?(l&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),o=[e,r],l.invert&&(e=l(e),r=l(r)),e>r&&(c=e,e=r,r=c),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],l&&(u=u[1],i=i[1]),a=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(c=u,u=i,i=c),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(l&&(o?(e=o[0],r=o[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),e>r&&(c=e,e=r,r=c))),s&&(a?(u=a[0],i=a[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(c=u,u=i,i=c))),l&&s?[[e,u],[r,i]]:l?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!l&&f[0]==f[1]||!!s&&h[0]==h[1]},ta.rebind(n,c,"on")};var Hl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ol=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Il=ac.format=gc.timeFormat,Yl=Il.utc,Zl=Yl("%Y-%m-%dT%H:%M:%S.%LZ");Il.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:Zl,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=Zl.toString,ac.second=Ft(function(n){return new cc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ac.seconds=ac.second.range,ac.seconds.utc=ac.second.utc.range,ac.minute=Ft(function(n){return new cc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ac.minutes=ac.minute.range,ac.minutes.utc=ac.minute.utc.range,ac.hour=Ft(function(n){var t=n.getTimezoneOffset()/60;return new cc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ac.hours=ac.hour.range,ac.hours.utc=ac.hour.utc.range,ac.month=Ft(function(n){return n=ac.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ac.months=ac.month.range,ac.months.utc=ac.month.utc.range;var Vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Xl=[[ac.second,1],[ac.second,5],[ac.second,15],[ac.second,30],[ac.minute,1],[ac.minute,5],[ac.minute,15],[ac.minute,30],[ac.hour,1],[ac.hour,3],[ac.hour,6],[ac.hour,12],[ac.day,1],[ac.day,2],[ac.week,1],[ac.month,1],[ac.month,3],[ac.year,1]],$l=Il.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Bl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:y,ceil:y};Xl.year=ac.year,ac.scale=function(){return Go(ta.scale.linear(),Xl,$l)};var Wl=Xl.map(function(n){return[n[0].utc,n[1]]}),Jl=Yl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);Wl.year=ac.year.utc,ac.scale.utc=function(){return Go(ta.scale.linear(),Wl,Jl)},ta.text=At(function(n){return n.responseText}),ta.json=function(n,t){return Nt(n,"application/json",Qo,t)},ta.html=function(n,t){return Nt(n,"text/html",na,t)},ta.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}(); \ No newline at end of file diff --git a/panoramix/static/lib/d3.tip.js b/panoramix/static/lib/d3.tip.js deleted file mode 100644 index 13e146b689cf..000000000000 --- a/panoramix/static/lib/d3.tip.js +++ /dev/null @@ -1,324 +0,0 @@ -// d3.tip -// Copyright (c) 2013 Justin Palmer -// -// Tooltips for d3.js SVG visualizations - -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module with d3 as a dependency. - define(['d3'], factory) - } else if (typeof module === 'object' && module.exports) { - // CommonJS - module.exports = function(d3) { - d3.tip = factory(d3) - return d3.tip - } - } else { - // Browser global. - root.d3.tip = factory(root.d3) - } -}(this, function (d3) { - - // Public - contructs a new tooltip - // - // Returns a tip - return function() { - var direction = d3_tip_direction, - offset = d3_tip_offset, - html = d3_tip_html, - node = initNode(), - svg = null, - point = null, - target = null - - function tip(vis) { - svg = getSVGNode(vis) - point = svg.createSVGPoint() - document.body.appendChild(node) - } - - // Public - show the tooltip on the screen - // - // Returns a tip - tip.show = function() { - var args = Array.prototype.slice.call(arguments) - if(args[args.length - 1] instanceof SVGElement) target = args.pop() - - var content = html.apply(this, args), - poffset = offset.apply(this, args), - dir = direction.apply(this, args), - nodel = getNodeEl(), - i = directions.length, - coords, - scrollTop = document.documentElement.scrollTop || document.body.scrollTop, - scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft - - nodel.html(content) - .style({ opacity: 1, 'pointer-events': 'all' }) - - while(i--) nodel.classed(directions[i], false) - coords = direction_callbacks.get(dir).apply(this) - nodel.classed(dir, true).style({ - top: (coords.top + poffset[0]) + scrollTop + 'px', - left: (coords.left + poffset[1]) + scrollLeft + 'px' - }) - - return tip - } - - // Public - hide the tooltip - // - // Returns a tip - tip.hide = function() { - var nodel = getNodeEl() - nodel.style({ opacity: 0, 'pointer-events': 'none' }) - return tip - } - - // Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value. - // - // n - name of the attribute - // v - value of the attribute - // - // Returns tip or attribute value - tip.attr = function(n, v) { - if (arguments.length < 2 && typeof n === 'string') { - return getNodeEl().attr(n) - } else { - var args = Array.prototype.slice.call(arguments) - d3.selection.prototype.attr.apply(getNodeEl(), args) - } - - return tip - } - - // Public: Proxy style calls to the d3 tip container. Sets or gets a style value. - // - // n - name of the property - // v - value of the property - // - // Returns tip or style property value - tip.style = function(n, v) { - if (arguments.length < 2 && typeof n === 'string') { - return getNodeEl().style(n) - } else { - var args = Array.prototype.slice.call(arguments) - d3.selection.prototype.style.apply(getNodeEl(), args) - } - - return tip - } - - // Public: Set or get the direction of the tooltip - // - // v - One of n(north), s(south), e(east), or w(west), nw(northwest), - // sw(southwest), ne(northeast) or se(southeast) - // - // Returns tip or direction - tip.direction = function(v) { - if (!arguments.length) return direction - direction = v == null ? v : d3.functor(v) - - return tip - } - - // Public: Sets or gets the offset of the tip - // - // v - Array of [x, y] offset - // - // Returns offset or - tip.offset = function(v) { - if (!arguments.length) return offset - offset = v == null ? v : d3.functor(v) - - return tip - } - - // Public: sets or gets the html value of the tooltip - // - // v - String value of the tip - // - // Returns html value or tip - tip.html = function(v) { - if (!arguments.length) return html - html = v == null ? v : d3.functor(v) - - return tip - } - - // Public: destroys the tooltip and removes it from the DOM - // - // Returns a tip - tip.destroy = function() { - if(node) { - getNodeEl().remove(); - node = null; - } - return tip; - } - - function d3_tip_direction() { return 'n' } - function d3_tip_offset() { return [0, 0] } - function d3_tip_html() { return ' ' } - - var direction_callbacks = d3.map({ - n: direction_n, - s: direction_s, - e: direction_e, - w: direction_w, - nw: direction_nw, - ne: direction_ne, - sw: direction_sw, - se: direction_se - }), - - directions = direction_callbacks.keys() - - function direction_n() { - var bbox = getScreenBBox() - return { - top: bbox.n.y - node.offsetHeight, - left: bbox.n.x - node.offsetWidth / 2 - } - } - - function direction_s() { - var bbox = getScreenBBox() - return { - top: bbox.s.y, - left: bbox.s.x - node.offsetWidth / 2 - } - } - - function direction_e() { - var bbox = getScreenBBox() - return { - top: bbox.e.y - node.offsetHeight / 2, - left: bbox.e.x - } - } - - function direction_w() { - var bbox = getScreenBBox() - return { - top: bbox.w.y - node.offsetHeight / 2, - left: bbox.w.x - node.offsetWidth - } - } - - function direction_nw() { - var bbox = getScreenBBox() - return { - top: bbox.nw.y - node.offsetHeight, - left: bbox.nw.x - node.offsetWidth - } - } - - function direction_ne() { - var bbox = getScreenBBox() - return { - top: bbox.ne.y - node.offsetHeight, - left: bbox.ne.x - } - } - - function direction_sw() { - var bbox = getScreenBBox() - return { - top: bbox.sw.y, - left: bbox.sw.x - node.offsetWidth - } - } - - function direction_se() { - var bbox = getScreenBBox() - return { - top: bbox.se.y, - left: bbox.e.x - } - } - - function initNode() { - var node = d3.select(document.createElement('div')) - node.style({ - position: 'absolute', - top: 0, - opacity: 0, - 'pointer-events': 'none', - 'box-sizing': 'border-box' - }) - - return node.node() - } - - function getSVGNode(el) { - el = el.node() - if(el.tagName.toLowerCase() === 'svg') - return el - - return el.ownerSVGElement - } - - function getNodeEl() { - if(node === null) { - node = initNode(); - // re-add node to DOM - document.body.appendChild(node); - }; - return d3.select(node); - } - - // Private - gets the screen coordinates of a shape - // - // Given a shape on the screen, will return an SVGPoint for the directions - // n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest), - // sw(southwest). - // - // +-+-+ - // | | - // + + - // | | - // +-+-+ - // - // Returns an Object {n, s, e, w, nw, sw, ne, se} - function getScreenBBox() { - var targetel = target || d3.event.target; - - while ('undefined' === typeof targetel.getScreenCTM && 'undefined' === targetel.parentNode) { - targetel = targetel.parentNode; - } - - var bbox = {}, - matrix = targetel.getScreenCTM(), - tbbox = targetel.getBBox(), - width = tbbox.width, - height = tbbox.height, - x = tbbox.x, - y = tbbox.y - - point.x = x - point.y = y - bbox.nw = point.matrixTransform(matrix) - point.x += width - bbox.ne = point.matrixTransform(matrix) - point.y += height - bbox.se = point.matrixTransform(matrix) - point.x -= width - bbox.sw = point.matrixTransform(matrix) - point.y -= height / 2 - bbox.w = point.matrixTransform(matrix) - point.x += width - bbox.e = point.matrixTransform(matrix) - point.x -= width / 2 - point.y -= height / 2 - bbox.n = point.matrixTransform(matrix) - point.y += height - bbox.s = point.matrixTransform(matrix) - - return bbox - } - - return tip - }; - -})); diff --git a/panoramix/static/lib/jquery-ui/external/jquery/jquery.js b/panoramix/static/lib/jquery-ui/external/jquery/jquery.js deleted file mode 100755 index c5c648255c15..000000000000 --- a/panoramix/static/lib/jquery-ui/external/jquery/jquery.js +++ /dev/null @@ -1,9789 +0,0 @@ -/*! - * jQuery JavaScript Library v1.10.2 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03T13:48Z - */ -(function( window, undefined ) { - -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -//"use strict"; -var - // The deferred used on DOM ready - readyList, - - // A central reference to the root jQuery(document) - rootjQuery, - - // Support: IE<10 - // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` - core_strundefined = typeof undefined, - - // Use the correct document accordingly with window argument (sandbox) - location = window.location, - document = window.document, - docElem = document.documentElement, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // [[Class]] -> type pairs - class2type = {}, - - // List of deleted data cache ids, so we can reuse them - core_deletedIds = [], - - core_version = "1.10.2", - - // Save a reference to some core methods - core_concat = core_deletedIds.concat, - core_push = core_deletedIds.push, - core_slice = core_deletedIds.slice, - core_indexOf = core_deletedIds.indexOf, - core_toString = class2type.toString, - core_hasOwn = class2type.hasOwnProperty, - core_trim = core_version.trim, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Used for matching numbers - core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - - // Used for splitting on whitespace - core_rnotwhite = /\S+/g, - - // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, - rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // The ready event handler - completed = function( event ) { - - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { - detach(); - jQuery.ready(); - } - }, - // Clean-up method for dom ready events - detach = function() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - - } else { - document.detachEvent( "onreadystatechange", completed ); - window.detachEvent( "onload", completed ); - } - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: core_version, - - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return core_slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; - }, - - slice: function() { - return this.pushStack( core_slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var src, copyIsArray, copy, name, options, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), - - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - if ( obj == null ) { - return String( obj ); - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[ core_toString.call(obj) ] || "object" : - typeof obj; - }, - - isPlainObject: function( obj ) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !core_hasOwn.call(obj, "constructor") && - !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if ( jQuery.support.ownLast ) { - for ( key in obj ) { - return core_hasOwn.call( obj, key ); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for ( key in obj ) {} - - return key === undefined || core_hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // keepScripts (optional): If true, will include scripts passed in the html string - parseHTML: function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[1] ) ]; - } - - parsed = jQuery.buildFragment( [ data ], context, scripts ); - if ( scripts ) { - jQuery( scripts ).remove(); - } - return jQuery.merge( [], parsed.childNodes ); - }, - - parseJSON: function( data ) { - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - if ( data === null ) { - return data; - } - - if ( typeof data === "string" ) { - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - if ( data ) { - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - } - } - } - - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && jQuery.trim( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Use native String.trim function wherever possible - trim: core_trim && !core_trim.call("\uFEFF\xA0") ? - function( text ) { - return text == null ? - "" : - core_trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - core_push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( core_indexOf ) { - return core_indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; - - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return core_concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var args, proxy, tmp; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = core_slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: function() { - return ( new Date() ).getTime(); - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations. - // Note: this method belongs to the css module but it's needed here for the support module. - // If support gets modularized, this method should be moved back to the css module. - swap: function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - } -}); - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", completed ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", completed ); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch(e) {} - - if ( top && top.doScroll ) { - (function doScrollCheck() { - if ( !jQuery.isReady ) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch(e) { - return setTimeout( doScrollCheck, 50 ); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } - } - } - return readyList.promise( obj ); -}; - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || type !== "function" && - ( length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj ); -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); -/*! - * Sizzle CSS Selector Engine v1.10.2 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03 - */ -(function( window, undefined ) { - -var i, - support, - cachedruns, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - hasDuplicate = false, - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rsibling = new RegExp( whitespace + "*[+~]" ), - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - // BMP codepoint - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && context.parentNode || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key += " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Detect xml - * @param {Element|Object} elem An element or a document - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent.attachEvent && parent !== parent.top ) { - parent.attachEvent( "onbeforeunload", function() { - setDocument(); - }); - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = assert(function( div ) { - div.innerHTML = "
"; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - - // Support: Opera 10-12/IE8 - // ^= $= *= and empty values - // Should not select anything - // Support: Windows 8 Native Apps - // The type attribute is restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "t", "" ); - - if ( div.querySelectorAll("[t^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = docElem.compareDocumentPosition ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); - - if ( compare ) { - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } - - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - } : - function( a, b ) { - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Parentless nodes are either documents or disconnected - } else if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [elem] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val === undefined ? - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null : - val; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - for ( ; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[5] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] && match[4] !== undefined ) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( tokens = [] ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var data, cache, outerCache, - dirkey = dirruns + " " + doneName; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { - if ( (data = cache[1]) === true || data === cachedruns ) { - return data === true; - } - } else { - cache = outerCache[ dir ] = [ dirkey ]; - cache[1] = matcher( elem, context, xml ) || cachedruns; - if ( cache[1] === true ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - // A counter to specify which element is currently being matched - var matcherCachedRuns = 0, - bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, expandContext ) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); - - if ( outermost ) { - outermostContext = context !== document && context; - cachedruns = matcherCachedRuns; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - for ( ; (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - cachedruns = ++matcherCachedRuns; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - match = tokenize( selector ); - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - } - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && context.parentNode || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) - ); - return results; -} - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - elem[ name ] === true ? name.toLowerCase() : null; - } - }); -} - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})( window ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var action = tuple[ 0 ], - fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; - if( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); -jQuery.support = (function( support ) { - - var all, a, input, select, fragment, opt, eventName, isSupported, i, - div = document.createElement("div"); - - // Setup - div.setAttribute( "className", "t" ); - div.innerHTML = "
a"; - - // Finish early in limited (non-browser) environments - all = div.getElementsByTagName("*") || []; - a = div.getElementsByTagName("a")[ 0 ]; - if ( !a || !a.style || !all.length ) { - return support; - } - - // First batch of tests - select = document.createElement("select"); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName("input")[ 0 ]; - - a.style.cssText = "top:1px;float:left;opacity:.5"; - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - support.getSetAttribute = div.className !== "t"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName("tbody").length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName("link").length; - - // Get the style information from getAttribute - // (IE uses .cssText instead) - support.style = /top/.test( a.getAttribute("style") ); - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - support.hrefNormalized = a.getAttribute("href") === "/a"; - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - support.opacity = /^0.5/.test( a.style.opacity ); - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - support.cssFloat = !!a.style.cssFloat; - - // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) - support.checkOn = !!input.value; - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - support.optSelected = opt.selected; - - // Tests for enctype support on a form (#6743) - support.enctype = !!document.createElement("form").enctype; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>"; - - // Will be defined later - support.inlineBlockNeedsLayout = false; - support.shrinkWrapBlocks = false; - support.pixelPosition = false; - support.deleteExpando = true; - support.noCloneEvent = true; - support.reliableMarginRight = true; - support.boxSizingReliable = true; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Support: IE<9 - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - // Check if we can trust getAttribute("value") - input = document.createElement("input"); - input.setAttribute( "value", "" ); - support.input = input.getAttribute( "value" ) === ""; - - // Check if an input maintains its value after becoming a radio - input.value = "t"; - input.setAttribute( "type", "radio" ); - support.radioValue = input.value === "t"; - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "checked", "t" ); - input.setAttribute( "name", "t" ); - - fragment = document.createDocumentFragment(); - fragment.appendChild( input ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - if ( div.attachEvent ) { - div.attachEvent( "onclick", function() { - support.noCloneEvent = false; - }); - - div.cloneNode( true ).click(); - } - - // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - for ( i in { submit: true, change: true, focusin: true }) { - div.setAttribute( eventName = "on" + i, "t" ); - - support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; - } - - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - // Support: IE<9 - // Iteration over object's inherited properties before its own. - for ( i in jQuery( support ) ) { - break; - } - support.ownLast = i !== "0"; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, marginDiv, tds, - divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; - - body.appendChild( container ).appendChild( div ); - - // Support: IE8 - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - div.innerHTML = "
t
"; - tds = div.getElementsByTagName("td"); - tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Support: IE8 - // Check if empty table cells still have offsetWidth/Height - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Check box-sizing and margin behavior. - div.innerHTML = ""; - div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; - - // Workaround failing boxSizing test due to offsetWidth returning wrong value - // with some non-1 values of body zoom, ticket #13543 - jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { - support.boxSizing = div.offsetWidth === 4; - }); - - // Use window.getComputedStyle because jsdom on node.js will break without it. - if ( window.getComputedStyle ) { - support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; - support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = div.appendChild( document.createElement("div") ); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - - support.reliableMarginRight = - !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); - } - - if ( typeof div.style.zoom !== core_strundefined ) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.innerHTML = ""; - div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); - - // Support: IE6 - // Check if elements with layout shrink-wrap their children - div.style.display = "block"; - div.innerHTML = "
"; - div.firstChild.style.width = "5px"; - support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); - - if ( support.inlineBlockNeedsLayout ) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild( container ); - - // Null elements to avoid leaks in IE - container = div = tds = marginDiv = null; - }); - - // Null elements to avoid leaks in IE - all = select = fragment = opt = a = input = null; - - return support; -})({}); - -var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - -function internalData( elem, name, data, pvt /* Internal Use Only */ ){ - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( typeof name === "string" ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; -} - -function internalRemoveData( elem, name, pvt ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat( jQuery.map( name, jQuery.camelCase ) ); - } - - i = name.length; - while ( i-- ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } - - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if ( jQuery.support.deleteExpando || cache != cache.window ) { - /* jshint eqeqeq: true */ - delete cache[ id ]; - - // When all else fails, null - } else { - cache[ id ] = null; - } -} - -jQuery.extend({ - cache: {}, - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "applet": true, - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data ) { - return internalData( elem, name, data ); - }, - - removeData: function( elem, name ) { - return internalRemoveData( elem, name ); - }, - - // For internal use only. - _data: function( elem, name, data ) { - return internalData( elem, name, data, true ); - }, - - _removeData: function( elem, name ) { - return internalRemoveData( elem, name, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - // Do not set data on non-element because it will not be cleared (#8335). - if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { - return false; - } - - var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; - - // nodes accept data unless otherwise specified; rejection can be conditional - return !noData || noData !== true && elem.getAttribute("classid") === noData; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var attrs, name, - data = null, - i = 0, - elem = this[0]; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - attrs = elem.attributes; - for ( ; i < attrs.length; i++ ) { - name = attrs[i].name; - - if ( name.indexOf("data-") === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - - dataAttr( elem, name, data[ name ] ); - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - return arguments.length > 1 ? - - // Sets one value - this.each(function() { - jQuery.data( this, key, value ); - }) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray(data) ) { - queue = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - jQuery._removeData( elem, type + "queue" ); - jQuery._removeData( elem, key ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var nodeHook, boolHook, - rclass = /[\t\r\n\f]/g, - rreturn = /\r/g, - rfocusable = /^(?:input|select|textarea|button|object)$/i, - rclickable = /^(?:a|area)$/i, - ruseDefault = /^(?:checked|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - getSetInput = jQuery.support.input; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call( this, j, this.className ) ); - }); - } - - if ( proceed ) { - // The disjunction here is for better compressibility (see removeClass) - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - " " - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - elem.className = jQuery.trim( cur ); - - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = arguments.length === 0 || typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call( this, j, this.className ) ); - }); - } - if ( proceed ) { - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - "" - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - elem.className = value ? jQuery.trim( cur ) : ""; - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - classNames = value.match( core_rnotwhite ) || []; - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( type === core_strundefined || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var ret, hooks, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // Use proper attribute retrieval(#6932, #12072) - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - elem.text; - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // oldIE doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - // Don't return options that are disabled or in a disabled optgroup - ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && - ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { - optionSet = true; - } - } - - // force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attr: function( elem, name, value ) { - var hooks, ret, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === core_strundefined ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - - } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, value + "" ); - return value; - } - - } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( core_rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( (name = attrNames[i++]) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - // Set corresponding property to false - if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - elem[ propName ] = false; - // Support: IE<9 - // Also clear defaultChecked/defaultSelected (if appropriate) - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = - elem[ propName ] = false; - } - - // See #9699 for explanation of this approach (setting first, then removal) - } else { - jQuery.attr( elem, name, "" ); - } - - elem.removeAttribute( getSetAttribute ? name : propName ); - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? - ret : - ( elem[ name ] = value ); - - } else { - return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? - ret : - elem[ name ]; - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - return tabindex ? - parseInt( tabindex, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - -1; - } - } - } -}); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - // IE<8 needs the *property* name - elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); - - // Use defaultChecked and defaultSelected for oldIE - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; - } - - return name; - } -}; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; - - jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? - function( elem, name, isXML ) { - var fn = jQuery.expr.attrHandle[ name ], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - (jQuery.expr.attrHandle[ name ] = undefined) != - getter( elem, name, isXML ) ? - - name.toLowerCase() : - null; - jQuery.expr.attrHandle[ name ] = fn; - return ret; - } : - function( elem, name, isXML ) { - return isXML ? - undefined : - elem[ jQuery.camelCase( "default-" + name ) ] ? - name.toLowerCase() : - null; - }; -}); - -// fix oldIE attroperties -if ( !getSetInput || !getSetAttribute ) { - jQuery.attrHooks.value = { - set: function( elem, value, name ) { - if ( jQuery.nodeName( elem, "input" ) ) { - // Does not return so that setAttribute is also used - elem.defaultValue = value; - } else { - // Use nodeHook if defined (#1954); otherwise setAttribute is fine - return nodeHook && nodeHook.set( elem, value, name ); - } - } - }; -} - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = { - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - elem.setAttributeNode( - (ret = elem.ownerDocument.createAttribute( name )) - ); - } - - ret.value = value += ""; - - // Break association with cloned elements by also using setAttribute (#9646) - return name === "value" || value === elem.getAttribute( name ) ? - value : - undefined; - } - }; - jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = - // Some attributes are constructed with empty-string values when not defined - function( elem, name, isXML ) { - var ret; - return isXML ? - undefined : - (ret = elem.getAttributeNode( name )) && ret.value !== "" ? - ret.value : - null; - }; - jQuery.valHooks.button = { - get: function( elem, name ) { - var ret = elem.getAttributeNode( name ); - return ret && ret.specified ? - ret.value : - undefined; - }, - set: nodeHook.set - }; - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - set: function( elem, value, name ) { - nodeHook.set( elem, value === "" ? false : value, name ); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }; - }); -} - - -// Some attributes require a special call on IE -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !jQuery.support.hrefNormalized ) { - // href/src property should get the full normalized URL (#10299/#12915) - jQuery.each([ "href", "src" ], function( i, name ) { - jQuery.propHooks[ name ] = { - get: function( elem ) { - return elem.getAttribute( name, 4 ); - } - }; - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Note: IE uppercases css property names, but if we were to .toLowerCase() - // .cssText, that would destroy case senstitivity in URL's, like in "background" - return elem.style.cssText || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = value + "" ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }; -} - -jQuery.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -}); - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }; - if ( !jQuery.support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - // Support: Webkit - // "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - }; - } -}); -var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [ elem || document ], - type = core_hasOwn.call( event, "type" ) ? event.type : event, - namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[ type ](); - } catch ( e ) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, ret, handleObj, matched, j, - handlerQueue = [], - args = core_slice.call( arguments ), - handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var sel, handleObj, matches, i, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - /* jshint eqeqeq: false */ - for ( ; cur != this; cur = cur.parentNode || this ) { - /* jshint eqeqeq: true */ - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: IE<9 - // Fix target property (#1925) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - try { - this.focus(); - return false; - } catch ( e ) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Even when returnValue equals to undefined Firefox will still show alert - if ( event.result !== undefined ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - var name = "on" + type; - - if ( elem.detachEvent ) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if ( typeof elem[ name ] === core_strundefined ) { - elem[ name ] = null; - } - - elem.detachEvent( name, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - if ( !e ) { - return; - } - - // If preventDefault exists, run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - if ( !e ) { - return; - } - // If stopPropagation exists, run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !jQuery._data( form, "submitBubbles" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - jQuery._data( form, "submitBubbles", true ); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event, true ); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - jQuery._data( elem, "changeBubbles", true ); - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var type, origFn; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); -var isSimple = /^.[^:#\[\.,]*$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - - has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; - - return this.filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - ret = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - cur = ret.push( cur ); - break; - } - } - } - - return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( jQuery.unique(all) ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - ret = jQuery.unique( ret ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - } - - return this.pushStack( ret ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( isSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; - }); -} -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - option: [ 1, "" ], - legend: [ 1, "
", "
" ], - area: [ 1, "", "" ], - param: [ 1, "", "" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - col: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] - }, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement("div") ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -jQuery.fn.extend({ - text: function( value ) { - return jQuery.access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - // keepData is for internal use only--do not document - remove: function( selector, keepData ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - } - - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } - - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if ( elem.options && jQuery.nodeName( elem, "select" ) ) { - elem.options.length = 0; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return jQuery.access( this, function( value ) { - var elem = this[0] || {}, - i = 0, - l = this.length; - - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for (; i < l; i++ ) { - // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch(e) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map( this, function( elem ) { - return [ elem.nextSibling, elem.parentNode ]; - }), - i = 0; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - var next = args[ i++ ], - parent = args[ i++ ]; - - if ( parent ) { - // Don't use the snapshot next if it has moved (#13810) - if ( next && next.parentNode !== parent ) { - next = this.nextSibling; - } - jQuery( this ).remove(); - parent.insertBefore( elem, next ); - } - // Allow new content to include elements from the context set - }, true ); - - // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback, allowIntersection ) { - - // Flatten any nested arrays - args = core_concat.apply( [], args ); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[0] = value.call( this, index, self.html() ); - } - self.domManip( args, callback, allowIntersection ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[i], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Hope ajax is available... - jQuery._evalUrl( node.src ); - } else { - jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - } - } - - return this; - } -}); - -// Support: IE<8 -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - if ( match ) { - elem.type = match[1]; - } else { - elem.removeAttribute("type"); - } - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var elem, - i = 0; - for ( ; (elem = elems[i]) != null; i++ ) { - jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); - } -} - -function cloneCopyEvent( src, dest ) { - - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { - return; - } - - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; - - if ( events ) { - delete curData.handle; - curData.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); - } -} - -function fixCloneNodeIssues( src, dest ) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); - - // IE6-8 copies events bound via attachEvent when using cloneNode. - if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { - data = jQuery._data( dest ); - - for ( e in data.events ) { - jQuery.removeEvent( dest, e, data.handle ); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute( jQuery.expando ); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if ( nodeName === "script" && dest.text !== src.text ) { - disableScript( dest ).text = src.text; - restoreScript( dest ); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if ( nodeName === "object" ) { - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { - dest.innerHTML = src.innerHTML; - } - - } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - i = 0, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone(true); - jQuery( insert[i] )[ original ]( elems ); - - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - core_push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - -function getAll( context, tag ) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : - undefined; - - if ( !found ) { - for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { - if ( !tag || jQuery.nodeName( elem, tag ) ) { - found.push( elem ); - } else { - jQuery.merge( found, getAll( elem, tag ) ); - } - } - } - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], found ) : - found; -} - -// Used in buildFragment, fixes the defaultChecked property -function fixDefaultChecked( elem ) { - if ( manipulation_rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains( elem.ownerDocument, elem ); - - if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); - } - - if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - // Fix all IE cloning issues - for ( i = 0; (node = srcElements[i]) != null; ++i ) { - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[i] ) { - fixCloneNodeIssues( node, destElements[i] ); - } - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0; (node = srcElements[i]) != null; i++ ) { - cloneCopyEvent( node, destElements[i] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - destElements = srcElements = node = null; - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment( context ), - - nodes = [], - i = 0; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; - - // Descend through wrappers to the right content - j = wrap[0]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); - } - - // Remove IE's autoinserted from table fragments - if ( !jQuery.support.tbody ) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test( elem ) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
" && !rtbody.test( elem ) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while ( j-- ) { - if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { - elem.removeChild( tbody ); - } - } - } - - jQuery.merge( nodes, tmp.childNodes ); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while ( tmp.firstChild ) { - tmp.removeChild( tmp.firstChild ); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; - } - } - } - - // Fix #11356: Clear elements from fragment - if ( tmp ) { - safe.removeChild( tmp ); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !jQuery.support.appendChecked ) { - jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); - } - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( safe.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - tmp = null; - - return safe; - }, - - cleanData: function( elems, /* internal */ acceptData ) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = jQuery.support.deleteExpando, - special = jQuery.event.special; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( acceptData || jQuery.acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; - - if ( data ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( deleteExpando ) { - delete elem[ internalKey ]; - - } else if ( typeof elem.removeAttribute !== core_strundefined ) { - elem.removeAttribute( internalKey ); - - } else { - elem[ internalKey ] = null; - } - - core_deletedIds.push( id ); - } - } - } - } - }, - - _evalUrl: function( url ) { - return jQuery.ajax({ - url: url, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } -}); -jQuery.fn.extend({ - wrapAll: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapAll( html.call(this, i) ); - }); - } - - if ( this[0] ) { - // The elements to wrap the target around - var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); - - if ( this[0].parentNode ) { - wrap.insertBefore( this[0] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { - elem = elem.firstChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function(i) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - } -}); -var iframe, getStyles, curCSS, - ralpha = /alpha\([^)]*\)/i, - ropacity = /opacity\s*=\s*([^)]*)/, - rposition = /^(top|right|bottom|left)$/, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), - rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), - rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), - elemdisplay = { BODY: "block" }, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = [ "Top", "Right", "Bottom", "Left" ], - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( style, name ) { - - // shortcut for names that are not vendor prefixed - if ( name in style ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in style ) { - return name; - } - } - - return origName; -} - -function isHidden( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = jQuery._data( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); - } - } else { - - if ( !values[ index ] ) { - hidden = isHidden( elem ); - - if ( display && display !== "none" || !hidden ) { - jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); - } - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.fn.extend({ - css: function( name, value ) { - return jQuery.access( this, function( elem, name, value ) { - var len, styles, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each(function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - }); - } -}); - -jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "columnCount": true, - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if ( type === "string" && (ret = rrelNum.exec( value )) ) { - value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if ( value == null || type === "number" && isNaN( value ) ) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( type === "number" && !jQuery.cssNumber[ origName ] ) { - value += "px"; - } - - // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, - // but it would mean to define eight (for every problematic property) identical functions - if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - - // Wrapped to prevent IE from throwing errors when 'invalid' values are provided - // Fixes bug #5509 - try { - style[ name ] = value; - } catch(e) {} - } - - } else { - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var num, val, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; - } - return val; - } -}); - -// NOTE: we've included the "window" in window.getComputedStyle -// because jsdom on node.js will break without it. -if ( window.getComputedStyle ) { - getStyles = function( elem ) { - return window.getComputedStyle( elem, null ); - }; - - curCSS = function( elem, name, _computed ) { - var width, minWidth, maxWidth, - computed = _computed || getStyles( elem ), - - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, - style = elem.style; - - if ( computed ) { - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; - }; -} else if ( document.documentElement.currentStyle ) { - getStyles = function( elem ) { - return elem.currentStyle; - }; - - curCSS = function( elem, name, _computed ) { - var left, rs, rsLeft, - computed = _computed || getStyles( elem ), - ret = computed ? computed[ name ] : undefined, - style = elem.style; - - // Avoid setting ret to empty string here - // so we don't default to auto - if ( ret == null && style && style[ name ] ) { - ret = style[ name ]; - } - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - // but not position css attributes, as those are proportional to the parent element instead - // and we can't measure the parent instead because it might trigger a "stacking dolls" problem - if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { - - // Remember the original values - left = style.left; - rs = elem.runtimeStyle; - rsLeft = rs && rs.left; - - // Put in the new values to get a computed value out - if ( rsLeft ) { - rs.left = elem.currentStyle.left; - } - style.left = name === "fontSize" ? "1em" : ret; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - if ( rsLeft ) { - rs.left = rsLeft; - } - } - - return ret === "" ? "auto" : ret; - }; -} - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - // at this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -// Try to determine the default display value of an element -function css_defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - // Use the already-created iframe if possible - iframe = ( iframe || - jQuery("'); - console.log(slice); - iframe = slice.container.find('iframe'); - iframe.css('height', slice.height()); - iframe.attr('src', payload.form_data.url); - slice.done(); - }) - .fail(function(xhr) { - slice.error(xhr.responseText); - }); - }; - return { - render: refresh, - resize: refresh, - }; -}); diff --git a/panoramix/static/widgets/viz_markup.js b/panoramix/static/widgets/viz_markup.js deleted file mode 100644 index a9fe4ef8e652..000000000000 --- a/panoramix/static/widgets/viz_markup.js +++ /dev/null @@ -1,17 +0,0 @@ -px.registerViz('markup', function(slice) { - - function refresh() { - $('#code').attr('rows', '15') - $.getJSON(slice.jsonEndpoint(), function(payload) { - slice.container.html(payload.data.html); - slice.done(); - }) - .fail(function(xhr) { - slice.error(xhr.responseText); - }); - }; - return { - render: refresh, - resize: refresh, - }; -}); diff --git a/panoramix/static/widgets/viz_nvd3.css b/panoramix/static/widgets/viz_nvd3.css deleted file mode 100644 index 7d5d49788ad4..000000000000 --- a/panoramix/static/widgets/viz_nvd3.css +++ /dev/null @@ -1,3 +0,0 @@ -g.dashed path.nv-line { - stroke-dasharray: 3, 3; -} diff --git a/panoramix/static/widgets/viz_nvd3.js b/panoramix/static/widgets/viz_nvd3.js deleted file mode 100644 index 9c502ed74ead..000000000000 --- a/panoramix/static/widgets/viz_nvd3.js +++ /dev/null @@ -1,185 +0,0 @@ -function viz_nvd3(slice) { - var chart = undefined; - var data = {}; - - var refresh = function() { - $.getJSON(slice.jsonEndpoint(), function(payload) { - var fd = payload.form_data; - var viz_type = fd.viz_type; - var f = d3.format('.3s'); - var colorKey = 'key'; - nv.addGraph(function() { - if (viz_type === 'line') { - if (fd.show_brush) { - chart = nv.models.lineWithFocusChart(); - chart.lines2.xScale(d3.time.scale.utc()); - chart.x2Axis - .showMaxMin(fd.x_axis_showminmax) - .staggerLabels(true); - } else { - chart = nv.models.lineChart() - } - // To alter the tooltip header - // chart.interactiveLayer.tooltip.headerFormatter(function(){return '';}); - chart.xScale(d3.time.scale.utc()); - chart.interpolate(fd.line_interpolation); - chart.xAxis - .showMaxMin(fd.x_axis_showminmax) - .staggerLabels(true); - } else if (viz_type === 'bar') { - chart = nv.models.multiBarChart() - .showControls(true) - .groupSpacing(0.1); - chart.xAxis - .showMaxMin(false) - .staggerLabels(true); - chart.stacked(fd.bar_stacked); - - } else if (viz_type === 'dist_bar') { - chart = nv.models.multiBarChart() - .showControls(true) //Allow user to switch between 'Grouped' and 'Stacked' mode. - .reduceXTicks(false) - .rotateLabels(45) - .groupSpacing(0.1); //Distance between each group of bars. - chart.xAxis - .showMaxMin(false); - chart.stacked(fd.bar_stacked); - } else if (viz_type === 'pie') { - chart = nv.models.pieChart() - colorKey = 'x'; - chart.valueFormat(f); - if (fd.donut) { - chart.donut(true); - chart.donutLabelsOutside(true); - } - chart.labelsOutside(true); - chart.cornerRadius(true); - - } else if (viz_type === 'column') { - chart = nv.models.multiBarChart() - .reduceXTicks(false) - .rotateLabels(45) ; - - } else if (viz_type === 'compare') { - chart = nv.models.cumulativeLineChart(); - chart.xScale(d3.time.scale.utc()); - chart.xAxis - .showMaxMin(false) - .staggerLabels(true); - - } else if (viz_type === 'bubble') { - var row = function(col1, col2){ - return "" - } - chart = nv.models.scatterChart(); - chart.showDistX(true); - chart.showDistY(true); - chart.tooltip.contentGenerator(function (obj) { - p = obj.point; - var s = "
" + col1 + "" + col2 + "
" - s += ''; - s += row(fd.x, f(p.x)); - s += row(fd.y, f(p.y)); - s += row(fd.size, f(p.size)); - s += "
' + p[fd.entity] + ' (' + p.group + ')
"; - return s; - }); - chart.pointRange([5, fd.max_bubble_size * fd.max_bubble_size]); - - } else if (viz_type === 'area') { - chart = nv.models.stackedAreaChart(); - chart.style(fd.stacked_style); - chart.xScale(d3.time.scale.utc()); - chart.xAxis - .showMaxMin(false) - .staggerLabels(true); - } - if ("showLegend" in chart) { - if ('show_legend' in fd) - chart.showLegend(fd.show_legend); - } - - var height = slice.height(); - if(chart.hasOwnProperty("x2Axis")) { - height += 30; - } - chart.height(height); - slice.container.css('height', height + 'px'); - - if ((viz_type === "line" || viz_type === "area") && fd.rich_tooltip) { - chart.useInteractiveGuideline(true); - } - if (fd.y_axis_zero) { - chart.forceY([0, 1]); - } - else if (fd.y_log_scale) { - chart.yScale(d3.scale.log()); - } - if (fd.x_log_scale) { - chart.xScale(d3.scale.log()); - } - if (viz_type === 'bubble') { - chart.xAxis.tickFormat(d3.format('.3s')); - } - else if (fd.x_axis_format == 'smart_date') { - chart.xAxis.tickFormat(px.formatDate); - } - else if (fd.x_axis_format !== undefined) { - chart.xAxis.tickFormat(px.timeFormatFactory(fd.x_axis_format)); - } - if (chart.yAxis !== undefined) - chart.yAxis.tickFormat(d3.format('.3s')); - if (fd.contribution || fd.num_period_compare || viz_type == 'compare') { - chart.yAxis.tickFormat(d3.format('.3p')); - if (chart.y2Axis != undefined) { - chart.y2Axis.tickFormat(d3.format('.3p')); - } - } - else if (fd.y_axis_format) { - chart.yAxis.tickFormat(d3.format(fd.y_axis_format)); - - if (chart.y2Axis != undefined) { - chart.y2Axis.tickFormat(d3.format(fd.y_axis_format)); - } - } - - chart.color(function(d, i){ - return px.color.category21(d[colorKey]); - }); - d3.select(slice.selector).append("svg") - .datum(payload.data) - .transition().duration(500) - .attr('height', height) - .call(chart); - - return chart; - }); - slice.done(payload); - }) - .fail(function(xhr) { - slice.error(xhr.responseText); - }); - }; - var resize = function() { - chart.update(); - } - - return { - render: refresh, - resize: resize, - }; - -} - -[ - 'area', - 'bar', - 'bubble', - 'column', - 'compare', - 'dist_bar', - 'line', - 'pie', -].forEach(function(name) { - px.registerViz(name, viz_nvd3); -}); diff --git a/panoramix/static/widgets/viz_pivot_table.css b/panoramix/static/widgets/viz_pivot_table.css deleted file mode 100644 index 89f3cf799a40..000000000000 --- a/panoramix/static/widgets/viz_pivot_table.css +++ /dev/null @@ -1,3 +0,0 @@ -.gridster li.widget.pivot_table, div.widget.pivot_table{ - overflow: auto; !important -} diff --git a/panoramix/static/widgets/viz_pivot_table.js b/panoramix/static/widgets/viz_pivot_table.js deleted file mode 100644 index c1350fefcf50..000000000000 --- a/panoramix/static/widgets/viz_pivot_table.js +++ /dev/null @@ -1,25 +0,0 @@ -px.registerViz('pivot_table', function(slice) { - container = slice.container; - var form_data = slice.data.form_data; - - function refresh() { - $.getJSON(slice.jsonEndpoint(), function(json){ - container.html(json.data); - if (form_data.groupby.length == 1){ - var table = container.find('table').DataTable({ - paging: false, - searching: false, - }); - table.column('-1').order( 'desc' ).draw(); - } - slice.done(json); - }).fail(function(xhr){ - slice.error(xhr.responseText); - }); - } - return { - render: refresh, - resize: refresh, - }; - -}); diff --git a/panoramix/static/widgets/viz_sankey.js b/panoramix/static/widgets/viz_sankey.js deleted file mode 100644 index 2d028db19eb3..000000000000 --- a/panoramix/static/widgets/viz_sankey.js +++ /dev/null @@ -1,104 +0,0 @@ -function viz_sankey(slice) { - var div = d3.select(slice.selector); - - var render = function() { - var width = slice.width(); - var height = slice.height() - 25; - var margin = {top: 5, right: 5, bottom: 5, left: 5}; - width = width - margin.left - margin.right; - height = height - margin.top - margin.bottom; - - var formatNumber = d3.format(",.0f"), - format = function(d) { return formatNumber(d) + " TWh"; }, - color = d3.scale.category20(); - - var svg = div.append("svg") - .attr("width", width + margin.left + margin.right) - .attr("height", height + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); - var sankey = d3.sankey() - .nodeWidth(15) - .nodePadding(10) - .size([width, height]); - - var path = sankey.link(); - - d3.json(slice.jsonEndpoint(), function(error, json) { - if (error != null){ - slice.error(error.responseText); - return ''; - } - links = json.data; - var nodes = {}; - // Compute the distinct nodes from the links. - links.forEach(function(link) { - link.source = nodes[link.source] || - (nodes[link.source] = {name: link.source}); - link.target = nodes[link.target] || - (nodes[link.target] = {name: link.target}); - link.value = +link.value; - var target_name = link.target.name; - var source_name = link.source.name; - }); - nodes = d3.values(nodes); - - sankey - .nodes(nodes) - .links(links) - .layout(32); - - var link = svg.append("g").selectAll(".link") - .data(links) - .enter().append("path") - .attr("class", "link") - .attr("d", path) - .style("stroke-width", function(d) { return Math.max(1, d.dy); }) - .sort(function(a, b) { return b.dy - a.dy; }); - - link.append("title") - .text(function(d) { return d.source.name + " → " + d.target.name + "\n" + format(d.value); }); - - var node = svg.append("g").selectAll(".node") - .data(nodes) - .enter().append("g") - .attr("class", "node") - .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }) - .call(d3.behavior.drag() - .origin(function(d) { return d; }) - .on("dragstart", function() { this.parentNode.appendChild(this); }) - .on("drag", dragmove)); - - node.append("rect") - .attr("height", function(d) { return d.dy; }) - .attr("width", sankey.nodeWidth()) - .style("fill", function(d) { return d.color = color(d.name.replace(/ .*/, "")); }) - .style("stroke", function(d) { return d3.rgb(d.color).darker(2); }) - .append("title") - .text(function(d) { return d.name + "\n" + format(d.value); }); - - node.append("text") - .attr("x", -6) - .attr("y", function(d) { return d.dy / 2; }) - .attr("dy", ".35em") - .attr("text-anchor", "end") - .attr("transform", null) - .text(function(d) { return d.name; }) - .filter(function(d) { return d.x < width / 2; }) - .attr("x", 6 + sankey.nodeWidth()) - .attr("text-anchor", "start"); - - function dragmove(d) { - d3.select(this).attr("transform", "translate(" + d.x + "," + (d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))) + ")"); - sankey.relayout(); - link.attr("d", path); - } - slice.done(json); - }); - } - return { - render: render, - resize: render, - }; -} -px.registerViz('sankey', viz_sankey); diff --git a/panoramix/static/widgets/viz_world_map.css b/panoramix/static/widgets/viz_world_map.css deleted file mode 100644 index 323341ab580f..000000000000 --- a/panoramix/static/widgets/viz_world_map.css +++ /dev/null @@ -1,3 +0,0 @@ -.world_map svg{ - background-color: #bce8f1; -}