From e03043bd0bd1da4b775d29e1fb4cb45217fa8a6c Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 1 Aug 2022 11:37:47 -0700 Subject: [PATCH 01/11] [subset] don't let VariationStore subset() produce inner_maps Make it a subset-planning object so VariationStore can subset to specified inner_maps. Also add a layout_variation_idx_delta_map in subset_plan --- src/hb-ot-layout-common.hh | 21 +++------------- src/hb-ot-layout-gdef-table.hh | 2 +- src/hb-subset-plan.cc | 44 +++++++++++++++++++++++----------- src/hb-subset-plan.hh | 13 +++++----- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 146be513a..ce8ddffbb 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2562,7 +2562,7 @@ struct VariationStore bool serialize (hb_serialize_context_t *c, const VariationStore *src, - const hb_array_t &inner_maps) + const hb_array_t &inner_maps) { TRACE_SERIALIZE (this); #ifdef HB_NO_VAR @@ -2617,7 +2617,7 @@ struct VariationStore return_trace (true); } - bool subset (hb_subset_context_t *c) const + bool subset (hb_subset_context_t *c, const hb_array_t &inner_maps) const { TRACE_SUBSET (this); #ifdef HB_NO_VAR @@ -2627,22 +2627,7 @@ struct VariationStore VariationStore *varstore_prime = c->serializer->start_embed (); if (unlikely (!varstore_prime)) return_trace (false); - const hb_set_t *variation_indices = c->plan->layout_variation_indices; - if (variation_indices->is_empty ()) return_trace (false); - - hb_vector_t inner_maps; - inner_maps.resize ((unsigned) dataSets.len); - - for (unsigned idx : c->plan->layout_variation_indices->iter ()) - { - uint16_t major = idx >> 16; - uint16_t minor = idx & 0xFFFF; - - if (major >= inner_maps.length) - return_trace (false); - inner_maps[major].add (minor); - } - varstore_prime->serialize (c->serializer, this, inner_maps.as_array ()); + varstore_prime->serialize (c->serializer, this, inner_maps); return_trace ( !c->serializer->in_error() diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index 5bc26d918..11fdf2a24 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -586,7 +586,7 @@ struct GDEFVersion1_2 bool subset_varstore = false; if (version.to_int () >= 0x00010003u) { - subset_varstore = out->varStore.serialize_subset (c, varStore, this); + subset_varstore = out->varStore.serialize_subset (c, varStore, this, c->plan->gdef_varstore_inner_maps.as_array ()); } if (subset_varstore) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 146900da9..500fe7f2c 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -269,11 +269,26 @@ _closure_glyphs_lookups_features (hb_subset_plan_t *plan, #ifndef HB_NO_VAR static inline void -_collect_layout_variation_indices (hb_subset_plan_t* plan, - const hb_set_t *glyphset, - const hb_map_t *gpos_lookups, - hb_set_t *layout_variation_indices, - hb_map_t *layout_variation_idx_map) +_generate_varstore_inner_maps (const hb_set_t& varidx_set, + unsigned subtable_count, + hb_vector_t &inner_maps /* OUT */) +{ + if (varidx_set.is_empty () || subtable_count == 0) return; + + inner_maps.resize (subtable_count); + for (unsigned idx : varidx_set) + { + uint16_t major = idx >> 16; + uint16_t minor = idx & 0xFFFF; + + if (major >= subtable_count) + continue; + inner_maps[major].add (minor); + } +} + +static inline void +_collect_layout_variation_indices (hb_subset_plan_t* plan) { hb_blob_ptr_t gdef = plan->source_table (); hb_blob_ptr_t gpos = plan->source_table (); @@ -284,13 +299,18 @@ _collect_layout_variation_indices (hb_subset_plan_t* plan, gpos.destroy (); return; } - OT::hb_collect_variation_indices_context_t c (layout_variation_indices, glyphset, gpos_lookups); + + hb_set_t varidx_set; + OT::hb_collect_variation_indices_context_t c (&varidx_set, plan->_glyphset_gsub, plan->gpos_lookups); gdef->collect_variation_indices (&c); if (hb_ot_layout_has_positioning (plan->source)) gpos->collect_variation_indices (&c); - gdef->remap_layout_variation_indices (layout_variation_indices, layout_variation_idx_map); + gdef->remap_layout_variation_indices (&varidx_set, plan->layout_variation_idx_delta_map); + + unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0; + _generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps); gdef.destroy (); gpos.destroy (); @@ -506,11 +526,7 @@ _populate_gids_to_retain (hb_subset_plan_t* plan, #ifndef HB_NO_VAR if (close_over_gdef) - _collect_layout_variation_indices (plan, - plan->_glyphset_gsub, - plan->gpos_lookups, - plan->layout_variation_indices, - plan->layout_variation_idx_map); + _collect_layout_variation_indices (plan); #endif } @@ -682,8 +698,8 @@ hb_subset_plan_create_or_fail (hb_face_t *face, plan->gpos_features = hb_map_create (); plan->colrv1_layers = hb_map_create (); plan->colr_palettes = hb_map_create (); - plan->layout_variation_indices = hb_set_create (); - plan->layout_variation_idx_map = hb_map_create (); + plan->check_success (plan->layout_variation_idx_delta_map = hb_hashmap_create> ()); + plan->gdef_varstore_inner_maps.init (); plan->check_success (plan->sanitized_table_cache = hb_hashmap_create> ()); plan->check_success (plan->axes_location = hb_hashmap_create ()); diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index 0dc020525..98a45e5f6 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -33,6 +33,7 @@ #include "hb-subset-input.hh" #include "hb-map.hh" +#include "hb-bimap.hh" #include "hb-set.hh" struct hb_subset_plan_t @@ -66,8 +67,6 @@ struct hb_subset_plan_t hb_map_destroy (gpos_features); hb_map_destroy (colrv1_layers); hb_map_destroy (colr_palettes); - hb_set_destroy (layout_variation_indices); - hb_map_destroy (layout_variation_idx_map); hb_hashmap_destroy (gsub_langsys); hb_hashmap_destroy (gpos_langsys); @@ -75,6 +74,7 @@ struct hb_subset_plan_t hb_hashmap_destroy (sanitized_table_cache); hb_hashmap_destroy (hmtx_map); hb_hashmap_destroy (vmtx_map); + hb_hashmap_destroy (layout_variation_idx_delta_map); if (user_axes_location) { @@ -147,10 +147,11 @@ struct hb_subset_plan_t hb_map_t *colrv1_layers; hb_map_t *colr_palettes; - //The set of layout item variation store delta set indices to be retained - hb_set_t *layout_variation_indices; - //Old -> New layout item variation store delta set index mapping - hb_map_t *layout_variation_idx_map; + //Old layout item variation index -> (New varidx, delta) mapping + hb_hashmap_t> *layout_variation_idx_delta_map; + + //gdef varstore retained varidx mapping + hb_vector_t gdef_varstore_inner_maps; hb_hashmap_t>* sanitized_table_cache; //normalized axes location map From b72995ff162c6318a84b6ae9d43a9a247f2ad01d Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 1 Aug 2022 14:48:01 -0700 Subject: [PATCH 02/11] [instance] GDEF table: collect both varidxes and deltas --- src/OT/Layout/GPOS/AnchorFormat3.hh | 4 +-- src/OT/Layout/GPOS/ValueFormat.hh | 8 +++--- src/hb-ot-layout-common.hh | 32 +++++++++++++++++---- src/hb-ot-layout-gdef-table.hh | 18 +++++++----- src/hb-subset-plan.cc | 44 ++++++++++++++++++++++++++++- 5 files changed, 86 insertions(+), 20 deletions(-) diff --git a/src/OT/Layout/GPOS/AnchorFormat3.hh b/src/OT/Layout/GPOS/AnchorFormat3.hh index d77b4699b..593ae3939 100644 --- a/src/OT/Layout/GPOS/AnchorFormat3.hh +++ b/src/OT/Layout/GPOS/AnchorFormat3.hh @@ -57,8 +57,8 @@ struct AnchorFormat3 void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { - (this+xDeviceTable).collect_variation_indices (c->layout_variation_indices); - (this+yDeviceTable).collect_variation_indices (c->layout_variation_indices); + (this+xDeviceTable).collect_variation_indices (c); + (this+yDeviceTable).collect_variation_indices (c); } }; diff --git a/src/OT/Layout/GPOS/ValueFormat.hh b/src/OT/Layout/GPOS/ValueFormat.hh index 38758a163..e94461915 100644 --- a/src/OT/Layout/GPOS/ValueFormat.hh +++ b/src/OT/Layout/GPOS/ValueFormat.hh @@ -201,27 +201,27 @@ struct ValueFormat : HBUINT16 if (format & yAdvance) i++; if (format & xPlaDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::yPlaDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::xAdvDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::yAdvDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } } diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index ce8ddffbb..35f38c2c7 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -186,6 +186,7 @@ struct hb_subset_layout_context_t : unsigned lookup_index_count; }; +struct VariationStore; struct hb_collect_variation_indices_context_t : hb_dispatch_context_t { @@ -194,15 +195,27 @@ struct hb_collect_variation_indices_context_t : static return_t default_return_value () { return hb_empty_t (); } hb_set_t *layout_variation_indices; + hb_hashmap_t> *varidx_delta_map; + hb_font_t *font; + const VariationStore *var_store; const hb_set_t *glyph_set; const hb_map_t *gpos_lookups; + float *store_cache; hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_, + hb_hashmap_t> *varidx_delta_map_, + hb_font_t *font_, + const VariationStore *var_store_, const hb_set_t *glyph_set_, - const hb_map_t *gpos_lookups_) : + const hb_map_t *gpos_lookups_, + float *store_cache_) : layout_variation_indices (layout_variation_indices_), + varidx_delta_map (varidx_delta_map_), + font (font_), + var_store (var_store_), glyph_set (glyph_set_), - gpos_lookups (gpos_lookups_) {} + gpos_lookups (gpos_lookups_), + store_cache (store_cache_) {} }; template @@ -3172,9 +3185,16 @@ struct VariationDevice return_trace (out); } - void record_variation_index (hb_set_t *layout_variation_indices) const + void collect_variation_index (hb_collect_variation_indices_context_t *c) const { - layout_variation_indices->add (varIdx); + c->layout_variation_indices->add (varIdx); + int delta = 0; + if (c->font && c->var_store) + delta = roundf (get_delta (c->font, *c->var_store, c->store_cache)); + + /* set new varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX here, will remap + * varidx later*/ + c->varidx_delta_map->set (varIdx, hb_pair_t (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta)); } bool sanitize (hb_sanitize_context_t *c) const @@ -3286,7 +3306,7 @@ struct Device } } - void collect_variation_indices (hb_set_t *layout_variation_indices) const + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { switch (u.b.format) { #ifndef HB_NO_HINTING @@ -3297,7 +3317,7 @@ struct Device #endif #ifndef HB_NO_VAR case 0x8000: - u.variation.record_variation_index (layout_variation_indices); + u.variation.collect_variation_index (c); return; #endif default: diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index 11fdf2a24..0ca67bd6c 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -207,8 +207,8 @@ struct CaretValueFormat3 hb_serialize_context_t::Head, c->plan->layout_variation_idx_map)); } - void collect_variation_indices (hb_set_t *layout_variation_indices) const - { (this+deviceTable).collect_variation_indices (layout_variation_indices); } + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const + { (this+deviceTable).collect_variation_indices (c); } bool sanitize (hb_sanitize_context_t *c) const { @@ -255,14 +255,14 @@ struct CaretValue } } - void collect_variation_indices (hb_set_t *layout_variation_indices) const + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { switch (u.format) { case 1: case 2: return; case 3: - u.format3.collect_variation_indices (layout_variation_indices); + u.format3.collect_variation_indices (c); return; default: return; } @@ -329,7 +329,7 @@ struct LigGlyph void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { for (const Offset16To& offset : carets.iter ()) - (this+offset).collect_variation_indices (c->layout_variation_indices); + (this+offset).collect_variation_indices (c); } bool sanitize (hb_sanitize_context_t *c) const @@ -846,7 +846,7 @@ struct GDEF { get_lig_caret_list ().collect_variation_indices (c); } void remap_layout_variation_indices (const hb_set_t *layout_variation_indices, - hb_map_t *layout_variation_idx_map /* OUT */) const + hb_hashmap_t> *layout_variation_idx_delta_map /* OUT */) const { if (!has_var_store ()) return; if (layout_variation_indices->is_empty ()) return; @@ -864,7 +864,11 @@ struct GDEF } unsigned new_idx = (new_major << 16) + new_minor; - layout_variation_idx_map->set (idx, new_idx); + if (!layout_variation_idx_delta_map->has (idx)) + continue; + int delta = hb_second (layout_variation_idx_delta_map->get (idx)); + + layout_variation_idx_delta_map->set (idx, hb_pair_t (new_idx, delta)); ++new_minor; last_major = major; } diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 500fe7f2c..4faca1ee9 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -287,6 +287,26 @@ _generate_varstore_inner_maps (const hb_set_t& varidx_set, } } +static inline hb_font_t* +_get_hb_font_with_variations (const hb_subset_plan_t *plan) +{ + hb_font_t *font = hb_font_create (plan->source); + + hb_vector_t vars; + vars.alloc (plan->user_axes_location->get_population ()); + + for (auto _ : *plan->user_axes_location) + { + hb_variation_t var; + var.tag = _.first; + var.value = _.second; + vars.push (var); + } + + hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ()); + return font; +} + static inline void _collect_layout_variation_indices (hb_subset_plan_t* plan) { @@ -300,13 +320,35 @@ _collect_layout_variation_indices (hb_subset_plan_t* plan) return; } + const OT::VariationStore *var_store = nullptr; hb_set_t varidx_set; - OT::hb_collect_variation_indices_context_t c (&varidx_set, plan->_glyphset_gsub, plan->gpos_lookups); + hb_font_t *font = nullptr; + float *store_cache = nullptr; + bool collect_delta = plan->pinned_at_default ? false : true; + if (collect_delta) + { + font = _get_hb_font_with_variations (plan); + if (gdef->has_var_store ()) + { + var_store = &(gdef->get_var_store ()); + store_cache = var_store->create_cache (); + } + } + + OT::hb_collect_variation_indices_context_t c (&varidx_set, + plan->layout_variation_idx_delta_map, + font, var_store, + plan->_glyphset_gsub, + plan->gpos_lookups, + store_cache); gdef->collect_variation_indices (&c); if (hb_ot_layout_has_positioning (plan->source)) gpos->collect_variation_indices (&c); + hb_font_destroy (font); + var_store->destroy_cache (store_cache); + gdef->remap_layout_variation_indices (&varidx_set, plan->layout_variation_idx_delta_map); unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0; From 9ab6605f205159b0b16be11a4b36f022ccb8274d Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 2 Aug 2022 09:54:29 -0700 Subject: [PATCH 03/11] [instance] update GDEF table --- src/hb-ot-layout-common.hh | 26 ++++++++++++++++++++------ src/hb-ot-layout-gdef-table.hh | 28 +++++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 35f38c2c7..05916a252 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -3166,21 +3166,22 @@ struct VariationDevice VariationStore::cache_t *store_cache = nullptr) const { return font->em_scalef_y (get_delta (font, store, store_cache)); } - VariationDevice* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map) const + VariationDevice* copy (hb_serialize_context_t *c, + const hb_hashmap_t> *layout_variation_idx_delta_map) const { TRACE_SERIALIZE (this); + if (!layout_variation_idx_delta_map) return_trace (nullptr); auto snap = c->snapshot (); auto *out = c->embed (this); if (unlikely (!out)) return_trace (nullptr); - if (!layout_variation_idx_map || layout_variation_idx_map->is_empty ()) return_trace (out); /* TODO Just get() and bail if NO_VARIATION. Needs to setup the map to return that. */ - if (!layout_variation_idx_map->has (varIdx)) + if (!layout_variation_idx_delta_map->has (varIdx)) { c->revert (snap); return_trace (nullptr); } - unsigned new_idx = layout_variation_idx_map->get (varIdx); + unsigned new_idx = hb_first (layout_variation_idx_delta_map->get (varIdx)); out->varIdx = new_idx; return_trace (out); } @@ -3287,7 +3288,8 @@ struct Device } } - Device* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map=nullptr) const + Device* copy (hb_serialize_context_t *c, + const hb_hashmap_t> *layout_variation_idx_delta_map=nullptr) const { TRACE_SERIALIZE (this); switch (u.b.format) { @@ -3299,7 +3301,7 @@ struct Device #endif #ifndef HB_NO_VAR case 0x8000: - return_trace (reinterpret_cast (u.variation.copy (c, layout_variation_idx_map))); + return_trace (reinterpret_cast (u.variation.copy (c, layout_variation_idx_delta_map))); #endif default: return_trace (nullptr); @@ -3325,6 +3327,18 @@ struct Device } } + unsigned get_variation_index () const + { + switch (u.b.format) { +#ifndef HB_NO_VAR + case 0x8000: + return u.variation.varIdx; +#endif + default: + return HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + } + } + protected: union { DeviceHeader b; diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index 0ca67bd6c..22925fdfa 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -200,11 +200,30 @@ struct CaretValueFormat3 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - auto *out = c->serializer->embed (this); + auto *out = c->serializer->start_embed (*this); if (unlikely (!out)) return_trace (false); + if (!c->serializer->embed (caretValueFormat)) return_trace (false); + if (!c->serializer->embed (coordinate)) return_trace (false); + + unsigned varidx = (this+deviceTable).get_variation_index (); + if (c->plan->layout_variation_idx_delta_map->has (varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } + + if (c->plan->all_axes_pinned) + return_trace (c->serializer->check_assign (out->caretValueFormat, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW)); + + if (!c->serializer->embed (deviceTable)) + return_trace (false); return_trace (out->deviceTable.serialize_copy (c->serializer, deviceTable, this, c->serializer->to_bias (out), - hb_serialize_context_t::Head, c->plan->layout_variation_idx_map)); + hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map)); } void collect_variation_indices (hb_collect_variation_indices_context_t *c) const @@ -586,7 +605,10 @@ struct GDEFVersion1_2 bool subset_varstore = false; if (version.to_int () >= 0x00010003u) { - subset_varstore = out->varStore.serialize_subset (c, varStore, this, c->plan->gdef_varstore_inner_maps.as_array ()); + if (c->plan->all_axes_pinned) + out->varStore = 0; + else + subset_varstore = out->varStore.serialize_subset (c, varStore, this, c->plan->gdef_varstore_inner_maps.as_array ()); } if (subset_varstore) From 61636d4efec1e6bbb3754de469212734d75489fb Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 2 Aug 2022 10:52:31 -0700 Subject: [PATCH 04/11] [instance] update GPOS AnchorFormat3 table --- src/OT/Layout/GPOS/Anchor.hh | 3 +- src/OT/Layout/GPOS/AnchorFormat3.hh | 46 ++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/OT/Layout/GPOS/Anchor.hh b/src/OT/Layout/GPOS/Anchor.hh index bfe6b36af..49e76e775 100644 --- a/src/OT/Layout/GPOS/Anchor.hh +++ b/src/OT/Layout/GPOS/Anchor.hh @@ -58,8 +58,7 @@ struct Anchor return_trace (bool (reinterpret_cast (u.format1.copy (c->serializer)))); } return_trace (bool (reinterpret_cast (u.format2.copy (c->serializer)))); - case 3: return_trace (bool (reinterpret_cast (u.format3.copy (c->serializer, - c->plan->layout_variation_idx_map)))); + case 3: return_trace (u.format3.subset (c)); default:return_trace (false); } } diff --git a/src/OT/Layout/GPOS/AnchorFormat3.hh b/src/OT/Layout/GPOS/AnchorFormat3.hh index 593ae3939..2e30ab33c 100644 --- a/src/OT/Layout/GPOS/AnchorFormat3.hh +++ b/src/OT/Layout/GPOS/AnchorFormat3.hh @@ -41,17 +41,47 @@ struct AnchorFormat3 *y += (this+yDeviceTable).get_y_delta (font, c->var_store, c->var_store_cache); } - AnchorFormat3* copy (hb_serialize_context_t *c, - const hb_map_t *layout_variation_idx_map) const + bool subset (hb_subset_context_t *c) const { - TRACE_SERIALIZE (this); - if (!layout_variation_idx_map) return_trace (nullptr); + TRACE_SUBSET (this); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!out)) return_trace (false); + if (unlikely (!c->serializer->embed (format))) return_trace (false); + if (unlikely (!c->serializer->embed (xCoordinate))) return_trace (false); + if (unlikely (!c->serializer->embed (yCoordinate))) return_trace (false); - auto *out = c->embed (this); - if (unlikely (!out)) return_trace (nullptr); + unsigned x_varidx = xDeviceTable ? (this+xDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + if (c->plan->layout_variation_idx_delta_map->has (x_varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (x_varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->xCoordinate, xCoordinate + delta, + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } - out->xDeviceTable.serialize_copy (c, xDeviceTable, this, 0, hb_serialize_context_t::Head, layout_variation_idx_map); - out->yDeviceTable.serialize_copy (c, yDeviceTable, this, 0, hb_serialize_context_t::Head, layout_variation_idx_map); + unsigned y_varidx = yDeviceTable ? (this+yDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + if (c->plan->layout_variation_idx_delta_map->has (y_varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (y_varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->yCoordinate, yCoordinate + delta, + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } + + if (c->plan->all_axes_pinned) + return_trace (c->serializer->check_assign (out->format, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW)); + + if (!c->serializer->embed (xDeviceTable)) return_trace (false); + if (!c->serializer->embed (yDeviceTable)) return_trace (false); + + out->xDeviceTable.serialize_copy (c->serializer, xDeviceTable, this, 0, hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map); + out->yDeviceTable.serialize_copy (c->serializer, yDeviceTable, this, 0, hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map); return_trace (out); } From 6de0a6f0b7cdb32e7a7b63c6fe87933b085f229b Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 3 Aug 2022 11:18:00 -0700 Subject: [PATCH 05/11] [instance] update GPOS ValueRecord table --- src/OT/Layout/GPOS/Common.hh | 3 +- src/OT/Layout/GPOS/PairPosFormat1.hh | 6 ++ src/OT/Layout/GPOS/PairPosFormat2.hh | 10 +++- src/OT/Layout/GPOS/PairSet.hh | 2 +- src/OT/Layout/GPOS/PairValueRecord.hh | 6 +- src/OT/Layout/GPOS/SinglePos.hh | 15 +++-- src/OT/Layout/GPOS/SinglePosFormat1.hh | 6 +- src/OT/Layout/GPOS/SinglePosFormat2.hh | 6 +- src/OT/Layout/GPOS/ValueFormat.hh | 83 ++++++++++++++++++++------ 9 files changed, 101 insertions(+), 36 deletions(-) diff --git a/src/OT/Layout/GPOS/Common.hh b/src/OT/Layout/GPOS/Common.hh index e16c06729..408197454 100644 --- a/src/OT/Layout/GPOS/Common.hh +++ b/src/OT/Layout/GPOS/Common.hh @@ -22,7 +22,8 @@ template static void SinglePos_serialize (hb_serialize_context_t *c, const SrcLookup *src, Iterator it, - const hb_map_t *layout_variation_idx_map); + const hb_hashmap_t> *layout_variation_idx_delta_map, + bool all_axes_pinned); } diff --git a/src/OT/Layout/GPOS/PairPosFormat1.hh b/src/OT/Layout/GPOS/PairPosFormat1.hh index 3cb207281..ddf7313f9 100644 --- a/src/OT/Layout/GPOS/PairPosFormat1.hh +++ b/src/OT/Layout/GPOS/PairPosFormat1.hh @@ -127,6 +127,12 @@ struct PairPosFormat1_3 out->valueFormat[1] = newFormats.second; } + if (c->plan->all_axes_pinned) + { + out->valueFormat[0] = out->valueFormat[0].drop_device_table_flags (); + out->valueFormat[1] = out->valueFormat[1].drop_device_table_flags (); + } + hb_sorted_vector_t new_coverage; + hb_zip (this+coverage, pairSet) diff --git a/src/OT/Layout/GPOS/PairPosFormat2.hh b/src/OT/Layout/GPOS/PairPosFormat2.hh index a80fe0c22..83b093b98 100644 --- a/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -274,13 +274,19 @@ struct PairPosFormat2_4 out->valueFormat1 = newFormats.first; out->valueFormat2 = newFormats.second; + if (c->plan->all_axes_pinned) + { + out->valueFormat1 = out->valueFormat1.drop_device_table_flags (); + out->valueFormat2 = out->valueFormat2.drop_device_table_flags (); + } + for (unsigned class1_idx : + hb_range ((unsigned) class1Count) | hb_filter (klass1_map)) { for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map)) { unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2); - valueFormat1.copy_values (c->serializer, newFormats.first, this, &values[idx], c->plan->layout_variation_idx_map); - valueFormat2.copy_values (c->serializer, newFormats.second, this, &values[idx + len1], c->plan->layout_variation_idx_map); + valueFormat1.copy_values (c->serializer, out->valueFormat1, this, &values[idx], c->plan->layout_variation_idx_delta_map); + valueFormat2.copy_values (c->serializer, out->valueFormat2, this, &values[idx + len1], c->plan->layout_variation_idx_delta_map); } } diff --git a/src/OT/Layout/GPOS/PairSet.hh b/src/OT/Layout/GPOS/PairSet.hh index 4578fbd1d..aa48d933c 100644 --- a/src/OT/Layout/GPOS/PairSet.hh +++ b/src/OT/Layout/GPOS/PairSet.hh @@ -163,7 +163,7 @@ struct PairSet newFormats, len1, &glyph_map, - c->plan->layout_variation_idx_map + c->plan->layout_variation_idx_delta_map }; const PairValueRecord *record = &firstPairValueRecord; diff --git a/src/OT/Layout/GPOS/PairValueRecord.hh b/src/OT/Layout/GPOS/PairValueRecord.hh index bd95abde1..322247776 100644 --- a/src/OT/Layout/GPOS/PairValueRecord.hh +++ b/src/OT/Layout/GPOS/PairValueRecord.hh @@ -34,7 +34,7 @@ struct PairValueRecord const ValueFormat *newFormats; unsigned len1; /* valueFormats[0].get_len() */ const hb_map_t *glyph_map; - const hb_map_t *layout_variation_idx_map; + const hb_hashmap_t> *layout_variation_idx_delta_map; }; bool subset (hb_subset_context_t *c, @@ -50,12 +50,12 @@ struct PairValueRecord closure->valueFormats[0].copy_values (s, closure->newFormats[0], closure->base, &values[0], - closure->layout_variation_idx_map); + closure->layout_variation_idx_delta_map); closure->valueFormats[1].copy_values (s, closure->newFormats[1], closure->base, &values[closure->len1], - closure->layout_variation_idx_map); + closure->layout_variation_idx_delta_map); return_trace (true); } diff --git a/src/OT/Layout/GPOS/SinglePos.hh b/src/OT/Layout/GPOS/SinglePos.hh index 702f578b3..6dce3e634 100644 --- a/src/OT/Layout/GPOS/SinglePos.hh +++ b/src/OT/Layout/GPOS/SinglePos.hh @@ -38,12 +38,16 @@ struct SinglePos void serialize (hb_serialize_context_t *c, const SrcLookup* src, Iterator glyph_val_iter_pairs, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t> *layout_variation_idx_delta_map, + bool all_axes_pinned) { if (unlikely (!c->extend_min (u.format))) return; unsigned format = 2; ValueFormat new_format = src->get_value_format (); + if (all_axes_pinned) + new_format = new_format.drop_device_table_flags (); + if (glyph_val_iter_pairs) format = get_format (glyph_val_iter_pairs); @@ -53,13 +57,13 @@ struct SinglePos src, glyph_val_iter_pairs, new_format, - layout_variation_idx_map); + layout_variation_idx_delta_map); return; case 2: u.format2.serialize (c, src, glyph_val_iter_pairs, new_format, - layout_variation_idx_map); + layout_variation_idx_delta_map); return; default:return; } @@ -84,8 +88,9 @@ static void SinglePos_serialize (hb_serialize_context_t *c, const SrcLookup *src, Iterator it, - const hb_map_t *layout_variation_idx_map) -{ c->start_embed ()->serialize (c, src, it, layout_variation_idx_map); } + const hb_hashmap_t> *layout_variation_idx_delta_map, + bool all_axes_pinned) +{ c->start_embed ()->serialize (c, src, it, layout_variation_idx_delta_map, all_axes_pinned); } } diff --git a/src/OT/Layout/GPOS/SinglePosFormat1.hh b/src/OT/Layout/GPOS/SinglePosFormat1.hh index 7cbdf6dc6..5a9dd58a6 100644 --- a/src/OT/Layout/GPOS/SinglePosFormat1.hh +++ b/src/OT/Layout/GPOS/SinglePosFormat1.hh @@ -87,7 +87,7 @@ struct SinglePosFormat1 const SrcLookup *src, Iterator it, ValueFormat newFormat, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t> *layout_variation_idx_delta_map) { if (unlikely (!c->extend_min (this))) return; if (unlikely (!c->check_assign (valueFormat, @@ -96,7 +96,7 @@ struct SinglePosFormat1 for (const hb_array_t& _ : + it | hb_map (hb_second)) { - src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_map); + src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_delta_map); // Only serialize the first entry in the iterator, the rest are assumed to // be the same. break; @@ -126,7 +126,7 @@ struct SinglePosFormat1 ; bool ret = bool (it); - SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_map); + SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned); return_trace (ret); } }; diff --git a/src/OT/Layout/GPOS/SinglePosFormat2.hh b/src/OT/Layout/GPOS/SinglePosFormat2.hh index 518fa9dcb..8a6e8a42a 100644 --- a/src/OT/Layout/GPOS/SinglePosFormat2.hh +++ b/src/OT/Layout/GPOS/SinglePosFormat2.hh @@ -99,7 +99,7 @@ struct SinglePosFormat2 const SrcLookup *src, Iterator it, ValueFormat newFormat, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t> *layout_variation_idx_delta_map) { auto out = c->extend_min (this); if (unlikely (!out)) return; @@ -109,7 +109,7 @@ struct SinglePosFormat2 + it | hb_map (hb_second) | hb_apply ([&] (hb_array_t _) - { src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_map); }) + { src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_delta_map); }) ; auto glyphs = @@ -141,7 +141,7 @@ struct SinglePosFormat2 ; bool ret = bool (it); - SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_map); + SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned); return_trace (ret); } }; diff --git a/src/OT/Layout/GPOS/ValueFormat.hh b/src/OT/Layout/GPOS/ValueFormat.hh index e94461915..26a40f01a 100644 --- a/src/OT/Layout/GPOS/ValueFormat.hh +++ b/src/OT/Layout/GPOS/ValueFormat.hh @@ -163,30 +163,50 @@ struct ValueFormat : HBUINT16 unsigned int new_format, const void *base, const Value *values, - const hb_map_t *layout_variation_idx_map) const + const hb_hashmap_t> *layout_variation_idx_delta_map) const { unsigned int format = *this; if (!format) return; - if (format & xPlacement) copy_value (c, new_format, xPlacement, *values++); - if (format & yPlacement) copy_value (c, new_format, yPlacement, *values++); - if (format & xAdvance) copy_value (c, new_format, xAdvance, *values++); - if (format & yAdvance) copy_value (c, new_format, yAdvance, *values++); + HBINT16 *x_placement = nullptr, *y_placement = nullptr, *x_adv = nullptr, *y_adv = nullptr; + if (format & xPlacement) x_placement = copy_value (c, new_format, xPlacement, *values++); + if (format & yPlacement) y_placement = copy_value (c, new_format, yPlacement, *values++); + if (format & xAdvance) x_adv = copy_value (c, new_format, xAdvance, *values++); + if (format & yAdvance) y_adv = copy_value (c, new_format, yAdvance, *values++); - if (format & xPlaDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & yPlaDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & xAdvDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & yAdvDevice) copy_device (c, base, values++, layout_variation_idx_map); + if (format & xPlaDevice) + { + add_delta_to_value (x_placement, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, xPlaDevice); + } + + if (format & yPlaDevice) + { + add_delta_to_value (y_placement, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, yPlaDevice); + } + + if (format & xAdvDevice) + { + add_delta_to_value (x_adv, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, xAdvDevice); + } + + if (format & yAdvDevice) + { + add_delta_to_value (y_adv, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, yAdvDevice); + } } - void copy_value (hb_serialize_context_t *c, - unsigned int new_format, - Flags flag, - Value value) const + HBINT16* copy_value (hb_serialize_context_t *c, + unsigned int new_format, + Flags flag, + Value value) const { // Filter by new format. - if (!(new_format & flag)) return; - c->copy (value); + if (!(new_format & flag)) return nullptr; + return reinterpret_cast (c->copy (value)); } void collect_variation_indices (hb_collect_variation_indices_context_t *c, @@ -226,6 +246,15 @@ struct ValueFormat : HBUINT16 } } + unsigned drop_device_table_flags () const + { + unsigned format = *this; + for (unsigned flag = xPlaDevice; flag <= yAdvDevice; flag = flag << 1) + format = format & ~flag; + + return format; + } + private: bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const { @@ -254,9 +283,27 @@ struct ValueFormat : HBUINT16 return *static_cast *> (value); } - bool copy_device (hb_serialize_context_t *c, const void *base, - const Value *src_value, const hb_map_t *layout_variation_idx_map) const + void add_delta_to_value (HBINT16 *value, + const void *base, + const Value *src_value, + const hb_hashmap_t> *layout_variation_idx_delta_map) const { + if (!value) return; + unsigned varidx = (base + get_device (src_value)).get_variation_index (); + hb_pair_t *varidx_delta; + if (!layout_variation_idx_delta_map->has (varidx, &varidx_delta)) return; + + *value += hb_second (*varidx_delta); + } + + bool copy_device (hb_serialize_context_t *c, const void *base, + const Value *src_value, + const hb_hashmap_t> *layout_variation_idx_delta_map, + unsigned int new_format, Flags flag) const + { + // Filter by new format. + if (!(new_format & flag)) return true; + Value *dst_value = c->copy (*src_value); if (!dst_value) return false; @@ -264,7 +311,7 @@ struct ValueFormat : HBUINT16 *dst_value = 0; c->push (); - if ((base + get_device (src_value)).copy (c, layout_variation_idx_map)) + if ((base + get_device (src_value)).copy (c, layout_variation_idx_delta_map)) { c->add_link (*dst_value, c->pop_pack ()); return true; From 7d7b49234441144692a69577b7c7ed70611c9ebc Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 24 Aug 2022 11:49:50 -0700 Subject: [PATCH 06/11] [instance] move _normalize_axes_location to the beginning of subset_plan_create pinned_at_default flag decides whether delta will be collected as well when collecting layout variation indices --- src/hb-subset-plan.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 4faca1ee9..c34f6722b 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -759,6 +759,10 @@ hb_subset_plan_create_or_fail (hb_face_t *face, return nullptr; } +#ifndef HB_NO_VAR + _normalize_axes_location (face, plan); +#endif + _populate_unicodes_to_retain (input->sets.unicodes, input->sets.glyphs, plan); _populate_gids_to_retain (plan, @@ -786,10 +790,6 @@ hb_subset_plan_create_or_fail (hb_face_t *face, plan->glyph_map->get(plan->unicode_to_new_gid_list.arrayZ[i].second); } -#ifndef HB_NO_VAR - _normalize_axes_location (face, plan); -#endif - _nameid_closure (face, plan->name_ids, plan->all_axes_pinned, plan->user_axes_location); if (unlikely (plan->in_error ())) { hb_subset_plan_destroy (plan); From 8b7e2a137346c42168acbc7841b3aa77f849edcb Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 24 Aug 2022 14:16:55 -0700 Subject: [PATCH 07/11] [instance] we need to update hmtx/vmtx values even for empty glyphs Update metrics using the 4 phantom points --- src/OT/glyf/Glyph.hh | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/OT/glyf/Glyph.hh b/src/OT/glyf/Glyph.hh index f5dc3d4ea..10ede2f86 100644 --- a/src/OT/glyf/Glyph.hh +++ b/src/OT/glyf/Glyph.hh @@ -101,15 +101,13 @@ struct Glyph const contour_point_vector_t &all_points, hb_bytes_t &dest_bytes /* OUT */) const { - if (all_points.length == 4) //Empty glyph + GlyphHeader *glyph_header = nullptr; + if (all_points.length > 4) { - dest_bytes = hb_bytes_t (); - return true; + glyph_header = (GlyphHeader *) hb_calloc (1, GlyphHeader::static_size); + if (unlikely (!glyph_header)) return false; } - GlyphHeader *glyph_header = (GlyphHeader *) hb_calloc (1, GlyphHeader::static_size); - if (unlikely (!glyph_header)) return false; - int xMin, xMax; xMin = xMax = roundf (all_points[0].x); @@ -128,6 +126,11 @@ struct Glyph update_mtx (plan, xMin, yMax, all_points); + /*for empty glyphs: all_points only include phantom points. + *just update metrics and then return */ + if (all_points.length == 4) + return true; + glyph_header->numberOfContours = header->numberOfContours; glyph_header->xMin = xMin; glyph_header->yMin = yMin; @@ -161,8 +164,11 @@ struct Glyph return false; break; default: - //no need to compile empty glyph (.notdef) - return true; + /* set empty bytes for empty glyph + * do not use source glyph's pointers */ + dest_start = hb_bytes_t (); + dest_end = hb_bytes_t (); + break; } return compile_header_bytes (plan, all_points, dest_start); From 58dbc00162fba5a694f4a1dffdc2d3521ebc24f1 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 25 Aug 2022 11:05:15 -0700 Subject: [PATCH 08/11] [instance] Fix compiling Composite glyph bytes The x/y offset encoded with int8 originally might overflow after deltas are applied. So we cannot just copy and update old values. --- src/OT/glyf/CompositeGlyph.hh | 102 +++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 20 deletions(-) diff --git a/src/OT/glyf/CompositeGlyph.hh b/src/OT/glyf/CompositeGlyph.hh index a2071a808..fc8e309bc 100644 --- a/src/OT/glyf/CompositeGlyph.hh +++ b/src/OT/glyf/CompositeGlyph.hh @@ -105,9 +105,10 @@ struct CompositeGlyphRecord } } - void apply_delta_to_offsets (const contour_point_t &p_delta) + unsigned compile_with_deltas (const contour_point_t &p_delta, + char *out) const { - HBINT8 *p = &StructAfter (flags); + const HBINT8 *p = &StructAfter (flags); #ifndef HB_NO_BEYOND_64K if (flags & GID_IS_24BIT) p += HBGlyphID24::static_size; @@ -115,17 +116,54 @@ struct CompositeGlyphRecord #endif p += HBGlyphID16::static_size; + unsigned len = get_size (); + unsigned len_before_val = (const char *)p - (const char *)this; if (flags & ARG_1_AND_2_ARE_WORDS) { - HBINT16 *px = reinterpret_cast (p); - px[0] += roundf (p_delta.x); - px[1] += roundf (p_delta.y); + // no overflow, copy and update value with deltas + memcpy (out, this, len); + + const HBINT16 *px = reinterpret_cast (p); + HBINT16 *o = reinterpret_cast (out + len_before_val); + o[0] = px[0] + roundf (p_delta.x); + o[1] = px[1] + roundf (p_delta.y); } else { - p[0] += roundf (p_delta.x); - p[1] += roundf (p_delta.y); + int new_x = p[0] + roundf (p_delta.x); + int new_y = p[1] + roundf (p_delta.y); + if (new_x <= 127 && new_x >= -128 && + new_y <= 127 && new_y >= -128) + { + memcpy (out, this, len); + HBINT8 *o = reinterpret_cast (out + len_before_val); + o[0] = new_x; + o[1] = new_y; + } + else + { + // int8 overflows after deltas applied + memcpy (out, this, len_before_val); + + //update flags + CompositeGlyphRecord *o = reinterpret_cast (out); + o->flags = flags | ARG_1_AND_2_ARE_WORDS; + out += len_before_val; + + HBINT16 new_value; + new_value = new_x; + memcpy (out, &new_value, HBINT16::static_size); + out += HBINT16::static_size; + + new_value = new_y; + memcpy (out, &new_value, HBINT16::static_size); + out += HBINT16::static_size; + + memcpy (out, p+2, len - len_before_val - 2); + len += 2; + } } + return len; } protected: @@ -316,32 +354,56 @@ struct CompositeGlyph const contour_point_vector_t &deltas, hb_bytes_t &dest_bytes /* OUT */) { - int len = source_bytes.length - GlyphHeader::static_size; - if (len <= 0 || header.numberOfContours != -1) + if (source_bytes.length <= GlyphHeader::static_size || + header.numberOfContours != -1) { dest_bytes = hb_bytes_t (); return true; } - char *p = (char *) hb_calloc (len, sizeof (char)); - if (unlikely (!p)) return false; + unsigned source_len = source_bytes.length - GlyphHeader::static_size; - memcpy (p, source_bytes.arrayZ + GlyphHeader::static_size, len); - dest_bytes = hb_bytes_t (p, len); + /* try to allocate more memories than source glyph bytes + * in case that there might be an overflow for int8 value + * and we would need to use int16 instead */ + char *o = (char *) hb_calloc (source_len + source_len/2, sizeof (char)); + if (unlikely (!o)) return false; - auto it = composite_iter_t (dest_bytes, (CompositeGlyphRecord *)p); + const CompositeGlyphRecord *c = reinterpret_cast (source_bytes.arrayZ + GlyphHeader::static_size); + auto it = composite_iter_t (hb_bytes_t ((const char *)c, source_len), c); - unsigned i = 0; - for (auto &component : it) + char *p = o; + unsigned i = 0, source_comp_len = 0; + for (const auto &component : it) { - if (!component.is_anchored ()) + /* last 4 points in deltas are phantom points and should not be included */ + if (i >= deltas.length - 4) return false; + + unsigned comp_len = component.get_size (); + if (component.is_anchored ()) { - /* last 4 points in deltas are phantom points and should not be included*/ - if (i >= deltas.length - 4) return false; - const_cast (component).apply_delta_to_offsets (deltas[i]); + memcpy (p, &component, comp_len); + p += comp_len; + } + else + { + unsigned new_len = component.compile_with_deltas (deltas[i], p); + p += new_len; } i++; + source_comp_len += comp_len; } + + //copy instructions if any + if (source_len > source_comp_len) + { + unsigned instr_len = source_len - source_comp_len; + memcpy (p, (const char *)c + source_comp_len, instr_len); + p += instr_len; + } + + unsigned len = p - o; + dest_bytes = hb_bytes_t (o, len); return true; } }; From 8f84c58a34e07254d89eb539ff4dd5ec8089281e Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 26 Aug 2022 08:24:19 -0700 Subject: [PATCH 09/11] [instance] don't copy phantom points from component No need to consider USE_MY_METRICS for instancing --- src/OT/glyf/Glyph.hh | 7 ++++--- src/OT/glyf/glyf.hh | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/OT/glyf/Glyph.hh b/src/OT/glyf/Glyph.hh index 10ede2f86..afcb5dc83 100644 --- a/src/OT/glyf/Glyph.hh +++ b/src/OT/glyf/Glyph.hh @@ -148,7 +148,7 @@ struct Glyph hb_bytes_t &dest_end /* OUT */) const { contour_point_vector_t all_points, deltas; - get_points (font, glyf, all_points, &deltas); + get_points (font, glyf, all_points, &deltas, false); switch (type) { case COMPOSITE: @@ -182,6 +182,7 @@ struct Glyph bool get_points (hb_font_t *font, const accelerator_t &glyf_accelerator, contour_point_vector_t &all_points /* OUT */, contour_point_vector_t *deltas = nullptr, /* OUT */ + bool use_my_metrics = true, bool phantom_only = false, unsigned int depth = 0) const { @@ -270,11 +271,11 @@ struct Glyph comp_points.reset (); if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ()) .get_points (font, glyf_accelerator, comp_points, - deltas, phantom_only, depth + 1))) + deltas, use_my_metrics, phantom_only, depth + 1))) return false; /* Copy phantom points from component if USE_MY_METRICS flag set */ - if (item.is_use_my_metrics ()) + if (use_my_metrics && item.is_use_my_metrics ()) for (unsigned int i = 0; i < PHANTOM_COUNT; i++) phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i]; diff --git a/src/OT/glyf/glyf.hh b/src/OT/glyf/glyf.hh index 7ba2b8eb0..be2cb1d0d 100644 --- a/src/OT/glyf/glyf.hh +++ b/src/OT/glyf/glyf.hh @@ -180,7 +180,7 @@ struct glyf_accelerator_t contour_point_vector_t all_points; bool phantom_only = !consumer.is_consuming_contour_points (); - if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, nullptr, phantom_only))) + if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, nullptr, true, phantom_only))) return false; if (consumer.is_consuming_contour_points ()) From 88c02e00248227ba3434e6b09a58d86c0a779144 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 26 Aug 2022 08:34:12 -0700 Subject: [PATCH 10/11] [instance] add tests for full instancing Also update previous tests with GDEF/GPOS tables --- ...le-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 3876 -> 3864 bytes ....retain-all-codepoint.wght=150,wdth=80.ttf | Bin 0 -> 114200 bytes ....retain-all-codepoint.wght=300,wdth=90.ttf | Bin 0 -> 114300 bytes ....retain-all-codepoint.wght=200,wdth=90.ttf | Bin 6540 -> 6760 bytes ....retain-all-codepoint.wght=650,wdth=85.ttf | Bin 6492 -> 6712 bytes ....retain-all-codepoint.wght=200,wdth=90.ttf | Bin 6332 -> 6440 bytes ....retain-all-codepoint.wght=650,wdth=85.ttf | Bin 6284 -> 6392 bytes ...tain-all-codepoint.wght=400,wdth=100.0.ttf | Bin 6584 -> 6804 bytes ...etain-all-codepoint.wght=drop,wdth=100.ttf | Bin 6584 -> 6804 bytes test/subset/data/tests/full_instance.tests | 12 ++++++++++++ test/subset/generate-expected-outputs.py | 7 +------ test/subset/meson.build | 1 + test/subset/run-tests.py | 3 +-- 13 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 test/subset/data/expected/full_instance/Roboto-Variable.default.retain-all-codepoint.wght=150,wdth=80.ttf create mode 100644 test/subset/data/expected/full_instance/Roboto-Variable.default.retain-all-codepoint.wght=300,wdth=90.ttf create mode 100644 test/subset/data/tests/full_instance.tests diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf index 930d8713386a12645f08b9d11d4162b972dea845..b0069ab75e47f34606882d40b85a595c54c0ecdd 100644 GIT binary patch delta 94 zcmZ1?H$!fMBDZ!?69WS)0|Nu2%S4@SK^GunU3yt!k@$T5a0UkUFB4D1GalKj!N|hM s62jgrv)O=2l3BKlL5qQhfsug;sE-3k3IJ&ahB$_6Kryz>MXZ}R0SiGBGynhq delta 106 zcmbOsw?uA&BDa6hECvQv1_lPkfQdTYf&oCry7aQdBJuh9;S3BM3=>bpGhW!N!N|hM w61=}@&t?NANoLI^1~Ud821W)Zpgs;DDFdV#7_t~10mazBY$&lgjdc?z01kT;GXMYp diff --git a/test/subset/data/expected/full_instance/Roboto-Variable.default.retain-all-codepoint.wght=150,wdth=80.ttf b/test/subset/data/expected/full_instance/Roboto-Variable.default.retain-all-codepoint.wght=150,wdth=80.ttf new file mode 100644 index 0000000000000000000000000000000000000000..49ee6f990e23d552bd5b82f916d936ac92605fef GIT binary patch literal 114200 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full_instance/Roboto-Variable.default.retain-all-codepoint.wght=300,wdth=90.ttf b/test/subset/data/expected/full_instance/Roboto-Variable.default.retain-all-codepoint.wght=300,wdth=90.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3fc881b335966ea8d1c5842a4ece27467a6ad035 GIT binary patch literal 114300 zcmd442YeM(*Z;fs%$#&cC{hy0IpL6igx;GHdhY=edgvt(r1u(H=taZ|Dk@U+fDKU) z5l|2dMN|yZLXij@stuU?-7`5!i1<9d@Be@A=bp)L_t~>&t+m%)v!+ByAw)p}L%5nZ zY1(X1yMa##;Rq8#UTNN;edqJV&NLLFVGAL;)otFnOQTlp{wOX)vBE+G#kB8Ssp>P% zZD~SiW$C4F=lF*4eZu3OW#8lEN!{l|}W)%!hW8toTQ|6tIl z!6P<0QmYD4WseY{^9Co486^S){mb&yhYU`hH0aHZLw^!tZK{ybcZUp28lbl?{~Yx% zP+xNh1wlIlXOo{uzVwh0V<&dr*`5AM)u+GIqo>Oby(k_g*YQLvx9K;pwIB0&|T}CC$UwwGc*StgdW8^bwy-Vy7FS6|v&#;xTa`VK;VlySriDTj&@vJ-} z)>yeWWw4kn-V*D@V)3;25PlUEt7tVvED|q^pRMv2#rs*kY!LIrEA;ce_=LS@i>0)D zMQo?f72;X3m7aIYgYv%BcXP3pG1&b-E7sAoN6Zp)>322h_t?Lv=pg!wiDH_VL+Ntb zzrsk4i=Sl-$6v@eUKFp1ca0^2*~Tw~evup_kaTacGAk`9pO=-^M1K0S+vvHohxf_dUt{(gB_`2_Z#?#1RYVo`Z%%CrM@!}?E=D?%F;*nikdkELPT6~n zv2p_$i5ky%!U42Iuo2}(#Ohbj3hlXEjZ!V$N_{yJguCoht|qID8d z>!R%<{6yodwNEw9QTs|eLHL7qi|{w?H^M(qxl-43gV0|OCd{X=C463gf$$|As_HN6 z8wg+5&v3pX&YWI-T9>I$n$9WpOy}e$Oy{I}an6bLP3MIAPdLZd@OO@@YdXi)9qb%a zr@eD@9n<+#P18B5_E*l7+NN`4t=`TNwZ3vD*D{^MYgKR#t5wW7w7TgWQq^=0uKJa8 zP&Lyzu!`v%P}y|$ue{mWukv7LQbp6*x8h7^pGu~)ccoR%UKLDd&+?|TN37}WUhXSr zVmZ^9P%fXd+vBFQYgyCTrA%pOe3=T)&e6S{ouW-=$LP(@4l$;)eauW}yV9n!tvlA) z#=Y6u+HE>pxw|@Bl5bJUbT)UH&StLB&ZbeOvq{uwXJe=7Y!tc5*)Y;{#+5Xk4N92K zC+e+=yW*^0ue!5tjr`6!HAg#Z*KF^sRkM_{W{p+OYE|Q$RVt5mR;t*_8Cx#SS*Ez* zjEOGmjII_@yl3g~f=;(1ym-%2#Z70F>j|f;cCjKooy96RBa52Ol0{5si6Z{ah-$@4 z^e9%nNQoZdDpgda9xMK2k=MHys#35^fhu8L3MPgn=Bpmk#Zlep5|U^nI*mSt7HZ5e zt{Zx2@BCeYs|R)QukP1HRuNtDCk7?@CC>1ZmHgWKrTFO${QCIK@Y6+NB_S&@=dTMr zuzEljy}H&VAW=(nYJD^mvPS}o2m28x_P1728OxR}VOB2V86|o{VHde)B z#*R}Nm9-00%FfH!oJ}>5>Q7aX;74fhl_%*dv>N4ZW$$AZKitM{85>*7(p731R+fjQ z(XH6<8^yFx;_jc-BA=Mfy0-5*Rfmo&8qt(KOkeXM=19n?-~w@?Dw zZB#Ov8tsjKMv5`Xm}e|9)){Xa+l-yYUgMDQweh`i*0|%4jxa}|NEz86a&F{}$Xk(r zINQ1cUBRvbuE$)Fu2QZtuF9@zuDY)Jt|qRrt{JWku1&5ju5GTJu3b@%s6tUiqDn=@ zL{*IHT}mtES1Pnr!BXL+B1^@VYEi0hse#dlu4#8a`^$J>n)k8W)K3%n(B$jUuv=M= z_nTz=y7nAEH2yED99J zMS%fOKtcft1@1us1i`#(X2=%iURmG#6xpZ*SlzHnSkXW!-~!>GgjvM&Hysate~>Aa z{9v^`82F%xsDJ;5``_O`c>mq|8}Gky|CReM-cO_7qGl1=i2GO$4}QD%;ND+C+}jDZ zgEzp-_tq0~eQ<9DSVXIa;7QV0m>GX%e3X%#@l1xucsgV0+0kdmoJ|qpZ1UORXNR6m zI=A<1;<=q?JDiO=TNE4fCb)X$;+YF)UOKbl%(647r&phubf)d;O+Rlr{nF_dPp>(> z>h%26!%xSb?)cNyLLUVE=C@PZBloGZS4L>AA3X`Id+Y4uh<#{7dStG4Bvn3dSxyVt zQ>9tiW)iNo%O%#W{2h^V0n4h;I*=L*Xr(O%%fWi^uD!>@p|;`Syq(il(;ob3(x{Zs+g+#q&a z25N(}!PwI)wISM2ZJ0J(OV&nU3$NCuYSXlt+AM9hHb-8S*W?{7Oq;At(WYxNn5S=R z>x4&Juf43jf*rJ7dsEw_Z5HonTePj>UF|LHZSkJw5$|i;#0T1T?H#cLihd||YVT?9 zYaeJkv=6nN+DF>QVxP7fD`G$P!~tgh7vi8egw1qV+oP-|?Y?$E9MwJ-$Fwh)--oa? zj*IWa39O9=T>pKqeItI*zSWM1AGM>{R6mJy?U;60oYIbK-)Seb@6iZ9YRc9+t^K5> zi!0byzly8cDRB)Q>(zc1H^fbGOWf8@i#ysG?X0+~ofE%l=QUHyfCU#YUoL8ww9DEr z(%|~bPrJgU88c7WWBPMwTTK>~#bj|Aj@B`BKi#1}E6d9YvZAacD=SL}-BndtW>`Q0 zvIf>!Em>QC5$h*V57L+GEA(JJL|><`*VoE6vaP;Ge+DZlKN@_czDjnL-DH9ut{2xM z^b&eWJyLhdMA=PW275@IEFa(I=*(C^b>v& zehvLr`q%Rx?SCZTv4GA2a{{&m{1F%xSR=4+;HtoFff+&mLG6QP2Ynx0B6v#hv%#MS zUkj-m(ko z%P%VbQTbaHnp8-wkXf-+#r2g6Rq9!3OXa}I9V;)d{BGsnsd#mIqekr-uh$H&S*qsXn(x;NuT{U+$Xc)0`mWaf+V0v7 zY9FipSDi|A;_J+<^I2V4w`Secy65VZsyD6Pm-S=nr__JD{_!Use`3ZHyPquj zdGbPoS`Fqk_$97Y+@6ND8ot}8Qlk}(&NnXJxMSmYn-psDLDTL{_cn`dHnQ2<%}zJF z*St*g`pr8w|D{FU7F}D6Zn3q6w`G@>6Iwpo@_4JzR;60iXw|S)e5;kMzG)rUx^e5S zt%tULuJxB~g4%Ry^Kn~u+nQ}#ww==Ut+t=GJ>ITZyYB6lx4Y54efzcTe{O%HgVCX0 zhp`>zcX+PD)((3*=IfZy@zsvoJAT^ntByZ*3htED>HE&DJAV=%8^0$0c9+gw)^)ko zwQkqct_QmLcT4FurQ7^&Z~uqwgKnR6`?lNJZhs{_mQXpNRl%-o)de7>8 zwoiDUetjnPS=eV?pZEHP_pRP{aNmi2Urnl#G(720(r^9B_3PDdMZcH&?d*5Fe{lci z{a+p6$98XEqk$6!K0ok>LFEU<4_YxOebAl3JqEu%_=CaTA?_hh4jDS+wIQDm$sAf{ zX!6i!hGq=CI`r;Pb6CKz0>i?GxrdDzmOAW>VQ&xnVAv>hDsM8=5UMh1_J z99d;#laUD{hmV{-a>d9EBR?4V<;c?`@1z8zM5I(qiA#x38JsdHWpT>-lNzT9)a+4Dk9uR&&QV`I<$h}OQ@fu!@>IrCcSi?~E-|{&=!T=? zM-Lu7dGzAZ>qc)My?^u%V=9b!e#~2AJ{@y>%*8Q(j13+eIkw8!rehPv4j(&x?254) z#(psN(AZOBz2mfTg~yc{S8ZH_ah=8u95-p)l5y+Dy)*9faX*c_HeQa;H@^7z^5Ywf z?>v6+_{rm!j9)+go$>p}|1dstyg8xJgqR6+CbXT9G-2$7c@v(Uuw}w06OK&CnDE=g z;EB$ORVOx?m@qMU;*5zaC%!iE!-v{!>Gz7M<#xT4rjcskNpynA&`5kEtnBXHR{4>c*)%r+z*4#MGasUYvSu z>fLEU(@IXOJgxDxuG5B1n>Ov_v~$z$PJ1xjZ+h|R<)>GlUVnO%>20R>nLc=W%Jd1- zXH1_zecAM9rmvg+#`L$R@11^V`q3GW%_un|dPbcYZDz#J=s9E5jEOTA&3JK!XU1nU zPR#ga#{HQEW|p2=Yi5I)&1ZI=IcVm{nX_iDp84j?-7}BO%$WJxte{y1XNAwIIIGdD zcC)(A8Zm3;tW~pKpY_(P_h;>%b!1k?tY2rDvkT6SnO%2wquH%y_nJLwcIxcKv)9jl zclH;v(`R3wqs=Kir|g{ib2`i!FeiD=*f|U4yfDWz=d(E{=3Jh0FEupPomwlkb!zX_ z(W&!Nm!`gw`hM!c)bv#ETw`vrxv_H_%*jwv|A+aR^B*iIxFBXh z-39FyBrO=bV8MbH7I+qXw&42(R~9^2SYTnrg{>C$S~zOqoP}!^zPa$@h2JbZxA1OS zP+DYK)wHH*32DRArl+k)+mQA_+M%>lY2HP~qGF56FN#~#dC{OnlNK#nv~kf#i@siT zcG2y{{)@vGS6CdkxW(es#d{W?TVgC}yd-tW_9YjWmRQ4~LRmOfZka9PZ$hzDvb1F{E!)0q_p+nQE-w3XdH&_4me*X~YI*PFPc2Vf zzIOSR<$IPNUw(P{y%k|AO0THBqV`w7;>3z8EAFohUFlv~Yh~+| zeO8WHIe+EzE8klA>B{3PFRfG_A>8}ou_>_`!g zE$H8{dsCMf-?&peVY5yRU1C7n_HFR7wQJbbCE_}@=OU(Je5cmba&2G=KYCT(H3LsI zR|pT41pKYU|8FIJStX9Fe)K$f<-IhhQ$4F#9V--@d8WBm#Ov& zrdNr7prkbtO|F()NwBx_8~S?XtmG^!Unq-`0p#L<8dC_h9}{=LOQ(xgc)4w=s5a_I zzBV7xrmfs%wZRw2)(Y6;R&-M(QclS(Q{HVuPuEZBKkKI{HMDZrjP-g1i(y`I8#HzqpJ~a1nAfFefoBN zraoRz*1PLvv2Y9PL7EraeV_ImS0ueTUMVe1{wxp6?Q($}FO%_DCdhWOw8f{_#Z&eKz4n?kZ_wt3H$P;g)kL*`&`Q+^o+c+^Ekd z+^WwYe7NOAN;c`^2{-Fw2{-DK3AgH_2_J4bfs#%7IKs{P7{ZPEB*LxwQ-lwKHommtO>ESFM^KteWdqjos^U(wp=XsvM4&=Z=O8jl(|rdz5X_Z2CuI&^{!qqOYy8$reY{oXjmn+sSXy4_hrpSuI9dEflp5S*g5Z@~AyDbq98nK9F!TON1Iz zf5NSrTEpJd4`z)i7nP(*%_e=L)%J6%EqfqONoo(E=D>cd{12g{!_?&03H zP_{+yOt?w!NVr-4Mz~RLPq-DISsWm}|@n@xHh z!p%}?mW_HX!mZLvsHjtbJ9Lk;7R7RZ(!rhk>a1EdxdWMBJi(p2!lEhn4vUD^qOFJ! z?L|B~zN_eguJ6Siy>iz5yYklky9(Gr^N=xh|E`i)!d97;{CVz0e#=&a@%q;3f~=Yu z+|#-sFUs@!8EX9Ky`9z(f6p&^KXN=~AktV}x?=;BV@0v;i-NRF%j$>ql9oB;Y9&(r zvuVHND({}F{8Fy+M!Cv6<|;3jQ!d(Nm6xJS9b5IUvE{zwsgBqd<7P27OV&?j&`@E& zcvfpGmKiCcyHQ(=b*vR5jjdvY>?I~@6T~8BUs>e5q|sWmmkY%cS~XD{SiT`<%K73+JwtRbs*Bb7EisMNuB%^$7;AhgqK%E*Rlh3c z8NU;E0!_ucj*4QXqZgjSP;uC(Bw85qaiCsNbkN(0Ag!esY!n8y#9IBTNHXe* z5&BKhQ(GdMFzyjX1)fa!RIHMpn{P5pRQh$l?P8TtQ9NrjqCNW=4a5l6(`WTlJXbLZ zI#m!)>zhQZ<2}&`o1+GIF=L3kYiXhdwBAl!&{0_|lOKsiMrkp@NECe>2gOMJnux^q zT5min24e%H`3(}o^(65;x^A*jMojY?MtO6wkaJjO1d0T0KeD)Aw9*=iX~q+r+bg1r z{6(yXr-LY;p^p;t^a)~&W4d_C@v#`-I3vbm!6f=!5JmO-9MjEyGsSjeoOs%Aphz&1 z#Y$-3n!b7(&BY5wFEPTw9e!-a4Mr)(_IiLH(qqLtq!WGNvg@PW>m!T8NkR+u~(Io&O^78hm=$DqANi!sisD z8~OZ#o2}wyzapIH0r9xw9oiKF1t~8>TnheHFt3wO_8TY4`ORUUC(J)pKYs5a-_?=r zg66M&pNcOXuZUNTWg^ya2&dl$k?wd`eCAhKJm=^wUI?ft4*3U&4SJ>+t$UCs#gDf1 z{kABj?-f<8JhJ4sg+BeoqU^rE5wnrM6ysI&u()>$d;*VO1K$bprxTQgPCJa=jEiv? zhmp6|%(Gb5lmyOcka!RK?ghW=BGPeAI317Cwh3)Fp@$;HdcR1~+2Md@N$87s@v{Fj zVw+>Kc)|Z2@s{5h@q*)J=2I$T-687h2Sg3O)uNp7n{YeA#6}}Rq&NbJD~YFxUvcad z<&7!kJ*#hrSkHM^f*(~J3F3VvFO2hDqMM_xc$|4y8(mNZ{XE<_ zOWjH_L0=+z`@bu;7#@-AC?wW6z7+larikh2qX~WmSUb9j;SMP_8w1eCU6I9#qKW@q z^u}HDdE|AlwU%Uv=By_Z^&doi`6pLJ^{79|{4WlD%ZMg^&1@(d1XL1<0W}!EtvhEB zCxTY$96&PY2h=%r2JQ7H#0>QH7UM^;13kD#AB)u>?%mQGioSXm^9B8T^mZcXfnM&0 zPO~l1z`Ch}Pk}=VHBX_7tTj`uo4H}Fmuk)QL9Lf+P5cL_byBU7xgmF(>72uJ z#HYaf+3TZPBXfhbQLT?YSZgEeqjgT|cvMV?jWuNr4c>BKjmg7@% zr#8m?!cj{+W_Zn49r;A0*2&yv)hjzt$uNCo+kVhBugz!Kc}h;P@04s?<5258YrN9S z*4obcO@6&4f66|>CR1~aV;xXyyH!qXt?lZV*cFP7@b<9Pr?NSj_lmD-{mverYDatc zx5FA2GGomrWrJXkT6V0mLzV4`EL(D^*6A#J(V9QDO<2R4L#*+Nhseq*HFqpqlQmw^ z*GKQXv5)?ijgIY(ujW}xpPKli$kCaW5wN4lCKP!>~_9A!KE0&Gn zn`?^4*iMQb%AQd+h)U<3qdq?S=AK#u(er&2eEa$ORy0#KOLpv&_bl7NXG17k2wtTq zx?6IVCssC;q3j%NC(FLUZqGZeJo$(``M>KLAHDu5hK?2u|2dAMKEIC+d1Gkz2|Dr_ z;_dKyVct2OCtoN}K1V0`Z0!FM=bh7*O+FF3M%m{7A@<4E-{J&lj9kNyiaz?QIiqaU zY&!|viQH=zs)-8J1u!4N^yAPaOPVEotuYT~onw+Q!A!EQA=UMmS`(B!WW`F4D4m|IpL6uI($8tW`GQQ^dRfV& zn#ZayTkp=v)~`N2s`Mq-n3hh-ihXm`rw1KFA7tb@4@-97|H8Od&#rxD&HQ+h>bqzm?9U%F`B+1o3s*+ z#)}d;lSH?tU#vUIoiLEDwgrfgsQA8(Nrm`Q($$Ym_n^&OPh zg4RNd_E>+NcZeG9iFUfL$JO8E^7uu&`*lc2i}J|6?ue{>rvxY_lOoch+)=K?#2x0R zB~)v76n*jF`8Ky)&~aOwT+q3D0tfZD7Q`oP=jp7*eR&AAG<69(T*4D)m1?R~6{;pK zl@YBaoY~H^TdIA;jyU0&Y1JB5ftByiSy*LuqYvXS>-+D}?6NSc-L@EYAZj#f47(=I zs-euFEWj?CX}2z$)jEKhFja%YPV%gl8iW0VN-#1m$PpJ17Z|6WCW9BMXgei4xvU73 z;++tgPeyE`PtJhi9dhQjz_eIyZGUbrl<$*5BO^nTzX?FgRjRViJ9O;@n9d!`&!in;{x8pNdINqUko# zE|#-tjnuV|?a+g1sZQUOme$0zEzXEZ>Yt?YO`@3TX<1e7CQZ~d_3hErmF9^{>fe_Z zO%tug70NS&w5IMP*8tQ7rwgq*yVZl%-PKXzyC!bS*B48r)>+9}k7pVD|w`_3Ufi*gO%>2D<@qJyO={;?5VWH)lbQ>*i|uzE^TRE~NpM~1&N&)|o% zL$b5Ys74r!=!&+ic#Ie&YY9=FVG*9>L?thFlO)f~ey%iEn7gi91(uvOr?z=tk0ZLd zXJ-E-&I2uk>`~B)0#`ymq?Znx^-c3h9J?7Y*+=q>g!j3+M2X6H4y{EiDtKmgaP>`e z_3cY3%Rp3w%i|z+4N6kNr4(%kj?Z5Qv^`N$T4(kZYRW`-{L%S?k_Nh?Q0J5-T6DG8 z$I)9MAqgH4k(TC8^GJpm-HgU`ALH?hX{jRqM#Z|52Es&jJXg{{Yu{!J*P@OZUqn-P zR3c5ZXhnBLIP^n574%O-8a=(3ZI0*yX$8|*XJvQ$k_1CneTy9ANdz$T}r>I;exHKY#0w#8a^z zt!Qm36@z3a))TY>j8epNM7M;zafn`o+S}#PSiCHyVej8k?HZ9)lC>KpmZnwfBrAzM zgkXET_Cftr|DF)*FEH8@5DlX}24k?R{nhFC`n1vv+TMpDF3?&-h^+?QNmcVePCJb#Ft+QaHP&F)x{i=G1>Ns6o^ z*#{4f_5{;Poq}Cphe6RE{x~Vdtm(-_f!!dN3Q@QU2&LD1bt9c{<0kY*^{6_;95=yEC=WyR&;#xot88^Vf)QaKso_804yJu`Y%) zA)i)voAi&#YJfzBahi40(t_RglHykC|3e|-gk?^OM6~n61)gcJJ}oUE-=k{+^0v=s z?Vu(i>(oXE8tT1A{z)?~F8$zqE3 z5Sm?}c#5UWR6`%#23b?u?k;a>e8MyiqA0Z=VuX1lu_Go*AwrSPk~t4EBPBM`Ho2xL z*_drjsoAkE*HG-N#u96bg_5)jZ9waQ7)!~eVekx1VrfPXDZP_e3|p#`vWKzx-C-_S zU(~lRgxt2ob!H7Pq7&*z)Jfz@Vu$%l38k+fjm9Dm;?rENumV)2xe9V=;hC$ZqLEeS zw#rz={bI6OsWX@xo0ev`Q&xD0me#s6L{QggLA4`-7*qBY*V@?sRL$blI39hqLkw|G zj8e4NA$q$fVJ(RU#*QsL=YePIZT1HFnzr zF=Dcgoz^q0I~RyiJ4B>9eAakWK7R?N#;pOZQUemgx;YZW-Tx=Eo|z1{o|z1{o|z2K zdS=p~oq9S^-AIwc2aX=eQwR2*Jk7w>7EjKFt0ylt|1|QVV3VNLBFcJFPwnV?AK6Np z8RmHs1+2`&0cB=}C}3X5DYo95&&rzLsT%W&uh#sJl6yy~kluW~%@+VU&xEBp7c zdCP8Vs<*rTN5AaRPE@<)rW-l0-Bot%JIW2;URHgm-72f?(+}moe<+vDgWRS6o3xqr zzS)1;*ZjmhZ~g!eKOps^`K!5}=R1`Aj z(f<8s9#^`@e9t_}mhoslnmmDv3)*LE$+)%WgAue_2o72Mf0U&O{>ReyXuV-HBrD8XaqP03 z(EKqcojYY7{JT7um+cn5H9+O;v^k!$S2{aeL+8wK^WuY#v-YznrjBT;XI5wNRGuF- z!EDl+)fyC1Pv@y82o0W2t}X&aZPxvQJT=%{6c;VoN{BXWB}K=qX9v6T3~F~ax9G_e zguE-uR)(*Atl{a@ZQ@;e+QnAE`l3fgp}yr&i6EdUOc7`|h zYl&akp5(pKYodYpjV(^xV{0fL2$Lr;czaYdkwG$urvUQFe4;sTjfV5YSVdVGCvi1d zL$u?~&|0D+Z@SkJo%nu7J<(Yn&>p<6+e_;uKH}pIeZJ+$$y>lj#Xa8dJt6&gyZ4j~)K2rBZm5>2{VI!S*R*T0nC8{Ivbc6ryCcK3 z-?jTPlJ|K{Sz5iLE2DYywy-Rt7uAc&YP?%pQr6H*>(R1~{fWKvsMA-Lr$uY zc+6fA?D_K_LS_GIS@m|zlSR4msw|9o7KqJP0F58SoXY)UU1A(+v#n-doz86Z1FBrD zDfSyUq1e;b_XvE={*Pkcxc{jWTr*i!cFI~$|Eclc%9ZtRT^(fCsNU4of%@roloi_N z|8W26xq6;;gm(6i)skOP-b_)y;#Qb9P`xTmsHhiig{nl7im-C3y(+PfF0D4IEQb;g zk66{IT0gkQm5h~E&kn0HA8k|%`)Bv+%c=F<9*Zim&m!m8YJXL)%8N6)hkr#GS#J9^@@;|4Otl4JA?DufIhmWzYCiflWm~F^FXwS2M>Z4>a>I8eoHx$hCWmi1xA+4$(HB;1R)%;d=hphwrNk2T}?Q<=b-9JtF*?nn@IUkf(bJ^C50n8qi^I6MpvJG{TK!b0TU=5(wU_#-Ic?8od-kY3e6!ZaRjVPb)L!TiP`A^^p_%DCsLv@~V!nR?Gkkila&n)p~uxk}12by&|Zz z(t$obXxIHys0kedYzBu+rrJZ~Stsm4|z`Iq-1Vf6uA6<9u@=cWd7a%{kNDc2e$^Djkt)CG%a8 zT8|Rrw!$Yq1^k z#&p(}Gn$;$Sgp8fQ{VK=y%oq_y?uMB`RLnxWopgV*w2Uj%;nrre0!9Z_U)e&=bjHa zrS{sU`(eiW1z4&vODwhGUNuOpuwuD+3~ zeo6-#S$a*4Rjn^BjuC{ks(#eZcYbPJ^XUM4jWe?CL!~)`@e8Q_?6>OGo{EMps2WCZ zx}_(TUMxT_1C-#*dPi+-1I=eH?#O>}zAk_9%Uvez?xg+1yqf zS2R%ap?*G1rnnbj@k#MF_j;{bsb3CtRnDf1Z{>1A8O22f)zYUA?N!p2VI?tY1+w>1 z$5$(+zXionC5OyfJymf~?y7&N{yw&T^?TO$t9P&7m3oKk?X5kab|W@X>rWNeJ6!9B zTCHjxuNhS1_Zk;#tgaDLqgeH$)jieMR9{@JYqd62TUBdASi1U}szs`Js;sOsvC3$| z^3~VWJ6w5Fr40H#T;H$a-HJwqQsrlspIl{S`B9J0tJbE>>X=ueQ=^AP4~XvVPIeD+ zmoIgT3dv1zZbQ8_+NC_4b(PVzaiXy`veMQ$+U524`6+6!L5IUNgX;U`-k{E2d$UJlQ%AK_Ta6fKl6zZR z-P#mwd>eFGS>La^#|L_}H>h5HabDDJRIN?UkrY4d%`R7Uit_aiS1s*B)go%E8KgFN z6;oxU;+ERr!d`p4HDWAI@2yeH>KiK9JZ6uW8mpm6j2dy3mGru|QbtxAQ6xd_RVl;Q zORXR3U15*aobh7Cd(Lch^~GU3IpRfYHmd#SwKj zs?Q<`RaW}oYxi&CytK@lx6e9fh$;k;EF$Qe!#a2Ylx57YU3B)E$WCp_=fB8t>^u`q5e7F zca9TB*;?Qw{+Xkm;roK|d|mJcZ)D#UzwVYTHfHRc!Qr7*R*GNEAgiGtoE$9WqF2gTb|)Rm1kH6 zDbKJBR-R!QqCCSgpYjaL{ObFVGE6(H9hC(w|8Q~3KU@O;@EKW3JBOFJwB;o(Yk7&w zSzh8;%S&9|@)B3Jyu>vvFL5or#DVyPgYgyDwS2`*EMIXm%U9gW@)ftSe8p`oUva$U zE1qWgilDJKc!}j7US;`*S6lw!HI{$)8OuNXtmPkm&higGZ~2GUTmIpfE&uSV zmVbDI)}Re*Uwgp61Q4CgnW772-OS~DO(9sUCjBh<2z&t!g5S*jQU}G%nKF{N6letc zf+R59+^-b?1wkQD7(50d%$ZsVP!dD}C#XPqB~S%a12sS`PzTflPk;uXA!rPm0>-Zm zW#8do1Q=&7*Cv2TU<#N9KA_Dm>OKRfNS`J?OPm2NQg533bq5Fn#XvZS0MX`5y$tc= z#5IXKfKDJDbOi~ZJLm~|g8{S~1crcNAQ_AVqrhnD$Aa--BKgV0TfsKcJBdFAyM;^N z1NMS%pm{!V*W4-o;NBMBz?FgKH_~PPB~DJIK=Y;?VYbn$nLp~Q zX#1Gx$$iXg;8A;5H}6xFeG|};d~f1W<}IzX zd0UGHtH3AV95`=!wM^n$=55^oAt2QBGCr?ffpjHM1*Cz+U@15bPH^l%iwb$^mxp%h zZXb6xdx2dbFWtgRhDaL$?F`r_*d~e%4#duFK-cyY86yrR_I8RwL zO(R|mmIAoOcuz6jQ_Q{QtYIxcOVAp00jt5Y;3Mz_I0&w?lHJ5cz01=QzmfmL{Eaol z`d+fclOqjLOyXZ)%?N?x=VT+|7Uplr&3V4^UrhETp9F@35tNM*#k2wBi-B+u0m^`C z=5KmU;trq_hzDIk0_YBUg5F>>7z@UO$zT=xZ6)3bK86ONP^BB%eBV?*Ra&*c+M$u;N6l@_2SXhm6T;?Br-7vk=; z>Sbv}4;s;fM)a`m2aDarpPQS}j(gCK9&y76D7lO9ERDlf&%1@plIuu$aFf|wn_AOz$C`2n*- z3j+mA51QAb6#|99V<3WgS^|^=k-!N`i(oAplwqI8K`f|1+e)Acs0M0)TA&W72c7^8 zKts?NGzHKMZF~Z4d;)EJLR&?jA5gZ7^e3c0BTlF9Qq8-U_q+0ISC9a@gPx!_7{D9W)a@kx7#yb@?J5$HIxkY^Me4jroEM49MB==xySscIMQtzC&V<@tsO`mP;K%A1 z%&M0P=7RZP0a$3>VJ*AET6TxE><%`4M>J|D5Dz{DzXGLWyu>$vdOqbgxC8F;9MbQ^ ze-Qsk{1>>#(|Kz3A&FHlWGtu&>Y7(&ec~rU3(~DXXVP6jH_#J|Ft2KO*tLFO02l-Y zgAc*a;0(9`t^kf_-E4>=c7tl>RlNrBD&nV!-vkH17Ysy0Cmlp$uJL4xA5ZWFgYKMd zFR%;TW!z(VsTYu_E#zB{aacUb%Gu=d?y?YqO;rzpuY z7T|aDChOoG*1Xu6_A`&j0p_oaYCW=Z1e?+iD@J|;E<>jb*@3!_?9+?5A8iJJL8Oz3N3d@S=~2{Q2Rw-@Zvc+V*TO>OZE#0~ z!tIM%3~^ad4ooLM6U+uH!D_IM@(sjq5WhqGuE>uBT-3hC#`uP^lcay5>?ZMFA`~iK zL>eyY`T1^X0rG`F3DV_Rn=69Kpej;Q&AiOl2}AWdpdNSvGyn}jW6%^d2Q5Ks&=xGD z-$h^vSPoXw&no&^M|uF9aa5`G|`W7pE+OxFm3bC{Ty8 zhQv*Yo115m^fO5MS$J^sF!1bEXAo(wR5M$*INF!o6%KT=VVJl7yddl=Fl zhO~zv?O{lJ7}6eww1>&N=4DL)2{fPs0|c6G#1m< z^^}J0IbqD4FlJ5|GbfCh z6UNL5W9Ec0bHbQ8VS0b|9S8=4p%i^n>7A%8r5W;QO#F-FS&PauW%<^pMrplX;>nKcy#?jyy@5pRqU2B1uX&DvR(M zZ60kAers8TK5J0vOqxq&2^L4!DQmDAQc#_FrmR9+e}0{988)V_33awEReJRD->k%5 zwCPQoe)Km0E7I1Z-y$8C9%(&3tSc|U`Acy75?sE-e7y;$FIg7m*XA`_M^fgqHqSGM zeHQ0U+WD+boz*57Mf>W17XE?R{A?|d?n(7610h>#^;nHq6bI{_09o9$Er1;RRB`mt^XA`i z)6!&*;ACDdD$C+gob++gwlpkjI?LMlzt1_}JX2iD(PlZEQe5)Qwf|cjTFksV#FfDz zwAoSS-SI5j>=@U+M?@zO54y9qa4m{HV zScCYVWyCkYEpQv$0e6|dzZ3rn{sIrUP7%NX0*?-m1fHg_i z!Q!lI?&Dhd2-nI-ESsSbOSwsvK4#NrXT$(jW~dHDVg>on4hWU zA+BZ)aW!*@tC>Sw%^YH#I>vSO5v??Kcr<|fTyG!Ydix01+effej-oM-qA`y$FOQ)$ zm3@DVxp|Dac`VDuJjQkT5i}|GJzkTOv{km|&y<}3=O{m~v?}QxNcyN2b;&xwp1t-FL*w=1})1)IF7( zNW*Q>8*5$NSGmT@9}cyvTULUy0+c@{=l;nWtnRhoIgoQN<>n*qrKr{VCTH>=@1^J` zIc`2{6dcJqdhR2y;pl6@bKtyX2iUzTdnrGAU1i)?+3PA2xrs4fMYCUJ%vZHFU@dqK zoQHy;pd>g+TS@C5_%9ynIV*K{zd2SHSCj%v2(LVMNQgW0K6Dr29IyOke5IH1m0r&B z%3l@x&}j$g;S0*J|HL8o{S9jhTUr*wr=Yy?k)%rjY-aqYm+_xo#(#PluX~7`3+96b zU?F!i3Sa{l1cg9h@EC}|4^aY?1d+fAe4h0R)K>ykKsCTM3%=FM_*O6DTfMA30U7|V zC-ALa#9PUi8a)5NYK_FGd^=xURtmdj%itW&LsDhrQ>Q@yA}qAA1>p>}CA1m-PhD z9rOgf!2tFd1crcNAQ_AV_+{|NUe?Eg@n9nP$;7$6;akaXqkJdv$H3Tft87G3QyIb!I*5%zA-$KqPXF!rf{#$bRuW>0QKo zq3J$ocmP@+GF{?Jt|P*^YoCe_Yc7}%7J!B3dJP|{76nQHHz>{B^Jp-a^n9=oECNfw zGO&uekBC1Z-b=g>oFknHZh_nMc?bM%u1DAIN6+p@1MNqT?nj62*Qav*fNw#^x1i%& z&{M%YumGe{zZfh9?~y-Fe1h{qPnah;YmCj z%JxD9B_{`vHs3v#L%iYqC2bB{a%10b3Fmvq|8TDb%AJIAC!yR)D0dRdokV{Ae*eYA zYJ`UvYF>w$*P&)Q)J*?h--DS;AM?RNum~&x%fKr7RQF^)BK-;Jy~O)~x;LZl%bcT3 z-J8iIz6EYG-aFuTpzhZgW;*g|-?IrJo%_Cxx@S{?vPz%|_&4`%a^Ig(_hzQDnob8Z z!EBHU=79wujXoEHr9j=od5^NJdpK}B9ge4qop3sxnV-(gPiN+*3!WyxhPuV7Z~{B( z7MdU(&YyzwXW{%=IG>JINM{b5g7fKc{w()xuL*1iY^+;IL8kbO`LZ9WH~`nbpv^&W z2=DKg>~q-sT6~4g_BHQ>|4Mr=xB+f~+d#du{2T3mC;k)s1s?E(18+5>b<(lBZn5HU z{}bTm@B7S1aFsC&CE zo=r9j&i&rG^gkag1dG5Duner?cptFuhqV8QymddAvc06$J>h-C zr>MsdY26n-LwuI}Iof0pUm$-4@RbLo^elGTEu=FYTkRGSdKL*yM}wxLL(U?h>1fe( zv}ihZ+AZv~TUqyp(^=iPH%yyKpbDr#T}|3`0G&WQ=n4`5ngT7Gj+RaTFZX-X(ZK0w z;PkBfz3E8xDWv)oQhf@kK7~}DLaI+8)u)i^vq<$>r1~uPg>LC@g01YU?gzg|{Z7&! zg9DU*0glt|1Tv~2fy#E;!>YIsiwduw87T^aX!9$v9lQ%Z#}>?IekJFbkunV|17|81w?y$$P;Kz?~UJn864$7-5E{ zt`TC0%Yt%1T?eRZ0Pf0Y>N?;JV*6U)sP;bjZ^-||HGs15|KiS#vg7#<2xpVQ*{FL| zM>(Sm&M1R3%HWJLIHL^CD1$S~;EXajqYTa{gEPwDj4~`+UfJ==hF3QGCUtJ23|b== zR0B1@9KaO{zUPbL9k9dPYpt-yxWWnmML`5837jAbGz7!IU9Lv>dW$B32Dl@EpZDVb z!`XL$M^)v0&$;)`OnRSm5|T+Fy-a4(lS%Kr7t(uyWYS3jiS*ukSFoZY3SwCsh!w@Q zmQ{Dx!iy5oHEUVO+UrPh-W?Sgon(J?JX~ zfE~aIumIo+fIMQg(^%~^Ry&Q=PGhyxSnV`cJB`&&W3|&*?KD<9jnz(LwbNMbG*&x} z)lOrz(^%~^Ry&Q=PGhyxSnV`cJB`&&W3|&*?KD<9jnz(LwbNMbG*&x})lOrz(^%~^ zRy&Q=PGhyxSnV`cJB`&&W3|&*?KD<9jhbcYY`3Utc9W=E`@Cq39~VvH+=(@_exmiW zS)gq_EXP(@4s+23{u-=>tLPQ}YshJ;=uQ4R(PdsMdW-)U^_)V~bHt)=acal)*$mNl zJdc`=HDtLBbsaNU2Zd;M)*AI4DPiDqN@vZ8;jATbo{d3NehRf78EQQ-sP&k^^X)*r zCxc|pnvm?-c#^~agOsB#Sj&G;8fQaD^K30?pEW}LM+^@+7&V3uL<`{+%~koQVFPLO zIE~S1b$=Qj%O6$sr(q+ep|@$|I1N2ab?-EE?=*8~Reu^fcN#i%8aj0vI&~WQZ5sM* z8v2duu4(A5Y1E0BZp202=_C09ycW%ucbRfN{XP_&ote z{()$~Vs;hu-YV!goN)oz0@#Z8q(Yz8bEs$0NbePRaWu;N4tYlUI|q0KQ?R^Kh~-4E zlv9Y+rkDi)7l13E9nc9tWC05`1Ou=uMg5NL&KVb@f!4&+0Dfk6b@C&Bk7fit~n1Ww0 z1;1blc76(WehPMe3U+=9c76(WehPMe3U+=9c76(WehPMe3U+=9c76(WehT(_3O0EP zc6bUlcnbD*3U+o1c6JIjb_zCj3O06%^#-T_`G7(|F`yJs4yXiF18M*oKtEs*unh1p z;Az0KSQi8Q&^q^NJf{rw1@$bTMQlU~i0y8V_-V9HBmH_*>UQBe7v;}I^>Y#Z{~pO( zfch4QxVQ14=#k{N8t+12%Yf_c=0_! zN^d|)Z$L_KKuT{wN^d|)Z$L_KKuT{wN^d|)Z$L_KKuT{wN^d|)Z$L_KKuT{wN^d{{ zs?arX9_MCVhJ|zz8NuFDTAHC}g3>b+a#@O;PC2fWj@_tskHK4*M4Y;27SBe2hjV`R zis)HN65cMLqCJpGSY(kC)-HWt7i+v>Y zBn$MmV$RnwU%G=+$C;LR=L=y4p&}0JDV;rwmA@kD=Fek2i?E&?tY-_>a~!jJ1haY# zmSQ>9(26yz#TuG1yCaxg2WHoY+10>OoP?z?#|*!Mr8oxN)elQCf!Uscr5J~$*a=H9 z0ZTEWw-n>hDl4Gh_JN|Gz*0=YQtX4J7{}@!hov}%6^>zr2e85}tnezSo$UnGcYx{- z!%~dGQkY}4+lAFG5JiB8(3=L2?TYAKy#6yfPaTk_L)RxsL6@fC>=kA?t`mT}06XyS zU4RpS#{uU6pWyu;XRoj z3?qMlkw3u5v?u8UjQjyc{tP33fRR7I$T%MeI%x;q+XXlQcpPvJ@CiPf!e=)CKLCD& zPtC%AGsYEh31;#cX7U+k@&RV@8D{bUX7Uwg@)i3b#y5cWHUssJf?_|xTm2lA`WlqE zAJljq*!vRxch&3(Xs9Z1>v?1yUY~se6#EcVdI}W!1{661io6So(Ec7u0m@rn0qbu9 z>u&eWgln)i*I{kYqb9O}#X+AMu64N91JL&gJ8TO( zYzsSV3p;EJPrekMd?`HnQt~5U8t_lRPqU?r(d_4pF~9_13NQnh11tcRsH|B5tN}Iv z8Q_olR2L%O=>~8I$N}gxU_1d{xW6~v0_(*EM)t z*AT&!q7(XaSdi<8cBvJ)&Kdzs@Y-^=6y4CDBdRGyNA%~g%-3O=ufsB5XLWtG*IC+E z3yTI1?HW8ZYHh9~`YALQfE+@NZP( zL#h%`aj8dLD+d~jA(p5YAl`!f%Fz#44r#8!FAm^-=b2Ddc1(5Yo$olKJ*JscSKSJgQAoH)|j(N}yo1kH=k&U$%ML{B?VXSUoC8eZ{TqNE06&UsSv)})PieKq)0l1XbY@$2GvFuyR+9Yy@FDIC zO$J}f82a}k=-iK>b3cN<{RsN@Bk0GM)`%P#HV5F z%|+H~Lxz!>8f!$1M&#%B*;_%uA%vB)Y?w+BYAdsm$lblj0%@nz*vHe;*Voh2M|}F$ zRnGC|UiaW&H}{|*+;1xvMgAtC``S_CdEAgS#zTG;mqUX?tYxg+TInYI{ijU1&|KQf_H2 zlPgJ>mzQ@SqYP64T`r7F9u~;R-6ay4jjgR6{%s=x0`a-R#)VOYs#HuvLrnuIiCC=} zd}wj~nc>AdTU33XY3<3iW6`0jmkmBp-TL%+{=wy${gI1%BWhNsNw)Am6Qh6a|K%5w zkkMV?>(h34XzE1a%{ z&Rwa*V(H?@fAJk_;!Tz$j1(3QB_<3N7LFt?_R5Qi%J%ZgiH^$kX7Un;3yOvl6Nc$W zHJ*9V(K()8IWdvBUN34}(wO~RR!-5n!oqb$IR*4`Bu7~v8(Xi;Q8mQIHq2z?7SeYM zb(dqgO1xXI%8jgxj;>>KZfyzSGzi2+h|su=z(AtNLv16s5}CUbiDPiEpQUBAwMOd5 zV)3DVp+TXcL6&xurr}s)n6N^DeBh-y$^sprq*Q7Kic)06QHtUX;eSYo7sUt}`Zy-1 zwj!ZCz%wP7*|SOeR%%;h?v~o>RjJD2z*~9Q4oU0V%I}%T?sQKMH4qzQzR|Ptxz^NS z*79^vcV^ns*p}GfwxuyMmzZZucWlgT*UKs!!Q!5cN}8{=3yWz;kLF` zR%9w?`R;V**x~x9n8v|q=k(pnbC?|S*Z7C{>1P6SgPyoWR2YD$Zap598~7amJx@R6S4?{3do5`*pT1BR%}46>YuzCu$PHzf1LD9-fH(6L(I~2o`6h__c%q9u*dss4|qf zDXFxxKh0D!h6BvizCLp0)~B2YU2`n*HWt`1j5bUsc6dyK_65ISLupLsQNuB{E<*a7_i(6JNwBFAi!G3kwsOSi`!y zGW3VA5`K_uN)Qkb^w29WsA#IIsYIJGQo{ai=6>>Aaf5%t@~WD3nf*=At{Q#3-aor8 zj9=Z>R>Lf4-aj5&wkErDU&F|&LyI37O<1$~u6RD2@(s->J&VzuVdZ_*wocA2u3&-% z3#=4DK|ZD$Q&U4=7BdMAqFRQUF4zyOM^L7JG#$BIrWDMGjsjH4=v6QMHks74Z%U0B zuP<4h+u!-j;P4ZT%JxI8laqt@b%w_G9;hrjG?p=tzrCh*T}J8t7S<_yBDZXHR{EOi z!E-G&PfRARXp6Tih-zJz+jy`uJgn_dYxSnQv<;2zE92;DQelNn!9UanFHoDYQmKSt z#D*psV=>ezG^JH!5Vd}kLx53*lu*KOrZbVuK>Zp%j%n#9AGW2kw|>>SvL92UODS{$ zIQk4Peds;C4GozE4i46)8Zo20ryei3r?<76%#GEXQT_V871U}{+6h*b1Xm|Ar?lsT zA5JcFSEXvdE1G()Wh34hb1g~q`Up}%Jh)t zy)E@?l0)k^SLUp2R7KF4-G!N55kG^oC7jfzX8!i>?*2H`N8_)T1nO*1X;8=n&X)-W ze10la#32dP!VAIzaSyXnsaP`$iwV8+1ix@F4VA59bjuKo#R(M zM_SK+u9K$Uf6iX%zqoAlVqZf4;hM3F{R2hYtE#sa6l|-h-cnf5@kDRm6K!ozXf$Wr z`!gpC3Rk43PZSoe$RsOQpIyB8?CR2OZBfmq`xkG_&E2@TZe42XI@Ye^zS`RRI#!&n zu0FlIWMyXRU6rL1DJc`cODlGtoyF=RC?!P^wr*|_CVpZ~gdR6~N_q;Mq+=y&$91d~ z9zI7vowB2b(2SMKiQInItAk;ICH*O>OLKj^GP~0A#wvoDsQBK!<#jt6LnGP`)Gs;F zsq`$}@$oK)+Uk2hn|xFA=s>i(XM29;rX>jp9ivgC>f}U5!G=d`+Rty!FFpAFMBn7p zrJV&x0*NM|;{&(|oKs@;Jw0#A3Vjd<@O~UDiW}bd#yelL2S95JLZvfb^c7pm#ekNG zBGe{?l}bb$oCqBI0aGjJ6>D&Sk`Sqq9AVDS++-!%j67Jfll%*lWHg_c@_&-%lV!Nq zE^?eb&fYKBJF~MAsTIpuh~gFTbCw9=%^t^-vP}W^cXjd2U0wLqxafb_T^ydcff>lu z#$p2whaM8?Z4)3EUPef`jIgmjCe10|VRf?V8ZlKsg zoXP^45#r(DYpk)fG_@6+GO92w71a33ol~|lsXsxMlYBFBDc)@}gpI{hnsv&|D_yZL$=n60n zoc(ZX1uM~Wmr7?i8L7mIz5`!N7Z5PvDl57c7sg6F_gy>v&*M0(k$PfO@ko}i{^jdx zW2#~tq=5}V5{IA&+ql{!PfqGxyZ?iYBkw#ko+*(AwjO?aqUipp1#uTjwp>3u6d{oo zY`XB{mfhby+M}2;G%)i?3G&EHkFyQ3OD=1UNNS9?GcZ(SH}u5Tc7-M^sEiM9EskVJ z&7Tg{1eT3vGm+X?@*6@elSl5U*~?$rke;*i3V-v!Zk~U8SDv3ozJEZ`(JzVnsr!lB zHz&&r4}Q*H)#j|I33W~xs*Ej}DDzhjo@j1;WJ7&uf?tw*NK`+b+J${TBJMD>7v&#Q zk&oJjlS++DO(h~@6BEXOWndEwbXtg7%E(CIRfkomHN<(|3c`XhnIYbHjA2X3-Mp`) zgyG)Q`iRSK-Y-OX<>fc?8K$$7%F7cNEgYjcK;L032OlrS+nacKnVFa~8fPabGhr-B zIyxH0(uH+y-flF~p~}t;*3C`O@L)F9Eqwk1dAOTCv|~2%cQGWhaZ_gcwr>8*VY0jJ zWM6F7hT43-DUQ@MZpltu-|+)O3hk;lWG{J{dA2=nS!LBo^v$Qmr~PZTHCAk|GSRwp zWUQ+xT$R)AWz=-AYW0(~&}gWqaifqAZ%CSvgUo`}c!VuN-*4yW-w& zw|%?y+R2Kp_YRNWQ<$;-g`uhbmp0{O-!q5B0btP)=PW@^8A2AAnVY*XngtYnR7iDE zqnjQ*f_6nTPSHj!BlQp%AO12Sp*!B~O&EEwoqwJrOuT=nxcKmg{EFd@iR;H+UH0PI zw2smf-|T#O$2TWRb@4j5gi?^h*fdV3SpoPD#zsaGb2BNUVHt@)KbS0memXDD8lwrm z3HXHLv|{-%^ABwk^Rw2dqoYHdN?j6de`hDNsiOmTrS})j-yf?(G{+bj8-o)CMif>D z-T=05yD#w{W^Ul7H?{$bG*3g#mVX&rDAtQQRVs?fSNE|{lMk63n$gSw4 z4Y;Ftq}Hwj^`KbO?9nSe-}Cu>1_O^Y!-X zXScL(PR%`}U(Io0bgD_5)fN(|vDm~w!f>FS(VQ01`Py_TP#)IA8pmycc>Jv6_u+XS z)6G!)A$|+xCbAGDM`|WEHqe-GBA}dx1Uk+|*b3FApc)QHCko8=<6-ho^3P%IOV!%L z9i~IvQyoK?s{J zvE&{enfY~im^Gq5=RUdRg*2WQ_X*ZH39h{xTq^_Lf=b>JXG>Nip~{9z0Pb;{i>otP z?7R~-=S6XMXKr|DWca1cSy>xj8Xmc@F>^@Ov9FUi7FSJ8|Wqkw=i1LJFS@;BtZ5Ud3NjDy#-rpe0V>G ztm)jGo_Am=|LicE${(K~wc^taFKleRzei@-QL(MCaeLm)r%z8xB%cR zQsk;OH}W!9g@pJSYV2)n%muG42-BcpF6BD}Y~IKq=z|Bu+|-+)X;Bx(&V`-F=UiHp zeZsSNYkTX7f!L&F_cw2Qr*F9M;L@dgvptJ9H7~ipFD7;Qsg|lIc2y3i^lnJ)I8;hn zV-{y6EOgDNn=CEf*rXbGd8Bq%Y34{qSb1i`0@vJ@HRTnX8^c07PWD%?$dMRHNxbcJ|uPv+jI?j}_XwxRhPwI zs{Zwt%v$~g_t`&}@h59x!`&;Z`ODelE-sLN@zz$1`6=H||8gF}4Bq9JbG;-Ue1elv zxGv1WSmdZSlX6CcLrs8UY;H+HzK-fWIwt=Ah>Vf3EqpwAdn-T04{jk>_&C_=15Arn zp^*F1T|i?rZ=|nQ+M7NLYh86Beouf^b{Vk(?s?$f1qAY?!wN=C85# zGyU3684n!f0}jCXEL;fg!wSAAxS2CCF*Ic~Nd3Vo3e%*Hji3ee86<*azd}wui;$Ue zcEil>Y_=muF|!M5pZo6S1GVA;fm4n_2Ye)%0FRkHf#3^KT97`GAcG#3xml8rE?(qc zl}xn#%f3x|9&1t}Z}&IdT+Yz80GhWGV-d^}?JF84a$FMdulK0*8RE`~`a6p`dU}KY z&Zw}!VNh7&NJIXWixT^`U(?$pv_6*4e9U}+JL_UbLjz=VL}CUx$N0;kf`1JbV5#Y0 z;aroWf9)am*^m9zHka6mL$voZA8LJ=@)cSijBPZ#5Bs|*<_z#mbRlO+1%*wSd0EI< zwsP0VlgL4{BBL|x1oWpPGNIrr_SfgTk(=hRO9%65g*UK^%SBg76nt`-pTCQ@OH`D( zcZjjZ-oZ#?C^nZ0wo#vnP*@5!%+qpCd3evM6UdmIOz!1nZ72A=dWl0G8}XMuWx{??q?F$ysoryS3&IHsqUAUsGN3X zWJ4^8?W+t+-!rKFCSusj)T4|1PmNoAd4#$~k=mb>65LW2p0%MSXGK*AUF|-s=uNDf zgNID5h?$$MRO4rCtl^AMfuQz;u7z58OR0R`jCfn>a!1lRJ1VuL!C@S;Z@{3N4GU}B zR$aBRKH9`ArhZ-d;vJ1)gKlX(xp_Sq{zewLD{HftrnyT*H{X4i30IC^+K>^`y}OdQ z)gJDNO+}3$_cX)XB-5pCFZsV4Uvq!T_N3z`Avz8Spd&;_wm1S*w zVK8&>g^gL24~;DzkB{%$SD9J4U!$ftLsf=7dK=D6-8jzH7+8~Ph=4M|j9@;HKsicH zI-kSNQXd`91vufBy3m^S>+jY^t6H{KR<5m!F*A;C*icomtwl8;&sdsWH<@c??3dA# zpVN~ee^(rM6V*iJU9YZ7iS0d9%m1}lyV}ZQ4LdKuGoSoXSn%$!_)QZBpU8XHQ;Qmy)#NY;R$kb^XDrh$Tl` zvls8}j!H;P2+E`N)?}ECtrD5Y68asP7#o>HV=5sU0-n?Jo15HHm*v)_5ny=jFfCHs zpT2gnOPsTTU9f9RdEgJ)pSTy6?8`GSY>`SL+OpO(Hd6ZV1?*9*+Zs9BIM@&KU{7OB zl%rH*CNbBDB>FKZSN~@BXkAChYFqvn1XFZ1ogIr^J?I-3wytH(MGIMAxwdgy+J|Ti{X)dyOQfkUd z^h3Qxk%pV!k+^aiu=e%z@bmNV^u-!4p_U#Y4+@gIp|mbyW*^|Q2=%!v;r+q)Fa-@{ zP68F)n$s-05Ne(Tx8MBkf!M(^dzCF?5ojBh;bn~)zMmgz_!uaqaYLGsVH0N^v!S*da~>y5CW40bEMlz>OTNMkw;u zmOfTYpu4-BF^~#b)RWMXW^nLFcLN3c?}YS}>htw_+M2P%aIn`hLLAw;y*hKaG_XHz zNk+*)hMYN)D~@j2R+%?e>OT;>BqO6M!;`I=Imt!wUIM-SslVGQD&W&o zpFEaIbsiJgNkdv#Yq>1FE7P0x^(me#m-(@4XGXXvgQYAN*}OW}qW#>4Y$+s@_Q-c) z93^z6v6ILw)W=w3XQt;PeRM~gUjDb}PG1s(A0|}q(DU+3z+iXL%F3Y7npK5^_f_`C zYKlv`LTsbj3x^KpD;qYHOrEJ85SOipFYb#b76JL`3mw8!Yt^ys1p!6dtHT@PR3!oO zh>##hdGSDL(vm#C%ALg}wVsMHV1@1g2oUFil0s}|1g7U0fpFBXfj)rUgZHI#5p~&j z%#3m7$+i9Q@~_?3nK@b>Jm8@&3L4!Kdy`e)xo11UWqDofMardodbLRAHA3qx}{ON)QWDLxsU~{_uP(NM0rh!~B{O9M+Ly zRl=|CXD?CvF%#a4TVTeCXvylr%ehz(T`*E(ktJ&*K`xFMNi;Mh6mG4H2nChyX|0f= z{|m0QE+`bjLvQlfPlbWAg)e;QSHyq9e(}x_|4H$;KSmewxBO?=xW7{MIP<4p@aF}( zJX~MrXV~h`sivnVp{&3x?uZ5@hz92t_4{b>4Pr*jHt-LUrgi+6{8#Hq6aOHzUN(6` z`7D6rm?dS7pig^qXmXWM$XPw)~Nplg`y&Y{Em=YK?w=Tb<~lRp|mGU zrLvX^{wGo_N}BqiElNza<5+9b_90Dk)P~&)hBtr>vxl}P1vX1!^L^i5_hrq2s-lep zU$#HF@z?tbyw{&=|9f7ax~S?v-QTPBEumC9!~aO^^-<}3Hwmm2v2Q^qNuuOA%-0I@ zO~ibyk;8CO8@nJq@9K&u2S2C9F(D&GXKWoVlmmc$84b^9bp;lhy3D8@%iMLVv2k3s zAriA3+>z|x80lQt6qvkYP}3Z_LHu35*TyH?zs&86&n@3q^JUe6o?j0YELgIy>hE=X zD{?mt{=NO&dJMUh+{YbdWg=HP7ZW_^MKa+mv9Le@PCNJiH)c&<;oXL?&=(Rg}Hg)$<~kI|-#)~Pa6BO_ETnIv^=u`(w) zS`~#1JA>}3eZ&V^llD}aJWixYm<0uW_7;tT71k)0BQV8sQP?{v>6DuIczXC#KaAhU zIo`S|Zb2WVyL(_Demyj6%swji!Ye5vN>8;FLp(j*SZAq5${84#NGxfk{xYp4pd(SZ z=zJcUvk(8jBeKx2an=cX3nXGO zakUj|OiWD~Mrh*^Dn)boTQ}OTNx|Bd_E9k2a9MRNIdgeJ&S<8By^nuNdx&Y`pR{2@ zf;H~mmc*w1;hw=0Wkcx$shNH14#ug2EYvo(9r5utD(wqnj%>Kl*6?Uw^H^l|F1U^8 zfc#oq$NdBR=?%>qgl9U3i_FfNJBZ~%yMs`SnR9{k9*~Y5erxLxd|T?@dWYKyz+|s_ zw6XD#)md4qA8BlSbX9im;(I4=hK_=^EN--x%#UIYil3;YW3=`9;&N*=qu(=Z&kc?>%v>**l~zg>?XW| z-bTKQcCZTEK%Z1469uSkjltAXE1Ar|jApAWZA>(Vmh&Atlrezpw`f17&iV-zvEOV4 z_=FwT75B*?X;{P874vV9Cc|RBju%SqeA@g(|Y2tO>p_K zd98paVm(1<0ZA19+2=_15IC}yf_@kt9_DdkF#ELDi1``6Y2__BTI&zOZW|Z1brCXz zV!y@8kYIB+lf2{wHkN`ZRS2pY8V$wQ|1)>YLTUV4E;(Fpc5nMVv#n}HvS;b`uKELA z5pn(ZG;MsPqd#j$XV112*X(ue?I(I;B06^Q)q_!Pg*$qh4t7Sw_ut)E_Q1M=f%x|2 zac$eO7UryJX*t;+r)t`=DnGI@Mpcv?=jN=g7%MASSrgjy!p5py70H_9h{A-Zg)WKZ z%PUfrVx_5-BS&`+Iph*kMPl$GPPO6@)NLiZa zOYyovEN8w(Po6QV9>^OS8k)|)4nxLA| z{|$i@^7i^3V9$RO7b}&AB9ybWLZ_#Mle>F(G3;#PL))776c+Aj-gc_7r#-7prE1G+ zUpn(r{i!b|C%-sVPp=bSJX~M8^a3F}cM|5pk|h^-e&slX>YVoPH~!;nbMx7MY~1wy6HQG|e81@^v3R4m_YMAsqeuB4E^9QG(TE95 z9%LS8-o<+Du>05XY>19QGU zjMeFFm4eB4OAIZnZA)EVlC4pjn0DDZkwZyUfvLGc)v?xQ>W28<;nWRH>|#RljhNun~5QtjmGWWSJu7AEFCrlv||k%_r^Mv=89K0_crZR!(fPtEnXzJf&L-t#Sr zatt(IP;!^Zfst_V1u!IJV5u?xub3kLJLYpmiNd=w?`Q)d4eQc_D%7l$wKOzzvDn&y z43rUkivoubfkS2~hg@9399S$*3W-c{)7r4<;Y*5CC9&30 zBSR+nu9^U^Bs&YoI$Qsu%=rI?VTfqGIG(v8J`P;p(T&So(LN$thLDt4xGSBZ^HM7aOw<~zKk6%Fb;46q1l?$la#n55&z>wWo2SQS!rTI7593I zCMijilH8k^*qfYKUY?jzS&7lhq3IvvrUjZCi>#hBX7D_FBf9S)2o%x>GD2Yk0S)`u z%zfm$PI7kUM>ejt71u!a-CO;wI9{HJa+w3ni1=xArCLAc%z*bFH?|gN?MP=VSOcM> z3RAqT7nYU_nGx+b#4IqvAuGM8xHVz8D7PmrFfZg~=Ew4E;uM?}=M4WQQl}Bcsf>s$@63Xvs+N?&^ql^LSWSLqWz|qj+OpiFs2*(|@x$WliR~#kK1)(Nk5kKC|7gJSC~z&#wZK=Fb^5G#@N4KiJ&R zbf~=i&?}88JqZatDUHeWLVGg%M0c|e>|@Z!J7G(tWG9Ig(f4~1M|+DO5qXmfI6+|_ zuDggBHApGB#Na$ne4`29$P&J>OY|u|q2IiUZ%WBa47M2H8-w`94)IgMZ#N3xxI~}$ zfN#7k@@MvANT|Fh1YS+ z?QsSSGM+OxsBD!+Zy5mVdsk^(m_jrlABYu&mF*+iVbN2M`WgabQE00k$EGsJ+ zQpaiX296h3-LI)Tv^w51vxKaii%cZ2s3OUeLN$>-z1#wO+w4UlYI~8Loq^QGT8jS| zQ`Vl*pf|xx*MlRpP|${eAOv8yck@}(Vg%J=s1OPYiN4;hwcgA|6l7{O;wo){ebhiC zQX^-W1KL7y&dtYB!%fp@_};cQaXKwGYnQdQGHXzL1mSV0Z_v^x zlwG(tv18Hoa4LuSI454~mBW0}md`pB%v@z13ueBivCH`EDeiIc7kK3a4Tg*t_|r&^ zHdOS1&}s^%P5o$8sjc-%%G>ruz}3|4i$Eq-*cZV)K2zSrK2Vam@#09`J*yUnW^cYY zRDWV+Rmh-6O7mU0b^AIaJyV+}a~k${gp0rU*Xt6MHtE3rUr*P>_MLot^uYdK9;2_W z@Kc9cA6Zu)lDp%r$wO_AuCEKt-T5|FdIph}u@Db9ATw`fZf3?ha4<)-Uw}@R_A*j{ zs6gvj&lzs{?F}<$1_r`O$JUF@%@?=w50j$)Es2R+`uW#{#-PcrXNHHK?QE^yl9juy z8q&La_Bv-GF+}$SGAwc@l>svD21MgT6JQum=QYAdm@CafJ5XfIZ62GiN&r(d0WGL; zx`oWJKe&8(ZpF@Wd7wO{xjDJ%c$HF9Cm8H#29u@7F}DHT$b-ceaLU&6wpeWAz#R`M!$^Cn`F2 zC;}X-);`HNl#eIGwI`aU4weU(J~+XfkfROBOB3U2!hGUW7oZZBnzN-gcf2A<+n2lb zr9Rcr%iHpZdgN4RbK}D5-4#j0hpJTNhXxYU11p?j{lRDGWMsdV_=&>MQ}3WQRxPx( zCB7!cnh2WN5w-~kwHD-c5Qpl^3A*|M41`o4OY0UaKR>(T1irTZ%D zj`yphyZ2VNpXmzr&KoJr8_HeeS2&WJ)Sa`a`ozbKIqw-l{vv*bgd zE9$pdKj~nNU9K$6&V6<%)Z)^dCv;mtg^DTCGhkepRrbf33bN7H+sn_-%iDME%KU3+ zh@|VcTxrE~MiXOH&-SxlbI;+`TsIk-#!yGV6OM(%xvn)zr$^>1r1O~j_d*Q2Uc0M; z>C&Q+`o5O7`)EPtzSdS;`~6GD3k#N)`1_YGFDw`@_2Ztqc}|?E&09G5%Fcpgdsmg=I%a)6++fVs?k%%UlsW9y(9dcKwVN%A^`2W1$?XE6eCitGIdoMBh%2_uC#2FJ0zlC>!inK zyk#S=?JS5{x~GCzHyrDa&)NRQPFd~oWyw*CyOsQl5iPj^XgY_lMfYwdVWzsy3I(*C zxvoz@5qevv0Ih-2PSXFfS3s~izx4}jXh6jo6`JZl?iXO|wJ+*=2CQVu-`JiL-+!!u z|D}3=Z(PC7*S5%N?jBCgTbWB#%I?Kc$;*y2uT%e6@Uan*PlrhXJG+JU4*Y@s@w+M&l7NZZyS!S;B zLVbFkJi0z0N+Jb2pJe>~u-Ipbgaf(`%=_DHd_o&{)j`Aqk|!z_suq}7B-pC57ReK< zBC5u--E^g3?JY8RaeH29=lug(>z+gThDL1?!|<*gW~yOjwp+&70pt+zTsH~rbd}F% zK^1Dppuj+{&_xPHd!+N@H+%4P43PuiKY^r^KO8LOY-9@KLB z=KNo@hT@AR1|25GNh{9v@o)7$Ihky1(jhe~JNlPZBzV)uDLTk;sJ zyRS%%r#*YCtvzsxa12^>VhSCMjYFiG7{NoK{+r+w(e>Qcsq-Jqv#`Hi*L3tBG_*LV z?)Y$G^5DU;+Fflbts%2AY5C$5O;JE#=}6|1?I9tGhi^U>KX9_8?c`uw+`zr9ttSWK z`~8Z>iVDVx{QQc?3kpYzeQka-$BD}xY-??GK|XQb94DxXqw*QIIgPGY?K@r-RC`+5 z?W!G~8pM%F7rKJX&fV4yBt(k3G{t-~5V7x1TUoU*exZepzgtXcfY1eGXjCteM08}) z$aoam_dW28ush3Kgj%!6(H(KT-Y2GB<~%mtWNx=vddk2;QeW5{Nqqz6;nnYK&*IEx zI+R`aXh1;OW+Nk7nzqyK{>6ylPW^-}N11t;)8uYjdiOzdy2S@Xdqe z=|MHlv3?Ct{Jd+`e*UQ@5t)6D&tleLjou>k4`Oe*%v+*yb$54hA{t{eGb5=`_XEv^ z>YMNfdJT=2zY}juxl*CeaL(gI#zg%clC~hk$%IOK)}s6F1CCtP3(akV7RD6&p+0=; ziXdW562r(PIb3k#nx*@44UL+llJNGdHIN+aC>0k;T+vhN27ej;xmY6c@ezrfS&htl-(SAHK`AfmVsb!+ec9lP&*sh= z;^Xe_k590l%y_MMsI>GU^lY=VD}dX>9mMEnsMS(Rqak19B+q*L&8pRd3jr2 z>Q@b3+L{L?*xu6WQn|Y_dFV)`s^Z{4B2|I~R3{zdzGWT||AO3!&685Gm?P|j0ZrM3 z(s~z2jpJCnrE;Y;dF6|a!v|YG7yrU*jh=kc6y!&_iMCl3aEI8U-HG7ifgg znb}$zQXCc%uZZyWizy8$3iDToM|t_hh~F2h82zU{9W%y znms|p6Y$MID0(gt-RyA8aS-~a5Y54kHOm=}O%ln(Hl${*$Mb>G=;-3&=;+eqfQ7F9{;mrH{wKDmC^j}PFV@A^*JYuvuZU>vxNCf= zFsIx4Aa_s}ui*nPXz{ku0_Z5FlOizcT`x>O|1V^Puhf8cAz$Ov} z&-L?P?;?L~`*uC|6)~cx7SZ|C@vrh?oRN524qAL02DNoaK%OewO^dqG*s@iI-~VAFq<_UPL8#yHBL>d$2Q{w#E9A&wM?-e0{wPRPRPk_&K#*(q%Tc0+d1ooARQjH%cXuXH=05i4PT2zD%*nwW?gTItd4 zITKFUK)zA8=h+*6HFH|ak2C5bY>P3qE@pxnZ+$NIyNR70NQ4GW-pt1q6xC@!vI@5bBnoKizk70bTIcL%043O;W>}Foxt7n@h3OGOIBxSKv){5b0>zh ztZuJssz6}OBN_9U*3ZL&cEXs^x*B$zo6uGbYybt3DOc+LB5wgoP-@V#J8*P^Qo&Bo zjI#wZ4>4id8=2&Kcqw1x~WTIJ(XjjAJ8{5s{C9#?{5e z$aoQrb1w_rB>crVf{hkRMLN-!;4}`OHcfHsgLR+QC|tJe9!f^#m+k2+>h^uo+&q|9Xx zZ~Et9yZ(#Y@`hu3_Ey=CKG(@_0LryDPyalbvH9{UMxwomE%z}UuWV!_!oVz*Os*fX zO913eDMAO;A}gyPAD=KwOGRL)l}55as7GQ3pae*vqp8kgft917jGgQ^vC!>fmn!2} z$~DO6%GjS&OsYCmVV!BI0VMiXF;m8xr#{)wz zZph5s@Z!+G#&>pB**4h@o&RBL-t9^}8w_8_PwXG>^&^>)gc4k+0h?#Lf_L7{OrRnZWNu!ygyN#)> zk)>UrgI`jB9hsF)ytB8^zp!t6(QAz-mnG$FzOYGF4Z24*-<5GZal-&kaCv~dJo9mQ zx{sBZt+6n0OV#8t@stxD;WeBX6miDBFBi3$QiSTLvvcqQ)>^j%DPG^(D0oo%&8q@K zz`jyHN>}`qThD!j=xy#z%Ddnc>W+M}Vf|CJozIP>ZXL-~RvoEt-jtrYwsB3>z{54w zr-rM_>W9OlhN^PLGx|FpV?A&L&D!Uh{mR!ab}g99&f8j7xxJYAXT!ri4ae)sl1B@Z zm*?kgs=S#cK0EkyH|P?I%qh+}#47{pf2qw3Oi-T}6S1j8LxjYsZvUYtW)nW&ZN)hC z=MlGIezKUqLA=6?`4!FDTa0)kn<+HOp8ElJWbkCIDfV-TGbo;jJDb`pieov2i?PO- zBUDt7Zx>o*e;344M%5p)ARtSq0pct|#FLcjLf##nR7lvoUwWV|V^xBoa=awICE7l+ zDQoQ$6>wN z=5zGVW3IGHoxA0EjqB>y$1Mz8i<`B{t|j{hladDal`PEL*pq3JJg^6Aq9+bL20nHb z#iQ%UT;vuP$FjCcKdHt9o4s_af;rOZd3wf@P6-Kw)wO8Sv-jc{v9LBBtJC8ZX$ngJ zRR!VCKU%voc~Q=i^s4pQ0~yP9=Tz?NjSXwrLmbanZfOdOXx~wV#x8Y#&dU7yv6zL4 z?HP|U$+>=2=|Q=Xu5qpLCF2FCIt*qdx2JnX_+~YPXKC^l`4{x3#nz}Is>A)#6wX*n z9zVv?{j7^XA(`4x#`vSZL6=OVi4cKpWrVuOAc_8H5a9?o%+_0Ilt*=zKzpzu(fszD zT0f_VvY58yMrBy~!UX3KH@5^uaoKpThkr*Ee~S50YbHLO#~Zagbf_>iJJQ$E)y6L~ zF=|PfEXpA++sD<{)y&>LuAnnL?UA>K86)JJ86mH)%RV}zhG}9?cgLVmhXkZ0YUi|0 z2R{g$d3){=QbRp#WE(B|J4~V#&3hVXwy~dP7%N877v7O!^lv!Yck2w7Q$3REk}-CW z#=z@A;VbA_gI|v`v=-n*sYM;Z3p;{?O+}6!B6^~zUl46C5{_`gDRMNKMirIdajk8bXLF-8sol;o%amimy4+pOCZhIq|+GQ!AsmcD1TJ z&aEV*tUs}Ed8xmVjrNU#jKkyY>x-Q1Z35DwP#BU$+lM9jJ9)X7TRJ4S?(gn6-W@^t zFk<#+u2Im;Qt%@5C(Xd1UVzguAO+Obpe;He0kz(c0k^sI&pe^IfEheKaDed_c7)6k z96LhV+XXd!2id_xw2DUeHU&{xbMcX2&k427y7C!33K(ZyJ^VKH>L^^vY zzGr7~Mc#NMg$%Ixs%w*lrDEmUz(k_G})D4xY=b-jmH<_{7>1?h0WPf zU3(Xsm}XDpsQV68%jzG*@o7U_QfEvtw;q0-u%9Uaoz6~%Vj*Sorl6vz_0;K4DtWN1 zzt>d4CW1JIaqBqMx-?~3UcpeVSJ{byoVKvg6z2rTfCUSZqBgzJ9o2K3%Pl{(qGBRZ z=mPJ(U*l>MoR<>ZT4WPtr%Lqk3UD!XTl4;Ip zw*wSkf-`fcL7Vqy^ywrhDp0V7=G2`66zDi;>*9ZXIh+)JL;?Y^LAUeldEbSDwApJF3R z%0Hm3z70grLI1`*?CzOoNcn&~*3;Qv<{(d%XSRfKQLU{rA7vK0nMkT^Ok-Acfiid+ z2=-vZ1ELtPkUBu~I0!e_ag5$sgW1MORoFQ-Usm7W?-pAST+pBEN#X;SgA8FEM>=y? zR0VTU+Ul~g9C_}l6D7Ne`EbIam&W=pA1n)LySo?T_401qD_k_V6yCR=SnPnEG4AFV zk#UwZX!tknP>||8N0s18!o^~$!mCx~`}))g>)zYB``wkXvE3Q5u|)vZ*EVjX9({m&Pc8f&f9)*py!RF)fGqI85()@U|2=)rh7}v?q6H5?)~0k zY#NC4zxf0-(=eaRT@WzhPBHE#1wIy92pXAIo?ute#WLs2K-=7o71~udJb+U#t5=+A z_9vOD9q0PSKR#KVw(FbYo&U6RPmO=Z^5f@(^VcZ|qr<;>2dXHKmq|$r{doePL38(p71c zImqNvXFH{>7V5ff`;B&jzw_oBVJ zc;1fqRY(>q@(`uaDBnxWI-3Wf;uvF2b%wdnuNbKd@~P(qy(QLhkr1f~ydu~F_CIrx z_|=<3T;hs_QJxNA1xr$M$I8G;3FXS*ES0+@lQ$E)0=#4)S7ik&%hetgfp8*Iy9>e` z!AsHY?S!&Z)ya*`5duFM^V5`{f=YT=7*}!a z0q@*<-uM0Uh1il;qbX-*&Yb!?xUY1=H$ajRA&0}~A_{`7 zzmJEgkCJR@G8`Mv?3=)F--(fj=oKVrCYvsZ{zj*DA0HimWmiST?XMdT{$!n#(W&j^ z_>x1z>A||C>#L3TwuxRNBl1&+K3dcL_*Vy?JM`7#-D5vJGVwrL-TrsiKfm;$UA<|I zaK4I!Fr?iBicy|UJoiZl1=+@Xc>%`WMh^>3h&cd32{cpU?m;)8MGD{?A!!+T5)hg& zb0uyMp9O*6T!Xq|Ta6*M{wa;d=E#tY`mAst8{rw#G2vb|b@-jZZ2iNlfpM9_MU{n46#hCd8%$#C7 z$-Wz?0#3Y5U?9k=@r3Ei%iZ0Ah@)^39y>wv~Ph z)?lEy8RQ+JI}C33(9W9njeO4ttqpiTSH9o6ufA?i3ub{3F7-;x$CF!+u-86pp2pR6 zo}a&<2kI4nk-0Gw{EVq4rPQB7tePm_&(6audgzmoO+53OEeEL^L zVawG&uu~h46xzD`xQsf@ce8K5_<-bg?VLR)pOOe)j%}c0rj2qH;k12^Uk8E0s>_CJHh9Kzwm#>K8c6c zHAsXp8w6G4XVFOwM_UR|-7}<*u72b*DgBL2t~VVK-ZPqRGtSe7XBJgf1(#)em)GRj z!K@{xvLDK6>^*hq$Ozx_ulD`z2Pel$>_>doyvc%ofXxPlR2pDP;X6W|a94TL9KBp^ zL3Wk1vxfuVu$=6$58QMJkzTnyJPHxkmK1FS6fC~&EXW+eB;?BCe)iC>9p9FdjtPFO zV^XY>1^HhNzhDpf$qChhpYW_OZCbtD&QvHy2|M}Bq~*e0fY@vN+SZ>{ki2wXClJ0flZWnG1*=x|p2fARD}o^rl3kln zAbD=NTBQ+yoh2!E`&w=}cAIkfSfa=#C#PqO#!sYAEQoiv za_ZB)uU5t^X-L(m2Ss&eTat8QTDQtmD#ltHW-hAR)TrSYjck|v_6lZU%m5Q4xA(qfHC~SUc{f`beG#viX`iC}L zK3rda`0|FmZx3g$IXnEwp0|dx^=F6t3~K+@lRsI%{=<7(TTXtse%*)nv<O{FaJ+mAJfD-jUwc3K_GZw=Wbfv*V^T}cACCr`6bHUqa9w>KnBZRS|& zVA~Ztr}q%gT7jFnWW@>#-=ZEL!v40SN8-HTecr@%@oXtfmt;uN*33E(VxPI~8L}ja z;}3CWJ2=pn6u$(__O2f;7qg78*2^n45wD%^vYhkUOAoMvaN6KJBAQ)Ohq3Hw?rK|P zx!GeV?j=#e29>e+BS@2fdP?v$3O>dwedZZ+ZcDR%T0X7$fYSjuIXWi?wT+F0W9e*f zPB>8l*@#;xw7_(&y=p$N9htgv+1mGzoW+(KI)&VH?ni#ZQ39~v@!bt3~8RPZsXk78}}RD9(5K2G+kdGqWY ztdvq7LV7`N@fH(bWNQ9)Wa}R?za0mPkzX(Glnxlhg*OZ<{Dv+g?UCgTBZLKqn~se0 zaEozGH-D~fG9K;WK1g@l=SX(}w(2Nby^m)AH&s~}t-@PKE3+86aqFP~aBOhgLPc>7 z510H*FUc1so!jpaC2$uqN;{L4Z=JV6Sqm_d9z&!zxu1=vo z@Zloi#RrK>icD-4ib>ZZ%H!R%cw4W*gps!ustPy7C@W!wM)sO~UL9dY5Z&|Ul`nK7}J;BF;&*Ge;`%UUtoM_pldAU zpMCd^<>XDAMdal~K5UFZ#&a#p4_3#Jt!N!WFq<}LT&tGlg*Z5MpZUwZ-Q7$t0VaO8<)fsKdtg@yXVje*s-kLJ;-JqyAA zL)Z|==Z@Tbf%(QnMMX0F=j`aB(FgeZJ9A4gm-LiOC`bz29&bTs#W~=VHa{VAu*QL_ z&CPTOqg*VX5?EZv+Pu*6ky05Y$0oWC4P}Is^c5D#YvWma)0*7eHBA6ZW;KaO+)V4+ z&Au9lS(Kkxmf$rF^IJ&S^2+4ak{Gq=_k-~ry6m>ZfpBfrSYg#zRXE-B`>+x>tVD@r z&~OMti{TWleaB?(!ikQ%1&79jmaL4$nd#lROZQes*6FJ)*vBOX)4#^OG(K@f-T5)0kvTE`Zj!|lAWQ3B*|jKY1rq{G^=DUO zD7ydB=NJ#!t%wLj?Y3PdqihGQqZ$L?GsM>NV&YeEg; zj}2!DJsI?V{2jI5GNz?5?$RXVLrU&Ek3=^;TxO;A0RqboseIg!%*Li^tsb=Du8>2bi)Y z6D8UF@R0^CNCx)1>6evtQGSeCwF<~*PPmm`z+@>z?0yF{J;ZTqDgsD5k&i+8mG z_bFOy7gf9@zihlcCt%zorm$n7t~SEfKE5WqY_K@+>Q5Ksw67`4?=Fn8w}~q1$#2`) zoj4ItI8e5*Hs0PgqP74~K?~SPgWy44nVR72>L}sKgvQ*Ew7$JhuJf$jJH99(IMKrt z>KyK;TXWB1&w(fR_N9g7HYS+bW9srktT7Y|qFscKJQ9P;H$8Io3+;XXUP>>^Y57&j z8T19x3Y{wr6A>t;vZJ_O&iskHON!$_FT;8Ol+gWzWvf*BYv!!}m2j#e8vUEJ4L0IMQ(+2j6fxR$( z6>k(xS(!Fb;H3Pjn(mew7B#C>Z%0x+rcE|hx?4COH)vwf`Gc(x^R$?gt$`8W$)yecJS z)nfStY2nb2Y;3=~uX1B|8ZEGRRbKY0a;y%V15wQ66|>6q^HeB?Vx^T;uD_LhO}q6K zA2z8Q!;Tu1VOMuzSa*Z)^bMo3zw*1wxYTlRRK*~hEkOEIwsRgoP?$945Q|U3BE_4ZIarfPVCK8<=YnMZ;uWctq_a3zRkDA2L_BjGXSA1zKh7*i=-u{+>k~v`QWWE0R=aVaIp!bUcYh3<)+lrL9r8TTqK2^V=B{pgC zF7`Lsg>Jg|Vg5i?MxSmdv2CKX1Ubg2nEqGfyAh@?*}7vv(SSPAz!S@Xd;r@0ZPl{Q!mF%)m^Sdbpz2tQHbX|j5 z!NdldS|%{D0j!1(teDtSLc`#oEZ!7Gt#rKwMomN}n@SUjJE?dN5Vzq=|({6KfV}gmBqTh-2kbXBQ=Q@9vbBo0-R|F5+3& z2|Dc4;bFPH>0nohu{{Y)EUs`cE2AH=eOyA(AX0+gp+JhZ^yK~mk-HD9as|zn%i4-Z z6`RcO&@Jo+iu@vc3fA@@X1B-8QCBA?uLegI_5tzcJY5#KzWG2GN>0t5k~nh()3TsF z6JCpBfWH~<*;NV3v7AYI>u!DmZ;txRicD{O2lBJuP-!%H`{-u! zvLbXZ@m@i=ve=;5m*eB|v-E6FUm21!)OVYoCqeZfEDneT!wZoJ3BW0Kfvw&H6?DSq zJDD9xc>j203vQPp7+F1wh?zwH<}`}gpNjqi8NJ)<>UQ*HPK6b9q*YHA3sc6PhnLrE zU7EHmyre6ma!nzsI()g}%xHT0=$RFg`_(TS);2{0HjTdB|N4^aJ|!-X8ujX({5?rh zW@?X_+Vhzzr}qCkQ}BD?XT3?C>&h$Eb|xDFvl|jhM)HKbHF(p?jBQDM!Ff%|Nlm$c z1veEfJKCR|+<$bL@QSGjpzq;DJ9_Bbolm#V{xrOLRR!ic^Jkoo$21P`F!++*>SzZ9 z6TA7ozIOIZZ)X*%>BJHzFu%QEUR+?|#$4!IL3G>x&fngavqt{(cCJoIp{JL%nP8h= zeDAV>)7=_}D~rqY1$k>Kg%Ua)qUybwFEufUnj;@(qAF153J#QzDCiSx{K=Ea9ho3j zJ_qJ9iyhy^gt#Mu}N>{81HT_Bm##pdKa9faNR75e*s0;vZdKW-q+L?zWQR3QoqEgt7#$zAKm!{ac zE|w|3R@2SSy<_?vs~8s}r$6D(a3phsW#RRqp#ZsyoxyVftRaf(aUnrGt$KaZWAJ-h>E4^93xevIYQTu8jVVg0m2qKj-RrV<^#X=eLp z(P6?=XB0|N{Ord!BZqj0a(*_$a%MsMf}P=1x?y&+ zsYN^Vm|Q7rmM_kx+7C>>1=UO+8HiL2aacDYo^X_(6t(IEW_K7A7aa|<;>93Xl9oGtU1>FLBq7jAq|WePlc=`fKlxpA}4d7 zTK4i*_RRK|`i%wK2IZP#2gUoRf5f)3`*zF0P4a$rTHPdv2z5rb?!c3Ebx$6Ux3hJt zH>YnpC#AuCpCEiN{VOrp6kChG3IPc773tI`ao*nmjftn>6^6eGHZbtCu)xqz_b9#w z|1eaEh>VYpswJ|I^gJ%k;4A3Jm}-=PESK6RrU zj2#jkfkAbK&iR%4|9rQ!l&P;7HOovCTNBB1Rq}KJVZk9GadFzn*jQgARr0lxS;aFk z(biU@aF6TPs%)Y81}m%mPxnz;F#SCpK*E&W-1y9r@w^S+xtl^0?$c*SaZBRy0tu`Dj+U#xB`m~FI`<96Ww5}Tc@E#H~vamh+@Yj3;U~M z7A3Z4hZiRK%3}z~FRU~)M9p1wKzemTYGtCgl=sFPlr9Z$d92!!hv;iPv^oMc$|lznV2+QWA9OpZ%ySS&4))YAk2HgY!D{`bE=tIl%N()NeL}e)wTFuGWAFai`GiDvoV|$#E&7} z7($o#kLjjY>c$Q>H60w&k<1+op1&LZNGC)_P}IAdjoKaVe^Kwo9n#!`PC^Z$^59S- z4=FuEsPHBfvH1bj%ZhyMgLPRx^1-F@gRH-_2N61=_;lZ78e8F0+ijH%bS1+36kBW;qaVP0NM-24O=7q!2;M@+c0 z{JZ9F{#D*A-@{ymRaG64cJ{rJt$Rw+^dTsgAIpCQUzBi$^wKF!7Is1lsVW2Vn~Q+@ zz2baPuhpicXt<;GGFbikgqV5sbps{gfVp!HXf_k`L=#LZ;3lc9!VkvB#|4xx`44hi zHCggm)_LWae3~s0ny))d*UDZf#+s=%zCMRK+fi4$qc?q7MA_1;^!DP=(Bclw z!Ip%)gvNZg1XPL969Nn3dj_H^GDk=1j_XYqTeh^uLjPqym19<%S)QJ``Vqa5 zbM&45k&(=?hw*d$Bdashm!DaI2CijKOr!90CfCSet%XFH1Cv_f{@EYjev+T&Sw^^>*Ct!|<|3O9(`LNs549|R)8Jx1r58exly;V3?( zjSI4|0rZQXvpF1$0>u>~DrXR3i{3$q^!~qCNdo2n65bNzcbALS6Lf2HiRN@;~wT%$3%YrL4z(_Ifl}4+TfS7I4FQ5EFp)c>bsB;kFd{=S+B8kl$JUpBPot z-Hna6-T!|wtO%;xI@-FWCd<3qjY_x7jDx$I56RIB9u+}}WQHD=-I>Y&vJs#L*@h&g8#mROv*X;HWt zG>xEv)2p)=j@>sfa(-ZC)!NF2$(r!+8so9?rlF=o=1Le{j~mp1Fr*sQI51{9E|P`^+gt{_FWIKasymVQ!b@zojvk zS2q5Jxn+o1vhlH{kH}B4J04y7DBJaD@1tx$?tBzsJZ$D8G?;NYN&?eiLqBr$-y zBXXBR?9u}w26;wgAPDvoId}zQzh&hu8VliVQ-zJR6#3w; z^sMdbUp^i`wO3_xWr2K=y`+AEJfF~IGmvG`gz6FSU@|y}Xp%}@g1P^4pYtu00E9YV7xvkMV8XrEA}sUbD1LjWfNf*IRz` zscTKnUF$>ox@ma0DKa-#e$)Jo={J^dKCt}gW%D=ESC${$&<6C1l>69_`YpURgh)k^ zvi@9$R;g3GaqdDQ0C*2y2C;7ZabYhLu;d>m`_a3Fc znAGQTym&gQ&-HkTH|6&z@0fm1bhiE;v;5u$^Y2-$ zy#0_@eO2>y4)g7OA*FbGJ387?fhLMciusYEZQ=fto&5imdAI+Hq?mU_sK($v5SAs1 zXeBghMEfv7tr9h;hU4Y}(Oi+sufY-0rDLdJjQ7cERtE1;oFW>H=*F@u2CUYwxJ*-_x;}!@pXJ z@;N2fEH9_3e5_tRR?LQkZeE=4%bTIVcHci$G8YAwXHbZL(7J)1wm2hp0;qy`MP3>k z+sD}!W(+uS{4M^$um(92S~oeJy(^zmKzFbwu#JhX>H~B7(CB$dwHy0zHRxqwTz!Bt zIOKLLc%#)Fwq1 zF=p>QA6cW&ya@PKfd;lFqP*G3l7uyfghA$_9I^WZR> z!tw;o^1dJ5le+!3e$OR7D|VMm-CZrDDr?1!3y@E0Ucy?#RsRKkt7X4dzl57-e?jew zqFN{DhS9xTAfHr|#W7s<7p0Yi$M1$#FUYrZ4482CBm5M7iI--+pg`2F~#lxJ{H3LRz3B{GtguZy=uAJ4mRvW)CP^dvF08y^Z1wQykv>6-+=Z zE1eBQnS{_ESoINWsm)*^PZ*7+-d@4)F1b{0w`c1d%GsY0TaEmNRMS$)Z+d2V7tj2V zC>m1IV1|~l5!*>)&mJ0HJtbFl&d~f+-Z=7o2E$ip6&q3YFV;h zYGjR|Gm4i@XXH=p|03AOm@btF$W9v?B7^1hmF2<-crRXDG5uelG&0wuFK4ZG_Ly+y z&&s5~*_hUF$v?}>{GY<%DlyZHa-0xbNFc-rZJUF+3{l$bH}?#RpnN8Gq8a{ZOHAz* zZqq-UZxp{l8W*h8<8v^VCE_CLcr%5r9|4AS?l{Db%pM_Q_6QJtvRR1fG5>Lqydm(X z`_GBZBb1ykv`tt8Svxx8fG#|K8hYWfL5cJgsOP!zB}`70iMKvf<5pp)PP1bEMzM?A;hPowvp z%X6?y5^EK{16`8X(2_}jrYVYTzrW+tEy2Wn2G=Aoq3_Yaxe=KfN=W+H?D&=H312oezC+*Uq0Esm~j`XQ@y=))1XP`S8g4*S3`e7cR-k>Cy!^ z-T#-y(c$kicFZ(>aesZ?U2hrWe;=KGVcE#5ri1Tq{N!}!%IfV;^nS4Z<9j>WPyJ*q zv+KHhO@6`ni4J*Y)6Y+LKr@&?CQ|`WHLtA+_A^=&SM<2a1PeoS0Cc2TOR_5Sd`X^W zb;+9jU{#<5sbJ5q?_CsGIb2XMToqZe`N`$W&P^7?qpERCW#)po*7bEQJG+zT#pFjs zqnN}XV8_dKi4xfdHMLF){{S8TQzWgbNL9FN^1HZ*;H1#{=ucA zszMM?sYC{&1}bp~a0f>_HADfe)p<1G^xxP>HM*UNnsWIN2Ir zIXFmMO$pX82U&tD4}mJLa;p5sOqJL8dIf)6`Do9nW(gm?Pn!kcDjN%KuL z!ZYm1E%LO0v@La7Ta`xVm~H3DBDxyDiZg zH_HWvL@PBKs}HYAQ}TfOM|19aZ~62Oj7D~lC#F#nu#dZa`=tkDq{3mWSlDKCu&mnx z*9Z|!YJbN3{WX4mcA-f5Ot7<%6lsC3*CmVcpZYVGD*%Na;0WxxG#I zOb54}{&XAj+40*4I#~O;FAgs6jUIk>S4|zNqso6Ae0FDTX(9l#flM_sja(`(_%Cb} z1U$))0ar%t>uVc=l!JH$b?9gO3>Ji6HD2!b(TV$_&l%Nu8UjJ9cMO1oho6wk{iAQn`2fU$ubwjot9> z{_2YD7gkgZITml|%hFAp>5J(A&Tm;wc4{kOem)`p0CpsW7X(p+jvXSXa7VqpY?VYS z%KqjOH<4dC^NQSa{hNr`a28<{A2dB8|J(jkHf?(37i%Gbr;OaciZxDDhqCNdCztX_ zjwemRn6S?ztj61TaQKZA?E_`&PPI;+hZv3--6wwyEHjb?ZIw)JFHc*Fn74xn$`IQ@ zvB+joEQUwr(F4dUDa?H#(-g^^1SI#Lp|HX})6@Uj`zy-}nJDx=ifYYPQOR^+dDo>= zDO)!6dUX2??<`zpGG^0h|$xS6IEq!h7N<#RIYZ;dL$w%41`Gd zogIl>C5os>_BgbJjfVEIAyV48wENB(TX~iW>(8^2&FFOkr z(26V!0i0G`!h}xYq|js&!YQTj7V5i;i|8dR#KDF$_I6& ztaP7)u0P)%_}ccUNu;+Y#xg4gb++$^@X-h%ZT73LA*oB)VMfq5Y`-#n|@`-f##asT}afY z(-nl%9fyv;#5@KmBtg|LM7H{HM3^pXT6q@8Z7; z*@-?ENBQSz_^qe;Z$Vn3&js{`yHf`?^h>m#r*eB9fC%<397NS(cEHhqdsj)*B$0){ zeeePa?$Gvk8V(}C*uWZ$a>l`T2N$k+NUR-gzZ1c{olpqsSG~4&@rf~>$=Co5=XpLx z9QNMH*WTVGEDVFqpEa0bWd_f^#gI4DmmUI4Vz?4`Gx(NfD+RWIFK<7OXSvAT|frREvpnzG7PRz)%v?6<}zQVD8+RErx8CXLw+s|J{Dp^WNZ| z_jeTwm1l7Jv#{1N>`Nf<`|uh@Mnu5t<&<1xt6%8o#6>_XlLR2;HMAg5Ka%f|ADJzxi=dR-9s8F?;m6d-Mm(BARaNg!7?p^?5^%UwYlJPPDNR!`=Up zZD@5FxuYpGx;Cw3q%wjDp?(wdq6DT}b#PJJ<_h8d(Za2LdHv-PBS}4XbY~5;7027F zC0j|}B~-O;ttw6L*;ZSp>&ry#^!wWT-|NRZH@|mhwNSVp>r9>b3^f%NLeecHsVgrx z*B1+QjE)XYu}39w^COX*z?W)X>#RDp_*P*#j^D3oW;6eCIkmhVu3==z}E8Yj+`Jdb+FQP; z(`Csm897S@%Ix~EGRBfS; zk6%-J*!H%qrLyhb&d0LTqMAC=?x1z)q0_GQRS%+`B!GwkLILBH+7`mNvkSF6vS_F`zW?HnQRf^;Q}g7e28ST>7wRNjxdXF-oaG6$b~3Qn3!L_|P>J)b+0%(w-d zW`1qF0SuCFjCy>DOZlGnOf*K0j%pEu@2we2CwzcBMB&G$ihvV(@G5Gn8F z<%A3ff|)^9w++{RDUKN;6DK~NByu5})!*xRc?9zk{%&&aHX6lrV_aiq*>Z(nPY}N@ zTz#Z@@wO_ps2&kL$vk@XkwxP-y>wBuI_P%BqxH~%{XJ_M*Bg5(G!$+13gIf!Jo|CRY zg0SHo&#rU7+0HcEe{-%YJiIq3q<-HE!}7mJUffsDnvM;1Jm1##T<6iZdP#yYK(f3O z8Y!Pw5FAiitx5@SQ05he;Zp(eNKcUxx}xZy*Ct8QuaMN%AIt0=#_U~?aeuOJ^z2x6 z=899xS~o`o#*7s<7^*@d>en~1g}u3%>#`P3X0N!jwDstl%cGaSd8Bp0f*xPL>Wz2T zMc19&SdAAaV&+d0NxLH6R$$$DcsTe|Oo`dPZa!9KI}qLCxf=(Bk*=%nvR_TjODu`T zaYA{^U_bM5!j;{QD{H-=J%zzHIZY&Sm(6@Gwe!=&=iu&c??-VU&?+fZf9@QtQ@Hk^ ziN~g&V8i1qwmB<*Nnt2L_^;i(;^nom(!zlO<)V>%k+gVgL(8*mEzh)%KZaVKbYcY6 zU9c6L!ifpQYXlpUDmXu15WLfpVnw~HqhfBIi%>u@T{twHuOXD{7HHjgsOF+|3&);% ztncVxDxsMe9`7->9(=BA{Ea(m3%9<>lAbcWcw2G#j+e)`|M&LEzH>u6&o{<)9T<2_ z)GP|FSY2B())2esu8vjr4JK!d-rd)^Z)tKtR{yrDzM})Fz0YoF-%(k+y*YodB9d#! zRcdGKD%X&?Z2bk7t&<>g`-0NpD(J*qw*Du+3aUP7N~ltQ0N)csm3w1ys0P z=6og19kqeNC~AtIMb@-_{d4l=7141CrFGH{N0#R)zx(GU?Zv$j$zj_ue!5W0{wZ8Q zaIY&Lch0|Y6Ydorm&!#?oVqy`=cV%LR?!n#icGa#cw9YrV+-}*)d1c?P$kM|Nn_wV z$mv-@+^nG)&;Jo!a2!}FD(=0R3Z+Ws0K>wp-y!(|0tUtKF^53@wWCpK1zQ`A zT>Fl0Ft*_j=64D_7rtTQAiSUpx6LXRDuyi)n#Kj~bdO?jl6UiZ4{h+(|HJ&-_9S1} zQx8nEbHj7OElV*Rna5)3qJDT^Z3e+@x=*}kx=;P&zn|3B%e#k%r;*qN`X29;&G+j*7}ocJy{a0eCe6HXsZ0zwnh} zH_S(ui~O`?# z9bTKAT@w~wlao~&F7)F^^=tA_JKg%D@bFst5gRHn)HY2P;UWGt{)F$RIbJEmI?a!bU?kEJ4Agk3iTr0>jhTXY%v} z^Ekz%0U4zm+nG}XD>M7?FCm-mh#OOcnDZ2?n-4nxx@v~f5$!@w` zJZD<%AtWX0gCks-N6-1y6A!dbmK#bd*XUS_>42~jg>c2QroN$5Q4w}6Yf^<%yWbq@ zePYeB^;y-2jybsn||Dh&1(&1_#9o3*6(?a0wwGqUu>>fS$l; z6iXEc8Nn?$%F&PD#K{oh;4JB#FrMO0K)OHGvV$GSs@@UcjU}durU8qxa#5}L`|R6) z{cGKxg$wtr`(T`v9DTj3>viESUq~>Fk4ajZfEIx@~1z@X_bF29?!eDR{pvC^B4lxEI+OxL1eb)fn}t}ISI$u&#H~hv4)`B)^zzLgV-!bjkD5<;f3R|%?L7z zS$gjp`DIqJ*jVB>9Vh(Ov^{OdTH%zbZ_TNm7@UDt$nT%vUMN+B@lHjfL}9qr2bTf` z*RC1x>9B>7lZcoyo^GWO!Zj(LR1L&yrIDB-vW&q5yX2LbD_`7EiL$_}vW7G4;z!a^ zTPZz#*&W@cI^ii(-6A)a70xc@cYd^w4e$Htt}<7rl`igC`t#%R;Wdx1StzFCT3ovo zp62~sKyL}(R1Z53Z(BP%FK!k zec9ck`^sxijJ*~d!6cq5`^j#N)K_!x{jEa5n&oN_14No|2VH5Kj~$jsy}?TOk7z3zPPbhm|b5t#0Y@(JVvt-Zv+g zp55A+B!?S*HuU(erAajhestT>qftw$CEHuT9A7dP*CW8g3$ zmrJTiSYnbP?F7L#R)Q=@*f$F!63fc65*_sm)J_!@UQW12r0oHs-~0ts=hb$}nr{_S zl(=UrDnC$Y{#Oad9S^MF(VerhrrJ28m)Z4F#E>*PU{-)kVj05Sty>qx1m(A7CLz@%d(F8|wjKTX?jjez@Oc68 z3tYU@+K?Lnm>uEQ?R$GuW17Y*Lx(@Pcz4H|4R8H-UwC?5icfIKvSL$U`GzIw*pJ8X zEF`I417D+B(n;74*O5l0?L|dxvGN}_nl?{t5^fXR5f$;5(PhV5T8=Lp z?WZq4US6^?KYwM(DE~5pC;1mw!|+;!Nx#4;UM?OLDK*alv7x{=uthOkjU9qgQSlSD zF+go9Mr8hoDd@TzdBTUNIc5!MFrRgK9-;@rVrQ@kj_R z-u?sm+Xo6(U%KCrUqeWz%b(j`Ih4P0UoFQuZ94es=)why>eEQadvwN0YQc#^{nzIx zEDJ;9k8A$;h8)g z%4x)E(z!G*ZYCQw+L7p&?H-3MA z|MAt;arSm`)vJ#8FFP}yXNYQCTVKDSBYS};F39fO&`>|s5T)6bH-1KGYG)r`wfaPV z|NU$7#-kdi>KZq6mHI9Jb=kW36qwj@}j;9k%tz&eqnW7t!vX4Hfn4HZF09cBFRY8>kk| z%-wR8(1=W<1uB>4eLWZ|87gpKI4^2NUAF>(DHVv!0wOF?EQD&4r}#QKC3|GmMU`#s zT%Zed_KXY6Srpg1`e?PCU7y-6ZMa4qvhrB1tzC~slQ~>Pn(iR05kC??gMLWWZ|%LM z&33N3q=3z#F*s=RKTV$hE2UtuJ8V}e>0ZD<=D|!Pr-qX#8>|s;`IA*roH4g*QFcaS zN$yyj7(1R@QkR+CT9rGIB*xND7G^e-=IUelPwF%HPlW&3l3gss1O`M^={DySM+5}M z2~~33=4&5jn?EES>yYXMqGMjfcT}ZefzA=S6(C!{&b3+%u8N|CSS3Te=_EzdeE~k_ zr^Q0Zsp+pp$LX)7JE!fV#ec|uUA|miwtPAIBl}c~G;BWoq$_GQD#=Ep2L2<^&!8(N zq^x)OQ9^Pu#9>}&64hvN0ktp;p!-w83)5Fbjj5te)UfHVg#VE*PqC3ICd%(=tJv_> z8M+O;>Z*81GTblSjy2;q>Zb_s}2WpT?O=7NdF^ zRv5ddrOg2Fq}(^af?G_fF`4Nl!9h>g)*VevO&=|)Cz>KiOI(dxN8q;gXv$8m*Y}O`Ls@YvQ5OJ7Fw$juJ|P5zDuZHtW{nWOC-c zWV~W`PmJNVyqv~6a`HP8*rNvd$EJTsudO^*=jQ9u>gtm@RCQIS{^SaGW4o;q%&};6zsWNCHG*0grl|GcF z?%@$O?%{d?LopO2M1Y{ibxCJNq!xYnXk-?q1M3H>csw99?@ndvx4N>$wZK z74G9vF2w|BJb)aI7W`-U#>3l#iYemukT(MSn-nDc0$$8;jy1shdv}bbUDQ1DHcMZ1 z#Z`W9?4qVye)sKFasvR0yrzFG|CxEvAL;#7t5%s3AzFG)`;SS@^bNa<+FaQ;Ha4a` zxayCKN9)^GbY&(+rJLS3!X~ouzpf=O7cNN&E=XXK;NbLP;_ay^DXEj}sFQ;>W?{gv zylvCK;Fiq;gPRvu7U(Lg3Un3He&!FfhTnbr8ah6zx`JD>dKWX z-D5)jx8F+hfax&(m+5I{ymCd}H9h?`TPyFVTinnTAD5vojf#j0kQ0Qkz{1qv%uval zN$i`d*ocUPQdD?wm%_7xtLs?#>YlZ0d+4tZRu|XR6|XL-t;G&6HvLrlvCSHA7R9y+ zan#*b5K~gqGq}|Qq|>HwHbQ*KNpMdK@kDN!r-(m`#h1lbrwbf zUPNYAT4X}5|2yw)Lb8;wReXOsX*x;xRZ5<3*p|l4M>p)tNYtgK*31uDSS!Eu$Rnn5 zNwPbE!t6{{izjRRX|X+&-_Ce z!Hmgc;qZ(%920mrFOmcdYSAIQrlvzlM7R#cOuPn7aeO`7_XMXuWTGC)$UPG-eC6DSP z>p-Rhki?a`S+}Y3cnw-AKyu#BgGSFE#V0s!Qt{aB_!d5L~o*hMk_XYWa zpql;yonTv_X$h0~HVA&%1-7=5=tGJvUoiyg2=^e*AnmooK|4V417>Ra|XSQfWj( zLqc7Wuz+O`mDG-;=a1Jlt}jj>IwA&imh2r_rRz*eZcM7`k1B`=jql7Yovf^0TVA!Z zqiFPjv4upBBG6Y4dT4O|)J(%~3_pMH-@q)TmmgWqTI5{OGuIR;ywriC-Gp`MadMCm z2Y#MQn!7`2w&>xJ8taGrdrnJlGQwC+u=%oSE$7$lQiIH)obb6nH=k}nU%s}cW_=kB zP0hOUfw=0V_v;Rb6Rw8ImO2Z1tqE9f9a+7i`v?XbS*8qkd)-m$mC><^8(b<$GP53 zbru4VL1AMnIM^eUPs3f)K+Ut{E966Xq^lUjEQzBmk&;FqkUyTCGi19#y2^wGi@Vy#O>0rh4UICXyLAMd(O?> zPUT2^bp0=re>M-lf6e5naH)uh6mOxTzi{oMMeBgqt9gYj@BpYtDY^HC-?$x-9rti#y}1NG&{ z@*;|2le5zzLsRo{R^xIPMueuyU+>mGq+a6^Ul|=0l@je7SAnnTZNK~_R?RLNq+A3-bdBnM>k)e zq<&N@rQeI&HBX}-s`2CK>ShBV(7Anq4)e`5V0nM)kTm|znnQx|=(FGbW9`e|Tl)<= zT9c6B6I&9Y&S=dGYRXi9{Pp*~_x1Rg=;S}&Kgg-lBO)WXC>L&IJ}%}@;|4%-ccE;$ zc@8=ccXvMr2hCoZ}D* z$tBku55C43)C$=>x{0Pnqi$(US4ZtsGfOQD3`oll*5>t=gvFLetDns2N=xg?$!KUy zAC+8!=6m_O+2nhKr3S^M`>M&V*)Hr8M$|9BOMVf{KZZ|q!ZG;G&zt?`^vQCxndG0m zZEn+xPbSnC(B=o`Pm1tcdfw(8^CwMcqvt)pYyPB8xJ&5apS(w(fZ7M84}?>i$3d3} zXg-AI>Jt>?>F?(k=IN;-;v}SCzd;%cZSeKR3+{f4Lm*`Lvtbdk82ISV60Qq>RU(esg))x3!5uDhP#PkZE(Or_euIWxYY+epPa5sJ7$UVuCe zHgm6B#X?oPAko=9?MNXJ1XZ5_H6-+%c zEWgSMHh*-ox%r-t>-TxnF z6beFJz{w%i6gc$1^qC40-7#624 z3@f-tn~gh!@0b=gq<^w(%7S!(%F$!FMc217uzQtOPT~!%lC6E6QoW|Maz$Uu=l11e zZFN@leO62(`k}AUxvf;zRwJs%(U;@%k{E){jMR*yrzkU9V{Lba#W5Xk=Yw`-*R|Vi zX~!kGhg>ABQ(r{e2u_nJc*g!ooF!6?08Yycp9SS4 ztq!f=3FnmiZ;WhzL2{eDTBTKiwUvSGVg=NS=xe2k(kjE+>Xhmsr7w51nw&eL#@cE` zb(F6aNqlIw)w)&@^J(HUi&JJcbCUPQG@!6`%-8YyxXx;2P!%h!q}i>oV!>HUGgJCH zH8Y^Jg5qhN*$gshg-k8YOldVT(~MS*&kM{4&92Ri)_Gn_d!Ni_c9z-ky+=*zS$n?) z9@6`@rD&C+%pcsi6f_g!T^XyhP~-Ym2KGaxRqTzea;<%xQhlkkNw=%Fd zlvZB$H?*QVrSx@5^*g1N5Bjq1rP3GO7NymQ>H~gT1X#*v-xkz{mPWN{XqU@pW&jp< z8rI2d@whCttaA{Uy@%8@XjP)jU-doQ3Q!{#kYao1w9?R+N-G2F!@Gr6**COO|I^y) zlxnNeR~}j&ozs{4Q){cUsx7eZqpu3IIx@G_C2Ok@l^%T&{p-=}3^n6CfzMx)X>E5# z^>^6ps9h=A>91>7XKBYSt3IE(1fC#?LbXiF-zRyD zizg7;@qL_f6=uqv=c{G$*i$Rzu5V>vElR7{8(R_Os4tD`)CBDTOF$bd-ISh)Qz_$( zs3`iF?p*rWJk-SWdO*|Ps%5lkQs%CDdPb&J@!%O&nkud6%qp!6tdrAJh`q7ZKg_K_({;S3 z1hlczROyN4L_J|nQ+!Sf(Z+fbl{Q3oWwa612k z=yiNv7zyXWz`~RfeSjHgofmJ#d!tqw)kvz+S3DYB>kGdr-J|&*jEV2i*J{;E%6smD zU3}0oGli!-f>y*WG^*7b`TZu2@`0rd?@8-o?di1Yd6o-miS!CKSz0MQ{nXr(7L^^> zLaql*b?9s3|5MwwhgVe{`@Qzw=Nyti!u#2P2_y(1KnNrxyb?%IUIGdMAq0_^1Q0~R zLr{tj6cDJ2MFbNP9-<+%)F9|pQL#R*wkqP=s?~bciq`h_`dyW?_x;Vx-s|jywDphP zuis}mIdgt%)|y$fW@gP=i>Z*WOLOMfHSnILQlYzndv5W7h}AwBy{3mt;6&5YCA8s4 z&NJ2ABCjgdH`wG1JYS-a`9gY*!T_$y;TL_))lTpArd6V9oZjK7ru|B^mo58O?{!zoTUC&dI}89a*Y6<@O#=-R+;0*tT%M=otg&JZt7pSTrc_ z>S1cw^)m)u`pZ?(F9)wlZ_#6k`n-$^&I-!1N3R@J+<(Ee+;LmVCTy6Q75#OC@t8Vb zUKwWXCaj<9A|;Tp_+J(3X;lIVtBYGIwba)GnuGVTT@Z_0p@y+tP&lO;vkQVXUSm}n zAFHW^l>sbvBgqREEV2uPg}GHmc0pwTN!tZMYN3&8)B}Q)1*DrBa`mW(6hWRBco-S9UwhWWJM>MqQ9-Cd=wojWZTBlT{WLFPX`p60ZJN zW7Vkn?19?k;BRcm)d`JNqq1e(2LVgQ9X>!ktb)z?T#DBy57n!nZG1vP$8N9(h}&AW zqF1DFIUt(_o@x|y!7@;Zfp_>6|4*@8le5USqoM9=a6WdP`CT;L+?3mULVrC+if0a- zQ(j(9w?!bP=6mtV%YRsX!4$yaX_Pu!t$lpTv(QK@XoF+b2?K{D;uXcniawb=dKi4s zS*yG}+6xz3z~@mLT{nc3J=Oc7?32w`qDg7|3yoQKTs|~v^bLEb&H3emfl<5-VHT{P zeM!aC%&gLzCd{}qw7>*-GOJnU(#5^Lwc?*{TZB{2m7?%o<3pK~ zG{0y2dL~F`HB$8=nv+%$khI1M5?Ko2sYdM=o(2Uig&;kOIY~T`rRdA{%eoX;+EU!@ zTx@USSd_8UE6d4D#n!2!t;GJ^{N_)iUV*q0%&qyjyLj$IhvDu zd@8Y$Q_N~5VN6&1ePpjJk^}z7dt;iZMu5ufiWNQGqjFz^nvRKd1(n2n2ifP1~?na60I2 zSSO~!-fv%Qt zs^5fO0Tr^S(6dUn*nNwr+95R5>sGyU7vEr&j@?aOA=I_*CD1dg15TKobU*j?Y`3%7 zI?A5oM4?a`{@iMXk*PYPRkIo9c&R_W9C1V_D}ypE@K#}T zMLjWiqnP75pQ_%;wO;0NVJysnnaLF;za9%T+H&C_VH4`$!H$GJZEXbxtRYz+e8~Syj&kO%O z96jpIz&g$iNCu=ros)Pz9)ZIgAC+ey$B`5lk$*lLzs2ZLj!gUK7#Ew)u6fxMaQK+? zw+-6{JubU3eu!N`$7rDIE#sGV!MGqh(--3+yj3A@LH@UD85h$hLwF;vM0l%0H51uD zGZnn)2=HBs>`>IF+jQrICK1&|pvw3Axe*#%6aE%d+1$_N#^;iEp-j(CpNjmTPeKoY zN+Po5t2iQ~_)mKrj1>8qMyfXcq{dKt6!;W2L?Y`gaa%QNv6%NPU}^g;Sj8IakQ%Qf z&qJxDVglnlgYXrLOb;3Fdr=?-ojkRe?il>4)hu(IqGM^^#40QWF)<${VUF=%x08@|;ZC zhX4&u$&r7rE_XhSS;%cZXUR^cnHi#t*L0yXYK4xn2q)cYpDxdt5X3{aYZF!;%%)~o z4fM*F>`XArVra%%<0GMJj~%SGKL2^p{>hQvK5s^qQK#|rbj_{reWU3C)86d`^BorsU2Eqs!mChaZY}lW6@NIFEe%CaWfU9HM zw`vvU%UqE~p-oiUo%U|JOy|d_ybWNhsqn-4V)e%NZ@uHa4Qp^S)}sBh9uDSFvM8~D zTh`kjI5ThFnFH3J&$r*O|FX;WZ*Xo;?>=S{QYr1@rzRy!Y=QB-7r7L=o7hG+CCf-D zXw@SlX@zQqM}U%(ZM!2sH%GM-l0~77Y}|CzCfC2-5T7Ji%4yRit0^m&x61D``@Y3v z*G=zV(WBsse(SamOC^T8XL91FAe$0DKUf8LU-q=Qpl-t@edp}G);t~^Gqs|)>w-hh zZ-XHbXMnJ>7vfO$osj{M(h%0_O7#M-5Oyc*PwOoINYr;P;S3;-u0!`LRTj@TrqVe; z$?^9A)-a($Mu2nt&0+cV43XR(WfLX0S2>#JH?FshWfK`G{DVd+H|_!w>0(zvak#)b zR*D&(#p~N}Zm~k$%-mavxY}6zG&A54tY!@>^Qf?U3;ky*?b9$;n5>;()u`Em)uCA| zsxTM}H5BQFVAW6>gRqF|xIdSKFIw9Ks|u?K=M&q4O0R8#MR6u!VQrgCv(h3O-8Fi_p1 z4u`Yx_e}Y{OVJ0`Gn?Bf^lfuHcmR(wU3Ob;$3;~K+3-GC4^Fzh{dV?)pI4b~n8y$K zO;~N?n;FJ-zi(YZbq7;D?xB@{3cbroZh&^o{SHa~#TbLrJW{`MySQH(EemkRG4FoW z5a2-C*X7Z|DjBAK;WK5Ha`|(*{*3GpzQ?MM?^%ENGxW!!M?M$dBYMW?SI}M&e@0a2 zeP7L=5ktx6(A)eO^VItu{yKgS{~Dj!&xCIhChyn#9`6?5GfXW$!(#I)9HvzrpJ_xE z^Y@t9_&gM!m+)u&3v&7c4D?Ugg=L(dFt3;42DH3z97gs(cw~>ND_q=7gS-jc+xvYv zEy2ohEZhuKr#z}e_YF{)1@MYA)n44rvyZW!@u+$-mPtP3Q6K9O$TB|kcTbkk=l?!M zdeIt7)o!0=H`=?8<^3{{!p5(<`_dkaX%>_AKG>VjxmsvDj~09D@bSXr`(yO>ful

=pJ5U3y;mt@h7~dj7~SW=+eNrZ#n-cPWHP>FYuFR)NxSqr=8x%wzw#oX z8mPG=D&~gALn4u*Dn-VFLI*u+f<@y&SeTKjI83U4^<`6_6Cdh$_X_A!cIV6*-AK@&e-1lX9{$ z;#PEQn`9w%`U*WzC+ECTr`NMDiuk?F3I8e=%1Gi7TJM}D-F3_v${edcZOV>C3lCHb z8+F6s`M-Gm`ZbsDS+;D~__V28=P!Ne`k|w5IkicJ|Jav1`W+oIbXoYq!f5Y?^-Mwz&fblpkDKx?w{1qIDSgMzi)O z&l+S~tXp`tA=?6+lNe9b217qE>iA6KTODZ*S#bshG5cEFaD&-Ge(p?Pdxv38ZQ|_I zhdjE~#$%GNN4j2Tr~aj-Vi_?nkdfDR&~g!Phq;vxq!pDQIWVYAtQBy4fqe?vx5oB~ zP!DjckLp%~_KJ5k*q-&|?;G2%M)u0!ojjhA#Z1o`U;aFXKUYH&9}Jzsh<@vhRfT(w zG?9A2FO=z-6qwiEn_ZaaQ?SY@+1o)R+|y`N5NE_C$n-U>u23KV#M|L%@{jl_lg4IlKm~VF7UVT8Arjb4g9$@)_0Cm(RZGm zP446yWYt=SzQmZEW4a3CEUb_>JGEcHkui@6Vn(!f4`?Yz8Kw*(Y#HSDQ}*ZGhmbp@ zh&N29jDSND`9tUnwEkCVT@81?@O6BPujArdQlx{v!a`RM<2Z*jT*ogtM|iy2XJn6;eMa$ki_}8M6gyHxrG3W6SQX|W!Gc5ekFhGuR)R%Tjj*VyMffUL z$AQ)2M99uSle}TbKCk%Vw9_t}m8)(*^XX2|P%s^@wSkJ8BE*L5jVHi`zN*29aX)Fq zs0wdA^JaDl^0o$d$9)Q_F!ruU8awQK^)Y`A^XJ{Tb&l?`NXJeW`EMcI(m>Ld3^3)o z_cD5wd%61#=?v8){oLolyP**F>^4SY>%d-pmdM(?O+4{d_?4CrG%K9K`JBlf)gJcc ztZZ04J*sKQEn|VONRLGKXgo z0za@-0q&hK2N38!fet_m!X1g{@WopfVc3Lln zo(5fKk8ZDfhUq#XzrRk?&2h#>p5ja&JPAmBmJQv+NN#k-HLJu5&ACrUZSaY0-!P+TM4fUwv0#uE?+X3*;pyAN=Czo$4A;T^ojy~pEItq$`V7fMFd z>F@L4w3ZP%#B0bm9@RizLzqghA&s%qAfpHV9hE4MgJ6+G!N1tDH(kjpbuDC3iaolf ztJ^phW&PU7aH zuuh(Xg>4hB;Gm6Ns!8oU$dMnlWN{#`Y2d5R|Tu-$~ZxzwMWnn zsT2>5%IvPzy(F|vfz|&Iopj;RAUZGi3Mm|hRl1TRxIcQM_O^%D4?awcyJc88mU0C8 zy^Pubia;$h6H9VThY&-Ab}`y#f~K~6XakT1jG-L_U5L@59-YL!mPvFmJk%IjRqTzR z#t7V|;q|HDnqOx>g%2pC~l=WUQThZ_;P!)SrBXBYvx-b+$!(Ly`g0;uTQfG{pRW9o(74Nfi!}<&~ zyHEHk9}RRn-19t^g@C(LOHlB3YrHq0fg>1?%KUk|oAJ6}jCO`+d3a&<#s-_wXj|*{ zMreQ5XlIR69(QdZ!AY8qxN8Glcc`~Jvr|`bqQufCKjf`jmbG6E&c8%8 zIRBDl-l5*Qgq^(2CrV6RA1=R?K2XLN|AN=@mhlX0tIfrsu@M&e->CcWmT{|B`%Pog zc#LCsul+>4*Zvt^Gun?4{@ylz3vYxh9~G}&+h~kw&$yWT@itD)HRCZR{y3#0W6au4 zxp%?)2zcW(-m*q`Pief5fY(yvaUv-oGuop99!8#PYlAYoNXtxD+XiJuReIo0acW+aUHi>2C06cB%89RO<%1F&^Dq>@*?2 z+z*S!Nmp9{@ocEZPw;B(d8m{|G)P*uo`%FE9Afx<+1}UeBD}@y2=aM2W4>L3uJJjbS?id?TICM)2=Q zZ#vYQgGFynl*CR;$nQ>Jq~48?1|egQU({MDtU)RS!>ToC7ry&VxExg5gv$H@a|(VR zQR!UuZ*Z7$8f&*;)mfLr(m-n?%=Jyac5imh1nR?JC9PgO3(Q8dV59Q_D%R;tf%tTF z_6N`|tb=qqAutQ(IH#>oc(#a7S7$FlMFY{bBDy>LcEv}0LgUri52>qZCCmh!u4iNq zF|z__@BwFqc-57u!;1KsW5jeL*(fQ#w4 z;2qF-Zx~-<_7NQw{*2Xngj12$C*e|$JLvdo(s57$EvDmwMs*-Oa_TIqsmb=rsfXbj zjkq(ybsFvLI^m6qe_}c=Xzy#ZH*prMm*(x_AR2hPN29%Y!yh$oF&$^AMurI*>p0Gz zv96MIvEmIz^JbfZfbd}}IHLDm)((!c;|Bj?hzY}TG?|{JdF7msZu^VtjWGGs^ zkF~dg;%!LO%7?pl39;{4NxO{mHoHBl`I5KEL5(U4il`c66{%do8v4($ii{@&Yw(3w zk7&MX?I+ch#McmDaUp`{i}g|Xszo+~^wG)%mexn%i{d=#<3Yn!RBL2i3arTu`}hH< z1nVGnT&Z%*Dgu_a-#0rihOP*A(^z%(I~Z^Hslz}On0KYlQ+An6v6-ON+1I(>5nUdV zbb-~Z5`Hf#BtVzPBU@*`z<8>YNZOyD_rmYJ7x@kUtWKSceFK`u-C%M9?Mej)`MrWy zYge(~i%=}!_ewp;YK>Nl8i-`{)l7z-aFaB;z=F?D5y}0Y)X9qi)kWA<=B0|LfMx%Z zbIf}@s=1u!veMC0o#$$dRiru!R_Z^)D#BSp%9&XgUx-C^S@^28E7>laDZtWpnfYRG zT==TB3sCa{te(Ky<4axmqLp2+4&uZIM}vKl0?;eF^zj8y2^LNq@;NqZAh2{@Ri*P> zXczBo3KnE3wzfO##?J$?#EW|rPY7C_T_!rz3vC8u+12?y@8J5i8Fls!Su>imZmjb0 z(w*McI@S$}FUhn1+P#`|BNaR3C*8+NJx~mZ%P%S@)nqrmm@aA{0j_qUh1;!EjnPB>_ zc|$+@;?3_BJUZV|uVLS=ZGwv455JP`CnxN|A6wsU4$dQcqTC8;sP#^Q- z4P&u4hVFT1I=wp$stH~n&$v$zRbE_-N@{UA<^~pgAB>Wnj~#%H@OV2HH2+x_q+t@8 zZYq+S;OS5GIJ644{6n)mtUvwTXN;uttf&B@LJ8pD9{aGCHU9Ak9Hl$mkBH@;;!uX#_?`_A+ zX+vx~`cF-?#sk2pl%xA0l)f~IP8JniaB)=hPXES;^FJ&x@5gDv$CjRd&#uKK4z`hq z9z2iv=C__%&;d`$H(&sdO2(VJv0Sl#(#Q(A?2&dE8` z?$>H%hErCczHv51pOxz{oc!pU*QnD!K5wQhimnQcpnEV(zcK}@YjXo{Qa4w2#7amA zTXqKboPf)>yi%_57pX;y=Av4~C*KRMYUeFud5Dgd3>rcq=h6E@Z_X^6o&- zz<9l&mb%B8=*K&1y;{HB8KGX?;jDI6ZC9^3!>wM_q3HeQf@pR$*}NgT$^6v(U33{F zX8OCo!M5UUuPwRk182^fZtG>0s1mn0536~1IG;Ly+N|a|51WsZLOSDBee~<-yXqw; z*X(Jwancqpgtg@Q9LnWVeGWb&mu?$u%dp=A>-mbi&sjl!4Bi+vPO4`9+Ty*Ph8*zC z{5v_-G!>Q-l`^pA6{u0V!p|ECWn(6&rJp0y`hhQw@vWOI`^+=SLpU@{vlm*@=&UIoUPp}cLEWzStAr>1>JfV~s{vyFS{ZyFvW+ zY@6s7`}$6JcSPA-KsSMF@~u3^(>3|TA64g|I@9Ct8|KeSf{z^N?{4P|>f?w%_AkKS za_I*Z?FQ&*4*u(UC7OdrIbxW|tyZWa_VQ_R8C^)|WK-(hK6H8vZ6bzYSv+jaqcM>a zTCe(JyxZ*&JUs^9hM>w)(>>wSp|8OcTAI%>k1zt9dDJKTF5#Jk5i6HejWic~Yyg{p-vr(wG!3##PwPfFF<|0C_nNi*Fp z%YyO5g4Njzn9ii2T_E-nyL1-)V7sJVw|60qCi_aqGmtjqC zqL|{xd>*}nIGxP#V@Iq_I)20&Xx&6Rom7ji5C`S(2|}XLD^of~cpHzfAl2CiWQ1F= z<O#ku&h7-SDxggxq3uf;Z>C4rtx394@R!AS z!-dY?!*t%P)%?u>f2$d<%%dCC6rJ-Y!oMKMcjt;KXV zM{sBG0OUZ?l$D4*h&(5)E3N}vPAvrJ_U!5p68Q`I|*8|*P0P<_E0^7t*yz%78K l&fEq&3WT~gYYqCa; z6!mt~Xnq}+zt4`uj_M;0!@Wc}n8p7GKT|hWz8}kSkbf<_gUx8Ao@IG6ZH|(N( tjbEZqAqj2;E!D_=L|KO&R6gase^RZ_ICjCMQmd6|1Qof&$(wT6@B>8{UF-k= delta 293 zcmaE1(qmlDz{tSBAOIv-7#Q4xL!Bn`HZd_UFwOvqn)nCn8x=P;USMEg>H+c-fRMw}tRi6Y3u+{(tw`HUzrZD^K%mNw!lxHx@019yJVqFT9 zD*^IVGIC2Q1a~oB0rFLVe1V+&0>^;zCP2PIUSe*l{7Vm@ z@0fuOVw_NrUtID(mmvkn4gtv*6mg{%R7RY;%)r2IGFgLh^5oZyxhxk}y!V+L!}MVD I3FZZ20Ln8*!~g&Q diff --git a/test/subset/data/expected/instantiate_glyf/Roboto-Variable.ABC.default.retain-all-codepoint.wght=650,wdth=85.ttf b/test/subset/data/expected/instantiate_glyf/Roboto-Variable.ABC.default.retain-all-codepoint.wght=650,wdth=85.ttf index ad3031ba6969303d22e25b90e04b0b13c988b40a..2b44f1fe075201cf17f9f34d3ab046b7a42bfa4b 100644 GIT binary patch delta 513 zcmYk3KS)AR6vn^%o>qvF2>mk$iHHcJkcc1BU}=LqrkL(Dovt zJ!lMS2&blKh!R>F3K|+(YHrHDYY?5wz3=?aIrp6N&V7ztjc!2z@bhpX6pzi!LZSr_ zSG11AlZll3?c*BI2gnEU)clmwx}(wmP99C9h9hg!+ciMDB`>AYlj+6NXr8=Jj%F-F z!iytvP{n7~?a;(m|0eTYlD}7EcFQ_*??wR6IncJ3HC9#mZWb74fHzyHtUOJ;egaK> zv{iGav8*S;Crp^6e=J9Xr|LeX?~vS=v+NCjmq?RiWM83_F+@9#$zig`GB%`s>AN8_ z2BD%cXqmyD$p`*EI}%csR_(flW$LyHkY!U=7VaN`=2xdhI71rxX;uBifsuiMK>$dwFfh0WhdNE>ZDL|zV4MLIHSrJDH!5{*yuiS~Q~~5C1cx|= z#4NST2J$U{e7oe_!~zB$hG{_cXF%$c%Ssfif2h?0esRhFT!s`N8)ycDLO~H%YC&bhxyuX;>@1Tt7$;AD&6vxwS>RIK OB5Nxf96$0puqHhd74BzH^uX74v=q_0Tkfc#R{~HaSM>Il95|d!84nY2gr8;^7(S|lM@-* z7!rVd9Uz}8H?g9Cd5gd?Aio62SIA4$%1xDj=>haUs{>GQLP36U$^Tr26d-#FNI^kS zYC&bhxyuX;Y!@bTFd9m7F~|TRql=qQ2+*M{Ks5~i|AWZMMvR%7ObkjOHW2Uu!<89G e3&1fboIzrYK*%t824exsrR=@Tn|YWvhyeg`|4#n^ delta 293 zcmZ2sw8yZXfsuiMK>$dwFfh0WhdNE>ZDL|zV4MLIHSrJDH!5{*?qpzK>H+c-fBQ-IF*Mc&ODcF~Gx7lWDnLG8PJVJCLmNW^kPj4N;L1&`C}7?qa16)?TF9V~mzbL> z|I!2GJD`IYClurtm;BFVNCC1#K=K7eT&V?>5$7&5FtDXe)?hT8T*;U;nVl(@<<+jw Lb(<@gHi!WLH~B^1 diff --git a/test/subset/data/expected/instantiate_glyf/Roboto-Variable.composite.default.retain-all-codepoint.wght=650,wdth=85.ttf b/test/subset/data/expected/instantiate_glyf/Roboto-Variable.composite.default.retain-all-codepoint.wght=650,wdth=85.ttf index ba3ddca6ef1ee75b66df175040babf98ba80e054..9ed86290b89b8ac86ec9efd3a4b4b647803be18d 100644 GIT binary patch delta 393 zcmeA%{9#znz{tSBAOs{>7!=%HT-_Kl7}yvX7;gYYwcG>zgI!8|N`d?kAYaZsIMit} zZxa&(0}~67Z{i=UZ&c3O+zI4A0rC@qLmWe5mfB?l`AdL&yX4%&0tP-Ne<0riq&~T< zM8W!pS}o8r10erjT0we!?h4ixBL)V}0tN>Dw)Di}0tOBSNuY%w4Ls>Nm1$F@dHom| zm|cMUR~e~^Da`&lvw#NX0QqJaKmo2@tU${cw*dJn8M!4DyebS=fqam9zMTBzM21d= zBp_c0$mhyUtSDgKB5(}IF9Gru@)EUjQ)Q$b&oeNv0$s#dP>^3-@;{d$1<0NPQczHo zT2L8r?lJ=d+k(j)jE0h23^G8-=;G!R0(2+~Pz}TX{~&U*5o4w%6N3_n4Fr6^aAgM4 d0&olpXOI{p5Hd`j!C1heQSGpGGY?aP7yxmxOi%y- delta 293 zcmexi*kf4Fz{tSBAOIv-7#Q4xL!Bn`HZd_UFwOvqn)nCn8^xPG!Ek+CsoIun0 z+tL$@3m7;UB!TKBfbu-)IhFNkQ>A(RfCk+61Gx-l89)K9U93xh z8cKkCm5khy3SJe4t3bXAkk6NspPb0h$&du(^8oo=xrr48%v%JG0r@6CzCvDNZmNv5 z<9VR(fDU3TD9A4^`Jc;>0%V7PMwE J%@s@yVgS8PLNNdU diff --git a/test/subset/data/expected/pin_all_at_default/Roboto-Variable.ABC.default.retain-all-codepoint.wght=400,wdth=100.0.ttf b/test/subset/data/expected/pin_all_at_default/Roboto-Variable.ABC.default.retain-all-codepoint.wght=400,wdth=100.0.ttf index 936647c4cfc40c0f5aa9a257263f83c0a49fc217..1523a99f9e018230144e18725fcf1e4d7bc1e830 100644 GIT binary patch delta 514 zcmYk3&r1SP5XZl7S3^umB!Z-agcO8P^oyVf5>vv!K!Ywt%eE=x+G0y26jDTV=%!S3 zjDqe(M5j(2gXo_KD(H~VN&7y9Xdds!XJ+2aym|M-mC+Ie06!N8g7N4~3>I8~xTkh7 zKA%iEKRzD;b(MS^Pc1~s-hGAkH}Xg_H85n)?!5rY5qTw*o=zLJ$TwNqcXU&;;K2#G zOZw|uc5vdSXP5E5$h9>qQ!=le2SY%s2WUIYXqz&9Clid*!IQ}q*Fx{hV?fIRb$3}q zTUC?ca|WEJeJo3b`@wldTZJ6Tn)bH8DlW)TvM;xxYr>CHa+vHkwQWni^*xc(K-Lk*HW3n|9p8z}WU1F(j5qmY;1 t(InawlHgR(-S8Yon2A_Iy(;hhlSTpbV;LMOPhJ^D@F0h{X;&{hegOk;TnqpJ delta 294 zcmbPYy2H4hfsuiMK>$dwFfh0WhdNE>ZDL|zV4MLIHSrJDH!AULyvV@7WC7$S1cx|= zr2cdI0_20_Ym##l3mAA9rUBKT0jW0>^-S6Cht9FEKY& zq2AjY=sTc;7^f8E7nl6cWk>)`l@aGIGcd3xOx9qWJozvv!K!Ywt%eE=x+G0y26jDTV=%!S3 zjDqe(M5j(2gXo_KD(H~VN&7y9Xdds!XJ+2aym|M-mC+Ie06!N8g7N4~3>I8~xTkh7 zKA%iEKRzD;b(MS^Pc1~s-hGAkH}Xg_H85n)?!5rY5qTw*o=zLJ$TwNqcXU&;;K2#G zOZw|uc5vdSXP5E5$h9>qQ!=le2SY%s2WUIYXqz&9Clid*!IQ}q*Fx{hV?fIRb$3}q zTUC?ca|WEJeJo3b`@wldTZJ6Tn)bH8DlW)TvM;xxYr>CHa+vHkwQWni^*xc(K-Lk*HW3n|9p8z}WU1F(j5qmY;1 t(InawlHgR(-S8Yon2A_Iy(;hhlSTpbV;LMOPhJ^D@F0h{X;&{hegOk;TnqpJ delta 294 zcmbPYy2H4hfsuiMK>$dwFfh0WhdNE>ZDL|zV4MLIHSrJDH!AULyvV@7WC7$S1cx|= zr2cdI0_20_Ym##l3mAA9rUBKT0jW0>^-S6Cht9FEKY& zq2AjY=sTc;7^f8E7nl6cWk>)`l@aGIGcd3xOx9qWJoz Date: Tue, 30 Aug 2022 09:08:09 -0700 Subject: [PATCH 11/11] [instance] Fix os/2 table width to widthclass mapping --- src/hb-ot-os2-table.hh | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh index 780d9627c..c6e8fad6f 100644 --- a/src/hb-ot-os2-table.hh +++ b/src/hb-ot-os2-table.hh @@ -175,10 +175,36 @@ struct OS2 int a = (int) floorf (ratio); int b = (int) ceilf (ratio); + /* follow this maping: + * https://docs.microsoft.com/en-us/typography/opentype/spec/os2#uswidthclass + */ + if (b <= 6) // 50-125 + { + if (a == b) return a + 1.0f; + } + else if (b == 7) // no mapping for 137.5 + { + a = 6; + b = 8; + } + else if (b == 8) + { + if (a == b) return 8.0f; // 150 + a = 6; + } + else + { + if (a == b && a == 12) return 9.0f; //200 + b = 12; + a = 8; + } + float va = 50 + a * 12.5f; float vb = 50 + b * 12.5f; - return a + 1.0f + (float) (b - a) * (width - va) / (vb - va); + float ret = a + (width - va) / (vb - va); + if (a <= 6) ret += 1.0f; + return ret; } bool subset (hb_subset_context_t *c) const