From 96295db1f060def83b50e99fdc00e289111f6bd1 Mon Sep 17 00:00:00 2001 From: Dylan Hillier Date: Fri, 30 Aug 2024 16:16:45 +0800 Subject: [PATCH 1/8] adds the loraweightsharing layers --- models/experimental/weight_sharing.py | 90 +++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 models/experimental/weight_sharing.py diff --git a/models/experimental/weight_sharing.py b/models/experimental/weight_sharing.py new file mode 100644 index 00000000..e1cf5b9b --- /dev/null +++ b/models/experimental/weight_sharing.py @@ -0,0 +1,90 @@ +from models.core_models import GenericTransformer +import torch +from torch import nn +# params: k_interior_layers, lora_rank + +class LoRA(nn.Module): + def __init__(self, linear_layer, lora_rank): + """Wraps the linear layer with LoRA""" + super().__init__() + self.linear_layer = linear_layer + self.lora_rank = lora_rank + self.U = nn.Parameter(torch.randn(linear_layer.out_features, lora_rank)) + self.V = nn.Parameter(torch.randn(lora_rank, linear_layer.in_features)) + self.bias = linear_layer.bias + self.weight = linear_layer.weight + + def forward(self, x): + """Forward pass through the linear layer with LoRA""" + # compute the LoRA weight matrix + W = self.weight + torch.matmul(self.U, self.V) + return torch.nn.functional.linear(x, W, self.bias) + +class FFNInteriorLora(GenericTransformer): + def __init__(self, model_cfg): + super().__init__(model_cfg) + self.k_interior_layers = model_cfg["k_interior_layers"] + self.lora_rank = model_cfg["lora_rank"] + # share the weights between transformer blocks in layers 1+k_interior_layers to D-k_interior_layers + base_layer = 1 + self.k_interior_layers + for i in range(1 + self.k_interior_layers, len(self.transformer.h) - self.k_interior_layers): + for name, param in self.transformer.h[i].ffn.named_parameters(): + # set the param to the corresponding param in the base layer + base_param = getattr(self.transformer.h[base_layer].ffn, name) + param.data = base_param.data + # wrap the linear layer with LoRA + setattr(self.transformer.h[i].ffn, name, LoRA(base_param, self.lora_rank)) + + + + + + + + + +# class GenericTransformer(torch.nn.Module): +# """ +# Generic Transformer Class intended to be used for as +# broad a range of transformer models as possible. +# """ + +# def __init__(self, model_cfg): +# super().__init__() + +# # build the transformer +# self.transformer = torch.nn.ModuleDict( +# { +# "drop": torch.nn.Dropout(), +# "h": torch.nn.ModuleList( +# [ +# GenericTransformerBlock( +# hidden_dim=model_cfg["hidden_dim"], +# context_window=model_cfg["context_window"], +# use_rope=model_cfg["positional_encoding_type"] == "rope", +# ffn_cfg=model_cfg["core_model"]["ffn"], +# attn_cfg=model_cfg["core_model"]["attn"], +# ) +# for _ in range(model_cfg["core_model"]["num_layers"]) +# ] +# ), +# } +# ) + +# def forward(self, x): +# """ +# Pass an input through the model +# Args: +# x: torch.tensor(B, S, H) +# Returns: +# x: torch.tensor(B, S, H) +# """ + +# # apply dropout +# x = self.transformer.drop(x) + +# # pass through the transformer blocks +# for block in self.transformer.h: +# x = block(x) + +# return x \ No newline at end of file From 065e5ba89e9a1628ea10a7cb43a79b8e2d783908 Mon Sep 17 00:00:00 2001 From: Dylan Hillier Date: Fri, 30 Aug 2024 16:16:57 +0800 Subject: [PATCH 2/8] makes it optional eh --- models/experimental/weight_sharing.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/models/experimental/weight_sharing.py b/models/experimental/weight_sharing.py index e1cf5b9b..6c5a2cf8 100644 --- a/models/experimental/weight_sharing.py +++ b/models/experimental/weight_sharing.py @@ -33,7 +33,8 @@ def __init__(self, model_cfg): base_param = getattr(self.transformer.h[base_layer].ffn, name) param.data = base_param.data # wrap the linear layer with LoRA - setattr(self.transformer.h[i].ffn, name, LoRA(base_param, self.lora_rank)) + if self.lora_rank is not None: + setattr(self.transformer.h[i].ffn, name, LoRA(base_param, self.lora_rank)) From a296f4894f3c4f1354f96bafe64bb43ddfc6fd7c Mon Sep 17 00:00:00 2001 From: Dylan Hillier Date: Thu, 5 Sep 2024 15:28:58 +0800 Subject: [PATCH 3/8] fixes attention to work for freaky values of hidden_dim --- models/build_models.py | 4 +++- models/components/layers/attention.py | 26 ++++++++++++------------ models/experimental/weight_sharing.py | 29 ++++++++++++++------------- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/models/build_models.py b/models/build_models.py index 36236091..7eeff965 100644 --- a/models/build_models.py +++ b/models/build_models.py @@ -12,6 +12,7 @@ from models.experimental.next_thought.embedding_models import HierarchicalEncoder from models.experimental.next_thought.model_heads import VariableLengthLatentDecoder from models.experimental.next_thought.core_models import BaselineCoreModel, Conv1dCoreModel +from models.experimental import weight_sharing from models.model_heads import AutoregressiveLMHead from models.model_shell import ModelShell @@ -70,7 +71,8 @@ def build_embedding_model(model_cfg): "generic_ffn_sharing": GenericFFNSharedTransfomer, "hf_core": HFTransformerCore, "next_thought_baseline": BaselineCoreModel, - "conv": Conv1dCoreModel + "conv": Conv1dCoreModel, + "weight_sharing": weight_sharing.SharedInteriorFFNLora, } diff --git a/models/components/layers/attention.py b/models/components/layers/attention.py index 41b06b37..21f94a6e 100644 --- a/models/components/layers/attention.py +++ b/models/components/layers/attention.py @@ -21,15 +21,16 @@ def __init__( group_size, ): super().__init__() - assert hidden_dim % num_heads == 0, "Hidden dim must be divisible by num heads" - + self.head_dim = 2 * ((hidden_dim // num_heads) // 2) # make sure it's even + self.effective_hidden_dim = self.head_dim * num_heads # different for certain head_dims + self.group_dim = self.head_dim * group_size # key, query, value projections for all heads self.c_attn = torch.nn.Linear( - hidden_dim, hidden_dim + 2 * hidden_dim // group_size, bias=bias + hidden_dim, self.effective_hidden_dim + 2 * self.group_dim, bias=bias ) # output projection - self.c_proj = torch.nn.Linear(hidden_dim, hidden_dim, bias=bias) + self.c_proj = torch.nn.Linear(self.effective_hidden_dim, hidden_dim, bias=bias) # attention dropout self.attn_dropout = torch.nn.Dropout() @@ -43,7 +44,7 @@ def __init__( if self.use_rope: assert context_window % 2 == 0 self.freqs_cis = compute_freqs_cis( - seq_len=context_window, head_dim=hidden_dim // num_heads + seq_len=context_window, head_dim=self.head_dim ) def forward(self, x, attention_mask=None): @@ -51,16 +52,15 @@ def forward(self, x, attention_mask=None): Forward pass """ assert attention_mask is None, "Not implemented yet" - B, S, H = x.size() + B, S, _ = x.size() num_grouped_heads = self.num_heads // self.group_size - group_hidden_dim = H // self.group_size # calculate query, key, values for all heads in batch # move head forward to be the batch dim - q, k, v = self.c_attn(x).split([H, group_hidden_dim, group_hidden_dim], dim=-1) - k = k.view(B, S, num_grouped_heads, H // self.num_heads) # (B, T, nh, hs) - q = q.view(B, S, self.num_heads, H // self.num_heads) # (B, T, nh, hs) - v = v.view(B, S, num_grouped_heads, H // self.num_heads).transpose( + q, k, v = self.c_attn(x).split([self.effective_hidden_dim, self.group_dim, self.group_dim], dim=-1) + k = k.view(B, S, num_grouped_heads, self.head_dim) # (B, T, nh, hs) + q = q.view(B, S, self.num_heads, self.head_dim) # (B, T, nh, hs) + v = v.view(B, S, num_grouped_heads, self.head_dim).transpose( 1, 2 ) # (B, nh, T, hs) @@ -86,11 +86,11 @@ def forward(self, x, attention_mask=None): ) # pylint: enable=not-callable y = ( - y.transpose(1, 2).contiguous().view(B, S, H) + y.transpose(1, 2).contiguous().view(B, S, self.effective_hidden_dim) ) # re-assemble all head outputs side by side # output projection - y = self.attn_dropout(self.c_proj(y)) # is this really necessary? + y = self.attn_dropout(self.c_proj(y)) # Reshape to original dim return y diff --git a/models/experimental/weight_sharing.py b/models/experimental/weight_sharing.py index 6c5a2cf8..3558080d 100644 --- a/models/experimental/weight_sharing.py +++ b/models/experimental/weight_sharing.py @@ -9,32 +9,33 @@ def __init__(self, linear_layer, lora_rank): super().__init__() self.linear_layer = linear_layer self.lora_rank = lora_rank - self.U = nn.Parameter(torch.randn(linear_layer.out_features, lora_rank)) - self.V = nn.Parameter(torch.randn(lora_rank, linear_layer.in_features)) - self.bias = linear_layer.bias - self.weight = linear_layer.weight + self.U = nn.Linear(linear_layer.in_features, lora_rank) + self.V = nn.Linear(lora_rank, linear_layer.out_features) def forward(self, x): """Forward pass through the linear layer with LoRA""" # compute the LoRA weight matrix - W = self.weight + torch.matmul(self.U, self.V) - return torch.nn.functional.linear(x, W, self.bias) + return self.linear_layer(x) + self.V(self.U(x)) -class FFNInteriorLora(GenericTransformer): +class SharedInteriorFFNLora(GenericTransformer): def __init__(self, model_cfg): super().__init__(model_cfg) self.k_interior_layers = model_cfg["k_interior_layers"] self.lora_rank = model_cfg["lora_rank"] # share the weights between transformer blocks in layers 1+k_interior_layers to D-k_interior_layers base_layer = 1 + self.k_interior_layers + ffn_0 = self.transformer.h[base_layer].ffn + shared_weights = {} + for name, module in ffn_0.named_modules(): + if isinstance(module, torch.nn.Linear): + shared_weights[name] = module.weight for i in range(1 + self.k_interior_layers, len(self.transformer.h) - self.k_interior_layers): - for name, param in self.transformer.h[i].ffn.named_parameters(): - # set the param to the corresponding param in the base layer - base_param = getattr(self.transformer.h[base_layer].ffn, name) - param.data = base_param.data - # wrap the linear layer with LoRA - if self.lora_rank is not None: - setattr(self.transformer.h[i].ffn, name, LoRA(base_param, self.lora_rank)) + for name, module in self.transformer.h[i].ffn.named_modules(): + if isinstance(module, torch.nn.Linear): + module.weight = shared_weights[name] + # wrap the linear layer with LoRA + if self.lora_rank is not None: + setattr(self.transformer.h[i].ffn, name, LoRA(module, self.lora_rank)) From 7c3561adfe2050475af4b429fc870794974d1dae Mon Sep 17 00:00:00 2001 From: Dylan Hillier Date: Thu, 5 Sep 2024 15:29:19 +0800 Subject: [PATCH 4/8] adds the experimental configs to be run --- configs/full_configs/baseline.yaml | 4 +- configs/full_configs/shared_baseline.yaml | 85 ++++++++++++++++++ configs/full_configs/shared_deep.yaml | 87 +++++++++++++++++++ .../full_configs/shared_k_1_wide copy.yaml | 87 +++++++++++++++++++ configs/full_configs/shared_k_2_wide.yaml | 87 +++++++++++++++++++ configs/full_configs/shared_r_64.yaml | 87 +++++++++++++++++++ .../full_configs/shared_r_64_k_1 copy.yaml | 87 +++++++++++++++++++ configs/full_configs/shared_r_64_long.yaml | 87 +++++++++++++++++++ configs/full_configs/shared_wide.yaml | 87 +++++++++++++++++++ configs/general/default.yaml | 2 +- 10 files changed, 697 insertions(+), 3 deletions(-) create mode 100644 configs/full_configs/shared_baseline.yaml create mode 100644 configs/full_configs/shared_deep.yaml create mode 100644 configs/full_configs/shared_k_1_wide copy.yaml create mode 100644 configs/full_configs/shared_k_2_wide.yaml create mode 100644 configs/full_configs/shared_r_64.yaml create mode 100644 configs/full_configs/shared_r_64_k_1 copy.yaml create mode 100644 configs/full_configs/shared_r_64_long.yaml create mode 100644 configs/full_configs/shared_wide.yaml diff --git a/configs/full_configs/baseline.yaml b/configs/full_configs/baseline.yaml index 85b5e908..1248ebec 100644 --- a/configs/full_configs/baseline.yaml +++ b/configs/full_configs/baseline.yaml @@ -75,11 +75,11 @@ trainer: name: cross_entropy general: logging: - wandb_log: false + wandb_log: true wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: data + data_dir: "../scratchDirectory/STLMData" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_baseline.yaml b/configs/full_configs/shared_baseline.yaml new file mode 100644 index 00000000..a826593e --- /dev/null +++ b/configs/full_configs/shared_baseline.yaml @@ -0,0 +1,85 @@ +model: + core_model: + core_model_type: generic + num_layers: 8 + ffn: + ffn_type: swiglu + ffn_dim: 1361 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 528 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: true + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "../scratchDirectory/STLMData" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_deep.yaml b/configs/full_configs/shared_deep.yaml new file mode 100644 index 00000000..929224df --- /dev/null +++ b/configs/full_configs/shared_deep.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 0 + lora_rank: null + core_model: + core_model_type: weight_sharing + num_layers: 14 + ffn: + ffn_type: swiglu + ffn_dim: 1568 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 608 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: false + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "../scratchDirectory/STLMData" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_k_1_wide copy.yaml b/configs/full_configs/shared_k_1_wide copy.yaml new file mode 100644 index 00000000..b04e797b --- /dev/null +++ b/configs/full_configs/shared_k_1_wide copy.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 1 + lora_rank: null + core_model: + core_model_type: weight_sharing + num_layers: 8 + ffn: + ffn_type: swiglu + ffn_dim: 1568 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 608 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: false + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "../scratchDirectory/STLMData" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_k_2_wide.yaml b/configs/full_configs/shared_k_2_wide.yaml new file mode 100644 index 00000000..20436292 --- /dev/null +++ b/configs/full_configs/shared_k_2_wide.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 2 + lora_rank: null + core_model: + core_model_type: weight_sharing + num_layers: 8 + ffn: + ffn_type: swiglu + ffn_dim: 1444 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 560 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: false + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "../scratchDirectory/STLMData" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_r_64.yaml b/configs/full_configs/shared_r_64.yaml new file mode 100644 index 00000000..b94e2e9a --- /dev/null +++ b/configs/full_configs/shared_r_64.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 0 + lora_rank: 64 + core_model: + core_model_type: weight_sharing + num_layers: 8 + ffn: + ffn_type: swiglu + ffn_dim: 1650 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 640 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: false + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "../scratchDirectory/STLMData" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_r_64_k_1 copy.yaml b/configs/full_configs/shared_r_64_k_1 copy.yaml new file mode 100644 index 00000000..6a3d2d15 --- /dev/null +++ b/configs/full_configs/shared_r_64_k_1 copy.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 1 + lora_rank: 64 + core_model: + core_model_type: weight_sharing + num_layers: 8 + ffn: + ffn_type: swiglu + ffn_dim: 1527 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 592 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: false + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "../scratchDirectory/STLMData" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_r_64_long.yaml b/configs/full_configs/shared_r_64_long.yaml new file mode 100644 index 00000000..51028408 --- /dev/null +++ b/configs/full_configs/shared_r_64_long.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 0 + lora_rank: 64 + core_model: + core_model_type: weight_sharing + num_layers: 12 + ffn: + ffn_type: swiglu + ffn_dim: 1527 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 592 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: false + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "../scratchDirectory/STLMData" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_wide.yaml b/configs/full_configs/shared_wide.yaml new file mode 100644 index 00000000..ed23dfe5 --- /dev/null +++ b/configs/full_configs/shared_wide.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 0 + lora_rank: null + core_model: + core_model_type: weight_sharing + num_layers: 8 + ffn: + ffn_type: swiglu + ffn_dim: 1733 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 672 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: false + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "../scratchDirectory/STLMData" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/general/default.yaml b/configs/general/default.yaml index 9467d1c2..45a220d6 100644 --- a/configs/general/default.yaml +++ b/configs/general/default.yaml @@ -4,7 +4,7 @@ logging: paths: output_dir: "outputs" - data_dir: "data" + data_dir: "../scratchDirectory/STLMData" checkpoint_dir: "checkpoints" seed: 489 From 471d1f228e1d9ad6d82ad5954d870d8eaa9abe27 Mon Sep 17 00:00:00 2001 From: Dylan Hillier Date: Fri, 6 Sep 2024 17:10:13 +0800 Subject: [PATCH 5/8] updates configs --- configs/full_configs/baseline.yaml | 2 +- configs/full_configs/shared_baseline.yaml | 2 +- configs/full_configs/shared_deep.yaml | 4 +- ..._1_wide copy.yaml => shared_k_1_wide.yaml} | 4 +- configs/full_configs/shared_k_2_wide.yaml | 4 +- configs/full_configs/shared_r_64.yaml | 4 +- ..._64_k_1 copy.yaml => shared_r_64_k_1.yaml} | 4 +- .../full_configs/shared_r_64_k_2_long.yaml | 87 +++++++++++++++++++ configs/full_configs/shared_r_64_long.yaml | 4 +- .../shared_untied_inputoutput.yaml | 85 ++++++++++++++++++ configs/full_configs/shared_wide.yaml | 4 +- configs/general/default.yaml | 2 +- 12 files changed, 189 insertions(+), 17 deletions(-) rename configs/full_configs/{shared_k_1_wide copy.yaml => shared_k_1_wide.yaml} (96%) rename configs/full_configs/{shared_r_64_k_1 copy.yaml => shared_r_64_k_1.yaml} (96%) create mode 100644 configs/full_configs/shared_r_64_k_2_long.yaml create mode 100644 configs/full_configs/shared_untied_inputoutput.yaml diff --git a/configs/full_configs/baseline.yaml b/configs/full_configs/baseline.yaml index 1248ebec..cb40ed5a 100644 --- a/configs/full_configs/baseline.yaml +++ b/configs/full_configs/baseline.yaml @@ -79,7 +79,7 @@ general: wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_baseline.yaml b/configs/full_configs/shared_baseline.yaml index a826593e..607f4db0 100644 --- a/configs/full_configs/shared_baseline.yaml +++ b/configs/full_configs/shared_baseline.yaml @@ -79,7 +79,7 @@ general: wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_deep.yaml b/configs/full_configs/shared_deep.yaml index 929224df..91bb002b 100644 --- a/configs/full_configs/shared_deep.yaml +++ b/configs/full_configs/shared_deep.yaml @@ -77,11 +77,11 @@ trainer: name: cross_entropy general: logging: - wandb_log: false + wandb_log: true wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_k_1_wide copy.yaml b/configs/full_configs/shared_k_1_wide.yaml similarity index 96% rename from configs/full_configs/shared_k_1_wide copy.yaml rename to configs/full_configs/shared_k_1_wide.yaml index b04e797b..eed263a3 100644 --- a/configs/full_configs/shared_k_1_wide copy.yaml +++ b/configs/full_configs/shared_k_1_wide.yaml @@ -77,11 +77,11 @@ trainer: name: cross_entropy general: logging: - wandb_log: false + wandb_log: true wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_k_2_wide.yaml b/configs/full_configs/shared_k_2_wide.yaml index 20436292..f7bd51bc 100644 --- a/configs/full_configs/shared_k_2_wide.yaml +++ b/configs/full_configs/shared_k_2_wide.yaml @@ -77,11 +77,11 @@ trainer: name: cross_entropy general: logging: - wandb_log: false + wandb_log: true wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_r_64.yaml b/configs/full_configs/shared_r_64.yaml index b94e2e9a..16ea6543 100644 --- a/configs/full_configs/shared_r_64.yaml +++ b/configs/full_configs/shared_r_64.yaml @@ -77,11 +77,11 @@ trainer: name: cross_entropy general: logging: - wandb_log: false + wandb_log: true wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_r_64_k_1 copy.yaml b/configs/full_configs/shared_r_64_k_1.yaml similarity index 96% rename from configs/full_configs/shared_r_64_k_1 copy.yaml rename to configs/full_configs/shared_r_64_k_1.yaml index 6a3d2d15..3424d75f 100644 --- a/configs/full_configs/shared_r_64_k_1 copy.yaml +++ b/configs/full_configs/shared_r_64_k_1.yaml @@ -77,11 +77,11 @@ trainer: name: cross_entropy general: logging: - wandb_log: false + wandb_log: true wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_r_64_k_2_long.yaml b/configs/full_configs/shared_r_64_k_2_long.yaml new file mode 100644 index 00000000..406b6a34 --- /dev/null +++ b/configs/full_configs/shared_r_64_k_2_long.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 2 + lora_rank: 64 + core_model: + core_model_type: weight_sharing + num_layers: 12 + ffn: + ffn_type: swiglu + ffn_dim: 1440 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 512 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: true + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "data" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_r_64_long.yaml b/configs/full_configs/shared_r_64_long.yaml index 51028408..e7d69707 100644 --- a/configs/full_configs/shared_r_64_long.yaml +++ b/configs/full_configs/shared_r_64_long.yaml @@ -77,11 +77,11 @@ trainer: name: cross_entropy general: logging: - wandb_log: false + wandb_log: true wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/full_configs/shared_untied_inputoutput.yaml b/configs/full_configs/shared_untied_inputoutput.yaml new file mode 100644 index 00000000..c4b888d2 --- /dev/null +++ b/configs/full_configs/shared_untied_inputoutput.yaml @@ -0,0 +1,85 @@ +model: + core_model: + core_model_type: generic + num_layers: 8 + ffn: + ffn_type: swiglu + ffn_dim: 1361 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 528 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: false + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: true + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "data" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_wide.yaml b/configs/full_configs/shared_wide.yaml index ed23dfe5..8ccb4a2c 100644 --- a/configs/full_configs/shared_wide.yaml +++ b/configs/full_configs/shared_wide.yaml @@ -77,11 +77,11 @@ trainer: name: cross_entropy general: logging: - wandb_log: false + wandb_log: true wandb_project: SuperTinyLanguageModels paths: output_dir: outputs - data_dir: "../scratchDirectory/STLMData" + data_dir: "data" checkpoint_dir: checkpoints seed: 489 device: cuda diff --git a/configs/general/default.yaml b/configs/general/default.yaml index 45a220d6..9cf8c88f 100644 --- a/configs/general/default.yaml +++ b/configs/general/default.yaml @@ -4,7 +4,7 @@ logging: paths: output_dir: "outputs" - data_dir: "../scratchDirectory/STLMData" + data_dir:"data" checkpoint_dir: "checkpoints" seed: 489 From 8a9f8a150b4eef9138309439463b48f6ad3fbca9 Mon Sep 17 00:00:00 2001 From: Dylan Hillier Date: Mon, 9 Sep 2024 17:21:45 +0800 Subject: [PATCH 6/8] updates tings --- README.md | 1 + pre_reports/weight_tying_prereport.pdf | Bin 0 -> 126704 bytes 2 files changed, 1 insertion(+) create mode 100644 pre_reports/weight_tying_prereport.pdf diff --git a/README.md b/README.md index 8c98bbe2..ac872927 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Please note that this repository is an evolving work in progress, reflecting the |-----------------------------|--------------------------------|---------------------|-----------------|--------------| | Dropout | `dropout-sched-exp` | | [View preregistration](https://github.com/LeonGuertler/SuperTinyLanguageModels/blob/main/pre_reports/dropout_prereport.pdf) | In progress | | Knowledge distillation | `feature/knowledge-distillation/replace-teacher-tokenizer`| | [View preregistration](https://github.com/LeonGuertler/SuperTinyLanguageModels/blob/feature/knowledge-distillation/replace-teacher-tokenizer/reports/preregistration-knowledgedistillation.pdf) | In progress | +| Weight Tying | `ffn-sharing` | | [View preregistration](pre_reports/weight_tying_prereport.pdf)| In progress | | Byte Level | | | In progress | In progress | | Self Play Evals | | [Join the room](https://discord.gg/hgVhe6Hp) | In progress| In progress | | Optimizers | `optimizers` | [Join the room](https://discord.gg/S5Q2ZmWY) | In progress | In progress diff --git a/pre_reports/weight_tying_prereport.pdf b/pre_reports/weight_tying_prereport.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0c16c7d7bbc67d6f60260b363463f4ab90c6f35b GIT binary patch literal 126704 zcmeFXW0WOLx9?l(vh7-B+qP}nwr$&Hmu=g&-PNTo+jaYS-@VV-``k0`xS!6KdvoL% zu_9uw$ejNe^Ordzl2k!NjFyp(6`Hi~x#$a;krBWEus5=T=HUU*%UIf(8ai2enVJ9? z|JDGEOl<57EC6~5fHr`UnS~v|$jJuK1<=a_7+C@Iq5wt)CKiUjzvKYS0D6^w%$eC4 z0DOGVrgkR(j0yNZcR({T{TD}6JRM8{^cqU0W`Er;asAZ$k+{uVioU@>jEeSCs!s`d2K@e~sw&Z=D$bS8eDe zMF847EJn;sj2ujcCLAUVCLB!0My$-tOol8*ChVL>oNPv{d^}8S945xhj4WoXrluxL zj3x}s>@1un#_SxdEF31B>`Z*R|IC21i<7CLEwo3Dv5|?vzPW*sfdK~;k>+lY#3&bo zCm2mHn8=+SaN-94fDKIjsVS{*zjAhPI~8 zf5VI8-@zvDU}`65>|$we2VnWnCRZ1mzi9i%=szM-!O+}P_Fv(z>TD|ipWXETG&=*> z*#14zzbPVY=wfJNZ~kAf#>n!w|39z(zh#OtfbB04|6-Df>3;x-k?~(>{GWkoU|?Wq zVBiX#xVZuw1gijK*2GW`l1YPsxysGPz))?x&t`F9t(lq3o4*216$A!Wm=S0Q1tp7Y4lmM*%ko9lzZ|PY7abD>k+zH#;xtQAh z{U76h=q3A?mWD$1|1j~N0oeXRlbw_4AJe~d{cHI@gjF(iws&f0Ozj`TwiV z|8)L8>ii#UXJ%yQ_;1il)v|ToYDfCI(l4aXRk95s76<@bE9>Q!xawj5xhi#@XikCD z&QU0dD>;1g^Tk;IA-dR{8)Hs_Odq{7Vw7)A`0Y4~LHKbSiVia)oEGBMu#>;RhD8oD zyU3!&V&>@jRM&L!rzw9n*=2wgMQ38<&1yh-f`}5`aWE6nr(qVO4^HqvVxj ziwg4$G5yQZ_M%R}-6x{XuVU?A!QNr19P5n4I-@cam*!tK;WTPIVWh6m2$a&HgS~rZ z7^^YPj5_Pt@0-58j`{c0Wi*PD^15?UCo~|e7UO;7SBIyyP3nJ|_`|vgq!R#3;qLrs zF!i+P4cZVFa6=wQ;e^qKf^FMVTTE4H)WBU|r4&Kq1tJAq)r`^<7Onr52n(iQ~)1w>{W7O#cPZ&_;;i@_z zrgfok>OgeJkw;N--n(~cJTYzT6vHvNm38N|U<;`qe9`#_HteffsXL9ux3u+NkE^`2 zub*F@CYs5tTe*GSaVu|XUcmHyMzxTb5^ruRv%Q)+KIc}c-kK5NrqpcHS?doFY+1|+ zbGX|UOgJ<)-TdkXV1aSi%ssFf39sR9!{Pjub&@j)WSv#n->Wwl6EGgX94?>EU$vly(Hu1p~8hnby2a4=LT4Qdt}Nm$m$LT?HQuEO$^8cpb~hCaS6 z-*1!VN~gQ5@)ZxBH2s!>pf7)|{nLNK^K*DucqWM>%mtO{Ct=T};Fb0tUo427T8qnM zXgeF4)fsi0KE@Z@i^!L~!r^XUxbW(UC-82#RU>IoHv6ukD^j+{g;)F#H|{Jqo3nw- zc-`54a95V!=f0@qjnWdmp$5l#Y~ z1GjNTqsrq)L}m>optp0Gs30d~muImZKLuvCGTYM=niq%TFO8?E&bqJ6M4T9ep-PkT z`hDPq`H0nkRnLCH2Z0?KB}_xcDVK`g5eLnr!l_|WwuV-;Vx~K1hFB-Skx&MGKn~Bz z9t$)J0V1x?YwO|P%=j7J%$9`9<-18i$lJHwCSffV2ylFWh8=K+dtPX6!So65)5yk7 zzV+}C{MNm&DhwQ&7x#@Enw91ky)Nte;)}SUNtFYTh+RGW=Uw?}OqpcIhI$i(*hj7R zQbm8O{;{3dm(j{^e$ZM7xBxQ8HpbcA-`^i1@l^oRv>opEW^=27-}S@Oe*fL?R}=mu z%)c4Wi|$XihHTA5Gf$9Xz1-t!G(Oi7?7Jn`y&Jd zE|hS@Rka;xsQ~7G}vvTW}AIsg%+t=!tSksu53Q@-0TxdE2mqX{#2m&hKQNxzAh&Zu%hU z%mFM6`_4h&^T57oNXx4UlimBJuPNLEHA2xDO~6#nq8hFOPeN%gbHD z{#0xJ^#ohiJ}kV6x&se_uTRy)YMad}dX_W>Vj;~`&mDqHO6sz0$`=!+;EQ=n8r`Xm zpOl{f{!@3(*hi2eZ!N4GEHrnkE%K&Y5841j6^0K_y3PvZwGfy*$WeW+rr0r4)*X>T z!AvbJD0N+PRa5RTBAEtFdZ;4_OGI^c`h+OIy9yWG!e9HGg&}XZo!16D2jV5B=115x=;kN5j!B${hqqbXYmV zEA;k(1GDwr^_nC|`hig+=t=x3iRyTfN<6t{K*vVrC{Hu?@-ME#rm9#AI1i}`;F?Gw zTrd@Lo`^BOgd8N$mHIqGUE&=8wii~sZ5T3iTFynmPUynMNq?4Y4wUyouyOAOv5I{Y z+=KN3vW|z%QTP>U@#0ckUUR3~NekGH>&`&p5@UK?=@7pZHHTiByX)wJ4BD z78$6JJMC>UQ1)2ONd33T=kvTeNS!(7EZw8mun@-rUs)hXlgwOx;S0CP-?-ndHgJj$k42<^o=w2Mv! zhc}c1(9uvogGL4UEF|mD%ZbZ?ED8Fluk4l%8*=ndZl%V@0?CjN2xrEFNSq`%wO)r; zbb+V?(#kvW2k0}5%Yd$u=O zho!UZRdx?cs?%reXvIuc%uHVV?l9a1&sX`IgRr>svqO&p1>MvTbvC_e$>R5>d}z+- z{gl}0ueTd4MMK!ytZCp`5FD*#S^p`v*dms}JzFm$5v;+x@E|Os&Shq0C=W+2(?T_3 z$F!?{;LrD*LIr~IFYyF#nm?|g&}*M!%&1rXVIBqBF)T|;F=jnE;)uK=2@YbVzEQo} zI~+k=?iVmd{x$<*H|)=?DbDR>Ym5`H+bYi znLu>W7A47@D5y-KcSI@0iuwvVg6eL?Bo1?yvfvnPWdxcohnD&|TKN4-c@Whh@Stt^ zzb`=r&F)#kd3aL@X3+B$2d|xi5@miQ9WG(Aw*A=;RW{j1;i|}p%(ZNoHvNuAJY@8{ zb5+x1RY;w)KxV$R=;390oyp=`F_%*P5^k>2^7Bc>68I)+S-a0C2D*Nzp zgnpeX(y06kSXK<=mnEtc$1|nDm%}`U4s1WBup-19myOV9u`Op_NAv-Q=pox!<;Ty# zkhxI7ApPqLeyNwK%fO!xb0psoygXQX|C_vu{r_Fg!U$kz`n$sP?*xVk@OPo@Z<_TV z)qfJL|6I0WVrOD!{BOC9O{cR%-OM5#uJs7@F@3A;R;#V`h@6_u-}3KCezM`6|IFLc z_jdkO#>%R$zr^bPsFI8rvAMxT?Y*AOFwZc*=nRq~lA4NjdUgi<&@971LLwAL20n}K z);b72OO^w~ieem)6v-P9h}173KL;cXg4o#f?9j}>><*rQqxi7}snEj4&|2T%09L-K zxz(YCnF-pitE>B}o2z4ir|V()tyyAX1meKP4xFK-kqs1bbi_(xG6HmD)JO%yh@y=m z4r(3H9bMQGiX^Z(I6k~O5dvahbpl!c6%WGD*u>iUfU=?_}(%IfIy1(8uvoC_x) zCZZ{zBBzE0AQCB~0b{6V1(%5aZrWbmh`i6YKp{3i@i!HRbNJGq*xdIg9r{lFTKjYQ zMG%P|76@!$V|WD1z{1#6A6od1VUOHe>ISs>oe`^h@jdp404Vdn0UrN8NB}XgF?y44 zj&5nG4vd8g&>5c{-5uE&Mgka{+Z`4A2Z zsM+9uSoj_@IUun*urs2uKlnh{n~kF*`(~`l{5Y{Ok%^(zvH5D+J|d9&;#4)}*0zrS z?)t@F@!`$S1&jvwL({PGn>NV5OVlRzB8Jvx21si5`^IwL;-fFjzw0*~&6l#^ckpk2 zD(L>3Zx<|3b8#5=0Ce8VKB{(&ad8yw6aVBddAjf7@2(6PnQhq^gVnUlnD!tVBuax!A5L6@`!z37O^8K26w zU9`L1^Ff!o0To8u7?T0J!Rwr*)isbKO7cwR#8kq@^UlL& z@yy=3Ruh_=hQWKzImX5|s&JXeZPSMyY;yJ}vGqhnkM@HfEx$Csx=_gCAK@bljHp8H z!x}DrSo4+Bu7^3s^<6?$H_ux_KAc)wSDEnGU@dXa6Z7r#mum*lebR4XI`?wCgyJMy zwtY(Q#Kn=3r+tzzH7F9ols=4}0?PxV^96>Wt$sS2E_pE^cf#0bsgm5naB@^O9yvTW z-3=W~j)?%(T4z~JiY0bJkXcIV+r1iqr1w`cec8$l@wI6gGP>Bf9|m9_4O4D61k}EA zi>tif?zpc_l>o62Xk6c2ga$RB^_ZH?-{dA9HW*+V8&|pGrX2O^5OvPrK%3>F9 zcW?%Pqa4tC*JkiTERI>5wk?ADN%QDwA7{bUI zp5U8~0WyzaX6*Gy%+#3b7P^6l5{Oru37)NfZZ~PDf|++!LN!|%q?b^`M)baW+^0Z$ zImcxhB0Gn^hd(~{9R3_d6SvuR7ouq@l&k2*Gigr|)_xz_o1%>0^u%y`Z_wS5NP2~k zh>Ia(rz>?6H7OS5LtRPon+5)#lTM=*C7%y zAlUE95yn=EK5|%I*S@HOOCT1clj7>He6*L>!d*xXCujGhKg$x5y^Njki|0F|Zut}= zVvv@lLska6d2Wylp11XbImZzlH#sSw5p&(>=5?H=y`LwJn`}ZS=N?9|+g1N4J<&Gl z{mcm!y!$0OIls;Dkx$U!0~fySbyN+i=Z3v55l3ZI<_8A112-wF@y?kKa!tmrC+0X5 zo48_|8S?mC_m&u}RCHt)4sUVafo>hyfKO;!RYguoBnw~tLqixODa!d5L9L^9cDaF^s#uZ;3uZD%9LN`1%e85AK(sb*~0Y1uMM25 zan~ccVf8zZLj0;bqmP$@7{>Yo;SYir`>jSWx{hRa*;)tnucy?sgams`j=lP!;}DBW z*o3gs=du3V=$Jz8N!4$Vpm@|2t^7pZl19A6L8s%Ywy4VFWwl&{& zA!H$(+3>3qC;InGUi#rZWYuV&q_G*AoA01To_%KrWr>c^B#=9ehN?{iG_`)!w9FMi zJ7nlcxHzDq*Rgd9?&FXa4=LJ)R{k|7S3txQ6d2w`3^m6$r_C^uF~F=Rc(tL3xiQuR_CpUplHK-@1r z2C@=eOu^sn8j=fU6$A>&wGTf-bk}Q%d4|iTyo?k`Ws(dD8yn2I@HRPiLiBbhVPS!O zfCp6IHK;9@+hDR7F|kp3W5Rz}_({EWHb_q{E<`us>HSoBfMOVf;-6{UKGL)~=f5C+ zt9SF*N@2u(su-w^2*8Y^XO}HX`Sm&#|07nzH|Saem@C~o`nXdC6F9Pz0K?*Gm33=< zrZ8zoW_K8FtM>ej>G3L$>Xo?1UYHEJc5Y(uCW>S+>{CQ$qJK4uce2xAefIdUS@R$O zr>jwnvj2q0!s&hN>v2 zkDUg$Xd88henWT|S}e%LAPYh2xj&7GK>YWvB2jU$W}jRa8@O+q&M3I6dzVJ70re=l>KaPx4n1<78X-aBL_R-9_i8$J+A8RnJdVyLp5JCL{LAO5X#hcDEkF zv8EY(ZF=%KtCq4hGam^yo#H%NLt)-mG`@@kxvf4HBYHTr0ym!rJa`h`77~UG;>(>g zW`GVx&fR`pnXqR3sOVQ&3uStqmKgDSrXdOph&LlpO%D*D*mBfsoyd06FCuSPFmsoX zf%#)$&FEeWZNU^S?u(iE7g2u;=Xi;=$z3ASc^KhGB1=kpm+KUdN&(?BTq zl2O(^KzuCC2zPExO0ot*F&0b@&87mfte41EEE86->LcMuBEYU*1S#z&myStkbp{rz zyU{_bhopU=T8QWPgWUyU=m`FlN<$Om&{vO7F+^Wrm86?SdPABGda4^`f8es1+}!~F22AE0 zHgZI5Sug|B>HKC^2H)ot^iBgH8UYMd~b{25iw zERm#9C4uAmc!fjrw)_B4Liu6@e%d?9I+Zz9+SADf8r9Z>96hE?!l(RAN#Lz_uVGpJ zV=0OrU^xEXsJAVv_%PpV60Q&pcmME3R3-xcgAs12LdUK&>QtTri)Ls+E`O5y@Lo0l zlAa$^+nxrfh}l`vb5#ZVR2!!4vvx>nAnno@3emM@6PY>X zpi$SlwbFrj}A`CNfJU;^UaEE(%0P(6TfrJ7} zj^ozh4gNVJJECROezcVwAjn`}aDKNCxPuBp0ga$8x)`@sd5?vsKm?zDE>3GaN%yS5 zese(g#2lSYBe4hPKWuGl^3ra{B6|W2dAyY6_>_gM0D@QRKFpQ&^ zMUW_8nI>6Wn1mz3-)6Wp?=_82qSm= z@QMNimA#UolEM^+WQ9L-@q3OD%baGZr>wTx9+I#ypJ?Q+W|1SeP!6~=>L{fcT+w#N z!p0gV#k^bVHyCBCSLh_#-1S^m*%v%HqGWm_iMdeiTHrGcx|)U~@tT?}q|ZASltb{BE!@?s3=e8c9@!FME)m(M3BG70rGaOC=`8kwHlBoQYko@w3K4L#_nU7m< zmti`lHB1K>S6SD5)-|Z^V=UjO%fFr*Jr_ z-%@^Z6%pEdDT|Q1`YJm7%0&WU?cv2tFTlTMc#*@xJ)S6$q1`0vWzH$)O_{Epwa}d@qSV^Y~Ke_!M#HiBmzFk)30xNF>#h-A1j785cgzezbW@wqhSHP69kz!oM{X({Aubn6$>)U1IIGL~;eN+yD zmK4Q;qg^ClcO=bRXM!|uJlIyCu(yT{^)-jE+U`?k)?!~JD9D}}3K7gA#hzq6!ZiM^ zCU)Q_rY$oh;5vAZ%duCJA%FoMq{F0VpN39}}Do&#NZYzD)*iaytmU1M7JVhB)Aygt~G+j?j0ZHc6c z0>xGf?mB&8l=JClJfe0_gNF=W08f*c*u5h-t0dbb1P#m7d&nn-23|&H>z+~4`Opat zeg^!>3C0xIb!yd`_PRQz>nvN$?xqg^IscPHeYh7I)f*xuXslB`{1e?6@fGN(9+PAR z?bZ~R44j^JbQV2Syb$AjG1PDy*D8Rdw}&&zJu&wQL$hv%ynkJ2vf|_w`@YXVmUbzy z_KH_v-AHi9R3hCu2^1_Ilrq7{ZC6||vJ-o9dQ|n7(O5m2Klq)Yxl1FXa8yXoP z22#}b!_%y@O0t_o)yl?thQdIBkakXtVV6XLYf8BJ=0lnm@6=0G!K40=r&r?K=|=+S z`>(jFEmumaszyM(G@b1yG=OlJ2D%v+;`Rx2ME+*~i*ZnE@iiaD$ayuP=z7K@V@53Riq1Z&I z3EBKvzHfo#WFmk37+bF5enNg%H>9_HS>*DH=*TaYDA+D2DZZuv(#>71|-Y zh@%(v9j002-l`)&w)t?bxRC%cwpIr<%1ByVYE9*Nmsz$uRZD*qJyk$>9NKTwD3}R= z9z4|RX9ca;RQi|?s`CRZyoem6RXP1eX#^=f9pA>oW5U}?7EPxRY~secB`!#;+J)dI z^U)L(1KA+3DE*d(Ojv`J4KcJ2@P0<22eek}Ru1aT@#ENiO0-n?a0crqV)zgDk?)5q zKG^nJhL?$1jwYMD;^4+sUvbU%O7ukikZI_Xm4#_D-D4+|7k?5OD?@gZc){HjZU38?4)$ji-BMLnA(S}e50s_# z%(pouAcj-gJ}79&Lu>ym`_*7whr#F9u%(=vl;%TKf0z)5HKQ?n?ch^g1hlq7Lpv%D zfJe(6r}CnD!_;7nNMN3yAE*rd@L4+4R^i5%sW2|~-IvWCE~}6ia$DJ#X>K~r4W#9z z3WXnM)~gnpUF>VgptQK};0C*ugQ~p;3xN=z^xDjX1a@G&_{4xR<cXJD$pd~*-wc)>7}1diKrFw&DdOGMx&g_U@)hcq=@OYdf$X7<1|2&L#L1ToPvi6* z*da%VFOlStC2KfXSELF2M#1gdrjsgzu!A^tgpyQO!T2H+yBoT0ie|n(vQM8VVcm=(fOdq@A+nuH)u=1|@LXqgtcwlk;$&~1q~R>v@^~%N<>|HlTb2I9 z&f*bj;^_vJw`e@+tfKqRZo2k&b5`_rY=g)fi-2cZHf0zUBt~6DgEg`#{3{b0 zk~&>1yC$c*WzP@_%n5msRRPmIp+iV^Qlqlo5VjQq;9T7dnC_Ma$;e3@%!Lw)2Zg@k zGi~U@+*0@B!g=nkm-mGEDTqS;_IL5PMFLRS{*R_;DD*8B3#KYE#DZ5k^`kK_&X!$? zX|>MKaR2@XJb-VJdO`N)_|zL<5{n5V8A-fb&Be9>!(Qmkm>r68!X zw)nguQ2BnWr48U8u5X)eo)f50yE+jG7DkY=BenaoDz$II7-%l6dadSHvHU~>Q`c-1 zs&YspY`atB5SkZIN1>lQ)OF&bxwAAQ!^0od$@bhj?nRfh$T^>+zzq*%8_*L?Ie{}j zYU8X7F9gzzY9<&(z!qu_(siBLiai3ldqL0bD@HS4o=9w8MaRgb zW{)nTUCc<90Y6`{mUX4uSZ*kirA;ayX}rQ$D$IhuRU083^MJYWY`++xdfFA(mzZ0&6#5) zFn)wNYNJQM>-YElsk#%iZ!hEdwT!z0cL%-DPXG>77&cvfHnpr<(_WFVOgMlbpGVO> zrf+TZR;XUeyCwOmS&ml<%}!wlbL&Dq!0xzBB~F~qrxnF-OY&N@^O#x>x1e*qEhE^QFHMtRb3FU*50E(4iW#2ZDR0G*5~7}M1sZa}A1ja- zH-Dle{fd&Ypa~NN8T2KMfZsZF+qIfK&LYMiPEFusdWZ{a!@dMF2&9B7CEoYjhO+DX zTn#Co%bE1Ka#$YH3?HiSVIKBpg=LdZSYm&9mkK|gvcpcmDSYA;JZqM$NZtR9JLdF9 zGnc@lC-F_yc$00o>qH>&U{4#%Tt9JG3{=UOYb1cEuZ&`l_bmYN1RVAE#bDj4>SPT3 zB_a)uohViB736o;bjK9@lh@&iejcDrLA{OJ-<^{~cQKDrLb8Fp-PFZD|Czr0s_Hc_ zG}IG&WID=jOaG}>;o94GJ4m_!;T5#mWz3Jdbv$2iB&Mz~XIy7X+ zh_C11a9VuebLuty(%?})izDceNBNZd1cU1E!;dBVBJW{>>tB6Fhf>!iB=o1Fo!Z2e z2Ct3Y-~~+{v-sS7J5>4|8KfR1$>G3PS~)vh@45DWuOy>MO%$J4sk;`xy}jJ6kUZIf zu#r{BJeut{ye3CP=QpDz7U5y@#r~pu4`JH(x#K7U z)tin7(mHYMfiukXs{6sm`kx#Jv_xM_y=R`pOSu%t3QLT1?+~|Cl4q%bgIVV8 zDSQivXW}PB&_RZ^DL60ptgW2IDsv)NK_Ttc6YY25?d#wDz_^ z_=bW!lZ-lgZAfOZ7+p^Vfb_s2k@*~f0dih%jOR5piqECsf4}d7o4jO4q|;M2GMdR0 zBMQ1VFSI`7DIwo*BB6ZfF?C}37-r6C?4;O|!`0Q)gZcEqR;U8^q~P0_bQD5 z;{j#_DPEV$%%*NM>5)7|w$dXyl|%kPQtP z9b3+K#q4EMaaiK0_0)qwl%iZ%PdZDJ&6>`8&PBnh$z$)rB&61f6UXVMMIW65{Ug4n zV(SE%x^}97CK*^Sdcs6D0|%y(3xz95 z??yA&Lo12)qlfmuMVPC}!0t8~gj;CXUz*B`%iQ2OZ!^9Bx0an&&KQJV0izi2v8w1n zb=flFeo)3oQl3Y?x@OZy9hf?dcTT{B;pgLsD)Yqu*|1$IZBveR~-F*KG%$w@U zCupcvEmU31Efmo3W4&nYaB+mM8(PK9y3O$6@I;2~6zL1@b>=3#rSBdK5lF5&S}HtO zs{J`dV9%f*E1}CA_E8WQ_|3(2w8&!NzAy84+~PpSO{1up{kdiA`Y|1fJKkY7CNbSd zirL7Nan8P0iq}6Gpv5}#J;>RPb)4uE(ZH->u#p=87byh7K8nCJ*U8bvud}Zw$Su88 z(Lyoek>gZh5ie)fWjDL6xoY$ubI_p%vy}(3x&fqBghAU-jTCW_dBn0Cy^rP9#OTyd zslXtZc~x$Y=34fQzc|PwqKkw(5~x8+WwvuQM|Beouk$1k;t2j{uPPMh5R-5)nA6EPeIf``{iGse5b zA94-PJXW?In{=xGY0uay^37+Q6DFR6J}fidvByWUJWFWN2*VLEQ+TaD7vJ}MtCvmPAe{r40o0VAzmdbl^0m}yW(>|Y3)U} zzQ*MT3NQERk=Vm{8&znf^XDS|WPY0Zl10mpN zdM#J*9g*)ux8*sm$HZ!ePUA{rU=d4&)oqkJeJ;W>>qL( z4tK9(R9`%vN7vQbz=gx3d!;yV@6?*sUF?$I>-XG3@^|NY@T|oL8T*-RwcUE5Naplc z@hECR@T1R-I=o7!Xtm!1lCo4MO`{TG+U!j+napUSELZ3W`4ZS7yd7$84$6*)FZaoC z9n=ySFnsLmxKS)~~{MX(i8Ja0yHB8?adZ=$eO z-mnrs<|XL+Y)yMI@OV*<^-JF$ZWgS~iB7Kb`_+_&+dFb-YZL|1p#tPo412nn^h|Wc z`;O@7CitmBVe_~!gk$N}yBmJ-h}+dzv60jaoDJ=Y9U_{-ET_6-L$>Wb@4};aXoWGx zA{vCLPKu^L?7YsD-3Ow92YUU|Z0%)fz?48Tnm~VF4d{l!?u>ql(l>O8b~HXtde^ym z((n!P1vim-3N&G^yyFm0SY`!sjq`q~*$sq}x&$AK=IpzEx6`UsMm)i;O)UB)HOb$q zk1xixE=laR5O3k}|0Xccu3b6T$Q(rQ7-0PTz=V|%MDxbY>_uZq-TlvAplTHW6|8 z=JGc2XwUn5sj_0q5A91(8?pZ3*_YZ^?Lp6uolMy7f={8N;|^|fKdayZEv3qW%8Z=Y zn;^gKs0V=xB@NK34x7^YH!(*6mzYnK*)WnUvq_gqFWb88)qMw>qG++2FRLmDEqJg( z(6=2v^Og~jtTM@o$5ImHj+3r{cX%UzOY_Fx^=}hph?Iow8VA!DihJHJZ}b%#9AZtv=pinIQFf?u$J*uJxWnop0JvJDy*H;~Q!*guOgC z_)^JT4h2yJDF#^1j3+C?f1g!XP990_7is?~{8defsU=US*f+p|a`js$yG(58wS8_%{}L}xPWZ42S}B|*9JcV(&x+` zPFFmagxGP!!VgOaO6c8h25CTf%m!MzUhj%wguJd`#aU*Wis}q8djZA3=bOZ4(6F3%g`>!XGLj9O3w^38;XHhB0*H(v$Uu@0GS1`0Bg^J zdmE*jq9K*~xJiBU0mjSH>p5frGm2g0vxC~3a!Dec29h|)T zfpqeLG#wV3vcW$0$RHF?63Rg_HewI>w-ozI$;rfoR$lg26CSh*{R)iinVUueb-Ja$ z4C4uz9jv~k-$YwA2{TH_$1`)?`bLDCDj{^oCqg(7PZ*URZCA!H9SKUC_fP^1Lb>;; zL6h7t;hp#{(QAM@k~$4tJp$}W9;to26%=5aMC<+~Q`6+oYaE{?%O@S;hXv5Eun_pMXDAZLR}zvLPFUQ;lt=Ix4@aq7fNFb!VJx_(l?keZFo+PuO!) z3q>*nXS*Gop{i3@N8^WE3YUy}>~08@U4lANFlO+;9R~R3FFb|W)qJZYRQO)BhcKXe zs;j#z)$UuUB!~pZGnrsJLHJ4C3+9~?mIRq>*MbuGn>3Kg+BVBcx^W%hbAlT0zpP_NB3bbmpW~;D#2j-sN9e(5X}lI{r^bm` z2ie+7Th6QxXmtarTIHYB#^l|RX^OyS9@?CBSwgt~ z3~l7ePeExnE(s12NOfYfW3(jK`SZtBY@9uN(#E>>Et%5kff?;FwGT*s{4@qEK1{wE zoo-ZJMhiImQBSs@k{q{VFodd)jBjTwZ3ET_Cl#o(bD$V*qQ7}X2A9ZiAFPZl-G7Hj zsy;>Ot%N?$rc@L;;%kTnCYx}pt6@nV&VPPqPF3uIrh7=wR&xule389AT|&Z_E!o02 zic+EDzxv4`C10t{3li&Y?)l zezqVw7UaHC2f8-FAPmwVFTAIa^%_U}jX0IQ%oi*wi^LIcQu32=bNqTC7PssF>V+1! zpAUK_!t9u1L=UO%jK!BhaFY7&Y0iY#GcU7t{?)WGR?*uWuqWI4{w!F88D9EHrex*m znvN)Y1SY9^>FSuAjU?DiyDnul`4DBZq@oCMu{(;b5b45RWCPt2^sPg2nvf1vsjITz zKY2ASY-KFQSYdf^bu{KzW^xLqu868B{X_nUaw4f^HG|<~7l>B5D6)iZ6JSu{&&^8*K2NvTz!53{S z%h?p{4jMY3)~en#dLl)F1O89+dS<3lF<#Gtnt5(3@^N|ay^%oofs$qM5K?!JQh|Y1 zQoQV%G^J4_d>r@WU;~uyMenW87B_s)q&2?YkymJUbAoBS9wGO{8sk7949eY1H089H260^p- zISXv2s%S$!)#lRYbqdi_H8dy_bfp(fm{mJT|1_lECyA>)2)=%-Ig0oLeyYM_n``*x z^=JgTEXIR4SmLG?`P7k?rdfBn{`rz>?^pWfQeX43N?xF)St3=V2?`&NkK%nSc<5r8 zO-8A`a@udk9bdymoxO!|{5gb*Bu+v-NPNV!k)v~~W9@y;TOws5ef8M{9F(5eXE4?N3*~uO%c7A%!xG&B!6xbH(`1!$)K;jFhKE!UW87|dm9=_4;i#+( zk_fM!PQ~b$crdKrgZkG0-A!}XPdm-+B1HHqdXqg)@xwiw872o6-P#O6)v^h95rjk) zm#Y!imSR_GN%PRTH~w*QLb*g8fC{&<*j@fMDY#q#m63l~;^)YS0?i zTVWdbbFJ~0JW_8Lu)hYhNzk_j?L*x?0J$ zC)JT(W4|HqxyRjVzbSj6fZtPH{I=tO6!}H2n|>VXO~p>Kcx>EOjoqJfh+)p+{jT4# zn6kC$xMRozgCUF!yi{yAqG zAvOzX>qXy7;9OuKJ}YN+&s{Z4b9vL^ilJ+0KV@!pXf@C0U|tdseXN_dB8uIhu*xKQ zna*!{>Y#bv3a7)=Zs$ehkLvnB|C=BZ{0Y35Nn_s;Cm+28daCeQnuR$EusH&3 zO?N9UM!BL(z3HgIgUPL@k- z1hLKjl!R8XvvMXQkc5;DWE6OMw9V0nlIHNa;UiHuk`dy+~FS-YVM#dPVY zGTeE$JS3s|%otl41UsZs!>g^er{X^0Mg+ViLn(e{NtT=m*z4R03bIp;@T09pz}(w} zxM7O8VuW5zVo(|U&)eHzizPi;VlehuQUPQzrz8VIap}2e^6bXI9TuBK$FU>zZR2;| zw~dwp*J2(Q@;t!C%y>R7=boMN0pmWIu*}+V|;=jAX_m-bk07{Eyuo zvr^wPK|(>L@BXyf^-#_L0QY6o!y*q!{zkRo{8sJP9dMo}s!tj;S^oS!b*lc;pC3_? z3#;-Svgx>I{F%qQncepKQz~b|$ReC6BxGI*^rz*irv;m7l~Y!W)p~Y2ZMDdh+9mC# zv`JijG^5bFG0I@G{0GT#E08EM0oTKRYAe7d03IdBWWMe7TP*LBEoyq_*zJWC{y zq2Tx-EwK*=?Xr!K&Sy{FDk@VjXZ_F5Pue<&aAj!}&&nAV8oonN8`aVFrJ+vA)Mo;F z0MJ&?&%x&!H@u4Ez#M6@Z2c^2z?!RYFC=K9_=hFBUNtv(blpN3Vnz1=(&towmdb6X z4!Vl6R%XiC?Flr8If6TtG~NVxMOaW|is@j3y+;PGC4+Bt{&fS|9Y}}NiLRKe-Wg~ifNZpPrmusOn=kc@r0PW+h`0X1?wjy8~1!L<}j`I%u$@O zDw(~I;gO)L)867=M|&-~u_Q8e3bv}0)gvPOu}!rU=9-+sd5Jgxs|kWd{C39U5f^@) zJ+w)hM}rrRM`5?^bVK+3%>5Wa$qi!sf*s1G_bgPKZ#kh?>o35cpG2myTG|W{CGQ+b zO=E8k>+eAJYyPcXr?|0qa%;@Ng08F?|q zf2Z_H_qdE~HJSuKZ3?Xa#`mVr{YQzpc#0KZO|i$#^e2EQ`xx^cVZJ80qid>n_LVtF z5r}|R|F~3LsC!@+o;JX%_kK-k8joNGNa3AC;#;`KTj1baW~9M6zT8e1V_@+gprV*n zD0Q>&aY(;lS}z=_{7spo6k$X^PdGvjP1B2?Ym7VQq`Zr8Y?3%D^o6UBUgVUU-g#^b zMLA)rb$>eRyb$0P6hmnglw$j9k(<1H=C?27To*@P9>lL2uRU;6m!}NR&O5m%NZN6Y zoGZV%-mKb1=L&_P-MYj3uqzEqsVj?ZcP3nQMd+@ZSmd20va)^}FE^a61&83blRp4D zYVbAFe31`x&Fr1W{Oo6SAHWa53D1kBqv$5=oeuo3p{R_D+bpRXgwZilVk;{9{snN5 z!djMDs@|{5eQzqrDuXW0WOZEkO^P(yR5YV+O(`rom!0eBltcSh5VUh7pComer;^!k zPA`@u9W0@leNcXTL-RO4C{wdvD$+##R8oFZue^(lJ53MEB;bDysMg}{Hh)R)2PV#a zHN}RjoEj!B8tml!vS*)MdAX++sGF%y#h11cQ|<<8w7;$hp&yXby})HWTiN#TLFvF< zaFC9tDNoIN7`3ksnMd_x zO*B@^W)4wlhoGZX$0B>L8Pevv!&h_1wAWa&M4-u12xbyQY=}&7zbl!sS5jR#8$!C? z+17u)9bIgcPn0l927H~NWm}Bfi#lfxBm8}9DJO)CHm+WDqxN&F&uMnd4O?I1n~Z)x4P`O5 zL~{Jn+fudfdq#U?4jNwF@CS58$16pA;S^?6vZ8;0gLp9noJ=46V~}-QeVjvdg4FOH zF4#o6(Z(acga9DHnmq9U?#WDf8{OJxZ2zXShUvZB#Vi_+Z&AlH^{mr}T*fW8NaB(i z&{4|*)*ueyV1@Ko1tdJkH39z~GHDH>$pjz?(7U>?~pU=*zh`|^Qi!2yv6 z7-b!>%#It;WUchDF!@eN*j}j%i(1IRi&M(zX5;;vC%%Td?JBF*xgC}0h#$GX( zDRHtO#ZLp{%4v}ENTcNZR7XpA%_%+ypj(NbC`=7(aD z(gb_L{x~yIWn!3G^GS1AT9t z!M|6`amB~AWi)kuC70Fnl9qckJjfqK1;uu!5ea z)omx@=eZ#s2c${}hqlYZ0&NZ=89-AHtfzP3cNRE zN}hPbRihZ`fg)~7EdF!IOZZW zkb+Ms$`8QyEtpSCa?|~tV^>vU5K*(G=Xb8mH=g-SdHWR7=y^BljI98W+5&AWb+F*D z%zbgRB#6V+lDTq%24%iqyw8d(%#g*cHi)$m%vsS^$X=vk7>|*+6u{xMGd($X;K7tp zh)b*jkvci7ru84iXn27=9AzTKRo9=sCg>fEv};1F;qkjM2f2{|xp*%~>?sRei=(i2 zs{*8U%Y&W0AHfAUtGZJPOu@gl zcq6h5kl~C|*IpZippMSNS+k#6A+N3`Nl1gyI#?}Ib=cz6$4glX!R-KEsb5nQgNXZILfqw)DpQ=5t>#td7@inkj78Px9&jrm>Lq_JKcu61WdSd6Ew*jX@?ff?~_?CScIEkRM6?w{H7# z5u%n5fPnoVGW}(-%4q6kQ*a_z?xY&N0H%m~&mpPR!}@F6*aHX8jr(}{TVC&w>ujxv zBq`S*XmsvHFhG0HMP`<}*zh$Ak8D^jUDvG5r6upTu{?cJx4eiCqq|&grR-}Sqb-L5GnAapG zZbWxW)?Dp^<$NOci(XaJ&8N3)YDVdbu$3)@^W{;@c@0pY6PUlNCy%@JO&`E9nRq@8 zeaXfORabTT$z95K2XtSz`pqdEmKmj8c1%YmJo?CgsnO5 zV^4Is^|W9m!st0(T20Rpkh5YJcsZCWkV=XJ0Dp3bip?aq(OlA8w*m5oZ>;YcKw^KT zYx9&1Mr0`?hxG-!``!EEP-mSW5HlZI(_L2dAn`O-M2u}^w8gp%)}QSKp5`oixeUF4 zD98)CePV~-&h=ndm^02dM3yjzdUxTa+}ddPggK4!gA3*D_6;dl->&PM>LIX*J#khd z5ka`pOsTKq{O*GG3|+W(GoZ#LQ#gVWAFFTxqT#@&p7`2$ay4#-?jB<*BMoWbaleJK z-EI*|n{cre%R~M-V#UdjauyBv|F?y}ihG92lcW3|E84<6axQjW1Xd_taT(%=crpIa z)xp0J=w(_EOi{_!izq|5a5a)>@QnNs z`S}-?<#8u}6zv$~sESOPFu5oN(bS3Xt1avJXOQUh9cQMk*RB4vV zdS}P1O-JZ76A7!0&3=Y|UA}XUa-Ifbi|iE5r@nvsXBokfZdxQGP7?$rN_=H;cF_qD zA0|e~{;|K2arP29bzU!#*j0e!1>yl&BIo3)vagoW1q-}wOe1Y|hwv z_r8tYn2DDpt@DMUFRtBq?j^WsX9_ti^9UKFq3awJzb8o{Nkbc;7J0g=6yT~X#)|c3 zL@oM9fcxK@cbf6=!#|!dbAiAx%Z#MkK^H&7K!Jz1$xnOM{R*j$SM*}q$5)z9FD46= z0egE4@3*Rg)cRAb({Gv9vjzQ#5}l!~`sKoQyR0>KI-4SAYxP){sgILdG#)|3Jcx$b z$}3~p)#gznqY49DOzxoLKmOzP+L-r(Qs0jPlz3NjURv0VP(ck1Xu4|PMapWSCQrS9}W@;shcJEV1NmMdh@I7my4R}e2 zzL3Gy%$Ie|1A4f-y%3fbc=ff@-xo%Zy_M!>3V(oicY4%v6L;8G;8PsHcpV?zjJ+RbMdLg6w7>ItLzAa6A5~b-O|KU&=Hr=T%)~fsdC=AJ6N?^@9V!| z^|b6gR2yqC);p?I?RP9{#CwX}kr&Dbhu=YSznb0M*jN^VZbU8ip1*&h`7O1b{S|AM zR_3-$P&*$Yivc)9ftwMbn4IB?>*shk8%LV^ul`VE7I;&R_@nIlozd=i%}9|t(045i zlNKmLmKrpY(kJ&z1k-HINGgILUU#b4sP8v4EVwEUPge2U)Ne00jnA`MHci5oHDu6L z&CR@x^n#V(r=uLkevVg^?ZdnlDLo=jmzNN=<9f5&V^X?%)fgz}cGV-x(aIoCUF*h0 zQJ2QLAX5klM6IKjbfn|sFAzeSDlu*?d!dVEZfpq|UT$gC_AC8rL97be31yWsZ@(^& z?Eao=$B}Zh<)eB?k7}rikEKWRJqwtYL&ovY@hf=qgIdOQJKrI;lkz7BQzf`@FPhmg z47&16UVkTrWVnkb?&hz+D{Y-T#U~W%-}g#457IQmY^F-)0l)ZCsJAzYYDDEHNJ3|8 zQ~V@jbJZ{t3WR%tzYiwJ+=X?j>6+9WXfy6Us&#fhF0#vC?5k&PxNm$Ikc%0o?&PhTKQgtlbQl z9WZR_?-KVtUPyOFT$)Cxb}&(>)k-t_5%TapIZA~tCY}tZ zFo9lTP-U+Kb%#IS`*8#O3MO(>VgrfVRvr^E3qvU#qDW6@1(Sc1NgR@b(qVad(09wj z#%6L#h<$tdZ91RQruexw>5MkoC7pEf%n;RT>SDqj?8FiKbyS8wPbLbq zwNpOv=O=&txv{{*M+@0q(*;{{rBtco&P4YjD2OpVLci_iU?*Z&04u5x`w(RBLZ25A zQOCJhH%=_bKGT;5&tef38X-&!#xG+sT;@7e9uSkL(-xiPOi|5oke63N{rhm*nr1M%E|o` zu_-Upa=o%aMXR9)AH@}_xXF->2rY-bGA>|O;A-0z<~AX`Xj^fa8uko@Q8Z{qKRd&8lP;dF~IxK`FJ;Jv$EpL_Am~ z94Ost`c2H7vhqpZZKY1@?YVMU(E|@@K&@bacW~D(zGvT#?~;e^pHpQQ`x!Vtd{h>> zJlzm|f8C(Z1>E^i3m0CXtvb?z>-0xiBv5Sn^V|Gk>26OWYRtYn`b7}xkS|};sO&c& zGP`Ev@1Ic6gH~XN6-hIkUn&ZWowv-@V=FYE%qDBqQ5_XS%Fff)o6~?cC_Xt%bP~7C zhaY9E)wPa>W-oqP3RVJF=6jCLg?=#<#oBJ8H&~W(AGpfhrS25jXkC1}@iDAb7=EA~-Z9P%K2lOtg%gUFuSGM98Xlx^g3$97 z*L&LxzGLjRH)cT8;=%*s1dZ#Hf6IO@?8jYCW=+a?c{|oIkdj^C*wgCfDmVa*r zri(LaBv(2|%+YjUGF)C(0YswC_aBu?G=M#0mAu?|{v1OLAQGellJT-( zbKgIu^Llcnl7L8X%fx6 zc;7%^l%eD5Rxn)n+tEK~RVmL_4;zApHh1}SEOacFVApAmn)$WV`uf%K;>FUGJ(#0R zIxY})$Xpd_Qu;~K^#%br`ePT?bmjF*<3`_mj^=OZ<_>0lk3J?t=(I>62LfrYztND? zc#wJriJNGh@B9&?D=va zc|n_zbLs4h&$N;-Th9h8T0xsoXg-Z5CDX57x|PQK7lM}9_zdbIjy+QSh%8-njx6G^ zEcHZNC$=L658-2<8;}D@ly9khd^w`fI1{9WN5+|Q!KPt<%QyQJdoAF|wXS}<{HIM!{&XRmnK}gs7Z5)?Ztw_Mx(y)ws0y^c%@+fuFnhF#Z7m^vThZZ@! z5&-Mtea+#^mSM#=iJ^AlzFy5AB!b8;MEOmXE+=&?YRm*{x#=^$qH8nIbxf`fM6V&}=A_Xj{e<_Ece$}epstdw zy4kWuilqBEG1z$lAu6uD5gV+E)1$6vy3&U4PgTXGy9T4O7&H+s@JvToTMQ8%yviu= zkEUx>tqu=+bbhVB(&ZCcA32%9j3ixD9)jC8pc_W2WN;F8(wDfYb$-R3sjpu*a>h;uh4twB`=Qrl*NkD*LI7PKLd82?xFbS<=1O8A@KhF z;ULbQvi&cIohqH(FwE}hxjUN>R4wel^j>GQ=HxgQT87*+k)f?_R2{S&{w-W=e1>o= z!UNbd6=^5&>qR}H`}u}%ow6H z(E?QX-43Ndq=Q}RBRUtk*(sV-I-DI?IpvF$+F9)~)N6+cy*BQ(7ID&~y@-FHR_2p> z9^PI3#+XfwFnw@<`jrb3dt+xFNe-@lZ8C)~vqhLYXGZ5{@KVq7zym7}e{+G3{tx?V)Gdk8aR~guh7Gnt>OFL)LjJaI4VX^ZOQSuRk;uX*{`? zCd3&jM8G5lgINh3zCEoF-)8Ke>u=R&*pVXA%-yVBl1m2Y)=xVFj z093LxQk)$aF1YZ-icuo)?Qdb*q5Sq$FovYX)$rHlLYb9Cm5`<;ZoeE&Jg#IbFs!NinC?6F43fz8`(DUFYxpf<8@-6P zI;48#62@=-H<`Aht)R<;?VE)hIz)1p5xYIiCoThpxt%x(b#+S-zd{kQg;!K2Q!si) z=SBB1lOr&g_v5H92jNiO@AF6rwbfi3AD%d|sqo!JHSM5}$!=QgU98pXNSg`n{nPL% zktPkQkHJN|A_})p5}Dlkizvu8@p1w5uhNEA{Z8J>l|LnGw|^PFd~V&y2c8njmo?~! z55W`AD2o+U^;d6R*r%Zq<+F>B+MmAfT;*BcT+5`+l9>4scI3C&F|SzoN4S9N*8w=2 zG!7RhOSgmWwz9iqW*-!~T6zZRu(hoyD~Kq-u0rB*YF4vfmvz}hek^Mx=3>h__+vaN zRW$GWqD-3ZVsM50Q%frvOI3=o6mM}EHe!648hwkDD!MEC90bBa8+kys7Ywe31>>0{ zc%~6LfIn9FwIg^$i!Vj5Tp(SsYEJ?gjJusc?x&>&Bo|y=HLA2`Ageg=&aIg;Z-ySJ z(oIVjp51RoIc{Qd1)Tr#_f<02C@RhMoofr%J)^L}R+%G<)>oMho#RBL^I^f!{`=5; zXYY?|^gi#=ebZM$K*qSz{!Gfi@GJ&e1Au%J{&lY+@9WE3V_6L~ed|Cc_eLfORC8i+ z)YzAn4MZovJbwIw(-+ISh#q8MF(W>QcqfK@A7`L_xsiWy(K6tD-A3Fm_%FG8p3{q8 zPwuS}z}9kX_qi-!HAbCJ?lGc4PdD13UvTA$ByaS{8h)OgQ)>=8Qp# z+Kfo2;C@XT8Ri+~L8wU(0?kN-d669cAO!tvh>X~B*2aJ*L0#IqQ+;5EKI7wn_p#~+ z>cMfq-RMqmV%qdB8xaTb{;y)dD}iL^xf zgFDm4Oy2)xsZZy5Xl)UO!opofD;i8i|IoZcY!V(v_hSC9>^I=ubExHFF+Y#Y+==+W zt_o)G|1B}&*a6NNO@57SmROz1rOl!XNyYx z3>|tzg8J}ZE_E&)9p*1Da`Mmfd!qf#Ym5j=bfnnG7*!Wvjfs#RAz)$UM(cJBrYhcZ z4RDLbbG5KvP>R1s5o~{ysf{I=7zCCB>80A)oKhQS3#r}gMSmNTVvBKC&E8@gTrEIP zLxY~NC@*`8j3mI}ukVtGejq(yE8H^sh1ZE{f@rzm6?Ymh-N^X2G@v#-`2``jTYKc9 zv=474kG}Qgk6jLeX*l&eEjRa;^(1zQMp^J!TfqdZgRbVI*4#ac7FFXlLNl=NBg&C^_+Os0 znWqF#6Z61fWh-4xvV+F_3H>abprZ?h-aldal70n^?w*wWYGx^NyCtr)UNq?k1v3+w zs$l_p=+BHr9C*vZC=iXBXOqpyio2G|71G}Ta#cjpl0nhNVNz271%G+#R^lWNh8brf z=5U$%kQ9Rr7jPXkH?`lLH`Y75L!OQ7qNAoNvmoSOd|bOpUV1Px_C~EcxS7`t-ifuh z_yiIvk!Iz+A|_nL`)Q_SB&#E}$a9joTlhPlL14e=svdlCkVY@*c+9B+5yDLXFY93_ zYjVS6<`IuWJti(7U;5hg@ggCQITFUe)DccZ=|gZY@8_XGVW&KADl3!lpBTaVgsy%6 zND{JqFpJ`SF>^E#<~DVj)k@@&2QDpZKFA`GKsYHH3=7wLPVC-8NhTRk?@!RbUekLr z6nxKud%)1}U4e*hk1D{1U=G&!ZVBl$ZJy={bYhf$IKmHjs!58sYDCg~CLD;H zEG68@(_U?*!}auzuu?fp>w#*Jhg^FHe#)+-4Dc`khEXbhy3=u?p~5YZ!XH zRAw(~Lp>=4Sp$Zn4yYS@>lxa6FEJ6;sA9xU>>ZiOF(!qeL-e=qQ~IX{4j1J7Uc0w> ze6*{lrHj*S?QgC+L4pNex#&yk z96e@no2dGDxDozKoxF3s2)39D-3ySFVh|)6SXfnCxrTOMD5GIFZtCnKXFGr}%uhS~ znQ<70|QX{AeB@9}iBK zhDm>Nb3oOA$v#zIoV=sqSHzXp|0JR9n<)gWEaZ%4P3LP=K_3%>Z;19dPd~L4Uj#rm zlWftm{uRZFh-~`zhssY^_7C5IXk-)3>4RFXOR!107Ru_JlS>sP`z?7?@u^sJ1(g7QR%XnNI$T|KR% ztMNm-&+I7PdwXaB0bF@y@(<-&Yq!&fQAjc%C}Q8si99I+-WyXZ2-TWmcRE&kDMyFY~y(fzVnCuqXGiC>$Jo0m@}V4HX(TPnPUzh z>lnSlwM8JdBOtdMLqdWe)mq)U@EFciels5k6_y66jPS4ameDRiXQ^-vVdATnkigNu z`?HopLxhHh(Ms>429mfmX97yrEZm@;%AtfGf|1N+u4W~ZreBA|g;8}f zt~1_O!j75m+8(6!?%y;w8M3IVIEYB-y7s4wAd#W(8w0W7G@cutQ>uS-M08*+w0Ezw z#?eK&rLL|kh_+ME!(mu*E0<&Ih||iQ9#h*Wdo6`WGWdfoi2+)Nm!m7F;6v&B4Rt#?J4W}hF*m|xR#9fJ1`6|QmZK<5I+ z*?<2L13K~pq|)(pDEzzE7IGjI9Q%lKxxh^6s3#_Xcy&;FW$c8D@5m@TQhcGjq^qaw z>73dpMc78d3d9XMAiatl0q!#JfiF-ZdcVmi*<<$ndivXpuqGT%(p+creFc6^RbpL# zz-DkbZ!tdaeiL9Uq51i-z2EcH9Cn$ge{f>}lDcJ1KTjQAOZU%4O!{uZSnQW(kr9G$ zb66ZZDLsoQ0ct56=y+ZDdS=F-tQb9n_jPGZ9r=+Q1j)@KDQk>|ePLhqA?_q7y&AX= z|FzRS5z#8D=hIdkvPVcBg2;+$jV>KHIV0XAYAG2*qFXq=7V*XJ@FM~?;>H?@g?9H>?wb`u1H}VbX8a|h!(0ks-ygAjnG1mNg7Ppc6(+Wx>#{vFU)a|(9 zlwI-1e4iSVv2II;W1_b@gvRC@3OC$W)9*#Wh$q)YP|FeBkSD70u14l~#3b4mjY^i~ z8BHpY+sPaWHqUy>qRIjPb{0wFxz1%3Imuh;*|Q857~O=lQ?SCDpXamE zhK&$IB8d51$|>w++cg6KXu;;>pIQ`1bh?Y5r+R*wW({D>aJn06a;ad1<42wT@2hlN zk`JriG0xXZjR}W1RbKZx6PRBo$R3I7{^Yi|fT^WDe5O_m@7EWkm~N`zP%T|B+;6nF zTWp<7$v>PH5AaasFwpo@?iL#Uw9VIJ^(9*Ks?!O6!K9d<9x5N8UJzQ%H(y1rR=>%; z4H^k|)i{PptfLF0m`amz8ks{tZO)&i&zaKM23p&g0r~9u1Iy_cw;UNRY1CojC{%)U zx@qe%9i-_xg~i)eW?((k-YeYFObC}}6CgM8y%KH5PUe!+>Ni5n%TPU8@Ec$Jj2g@l zRCbA#Avjd(r0=s4!Iiue^N6pVSZ+<`Jf#=^IVfN zbJDqI@PP)H1ict3FI{XtdG~c!>6Ye3N~t7gML)$@4^HYW6!ak2d%&Ub8Mr|aqwm;Z zsyu^m(F=GgxTCEfL;!Lg+UNrJh1g+ijRfZa)eiJEy0CqKb!rft6WFFGuI9i}2Pm>N zRbhS(aFe6$gj>q7oG6}7zX$i~t8e(n*npB>G6wW~poA1gBPmiWQNKl}H$IwTz()l< zauAaN1*A`lEWniJQ9~3}o$L0KasW_fiQ1P+OZNP0Ai| z+wB27jFA>k5Bb0X@hZ*hMVesM3Zq9-)f%xj7O3qFxyQtlJafGM;8xb+_2LcvGY-*S zZ|C6?Wo&J*-?sJviWcfD?McK9wTs4 zk!#*aW1N0|IF8&0ulVG!*gJb|#)h-ydB6_w3WVdG_H*WqdtV447iusc+W>=i$=%rD zAy}Ghho`?6c(vu{pmzt-`$&$;7-0N|QhW_aBFur|PpF3ap4=jspFx~iFa`8yF&QNr zE+rMJ1_i0E{Oq&?(0Fj+)5^ERbkO^qd*CIksI17`Z2AQJ!FPGnsX(#fPV9a&^iB}< zfrfAVesvQzhmWrC;681rmKd24&~C|yJCB~?4sWJs^SSDwW(fvq*G zJ@j$-9H8c2=@Ubk67iqaaCTW3#|gi{8j;rx)R-o12qL-zk%?MXaXaD!;VesRCBU=I zUe1r4clKPS;vd%sWwVK6kc|};Yw&HN@hSxg$v&h2{km%HRhg*Yx>!p6u(OmiWD!N= zC2}mosna}&M#qrzApJtCM}Jo;>0W~pItTe|(r#OgOh~tB?lXM ztdq?x+oSmXsrIHezA1i=H9U7B<9AaT#FuIMY;3;XGzUUkD&+4iru)p>Y@I;Kd|sud z#W{ytvc)&F8t9@LobITD7QU1*6_r@plndP|2!&vdU~G}L2y-1WKq`nX6KEXGgH#WZ zFtR75$t}bkz5EpNemRF`L^AdAiQmi40gTGO3`XDeV8;iLYh|Spi&N_TYJH;2@o+(N zmj*7D-Zo5Zw5M77{8!g0wcM5Y?RL*^yPU!#lM@cxVfG=ykwq>7-HpY68&1kGJ$cm$ zztVF+1+4QFFce?Anm-ClE||8jIl-gdGHwZf~2-h$xb-DwU;WJ z(!INK6z~HPl+y>?tkvfbB*yhI7+LDK_wzCNfzq8yf^@S*Sv-_Glu3o*|;N+v8Efb>;HtWnE!A0sz$|=N96}Aoi>)Hf(8|rH7&9sjK(y< z7kgt8$@tVDV`jQRCYeT&Qt<&vC`6()0&0UYB%)D;ibOifgt9aI_REcb$NR72?dK?G z?t^#l?1OLa>5K0yF==?S@C8Bzem+7faDEa>N-F?0@%mtnLx@yck(G8njUdnh>OcY@ zrh>4z80MS+j!20z+!3K1lp_dapCJNVMFqfAR#r9y#Xz8h@j`^&9wMQI|1cscIr-02 z(;1K_!=K23B=}quu=pSzAVH)gQ4k75`Fk#~l>kCumtbF#BrqV5^);g+m65>O#uOeS z7$pIYJ@Dm?0P!IJ6cJttg8=HjcoA@M4mhAp31YZq6$6SP9S^u45C$uPe9+JU0k615 z@DTvEI5`pq>>CyVGXNb|JaC^opd27Ei2MV26)NB+Z}}z2!iDNuFpMz+M%q*Wh9_4d z7=VNNwSHlai_jjYIW1c-#4z9z(i^GV8Wqz_x1+jmqsgJis(D;=XkBiW8ktNbp=Jm zKPwW3*a$(QABnJ=eLs?T0KLtwtqehcD^dc`FmUY-4Nghv6SnDz?9i9eTB`gfL;&jG z4a{I>bxNIu*UZw!nEp+l?WU6%Ee~QmP7*lK-^{7G80nX*TJhpaIT!#<3zQDDrm_)# zepv;aW#tY0FTDDSXR>cLjUz%11}G;LB_$;V@crlP>FW3sJC+bsp0qkPfi|QFVZY*Q zsvhj<=fXwf`b89g{rAk%_g9bsVwm{ztK8!TBEO1KQlUY@%lXUj>{H7$?o?uPMyacM zdS1v%c6`NoDC^^PFPaE-lB-$mj@g^sf|}UuOALPnD%r#esXrdGE9kB8lBumbrFJ<1 z8&;jiFPYwQkui()Y5I`0EV(mj=sepkn|RE**E!lr}8S~oC#9SxKhV0^IN20RdjD(o*jN51Wl6TeG z69CxH!EQZ@LR%mmESO60qbG(J4c(*WBIpQZM^n%hol(~_y7pIn4j=!GnfdV%*A7;E ze3*`os&RAU&L^`lPfK<$Y7_QUzJGRB9$9+xl~)*+ogYi5Rl(qFAbgMZl|9DfY0cI} za|K%J&J$l|>A)9Q9ZE;jo#u3YTD()QYcN@2S1xXkA4KjToN4s0+bw@mRuIB}`?i9DzmZ3F(@tfAa@Ew#ggR@D0Y5#;AsQ zasDu=+#jB6+bHcR2oGTt%Fh)Jg%!r<&EeA$nA#)45j2Mpy~uK#w$G+)l#QI?cUZsc zf--J#=Vxgmj}8Ohz}0kU11?h6eRgDt6b582Gy_QX_ms(YQ^i`c>1))io&O0NuO6Q} z+-KCk1qybA3zGi6gm68#cIC*yVv96HyP@0K_|vD<8q9E;vu?tF6gDfCy$>4jdPGk8DHiI*fouhRM};w zGs#yQ9WP;(e2?zoF<~D)enZYv*R=v>LFT6*Z{06Y=$@X!nva%*xI>_`7dLyHKf{+} zX)^RxS{%OZZV|>0;SNO=rgp5glzpP$E|!^^yFig6>U-WAt1!mf3VA*5T|mvrr(>HM)hI!&o!+P+^ditI8Cq421v z5&3FpHvuT>No1hpGmO!_>U@N9ubopKI--T)8quiYpguvI-z`loK_GK3bM;qE(c)|) zDh~G0@pKQ)4lgp2)2j*IhWP)Bv2zF#Em*g7*{)O8DciPf+qP}nK4sgsZQHi3t{!y6 zd(n4rr+cs`8Efy%KiB%!W3eo2@dEkdwCZ4O%qI)0Hp`;3%C+Gi%eq!Iw|3`vR{4=t z)So)pvPJ@`vfbBdZ}U6~gezglSV6I=hD3AP4JyE1aCXA2Y0TEQ1?`M3%(F``qvR57IvH zO&~*D`@y(qcCoqC@g{xmj}HbNAg^&8P;g~*;!bKQK9mVI?=?nqG&x>RE33}ZvqQ<6Fj@x6xoftpM=hhNlt)MR4>cRP z<-1Yx;&zn}_m-}Z?Z)EU=<@SI_D|{RR(GQY4Hs6PpfsukUxi#QQEy$(_ooj@S#)DGmM) zTnC(27lKdy+lseoFq!_Pg8Ubmrk)NOcQU&_%DT|We7G@PJcd`M!xQ_9ve%O<)z-ai z=S|NEn0O5nHW|FKlf-6_8$Be#LY56H8eUw4;7dA~Ocxt{rR!APvMERzZ6!4kPFNYn zwk1ai`9{Xh^!?dg*X)USct{twvrU@!6SbC)7#EA#@Mn?Nm_Sg1K?VY=uoz1L3&&)Z zPp)#3#1tFiJYy{$MJj?t-Kv{d z`~GsQ?=;Xms#y?=SOK!9{W?w# zm zvJ0}b@oi-)ierLSSuyqw>apOU&9pyk>e9%ACNRY&X;fR?OjGx@ZY&&-6kx*)Pr=q| z1{So|sq;vyTJ%NQkHNwXEWkOin$(E-#-F}qRvZmgK60#_=mSNI64ZrePZbhfscBemOH1eJa$Tf-adI%X+jh*2`E=zU7kRdbBD9HtWujr;2!Jyu&IEf~EkR zMThGv{!Omzr3+s%0R}agdwK659_p|80d|RQ*pgs3|I?gDwH5n2GX`SPY&T2ZhA}6u zh-N*k1r5%ha`@O6ae=&JDD3HQBU8(ZXe9(42zye`C`|HJEPiJ`1c%8}keL(uMiz^dvFZZqS?^NbDZ zmc`TQ^p~;OX60u$C#b5b@{U$aHI^^iO1sNH?wzvGJlkd)rIn-Nb*Ip~;Y3#L2M_bD z!S_t1)>Oe4{yvWL_pz^kZ6?^!zYuWqL>ZMjb(P904^{pY$p!Jxl z2N(cjAXMr2X~PWbqGH%}07;{$?Z(^4?S}35Pck)uHDdc%|SSBoP~H)FC)l{`e8K}iIOu{fRbaVcbCq#&$wK_ z&-h$~l2ccWlCxKWk`qqIQ{YO;BiMtIleZ8tbGj8Vb2}9=qonH<;`9616raa%OTY`P z2O+1AcF^>ce9(0K_kEuDJjl9UBtFBW!20Zwvy%AV1*rm`BRo`tzU5;-5k>z#bN(oa zeu9_mHyOOj*>lC*?wTdA_j9Q(IS9;!2NhtZPJU?5YK8RaB0C|^wZ$U;%(lHuoG<3Y z3BzwWEC@%=dEys!huU z9mU=P8{N$sabDb)XdIHq1u-x4VOELPdl|&sYQO!%92+)f?T_5auH}Dz&YCA%i1V_2 ziwhNJ!n1ki7k!p;o@7u`rRT+%UlBP=@mzd&&tFXK2gTe@eFk~OGmrO7a5t4#G-*6= zO<4b)mA7<^5j(kGzA^$qiUN-mmah4>%(n453KSP;9lbk!-EXp>+^vOVmzJ&yj?vQ#XSgp0ME=86|<1!z96uK>>#qtQ0(g^ce{M3Vp;~ zFb#qHC8PnZ1tALAXJ?&<{HI~0SsSE~Ao8b#5ljjW0He$(EzA#wyFSy?=rlf0mmW<| znh$Wj$>>k6Hd>lyP!)cckV~6^p8-&ub_897{_Ie=nr>#pk}Aivyk zv{w*njN>pi=js;ybv46P!xY0A2PwnxHBK%oA@!R~xI&c%K1updL*53$?qoM1mm6d) zYi0(04QI`e*7#d(kNY9fq=)NFzLR$+$=gqfz&p z8O>@#JVR~=LK1*^sb-86%xb^o_%fo82K8hpb&jzg%oh=vR--J{W3?gSU{l~j!rMq6 z6Nj`qQZUk64&A`A%1#7)&R?S8O(>e8JZWANJ!l@qxzVPrHNtFnCDJLU*++a8cE_Ra zqGw9oPI*;*-*5N!J>FX3%OB`wmHS)~c7R^LGnT!z6unmpB7VGjv}xokaVK`+(~z8; z{(}hU|2q-<&iVewWRKx5D03b-a!2Yk0Yimz>X5gngE&?vV zWJsWaoZ&yTAwWn_{5z|E@K3Sw!8RdpPuqY2r~m+L7F4>IeQYn>Ov zN~s}$4bW~UiT>y6yXH@3LbDl@05*h^v-43PTmI{=7?wE=t{)|gHT0~1ey$i=Dax+u z1b}oH;iIgjSI{K@wru zH$laZ@Gjuz8a6;0{AZ4nZ@w>a0Q(nQh?+(}4k7}nYg!^~FXk}-s2O?1L*CXb7eH9z z5-q_XAZSl`Xe*x{96}^k|IIu;fHAu@z+v$K?^hmGJRJz;Q0VU|_#E+-a%zf&l3ks= z7Y8R##_Z2t&HEpHvC^Zd?hfD|?CLJ$&84viTO(M<`ugvskR?YDxgE&kPwaQOJNT1f zq1V_cum~^+e<5KIp%-k|_^%g4VAw~e#Uo|hPxCik8F%+qtlmUbKfK-vS`Z*V{(yXd_zdtH z-xGHj|F5zG-yt5S`Ve3r;t%DUDUmPjh6y}GyYF-an% zVi1mUKp0h8wL7ngcU`Nx`h>e4-`fF0#P#9=af4ZQF!co|k z({+fBT#NliMWxOdtt?%C6-77Q6kwIt(qkLa8F{B2v_pvYvt(=4XXZd0&I2aQ-w73% zzVgd>MQgVzk$2N5l^eIwbWWXgB+gQ?{I1o0tF!L!PoKp%u*}xOf!w}hGb9q7lp8Dg z>*%o3Usc>7kXDE3QFI_H_xp9GTY7OcmW+Ci6$n_|EE(nqMf3UPCi$3smXXFKiW174 zmpd7cbi{Nqj}LL6H@x{6BfUk;1E0fGQ`=tnt#Dhxr8ACX@*9SH4(F3MQ+v#VG8*_# zb&DJV0TI#ECOLd<^tM0gbbgYKWa9>?*1)f?AF>x`QW9k5lM!&ET9|as-|J-E1p4Dy zP%Bmtpm1s7pv87kY@$jpdgAQ8Z5!iK#|U&lCmznl+t~v+E@xCd-}aJWb|2F%*Pk6# z&k`0ZOs1-!3;$y$J_+?%#Pi&xMh6O_5%!5c*}zTRNHYhJ77(fem$^IO{N2!8vGjM< zbcE9t_1tUurrO9X-+L3Cl7VA(E+UrZnC%yzKUjI*{%dy+7Krkqhj{jSN)+jjNTDjL zVx>J|GGz+qO?J`kHPMnXirnniS9AecF+=%UrLmWcPr~ELS{Ds^wMN0r|>R3^?ro)EZrZ{5dPtIwtb<)a~)gy=ZK z0pW&WfoI8dfqL5FDxRCu9A`A z)bmtmG1W%j5S~4M$JxP@)oq8j8wj1BjB-xRrvbHA8F(5IIwysl|4zrrt(ZKtYcxDl zo?W!9+AneYTa?RlriyQ$edLH%?wMjizsZP<1kc5@)yEi7nS1-U4t#TJ0XNI_DkX&N zMGc}Rpa3_U6}Bwi9%PJL?DHtd2$0K zuEApkH=pM=z~-1r_-4Vd_QaG|f`g(Yv-b3k>WEwxx@)-))pB#UXe*OphVCieI%YNo zuHUCXs_y7JAowA%tKHokgLk|vS)(hH*87$lXQgpY*uEd3*vV{x2mcnFU+n>maDWrj z;w5rxcw^h29sjh6ykG@zs*<3aH*?M(dii7<=a1z8q*iiY{%Si%fk^nZD>)IPT+^pZ zxJEH`B;b_MCC(uId-@bVboRWVd~fD_1S?d`?VIu}f@j$a<=~@sg|n=t1^<~{gdLZn z>QI1fz1)>x#fG+;CPLa$qW%Kt+A{}+7YMx+UqIfvYaR2*hyiT>$dO5Gj5HG`=uJs)IAbfY`9+g%NdoI65>r>e*g zr{F5`7f$7-8fBdsxE?M@$D+!Dh1F@4-Cs*2lq=%>G37KGWvgcT6a|cV8F3G+cYXTt z7n0;FY)^{@fZ5DsZi2_DHPQCt-&(oW0n@)Qj{`b9G>s?Y`m*cHHq&O34&qPZO2+Wb z8PLL%MJ+cG478dYmhGS@(56|TUHQ#1pc?tbFVDr=I)=Z^b8`_SS9N-8WYxRs=X+jL zlTBIJuI+78Vqq@!%FKYKeeHvOx;X80ON>*Sw%TODGc@(B0g3589a z4|E|u%iT_va?rV`n^zH;#u;!yxbYebQdBS-YM!f1=+Cd^eAiTb-^*E5c-!vTyfJbS z_wA}n#%E8M9FDTLL6>gM+P=e~5(cuzAVR?*>EPYd>3}Ju6jYZ_x&M9shIZJI&XAOb zpZe;Z`@Hz*rNX!OLR*@7$UTW_Q5xUQeF4k$4cMhLpgY)U59yFvkySc8RNpGffh=3s zW=g1$t_~=Dc*-0?JG`q~D0d`XCaRXLrTaXNbw-YyREyas^ag(9xv3X0u7QtvJUqqZ zV(6PjCUc!7l4*tS3!en9)eS8*$faPREd1qZo>OjY$H(@wA}21I*zDJH?s$yD3ysIu zeHO(_$A|nDd3@AIN~xVPKLlcj1-7urxQUEp>jWJMimu)@E+m39PEAj_J?;j@vsd0t z7SCgi4K6%BZY(I0YR)XMV+Wo`#ET1&Z4+O-I3Tr&b-rkNxy@Z?Y8e&nC7lQZu0~2% zVyRNVj&9$+`)-FR+o#B%+#nm!f>hSUV{z-3SV^6E&JI2W1g}aDI{DobK1S0>rbj#i zU?ihR%Y<4@&Z;q9xm*`VQ1~8QK41fB;A3FeL`VQ~PW1$ADm}Ni{1<%Hzf=}TA2+Z~ zD!so_|9Em@f#5U}$J7&UE~3#sl@992P%`TuV_B@-$`DI;MiNyiZ3$J*ZHAQYGt}+# zK8$vF$%0{H7(*%5Gxpw1f`sDufdfC5Bf&1xiUw`ME_HHwiNd8M_P9$g72Mrl9#*jg z!W52kcSA`zpGtGxo2xTc+f;O5qS5s@jkO7|;R8R0GsD0{F2ueqljq##vnnXEP)?M; zaWjncjDQ^*1|dkCLlyKn!)Z4h+fvUj_tV#B(Bs-D!ZZG}H|CM%MrRC6Am3URPCUHO zgu3!lQcH@y4RwW%e`+tI^s!2ngskzkU#n8@eN_j?%f+qB(BC>}9IYHlcBhHqAftafXm`qIzeCW`vySam2;?v`fcVhBFz}~;AP(b@coZ>@II74)o6Mj& z*!U#YbRQD8*t%~dEhQS|^tid*sYI7;(i^C_OjF5Tf3F*jEF90lL3!b_;E?$rq~+7A zs4I#7={Mcgd~2a2&?-oGYm<~0Wsj{9y}(#ivHpitNm<6j)H+}zD(*!297K zN88hk&Wl31*3y*HG~^YTTi?v{k5m9`4=K!3I*+A;%43E)=SFy3_Xy1 z)PlN_da{L%5*vyYue!e1!VM-3(mr!p!sknhl;pBU6Ahlk+gko-;8Uk!${G1($fh=T z-E8)EjrG7iW%y;C-B6h7DZ`I$#dWB<)!1EmGFP6{Lx^ss{7s*dBPaEury zs>snO>*5XyKn&#v>8Zs&#sdc$;mU9gIXoSb^w_BB9uVZh?{gl%dti9A>uGSHWs665D-8IanHTD(nj&r%hEP> zXs2UZFFHXqhLj@P?$1kRE4DFQsBxSm4aJD$Dl?hgjT2UFzU9M6Q%8n!iBtjBVqEy? zsl*&}Q%i ziy`tZT5*@v$g~FUVgnod3-o@Xf2qs8!|X2wzXM9Y`hNB*mrFC>H$K47ro;6j?)j-Q@2@>KDFB85P`$m1~uo?*BZIgLP+PraH+(ixQgIOI-YjNQ^hu}N5pTjuNh#bzY zp-3=MU%+`lPeW>=K;#2cnk!nritLBhi~-2o$2{!u-n3Y5wF%C*e2U9M{jj_g_ziAY z%$*@oEd3{^C!o&1r}by=m=klr4M?7YJ1UP5zEzSC*I9s^Mok?Kqh8ogTuYnJBR}|-2{|5$jOv(3gi0- zfFj$ORBlB)yyLJc7&da3QrMiUYVrwkA}s!DEn^FvN9Q&SymwTFU_&>Tt**q0LodX- zRo|a#{ST*NHR7{5RIP*`-cotT7hm-CpqnfoSHUzDpe?TO*2#q)z)*q@()&_z09~zc zwh6~wq2Fj7XP*s?M=xUcg0+e@&F#^U6p4@{2UIz_?W|`PuWPh=U7hZPWf$-Tv~Q;? zxY(yl29Iu3Be_i(jtho1ZWD70Ma=Dr$WvL|uiR4!FoN_=7I8E&qf$WDyeuOb*=@hf zD;+hp*a9u5<{Sx0FOCjPX;)}T8On?XF7&6q_J}OUV<7rMwyN>*8UMuoNC;Aejh8Z* z1~r~Pdhs6BPPtv_aZxjERb=GyhN^2zJ9a!jPkZMWyb%$1&R?IwT2<1u5}%^dTibRM zxZia-Q;A|w-MeeX@%F)HilA?qLt)Vp6lLm%6Z#K@cuE*>)5e*fBn?+(|K#4KnxaAE zU=L!X_8@>Vo$j+nnJA7%tjjqMk7K=^YSN1qO=^sjrk58_7Z%tpaIu4q2y*J~kZUny zMS!+Q5P+=FHzZ{rb(1;3cNgsq|DF5=w3Rsw8{dBt_Vno3qisVZGYDZsD*7}8{}6yy zC%pm(4@BaqiVe{c=pFvyKz6lW&@>XmWdA-LIMl6`I;0|LYjZUeAxPd4ID$_GyC0|#tLjymOJ4e1>GM4DFKWK)hC_ysG`vzX z^7+N20sg?q*>SoH7tvlDubgL~c%%A1@E%8OopnsIXL3W*>w~)5$=pWq z$dUG~!wowsgo(R3Iuvsx@){A{Jby8O4_2gRJmlGPP2srTiJL8rtZfGwb6t^YDsg=d`RUyuj zaEElOsC`8j_NiTry|Gm7H;q9cQV|*kr|O^ZA=t$eZPR2Utm~74Jn(r+Jam9z)vU6{kg?Puz@2b;2$7aE>vT-$70uo0Oq`*n#Ao*+P%= zP!rU2D|mTWk|JyzU<9bir*MVk=2-qfb?{GxmYu3%D zu?!i=*ZG&bR7Iy-^!F#A;?Kjb9>eUqwyb?#B=7r|#s+(1B2bi_L>h zY>HZ;r{;a^Qc3eZ4(u{u{@xmDwnLfGnwKWY$~cHaRw23?s7FM6OW(J8lYN&`DNln;*nRz^P;Flflh1GxCMEI8o*MDzou5;X zIQ|1|BdfoC2K_|BgCTcCb@O_kRNV$dAJP-Xs6x~?w|OP%tRQAat+i6jR4uU~#=$@hC<{rI zA@Ibf`?iu*Rn&S^rg`$lx||Ad_wr6>uTG}NfqveLBzH3kv>gv|YNZ=<_#I)XLiwv; z>yKsV5US?I@-6!d(|#-x$dFNE#hF~oi)TQ|9|&+M-pqASfyE6Yer8h}sM#iVU5uPl z>ttceoOxa6IR?b%XYu&t$!(-Wf0@*TdI`+zq+9Y%bEn^)F#LRzsB3n#_#{4%Zinl2 zB1juVo9p*#XGa zFK*`N1G3X&h_hB5tdFxvRopq>@l~D=cHTpq6}fMh8o>bnjNW)16Z$*)j`m=1oa*4} z5wj{Ht5)t5-$$)*wsXfH-Xnky1Q}Q zLp$+P5-#-DyfoqTGErxXTH}#Iuq^h{4lUZ1;j+b#{TSE z7s>f|^y7mP{hyX(>clR25~e_eR5ybz2ya=!q7bm!{fswv50K9;!r07*-D80tQjh&3 z+d6aXWjb9ZE6LWKK_;z*7h8YdB=OQFwdA@z~QPHH+c3zUjv!RGe@-@YIkN>p0+1 zdalqGz~vLk=O~z(%#HWHgB=XgOafS-9nUJ84Y?0=sBQ|=SxI z;ikxj)ieFt<)9xrR!-LUr1#}2Wg8Wv%`K57pBj?3@pTQ}--MCN?)s4lSd>!W%`(sf=Ow~2V3tNTOC1_nhXW{$CCL_z?onf}_My*q^fN-v3 zD_l&Yn`7EiX;hHk6qLQv;~vT0_e~fB*CEExRi#ZRZ@DBV;ZB^`jMV0}GO2D3Yc{ma z8Ch6b2I#E~uhVf-u1fiG+Q;-Ihwurit7jn7uRTe_m^w9cvgZU;V-2G3Kek39>kM(6 zYKgP0Y2eVK>3*mX7aD9rz9g7TD;si!m;;_h%LgHI=@mY>y(8WJGWR@FxMUTNLR63^ zxh&`j2s7OTTX^+eHuH5pYGbToS7Vpxwjii!fBOu&2IPc(lSbKpZ&xT<i-bQi6g0L!+)wla42rtfwQYG04%b*<%PUk(aG%IDJVH9Xpw*Do@auuuv{Y@ty0# zsFud2){QcbbE>_^g?y6wPd^R+!`k1rxR75YmNeS%L(sS3+&XU?XW4bUct*-TY%$Su zC(xTbidisO$Gf;AjPR;aqcwLQ>Aso(E_fRn*4SW{xEOIld4qm#Dw7neAa<_%XZ(Ty z6P!l0`ZC<}Vvw0i4rZ)NGp^WjI@>E!-phhUzhOhbIoz1ad)wN>_d?mbem3> zF$9BR3l$N#pdS5mpVjACdoJ3loj#Vcd}~e;jh31)3NEWv&iv2=&vq!}0T0m83X0v& zP*7y~RXAU_Ds1ZQ+&jAlv1|E8SGxNBk>U$E z~=IoiW^6`(y$x7RP zK)p54JE~br3+@`tWJ_H1%-gN!0vA&ap{P3XczfP7PWfExNQ7MkOb+_M$(P5tnS=#| zBMWWL&2Ztiv{L@Z)ONx`rMO5R>n=H60SQ@VZZwqZvTa{k87#D zEw9Ns?`4P`8s6Y}wNnSp7fY$I#y6I@Eu$I$gajVWNkDKrp`_G z+6?@s)AYE;Y{v>+;@>1;$ye74pJ~sr)1s1j%Be3vyBPJ!fABjn{MUX5X8Qk;Yhq=i z`;WOMHnv|M1P>3CqmzTNzBQCvX0#Ki(xT-GZCKFXEisra`lLc9S63Li-d;LEn5}3h z2(gx+!hoPKCvl1`3CY01!BCHF$L@#ij^!@P<@cEeU(Rfto-ew2i*q}Pwce`Udpq<1 zvSXKOTesG(ZKq78Glpv95+(3I& z{Zm(GXJeoa4hI1p>)eJ%0B!;Z&j8l7SgT9GR=}^ybbL66Am54@Xe5MuE4cg5;4A(c z1YG>pdcE8L!D@l}HZQo>bXc{NyWb9eF$olW0~jzLhL!Ile!#b?wg7xIyE}W|_unWG zKp$5y_01ui?16gQ2x&OIs6e2=Ooz&C2s#jO01ze*69^#Afjb|8Tzm**qvzYZuE&4< zI+IWVoOE|}kJ{8b1TqnAv}_PgYmnM}gWGQEu_r~qt`9*%@Hgpvk4T~IK{a<;wlY3u zjBxbrWYcbR1E@hv3_mI$uv~w=ujqqAIF&>nsbkzhZ}2AIA^;%2Ymg1~0N6_dP@CGs z{Zez=zCFFWBe6^S+70BZYud`#``ist%R7kb^%Ht_@w;%q2-VkmzB@lvuPs54AV5}s zmm&O6R^fmKK1tuXVVb`Pci?wW_Ce|P+D>p0dLJ%cUdAr7by)1s7eDYGb{>wF6O@w{ z5>0;;?{+xM&0EoWQxkK*d&ekyfdRe=))qbje|iSY0{;3I-Sv1S>owc?-R4-`Y&_;f zaeos4Oz2MZLA|ehWmT+KYPT!cOb_)1oL{9 zsCu4$LNO0P{5^h*?PN7v2fu(y`)*bMo_C7Dc6lW$z?%JAIlo#|AOYKTLCDi^9&cC# zHV^T2^suBM`q#hVHNST~dYWON{Qa5tY~plhp!^W0{`M1+v1iMo~0J?iWv>O3Ezewo)GN8dkH#-2XCmz68`?cwP zrIipMcELJYcV515zoQ{;fm*HiuB&~4Kl=f$KVB~I(!qPLynf7jbM-U_dC6{RA7^@h zLf)?ROFK4r_uc?EZC)0?HM?H~S33fJ!hLlqSo@K`HNRD>manT{?ht#{+;+l#MtgQp z=~khwqS-k?TTo#g-H?|(`-+gGKvmci zjhxINWGG-*0t9I{!xtK8LEH;mna0I0)4n_Gy@f>0NBfgy0$Y!}gkkXWV`dPgnwCr`yH-7lcl0mfWY|eR->z`bNK4BG zUQD|t_IvecPuzt(CWiP9b}d4C_{)T1L5i|S zsIZicfg)BHIZjY-!cDfW6YEiLz*tM5xnKV)o^VnU&EILuW2RO6mwS3xGs<*wJ54mN z<&|!>)YnN8|4T^pB|mQ46tv9p{o$74s^m@?OxG;goZQzHnNR623oz)vK_SjA%p~`E zs%a!FZ%eGL#=;YFWnNMBROUHoo$V_;4>IZ4Z~xfP)3woRg51_jc2Du9psZ6H3gVT$ z4B41N6lsA(x2BA<4B~vny4#ig;wzC+n2CBMd5;~uXlpI#;$!b;1+v+Ir!Joa4C!vL zGW|@Ccu7v~n6lrKmxgIVM);3m6H#0;%QDL*9ms$OH197#MA<4Kz4S*~U_G8Ck0eJ6 z&>Fo&42OsDd;BWxPYi<%EZVu%3l_!^B9XBWD3W68jbfuvABWVt-dA09-E-C$`Op|C zIVt_-uV?Ol!6n=29*7o+E7mC={nO$)U{Aw72cRPe8`ISazwJmLdVX%&~PfKLBG&`n#Iqy4SipC*6ZVtTaw4!9!SRDdV?i)^yuwQLzPZc`>SZf(D$w zn3@{v6Y~?dkwhK!M1nfF3EbAQI^2`B(vZw8rA!B}f?T)!2;)u(j@a!LiYBoujiKul zh|6xu5o5IQfDnyW)IGl7V@)jBl0W$J1Hcj-ysSSrf|g8TSWN@}1(<|6`GpHwrV+|f z2(1Qe2JP$7f}dC#4D58~s$!gE`p-N{qDy@i&Zy%N z{yhwwtDBz&u`O%*OoFF_h|girU(I9BX4O^htks&4n;_npBx*?~w6e~>btc3gOdj7$ zkFzxJ@!KRpnDB z=S!rwS$@p9Jg!zfjjcvou@&4J*@tiiK&>;x1KUTd?z#wuu1h0#fCe))lDh6wyC~Wd zeio5fki;Ldt=F2M^D-azW`zW>eArRxOjuF(KDK=ianEhU0Lfe~>geedQhX9?*7cRt65%qe*pDn*u_PZjUvJIt^^0Mn9xBg#Xc3X$n43ip&b6?wDP zuU$)Q#zX?g!YJzZDM~;oMY7jYORZE>(m7AJK*=Y_H=9ee*=OOS{yB7l5-h$eRC3Ih zZ(WQg9PfFtfc$0f#W-v(-ATIae{8L zi`|Pd(QeMp)e@=<~HVJo1` z()%lY)>Ag~@70dK#1~g!THX$!Q^_M&nr~i6;eM~nOAAk82z&~=x(dD=ek8Dy2Dh7_ zfewRyF}9!dit{ZmSvRn%!rk>8@t^CWF<>G^TTRBHjUsQ9a;I%YZu|5jid04h#Il^u^O$i zQQcEiwJ)#q#bP{ccw_%{W!J+=b?@p3%|h$-@-(T8PowvzW2C_vP@*avD1c7X@8f*k zc_j`dATbw4*G)>NhVYqyy;mYI-|&yK&`~2(}y8k0h2y1zDCKCbL4^Kiz`=zMQRM`BcV}e zQ_fZiH%p(^h=55BHRYr3msHH-#{Ig5j02WOZvk7Feq^-Us^E%oYl`D=UFw79c@w!s zaB7~^pbRL}}c?S3&I!2WiF%fjfA1yJ`WYZ$QycY#wDQW##7lEp}^XuNdEKrEd{1I*}{rV7sVp98#0EM+AQTZZzN2xy@UqQ;)7@yAZ z934}3TbZz`nltFCfl^TQgcyLJl-pd_g^Xk-Bhs4~RS&taMO&}&LO(SjT9&|wr}ek= zIsImd!NVMti+}aE$&9Ue(o%HOa9d%UmS#grUvp@R!1P>kp59du`VtDfqK=thfX zN-%5Ai*1-HgFzigcYEW89M9uX!-7HX1OpGUrW70W7goDF!svAR2 zqju=2f2JGogiJXJRN{Xo8`Eoi|YWq0%LMWG(;; z*5NX|SRHODzU+MdcJ-`dR#5Xg|SKdWFxlM0e2hXGLU2E%ms%Y zs~t>+%G7RvO0SG;yd0EB4V}t7AAE${rwR3+rc-*CW z`SPE1{mHuW`AMXcDihHSB*Ybj&UyEOR-pa5}EUa$;T6MaiaABU$HpmICA5 z5qaH+xkxnVXK}rF&AGE;E*XTtQ0AcGWl=fxi>E{r*4(G(^9>EOxU^G!jfl>w3{ma= zWWW3^I7fm?&0epTau-TWIpCjgY+FL7{vkNL+rMA(Y1?ENC88L77FdYn6{F|MS-s(G z?{n@t?F4%IgP4tokCXEV@4uFK5gl0*QS79vlaZ?pupq+lTnV~J8$_A;YoJp0q4jp0 z-yM#w$NQR&ITCF{t3w5c+fNsNV$Iw81KN^ZtcQqc4W`e?Pf%P+NqS?UA_nZhm{SI@^$D! z2B&+LPM!OtTmM`0M>t``hq0(z$5LdxI_X#3s?{FO86-zhZQ=cAm3NHUQplZ%9hlJP z>R*WIogrE?!e+StR;WeAQ6OP02$njJO zfn`|exHDYBPI#wI4{WmGo;>;=9CQ5a6$f{O-zaFmd}`Yp9hxkYD%IQ(q?O4OH#(ql zGGH;f3ou9s`8>ULLUD&SPb!FHkIS_?xJgiOcoKL0p1EXZF*-&FS%E2)$^XIj_$2Xp5J8Oqe zQXb+N;IKJw5k}GV|Ly+C;#28Qqtl@MND!^=Z#C8?P+e%0{9=^U@^BFwyA+Ru!@R}j z^Sv(u-N7{-6`~Ya>h2G7R7 zQ3JMX^;pZ~ik>Zg$;C^0n{=YSu0}rJPI(MdTtPIRT>28OiP`-Je-$`{NC-WX5Kq9o zyl%$x>SL&^hcMssVGk3+K}(WlI(Bj)TVXbcw2Wg%i|~ z`KxlqWV40M!6`CR2$%=!_lhZOw6w?;to^YXKk`Bp+<&yAw>NW75*iu!bc zl$^0Q0;zn6Qm(VpAj=;cKdqW!hfKfYh($FCUR!oJ?qIOrN<+?9C@{`7jdIhkHJ+L5xP@7!)qUo`StFgY<>goThUx`=?fk(JfE^ zz9%;8JEA3=h2@>~qDbxB0ZzYXlQ}Dflk+j*51JTUQ4|L(f*faHf_%5konpjo?imGZ zz-5T-;)E634rdHOLU)z3?xy*vvcE`APo*2AOsrgzbE`@8{I)ZO#W>-Zo|C3anN~-M zPMNHRaqZVF#jalaMoS@_|A(=2hz>1Uux*^&*tTukwr$(CZQR&4Zfx7OZ9A3Us2cB& zQH^Tu_UW9x=UQ`7Ay&%@kB^}dXX(B6PnY9YE<`3mMf5cn=Cj4htZQ>=l(OMY3i!xs zgG>%^R%SQcgqh}VuP__SDTzbkVP(sXbylA{tlQH2sTJgUIY_|DNoc|Rec_2F;@ zxO5=0Jzl{(h5UHn)Ip+}+$lY$_b_38gxZ8;*YN-^sc678q#p*X7av8xotT2AFewDA zm=ERnaNXe5P_(sUi>KVJNrq5k?FnsC1#zOSw8!#A<6Zia(mM`qlqB--AW4L0Hs*`2 z&j;yaIwQp0g|Y z&B-MLqfD3qOuRD=%T6@)e+|U}+oB-S;O1_>WMt~{nMsl6w9jFFYL?iVU`_MxtT!X4 zLX~Dxb zcut9#MLjqc*(`f{{AzX9@G3j@OWk)Z|RuJ%)Jb5tc5;um0GxcZ|n9e zw!yn7FjC4{@rYdDH51ke5@-wY+@+6`8G7_kwUl~e__&BEi<`P(fH;O2lv`MYTE+n3 z**=v&#oXg7%_XZ;mFYRaquAO>9u>qi;oac5X@^cG`!}a1pS`cYL+n6QquffP%Wz^# z=~jN@$!;HNjkgh`<>6r=t#gJ%sudgWJ?REZIyyPNp_rNAecVfFs&Cg;vW)q3Y1?kU zOS?M>8(RXha0;@7D>%+j9Qq}HNW;RiL5dU@P8QE-Ts@m)|h=d7oxGTl8J zM|^h7wm+Jymu{=LnUyJ5lqau{rypU;ZTa$10~6131>2|UoD1K%aNdUDHI`L4v|>kc zF0z9xH{d2%$V9BTrytV8HnSQmFDrQB%c`E|(2^^2RMCUHDRFJ0x)Htn9{sc-peq)n z0ndDbC<3q@YSy4ZPf8a#l0U6HEDb>s$6BqlaxVW1w$Q&BL>FlDsT#;Qi2V55%YDN_ zYK&IvN0rD_$KJPnhx8$7UV(dT8au5EefqgqCbhP}tByI#4zd>a=;eN}V5`WDo=7?N z88CiVxlhzZ)g9K$cENI|BN~OemuE`;-k8FBwX}%pfl?!h9|2Q0baL(sDm*%V8UBSy z!g?nhKqhv0D!Bzosgt%~>}N%r&e4g2KGpj4roXkmPod95jN=89YZq zDA0_OBwJmat>_K@M=6X`y>n~-P(q2+&IZ#=u_mQa25mc0UQGcvN&RLz0aQnC|2^MF zu!#d;#H+E0RmZL{qH<%T(rzp)nTL}@+59se4`(GTuH>AKgw)iiyK{OTvXV_h9dY4; z9y#9|oso^sV9Iy6Rq@4K?&~YCDc0Y9P{e#h>##LayS=9T`m)7Ut9_$7%IaA42#g2a z{DInT6&;{H$2qro}zN^SoplDMny-Im&A|+LAt2stU!@fl2MMjtuXM5fddC% zG?2F>H*cg>h;43-@)Oy5ppP=^a3Kneg!3YUVPHuS1#&Wfi+Br4t;lYK7j6vab~>8E zlJ^R~I)9rv-o9KrkR4|Rhua;ib>4w;NtzHvTTzIc4s8El84)2g8e!# z)FBAbsql@`LmJ9}Cm@=2V^rEH5|4pCg+JR!@x6N`V|>af-qw}yKo()v1ccvj{n;qz zee;gg5_x>b^&*L^2+4h)z93)n_>}%PAG&^ANfAU8oE&_m(~u?uoWZ+?D$y4qD=5ACnClBGOi$vy zMKyS8ew+%)V+N0TE{^iFo|O%N%6v%Gu|yu`s-n*qZQiuHANig`2PpdTc&g-%-YXaB zi*1Gdco2jhmg*sd<=85W@1k*b*~~;aHU*s18Qa0OCh*r)Qn7pd9B4g2hTxWe{%K(> zV3nEr4_ymTW;FurPsCzdmlb`AqvUgGhq%mkt>})z2Q37$o$9%UtGpdA*EJo~MD#+q z{OS}}DbC^-ey)P3m*d|#XA<);5z1^svNQCKe39#51W~Et)=hpdp-Cvudsun8S%P8D}*POuN;Aj$jlc|k@P z-dz;7UkKDegEpWlZHR`hMa%J$e4=<%Mno1Q8IGcgVfDI&WAJw@x)Q4K#pU^2QI$j6 zF$ZXZ zoLHXT#nKLcO*NtuAnW1@tr;ZnPP9^uR7qGol z#6}K?5>$V-i-1)0j(>nfd3O4x{w7M%tsMMYDzWL6a&3bAu>{!tFR{a-kE4%S3)dy` z?~DfqMNAPLZzw9E*U`0TLDxNBrBZb3R?Bh#eb+lbS`Rm~^{iYuj_78N(S6V+L^dqk zQumE~;Nh$5C*|t~q-i$h5E*f*=u81|v|+VJfG0QpW|sj~c9o9Z7pJ8jv5q=TxgA>L zU`}s-_r2La{`UdIj)Q&90Ma}iBjXI{BhiLdCp$f?yk;RMfbH&M>_7yMq}puiPy1dQ z**J39PTgnL6M;h58V!<;BQ<)F)>Tf-IBDKbBGT8t*^D2AFGX^Tv<-k7`Om28Qr4~q zZ*8iZwihwgb+_m#C}IOIy{z4b|Hg(*tRylU9+!+7q^~u}%F`B_nMHiu4~19R9~x*F zVAtU^Ow??X3p4KYQtPV8uF{?Dhozw2G}(_yyU`TT_8-T9sOJx-O`SSZZL3i0;gOz! zFhsTFqoC5gOV#F9$fJmDvr`UL|H4X{8NuZ z3`v>L><8gP@HdaKYF@VyVoaQra1Zz!jJ^(cnP^j$tvqBKK=Hw%D1FSei`|?p+a#@z zS9i&b*4mPf)c$6pXc1cxfB9yYSu=YSZ<&;2KvM#?ASp@rA|yjxb}o+9!Hzew`8c72 z#f&LG%P1?H{F^@1tsa+ymRQeF)>KPIyHuf}8*>h_bn`Gudo*w<_pUN}c2NwDHs;rZ z)96gPq4xL2(@rxZNC4X^JG4V$?qO~}VKuiCu4Wu4vnAxg> z8K>EMAcZ~U1#_>rsd{J$yF_&LNLfK$s^_o;{n+j#vbpt|+70YM*{WQLS3cY$-U~5b z9icmdVCYVmtuk$oCdbDs%b9nCbolbW+$1z1n_wVP|C`v$wjIsW@X#evJ%a}~zC&Cm z%H~=x9|1v%&J?TTmxwP|>H9RVa2f zhnc5e!MDQb`&ht<9i6lHB4N=5U23nNSs0}$ImSiR;l=vUr2aAH%{D$eu9ez%Ze)Vl zq?l(;-#Q#Ef3DNoY-#*%9BTfwQf2kJRF;|ehk!2w*UZ+{8$|%^X$Ik+x|z?CM^}SbYX`TBy;I!D`Ugq2%wY1;?R9*%ym;A!OkAr$^d%Z!AKgS0 z-!YVCi$alF42sX8@^+zKVrs8pOKp@sjRHvsG&;4iE?~&6nVmQQS$H&laYeI)+B=DTM7$OMtKVCe+v1t7zWZNs3R}#ON{(nDH@<>Fl(b4ut7nP zmEC8LoVcszJ1(zA53%J&7r+;G0V3w!>+`KEkY~>|TFZF3sSOgnH(P3}4|Bwa%`ALt zH;Ee!6b>mF84&>q*eeI9FBc!wTMHB2somQX(_`Qav zhFDF{1%iG2WcPkUgi626!ZgRU_oj5;6CD`|A?FX5TSx3Krzj1NPfSb<29JgY`ufEb ziwplw7WZ?z*l86uQWAum^#jf)KG_$tNXw>R8#3uKeJ;925~!pK;8repi_tk5NJ>G>QWa70BAVxZ*I?YtSLc90{tZ46#h zRB@6|ul&x29QSq~)}7N;56-ksV17k5xIoA@8jJXdA#P1wN5h^deNrPdwENjy=C>vWyd@eL42J0v|4N=sP2|eFL7R!EiDN-;S-v z2E!(jZ?ry-ab6Z|G~31G=Ea7L`7(T$yO?QzHDPGQf_L0$^Ks-vOy(Wi=)};n)vxW< zmzs`)Zw%3lP%zO>_<3903W`YQq`6JGOt2T4f}w4}07K}>uz2+pDm@Q19XSG^&rB+5 zq$T<37AY*!@`;YVDX&YuFvfXBZN8Ij|91)HQBcg%#4XU5xOt%`({qh0I{I$JgKSze3gisYfr)nJkUw!p>0nJ{Pqjj z+$$T64BlcT*m>Kb7<#`tO-IyaK~;TRHZD#5l2XSi7otuBnoZBriht1gIr~ER!dDzJ zLJUn4b6b0&2OF{Y?d`9o6$69%@#Tr$n%?nqm~25F-`PAKL^#7m?@8woJ*XHZ0YUOC zg_bo}5)MnjcyjE~;%DQC^4d*{0}*(FH?Zj5n7w z>p8^xbgp5#1|M&>ZtuAl;7D&pnh=9x=WGdgL$&!m6xl+=B^eY+uZrd3i*z&@RZ>5A zihnRlAes2*3#pqMjxR_@p65yFMM;ep#-gbv9ztNOl9cT^b;{m0l4C_VjO@J*Z1R%n zbp6xIYOeTs1UU&U$5S{(m}8`8&h1htMoZ5aMedeAcfeIr#n@bt*XH*%_@#)1fmfo zTy=~9BXnu! zo5qE1*Z?GAnZX6uk`zb42vSq<8mzmPk`L8a1HJq3BDw#zTquqV8j40jKQ?Rdv9(Bk zU3!nOEMinT`uTQ@#uhfbD6!$_St0Fd89)QJ`vPo8RO!76vgtg2GP2}9h?`FxSgm&h z(HKTVteikG>hlx^J*W zh}W`;6Wv+89a}m0v(3`im4CoKlT()2NiKwu3X77sI_6WxR5(a_@+faw(V_S3 zFZ!c|WuhY9tp?j>r?^?bwXj8$V|Ewf5$!WZ8I!l_R*PDP_z(Pf8%kM+Uj8coSg5{c zsW06C%2N`C>zXr6i`vrAH+bknILzInEj32)4RZ0WwlK-VyTy`&O-sg9PPK4RlFDFT zAOoIL3GxPIh5G_H{l=1-7yAfKw12V*a42i*#Z&3LKi0exH1#4AwX^h}CtlcVvnb_` zA+~$3*u9I4{84W)MdWk+UP~%dNZ-F($`;G&OJ5xR0s z(R>xd!)2c8l_}Fqz5#kv~4Ehgk2fOqQ44r{q2T z)_*PkXkYcw1Mcpl!qN(KzKy%=)bD5YmNiK;kD#J&;OIkWu7VjJpt2|^g$l8FpHz^y zXS;#hi$|7A&{ooNM41QA{w5{wT-MtJOfR@ymf37nMKq@f0v7Ino?W^QM{?SJ0bYW0 zPdtJ8TlaWJo-kS(rpk5XJe>>G*|k_rJCo~yy~As^V1os9xG}vO%vN{$Vpb|3RYy zXsAfd#_d2<1lLoeD9)I17sj2G=0W9P+;gm~TUBy?F&pa8h~j7%#{^A3&mkm8g!G$z*N{gI~<^nLH@d z+iP@F0N<-M@gX|AQZJ~UENww9&V4aKZLqIkDPy$G%~Q_z6YFnDfwLul5w0&lIgamD zO#_*f8?p^7eabJjAX9~Q3)IPRa_Q*#N{&5;ucy_LgZaAf?yhFAu2*ENlj~Tjl`wbs ziE&Y1Bq@NU(pd=I=Oo3!Kja!42QC}K5>Ym4l5n2?CGGYVggq2}HC5#kG9TGtl`W?y zgB=%7U)`;n?l~KdHiWK=&gVg{Tn*m#a_xGAag$}>m$UjN3J&`PwbG9m6%1#$X~T=? z%Dn6om(P3i{L-mx^p!4#rr5;Qcayfm>1)Q^)|Tw)Q6S|)O@yJWm6i@q>{NRW6P*5z ziu59G#=%$9n+k5LR}>(ORr=ZA{~&EgC@)p&T?^Y0>ZExcmeyc8X_u|kOEz$SKu>A7 zkW0NlDtW%4#({W~Rc3}{kL#&pa?y$am~`hFCCT;i76l$lufPc-;)6iHr&dHG3yGP! zr@gqYM*J-k3YzPeQA*p3Wf5d(@4&Qgx+c|DZHNJe#9kwCk4}8?QnQvB=8abq`+`=Y zV0GuI1*cDBkS z{;p9mqsoS3wxEHoGh017OPvPqa!KA0F9@IJZO2l4Bc)D8=}1m&x;yGnyQq!6@6k$^ z_{?uQe6U%Esu$lq(x@cOvBv*Mj{~tTg|$mKChx z@-kFS=e3jV;%Xhud-6g;D!tn&lPMHL1Cbh!)(nAGBno#*W6eyQvT7W)yi(M2d&VQf zJDo;PeRpDh-WU2Kua@nKtS-o)h$V%hY^G!kq^Y&0-)P-NyeU3@sb=NC%TMgT*4EssHZLOALY^5=7@EwuFVr}Zw?ic zx8a$EbLAd%y|elztJtuRJ7s6-Ot*lcu_F*Fb|u=|d{<}ZbWND~XIb||yKBb`tJ@*5 z0qcq$Y{`vDMOz=$zk_ONmSw*6rZv<0RLP62+cmtW3;PJ%=K3bQDH1}HQn!IB{~mQJ z+VA_z|5Rs9P~@yAYf^=5LuOV;d&$r2`Wv!e5A}<5XB>Ct2z@bSgGHfQ#~55}g#(a$ z8WB<6q*#nzRd2wVDJB)x0^6-|^ZQX%LQL`OpSEgz^jaR6*<+;l>&#Szb1Hl}L)N&w(Z`lle(xt=G-}CB)15qop8j?sUIHJU z5?6;5$Pp)@*jVf=WIn*7%#;|S=cjD7skxr!cT!=L6umaN#A0iE$ayN$E_{(UY2(Yr z2~8*UsK`4)qCBP>tIGM12*n2&xs@158qwSXH#ImQo`ty^w7vAExz8PFNNkSRDQKH z*y5F+l3QuJYchA(*=QTNA%8a}!&x3>J|MPPbO^t(w60(0s&e3zE0FYIRRR@S@XCE^ zuE#|jvOh*N`@x#WD*akd)X3ZrFq;Lw*$)5dT{V7O4dm8P|Fn5KH!GMh>Zby` z_w}>pommyup1suXUJaLLI;y)W64&owc=gKU1{42GX-j;h(o}a4hL7kKXNtwzi#M?c z;*fgSE?1Co{b}Lrsm^aFAz2BM%!wOeVP3`ohk@sUq~g#*_NkghNrQ1_{5n=vmS2wG zFjO5t_&kr#|4W$}+;EcbFjo1(DTSyB!8Jm1=w*m7Z?DlG{o&k1R<1-2+lb61DS?Y} z*KU+8qx}ipVg4uAcVfZ(WEnfaK7$LGtf=kk#)u;7(tOJzC(|f&FQZiVQ~#d7H9q&o znBJ`H@$4wPa-85==8@w(LA)kcwcfa^UQRK3JOcMdZ^IS3=S!pu0eB{b|=6X~sOY(}QwDF3_Ecf`2LJ5`L zXi0V+LQ{iKFr{sl+XxJ7rjOtTrG5v)l2?UIfg}et`MXorh{QosU3n2T@ltIS20y3A z(uy-}Af#Qz>ssoKId2g6Fl+ukeeHx9ylzKt2%Co^d`iR{h>yh1N}ao zw;M|=n&tZxSIp_^s80IqxFKx1G|LmeN}DqANm9*O#g1vPaK)2RQG`BH!%2kL(J^@F zd|^@Tqm+*r^a7s}IBTAknvpM*An)Zqg_w#+4>sxAgz_SQTnyRhmjhCP?_a~Bq}V| z98+q%ObYQ@J^c=;1(tQ9ui(p#wVHGkizq619*6csAwIn+a+GEUL$%SQC8%w<+9JdF zmXqrElq_Gs_*H!x%McY2S8CCHS~Itno$~*ZJEZg9uE=7VXl@;Up{#@su zFk^@H2`_cQNEt>^Pioh%+$#~Na^Ee3CPD>xhuTh_)|$*CULBzwV(*FU_}-5Vvcl99 zJEA}+JaX$BJ>#v0(fj8N@hp=eFenvTj;Y9!H4O604g2S?@sGiYUH9~HS3EK6abKyj zwfn@M&7a04_baULn;vA(rDAXa-trN+E@Ydb3H`~-90!{b_Is1Pn^?u$x6AwbG|nwn zw_N?lXaiqUiI<*3doJwfV&haD#5dYic%iM0yLroI&Nti@Yp`6oMq6#G>g!E51I3{E z95BS0mJP30X@vK$*Av{x=cGRuIBcP8S8W>9HxmXL%_C^r^VKeAn7WN}%G(E>7;7=k z4m2+Fq}Hh;DK~(PJ-!5qiLe(qvBDU-zSl-Z5Zt@#sP+u#othf%I@6AFt#dK>I-ptP zoQ@=??t-s1vMatbS&_at8jsW!piRO=51nnJ5v+#}ym{M<0rY&l#oU}uuO?@X+| zjxsl7oXBqq1X?RtY08ux?wwfrNP8BH7&ew59B80=yF{~jViy^HS}gZx;iMwSnZ`>P9Lolp^?A*PhIjMlqv^;fHp!d)uBSi>h#c6Qh4PmWj!X2H9mk5==Hc zPEz-B2*+UjuR;*fLYGVAc!z(f@q*= zzyP;0>B@{M51cbQCcehfnqZYt6r4!Gh&Xye-J4?SBa5Cshx~4NP4hXJypsS`M>e}S z9d=ne#fMC1`5g#K)W}XJlie;qFc{YlZ8Cv=b1)#Kjnq7q{*_yhS|H)vstXOLR-4*m zZ*MP%Box+Y4U7=Q3T7TKW{jG#CmDWrmd4tp3aX1WB1x#{XEF(v9}M3H)~0FAkAyC% z;7>GbnE@kG)GS`CC+yhK1P+ON=0H$?tf^ml_Ej*LNXaAUBBVL8g{2FOT zwfv7Qvp<3A(+K+wOhwlVTO{gEI0@@o^zrC{{-%26pew4c@He^10>9}>GwB9*HoebB zoP-W&Ur@8x^Xq~fhX1Yh@nNv>UrO{FFFjH2vUPmDQzSCqvfVeo4hlhhm^e>5n3vPj zD^ISnz?H=Tcl9gHPYZHo^##QODDE)zvbO)L-TL<%9Q9vo(*ME(ng7o`kd=}3zt#SX z_za9J?DYSA{7)drz{LE!pz)v8_i8s2`RuJk+Ux7-VVc&C4lR2#U@W&kxcIH0Zf-BT zvi2?beLSrnM<3H!97-qCUrcVkohmn$KJB@>I{(T>l@~EYrf{SK6k(rhqN}8-y#Yw# zv&%E1GJ>)bfop*Z31_iEUgMnzH*a~JUkG} z0QO;Hb*J&AsMG+eOEOS#fCozbB)%B||9XBYJ?xzUH8g?C`+c?o+u&ed`9Ig-5qyut zp7Z1PE|KoiTuI30jFwE%PelzRHJ3*p=h+}7&-3CvFmAZ3Q+ zwGxNh$_c>#Y}#yl><9Q7uf_feGdj1nH_(4A^nxHg)Hk#=G>LI|3i&!(K}hffmsO)m zTH|-*3g}Y?2#boBdJJo7>zDG_a!oWDw!8#ld;??;>e>FCGJy<158lSUp5g9u_ziJ< z3jK~1nh73z!v$MD;} z_HRa&hN!Z}S+HZ{wMD%w|?@mN9_IwXy{iE@KZbc@gsKKe-Y{Ho4K`s^Ra11t~l`Okdw@|z9~i7UQ(?;pjf2Y%{`2MNr|doVq{j>w;t?c+;8W9? z{s697c1ql-dT0s*Gi~@p_kQ@CcCTm zR!ZRx)^%Tf@tG`G&Jn_!;_TCLVXab&6Vs)S2`jaLEZ1D*J#Vhss{j0v;ag`5OHGBT z`X`VO_uBL|w41LS8vkAnp1+94N%+25sv=(0R=_eusDhTgw_vutyPp^n{k@ZU-3Ma3 zTUtB;7iv!A4#*1K*%e4hVv)2Up2c&=H0=`OdTtY{wn7L zz3#kLAI&I@X~CjLVf;Sb+7Yh)R>&yvZtfLu-3O-aaCk>AErd}m-|9lNCgr7wR5f+& zjIFb!rbJ)d1P0$o3A{=h#qA0|h%iAymloM6mhJaKHrI-_P|qX=4j#ddR>T@TcBWQl z0r23mM}r8Fy`lcK*e=oC{C3H*zNLY8>6=Mj++0XrBuexs(X~GF^jt9$fi;;W6ji+L zs~A?R7&6EInJ>i5Z`^A52H^d$#$@`6}Z3YX24`zs0Po3EFDl3fAvp z7HXBnh+r`zExA9)6h2uI;T~kX3M01%vvQzlQ@UdYZQQ8|W*PK)P<3)$G)V&ST9{7B zJAsLDF~ey=y4BCU^#oSUcy~C^K5Wv4-J*rx_p;^|2lbWF!sor+3e4ob5YrZ6cmEr2 zT&vqn6@^CMsM1d*$40K1VQ-IaDu83~Y&^v^b(Jp1{wGD(ZPBV?)2_{DWTZ^iif2>k z>V8aLc~6i9MXJRR%3#C)pnto&G=4RZJ#70R95bVP4aX2s$n>i&qcM4TwUr?!m)5)R z?h)jtxG&U__6d0#CE2JS?1{Qm&03iV|ALjqq18v?1>NlP<$0)#mG%h7{ixhl;yEYL8ek`8%yK?A7sqOT|M%Lk~^&#C5qmdRb0>$ zrtEN$xnjwgPtvbei1bEIO`U>X&GoFt)I7-Rh0XgV>}#}u8`eG-K#}9IrKU#GrtUpJ zrnH3Hcb{`M+J{S+xX#@-1sz>9bPfq(ov#FDqNx$-ElVOxl(GH)DxrH5PLERbvxCIk zc58R_cYLrO)=?K98e|W4r^cD{R9(hVimV19|1N;(JZ~Z#lW1FLsWlaXDh7%9%U<~@ zjgILFl%s_q&-y%sG#o#(QHuJlzT+r8ZmDb92Nmp-#&r}9bwS8ln!1vU1lA`1X{Y&j zyg>#*_gh%p$!6XZt2LBGqI?Z(zZX*OjxuI9*cp>7{{f&Jirez*s6BZ_P_E}0Wx`s9 zFz!({u*0^~Op_c?IH=IEva6b;dY{o1&VDegjbt0#lfpr()km6+YFCxxrhVQti=)@2 zic6y^2|#g|1&s<;S+-J07A zy}}6nxb)CUK7(tM0%>TKuIRi? zP?J%0C~o@1hfq{iCVEVM*-W9>rLf-_F5xA{D_9u=`Cv4Tz<+Ve5sF3mlpm3 zagcIZTNiHSG`$BS%5Hv3ys6-9V2BF*kclWwPV&D5r<83*-}iQggd1f&e0xK(%s72S z3xC-F@8f9tM<*=8Wtn=|uZW_~P&2_)y>l*C!ID4SLOe2@eCU<-PEI6WI38UO*E6WW z8FPoy;@~6_f8}iu^}0nR?Ayo135joxNX~hP5g>qRsD)ADo1l5huCwIK0-r!^1G%Ob zv*14v)b1mrli-YJICD9I@__sC&7)gvuvCBw9w&Rqd)<7z&iAD|KbVqdnq(TF<=v|y zru{>mp^lv1f_guJIir}~_W?!P(5guY=p91aeSJK0NMSa(+_1Q$q+K;e@*K&j@gqj) z3g-nm8ADcP);JMmn`yNHjH+BGR~jEph%j)GDayy1XgEX!J7Ar54Nx4(Nm6P82iTPK zo+ZJU)Of}OlzVv61K(`0EX&E{ti2{5BH}uk6gTPaUq2$(N9Ia=qH8wq0k`Pqn+9>N zgPEm0pCJL#pz!aVS7tF3i6Yr%C*XfJ)DQ478jsf8?8}G9-)Pv7R&5 z6(pge@cb;B8(FkY)>mw`?EqeQd5Q(&{qrArn9B;goVO`^SR(9Dckr7-*KWpdUMyH+ z#3v>UCNM=-xJ|@apY5I{O{SAq?+E1>TF-^$e+zubxx{xbYx1aTCMR|CPu<0`hyQFu zI)Z318XY}blkftY!rPTQP;K;NQ{`j_o)n^Z2||0`JGZBx%0hp0W`evBXI$+@db}cC zs24CB91T<8Xs0h6k2{HOe(H@>DO9pS<59dV(s;Y z8J?@4J6|^2Fl`Mo$LuBbWzJ=nyZ37mvCKobft;bBk%ZAb%2x7kZDP<)^(WGVHwkhW1SVa(+ zUjy`6n0bQbR%w97XG(j#Hu&F*LEo(xW(DpV-dKCR* z!=R#mN0bD#<{PhS1r>uS-q$LX(TVX25GZdQDS?AB4vOP)r}K>;GfATnlXlX-X00?O z$!)afYN_1NMJZjR-CBP57q1x8VXNf$-5E*tLL-ECXgxGm+iPs$WbYZIXVO_D!SY`Y z6e9#~1EtkDvTEex!bU{MZbJu7lqCzb6hw{Gydt?l{WE6;>0u%;j#|qXg-QvtO_b!C z2{|K2)j9WjZ=r20yqxk>L{(|^i~(netp{B$-u%9;=#O=w?RM{=Ib!cdz26j zc>r917o3r?W1|~Hf0G%!Kknw-V5t;)|5=6MKhAc`LB-wk=&%qY&U9&jQ1i05gQ9Q&?Xh^w;fJ)!5F#PpyaX zJ2{ydPs7!sosl3QmeZKX0@PqtKpd5f9bv5y3^C6SiAf!^|CS1ma!uz*Lo z+HQ;A@Fd43hYL>E(Sf~jT6MAahIf8SEL?4dy>BOgy5CF+BT(C8!dCTY2n);Kzoud% z{FE~L8lPY1IETh=_18_u`vGU5cCQbkvQ=v^0?Vz9H=x}>R+w%NpdEUPZe#Wp2Tp%43rJ6vPmp&C6XSk{FY&u5lSbgbke&L%!rfvQ&bVysSLx%x{aRwar6EuwdF&%9-WJ|1$Ic5-{F3M z^gUvMsf4ES4=05{w+(Ksl+=&WwlmI+#hu$wj9=?^(vOFVsJV$;NRwSCrn$I~@-m6J z#N{K?o`_ONn{a2Z1g2nf#dM{KJQ)E%7#uv!!Y1x;Ff6qx7%q<;1DT zHw{1AcgoU4osB){eE^$9Np$ZY5&1*rNqZG_vU}YT02!LWGpidhAt*eX<;#&uUPRR= z@0D35WgnDXw70y_7@XVT@;Mb@rdg&hx{VHVNXo`+jk!_^3GpFH@}AoM=B_Wd7g_gx z$3Qg@X+|Jorygz`#O=Q%!TP(vzKIgrpq2+&rPmy5*)T$H`FB2ZkmP-&Q8T?8-)U~i zD6Ma8-mpC_hK^(DfC$P4J>68D>h^3jdK4Aj3@q%@1hAz3@>vF=;hiH9r_HK1mEI|f z=@X1YMN%TFtE!aPEMIjhnip((;>z+PxR%o|Sz-=x1*N^Xw5Kqyy?W9=TqA#2C?QS9 z!a219%v2!f@vp`&X4Y=kcQcgX7i*Fn>|0Iy>#~9Bv*J!GFu_V)#5=s?%eSz6xvqy{ zvxttq(($I_fY_}HNOpkj#d0ZO&DdoQ!&)hD#$i)9*7`H(k%@v!J=a#NizD^L5h-i=e%n^-Ih-9Z6|ZF+%i-ifoSWLj{$mZoI|C@aLg8OW=+_u!sQKq4bO1_b zn}V7-Ze)E34@f^}R{i*;n;y?*in*YIj`xpJWY6$H-yI-PmKUPR*N@mC<8r!hR!-^k zD(`Mb1?5u6D7i7I3!u#6Lk^0o1g2@Sp?-+n3V!%^wl8>zT!_zZVzti1>m1B*S+MvJ z%(9gsHnRdbk-8qj@TL)M@9J_E2A|hw-iQt2=ZcYlcnGc_ZN=haKekg@vMFaqMD?o; z#^vC?ci83LlHVp7D4+$88>sc-= zxH;Y$k{u-~>H0WeZJSDh`G~IVc(3(Ts`SK`yH;g|QeKP1pijE<6L~Sd7R<6bQwbYV z(xoplk@`mQW%kb{`&jk6N}4JAN=(Y`uk=<10|BW^!!dWf|8;mk9`E2_vT30yv!Xbq z@Mra=IMoj@?S05_wfkqRUE$#(f8Xd%+oGdT2qhRNo)!Nmt8AWSFPdXk)69Chdtr|I zgQ3GLU1HHy7_AZCH_rWZXbTsCnJMChBhLr2PcEG=c-Tv1<%}G)ROi2)LXR(Uyr49R z7@vb7@fo+NWv!X=cUq^t)xGE<#R-qRW{82y%qw&=I*$U;+mXw>!BXlLj^~8`p;+(v z`PLf_BDXP>YluS*zCee=A4czywJ`nsCFgvph|0{l{?92mlRP#ZVzjY6Zy2uZ6WrvO zv-p&_Evs~oxhyidFa5utCzXOyEA(j}B#fn1#E|^OZ^^8?=M1S}8hQ9+R^W^c`?q(i zfj^a)xH7kJ8M&+dL2MA#eOSIt-z{@-u)p%dcHnzEr3j$(c>yF>W* z_|uK|Z$=!IS#d7W60I3fQu0lBj}q@I>RikpSD+cs$ji%tFj`ayV9NL6`a5`6YWfws zEd=cU%t;d~lcqXo$oq(g%j0O>S)p$zcvQBK6PHJ84VRYJ+tG3;U4=xaEP}_ylW&i?3%Z(UB zE$XiWs&(A z9i?F#i+5>f+4y-F;-qvR9(<2h^JMsBPr#h}=L7Naun;Y1r?eJ5Y;asoXZjKIgCPK- zb+Ne@#txUdK*I>T@YgKB@g@`QN@Fh;$jERB22$$-+Ovt@3z?O}2C(}s40O{^@HX_C zZ?vB}neBn;f~r1i1>}nYO=({u|8eMSGPi5Jx(988CyL<&!&UpW!|}6b!r&}^iLwCxv!5pG0PoV>@oC_vWelkqX|B|?6zXB2%?*zH zp50kd>zRQp%{_wvyC;Uey{8}?xsM>-aDEaRbzjarQ^(J&ZGhkqm|$7 z{tBj=Q)$9CBb(ziw^e(I;603k?=@RTIv+8c)k?#{qP&r!7((SI@0f<_57H2^e~1Ik6_KVxJPSvm~zy z=R~KTmdfe6J1(w#6t+qkX`G#)f)AWyYebn1UcJp;E1=lwPRa9GipdcF0o z_LM^kj~;DhDBs5uCp!>tXa~K3*(U5gKs8`4@xzXf;r(BPHdC>&Q9*mPU-hXJEH%Ve zX-1L*Xc3B~@)SyJh@tQVH{^dOqYDUeb7Y< zK6%j^R81$Z4?oqvt-;5^fizf4V|t8A2N+xj=4yvGK!0GmfIZ=d0Pax8v+Vi6!BdQe zr&5m(XGLXU*7hzG(AZ5Wl?pPC3(`QpLM@h*X#-m>jCIK6aLqKaJT&5U@HDb*k|*A6 z$OpZ49`jZxiNzMAa<)41BXS8U`Acp4J8;v$jgnQ( z^J*vEd`};cL_Rk9n%qiTfg=403ywFvW24zPwW_B%Vk+rs>K^6jY>_SgMik~1X!Vy> z^c%G+O->$7NK2e2M{WDc9r$A7^<1~yOO>!N{E34`d+beXKXukYmfD}zsT+4ZcdHui zN9JkOK)t!4#QW9_J^1UyoT;6on?zNhh@Z<#b=-4hDpqS&b3(hm_%8-;y*&o=hZC*( zRi-3fZ!@E_A?e!o{6u=38eP^eNv})rJ*{r~1-~i@)u7)QggGfpER_@YeUr&_6PF*h z(|`l9Ap?8k+!yHKV@}Ad%p)o2(<4mkPa4bskl|n4aP}p=+{H(j*@f!ym05XhhuNC-rMui%R9Q}b zGM+D#Wr-=!JFcuhSVz-cNO=*Q7cDn3DC!IMqo5EHGmeW*NoL8u9lL2!cqvJnHog_G zwHna*aJgE63wtn8f~8G<1*z*v^*$^f-QW6@($E?*GdFT;-rVR5?(Ab{UcO(du9f`< zvqs1f&K-STi$j)#vG&@ohLS!u1M@;+CIiphQ7HBq8+zO@*8moAw1ZG-RyNG zo{1PwtHdD1qay_EKBB|iKfdi@1S^IA9IRwzA;+NNC!xBiDCl0pg2GA5sX@WvoI4%h zsooO^4H?-nv0^m~BzEAO>O1XWu4dp?9M#`^A<(rI@dSmaVPB1xdMrV?0cbDsC*YPN zp@lY@oE~4`=d>jf?BK(2eY*^Bz3EV@H;EjpNu>Go+@G(RRW<`HCuwk|oROKYnbVV%i~(6q7iDp*mxJ7g}r3Dq%e zwr%WSFbl~`tsCg;QP7A7dzR@4($LcTrza2uPJqC z+UR!=9Nl(0XeOi`tv^J8tA9-=Wy1=G_!Dq7KqY#i*N;q*Ff+{=d1r(5!XPX^F9S?C z?sX=q?tI$VnR#FnKqaW(Sha|}8dZBf{IL44P6;Z7YRKap{_;R9Fr(By=bY``xJ;4N zz)QV?ak&!h#)oBr^osTZ;^?abW$ zCm<0Y{V^n_ix{8UXEo<3=b&o4x||>Zv6XKhM4hVmZ+C=-;lPuiA`CPGkiU3^+4qM2 zb5JQ9PMty>*Y`?dR=fN+#kV*RxP2q^)LK@*&(e)rHtQpF?TY&Mp2#1x&_X44b@s3= zGBa|eFjSN~^t&-KDC`5401yJHiJ@1j|0&jqI^;~=)M)sZp}Up!F13fVT=$2X=b}zm zQEIC4haM*dtohwC%z_*khlDy$CDIL@Dv;p!Ny`kV!P77eJCdo+d{xm6V<;+vr1MRa zJtb|MR|jxX(a4klE`6x_EpM+|`)2lEZeXmLtnE%s>_caw!T(9WAA|>?Jd6*l5e}J< z4(J{8UM&49ywKWE5Kl!#uzJq^T^fJflz^ULO$@RVWYq`I;QHG!FMUxgE-(%J4SGlh zR)jp*6(uDs%R~hd{g7z|6rDzsrqQrYRS@FlES-ZCDccvX{@l9fAOQx8&i zagzMsGNM=s|Hc&*-w2`Hl2Imw+7_15x!=H<=6LN(aR}vqR|oMNh>^sZRW$ut4_Gz- zVTvU=^D+^!xwr=f@)}GdP8rPy2&E!7uP)TcM2UDE4OBANneSjow6%17IlxRU5ryLH zn#Nw;E0F)WRe0fq3A=^KG$h9O_T{>FWK|R0QfdyfW9$1dgyQ{CoeRz`N}Y?%bal&q zU=@JyancdCedjWYBD5L*iLUdxM?C5-sVZr&;x8a7UheB*v_1A;Xc|p@-tM1d5D)^m z0-m)q{{_K91iYHiTMwIaurZsz|3X)`N?L=dZ+Ml4fS}@0f z{oVvG!Euz@AD{?p1l{kZ$aIC6h|RjMc2yv<(fwC2;dCV0sgrK>Rc zgZb6Z@CovdF5#6v*&4OXa|)jS_ZWwhuVd&`#oU+kP9#^Cjo2JKEiXkIkxeC>_56rD zW$*g0!ak;c$?vMaS@Q#MnnncT!QsMOeL{khCDp1$Oly)wsT?c7E4(Y$wzCdoxZJqs z(BtmNu}~n@e{$Jal|E)i=QPWQjDKZrz+OVzy@{T}ZDbK^3!YE0(#w*;Y}!U~4pw;zMUfBDPU8wl^v#HGeBD!AZzN`(Wd z^i8fEX<|?LVa(LewLLQLA=7(k9PK~QjZC!nSEi6FTdl`~q{&gs1 z57VtsG%VNmgMEbpmnDk%PWtGXhdfSx2;;_bn1u0=uTX1Wim1+EFMJ+RY*0jI*c!i* zNZtqiFNIno{qZB>;eK%}`8w9%68YBaUgW}}XjdD+3(UxieKhpI{wt*kWT_e5vM)FR zNt+3|>vANrRsK6PW~o_UQQd&cnAMmedH;|cw)~jXXW=6dG$zH3jeQ($eIg5kdk3UA z`xmoQWl$#51OEVNG>QqhK9QT2ftE*-g<2kgh%|=Oq>O;T51EVFP&Yg5S^RSxrnc2_?DZ0PjW%BLd%?s_%<{~P z32AlGZ#2_L*`&#-BK-bm@t4)V^(-YGAGNI?OPGeYY`GfGKxsJxjM%puLp-s z&iCv&^)f(-mibFO^z*+H{=dS!Tx7JOkbw-gRpIDI&192!5F&hyT)8Spn^Ob(P8g+# zlgs{``e$i|m-bcr!i?$U1)eZLZR2i#^A0LePMgXp3-n0|cblThw?;Y@b>_*7 zW%hmLZZugoSdmveLOH59x;?WPuP;Cuhp$+Lu4`YeoR82ydEz;94{h6o3n^J1)=JEB z%a}Mz;(%#Il}Gp<;w5+&(mGYEj=}I-C0Y%!IOisfa}F#YpdH0C4RTGs#T!B*Zk7s( z?Ez$d&Jqz@q=BLB(L%f%(jnyuj#9@FSGea9EHrux#n=Q3QrqJQIoFaJ+%(*(wz%>< zGm1}ctxNPF!&}b%G<#jbc1!g4j^oJz=Z5A{i%gPW>V+n8sB}d5W{3A^*FUCBPCmm4 z_fI}|gdtUfKFR(a2{!Lp_N8vVz8W{y67#>LHizP6-`0UnUlj>zHi30|% zCoxWUD5WZwdJN^<|Mc+X*bz|1#~(>)pAq{)YCX#DC#RR~qsyDZEJFXP_N+L+l4MTR z5$F?fxs#SCZf0F)7UXd27K5NCMq;>Jv-^*$Md}yI?7`!G2On|?40|Kj_-miR zyfo_JgVv{Vf^K_vbJHu_fP}n513sthxXp(p_Lp z9+sK6C*?FI>}3Ml@$ zP_%lEp5X^S(^L^ptrW;o;@1Vl=;e{%lFV6FMNWh`zNmg_{A4`N>M(bmk2OB2KJztE z3(JU`b$D2H=XXrjcY>sZVQMm+67aj0FE{2@*raxXn!Fv{E-htyY--ixSjec$$QT~- zvnubRFud_aNDbSajU!d{8ERnnT1umJcXq5pU(R>tjw;)8Ifgl@S^~Gl6JKWpBU$qF zcJJO`W5JPsJ%)HYPI?p=S>Iq#@%MJf&?$So!U*|^bR4tA<__sOmV;}<%`ys;?t;vU zVqImDALP0!QamZ3y|(P$Jc*!utYbS#&5nGh#9DAbA$u`eS-EOW7;l4meiNoA%Ksh0 zjMc+_E1V1RF?6@AcWf|qa*w#d&T;5elz@$;3zD4eVTssW$zq~dvMtU|OgfaIi%Adw zGp3-JugDU|#*1-zhTLYX{P#DjF>&=(>+zlygnQAtTA(FZmGQuXF(^U@naw77Jz^=` zy{k}@sO0DPJ@Jkl`#iUSJvN*H=l(vHl|u$m$4^KhwaGX$4G&m}Id}MG8jNuJ`R4oL zXqjxR(xB5qw27RR|>1i)s;ZD zwG^&o6_ji497PMZb*_(?=?7jw`f6=91R1y-`8rZMg>3c`_HMB``oHA2EzRoOR(2#SaJvq2EUGBnxR+@4-yc1He6^A8jWzAi3+uhhmMxMw=(l zlTX843?i)J0<7J%6ua4el^kV-FX&;Y!wUFgwQ8KZ_Js*G5!)0x+~_VOXe9w(XiH&5 z>oQJM=|aa5aao1MJLF99n8S3kw#0_VUXF^332M;3;5A|aAVH!KOyJw)-879rjA!&Cxvaf zSrF^7&_T=mS_BDyBz$V_jl4i?)7Yg&0f{X7!snuX_Ke7J`?9B`s`l@H^UCRV6Hnj{ zyja3MN%B4qHJe3yW@`R=zQR_zH~xo6jLgdJhaa^OM)P+Ed9FuM0J|cU6gBRZB7N)Z zaM`~YUQ5*w44zHJTkwhY$wYm=3iQ&n%zmGy>m=aRvg=PpUnls34iZu4E~o6qv~pt0 zI44{kZ&))lHuf_MW7+nF26jkty-3u&8=DRl>jAFg&#~0KpD|Oee5nRb3Bj_N)QIR! zQh6VLmOAm~3yj8(d;Fg5K&2?S`Nm@;_tk||seN68H!eGae3Hk4((IKSK4N1Qp(nQ? z8*{ZS(qESb{*taWp6)xRWXc>XZl#m^THgQT0x8A+qV?|9MG&Sp>#~GbsKgVS@+uR$>s%9!)*2J(UD>!^R@54mr zl5-l#^N3t8({6GB^Nswm>!#*Mdb%b7c3n9T@}Y!Bo@k-?;eKhm5CZ)PJ8OOK!^|`} z6}fJF3cR8ndZAI};n=>!X;fFZ7)TWi71rsbr=RYb(}^iuwn~1;h`vUMij3G!9eke7pF{oZ@H zrCX`AaYv2RPYIc7_stgNH5;0hmVDOGkJp>=sy%`ysU}UW>pkmrrWWN1>K}=MwQ&u3 z8$rKtC+Ll+xD=xb`>zkN;LOMs+{7pEhS$e1I4Z1pX3(TBH8wRvL1XwO&W6Ock>Xxy z(ld}&F=Q^R)o7}H{Zy$#JPp8e(A|!+<8tmZQw=qzPH)?>>s&Lz#OlrQ(u_j6bdrqa zkqXp)&tYDndHH$?ftLnzEvtUo>8v*A{V< z$d1jU7y4Vt7;-8N0FNj8NV3&mbLXQ4hq*h|IJiDmY{62u>byl84Hr~0$iyC|(2h8I zv?ZA>M@X=<$RNK-U*5pdBN+MPwp;a;1&%ydf01Jy^~Kq(;qhFn7K%%Oo@v`#g$Psgnf||d zdSsa_q94{sNVIZChU#as8dLfk=F5#aOy-sXf|7W06SNMQLh1Td+>|=}*)$RYwsXE$ z|CZ>Rf6sUd-WO8v*;y&x@NC7B;qvnEo?cw1+|TL2^(NXGLs)kbb*kCBT>tRKh)kLX ziiD&R8!NVO**|r|OgHDoNr{ytK$;_n9vv?Kbz^f*uUg@6-8jd=6Hyykv5+I#Xn%6P zhQu&q0f`-Fnc$6PEXkZxr4VY-G#vJma5X^e7DF$P(QCjIqUw%)o>F&kl+h9R zG&-;aZ!l#4XAw1?RKBB~zHFWe6AFv`g?uIqrTAa)Ccytc-o)~Md8YsHCJt5(_Wu=c z;$&g@e+v(*JCt2YY}?3jn~c1M<%U~pB57K$i;Xs0ZU1MC=-<9R-)tNIZc}W38pPbo z=%TE4pN&f~ds60uP8m0EvkKfkHw;!cqy0jjT-XObsm|2^3V9OG(PgKIUcm z=>UD${TjaGoEw-K!4ZCb?%SAH8e5y1T)$x){Bqr;B_Q?9FF_gDm|21$CMKz;#iM~L zgpX5$4nnZm{W@dcg21tNd(T#5BF-?IQ^Y+|c-Vg4%f@AWj! z@>V2_|?Rc>=!l1(%jJM0*Z-^HTad>;`o(? zEO75P%DnAIF#ZdN`rC&1wJUV{i_`I&QuKR_^xNBW`U_2WVPZ*DW&Z32{NrN`-y+x%7eGG=pVZ2Ogd=!Ngwt^F1LS>3_G>cGb8tEOMabO28;D=y<& zF)%@ph5Eg@Gz7wfZlOz@MYzy&C~SF6JN}QdoI{U zdMn4=IWhb#Ec0I(Nweh2jF`{at8y16{j&~W;Luah6GtW}Meo?bO-N9&>kJgczA|SV z|KcNKA#9Cv7Bb~%9DQe!u!A1E2DAYfs)PLZDx3D_=sm*Qz{UMP%n7~w6)23020JrZ z8ex#;KAN$AUUv1TU}q2JYdT}Pz=)|xvjv(;Z+#f=)Mq@x|A@&7GKA zuAd~o*2FP22NYXm17U1hsDX@ymZVZwtFh#PcZlnCVQd=9FtJYv$pq|6Igz&{ZAiPn z=_QP0NT9yA0g)~V<%)t%NG=|es-P}ews~eu2YObVN-zdrcJGLJGp%7-FQZb|_B{e0 zsyv25iIS9`?MVmEHDVkVr7h`Tg7jJt9y>38Z>I<1vd0k0QI-*vGwLorJDbFU8EB`$ zda=jw)*LklslL>IRE|W8zz>Dk!jdun61vzf+&Wzs|3>GqtEl==|*- zeB0-T|7jizbt&6Eh+OY$rSp-gEOsc@aT!iTVjkt+z`rm0Lm@JE_bD>Dk2$bx10~P5 z4XeHW=(wNzmsy)V@iLq99d8vgwG*x~!o0ng_hXxkEAENsDpN!NWzI1x+SFEA^dYpkHcBhx^Gh4`ZT#2Nkl)JQ@ViY=bY!$R~;2N@!F_1#57OvJKNX8XV+X7D=EVL4y-Mg8qo3+^t0%P*RZbSayl8VBnpm zlqddY#1JO_m#c-^g|J|tCeDcIjrbxRk2$z;RLRY&BvXT0=9Ov!`tdq2nxBm}>G(b+ zdIHv_TE~MO$2RZFe%_wm==40sJ*h95gBM=L0`?Ne-0z}zQ9w{kc-qm@tiE1-Aj8Z` zqg<2rP`O*}c@1cB>9ZwN82r7u9-)05lL+?X7G4#a8LN_f;)UX0oebq|6QEZBpSN@4 zA=b9G$4QI%3nO8!#24`PcZleY!K_eml`j+O&nIFZ9Kj*F-FTu*J1|d-dFDY6kE7&Z zT#C?*QzwS_9VB-@sB*QhMFhutj@&(alm}REOiFytZlr7NA)H{S4cz*3>5Q1%0%~x? zkJJJEJUm)xa_Zh&aN z8qffu4l&r>1QWA`YXwt#DRyx*%CabPrs_1OY}gw7dx8eedKjV~<9 zabb4XrWB*cJ=V<9;KI3^6(P7w*QSmCfOoDq|0U<9AqT#9YrDOzg@v_o*?aL}YX#lw zI5g{aK=fjmUBT+y03*int7$7%M9|&8p0zmW14u4y_xtJy^fc&0w(L4)T6zJDpAgyg zfx>DQF;R%Mn23b%{st8}OC;9e~oOd!r#WCQCJ^$%299FgDL9ew9Ru zYF4%bmz@zCLEKkGMn@l#&St1Vp&|`1`y@JJi+g`8dCGMoAEfY4oJ$aZ%_#K zg{i->?j(#NV{`lpWq-gut&KHLWKLfVM_u!yT~^tbdUiq40*YsLD1sfp^ms6e3ph8P z3$k=Q4D;%0!V`7F5y=b6my?K!zFvy%3+>=N5r?a3egU@=J+ku-#yMJVuPXB-d4l2n zXS+4Iu#_*vNCdB9Y)0gWCr9xBVkgZ>W=!gOeL;Rj2xo&7MNHQ*N!cUutWwBAP;v zGbpi<&H5o9o_#*fqLv7iG$H@?B5r?VW?k+0upfM*y=U%1AYC>pY&a9S)6$R7GogJF z;%Xc34T$K}>$HO&BWhk08NI?#r1)Qg`04B;wq|~!l7OS8?f}7>{8U0YL9yZqhD$AA zNZE2?K7Gm#u9huqiKx*8u1?!112ueE38820Wcj{np$SPsL{~C=hXZ7D(3C{8x26*q z#tx)w0xWV!9{nuTea^8B(l}4mSH9Mn2)MOW2&m z;M8B+gXtAYq;T$y+D(#e*G3TQAZiY*BOT{0B2khX{;=o=uZKO*>kmu#q3SciWS9;F zSHR>Gx~aohQfjg;`2!KAqkM14htsEY zF$)0;7hIxF0!}*=KWX)5(tKVGF*3*f*Jyh}prJxp(w}9!u!g5#4Z4H*hx=JIJk71V zX2)q`)umHX3z}}Y-xh>(a{)!zUi)&^AKQepZtb_1gmcHbYxaAJM8 zhT&1{g!&>>efpfoX;nBD>dKrb)jryzB$h!J+My@u>OJgSkmy7YmRo(lo5|#mH)W^| zsl1aBT^bwV9EMa$m6s-!`nJ$H^6)bcG9duX`Z&Z`cz%KlFG%XWoD2Nhv!*R`B^6qr zT-TaZu=Z;Oqdthtp~iskJg7mKFn)@%&IX^pYcQ+{V>vcnu&6fkuU1phf}`(>F^s~b ze)f->RONRxLzif$^L>DZa^sXPf~Jmq0uLav&$!&XGkx?c;5ZZ~y@|8x=-&(9@lTHEr9G~wn=s4nLdlEF_UpWpPef+Vno-@RrtaQirFo=BPZ=jKA_iIm;$0is z5=l-m-0jnIRRU@AuPC9{5|RhxYd9UcKRRXh>AcWm=P5%mom-iZPu-mXZ^ZO>B~y8- zLc2EA2^-_!7hb3F3Bygpk|yN`UhbZ&xwiY3aTQhV!hHrSnxlIEH$8rqO$Ir zX!0E;0f86uCz)7c#OOGo>!`=dRZo=tJ6z^fd%!@hviFTHsX4SFKc*OoJ~re^aSEA4 zc>7HJcgBS>@KxsK<_5$f2uY33(UP82{r;2(WxuuMc$SZxZmA40Kjtm`rQ29jO)qK9 z3<+24nX-5@wz+usu=!Q4Z3Y?9Hjjp0{S5%h{h`Yd*wNZznb39UCmqvKIT|hbFJT4G zzT91$|17`a!sPC<#<<-3qb_+>nh`UmXg|evyzq7^P(}{WPv9bAe97UI6KsKh(wI9v zU5sH8_;-KgW+~vU`GX4Ot-|OSQNP*Hq9ftB6=) zPGk|e%*ASG3CSb+=fXRaK1HwN2mhSZ!q<{_E42;GP|V0}4?-dD%DRAKm>eHfr#Wj& zD;9#N-8n*;tO_x>I`6JY)qEX5S{Y=CG8rlK7BDDE*(h32)JBg}^^7buj{LziupvaH z3638_@lp}8d=Lk5sUK`XoG{T4)Ea*1UJ9wJp0v)$sJB&KmRWoHYreX`gE+dfiG|b)v4w} z<%&W#ur^;gG)W}y6$03zCb_clIMyX##vYG#qZxLt@(SR&e4P8eC4;6bbd%gklQZNp zYyptf&CUGfH$i-2W=A2e`pu`jA~6q=*)=Y$`m``kKyvMb@eGCK|Jcuf1g!km?yvo zl%QGxRw#&Kt4Wlm5l)P*rC^kI1erZKG6*=$iMmzj9@COxET4ZmuKI_k70H&-lEst^ zD6Vw)^IX1HHXy5+E)}9LfTF>KEHvFq4%bB{8x(2l8mnW&U&3t0osJS?F!#0)3PymMhYxuhF zq&oO}`aK07+l&<}X^ByjBS6~{8xb@fO4$2~7ujgqH9DnPJk|og+saVsXRavJm5B*1 zkS`LC6$F_I(NMh9OfHI#HSxhz z;_{)8C7U`}C8w%S{V%lL_QBTmb*?@c?Gtp%J_~H}ra0WoD6UmgIeAK&@}zIZ=1Q#{ zPFgkYn!Cgnot+t=P%E?sz1JlVPZ~5S{e`bfgew2)2%okpugjxe8|G0gLFvZ*J8Pp z+E6fMb(g48)vpPo3SA*e(5XyP8h{j6WBNC=OYAYB(nhl!IbK8*w&5pM1-2YX23Ct* z?5pqf>wPQ?9N3xt0>~G-$is?c#K?ug*MBzaAS+xNk{mAtpY% z_u(`w`gTFjtUT7c?qT-cdP7~V>>Ha=njH&Bu~Z$co}Fo~E}#bz6p;gJOaoQ&xsLn*3~yvvU~q5Zj!s9-Pj8{(3VLTh$h)6 zGT>^-$SQx;EwtKKrge1cE6O;?U+@#W>>b@8dEI2qWy33^oA}ghUS!Y_FJpU3S&L23 z2P!zQrIH~`gwucJyJl244#WjeGoW2Y+h7+Lc^N<k%D{Pz%C(#f0Nslh`seG2=>- zQ(@CE!K@gZV|&ciE#S>SG|m$38_)Wje`P}Tt%7X@B*%W}EuVNuouCD<_<3|vTMmea z*_b`}otGaFq=PZxBDXt`FOkVx_t=W^q35{JZfl!jAtyC3G9M=q&p?`Vre4JAUq zG|iO_j}nKHjzOPR&?MRz+6MIk)D7gi1(rhW03$&xRd+shCa9Ny9mlzxOIb_R_*Y%+ zF#9`I>Mk^oTSj=NM)#O}lF?S?A+yj(-r01}Z+5;;6Lvw<5$?=1-+13G^{lz<>#R)L zR!{0(LZlh;ekWB}?jHbsKzJ}sQMK)9X~S_@=-xUpdn|ni6C(V5FB*Bl0M#pl%L6^i zlZB69ukwAE$m69Zo2Kf$u&Bozi(MBKe}l;6W?@VI*!ctNn`8eHKRf!JTLwoa;~cSO z!0)|0iZu3U^Un2tGyRFkpQl`8a41CpgMJmJScP(EVs-a^%#iQuYMG`p@Vi7{-WcM0 zujtc_`DU{FW;@SCiQCuw}{0W-PdO%e>Z`&Pwb2Fo);{m>cDDM*XPpV$y$4Buz z*_41@e96wgAV1g^+D^r7bC8Q}_d$?;4**)vQhA%wLn(47o)u#}H$hF|#iJ0kSVU#e@lip+8URhuzm4Y-=&&gbOMp zxI%^U&RugU3m-QIg^C;8LqIA`w>?d)82%3~w+mKJXafNSV*Rx*id+0(R~T07EIFUz zKo8giPMI%>3^58Rqnre0JwZfaxRRuz5VXyF8Ek)vzLiia@v89E*et#T^I#pGkZE>l zGmtt+kJkY>S!IWt#1xV|=rHm)i3Q9aY=3@U*;9a38pJ+vh3wW+Uzz=i_?2sz|B4yu z#nD^o%L^mpj4S0fmU?s3t}aRFf}PquFc+_nGO5Ii$;fMR5B|M6sWi2EzlJAtGB(X; zrUj9jH_=zIU#E>Vu;|qfyo03V^_-iD{MuAw8>{-F)fmkFW_M1G#m*fHZe~XdNTkXL z|8~K;&e&inrn)7AKOT+OGPXb(y9tOPTOUu4rxk;zdz+oAhpfWCEN(v#HmgeBJ#~nk z?yHQfHM*QTuEKm`L!JoVIZUwRd`kss>3{l%#*qC_$J^7E2hnwyAci!q5wBTVe2XPu zTH+HEijNJ8cTQZcyzOY2&CA>{A2l5-VN)I2x`a1}0HOEG*(yyGGfMrjL>FILuOT9f zQmWR6VT%pP5>Ph>vKUx z3A>=9KU@C2+LPXZ?d{0nic&YWfaA^Y=@5qdC+jBADCpzEl$gu!ngo?1wFW|2!1ZgL z!~%Zq2amhgx2wz(0N_U#>*z9%4t6Pg39rnr{Jw-&36p*z6PegU%!u&*3rJ(W}tN!TM#Au`(jHW+y zA)r@hb?yub;!GpoZCoBEv(;SP`Uju#xAuOdoAaw5kj=8MDG2UMVO!U@C{fg{1cLb= zV*kidLyQ21&gWqJM_e2b85UV--Utaxm1OZ#sd<0=?4nvy?FP0&=M`Ki3`_&wyXDAV zbqBi8I)hZyB)`*d@jOIHrbHu8uQp)(26yj6to?r?y$AaiB%IBiC{aYvMgg8rqF2MgME$5K5pFEg?W8PM|{iFd)wt}_m<13feQ?;+UVr*LcCZBNkyi~wZCjP*w#;GLV zhpP9m^um1}4F^7i%rdx25-qI-CRp6xSqh7$>Y?rwd_TBI8p7lA=m=O6n;ZmP)t*lyJ{-L!%3r9l0KyArni2~94?Oi9F;I+?R3tF;#?IPi zUjbKK;LSA^^yuv#&iyn*)ZXT3H&xw*iyCOV5INB+;py2q2q_`#7Qtz?tOPlIr66=+ zKe^zm60kzf_0Yh`dB=;#fZMyNas`{9)>`0$@$R@2$zfckQBO$y@~vuT6G|nLpPLGv zS|Pj)s^)FYQ$7%vDma~s6PGe@_rG@pBUT<;AR`YQ)>)Wc6Tr{D9S6>vlz=9|gFsB> z6^SPz>WhFW-P^!nhys)D@m@p5%tf~_RM>o5ZI)$KsE%eSjJvsgzD>opJ4yXDiMId4 z*gM6D7A=jsZQHhO+qTWswr$(CZQFMDYTLGTS59(n?tjlt&VCxn953^szAG*rz9 zfJv)O3z0xphy)R%wSJ0UD|o7^FfG5Pbw+JhPszo$_Nd^Sb?Jl4v(|mS=icVz{k(`7jc~L$9mr>V=GvpnjKd5!C}XdsKjkMpNSYyo zSx_{Y>I%n-Eligt7zXS7OBUa4>>={vX!s73M7l@5BZO(s8Pgnf{!))-;m&B-caF%Z z+O@tZ+&=n|2mtZ=G=7}vG{|UEZAWYIE)US8p25NzGk*mZbZh3X`XTJYykl=)zOI5t zv1LOrz+&Ca9DidXW|L#q@Ajx*GDc1MSobZQCj)uQthvQ zSripd961YBK7EcMDoR&}7<7Z@>ZYl1cM9*9s{j}}4>7Ckc#A2Xb++~?d`}_|CCyaU z#;gV6KG>3TX1ifc+WT|hT3T4kX?2W2fG$rrPKUE(FK!X>jeGI&->R|D@ikJwL4qH0 z-nF2lQ7)R0-=l!}q>D6N0yc zpT@?=p{D#Y6QwNI=Z77`5zyz6{+TL4cFWUhbDiV;tLcbUhY@Zy$V-3uYZiLVAWXL3 z-3hf!8z+X4E6yF`?m_hp_HMkyrKd#SOdgCMP_{7M!cPb}@_VkwVNQ`V5R>XD6g+>K zO1tfPThFn3B9@?g@oWl9NCZ5gq6eabMqd|Z|wRyCPh|)7{Hiaxf2Tx zR}fn_=`XSp=;DRAG1%MSK|uOk3HvuV6j$0y5FG_rVa zVGmxnmo5{}`(LB>B;#=Hmi?lHt~p+?{S&GXiGPJzWyRs+GsFny&=&vB_CL=$^Mg%r zV9n<>+J2akQBb(R3%$o6T!|AQM$peLs}Rf1_cjoI52*Wvrq};qj(!lmo~y&w6z<%< z-5$4xn^Px#)V7;}XWLWE;k!c#gI$g+tCZRb$7Q;EEyzgDPF-8nIqHtDND)Fm$HgRz zz8f`q^MlFEq+^EQ08bPM{A)$))b`N6<{G0cN}dKPRZn|{`0e5buZ!Db|nosw7UgDwqG=y9Z?Luc_MXE6G ztyrQ!Rd{QpWFccvw4R1VMa-FNA%vZwJ@;qhF=&D0ge}5T80s6W z3VK{}R$21{^sv>KDNft`c6HbxCr>7?I1|iJ=$)8jRxJaXp!9L5&$;8hg4HQoim|BV zMji4;5{8M@OcQ&JYVcBoSgznK*1GJ$ol#Q9zt+S7}E^K9E*$n7Q zXH)%{nNnoc%*B*x|FPE;4GFb1^QeSHI<5f2wl5fM=oVt8Ts#7rLewUPu1*(Zw9@z` zGXpqRFSh#uy6%c~aRM7Gwk8P_rzA3bt(O^OP_VLYjGYBRa0D==r)LbBaZ~EC9=c-&I-GY7OT~#jzBG3PK`44( zC+}Jl^FWg2pIbw~t*C9r~apSu%EBO}|HjeLd|0!k!ZZ3=p=?mLh`e z>O8(Qh^(@vp*aHjQEL=g15TGnjMEBitO$>(HW+rPFKZN~ue>aYiKFe(*Xg{6fu{hGutz+hiZ$@ZRoZy;9q{3CFyc; z>SlS2IlW^8Mb{V(9Z(sjeJ?u7$`cfiH|kM4xg?yF*c%YDo612?31b+z7X${>mJ4;p zuvJ`at|l~~5OEnWSP%-{GYD7A&ps{1KhtpWvcXsYRLzlLXcG{h;+^oM59F&vb0)zk zb=AjI;YR2pCDj-E8xQyi*a@e@hQ&UXlVTSnCW#7rse2BJ?Ny5&W?gMg^pe`dOhy|1@e6e}_i zAmIi13%nC#2HnnjTJ}YN`vxCsb`*Ygd}&VMJT%D3>%=-P>PHBKN8TVQ&$?{~mIkyt zGN!S~U>oM`I+BYNN%)w5kzi)_mxT0R-g!$$04<91Gy-2(hZNgf=j@i4!D9S5K2HV(GRDG*+= zM*;rcA)r0m)=^@`iS~h7O&UE2BVhnObthBy>Qo67and4v#j1cf%RLw$Li0{o{P=sQ z!L$l8ycU=0s_HYJFqp0z^O8)VaLYhnnC7tn{|-cGnOk4a0{rE&v)qv@ju^(h;gc#0 zy`36Wa&sv-l=wjKzZYz)D|~=s)>K{Zh!Qg@s}yLcM%-j?UxiJ-<3JZ*R=KLOEUOF= z(gcbEoNQ8WRHZ4#Ut!Z^?eM2L0f(7PsXJnRGag-=OpWXmgt7>^R8??c*h-oILk2Pd zFUPOYvye??5U(_(Aje6skhdh@1h$TiP^C0Y;ajdm#T0)bYi!VgV6AxZsLTDrG(L(E zxQVe9%@3>r>|pj4pWx00J|UuaQ%9Mr&Clj*izKUMAAC$^7+wIt&0-bm_dTXhS(E+h>IWyiS)zrxYg1 z9p`UbyQE{MZ%b{!0v#~-QFrTuJ*WvlbXMJUUZgw{u@bx*Z5cM4V6HFAZ+06nS$z4l zk2B#9@vQe3XG>IFrHsmbt&H-7&WX@=7uoNkPl6*g zeAV%!@&cFJROfoRZ#MVPIK`ws27B-Knx4cW#xcxF^LJ$5hM77!JrA0J7?nH=pJnp^ zT5c*zD{%d9gDZ=)1NP6G(;jMMe6g5G>d0Mq@pWbLt1=6s_Wr-@;P2!L+H64SyJ^eF za|$OSjek+C^KJZ7Rz;Q!2n+_7pDkU2XfJja~5&6)ofrVoy2p zZO#J^TRMc-NU&N|^j%L+7QGn^wy$i|jvpZ~%S=nML~=--(G^*!76{Rl~ALZdNo!k=J{U z-lhw_urZYV8Ct$ipV;QD&1s2pihV6z+iiv9GIFzajtCXlDeIyy(HYS(Yi|wGPIO4B z8*ZeG7(|GZs0yyAoP?pA*e;sGsUKn4t7))DSeC>nl8;N7g`8#*@Xa&Tz}sB#^otG) z7iOsT#YuMyx8-4jdK@BeD2m2t=Okh~Jx@Fl#`x{|P*$l2m(H7Pru~S-jKz?9IRn^u zuAYe&NlJg3h*Jl9{vhoBXnrQ2mK$@oBvV!yT9&mugIXuHEmPYU!e~zssGuIf7S7{t zcIL(?IsHzG=(s?7E$v_HZqL39z;;ILF|8|JcS&ey6nAoSx?aM+LRo#j7itY!%hkVmM=BIcO$+8YBy|UuL3d>B;>hFf4nXM=(vhb?TNd5%#6E^S&h4o7L zU$(F{`FeW}wL`H1JDf7TZ80`TJ@Y0bxtYNaHU+3LD`PiVvZIeoPeXsnRQuxR0n zFq6jbmGIK5V_$|XAN)uR-dZ~FvxXpMZi<#sHl~R`G&%{_h~!Z!P&(B7 zGw&Bnx5}|P1Y6RJaBkgF{F~GZWQS)Fy2PwD=pT#Yg^+Rk$_cl)TVQIo0C|+41<#0! zC^*oAX@ELbd1LmXbiuYgYeWatH@xOM8m=J*SNNUv_VnOHFGIM}8i8|2&4l!2>0Ogg zW4JgO{~fR}BGIAt8ogmDICd?}>CapDVYp0d;Xbx{yV?ML2&w=z=2(ue{1ZciV1Ae7 z%8Cd6#8Q$ZM2gF-VezIG(Jnn`$vEDP*Q2fGfWB}YR(ook>m?G&J!$xb_9G?Ar^mgb zR21X#L)upxY=VlHmuH`8eXk|MP1z)1L_55&H4(jy-iipqXQ%YvC_(aiDIQP zU>)N~J$SIpD=D7L@f$!qYk6zp2o^w8on>kBkujeoI^sgdfTofyfDI;A`G$W!w zlj};A4*RY!Xb#4%KUCP$$sfjH@;MeR=O_qeixIheMF6qR?fpTXaF@fuuA~w*TCYhD z&oHr-m}7JSPEEG4BB$3(s>ABSp+A9bq_=_H<0^v0nSGo8oWW_H!*--{xu14nw)bK) zV?k^~%j6F+4mjWz&~mt5#rM}oiWoJn^4oJdhwjLSHd-RsY86mw*Z0+K%-o zxU5PJQ=??UoZp{6i zHZaQKx{?mVDNRL4nq&4H8)AV6J@$7Q1Uc=UZBx22b0T1J>}y1|8UXr9X9%R>59`D$ zGL>Vzhi#&rYwBKwrm6}bwJG8SE{?+;^Ac)dfD^~)s+$wFS)rdu86KrlvHi3jy<|At}asq@so zqOm&StHy~=A_zztWrtQ#jXZDMfytc`o}@w?a78W`_+LzuH$*2T8@>z+S31IV-FXB= zs%RE&{QGXF?pLq9Kg(XU>)rKZuAuGKsRmVRL-&TJhvZH1MYf*+)c3KopWseQ=X%%b ztvqF)o~WtIkyXb1KLvQQ!iE89H*-A8SJEm&Ca%(NaETXTYlr#xn4t937^?@$___Ab zn9w1d5y_0%n>V1^d>i`t51Ah#(t4+)&tm`R{*)Vr&RF@w8#d6>#0!*-lKo`??LZTo z!zb^eH&S4aD~cyRX4h|x35yn8ga(@1C!ILqs*I~Xu+bs zcReJUE`Aty3*w?73YeWpL@o2)a=)}aK~+GB%FG8S$D=*mz|IVAI2LQkv)6t#Z$oK; z4?w>vgOOEAF^$eoSaQDkAtxbrcrsn%2ARMg9CW>bn zhS(9(N)^Hm(qh7usY={y7kp$zsYXh^HYWG$8;h&ZEy);R$kc~i*MJfjH=ZgGI)T5G zEz%=q{Y5%#=lD>Q)VXh>2iewZ{DkH@J#aR$V&lJuA2v0y{hN&LF-i|KlLU^dhHi`k z&XaWLgXDtuAk$Wo@ZuwFfEiV>A`)z28bO6}t0BMF{|>c-@X4hJF2w~}t&s58&I%Y| z0=LtC1a-~g9rOoIW{=0%9A07;4r0cI&&dj1u2*U13sPYv;iPtpEvB}?3dLp|+~q15 zL1`twqVH+zp565+4qJV4lTi>?4A{Y^3gksVL1brzvjIrZh3L+GAL!4f6>#FZV-#CyNHboU33-7F%P{zD^Py6U3`|NemPPe#ww|f#M7*u}S8&B>W}_@#nH#0o`K( zd|`DZ){=}UX`W7gYC5V-P9T?;=$Ycb%IJI1B&oE=O|Bk;Mq!$LGGOt-8R4f(_@>mC zHzJi^5J{wC;z*GS!&UWfiYcytm4Y9=gLwiV1%tg$Nj%J9lW^I?1jhi}l4C~u@MV%p zxjijqZ_Gg^Z3Ky#POvg)%cKpUUXBUf3ie+_g=$bX!@fZ26D*%EO{>af?qF9}D)5*R&_~zJ^%&sg%(>`z5(pQ4+&E#Jv(m($*+ZW;{~|wma4XKRzPw$^0EWJkuudFM z0e&MxwyF_gFGi(}jJVWkJfcgw31*G+Z;T>RM?j~DNvgALn7p3e1ANu=pl{Z4&|DT~% z_4f|BuIJX>8I@lBDvUp<>mc!#dys-Qi@~XFEs&OWWkNWBXWKOe0n#c$9VGZjJ$gIF zZ?B1VQ>_HDY82Anb42gNpuXWUMnNb^d425RdR^Djjg*`~kUF`N$4eTtz;R}$c6d}^ zO@Fl)>qov|;B?=JFP+gWVn3n$1+goBaTadLYhZTl_X{8};MUT_6yC9oIN-A*IkmwLu zHw{wF=vcCC9CK;^>8#^HGdh@kOX5l~7S6rak&o?W(L*5dW~8O8>s{+TBm$PV)SdG* ze`pnIUbW(gXuG8_kbvuVuO?s*KG~)6q3L0cIO8E5qQ}bAbN03U*ilKXJwlKH;OZ;grIpzz58h zh&S8q_2Jp&hu1K$J`vN6Tgjz{IFS;BQR-)9>wb#L%>i$;B^dz`BsID{U3E`ONf>f; z!u+y<7d7=-8b^&jCuOkYnjj-ebHzgcE%tpGy^oRI4ISugUKV|qWDj6L{3UT&-aJZcxrOPb zd|ZPBmhmx>Zk|9fRO6w{sA3<&!`tiv-eoIctalTjq(3{zsdb%ZpuK4InhGZpB6Y9C zi@$~{*XPTbWKrKw^$c}~y62{)^ibIFCZ%AgityT%X$_5z$)mV+9CXW-qdlG;aqz^; z_E!10#%|LYJ;WA4a(9;P_zpn8+1p{~gV`)w&}Yn503}MA1foBZ&EKO^Nyc1i(I!ty zovwUJ{%-(6zI1is&<`w_ptU{$$f>(6Hgnc1nXbXV!{-gYtyW2gHlfd$D|aC0h5Z*1%AD|zeZctcWM;cjoAXo&YjDWCUS=-{?Sof zIQyO5_{lFNT0Z}WNrn@8n{O!h z8jeh*|G4>7a!M_IKC;g3>#E%(gYV+Op)9b7+DS`?m<_c9vNH2HPLmA~W3S1H`l(`7 z;@a$@2TBJJQE@XgKoR(zGp(8XL4_iv`oQl_h{o$!9Y5`)+IWM(fzMY9BleH)!5Y)fa1TNUL>j3&wvAoRcEC~&bhe0vz6A{&Fu?|?h(vJ?ddBAeT_kQy2 z2N(+F@vNfB-5ov4tz=w=5^b~T9FI|i2no~D0lyC2h3)-~s+@NTP(Om!w}YvDchtk$g3E%@^+u4{t-UrsMEodL5l?;c-Wf>zP$#x5K%) z(0GOZQevoi&CvkJ`c&(?&>g9kvfbJXQ~_x6`4{TE@Nfg|l^&PTH&^&m&KRr8PYAd7 zfRI1^!Xg-x=3TXs#}Wz24)3eY`I!cl1uGxEa2e#$NAAy_v{pDrf+ogSI&pK|A05dQ z^XgVo$BLS0y>D^n*7KBzZ`Ok|`QdFS732Y(L3DoZKsrPR6i0XEXbq`5M-w!cs=i%2Gpjbo*rqFkyV#?2z<6~gHbNT0O$PdU zU3*=^W@OSjMe{ayXpRZU(A=h(V|IQJIyjkWGr3U@CvhBWQh_)&gn?m&F#dpKUnsh- zF*XH)VcY167#lIIi(1H^Ws`P=va@B4^y{o(jH-iyAbi}-4($}SqosdaWcz%uiViKI zgxXy)XhX0I{_y)@4m%0Lr?yxj`c(;9P3k@gxM#B0;I;8nR+^=cM5Zslcyy{CDLEQ* z8U_$@J&P(0rF#O1T^_muA_pV9dj#It7U1ljtf~p&ctbi%Aacl(>IJR5KKNL>k!d9k zfJ(F?03Bg=c0#13^5 zc-ZF;iiw1!_NGe8gUoL($bm&rI(lc*Le|9Ce-{fD7q2$TS_p2`U8s@?uT%NK(3z%< z2gX8Awg5NiewETuXkpN<@q@uAX$7^)LKM~iIhbniVc)cCi7!j!%ma{9{+5&) zK7fx#Lh}R`EPeY(ZEy3HV=+;YF!-D}=|+F@+H9QW?GQ=jFbd<|AA&dMkD+{-Y=AA4 zpPL3nvNIRBK17#NR^aI{yoDWZP>{EiVN|q=CMM@Ic=q(v{&blb&d)5`WYJT9kOrVu zUII~P7=Y>(IksREbZ+_8$6D=(&pm_YELPr!nF7x66xE2y~Of%8YhrXLH%J z_oc2PcUPzpi%I7^j!88VY|z+j^e6V+ZWbOH;?Ip$SH{*3Z3?)6ph6{~=yT5}_hzLY zGV}gjdPN1^ZWwf-sJ6#o44a~Bw1|B$G}2>Lq;OvnJLmVNYLvEpm~ zh*PE%SU~8}fx_8iNpzz%Cysjh-@DEdIjE*egp<|HcMQ(DmDR_INhxA>#7rP3)q^j) zO*E#8Vw3a<(UVyM?}r2+(GRe! zD9k`1h9$|N(Gu_!8~uULHB8Y13(>xF%_W;xi_}^FqBB$5XyGqPcsACd3oj2~X`2{b z-4B(RDJ-l@Ta_Z~pMCOz*d`6_o;HJli3wG7WaOTE1%mA`{TS z2}jfKlcvnXP{w1_67MAzLe7}yG_4nuxyA`h!>YXMmhIy_`s=y9B}F>C=MF>J1Siv1 z6}d8`ra>$LM9Gy=f}$uM0!LI_i5Dz@s_bxn6s?cX2(g5l!zkxYhDwjS!66XBYgZWxlT&JWT-O67x+Dff}kCD$|~Mhnbiy2-XcHCMaSC_M&!&M{OPe>AyM#{ zdu&|Bxvg~WIg=(m z_HPTjXl7)K4Pfa~@Blg`R)e(8nJevgE<$RPw}U^!*5L0|qhLXR;bw@FzvZ?keE<%O zoDR z6-FzdN+7NrLU!Ef*62QC6vcaXUBMcLCj1HO__H!6e|w+AeEm_xiGtKU;$aDm12eBG z9j$z))Dls>2x@b7OOaA2(hpA0`Jk=lbRlg|)y|$rbO!ulm;WZfqeHpV4T_95pv=9w()@zzg!8r! z1v6i&!7$L3_PT$eyd+(E+mXe`y6t(Sb@cQNgeh;!%oKCtJ&d=&dyqG`$Vq`Otc*fi zp5cb@(U~7G9wdEUM7=cjN6<)eu5^ ztlxLvysQk4f`r$=0-qD7NWj`?PN#2@{=n_=J3Ez4Jk$1wzui`taHz#xoc%=s&-!)u z%98syDE2nq76Xc4qs|qs?8kz`C=J%>bf7#XJkBD)w)t?CvijW2spn!6D(ZfgyyS@w zW$Zs#zu5je>lXnVCmR7DAC!}`qp6_{lzX;~imcrM147TKx;uQz2Ji?zNdOe#I%EQe zwRVbSi@JmiJCdXVMA*;gGd6Oy8ZUxu?(TH=J+#y7r3?3hYFiuf^Z0reuUlGgbJEr8 z4a)ZRv95=OH8+p8_PQkxFMq>oFLj%%!RtENZu9fq-gs6kj~*3wqc0ier(#<`Am7!` z_D@c-tTHs;y8gwXLK`yNgBLFj?)jM0iNFi0N%GU!%W0=oUb_2HHn+jHn&zrOv=d8@ zl;M)%R)KBRPi5G30Uc7Jstc#i?wKar4PSisHxGR4dUF_^7Tx;O3~p}NPZA5C$WmHw zqtCW){b$|c*20S;7cQ*{173|2h z?RWh`;^V(@4kJ{JHqX~Gj(Lsz(Ob(7?>O)!hbh1?2dsc%90K{7;k@wx0+Dx=WZ?Ax z`H|-qwyX@k)=bvc7pS`w5=w*ClaF&y6@hwL#*#ULkm`EQf_l#R= z8Lue^TZfmjk?3h+m6LZzZaC(sP0OTyVbUByS~4due|M=ySmPqG5b9{#{Z>X74+j zDx`<}wZ1CYT%@4)xqX48rPe~$Kyb0L`@CAti5KP93O+m;*_1~726wm)8vYLeu>Y3; zu(L4yPXJU0Y!4Vvx=*RQ!=$bQjJW?d09UP4E0%Tf>9!;ig(Ns1ub214?bcoZF?nNi z%r6EvzTMX3mDVqRkoX*5EI&@RQ2!+UY_$w*>;6SKO{xgfA5AXBG5aKcS!5mg3v2C~_n3m{Xa*?d}(zUO^7Lf{9UI;dsUS8lI<#4>W$b2nei^8@bWjG%VR6&)s_;6KEw^i@UGMIReq8P4E1&qborD9FmZwNtwGx ztu#laF*R?9R@_6|1R@ib4e6i_?ifKtrGZOrsOM0uHE^hxVaO;p9|rZLcv6VEq*Gfh zC&-A4jO^>WDa;9jra3gHA&m>wNZDY{nuupM^4iLoXI|SZw5qK!-lM}^ zFtIt0JNWy@a)ti@3&(#63n#<>9~N1=O)iA)OZECNfb#)Xei9`*7~oi z*x@6{a8uz{`1jYiCaWx)1mWlv`wnhyoKUwsU%pxIKEGJzN6|?A`*wbL-E7v~*06({ z+HJQ}T^#vc<11r7U0z>Q{xY9e4Ecjz4|Dv{{U=UR{^;$^j=0t8xFjKO+|lenzJnji zAMQ)nF*j1Pxzqh?mT2aPqq6;{)I>fVbVwAxz(BTdQK=07=QZ|E+))m+ zN9cd^*Al%jM}0f*5a$fkDQG_mxOIEa+BQjf>)-Fc-6Olg?oIV+(u{tnY4PNjxE;Q9 zru}4mvP17xw|*sQX?b(u!`dLQgwU!|&JLw3(@%bTw?!F$?MJm|mp%!hWOpMyTt4~m z;5X^yHt$){q$$;nI@YTrIbQr~EXK5R^=ms^CR1cT7CaSeB1;x2)k6I@fG7Y}K-Q4_ zLH7XM`vCUIwS+=a&IeTC^|#miw9Z02FwMO0`TdmKk)0g2XG7 zbPC#%Dd|#CnW$#x%MA&GRl7llX+oQpHzn@s^9`uMECJ?+=m6ST0l?*E8wAb{>d)rY zq-l}&0NwLQpVGIO;WJ6|1?x4J{5=b1Gr^W2_^hxLh^w1Q0iUrlSZx^8i|jH>hkA1@ zYii53zT0x>Lg%##VpT{q0O%_yZ7ENP)lt%d?I=!??E00ocAzmyqzmm?5@WSmX^jqa zY8Xqm>ZOh#PZWs6?-MkZ6{`a+5a>C;JFO=4{0FrhqPeu3qI)tqlTGq7YlPmRV<~r? zWZr3SLD_pw+ym0*qyn-EdKV4q409)XDF2j9kc74*0y1W_Lzyf@8dnNyVG6(V6oIf0 zF-uLFJ$g>tzWqpGjMrbI?oVq5_)TPD9I0g28HPmO){WAj>UUvf)8?fC%U^PUu}}Hn zUTjL^E;nzb$yj&TN#AEaP*0lGNKGHm^#Xy5Yk2@ac1Ee)#TnPIaI`1hf^;9PsXM>x z&TuLC8pQ2Ko-I%>r_(Amx~>W;yV?J57BVA5B>?JA^v-@3f?v9JI3PXD~BzVx-N z|L&OnesX>Ck6-=fH~t3A{=k!c@+YtV5}N#mk$v_tdZd=^z>W*;9OZ;f4fDEcA5kfIeYfYwQ%PL4Vof2?(yzsB@=?sTOn--`HC#RW9E0}tj+fn+F;xQsmwhejWDQ*bFO}@ zPB!?R&ZB;~f&Yj|N55AOW3p%r@e02g3Qq*!rSbPDM{^JMsk0E;|wOKi|f{|DkG$_M&@B@}zr`ikKSPnV9}> zukpY1=f7vbyk!;T|H6RYHc98|#Yj%)qe6$|kJBzVJG-cQPFyW6eomFH&pIz}`DsB_ ztF21gd+A#9jJxP_PFZ*hv3)y5pkUHN9t|6;%(4Dy@h!FA?M?sK;drDnyY zhT}O6TTXVBkHV?0h0I|4uZLUkjWWaYmZhhnllg|{9ndoM5eS)zi*k(b$lQelSibwG z1J<^~5?-f4gTfN}22acoICU3vsl4!YXsM5Ko4RVS?VQi=O}@anL5E5Uw*qtKvxA?r z<%duC<;zWx8`V(@BCD!;mvUd-R=wS>PW`-R1)6CGjE=V7CUZk_Hy&LFUVglhWgsT?+f>%rj$^cRVX2i+17@4JIyww1*gd~PS&I~3U z2Y^Xwf&mc_)6<0Wb$p&!xX*~LKhqzm*=mA9po@;74MJPkGvdl|1YiV&pbNziWhg%i zxuKUs`FkDy2>8uKqxg;_SrO^uk?TW8xI0zwkG=Sq61cAosUD#m=`2DWNvL^FQxjS6 zO6EO|66|9ZL=pB0Jn?9sJ-NnQZ*>nJ@^6%2k>nBVpbs;;T)R0_EbC((h?(4iD0zSp zMpaR^)wk90TA$My)OQ!KUm@wJx7q;=R`q@^;a7dZQ9t|?a|Q}lH9yMyA7f6&^rgr& z&M|K+7Z6ysL#@BY>Vd*R$3cchH;~^ZjH|V#Vkfkmxq@aF9r1Y|ucP41DO#hv=wJWh z|D!k;`jm}!nBBf)8uc{$ke|}t^q=hBOoituuZrL2&EBCyr!MG%2gX_X4tBT=p!c`b zWmUTJ)>Gv^&#rCiJ7Pr{^9!^b*|F_EFu?f#VL-*h{$J3`8(Atl+x)-5&&p z@sJ~6|6f~41+^9?jfv{RxQQ>&NF-zu(L_WLLlmf0< zY9mLoK&&Xqqu*C1sB|FPcyP7!H&qsp1n}3lRNWkzhq zYpNjuA&XSRX=LzuFr?{%E~8r3Vq6~0ixWjf42m>;621LLq;&L$N zL@^*t62rOw90eIK9o7sI;$de1O)&f-DdUE4H%KGKc)A7wsZcOFvlQ{nsY7+MuLGc3c_e|D*sJjPb6+IT#SR6B({5oKrn%6YypstaxHKs!pJB_ z3_&S^47Xgq$;C8fvFc3i^9rZI3BQE8?Ux%yu znEVFvXy@(Y51J&oOg{nlY42m%-!IxOue&nlYkQQ3r|5nlnLQC8=2^7l$S)nX?eH!s zGjfZ!pqeHe9_*QAO+*4Pr}#}qiHV3ym@YkXb#;dtx`4D&RSKTTq4RZf=ed%8mq4l9 zfT@2)@Lacmt+D)5aKOH7bA3xHRz+^Z<}aaYs^%;4HcWsw&@`@fll%F)3>Yi04QANt zYa!K0b?ZS;2yAo$Qc*`z5Xfjj8zkicTA~1yMim1!H<1Nw26USA4O?-i{Z$V{M1jg` zFGkf)5>?WV{LKASZ4V21u3-nD=NgTE^jen5H4 zRE_^K)69fYe-jZ9dfMt(lI|1YJ6&4(B`+c;CQMmzen44r2NYsYBo=pv>`e+X{x^5) zk?XU~vnh%*&rJP4{LqR}*qR`Sgf7MVLnR~Ct|b3lh;}fjkz1vXQDGRP%Rdy56H2P;$pR@Z zB)FxHBVoxQZ5OuA;8xxo@`ph zf&{+KKj(XIXK6{+o*g>bCre3Nee2w^cB#>Q=`oL0)~>=CYRC4cQ3vnW=CdXfV}hL+ zb4^`Dd0|K7ES}7j8xYeOtaZcX0ttCDOfXqWJ33&g_FW*4UaqQJbQH){MKaKrpG`$Y zX{Wf=W9O=^sMH76=+&>f)#FZW1}VPGYMjw7zgGv}69e@4aQwa^Yf;z`K3l@&pAg$| zgeckwk%qx_bg}xq{MZJMs*IV|rpqt)N=RE^GBK?TotmGs@Q1u!UO(sCW%{}Je(eYj z$Z}g|bFTdoEvV6(Fr%QUa zeY1^LA^782hb6;SZG>$~7Ay3K3iRcO`MdV^p;Q@ZGj?Vd=csO%rjrexE4U&pEuupv zjZh^wCSgQL9;*cJJp~cMYPFt#6K%+gHsA)XZ8Xa3<7a>O%BR|7h1P(>Y&yeaZCJBe zx2)H?EY)(yHyFgh*c1??p&|GXytTpzLg0HSeB=*cG%Ihr#uWe4SWV!4cPaKt@6?xm z4UH^BrPYBe1%d+utMz^N6L{^+*(^<==~rucPSn;Z(`bxQdSH`~tYX@9I?z0fHb=|G z`+T)bM>*$iZyCjNYi-LdUUq8ff>AYV7zA#~rb3U7y*qOmeZBnLu;qj-G=4?ikC-&K zn||Fo=Q8Kc0o1&OYB_MrEB4K%IRV|FK8wEK@}H|;%RgXlXZ|roZGyoI z;4iX(W4%X@N8icMJ^Kx$2DORCXZ9U@(>6zs#bYMoh>3#;hY%(J_cZ+qyywU0%Z?k> zUnG)t)EJm-=TsF5-H?6>kM0EH|#Kfh1Cdy2;ucGDQYPy zUVRG)g%To&zeQ)m3enaPJ!(%Q65)8AF(R)sQZ|olNAm_^k;n?XwK??71`V||>J2=#s-5d= zuI{lx%24Y)**AV8W8R+tqKj9C#cT-iP->$E_lFD!NuLx3CD_@>kaUtxtISwCbc}CIlz@Vu7LQl+a5q$4ap(=R=qT9K*8kp6-3947QOGRgkpP~VAR~4%Eo%N|KO82ZDGw-4S zvsZPsvK=?BV|ewjs9X$75phRJtUTGwtiWc@;agDD-k92HzrSSUojyuJ%~|X1{Y!Mz zqCQ8ooui$bN>M5hCreR9=IsaBrx*SW@n^8-mNO+KDOfR=S1=onyf70~(OCBDQvDm3 z(2zdfD)y1qz+w;HGivv?;VY>#r8oc4|`w}err9bCaye$8mMM-=& z`!djHXFzpbO;ze($7u5R9~>E>6q&Xcu4G%IdqVHh!wwjGlq;7)fgx7V`WwZ+|JhBh z8W}Kye?IGaei}Zxp#z=0C}Fw)ZlDsKjLoa7!A0w15rXkL)RWBF0&~VcgEEMH+XB{0 z){L48rzB^dI|(sCaX?f+X@j4FF0HU_>eSaMKJ>Hu?pQ!!OQ{9LM(bWl@gJyj?y-F| zk4$(Dkok_7a~?V(!1zv}b*ipX=&{u?d*Cs(60sdcJ14~GV<@)zH$4E^WVnm)s|ehXT8vZ z{b<=^YzlI|gb&q8-`Kq+`yTAPc}EILKk0)76M`jEY%!;+PqZt|;9B{RGL9Cn_RUJq z%w}26P^^$VJlQ1tc3Ur`mA$DqW3I5qs-a#5wgq2b5U(9fo)&pTykXzWL13z2!H%R^H%ZC>$;kw-hc~uk}k0zDjdAAy3ol6%0uY=FJua{!~aO zxVoykvSVOK##VST`myYSTv*Mes&3iFqI!uHV%ad5`@HG4L@>$Jmr})Uwz|+gula82 zM8{#VD#cgoyyk?ANP-;-T?pCN73@1HriQ4hVp))fYFns5Q_*oAGDz&Hcv}E>k!6?0V)_9uQ!Mz(5LND|sl3TGb9H{Y`^~w!Vay0fTlqp`i(mx3 zPT}Sd7yH78Qs{o?v|&mfmsE8AJX>6e@r^h5Iy|M_-No3vmVeip)ND_eJO45F4&5`pDkHPC;TK!P?lwoZ-&ngp!>Ohi&3U}yf1hc*Gd zu&s@gvCZFiO#iV$FJo+Et}kTk_IK|;J^~vf69GFX6T#n|^7;;cHxjV@(_K{{pjR+< zv~_kcGS|I}IX`liPJSZl^MM*o-){~Y`8m=Vm3jO_ozk?YcsO59*W>Yk~c zjjs@a(edK^1MZo)Msj4-^=x&t``R1NfMghdLOWbv#rR7O7O!*b%BuW|BT`s64v1W%11C!G7t)t{WC4>gt#-qRf0E@hC!D zJ7L0`WGU0*W2M@DeefpafY!CtMb~i@!q>H+UF_+hJ9}{AK24-u&F(3N>%*@+jKm^NnR(h_Xn(!x)B zeXK6DsLzDz?H^0xvDNJ@fg;9)@ta1CMue^8H6UbX+8yhU^VYN|60gU;wQw$eyNi_V zhs@GKi<^i>GgQ`G!5TjteOyewJdmY@% zB;IEHBLf7ax}C)Z(DrM0d$PT(5fR*H^UPRzS=n}M{ir{)xcjdss=3Tkf!X{b(kGMo ztD}Ls#RDElxY9`7$uu~EMTHv6O_z>eqZ^wEOl`IgS^8nchbu_nw?+hfF=6J{y@hzBia(+(`AM+&L!Mi(CgCLevN-LJ0Onf)f3D<^P z+{j)9#OgNusEBdmftq%N`C}^SQ9WzS4||x*gvquhHZ9F$aC`(3N+OHFr~Mc)rl?+; zw-#KJq|=hN!sV)Ndl5}OSaiOkhB^R|jmh9~02F;*U><0bO?6E-z)-Ija>B%%%n*{n z7UuQH2R=;LkrJ)z?3gEZUH9pJ_8D$=r2ig7R%2i2Fi($_>>DV%h9hTy7^Cwh*JY`p zYU+N^bcyCdzxYhd{QaQ}_qjt~&Ke+-c$>!ppj^hB+q#lpE0GKdTf4>s-gAGoP!W-u z!49b2rCMK0Y}d4&P|(VbLPlw?c)|M*7R)z+_zkzVjm+Z&?=-=D>?2(3!WukSk)7UC zX-=I$C^wTLquOVf#K~~pWb3GrEZG#)DQ+nbX8Ke3@a8?KNORVa;W&J?cH7YDq2J_a zgSUeRhzXX#6$OwxAvupMl4zq6ywUoRjjAfj+OF7^0*G@&U@D&Y{08B*;LLZ~2AmNT z;pv}+&qBy%zkTKdtkXCn|`rRJPaaP%nAx`lOry^|y4?7OY- zk~z#`7w(I|OswOmXVdnY2ml{U$|f2!u?KD6PA2M{^lI#)TijOa;;k7ub*j`Z6aYrOaNH9Xb=rcu`E!2WRv>%GIA)~TrK1PIVO?_y4zR-0#G5#($btp z#{trOyuue~B2vt9aXBIZ+6KqeNdS+bThZs z0c|cV$bX@%lhYwx9S43t4!njduXdGvzdC;NrbEEbMz1tmV?*d2@;H@b!AceWXlf~< zY;Jej!FdrtvdhKE-%-8bG+Ox>s*fjuYM|K@C|B>nxZ>?qW%%Q%AsP zy3839H(o#P6*665yv6}scrwe4HOR~D=I&=dtXbX1@d|Spm9=#YlG--R&f9D$RbIO+ z6O06o_hMSrY~#s2dS%NHrAj_)-MOM*t1>#-JhPVoz%vrzt(gwunGg z=)8a}#(T6*{A6~-b_X;ts>a0xgMUgGkB!xWLcZ;@YSWkV!rizMj2nM74EvR7 zdt>9%VZW?y2Qki^Of|X|vF70U@C}?R>ZX^bu z!~p;vM(4t9z6u)%RE3-~O&bAX(40jH*)eiywe**=&!q};pZSJ%v>w!q8_gNYlCQ!*-O7HrRvB|vfO7PXW+wP}&V|Vm+hq>=V7li#UY-`$T0su(NP}$} z@ZxY{c7FgD8#YrUr)j`qiyKbJ5r&KUhwSuas3^TY#YJ5DifVepWAO>e*?h9XF-r4Y z6mFsBGkZ|HzBvO%6dNA7^fRFq-7rT`ju7dK9i}nsb^YP#pX1_xG*@%xRiWNzURj?= zBR2hpSs#Pp-BI%R=A>%+LR3|IM^4NxY>xm=2xy0@e&|`BIOE9fCpmst31m=a#c_XjO3siY%#!WEw{2LK`Dnd8ejOrLkpk6v4EWYplKe-)22YcQVd zu7qa*MUl~40rX@sg`+e;-+dB88^Y{0Wo2Ule|G4>sO}D83y+SG8u~e@NW4`EO9R#` zQ4$1;)y`)d#K`^Dot-LVcV1(;<~XpU_?Ue^uys9`L8Vj`O0VdkaqG9&@f%U=O`I3j z^v*YE)9GBgsMt{q@9&phqQ7XyFB<@n2PJpWi>IUrF~#)y!){)dLx!oMJoQA~*|DF2 zu$+NPhv2I}29R4)7Q7|7QQZW>#dCQ=C4}dE5<eKcL3sVjL3A z8H<&{9Eo@JL^}X(QsdX45O%5)SjYN@-(qG*59;eVDj9T14Q_Z0$+LJEuS1bDUeeIb z|1^ovv-kw9r|J4Uj$XvYW5vbOgMCTK&1RgF0|GVJ>L&)S`?Ivy$QfzWX)-%E94@QCb6 zZ?B+FO^^=j1lmpdV;?&)C~8;Jl8h(qR9qo>gg>}JT+Q=q*+lH)vD65XwM3B;7F|a& zDb}J$Akb+U5u`i-({4h|0j9dVciYFQ=x3RwX5Kuk4lb4|oG-2bHoRO7#IYEm8Nq|4 zU%4>r_zL!maU+l{d>W^Aa7eYSKJ}bS<);e2nNXWaIeFyltnM&PBjCJ4ho6?yuUTMKf28`6NAFN)+^WDOzZ^(e{7MIt*G1L>oF@^KL zv{Sm4Zln+(n&WFMHee~#?rlRWu&Fk*+9R=R*FQc=g;!WJoKSEQG{j}l5eOf6;2m^f{`>$t=es)ptM>Uv-uxS?gOPxd znf3n+dSxPD22k60HKNl%(BKLJ|U3Y)n#=j;SEu z-l1rL0fwPxqKDxC09h;|Bnc{EE(&69j(|W3326>Vsw|Mfeg5*Z^Y!hy((c-2IpsMW zb8_kZ{LpFnT7#J$LB(B|y^CdrqJlyMmI7RHo;eE8rw7T%poY^sVj9xx(f^|c=!Iq% z1rHRR@L}tt41*Ifw6U0{=9R{W1-f|m1R_M@hhWYb7KMWWg909C{DT@cJPNp!=L2Dy z*Nq_$9v$!j@TxSY@lmP7i`SmrFCyvj^GOR2p4{{pY+YTtR%V!sbzlr%;shtOi z0{OF*hT#Wqb{um1X2>Smq4$-K!GU0VE7H45f$tSSKaLp#xIY7yVQ~Qn+qGN9-{;{A zB;x0*4U0eo_Qt-cyVm1}P_{EBj{y_?7*GI&NTHes-H!~%vN(%80H!DEC!h3CD^OMn zkChAm6iCFAFZ=4Z6D;hHH9jmr(cRP2{@|~VpreM*h#z!P3n$p4cbi%jhIw4wiM7=@&|%wfl+=a02`k2wab$ z>jrV%!~NX`EI=S&3IYS|6wpB=@7FVTXVN;6%jPNd^65^SVQais}S_Ku$#mjDng91WbrvZ=VO_gLp58LQJt=OV#Up zVo|6yE3n2tv~PQ+3;OZJ>h0eXLYa6f;P~6M#34iz_^RPqtgWchq z|A`OsGvmSH#mnpK3F_1K6N(-o;s*A8H1e>79(mHuhgA!(=o_NZ|1+wLe;suz`dzAu z4LxKjfO&NOb|WS7YDNIGJN*lSX7UPN`FnNB7jhEWKL9)58=;4fLf|(9#wR{sXN4Z# zYitO7PHd01U8mW%dl45@h|6~|ojs*F0ZO1h7|<>8@J*2)2ZT<@^sV0x3|PRRycrE2 zXqYWM$Z5bZfX@_iEOh^Sp)V%j4?xJ90fU?R7aq^|qVJWjB?cV4-vEFjvf1iX$F;KS z4vq>{<40r-%y{g5wHhB1%8-nHhIg#_=sbw7iRh#uT++fj*C`)uCG;h=jAQm58M8dp1Ze7fEJR6$>C)Xl*C1M{~Z`)|5map+!j(me(<^72>tvrod{&KwQ*EOru?*fhgx#Fop}T*~l~e zFHDCJx>l!zU_io5coHakHt2mwu>--znW;hVbv1W&Yc-DW7tHNgt&#Go(hCOP!DN(a z)Tp(0v>{0^3*x#3m~6FzxHi-<@$Ngx`qbC;ii`c3DV6bepQJDo=^>~0#wF(Xdu~)6 z5rs<2(%rADZEmNHR>*0lkaeo-E_QafDCX~SFR{yTLYa$SnW zIIlz+9ZO!ilCTRHn(QO1-C*r1!bW0SmJi$1Q}y@JVod8E*bApsIZKHs&d!x(63XJJ z6raIkrLXHP$z<5LfoJjI_}^4t^nT*D?Ky8#ua`zcO%s_8kG3{~46hH%=p(w~jtKvW zujlmUckx2L##f2?;R1Mh@a=4RC;GAvucfT?0y0vhs4;jZB{gelZ6I&b^5sS;ATG2B zEc6pGm>8SvlR;s!HGY~Sby|<2F@{(RQ#Oj*`rMk(sBJ*$`Ml0%*{G%T}Va|y*th9(KB-#5tElJ6uv@kG6*y7MqdEoPObXjQiQp6^e>t}~|o zZ(Fp7vc#2A#MEn~U~q{b_6(5+T2|TVcnJ^R9D|<75M%cf8D1Z1U-pg^g?7K|p}Y?yKp1IjwgY1d2QOP7d#8bNKBZ zb=#E1`MMSEbM9>?n_g`2oYguOiW^O=+FS$bBvR-ic^ROH3sWK^-;Z^JolVr#XS1#m z`{1OezIQSapipiJdQ9}|tR$vcGK>;2-kJ_E+dTDSH)S}5x>s)HcAU3sC>d;KnlEn; zI%n`XNH_c`HSTb8Aks2Ror1n<-e*^EmdjoyQ4E0wHmY`4&z2px;D>`N3~ms$(Xb!gkw8DbG|O#h-Gfpwk%YRnU+gTk^Y*6Lg7B zA`7CTK)NBs0cUg-%mq_0nKm`!>rH7QB24E`_pjV<<;U-5n>k_u*p#hUxvBRT;u~SN zVNEK!9&(;C?14Hp5(>qM(V&1aQ6%{100||AXA_i)IJM$gF;9g9Z;~?Rd#7WH+VcERrVkR!l?N|xr{oin0d`C z>47&@JhkXjx}$ODN_+1)(Z73(KisDFEr;AB-?BQQKoe7rF22wH~sjM5k#KQalvnwKNljSRA7mWy-bDhxn(o9c|nf-O!Ow z>s?eTlWJu<1o^L)TWfb$y`J~h zn6NCI9#>uR*-LrvqU(i{NG2DoYas6rTj7_i{2AV9>Z&I`!fx+!(2S8%Q)HF4sg)E? z+wg;9;2C!@C0;*9OkfqptTf_6>2zmE3d}-GsikQ=HCQD2Gs%jj6ZeYeC6sg#>;-dd zLuJM2nxbC$wc5Y#xzSJMNiI_bvGJ*Jpe+Sq(#clW$HmgJ%NjZ1B=c~~v2(ONIzUkK z<(csgJ)CcN5Bckh+d?=8B=_amW>;=|tQ8(j|Rc)zHM2jb>80?On4@xdZp{sd zgXu_uty0?q#0$;S<2qkXZ!t{KHl(yBwNxXvO$jRxjX~y}YAF9BQ47bLJrax;rdNfv z>A|NLEwq+mppCk7^X#5-1;lon?;p+x&K!kPOGr&Alf0knWM(c8sx6%Le9N7O5%XTu z3v8s&!EGNBOam-bxGa_NGj}XP@Rwp5WuU9@Q=xrY)Zt%4fiMf5suB^AH*TuG&;}bF zO@VK+4VylMKKShK(5PRl5~i%L(BpJ~R5hrRaaf;I#Boz=7MAv!GLgx`Q80GEbu=Q& zgy1W?bGD)m70^;`6*(0)>D(5kt&xOvA^&!;PLUz2dEd@xOYmSs@^|2k(u5nC)fy7 zILB4p^R;ZKorZ;KUCyeR zBqEpDY-4J*TLTg5q)+$c9=C#*{ZWM;6DikLE}U z@kOLx!SwdIE-?H8nA?VJOA!Q~YFb#fuz(PIUfNwY#`38Bo7V6j8Ma*0*p&tER6WFTM{kmSG1a?=#h1L; zq4w9$&LOHkb|0@4s%^PMuf`IBnb)iO^0l(rD>$Gy`twW++YzrHlTG|>7#PDv>(WME zaCGYUIs}^OoTzi*B-U~JWj*X!NuIx}x!Gzj2v}xb;1({8ESOV%U%X7ut7w`Zo)sCw zv+3oly5s1^G(Am~ltKl>BGQFVGC5Dkd35rKpt}Q| zWms0Dd#&kOBDP?j7?p{Q_dkXc2UPi`<~d`SeV95MN(`xbE~N+GV32>}ryLdk$JH8_ z+%OdS<0wl4($VdAbA8i?Fq3Zk)v6`y;+W_vH}$dy5zo2q%oouI`SiIhMaUc#?9RK8 zufGz_)>-F=QF-CFRnw9OcVL^0$>uf=&ens>PQCHCq*28UfDDS#V^Dy_a4%iO;pYM* zWpu@vO?T>o$d8%jO|bP10^M<0rl=MOldhhN_K1<#(hJuRruY@09BHR918M6I$zjFx z*cQE1VZmuBO}b!6;IheCg-c~vJ>KlyMlHF3w#r9FftjI#+28OD5j?t_N3y;BMg_2j zj+mi2O?E)ZrId=sFMeKwq3SoOu1ht11?u1%r^)DSk1i2#(Qh+_E^p zaW1*Fgu_sLQ87rNsYzsO?5Vbqu-J9Z6sDWR`(ND|w zbnZgYEI3O@mjsgJ0WZJ8PT(=Gddo3NUs4RZ3WXj ztdpiaG*gqNBYz5EQt@T}7;_MJxZR707EE-XnF)%v^2$sr9@@wC0MlNKrm~hSW&MJQ|G0DKt(5B&)>Z9REZm zxGj#93|GL6e`#z_`Y!n*ZY8t8>6?A*gMpseFuiWfClR5^JdjVCQ-~Y|xBsPCp2B)< zEHnKcl3lHp3%Rc%Z5ns0@C%&}4x$M`ixPPPAZ%xVmyIuXE;mKp~D(VhZNct!y zx&WR)Nx#1~Y@^52=(j$MNIp)^&<4TO3_(c`7*t_Gn~B`&kPm zPr;(Xsk3+9S@|JbH5@O z)R&V6qA+c5_Z2;&;m1*ZweoX=gRSK;?wIt*iwk|re4yfIK?-r{5Mgydc+#5bi$hjs zvBaPe3l^`EsvtB-oCGfA$)qxxTZ+j^<*H$`_)S>EV+ccyC{Pas^YdHtn^j;={*xZ* zh6&$(i_vd8$n7*L7lB1*Eq!z3J$jAEoo z!#tiQ3{67!s$OH|mbsQi%*Do*pr3g+RYTeM2!G>k!msg5qITf>4IT*R(sOUgZK~F` zl7A3~lxh>>n)52QqhVR)9X}BbL=8x$dzp?2SIN~$`d=PQ6{%%f|&f|7{pYMK$J1PiTfXju-M6ylqcDy3Hf%S*Y zP5StCL!&RcjNaj}Z%z!h(&M?12;-ID)s#D!2~JU8_gs1HR;ett-fIOFrMEOF4@FIu zk}CP)t)h0{ccoKXNugZO3{_D2?xisF!09I_C8ZWkzdb{?IDhM30NN(f0#XlHJlr*R zOS7gg)S%UCZ9{ckf(3KW$wN(Mc<`Iw#^F*+C^k}t%zldX!d%XII1?5bNz8ByySCK| z-nFH4p)cxNu5EJ!>8s0S@@!j}VL(i2p=U=`pE2AQXdSLjFAWrs!* z-oxuV{7!3N}{3xu0clil8{PGG2sPcbVbyLg=2gjdaA=PbC7SePZo zmt>2hQHgl(Kt0ptt1>QAQmewX9VgPJ_n0GIYFs-90U<5c)TugO$tX@YH>&xIUzkN! z-N#exg*{^&J}mIMLCJfpHEiNutxH;b(&?f_^Ni*N&kp}&+F{8yC*2cL$CvxYCu*!G z1$;HpsD?nys*Qn{PQ=TrB8}XS3wM(0JHqh1$}aJ{nbE`Jo}Y})bNh4Xa7F!L?d2u; zI*L1??%Ga5-J+N7UTVB=IVt{*++d<51GiE@Mw~gn2x}esXJ@@c@&X|%0-s$BBT8ph z8oxgxai-e2Wn1o}_a!oi;Jn_)gj^{icE|oebLI5eUPo5+$pVVb`b?Qlu%r9pg;&1f@aR_cO_EW;lpcA(&fgrNb#!zfu+vtd>mzXcJ0)@GqPBL?dqpNs58vg-i%`VX^1wIex@ij>bGE(j>^0uYSqXi z&FBn6jU#|uS5X--v8klB3F&ZT%XaNp{|S{adz@{&pp#w66OaKH zJ=&3Rotr+uOtEK4Nhs}2IG67=><4oba)Zp8g~Q<>z5LK}dA7_~ggWy~2xl1rKcI;+ z#W>N=((mltgU{M`gyq@e4Z|=c-0jOQ0!kSS=G)`7V+MT2Gdkwn4xG$ao@F(|X^>Z1 z=~dLY;M~TZ;SIgkgQV~GM27r?zE^hRb06n1mB4|N=KJhcn6(z}NpgzjtRsTiVSHNL z9b9AvBQIfQnoZOq@?(|=OY}>m8KY+*0eusiNkYcQQj&GPMZI%;{9UxLQ+!;6d{Qnt z8l6JO&IQ*tml%hg9khAMa`>w<4!c^|hQ(M^IJVpE<&)>|Z#4lQWLov+?&Urh4X*HD zzOl-Y!MQUf#*rrm@uagHj+MocGsC(wHO7$_3g<*Yx-+SdCXNZ`Ofnsgp%BVp!n==) zj4F}|=QNBxO@Gqw{LJ66?V)z@c^tJ}YQuzn6{jXB_KY;E3=4Sst09%fKNZh~3?f(<7{ddET7+IM9XI&<%YP)W* z!Fb=)-V!^@RwX1+{PvdOZ(x&Iu9{YFbaB_C8QvF?;A=>le0u_hl(g3}HTA3~0RVyA z{X0Y2^X>d8oW?{{%ZMjadwbe}Z$c5XRFtWM#*}~5K<$Dq!%=X|I0?caBMh=ZbS&LM zB~Zislgn1hn%$m74ue$p=~tzVdcH+IcOm;L-^fUdxI)2H#kttcZ5QhlReLv2_S_ne zzhW4S++CoqCu1b#lz@b(6`3&&6z2qHw0Xh|on;+&vj^n$e1Mnok@ZHh*tJxGqBpj^ zpba-~4xV(kXx)_^%H%aonH3}h?Q8&r3$AZ8OJzO(aF|99GI!$ zrORzAr||M>@QqBJKElt^;C`0&KuQ0~6>=I>?k7{o*tXr>E%NUP4fc^-yRB$zZ4_#) zXBbu>DB`2mQ;4gzTqSu({!1A|k*tP(TkcF|4##+LHwi=aqWo#d<@90E_?sb$g*0;W zvIiMsi(q-2EX!Zp@a*}m>AlDd43WoCN@NB_eL!5C=iSR($83QH9*DlXqT$||u~06xX?&Lto3=3}_KmQgC#pqb?M{h(l;HSZPx zy$rr^IRkLxf=Pf)Dap-U&vfo!0GkD$@DwPa7%B%5CdJi4TaY2>DQ>rdm*YYS0KT1m zDpf2Q8kH8o?;xbf*OFeAws-2GHT-_X*{up1gG_Qc;3e(Uj3U~&^&fkg@M zf{@YeXMrg=U`*#S(6}&68iIX_!t130b_b6>mpP)R-VTdk`B4Hf3?a**d5Q&m$j<}C zf&>dTaIO$vWeHdRn(o93xNX7Rdy$k`@`An}-Wt<6sJ;9>HahZbK9`R9#eEJ~`AlCJ zXt8++b?Q(pqsDWmM?s2B4%BMj?{h=7HK>?1_P`O`!Ot)*y5z#UxGW5zreeM4G5|3A zS}k-5{<@mo7tFg=2dB10av5M>I+0Jg1X0kf(0A61D}QJk(X-<5#?+Y*4)MT|Z1D0* z3>#3$i}iQ{i6E&r9={KYm9@!@H>n@8VecCU3d$21@WqZcSyR~NSMa^=LFMqERgA|v z8;&se!bsY)3aI>2<;1%pYvv^VCjM+a29^B2YFH|W;4}K4ZEz5U*Ul>jsXdLjpWG{^WK_o|Sm}q@919#1 zS>+1nT8{%$%h%_Hz)Vrsj|9F8sdw8#P`N~ogR>uhutIg|Na+al{P<58Shgq7I*a(J zJb0$ML$i~PyQRKk23a4l*$^Ffeia z50a_c#aK;iD}nX;8U!L*)6Ug3ba!0<7`G^XIFMTq2m~ID#Vv04x=%Z>gBuVC#(k&F z@uY2s-Phzg_WI;fqeDgcO1Wb?zi@umB)KU-&F_#PMqWjh4UW(cYqhU`N*Q`T4-8RB ze+g)-0Y08zOM7F^k@dnFL;GN4qZ;QE}Gcy`=}4s2;SZSfKy19;(H}#od5yA0vbpy z@JbNC+!+>Fl+_)eurmWr0PhgO!JSfQV5%R_3Q`_WGXO_hP#VB847&IG2DBGx-wgCy zF@t&oI<<%z0K(20NIgJzQy?dWpp<_W+Yfnk2=Ma!{T>FO1IS9tFJ?BC*-r>SPfW^_ zy^A|z^a$6d(Uf0n;qyN{j$z~HN4 z0m|U)xwNRK4m|@M1qy__9Vm}L?le~ojld6eb!iOm^a<%BcybK%Qx(gmMo%o$*W?y# z7pMWSU2QE;OIz1Wr}Zamn*Rdiv*p}hR`yxP*IoE~{YjV8FTaMs(~^xvwk9<#Wj1w{ zO;3#Fng6Tc)C?BT&f(L##li6%{20#R?ZOY^=MiQ>3Q2%Etgs8c7s@DlxCYF>I|zi~ z`$oy+<0bslHtuzY=(b06`zN#Yr(({xWAJC?gI``^XI~bcXmhphy0|c-#0YQsmc9!SaM=&^ouR? zsxsUqWWzjwFs(Jz|gmu?mZ$2X{_C3JI><7Xk*%?`ro z+_|o$+uT(x)aoBt6r-bL_3u#gj}?>X)Ed9;CkG(FZ{~y?s=@OfG~cqKB7z(Md=*(f zK>%uW{*eh|ueO)~EuQY5+&W)G`)|i;sGxQ~Ucg^CRya6WeyKmcpWkgvZ|GR+Vp3sC zxqR~>K)BU98aF*KzIsyZ=&9&KKN(>3$v=i)E2IGaJc21^(2WREdvUJinC7!o`xqKo zZHL_~(%HIpzVqx4jaK0GnP~bYxaXoDS+bQ?L>Tw>r#7|lmKNz~-@ghltdCs;IlGLZ z^6Y<*1Oz+}f{skn6>!B?0~DbHRg+!q#B*C+JqKo)S9ex6d}3DHM28blLnX;!NS>v* z^4>w7m|WW`>b-#C1# z`K~$|lF^C*gAzl(WlwzZDO5#~Eiql}LmHPzy`rZCbDH`KiW0ZaYw+!~|4y8K(}~HB z=l&9(djLu+1YbO^}L4ARuISgyY&w<=(~usuwsffvw3X83fRfsw z714G3scAk^y~SQ4G8>o~%6(+L`b`t)z2iIWqdD`|wI3NZWc*R{C`moGQYG4bH|xOH znm9;+6tdxc6XWtoXwe*@SDUqSJXUnz^dlfFt0Y#JKycEm=EKx$HtA zp74!T0t_r3BG0u5Kb+Eg@j@k+qf?Wgth21vu5e+3 z?sprn3Y_qyARXyMv#`5$vQr1SG439<^7`vD{XzhR)m#hbFfCz#knS3#Jhg7%Odr6k zg|oqrRwEp3YqeH-Z)Mh`wPvM4a9A?_v@7G%eA0bYbH~|3!l939KVMZ;pa>n+JUonj zr4{|g`pFodHG&5#ddf7fxj_|F&xWX43?bb0>XOP&v5S;qUJd}$`8UUjQmyRPSMq?p zN3+2RkGGmFyWbd8W9*N+U8x`bK z-sRjjah*K0{m&zNLghUgLSBn-TTIql2SzoRdcSQe%hyPKIyBE|GgI!KQCYdlW5{bi z8zSBYaR)oY)l{g%d-xuGB~0K1x=Wo+E26oaXj-t-p81=UP=3IbNV?gCSXq9wCT>9L zR{y0y+MXOAaulLCd4H!h%G(YY|9#P~KVz*!l9FI)QHwP|GCN+XFsFo75*G=wjg`<> zJ~-d$>^1${y4jVSMWd5xBG@RsVI{KZW);F>{eCtQZXC-zYk1hI5-lW`dWoN&Nr3E( z!<%(5ckwl#x}1O(i7#OCWDNFfNy+fIdug$pKzg*0U3X1*k9Fb8#Q4)bHfLvth)hqv zum+c8HB96<#Mk-Or^CM_vP#_WS8v0M?aq{ zwB_FDy@vPGL0aV!uQlMK5Z{kY$4J_3QvztHloGXdiA&oVtLIm_L->OG03ZCNG-p6C z?HoGCsvmO-MvxslBLg*;Rr2N&6@NY#_IO~nu@5h%*^4tM)T3%cEXrBLqos1LO-i<| z+DG9MBg9maL$lUa*1y0=3GKAETJ_#T>5rA3fOAmkR2q$g;*UGkv)(?>x@sI5st5m^ zdAxLrt2Eki(5NuYu#Qg|-u6Or{T=$Xo?g$>2%E+*$#o7HFzf zabQOy?A;6#{*+YvcxOYg=2`bldy~oFA5Gdgec0@&CjjyI%Y-nL8{ZrM={Ay=Y*C}F z->VAixwDLJ?1%RvAJmOh3FOLVN)*%Jw2c^M^wW8*c2uE^Ex%Rzt-BRdSF-Rx@o>$C z$OH5oYoGq)MGT`cO-zt+s>Q3TxLq{kQCVaIp%9$4?`gJDL%{SspChBhn8>yO66=H2 zEoX}zWNjFm-K3m-;SYDJ!+Y%8e3lE$N0SEkgrKJ18UY8oWOURvhZ>Xo5)h2BWD467 z46YF41!Y|2OfN}^)l&@dMrUUE2iXBPguY{(cb@kAUN~0LIef~szhlE&YZ8%fOYh!G z>kOW++Xah*kC?F^8I&xjsrp@2jp;Zyhg3<)u*eguh4ty7;o`|q#zuYaWWk78l>v;a zsQ65+9egJY05bt>cFzd>gf4Z7h;A4M`Nj1&iHZKW5PG?4oK7R#uJyp90AeXq8L+-I zKf5atrxe{Q2WYx@0Dkr^CP-j9!{PBM76-+WUEJ8+$G#$CRqb9;1)?rA*Ur;o2;R#N zkJ(0Vd7A9=DGH;TLuC}+yG|72GUd0pZR4$=CXWMT=C@@uLxb5e5j12lAqhmfl}S$C zAf4*v*>aH?K^K9yzUF8RG;A>i5!A1sjFW!nF81@Ij`GLO8#Bhmmqm%hD8;~SRv8M; z;|;(6)!1D|wehy=0>`x!3dOZSij&~(?(R?m1b25UPH`i4DrAlL7RX@I61_?+Lq3`6NVrKS3O0uKNZK+uyL!_e+&-{bL{(pIlXKJdkut$&X? z*!ww2LJoRHMvO8q7%dR8WTBvgO1rw}p=@BQMS@2iazBmsrikqzPCUn!%+3b9L%OPZ z`y(-xi5k5_IBVV*;L&z5k%yxZ9;+Qy1b4u$qx`y~9ztQ$m5iLtgE*`?WYvtH`2(#* zQH2X4xyh4AUubG6Agk#PI6|R~S4H794rCh!w@03Z*Z#QVPR{Yi;xQ)CTt1*Ze!oC8 zg5>x%N;1vqxW8fXvt^GvX4e=?(;f6aTbsKhY)JO>^CGGKtIfk#m)uEy3gsu8-ESGO zS|0kFtd{r(!OZ(6Dro4;9#mJZ;nFG%wkF6b;hTJ=Eq&h0cTnnr^9kd_^+jpdHe)NxdyK|xKF2-h z>2&8}z(bn{@thOy6gqg#E2K~ed}wYDVnJo(7unrBOCG-p5{RjyL_kh$crJYRv$^d+ zWHLFq34>4gkNnQh=(~5_fl}?(?{OsSjCLF68?@9s&a8Ew#u6~Ne8zi&;KQoY2b2rK znD?0yx?KJCEfZ-lqvl>~s$^FvJYv94UvE#Sa)xCcsw^JI9FrnRbz2RuW?XZ4O#(6- zwXUox!oZ=om)vKcROZtC)|4*WD8A&SK^IILP|JemWh>8>eaOb;Jc)+;-U^mh$OsaO ztBakm2XAxHj#bl1>;3qw&fmiwcE4yqc$^`8P4Ki`e($18)Vr$O#lW9&@7}8bQ_t*v z>-sm^+(UAboG=bf&eiSCOQrmoLNb2Z3qIp^m0?G%*9~RkCuXzWCQrR_7R;W!*i(~K zRxn=B=501fk84;W=I7m?80-1=1zb{ele~lGdYwBzsGIG{?tDff_wg5gle^JIi2UMC zDG{|V>pPaFh1vR*-^p(Kq*kr&D8pUUt*xuULdLt9`Lw2Q%Cg7wAGJ!m>9`*1D^6Dc z6qFi$`KeiSr4+XqGo~}xmB-13JNmnl@B3b-h%-VW3scnnPYQV}(O(}U5%GE5>~27@ zJ4u>%nH2(ye^$5eKc9L3EZ7vzx)Z>9uP&q@Q=$thVSL=cRuTdc1imkaRPx&h6itrc zSd}1c4(`?qGMoy^^|r*aO&c@w>Y#@&$xEL3=U`@~O$6LN0pdDZ!UK#8O(5HmUO6sy zkJapER+)FIvbX|DWybI!O-fTuah&n*FLR>dPs-Lb@EOH32aV{?$N)YA_i6_4Y%D} z+9d0w2D8Zk72^kkK+6g?c~&%FH^-;POqM$c$iOpFvKW1X|L*jFgfKj2qcB=W=qdCp z=684ia}(YhKWZI*w&u#}6<~0vn8ks2zo}Nd3g=DNw4Gwk+b%SCdhy1Qk%_mTHaRzE z1Kpa)M91$W5kPht$4+sLDQM7&-G(!tU$ULujM7Y7MOCwx81b2LmOs3o=9IPvPBAKa zd9O6P8xfy+<2fwS>HFv%mc2@d46KPIa%jhp%ceW@kbYo`jI7?^-FBJX;{9b?y3cs% z>-xnduzqSkPHI!dQU9_q;{2!f?DkqWlD$}TFZ!hpXjhooI`YhFJKt;~^>l9=uaXRK zp3*cGjEI78cD z2Y*wAydzNpjg43SNPx{Ew_)eex@CO0<|M0Tev)5V7iOnsoaCK$TnGxuf_*c{NC0)S zKpiq_{WMjxQ(@;&uX`N4n1?k(mK_eKyo_h-T2zBfhgQ=MzZ|w#HD>-sN^--#Cq(d> zLTF&|UcrmoZd5D(u?~2@`|0ye{(j!AcYNb_Y)d&=sXY=&_NA^ixEhwRH~!T1z5_oH z2|~BlJO%0x-nonnTrHO%d(JCza1`#V>3pr#@IW(CS5%C>Q%E&KQf%}_eU}?Sd?sHp zS*s!PJ=IpshQHjggLRzV;QGrxH&lMMbl0>BsL@<{0wH={R$ElUB=e}?7-RnYF^8Xz z*!jeXwOEyUR>SqYjj;W3YB-GlC*)&cwdUK}*03XCTh9s;2A4Y1H-JL)#W(6Fh-R zuF^iv{GV>kCTs%PCf3c$IRKYxJm7Z^8F2CfCe;?yqX!9mEvDSp`}0&E?kEgGtKoFZ zpDBoHTI@)}g|ew#qq#SM*g1&LUs{zOb^CYBzWnfmdm=@-G>9f+7|~7UKort5oPJ*` zR7aHfr~7eo*hN@Oxa3A3wDGINdMy1Ikx!&n0l)J6eqe)Aj@lR8{dH7GW_K}N<1N(`BReIx5jl4z zN;Qw<*_zV8i>x5428INeBPmmjANr1o==!cKIW2d$(wR{?UDIhLy^j@WP}JcVwG1J> zXGC!x0ykr&@=8QbbKQ7cCpv@Z9ex^#?@HM-(51}wt<8AGpW70ILTX0uc_bsugW{2L zcHM4TetuthW~AaUu3PkGoBD?XZ*dmkq{zL= z*O%2JuY!NiA2SxPS_Tc`bWa;t07>i*vyg0+VlPoM?MmtXp%g;c8uyHRbXZiJDQV7} zMscyrtJ~08aJJtVgEQ}(WHn~`a7QQqmSGF&6SER&dR-R+XJB@eP|juTu}T0YH;DyX zgN#uLqu&N*p?cSK-^H|4PPP}b)y?Ki0%QVr$CwqT_9u@I{b<)v=zOoSvD|$6x=$;a z2DKEiy!4)HnyHxDI`RO(+!Kez!CA|^m+k2+*$`$?#GAL+gVW63_STdeA28-4Q5MX;Siz)ph@X(vxk9MBoo9T-hV z6b_fxHf;MKQvg6QNAqo5HGi@J9L>**3M98fn-5KBE8m03QuRnt=7<$HZib}9gvc8D zcZ9@`zD1+~LK*bp_ZM?pJt3vCLOcy6Z2q_1$sZ3nI0-h`yl~<>{i&8HSfEE;ya>3a z4aoE81_f@n`@>k56u|0KKOXCiCU>6oiP5%rh<{ZyOaU|gThXNnld@#)aJFv}Wk->Q_U zG}}r0W}UFcX6D2q3aDg*^5dP3lP@6-EQ=m?+wHj0@ic_O??4Pldt&a%Wj&L~rW0pAew2Xg$hc!^ zC;X6R!>4yA=J|R7rh|`ZVM5t3@E=Ni)ni{x+Dw7Jro1x)TF{09l|zs|;n!cd_r@Sx z5!~(xcsEs{w>F#zYW;Nkjj??z* zwsATO2eaL_#G$(z%}ZM+kKBd-P9^;QPGsLuloi0>9@a+X`2Ox8YFW!MNtaXQXHDBFjl{0yfx`At8{9rg#EUU#F-Ra{VA%K{ec{RPUUPx zUwv>_STS#8vPWShQFeJtJ;MX_9!D*k;mqwPFE&U|5q~ua?%}KFnbygC^oQ)7RuzSM zkfEBuK^PU|nsE2hFR@y)9t8dYr#WYC=hsX{?5hu-vomE`vwjJCF#2KD%v8P{&T-4KeFv&3rA(+c@TF$T|(q%a?p zk<_@206b$I{=W5JK=$!i#cTE8%~jYWqz6ek08<9d!FMwPYg{7|C9~@{W~^qZVr2BU zPF}tG)20?FHcF!%HJDEmQUMhQ%Q75$4KjHzc)NhR--ui^q2+@0u>}!Q7;Vu&Zg4Nm zYWei2mZxE>*@Z$+^P46Lol4*fqE7u+aR@^>tr-2UUjRO>78xg3Y-p>Hi)+x@ZPheRcUEHo2a-KR7M`$mD3?}WiK<3-kC= zauSG#7v`cJDdkcaPRQ_Q=7(oLDUyc>JF%g(sG_#6-*9@j=NnY4c%}ax_odxC6QB`n zpthzZ*D+Bw4o8+ajeJ zgh0CKd^eLXWO12OAK!-ZM60n(!9Dru>71CObFy_jzqgUGU^NvI+(mR0&-*F3`8^fI z&oqOi=sP(1P02@@?#o&hGVxx=_*2E%fikG$%6Kvy{1mCCDJiBM?l;hG!eBk2tet+j z?(^~Q+h&q;i@uU{!|Hxoz17Ue%_40IGS_&wtaa2lJBKUc`s<#fc8l8&S*>VXuewr< zn7o^?px)iA+y?2|-*3Nl6B`n2TglhfrT@@7FG*s`52lTv4`9B(9s(OyiM0iCU0``B z=P}K*HD`H0{U($6QTtANX=pk2zB2Y{P3u|Isu{v$Pn!8|Fd{sVDpvaV*8C09}n*-zJkq@_-3MmM86^)LK{wFl+A z{^Mxg=5sSr;EnIG0jZ8FT%VC$63^h|0^_rDmgl(SIBFmtMOqv!?+DtUXPWBjl%^7B+l9{NdRNq!x_38nGQIRM%kd&HnH_ykSQ?h5 z_J0yXK@+I6mFSgT5F?|z^yCek8uY$!b|G;Cz>pgz+4wvE+mk@2^dnw1I^zr)axC z(~5vM(~(x#pn*i^KLKrgz{1Jx|)*f%PgUj6xb zgQN4&J#2NjL51$;Y^rSp$+gxC?qVy>T(NG-}!PMU|W<{N(6#PW_1$L;*l|H2-z zhGVFXiRU1Kr$$%xBV=jL#yY06N-oqu-TIV|Mn1QkTFs_*^_rL%=^S$r#-xQO`tcUDEmRg{Sj)QV}+6_0N{o9sF(D%Ha0 zOHn?05|!8I(9(Z`hz1Xu9j4C2LDlQZ`)coFkC3$%TaC_TIr0+( z#7YyvNmJ&#;2g|V?pnYWC#ZSMU`T?PP(z0~zOM`4_%oFFImGm-9gf*Z;0_<^U(zAQTyGRO)5?NJ)4``<5wmS6f%}W>sxoPZa5)v^*IPNa zf5;abEaN%Y(###lN?+Sfd&{!6EI;k36gIkRi>IPS`EZtY5ZIX_l)XyAcj;LhFpG`_HR+z_8=bugt>`A4 zS|vY)a=A7sb^K>0+Mw2+vk#O!^p?d&{;yRAd9Nl$#`?qTGPE-mpixTY6cQ&3`4MyS zHJ|XjLgk>aOIRjyXm!%0!}-x;{W}S(IIike^hX{m}sQ?=_`&y|EujE3z6f?+^>nqWd#_nxX<`M3isJA6 zGF)xUC|4vwB!^T=zE8-Lht*u?oDG6gVoo<({6F(_GZ&Yu)RaNd>d(J#^c|x)=NE_>o@{;pO3!a~cv&HM zTXVlrnCY5=La7B*kb!w+^A`$*i_bdzGQI-jRm@=r5^g}Gld14Jsu)TR&v|@#iSJ7B zLVPoHQ=FwI!rK5lMYwvS8HSaax2oa{Mt9|_q&27O^#ZtF^>S&9yAFo{e-qCDbRv4Q zGVdlTZy?QhknD5x+2ecug$B)ZPJtN`-^WNRgJ1D!5lapCiTD6$=KFRl{Dt35n9}ao^ zrW&y-L@U^D6X6_C~*Oy4|Hmo`G)Hl|!32{>_BhOfM_h_S3l}K3;HPCtu!jY zhMAZ~7aDMZg`lR)z1@__5~+^1b^`-gPjACK}&K;wKJi7 z>Km1JA^sVn)9GA!`>ZjfW=Cs_&q@+Le<=}Te#M&*%P<^Py?4HnnK{kjDRlwJkB6@7 zb;X3+x7lI~#WN!89JJ49%j-+jZCcMfk++dq+LhZ2C;L(EWK&ZZIIsBdcaV z|HK+8vAsxXThPa=b2#Y~5d8zn@bTdi!d&687xKb7Mvg|nt7tEm?%A<)r@~h4^cRUc zud}{4s?#ky!s`-@8xXMVKrg}mm$ak>CDcQ5RPq0NKqdAsX=zo1C-XkQ)5+$KeNFuR z)J2!ZhuYX*3>4DR{rF9(xoM(zwq%C7z&LHjE^S;aqT1p zdy56tzt2jc0B4M&q0I>I@hgGge?%(4Gs8y}cumH-g_IC16EGK~6ulcd`U0PfC@RfJ zOb4Knh-W^efO$*5bjFc&@l=C6ScqZd7z~01+sd*f8r2ZxXTX`K1HPCNxp@E38x2JO}CmdHgZ%C8?0%-RWhP>O~MtK**CD>c2NeuMy${`2#Q4}RhsP?E!iI)yl=oupBq;5S4{vu2;5Gy2+T(5iEiGNN z+|WiZNWi2eQlQ)aV9ow#a8JzL&C1b*ik<-$D-I)--K-rQBw_3r6}==sJCL0d$oJ0; zHc%C${~vq&v$rBx6QWDyX${NSvw}%YE-nxY*k%QYx2L0vx$D2GDLI<|-wUZ~O6jsn zyW82Bf*l-S))~E~m9;AsY;`iXfK_Iu(uTOW!dju?U9vJW?n7_>{p z1xp|NA9bpKBW|!Tc6(Q}_W2UjYtf4YN(x0|`a4k|3QU09fkO$V0Z4x-|K z-C_Cd8rD7#DiDZ@O-_=^K#G?xr7DT zxp~daI6#~hTo8ykJIEZ!!NbXCZpOpQ#mQ^V$HOjc^j`)No0-DF(@77bSG`db)h3PH zV?j)u{XmtZN6MUw2v|N3mW^#QaVEeSwd#X|OYuM||L-5CRR2E Date: Thu, 12 Sep 2024 12:39:48 +0800 Subject: [PATCH 7/8] updates weight tying --- models/experimental/weight_sharing.py | 95 ++++++++------------------- 1 file changed, 29 insertions(+), 66 deletions(-) diff --git a/models/experimental/weight_sharing.py b/models/experimental/weight_sharing.py index 3558080d..f27fb576 100644 --- a/models/experimental/weight_sharing.py +++ b/models/experimental/weight_sharing.py @@ -1,7 +1,5 @@ +import torch.nn as nn from models.core_models import GenericTransformer -import torch -from torch import nn -# params: k_interior_layers, lora_rank class LoRA(nn.Module): def __init__(self, linear_layer, lora_rank): @@ -14,7 +12,6 @@ def __init__(self, linear_layer, lora_rank): def forward(self, x): """Forward pass through the linear layer with LoRA""" - # compute the LoRA weight matrix return self.linear_layer(x) + self.V(self.U(x)) class SharedInteriorFFNLora(GenericTransformer): @@ -22,71 +19,37 @@ def __init__(self, model_cfg): super().__init__(model_cfg) self.k_interior_layers = model_cfg["k_interior_layers"] self.lora_rank = model_cfg["lora_rank"] - # share the weights between transformer blocks in layers 1+k_interior_layers to D-k_interior_layers - base_layer = 1 + self.k_interior_layers - ffn_0 = self.transformer.h[base_layer].ffn - shared_weights = {} - for name, module in ffn_0.named_modules(): - if isinstance(module, torch.nn.Linear): - shared_weights[name] = module.weight - for i in range(1 + self.k_interior_layers, len(self.transformer.h) - self.k_interior_layers): - for name, module in self.transformer.h[i].ffn.named_modules(): - if isinstance(module, torch.nn.Linear): + + self._apply_weight_sharing_and_lora( + start_layer=1 + self.k_interior_layers, + end_layer=len(self.transformer.h) - self.k_interior_layers, + module_name='ffn' + ) + + def _apply_weight_sharing_and_lora(self, start_layer: int, end_layer: int, module_name: str): + base_module = getattr(self.transformer.h[start_layer], module_name) + shared_weights = {name: module.weight for name, module in base_module.named_modules() if isinstance(module, nn.Linear)} + + for i in range(start_layer, end_layer): + target_module = getattr(self.transformer.h[i], module_name) + for name, module in target_module.named_modules(): + if isinstance(module, nn.Linear): module.weight = shared_weights[name] - # wrap the linear layer with LoRA if self.lora_rank is not None: - setattr(self.transformer.h[i].ffn, name, LoRA(module, self.lora_rank)) - - - - - - - + lora_module = LoRA(module, self.lora_rank) + setattr(target_module, name, lora_module) -# class GenericTransformer(torch.nn.Module): -# """ -# Generic Transformer Class intended to be used for as -# broad a range of transformer models as possible. -# """ -# def __init__(self, model_cfg): -# super().__init__() - -# # build the transformer -# self.transformer = torch.nn.ModuleDict( -# { -# "drop": torch.nn.Dropout(), -# "h": torch.nn.ModuleList( -# [ -# GenericTransformerBlock( -# hidden_dim=model_cfg["hidden_dim"], -# context_window=model_cfg["context_window"], -# use_rope=model_cfg["positional_encoding_type"] == "rope", -# ffn_cfg=model_cfg["core_model"]["ffn"], -# attn_cfg=model_cfg["core_model"]["attn"], -# ) -# for _ in range(model_cfg["core_model"]["num_layers"]) -# ] -# ), -# } -# ) - -# def forward(self, x): -# """ -# Pass an input through the model -# Args: -# x: torch.tensor(B, S, H) -# Returns: -# x: torch.tensor(B, S, H) -# """ - -# # apply dropout -# x = self.transformer.drop(x) - -# # pass through the transformer blocks -# for block in self.transformer.h: -# x = block(x) +class SharedInteriorFFNLoraAndCProj(SharedInteriorFFNLora): + def __init__(self, model_cfg): + super().__init__(model_cfg) -# return x \ No newline at end of file + # now strictly share the c_proj weights w/o lora + for i in range(1 + self.k_interior_layers, len(self.transformer.h) - self.k_interior_layers): + base_cproj = self.transformer.h[1 + self.k_interior_layers].attn.c_proj + shared_cproj_weights = {name: module.weight for name, module in base_cproj.named_modules() if isinstance(module, nn.Linear)} + target_cproj = self.transformer.h[i].attn.c_proj + for name, module in target_cproj.named_modules(): + if isinstance(module, nn.Linear): + module.weight = shared_cproj_weights[name] \ No newline at end of file From 5b8f8ad03eb65416f82fbf592c2f5b8a958fde78 Mon Sep 17 00:00:00 2001 From: Dylan Hillier Date: Thu, 12 Sep 2024 12:40:01 +0800 Subject: [PATCH 8/8] adds a new config that nice --- configs/full_configs/good_boi.yaml | 87 +++++++++++++++++++++++ configs/full_configs/shared_k_2_deep.yaml | 87 +++++++++++++++++++++++ configs/generate.yaml | 2 +- configs/generator/baseline.yaml | 5 +- 4 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 configs/full_configs/good_boi.yaml create mode 100644 configs/full_configs/shared_k_2_deep.yaml diff --git a/configs/full_configs/good_boi.yaml b/configs/full_configs/good_boi.yaml new file mode 100644 index 00000000..bdd954ec --- /dev/null +++ b/configs/full_configs/good_boi.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 2 + lora_rank: 64 + core_model: + core_model_type: weight_sharing + num_layers: 12 + ffn: + ffn_type: swiglu + ffn_dim: 1440 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: simple_en_wiki + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 512 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 150000 + lr_decay_iters: 150000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 10000 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: true + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "data" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/full_configs/shared_k_2_deep.yaml b/configs/full_configs/shared_k_2_deep.yaml new file mode 100644 index 00000000..d75c5a87 --- /dev/null +++ b/configs/full_configs/shared_k_2_deep.yaml @@ -0,0 +1,87 @@ +model: + k_interior_layers: 2 + lora_rank: null + core_model: + core_model_type: weight_sharing + num_layers: 12 + ffn: + ffn_type: swiglu + ffn_dim: 1440 + normalization: rms_norm + bias: false + attn: + attn_type: generic + num_heads: 16 + normalization: rms_norm + group_size: 4 + bias: false + is_causal: true + embedder: + tokenizer_type: gpt2 + embedding_model_type: generic + dataset_name: stlm + lm_head: + normalization: rms_norm + bias: false + lm_head_type: generic + hidden_dim: 544 + context_window: 512 + vocab_size: 50257 + model_shell_type: standard + embedding_weight_tying: true + positional_encoding_type: rope +trainer: + dropout_scheduler: + dropout_type: constant + dropout: 0 + dataset: openwebtext + training: + trainer_type: base_trainer + batch_size: 24 + gradient_accumulation_steps: 20 + max_iters: 30000 + lr_decay_iters: 30000 + warmup_iters: 5000 + eval_interval: 2000 + log_interval: 10 + eval_iters: 500 + checkpoint_interval: 1000000000.0 + run_profiler: false + eval: + - benchmarks: + - "winograd" + - "hellaswag" + - "arc" + - "mmlu" + - "blimp" + num_samples: 1000 + evaluator: "mcq" + - evaluator: "prog" + optimizer: + name: nanoGPTadamW + lr: 0.0006 + min_lr: 6.0e-05 + weight_decay: 0.1 + beta1: 0.9 + beta2: 0.95 + grad_clip: 1.0 + decay_lr: true + warmup_iters: 5000 + lr_scheduler: + name: cosine + dataloader: + name: standard + datasampling: + name: standard + loss_fn: + name: cross_entropy +general: + logging: + wandb_log: true + wandb_project: SuperTinyLanguageModels + paths: + output_dir: outputs + data_dir: "data" + checkpoint_dir: checkpoints + seed: 489 + device: cuda diff --git a/configs/generate.yaml b/configs/generate.yaml index 1a9cbf40..2d71d087 100644 --- a/configs/generate.yaml +++ b/configs/generate.yaml @@ -1,4 +1,4 @@ defaults: - generator: baseline -model_ckpt: "checkpoints/...pt" +model_ckpt: "outputs/2024-09-09/09-52-58/checkpoints/ckpt_149999.pt" diff --git a/configs/generator/baseline.yaml b/configs/generator/baseline.yaml index a62d72b7..5af4ea73 100644 --- a/configs/generator/baseline.yaml +++ b/configs/generator/baseline.yaml @@ -1,4 +1,5 @@ temperature: 0.8 -top_k: 10 +top_k: 200 max_new_tokens: 300 -input_text: "Earth is the third planet from the Sun and the only astronomical object known to harbor life. This is enabled by Earth being an ocean world, the only one in the Solar System sustaining liquid surface water." +# input_text: "Earth is the third planet from the Sun and the only astronomical object known to harbor life. This is enabled by Earth being an ocean world, the only one in the Solar System sustaining liquid surface water." +input_text: "Recipe for fish and chips:" \ No newline at end of file