From d14ea54b7a1e9d91ceecee49e0609084da1caae6 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 12:38:25 +0100 Subject: [PATCH 01/51] use dependency injection for press --- evaluation/evaluate.py | 4 +- kvpress/__init__.py | 41 ++++++------- kvpress/default_presses.py | 58 +++++++++++++++++++ kvpress/per_layer_compression_wrapper.py | 48 --------------- kvpress/pipeline.py | 12 ++-- .../{base_press.py => default_press.py} | 49 ++++------------ kvpress/presses/eager_attention_press.py | 32 ++++++++++ .../presses/per_layer_compression_press.py | 31 ++++++++++ kvpress/scorers/__init__.py | 2 + kvpress/scorers/base_scorer.py | 43 ++++++++++++++ .../expected_attention_scorer.py} | 4 +- .../knorm_scorer.py} | 4 +- .../observed_attention_scorer.py} | 21 +------ .../random_scorer.py} | 4 +- .../snapkv_scorer.py} | 5 +- .../streaming_llm_scorer.py} | 4 +- .../tova_press.py => scorers/tova_scorer.py} | 6 +- .../presses/test_observed_attention_press.py | 2 +- tests/presses/test_presses.py | 6 +- tests/test_per_layer_compression_wrapper.py | 40 ++----------- tests/test_press_call.py | 4 +- 21 files changed, 230 insertions(+), 190 deletions(-) create mode 100644 kvpress/default_presses.py delete mode 100644 kvpress/per_layer_compression_wrapper.py rename kvpress/presses/{base_press.py => default_press.py} (77%) create mode 100644 kvpress/presses/eager_attention_press.py create mode 100644 kvpress/presses/per_layer_compression_press.py create mode 100644 kvpress/scorers/__init__.py create mode 100644 kvpress/scorers/base_scorer.py rename kvpress/{presses/expected_attention_press.py => scorers/expected_attention_scorer.py} (98%) rename kvpress/{presses/knorm_press.py => scorers/knorm_scorer.py} (86%) rename kvpress/{presses/observed_attention_press.py => scorers/observed_attention_scorer.py} (60%) rename kvpress/{presses/random_press.py => scorers/random_scorer.py} (85%) rename kvpress/{presses/snapkv_press.py => scorers/snapkv_scorer.py} (97%) rename kvpress/{presses/streaming_llm_press.py => scorers/streaming_llm_scorer.py} (92%) rename kvpress/{presses/tova_press.py => scorers/tova_scorer.py} (95%) diff --git a/evaluation/evaluate.py b/evaluation/evaluate.py index b82018b2..27cd19cf 100644 --- a/evaluation/evaluate.py +++ b/evaluation/evaluate.py @@ -22,7 +22,7 @@ ObservedAttentionPress, RandomPress, SnapKVPress, - StreamingLLMPress, + StreamingLLMPress, ObservedAttentionScorer, ) logger = logging.getLogger(__name__) @@ -122,7 +122,7 @@ def evaluate( press.compression_ratio = compression_ratio # Initialize pipeline with the correct attention implementation - if isinstance(press, ObservedAttentionPress): + if isinstance(press.scorer, ObservedAttentionScorer): model_kwargs = {"attn_implementation": "eager"} else: try: diff --git a/kvpress/__init__.py b/kvpress/__init__.py index 2f1e0409..43d8c86f 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -2,26 +2,23 @@ # SPDX-License-Identifier: Apache-2.0 -from kvpress.per_layer_compression_wrapper import apply_per_layer_compression +from kvpress.default_presses import ( + ExpectedAttentionPress, + KnormPress, + ObservedAttentionPress, + RandomPress, + SnapKVPress, + StreamingLLMPress, + TOVAPress, +) from kvpress.pipeline import KVPressTextGenerationPipeline -from kvpress.presses.base_press import BasePress -from kvpress.presses.expected_attention_press import ExpectedAttentionPress -from kvpress.presses.knorm_press import KnormPress -from kvpress.presses.observed_attention_press import ObservedAttentionPress -from kvpress.presses.random_press import RandomPress -from kvpress.presses.snapkv_press import SnapKVPress -from kvpress.presses.streaming_llm_press import StreamingLLMPress -from kvpress.presses.tova_press import TOVAPress - -__all__ = [ - "BasePress", - "ExpectedAttentionPress", - "KnormPress", - "ObservedAttentionPress", - "RandomPress", - "SnapKVPress", - "StreamingLLMPress", - "TOVAPress", - "KVPressTextGenerationPipeline", - "apply_per_layer_compression", -] +from kvpress.presses.default_press import DefaultPress +from kvpress.presses.eager_attention_press import EagerAttentionPress +from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress +from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer +from kvpress.scorers.knorm_scorer import KnormScorer +from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer +from kvpress.scorers.random_scorer import RandomScorer +from kvpress.scorers.snapkv_scorer import SnapKVScorer +from kvpress.scorers.streaming_llm_scorer import StreamingLLMScorer +from kvpress.scorers.tova_scorer import TOVAScorer diff --git a/kvpress/default_presses.py b/kvpress/default_presses.py new file mode 100644 index 00000000..1f7a5536 --- /dev/null +++ b/kvpress/default_presses.py @@ -0,0 +1,58 @@ +from kvpress.presses.default_press import DefaultPress +from kvpress.presses.eager_attention_press import EagerAttentionPress +from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer +from kvpress.scorers.knorm_scorer import KnormScorer +from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer +from kvpress.scorers.random_scorer import RandomScorer +from kvpress.scorers.snapkv_scorer import SnapKVScorer +from kvpress.scorers.streaming_llm_scorer import StreamingLLMScorer +from kvpress.scorers.tova_scorer import TOVAScorer + + +def ExpectedAttentionPress( + compression_ratio: float = 0.0, + n_future_positions: int = 512, + n_sink: int = 4, + use_covariance: bool = True, + use_vnorm: bool = True, +): + return DefaultPress( + compression_ratio=compression_ratio, + scorer=ExpectedAttentionScorer( + n_future_positions=n_future_positions, n_sink=n_sink, use_covariance=use_covariance, use_vnorm=use_vnorm + ), + ) + + +def KnormPress( + compression_ratio: float = 0.0, +): + return DefaultPress(compression_ratio=compression_ratio, scorer=KnormScorer()) + + +def ObservedAttentionPress( + compression_ratio: float = 0.0, +): + return EagerAttentionPress(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) + + +def RandomPress(compression_ratio: float = 0.0): + return DefaultPress(compression_ratio=compression_ratio, scorer=RandomScorer()) + + +def SnapKVPress( + compression_ratio: float = 0.0, + window_size: int = 64, + kernel_size: int = 5, +): + return DefaultPress( + compression_ratio=compression_ratio, scorer=SnapKVScorer(window_size=window_size, kernel_size=kernel_size) + ) + + +def StreamingLLMPress(compression_ratio: float = 0.0, n_sink: int = 4): + return DefaultPress(compression_ratio=compression_ratio, scorer=StreamingLLMScorer(n_sink=n_sink)) + + +def TOVAPress(compression_ratio: float = 0.0, window_size: int = 1): + return DefaultPress(compression_ratio=compression_ratio, scorer=TOVAScorer(window_size=window_size)) diff --git a/kvpress/per_layer_compression_wrapper.py b/kvpress/per_layer_compression_wrapper.py deleted file mode 100644 index 95d8451a..00000000 --- a/kvpress/per_layer_compression_wrapper.py +++ /dev/null @@ -1,48 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -import logging -from typing import List - -import torch - -from kvpress.presses.base_press import BasePress - -logger = logging.getLogger(__name__) - - -def apply_per_layer_compression(press: BasePress, compression_ratios: List[float]) -> BasePress: - """ - Apply per-layer compression to a given press object. - This function wraps the forward hook of the press object to apply per-layer compression. - - Parameters - ---------- - press : BasePress - The press object to apply per-layer compression to. - compression_ratios : Dict[int, float] - - Returns - ------- - BasePress - The press object with per-layer compression applied. - """ - press.compression_ratios = compression_ratios # type: ignore[attr-defined] - press.compression_ratio = None - - logger.warning( - "Per layer compression wrapper is an experimental feature and only works with flash attention. " - "Please make sure that the model uses flash attention." - ) - - original_forward_hook = press.forward_hook - - def _forward_hook(module: torch.nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): - press.compression_ratio = press.compression_ratios[module.layer_idx] # type: ignore[attr-defined] - output = original_forward_hook(module, input, kwargs, output) - press.compression_ratio = None - return output - - press.forward_hook = _forward_hook # type: ignore[method-assign] - return press diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index 1ae45aef..79fda75a 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -7,12 +7,12 @@ from typing import Optional import torch -from transformers import AutoModelForCausalLM, Cache, DynamicCache, QuantizedCache, Pipeline +from transformers import AutoModelForCausalLM, Cache, DynamicCache, Pipeline, QuantizedCache from transformers.pipelines import PIPELINE_REGISTRY from transformers.pipelines.base import GenericTensor -from kvpress.presses.base_press import BasePress -from kvpress.presses.observed_attention_press import ObservedAttentionPress +from kvpress.default_presses import ObservedAttentionScorer +from kvpress.presses.default_press import DefaultPress logger = logging.getLogger(__name__) @@ -29,7 +29,7 @@ def _sanitize_parameters( question: Optional[str] = None, questions: Optional[list[str]] = None, answer_prefix: Optional[str] = None, - press: Optional[BasePress] = None, + press: Optional[DefaultPress] = None, max_new_tokens: int = 50, max_context_length: Optional[int] = None, cache: Optional[Cache] = None, @@ -133,7 +133,7 @@ def _forward( self, input_tensors: dict[str, GenericTensor], max_new_tokens: int = 50, - press: Optional[BasePress] = None, + press: Optional[DefaultPress] = None, cache: Optional[Cache] = None, ): """ @@ -167,7 +167,7 @@ def _forward( self.model( input_ids=context_ids, past_key_values=cache, - output_attentions=isinstance(press, ObservedAttentionPress), + output_attentions=isinstance(press.scorer, ObservedAttentionScorer), num_logits_to_keep=1, ) diff --git a/kvpress/presses/base_press.py b/kvpress/presses/default_press.py similarity index 77% rename from kvpress/presses/base_press.py rename to kvpress/presses/default_press.py index 553187aa..37c3b94d 100644 --- a/kvpress/presses/base_press.py +++ b/kvpress/presses/default_press.py @@ -4,6 +4,7 @@ import logging from contextlib import contextmanager +from dataclasses import dataclass from typing import Generator import torch @@ -13,14 +14,17 @@ MistralForCausalLM, Phi3ForCausalLM, PreTrainedModel, - Qwen2ForCausalLM, QuantizedCache, + Qwen2ForCausalLM, ) +from kvpress.scorers.base_scorer import BasesScorer + logger = logging.getLogger(__name__) -class BasePress: +@dataclass +class DefaultPress: """Base class for pruning methods. Each pruning method should implement a `score` method that computes the scores for each KV pair in a layer. This score is used to prune the KV pairs with the lowest scores in the `hook` method @@ -28,42 +32,11 @@ class BasePress: The press can be applied to a model by calling it with the model as an argument. """ - def __init__(self, compression_ratio: float = 0.0): - self.compression_ratio = compression_ratio - assert 0 <= compression_ratio < 1, "Compression ratio must be between 0 and 1" - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - """Compute the scores for each KV pair in the layer. + scorer: BasesScorer + compression_ratio: float = 0.0 - Parameters - ---------- - module : - Transformer layer, see `hook` method for more details. - hidden_states : - Hidden states of the layer. - keys : - Keys of the cache. Note keys are after RoPE. - values : - Values of the cache. - attentions : - Attention weights of the layer. - kwargs : - Keyword arguments, as given to the forward pass of the layer. - - Returns - ------- - Scores for each KV pair in the layer, shape keys.shape[:-1]. - - """ - raise NotImplementedError + def __post_init__(self): + assert 0 <= self.compression_ratio < 1, "Compression ratio must be between 0 and 1" def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): """Cache compression hook called after the forward pass of a decoder layer. @@ -107,7 +80,7 @@ def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dic values = cache.value_cache[module.layer_idx] with torch.no_grad(): - scores = self.score(module, hidden_states, keys, values, attentions, kwargs) + scores = self.scorer.score(module, hidden_states, keys, values, attentions, kwargs) # Prune KV pairs with the lowest scores n_kept = int(q_len * (1 - self.compression_ratio)) diff --git a/kvpress/presses/eager_attention_press.py b/kvpress/presses/eager_attention_press.py new file mode 100644 index 00000000..e9a00e8a --- /dev/null +++ b/kvpress/presses/eager_attention_press.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + +from dataclasses import dataclass + +import torch +from torch import nn +from transformers.utils import logging + +from kvpress.presses.default_press import DefaultPress + +logger = logging.get_logger(__name__) + + +@dataclass +class EagerAttentionPress(DefaultPress): + """ + This press is used when eager attention is used in the model (i.e. the attention is materialized). + It is used to calculate the observed attention score. + """ + + def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): + # attentions are needed as input for the hook, but unless the user wants to return them in the output, + # we can remove them to save memory + output = super().forward_hook(module, input, kwargs, output) + logger.warning_once("Model will not return attentions in its output to save memory. ") + output = list(output) + output[-2] = None + output = tuple(output) + + return output diff --git a/kvpress/presses/per_layer_compression_press.py b/kvpress/presses/per_layer_compression_press.py new file mode 100644 index 00000000..596e6bef --- /dev/null +++ b/kvpress/presses/per_layer_compression_press.py @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + +import logging +from dataclasses import dataclass +from typing import List + +import torch +from torch import nn + +from kvpress.presses.default_press import DefaultPress + +logger = logging.getLogger(__name__) + + +@dataclass +class PerLayerCompressionPress(DefaultPress): + compression_ratios: List[float] = None + + def __post_init__(self): + super().__post_init__() + logger.warning( + "Per layer compression wrapper is an experimental feature and only works with flash attention. " + "Please make sure that the model uses flash attention." + ) + assert self.compression_ratios is not None, "Please provide a list of compression ratios for each layer." + + def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): + self.compression_ratio = self.compression_ratios[module.layer_idx] + return super().forward_hook(module, input, kwargs, output) diff --git a/kvpress/scorers/__init__.py b/kvpress/scorers/__init__.py new file mode 100644 index 00000000..299764fc --- /dev/null +++ b/kvpress/scorers/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 diff --git a/kvpress/scorers/base_scorer.py b/kvpress/scorers/base_scorer.py new file mode 100644 index 00000000..ae257ecd --- /dev/null +++ b/kvpress/scorers/base_scorer.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + +import torch +from torch import nn + + +class BasesScorer: + """Base class for scorers""" + + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + """Compute the scores for each KV pair in the layer. + + Parameters + ---------- + module : + Transformer layer, see `hook` method for more details. + hidden_states : + Hidden states of the layer. + keys : + Keys of the cache. Note keys are after RoPE. + values : + Values of the cache. + attentions : + Attention weights of the layer. + kwargs : + Keyword arguments, as given to the forward pass of the layer. + + Returns + ------- + Scores for each KV pair in the layer, shape keys.shape[:-1]. + + """ + raise NotImplementedError diff --git a/kvpress/presses/expected_attention_press.py b/kvpress/scorers/expected_attention_scorer.py similarity index 98% rename from kvpress/presses/expected_attention_press.py rename to kvpress/scorers/expected_attention_scorer.py index f1a4bdea..70f4a738 100644 --- a/kvpress/presses/expected_attention_press.py +++ b/kvpress/scorers/expected_attention_scorer.py @@ -11,11 +11,11 @@ from torch import nn from transformers.models.llama.modeling_llama import repeat_kv -from kvpress.presses.base_press import BasePress +from kvpress.scorers.base_scorer import BasesScorer @dataclass -class ExpectedAttentionPress(BasePress): +class ExpectedAttentionScorer(BasesScorer): """ Compute scores based on the expected attention on next positions. To do so 1. Compute the mean and covariance matrix of the queries before RoPE. diff --git a/kvpress/presses/knorm_press.py b/kvpress/scorers/knorm_scorer.py similarity index 86% rename from kvpress/presses/knorm_press.py rename to kvpress/scorers/knorm_scorer.py index 920f96d8..bba14a1a 100644 --- a/kvpress/presses/knorm_press.py +++ b/kvpress/scorers/knorm_scorer.py @@ -5,10 +5,10 @@ import torch from torch import nn -from kvpress.presses.base_press import BasePress +from kvpress.scorers.base_scorer import BasesScorer -class KnormPress(BasePress): +class KnormScorer(BasesScorer): """Prune KV pairs with highest L2 norm of keys (https://arxiv.org/pdf/2406.11430)""" def score( diff --git a/kvpress/presses/observed_attention_press.py b/kvpress/scorers/observed_attention_scorer.py similarity index 60% rename from kvpress/presses/observed_attention_press.py rename to kvpress/scorers/observed_attention_scorer.py index 26533ad4..730738a9 100644 --- a/kvpress/presses/observed_attention_press.py +++ b/kvpress/scorers/observed_attention_scorer.py @@ -8,20 +8,19 @@ from torch import nn from transformers.utils import logging -from kvpress.presses.base_press import BasePress +from kvpress.scorers.base_scorer import BasesScorer logger = logging.get_logger(__name__) @dataclass -class ObservedAttentionPress(BasePress): +class ObservedAttentionScorer(BasesScorer): """The observed attention score is defined as the average attention weight over all prompt tokens Requires output_attentions=True and attn_implementation="eager" to have access to attentions This approach is related to H2O (https://arxiv.org/abs/2306.14048). """ compression_ratio: float = 0.0 - output_attentions: bool = False def score( self, @@ -39,19 +38,3 @@ def score( scores = scores / n_tokens_in_sum scores = scores.view(bsz, num_key_value_heads, -1, n_tokens).mean(2) return scores - - def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): - output = super().forward_hook(module, input, kwargs, output) - - # attentions are needed as input for the hook, but unless the user wants to return them in the output, - # we can remove them to save memory - if not self.output_attentions: - logger.warning_once( - "Model will not return attentions in its output to save memory. " - "Set output_attentions=True in ObservedAttentionPress to return attentions." - ) - output = list(output) - output[-2] = None - output = tuple(output) - - return output diff --git a/kvpress/presses/random_press.py b/kvpress/scorers/random_scorer.py similarity index 85% rename from kvpress/presses/random_press.py rename to kvpress/scorers/random_scorer.py index 9956c6ee..b0b38681 100644 --- a/kvpress/presses/random_press.py +++ b/kvpress/scorers/random_scorer.py @@ -5,10 +5,10 @@ import torch from torch import nn -from kvpress.presses.base_press import BasePress +from kvpress.scorers.base_scorer import BasesScorer -class RandomPress(BasePress): +class RandomScorer(BasesScorer): """Randomly prune KV pairs""" def score( diff --git a/kvpress/presses/snapkv_press.py b/kvpress/scorers/snapkv_scorer.py similarity index 97% rename from kvpress/presses/snapkv_press.py rename to kvpress/scorers/snapkv_scorer.py index 7d450475..9eeb767c 100644 --- a/kvpress/presses/snapkv_press.py +++ b/kvpress/scorers/snapkv_scorer.py @@ -11,18 +11,17 @@ from torch import nn from transformers.models.llama.modeling_llama import repeat_kv, rotate_half -from kvpress.presses.base_press import BasePress +from kvpress.scorers.base_scorer import BasesScorer @dataclass -class SnapKVPress(BasePress): +class SnapKVScorer(BasesScorer): """ SnapKV (https://arxiv.org/abs/2404.14469) use the attention of the latest window_size tokens to estimate the importance of the previous KV pairs. We use the default settings from: https://github.com/FasterDecoding/SnapKV/blob/main/snapkv/monkeypatch/snapkv_utils.py#L24 """ - compression_ratio: float = 0.0 window_size: int = 64 kernel_size: int = 5 diff --git a/kvpress/presses/streaming_llm_press.py b/kvpress/scorers/streaming_llm_scorer.py similarity index 92% rename from kvpress/presses/streaming_llm_press.py rename to kvpress/scorers/streaming_llm_scorer.py index ab6af16b..7f32321d 100644 --- a/kvpress/presses/streaming_llm_press.py +++ b/kvpress/scorers/streaming_llm_scorer.py @@ -7,11 +7,11 @@ import torch from torch import nn -from kvpress.presses.base_press import BasePress +from kvpress.scorers.base_scorer import BasesScorer @dataclass -class StreamingLLMPress(BasePress): +class StreamingLLMScorer(BasesScorer): """ Prune a fixed number of KV pairs at the beginning and end of the sequence (https://arxiv.org/abs/2309.17453) We keep the first n_sink tokens and the last n_local tokens. diff --git a/kvpress/presses/tova_press.py b/kvpress/scorers/tova_scorer.py similarity index 95% rename from kvpress/presses/tova_press.py rename to kvpress/scorers/tova_scorer.py index 0addcd95..366b3539 100644 --- a/kvpress/presses/tova_press.py +++ b/kvpress/scorers/tova_scorer.py @@ -4,14 +4,14 @@ from dataclasses import dataclass import torch -from torch import nn import torch.nn.functional as F +from torch import nn -from kvpress.presses.snapkv_press import SnapKVPress +from kvpress.scorers.snapkv_scorer import SnapKVScorer @dataclass -class TOVAPress(SnapKVPress): +class TOVAScorer(SnapKVScorer): """ TOVA (https://arxiv.org/abs/2401.06104) use the attention of the last token averaged across heads to estimate the importance of the previous KV pairs. This press was reviewed by Michael Hassid, diff --git a/tests/presses/test_observed_attention_press.py b/tests/presses/test_observed_attention_press.py index 7310a97c..f68920ed 100644 --- a/tests/presses/test_observed_attention_press.py +++ b/tests/presses/test_observed_attention_press.py @@ -7,7 +7,7 @@ import torch from transformers import DynamicCache -from kvpress import ObservedAttentionPress +from kvpress.default_presses import ObservedAttentionPress from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index ba450160..ee881678 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -6,8 +6,8 @@ from torch import nn from transformers import DynamicCache -from kvpress import ( - BasePress, +from kvpress.default_presses import ( + DefaultPress, ExpectedAttentionPress, KnormPress, ObservedAttentionPress, @@ -39,7 +39,7 @@ def test_presses_run_observed_attention(unit_test_model_output_attention): # no unit_test_model_output_attention(input_ids, past_key_values=DynamicCache()).past_key_values -class StoreKnormPress(BasePress): +class StoreKnormPress(DefaultPress): def __init__(self, compression_ratio: float = 0.0) -> None: super().__init__(compression_ratio=compression_ratio) diff --git a/tests/test_per_layer_compression_wrapper.py b/tests/test_per_layer_compression_wrapper.py index f68808eb..9cbd6a79 100644 --- a/tests/test_per_layer_compression_wrapper.py +++ b/tests/test_per_layer_compression_wrapper.py @@ -2,47 +2,17 @@ # SPDX-License-Identifier: Apache-2.0 -from dataclasses import dataclass, field - import torch -from torch import nn from transformers import DynamicCache -from kvpress import KnormPress, apply_per_layer_compression +from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress +from kvpress.scorers.knorm_scorer import KnormScorer from tests.fixtures import kv_press_pipeline, unit_test_model # noqa: F401 -@dataclass -class RecordCompressionKnormPress(KnormPress): - compression_ratio: float = 0 - recorded_compression_ratios: list[float] = field(default_factory=list) - - def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): - self.recorded_compression_ratios.append(self.compression_ratio) - return super().forward_hook(module, input, kwargs, output) - - -def test_presses_run(kv_press_pipeline): # noqa: F811 - press = RecordCompressionKnormPress(compression_ratio=0) - compression_ratios = [0.1, 0.2] - wrapped_press = apply_per_layer_compression(press, compression_ratios) - assert press.compression_ratio is None - - context = "This is a test article. It was written on 2022-01-01." - questions = ["When was this article written?"] - answers = kv_press_pipeline(context, questions=questions, press=wrapped_press)["answers"] - - assert len(answers) == 1 - assert isinstance(answers[0], str) - - assert press.recorded_compression_ratios == compression_ratios - - -def test_compression_rate_1(unit_test_model): # noqa: F811 - press = RecordCompressionKnormPress(compression_ratio=0) - compression_ratios = [0.1, 1] - wrapped_press = apply_per_layer_compression(press, compression_ratios) - with wrapped_press(unit_test_model): +def test_per_layer_compression_press(unit_test_model): # noqa: F811 + press = PerLayerCompressionPress(compression_ratios=[0.1, 1], scorer=KnormScorer()) + with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 0931cc36..a6c24488 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -4,12 +4,12 @@ from transformers import DynamicCache -from kvpress import BasePress, KnormPress +from kvpress import DefaultPress, KnormPress from tests.fixtures import unit_test_model # noqa: F401 def test_context_manager_adds_and_removes_hook(unit_test_model): # noqa: F811 - press = BasePress() + press = DefaultPress() with press(unit_test_model): for layer in unit_test_model.model.layers: From 1054ac25cd64f781a44a4b5d6551e347f37c9195 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 12:53:23 +0100 Subject: [PATCH 02/51] rename press-> pruner class --- README.md | 18 ++++++++++++++++++ evaluation/evaluate.py | 3 ++- kvpress/__init__.py | 6 +++--- kvpress/default_presses.py | 18 +++++++++--------- kvpress/pipeline.py | 6 +++--- kvpress/{presses => prunners}/__init__.py | 0 .../default_pruner.py} | 2 +- .../eager_attention_pruner.py} | 4 ++-- .../per_layer_compression_pruner.py} | 4 ++-- tests/assets/qa_dataset.csv | 4 ++-- tests/presses/test_presses.py | 6 +++--- tests/test_per_layer_compression_wrapper.py | 4 ++-- tests/test_press_call.py | 4 ++-- 13 files changed, 49 insertions(+), 30 deletions(-) rename kvpress/{presses => prunners}/__init__.py (100%) rename kvpress/{presses/default_press.py => prunners/default_pruner.py} (99%) rename kvpress/{presses/eager_attention_press.py => prunners/eager_attention_pruner.py} (90%) rename kvpress/{presses/per_layer_compression_press.py => prunners/per_layer_compression_pruner.py} (90%) diff --git a/README.md b/README.md index b72ec054..1c27d380 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,24 @@ All current presses are training free. We provide the following presses associat For a detailed list of existing KV cache compression methods, check [Awesome-KV-Cache-Compression](https://github.com/October2001/Awesome-KV-Cache-Compression) or [Awesome-LLM-Compression](https://github.com/HuangOwen/Awesome-LLM-Compression?tab=readme-ov-file#kv-cache-compression) +## Customization + +Each press is composed of two main components, the scorer class that identifies important tokens and a pruner class that implements the pruning strategy. +As an example, it is possible to initialize `ExpectedAttentionPress` as follows: + +```python +from kvpress import DefaultPruner, ExpectedAttentionScorer + +press = DefaultPruner(compression_ratio=0.1, scorer=ExpectedAttentionScorer()) +``` + +This allows for easy customization of the press behavior. +Currently, the following pruning strategies are available: +- `DefaultPruner`: Prunes the least important key-value pairs based on the score computed by the scorer. +- `PerLayerCompressionPruner`: Same as DefaultPruner, but it is possible to specify a different compression ratio for each layer. +- `EagerAttentionPruner`: This class is used in conjunction with `ObservedAttentionPress` for better memory management (attention matrix will be deleted after computing the score). + + ## Evaluation See the [speed_and_memory.ipynb](notebooks/speed_and_memory.ipynb) notebook on how to measure peak memory usage and total time gain. diff --git a/evaluation/evaluate.py b/evaluation/evaluate.py index 27cd19cf..21d1d528 100644 --- a/evaluation/evaluate.py +++ b/evaluation/evaluate.py @@ -20,9 +20,10 @@ ExpectedAttentionPress, KnormPress, ObservedAttentionPress, + ObservedAttentionScorer, RandomPress, SnapKVPress, - StreamingLLMPress, ObservedAttentionScorer, + StreamingLLMPress, ) logger = logging.getLogger(__name__) diff --git a/kvpress/__init__.py b/kvpress/__init__.py index 43d8c86f..55575be7 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -12,9 +12,9 @@ TOVAPress, ) from kvpress.pipeline import KVPressTextGenerationPipeline -from kvpress.presses.default_press import DefaultPress -from kvpress.presses.eager_attention_press import EagerAttentionPress -from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress +from kvpress.prunners.default_pruner import DefaultPruner +from kvpress.prunners.eager_attention_pruner import EagerAttentionPruner +from kvpress.prunners.per_layer_compression_pruner import PerLayerCompressionPruner from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer from kvpress.scorers.knorm_scorer import KnormScorer from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer diff --git a/kvpress/default_presses.py b/kvpress/default_presses.py index 1f7a5536..3242d3b3 100644 --- a/kvpress/default_presses.py +++ b/kvpress/default_presses.py @@ -1,5 +1,5 @@ -from kvpress.presses.default_press import DefaultPress -from kvpress.presses.eager_attention_press import EagerAttentionPress +from kvpress.prunners.default_pruner import DefaultPruner +from kvpress.prunners.eager_attention_pruner import EagerAttentionPruner from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer from kvpress.scorers.knorm_scorer import KnormScorer from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer @@ -16,7 +16,7 @@ def ExpectedAttentionPress( use_covariance: bool = True, use_vnorm: bool = True, ): - return DefaultPress( + return DefaultPruner( compression_ratio=compression_ratio, scorer=ExpectedAttentionScorer( n_future_positions=n_future_positions, n_sink=n_sink, use_covariance=use_covariance, use_vnorm=use_vnorm @@ -27,17 +27,17 @@ def ExpectedAttentionPress( def KnormPress( compression_ratio: float = 0.0, ): - return DefaultPress(compression_ratio=compression_ratio, scorer=KnormScorer()) + return DefaultPruner(compression_ratio=compression_ratio, scorer=KnormScorer()) def ObservedAttentionPress( compression_ratio: float = 0.0, ): - return EagerAttentionPress(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) + return EagerAttentionPruner(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) def RandomPress(compression_ratio: float = 0.0): - return DefaultPress(compression_ratio=compression_ratio, scorer=RandomScorer()) + return DefaultPruner(compression_ratio=compression_ratio, scorer=RandomScorer()) def SnapKVPress( @@ -45,14 +45,14 @@ def SnapKVPress( window_size: int = 64, kernel_size: int = 5, ): - return DefaultPress( + return DefaultPruner( compression_ratio=compression_ratio, scorer=SnapKVScorer(window_size=window_size, kernel_size=kernel_size) ) def StreamingLLMPress(compression_ratio: float = 0.0, n_sink: int = 4): - return DefaultPress(compression_ratio=compression_ratio, scorer=StreamingLLMScorer(n_sink=n_sink)) + return DefaultPruner(compression_ratio=compression_ratio, scorer=StreamingLLMScorer(n_sink=n_sink)) def TOVAPress(compression_ratio: float = 0.0, window_size: int = 1): - return DefaultPress(compression_ratio=compression_ratio, scorer=TOVAScorer(window_size=window_size)) + return DefaultPruner(compression_ratio=compression_ratio, scorer=TOVAScorer(window_size=window_size)) diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index 79fda75a..4ede85fa 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -12,7 +12,7 @@ from transformers.pipelines.base import GenericTensor from kvpress.default_presses import ObservedAttentionScorer -from kvpress.presses.default_press import DefaultPress +from kvpress.prunners.default_pruner import DefaultPruner logger = logging.getLogger(__name__) @@ -29,7 +29,7 @@ def _sanitize_parameters( question: Optional[str] = None, questions: Optional[list[str]] = None, answer_prefix: Optional[str] = None, - press: Optional[DefaultPress] = None, + press: Optional[DefaultPruner] = None, max_new_tokens: int = 50, max_context_length: Optional[int] = None, cache: Optional[Cache] = None, @@ -133,7 +133,7 @@ def _forward( self, input_tensors: dict[str, GenericTensor], max_new_tokens: int = 50, - press: Optional[DefaultPress] = None, + press: Optional[DefaultPruner] = None, cache: Optional[Cache] = None, ): """ diff --git a/kvpress/presses/__init__.py b/kvpress/prunners/__init__.py similarity index 100% rename from kvpress/presses/__init__.py rename to kvpress/prunners/__init__.py diff --git a/kvpress/presses/default_press.py b/kvpress/prunners/default_pruner.py similarity index 99% rename from kvpress/presses/default_press.py rename to kvpress/prunners/default_pruner.py index 37c3b94d..7caa5c99 100644 --- a/kvpress/presses/default_press.py +++ b/kvpress/prunners/default_pruner.py @@ -24,7 +24,7 @@ @dataclass -class DefaultPress: +class DefaultPruner: """Base class for pruning methods. Each pruning method should implement a `score` method that computes the scores for each KV pair in a layer. This score is used to prune the KV pairs with the lowest scores in the `hook` method diff --git a/kvpress/presses/eager_attention_press.py b/kvpress/prunners/eager_attention_pruner.py similarity index 90% rename from kvpress/presses/eager_attention_press.py rename to kvpress/prunners/eager_attention_pruner.py index e9a00e8a..60a73478 100644 --- a/kvpress/presses/eager_attention_press.py +++ b/kvpress/prunners/eager_attention_pruner.py @@ -8,13 +8,13 @@ from torch import nn from transformers.utils import logging -from kvpress.presses.default_press import DefaultPress +from kvpress.prunners.default_pruner import DefaultPruner logger = logging.get_logger(__name__) @dataclass -class EagerAttentionPress(DefaultPress): +class EagerAttentionPruner(DefaultPruner): """ This press is used when eager attention is used in the model (i.e. the attention is materialized). It is used to calculate the observed attention score. diff --git a/kvpress/presses/per_layer_compression_press.py b/kvpress/prunners/per_layer_compression_pruner.py similarity index 90% rename from kvpress/presses/per_layer_compression_press.py rename to kvpress/prunners/per_layer_compression_pruner.py index 596e6bef..8ac31043 100644 --- a/kvpress/presses/per_layer_compression_press.py +++ b/kvpress/prunners/per_layer_compression_pruner.py @@ -9,13 +9,13 @@ import torch from torch import nn -from kvpress.presses.default_press import DefaultPress +from kvpress.prunners.default_pruner import DefaultPruner logger = logging.getLogger(__name__) @dataclass -class PerLayerCompressionPress(DefaultPress): +class PerLayerCompressionPruner(DefaultPruner): compression_ratios: List[float] = None def __post_init__(self): diff --git a/tests/assets/qa_dataset.csv b/tests/assets/qa_dataset.csv index 0bee4dec..0702747b 100644 --- a/tests/assets/qa_dataset.csv +++ b/tests/assets/qa_dataset.csv @@ -758,7 +758,7 @@ Step 3: Clean the object Before placing the object on the keyboard, clean it so it doesn't leave any dirt or debris on the keys. Step 4: Position the object carefully -Carefully place the object exactly over the key that needs to be held down. Make sure that it only presses the desired key and doesn't accidentally press any of the adjacent keys. +Carefully place the object exactly over the key that needs to be held down. Make sure that it only prunners the desired key and doesn't accidentally press any of the adjacent keys. Step 5: Test the result Once the object is placed correctly over the key, check to see if the key is being held down successfully. If it's not pressed down enough or it's pressing other keys, reposition the object accordingly. @@ -1820,7 +1820,7 @@ Answer:","1. Laouni Mouhid is La Fouine's real name. 7. Owns record label Banlieue Sale Music. 8. Owns clothing line named Street Swagg. 9. Established figure in French rap scene." -"I am a movie director and I just received the following movie plot. Could you help me answer this question? If not, let me know by writing ""Not answerable"". Plot title: Practical Magic Movie plot: When Maria, the witch ancestor of our protagonists, realizes that her lover is never going to come for her, she casts a spell on herself to never fall in love again. Unfortunately, the spell goes awry and becomes a family curse: any man that falls for an Owens woman will die. And that's exactly what happens to Sally (Sandra Bullock) and Gillian (Nicole Kidman) Owens' father, causing their mother to die of a broken heart. The young girls then live with their two aunts (Stockard Channing, Diane Wiest), who teach them the ways of being a witch and how to deal with the ridicule that comes with the family profession. But one night when they witness their aunts casting a love spell for a neighbor, Sally decides she will never fall in love and dreams up a man that will never exist...Until one day she goes to town with her aunts and she meets the man she falls for. The next thing you know, Sally is happily married to Michael (Mark Feuerstein) with two daughters of her very own. Her sister, in the mean time, has been living in Florida where life is constant parties.But when the 'death watch beetle' sounds, Sally know it is only a matter of time before she loses Michael like her mother lost her father...and like all the Owens women have lost the men they love. It is only when the curse plays out that she learns her aunts cast the spell on her to fall for him in the first place. She allows her daughters to live with the aunts who raised her, telling them that her daughters are to never do magic.With Michael's tragic death, the sisters reunite and it's Gillian who presses Sally to forgive herself and move on. But tragedy strikes twice when the sisters again reunite, this time when Gilly calls because her boyfriend, Jimmy (Goran Visnjic), begins beating her. It is his accidental death that makes them toy with nature; hoping to bring him back so they won't be arrested. They succeed, but are forced to actually kill him this time when he tries to strangle Gilly.Jimmy, however, is haunting them. And the aunts leave when the... My question: What did Gary fall in love with? +"I am a movie director and I just received the following movie plot. Could you help me answer this question? If not, let me know by writing ""Not answerable"". Plot title: Practical Magic Movie plot: When Maria, the witch ancestor of our protagonists, realizes that her lover is never going to come for her, she casts a spell on herself to never fall in love again. Unfortunately, the spell goes awry and becomes a family curse: any man that falls for an Owens woman will die. And that's exactly what happens to Sally (Sandra Bullock) and Gillian (Nicole Kidman) Owens' father, causing their mother to die of a broken heart. The young girls then live with their two aunts (Stockard Channing, Diane Wiest), who teach them the ways of being a witch and how to deal with the ridicule that comes with the family profession. But one night when they witness their aunts casting a love spell for a neighbor, Sally decides she will never fall in love and dreams up a man that will never exist...Until one day she goes to town with her aunts and she meets the man she falls for. The next thing you know, Sally is happily married to Michael (Mark Feuerstein) with two daughters of her very own. Her sister, in the mean time, has been living in Florida where life is constant parties.But when the 'death watch beetle' sounds, Sally know it is only a matter of time before she loses Michael like her mother lost her father...and like all the Owens women have lost the men they love. It is only when the curse plays out that she learns her aunts cast the spell on her to fall for him in the first place. She allows her daughters to live with the aunts who raised her, telling them that her daughters are to never do magic.With Michael's tragic death, the sisters reunite and it's Gillian who prunners Sally to forgive herself and move on. But tragedy strikes twice when the sisters again reunite, this time when Gilly calls because her boyfriend, Jimmy (Goran Visnjic), begins beating her. It is his accidental death that makes them toy with nature; hoping to bring him back so they won't be arrested. They succeed, but are forced to actually kill him this time when he tries to strangle Gilly.Jimmy, however, is haunting them. And the aunts leave when the... My question: What did Gary fall in love with? Answer:",Not answerable. "Question: Extract the answer to the following question from the movie plot. If the question isn't answerable, please output ""Can't answer"". Question: What type of animal did he find buried alive? Title: Antichrist Movie plot: Prologue[edit] A couple makes passionate love, as their toddler, Nic, climbs up to the bedroom window and falls to his death. Chapter One: Grief[edit] The mother collapses at the funeral, and spends the next month in the hospital crippled with atypical grief. The father, a therapist, is skeptical of the psychiatric care she is receiving and takes it upon himself to treat her personally with psychotherapy. But it is not successful, and so when she reveals that her second greatest fear is nature, he decides to try exposure therapy. They hike to their isolated cabin in a woods called Eden, where she spent time with Nic the previous summer while writing a thesis on gynocide. He encounters a doe which shows no fear of him, and has a stillborn fawn hanging halfway out of her. Chapter Two: Pain (Chaos Reigns)[edit] During sessions of psychotherapy, she becomes increasingly grief stricken and manic, often demanding forceful sex to escape the pain. The area becomes increasingly sinister to the man, including acorns rapidly pelting the metal roof, awakening with a hand covered in swollen ticks, and finding a self-disemboweling fox that tells him, ""chaos reigns."" Chapter Three: Despair (Gynocide)[edit] In the dark attic the man finds the woman’s thesis studies: terrifying pictures of witch-hunts, and a scrapbook in which her writing becomes increasingly frantic and illegible. She reveals that while writing her thesis, she came to believe that all women are inherently evil. The man is repulsed by this and reproaches her for buying into the gynocidal beliefs she had originally set out to criticize. In a frenzied moment, they have violent intercourse at the base of an ominous dead tree, where bodies are intertwined within the exposed roots. He suspects that Satan is her greatest, and hidden fear. Through the autopsy and old photos, he becomes aware that she had been systematically putting Nic’s shoes on the wrong feet, resulting in pain and deformity. She attacks him, accuses him of planning to leave her, mounts him,... Answer:",Can't answer diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index ee881678..506a458e 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -7,7 +7,7 @@ from transformers import DynamicCache from kvpress.default_presses import ( - DefaultPress, + DefaultPruner, ExpectedAttentionPress, KnormPress, ObservedAttentionPress, @@ -39,7 +39,7 @@ def test_presses_run_observed_attention(unit_test_model_output_attention): # no unit_test_model_output_attention(input_ids, past_key_values=DynamicCache()).past_key_values -class StoreKnormPress(DefaultPress): +class StoreKnormPruner(DefaultPruner): def __init__(self, compression_ratio: float = 0.0) -> None: super().__init__(compression_ratio=compression_ratio) @@ -65,7 +65,7 @@ def test_presses_keep_highest_score(unit_test_model): # noqa: F811 Test that kept keys are those with the highest score """ for compresion_ratio in [0.0, 0.2, 0.4, 0.6, 0.8]: - press = StoreKnormPress(compression_ratio=compresion_ratio) + press = StoreKnormPruner(compression_ratio=compresion_ratio) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values diff --git a/tests/test_per_layer_compression_wrapper.py b/tests/test_per_layer_compression_wrapper.py index 9cbd6a79..70f31ac3 100644 --- a/tests/test_per_layer_compression_wrapper.py +++ b/tests/test_per_layer_compression_wrapper.py @@ -5,13 +5,13 @@ import torch from transformers import DynamicCache -from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress +from kvpress.prunners.per_layer_compression_pruner import PerLayerCompressionPruner from kvpress.scorers.knorm_scorer import KnormScorer from tests.fixtures import kv_press_pipeline, unit_test_model # noqa: F401 def test_per_layer_compression_press(unit_test_model): # noqa: F811 - press = PerLayerCompressionPress(compression_ratios=[0.1, 1], scorer=KnormScorer()) + press = PerLayerCompressionPruner(compression_ratios=[0.1, 1], scorer=KnormScorer()) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values diff --git a/tests/test_press_call.py b/tests/test_press_call.py index a6c24488..6f2d498b 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -4,12 +4,12 @@ from transformers import DynamicCache -from kvpress import DefaultPress, KnormPress +from kvpress import DefaultPruner, KnormPress from tests.fixtures import unit_test_model # noqa: F401 def test_context_manager_adds_and_removes_hook(unit_test_model): # noqa: F811 - press = DefaultPress() + press = DefaultPruner() with press(unit_test_model): for layer in unit_test_model.model.layers: From d05437bcdbbe31a24b8bbc0590a6164ede9e68ea Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 12:59:10 +0100 Subject: [PATCH 03/51] docstring fixes --- kvpress/prunners/default_pruner.py | 11 +++++------ kvpress/prunners/eager_attention_pruner.py | 16 ++++++++++------ kvpress/scorers/base_scorer.py | 7 +++++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/kvpress/prunners/default_pruner.py b/kvpress/prunners/default_pruner.py index 7caa5c99..0dd1917c 100644 --- a/kvpress/prunners/default_pruner.py +++ b/kvpress/prunners/default_pruner.py @@ -25,11 +25,10 @@ @dataclass class DefaultPruner: - """Base class for pruning methods. - Each pruning method should implement a `score` method that computes the scores for each KV pair in a layer. - This score is used to prune the KV pairs with the lowest scores in the `hook` method - The `hook` method is called after the forward pass of a layer and updates the cache with the pruned KV pairs. - The press can be applied to a model by calling it with the model as an argument. + """ + Base class for pruning methods. + The `forward_hook` method is called after the forward pass of an attention layer. + and updates the cache with the pruned KV pairs. """ scorer: BasesScorer @@ -39,7 +38,7 @@ def __post_init__(self): assert 0 <= self.compression_ratio < 1, "Compression ratio must be between 0 and 1" def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): - """Cache compression hook called after the forward pass of a decoder layer. + """Cache compression hook called after the forward pass of an attention layer. The hook is applied only during the pre-filling phase if there is some pruning ratio. The current implementation only allows to remove a constant number of KV pairs. diff --git a/kvpress/prunners/eager_attention_pruner.py b/kvpress/prunners/eager_attention_pruner.py index 60a73478..64f6f265 100644 --- a/kvpress/prunners/eager_attention_pruner.py +++ b/kvpress/prunners/eager_attention_pruner.py @@ -2,29 +2,33 @@ # SPDX-License-Identifier: Apache-2.0 +import logging from dataclasses import dataclass import torch from torch import nn -from transformers.utils import logging from kvpress.prunners.default_pruner import DefaultPruner -logger = logging.get_logger(__name__) +logger = logging.getLogger(__name__) @dataclass class EagerAttentionPruner(DefaultPruner): """ - This press is used when eager attention is used in the model (i.e. the attention is materialized). - It is used to calculate the observed attention score. + This pruner can be used when eager attention is used in the model (i.e. the attention is materialized). + It will not return attentions in its output to save memory. """ + def __post_init__(self): + super().__post_init__() + logger.warning("Model will not return attentions in its output to save memory. Please use DefaultPruner if" + " attentions are needed in the output.") + def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): + output = super().forward_hook(module, input, kwargs, output) # attentions are needed as input for the hook, but unless the user wants to return them in the output, # we can remove them to save memory - output = super().forward_hook(module, input, kwargs, output) - logger.warning_once("Model will not return attentions in its output to save memory. ") output = list(output) output[-2] = None output = tuple(output) diff --git a/kvpress/scorers/base_scorer.py b/kvpress/scorers/base_scorer.py index ae257ecd..6b970c59 100644 --- a/kvpress/scorers/base_scorer.py +++ b/kvpress/scorers/base_scorer.py @@ -7,7 +7,11 @@ class BasesScorer: - """Base class for scorers""" + """ + Base class for scorers. + The `score` method is called after the forward pass of an attention layer. + It is used to compute the scores for each KV pair in the layer. + """ def score( self, @@ -38,6 +42,5 @@ def score( Returns ------- Scores for each KV pair in the layer, shape keys.shape[:-1]. - """ raise NotImplementedError From 95275a3d12deb04b97745dce99f8b62ce663f392 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 13:03:24 +0100 Subject: [PATCH 04/51] fix default observed attention press --- README.md | 15 --------------- kvpress/default_presses.py | 31 +++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 1c27d380..e4dd4ca8 100644 --- a/README.md +++ b/README.md @@ -190,18 +190,3 @@ All presses are stored in the `presses` directory. The easiest way to create a n Before opening a pull request with a new press, make sure to register it in the `__init__.py` file of repository and to add it in [test_presses.py](tests/presses/test_presses.py). - -
- -### Can I change the compression ratio from one layer to another ? - - -We provide an experimental feature, which only works with flash attention: -```python -from kvpress import apply_per_layer_compression -# compression_ratios should have the same length as the number of layers -press = apply_per_layer_compression(press, compression_ratios=[...]) -``` - -Check the [demo notebook](notebooks/per_layer_compression_demo.ipynb) for more details. -
diff --git a/kvpress/default_presses.py b/kvpress/default_presses.py index 3242d3b3..04f8072a 100644 --- a/kvpress/default_presses.py +++ b/kvpress/default_presses.py @@ -1,3 +1,11 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +""" +This file provides the default presses for the KVPress library. +Each press is a shortcut to a specific pruner and scorer combination. +Function names are uppercase for backwards compatibility. +""" from kvpress.prunners.default_pruner import DefaultPruner from kvpress.prunners.eager_attention_pruner import EagerAttentionPruner from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer @@ -10,11 +18,11 @@ def ExpectedAttentionPress( - compression_ratio: float = 0.0, - n_future_positions: int = 512, - n_sink: int = 4, - use_covariance: bool = True, - use_vnorm: bool = True, + compression_ratio: float = 0.0, + n_future_positions: int = 512, + n_sink: int = 4, + use_covariance: bool = True, + use_vnorm: bool = True, ): return DefaultPruner( compression_ratio=compression_ratio, @@ -25,14 +33,17 @@ def ExpectedAttentionPress( def KnormPress( - compression_ratio: float = 0.0, + compression_ratio: float = 0.0, ): return DefaultPruner(compression_ratio=compression_ratio, scorer=KnormScorer()) def ObservedAttentionPress( - compression_ratio: float = 0.0, + compression_ratio: float = 0.0, + output_attentions: bool = False, ): + if output_attentions: + return DefaultPruner(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) return EagerAttentionPruner(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) @@ -41,9 +52,9 @@ def RandomPress(compression_ratio: float = 0.0): def SnapKVPress( - compression_ratio: float = 0.0, - window_size: int = 64, - kernel_size: int = 5, + compression_ratio: float = 0.0, + window_size: int = 64, + kernel_size: int = 5, ): return DefaultPruner( compression_ratio=compression_ratio, scorer=SnapKVScorer(window_size=window_size, kernel_size=kernel_size) From 68d60718f509802a3878bdcde6bdf66ed352bc3c Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 13:14:23 +0100 Subject: [PATCH 05/51] fix test --- kvpress/default_presses.py | 22 +++++++++++----------- kvpress/prunners/eager_attention_pruner.py | 6 ++++-- tests/presses/test_presses.py | 9 ++++++--- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/kvpress/default_presses.py b/kvpress/default_presses.py index 04f8072a..877bd90a 100644 --- a/kvpress/default_presses.py +++ b/kvpress/default_presses.py @@ -18,11 +18,11 @@ def ExpectedAttentionPress( - compression_ratio: float = 0.0, - n_future_positions: int = 512, - n_sink: int = 4, - use_covariance: bool = True, - use_vnorm: bool = True, + compression_ratio: float = 0.0, + n_future_positions: int = 512, + n_sink: int = 4, + use_covariance: bool = True, + use_vnorm: bool = True, ): return DefaultPruner( compression_ratio=compression_ratio, @@ -33,14 +33,14 @@ def ExpectedAttentionPress( def KnormPress( - compression_ratio: float = 0.0, + compression_ratio: float = 0.0, ): return DefaultPruner(compression_ratio=compression_ratio, scorer=KnormScorer()) def ObservedAttentionPress( - compression_ratio: float = 0.0, - output_attentions: bool = False, + compression_ratio: float = 0.0, + output_attentions: bool = False, ): if output_attentions: return DefaultPruner(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) @@ -52,9 +52,9 @@ def RandomPress(compression_ratio: float = 0.0): def SnapKVPress( - compression_ratio: float = 0.0, - window_size: int = 64, - kernel_size: int = 5, + compression_ratio: float = 0.0, + window_size: int = 64, + kernel_size: int = 5, ): return DefaultPruner( compression_ratio=compression_ratio, scorer=SnapKVScorer(window_size=window_size, kernel_size=kernel_size) diff --git a/kvpress/prunners/eager_attention_pruner.py b/kvpress/prunners/eager_attention_pruner.py index 64f6f265..b1ef022d 100644 --- a/kvpress/prunners/eager_attention_pruner.py +++ b/kvpress/prunners/eager_attention_pruner.py @@ -22,8 +22,10 @@ class EagerAttentionPruner(DefaultPruner): def __post_init__(self): super().__post_init__() - logger.warning("Model will not return attentions in its output to save memory. Please use DefaultPruner if" - " attentions are needed in the output.") + logger.warning( + "Model will not return attentions in its output to save memory. Please use DefaultPruner if" + " attentions are needed in the output." + ) def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): output = super().forward_hook(module, input, kwargs, output) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 506a458e..cae2b780 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -16,6 +16,7 @@ StreamingLLMPress, TOVAPress, ) +from kvpress.scorers.base_scorer import BasesScorer from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 @@ -39,7 +40,7 @@ def test_presses_run_observed_attention(unit_test_model_output_attention): # no unit_test_model_output_attention(input_ids, past_key_values=DynamicCache()).past_key_values -class StoreKnormPruner(DefaultPruner): +class StoreKnormScorer(BasesScorer): def __init__(self, compression_ratio: float = 0.0) -> None: super().__init__(compression_ratio=compression_ratio) @@ -65,12 +66,14 @@ def test_presses_keep_highest_score(unit_test_model): # noqa: F811 Test that kept keys are those with the highest score """ for compresion_ratio in [0.0, 0.2, 0.4, 0.6, 0.8]: - press = StoreKnormPruner(compression_ratio=compresion_ratio) + press = DefaultPruner( + compression_ratio=compresion_ratio, scorer=StoreKnormScorer(compression_ratio=compresion_ratio) + ) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values - for scores, key in zip(press.scores, past_key_values.key_cache): + for scores, key in zip(press.scorer.scores, past_key_values.key_cache): max_scores = -key.norm(dim=-1) for batch_idx in range(scores.shape[0]): for head_idx in range(scores.shape[1]): From 38e6cead4c4759d8ee87ab382f5a1b1d6842659c Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 13:15:36 +0100 Subject: [PATCH 06/51] fix test --- tests/presses/test_presses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index cae2b780..a641d4e0 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -25,7 +25,7 @@ def test_presses_run(unit_test_model): # noqa: F811 for compression_ratio in [0.2, 0.4, 0.6, 0.8]: press = cls(compression_ratio=compression_ratio) if cls == SnapKVPress: - press.window_size = 2 + press.scorer.window_size = 2 with press(unit_test_model): input_ids = unit_test_model.dummy_inputs["input_ids"] unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values From 362f723b7c6056c4b118bde40d2257ca60abd4a0 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 13:16:41 +0100 Subject: [PATCH 07/51] fix test --- tests/presses/test_presses.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index a641d4e0..d0b348a3 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -42,8 +42,7 @@ def test_presses_run_observed_attention(unit_test_model_output_attention): # no class StoreKnormScorer(BasesScorer): - def __init__(self, compression_ratio: float = 0.0) -> None: - super().__init__(compression_ratio=compression_ratio) + def __init__(self) -> None: self.scores = [] def score( @@ -67,7 +66,7 @@ def test_presses_keep_highest_score(unit_test_model): # noqa: F811 """ for compresion_ratio in [0.0, 0.2, 0.4, 0.6, 0.8]: press = DefaultPruner( - compression_ratio=compresion_ratio, scorer=StoreKnormScorer(compression_ratio=compresion_ratio) + compression_ratio=compresion_ratio, scorer=StoreKnormScorer() ) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) From 4687bad60c0a42126465f7324629f5e8dccc8b8b Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 13:23:13 +0100 Subject: [PATCH 08/51] fix test --- kvpress/pipeline.py | 2 +- tests/presses/test_presses.py | 4 +--- tests/test_press_call.py | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index 4ede85fa..cde7fa5b 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -167,7 +167,7 @@ def _forward( self.model( input_ids=context_ids, past_key_values=cache, - output_attentions=isinstance(press.scorer, ObservedAttentionScorer), + output_attentions=isinstance(getattr(press, "scorer", None), ObservedAttentionScorer), num_logits_to_keep=1, ) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index d0b348a3..0d549a45 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -65,9 +65,7 @@ def test_presses_keep_highest_score(unit_test_model): # noqa: F811 Test that kept keys are those with the highest score """ for compresion_ratio in [0.0, 0.2, 0.4, 0.6, 0.8]: - press = DefaultPruner( - compression_ratio=compresion_ratio, scorer=StoreKnormScorer() - ) + press = DefaultPruner(compression_ratio=compresion_ratio, scorer=StoreKnormScorer()) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 6f2d498b..521b6021 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -9,7 +9,7 @@ def test_context_manager_adds_and_removes_hook(unit_test_model): # noqa: F811 - press = DefaultPruner() + press = DefaultPruner(scorer=KnormPress(compression_ratio=0.2)) with press(unit_test_model): for layer in unit_test_model.model.layers: From 6ded8594f65ad3df366e9b83428cc73009f4bd32 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Mon, 2 Dec 2024 13:37:51 +0100 Subject: [PATCH 09/51] fix typo --- kvpress/prunners/default_pruner.py | 4 ++-- kvpress/scorers/base_scorer.py | 2 +- kvpress/scorers/expected_attention_scorer.py | 4 ++-- kvpress/scorers/knorm_scorer.py | 4 ++-- kvpress/scorers/observed_attention_scorer.py | 4 ++-- kvpress/scorers/random_scorer.py | 4 ++-- kvpress/scorers/snapkv_scorer.py | 4 ++-- kvpress/scorers/streaming_llm_scorer.py | 4 ++-- tests/presses/test_presses.py | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/kvpress/prunners/default_pruner.py b/kvpress/prunners/default_pruner.py index 0dd1917c..deff2cc8 100644 --- a/kvpress/prunners/default_pruner.py +++ b/kvpress/prunners/default_pruner.py @@ -18,7 +18,7 @@ Qwen2ForCausalLM, ) -from kvpress.scorers.base_scorer import BasesScorer +from kvpress.scorers.base_scorer import BaseScorer logger = logging.getLogger(__name__) @@ -31,7 +31,7 @@ class DefaultPruner: and updates the cache with the pruned KV pairs. """ - scorer: BasesScorer + scorer: BaseScorer compression_ratio: float = 0.0 def __post_init__(self): diff --git a/kvpress/scorers/base_scorer.py b/kvpress/scorers/base_scorer.py index 6b970c59..af095693 100644 --- a/kvpress/scorers/base_scorer.py +++ b/kvpress/scorers/base_scorer.py @@ -6,7 +6,7 @@ from torch import nn -class BasesScorer: +class BaseScorer: """ Base class for scorers. The `score` method is called after the forward pass of an attention layer. diff --git a/kvpress/scorers/expected_attention_scorer.py b/kvpress/scorers/expected_attention_scorer.py index 70f4a738..8b4e1b23 100644 --- a/kvpress/scorers/expected_attention_scorer.py +++ b/kvpress/scorers/expected_attention_scorer.py @@ -11,11 +11,11 @@ from torch import nn from transformers.models.llama.modeling_llama import repeat_kv -from kvpress.scorers.base_scorer import BasesScorer +from kvpress.scorers.base_scorer import BaseScorer @dataclass -class ExpectedAttentionScorer(BasesScorer): +class ExpectedAttentionScorer(BaseScorer): """ Compute scores based on the expected attention on next positions. To do so 1. Compute the mean and covariance matrix of the queries before RoPE. diff --git a/kvpress/scorers/knorm_scorer.py b/kvpress/scorers/knorm_scorer.py index bba14a1a..979cdc81 100644 --- a/kvpress/scorers/knorm_scorer.py +++ b/kvpress/scorers/knorm_scorer.py @@ -5,10 +5,10 @@ import torch from torch import nn -from kvpress.scorers.base_scorer import BasesScorer +from kvpress.scorers.base_scorer import BaseScorer -class KnormScorer(BasesScorer): +class KnormScorer(BaseScorer): """Prune KV pairs with highest L2 norm of keys (https://arxiv.org/pdf/2406.11430)""" def score( diff --git a/kvpress/scorers/observed_attention_scorer.py b/kvpress/scorers/observed_attention_scorer.py index 730738a9..3178cf28 100644 --- a/kvpress/scorers/observed_attention_scorer.py +++ b/kvpress/scorers/observed_attention_scorer.py @@ -8,13 +8,13 @@ from torch import nn from transformers.utils import logging -from kvpress.scorers.base_scorer import BasesScorer +from kvpress.scorers.base_scorer import BaseScorer logger = logging.get_logger(__name__) @dataclass -class ObservedAttentionScorer(BasesScorer): +class ObservedAttentionScorer(BaseScorer): """The observed attention score is defined as the average attention weight over all prompt tokens Requires output_attentions=True and attn_implementation="eager" to have access to attentions This approach is related to H2O (https://arxiv.org/abs/2306.14048). diff --git a/kvpress/scorers/random_scorer.py b/kvpress/scorers/random_scorer.py index b0b38681..9ae1334f 100644 --- a/kvpress/scorers/random_scorer.py +++ b/kvpress/scorers/random_scorer.py @@ -5,10 +5,10 @@ import torch from torch import nn -from kvpress.scorers.base_scorer import BasesScorer +from kvpress.scorers.base_scorer import BaseScorer -class RandomScorer(BasesScorer): +class RandomScorer(BaseScorer): """Randomly prune KV pairs""" def score( diff --git a/kvpress/scorers/snapkv_scorer.py b/kvpress/scorers/snapkv_scorer.py index 9eeb767c..a5710f0d 100644 --- a/kvpress/scorers/snapkv_scorer.py +++ b/kvpress/scorers/snapkv_scorer.py @@ -11,11 +11,11 @@ from torch import nn from transformers.models.llama.modeling_llama import repeat_kv, rotate_half -from kvpress.scorers.base_scorer import BasesScorer +from kvpress.scorers.base_scorer import BaseScorer @dataclass -class SnapKVScorer(BasesScorer): +class SnapKVScorer(BaseScorer): """ SnapKV (https://arxiv.org/abs/2404.14469) use the attention of the latest window_size tokens to estimate the importance of the previous KV pairs. We use the default settings from: diff --git a/kvpress/scorers/streaming_llm_scorer.py b/kvpress/scorers/streaming_llm_scorer.py index 7f32321d..d67d529b 100644 --- a/kvpress/scorers/streaming_llm_scorer.py +++ b/kvpress/scorers/streaming_llm_scorer.py @@ -7,11 +7,11 @@ import torch from torch import nn -from kvpress.scorers.base_scorer import BasesScorer +from kvpress.scorers.base_scorer import BaseScorer @dataclass -class StreamingLLMScorer(BasesScorer): +class StreamingLLMScorer(BaseScorer): """ Prune a fixed number of KV pairs at the beginning and end of the sequence (https://arxiv.org/abs/2309.17453) We keep the first n_sink tokens and the last n_local tokens. diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 0d549a45..8132ce78 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -16,7 +16,7 @@ StreamingLLMPress, TOVAPress, ) -from kvpress.scorers.base_scorer import BasesScorer +from kvpress.scorers.base_scorer import BaseScorer from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 @@ -40,7 +40,7 @@ def test_presses_run_observed_attention(unit_test_model_output_attention): # no unit_test_model_output_attention(input_ids, past_key_values=DynamicCache()).past_key_values -class StoreKnormScorer(BasesScorer): +class StoreKnormScorer(BaseScorer): def __init__(self) -> None: self.scores = [] From 774e46894b4a8805f3cb795ea637d2a6458a3405 Mon Sep 17 00:00:00 2001 From: Max Jeblick Date: Tue, 3 Dec 2024 09:44:53 +0000 Subject: [PATCH 10/51] update notebooks --- notebooks/expected_attention.ipynb | 95 +++++++++-------- notebooks/new_press.ipynb | 115 ++++++++++++++------- notebooks/per_layer_compression_demo.ipynb | 50 +++++---- notebooks/speed_and_memory.ipynb | 4 +- 4 files changed, 155 insertions(+), 109 deletions(-) diff --git a/notebooks/expected_attention.ipynb b/notebooks/expected_attention.ipynb index 199d8c20..6208cc59 100644 --- a/notebooks/expected_attention.ipynb +++ b/notebooks/expected_attention.ipynb @@ -11,7 +11,38 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING: The directory '/mount/home/setup/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3.10 -m pip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "# matplotlib is not a core dependency of kvpress\n", + "!pip install matplotlib --quiet" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/mount/home/setup/.cache/pypoetry/virtualenvs/kvpress-PV_RntMw-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "import requests\n", "import numpy as np\n", @@ -44,35 +75,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n" + "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n", + "Loading checkpoint shards: 100%|██████████| 4/4 [00:00<00:00, 4.28it/s]\n" ] }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "488d2f8788f44f56be4296f0958d9aa4", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Loading checkpoint shards: 0%| | 0/4 [00:00" ] @@ -170,7 +181,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Expected attention is computed using the first 5000 tokens and evaluated on the last 3743 tokens\n" + "Expected attention is computed using the first 5000 tokens and evaluated on the last 3914 tokens\n" ] }, { @@ -211,7 +222,7 @@ " attn_weights = eager_self_attn(hidden_states, position_ids=position_ids, attention_mask=attention_mask, output_attentions=True)[1][0] \n", "\n", " # Compute scores on the first n_train tokens\n", - " scores = press.score(\n", + " scores = press.scorer.score(\n", " self_attn, hidden_states[:, :n_train], keys[:, :, :n_train], values[:, :, :n_train], None, None\n", " )[0]" ] @@ -223,7 +234,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAHLCAYAAAADXnZlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADIUklEQVR4nOydeXxU5fX/P3cmk8kQMQuriRA2QUJIghEEsYCKIKYEat1QFLX665dSQWhqsagYEUWlSlFEa2u1puKClcUoiyCiKKIsCZuggEETwhYSIEwms9zfHzfPk+feuXe2zEwWzvv1ygsyc5fn3hm9h3M+53MkWZZlEARBEARBEEFjauoFEARBEARBtFQokCIIgiAIgggRCqQIgiAIgiBChAIpgiAIgiCIEKFAiiAIgiAIIkQokCIIgiAIgggRCqQIgiAIgiBChAIpgiAIgiCIEKFAiiAIgiAIIkQokCIIgggj3bp1w69//eumXoYKSZLw+OOPN/UyCKJVQoEUQZyHvPHGG5AkCd99911TLyUiTJ8+HUOGDOG/Z2Vl6QYSI0aMgCRJXj/XX399FFfbPJFlGcnJyXj11VcBANu3b4ckSfjpp5+8tp07dy7y8vLQqVOngIK2d999F0OGDEF8fDwSExNx5ZVXYv369RG4CoKIPDFNvQCCIIhw880332Dw4MEAgDNnzmDXrl145plndLe9+OKL8fTTT6teS0lJifgamzs//PADTp06xe/j119/jU6dOqFbt25e2z7yyCPo3LkzBgwYgNWrV/s87uOPP44nnngCN910E+6++244nU7s2rULZWVlkbgMgog4FEgRBNHs8Xg8qKurQ1xcnN9tXS4Xtm/fjmnTpgEAtmzZAo/Hg0GDBulun5CQgIkTJ4Z1va2BLVu24IILLkBGRgYAJZC64oordLc9dOgQunXrhhMnTqBDhw6Gx9y8eTOeeOIJ/O1vf8P06dMjsm6CiDZU2iMIQpe6ujo89thjyMnJQUJCAuLj4/GrX/0Kn332Gd9GlmV069YN48aN89q/trYWCQkJ+P3vf89fczgcmD17Nnr16gWr1YouXbrgoYcegsPhUO0rSRL++Mc/4r///S/69esHq9WKVatWGa7V6XTixIkTOHHiBDZt2oTa2lpccsklOHHiBD777DN069YNHo8HJ06cgNPp9Nrf5XLh7NmzodwmQ7788ksMGjQIcXFx6NGjB/7zn/94bVNVVYUHH3wQXbp0gdVqRa9evfDMM8/A4/Gotps/fz6uvPJKtGvXDjabDTk5OVi6dKnX8RwOB6ZPn44OHTqgbdu2yMvLwy+//BLwms+ePcvv45dffon+/fvj1KlTOHHiBL7++mukp6fjxIkTOHXqlGo/vSyVHgsWLEDnzp0xbdo0yLIc9ntOEE2CTBDEece///1vGYD87bffGm5z/Phx+aKLLpJnzJghL168WH722WflPn36yBaLRd6+fTvfbtasWbLFYpFPnjyp2v+9996TAcgbN26UZVmW3W63PGrUKLlNmzbygw8+KL/66qvyH//4RzkmJkYeN26cal8Act++feUOHTrIBQUF8qJFi1Tn1PLZZ5/JAAL6+eyzz/h+w4cPly0WixwbGysDkDt16iQ/8sgjcl1dXcD3UktaWprcp08fuVOnTvJf//pX+aWXXpIvu+wyWZIkedeuXXy7mpoaOTMzU27Xrp3817/+VX7llVfku+66S5YkSZ42bZrqmBdffLH8hz/8QX7ppZfk559/Xh40aJAMQP7oo49U202cOFEGIN9+++3ySy+9JN94441yZmamDECePXu237VPmjQpoHuYlpamu//x48d9nqt9+/ZyXl6e/MILL8jt2rWTAcidO3eWX3zxRb9rI4jmCgVSBHEeEkgg5XK5ZIfDoXrt1KlTcqdOneR7772Xv7Zv3z4ZgLx48WLVtnl5eXK3bt1kj8cjy7Isv/XWW7LJZJK/+OIL1XavvPKKDEDetGkTfw2AbDKZ5N27dwd0PZWVlfLatWvltWvXyldccYU8atQoee3atfKqVavk2NhYedasWfz9yspKvt+9994rP/744/IHH3wg/+c//5Hz8vJkAPItt9wS0Hn1SEtLUwWQsizLx44dk61Wq/ynP/2JvzZnzhw5Pj5e3r9/v2r/mTNnymazWT58+DB/7dy5c6pt6urq5IyMDPmaa67hr+3YsUMGIP/hD39QbXv77bcHHEjt3r1bXrt2rbx06VIZgPy3v/1NXrt2rTxz5kzZarXKa9askdeuXSt/+eWXuvv7CqQqKytlAHK7du3kCy64QH7uuefkd999V77++utlAPIrr7zid30E0RyhQIogzkMCCaRE3G63fPLkSfn48eNybm6unJ2drXr/iiuukK+66ir++8mTJ2WLxSLPmjWL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LHV/75be42frfYiIyHWwa09ljuzas1dXliPicEZcautvdXe+woWIyL2wa28Isqa1yRELNypp9ervHFfqjrSkO74ZkaP6bFHq/t6z06LZ6kRE5EFYSKkkNzcXsbGxMBgMDrunq3QNKYmjv3NcqTvSku74iqubBixSl86KNM30s6YwdPUikohoqGPXnso4a2/wnNHtZ8s9bY3Plhc882XQRETOwa498hj27I60toXHllYwW+OzpcXOVVoZiYjIMhZSNKRYWyCpWcBYW3h5wgB8IiJPx0KKhpS+CqSeLVWOGJQ/EFcfG0ZERCykaIjpq0ByxaKF3XpERK6P79ojAlzynXnWvPePiIiciy1SNGT0N9B8MF15XKKAiGjoYiFFQ4Za3Xeu2C1IRESOwUKKhozBjjnqq+WJY5mIiIYuLsipMi7I6Tm4OCYR0dDBBTmdzBmviBmKPjhXjficE4jPOaH6GCW2PBERUU9skVIZW6Qss9dik92tRADYUkRERHbDFilyafYaoL0qeQICfb0R6OvNliIiInI4riNFTmGvdZu41hIRETkTu/ZUxq49IiIi98OuPXIKLk5JRERDCQspsisuTmkdFpxERJ6BhRTZlTsvEdBfcWPvwocFJxGRZ2AhRXY1mHfWAc5tqemvuLF34ePOBScREX2HhRS5FGe21PRX3Ni78BlswUlERK6Bs/ZUxll7trHXQp1ERESDYe3fbxZSKmMhRURE5H64/AERERGRylhIERERESnEQsqNcS0iIiIi52IhpZLc3FzExsbCYDCodg+uRURERORcLKRUkpmZif/+978oKipS7R5ci4iIiMi5OGtPZZy1R0RE5H44a4+IiIhIZSykiIiIiBRiIUVERESkEAspIiIiIoVYSBEREREpxEKKiIiISCEWUkREREQKsZAiIiIiUoiFFBEREZFCLKSIiIiIFGIhRURERKQQCynyaB+cq8YT//cJPjhX7exQiIjIA7GQIo92oOAabty6iwMF15wdChEReSAWUuTRViVPwCOBvliVPMHZoRARkQfSiIg4OwhPdvv2bYwcORLNzc0ICAhwdjhERERkBWv/frNFioiIiEghFlJERERECrGQIiIiIlKIhZQV9uzZg8mTJyM2Nhbr1q0Dh5URERERwEJqQN988w3279+P4uJiXL58GcXFxTh37pyzwyIiIiIXMMzZAbiD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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAHLCAYAAAADXnZlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADCiklEQVR4nOyde3gU5dn/v7ObzWaJmANHEzEcFDSEEIwchBZROaiRQ32rLYqH2r5vf0jFimihijECiorVoim22lYtLWpt5dBUDhURRRFFziAgYrAJ55AgYbPZw/z+2NxPnpmd2Z1dspsD9+e6uCCzM888M7M639zPfX9vRVVVFQzDMAzDMEzU2Jp7AgzDMAzDMK0VFlIMwzAMwzAxwkKKYRiGYRgmRlhIMQzDMAzDxAgLKYZhGIZhmBhhIcUwDMMwDBMjLKQYhmEYhmFihIUUwzAMwzBMjLCQYhiGYRiGiREWUgzDME1I9+7dceONNzb3NDQoioLHHnusuafBMG0SFlIMcw7y6quvQlEUfP755809lbhw//3348orrxQ/9+/f31BIjBgxAoqihPy57rrrEjjblomqqsjMzMTvf/97AMDmzZuhKAq++eabkH3nzp2LcePGoUuXLpZE25tvvokrr7wSqampSE9Px9ChQ7FmzZo4XAXDxJ+k5p4AwzBMU/Ppp59iyJAhAIDvvvsOO3bswFNPPWW474UXXognn3xSsy0rKyvuc2zp7Nu3DydPnhT38ZNPPkGXLl3QvXv3kH0feeQRdO3aFQMGDMDKlSvDjvvYY4/h8ccfxw9/+EPcdddd8Hq92LFjByoqKuJxGQwTd1hIMQzT4gkEAqivr0dKSkrEfX0+HzZv3oz77rsPALBx40YEAgEMGjTIcP+0tDRMmjSpSefbFti4cSPOO+885OXlAQgKqcGDBxvue+DAAXTv3h3Hjx9Hp06dTMfcsGEDHn/8cTz77LO4//774zJvhkk0vLTHMIwh9fX1ePTRR1FYWIi0tDSkpqbi+9//Pt5//32xj6qq6N69O8aPHx9yfF1dHdLS0vDzn/9cbPN4PCguLsbFF18Mp9OJbt264aGHHoLH49EcqygKfvGLX+Cvf/0r+vbtC6fTiRUrVpjO1ev14vjx4zh+/DjWr1+Puro6XHLJJTh+/Djef/99dO/eHYFAAMePH4fX6w053ufz4fTp07HcJlM++ugjDBo0CCkpKejZsydef/31kH2qq6vxy1/+Et26dYPT6cTFF1+Mp556CoFAQLPf/PnzMXToUHTo0AEulwuFhYV4++23Q8bzeDy4//770alTJ7Rv3x7jxo3Df//7X8tzPn36tLiPH330Efr164eTJ0/i+PHj+OSTT5Cbm4vjx4/j5MmTmuOMolRGPP/88+jatSvuu+8+qKra5PecYZoFlWGYc44///nPKgD1s88+M93n2LFj6gUXXKBOmzZNXbhwofr000+rffr0UR0Oh7p582ax38MPP6w6HA71xIkTmuPfeustFYC6bt06VVVV1e/3q6NHj1bbtWun/vKXv1R///vfq7/4xS/UpKQkdfz48ZpjAaiXXXaZ2qlTJ7WkpEQtLS3VnFPP+++/rwKw9Of9998Xx1111VWqw+FQk5OTVQBqly5d1EceeUStr6+3fC/15OTkqH369FG7dOmi/vrXv1ZffPFF9fLLL1cVRVF37Ngh9qutrVXz8/PVDh06qL/+9a/Vl156Sb3jjjtURVHU++67TzPmhRdeqN5zzz3qiy++qP7mN79RBw0apAJQ//Wvf2n2mzRpkgpAvfXWW9UXX3xRvemmm9T8/HwVgFpcXBxx7nfeeaele5iTk2N4/LFjx8Keq2PHjuq4cePU5557Tu3QoYMKQO3atav6wgsvRJwbw7RUWEgxzDmIFSHl8/lUj8ej2Xby5Em1S5cu6t133y227dmzRwWgLly4ULPvuHHj1O7du6uBQEBVVVX9y1/+otpsNvXDDz/U7PfSSy+pANT169eLbQBUm82m7ty509L1VFVVqatXr1ZXr16tDh48WB09erS6evVqdcWKFWpycrL68MMPi8+rqqrEcXfffbf62GOPqf/4xz/U119/XR03bpwKQL3lllssndeInJwcjYBUVVU9evSo6nQ61QceeEBsmz17tpqamqru3btXc/yMGTNUu92uHjx4UGw7c+aMZp/6+no1Ly9Pveaaa8S2LVu2qADUe+65R7PvrbfeallI7dy5U129erX69ttvqwDUZ599Vl29erU6Y8YM1el0qqtWrVJXr16tfvTRR4bHhxNSVVVVKgC1Q4cO6nnnnac+88wz6ptvvqled911KgD1pZdeijg/hmmJsJBimHMQK0JKxu/3qydOnFCPHTumFhUVqQUFBZrPBw8erH7ve98TP584cUJ1OBzqww8/LLaNGzdO7du3r3rs2DHNn71796oA1Dlz5oh9AahXX3111NcVCATUDh06qL///e9VVVXVzz77TAWgfvPNN5bH+N///V8VgPrJJ59EfX5VDQqp3NzckO35+fnqD37wA83P1113Xcj9+M9//qMCUBctWmQ4flVVlXrs2DF18uTJanp6utj+xBNPqADUL7/8UrP/xo0bLQspYunSparD4VBPnz6tqqqqTpkyRR0xYkTE48IJqYMHD4qI1htvvCG2+/1+NTc3V73wwgstz49hWhKcI8UwjCmvvfYa8vPzkZKSgg4dOqBTp04oKytDTU2NZr877rgD69evR3l5OQDg73//O7xeL26//Xaxz759+7Bz50506tRJ86d3794AgKNHj2rG7NGjh6U5Uu4T5fWcOHEC/fv3x/Hjx/Huu+/iwgsvRGpqKo4fPx6Si2XEAw88AAD4z3/+Y+n8Rlx00UUh2zIyMjS5Rfv27cOKFStC7sfIkSMBaO/Hv/71LwwZMgQpKSnIzMxEp06dsHDhQs1zKC8vh81mQ69evTTn7dOnj6U5nzlzRtzHFStWoKCgAG63G8ePH8eaNWtwxRVXiM9jweVyAQAcDgd++MMfiu02mw0/+tGP8N///hcHDx6MaWyGaU64ao9hGEMWLVqEu+66CxMmTMCDDz6Izp07w26348knn8T+/fs1+/74xz/G/fffj7/+9a/49a9/jUWLFuGKK67QvMQDgQD69euH3/zmN4bn69atm+ZnevFG4uDBgyGii0r2Caok+/Of/4y77ror7Hg0j6qqKkvnN8JutxtuV1VV/DsQCGDUqFF46KGHDPclgfnhhx9i3LhxGD58OH73u9/hggsugMPhwJ///Gf87W9/i3mOep5++mmUlJRotskVeLt378b8+fNDrsMqmZmZSElJQXp6esj96dy5MwDg5MmThiKUYVoyLKQYhjHk7bffRs+ePfHPf/4TiqKI7cXFxSH7ZmZmoqioCH/9619x2223Yf369Xj++ec1+/Tq1Qtbt27FtddeqxnvbOnatStWr14NACgpKUFKSgp+9atfQVVVjBs3Dvfffz+uueYaAEDfvn0jjvf1118DQNgy/qagV69eOH36tIhAmfGPf/wDKSkpWLlyJZxOp9j+5z//WbNfTk4OAoEA9u/frxGwe/bssTSfO+64A9/73vdw5swZjB8/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vuWzLD09XS0tLZozZ05QzgmMFzeEOwAAY9uSJUtUXl7usywmJiZM0cBfUVFRSklJCXcYwJjHiBSAEYmJiVFKSorPa8qUKZKkiooKRUdH6+9//7t3+2effVZf/OIX1draKunqaNGjjz6qRx99VImJiUpKStJPfvIT9f0+9e7ubpWWluqmm25SfHy85s2bp4qKCp84Dh8+rMLCQsXFxWnKlClavHixzp07p+LiYr399tv69a9/7R0xO336tCTpxIkTuu++++R2u5WcnKyHH35YbW1t3mN2dXVpxYoVcrvdSk1N1XPPPTfk59HQ0KClS5cqOTlZbrdbeXl52rdvn3d9YWGhmpqa9OSTT3rjqaio0MqVK3XhwgXvss2bN/t17b0jWW+99ZaysrLkdru1ZMkStbS0SJI2b96sl19+WXv37vU530BTe2+//bby8/MVExOj1NRUPfXUU7py5YpP7I8//rh++MMfaurUqUpJSfHGCYxbBgAOFRUV2dKlSwfdZv369ZaRkWHnz5+3Y8eOWXR0tO3du9e7vqCgwNxut61du9Zqa2vt1Vdftbi4OHvxxRe923z/+9+3u+66yw4dOmT19fX2q1/9ymJiYqyurs7MzN577z2LiYmx1atXW3V1tZ04ccJ27Nhh//nPf+z8+fM2f/58W7VqlbW0tFhLS4tduXLFzp07Z1/4whds48aNdvLkSTt27Jjde++9tnDhQu95V69ebTNmzLB9+/ZZTU2NffOb37RJkybZ2rVrr3u91dXV9tvf/tbef/99q6ursx//+Md24403WlNTk5mZffrpp5aWlmY//elPvfF0d3fb9u3bLSEhwbuso6PDr2svLy+3iRMn2qJFi6yystKqqqosKyvLHnzwQTMz6+josAceeMCWLFnic77GxkaTZO+9956ZmX300UcWFxdna9assZMnT9qePXssKSnJNm3a5JOrhIQE27x5s9XV1dnLL79sLpfL/vrXvw7+PwoQwSikADhWVFRkUVFRFh8f7/P6+c9/7t2mu7vbcnNz7YEHHrDs7GxbtWqVzzEKCgosKyvLenp6vMs2bNhgWVlZZmbW1NRkUVFRdubMGZ/9vv71r9vGjRvNzGz58uW2YMGC68ZZUFDQr/j52c9+Zt/4xjd8ljU3N5skO3XqlHV0dFh0dLT96U9/8q7/9NNPLTY2dtBCaiC33nqr7dixw/s+IyPDXnjhBZ9tysvLLTEx0WeZP9deXl5ukqy+vt67vqyszJKTk73vByp4ry2knn76aZs9e7ZPHsrKysztdpvH4zGzq5/j3Xff7XOcvLw827Bhw9AfAhCh6JECMCILFy7Uzp07fZZNnTrV+9/R0dF67bXXlJOTo4yMDL3wwgv9jnHnnXfK5XJ538+fP1/PPfecPB6P3n//fXk8Hs2aNctnn+7ubk2bNk2SVF1dre985zvDivv48eM6ePCg3G53v3UNDQ26dOmSLl++rHnz5vlc1+zZswc9bmdnpzZv3qw333xTLS0tunLlii5duqQPP/xwWPFJ8uvaJSkuLk4zZ870vk9NTdXZs2eHda6TJ09q/vz5PnlYsGCBOjs79dFHH2nGjBmSpJycHJ/9nJwLiCQUUgBGJD4+XjfffPOg2/zzn/+UJLW3t6u9vV3x8fF+H7+zs1NRUVGqqqpSVFSUz7reIig2NnaYUV897v33369f/vKX/dalpqaqvr5+2MeUpNLSUv3tb3/Ttm3bdPPNNys2Nlbf/va3dfnyZUcxDnXtkjRx4kSfdS6Xy6fHLJAGOldPT09QzgWMBRRSAIKqoaFBTz75pF566SXt2rVLRUVF2rdvnyZM+P97XY4ePeqzz5EjR3TLLbcoKipKt912mzwej86ePat77rlnwHPk5ORo//792rJly4Dro6Oj5fF4fJZ99atf1e7du5WZmakbbuj/q3DmzJmaOHGijh496h2NOXfunOrq6lRQUHDd6z18+LCKi4u1bNkySVeLod7m9sHiGWiZP9fuj4GOfa2srCzt3r1bZuYdlTp8+LAmTZqktLQ0x+cGIh137QEYke7ubn3yySc+r9473zwejx566CEtXrxYK1euVHl5uWpqavrd/fbhhx9q3bp1OnXqlP74xz9qx44dWrt2rSRp1qxZ+u53v6sVK1bojTfeUGNjo959911t3bpVb775piRp48aNqqys1Jo1a1RTU6Pa2lrt3LnTG0dmZqaOHj2q06dPq62tTT09PSopKVF7e7uWL1+uyspKNTQ06K233tLKlSvl8Xjkdrv1ve99T+vXr9eBAwd04sQJFRcX+xSAA7nlllv0xhtvqLq6WsePH9eDDz7Yb8QmMzNThw4d0pkzZ3xi7Ozs1P79+9XW1qbPPvvMr2v3R2ZmpmpqanTq1Cm1tbXp888/77fNmjVr1NzcrMcee0y1tbXau3evNm3apHXr1g15zcC4Fu4mLQBjV1FRkUnq95o9e7aZmW3ZssVSU1Otra3Nu8/u3bstOjraqqurzexqA/OaNWvskUcesYSEBJsyZYo9/fTTPk3Ply9ftmeeecYyMzNt4sSJlpqaasuWLbOamhrvNhUVFXbXXXdZTEyMTZ482RYvXmznzp0zM7NTp07ZnXfeabGxsSbJGhsbzcysrq7Oli1bZpMnT7bY2Fj78pe/bE888YT33B0dHfbQQw9ZXFycJScn27PPPjtg43pfjY2NtnDhQouNjbX09HT7zW9+02+fd955x3JyciwmJsb6/hp+5JFHbNq0aSbJe7fcUNc+UJP6nj17fI579uxZu/fee83tdpskO3jwYL9m897PMC8vz6Kjoy0lJcU2bNhgn3/+uXf9QNe+dOlSKyoquu7nAUQ6l1mQJtIBwA+FhYXKzc3t96RvABgLGK8FAABwiEIKAADAIab2AAAAHGJECgAAwCEKKQAAAIcopAAAAByikAIAAHCIQgoAAMAhCikAAACHKKQAAAAcopACAABw6P8ADDU9SF4FW4cAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -234,16 +245,16 @@ { "data": { "text/plain": [ - "Text(0, 0.5, 'Average attention loss on the last 3743 tokens')" + "Text(0, 0.5, 'Average attention loss on the last 3914 tokens')" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADgB0lEQVR4nOzddXhTZxvA4V+SureUCrRQ3N0dhutg6IDhMGy4DoYO3dBhYzgT2BjyIcOKF3f3Qgu0lLbULXK+P0IDpUhT0qYp731dXOScHHnyNk2eviqTJElCEARBEAQhm5AbOwBBEARBEARDEsmNIAiCIAjZikhuBEEQBEHIVkRyIwiCIAhCtiKSG0EQBEEQshWR3AiCIAiCkK2I5EYQBEEQhGzFzNgBZDaNRsOzZ8+wt7dHJpMZOxxBEARBENJAkiSio6PJlSsXcvmH62Y+u+Tm2bNneHt7GzsMQRAEQRDSITAwEC8vrw8e89klN/b29oC2cBwcHAx6baVSyf79+2nUqBHm5uYGvbbwmijnzCHKOfOIss4copwzR0aVc1RUFN7e3rrv8Q/57JKb5KYoBweHDElubGxscHBwEL84GUiUc+YQ5Zx5RFlnDlHOmSOjyzktXUpEh2JBEARBELIVkdwIgiAIgpCtiORGEARBEIRs5bPrc5NWarUapVKp1zlKpRIzMzMSEhJQq9UZFJkgyjlzmFo5m5ubo1AojB2GIAhZgEhu3iJJEsHBwURERKTrXA8PDwIDA8UcOhlIlHPmMMVydnJywsPDw2TiFQQhY4jk5i3JiY2bmxs2NjZ6fUhqNBpiYmKws7P76ARDQvqJcs4cplTOkiQRFxdHSEgIAJ6enkaOSBAEYxLJzRvUarUuscmRI4fe52s0GpKSkrCyssryXwamTJRz5jC1cra2tgYgJCQENzc30UQlCJ+xrP+JlYmS+9jY2NgYORJBENIj+XdX3/5ygiBkLyK5eQfRXi8Ipkn87gqCACK5EQRBEAQhmzFqcnPs2DFatmxJrly5kMlkbN++/aPnHDlyhPLly2NpaUnBggVZt25dhscpCIIgCILpMGpyExsbS5kyZVi6dGmajvf396d58+bUq1ePy5cvM2zYMPr06cO+ffsyOFLhY9KanAqCIAhCRjPqaKmmTZvStGnTNB+/YsUK8uXLx7x58wAoVqwYJ06cYMGCBTRu3DijwjQJPXr0YP369QCYmZnh5eVF+/btmTZtGlZWVkaOThAEQfgcRIcGcvLw/0hINO5gbJMaCn7q1CkaNGiQYl/jxo0ZNmzYe89JTEwkMTFRtx0VFQVoR1O8PaJCqVQiSRIajQaNRqN3fJIk6f5Pz/mfQpIkGjduzJo1a1AqlVy4cIGePXsCMHv27EyJIb3lpi9jlXNSUhIWFhaZdj9jM+b7Ob00Gg2SJKFUKk1qKHjyZ5EY5ZWxRDlnLEmS2Lp8JpX/OILcHeJbdzHo9fX5uZlUchMcHIy7u3uKfe7u7kRFRREfH6+b5+JNs2bNYurUqan279+/P9WQbzMzMzw8PIiJiSEpKQnQ/rASlPp9sMeHReh1/PtYmcvTPPoj+cM8+TV98cUX1KlTh3379vH9998DEB4ezujRozl16hQRERH4+PgwYsQI2rVrp7tOixYtKFGiBJaWlmzcuBELCwt69uzJuHHjdMc8ePCA7777josXL+Lj48OsWbO0rzs+Xpc83rhxg/Hjx3Pu3Dmsra1p1aoVP/74I3Z2dgAMHDiQyMhIypcvz6+//kpiYiKDBg1ixIgRTJ06ld9//x0bGxu+//57unR59y9IdHQ0O3bsYM6cOfj7+2NtbU3p0qX5448/sLW1BeD3339n6dKlPHz4EGdnZ1q2bMlPP/0EQGBgIGPHjuXYsWPI5XLq16/PnDlzcHNzA7RJ4e7du+nbty/z5s0jMDCQ8PBwIiMj+eGHH9izZw9JSUmULVuWGTNmUKpUqbT9YE1MdHS0sUNIs6SkJOLj4zl27BgqlcrY4ejtwIEDxg7hsyDKOWPsCZBT48k5AJLM5Rz29TXo9ePi4tJ8rEklN+kxfvx4RowYoduOiorC29ubRo0a4eDgkOLYhIQEAgMDsbOz0zXlxCWpKDfHOL8I16c0xMYibT8ic3NzzMzMdK/p+vXrnDt3jrx58+r2RUdHU7VqVSZMmICDgwN79uyhf//+lCxZksqVKwPaBG/Tpk0MHz6c06dPc+rUKXr16kW9evVo2LAhGo2GHj164O7uzqlTp4iMjNSVr7W1NQ4ODsTGxtK+fXuqVq3KmTNnCAkJoV+/fkyYMIG1a9fq4j1+/Dg+Pj4cPXoUPz8/+vbty4ULF6hduzanT5/m77//Zvjw4bRs2RIvLy/da5UkiejoaGJiYujTpw9z5syhdevWREdHc+LECezt7bGzs2P58uWMHj2aWbNm0aRJEyIjIzl58iQODg5oNBq6deuGnZ0dhw8fRqVS8d1339GvXz8OHToEgKWlJf7+/uzZs4etW7eiUChwcHCgXbt2WFtbs2fPHhwdHVm5ciVt2rTh9u3buLi4GOaHnwUkl7O9vb3JDLFOSEjA2tqa2rVrm1RzrFKp5MCBAzRs2BBzc3Njh5NtiXLOOCfuhyE/swx3TShgjcra2uDlnPzHc1qYVHLj4eHB8+fPU+x7/vw5Dg4O76y1Ae0XlKWlZar95ubmqQpdrVYjk8mQy+W6GVmNOTPrm3F8jEwmY/fu3Tg4OKBSqUhMTEQul7NkyRLdNby9vRk9erTunCFDhrB//362bNlC1apVdftLly7NlClTAChSpAjLli3j8OHDNG7cmIMHD3L79m327dtHrly5AJg5cyZNmzbVxbtp0yYSEhLYuHGjrgZlyZIltGzZkrlz5+Lu7o5MJsPFxYVffvkFuVxOsWLF+Pnnn4mPj2fChAkAfP/998yZM4eTJ0/SqVMnXXzJTSTBwcGoVCratm1L3rx5AShTpozuuJkzZzJy5MgUzZZVqlQBwNfXl2vXruHv74+3tzcAGzZsoESJEly4cIFKlSohk8lISkpi48aN5MyZE4ATJ05w7tw5QkJCdO+refPmsWPHDrZu3Uq/fv3S9PMyBcnlnPw7YQrkcm1t57t+v02BqcZtakQ5G45GI7Hy+ENm/3eLnRY7eKzSflYorawMXs76XMukkptq1aqxZ8+eFPsOHDhAtWrVMuye1uYKbk5LW2dljUZDdFQ09g72BvkysDbXr89AvXr1WL58ObGxsSxYsAAzMzPatm2re16tVjNz5kz+/vtvnj59SlJSEomJiama50qXLp1i29PTU7dmz61bt/D29tYlNkCq8r916xZlypTRJTYANWrUQKPRcOfOHV3TYokSJVKUk7u7OyVLltRtKxQKcuTIobv328qUKUP9+vUpVaoUjRs3plGjRrRr1w5nZ2dCQkJ49uwZ9evXf+e5ya8jObEBKF68OE5OTty6dYtKlSoBkDdvXl1iA3DlyhViYmJSLc8RHx/PgwcP3nkvQRCE7Ojco3Bm7bnFxYAIysvuUUr+iAcq7eelxsj9E42a3MTExHD//n3dtr+/P5cvX8bFxYU8efIwfvx4nj59yoYNGwDo378/S5YsYcyYMfTq1YtDhw7x999/s3v37gyLUSaTpblpSKPRoLJQYGNhZpS/dG1tbSlYsCAAa9asoUyZMqxevZrevXsD8NNPP7Fo0SIWLlxIqVKlsLW1ZdiwYbr+Rcnezo5lMlmGdCh91330ubdCoeDAgQOcPHmS/fv388svvzBhwgTOnDmDq6urQWJ8M0ED7XvW09OTI0eOpDrWycnJIPcUBEHIyl5EJ/LTvtv8ff4JAFZmsDjHLogEJQ5APBob2w9fJIMZta75/PnzlCtXjnLlygEwYsQIypUrx6RJkwAICgoiICBAd3y+fPnYvXs3Bw4coEyZMsybN49Vq1Z99sPA30Uul/P9998zceJE4uPjAfDz8+PLL7+ka9eulClThvz583P37l29rlusWDECAwMJCgrS7Tt9+nSqY65cuUJsbKxun5+fH3K5nCJFinzCq0pNJpNRo0YNpk6dyqVLl7CwsGDbtm3Y29vj4+OD73s6tCW/jsDAQN2+mzdvEhERQfHixd97v/LlyxMcHIyZmRkFCxZM8c9QCZUgCEJWdeZhGK2WnNAlNtUL5OB01TN4RZ4Hc1s0SdrKADNbZ2OGadzkpm7dukiSlOpf8qzD69atS/UXct26dbl06RKJiYk8ePCAHj16ZHrcpqJ9+/YoFArdJImFChXS1XTcunWLb7/9NlUfpo9p0KABhQsXpnv37ly5coXjx4/r+sgk69KlC1ZWVnTv3p3r169z+PBhvvvuO7755ptUo90+xZkzZ5g5cybnz58nICCArVu38uLFC4oVKwbAlClTmDdvHosXL+bevXtcvHiRX375Rfc6SpUqRZcuXbh48SJnz56lW7du1KlTh4oVK37w9VerVo3WrVuzf/9+Hj16xMmTJ5kwYQLnz5832GsTBEHIanxvPafjytMERSZgY6FgRdcK/PF1fpwuLdce0GI+iljt1CsKWyfjBYpYWypbMzMzY/DgwcydO5fY2FgmTpxI+fLlady4MXXr1sXDw4PWrVvrdU25XM62bduIj4+ncuXK9OnThxkzZqQ4xsbGhn379hEeHk6lSpVo164d9evXZ8mSJQZ8deDg4MCxY8do1qwZhQsXZuLEicybN083MWT37t1ZuHAhy5Yto0SJErRo0YJ79+4B2hqfHTt24OzsTO3atWnQoAH58+dn8+bNH7ynTCZjz5491K5dm549e1K4cGE6derE48ePDZq4CYIgZCV/nw9k1D9XAMjlaMX/BtekSUkPZBfWgzoJcpUnoURrLGO03RzMbY07clQmJc/UlUbx8fFIkqTrhPr48WO2bdtG8eLFadSoUYYEaUhRUVE4OjoSGRn5zqHg/v7+5MuXL13DSDUaDVFRUTg4OJjM6BJTJMo5c5hiOX/q77CxKJVK9uzZQ7NmzcQongwkyjl9Dtx8Tt8N2pppL2drdgyqQQ47S4h/CXPyARK0+ZVbXmUIbv4VHhHweEB/6g8caPCh4O/7/n6b3p9YX375pa6Db0REBFWqVGHevHl8+eWXLF++PH0RC4IgCIKQpUiSxKKD9xj050UA6hXJyb5htbWJDcB/YwEJbN2gZFvuR9zHXtvFE42tiXUovnjxIrVq1QJgy5YtuLu78/jxYzZs2MDixYsNHqAgCIIgCJkrKDKetstPsuDgXZJUGuoWycnCjuWwtXw1evjZJbj6qhm/8QxQmHM/7A62r1Y7Ur81xUhm03soeFxcHPb29oB2CYOvvvoKuVxO1apVefz4scEDFARBEAQhc0iSxF9nA5mz9zaR8UpsLBSMaVyE7tV9Xs9UrkqC/T9oH+cqB6XaA/Ds8U3tNRRyNO+ZWDez6F1zU7BgQbZv305gYCD79u3T9bMJCQn5aBuYIAiCIAhZ1y+H7vP9tmtExivJ7WTN/wbXoEeNfCmXYNkzEh4dB5kCmv0Mr55LCtZOEaJxdQYj99PTu+Zm0qRJdO7cmeHDh1O/fn3d7LT79+/XzVcjCIIgCIJpUKo1nLgfys4rz9h68SkA39bOz3f1C2Fn+VaaEB8BF7X9bun4O3i9njpD/uKl9n+3nBib3slNu3btqFmzJkFBQSnW8alfvz5t2rQxaHCCIAiCIGSc3VeDmLD9GhFxSt2+Mt5OjGtaNPWCuZIE/xusfeycD4o20z2l1qixDI8BwMLDM8Pj/ph0Lb/g4eGBh4dHin3Jq0oLgiAIgpC1Jak0bL/0lDH/XgXAwkxOp0retCidi4p5nVMnNgBHZsOtndrHNYakeOpZ7DNcorRL5dh4emVo7Gmhd3ITGxvL7Nmz8fX1JSQkJNW6Pw8fPjRYcIIgCIIgGNaZh2EM+vMSoTHaoU12lmac+b7+65FQ7+J/HI7O1j6uNQoq9krx9KPIR7hEax+bu3tgbHonN3369OHo0aN88803eHp6vju7EwRBEAQhy9lzLYhBf15EksBCIadagRz82LrkhxObpFjY2Fr72LsqfDEx1SH+kf7kiNbOCWzm7g5qVQZEn3Z6Jzf//fcfu3fvpkaNGhkRj5BOPXr0ICIigu3bt+v2bdmyha5duzJjxgxGjhxpvOAEQRAEo4qMU7LsyH1+PaZtXSmXx4nFncrh7ZKG+Wj2TQDNq2Sl2U+60VFvehT1iDqvam4U7u7w7KmhQk8XvZMbZ2dnXFyMu2aE8HGrVq1i0KBBrFixgp49exo7HINRKpUoFApjhyEIgmAS1BqJ308/ZuaeWySqtN1ISuRy4O9vq2GuSMNw7ahnr0dHdfoLPEu/87CHLx/Q5lVyY+Zh/ORG74Ho06dPZ9KkScTFxWVEPIIBzJ07l++++45NmzalSGx27NhB+fLlsbKyIn/+/EydOhWVSpuN9+rVixYtWqS4jlKpxM3NjdWrVwPamqBSpUphbW1Njhw5aNCgAbGxse+M4ciRI8hkMnx9falYsSI2NjZUr16dO3fupDhu+fLlFChQAAsLC4oUKcLGjRtTPC+TyVi+fDmtWrXC1taWGTNmMHXqVGrVqsWaNWvIkycPdnZ2DBw4ELVazdy5c/Hw8MDNzS3Vgp6CIAifC7VGYsflpzRccJTJ/7tBokpDPldbfm5fhl3f1UxbYnNjOywsBZIachZLMTrqTUnqJJ4G3sBMA8hkmOXIYdDXkh5619zMmzePBw8e4O7ujo+PT6pFsS5evGiw4LIESQJlGhM5jUZ7bJLCMBMYmdu8s/rvQ8aOHcuyZcvYtWsX9evX1+0/fvw43bp1Y/HixdSqVYsHDx7Qr18/ACZPnkyfPn2oXbs2QUFBeHpqh/Ht2rWLuLg4OnbsSFBQEF9//TVz586lTZs2REdHc/z4cT627uqECROYN28eOXPmpH///vTq1Qs/Pz8Atm3bxtChQ1m4cCENGjRg165d9OzZEy8vL+rVq6e7xpQpU5g9ezYLFy7EzMyM1atX8+jRI/bu3cvevXt58OAB7dq14+HDhxQuXJijR49y8uRJevXqRYMGDahSpYpeZSgIgmDKQqITGL75Mn73wwBwsDLj68p5GN24CGZpSWoAHp+Ef7q/3m6/9r2Hng0+i31YAqCttZFlgUVJ9U5uWrdunQFhZGHKOJiZK02HygEnQ977+2dgkfbFx/777z927NiBr68vX3zxRYrnpk6dyrhx4+jeXftmzZ8/P9OnT2fMmDFMnjyZ6tWr62pOxowZA8DatWtp3749dnZ23L17F5VKxVdffUXevHkBKFWq1EdjmjFjBnXq1AFg3LhxNG/enISEBKysrPj555/p0aMHAwcOBGDEiBGcPn2an3/+OUVy07lz51RNaxqNhtWrV+Po6Ejx4sWpV68ed+7cYc+ePcjlcooUKcKcOXM4fPiwSG4EQfgsRMZr+9WsPPZQ22HYTM6gugXpVdMHeys9Eo5bu+DfPtrHucpB+/XgnPe9h194fgG3CO0fuha5jT8MHNKR3EyePDkj4hAMoHTp0oSGhjJ58mQqV66MnZ2d7rkrV67g5+eXoqlGrVaTkJBAXFwcNjY29OnTh5UrVzJmzBieP3/Of//9x6FDhwAoU6YM9evXp1SpUjRu3JhGjRrRrl07nJ2dPxpTsuQaoZCQEPLkycOtW7d0tUfJatSowaJFi1Lsq1ixIm/LkyePbo0zAHd3dxQKBfI3aszc3d0JCQn5YHyCIAjZQVSCkppzDhGdoO1qkMvRiuVdK1DG20m/C6lVsHskqOLBswx8sw2sP/w5fz/iPm4R2sfmXiaa3ABERESwZcsWHjx4wOjRo3FxceHixYu4u7uTO3duQ8doXOY22hqUNNBoNERFR+Ngb5/iS/aT7q2H3Llzs2XLFurVq0eTJk3477//dAlATEwMU6dO5auvvkp1npWVFQDdunVj3LhxnDp1ipMnT5IvXz7dCvAKhYIDBw5w8uRJ9u/fzy+//MKECRM4c+YM+fLle/9LeKN6MnnagLfnRvoYW9vUtVdmZinfujKZLFUTqUwm0/tegiAIpiYgLI6OK0/pEptJLYrTvqKXfrU1oO2G8d9oiAkGCzv4ZvtHExuABxEPaBaprbkx9zbR5Obq1as0aNAAR0dHHj16RN++fXFxcWHr1q0EBASwYcOGjIjTeGSytDcNaTRgrtYeb6RFw/LmzcvRo0d1Cc7evXuxt7enfPny3Llzh4IFC7733Bw5ctC6dWvWrl3LqVOnUjUFyWQyatSoQY0aNZg0aRJ58+Zl27ZtjBgxIl2xFitWDD8/P11TGYCfnx/FixdP1/UEQRA+N3+fD2TMFu0swzYWCmZ9VYovy6azksFvIZxfo33cfB7YfHxkdLwqnifRT3CP0G5bmGrNzYgRI+jRowdz585N0SzQrFkzOnfubNDghPTx9vbmyJEj1KtXj8aNG7N3714mTZpEixYtyJMnD+3atUMul3PlyhWuX7/Ojz/+qDu3T58+tGjRArVanSLpOHPmDL6+vjRq1Ag3NzfOnDnDixcvKFasWLrjHD16NB06dKBcuXI0aNCAnTt3snXrVg4ePPhJr18QBOFzsPXiE11ik9PeklXdKurfDJXszl44OEX7uPp3UKZTmk47F3wOCQnPSDmgNt1mqXPnzvHrr7+m2p87d26Cg4MNEpTw6by8vFIkOPv27WPXrl1MmzaNOXPmYG5uTtGiRenTp0+K8xo0aICnpyclSpQgV67XHakdHBw4duwYCxcuJCoqirx58zJv3jyaNm2a7hhbt27NokWL+Pnnnxk6dCj58uVj7dq11K1bN93XFARByO6eRyWw8thDVp/wB6Cgmx07BtX48CzDH3NgkvZ/mxxQZ2yaT/N76odCLeH8al0pcy/v9MdgQHqXhKWlJVFRUan23717l5w5jb/M+edq3bp1qfblzp2bu3fv6rYbN25M48aNP3id2NhYXr58Se/evVPsL1asGHv37k1zPHXr1k01TLxs2bKp9g0YMIABAwa89zrvGmo+efJkhg8fnmLfu17/kSNH0hyvIAhCVpegVDPwj4scuv16oES5PE5s6V8dhfwTlkKKfwmhr+Yg63cELO0/ePibboXfIkcUyDUSMgsLzHK6olKr0x+LgejdMaRVq1ZMmzYNpVK7PLpMJiMgIICxY8fStm1bgwcoZA6NRkNISAjTp0/HycmJVq1aGTskQRAE4ZXw2CTaLj+pS2wq5nVmRdcK/NW3avoTG0mCa1tg7avJ+Vzyg1OeNJ+u1qi5HX4bt+TOxF5eyIzU3/Rt6ZrEr127dri5uREfH0+dOnUIDg6mWrVqYkZYExYQEEC+fPnw8vJi3bp1qUYjCYIgCJlPkiR2XQ1i0o7rvIzTVir81q0iDYu7f/rFf28LD3xfbcig3gS9Tr8Weo14VTze0ZZAPOZeWWe0tN7fYI6Ojhw4cAA/Pz+uXLlCTEwM5cuXp0GDBh+drVbIunx8fMTPTxAEIQu5+zyaRb732H01CNAO3l3aubxhEhu/Ra8TmzKdoc5obc2NHs4GnwWgrMoTeJhlRkpBOpKbn376idGjR+uGBCdTq9V07dqVv/76y6ABCoIgCMLn5vyjcDr8egrNq785+9bKR5cqefFxTfus9e91atnrDsSV+2lX+k6Hc8HnAPCJsQbAPIvMTgzpTG5cXFxSdDhVq9V06tSJ69evGzQ4QRAEQficxCepWXH0AauOP0QjQW4na2Z9VYrahQ00YOfZZdg3Xvu4eGtoOjddl4lVxnLxuXYtSeeQeAAs8vl8enwGondys3v3bho1aoSjoyPt2rVDpVLRoUMHbt++zeHDhzMiRkEQBEHI9pJUGtr/epLrT7UjkkvkcmBNj0q4O1gZ5gY3d8Dfr+Yvs3KEtqv1Xpw52cXnF0nSJJHLxhPZkyAkwMLn/bPVZza9k5tKlSrx77//0rp1aywsLFi9ejX379/n8OHDuLsboB1QEARBED4z8Ulq+v9+QZfYTG1Vgq5V837aEO9kGg0cngHHf9ZuuxaG1stBkf6BI+eea5uk6lqVRorbDWZmWGSRpRcgnWtLffHFF2zYsIG2bdtSrFgxjh49iqurq6FjEwRBEIRsL0GpZtzWqxy9+wKFXMbSzuVpUtLDcDf432C4/If2ceV+0HjWJyU2AOeDzwNQKUk72auFlxcycz3XsspAaXp171psESBnzpw4OTmlWNl569atholMEARBELIxtUZi46lHLDl8n9CYJEBbY2PQxObYT68Tm4bToMbQT75kTFIMN8NuAlAw2oZ4wMLH55Ova0hpSm4cHR3fuf9js90KQkb64osvKFu2LAsXLjR2KJ9sypQpbN++ncuXLxs7lAzTo0cPIiIi2L59u7FDEQSjexQay5h/r3LWPxwAVzsL+tcpQOfKaZ9E74MkCfZPhFNLtNt5a0K17wxy6Ushl1BLanLb5cbqTrg2ucmXdfrbQBqTm7Vr12Z0HMIn6tGjB+vXr0+1P3nhzKyibt26mZ6QxMfHkzt3buRyOU+fPsXS0lL3XPL6Wy9fvsTJySlT4pTJZGzbto3WrVvr9o0aNYrvvjPMB8+H+Pj48PjxYwBsbGwoUqQI48ePp3379hl+70WLFom5lAQBOH7vBQP/uEh0ggoLhZwJzYvRuUoezBUGnN330sbXiU3176DBNDDQ7MHJ/W0qeVQiae8jIGuNlIJ0LL+Q7MWLF5w4cYITJ07w4sULQ8YkpFOTJk0ICgpK8U/MOwT//vsvJUqUoGjRolm21sDOzo4cOXJkyr2mTZtGUFAQly5dolKlSnTs2JGTJ0++89ikpCSD3dfR0TFFAikIn6N7z6Ppt+EC0Qkq8uawwXdkHbpX9zFsYgNw+U/t//nrQsPpBktsAI4/OQ5AFc8qJL5av9CyYCGDXd8Q9H61sbGx9OrVC09PT2rXrk3t2rXJlSsXvXv3Ji4uLiNiFNLI0tISDw+PFP+cnZ0BbQ2FhYUFx48f1x0/d+5c3NzceP78OaCtrRg8eDCDBw/G0dERV1dXfvjhhxR/bScmJjJq1Chy586Nra0tVapUSbVApZ+fH3Xr1sXGxgZnZ2caN27My5cv6dGjB0ePHmXRokXIZDJkMhmPHj0C4Pr16zRt2hQ7Ozvc3d355ptvCA0N1V0zNjaWbt26YWdnR+7cuVmyZEmay2X16tV07dqVrl27snr1at3+R48eUa9ePQCcnZ2RyWT06NHjk+KsW7cuQ4YMYcyYMbi4uODh4cGUKVN0z/u8apdu06YNMplMtz1lyhTKli2rO06j0TBt2jS8vLywtLSkbNmyKWrgHj16hEwmY+vWrdSrVw8bGxvKlCnDqVOnPloe9vb2eHh4ULhwYZYuXYq1tTU7d+7UxTd9+nS6deuGk5MTw4YN48iRI8hkMiIiInTXuHz5copyWbduHU5OTuzbt49ixYphZ2enS7aT9ejRI0Vt1cfKCuD27dvUrFkTKysrihcvzsGDB5HJZFk2SRWE94lPUvP76ce0WuJHvFK7sOTGXlXwdrEx/M1iQyHg1WdBg6npHu79Lk+in3A/4j4KmYIadqVRvfr+sCxs4snNiBEjOHr0KDt37iQiIoKIiAh27NjB0aNHGTlyZEbEaFSSJBGnjEvzv3hVvF7Hf+ifIavw69aty7Bhw/jmm2+IjIzk0qVL/PDDD6xatSrFEP7169djZmbG2bNnWbRoEfPnz2fVqlW65wcPHsypU6fYtGkTV69epX379jRp0oR79+4B2i+9+vXrU7x4cU6dOsWJEydo2bIlarWaRYsWUa1aNfr27aurWfL29iYiIoIvvviCcuXKcf78efbu3cvz58/p0KGD7r6jR4/m6NGj7Nixg71793LixAkuXrz40df94MEDTp06RYcOHejQoQPHjx/XNct4e3vz77//AnDnzh2CgoJYtGjRJ8WZXIa2tracOXOGuXPnMm3aNA4cOADAuXPa6ty1a9cSFBSk237bokWLmDdvHj///DNXr16lcePGtGrVSlfOySZMmMCoUaO4fPkyhQsX5uuvv0alUn20XJKZmZlhbm6eoobm559/pkyZMly4cIHRo0en+VpxcXH8/PPPbNy4kWPHjhEQEMCoUaM+eM6HykqtVtO6dWtsbGw4c+YMK1euZMIE/da+EYSs4MLjcGrOOcTE7deJV6qxtzJjS/9q5MmRAYnNzf/BorLax84+4FnGoJc/+uQoAOXcymHxKBgA89y5UdjZGfQ+n0rvsWD//vsvW7ZsoW7durp9zZo1w9ramg4dOrB8+XJDxmd08ap4qvxZxSj3PtP5DDbmaX/z79q1C7u33mDff/8933//PQA//vgjBw4coF+/fly/fp3u3bunWv3b29ubBQsWIJPJKFKkCNeuXWPBggX07duXgIAA1q5dS0BAALlyaYf/jRo1ir1797J27VpmzpzJ3LlzqVixIsuWLdNds0SJErrHFhYW2NjY4OHxejTAkiVLKFeuHDNnztTtW7NmDd7e3ty9e5dcuXKxevVqfv/9d+rXr49Go2H58uUprvs+a9asoWnTproarMaNG7N27VqmTJmCQqHAxcUFADc3txRNJumJs3DhwgCULl2ayZMnA1CoUCGWLFmCr68vDRs2JGdO7SyjTk5OKa79tp9//pmxY8fSqVMnAObMmcPhw4dZuHAhS5cu1R03atQomjdvDsDUqVMpUaIE9+/fp2jRoh8tm6SkJObNm0dkZCRffPGFbv8XX3zByJEj0Wg0REVF8fLly49eC0CpVLJixQoKFCgAaBPhadOmffCcD5XVgQMHePDgAUeOHNGV1YwZM2jYsGGa4hGErECl1tBn/XlexilxtDanf50C9Kjug7WFwvA3iwiEv795vV33e4PW2gAcDtRO1lvXuy6Jl7R/bFm++uzLSvRObuLi4t45WZ+bm5toljKyevXqpUouk7+8QfuF/ccff1C6dGny5s3LggULUl2jatWqyN74ZahWrRrz5s1DrVZz7do11Gq17ks8WWJioq6/yOXLl/XunHrlyhUOHz6cKjEDbc1LfHw8SUlJVKnyOsl0dnamSJEiH7yuWq1m/fr1LFq0SLeva9eujBo1ikmTJiHXsw36Y3G+mdy8ydPTk5CQkDTfJyoqimfPnqVYuw2gRo0aXLlyJcW+N+/l6ekJQEhIyAeTm7FjxzJx4kQSEhKws7Nj9uzZugQJoGLFimmO9U02Nja6xCY5no+97g+V1Z07d/D29k6RBFauXDldsQmCMTyNiKfjr6d0q3kfG1MPR+sMmgsmNhSWvvH7MewaOBlo5NUr0UnRXAi+ALxKbjZpm/kti2SD5KZatWpMnjyZDRs2YGWlnRI6Pj6eqVOnUq1aNYMHaGzWZtac6XwmTcdqNBqio6Oxt7fX+4vzfffWh62tLQULFvzgMckdR8PDwwkPD8fWNu2LsMXExKBQKLhw4QIKRcq/OpK/8K2t9Ys5+botW7Zkzpw5qZ7z9PTk/v37el8TYN++fTx9+pSOHTum2K9Wq3W1A4aMM5n5WxNZyWQyNBqNXvdKqzfvlZyUfuxeo0ePpkePHrp+Q7K3/rJ7+z2R/F5+s5lUqVR+MJbkeD7WtJqZZSUImUGtkTj1IIzFh+7phnkDTP+yRMYlNmEPYHUjUL6qYOiyxeCJDcChgEOoJBX5HPOR1yEvj151JrbKDjU3CxcupEmTJnh5eVGmjLYt78qVK1hZWbFv3z6DB2hsMpkszU1DGo0GlZkKG3MbgyQ3hvbgwQOGDx/Ob7/9xubNm+nevTsHDx5MEeuZMykTudOnT1OoUCEUCgXlypVDrVYTEhJCrVq13nmP0qVL4+vry9SpU9/5vIWFBWq1OsW+8uXL8++//+Lj44OZWeq3ZIECBTA3N+fMmTPkyaP9hY2IiODu3bvUqVPnva939erVdOrUKVU/jRkzZrB69WoaNmyIhYUFQKqY0hNnWpmbm6e69pscHBzIlSsXfn5+KV6fn5+fQWouXF1dP5oEvym5KS0oKEjXvJcZ8/EUKVKEwMBAnj9/rqstfl8fJUHICi48fsnof67wMDRWt698Hie+rpyH9hW9M+amd/bCll6gjAVzG+iwEQo1yJBb7Xq4C4CmPk2RNBoSXvUBtPxILbox6P0NXKpUKe7du8esWbMoW7YsZcuWZfbs2dy7dy9NfSCEjJOYmEhwcHCKf8kjedRqNV27dqVx48b07NmTtWvXcvXqVebNm5fiGgEBAYwYMYI7d+7w119/8csvvzB0qHZGy8KFC9OlSxe6devG1q1b8ff35+zZs8yaNYvdu3cDMH78eM6dO8fAgQO5evUqt2/fZvny5bo4fHx8OHPmDI8ePSI0NBSNRsOgQYMIDw/n66+/5ty5czx48IB9+/bRs2dP1Go1dnZ29O7dm9GjR3Po0CGuX7/OwIEDP5hAvnjxgp07d9K9e3dKliyZ4l+3bt3Yvn074eHh5M2bF5lMxq5du3jx4gUxMTHpjjOtfHx88PX1JTg4+L39WUaPHs2cOXPYvHkzd+7cYdy4cVy+fFn3s8hMBQsWxNvbmylTpnDv3j12796d6n2TERo2bEiBAgXo3r07V69exc/Pj4kTJwKkqm0SBGM76x9Ol1WneRgai72VGV9XzsORUXXZOrBGxiU2Ty9o+9goY8GtBPT8L8MSm0R1IldfXAW0TVLKp0+R4uKQWVhgkTdvhtzzU+id3Bw7dgwLCwv69u3LvHnzmDdvHn369MHc3Jxjx45lRIxCGu3duxdPT88U/2rWrAloayseP37Mr7/+CmibUVauXMnEiRNT9OPo1q0b8fHxVK5cmUGDBjF06NAUy2usXbuWbt26MXLkSIoUKULr1q05d+6crkalcOHC7N+/nytXrlC5cmWqVavGjh07dDUdo0aNQqFQULx4cXLmzKnrnOzn54daraZRo0aUKlWKYcOG4eTkpEtgfvrpJ2rVqkXLli1p1KgRVatWpUKFCu8tiw0bNmBra0v9+vVTPVe/fn2sra35/fffyZ07N1OnTmXcuHG4u7szePDgT4ozLebNm8eBAwfw9vamXLly7zxmyJAhjBgxgpEjR1KqVCn27t3L//73PwoVyvzhlubm5vz111/cvn2b0qVLM2fOHH788ccMv69CoWD79u3ExMRQqVIl+vTpo6uFS24SFwRj02gkvvvrEh1+PUWCUkPFvM4cH1OPWV+Vwsc17c3+6eI7DdRJ2rlsvj0Kucpm2K2OPTlGnCoOdxt3irgUIfHOHQAsChZA9gk12RlFJuk53lihUBAUFISbm1uK/WFhYbi5uen1F6wxREVF4ejoSGRkJA4ODimeS0hIwN/fn3z58qXrwzN5dImDg0OWbJb6GGPMHpwepl7OpiIrlrOfnx81a9bk/v37KTovJ/vU32FjUSqV7Nmzh2bNmqXqhyQYjqHLOSwmka6rz3IrSLuSd5V8LqzuUQk7y0z4so8IgF8qgjoRuu3QJjgZaMbpGWy6s4kuxbowrvI4XixZSuiSJTh++SW55sxOcWxGvZ8/9P39Nr1/ApIkvbNKOCwsTK/OqYIgCB+zbds27OzsKFSoEPfv32fo0KHUqFHjnYmNIGSW+yExrDvpz/8uPyMqQTuv1Le18zOuadHMazLdM1qb2OQsql03KoPdfantPFzEWdu/JuH6dQCsSpbM8HunR5qTm+SVwZNncX1zfR61Ws3Vq1epXr264SMUBOGzFR0dzdixYwkICMDV1ZUGDRpkSn8fQXiftX7+/Lj7FmqNttEjv6stizqVo5TXuxeYzhBBV+DuqxnLm8wCRcbWFIXGh3L5xWUAKrprp4qIv/EqucmifW3TXCLJK4NLkoS9vX2KIb8WFhZUrVqVvn37Gj5CIdO8vYyCIBhbt27d6Natm7HDEAQSlGqm7rzJX2cDAMif05ZJLYpTo6Cr4deF+pBwf1jXUvs4fz3tvwy24eYGNJKG0q6l8bL3Qvk8BPWLUJDLsSr28QlDjSHNyU3yyuA+Pj6MGjVKNEEJgiAIn4Wz/uF899dFnkclAtC8lCcLO5XN3KQGIOYFrG8JiZFgkwNaLjT4DMTv8p//fwD0KNkDmUxGwqtaG8uCBZGnY26zzKB3XVbyVOmCIAiCkN1JksT3267xPCoRR2tzRjQsTLdqeTN/OoKIANjUGSIDwcELeu8DR68Mv22cMo7nsdrFMcu5aUd3ZvX+NpCO5EYQBEEQPgdhMYn8cug+90NikMvg4Ig65LS3/PiJhqZWwcp6EBcKVk7Qfl2mJDYA/pH+SEg4WzqTw0q7zE68LrnJmv1tQCQ3giAIgpBKRFwSLX45QVBkAgDdqvkYJ7FJjIY1TbWJDWjns3H2ybTb3w6/DYC3g7duSZWE6zcAsBY1N4IgCIJgOg7fCSEoMgEbCwXz2pehcQmPj5+UEfwWw/NrIFNAw2mZmtgAnAo6BUDN3Nrh5qrgYNTh4WBmliWXXUgmkhtBEARBeCVRpeb0w3AWHdSum9SydC6alvL8yFkZ5OkFODZX+7j5PKjYM1NvL0kSV15oZ7BP7m+T3CRlWagQcksj1GSlkV5dvW/dusXatWu5fVtbTXX79m0GDBhAr169OHToUIYEKGQdU6ZMoWzZstnmPun16NEjZDJZpiweKQhC5jl8O4Qasw/Tfc1ZHoXFYW9lRvfqPsYJ5skFWNdC+9g2J1TokekhPI15SnBsMGYyM0q7lgYg4Vry/DbFMz0efaQ5udm7dy9ly5Zl1KhRlCtXjr1791K7dm3u37/P48ePadSokUhwjCwwMJBevXqRK1cuLCwsyJs3L0OHDiUsLEzva8lkMrZv355i36hRo/D19TVQtKbL29uboKAgSmbh9mZBENLuRXQiQ/66RM915wiNScRcIePrynnYObgmxXN9eJr/DOF/HDa0AmUcuBaBXvsyZcj3284EnQGgpGtJbMxtAIi/dAkAmyz8ByjokdxMmzaN0aNHExYWxtq1a+ncuTN9+/blwIED+Pr6Mnr0aGbPnv3xCwkZ4uHDh1SsWJF79+7x119/cf/+fVasWIGvry/VqlUjPDz8k+9hZ2dHjhw5DBBt5lOr1Wg0GoNcS6FQ4OHhoVsMVBAE0/XwRQzNFx/nf1eeAdCpkjenx9fPnIUv3+X8GtjYGpJiwLUw9NoLOYyz3MiRwCMA1MhdAwBJqST+2jUArMuXN0pMaZXm5ObGjRv06NEDgA4dOhAdHU27du10z3fp0oWrV68aPEAhbQYNGoSFhQX79++nTp065MmTh6ZNm3Lw4EGePn2qW00ZtBMxTp8+na+//hpbW1ty587N0qVLUzwP0KZNG2QymW777eaiHj160Lp1a2bOnIm7uztOTk5MmzYNlUrF6NGjcXFxwcvLSzcBZLKxY8dSuHBhbGxsyJ8/Pz/88ANKpTLNr/XIkSM4Ozuze/duSpcujZWVFVWrVuX6q7ZggHXr1uHk5MT//vc/ihcvjqWlJQEBAdStW5dhw4aluF7r1q117+3k1z9z5kx69eqFvb09efLkYeXKlbrn326WOnLkCDKZDF9fXypWrIiNjQ3Vq1fnzqtVc5P9+OOPuLm5YW9vT58+fRg3blyWbn4ThOwsPDaJjacf0/KXE4REJ+Jmb8maHhWZ3bY0OeyM1Jfk7j7YNRw0KijRBvoeBhsXo4QSp4zTdSau562dBTnh9m2khAQUjo5YvPpeyKr06nOTPGmRXC7HyspKtyQDgL29PZGRkYaNLguQJAlNXFza/8XH63f8B/6ldcH28PBw9u3bx8CBA1MsiwHg4eFBly5d2Lx5c4rr/fTTT5QpU4ZLly4xbtw4hg4dyoEDBwA4d+4coJ2VOigoSLf9LocOHeLZs2ccO3aM+fPnM3nyZFq0aIGzszNnzpyhf//+fPvttzx58kR3jr29PevWrePmzZssWrSI3377jQULFqT5Z5Js7NixzJs3j3PnzpEzZ05atmyZIkmKi4tjzpw5rFq1ihs3bqRayf5D5s2bR8WKFbl06RIDBw5kwIABqZKVt02YMIF58+Zx/vx5zMzM6NWrl+65P/74gxkzZjBnzhwuXLhAnjx5WL58ud6vWRCETxOeCH02XqTyjIP8sP06sUlqnGzMWdOjEl8UdTdeYLGhsKmL9nHhptBuLVjaGS2c00GnSVQnktsuN4WdCwMQf/EiANblyiGTZ/LszHpKc726j48P9+7d063Ge+rUKfLkyaN7PiAgAE9P/XuUL126lJ9++ong4GDKlCnDL7/8QuXKld97/MKFC1m+fLluIb127doxa9YsrKys9L53Wkjx8dwpX0Gvc54b6N5FLl5AZmPz0ePu3buHJEkUK1bsnc8XK1aMly9f8uLFC90XfI0aNRg3bhwAhQsXxs/PjwULFtCwYUNy5swJgJOTEx4eHx7+6OLiwuLFi5HL5RQpUoS5c+cSFxfH999/D8D48eOZPXs2J06coFOnTgBMnDhRd37ych6bNm1izJgxH32tb/rhhx9o2LAhAOvXr8fLy4tt27bRoUMHAJRKJcuWLaNMmTJ6XRegWbNmDBw4ENAmUQsWLODw4cMU+cDQxxkzZlCnTh0Axo0bR/PmzUlISMDKyopffvmF3r1707OndrTDpEmT2L9/PzExMXrHJghC+sQnqVl6Q0FoonbOmBK5HGhTLjdtyuU2Xm0NgFoJ2/qDRgn2ntDqF6P0sXnTHv89gLbWJrliI+6itr+NdblyRosrrdKceg0YMAC1Wq3bLlmyZIo+B//99x9ffPGFXjffvHkzI0aMYPLkyVy8eJEyZcrQuHFjQkJC3nn8n3/+ybhx45g8eTK3bt1i9erVbN68WfdF+rlLa00PQLVq1VJt37p1S+97lihRAvkbGby7uzulSpXSbSsUCnLkyJHiZ7p582Zq1KiBh4cHdnZ2TJw4kYCAAL3v/eZrcHFxoUiRIileg4WFBaVLl9b7ukCK82QyGR4eHu99X77rnOREP/mcO3fupEraP5TEC4JgWKExiYzcco3QRBlW5nL+6luVXd/VpE+t/MZNbGLD4O9ucF9bc079yWCX03jxAJGJkfgGaAePtC7YGtB+v+g6E5fP+slNmmtu+vfv/8HnZ86cqffN58+fT9++fXV/za5YsYLdu3ezZs0aXa3Cm06ePEmNGjXo3LkzoP2r/+uvv+bMmTPvvUdiYiKJiYm67aioKED7V/3b/TyUSqW2GUqj0XU+lSwtKXT+/c0yb5IkieiYGOzt7Ayy7ohkaZmmTrD58+dHJpNx8+ZNvvzyy1TP37x5E2dnZ3LkyPH6db16nW/GDqTY92Y5vOsYSZIwMzNLcYxMJnvnvuQOvadOnaJLly5MmTKFRo0a4ejoyObNm5k/f36K674dS4pyefX826/hzX0ajQZra2skSUqR9Mnl8lSvKykpKdW1PvQakvcnP07eVigUqV6DSqVKdfyHyjwr+VA5Z1UajQZJklAqlSgUCmOHk2bJn0X69D0T0u7UwzBG/3tdt/DlhCaFqZjHAZVKZdS4ZIGnUWztgywmGABNwYaoi7UBI78P9vvvR6VRUcipEPnt82u/L58+RRUSAmZmKIoW/eB7NaPez/pc75OHexw5coQqVaqk6uvxMUlJSVy4cIHx48fr9snlcho0aMCpU6feeU716tX5/fffOXv2LJUrV+bhw4fs2bOHb7755r33mTVrFlOnTk21f//+/di81eRjZmaGh4cHMTExJCUl6fV6dK/B2prYN2q4Pkl0dJoOMzc3p169eixbtoxevXql+Fk8f/6cP//8k44dOxL96noajYYTJ07oEj2A48ePU7BgQd0+c3NzYmJiUhyTmJiIWq1OkSCqVKoUx6hUKpKSklLs02g0JCQkEBUVxeHDh/H29mbw4MG65+/fv48kSbpz3r7P2+Lj4wHte69NmzYAREREcPfuXfLmzUtUVBQJCQkprpnMycmJwMBA3X61Ws21a9eoVauWbt+b8SZTq9UkJiYSFRWla0qKjY0lKiqKuLg4AKKjo3W1WLGxsQC6MixYsCAnT56kdevWumuePn36g68zq4hO4/swK0hKSiI+Pp5jx44Z/YsrPZL7vQmfLjIJTj6XcS9SzoNo7R+b1gqJ3kU0OIReZ8+e6x+5QsbyjDhPZf/FACSYOXAjd2ee2FWDvfuMGhfA7zG/A+CT4MOePdrmKftLl/EE4j092ZvGaV8M/X5O/qxNi09Obho1asSVK1fe29/jfUJDQ1Gr1bi7p+zA5e7urpsk8G2dO3cmNDSUmjVrIkkSKpWK/v37f7BZavz48YwYMUK3HRUVhbe3N40aNcLBIeX8BQkJCQQGBmJnZ5euPjySJBEdHY29vX2mrxi7bNkyatasSceOHZk2bRr58uXjxo0bjB07lty5czN37lzd65XL5Zw9e5Zff/2VL7/8koMHD7Jjxw527typO8bHx4dTp07RoEEDLC0tcXZ2xtLSEoVCoTvG3NwcMzOzFOVoZmaGhYVFin3JHdAdHBwoWbIkT548Yc+ePVSqVIk9e/awe/duZDKZ7py37/O25ORt3rx5eHl54e7uzsSJE3F1deXrr7/GwsICKyurFNdM1rBhQ0aNGsXx48cpUKAACxYsICoqCnNz8xTlkxxvMoVCgaWlJQ4ODtjZaTv52dra4uDgoEuS7e3tdefY2mqHkNrZ2eHg4MCQIUP49ttvqVatGtWrV+fvv//m5s2b5M+f/72v09iM+X5Or4SEBKytraldu3aG9cPLCEqlkgMHDtCwYUPMzc2NHY7JU6o1NF18ksfhr78MO1bMTd8aebhx9rjRy1l2ezdm/2oTG03uiig6/ElpGxfS14huWE9jnvLwfw+RIWNoo6HksssFwIuLl4gEPOrWpVSzZh+8Rka9n/X5QzDNyU3594xpV6lUtG3bVvdBcvFVb+qMcOTIEWbOnMmyZcuoUqUK9+/fZ+jQoUyfPp0ffvjhnedYWlpi+Y4pos3NzVMVulqtRiaTIZfLU/QjSavkqvvka2SmIkWKcP78eSZPnkynTp0IDw/Hw8OD1q1bM3ny5FTz04wcOZILFy4wbdo0HBwcmD9/Pk2bNtU9P2/ePEaMGMGqVavInTu3bvgzoHttMpnsna/1Q/tat27N8OHDGTJkCImJiTRv3pwffviBKVOmpLjum/d5W/LzM2fOZPjw4dy7d4+yZcuyc+dO3fsw+dy3r9GnTx+uXbtGjx49MDMzY/jw4dSrVy9VzB96DW9e+13bb99fLpfzzTff8OjRI8aMGUNCQgIdOnSgR48enD17NtPfK2llzPdzesnlcmQy2Tt/v02BqcadlcQmqhj81xVdYjOpRXFqF85JQTc7lEolN8gC5XzjH+3/ZtbIe+xCbq5fy0dGOhtyFoCKHhXJ65xXtz/hVX8buwoV0lx2hi5nfa4lk9LYC9Xc3JwGDRpQtWpV3T5Jkpg+fTr9+/fXjcKZPHlymm6clJSEjY0NW7ZsSVFV3717dyIiItixY0eqc2rVqkXVqlX56aefdPt+//13+vXrR0xMTJo+gKOionB0dCQyMvKdNTf+/v7ky5cvXX/1aTQaoqKicHBwyNJfBj4+PgwbNizVfC+m4tChQ9SvX5+wsDBcXIwzB4QhNGzYEA8PDzZu3GjsUN7JVN7Pb/rU32FjUSqV7Nmzh2bNmonk5hPsuvqMH7Zf52Wctm/Gz+3L0K6Cl+75LFPOqxtB4BntcO+SXxkvjneYe24uG29u5Jvi3zCmknYEqyo8nHvVtRP5FTrph9lHPnczqpw/9P39tjTX3Bw5coTu3btTuXJlJk+erPuwmzFjBoMGDaJ4cf3WmbCwsKBChQr4+vrqkhuNRoOvr2+K/hhviouLS/Uhm9xpUJ+RQoKQ2eLi4lixYgWNGzdGoVDw119/cfDgQdHHQhAM4EpgBD/uvsm5Ry8BcLQ2Z2nn8tQs5GrkyN4j7IH2f4dcxo3jHS4+17a+FHIqpNsXd1Zbm2NZuPBHE5usIs1/jtWoUYMLFy5w9+5dqlevzoMHDz755iNGjOC3335j/fr13Lp1iwEDBhAbG6sbPdWtW7cUHY5btmzJ8uXL2bRpE/7+/hw4cIAffviBli1bmtTICOHzI5PJ2LNnD7Vr16ZChQrs3LmTf//9lwYNGhg7NEEwWc+jEpi84zqtl/npEpsGxdzZN6x21k1sEmMgTjvPDq6FjRvLW57FPONG2A1kyKjtVVu3P/b0aQBsqlYxVmh606tDsaOjI3/99Rdr166lZs2aTJ069ZM6Gnbs2JEXL14wadIkgoODKVu2LHv37tV1Mg4ICEhRUzNx4kRkMhkTJ07k6dOnullpZ8yYke4YPkePHj0ydgifpG7durx8+TLLdsR9F2traw4ePGjsMAQh21hzwp/pu2+SXGnfoJg745oWpaCb8Wb1TZP9r5bCsXEFa2fjxvKWg4+1n1Hl3cuTw/p1P824M9qaG9s3uqVkdekaLdWzZ09q1qxJly5dPnm45eDBg9/bDHXkyJEU22ZmZkyePDnN/XoEQRCE7Gfv9WB+2ncHSQJvF2umf1mSukXSvryK0Ty9CBc3aB83+tHosxC/7ciTIwA0zNtQt0/5/DlJ/v4gl2NTsaKRItNfuoeCFypUiNOnTxMdHW1Sf0Gnhei/IwimSfzuZn/PoxIY/OdFVBqJYp4O7PquJgp51koSUkmIguPz4OQvIGkgb00o08nYUaXyIELb3aS82+vR0XGvJsm1Kl4chQl916e5z01oaGjqk+VyHB0dTWYOjI9J7tWtz0RBgiBkHcm/u2LEUfb037Ugmi8+jkojkcPWgn/6V8v6iQ3Aps7gtxAkNeSpDh02ZLlamyfRTwhPCEcuk+Nl/3qEWexpbXJja0L9bUCPmht3d3fq1q1L7969adu27TvnjjF1CoUCJycn3XpANjY2eiVuGo2GpKQkEhISTGborCkS5Zw5TKmcJUkiLi6OkJAQnJycxACDbOZ+SAyz/7vNwVuvlyXuWcMHO8tPnoc24wWeg0fHtY/b/AqlO2a5xAZg3yPtzMiVPCphb2Gv259cc2NTxXT624AeyY0kSVhYWNCzZ08GDx5Mly5d6N27N2XLls3A8DJf8irYH1sk8V0kSSI+Ph5ra+tsU5uVFYlyzhymWM5pWcleMB1xSSo2nHrMvP13UKq1TY7NSnkwtklR8uawNXJ0aaBKgvUttY9zlc+STVEAao2a7fe3A9AobyPd/qQnT1A+fQpmZiaxWOab9Ep7169fj1wuZ/369axZs4Zly5ZRtmxZ+vTpQ5cuXbJF3xuZTIanpydubm56L/qlVCo5duwYtWvXFtXiGUiUc+YwtXI2NzcXNTbZRIJSzf8uP2P8tmuoNdqkpmp+F3rXzE/D4u4fOTuLUMbDnlGg0q6FR5PZxo3nA3Y93MWjqEc4WjrSPH9z3f64V0PArUuXRm5rAsnkG/Su03N1dWXkyJGMHDmSU6dOsWrVKsaOHcuoUaNo27YtGzZsyIg4M51CodD7g1KhUKBSqbCysjKJLwNTJco5c4hyFjKbJEksP/qAVcf9CY99vXjx982K0rNGPswVWbt5VCf4OmzuCi/9tds1R0CerNlnRSNpWH5lOQA9SvTA1vx1EhN78iRgev1tQI/k5l3V0tWqVaNatWosXryYTZs2sWbNGoMGJwiCIHwe/ENjmbj9Gn73wwDIaW9J92p5qV/MnWKeJtQq8OQ8rKqvfWybE6oPgaoDjRvTB5wPPs/TmKfYm9vTtVhX3X5JpSLG71VyU7OmscJLN7363LyPra0tvXv3pnfv3gYJShAEQfg8vIxNYsXRB6w+4Y9KI2FhJqd5KU/mtC2NhZmJ1NQAJMXBpY2w99Ws+o7e0O8I2GbRmZJf+d+D/wHQOF9jrMxer8cWf+0amshI5A4OWJfOCuuV6yfNyc3atWtxdHTMyFgEQRCEz0iCUk2bZX48CtMO4a+cz4Wf2pU2jc7CydQquPw7HJ4FMcHafW7F4eu/snxiE6eM48Bj7fp2rQq0SvFc7HHtCC/bGtWRmZnAqLS3pDni7t27Z2QcgiAIwmdCqdaw7dJTFvve48lLbYfbmW1K8XVlb5MZmQdAfASsaQIvbmm3HfNA2c5QYwhYZP0E7WDAQeJUcXjZeVE2Z9kUz8Uc0yY3drVqv+PMrE+vdEySJB49eoS3tzdmZmYkJSWxbds2EhMTadasGa6uWTtLFQRBEIwnSaVh3v47/Hk2gOgE7dI9DlZm/NimFK3KZL0Vsj/q8AxtYiM3g/qToEp/MDOdOeCuvrgKQB3vOimSSlVYGAnXrwNgW7OGUWL7VGlObu7cuUPjxo0JDAwkf/787N+/n/bt23P79m0kScLGxoaTJ09SqFChj19MEARB+KzEJKoY9+9Vdl0NAsDZxpy25b0Y0agwNham1+zBg0NwdqX2cfUhUGOocePRk1qj5sTTEwCUdSub4rnYE9r9lsWKYe5mAmt2vUOae2uNHTuWMmXKcPnyZVq0aEHz5s3x8vLi5cuXhIeHU61aNaZNm5aRsQqCIAgmJkGpZs7e29SYfYhdV4Mwk8tY1KksFyY2ZGKL4qaZ2ARfhy2vBtCY20DNYUYNJz3OP381SsrCnrpedVM897pJqpYRIjOMNL+rTp48yf79+ylVqhQ//vgjixYtYuXKlbr5L8aNG8fXX3+dYYEKgiAIpufQ7RCWH9EuyOjtYs0PzYvTqIQJzyJ93xf+7AgaJdjkgIFnwMr0BttcD9U2O1XzrJZilJSkVBLzqubGrvZnkNzExMTg4uICaId+29ra4unpqXve29ub58+fv+90QRAE4TPkHxoLgK2FggPD62BlbsKzSN/5D/56tYSCe0n4ZjvY5TRqSOkhSRK7Hu4CUjdJxV24gCYyEoWzM9blTGvJhTeluVkqV65cBAQE6Lbnzp2L2xttcS9evMDZ2dmw0QmCIAgmKzA8jp/23QGgfUVv005srm15ndjkrwt9D5lkYgNw8tlJ7kfcx9rMmi8LfpniueiDvgDYfVEPmQkvZ5Lm5KZBgwbcvn1btz1gwADs7V+vHLp//37Kly9v2OgEQRAEkxQWk0ivded02x0reRsxmk+gjIfdI+HfV31sLOyh3VqTGhX1to23NgLQrnA7HCxez/4sSRLRvtrkxr5+A6PEZihpbpZasWLFB5/v2LGjmAtHEARB4Kd9t1lx9KFu0cvFX5czrSUUkkkS/DcGLr5aM7FYK2i9DCztP3xeFvY46jF+T/0A6FikY4rnEm7cRBUUhMzGBtvq1YwRnsEYrJt6vnz5DHUpQRAEwQRJksT8A3dZeljbgdje0owFHcvSwFRW8n7b393glnZ5AhrPhGqDjBuPAex/tB+Aqp5VyeuQN8Vz0Qe1sxXb1ayJ3Moq1bmmxATH4AmCIAhZ0YGbz/nl0H0AGpdwZ36HsthamuDXjFoJOwa/TmxKttNO0GfiJEli/2NtctPIp1Gq52OSm6Qa1M/UuDKCCb7rBEEQhKwmODKB9aceAVAlnwvLu1RALjehpRSSJUTC9oFwWzuaiKItoN1q48ZkIBdDLnI7/DYWcgsa5EnZpybp0SMS790HMzPs6tQxUoSGI5IbQRAEId0kSWLZkQcsOHAX1as+Nt9Uy2uaic2zy7ClJ4Q/1G63XAwVsk9f0jXX1wDQqmArnK1Sjm5O7khsW7kSimywSLZIbgRBEIR0iYxXMmHbNd2SCmW8HOlWzYfmpTw/cmYWFBsG61tCYhQ45Ibm86BIU2NHZTB3X97l2JNjyJDRo0SPVM9H/bcXAPuGDTM5soyhd3KjUCgICgpKMccNQFhYGG5ubqjVaoMFJwiCIGRN90NiaLPUj+hE7QKYA+sWYHTjIqa1qney0Huwc6g2sXHJD318wcbF2FEZ1NrrawFokLdBqo7ESQEB2oUy5XLsG6Xui2OK9E5uJEl65/7ExEQsLCw+OSBBEAQha7vw+CVtl58EwFwh45evy9OkpAkuqZAUB0dmwqllIL36w7zJnGyX2ATHBrPXX1sz07tk71TPJ9fa2FatglmOHJkaW0ZJc3KzePFiAGQyGatWrcLOzk73nFqt5tixYxQtWtTwEQqCIAhZRmSckm6rz+i21/WsTI2CrkaMKJ1ePtIufvn0vHY7TzWoMQwKZ4+aizctu7wMlaSiontFSriWSPV81J49ADg0a5bZoWWYNCc3CxYsALQ1NytWrEDxxrTMFhYW+Pj4fHSiP0EQBMF0qTUSXVafJjZJW8vx97fVqJzPBGs5EqNhZT2IDwdLR2gyC8p2BlNsUvuI4Nhgtt3fBsCgsqnn6Ul8+JDEO3fAzAz7BqY9K/Gb0pzc+Pv7A1CvXj22bt0q1pESBEH4zPx78QnXn0ZhJpexfVANSuY2wVE1kgbFX+21iY2FPfQ/Ds55P36eifIN0I6CKpOzDBU9KqZ6PmrPfwDY1qiOwskpM0PLUGleWyrZ4cOHUyQ2arWay5cv8/LlS4MGJgiCIGQda/38GbPlKgA1CrqaZmKjSqTqw/nIk5uiGk7J1okNwJ6H2ianJj5NUj0nSRJR/2mTG4em2WdkGKQjuRk2bBirV2snNFKr1dSuXZvy5cvj7e3NkSNHDB2fIAiCYEQhUQkM/OMCU3feBCCXoxUz2pQ0clTpI/edjHvUVSQzK+iwESr1MXZIGepO+B2uhl5Fhowm+VInN4l375L04AEyCwvs65v+rMRv0nu01D///EPXrl0B2LlzJ48ePeL27dts3LiRCRMm4OfnZ/AgBUEQhMwVk6ji16MPWH/yEVEJKmQy6Fk9H0PqF8TJxsRGxiZEwtG5KM6vAkDdeiVmxVsZOaiMlahOZPLJyQDUzF0TV+vUnb4jt+8AwK5OHRT2prsY6LvondyEhYXh4aEd8rdnzx7at29P4cKF6dWrF4sWLTJ4gIIgCELmCgyPY/Bfl7gSGAFAiVwOzP6qNKW8TLApSqOGPzpA4GkA/HPUw6tI9hkV9D6bb2/mRtgNrM2sGV1pdKrnJZWKyF07AXBs0zqTo8t4eic37u7u3Lx5E09PT/bu3cvy5csBiIuLSzGCShAEQTAtkfFK/jjzmHn776LWSFibK5jbrjTNSnmiMMXlFFRJsL4FBGqHrqsbzeJqSC68jBxWRktUJ7LuxjoAxlQaQz7HfKmOiT15EvWLUBTOztjVrJnJEWY8vZObnj170qFDBzw9PZHJZDR4NXTszJkzYp4bQRAEE5SgVLP8yAOWHbmPUq2dqLWohz0/tStjmrU1AMoE+Le3LrGhUl80FXvDqwnrsrMd93fwIv4F7jbufFngy3ceE7l9OwAOLVogy4YT8Oqd3EyZMoWSJUsSGBhI+/btsbS0BLTLMowbN87gAQqCIAgZQ6nWsPd6MPMP3MU/NBaAHLYW9KqZj/51CphmbU2yo7Nfr+zdYQMU/xKUSuPGlAmUGiWrr2kH/fQs2RNzhXmqY9RRUUQf1A4Rd2z97uTH1KVr4cx27dql2te9e/ZZOVUQBCE7S1Jp2H75Kev8HnEzKAqAnPaW9KjuQ88aPthYmPCaypIEF9aC36s+oE1maxObz8TBxwd5FvsMFysXvir01TuPifpvL1JSEpaFCmFVvHgmR5g50vUOjo2N5ejRowQEBJCUlJTiuSFDhhgkMEEQBMFwJEli341gfG+F4Hc/lGeRCQDYWZrRvXpeetfMj4utiTdPPLkAvlPB/6h2u2BDqNLfuDFlsuQ1pL4s+CXWZtbvPCZyh3aUlGPr1qa50Gka6J3cXLp0iWbNmhEXF0dsbCwuLi6EhoZiY2ODm5ubSG4EQRCyGEmSmPy/G2w49Vi3z9nGnO7VfWhb3gtvFxsjRmcgLx/Buuagige5GdQZBzWGZMslFd7nVtgtDgUeQoaMlvlbvvOYpEePiL94EeRyHFq2yOQIM4/eyc3w4cNp2bIlK1aswNHRkdOnT2Nubk7Xrl0ZOnRoRsQoCIIgpNP1p5EM2XSJhy+0fWqalfKgXQUvKufLgZ2lCTc/venmDtg1XJvY2LpB7/3gknqEUHamkTT8fP5nAJrka0Ih50LvPO7lP/8AYFerFuZubpkWX2bT+519+fJlfv31V+RyOQqFgsTERPLnz8/cuXPp3r07X3317jY+QRAEIfNIksTsvbf59ehDACwUckY3LkKfWvmyT1NEbBgc+wnOaKckwSkvtF7+2SU2AH5P/TgbfBYLucU7F8gE0CQlEblVu4imU8cOmRleptM7uTE3N0cu167a4ObmRkBAAMWKFcPR0ZHAwECDBygIgiDob8imy+y88gyA0l6OLO9agdxO7+6DYXJUSeC3EE4sAGWcdl/RFtBuDZhZGjU0Y0hUJzLn3BwA2hdpT16Hd6+XFePri/rlS8zc3LCrXTszQ8x0eic35cqV49y5cxQqVIg6deowadIkQkND2bhxIyVLmuZ6I4IgCNmFUq1h+6WnusRmTJMiDKhTIPvU1jy9AFt6w0t/7bZTHmg8U5vcZJfXqKdfr/zK46jHuFq7vrfWBiDiVZOUU7u2yMyySZPke+j96mbOnEl0dDQAM2bMoFu3bgwYMIBChQqxZs0agwcoCIIgpM2959H03XCeR2Ha2owaBXMwsG5BI0dlIPERcHYlHPsZ1IlgZgUNp0GFnmBm4qO8PoFao2bXQ+18PiMqjMDe4t1rRCUFBBB78hTIZDi1bZuZIRqF3slNxYoVdY/d3NzYuzf7z/YoCIKQlUmSxLIjD1h08B5Jag0yGXSrmpeRjYsYO7RP9+QCnF4Gt3ZqkxoAl/zQfSc4ZveFFD5u3Y11BMUG4WDhQCOfRu89LuKfLQDY1qyJee7cmRWe0WTveilBEITPwPDNl9l+WdsMVSKXA0s6lyefq62RozIAtRI2fAlJ2tYCnPJC/UlQvDUoxNdXaHwov179FYBRFUdhqXh3fyMpKYmIrVsBcOrQPtPiM6Y0vTvKlSuX5vbaixcvflJAgiAIQtr9eSZAl9h8Wzs/45oWzT79a0Juvk5seu2H3BVEUvOGvf57iVfFUzxHcVoXbP3e46IPH0EdFobC1RX7unUzLT5jStO7pHXr1hkchiAIgqAPSZKYuvMm604+AiCfqy2jGxfJPokNwOkV2v8LN4U8VYwbSxaTpE5i6eWlADTK2+iDP/eXf/wBgNNXXyEzT73WVHaUpuRm8uTJGR2HIAiCkEbhsUnM/u8Wf59/AkDPGj6Ma1oUM4XcyJEZULg/XPtb+7h8N+PGkgVtubuFGGUMLlYudCnW5b3HJdy5S9zZs6BQ4Px1p0yM0LhE/Z4gCIKJUGskft5/h42nHhOTqALg2zr5Gd+0mJEjywCnloJGBd5VoGgzY0eTpTyNecovl34BoFfJXliZWb332Je//w6AfcOGmHt6Zkp8WYFIbgRBEEzAzivP+Hn/HR6/GuZdxN2e8c2KUqdwTiNHZmCSBEdmw7nftNulOxo3nixGkiTGHBtDjDKG0q6lP1hro3r5ksidOwFw+aZrZoWYJYjkRhAEIQu7+zyayTtucOphmG5f67K5+Kl9GcyzUzNUsv8Nhkva2gYq9ICKvYwaTlZz/Olxrr64irWZNbNrz8ZM/v6v8ch//0VKSMCyeDGsy5fPxCiNTyQ3giAIWZAkSfzvyjOGbroMgEIuo0253PSo7kPJ3I7GDS6jBJ59ndhUHaideTg7dZA2gN+uamu0mudvjre993uPk1Qqwv/8EwCXrt9kr47maZDu5CYpKQl/f38KFCiAWTafxlkQBCEznbwfyph/r/LkZTwART3sWd61QvaYu+Z9Qu/Bv721j72rQpNZxo0nC7oeep3LLy5jJjejX6l+Hzw2+vBhVM+CUDg749D88+uzpHedZlxcHL1798bGxoYSJUoQEBAAwHfffcfs2bMNHqAgCMLn5M8zAXRdfYYnL+OxMpfTr3Z+/je4ZvZObMIfwoqaEBEACgtoNN3YEWU5kiTx6xXthH1NfZriaffhzsHh69cD4NShA3LLz28xUb2Tm/Hjx3PlyhWOHDmCldXrHtoNGjRg8+bNBg1OEAThcyFJ8NsJf77fdg2NBA2KuXHm+wZ836wYFmbZsG9NMo0GtvQCVQLYe0L/E+Bd2dhRZTk7HuzgyJMjyGVyupfo/sFj469cIf78BTA3x7nz15kUYdaid3vS9u3b2bx5M1WrVk3RhleiRAkePHhg0OAEQRA+B763Qph1RcHz+HuANrFZ2qU8lmYKI0eWCc6uhGeXtI+//gtyZoP1sAwsKimK+efnAzCo7CCKuHy4jMJWaxexdmzRAnN39wyPLyvS+8+BFy9e4Obmlmp/bGxsujosLV26FB8fH6ysrKhSpQpnz5794PEREREMGjQIT09PLC0tKVy4MHv27NH7voIgCMYmSRL/nA+k/5+XeR4vw8JMztgmRfmtW8XPI7F55Ad7x2ofl+sKucoZN54savHFxbxMfEleh7z0Kvnh0WNJjx8TfeAAADl69cyM8LKkdK0Kvnv3br777jsAXUKzatUqqlWrpte1Nm/ezIgRI1ixYgVVqlRh4cKFNG7cmDt37rwzgUpKSqJhw4a4ubmxZcsWcufOzePHj3FyctL3ZQiCIBhVWEwi3268wPnHL3X7jo2qjYdTNu5b8yaNBnaP1D7OWRRaLDJuPFnUw4iH/Hv3XwB+qPrDB4d+A4StWweShG2d2lgWKpQJEWZNeic3M2fOpGnTpty8eROVSsWiRYu4efMmJ0+e5OjRo3pda/78+fTt25eePbXZ5YoVK9i9ezdr1qxh3LhxqY5fs2YN4eHhnDx5EvNX62P4+Ph88B6JiYkkJibqtqOiogBQKpUolUq94v2Y5OsZ+rpCSqKcM4co54yh0Uhsv/KMOfvuEh6rRC6D1mU8KUYgDhayz6a85QcnoXhxC0mmQNV6JWgk0GTsaze197QkSUw/PR2VpKKaZzXKu5b/YOyqsDAit24DwKl7D6O9zowqZ32uJ5MkSdL3Bg8ePGD27NlcuXKFmJgYypcvz9ixYylVqlSar5GUlISNjQ1btmxJsTBn9+7diYiIYMeOHanOadasGS4uLtjY2LBjxw5y5sxJ586dGTt2LArFu6twp0yZwtSpU1Pt//PPP7GxsUlzvIIgCJ8qSQ3r7sm58VLbIyCHpUS3Qmp87I0cWCbLH7KXUk+1c7Dc9GzHPY9WRo4oa7qWdI3NcZuRIWOY/TByKHJ88Pgc+w+Qw9eXBC8vAgYPynZzBMXFxdG5c2ciIyNxcHD44LHpmqCmQIEC/Pbbb+kKLlloaChqtRr3tzo7ubu7c/v27Xee8/DhQw4dOkSXLl3Ys2cP9+/fZ+DAgSiVyvcu7jl+/HhGjBih246KisLb25tGjRp9tHD0pVQqOXDgAA0bNtTVLAmGJ8o5c4hyNhyNRmLdqcesPfmY4ChtTfLguvkZUCc/Fmbyz6esVYnaGptXiY26Yl8KNZ5FZjWemFI5KzVKtvhugTjoVLgT31T85oPHa+LieDRrNhrAZ9gwSjZulDmBvkNGlXNyy0tapCu50Wg03L9/n5CQEDQaTYrnateunZ5Lpvm+bm5urFy5EoVCQYUKFXj69Ck//fTTe5MbS0tLLN8xxt/c3DzD3twZeW3hNVHOmUOU86e5HxJN59/OEBKtTWpc7Sz4sXUpmpT0SHVsti7rgDOwYxCEaUeEUWccijpjUcgzf5i7KZTz5OOTufziMuZyczoX7/zReMO2bkMTEYF5njw4NW2C7D2tGZnJ0OWsz7X0Tm5Onz5N586defz4MW+3aMlkMtRqdZqu4+rqikKh4Pnz5yn2P3/+HA+P1L/0AJ6enpibm6dogipWrBjBwcEkJSVhYWGh56sRBEHIOPeeR9NtzVlCohNfTchXgIF1C2Blbvwvnkx1axdsTl7gUQZtfoUyYkHM9/F76sfOhzuRy+QsqLsAH0efDx6vSUggbPVqAFy/7ZclEhtj0ztl7t+/PxUrVuT69euEh4fz8uVL3b/w8PA0X8fCwoIKFSrg6+ur26fRaPD19X3vqKsaNWpw//79FLVFd+/exdPTUyQ2giBkGRcev6TbmrM0WniMoMgEXGwtODKqHiMaFv78EpuwB/DfGO1j95Iw5JJIbD4gVhnLj6d/BKBz0c7U8a7z0XMi/v4HdWgo5rly4dhK9F+CdNTc3Lt3jy1btlCwYMFPvvmIESPo3r07FStWpHLlyixcuJDY2Fjd6Klu3bqRO3duZs3SrjEyYMAAlixZwtChQ/nuu++4d+8eM2fOZMiQIZ8ciyAIwqeQJImLAREsOXSPw3de6PZXy5+D2W1L4eFo9YGzsyGNRjtB3/4JoFGBlSP02A3WTsaOLEtbe30tT2Ke4GnrycCyAz96vCYxkbBVqwDI0a8fsize3JZZ9E5uqlSpwv379w2S3HTs2JEXL14wadIkgoODKVu2LHv37tV1Mg4ICED+Rnust7c3+/btY/jw4ZQuXZrcuXMzdOhQxo4d+8mxCIIgpEeiSs0fpwP4/fRjHobGAtoVvL8sk4tBXxSkQE47I0doJLuGwUXt+kZ4lIIvl4rE5iNilbH8eVvb2Xp0pdHYW3x8GF3k1q2oQkIw8/DA8as2GR2iyUhTcnP16lXd4++++46RI0cSHBxMqVKlUnXwKV26tF4BDB48mMGDB7/zuSNHjqTaV61aNU6fPq3XPQRBEDLCtSeRDPjjgm71bitzOc1L5WLwFwWz90KXHyJJcPzn14lN2a7aFb6tDDs6NTvaeHMj0UnR+Dj4UD9P/Y8eLyUlEbpSO3I5R98+yEX3DJ00JTdly5ZFJpOl6EDcq9frKaCTn9OnQ7EgCIIpW3X8ITP23EKSwM3ekqENCtGqTC7srT7zZoETC+CQts8IZb6G1kuNG4+JOPj4ICuvrgSgV8leyGUf7xIbsX07qqAgzHLmxKldu4wO0aSkKbnx9/fP6DgEQRBMxt7rwfy4+xYAZbydWN+zEk424q9mAE4t0f5ftAV8ucy4sZiIsPgwJp2chFKjpI5XHVoV+HinYEmpJOxXbTKUo28f5O+Y8uRzlqbkJm/evLrHx44do3r16piZpTxVpVJx8uTJFMcKgiBkJ88i4lnr589av0cANC/lyZLO5dK1aHC2dP1fiAvTPm6xEIwwh42pUWvUjDk2huikaAo6FWRBvQUo5B8fURexdRvKp09R5MiBU/v2mRCpadG7Q3G9evUICgpKtbBlZGQk9erVE81SgiBkO4Hhcfx5NoBVxx+iVGub56vlz8HcdqVFYpMsLhx2aBdUJlc5sMtp3HhMxIabGzgbfBZrM2t+qv0T5vKPN2tqEhIIXapt7nP99lvk1tYZHabJ0Tu5Se5b87awsDBsbT/TDnSCIGRLCUo1XVad4cIbK3cX83RgyBcFaVTCA4VcJDYAqJXwR3tQakeL0X2nceMxEbfDb7PiygoAxlUeR0HntI1CfvnHH6hCQjDPlQunTmLOoHdJc3Lz1VdfAdrOwz169EixpIFarebq1atUr17d8BEKgiAYwVn/cIZvvszTCO1IqDLeTvSrlZ+mJT2Qi6TmNf9jsGvE62UVeh8Ay89sJdB0CIsPo/+B/sSp4qjkUYnWBVun6Tx1VJRuhJTrkO/ECKn3SHNy4+joCGhrbuzt7bF+oxrMwsKCqlWr0rdvX8NHKAiCkIkkSWLdyUdM3XkTABsLBUs6l+OLou4fOfMzdPUf2NpH+9jGFVrMB+/Kxo3JBEiSxMwzMwlLCMPHwYeF9RamaXQUQNiaNWgiI7EsVBDHli0zOFLTlebkZu3atQD4+PgwatQo0QQlCEK21HqpH1eeRAJgb2nG3uG1ye0k+jSkcno57B2nfZyrPHTbrp2FWPiofY/3sf/xfsxkZsyqNQsHi7TNAaR68YLw9RsAyDlsmFhD6gP07nPzvtW3BUEQTFVMoop/Lzxh9Ql/AsLjAOhdMx/jmxbFTCFG/KRydz/s+1772KcWdPpDJDZplKRO4rer2malniV7UtK1ZJrPfbFkKVJ8PNZlymD3xRcZFWK2oHdyIwiCkF1oNBJ/nA1g7n+3iU5UAWBhJqdb1bxMbFHcyNFlUZf/hD2jQdJoE5su/4C5qNlKC0mS+P7E99x9eRdbc1s6F+uc5nMT7twl4p9/AHAbPUqM0vsIkdwIgvBZCotJpOPK09wPiQHAycac4Q0K07pcbhytP/NZht9FlQi7R8Kljdptpzzw9V8isUkjSZKYc24O+x7tw0xuxoK6C3C1dk3zuSFzZoNGg33jxthUrJjB0Zo+kdwIgvBZCY9NYt3JR6w6/pC4JO28XIPqFWBA3YLYWYqPxPfaMzplYtPzPzEqSg/b72/nj1t/ADChygSq5aqW5nNjjhwh9uQpZObmuI0elVEhZiviN1kQhM/G/hvBjN5ylch4JQCF3OwY17Qo9YuJkVAftGMQXPpd+7jhdKj+HYhmkTQLjA5k1tlZAPQv0592hdO+DpSkVBIy9ycAXHp0x8LLK0NizG7Sldz4+vri6+tLSEgIGo0mxXNr1qwxSGCCIAiG9IvvPeYduAtA3hw2jGhYmBalc4mJ+D7m3OrXiU31IVBtkEhs9CBJEj+e/pF4VTylc5ambyn9pkx5+dcmkvz9UeTIQY5vv82gKLMfvZObqVOnMm3aNCpWrIinp6fo1CQIQpb3OCyW+Qe1iU3Tkh4s6FgWK3MxjPajnt+A/RO1jws3gUbTjRuPiVFqlCy6sIiTz05iIbdgRo0ZWCjSPumeOiKCF6+WWcg5ZAgKO7uMCjXb0Tu5WbFiBevWreObb77JiHgEQRAMbsXRB0gSlPV2YnnXCsYOxzSoVfB7O1DGgVcl6PiHsSMyKZIkMezwMI49OQbA0PJD8XH00esaL5Yu007YV6QITu3aZkCU2ZfeyU1SUpJYZkEQBJNx73k0f50NBKBPrXxGjsaEXPkTop9pH7daAgrRRVMfp4JOcezJMSwVlsyoOYPGPo31Oj/xwQNe/vUXAO7jxooJ+/Sk9+xUffr04c8//8yIWARBEAxGpdbw97lAmi8+AUBpL0dalM5l5KhMxNW/4X+vVviu1Bfciho3HhN0NPAoAK0KtNI7sZEkieDpP4JKhV39+thWS/vIKkFL71Q8ISGBlStXcvDgQUqXLo25ecr5IObPn2+w4ARBENIjPknNt79f4NjdFwDkcrRifoeyxg3KVFzbAltfdXr1LAONZxo3HhP0MuEl//n/B0BlD/3X2or+7z/iTp9GZmmJ+/jxhg7vs6B3cnP16lXKli0LwPXr11M8JzoXC4JgbOGxSXT+7TS3g6ORy2BI/UL0q50fGwvRrPJRj0/Ctv7ax3mqQevlYCZWndbX/AvzeZn4koJOBamft75e56pjYnk+ew4Arv2/xcIrd0aEmO3p/dt++PDhjIhDEAThk2g0En4PQhn9z1WCoxKwNlfwy9flaFBczGGTJsHX4K+vQaPUJjad/wartC3oKLzm+9iX7fe3A/BD1R8wl+s323XosmWoQkIwz5MHl169MiDCz8Mn/Snz5MkTALzEpEKCIBhRWEwi3268wPnHLwHt+lC/96lMhbwuRo7MRFzfCtu+BXUSuJeCzptFYpMOEQkRTDo5CYCORTpS3r28Xucn3rtH+Abtqt8eEycgt7Q0eIyfC707FGs0GqZNm4ajoyN58+Ylb968ODk5MX369FQT+gmCIGSGYZsv6xKbr8rlxndEHZHYpIVGA+fXwL99tIlN4SbQ/X9ihe90iFfFM+TwEKKSosjnmI9xlcfpdX6KTsQN6mNXu3YGRfp50LvmZsKECaxevZrZs2dTo0YNAE6cOMGUKVNISEhgxowZBg9SEAThXW4+i2LlsQccvxcKaNeIGt1YjOxJk6ArsPkbiHis3S7dEVqvALnef/MKwNJLS7kUcgk7czt+qv0TZnL9vl6jdu8h7uxZZFZWuI8TnYg/ld7Jzfr161m1ahWtWrXS7StdujS5c+dm4MCBIrkRBCHDJSjVDP7zIgdvhej2Vc3vwqhGRYwYlQm5sxf+6QGqeO12+W7QfIFIbNLpQcQD3aKYs2vNpoiLfu9DdWQkz+fMBkQnYkPRO7kJDw+naNHUfxkVLVqU8PBwgwQlCILwIacfhukSm1qFXPmmal4aFHMXIzbT4tIfsGOg9rFrYWizAnKLWZvTK14Vz4gjI1BJKup516OOdx29r/F87lzUL0KxyJ9fdCI2EL3T9DJlyrBkyZJU+5csWUKZMmUMEpQgCML7BIbHMWnHDQDqF3VjY+8qNCrhgVwsgPlxwddfJzZFmkHfwyKx+UQ/n/uZh5EPcbFy0bufDUDsyZNE/rsVZDI8f5yO3EIMvTcEvWtu5s6dS/PmzTl48CDVXs2aeOrUKQIDA9mzZ4/BAxQEQUi2+2oQg/68qNvuWMnbiNGYGLUKVmj7SeLgBe3XizlsPtHJZyf5++7fyJDxY40fyWWn3wzYmrg4giZNBsC5c2dsyus3ukp4P71rburUqcPdu3dp06YNERERRERE8NVXX3Hnzh1q1aqVETEKgiAgSRJjtlwBQCGXsX1QDRqV8DByVCYi5gWsb/F6u/06kdh8osDoQEYdGQVAhyIdqOWl//ffi0WLUT55gpmnJzmHDzd0iJ+1dM1zkytXLtFxWBCETCFJEqcfhvPz/jvEJqkBODnuC9wdrIwcmQmQJLj2D+waAUnRYGEHjWeAdyVjR2byllxaQrQymlKupRheQf/EJP7KFcI3bgTAc+oUFHa2hg7xsybmIxcEIUtKUmk4fu8FCw7e5frTKN3+L8vmEolNWqhV8EdbeHhEu+1aBNr+pl0vSvgkhwIOscdf2w1jeIXh2Jrrl5hISUkETfwBNBocWrUUc9pkAJHcCIKQ5Zx6EMaof67wNCJet69r1Tz0r1MAL2cbI0ZmIoKuwo5BEHxVu12pLzSZBQr9lgIQUjv57CQjj44EoEX+FlTy0L8WLPTXlSTeu4fC2VksjJlBRHIjCEKWERGXxMpjD1l25AEAOe0taVrSg27VfCjoZmfk6EyARg0HJsHpZSBpwMwKWiyAsp2NHVm28CLuBaOOjEKlUdEwb0Om15iu9zXir98gdMUKANwnTsDM2dnQYQqI5EYQhCwgUaVm+6WnTNt5U9evpkbBHPz6TUXsLMXHVJodnw+nXk3VUfxLaDQDnMSIMkOISIhgoO9AopXRFHQqyOxas/WehViTmMizcWNBrca+SRMcmjXLoGgFvT814uPjkSQJGxtt1fDjx4/Ztm0bxYsXp1GjRgYPUBCE7O3Bixi6rjpDUGQCAEU97BnVqAj1i7mJSfn0ce8gHP5R+7jueKir/5wrwvtN8JvA7fDbuFi5MLPmTCwU+o82e7FwEUn3H6BwdcVj8iTx/s5Aeic3X375JV999RX9+/cnIiKCKlWqYG5uTmhoKPPnz2fAgAEZEacgCNnQ5cAIhm66RFBkAjYWCgbVK8i3tfNjphDLAKSZJMHZ3+DAD9rtYq2g9hjjxpTNbLu3jWNPjgGw+IvFFMtRTO9rxJ0/T/i6dQB4TpsmmqMymN6fIBcvXtTNZ7Nlyxbc3d15/PgxGzZsYPHixQYPUBCE7CcsJpHJO67Teqkfj8PiMFfI+LNvVQbVKygSG32dWgL/jQZVAniUglaLxRpRBvQy4SULLiwAoEeJHpTJqf9oM01sLM/Gfw+ShONXX2H/RT1Dhym8Re+am7i4OOzt7QHYv38/X331FXK5nKpVq/L48WODBygIQvZy+mEY3268QGS8EoB6RXIyslERSuZ2NHJkJkaS4OIG2D9Ru12pDzSeJSbnM6DQ+FAGHBzAy8SX5HfMz5DyQ9J1nedzf0IZGIhZLk/cvxejozKD3slNwYIF2b59O23atGHfvn0MfzWrYkhICA4ODgYPUBCE7CMgLI5OK08DkMvRih/blKReEdG3Rm+SBFv7aifoAyjSXNt5WCQ2BhMYFUjX/7oSnhBODqscLKi7AHO5/kPpo48cIWLzZgByzZyFwk6M+ssMetddTpo0iVGjRuHj40OVKlV060vt37+fcuXKGTxAQRCyh6N3X1Bv3hEAbCwU/De0Nl8UFSt56y3yKfze9nViU6U/tF8L5mJiQ0NRqpWMOTaG8IRw8tjnYX3T9eR3yq//dUJCCBr/PQAu3bthW7WKoUMV3kPvmpt27dpRs2ZNgoKCUqwCXr9+fdq0aWPQ4ARByB7CY5MY9MdF1BqJHLYWzPqqFI42YkI5vT29AGuagjoRFBbQZDZU6m3sqLIVtUbNuOPjuB52HQcLB35r9JveC2ICSBoNz8aORf3yJZbFipFz5MgMiFZ4n3RNIOHh4YGHh3bBuqioKA4dOkSRIkUoWrSoQYMTBCF7+OP0Y2ISVbjaWXJsTF1sLMTcNXq7tRM2d9U+VljCAD9wLWTcmLIZSZKYfXY2+x/vx0xuxpzac9KV2ACErV5N3KnTyKytyT3vZ+QWoskwM+n9CdOhQwdq167N4MGDiY+Pp2LFijx69AhJkti0aRNt27bNiDgFQTAxKrWGg7ees+7kI04/DAfg68reIrHRV1w4/DcWrv2t3ZabQ+fNIrExMJVGxeyzs9l8R9s/5scaP1Izd810XSv+yhVeLNKOHvaYOAHL/Po3aQmfRu9PmWPHjjFhwgQAtm3bhiRJREREsH79en788UeR3AiCwPlH4QzddFm3NpRCLqNpSQ/61BIf8nq5vhV2j4D4l9rtIs2h9TKwdjJqWNnNs5hnjD42mqsvriJDxpTqU2iev3m6rqWOjubpyFGgUmHftAmOX31l4GiFtNA7uYmMjMTFxQWAvXv30rZtW2xsbGjevDmjR482eICCIJiWE/dC6bfxPHFJaqzM5fSqkY+uVfOSy8na2KGZjviXsHMY3Nyu3c5ZDJrPA58axowqWwqKCaLbf914Hvccewt7JlWbRBOfJum6liRJBE+ZivLJE8xz5cJz6lTRYd5I9E5uvL29OXXqFC4uLuzdu5dNmzYB8PLlS6ysRG99QfhcqTUSE7ZdY9O5QAAcrc3ZN6w2Ho7ic0EvLx/DxtYQ/hDkZlB1IHzxgxjmnQEiEiLovb83z+Oek88xH8sbLCe3Xe70X2/zZqJ27waFglw//4xCTI9iNHonN8OGDaNLly7Y2dmRN29e6tatC2ibq0qVKmXo+ARBMAGPw2KZtOMGR+++AKB9BS+GNywsEhs9ya79DXtGgioeHPNAxw2QS0yxkRES1YkMPTyUwOhAPGw9WNlwJR62Hum+Xvy16zyfMRMAtxHDsSkvfm7GpHdyM3DgQCpXrkxgYCANGzZE/mqa7/z58/Pjjz8aPEBBELK2W0FRdPj1FNEJKgDGNinKgLoFjByV6fGMOI/i8hKQNOBVCdqvB8f01yII7xenjGPE8RFcDLmIrbktv3zxyyclNuqICJ4OHYqkVGLXoD4uvXoZMFohPdI1bKFixYpUrFgRSZKQJAmZTEbz5unrfCUIgmlSaySWHr7PIt97qDUSeXPYsKxLeUrkEsso6EWtRH52BeUf/4pM0kDRFtBho1gfKoOEqkP5Zt83+Ef56xKboi7pn8ZEO5/NOJTPnmHu7U2umTNFP5ssIF2/PRs2bKBUqVJYW1tjbW1N6dKl2bhxo6FjEwQhC5uz9zbzD9xFrZEokNOW33tXEYmNvlRJ8Fs9FAcmYqZJRJO3JrRdLRKbDHI19Cq/xvyKf5Q/OaxysKLBCip5VPqka4at/I2Yo0eRWVjgtWih6GeTRehdczN//nx++OEHBg8eTI0a2p77J06coH///oSGhurWmhIEIfs6evcF608+AqCQmx3bB9XA1lLMX6O3U0sg+BoA13N9TZEui5CbWxo5qOxr4aWFxEvxFHcpztIGS3G1dv2k68WeOsWLxa/ms5n0A1bFixsiTMEA9P40+uWXX1i+fDndunXT7WvVqhUlSpRgypQpIrkRhGxurZ8/U3feBMDByoyd39XEylxh5KhMUNAVODoXAHWVATxIqkYRmaixySgXn1/kyosrAMytOfeTE5ukJ094Omw4aDQ4tmmDo5jjLUvR+zcpKCiI6tWrp9pfvXp1goKCDBKUIAhZ0/fbrukSG28Xa3YMFomN3iQJzq+BVQ20o6JylUNTf5qxo8rWXsS9YMyxMUhIlDMvl+4lFZJpYmN5MnAQ6shIrEqWxGPyJNHPJovRO7kpWLAgf//9d6r9mzdvplAhMR24IGRHSrWGsVuu8ueZAAD61c7PgeF1yOdqa+TITIwkwa7h2n/qJO2oqI6/g/hizFDTT0/nedxzvOy8aGHT4pOuJWk0PBs3nsS7d1G4uuK15BfkYo63LEfvZqmpU6fSsWNHjh07putz4+fnh6+v7zuTHkEQTFtkvJLeG85w5UkkAOObFuXbOmKot97UKtjaF25s1W7XHAF1xoK5FSiVxo0tG/vr9l8cDjwMwJSqUwg+H/xJ1wtdvpzoAweQmZvj9ctizD3SP4RcyDh619y0bduWM2fO4Orqyvbt29m+fTuurq6cPXuWNm3aZESMgiAYSZIamv9ykitPIrE2V7CoU1mR2KTX7V2vE5tGM6DBZG1iI2QY/0h/fjr3EwDDyg+jvFv5T7pe9MGDhP6yBACPKZOxKScm6suq0tV7rUKFCvz+++9cuHCBCxcu8Pvvv1PuE37IS5cuxcfHBysrK6pUqcLZs2fTdN6mTZuQyWS0bt063fcWBCE1pVrD3hvPmX5JwfPoRABWd6/Il2XFpHLpIklw6Xft4zzVofpg48bzGbgTfod+B/qh1Cip4lmFniV7ftL1Eu7c5dmYsQA4f/MNTqIDcZaWpmapqKioNF/QQc8x/ps3b2bEiBGsWLGCKlWqsHDhQho3bsydO3dwc3N773mPHj1i1KhR1KpVS6/7CYLwYTGJKpovPs7jsDhAhoWZnB+/LEn1gp82uuSzpdHAv73h/gHtdinxpZiRNJKGv+/8zfwL84lXxePj4MOMGjOQy+SoUafrmsqQEAL790cTF4dN1aq4jxGLRGd1aUpunJycPtoTPHmmYrVavzfP/Pnz6du3Lz17arPqFStWsHv3btasWcO4cePeeY5araZLly5MnTqV48ePExERodc9BUF4N0mSmLv39qvEBhrk1vBzzy9wshMreqfbw8Ovm6PqT4LyPYwaTnaWqE5k1NFRHAk8AkAVzyrMqzMPR8v0Ty6piYvjyYCBqIKCsMiXD6+FC5CZmxsmYCHDpCm5OXz4cIbcPCkpiQsXLjB+/HjdPrlcToMGDTh16tR7z5s2bRpubm707t2b48ePf/AeiYmJJCYm6raTa6GUSiVKA3fiS76eoa8rpCTKOeMsPfKQDaceA9CunCe1rAKxkEuirNNL0qA4+xtyQFOqA+qqQ0AjgSZleYr39KdLVCcy6tgo/IL8sFRYMrTsUDoU7oBcJk9VvmktZ0mtJnjESBJu3EDu7Izn0iVobG3RiJ/TB2XU+1mf66UpualTp066g/mQ0NBQ1Go17u7uKfa7u7tz+/btd55z4sQJVq9ezeXLl9N0j1mzZjF16tRU+/fv34+NjY3eMafFgQMHMuS6QkqinA3rYqiM9fe0c9Z42UpUtwgERDmnl1vUVUo++QP7RO38X2fi8hCyZ88HzxFlnT4qScWfsX9yV3UXc8zpYtUFhwcO7H2w953Hp7Wcc+7cifMJPzRmZgR06sTta9fg2jVDhp6tGfr9HBcXl+ZjTWq+9OjoaL755ht+++03XF3T1v4/fvx4RowYoduOiorC29ubRo0a6d0/6GOUSiUHDhygYcOGmItqywwjytmwlGoNa08+5q9zDwANBXLa8k+/KlgpJFHO6SR7eh6zdT8DIFnao6k2lIrVh753Phvxnk6/lwkvGX1iNHcj72KlsGJR3UVUcn/3elH6lHPEn38ResIPAM9ZsyjcpLHBY8+uMur9rE//X6MmN66urigUCp4/f55i//Pnz/F4x9wBDx484NGjR7Rs2VK3T6PRAGBmZsadO3coUCDlMFVLS0ssLVOv1WJubp5hHyIZeW3hNVHOn+5WUBTDNl3mzvNoACrnc2Fdz0rYWJjpqoBFOafDsdna/31qIfv6LxSW9qRlHmdR1vpJUicx/NhwroZexcbMhkVfLKKqZ9WPnvexco4+fJjQOXMAyDliBC4tP23iv8+Vod/P+lzLqMmNhYUFFSpUwNfXVzecW6PR4Ovry+DBqYdKFi1alGtvVQlOnDiR6OhoFi1ahLe3d2aELQjZwrIj95m79w4AzjbmTGhenLblc4tp5D+FRg13/oOHR7TbtUeDpb1RQ8qulGol/Q7042roVRwsHNjQdAMFnD59Dqb4q1d5OmIkaDQ4tW9Hjr59DBCtkNmM3iw1YsQIunfvTsWKFalcuTILFy4kNjZWN3qqW7du5M6dm1mzZmFlZUXJkiVTnO/k5ASQar8gCO/ndz9Ul9h4OFjxT/9qeLtkTB+0z8bjU7DtW4jQdsgmV3nwqWncmLKpRHUi44+P58LzC9iY2TCv7jyDJDaJDx8S2O9bpPh4bGvUwGOSWDPKVBk9uenYsSMvXrxg0qRJBAcHU7ZsWfbu3avrZBwQEIBcLlbKFQRDuRMczYDfLwBQyM2O7YNqYGtp9I8C03ZjG2zpDdKrqTAq9oZGP4JcLCpqaCqNihFHRnDsyTHMZGb8XOfnNDVFfYwyOJiAPn1QR0RgVaoUXosXiSHfJkzvT7Tnz58zatQofH19CQkJQZKkFM/rO88NwODBg9/ZDAVw5MiRD567bt06ve8nCJ+rw3dC+HbDBZLUGqzM5UxoXkwkNp/q+U3YPkib2BT/ElosBBsXY0eVLUmSxOKLizn25BiWCksWf7GY6rmqf/J11RERBPbti+pZEBY+Pnj/ugK5rVgU1pTp/anWo0cPAgIC+OGHH/D09BRVdoJgInZcfsrQTZcB8HK2ZlO/qng5i6aodFOr4NwqODwTlLHgVgLargaF+Gs/IyjVSuaem8umO5sAmFp9qkESG018PIEDB5F47z5mbm7kWb0KMxeRnJo6vZObEydOcPz4ccqWLZsB4QiCYGiPQmNZefwhf54JACCPiw07v6uJo7X4Ek63pxfg3z4Q/lC77V0FOv0pEpsMEqeMY8DBAVwMuQjAd+W+o3n+5p98XUml4umIkcRfvIjcwQHv337DPLdYPy070Du58fb2TtUUJQhC1nT4Tgj9N14gUaWdMqGstxMrulYQiU16JcZoa2rOLAdJW6bUGQc1h4sVvjNIgiqB/gf7cynkErbmtkyuNpmm+Zp+8nUltZpn48YTc/gwMktLvJcvw6pIYQNELGQFeic3CxcuZNy4cfz666/4+PhkQEiCIHyq6AQlvx33Z+nh+6g1EoXc7JjcsgQ1CuYQTcnpFXAaNn8DsSHa7WKtoN4EcCtq3LiysUeRj5h8cjKXQi5hb2HPonqLqOTx7gn69CFJEsFTphC1axeYmZF7wQJsKlQwQMRCVqF3ctOxY0fi4uIoUKAANjY2qSbVCQ8PN1hwgiDoT5Ikuq05y6WACAC+LJuLWV+VwsZCdBxOtyOz4cgs7WPbnNB6ORRqaNyYsrlt97Yx/fR0lBol5nJz5tedb5DEBkkidM4cIv/ZAnI5uX+ai/0X9T79ukKWkq6aG0EQsq4bz6J0ic2ctqXoUNFb1NZ8itt7Xic2XpW0fWvs3IwbUzam0qiYc3aOruNwRfeKTKw60SDz2EiShOvefUS+GoXrOXMGDk0/vYlLyHr0Tm66d++eEXEIgmAAIVEJTPnfDQAaFXenY6U8Ro7IxN3eDdsHaB+7l4TeB967PpTw6Z7HPmfc8XGcf34egEFlB9GvdD/kMsPMdfZy5W+4vEpsPKZMxunVzPhC9pOuemq1Ws327du5desWACVKlKBVq1YoFGLCKkEwBo1GYtWJh8zccxsAuQx618xn5KhMmCTB/olwaol228ELuvwjEpsM5PfUj4l+EwmND8XW3JYp1abQJF8Tg10/bM1awpdof56uo0fj3KmTwa4tZD16Jzf379+nWbNmPH36lCJFigAwa9YsvL292b17d6qFKwVByFhH7oSw7PADzj7S9ndztjFnTY9KlMvjbOTITNi+7+H0Mu3jir2g4TSxRlQG+vXKryy5rE08CjoVZF6deeR3ym+w64etXkPITz8BENqoIQW7fWOwawtZk97JzZAhQyhQoACnT5/G5dVER2FhYXTt2pUhQ4awe/dugwcpCMK7TdpxnQ2ntGsZWSjk9K2djyH1C2FpJmpR0+3B4deJTe0x8MUE48aTjb1MeMmss7P4z/8/ADoV6cTIiiOxMjPcsPrQlb/xYv58AJy//Za7+XwMdm0h69I7uTl69GiKxAYgR44czJ49mxo1ahg0OEEQ3m/T2QBdYlO3SE4mtyxBPlcxZXy6vbgDp5bC1b+123lriMQmA4XEhdBnfx/8I/2Ry+QMKTeE3qV6G/QeocuX82LRYgBcvxuMU79+sGePQe8hZE16JzeWlpZER0en2h8TE4OFhYVBghIE4f3uBEczZ+9tDt3WzrfSorQnizuVQy4X/UHSRZLg6NxXI6JeTVCarw50+sOoYWVnN0JvMOroKJ7EPMHdxp2F9RZS0rWkwa4vSRKhS5YSunQpADmHDcO1/7colUqD3UPI2vROblq0aEG/fv1YvXo1lStXBuDMmTP079+fVq1aGTxAQRC0JEli19Ugxv17ldgk7QK1jYq7s0gkNp/m6t9wZKb2cc6i0Hgm5K8rVvTOAGqNmqWXl7L6+mo0kgZPW09WN1qNt4O3we4hSRIvFi8mbPkKANxGjSRHnz4Gu75gGvRObhYvXkz37t2pVq2abgI/lUpFq1atWLRokcEDFAQBTj4IZc7eO1wJjACgQE5blnWpQBEP0cn1kz3w1f5ftAV0/F2MiMogz2KeMf74eN36UE3zNeX7yt/jZOVksHtIksSL+fMJ+20VAG5jx5KjZw+DXV8wHXonN05OTuzYsYN79+5x+7Z22GmxYsUoWLCgwYMThM+dSq1h1Ql/Zv+n/V1TyGV0quTNuKZFsbcS60N9sqgguLtX+7hcV5HYZJCTz04y5tgYIhMjsTW3ZUKVCbQs0NKg95DUaoKnTydi02YA3L8fj0u3bga9h2A60j0fe6FChShUqJAhYxEE4RW1RmKx7z3+PBvAi+hEAMp4O/Fr1wp4OIoFGg1Co4HdIyAhElyLQMEGxo4oW1pzfQ0LLiwAoGSOksyuPZu8DnkNeg8pKYln48YTtWcPyGR4TJ2Cc4cOBr2HYFrSlNyMGDGC6dOnY2try4gRIz547PxXQ+4EQUifu8+j6b3+HIHh8QDksLVgQN0CdK2aFytz0Q/EIO4dAN+pEHxNu12pDyhETZghxSTFMOPMDHY93AVAy/wtmVRtkkGHeQNo4uN5MnQosceOg7k5uefOEUsqCGlLbi5duqTrZX7p0qUMDUgQPmdJKg3DNl3WJTbTvyxBx0p5sDAzzPTzn72ESNg9Eq79o922dIC646ByX+PGlc1cfH6Rqaem8jDyIXKZnN4le/Ndue8MvsaZOjqawAEDiD9/AZmVFV6/LMauVi2D3kMwTWlKbg4fPvzOx4IgGM6Tl3EM33yZm0FRAPzZpwrVC7oaOapsJPg6/NEOooO02xV7wxcTwcblw+cJaRaVFMWyy8v489afSEi4WruyoO4CyrqVNfi9VOHhBPTpQ+LNW8jt7PD+dcX/27vv8CarNoDDv7Rp0r13KR2MlrJnKVNZRZa4QERBUFyoCIiCg6XIUBDxQ1CGuBgqQ0BA2cjeuwPaMrso3TPrfH8EggFUCk1Ly7mvKxfNeU/yPjlNyZPznoF906Zlfh6pcir1mJvBgwfzxRdf4ORkPkujoKCAN954g4ULF5ZZcJJU1RVr9fyw5zwHzmWyJTYdncG4zsrXzzWViU1ZyUyErZ/c6K2xVkH/XyG0fcXGVcVsPr+ZCXsmkFWSBcBjNR9jRNMRZTob6jrNpUtcfHEImnPnsHZ3p/r8edhGRJT5eaTKq9TJzXfffceUKVNuSW6Kior4/vvvZXIjSXdICMErPx5iW9wVU1nLUHdGdA6jRYjsTbhn+Vfg4ELY+TnoigAF1O0NbUaAX4OKjq7KKNYVM+vILH44/QMAQc5BjGkxhtYBllmxvujkKS6+8gr6jAyU/n5Un78AdajcJFYyd8fJTW5uLkIIhBDk5eVha3tjUJher2fdunV4e3tbJEhJqmrSc4t56YdDHL22bs1zLYN4smk1Gga6VmhclZ4QcOZP2DULzu/CtOJwYCR0+RgCW1RoeFXN2ayzvPPXO5zJOgPAgIgBDGsyDJW1ZVarz//rLy4NewtRWIg6LIzAb77Bxkd+7ki3uuPkxtXVFYVCgUKhoHbt2rccVygUTJgwoUyDk6SqRgjB9vgrjPr1uGmK9wttQnivWx2s5SrD9yZpB6x+E7KSbpT5NYKmA6HJQLnicBn749wfjNs9jgJtAW5qNz5q/RHtAy13qS97xUpSPvwQ9Hrso1pS7csvsXZ0tNj5pMrtjpObrVu3IoSgQ4cOLF++3GzjTJVKRVBQEP7+/hYJUpKqghKdnq4z/yIpowCA6u72/O+ZxjSo5lqxgVUF2iL4vjcI47YUNBsMzYeAjxyHUdZK9CV8su8TVpxZAUBz3+ZMbTsVL3svi5xPCEHGnDlkzPoSAOdePfH/+GMUci9D6V/ccXLTvr0xI09KSiIwMBArKzk1VZLuVFxqHu8uP25KbAa3DmFYx1q42Mu1Ve7ZlThY3PdGYjMyDpx8KzamKipfk8+7f73Ljks7AHi2zrOMbDYSpdVdrwf7r4ROR+qEiWT/YhwM7jFkCF4jhpf5lHKp6in1OzIoKIjs7Gz2799Peno6BoPB7PgAudy1JN2i7zd7yC40rhU16bF69I8s2xVaH0hCwPp3Yf/XN8r6/iQTGwuJzYxl2JZhJBcko7ZWM739dItehtLn5XF55Ejj4nxWVvh88D7uzzxjsfNJVUupk5s1a9bQv39/8vPzcXZ2NsugFQqFTG4k6W+KtXqmbYgzJTbfD25Bu9qW6b5/oGSdg5+egox4433/JtBjBvg3rtCwqiKtQcv84/P5+vjX6IWeAMcAprabSkOvhhY7p+biRS6++iqaswkobG0J+OxTnDrJ7TGkO1fq5GbkyJEMHjyYTz75BHt7e0vEJElVwsXMQgYtOsDZ9HwAXm4XKhObe6UpNPbUbJt6bXo30HQQdJ8B8lJ5mcsuzmb4tuEcTDsIQKfqnRjfajwuaheLnbPw4EEuvfEm+qwslN7eVPvqK+zq1bXY+aSqqdTJzeXLl3nzzTdlYiNJ/+BMWh5TN8SxKSYNAJW1FR/3rkef5oEVHFklZtDDgQWwdRIUZxvL/BrC4/PB69bZm9K9O5B6gNF/jSa9MB17pT3vt3yfXjV6WfSc2StXkTJ2LGi12NatS7WvZmPj42PRc0pVU6mTm+joaA4ePEhoaKgl4pGkSksIwbIDFxm/5hTFWgMKBTSt7sYbHWvRXvbY3L2CDFgzDGKNGzCitIMO70PU6yAHlpa5Am0Bnx/6nGVxywAIdg7ms/afEeYeZrFzCoOBK59/ztV58wFw6tIF/6lTsLKzs9g5paqt1MlN9+7dGTVqFKdPn6Z+/frY2JjP9ujVy7KZvSTdj1YfS2bmpngSrxhnQ9UPcOHTpxoQ7utcwZFVYvnpxtWFD35rvARlrYLOE417QinlNGBLOHX1FMO3DielwLj/1pO1n2RUs1HY21iup16fl0fyO++Sf23fQo9XXsbrzTdRyMuM0j0odXIzZIhx99yJEyfeckyhUKDX6+89KkmqRL7dlcSENacB4yWooQ/X5JWHQlEr5aJxd+3MJljaD/Qa432/RtB1CgRFVWhYVVmeJs+U2HjZeTGl7RRa+Fl2ReeSM2e49PobaM6fR6FS4ffxR7jIL8hSGSh1cnPz1G9JelBlFWiYsTGeH/aeB6BLhA+fPtlQrl1zLwwG2D4Ftk813ncPhW6fQo2O8hKUBaUWpDJowyBSClJQWin57pHvCHSy7Bix3A1/kPzee4jCQpR+flSbNQu7+vUsek7pwXFPKy8VFxeb7TElSQ+KK3klPDFnNxcyCwF4qmk1Pnm8PjbWsiv9ruk08PsIOGLcgJEGfaH7dFA7/fvjpHuy/eJ2Pt73MakFqbjbuvNlhy8tmtgIvZ4rM2eaxtfYt2xJwIzpKN3lZrFS2Sl1cqPX6/nkk0+YO3cuaWlpxMfHExoayocffkhwcDAvvPCCJeKUpPvG3O0JzPgzHo3egKNayYw+DelSVy4cd08KM+HHJyD5MKCAR6ZB5EsVHVWVpjPomH5wOj/G/AiAUqFkxkMzaOBluR3TdVlZJI8cScHuPQC4Dx6M94jhKJSWWeFYenCV+mvmpEmTWLRoEdOmTUP1t7096tWrx/z588s0OEm6n+QWa3ljyRGmrI9FozcQ6uXAjy9GysTmXqQcg5WvwheNriU2wBPzZWJjYX9d+os+a/uYEptn6zzL6sdW09SnqcXOWXT8OOeeeJKC3XtQ2NkRMGM6Pu+MkomNZBGlfld9//33fPPNN3Ts2JFXXnnFVN6wYUNiY2PLNDhJul+cSs7hxe8OkpJTDMC7XcN5pX2o3OPmbhkMsG8u/Pk+iGvj+DxqweNfQ4DlPmAfdCX6EmYdnsWPMT9iEAYcbBwY23Is3UK7WeycQggyF31H+vTpoNNhU7061b78EtswuT6RZDl3tYhfzZo1byk3GAxotdoyCUqS7hcanYEtsem88+sxcot1uNjZ8GW/xnKl4XuRdhpWvw6XDxnvB7eFNsMh9CGwkjPMLEEIwe9Jv/Pl4S9JLkgG4LGaj/FW07dwt7XcWBddVhYpY94jf9s2AJyio/H7+COsneQ4KsmySp3cRERE8NdffxEUZL7x36+//krjxnJfF6nqyCvW0m/eXk5ezgWgQTUXZj/ThEB3uTr3XSvKhh8eg/xUsHGAzhOM69bINU0sJuZqDB/t/YgTGScAcLd1Z0KrCTwU+JBFz1t46BCXR76NLjUVhUqFz5jRuD79tOztlMpFqZObsWPHMnDgQC5fvozBYGDFihXExcXx/fffs3btWkvEKEnl7lRyDiOWHSMuLQ9bGyuebl6dt6PDcFTL8QF37cwmWPkSFF413h+8AfwsN3j1QWcQBr4/9T3/O/o/SvQl2CntGFJ/CM9GPIud0nIr/wqDgavz5nNl1izQ61EFBxPw+Qxs69Sx2Dkl6Wal/p/60UcfZc2aNUycOBEHBwfGjh1LkyZNWLNmDZ07d7ZEjJJUbs5lFPDF5jOsOnoZIcDWxoofXoikebCcpnrXCq7Cxg/h6GJAgIM39PleJjYWtC9lH1P2T+Fs9lkAWge05uPWH+Np52nR82pTU0kePYbCvXsBcO7ZE99x47B2dLDoeSXpZnf1NbRt27Zs3LixrGORpAqTXajhq20JLNiZhN4gAHgozIt3osOJ8JdbKNy1o4th/WgoyTHeb/QsdJsGKvlhZwm5mlwm7J7An+f/BMBJ5cRrDV+jf53+Fr8clLtuHSnjJ2DIzUVha4vvhx/g8vjj8jKUVCFKndyEhoZy4MABPDw8zMqzs7Np0qQJiYmJZRacJFmaVm9gzrYEvtmRSH6JDoCHw7wY0TmM+tVcKji6Si75CPw21Dgbyrc+dP4Iajxc0VFVSUIIfj3zK18c/oKckhysFdb0rtmb4U2H46K27PtYn5dH6kcfkbt6DQC29evjP20q6pAQi55Xkv5NqZObc+fO3Xb/qJKSEi5fvlwmQUlSeTibns9LPxw0bXYZ7uvE213C6BThU8GRVQF6LSwfYkxsgtvCgN/kTCgL0Rq0TN0/1bSLd3Wn6nzc5mMae1t+gkfB/v0kjx6NLjkFrKzwfOUVPF99BYWN3IJEqlh3nNysXr3a9PMff/yBi8uNbwN6vZ7NmzcTHBxcpsFJkqVcyiqk9+xd5JfoUFlb8WHPCPq3qI6VlexCvydCQNx6+GMMZJ0zlvX8QiY2FnIg9QCT9k4iIScBgOFNhzMwYiDWFm5vg0ZDxqxZXF2wEITApnp1/KdOwV7OmJXuE3ec3PTu3dv088CBA82O2djYEBwczPTp08ssMEmyBL1BsC/pKs/M2weAv4stc55tSsNA14oNrCo4swm2TDSuOgxg6wodx4JHjQoNqyrKLs5myoEp/J74OwBuajdGNhvJozUftfi5i+PjSX53NCUxMQC4PvUkPqNHY+Ugx1FJ9487Tm6u7wYeEhLCgQMH8PS07Kh7SSprabnFDFy4n9jUPFPZ+90jZGJzr7RFsHEs7P/GeF/lCM1fhDZvgZ1bhYZWFcVlxvHW1re4lH8JBQr6hPXhjcZvWHxsjdBquTp/Ple+mgNaLdZubvh9NBGnTp0sel5JuhulHnMzYcIEnG6zuqRGo2Hp0qUMGDCgTAKTpLIkhOCJObu5lFWEWmlFjwb+9G7sT9tacqXheyIEfNvtxr5QzQbDwx+Ag8e/P04qtdSCVGYdnsXaxLUIBD72Psx8eCb1POtZ/NzFcXEkjxlDyWljb41jhw74TRiP0kv+/Uj3p1InN4MGDaJr1654e3ublefl5TFo0CCZ3Ej3nYuZhczeepZLWUUArHitFXX95Uyoe6bXwS8DbyQ2LV6GR6aCnPpb5lILUnl01aMU6goB6BzUmQ9bfoibrWV7xoRGQ8Y388iYOxd0OqxdXPD54AOce3SXU7yl+1qpkxshxG3f1JcuXTIbZCxJ94MreSU8OXc3abklAPRu5C8Tm7Ky6lWIvbYqeYuXoOsUmdhYwIHUA7y55U0KdYU42jgyr8u88umtOX2a5DHvURIXB4BT5074jh0re2ukSuGOk5vGjRujUChQKBR07NgR5d+2qdfr9SQlJdG1a1eLBClJd+uVHw+RlluCo1rJx73r0bOhf0WHVPllnYOtn8CJn433u8+A5i9UaEhVUWpBKjMOzWB90noAXNWuzO00l7qedS16XoNGQ8acOVz9Zh7o9Vi7uuI79kOcHnlE9tZIlUapZ0sdPXqU6OhoHB0dTcdUKhXBwcE88cQTZR6gJN2NnEItq45e5tD5LACWDGkpF+W7V9kXYfUbkLgNMK7iTJOBMrEpYxq9hu9Pf883x7+hSFeEAgVP1H6CkU1H4qhy/O8nuAcF+/aTOn48mqQkwLiLt+/YD1F6yDFUUuVyx8nNuHHjAAgODqZv377Y2tpaLChJuhdbYtN4b8VJUnOLAQj2sKdegNxC4a4ZdBCzAZa/CDpjmxLQFNq9A2Gyt7as6IWe5WeXM//kfNIK0wBo5NWIMZFjiPCIsOi5dVlZpE/7lJyVKwGw9vTE94P3cZa98VIlVeoxNzevcSNJ94vMAg0DFu7j5OVcALyd1PRrUZ2nWwTK7vS75FicjPUPveDSfmOB0hb6/gi15Ca5ZcUgDGw4t4Ev8r4gc38mAF52XgxvOpweoT0s+t4VQpCz6jfSp05Fn50NgOvTffEeMQJrZ/mFQKq8Sp3c6PV6Pv/8c37++WcuXLiARqMxO56ZmVlmwUnSnYpPy+O1nw5zNj0fgPa1vfjymcY428pl4O+KXovV1o/pEPMFCgQo7YyXn9oMBwe5xlVZOZx2mMn7JxObGQuAh60HL9R/gadqP4Wt0rK94yWJSaSOH0/hfmPiqq5dG98J4+Uqw1KVcFfr3MyfP5+RI0fywQcf8P7773Pu3DlWrVrF2LFjLRGjJP2rjafTGPL9QdP9Of2b8Eh9vwqMqJIryICfnsQ6+QgAhuqtsHr8G3ANrODAqo64zDimHpjKgdQDADjaONLSuiXje47Hxd6yY8MMxcVc/WYeV+fNQ2i1KGxt8Xp9KO4DB8o9oaQqw6q0D/jpp5+YN28eI0eORKlU0q9fP+bPn8/YsWPZu3fvXQUxe/ZsgoODsbW1JTIykv3Xvknczrx582jbti1ubm64ubnRqVOnf60vVW1n0/MZuti4zoqHg4rf32wjE5t7kbAFvnkYko8grFUcC3we/bOrZGJTRnJKcvhoz0f0WduHA6kHUCqUPFHrCX7r+RsP2T6EvY29xc4thCB340YSu/cg46uvEFotDm3bErp2DR4vvigTG6lKKXXPTWpqKvXr1wfA0dGRnJwcAHr06MGHH35Y6gCWLVvGiBEjmDt3LpGRkcycOZPo6Gji4uJuWSgQYNu2bfTr149WrVpha2vL1KlT6dKlC6dOnSIgIKDU55cqr7TcYvrP34dGZ6BegDM/vxyFvarUb2nJoIfjy2D/vBsL8rlWR99rDudOXCVCUervQNJNckpy+O7UdyyNXUqe1rj9R3RwNCObjsTP0Q+tVmvR85ckJpI26RMKdu0CQOnri8/od3GKjpbj0aQqqdSfBNWqVSMlJYXq1atTo0YN/vzzT5o0acKBAwdQq9WlDmDGjBkMGTKEQYMGATB37lx+//13Fi5cyOjRo2+p/9NPP5ndnz9/PsuXL2fz5s1ydeQHSFYJ9Jt/gLTcEqytFMzs20gmNqWl08CxxbD7S7h69lqhAuo+Bt0+Rahc4MS6Cg2xshNCsD5pPdMPTSe9MB2Amq41eS/yPZr7Nrf4+fX5BWR89RWZ338POh0KGxvcXxiM50svYWVvuV4iSapopf40eOyxx9i8eTORkZG88cYbPPvssyxYsIALFy4wfPjwUj2XRqPh0KFDjBkzxlRmZWVFp06d2LNnzx09R2FhIVqtFnd399seLykpoaSkxHQ/N9c4k0ar1Zb5t6Xrz2fpb2EPuvl/JTLzqDUlBuN2ClMeq0uQm61s99LITUa55CkUGcbVZ4WtK4aWr2No1B8cjCvQyvfzvUktSGXs3rEcTDOOBwtwCGBEkxG0r9YeK4WVWbuWdVsLIchf+zsZn3+O/soVAOzbt8PznXdQVa+OHtA/gL9X+Z4uH5Zq59I8n0IIIe7lZHv37mX37t3UqlWLnj17luqxycnJBAQEsHv3bqKiokzl77zzDtu3b2ffvn3/+RyvvfYaf/zxB6dOnbrt2jvjx49nwoQJt5QvXrwYe/nNpVLJLoGV56w4mmm8TBLkKOgbqifAoYIDq0yEgRrpGwhPXYHSoKHE2pF4316c93gIvbVcu6os6ISOI5oj/Fn8J0WiCBtsaG/bnlbqVqgUKoufX33pEl5r1mJ/7hwAGg8PrvTsSUGdcIufW5IsqbCwkGeeeYacnByc/2Opgnvux2/ZsiUtW7a816e5K1OmTGHp0qVs27btHxcVHDNmDCNGjDDdz83NJTAwkC5duvxn45SWVqtl48aNdO7cGRs5OK9MbYpJZ9zio6b7DdwN/PRaB2zVlv+wqCoUSTuwXvsGitzLAAgHb6z6/UK4T11u97En38+lk1aYxoqzK1ibtJaUohQAqjlW47O2n1Hbrfa/PrYs2lqXmsrVWbPIW2Pc70thZ4vbSy/hNmAAESr5dwLyPV1eLNXO16+83IkKHaTg6emJtbU1aWlpZuVpaWn4+vr+62M/++wzpkyZwqZNm2jQoME/1lOr1bcdC2RjY2OxN7cln/tBU6LTM3ldLIt2nzOVLRjQhPwz+7FVq2Q736mCq/Bzf9AZL+XReSKKyFewUf73ODn5fv53idmJzDk2h43nN6IXesC4Xs3geoN5Kuwp7JR2d/xcd9PWhoICri5YwNWF3yKKjStIO/fqiffw4dj4yZmDtyPf0+WjrNu5NM9VocmNSqWiadOmbN682bR3lcFgYPPmzbz++uv/+Lhp06YxadIk/vjjD5o1a1ZO0UrlbdmBC3y+8YxpG4VwXyfmD2yGj6MN685UcHCVRc5lOL0K/pp+I7F566Sc2l0GYjNjWXRqEesS1yGu7bXV3Lc5j9d6nE7VO1l8ET6h15OzciXpX3yB/koGAHbNmuLz7mjs6lt+13BJup9V+PSSESNGMHDgQJo1a0aLFi2YOXMmBQUFptlTAwYMICAggMmTJwMwdepUxo4dy+LFiwkODiY1NRUwTkv/+2aeUuX28drTzN9p3LzP2VbJp081pEuEDwqFQg4GvBP56bB2OMT+jmmTS8/a8OhXMrG5R6kFqUzaO4ltl7aZyjpW78irDV8lzD2sXGIo2L2btKnTKIkzDgi3qV4d77dH4tS5s5zaLUncB8lN3759uXLlCmPHjiU1NZVGjRqxYcMGfHx8ALhw4QJWVjfW2ZgzZw4ajYYnn3zS7HnGjRvH+PHjyzN0yUJ2nc0wJTaDWgczvHNtuY3Cnco6DwcXwIGFoDGup4J/Y4joDc1fBLX8AnAvfjv7GxP3TERjMG47Ex0czaC6g6jrWbdczl908hRXPv/ctF6NlbMzXkNfw61fPxRyXI0kmdxVcpOdnc2vv/5KQkICo0aNwt3dncOHD+Pj43NXC+m9/vrr/3gZatu2bWb3z12bASBVPUIIdidcZdhS47L/bvY2jOtZPh8aVcL+ebD+HRAG433vCOg+HYJaVWxcVUBOSQ5T909lTeIaACI8IhjTYgyNvBuVy/lLEhO58sUs8v74w1igVOL2TD88X30VpZtbucQgSZVJqZOb48eP06lTJ1xcXDh37hxDhgzB3d2dFStWcOHCBb7//ntLxClVcaeSc/hw1UkOX8gGwEFlzYLnLb/IWZVwYS9s/QSSthvvB7WGqKFQ+xGwkqsL34u4zDhWnl3JmoQ15GpysVJY8Xzd53mz8ZtYW1lb/Pza5GSuzJ5NzspVYDCAQoFzzx54vfEGqkB5eVGS/kmpk5sRI0bw/PPPM23aNJycnEzl3bp145lnninT4KQHQ1puMQMX7icjX4NKacVTTavxdpcw3BxkN/u/0hTAzs+NN4MOFNbGS09dp8ik5h4YhIEdl3Yw78Q8jl85bioPdg7mo9YflUtvjS4zk6tff0PW4sWIa2PMHDt0wGvYMGzD/n1auSRJd5HcHDhwgK+//vqW8oCAANPgXkm6U8cvZTPo2wNcLdDg62zLyqGt8HO586mzD6xLB2HNW5B2wni/Tk+IniwHC98DjV7D0til/BTzE8kFyQAorZQ8HPgwj9V8jFb+rSzeW6PPyyP7p8VkfvsthsJCAOybN8drxHDsGze26LklqSopdXKjVqtvu5BOfHw8Xl5eZRKUVPUduZDFzE1n2B5vXBre2krBtCcbyMTmv2QmwoYxEL/BeN/WBXp+YRwwLGfJ3BWtXsuGcxuYdWQWqQXGL2hOKieerPUkA+oOwNPO0+Ix6HNzcd+4ifMfT8KQZxwIbhsRgdfw4Ti0aS1nQElSKZU6uenVqxcTJ07k559/BkChUHDhwgXeffddnnjiiTIPUKpaLmYWMmd7Akv3X8BwbYZyjwZ+vNWpNjW95Uyef3R+N2yfZhxXc33AcHgP6PYZOMuF2u5GniaPZXHLWBKzhPQi46aW3nbevNroVXqE9rD4OjUA+pwcMr/7nswffsAzLw8DoKpZA6/XX8epSxcU8vKiJN2VUic306dP58knn8Tb25uioiLat29PamoqUVFRTJo0yRIxSlXE1th0Xv7hEBq98cO5Q7g3o6LDqONXtttgVCnJR2DLJDi78UZZzc7Q/l0IlAOu74bOoGPl2ZXMOjyL7JJsALzsvOgX3o9nI54t1YrCd0ufnc3V774j64cfMeTnA1Di40P1t9/GrXs3mdRI0j0qdXLj4uLCxo0b2blzJ8ePHyc/P58mTZrQqVMnS8QnVRFfbTvLtA3GBcdCPB2Y1LserWpavru/0irMNM6AOrgQri3pT81OEP0JeJXPQnFVTZ4mj8Uxi1mdsJoLeRcACHEJ4cX6L/JI8CPYWFt+LSVdVhaZi74j68cfMRQUAKCuXRu3l19ih0ZD3a7RMrGRpDJw14v4tWnThjZt2pRlLFIVJITg499jWHBtUb62tTyZN6AZtjaWn0ZbKelK4Ohi2DQOinOMZeE9oMUQCGkvx9XchVNXT7Ho5CK2X9pO0bUtKFzULrxY70WejXgWpZXl1zLVpqWT+f13ZC9ZahoorA4Px/O1V3Hq1AmdXg/r1lk8Dkl6UJT6r3rWrFm3LVcoFNja2lKzZk3atWuHtbX88HqQaXQG9iRe5bM/4jhx2fghXcvbke8Ht5CDI//Jzpmw539QYBxkja0LdJsO9Z+USc1dOH7lOAtPLmTzhc2mshCXEJ6LeI5uId1wsHGweAwliUlcXbiA3N9Wm6Z0qyPq4PXaazh26HCjl0avt3gskvQgKXVy8/nnn3PlyhUKCwtxu7YyZlZWFvb29jg6OpKenk5oaChbt24lUC4y9cDq8/Uejl7MBowzofpHVmf0I+Eysbmd/HTYNAGO/mi87+QHkS9Dg6flYOG7cDT9KDMPz+RQ2iEAFCjoGtKVZ8KfoaFXw3J5DxYdP87VefPJ27QJhHHkvF2zpni8+CKO7dvLvwNJsrBSJzeffPIJ33zzDfPnz6dGjRoAnD17lpdffpmXXnqJ1q1b8/TTTzN8+HB+/fXXMg9Yuv+tOZZsSmx6N/JnWKfahHha/ltypZMeC/u/Nl6G0hl3Pqd+H3h0NijlAoalUaAtYH3Sen6N/5VTV08BxjVqeoT24Pm6z1PDtYbFYxBCULBzJ1fnzadw/35TuWOHDni8+CL2TeQ6NZJUXkqd3HzwwQcsX77clNgA1KxZk88++4wnnniCxMREpk2bJqeFP6CWH7rEyF+OAdCkuiszn5b/oZsRApJ2wKFv4dQqTDt2BzQ1LsJXPbIio6t0YjNjWRa3jHWJ6yjUGceyXE9qhjYaiq+Dr8VjMJSUkLt2LZnffU9JfLyxUKnEpUcPPF58AXXNmhaPQZIkc6VOblJSUtDpdLeU63Q60wrF/v7+5F1biEp6MFy4WsisLWf49dAlABzVSmb3b1LBUd1nhIAlT99YgA+Mg4UjX4HgNnJcTSnEXI1h9tHZbL+03VQW5BzEk7WepFfNXrjbuls8Bm16OllLlpC9dBn6rCwAFPb2uD31FO7PD8TGT15SlKSKUurk5uGHH+bll19m/vz5NL62HPiRI0d49dVX6dChAwAnTpwgJCSkbCOV7ltn0/N59H87KdAYB0XW9nHk+8GR+LpYfhG0SkFTCKd/M+4BlWGcDk+TAdB8CPg1qNjYKhEhBEfSj/D18a/ZnbwbAGuFNZ2DOtMnrA/NfJqVz3iak6fI/P47ctdvgGuDhJX+frj3fxbXJ5/A2sXF4jFIkvTvSp3cLFiwgOeee46mTZtiY2NcF0Kn09GxY0cWLFgAgKOjI9OnTy/bSKX7jhCCJfsvMmNjHAUaPeG+TrzeoSaP1PPD2uoB74XQ6+DcDohZA8eWgtZ4yQSlLXQca9y1W7ojGUUZrE5YzcozKzmXew4wJjXRwdG83OBlQl1DLR6D0OnI27SZzB9+oOjQIVO5XZMmuA8YgFOnjiiUlp9SLknSnSn1X6Ovry8bN24kNjaW+GvXl8PCwggLu7Gw2MMPP1x2EUr3rU/WxTDvL+P6NX4utiwa1EL21mgK4dAi45Tu3Ms3yl0Codlg483OtaKiqzR0Bh07Lu1g5dmV/HXpL/TXFjK0U9rRNbgrg+oNIsTF8r3D2vR0cpYvJ+vnX9ClpBgLbWxwfqQr7s8NwK5+PYvHIElS6d31V43w8HDCw8PLMhapksgv0TFlfQw/7jWu8tox3Jv/PdMEO9UDvrbRlXj4ZSCknzbet3OHsEegQR+5AN8dEEIQmxnLuqR1rE9aT1phmulYI69GPF7rcboEd7H4+jRCCAr37SNryVLyNm+Ga2MMrd3ccH26L25P98PGx9uiMUiSdG/uKrm5dOkSq1ev5sKFC2g0GrNjM2bMKJPApPtPUkYBk9fFsD3+CiU64/5Qdf2dmTegGVYP8mWoSwdh22RI2GLc1NLWxXjpqVF/sJG7nP+XnJIclp9Zzm9nfyMxJ9FU7qp25bGaj9G7Zu9yufSkz8khZ9UqspYuQ5OUZCq3a9wYt35P4xQdjZVabfE4JEm6d6VObjZv3kyvXr0IDQ0lNjaWevXqce7cOYQQNGkiZ8dUVVq9gce/2kVWoXEAZainA080rcYr7Ws8uIlNXhrsmwO7/wcGY7tQsxP0+hKc/Ss2tvtcakEqWy5s4a/Lf7E/ZT8ag/FLktpaTftq7ekW0o021dqgtrZsMiGEoOjoUbJ//oXcdesQJSUAWNnb4/xoL9yefhrbMLmXlyRVNqVObsaMGcPbb7/NhAkTcHJyYvny5Xh7e9O/f3+6du1qiRilCmQwCH4/kcL0P+NMic3iIZFEhXo8uKusFmXDjk9h/zzQGz8MqRVt3NTSU65p8k9K9CVsvbiVJTFLOJx+2OzY9W0RHgl+BEeVo8Vj0V29Ss5vq8lesRzN2QRTuTosDLd+T+PcoyfWjnLhSUmqrEqd3MTExLBkyRLjg5VKioqKcHR0ZOLEiTz66KO8+uqrZR6kVDGKNHpe+uEgf53JAMDN3oZR0eG0qvGA7uZ9ZhPsmGa8DHV9p+6AptB2JIR1k2Nq/kFidiJ/nP+DpbFLySzONJU38W5Cu2rtaFetHTVda1o8WRZ6PQU7d5L963Lytm41jaVR2NriHB2Na9++2DVu9OAm7ZJUhZQ6uXFwcDCNs/Hz8yMhIYG6desCkJGRUbbRSRUmv0RHh8+2kZ5n7JkY0jaENzrWwtnWpoIjK2cGA1zcByd+gYMLbpS714A2w6HxszKp+Qcbz29kccxiDqYdNJX52PvwaM1Hear2U+WyejCA5uJFspcvJ2flKnRpNwYp29avj+sTT+DcvRvWTk7lEoskSeWj1MlNy5Yt2blzJ3Xq1KFbt26MHDmSEydOsGLFClq2bGmJGKVyJIRgzvYE5mxLIK/Y+M323a7hvPqQ5ffmua8UXDXu+3TiF8hMND/26h7wiaiYuO5zGUUZbLmwhdUJqzl2xbgNh7XCmij/KHqE9qBLcBdsrCyfIOtzc8ndsIHc1WsoPHgjubJ2ccH50V64PvEktmG1LR6HJEkVo9TJzYwZM8jPzwdgwoQJ5Ofns2zZMmrVqiVnSlVy+SU6nl+4n4PnjUvJB3vY807XcLrVf8CWkT+5Ata+BcU5xvtqZ6gdDRGPQlBrsLf80v6ViUEYOJJ+hF/if2F90noMwjiTTqlQ8kjIIwxtPJQAxwDLx6HRULBjBzmr15C/dSvi2urBKBQ4tG6N6xOP49ixI1YquSmpJFV1pUpu9Ho9ly5dokED45LxDg4OzJ071yKBSeVv5M9HTYnNqOgwXmlf48Faadigh2XPQtw6432fetD6LWNiY+tcoaHdjy7mXmT5meX8ce4PLuVfMpXX86hHdHA03UO742XvZdEYhBAUHTlCzurV5K7fgCEnx3RMXasWLo/2wrl7d7nPkyQ9YEqV3FhbW9OlSxdiYmJwdXW1UEhSeRNCMO+vRP44ZRyPMKtfY3o1fICmMuelwbHF8NfnUHLtw7HlUOg8Eazlkvo3K9GX8OHOD9lwbgPi2q7mjjaOdKjegf51+hPhYflLdiWJieSsWUPumrVoL91IrJTe3jj36IFLr57YykVGJemBVer/uevVq0diYqLcGLMK+WpbAp/+YdzQsUWIOz0bPADfcvPS4PQqOLUKLh24sU6NlQ1ET4LIlysyuvtSRlEGS2KXsCxuGTnXksA2AW3oFtKNhwIfwkll2UG5mnPnyF2/ntz1Gyi5tvULGNekcerSBZdePbGPjERh/YCvlC1JUumTm48//pi3336bjz76iKZNm+LgYL4WhLOz7L6vLI5ezGbOtrOmHpua3o788EKLqjsVVqeBUyvh6E9w7i/jasLXBTSDBn2hUT9Qy5kz15WIEnYl72Lb5W2sTVxLybV1feyUdkxpO4UO1TtY9PyaixfJXb+B3A3rKTkdc+OAUolD61a49OyFU8cOWNnJlaAlSbqh1MlNt27dAOjVq5fZh6AQAoVCgV6vL7vopDKXU6Rlwc4kdp/NMI2vAejewI8pj9dHraxi33qFgMuHjVsjHP4eci7cOBbQDOo/CbW6gMcDNhvsHwghiM+K56/Lf7Hj4g6O5RzDsO1GEtjAswHPRTxHu2rtsLext0gM2suXyd3wB7nr11N88uSNA9bWOERF4fxIV5w6dsRaXhqXJOkflDq52bp1qyXikMrBhpOpjFlx3LTSMMBDYV683SWMegEuFRiZBRj0cHAh/DUd8lJulKtdjAlNqzfAXV5avS42M5YtF7bw57k/SchJMDvm5+BHK/9WdA/tTjOfZhbp2StJTCJv8ybyNm2i+NjxGwesrLCPbIHzI4/g1LkzSje3Mj+3JElVT6mTm/bt21siDsmCNDoD41afZMn+iwA4qpUM71ybLhE+BLpb5tt3hRACErcZbyd+hdxrA02t1VCrs7GHpt7j8rLTNTklOWy9uJXl8cs5euWoqdzGyobW/q1p4dMCXbyOZ3s+i41N2a5NIwwGik+eJG/jJvI2b0aT+Le1hBQK7Js3N/bQdOmC0sOjTM8tSVLVd1dTQf766y++/vprEhMT+eWXXwgICOCHH34gJCSENm3alHWM0j1YduACszaf5XJ2EQD9I6szvHNtPB2r0O7GmYnGgcF7v4KCKzfK7dyg/bvQ9Hm5O/c153LOsSt5F3+e+5NjV46hv7aNhFKhpH1ge9pXa8/DgQ/jauuKVqtlXcK6Mju30Ggo2H+AvM2byN+8BV16+o2DNjY4REbi1KkTjh0exsbbu8zOK0nSg6fUyc3y5ct57rnn6N+/P4cPH6bk2i66OTk5fPLJJ6xbV3b/GUr3ZvzqUyzafQ4AlbUVY7qFM6h1FbgUIwTu+XFYbdoLCZsg48bMGWzsjfs8hT0C4T3Axrbi4rwPGISBUxmn2HpxK1svbuVs9lmz47XcatE1uCuP1XzMImvS6PPzKdi5k7xNm8nfvh1DXp7pmJW9PQ7t2xkTmnbt5BYIkiSVmbuaLTV37lwGDBjA0qVLTeWtW7fm448/LtPgpLsXm5prSmw6R/gw6bF6eDtV4g96XYlxhlP8nyjjN9A2+/yNY1ZKqB5lXEG48XMPfEJTqC1kf+p+tl3cxvZL28kourHnm7XCmma+zYjyi6JrSNcyXzlYCIEmIYH87TvI37GDwkOHTBtUAlh7eODUoQNOnTth37KlXC1YkiSLKHVyExcXR7t27W4pd3FxITs7uyxiku6RTm9gzIoTAAS62/HNc00r7/RubTEc+cFsYLAC0FnZYlX3UazCH4EaHcC2ig2ILgWDMBCfFc++lH3sTdnLobRDFOmKTMcdbBxoE9CGhwMfpk1AG1zUZdtWhqIiCvbto2DHDvK370B7+bLZcVVQEI4dO+LUqRN2DRvIdWgkSbK4Uic3vr6+nD17luDgYLPynTt3EhoaWlZxSXchKaOA3QkZbDiZypEL2TiplSwY2LzyJTbaYkg5CjFr4OC3oC0wltu6QMSj6EI7sSG+mOiej2NVxgNdKwMhBBfyLpiSmQOpB8guyTarE+AYQGv/1nQM6khzn+bYWJddOwkh0CSdo2DXLmPvzL59CI3GdFyhUmEfGYlju3Y4tmuLKiiozM4tSZJ0J0qd3AwZMoRhw4axcOFCFAoFycnJ7Nmzh7fffpsPP/zQEjFK/2FH/BW+3HKGA+eyzMrHdKtDbZ9KMo5BU2Bchyb2d7i4D/Q3PiyxsjEODG75KqgdEVot+jIc6FoZCCE4n3uerRe3sixuGZfzzXtH7JR2NPNpRqRfJC18WxDmHoaVwqrMzq/LyKBgz14Kdu+mYM8edKmpZsdt/P1xfKg9Dm3b4hAZiZV9FZqFJ0lSpVPq5Gb06NEYDAY6duxIYWEh7dq1Q61W8/bbb/PGG29YIkbpNgwGwe6Eq8zdnsDOszfGVLQIcadpkBtNq7vRKcKnAiO8AwY9nN8FR34yboWgK75xzM7NuMhevSeMU7gdHrzpwFqDltNXT7Pt4jZWn11NetGN2UU2VjY09GpIpF8kkX6R1POsh41V2fXOGAoLKdi7F8+1a7mwYCGav213AMbeGbumTXBs0xbH9u1Q1ahR+XoIJUmqskqd3CgUCt5//31GjRrF2bNnyc/PJyIiAkdHR0vEJ93GjvgrjPr1GGm5xplq1lYKHmscwCvtQ6npfR/31BgMkHIELuyF87uNA4SLb+zijJMfNH8BanQE/8bwgH1Y6gw6YjNjOZR2iINpB9mfsp9CXaHpuNJKSQPPBvSu2Zvo4OgyXSHYoNFQfOIEhfv3U7B7D4VHj4JWiztwvQ9NHVEHx1atsI+Kwr5pU6xsH+yB25Ik3b9Kndz8+OOPPP7449jb2xMRYfndf6UbUnOKmbs9ge/2nEMI4/Tu3o39eaNDrftzMT4hjNO04zcYN6c8vwcKM8zrqF2gxkPGWU6hD0EZjg253+kMOhKyE0zjZg6nHSZPm2dWx1nlTEu/ljwU+BAPBz6Mo6psvkQYiospOnqMwgMHKDx4kKKjRxHXlnW4Tunnx9VqAdTu0wfn1q1RuruXybklSZIsrdTJzfDhw3nllVfo1asXzz77LNHR0VjL2Q8W9/nGeL7ccgaDMN5/KMyLWf0a42x7nyUDOo1xMHDKMTiwAK7EmB9XOUFwGwhsDiEPgV9DsL6rtSQrnfTCdE5knOD4leOcyDjByYyTZrOaAJxUTjT2bkwzn2a08G1BHY86ZTJ2xlBQQOHRo8Zk5sBBio8fR2i1ZnWs3d2xb9YMh6iWOERFgb8/p9evp2nXrigfwIHbkiRVXqX+VElJSWHDhg0sWbKEPn36YG9vz1NPPUX//v1p1aqVJWJ8oBVqdHz6Rxzf7joHQINqLrwTHU7rmh73xxgHgx5ST8Dh7+DyIUiPuWkwsBICI6F2NFRrAQFNQVn11zbJLM4k5moMMZkxxGbGcvzKcVIKUm6p52DjQCOvRrT0a0lz3+aEu4djbXVvXxaEEGgvJ1N09KjpVhwba7beDIDSywv75s2xb9Ec++bNUYWGmr2ntDclP5IkSZVFqZMbpVJJjx496NGjB4WFhaxcuZLFixfz8MMPU61aNRISEv77SaQ7sjfxKi//cIicIuOHzAttQvige52KT2qKsuHMn8bLTQlboMh8lhb2nuDXAILbGsfQVPE1aIQQpBaksjN5Jzsv7eTU1VOkFabdUs9KYUVN15rU96xPQ6+G1PesT4hLyD0nM4aSEopPnaLoyFGKjh6h8OhR9Fcybqmn9PfDobkxkbFv3hyb6tUr/r0kSZJkAfd0PcDe3p7o6GiysrI4f/48MTEx//0g6T8JIfhp3wU+WHUSADd7G97qVJuBrYIrLqi8VOO6M7Fr4dxOMPytF8BKCbW7QoM+4FMP3ELAquymId9vhBAkFySz6/IudlzawcmMk1wtvmpWR4GCIOcg6rjXIdwjnAiPCBp4NrjnQcDGXpnLFB8/TuHRoxQdPUZxTAzc3MuiVGIbHo5do0bYNW6EfaNG2ASU7WrEkiRJ96u7Sm6u99j89NNPbN68mcDAQPr168evv/5a1vE9cHIKtYxecZz1J2+sI/L7m23xdy3njR+FgNTjkLTDOLvp7CbzqdqeYVC7izGpqdaiSl9qKtYVmy4t7U3Zy/GM4+SU5JjVUSqUhLuH06F6B5r4NCHcPRwHG4d7Oq8QAl1yMkWnTlF88hTFJ09SfOoU+pycW+pae3pi16gh9o0aYdeoEbZ162JlJzcLlSTpwVTq5Obpp59m7dq12Nvb06dPHz788EOioqIsEdsDRW8QfLf7HP/bepbMAg1KKwXPtwpmWKdaOJXHoOHiHOMg4HM74dwu4ziamz7A8W8MdR+H8O7gUcPyMVUArUFLfGY8B9MOEp8Vz5msM5zJOoNO3DReRaEkwiPClMxEeESgtr77ndaFEOhSUoyJzPVk5tQp9FlZt1a2scG2dm3sGjbErnFj7Bobe2XkJSZJkiSjUic31tbW/Pzzz7edJXXy5Enq1atXZsE9SEb9cowVR4yrzlZzs+PLfo1pXN3NcifU64wL5535Ey4fhqtnbq1jZQMh7Yy3oFZQrXmVWnumWFdMQnYC8VnxxGfFcyLjBLGZsZToS26p62HrQX0v41iZKL8oarnVQmV9d71VhuJiSs6cpSQuluK4eEri4iiJi7ttjwxKJeratbCrWxfbuvWwrVcPde1acsNJSZKkf1Hq5Oann34yu5+Xl8eSJUuYP38+hw4dQq/Xl1lwD4L0vGI+33jGlNiMig7jxbYhqJUWml4vBJzdDGuGQe4l82MugcYEJqSd8V/P2lXmcpPOoCMpJ4mTGSc5dfUUpzJOEZMZg17c+n51UjnRxLsJ9T3rE+oaSoRHBP4O/qXuGbneG1N8LXkpjoujJDYOzfnzxgUNb2ZtjbpWLWzr1TUmM/Xqoa5dGyv13fcISZIkPYjuekDxjh07WLBgAcuXL8ff35/HH3+c2bNnl2VsVdqVvBKmbYjl18OXENfWrnmuZRBDH65Z9icTwjhFO2YNHF8GmX+b0daov3GadlCbKrPFgRCCzOJMYjNjOZJ+hD0pe4jPjKdYX3xLXXdbd2q51aK2W23C3cNp4NmA6s7VS7W2jNDp0Fy8iCYxkZKERDQJCZQkJKBJTMRQWHjbx1i7uaEOD8M2LBx1WBi2YbVR1awpe2QkSZLKQKmSm9TUVBYtWsSCBQvIzc2lT58+lJSUsGrVKrlacSkUafQ8OXc3568aP/hqeDkw+pE6dKrjXTYn0Osg7aRxA8rEbcYxNH8fP6OwgrBuxo0og9uUzTkrgN6gJzU3lcScRJJyksz+zdXk3lLfXmlPuHs4Db0aEuYeRmPvxvg7+t/x+QzFxWjOnTMmLgmJlCQmokk4i+bc+VsWxDNRKlGHhpoSGHVYOOqw2ii9vOQYGUmSJAu54+SmZ8+e7Nixg+7duzNz5ky6du2KtbU1c+fOtWR8VYoQgq93JPLNjkQyC4wL3U1+vD79WlS/tyfWayFpO5xebRwUnBEP2pt6DBRWxj2b6vSAmp3BpfJMCy7SFXE+9zyJ2Ykk5SaRkJXA8dzjTPx5IhqD5raPUaAg0CmQCI8I6nvWp221tgQ5B/1nj4yhpATthQtoLlxAc+48mvPXbhcuoEu5dRE+0/lsbVGFhqAOrYG6Riiq6/9Wr45C9sZIkiSVqztObtavX8+bb77Jq6++Sq1atSwZU5VUUKJj0KID7E/KBCDA1Y6PH6vHw2H30FtTkAHHf4Z9cyD7gvkxlSNUb2m81ewM3nVAef+O3RBCkJSbRMzVGC7mXSSlIIXL+Ze5lHeJ5PxkBOK2j1Nbqwl2DibEJYRQl1BCXEIIcQkhyDkIW+WtGzsKIdBnZ6O9nIz28mW0ly6huXjBlMToUlIxXSe8DStnZ9Shoahq1riRyNSogY2/P4oqvLaPJElSZXLHyc3OnTtZsGABTZs2pU6dOjz33HM8/fTTloytSnlr2VH2J2VipYCRXcJ4uV0oSuu7+DDUFBpnOR1YAJcP3ii3cYCQthDR2zhl27P2fbmQXqG2kNTCVC7lXeJi3kXOZp8lPiueS3mXyCzO/MfHuahdCHUJJdQllOqO1cmIz6BPxz4EugSarfBrSl5izpJ7+bIxgbl+S76M9nLyP46Duc7KwQFVUBCq4CBsgoJQVQ8y3bd2c5OXkyRJku5zd5zctGzZkpYtWzJz5kyWLVvGwoULGTFiBAaDgY0bNxIYGIiTk5MlY62UTifn8uFvJzl03rheyfQ+DXmscbU7fwJdiXEg8IW9kJUEF/dDyd/Gk3iGQeTL0KAvqMtmx+i7pdVrSS1IJbkgmeT8ZFPvS1pBGmmFxtvNG0X+ndpaTR33OoS4hODv6E+AYwD+jv6EuITgbuuOMBjQX71K0eXL7Itfh0PhX1zNyECXloo2LR1dWhratDTEfyQvANZenqj8A7AJ8McmsLopeVEFBWHt7i4TGEmSpEqs1LOlHBwcGDx4MIMHDyYuLo4FCxYwZcoURo8eTefOnVm9erUl4qx0CjU6PvsjnoW7kkxl7Wt7/Xdioy02rgx85k84v8e4w7Ym37yOk59xMb0mA8A7vOyD/weF2kJT0pJRlEFaYZrp0tGl/EukFaT94+Wjv3OwccDf0Z9Ax0CCnIOo6xpONZ0TAVpHlNn56NKvoo/JQHflJNrUzeSmpXE1LQ3dlSumzR8DgFt3T7pB6eWFTUDAbW7+2Pj7y+nVkiRJVdg97S0VFhbGtGnTmDx5MmvWrGHhwoVlFVeldiWvhN5z9pKeZ1wMrq6/M5Meq0/Dav+wgWRmIsSsNc5sOr/LfJsDAEcf43TtgGbgHgqBLcp8/EyJvoTLeZdJLkjmSuEVrhRd4UrhFdIK00gtSCWtMO1fLxtdp7ZW42fvS3W1L9WFO4FaR3yKbXEvssIpX49tbgmKzBx0V6+iu5qAPmM/+uxsAP55uO7fWFlh7elJgUqFR1gYKl9flD4+2Pj6oPT2QenjLZMXSZKkB9w9JTfXWVtb07t3b3r37n1Xj589ezaffvopqampNGzYkC+//JIWLVr8Y/1ffvmFDz/8kHPnzlGrVi2mTp1Kt27d7jL6snUxHybPNSY2KqUV/+vXmM4RPuaXOYSA5CNwcjlcOmCcsv13Kieo1gzqPQ4BTcGrzl2Pn9Eb9GSXZJNVnEVGcQYZRRlcLbpKakEqqQWppBSkkFKQcvvERQhUOrAvMd7CisBLa0s1vQteWlvcNTa4l9jgVKzAvlCPTX4xipx89NkXEZpbd4fXXrvdlpUV1u7uKD08UHp4YO3pYex98bmWvPh4o/T1RenpiU4I1q1bR71u3bCxKYetKSRJkqRKpUySm3uxbNkyRowYwdy5c4mMjGTmzJlER0cTFxeHt/etM4l2795Nv379mDx5Mj169GDx4sX07t2bw4cPV/jWDyVaPbNOWaMxlGBjrWDR881pVdPTmMxknbux5kzSDshPNX+wXyOo09O47kxg5C3bHBiEgTxNHrmaXHJLcskpySFHk0O+Np8CTQE5mhyyirPIKsokrzCL/NyrFOVnoS3IR6UR2GrBViOwLwE7jTFZ8SwRVC/GVOakscJZq8ShRIFtsQGbYh1W+ptX0i24drvVLWv9KpUo3d2NiYqHpzFx8fTA2sMTpee1JObaz9auriis73BV5n9aU0aSJEmSuA+SmxkzZjBkyBAGDRoEwNy5c/n9999ZuHAho0ePvqX+F198QdeuXRk1ahQAH330ERs3buR///tfha65oynIY+uWDUQWH6Ca9VUeDwX1urkcyk1DV3AFrbaEYqFAo1CgEVbo8ETr4IXezhe90gFDtjWG7fsx/PkXek0xhhINBk0JQqMFjQa0Wmx0oNSDjR5UWrDVChy04K6BWlpQX7spb7Oy/53Rc5sUBayssHJ0xNrV1Xhzcbnxs+u1n11c/1ZmvFk52MuBuZIkSVK5q9DkRqPRcOjQIcaMGWMqs7KyolOnTuzZs+e2j9mzZw8jRowwK4uOjmbVqlW3rV9SUkJJyY2NEHNzjTONtFot2jLsAfh94QTCZ//OezeVGy+aqK/dbpZz7WYhSiUKO1us7OyxsrfDys4OK0cnrBwdsXJyvPGzo4PxZyfHa/edsHZyxMrBASsnJxT2pU9SDIBBp/vPenfj+u+tLH9/0q1kO5cf2dblQ7Zz+bBUO5fm+So0ucnIyECv1+Pj42NW7uPjQ2xs7G0fk5qaetv6qampt60/efJkJkyYcEv5n3/+ib29/V1Gfqu8ghI01mCwAoPC+K+wAoOVwnhTKBDWVgiFFcJKgbAy/mtQWmOwtsagtEYolaBUIpQ2oLRBYaNCYW2DQqnCWmmLtY0tChsVwlqJwUaJUKkwqFSmf2/+mTu9zHOdwQC5ucZbJbBx48aKDuGBINu5/Mi2Lh+ynctHWbdz4R0s83FdhV+WsrQxY8aY9fTk5uYSGBhIly5dcHZ2LrsTPdKVxP7ZxBzaS5cuneVAVwvSarVs3LiRzp1lO1uSbOfyI9u6fMh2Lh+WaufcUnzxrtDkxtPTE2tra9LS0szK09LS8PX1ve1jfH19S1VfrVajvs20YBsbmzJ/c4f6uhOrsMxzS7eS7Vw+ZDuXH9nW5UO2c/ko63YuzXNV6Pr8KpWKpk2bsnnzZlOZwWBg8+bNREVF3fYxUVFRZvXB2PX1T/UlSZIkSXqwVPhlqREjRjBw4ECaNWtGixYtmDlzJgUFBabZUwMGDCAgIIDJkycDMGzYMNq3b8/06dPp3r07S5cu5eDBg3zzzTcV+TIkSZIkSbpPVHhy07dvX65cucLYsWNJTU2lUaNGbNiwwTRo+MKFC1j9bQG7Vq1asXjxYj744APee+89atWqxapVqyp8jRtJkiRJku4PFZ7cALz++uu8/vrrtz22bdu2W8qeeuopnnrqKQtHJUmSJElSZVShY24kSZIkSZLKmkxuJEmSJEmqUmRyI0mSJElSlSKTG0mSJEmSqhSZ3EiSJEmSVKXI5EaSJEmSpCpFJjeSJEmSJFUpMrmRJEmSJKlKkcmNJEmSJElVyn2xQnF5EkIApds6/U5ptVoKCwvJzc2VO85akGzn8iHbufzIti4fsp3Lh6Xa+frn9vXP8X/zwCU3eXl5AAQGBlZwJJIkSZIklVZeXh4uLi7/Wkch7iQFqkIMBgPJyck4OTmhUCjK9Llzc3MJDAzk4sWLODs7l+lzSzfIdi4fsp3Lj2zr8iHbuXxYqp2FEOTl5eHv72+2ofbtPHA9N1ZWVlSrVs2i53B2dpZ/OOVAtnP5kO1cfmRblw/ZzuXDEu38Xz0218kBxZIkSZIkVSkyuZEkSZIkqUqRyU0ZUqvVjBs3DrVaXdGhVGmyncuHbOfyI9u6fMh2Lh/3Qzs/cAOKJUmSJEmq2mTPjSRJkiRJVYpMbiRJkiRJqlJkciNJkiRJUpUikxtJkiRJkqoUmdyUkdmzZxMcHIytrS2RkZHs37+/okO6r+3YsYOePXvi7++PQqFg1apVZseFEIwdOxY/Pz/s7Ozo1KkTZ86cMauTmZlJ//79cXZ2xtXVlRdeeIH8/HyzOsePH6dt27bY2toSGBjItGnTLP3S7iuTJ0+mefPmODk54e3tTe/evYmLizOrU1xczNChQ/Hw8MDR0ZEnnniCtLQ0szoXLlyge/fu2Nvb4+3tzahRo9DpdGZ1tm3bRpMmTVCr1dSsWZNFixZZ+uXdN+bMmUODBg1Mi5ZFRUWxfv1603HZxpYxZcoUFAoFb731lqlMtnXZGD9+PAqFwuwWHh5uOn7ft7OQ7tnSpUuFSqUSCxcuFKdOnRJDhgwRrq6uIi0traJDu2+tW7dOvP/++2LFihUCECtXrjQ7PmXKFOHi4iJWrVoljh07Jnr16iVCQkJEUVGRqU7Xrl1Fw4YNxd69e8Vff/0latasKfr162c6npOTI3x8fET//v3FyZMnxZIlS4SdnZ34+uuvy+tlVrjo6Gjx7bffipMnT4qjR4+Kbt26ierVq4v8/HxTnVdeeUUEBgaKzZs3i4MHD4qWLVuKVq1amY7rdDpRr1490alTJ3HkyBGxbt064enpKcaMGWOqk5iYKOzt7cWIESPE6dOnxZdffimsra3Fhg0byvX1VpTVq1eL33//XcTHx4u4uDjx3nvvCRsbG3Hy5EkhhGxjS9i/f78IDg4WDRo0EMOGDTOVy7YuG+PGjRN169YVKSkpptuVK1dMx+/3dpbJTRlo0aKFGDp0qOm+Xq8X/v7+YvLkyRUYVeVxc3JjMBiEr6+v+PTTT01l2dnZQq1WiyVLlgghhDh9+rQAxIEDB0x11q9fLxQKhbh8+bIQQoivvvpKuLm5iZKSElOdd999V4SFhVn4Fd2/0tPTBSC2b98uhDC2q42Njfjll19MdWJiYgQg9uzZI4QwJqJWVlYiNTXVVGfOnDnC2dnZ1LbvvPOOqFu3rtm5+vbtK6Kjoy39ku5bbm5uYv78+bKNLSAvL0/UqlVLbNy4UbRv396U3Mi2Ljvjxo0TDRs2vO2xytDO8rLUPdJoNBw6dIhOnTqZyqysrOjUqRN79uypwMgqr6SkJFJTU83a1MXFhcjISFOb7tmzB1dXV5o1a2aq06lTJ6ysrNi3b5+pTrt27VCpVKY60dHRxMXFkZWVVU6v5v6Sk5MDgLu7OwCHDh1Cq9WatXV4eDjVq1c3a+v69evj4+NjqhMdHU1ubi6nTp0y1fn7c1yv8yD+Dej1epYuXUpBQQFRUVGyjS1g6NChdO/e/Zb2kG1dts6cOYO/vz+hoaH079+fCxcuAJWjnWVyc48yMjLQ6/Vmv0AAHx8fUlNTKyiqyu16u/1bm6ampuLt7W12XKlU4u7ublbnds/x93M8SAwGA2+99RatW7emXr16gLEdVCoVrq6uZnVvbuv/asd/qpObm0tRUZElXs5958SJEzg6OqJWq3nllVdYuXIlERERso3L2NKlSzl8+DCTJ0++5Zhs67ITGRnJokWL2LBhA3PmzCEpKYm2bduSl5dXKdr5gdsVXJIeVEOHDuXkyZPs3LmzokOpksLCwjh69Cg5OTn8+uuvDBw4kO3bt1d0WFXKxYsXGTZsGBs3bsTW1raiw6nSHnnkEdPPDRo0IDIykqCgIH7++Wfs7OwqMLI7I3tu7pGnpyfW1ta3jBJPS0vD19e3gqKq3K6327+1qa+vL+np6WbHdTodmZmZZnVu9xx/P8eD4vXXX2ft2rVs3bqVatWqmcp9fX3RaDRkZ2eb1b+5rf+rHf+pjrOzc6X4j7AsqFQqatasSdOmTZk8eTINGzbkiy++kG1chg4dOkR6ejpNmjRBqVSiVCrZvn07s2bNQqlU4uPjI9vaQlxdXalduzZnz56tFO9pmdzcI5VKRdOmTdm8ebOpzGAwsHnzZqKioiowssorJCQEX19fszbNzc1l3759pjaNiooiOzubQ4cOmeps2bIFg8FAZGSkqc6OHTvQarWmOhs3biQsLAw3N7dyejUVSwjB66+/zsqVK9myZQshISFmx5s2bYqNjY1ZW8fFxXHhwgWztj5x4oRZMrlx40acnZ2JiIgw1fn7c1yv8yD/DRgMBkpKSmQbl6GOHTty4sQJjh49aro1a9aM/v37m36WbW0Z+fn5JCQk4OfnVzne0/c8JFkSS5cuFWq1WixatEicPn1avPTSS8LV1dVslLhkLi8vTxw5ckQcOXJEAGLGjBniyJEj4vz580II41RwV1dX8dtvv4njx4+LRx999LZTwRs3biz27dsndu7cKWrVqmU2FTw7O1v4+PiI5557Tpw8eVIsXbpU2NvbP1BTwV999VXh4uIitm3bZjals7Cw0FTnlVdeEdWrVxdbtmwRBw8eFFFRUSIqKsp0/PqUzi5duoijR4+KDRs2CC8vr9tO6Rw1apSIiYkRs2fPfqCmzo4ePVps375dJCUliePHj4vRo0cLhUIh/vzzTyGEbGNL+vtsKSFkW5eVkSNHim3btomkpCSxa9cu0alTJ+Hp6SnS09OFEPd/O8vkpox8+eWXonr16kKlUokWLVqIvXv3VnRI97WtW7cK4JbbwIEDhRDG6eAffvih8PHxEWq1WnTs2FHExcWZPcfVq1dFv379hKOjo3B2dhaDBg0SeXl5ZnWOHTsm2rRpI9RqtQgICBBTpkwpr5d4X7hdGwPi22+/NdUpKioSr732mnBzcxP29vbiscceEykpKWbPc+7cOfHII48IOzs74enpKUaOHCm0Wq1Zna1bt4pGjRoJlUolQkNDzc5R1Q0ePFgEBQUJlUolvLy8RMeOHU2JjRCyjS3p5uRGtnXZ6Nu3r/Dz8xMqlUoEBASIvn37irNnz5qO3+/trBBCiHvv/5EkSZIkSbo/yDE3kiRJkiRVKTK5kSRJkiSpSpHJjSRJkiRJVYpMbiRJkiRJqlJkciNJkiRJUpUikxtJkiRJkqoUmdxIkiRJklSlyORGkiRJkqQqRSY3knQfOHfuHAqFgqNHj1Z0KCaxsbG0bNkSW1tbGjVqVNHhlBlLtnVwcDAzZ84s8+e9V+3atWPx4sUVHcYd2bBhA40aNcJgMFR0KFIlJpMbSQKef/55FAoFU6ZMMStftWoVCoWigqKqWOPGjcPBwYG4uLhbNrer6u7XJOVurF69mrS0NJ5++ulbjoWEhLBp0yZTwnfzbe/evWb1f/nlF8LDw7G1taV+/fqsW7fO7LgQgrFjx+Ln54ednR2dOnXizJkzZnUyMzPp378/zs7OuLq68sILL5Cfn2863rVrV2xsbPjpp5/KsBWkB41MbiTpGltbW6ZOnUpWVlZFh1JmNBrNXT82ISGBNm3aEBQUhIeHx30Rk1R6s2bNYtCgQVhZmf93f/z4cbKysmjfvr2pbNOmTaSkpJhuTZs2NR3bvXs3/fr144UXXuDIkSP07t2b3r17c/LkSVOdadOmMWvWLObOncu+fftwcHAgOjqa4uJiU53+/ftz6tQpNm7cyNq1a9mxYwcvvfSSWWzPP/88s2bNKuumkB4kZbJDlSRVcgMHDhQ9evQQ4eHhYtSoUabylStXir//mYwbN040bNjQ7LGff/65CAoKMnuuRx99VEyaNEl4e3sLFxcXMWHCBKHVasXbb78t3NzcREBAgFi4cKHpMUlJSQIQS5YsEVFRUUKtVou6deuKbdu2mZ3rxIkTomvXrsLBwUF4e3uLZ599Vly5csV0vH379mLo0KFi2LBhwsPDQzz00EO3fb16vV5MmDBBBAQECJVKJRo2bCjWr19vOs5NG22OGzfuts9z/XxDhw4Vzs7OwsPDQ3zwwQfCYDCY6gQFBYmJEyeK5557Tjg5OYmBAweaNk7Nysoy1bu+Q3xSUpIQQohvv/1WuLi4iA0bNojw8HDh4OAgoqOjRXJyslkM8+bNE+Hh4UKtVouwsDAxe/Zss+P79u0TjRo1Emq1WjRt2lSsWLFCAOLIkSP/+Jpufv3X/frrryIiIkKoVCoRFBQkPvvsM7PHBgUFic8//9wsNhcXF7Fp0yYhxJ39/t544w0xatQo4ebmJnx8fMza3mAwiHHjxonAwEChUqmEn5+feOONN277OoQQIj09XSgUCnHy5Mlbjk2cOFH07dtXCHHj/fdPbSKEEH369BHdu3c3K4uMjBQvv/yyKTZfX1/x6aefmo5nZ2cLtVotlixZIoQQ4vTp0wIQBw4cMNVZv369UCgU4vLly6ay8+fPC8Bso0ZJKg2Z3EiSuJGQrFixQtja2oqLFy8KIe4+uXFychJDhw4VsbGxYsGCBQIQ0dHRYtKkSSI+Pl589NFHwsbGxnSe6x8u1apVE7/++qs4ffq0ePHFF4WTk5PIyMgQQgiRlZUlvLy8xJgxY0RMTIw4fPiw6Ny5s3j44YdN527fvr1wdHQUo0aNErGxsSI2Nva2r3fGjBnC2dlZLFmyRMTGxop33nlH2NjYiPj4eCGEECkpKaJu3bpi5MiRIiUl5Zbd1m8+37Bhw0RsbKz48ccfhb29vfjmm29MdYKCgoSzs7P47LPPxNmzZ8XZs2fvOLmxsbERnTp1EgcOHBCHDh0SderUEc8884zpMT/++KPw8/MTy5cvF4mJiWL58uXC3d1dLFq0SAghRF5envDy8hLPPPOMOHnypFizZo0IDQ391w/yq1evimrVqomJEyeKlJQU007HBw8eFFZWVmLixIkiLi5OfPvtt8LOzs5sF+O/JzdTp04VHh4eYt++faX6/Tk7O4vx48eL+Ph48d133wmFQmHaYfyXX34Rzs7OYt26deL8+fNi3759Zm19sxUrVggHBweh1+tvOdasWTOxePFiIcSN919gYKDw8vISrVu3Fr/99ptZ/cDAQLPETQghxo4dKxo0aCCEECIhIeG27dquXTvx5ptvCiGEWLBggXB1dTU7rtVqhbW1tVixYoVZuY+PzwO3E7dUdmRyI0niRnIjhBAtW7YUgwcPFkLcfXITFBRk9oESFhYm2rZta7qv0+mEg4OD6Rvt9Q+XKVOmmOpotVpRrVo1MXXqVCGEEB999JHo0qWL2bkvXrwoABEXFyeEMH44Nm7c+D9fr7+/v5g0aZJZWfPmzcVrr71mut+wYcN/7LG5rn379qJOnTpmPTXvvvuuqFOnjul+UFCQ6N27t9nj7jS5ufnb++zZs4WPj4/pfo0aNUwf0Nd99NFHIioqSgghxNdffy08PDxEUVGR6ficOXP+s5fi5h4YIYR45plnROfOnc3KRo0aJSIiIm553DvvvCP8/PzMekzu9PfXpk0bszrNmzcX7777rhBCiOnTp4vatWsLjUbzj7H/3eeffy5CQ0NvKb906ZJQqVSm9r9y5YqYPn262Lt3r9i/f7949913hUKhMEtwbGxsbmnr2bNnC29vbyGEELt27RLALT1rTz31lOjTp48QQohJkyaJ2rVr3xKPl5eX+Oqrr8zKGjduLMaPH39Hr1OSbqa0+HUvSapkpk6dSocOHXj77bfv+jnq1q1rNsbBx8eHevXqme5bW1vj4eFBenq62eOioqJMPyuVSpo1a0ZMTAwAx44dY+vWrTg6Ot5yvoSEBGrXrg1gNk7idnJzc0lOTqZ169Zm5a1bt+bYsWN3+ApvaNmypdmg66ioKKZPn45er8fa2hqAZs2alfp5Aezt7alRo4bpvp+fn6nNCgoKSEhI4IUXXmDIkCGmOjqdDhcXFwBiYmJo0KABtra2ZvHdjZiYGB599FGzstatWzNz5kyz1zp9+nQKCgo4ePAgoaGhprp3+vtr0KCB2bG/v+annnqKmTNnEhoaSteuXenWrRs9e/ZEqbz9f+VFRUVmr/261atX06ZNG1xdXQHw9PRkxIgRpuPNmzcnOTmZTz/9lF69ev1X01iEnZ0dhYWFFXJuqfKTA4ol6Sbt2rUjOjqaMWPG3HLMysoKIYRZmVarvaWejY2N2X2FQnHbstJMd83Pz6dnz54cPXrU7HbmzBnatWtnqufg4HDHz1lebo7peuL397a803a8/pjrM2zmzZtn1h4nT568ZZZPeWrbti16vZ6ff/7ZrPxOf3//9j4JDAwkLi6Or776Cjs7O1577TXatWt327YDY9JyuwHyq1ev/s+kJTIykrNnz5ru+/r6kpaWZlYnLS0NX19f0/HrZf9W5+aEXqfTkZmZaapzXWZmJl5eXv8aoyT9E5ncSNJtTJkyhTVr1rBnzx6zci8vL1JTU80+lMtyvZS/fyjrdDoOHTpEnTp1AGjSpAmnTp0iODiYmjVrmt1Kk9A4Ozvj7+/Prl27zMp37dpFREREqWPet2/fLa+hVq1app6M27n+oZWSkmIqK207+vj44O/vT2Ji4i3tERISAkCdOnU4fvy42WydO0l8VCoVer3erKxOnTq3bbPatWubvdYWLVqwfv16PvnkEz777DNTeVn9/uzs7OjZsyezZs1i27Zt7NmzhxMnTty2buPGjUlNTTVLcPLz89m6destvVA3O3r0KH5+fqb7UVFRtywJsHHjRlNPWEhICL6+vmZ1cnNz2bdvn6lOVFQU2dnZHDp0yFRny5YtGAwGIiMjTWXFxcUkJCTQuHHj/2oOSbotmdxI0m3Ur1+f/v373zId9aGHHuLKlStMmzaNhIQEZs+ezfr168vsvLNnz2blypXExsYydOhQsrKyGDx4MABDhw4lMzOTfv36ceDAARISEvjjjz8YNGjQLR/E/2XUqFFMnTqVZcuWERcXx+jRozl69CjDhg0rdcwXLlxgxIgRxMXFsWTJEr788sv/fJ6aNWsSGBjI+PHjOXPmDL///jvTp08v9bknTJjA5MmTmTVrFvHx8Zw4cYJvv/2WGTNmAPDMM8+gUCgYMmQIp0+fZt26dWYJxz8JDg5mx44dXL58mYyMDABGjhzJ5s2b+eijj4iPj+e7777jf//7320vX7Zq1Yp169YxYcIE03o5ZfH7W7RoEQsWLODkyZMkJiby448/YmdnR1BQ0G3rN27cGE9PT7OkbMOGDdSuXZvg4GBT2XfffceSJUuIjY0lNjaWTz75hIULF/LGG2+Y6gwbNowNGzYwffp0YmNjGT9+PAcPHuT1118HjD1Mb731Fh9//DGrV6/mxIkTDBgwAH9/f3r37g0YE8SuXbsyZMgQ9u/fz65du3j99dd5+umn8ff3N51r7969qNXqu76EKElyQLEkCfMBxdclJSUJlUolbv4zmTNnjggMDBQODg5iwIABYtKkSbedCv537du3F8OGDTMr+/ug1esDihcvXixatGghVCqViIiIEFu2bDF7THx8vHjssceEq6ursLOzE+Hh4eKtt94yDei93XluR6/Xi/Hjx4uAgABhY2Nzy1RwIe58QPFrr70mXnnlFeHs7Czc3NzEe++9d8tU8JsH5wohxM6dO0X9+vWFra2taNu2rfjll19uOxX8724e4C2EED/99JNo1KiRUKlUws3NTbRr185s5s2ePXtEw4YNhUqlEo0aNRLLly//zwHFe/bsEQ0aNBBqtfq2U8FtbGxE9erVzaY93+61bt++XTg4OIhZs2YJIe7u9/foo4+KgQMHml5/ZGSkcHZ2Fg4ODqJly5amaeb/5J133hFPP/206f6zzz4r3n//fbM6ixYtEnXq1BH29vbC2dlZtGjRQvzyyy+3PNfPP/8sateuLVQqlahbt674/fffzY4bDAbx4YcfCh8fH6FWq0XHjh1Ng6Wvu3r1qujXr59wdHQUzs7OYtCgQbfMxnvppZdMU8wl6W4ohLhpAIEkSdIdeuihh2jUqFGVWc23KkpNTaVu3bocPnyYgIAAfHx8WL9+PS1atKjo0G4rIyODsLAwDh48aLq8KEmlJWdLSZIkVWG+vr4sWLCACxcuYGdnx/Dhw2nevHlFh/WPzp07x1dffSUTG+meyJ4bSZLumuy5kSTpfiSTG0mSJEmSqhQ5W0qSJEmSpCpFJjeSJEmSJFUpMrmRJEmSJKlKkcmNJEmSJElVikxuJEmSJEmqUmRyI0mSJElSlSKTG0mSJEmSqhSZ3EiSJEmSVKX8H9lRyrfDZZ8cAAAAAElFTkSuQmCC", + "image/png": "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", "text/plain": [ "
" ] @@ -257,8 +268,8 @@ "\n", "# Exclude sink tokens from calculation\n", "kv_head_idx = head_idx // self_attn.num_key_value_groups\n", - "observed_attention = attn_weights[head_idx, n_train:, press.n_sink : n_train].mean(0).float().cpu()\n", - "expected_attention = scores[kv_head_idx, press.n_sink :].float().cpu()\n", + "observed_attention = attn_weights[head_idx, n_train:, press.scorer.n_sink : n_train].mean(0).float().cpu()\n", + "expected_attention = scores[kv_head_idx, press.scorer.n_sink :].float().cpu()\n", "\n", "# Display correlation between expected and observed attention\n", "plt.scatter(expected_attention, observed_attention, s=1)\n", @@ -272,8 +283,8 @@ "# We can also measure if we pruned the right tokens by measuring the average attention loss on the test tokens\n", "# The optimal pruning curve shows that pruning alone is not enough to achieve high KV cache compression ratio\n", "scale = observed_attention.sum()\n", - "knorm = -keys[0, kv_head_idx, press.n_sink:n_train:].norm(dim=-1).float().cpu()\n", - "random = torch.randperm(n_train - press.n_sink)\n", + "knorm = -keys[0, kv_head_idx, press.scorer.n_sink:n_train:].norm(dim=-1).float().cpu()\n", + "random = torch.randperm(n_train - press.scorer.n_sink)\n", "for x, label in zip([random, knorm, expected_attention, observed_attention], [\"Random score\", \"Keys norm\", \"Expected Attention Pruning\", \"Optimal pruning\"]):\n", " indices = torch.sort(x).indices\n", " plt.plot(torch.cumsum(observed_attention[indices], dim=0) / scale, label=label)\n", @@ -303,13 +314,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "tensor(9344., device='cuda:0', dtype=torch.bfloat16)\n", - "tensor(48.6761)\n" + "tensor(8704., device='cuda:0', dtype=torch.bfloat16)\n", + "tensor(48.9765)\n" ] } ], "source": [ - "vnorm = values[..., press.n_sink:n_train].norm(dim=-1).float().cpu()\n", + "vnorm = values[..., press.scorer.n_sink:n_train].norm(dim=-1).float().cpu()\n", "print(scores.max() / scores.min())\n", "print(vnorm.max() / vnorm.min())" ] @@ -317,9 +328,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "kvpress2", "language": "python", - "name": "python3" + "name": "kvpress2" }, "language_info": { "codemirror_mode": { @@ -331,9 +342,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.15" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/notebooks/new_press.ipynb b/notebooks/new_press.ipynb index a7771efd..1862f784 100644 --- a/notebooks/new_press.ipynb +++ b/notebooks/new_press.ipynb @@ -13,13 +13,23 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/mount/home/setup/.cache/pypoetry/virtualenvs/kvpress-PV_RntMw-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "import torch\n", "from torch import nn\n", "from transformers import pipeline\n", "\n", - "from kvpress import BasePress, KnormPress" + "from kvpress.scorers.base_scorer import BaseScorer\n", + "from kvpress import KnormPress, DefaultPruner" ] }, { @@ -83,7 +93,6 @@ "name": "stderr", "output_type": "stream", "text": [ - "Starting from v4.46, the `logits` model output will have the same type as the model (except at train time, where it will always be FP32)\n", "The `seen_tokens` attribute is deprecated and will be removed in v4.41. Use the `cache_position` model input instead.\n" ] }, @@ -134,15 +143,15 @@ "metadata": {}, "source": [ "\n", - "The easiest way to create a new press is to create a class that inherits from `BasePress` and implement a `score` method that computes the score for each key-value pair. \n", + "The easiest way to create a new press is to create a new scorer class class that inherits from `BaseScorer` and implement a `score` method that computes the score for each key-value pair. \n", "\n", - "The arguments of the `score` method are obtained from the forward hook:\n", + "The arguments of the `score` method are as follows:\n", "- `module`: the attention layer\n", "- `hidden_states`: the input of the attention layer\n", "- `keys` and `values`: the key-value pairs from the attention layer\n", "- `attentions`: the attention weights, only available with `attn_implementation=\"eager\"`\n", "\n", - "In this first example, we will reproduce the `KnormPress` where the score of a key-value pair is simply the opposite of the norm of the key vector." + "In this first example, we will reproduce the `KnormScorer` where the score of a key-value pair is simply the opposite of the norm of the key vector." ] }, { @@ -168,19 +177,13 @@ "keys shape: torch.Size([1, 2, 44, 128])\n", "values shape: torch.Size([1, 2, 44, 128])\n", "score shape: torch.Size([1, 2, 44])\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\n", "The purpose of this step-by-step guide is to provide instructions on how to create a new press in kvpress. The guide is designed to help users understand the process of setting up a new press in the kvpress platform.\n" ] } ], "source": [ - "class MyKnormPress(BasePress):\n", + "class MyKnormScorer(BaseScorer):\n", " def score(\n", " self,\n", " module: nn.Module,\n", @@ -208,7 +211,8 @@ " return scores\n", "\n", "\n", - "press = MyKnormPress(compression_ratio)\n", + "press = DefaultPruner(compression_ratio=compression_ratio,\n", + " scorer=MyKnormScorer())\n", "print(pipe(context, question=question, press=press)[\"answer\"])" ] }, @@ -216,19 +220,22 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2.2 Updating the `forward_hook` method " + "### 2.2 Creating a custom press by updating the `forward_hook` method " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The `forward_hook` method defined in the `BasePress` class roughly works as follows:\n", + "The `forward_hook` method defined in the `BasePruner` class roughly works as follows:\n", "\n", "1. Get the scores\n", "2. Update the key-value pairs based on the scores and the `compression_ratio`\n", "\n", - "While we generally do not recommend to modify this method, the following example will show how it works. We will re-implement the `StreamingLLMPress` without using the `compression_ratio` parameter. In `StreamingLLM`, only the first `n_first` and last `n_last` key-value pairs are kept." + "While it is sufficient in most cases to create a custom scorer class, the following example will show how it works. We will re-implement the `StreamingLLMPress` explcitly without using the `compression_ratio` parameter. In `StreamingLLM`, only the first `n_first` and last `n_last` key-value pairs are kept.\n", + "\n", + "MyStreamingLLMPress is a standalone press and doesn't need a scorer nor a compression ratio, as it always keeps first and last tokens.\n", + "We thus do not inherit from BasePruner." ] }, { @@ -242,13 +249,7 @@ "text": [ "\n", "n_last: 2\n", - "Last tokens seen by the model: press !\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "Last tokens seen by the model: press !\n", "Answer: The purpose of this guide is to provide instructions and information on how to use the software or application called \"Pulse\" or \"Pulse 2\". Pulse is a popular music production software that allows users to create, edit, and mix music tracks\n", "\n", "n_last: 4\n", @@ -262,28 +263,66 @@ } ], "source": [ - "class MyStreamingLLMPress(BasePress):\n", + "from dataclasses import dataclass\n", + "from contextlib import contextmanager\n", + "from typing import Generator\n", "\n", - " def __init__(self, n_first=1, n_last=8):\n", - " self.n_first = n_first\n", - " self.n_last = n_last\n", + "from transformers import (\n", + " LlamaForCausalLM,\n", + " MistralForCausalLM,\n", + " Phi3ForCausalLM,\n", + " PreTrainedModel,\n", + " QuantizedCache,\n", + " Qwen2ForCausalLM,\n", + ")\n", "\n", - " def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list):\n", "\n", + "@dataclass\n", + "class MyStreamingLLMPress:\n", + " n_first: int = 1\n", + " n_last: int = 8\n", + "\n", + " def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list):\n", " # Get the cache (transformers.cache_utils.DynamicCache object)\n", " cache = output[-1]\n", - " i = module.layer_idx\n", - " keys, values = cache.key_cache[i], cache.value_cache[i]\n", + " layer_idx = module.layer_idx\n", + " keys, values = cache.key_cache[layer_idx], cache.value_cache[layer_idx]\n", "\n", " # Update the cache to only keep the first and last tokens\n", " mask = torch.ones(keys.shape[-2], dtype=torch.bool, device=keys.device)\n", " mask[self.n_first : -self.n_last] = False\n", - " cache.key_cache[i] = keys[:, :, mask, :]\n", - " cache.value_cache[i] = values[:, :, mask, :]\n", + " cache.key_cache[layer_idx] = keys[:, :, mask, :]\n", + " cache.value_cache[layer_idx] = values[:, :, mask, :]\n", "\n", " # Return the updated output (output[-1] has been modified in-place)\n", " return output\n", "\n", + " # Same as DefaultPruner's __call__ method.\n", + " @contextmanager\n", + " def __call__(self, model: PreTrainedModel) -> Generator:\n", + " \"\"\"\n", + " Context manager to apply a compression method to a model.\n", + " Apply this context manager during the pre-filling phase to compress the context.\n", + "\n", + " Parameters\n", + " ----------\n", + " model : PreTrainedModel\n", + " Model to apply the compression method to\n", + " \"\"\"\n", + "\n", + " if not isinstance(model, (LlamaForCausalLM, MistralForCausalLM, Phi3ForCausalLM, Qwen2ForCausalLM)):\n", + " logger.warning(f\"Model {type(model)} not tested\")\n", + "\n", + " try:\n", + " hooks = []\n", + " for layer in model.model.layers:\n", + " hooks.append(layer.self_attn.register_forward_hook(self.forward_hook, with_kwargs=True))\n", + "\n", + " yield\n", + " finally:\n", + " for forward_hook in hooks:\n", + " forward_hook.remove()\n", + "\n", "\n", "for n_last in [2, 4, 8]:\n", " press = MyStreamingLLMPress(n_last=n_last)\n", @@ -309,9 +348,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "kvpress2", "language": "python", - "name": "python3" + "name": "kvpress2" }, "language_info": { "codemirror_mode": { @@ -323,9 +362,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.15" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/notebooks/per_layer_compression_demo.ipynb b/notebooks/per_layer_compression_demo.ipynb index fc46c9de..9637538b 100644 --- a/notebooks/per_layer_compression_demo.ipynb +++ b/notebooks/per_layer_compression_demo.ipynb @@ -4,14 +4,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In this notebook, we showcase how to use the improve retrieval performance using per-layer compression." + "# In this notebook, we showcase how to use the improve retrieval performance using per-layer compression." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/mount/home/setup/.cache/pypoetry/virtualenvs/kvpress-PV_RntMw-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "import numpy as np\n", "import torch\n", @@ -24,7 +33,8 @@ " RandomPress,\n", " SnapKVPress,\n", " StreamingLLMPress,\n", - " apply_per_layer_compression,\n", + " ExpectedAttentionScorer,\n", + " PerLayerCompressionPruner\n", ")" ] }, @@ -44,22 +54,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n" + "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n", + "Loading checkpoint shards: 100%|██████████| 2/2 [00:00<00:00, 4.81it/s]\n" ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "14ee6cc96fce42cfb6e75b2964fbda04", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Loading checkpoint shards: 0%| | 0/2 [00:00 Date: Tue, 3 Dec 2024 17:01:33 +0100 Subject: [PATCH 11/51] fix merge conflicts --- kvpress/scorers/think_press.py | 106 +++++++++++++++++++++++++++++++++ tests/presses/test_presses.py | 2 - 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/kvpress/scorers/think_press.py b/kvpress/scorers/think_press.py index e69de29b..7aae5410 100644 --- a/kvpress/scorers/think_press.py +++ b/kvpress/scorers/think_press.py @@ -0,0 +1,106 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + +from dataclasses import dataclass +from typing import Optional + +import torch +from torch import nn +from transformers.cache_utils import QuantizedCache +from transformers.models.llama.modeling_llama import rotate_half + +from kvpress.presses.base_press import BasePress + + +@dataclass +class ThinKPress(BasePress): + """ + ThinK (https://arxiv.org/pdf/2407.21018) compresses the dimensions of the keys, and not the sequence length. + Hence it can be combined with any other press that compresses the sequence length, e.g. + press = ThinKPress(compression_ratio=0.5, inner_press=SnapKVPress(compression_ratio=0.5)) + + Here, we zero out the pruned dimensions resulting in no memory gain (the shape of the keys remains the same). + To achieve memory savings, several options can be considered (see https://github.com/NVIDIA/kvpress/pull/18/), + we might implement them in the future, especially if other similar presses are requested. + + This press has been reviewed by Yuhui Xu, first author of the ThinK paper. + """ + + compression_ratio: float = 0.0 + inner_press: Optional[BasePress] = None + window_size: int = 32 + + def compute_window_queries(self, module, hidden_states): + """ + Re-compute the last window_size query states + """ + + bsz, q_len, _ = hidden_states.shape + + # Get last window_size queries + if hasattr(module, "q_proj"): + query_states = module.q_proj(hidden_states[:, -self.window_size :]) + elif hasattr(module, "qkv_proj"): + qkv = module.qkv_proj(hidden_states[:, -self.window_size :]) + query_states = qkv[..., : module.num_heads * module.head_dim] + else: + raise NotImplementedError(f"SnapKV not yet implemented for {module.__class__}.") + + query_states = query_states.view(bsz, self.window_size, module.num_heads, module.head_dim).transpose(1, 2) + + # Apply RoPE + position_ids = torch.arange(q_len - self.window_size, q_len).unsqueeze(0).to(query_states.device) + cos, sin = module.rotary_emb(query_states, position_ids) + query_states = (query_states * cos.unsqueeze(1)) + (rotate_half(query_states) * sin.unsqueeze(1)) + + return query_states + + def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): + """ + We first apply the inner press, then we prune the key dimensions. If other similar presses are requested, + we will create a dedicated DimensionBasePress class to avoid code duplication. + """ + + # Apply the forward hook of the inner press + if self.inner_press is not None: + output = self.inner_press.forward_hook(module, input, kwargs, output) + + # Don't compress if the compression ratio is 0 or this is not pre-filling + cache = output[-1] + hidden_states = kwargs["hidden_states"] + q_len = hidden_states.shape[1] + assert q_len > self.window_size, "Query length should be greater than the window size" + + if (self.compression_ratio == 0) or (cache.seen_tokens > q_len): + return output + + # Get keys + if isinstance(cache, QuantizedCache): + keys = cache._dequantize(cache._quantized_key_cache[module.layer_idx]) + else: + keys = cache.key_cache[module.layer_idx] + bsz, num_key_value_heads, q_len, head_dim = keys.shape + + # ThinK specific code + queries = self.compute_window_queries(module, kwargs["hidden_states"]) + + # Compute scores per dimension + queries_norm = torch.pow(queries, 2).mean(dim=2) # (bsz, num_heads, head_dim) + queries_norm = queries_norm.view(bsz, num_key_value_heads, module.num_key_value_groups, module.head_dim).mean(2) + keys_norm = torch.pow(keys, 2).mean(dim=2) + key_scores = queries_norm * keys_norm # (bsz, num_key_value_heads, head_dim) + + # Prune dimensions with the lowest scores by setting them to 0 + n_pruned = int(head_dim * self.compression_ratio) + indices = key_scores.topk(n_pruned, dim=-1, largest=False).indices + indices = indices.unsqueeze(2).expand(-1, -1, q_len, -1) + keys = keys.scatter_(-1, indices, 0) + + # Update cache + if isinstance(cache, QuantizedCache): + cache._quantized_key_cache[module.layer_idx] = cache._quantize(keys, axis=cache.axis_key) + else: + cache.key_cache[module.layer_idx] = keys + + return output diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index efc1f11f..9c545a5c 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -33,8 +33,6 @@ def test_presses_run(unit_test_model): # noqa: F811 for cls in [KnormPress, ExpectedAttentionPress, RandomPress, StreamingLLMPress, SnapKVPress, TOVAPress, ThinKPress]: for compression_ratio in [0.2, 0.4, 0.6, 0.8]: press = cls(compression_ratio=compression_ratio) - if cls == SnapKVPress: - press.scorer.window_size = 2 if cls in [SnapKVPress, ThinKPress]: press.window_size = 2 with press(unit_test_model): From 926290e4a550296baf1c2643a3b682bdb2c726fc Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 3 Dec 2024 17:07:59 +0100 Subject: [PATCH 12/51] add think_press to pruners --- kvpress/__init__.py | 1 + kvpress/{scorers => prunners}/think_press.py | 7 +++---- tests/presses/test_presses.py | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) rename kvpress/{scorers => prunners}/think_press.py (97%) diff --git a/kvpress/__init__.py b/kvpress/__init__.py index 55575be7..ee3a9e3b 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -15,6 +15,7 @@ from kvpress.prunners.default_pruner import DefaultPruner from kvpress.prunners.eager_attention_pruner import EagerAttentionPruner from kvpress.prunners.per_layer_compression_pruner import PerLayerCompressionPruner +from kvpress.prunners.think_press import ThinKPress from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer from kvpress.scorers.knorm_scorer import KnormScorer from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer diff --git a/kvpress/scorers/think_press.py b/kvpress/prunners/think_press.py similarity index 97% rename from kvpress/scorers/think_press.py rename to kvpress/prunners/think_press.py index 7aae5410..bd00d3ba 100644 --- a/kvpress/scorers/think_press.py +++ b/kvpress/prunners/think_press.py @@ -10,11 +10,11 @@ from transformers.cache_utils import QuantizedCache from transformers.models.llama.modeling_llama import rotate_half -from kvpress.presses.base_press import BasePress +from kvpress import DefaultPruner @dataclass -class ThinKPress(BasePress): +class ThinKPress(DefaultPruner): """ ThinK (https://arxiv.org/pdf/2407.21018) compresses the dimensions of the keys, and not the sequence length. Hence it can be combined with any other press that compresses the sequence length, e.g. @@ -28,14 +28,13 @@ class ThinKPress(BasePress): """ compression_ratio: float = 0.0 - inner_press: Optional[BasePress] = None + inner_press: Optional[DefaultPruner] = None window_size: int = 32 def compute_window_queries(self, module, hidden_states): """ Re-compute the last window_size query states """ - bsz, q_len, _ = hidden_states.shape # Get last window_size queries diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 9c545a5c..3f44893d 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -14,11 +14,10 @@ RandomPress, SnapKVPress, StreamingLLMPress, - TOVAPress, ThinKPress, + TOVAPress, ) from kvpress.scorers.base_scorer import BaseScorer - from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 From a370fc774f6c34d335c93605475a82b2e07e2a87 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 3 Dec 2024 17:18:09 +0100 Subject: [PATCH 13/51] create a basepruner class --- kvpress/pipeline.py | 6 +- kvpress/prunners/base_pruner.py | 69 +++++++++++++++++++ kvpress/prunners/default_pruner.py | 42 ++--------- .../prunners/per_layer_compression_pruner.py | 23 +++++-- kvpress/prunners/think_press.py | 3 +- tests/presses/test_presses.py | 2 +- 6 files changed, 100 insertions(+), 45 deletions(-) create mode 100644 kvpress/prunners/base_pruner.py diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index cde7fa5b..df88cc20 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -12,7 +12,7 @@ from transformers.pipelines.base import GenericTensor from kvpress.default_presses import ObservedAttentionScorer -from kvpress.prunners.default_pruner import DefaultPruner +from kvpress.prunners.base_pruner import BasePruner logger = logging.getLogger(__name__) @@ -29,7 +29,7 @@ def _sanitize_parameters( question: Optional[str] = None, questions: Optional[list[str]] = None, answer_prefix: Optional[str] = None, - press: Optional[DefaultPruner] = None, + press: Optional[BasePruner] = None, max_new_tokens: int = 50, max_context_length: Optional[int] = None, cache: Optional[Cache] = None, @@ -133,7 +133,7 @@ def _forward( self, input_tensors: dict[str, GenericTensor], max_new_tokens: int = 50, - press: Optional[DefaultPruner] = None, + press: Optional[BasePruner] = None, cache: Optional[Cache] = None, ): """ diff --git a/kvpress/prunners/base_pruner.py b/kvpress/prunners/base_pruner.py new file mode 100644 index 00000000..077ca41c --- /dev/null +++ b/kvpress/prunners/base_pruner.py @@ -0,0 +1,69 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + +import logging +from contextlib import contextmanager +from dataclasses import dataclass +from typing import Generator + +import torch +from torch import nn +from transformers import LlamaForCausalLM, MistralForCausalLM, Phi3ForCausalLM, PreTrainedModel, Qwen2ForCausalLM + +logger = logging.getLogger(__name__) + + +@dataclass +class BasePruner: + """ + Base class for all pruning methods. + The `forward_hook` method is called after the forward pass of an attention layer. + Any pruning/updating method should be implemented in the derived class. + """ + + def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): + """Cache compression hook called after the forward pass of an attention layer. + The hook is applied only during the pre-filling phase if there is some pruning ratio. + + Parameters + ---------- + module : + Transformer attention layer. + input : + Input to the hook. This is the input to the forward pass of the layer. + kwargs : + Keyword arguments, as given to the forward pass of the layer. + output : + Output of the hook. This is the original output of the forward pass of the layer. + + Returns + ------- + Modified output of the forward pass of the layer. + """ + raise NotImplementedError("forward_hook method must be implemented in the derived class") + + @contextmanager + def __call__(self, model: PreTrainedModel) -> Generator: + """ + Context manager to apply a compression method to a model. + Apply this context manager during the pre-filling phase to compress the context. + + Parameters + ---------- + model : PreTrainedModel + Model to apply the compression method to + """ + + if not isinstance(model, (LlamaForCausalLM, MistralForCausalLM, Phi3ForCausalLM, Qwen2ForCausalLM)): + logger.warning(f"Model {type(model)} not tested") + + hooks = [] + try: + for layer in model.model.layers: + hooks.append(layer.self_attn.register_forward_hook(self.forward_hook, with_kwargs=True)) + + yield + finally: + for forward_hook in hooks: + forward_hook.remove() diff --git a/kvpress/prunners/default_pruner.py b/kvpress/prunners/default_pruner.py index deff2cc8..aeecb10f 100644 --- a/kvpress/prunners/default_pruner.py +++ b/kvpress/prunners/default_pruner.py @@ -3,30 +3,24 @@ import logging -from contextlib import contextmanager from dataclasses import dataclass -from typing import Generator import torch from torch import nn from transformers import ( - LlamaForCausalLM, - MistralForCausalLM, - Phi3ForCausalLM, - PreTrainedModel, QuantizedCache, - Qwen2ForCausalLM, ) +from kvpress.prunners.base_pruner import BasePruner from kvpress.scorers.base_scorer import BaseScorer logger = logging.getLogger(__name__) @dataclass -class DefaultPruner: +class DefaultPruner(BasePruner): """ - Base class for pruning methods. + Default pruning method. The `forward_hook` method is called after the forward pass of an attention layer. and updates the cache with the pruned KV pairs. """ @@ -38,9 +32,10 @@ def __post_init__(self): assert 0 <= self.compression_ratio < 1, "Compression ratio must be between 0 and 1" def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): - """Cache compression hook called after the forward pass of an attention layer. + """ + Default cache compression hook called after the forward pass of an attention layer. The hook is applied only during the pre-filling phase if there is some pruning ratio. - The current implementation only allows to remove a constant number of KV pairs. + This implementation allows to remove a constant number of KV pairs. Parameters ---------- @@ -97,28 +92,3 @@ def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dic cache.value_cache[module.layer_idx] = values return output - - @contextmanager - def __call__(self, model: PreTrainedModel) -> Generator: - """ - Context manager to apply a compression method to a model. - Apply this context manager during the pre-filling phase to compress the context. - - Parameters - ---------- - model : PreTrainedModel - Model to apply the compression method to - """ - - if not isinstance(model, (LlamaForCausalLM, MistralForCausalLM, Phi3ForCausalLM, Qwen2ForCausalLM)): - logger.warning(f"Model {type(model)} not tested") - - try: - hooks = [] - for layer in model.model.layers: - hooks.append(layer.self_attn.register_forward_hook(self.forward_hook, with_kwargs=True)) - - yield - finally: - for forward_hook in hooks: - forward_hook.remove() diff --git a/kvpress/prunners/per_layer_compression_pruner.py b/kvpress/prunners/per_layer_compression_pruner.py index 8ac31043..497cca6c 100644 --- a/kvpress/prunners/per_layer_compression_pruner.py +++ b/kvpress/prunners/per_layer_compression_pruner.py @@ -9,23 +9,38 @@ import torch from torch import nn +from kvpress.prunners.base_pruner import BasePruner from kvpress.prunners.default_pruner import DefaultPruner +from kvpress.scorers.base_scorer import BaseScorer logger = logging.getLogger(__name__) @dataclass -class PerLayerCompressionPruner(DefaultPruner): +class PerLayerCompressionPruner(BasePruner): + scorer: BaseScorer compression_ratios: List[float] = None def __post_init__(self): - super().__post_init__() logger.warning( "Per layer compression wrapper is an experimental feature and only works with flash attention. " "Please make sure that the model uses flash attention." ) assert self.compression_ratios is not None, "Please provide a list of compression ratios for each layer." + self.pruner = DefaultPruner(scorer=self.scorer) def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): - self.compression_ratio = self.compression_ratios[module.layer_idx] - return super().forward_hook(module, input, kwargs, output) + self.pruner.compression_ratio = self.compression_ratios[module.layer_idx] + return self.pruner.forward_hook(module, input, kwargs, output) + + @property + def compression_ratio(self): + return sum(self.compression_ratios) / len(self.compression_ratios) + + @compression_ratio.setter + def compression_ratio(self, value): + # While we could set a uniform compression ratio, raise an error to indicate that this may rather be a mistake + raise NotImplementedError( + "Setting compression ratio is not supported for PerLayerCompressionPruner. " + "Please use DefaultPruner for a uniform compression ratio." + ) diff --git a/kvpress/prunners/think_press.py b/kvpress/prunners/think_press.py index bd00d3ba..5ae6d6bb 100644 --- a/kvpress/prunners/think_press.py +++ b/kvpress/prunners/think_press.py @@ -11,10 +11,11 @@ from transformers.models.llama.modeling_llama import rotate_half from kvpress import DefaultPruner +from kvpress.prunners.base_pruner import BasePruner @dataclass -class ThinKPress(DefaultPruner): +class ThinKPress(BasePruner): """ ThinK (https://arxiv.org/pdf/2407.21018) compresses the dimensions of the keys, and not the sequence length. Hence it can be combined with any other press that compresses the sequence length, e.g. diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 3f44893d..54d57b71 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -14,9 +14,9 @@ RandomPress, SnapKVPress, StreamingLLMPress, - ThinKPress, TOVAPress, ) +from kvpress.prunners.think_press import ThinKPress from kvpress.scorers.base_scorer import BaseScorer from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 From a54b17cbb06ab82e59bd1413622afaf7cd1da9ee Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 3 Dec 2024 17:24:16 +0100 Subject: [PATCH 14/51] update readme --- README.md | 12 ++++++++++-- kvpress/__init__.py | 6 +++--- kvpress/{ => presses}/default_presses.py | 0 kvpress/{prunners => presses}/think_press.py | 0 kvpress/prunners/default_pruner.py | 4 +--- 5 files changed, 14 insertions(+), 8 deletions(-) rename kvpress/{ => presses}/default_presses.py (100%) rename kvpress/{prunners => presses}/think_press.py (100%) diff --git a/README.md b/README.md index e949b985..9277b204 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ For a detailed list of existing KV cache compression methods, check [Awesome-KV- ## Customization -Each press is composed of two main components, the scorer class that identifies important tokens and a pruner class that implements the pruning strategy. +Most presses are composed of two main components, the scorer class that identifies important tokens and a pruner class that implements the pruning strategy. As an example, it is possible to initialize `ExpectedAttentionPress` as follows: ```python @@ -78,10 +78,18 @@ press = DefaultPruner(compression_ratio=0.1, scorer=ExpectedAttentionScorer()) This allows for easy customization of the press behavior. Currently, the following pruning strategies are available: - `DefaultPruner`: Prunes the least important key-value pairs based on the score computed by the scorer. -- `PerLayerCompressionPruner`: Same as DefaultPruner, but it is possible to specify a different compression ratio for each layer. +- `PerLayerCompressionPruner`: Same as DefaultPruner, but it is possible to specify a different compression ratio for each layer. This feature is experimental. - `EagerAttentionPruner`: This class is used in conjunction with `ObservedAttentionPress` for better memory management (attention matrix will be deleted after computing the score). +It is also possible to create a custom press that does not consume a scorer, such an example would be `ThinKPress` that prunes across the channel dimension of the keys: +```python +from kvpress import ThinKPress, ExpectedAttentionPress +press = ThinKPress(compression_ratio=0.1, inner_press=ExpectedAttentionPress(compression_ratio=0.1)) +``` + + + ## Evaluation See the [speed_and_memory.ipynb](notebooks/speed_and_memory.ipynb) notebook on how to measure peak memory usage and total time gain. diff --git a/kvpress/__init__.py b/kvpress/__init__.py index ee3a9e3b..687f1512 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -2,7 +2,8 @@ # SPDX-License-Identifier: Apache-2.0 -from kvpress.default_presses import ( +from kvpress.pipeline import KVPressTextGenerationPipeline +from kvpress.presses.default_presses import ( ExpectedAttentionPress, KnormPress, ObservedAttentionPress, @@ -11,11 +12,10 @@ StreamingLLMPress, TOVAPress, ) -from kvpress.pipeline import KVPressTextGenerationPipeline +from kvpress.presses.think_press import ThinKPress from kvpress.prunners.default_pruner import DefaultPruner from kvpress.prunners.eager_attention_pruner import EagerAttentionPruner from kvpress.prunners.per_layer_compression_pruner import PerLayerCompressionPruner -from kvpress.prunners.think_press import ThinKPress from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer from kvpress.scorers.knorm_scorer import KnormScorer from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer diff --git a/kvpress/default_presses.py b/kvpress/presses/default_presses.py similarity index 100% rename from kvpress/default_presses.py rename to kvpress/presses/default_presses.py diff --git a/kvpress/prunners/think_press.py b/kvpress/presses/think_press.py similarity index 100% rename from kvpress/prunners/think_press.py rename to kvpress/presses/think_press.py diff --git a/kvpress/prunners/default_pruner.py b/kvpress/prunners/default_pruner.py index aeecb10f..0c5137c9 100644 --- a/kvpress/prunners/default_pruner.py +++ b/kvpress/prunners/default_pruner.py @@ -7,9 +7,7 @@ import torch from torch import nn -from transformers import ( - QuantizedCache, -) +from transformers import QuantizedCache from kvpress.prunners.base_pruner import BasePruner from kvpress.scorers.base_scorer import BaseScorer From 7aaef6076713cba30eda3ce9e0eec079a9c27b48 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 3 Dec 2024 17:26:21 +0100 Subject: [PATCH 15/51] update readme --- kvpress/presses/__init__.py | 0 kvpress/presses/default_presses.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 kvpress/presses/__init__.py diff --git a/kvpress/presses/__init__.py b/kvpress/presses/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/kvpress/presses/default_presses.py b/kvpress/presses/default_presses.py index 877bd90a..f35dec16 100644 --- a/kvpress/presses/default_presses.py +++ b/kvpress/presses/default_presses.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 """ -This file provides the default presses for the KVPress library. +This file provides the default presses for the KVPress library that are composed of pruner+scorers. Each press is a shortcut to a specific pruner and scorer combination. Function names are uppercase for backwards compatibility. """ From 0e8a19432e5bbc4ac644a10c88387bbf7502cb6e Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 3 Dec 2024 17:28:23 +0100 Subject: [PATCH 16/51] improve example notebook --- notebooks/new_press.ipynb | 41 ++------------------------------------- 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/notebooks/new_press.ipynb b/notebooks/new_press.ipynb index 1862f784..5b59f43d 100644 --- a/notebooks/new_press.ipynb +++ b/notebooks/new_press.ipynb @@ -28,6 +28,7 @@ "from torch import nn\n", "from transformers import pipeline\n", "\n", + "from kvpress.prunners.base_pruner import BasePruner\n", "from kvpress.scorers.base_scorer import BaseScorer\n", "from kvpress import KnormPress, DefaultPruner" ] @@ -264,21 +265,9 @@ ], "source": [ "from dataclasses import dataclass\n", - "from contextlib import contextmanager\n", - "from typing import Generator\n", - "\n", - "from transformers import (\n", - " LlamaForCausalLM,\n", - " MistralForCausalLM,\n", - " Phi3ForCausalLM,\n", - " PreTrainedModel,\n", - " QuantizedCache,\n", - " Qwen2ForCausalLM,\n", - ")\n", - "\n", "\n", "@dataclass\n", - "class MyStreamingLLMPress:\n", + "class MyStreamingLLMPress(BasePruner):\n", " n_first: int = 1\n", " n_last: int = 8\n", "\n", @@ -297,32 +286,6 @@ " # Return the updated output (output[-1] has been modified in-place)\n", " return output\n", "\n", - " # Same as DefaultPruner's __call__ method.\n", - " @contextmanager\n", - " def __call__(self, model: PreTrainedModel) -> Generator:\n", - " \"\"\"\n", - " Context manager to apply a compression method to a model.\n", - " Apply this context manager during the pre-filling phase to compress the context.\n", - "\n", - " Parameters\n", - " ----------\n", - " model : PreTrainedModel\n", - " Model to apply the compression method to\n", - " \"\"\"\n", - "\n", - " if not isinstance(model, (LlamaForCausalLM, MistralForCausalLM, Phi3ForCausalLM, Qwen2ForCausalLM)):\n", - " logger.warning(f\"Model {type(model)} not tested\")\n", - "\n", - " try:\n", - " hooks = []\n", - " for layer in model.model.layers:\n", - " hooks.append(layer.self_attn.register_forward_hook(self.forward_hook, with_kwargs=True))\n", - "\n", - " yield\n", - " finally:\n", - " for forward_hook in hooks:\n", - " forward_hook.remove()\n", - "\n", "\n", "for n_last in [2, 4, 8]:\n", " press = MyStreamingLLMPress(n_last=n_last)\n", From 44734a4ec1deba990a1cbb9a67926021906f36e8 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 3 Dec 2024 17:42:11 +0100 Subject: [PATCH 17/51] remove default compression_ratios argument --- kvpress/prunners/per_layer_compression_pruner.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kvpress/prunners/per_layer_compression_pruner.py b/kvpress/prunners/per_layer_compression_pruner.py index 497cca6c..9e27dee1 100644 --- a/kvpress/prunners/per_layer_compression_pruner.py +++ b/kvpress/prunners/per_layer_compression_pruner.py @@ -19,14 +19,13 @@ @dataclass class PerLayerCompressionPruner(BasePruner): scorer: BaseScorer - compression_ratios: List[float] = None + compression_ratios: List[float] def __post_init__(self): logger.warning( "Per layer compression wrapper is an experimental feature and only works with flash attention. " "Please make sure that the model uses flash attention." ) - assert self.compression_ratios is not None, "Please provide a list of compression ratios for each layer." self.pruner = DefaultPruner(scorer=self.scorer) def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): From 9161e4a50ad4698d503386a967b4238079bc2e3d Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 3 Dec 2024 17:43:09 +0100 Subject: [PATCH 18/51] remove default compression_ratios argument --- kvpress/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index df88cc20..bf8eb93d 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -11,7 +11,7 @@ from transformers.pipelines import PIPELINE_REGISTRY from transformers.pipelines.base import GenericTensor -from kvpress.default_presses import ObservedAttentionScorer +from kvpress import ObservedAttentionScorer from kvpress.prunners.base_pruner import BasePruner logger = logging.getLogger(__name__) From 21102c3412d75d7cbd995cf21d573f5095644ba5 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 10:05:28 +0100 Subject: [PATCH 19/51] fix circular import --- kvpress/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index bf8eb93d..eb678675 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -11,8 +11,8 @@ from transformers.pipelines import PIPELINE_REGISTRY from transformers.pipelines.base import GenericTensor -from kvpress import ObservedAttentionScorer from kvpress.prunners.base_pruner import BasePruner +from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer logger = logging.getLogger(__name__) From 33ab1a643d9ec5685b7166a3a417317f0e20b526 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 10:07:56 +0100 Subject: [PATCH 20/51] fix circular import --- kvpress/presses/think_press.py | 2 +- tests/test_generate.py | 2 +- tests/test_pipeline.py | 3 ++- tests/test_press_call.py | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/kvpress/presses/think_press.py b/kvpress/presses/think_press.py index 5ae6d6bb..e0f19449 100644 --- a/kvpress/presses/think_press.py +++ b/kvpress/presses/think_press.py @@ -10,8 +10,8 @@ from transformers.cache_utils import QuantizedCache from transformers.models.llama.modeling_llama import rotate_half -from kvpress import DefaultPruner from kvpress.prunners.base_pruner import BasePruner +from kvpress.prunners.default_pruner import DefaultPruner @dataclass diff --git a/tests/test_generate.py b/tests/test_generate.py index 7bad5974..f13486b7 100644 --- a/tests/test_generate.py +++ b/tests/test_generate.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 -from kvpress import KnormPress +from kvpress.presses.default_presses import KnormPress from tests.fixtures import kv_press_pipeline # noqa: F401 diff --git a/tests/test_pipeline.py b/tests/test_pipeline.py index 07a95f2b..3338bda3 100644 --- a/tests/test_pipeline.py +++ b/tests/test_pipeline.py @@ -8,7 +8,8 @@ import torch from transformers import AutoTokenizer, DynamicCache -from kvpress import ExpectedAttentionPress, KVPressTextGenerationPipeline +from kvpress.pipeline import KVPressTextGenerationPipeline +from kvpress.presses.default_presses import ExpectedAttentionPress from tests.fixtures import danube_500m_model, kv_press_pipeline, unit_test_model # noqa: F401 diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 521b6021..275709ac 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -4,7 +4,8 @@ from transformers import DynamicCache -from kvpress import DefaultPruner, KnormPress +from kvpress.prunners.default_pruner import DefaultPruner +from kvpress.scorers.knorm_scorer import KnormPress from tests.fixtures import unit_test_model # noqa: F401 From 2bd6d93e283028e50d93f221acb3b5f922073afb Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 10:10:33 +0100 Subject: [PATCH 21/51] fix circular import --- tests/presses/test_observed_attention_press.py | 2 +- tests/presses/test_presses.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/presses/test_observed_attention_press.py b/tests/presses/test_observed_attention_press.py index f68920ed..73cf5138 100644 --- a/tests/presses/test_observed_attention_press.py +++ b/tests/presses/test_observed_attention_press.py @@ -7,7 +7,7 @@ import torch from transformers import DynamicCache -from kvpress.default_presses import ObservedAttentionPress +from kvpress.presses.default_presses import ObservedAttentionPress from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 54d57b71..48d43c31 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -6,8 +6,7 @@ from torch import nn from transformers import DynamicCache -from kvpress.default_presses import ( - DefaultPruner, +from kvpress.presses.default_presses import ( ExpectedAttentionPress, KnormPress, ObservedAttentionPress, @@ -16,6 +15,7 @@ StreamingLLMPress, TOVAPress, ) +from kvpress.prunners.default_pruner import DefaultPruner from kvpress.prunners.think_press import ThinKPress from kvpress.scorers.base_scorer import BaseScorer from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 From 437a6ae111e35d1c7ef10468b3f11997d17797f2 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 10:12:36 +0100 Subject: [PATCH 22/51] fix import --- tests/presses/test_presses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 48d43c31..6461d965 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -16,7 +16,7 @@ TOVAPress, ) from kvpress.prunners.default_pruner import DefaultPruner -from kvpress.prunners.think_press import ThinKPress +from kvpress.presses.think_press import ThinKPress from kvpress.scorers.base_scorer import BaseScorer from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 From 3ef29707e956397bc806746a2d5e6863f915b0d6 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 10:13:20 +0100 Subject: [PATCH 23/51] fix import --- tests/test_press_call.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 275709ac..e18be318 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -5,7 +5,7 @@ from transformers import DynamicCache from kvpress.prunners.default_pruner import DefaultPruner -from kvpress.scorers.knorm_scorer import KnormPress +from kvpress.presses.default_presses import KnormPress from tests.fixtures import unit_test_model # noqa: F401 From d427b748ef833e6367bbcae6f889da6e9b952d19 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 10:41:41 +0100 Subject: [PATCH 24/51] fix test --- tests/presses/test_presses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 6461d965..53055c8e 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -33,7 +33,7 @@ def test_presses_run(unit_test_model): # noqa: F811 for compression_ratio in [0.2, 0.4, 0.6, 0.8]: press = cls(compression_ratio=compression_ratio) if cls in [SnapKVPress, ThinKPress]: - press.window_size = 2 + press.scorer.window_size = 2 with press(unit_test_model): input_ids = unit_test_model.dummy_inputs["input_ids"] unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values From ee3a0d059bb90b845c5272a9c31ac17e6e21cf39 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 10:44:12 +0100 Subject: [PATCH 25/51] fix test --- tests/presses/test_presses.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 53055c8e..c8264878 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -32,8 +32,10 @@ def test_presses_run(unit_test_model): # noqa: F811 for cls in [KnormPress, ExpectedAttentionPress, RandomPress, StreamingLLMPress, SnapKVPress, TOVAPress, ThinKPress]: for compression_ratio in [0.2, 0.4, 0.6, 0.8]: press = cls(compression_ratio=compression_ratio) - if cls in [SnapKVPress, ThinKPress]: + if cls in [SnapKVPress]: press.scorer.window_size = 2 + if cls == ThinKPress: + press.window_size = 2 with press(unit_test_model): input_ids = unit_test_model.dummy_inputs["input_ids"] unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values From 44917a45cdd4db2add1eeec313c310991869e183 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 11:36:22 +0100 Subject: [PATCH 26/51] fix type annotation --- kvpress/presses/think_press.py | 3 +-- tests/presses/test_presses.py | 2 +- tests/test_press_call.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/kvpress/presses/think_press.py b/kvpress/presses/think_press.py index e0f19449..48e953fb 100644 --- a/kvpress/presses/think_press.py +++ b/kvpress/presses/think_press.py @@ -11,7 +11,6 @@ from transformers.models.llama.modeling_llama import rotate_half from kvpress.prunners.base_pruner import BasePruner -from kvpress.prunners.default_pruner import DefaultPruner @dataclass @@ -29,7 +28,7 @@ class ThinKPress(BasePruner): """ compression_ratio: float = 0.0 - inner_press: Optional[DefaultPruner] = None + inner_press: Optional[BasePruner] = None window_size: int = 32 def compute_window_queries(self, module, hidden_states): diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index c8264878..738ba3fd 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -15,8 +15,8 @@ StreamingLLMPress, TOVAPress, ) -from kvpress.prunners.default_pruner import DefaultPruner from kvpress.presses.think_press import ThinKPress +from kvpress.prunners.default_pruner import DefaultPruner from kvpress.scorers.base_scorer import BaseScorer from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 diff --git a/tests/test_press_call.py b/tests/test_press_call.py index e18be318..0d664cd0 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -4,8 +4,8 @@ from transformers import DynamicCache -from kvpress.prunners.default_pruner import DefaultPruner from kvpress.presses.default_presses import KnormPress +from kvpress.prunners.default_pruner import DefaultPruner from tests.fixtures import unit_test_model # noqa: F401 From 1e4a36f6cf1b951c64f588285bebf8e7651e8165 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Wed, 4 Dec 2024 15:58:13 +0100 Subject: [PATCH 27/51] make compression for think more explicit --- README.md | 2 +- evaluation/evaluate.py | 2 +- kvpress/presses/think_press.py | 19 ++++++++++++++++--- tests/presses/test_presses.py | 6 ++---- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9277b204..3c370b0d 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ Currently, the following pruning strategies are available: It is also possible to create a custom press that does not consume a scorer, such an example would be `ThinKPress` that prunes across the channel dimension of the keys: ```python from kvpress import ThinKPress, ExpectedAttentionPress -press = ThinKPress(compression_ratio=0.1, inner_press=ExpectedAttentionPress(compression_ratio=0.1)) +press = ThinKPress(key_channel_compression_ratio=0.1, inner_press=ExpectedAttentionPress(compression_ratio=0.1)) ``` diff --git a/evaluation/evaluate.py b/evaluation/evaluate.py index 21d1d528..24ae0967 100644 --- a/evaluation/evaluate.py +++ b/evaluation/evaluate.py @@ -120,7 +120,7 @@ def evaluate( # Load press assert press_name in PRESS_DICT press = PRESS_DICT[press_name] - press.compression_ratio = compression_ratio + press.key_channel_compression_ratio = compression_ratio # Initialize pipeline with the correct attention implementation if isinstance(press.scorer, ObservedAttentionScorer): diff --git a/kvpress/presses/think_press.py b/kvpress/presses/think_press.py index 48e953fb..6d699aae 100644 --- a/kvpress/presses/think_press.py +++ b/kvpress/presses/think_press.py @@ -27,7 +27,7 @@ class ThinKPress(BasePruner): This press has been reviewed by Yuhui Xu, first author of the ThinK paper. """ - compression_ratio: float = 0.0 + key_channel_compression_ratio: float = 0.0 inner_press: Optional[BasePruner] = None window_size: int = 32 @@ -71,7 +71,7 @@ def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dic q_len = hidden_states.shape[1] assert q_len > self.window_size, "Query length should be greater than the window size" - if (self.compression_ratio == 0) or (cache.seen_tokens > q_len): + if (self.key_channel_compression_ratio == 0) or (cache.seen_tokens > q_len): return output # Get keys @@ -91,7 +91,7 @@ def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dic key_scores = queries_norm * keys_norm # (bsz, num_key_value_heads, head_dim) # Prune dimensions with the lowest scores by setting them to 0 - n_pruned = int(head_dim * self.compression_ratio) + n_pruned = int(head_dim * self.key_channel_compression_ratio) indices = key_scores.topk(n_pruned, dim=-1, largest=False).indices indices = indices.unsqueeze(2).expand(-1, -1, q_len, -1) keys = keys.scatter_(-1, indices, 0) @@ -103,3 +103,16 @@ def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dic cache.key_cache[module.layer_idx] = keys return output + + @property + def compression_ratio(self): + compression_ratio = self.key_channel_compression_ratio / 2 + if self.inner_press is not None and hasattr(self.inner_press, "compression_ratio"): + compression_ratio += self.inner_press.compression_ratio + return compression_ratio + + @compression_ratio.setter + def compression_ratio(self, value): + raise AttributeError( + "Cannot set the compression ratio of ThinKPress directly. " "Set key_channel_compression_ratio instead." + ) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 738ba3fd..8c8213ab 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -22,20 +22,18 @@ def test_think_inner_press(unit_test_model): # noqa: F811 - press = ThinKPress(compression_ratio=0.5, window_size=2, inner_press=KnormPress(0.5)) + press = ThinKPress(key_channel_compression_ratio=0.5, window_size=2, inner_press=KnormPress(0.5)) with press(unit_test_model): input_ids = unit_test_model.dummy_inputs["input_ids"] unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values def test_presses_run(unit_test_model): # noqa: F811 - for cls in [KnormPress, ExpectedAttentionPress, RandomPress, StreamingLLMPress, SnapKVPress, TOVAPress, ThinKPress]: + for cls in [KnormPress, ExpectedAttentionPress, RandomPress, StreamingLLMPress, SnapKVPress, TOVAPress]: for compression_ratio in [0.2, 0.4, 0.6, 0.8]: press = cls(compression_ratio=compression_ratio) if cls in [SnapKVPress]: press.scorer.window_size = 2 - if cls == ThinKPress: - press.window_size = 2 with press(unit_test_model): input_ids = unit_test_model.dummy_inputs["input_ids"] unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values From ca7ef7ce94baaa038c08751f46284fdb3b834a4a Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 10:09:18 +0100 Subject: [PATCH 28/51] address pr feedback --- README.md | 4 +-- evaluation/evaluate.py | 2 +- kvpress/__init__.py | 8 ++--- kvpress/pipeline.py | 6 ++-- .../base_pruner.py => presses/base_press.py} | 2 +- .../default_press.py} | 4 +-- kvpress/presses/default_presses.py | 32 +++++-------------- .../eager_attention_press.py} | 4 +-- kvpress/presses/expected_attention_press.py | 22 +++++++++++++ .../per_layer_compression_press.py} | 22 +++++++------ kvpress/presses/think_press.py | 6 ++-- kvpress/prunners/__init__.py | 2 -- notebooks/expected_attention.ipynb | 22 ++++++------- notebooks/new_press.ipynb | 10 +++--- notebooks/per_layer_compression_demo.ipynb | 6 ++-- tests/presses/test_presses.py | 8 ++--- tests/test_per_layer_compression_wrapper.py | 4 +-- tests/test_pipeline.py | 2 +- tests/test_press_call.py | 4 +-- 19 files changed, 88 insertions(+), 82 deletions(-) rename kvpress/{prunners/base_pruner.py => presses/base_press.py} (99%) rename kvpress/{prunners/default_pruner.py => presses/default_press.py} (97%) rename kvpress/{prunners/eager_attention_pruner.py => presses/eager_attention_press.py} (91%) create mode 100644 kvpress/presses/expected_attention_press.py rename kvpress/{prunners/per_layer_compression_pruner.py => presses/per_layer_compression_press.py} (63%) delete mode 100644 kvpress/prunners/__init__.py diff --git a/README.md b/README.md index 3c370b0d..93fdd4ca 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,9 @@ Most presses are composed of two main components, the scorer class that identifi As an example, it is possible to initialize `ExpectedAttentionPress` as follows: ```python -from kvpress import DefaultPruner, ExpectedAttentionScorer +from kvpress import DefaultPress, ExpectedAttentionScorer -press = DefaultPruner(compression_ratio=0.1, scorer=ExpectedAttentionScorer()) +press = DefaultPress(compression_ratio=0.1, scorer=ExpectedAttentionScorer()) ``` This allows for easy customization of the press behavior. diff --git a/evaluation/evaluate.py b/evaluation/evaluate.py index 24ae0967..fc7a7bc7 100644 --- a/evaluation/evaluate.py +++ b/evaluation/evaluate.py @@ -123,7 +123,7 @@ def evaluate( press.key_channel_compression_ratio = compression_ratio # Initialize pipeline with the correct attention implementation - if isinstance(press.scorer, ObservedAttentionScorer): + if isinstance(press.press, ObservedAttentionScorer): model_kwargs = {"attn_implementation": "eager"} else: try: diff --git a/kvpress/__init__.py b/kvpress/__init__.py index 687f1512..29f527a0 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -3,8 +3,8 @@ from kvpress.pipeline import KVPressTextGenerationPipeline +from kvpress.presses.default_press import DefaultPress from kvpress.presses.default_presses import ( - ExpectedAttentionPress, KnormPress, ObservedAttentionPress, RandomPress, @@ -12,10 +12,10 @@ StreamingLLMPress, TOVAPress, ) +from kvpress.presses.eager_attention_press import EagerAttentionPruner +from kvpress.presses.expected_attention_press import ExpectedAttentionPress +from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress from kvpress.presses.think_press import ThinKPress -from kvpress.prunners.default_pruner import DefaultPruner -from kvpress.prunners.eager_attention_pruner import EagerAttentionPruner -from kvpress.prunners.per_layer_compression_pruner import PerLayerCompressionPruner from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer from kvpress.scorers.knorm_scorer import KnormScorer from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index eb678675..14703ab7 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -11,7 +11,7 @@ from transformers.pipelines import PIPELINE_REGISTRY from transformers.pipelines.base import GenericTensor -from kvpress.prunners.base_pruner import BasePruner +from kvpress.presses.base_press import BasePress from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer logger = logging.getLogger(__name__) @@ -29,7 +29,7 @@ def _sanitize_parameters( question: Optional[str] = None, questions: Optional[list[str]] = None, answer_prefix: Optional[str] = None, - press: Optional[BasePruner] = None, + press: Optional[BasePress] = None, max_new_tokens: int = 50, max_context_length: Optional[int] = None, cache: Optional[Cache] = None, @@ -133,7 +133,7 @@ def _forward( self, input_tensors: dict[str, GenericTensor], max_new_tokens: int = 50, - press: Optional[BasePruner] = None, + press: Optional[BasePress] = None, cache: Optional[Cache] = None, ): """ diff --git a/kvpress/prunners/base_pruner.py b/kvpress/presses/base_press.py similarity index 99% rename from kvpress/prunners/base_pruner.py rename to kvpress/presses/base_press.py index 077ca41c..6d30ff43 100644 --- a/kvpress/prunners/base_pruner.py +++ b/kvpress/presses/base_press.py @@ -15,7 +15,7 @@ @dataclass -class BasePruner: +class BasePress: """ Base class for all pruning methods. The `forward_hook` method is called after the forward pass of an attention layer. diff --git a/kvpress/prunners/default_pruner.py b/kvpress/presses/default_press.py similarity index 97% rename from kvpress/prunners/default_pruner.py rename to kvpress/presses/default_press.py index 0c5137c9..ef7a7b1a 100644 --- a/kvpress/prunners/default_pruner.py +++ b/kvpress/presses/default_press.py @@ -9,14 +9,14 @@ from torch import nn from transformers import QuantizedCache -from kvpress.prunners.base_pruner import BasePruner +from kvpress.presses.base_press import BasePress from kvpress.scorers.base_scorer import BaseScorer logger = logging.getLogger(__name__) @dataclass -class DefaultPruner(BasePruner): +class DefaultPress(BasePress): """ Default pruning method. The `forward_hook` method is called after the forward pass of an attention layer. diff --git a/kvpress/presses/default_presses.py b/kvpress/presses/default_presses.py index f35dec16..fc04ad18 100644 --- a/kvpress/presses/default_presses.py +++ b/kvpress/presses/default_presses.py @@ -6,9 +6,8 @@ Each press is a shortcut to a specific pruner and scorer combination. Function names are uppercase for backwards compatibility. """ -from kvpress.prunners.default_pruner import DefaultPruner -from kvpress.prunners.eager_attention_pruner import EagerAttentionPruner -from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer +from kvpress.presses.default_press import DefaultPress +from kvpress.presses.eager_attention_press import EagerAttentionPruner from kvpress.scorers.knorm_scorer import KnormScorer from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer from kvpress.scorers.random_scorer import RandomScorer @@ -17,25 +16,10 @@ from kvpress.scorers.tova_scorer import TOVAScorer -def ExpectedAttentionPress( - compression_ratio: float = 0.0, - n_future_positions: int = 512, - n_sink: int = 4, - use_covariance: bool = True, - use_vnorm: bool = True, -): - return DefaultPruner( - compression_ratio=compression_ratio, - scorer=ExpectedAttentionScorer( - n_future_positions=n_future_positions, n_sink=n_sink, use_covariance=use_covariance, use_vnorm=use_vnorm - ), - ) - - def KnormPress( compression_ratio: float = 0.0, ): - return DefaultPruner(compression_ratio=compression_ratio, scorer=KnormScorer()) + return DefaultPress(compression_ratio=compression_ratio, scorer=KnormScorer()) def ObservedAttentionPress( @@ -43,12 +27,12 @@ def ObservedAttentionPress( output_attentions: bool = False, ): if output_attentions: - return DefaultPruner(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) + return DefaultPress(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) return EagerAttentionPruner(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) def RandomPress(compression_ratio: float = 0.0): - return DefaultPruner(compression_ratio=compression_ratio, scorer=RandomScorer()) + return DefaultPress(compression_ratio=compression_ratio, scorer=RandomScorer()) def SnapKVPress( @@ -56,14 +40,14 @@ def SnapKVPress( window_size: int = 64, kernel_size: int = 5, ): - return DefaultPruner( + return DefaultPress( compression_ratio=compression_ratio, scorer=SnapKVScorer(window_size=window_size, kernel_size=kernel_size) ) def StreamingLLMPress(compression_ratio: float = 0.0, n_sink: int = 4): - return DefaultPruner(compression_ratio=compression_ratio, scorer=StreamingLLMScorer(n_sink=n_sink)) + return DefaultPress(compression_ratio=compression_ratio, scorer=StreamingLLMScorer(n_sink=n_sink)) def TOVAPress(compression_ratio: float = 0.0, window_size: int = 1): - return DefaultPruner(compression_ratio=compression_ratio, scorer=TOVAScorer(window_size=window_size)) + return DefaultPress(compression_ratio=compression_ratio, scorer=TOVAScorer(window_size=window_size)) diff --git a/kvpress/prunners/eager_attention_pruner.py b/kvpress/presses/eager_attention_press.py similarity index 91% rename from kvpress/prunners/eager_attention_pruner.py rename to kvpress/presses/eager_attention_press.py index b1ef022d..06aa5a83 100644 --- a/kvpress/prunners/eager_attention_pruner.py +++ b/kvpress/presses/eager_attention_press.py @@ -8,13 +8,13 @@ import torch from torch import nn -from kvpress.prunners.default_pruner import DefaultPruner +from kvpress.presses.default_press import DefaultPress logger = logging.getLogger(__name__) @dataclass -class EagerAttentionPruner(DefaultPruner): +class EagerAttentionPruner(DefaultPress): """ This pruner can be used when eager attention is used in the model (i.e. the attention is materialized). It will not return attentions in its output to save memory. diff --git a/kvpress/presses/expected_attention_press.py b/kvpress/presses/expected_attention_press.py new file mode 100644 index 00000000..c8069a7f --- /dev/null +++ b/kvpress/presses/expected_attention_press.py @@ -0,0 +1,22 @@ +from dataclasses import dataclass, field + +from kvpress import DefaultPress, ExpectedAttentionScorer + + +@dataclass +class ExpectedAttentionPress(DefaultPress): + scorer: ExpectedAttentionScorer = field(default_factory=ExpectedAttentionScorer) + compression_ratio: float = 0.0 + n_future_positions: int = (512,) + n_sink: int = (4,) + use_covariance: bool = (True,) + use_vnorm: bool = (True,) + + def __post_init__(self): + self.scorer = ExpectedAttentionScorer( + n_future_positions=self.n_future_positions, + n_sink=self.n_sink, + use_covariance=self.use_covariance, + use_vnorm=self.use_vnorm, + ) + super().__post_init__() diff --git a/kvpress/prunners/per_layer_compression_pruner.py b/kvpress/presses/per_layer_compression_press.py similarity index 63% rename from kvpress/prunners/per_layer_compression_pruner.py rename to kvpress/presses/per_layer_compression_press.py index 9e27dee1..48bcba47 100644 --- a/kvpress/prunners/per_layer_compression_pruner.py +++ b/kvpress/presses/per_layer_compression_press.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 - - +import inspect import logging from dataclasses import dataclass from typing import List @@ -9,16 +8,14 @@ import torch from torch import nn -from kvpress.prunners.base_pruner import BasePruner -from kvpress.prunners.default_pruner import DefaultPruner -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.base_press import BasePress logger = logging.getLogger(__name__) @dataclass -class PerLayerCompressionPruner(BasePruner): - scorer: BaseScorer +class PerLayerCompressionPress(BasePress): + press: BasePress compression_ratios: List[float] def __post_init__(self): @@ -26,11 +23,16 @@ def __post_init__(self): "Per layer compression wrapper is an experimental feature and only works with flash attention. " "Please make sure that the model uses flash attention." ) - self.pruner = DefaultPruner(scorer=self.scorer) + assert "compression_ratio" in inspect.signature( + self.press.__init__ + ), f"compression_ratio can't be set in the provided press: {self.press.__class__}" def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): - self.pruner.compression_ratio = self.compression_ratios[module.layer_idx] - return self.pruner.forward_hook(module, input, kwargs, output) + original_compression_ratio = self.press.compression_ratio # type:ignore[attr-defined] + self.press.compression_ratio = self.compression_ratios[module.layer_idx] # type:ignore[attr-defined] + output = self.press.forward_hook(module, input, kwargs, output) + self.press.compression_ratio = original_compression_ratio # type:ignore[attr-defined] + return output @property def compression_ratio(self): diff --git a/kvpress/presses/think_press.py b/kvpress/presses/think_press.py index 6d699aae..d8033873 100644 --- a/kvpress/presses/think_press.py +++ b/kvpress/presses/think_press.py @@ -10,11 +10,11 @@ from transformers.cache_utils import QuantizedCache from transformers.models.llama.modeling_llama import rotate_half -from kvpress.prunners.base_pruner import BasePruner +from kvpress.presses.base_press import BasePress @dataclass -class ThinKPress(BasePruner): +class ThinKPress(BasePress): """ ThinK (https://arxiv.org/pdf/2407.21018) compresses the dimensions of the keys, and not the sequence length. Hence it can be combined with any other press that compresses the sequence length, e.g. @@ -28,7 +28,7 @@ class ThinKPress(BasePruner): """ key_channel_compression_ratio: float = 0.0 - inner_press: Optional[BasePruner] = None + inner_press: Optional[BasePress] = None window_size: int = 32 def compute_window_queries(self, module, hidden_states): diff --git a/kvpress/prunners/__init__.py b/kvpress/prunners/__init__.py deleted file mode 100644 index 299764fc..00000000 --- a/kvpress/prunners/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 diff --git a/notebooks/expected_attention.ipynb b/notebooks/expected_attention.ipynb index 6208cc59..64cbf949 100644 --- a/notebooks/expected_attention.ipynb +++ b/notebooks/expected_attention.ipynb @@ -16,11 +16,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[33mWARNING: The directory '/mount/home/setup/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3.10 -m pip install --upgrade pip\u001b[0m\n" + "\u001B[33mWARNING: The directory '/mount/home/setup/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.\u001B[0m\u001B[33m\n", + "\u001B[0m\u001B[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001B[0m\u001B[33m\n", + "\u001B[0m\n", + "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m24.0\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m24.3.1\u001B[0m\n", + "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpython3.10 -m pip install --upgrade pip\u001B[0m\n" ] } ], @@ -222,7 +222,7 @@ " attn_weights = eager_self_attn(hidden_states, position_ids=position_ids, attention_mask=attention_mask, output_attentions=True)[1][0] \n", "\n", " # Compute scores on the first n_train tokens\n", - " scores = press.scorer.score(\n", + " scores = press.press.score(\n", " self_attn, hidden_states[:, :n_train], keys[:, :, :n_train], values[:, :, :n_train], None, None\n", " )[0]" ] @@ -268,8 +268,8 @@ "\n", "# Exclude sink tokens from calculation\n", "kv_head_idx = head_idx // self_attn.num_key_value_groups\n", - "observed_attention = attn_weights[head_idx, n_train:, press.scorer.n_sink : n_train].mean(0).float().cpu()\n", - "expected_attention = scores[kv_head_idx, press.scorer.n_sink :].float().cpu()\n", + "observed_attention = attn_weights[head_idx, n_train:, press.press.n_sink: n_train].mean(0).float().cpu()\n", + "expected_attention = scores[kv_head_idx, press.press.n_sink:].float().cpu()\n", "\n", "# Display correlation between expected and observed attention\n", "plt.scatter(expected_attention, observed_attention, s=1)\n", @@ -283,8 +283,8 @@ "# We can also measure if we pruned the right tokens by measuring the average attention loss on the test tokens\n", "# The optimal pruning curve shows that pruning alone is not enough to achieve high KV cache compression ratio\n", "scale = observed_attention.sum()\n", - "knorm = -keys[0, kv_head_idx, press.scorer.n_sink:n_train:].norm(dim=-1).float().cpu()\n", - "random = torch.randperm(n_train - press.scorer.n_sink)\n", + "knorm = -keys[0, kv_head_idx, press.press.n_sink:n_train:].norm(dim=-1).float().cpu()\n", + "random = torch.randperm(n_train - press.press.n_sink)\n", "for x, label in zip([random, knorm, expected_attention, observed_attention], [\"Random score\", \"Keys norm\", \"Expected Attention Pruning\", \"Optimal pruning\"]):\n", " indices = torch.sort(x).indices\n", " plt.plot(torch.cumsum(observed_attention[indices], dim=0) / scale, label=label)\n", @@ -320,7 +320,7 @@ } ], "source": [ - "vnorm = values[..., press.scorer.n_sink:n_train].norm(dim=-1).float().cpu()\n", + "vnorm = values[..., press.press.n_sink:n_train].norm(dim=-1).float().cpu()\n", "print(scores.max() / scores.min())\n", "print(vnorm.max() / vnorm.min())" ] diff --git a/notebooks/new_press.ipynb b/notebooks/new_press.ipynb index 5b59f43d..ca3bf9a6 100644 --- a/notebooks/new_press.ipynb +++ b/notebooks/new_press.ipynb @@ -28,9 +28,9 @@ "from torch import nn\n", "from transformers import pipeline\n", "\n", - "from kvpress.prunners.base_pruner import BasePruner\n", + "from kvpress.prunners.base_press import BasePress\n", "from kvpress.scorers.base_scorer import BaseScorer\n", - "from kvpress import KnormPress, DefaultPruner" + "from kvpress import KnormPress, DefaultPress" ] }, { @@ -212,8 +212,8 @@ " return scores\n", "\n", "\n", - "press = DefaultPruner(compression_ratio=compression_ratio,\n", - " scorer=MyKnormScorer())\n", + "press = DefaultPress(compression_ratio=compression_ratio,\n", + " scorer=MyKnormScorer())\n", "print(pipe(context, question=question, press=press)[\"answer\"])" ] }, @@ -267,7 +267,7 @@ "from dataclasses import dataclass\n", "\n", "@dataclass\n", - "class MyStreamingLLMPress(BasePruner):\n", + "class MyStreamingLLMPress(BasePress):\n", " n_first: int = 1\n", " n_last: int = 8\n", "\n", diff --git a/notebooks/per_layer_compression_demo.ipynb b/notebooks/per_layer_compression_demo.ipynb index 9637538b..eabbc771 100644 --- a/notebooks/per_layer_compression_demo.ipynb +++ b/notebooks/per_layer_compression_demo.ipynb @@ -34,7 +34,7 @@ " SnapKVPress,\n", " StreamingLLMPress,\n", " ExpectedAttentionScorer,\n", - " PerLayerCompressionPruner\n", + " PerLayerCompressionPress\n", ")" ] }, @@ -180,8 +180,8 @@ } ], "source": [ - "press_per_layer = PerLayerCompressionPruner(compression_ratios=PHI_35_COMPRESSION_RATIOS,\n", - " scorer=ExpectedAttentionScorer())" + "press_per_layer = PerLayerCompressionPress(compression_ratios=PHI_35_COMPRESSION_RATIOS,\n", + " press=ExpectedAttentionScorer())" ] }, { diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 8c8213ab..1ae0da49 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -6,8 +6,8 @@ from torch import nn from transformers import DynamicCache +from kvpress import ExpectedAttentionPress from kvpress.presses.default_presses import ( - ExpectedAttentionPress, KnormPress, ObservedAttentionPress, RandomPress, @@ -16,7 +16,7 @@ TOVAPress, ) from kvpress.presses.think_press import ThinKPress -from kvpress.prunners.default_pruner import DefaultPruner +from kvpress.prunners.default_press import DefaultPress from kvpress.scorers.base_scorer import BaseScorer from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 @@ -33,7 +33,7 @@ def test_presses_run(unit_test_model): # noqa: F811 for compression_ratio in [0.2, 0.4, 0.6, 0.8]: press = cls(compression_ratio=compression_ratio) if cls in [SnapKVPress]: - press.scorer.window_size = 2 + press.press.window_size = 2 with press(unit_test_model): input_ids = unit_test_model.dummy_inputs["input_ids"] unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values @@ -73,7 +73,7 @@ def test_presses_keep_highest_score(unit_test_model): # noqa: F811 Test that kept keys are those with the highest score """ for compresion_ratio in [0.0, 0.2, 0.4, 0.6, 0.8]: - press = DefaultPruner(compression_ratio=compresion_ratio, scorer=StoreKnormScorer()) + press = DefaultPress(compression_ratio=compresion_ratio, scorer=StoreKnormScorer()) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values diff --git a/tests/test_per_layer_compression_wrapper.py b/tests/test_per_layer_compression_wrapper.py index 70f31ac3..977bb2fc 100644 --- a/tests/test_per_layer_compression_wrapper.py +++ b/tests/test_per_layer_compression_wrapper.py @@ -5,13 +5,13 @@ import torch from transformers import DynamicCache -from kvpress.prunners.per_layer_compression_pruner import PerLayerCompressionPruner +from kvpress.prunners.per_layer_compression_press import PerLayerCompressionPress from kvpress.scorers.knorm_scorer import KnormScorer from tests.fixtures import kv_press_pipeline, unit_test_model # noqa: F401 def test_per_layer_compression_press(unit_test_model): # noqa: F811 - press = PerLayerCompressionPruner(compression_ratios=[0.1, 1], scorer=KnormScorer()) + press = PerLayerCompressionPress(compression_ratios=[0.1, 1], press=KnormScorer()) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values diff --git a/tests/test_pipeline.py b/tests/test_pipeline.py index 3338bda3..1d4c324b 100644 --- a/tests/test_pipeline.py +++ b/tests/test_pipeline.py @@ -8,8 +8,8 @@ import torch from transformers import AutoTokenizer, DynamicCache +from kvpress import ExpectedAttentionPress from kvpress.pipeline import KVPressTextGenerationPipeline -from kvpress.presses.default_presses import ExpectedAttentionPress from tests.fixtures import danube_500m_model, kv_press_pipeline, unit_test_model # noqa: F401 diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 0d664cd0..6fdee0b5 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -5,12 +5,12 @@ from transformers import DynamicCache from kvpress.presses.default_presses import KnormPress -from kvpress.prunners.default_pruner import DefaultPruner +from kvpress.prunners.default_press import DefaultPress from tests.fixtures import unit_test_model # noqa: F401 def test_context_manager_adds_and_removes_hook(unit_test_model): # noqa: F811 - press = DefaultPruner(scorer=KnormPress(compression_ratio=0.2)) + press = DefaultPress(scorer=KnormPress(compression_ratio=0.2)) with press(unit_test_model): for layer in unit_test_model.model.layers: From 5bff26ab785d7091e8bb93073148d5c0059c92c2 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 10:09:37 +0100 Subject: [PATCH 29/51] address pr feedback --- kvpress/presses/expected_attention_press.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kvpress/presses/expected_attention_press.py b/kvpress/presses/expected_attention_press.py index c8069a7f..1c273446 100644 --- a/kvpress/presses/expected_attention_press.py +++ b/kvpress/presses/expected_attention_press.py @@ -7,10 +7,10 @@ class ExpectedAttentionPress(DefaultPress): scorer: ExpectedAttentionScorer = field(default_factory=ExpectedAttentionScorer) compression_ratio: float = 0.0 - n_future_positions: int = (512,) - n_sink: int = (4,) - use_covariance: bool = (True,) - use_vnorm: bool = (True,) + n_future_positions: int = 512 + n_sink: int = 4 + use_covariance: bool = True + use_vnorm: bool = True def __post_init__(self): self.scorer = ExpectedAttentionScorer( From 2646ba459391c07beebc136e49d1826d4dacdfd0 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 10:21:32 +0100 Subject: [PATCH 30/51] address pr feedback --- evaluation/evaluate.py | 4 +- kvpress/__init__.py | 15 +++--- kvpress/presses/default_press.py | 2 +- kvpress/presses/default_presses.py | 53 ------------------- kvpress/presses/knorm_press.py | 13 +++++ ...n_press.py => observed_attention_press.py} | 25 +++++---- kvpress/presses/random_press.py | 13 +++++ kvpress/presses/snapkv_press.py | 18 +++++++ kvpress/presses/streaming_llm_press.py | 14 +++++ kvpress/presses/tova_press.py | 14 +++++ kvpress/scorers/observed_attention_scorer.py | 2 - .../presses/test_observed_attention_press.py | 2 +- tests/presses/test_presses.py | 4 +- tests/test_generate.py | 2 +- tests/test_press_call.py | 2 +- 15 files changed, 102 insertions(+), 81 deletions(-) delete mode 100644 kvpress/presses/default_presses.py create mode 100644 kvpress/presses/knorm_press.py rename kvpress/presses/{eager_attention_press.py => observed_attention_press.py} (57%) create mode 100644 kvpress/presses/random_press.py create mode 100644 kvpress/presses/snapkv_press.py create mode 100644 kvpress/presses/streaming_llm_press.py create mode 100644 kvpress/presses/tova_press.py diff --git a/evaluation/evaluate.py b/evaluation/evaluate.py index fc7a7bc7..21d1d528 100644 --- a/evaluation/evaluate.py +++ b/evaluation/evaluate.py @@ -120,10 +120,10 @@ def evaluate( # Load press assert press_name in PRESS_DICT press = PRESS_DICT[press_name] - press.key_channel_compression_ratio = compression_ratio + press.compression_ratio = compression_ratio # Initialize pipeline with the correct attention implementation - if isinstance(press.press, ObservedAttentionScorer): + if isinstance(press.scorer, ObservedAttentionScorer): model_kwargs = {"attn_implementation": "eager"} else: try: diff --git a/kvpress/__init__.py b/kvpress/__init__.py index 29f527a0..bb8ce988 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -4,18 +4,15 @@ from kvpress.pipeline import KVPressTextGenerationPipeline from kvpress.presses.default_press import DefaultPress -from kvpress.presses.default_presses import ( - KnormPress, - ObservedAttentionPress, - RandomPress, - SnapKVPress, - StreamingLLMPress, - TOVAPress, -) -from kvpress.presses.eager_attention_press import EagerAttentionPruner from kvpress.presses.expected_attention_press import ExpectedAttentionPress +from kvpress.presses.knorm_press import KnormPress +from kvpress.presses.observed_attention_press import ObservedAttentionPress from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress +from kvpress.presses.random_press import RandomPress +from kvpress.presses.snapkv_press import SnapKVPress +from kvpress.presses.streaming_llm_press import StreamingLLMPress from kvpress.presses.think_press import ThinKPress +from kvpress.presses.tova_press import TOVAPress from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer from kvpress.scorers.knorm_scorer import KnormScorer from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer diff --git a/kvpress/presses/default_press.py b/kvpress/presses/default_press.py index ef7a7b1a..dc592eb5 100644 --- a/kvpress/presses/default_press.py +++ b/kvpress/presses/default_press.py @@ -18,7 +18,7 @@ @dataclass class DefaultPress(BasePress): """ - Default pruning method. + Default press method. The `forward_hook` method is called after the forward pass of an attention layer. and updates the cache with the pruned KV pairs. """ diff --git a/kvpress/presses/default_presses.py b/kvpress/presses/default_presses.py deleted file mode 100644 index fc04ad18..00000000 --- a/kvpress/presses/default_presses.py +++ /dev/null @@ -1,53 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -""" -This file provides the default presses for the KVPress library that are composed of pruner+scorers. -Each press is a shortcut to a specific pruner and scorer combination. -Function names are uppercase for backwards compatibility. -""" -from kvpress.presses.default_press import DefaultPress -from kvpress.presses.eager_attention_press import EagerAttentionPruner -from kvpress.scorers.knorm_scorer import KnormScorer -from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer -from kvpress.scorers.random_scorer import RandomScorer -from kvpress.scorers.snapkv_scorer import SnapKVScorer -from kvpress.scorers.streaming_llm_scorer import StreamingLLMScorer -from kvpress.scorers.tova_scorer import TOVAScorer - - -def KnormPress( - compression_ratio: float = 0.0, -): - return DefaultPress(compression_ratio=compression_ratio, scorer=KnormScorer()) - - -def ObservedAttentionPress( - compression_ratio: float = 0.0, - output_attentions: bool = False, -): - if output_attentions: - return DefaultPress(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) - return EagerAttentionPruner(compression_ratio=compression_ratio, scorer=ObservedAttentionScorer()) - - -def RandomPress(compression_ratio: float = 0.0): - return DefaultPress(compression_ratio=compression_ratio, scorer=RandomScorer()) - - -def SnapKVPress( - compression_ratio: float = 0.0, - window_size: int = 64, - kernel_size: int = 5, -): - return DefaultPress( - compression_ratio=compression_ratio, scorer=SnapKVScorer(window_size=window_size, kernel_size=kernel_size) - ) - - -def StreamingLLMPress(compression_ratio: float = 0.0, n_sink: int = 4): - return DefaultPress(compression_ratio=compression_ratio, scorer=StreamingLLMScorer(n_sink=n_sink)) - - -def TOVAPress(compression_ratio: float = 0.0, window_size: int = 1): - return DefaultPress(compression_ratio=compression_ratio, scorer=TOVAScorer(window_size=window_size)) diff --git a/kvpress/presses/knorm_press.py b/kvpress/presses/knorm_press.py new file mode 100644 index 00000000..4901e20a --- /dev/null +++ b/kvpress/presses/knorm_press.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass, field + +from kvpress import DefaultPress, KnormScorer + + +@dataclass +class KnormPress(DefaultPress): + scorer: KnormScorer = field(default_factory=KnormScorer) + compression_ratio: float = 0.0 + + def __post_init__(self): + self.scorer = KnormScorer() + super().__post_init__() diff --git a/kvpress/presses/eager_attention_press.py b/kvpress/presses/observed_attention_press.py similarity index 57% rename from kvpress/presses/eager_attention_press.py rename to kvpress/presses/observed_attention_press.py index 06aa5a83..c9e40cd5 100644 --- a/kvpress/presses/eager_attention_press.py +++ b/kvpress/presses/observed_attention_press.py @@ -3,36 +3,43 @@ import logging -from dataclasses import dataclass +from dataclasses import dataclass, field import torch from torch import nn +from kvpress import ObservedAttentionScorer from kvpress.presses.default_press import DefaultPress logger = logging.getLogger(__name__) @dataclass -class EagerAttentionPruner(DefaultPress): +class ObservedAttentionPress(DefaultPress): """ This pruner can be used when eager attention is used in the model (i.e. the attention is materialized). It will not return attentions in its output to save memory. """ + scorer: ObservedAttentionScorer = field(default_factory=ObservedAttentionScorer) + compression_ratio: float = 0.0 + output_attentions: bool = False + def __post_init__(self): super().__post_init__() - logger.warning( - "Model will not return attentions in its output to save memory. Please use DefaultPruner if" - " attentions are needed in the output." - ) + if not self.output_attentions: + logger.warning( + "Model will not return attentions in its output to save memory. Please use DefaultPruner if" + " attentions are needed in the output." + ) def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): output = super().forward_hook(module, input, kwargs, output) # attentions are needed as input for the hook, but unless the user wants to return them in the output, # we can remove them to save memory - output = list(output) - output[-2] = None - output = tuple(output) + if not self.output_attentions: + output = list(output) + output[-2] = None + output = tuple(output) return output diff --git a/kvpress/presses/random_press.py b/kvpress/presses/random_press.py new file mode 100644 index 00000000..5baa7502 --- /dev/null +++ b/kvpress/presses/random_press.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass, field + +from kvpress import DefaultPress, RandomScorer + + +@dataclass +class RandomPress(DefaultPress): + scorer: RandomScorer = field(default_factory=RandomScorer) + compression_ratio: float = 0.0 + + def __post_init__(self): + self.scorer = RandomScorer() + super().__post_init__() diff --git a/kvpress/presses/snapkv_press.py b/kvpress/presses/snapkv_press.py new file mode 100644 index 00000000..2cbe09f4 --- /dev/null +++ b/kvpress/presses/snapkv_press.py @@ -0,0 +1,18 @@ +from dataclasses import dataclass, field + +from kvpress import DefaultPress, SnapKVScorer + + +@dataclass +class SnapKVPress(DefaultPress): + scorer: SnapKVScorer = field(default_factory=SnapKVScorer) + compression_ratio: float = 0.0 + window_size: int = 64 + kernel_size: int = 5 + + def __post_init__(self): + self.scorer = SnapKVScorer( + window_size=self.window_size, + kernel_size=self.kernel_size, + ) + super().__post_init__() diff --git a/kvpress/presses/streaming_llm_press.py b/kvpress/presses/streaming_llm_press.py new file mode 100644 index 00000000..2ca0e495 --- /dev/null +++ b/kvpress/presses/streaming_llm_press.py @@ -0,0 +1,14 @@ +from dataclasses import dataclass, field + +from kvpress import DefaultPress, StreamingLLMScorer + + +@dataclass +class StreamingLLMPress(DefaultPress): + scorer: StreamingLLMScorer = field(default_factory=StreamingLLMScorer) + compression_ratio: float = 0.0 + n_sink: int = 4 + + def __post_init__(self): + self.scorer = StreamingLLMScorer(n_sink=self.n_sink) + super().__post_init__() diff --git a/kvpress/presses/tova_press.py b/kvpress/presses/tova_press.py new file mode 100644 index 00000000..3b552bc4 --- /dev/null +++ b/kvpress/presses/tova_press.py @@ -0,0 +1,14 @@ +import dataclasses + +from kvpress import DefaultPress, TOVAScorer + + +@dataclasses.dataclass +class TOVAPress(DefaultPress): + scorer: TOVAScorer = dataclasses.field(default_factory=TOVAScorer) + compression_ratio: float = 0.0 + window_size: int = 1 + + def __post_init__(self): + self.scorer = TOVAScorer(window_size=self.window_size) + super().__post_init__() diff --git a/kvpress/scorers/observed_attention_scorer.py b/kvpress/scorers/observed_attention_scorer.py index 3178cf28..20638d80 100644 --- a/kvpress/scorers/observed_attention_scorer.py +++ b/kvpress/scorers/observed_attention_scorer.py @@ -20,8 +20,6 @@ class ObservedAttentionScorer(BaseScorer): This approach is related to H2O (https://arxiv.org/abs/2306.14048). """ - compression_ratio: float = 0.0 - def score( self, module: nn.Module, diff --git a/tests/presses/test_observed_attention_press.py b/tests/presses/test_observed_attention_press.py index 73cf5138..7310a97c 100644 --- a/tests/presses/test_observed_attention_press.py +++ b/tests/presses/test_observed_attention_press.py @@ -7,7 +7,7 @@ import torch from transformers import DynamicCache -from kvpress.presses.default_presses import ObservedAttentionPress +from kvpress import ObservedAttentionPress from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 1ae0da49..eb61838b 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -6,8 +6,8 @@ from torch import nn from transformers import DynamicCache -from kvpress import ExpectedAttentionPress -from kvpress.presses.default_presses import ( +from kvpress import ( + ExpectedAttentionPress, KnormPress, ObservedAttentionPress, RandomPress, diff --git a/tests/test_generate.py b/tests/test_generate.py index f13486b7..7bad5974 100644 --- a/tests/test_generate.py +++ b/tests/test_generate.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 -from kvpress.presses.default_presses import KnormPress +from kvpress import KnormPress from tests.fixtures import kv_press_pipeline # noqa: F401 diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 6fdee0b5..740d612d 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -4,7 +4,7 @@ from transformers import DynamicCache -from kvpress.presses.default_presses import KnormPress +from kvpress import KnormPress from kvpress.prunners.default_press import DefaultPress from tests.fixtures import unit_test_model # noqa: F401 From bbc03f8d1b84c3db675a8ed3153be20b4d20c815 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 10:46:57 +0100 Subject: [PATCH 31/51] address pr feedback --- README.md | 4 ++-- kvpress/__init__.py | 16 ++++++++-------- kvpress/pipeline.py | 2 +- kvpress/presses/expected_attention_press.py | 5 +++-- kvpress/presses/knorm_press.py | 5 +++-- kvpress/presses/observed_attention_press.py | 6 +++--- kvpress/presses/per_layer_compression_press.py | 4 ++-- kvpress/presses/random_press.py | 5 +++-- .../{default_press.py => scorer_press.py} | 6 +++--- kvpress/{ => presses}/scorers/__init__.py | 0 kvpress/{ => presses}/scorers/base_scorer.py | 0 .../scorers/expected_attention_scorer.py | 2 +- kvpress/{ => presses}/scorers/knorm_scorer.py | 2 +- .../scorers/observed_attention_scorer.py | 2 +- kvpress/{ => presses}/scorers/random_scorer.py | 2 +- kvpress/{ => presses}/scorers/snapkv_scorer.py | 2 +- .../scorers/streaming_llm_scorer.py | 2 +- kvpress/{ => presses}/scorers/tova_scorer.py | 2 +- kvpress/presses/snapkv_press.py | 5 +++-- kvpress/presses/streaming_llm_press.py | 5 +++-- kvpress/presses/tova_press.py | 5 +++-- notebooks/new_press.ipynb | 6 +++--- tests/test_per_layer_compression_wrapper.py | 6 +++--- tests/test_press_call.py | 5 +++-- 24 files changed, 53 insertions(+), 46 deletions(-) rename kvpress/presses/{default_press.py => scorer_press.py} (96%) rename kvpress/{ => presses}/scorers/__init__.py (100%) rename kvpress/{ => presses}/scorers/base_scorer.py (100%) rename kvpress/{ => presses}/scorers/expected_attention_scorer.py (98%) rename kvpress/{ => presses}/scorers/knorm_scorer.py (90%) rename kvpress/{ => presses}/scorers/observed_attention_scorer.py (95%) rename kvpress/{ => presses}/scorers/random_scorer.py (90%) rename kvpress/{ => presses}/scorers/snapkv_scorer.py (98%) rename kvpress/{ => presses}/scorers/streaming_llm_scorer.py (95%) rename kvpress/{ => presses}/scorers/tova_scorer.py (96%) diff --git a/README.md b/README.md index 93fdd4ca..a4d44bde 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,9 @@ Most presses are composed of two main components, the scorer class that identifi As an example, it is possible to initialize `ExpectedAttentionPress` as follows: ```python -from kvpress import DefaultPress, ExpectedAttentionScorer +from kvpress import ScorerPress, ExpectedAttentionScorer -press = DefaultPress(compression_ratio=0.1, scorer=ExpectedAttentionScorer()) +press = ScorerPress(compression_ratio=0.1, scorer=ExpectedAttentionScorer()) ``` This allows for easy customization of the press behavior. diff --git a/kvpress/__init__.py b/kvpress/__init__.py index bb8ce988..e9130f4d 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -3,20 +3,20 @@ from kvpress.pipeline import KVPressTextGenerationPipeline -from kvpress.presses.default_press import DefaultPress from kvpress.presses.expected_attention_press import ExpectedAttentionPress from kvpress.presses.knorm_press import KnormPress from kvpress.presses.observed_attention_press import ObservedAttentionPress from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress from kvpress.presses.random_press import RandomPress +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.expected_attention_scorer import ExpectedAttentionScorer +from kvpress.presses.scorers.knorm_scorer import KnormScorer +from kvpress.presses.scorers.observed_attention_scorer import ObservedAttentionScorer +from kvpress.presses.scorers.random_scorer import RandomScorer +from kvpress.presses.scorers.snapkv_scorer import SnapKVScorer +from kvpress.presses.scorers.streaming_llm_scorer import StreamingLLMScorer +from kvpress.presses.scorers.tova_scorer import TOVAScorer from kvpress.presses.snapkv_press import SnapKVPress from kvpress.presses.streaming_llm_press import StreamingLLMPress from kvpress.presses.think_press import ThinKPress from kvpress.presses.tova_press import TOVAPress -from kvpress.scorers.expected_attention_scorer import ExpectedAttentionScorer -from kvpress.scorers.knorm_scorer import KnormScorer -from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer -from kvpress.scorers.random_scorer import RandomScorer -from kvpress.scorers.snapkv_scorer import SnapKVScorer -from kvpress.scorers.streaming_llm_scorer import StreamingLLMScorer -from kvpress.scorers.tova_scorer import TOVAScorer diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index 14703ab7..8f2da8b2 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -12,7 +12,7 @@ from transformers.pipelines.base import GenericTensor from kvpress.presses.base_press import BasePress -from kvpress.scorers.observed_attention_scorer import ObservedAttentionScorer +from kvpress.presses.scorers.observed_attention_scorer import ObservedAttentionScorer logger = logging.getLogger(__name__) diff --git a/kvpress/presses/expected_attention_press.py b/kvpress/presses/expected_attention_press.py index 1c273446..4cfc687b 100644 --- a/kvpress/presses/expected_attention_press.py +++ b/kvpress/presses/expected_attention_press.py @@ -1,10 +1,11 @@ from dataclasses import dataclass, field -from kvpress import DefaultPress, ExpectedAttentionScorer +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.expected_attention_scorer import ExpectedAttentionScorer @dataclass -class ExpectedAttentionPress(DefaultPress): +class ExpectedAttentionPress(ScorerPress): scorer: ExpectedAttentionScorer = field(default_factory=ExpectedAttentionScorer) compression_ratio: float = 0.0 n_future_positions: int = 512 diff --git a/kvpress/presses/knorm_press.py b/kvpress/presses/knorm_press.py index 4901e20a..92a91eff 100644 --- a/kvpress/presses/knorm_press.py +++ b/kvpress/presses/knorm_press.py @@ -1,10 +1,11 @@ from dataclasses import dataclass, field -from kvpress import DefaultPress, KnormScorer +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.knorm_scorer import KnormScorer @dataclass -class KnormPress(DefaultPress): +class KnormPress(ScorerPress): scorer: KnormScorer = field(default_factory=KnormScorer) compression_ratio: float = 0.0 diff --git a/kvpress/presses/observed_attention_press.py b/kvpress/presses/observed_attention_press.py index c9e40cd5..0c88e850 100644 --- a/kvpress/presses/observed_attention_press.py +++ b/kvpress/presses/observed_attention_press.py @@ -8,14 +8,14 @@ import torch from torch import nn -from kvpress import ObservedAttentionScorer -from kvpress.presses.default_press import DefaultPress +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.observed_attention_scorer import ObservedAttentionScorer logger = logging.getLogger(__name__) @dataclass -class ObservedAttentionPress(DefaultPress): +class ObservedAttentionPress(ScorerPress): """ This pruner can be used when eager attention is used in the model (i.e. the attention is materialized). It will not return attentions in its output to save memory. diff --git a/kvpress/presses/per_layer_compression_press.py b/kvpress/presses/per_layer_compression_press.py index 48bcba47..7ec66dbe 100644 --- a/kvpress/presses/per_layer_compression_press.py +++ b/kvpress/presses/per_layer_compression_press.py @@ -24,8 +24,8 @@ def __post_init__(self): "Please make sure that the model uses flash attention." ) assert "compression_ratio" in inspect.signature( - self.press.__init__ - ), f"compression_ratio can't be set in the provided press: {self.press.__class__}" + self.press.__init__ # type:ignore[misc] + ).parameters, f"compression_ratio can't be set in the provided press: {self.press.__class__}" def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): original_compression_ratio = self.press.compression_ratio # type:ignore[attr-defined] diff --git a/kvpress/presses/random_press.py b/kvpress/presses/random_press.py index 5baa7502..52756575 100644 --- a/kvpress/presses/random_press.py +++ b/kvpress/presses/random_press.py @@ -1,10 +1,11 @@ from dataclasses import dataclass, field -from kvpress import DefaultPress, RandomScorer +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.random_scorer import RandomScorer @dataclass -class RandomPress(DefaultPress): +class RandomPress(ScorerPress): scorer: RandomScorer = field(default_factory=RandomScorer) compression_ratio: float = 0.0 diff --git a/kvpress/presses/default_press.py b/kvpress/presses/scorer_press.py similarity index 96% rename from kvpress/presses/default_press.py rename to kvpress/presses/scorer_press.py index dc592eb5..363e04a8 100644 --- a/kvpress/presses/default_press.py +++ b/kvpress/presses/scorer_press.py @@ -10,15 +10,15 @@ from transformers import QuantizedCache from kvpress.presses.base_press import BasePress -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.scorers.base_scorer import BaseScorer logger = logging.getLogger(__name__) @dataclass -class DefaultPress(BasePress): +class ScorerPress(BasePress): """ - Default press method. + Default press method for using a scorer. The `forward_hook` method is called after the forward pass of an attention layer. and updates the cache with the pruned KV pairs. """ diff --git a/kvpress/scorers/__init__.py b/kvpress/presses/scorers/__init__.py similarity index 100% rename from kvpress/scorers/__init__.py rename to kvpress/presses/scorers/__init__.py diff --git a/kvpress/scorers/base_scorer.py b/kvpress/presses/scorers/base_scorer.py similarity index 100% rename from kvpress/scorers/base_scorer.py rename to kvpress/presses/scorers/base_scorer.py diff --git a/kvpress/scorers/expected_attention_scorer.py b/kvpress/presses/scorers/expected_attention_scorer.py similarity index 98% rename from kvpress/scorers/expected_attention_scorer.py rename to kvpress/presses/scorers/expected_attention_scorer.py index 8b4e1b23..3a07b722 100644 --- a/kvpress/scorers/expected_attention_scorer.py +++ b/kvpress/presses/scorers/expected_attention_scorer.py @@ -11,7 +11,7 @@ from torch import nn from transformers.models.llama.modeling_llama import repeat_kv -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.scorers.base_scorer import BaseScorer @dataclass diff --git a/kvpress/scorers/knorm_scorer.py b/kvpress/presses/scorers/knorm_scorer.py similarity index 90% rename from kvpress/scorers/knorm_scorer.py rename to kvpress/presses/scorers/knorm_scorer.py index 979cdc81..b5b2f0f3 100644 --- a/kvpress/scorers/knorm_scorer.py +++ b/kvpress/presses/scorers/knorm_scorer.py @@ -5,7 +5,7 @@ import torch from torch import nn -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.scorers.base_scorer import BaseScorer class KnormScorer(BaseScorer): diff --git a/kvpress/scorers/observed_attention_scorer.py b/kvpress/presses/scorers/observed_attention_scorer.py similarity index 95% rename from kvpress/scorers/observed_attention_scorer.py rename to kvpress/presses/scorers/observed_attention_scorer.py index 20638d80..ef3f9a3a 100644 --- a/kvpress/scorers/observed_attention_scorer.py +++ b/kvpress/presses/scorers/observed_attention_scorer.py @@ -8,7 +8,7 @@ from torch import nn from transformers.utils import logging -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.scorers.base_scorer import BaseScorer logger = logging.get_logger(__name__) diff --git a/kvpress/scorers/random_scorer.py b/kvpress/presses/scorers/random_scorer.py similarity index 90% rename from kvpress/scorers/random_scorer.py rename to kvpress/presses/scorers/random_scorer.py index 9ae1334f..8f0ad818 100644 --- a/kvpress/scorers/random_scorer.py +++ b/kvpress/presses/scorers/random_scorer.py @@ -5,7 +5,7 @@ import torch from torch import nn -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.scorers.base_scorer import BaseScorer class RandomScorer(BaseScorer): diff --git a/kvpress/scorers/snapkv_scorer.py b/kvpress/presses/scorers/snapkv_scorer.py similarity index 98% rename from kvpress/scorers/snapkv_scorer.py rename to kvpress/presses/scorers/snapkv_scorer.py index d51063b5..4bec14c6 100644 --- a/kvpress/scorers/snapkv_scorer.py +++ b/kvpress/presses/scorers/snapkv_scorer.py @@ -10,7 +10,7 @@ from torch import nn from transformers.models.llama.modeling_llama import repeat_kv, rotate_half -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.scorers.base_scorer import BaseScorer @dataclass diff --git a/kvpress/scorers/streaming_llm_scorer.py b/kvpress/presses/scorers/streaming_llm_scorer.py similarity index 95% rename from kvpress/scorers/streaming_llm_scorer.py rename to kvpress/presses/scorers/streaming_llm_scorer.py index d67d529b..b70836d2 100644 --- a/kvpress/scorers/streaming_llm_scorer.py +++ b/kvpress/presses/scorers/streaming_llm_scorer.py @@ -7,7 +7,7 @@ import torch from torch import nn -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.scorers.base_scorer import BaseScorer @dataclass diff --git a/kvpress/scorers/tova_scorer.py b/kvpress/presses/scorers/tova_scorer.py similarity index 96% rename from kvpress/scorers/tova_scorer.py rename to kvpress/presses/scorers/tova_scorer.py index 366b3539..57a8024d 100644 --- a/kvpress/scorers/tova_scorer.py +++ b/kvpress/presses/scorers/tova_scorer.py @@ -7,7 +7,7 @@ import torch.nn.functional as F from torch import nn -from kvpress.scorers.snapkv_scorer import SnapKVScorer +from kvpress.presses.scorers.snapkv_scorer import SnapKVScorer @dataclass diff --git a/kvpress/presses/snapkv_press.py b/kvpress/presses/snapkv_press.py index 2cbe09f4..567605c7 100644 --- a/kvpress/presses/snapkv_press.py +++ b/kvpress/presses/snapkv_press.py @@ -1,10 +1,11 @@ from dataclasses import dataclass, field -from kvpress import DefaultPress, SnapKVScorer +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.snapkv_scorer import SnapKVScorer @dataclass -class SnapKVPress(DefaultPress): +class SnapKVPress(ScorerPress): scorer: SnapKVScorer = field(default_factory=SnapKVScorer) compression_ratio: float = 0.0 window_size: int = 64 diff --git a/kvpress/presses/streaming_llm_press.py b/kvpress/presses/streaming_llm_press.py index 2ca0e495..930f9ae1 100644 --- a/kvpress/presses/streaming_llm_press.py +++ b/kvpress/presses/streaming_llm_press.py @@ -1,10 +1,11 @@ from dataclasses import dataclass, field -from kvpress import DefaultPress, StreamingLLMScorer +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.streaming_llm_scorer import StreamingLLMScorer @dataclass -class StreamingLLMPress(DefaultPress): +class StreamingLLMPress(ScorerPress): scorer: StreamingLLMScorer = field(default_factory=StreamingLLMScorer) compression_ratio: float = 0.0 n_sink: int = 4 diff --git a/kvpress/presses/tova_press.py b/kvpress/presses/tova_press.py index 3b552bc4..166d4a4a 100644 --- a/kvpress/presses/tova_press.py +++ b/kvpress/presses/tova_press.py @@ -1,10 +1,11 @@ import dataclasses -from kvpress import DefaultPress, TOVAScorer +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.tova_scorer import TOVAScorer @dataclasses.dataclass -class TOVAPress(DefaultPress): +class TOVAPress(ScorerPress): scorer: TOVAScorer = dataclasses.field(default_factory=TOVAScorer) compression_ratio: float = 0.0 window_size: int = 1 diff --git a/notebooks/new_press.ipynb b/notebooks/new_press.ipynb index ca3bf9a6..b30d0e6e 100644 --- a/notebooks/new_press.ipynb +++ b/notebooks/new_press.ipynb @@ -30,7 +30,7 @@ "\n", "from kvpress.prunners.base_press import BasePress\n", "from kvpress.scorers.base_scorer import BaseScorer\n", - "from kvpress import KnormPress, DefaultPress" + "from kvpress import KnormPress, ScorerPress" ] }, { @@ -212,8 +212,8 @@ " return scores\n", "\n", "\n", - "press = DefaultPress(compression_ratio=compression_ratio,\n", - " scorer=MyKnormScorer())\n", + "press = ScorerPress(compression_ratio=compression_ratio,\n", + " scorer=MyKnormScorer())\n", "print(pipe(context, question=question, press=press)[\"answer\"])" ] }, diff --git a/tests/test_per_layer_compression_wrapper.py b/tests/test_per_layer_compression_wrapper.py index 977bb2fc..b0bf4155 100644 --- a/tests/test_per_layer_compression_wrapper.py +++ b/tests/test_per_layer_compression_wrapper.py @@ -5,13 +5,13 @@ import torch from transformers import DynamicCache -from kvpress.prunners.per_layer_compression_press import PerLayerCompressionPress -from kvpress.scorers.knorm_scorer import KnormScorer +from kvpress.presses.knorm_press import KnormPress +from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress from tests.fixtures import kv_press_pipeline, unit_test_model # noqa: F401 def test_per_layer_compression_press(unit_test_model): # noqa: F811 - press = PerLayerCompressionPress(compression_ratios=[0.1, 1], press=KnormScorer()) + press = PerLayerCompressionPress(compression_ratios=[0.1, 1], press=KnormPress()) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 740d612d..5315acd4 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -5,12 +5,13 @@ from transformers import DynamicCache from kvpress import KnormPress -from kvpress.prunners.default_press import DefaultPress +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.knorm_scorer import KnormScorer from tests.fixtures import unit_test_model # noqa: F401 def test_context_manager_adds_and_removes_hook(unit_test_model): # noqa: F811 - press = DefaultPress(scorer=KnormPress(compression_ratio=0.2)) + press = ScorerPress(scorer=KnormScorer(), compression_ratio=0.2) with press(unit_test_model): for layer in unit_test_model.model.layers: From 158d5c60b91d07185dd323fe7e85a4a0b2566e28 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 10:50:17 +0100 Subject: [PATCH 32/51] fix style --- kvpress/presses/per_layer_compression_press.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/kvpress/presses/per_layer_compression_press.py b/kvpress/presses/per_layer_compression_press.py index 7ec66dbe..7950ed63 100644 --- a/kvpress/presses/per_layer_compression_press.py +++ b/kvpress/presses/per_layer_compression_press.py @@ -23,9 +23,12 @@ def __post_init__(self): "Per layer compression wrapper is an experimental feature and only works with flash attention. " "Please make sure that the model uses flash attention." ) - assert "compression_ratio" in inspect.signature( - self.press.__init__ # type:ignore[misc] - ).parameters, f"compression_ratio can't be set in the provided press: {self.press.__class__}" + assert ( + "compression_ratio" + in inspect.signature( + self.press.__init__ # type:ignore[misc] + ).parameters + ), f"compression_ratio can't be set in the provided press: {self.press.__class__}" def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): original_compression_ratio = self.press.compression_ratio # type:ignore[attr-defined] From afc87a31f87f3b5a0340e7f45c00812ae91f28a6 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 10:55:21 +0100 Subject: [PATCH 33/51] fix tests --- tests/assets/qa_dataset.csv | 1875 --------------------------------- tests/presses/test_presses.py | 6 +- 2 files changed, 3 insertions(+), 1878 deletions(-) delete mode 100644 tests/assets/qa_dataset.csv diff --git a/tests/assets/qa_dataset.csv b/tests/assets/qa_dataset.csv deleted file mode 100644 index 0702747b..00000000 --- a/tests/assets/qa_dataset.csv +++ /dev/null @@ -1,1875 +0,0 @@ -question,answer -"You will be given a definition of a task first, then some input of the task. -This task is about using the specified sentence and converting the sentence to Resource Description Framework (RDF) triplets of the form (subject, predicate object). The RDF triplets generated must be such that the triplets accurately capture the structure and semantics of the input sentence. The input is a sentence and the output is a list of triplets of the form [subject, predicate, object] that capture the relationships present in the sentence. When a sentence has more than 1 RDF triplet possible, the output must contain all of them. - -AFC Ajax (amateurs)'s ground is Sportpark De Toekomst where Ajax Youth Academy also play. -Output:","[ - [""AFC Ajax (amateurs)"", ""has ground"", ""Sportpark De Toekomst""], - [""Ajax Youth Academy"", ""plays at"", ""Sportpark De Toekomst""] -]" -Generate an approximately fifteen-word sentence that describes all this data: Midsummer House eatType restaurant; Midsummer House food Chinese; Midsummer House priceRange moderate; Midsummer House customer rating 3 out of 5; Midsummer House near All Bar One,"Midsummer House is a moderately priced Chinese restaurant with a 3/5 customer rating, located near All Bar One." -"What happens next in this paragraph? - -She then rubs a needle on a cotton ball then pushing it onto a pencil and wrapping thread around it. She then holds up a box of a product and then pouring several liquids into a bowl. she -Choose your answer from: A. adds saucepan and shakes up the product in a grinder. B. pinches the thread to style a cigarette, and then walks away. C. then dips the needle in ink and using the pencil to draw a design on her leg, rubbing it off with a rag in the end. D. begins to style her hair and cuts it several times before parting the ends of it to show the hairstyle she has created.","C. She then dips the needle in ink and using the pencil to draw a design on her leg, rubbing it off with a rag in the end. In this option, she is continuing the process of using the needle, pencil, and thread, which is most related to what she was doing in the previous sentence." -"Please answer the following question: I want to test the ability of students to read a passage and answer questions about it. Could you please come up with a good question for the passage ""In 1901, the Federation of Australia was the process by which the six separate British self-governing colonies of New South Wales, Queensland, South Australia, Tasmania, Victoria and Western Australia formed one nation. They kept the systems of government that they had developed as separate colonies but also would have a federal government that was responsible for matters concerning the whole nation. When the Constitution of Australia came into force, the colonies collectively became states of the Commonwealth of Australia.""? -Answer:","Based on the passage, discuss the primary motivations and outcomes of the 1901 Federation of Australia, including the roles and responsibilities of the federal government, as well as the continued governmental structures of the individual states involved." -"James runs a TV show and there are 5 main characters and 4 minor characters. He pays the minor characters $15,000 each episode. He paid the major characters three times as much. How much does he pay per episode? Let's be accurate as possible.","James pays the minor characters $15,000 each episode. Since there are 4 minor characters, he pays them a total of 4 * $15,000 = $60,000 per episode. - -The major characters are paid three times as much. So, each major character gets paid 3 * $15,000 = $45,000 per episode. - -There are 5 main characters, so he pays them a total of 5 * $45,000 = $225,000 per episode. - -In total, James pays $225,000 (major characters) + $60,000 (minor characters) = $285,000 per episode." -"Given the stream of consciousness rationale, provide a reasonable question and answer. Rationale: Here the game refers to a volleyball where female beach volleyball player serving the ball. - The question and answer:","Question: What is the proper technique for a female beach volleyball player to serve the ball effectively in a game? - -Answer: To serve the ball effectively in beach volleyball, a female player should utilize a consistent pre-serve routine, stand in a balanced position with feet shoulder-width apart, toss the ball at an appropriate height while extending their non-hitting arm, and use a combination of shoulder, arm, and wrist movement to achieve a powerful and accurate serve. Different serve styles, such as underhand, topspin, and float, can be used depending on the player's strengths and the desired outcome." -"Multi-choice question: What is the sentiment of the following tweet? -Tweet: @nikkigreen I told you -Choose your answer from: - + negative; - + positive;","To determine the sentiment of the tweet, we need to analyze it thoroughly. - -Tweet: @nikkigreen I told you - -Step 1: Identify the words or phrases that carry emotional weight. -In this tweet, there is only one phrase worth examining: ""I told you."" - -Step 2: Determine the sentiment of the identified words or phrases. -""I told you"" can carry a variety of sentiments, depending on the context. It could be positive, negative, or neutral. - -Step 3: Consider the overall context of the tweet. -Unfortunately, without more context, it is impossible to determine the exact sentiment of the tweet. - -As a result, we cannot confidently choose an answer from the provided options, positive or negative, without more contextual information." -"John was a terrible writer. To practice, his teacher suggest that he consider people he knows and do what? -Options: -- write novels -- advertising firm -- write letter -- write notes -- write poems -Let's think now! Step-by-step reasoning:","Step 1: Analyze the situation - John is a terrible writer and needs practice to improve his skills. His teacher gives him advice on how to practice. - -Step 2: Consider the options given: -- Write novels: This might be a bit overwhelming for someone who is just starting to improve their writing skills, as novels are long and require a lot of commitment. -- Advertising firm: This option doesn't seem to directly connect to practicing writing, as it refers to a type of business rather than a writing activity. -- Write letters: Writing letters could be a good way to practice writing, especially since John can think about people he knows while doing so. This makes the writing more personal and engaging. -- Write notes: Writing notes can help improve writing skills to some extent, but might not allow for the kind of continuous practice that John needs. -- Write poems: This is another creative option to practice writing, but it might not be the best choice if John struggles with the basics of writing and is not yet comfortable with more advanced forms such as poetry. - -Step 3: Choose the most suitable option based on the analysis: -Given the options, writing letters seems to be the best advice for John to follow when considering people he knows. This would allow him to practice writing in a personal, engaging way while focusing on communicating with others, which could help him improve his skills." -"What is a one-sentence summary of the following article? -One of the first complaints presented to doctors by many people later diagnosed with Parkinson’s Disease is an involuntary tremor or shaking of the hands, fingers, arms, legs, jaw, and face. You’re most likely to notice this tremor when your hands are at rest rather than when you’re using them, although you may see more tremors while your hands and arms are in use as the disease progresses. There are many causes of tremors. Parkinson's Disease is one of the most common causes, and tremors are often the first sign of the disease. The tremor and other symptoms may initially appear only on one side of the body, or they may appear worse on one side than the other. A repetitive “pill-rolling"" movement between the thumb and finger—named because it looks as though the person is rolling a pill between their fingers—is characteristic of a Parkinsonian tremor. Some symptoms of Parkinson's are caused by the larger symptom of slowed movements (also known as bradykinesia). This primarily affects motor functions from walking and balance to writing and even motor functions that are often considered reflexive or spontaneous. These slowed movements are a very common early sign of Parkinson’s, and may show up at the onset of the disease in 80% of patients. Some people might have a hard time describing what they are feeling and use words like “weakness,” “tiredness,” or “incoordination” when talking about these symptoms. Look for distortions in voluntary movements. In addition to involuntary movements, those with Parkinson’s may experience disturbances in their voluntary movements beyond just slowness. Some of the treatments used for Parkinson's disease may cause abnormal involuntary movements, or an increase in movement, referred to as dyskinesia. These distortions (dyskinesias) can be similar to a “tic” in appearance and worsen with psychological stress. Advanced dyskinesia is most often seen in patients who have been on the medication Levodopa for some time. A common symptom of Parkinson’s is a shuffling gait with short steps and a tendency to lean forward. People with Parkinson's often have difficulty with their balance, and there is sometimes a tendency to fall forward, causing the person to walk faster and faster to keep from falling over. This pattern is called a ""festinating gait,"" and it is very common in Parkinson's disease. This symptom typically shows up in the later stages of the disease. Those with Parkinson’s Disease often lean forward at the waist when standing or walking. This is because Parkinson's can cause posture and balance problems, including rigidity. There is a tendency to flex the arms and the head so that the person appears bent over with the elbows flexed and the head down. Rigidity can affect the whole body, and might you feel stiff or sore. Check for postural rigidity. Also referred to as “cog-wheeling,” this symptom presents as a hallmark, rigid motion when an examiner moves the arm of a patient through basic flexion and extension motions. The rigidity and resistance to movement is most obvious with passive movement of the wrists and elbow. Cog-wheeling may happen when the increased muscle tone related to rigidity is combined with a tremor. Some cognitive impairment is common, but usually not until late in the course of the disease. Around 90% of those with PD will show signs of speech disturbances at some point. These can present as quieter speech, breathy or hoarse qualities to the voice, and reduced precision with language. The voice often becomes soft or whispery because the vocal muscles lack mobility. Up to 60% of those with PD may show signs or anxiety or depression. PD affects some of the mood-stabilizing portions of the brain, which leads to this increased chance for depression, especially paired with the quality of life for patients in late stages of the disease. The muscles used to push food through the digestive system are also affected by PD. This can lead to a variety of gastrointestinal issues from incontinence to constipation. These same symptoms often present along with difficulty swallowing food as well. Many of the involuntary movements associated with Parkinson’s make it increasingly difficult for those with the disease to get a full night of sleep. Other symptoms—such as muscle rigidity making it difficult to roll over at night or bladder issues leading to getting up at night to urinate frequently—compound the sleep disruptions experienced by those with PD. - -Summary:","Involuntary tremors, slowed movements, and posture and balance issues are common early symptoms of Parkinson's Disease, often accompanied by disturbances in voluntary movements, speech, mood, and gastrointestinal issues as the disease progresses." -"Premise: A man is inline skating in front of a wooden bench. - -Hypothesis: A man is having fun skating in front of a bench. - -.Choose the correct answer: Given the premise, can we conclude the hypothesis? - -Select from: a). yes b). it is not possible to tell c). no","b). it is not possible to tell - -Justification: Although the man is inline skating in front of the wooden bench, we cannot conclude whether he is having fun or not, as his emotions are not explicitly mentioned." -"Q: Answer the following question given this paragraph: The kidneys also secrete hormones that help maintain homeostasis. For example, they produce a hormone that stimulates bone marrow to produce red blood cells when more are needed. They also secrete a hormone that regulates blood pressure and keeps it in a normal range. Q: What organs secrete hormones that help maintain homeostasis? A: -The answer is:","The kidneys are the organs that secrete hormones to help maintain homeostasis. They produce a hormone that stimulates bone marrow to produce red blood cells when needed, and they also secrete a hormone that regulates blood pressure, keeping it within a normal range." -"Write a question about the following article: Coming off their home win over the Buccaneers, the Packers flew to Ford Field for a Week 12 Thanksgiving duel with their NFC North foe, the Detroit Lions. After a scoreless first quarter, Green Bay delivered the game's opening punch in the second quarter with quarterback Aaron Rodgers finding wide receiver Greg Jennings on a 3-yard touchdown pass. The Packers added to their lead in the third quarter with a 1-yard touchdown run from fullback John Kuhn, followed by Rodgers connecting with wide receiver James Jones on a 65-yard touchdown pass and a 35-yard field goal from kicker Mason Crosby. The Lions answered in the fourth quarter with a 16-yard touchdown run by running back Keiland Williams and a two-point conversion pass from quarterback Matthew Stafford to wide receiver Titus Young), yet Green Bay pulled away with Crosby nailing a 32-yard field goal. Detroit closed out the game with Stafford completing a 3-yard touchdown pass to wide receiver Calvin Johnson. With the win, the Packers acquired their first 11-0 start in franchise history, beating the 1962 team which started 10-0 and finished 14-1 including postseason play. Rodgers (22/32 for 307 yards, 2 TDs) was named NFL on FOX's 2011 Galloping Gobbler Award Winner. - -Question about the article:","What happened during the Thanksgiving football game between the Packers and the Lions, and what record did the Packers achieve with their win?" -"Given the question: I am trying to decide whether it's worth it to invest in this film proposal. Can you help me answer a few questions? If you can't, please say ""No I can't"". Question: What is Tool's relation to Ross. Movie title: The Expendables Movie plot: The movie is a Vietnam exploitation film where a commando makes an elite team out of rebels. The men are trouble makers and rebels, but are able to perform well. The men are sent out to blow up a bridge and manage to destroy the North Vietnamese Army (NVA) guards. However, another NVA force arrives and an all out battle commences. During the battle, two of the men are killed, but the team kills off all of the NVA reinforcements and captures their leader. The team is next sent on another mission to capture two village women, and then another to destroy an enemy base where another member is killed. They kill all of the NVA forces in the base, but their mission gets tougher when a prisoner escapes and captures American women and holds them hostage. The NVA splits up into two forces: one at an old fort and the other to ambush the team as it arrives. Despite the NVA plan of ambush, the NVA are wiped out, but they manage to kill two of the women and one of the special squad. Realizing that there is little time, the squad goes on with their mission and finds the fort. Their squad leader goes inside the fort to recon and is captured. The squad decides to go in and rescue him, the POW girls, and kill the NVA leader. -The answer is:","Tool is a character in The Expendables movie and is played by actor Mickey Rourke. Tool is a former member of the elite team of mercenaries known as the Expendables. He is now the team's tattoo artist and provides moral support. Tool is a friend and confidant of the team leader, Barney Ross, played by Sylvester Stallone. The two share a bond as they have both experienced the adrenaline, pain, and emotional toll of their dangerous line of work. In summary, Tool's relation to Ross is that he is a former teammate, friend, and confidant." -"This is some data: Amatriciana sauce, region, Lazio; Amatriciana sauce, country, Italy; Amatriciana sauce, ingredient, Tomato; Amatriciana sauce, course, Italian meal structure; Amatriciana sauce, mainIngredient, ""Tomatoes, guanciale, cheese, olive oil"". - -Generate a detailed description of this data","Step 1: Understand the data structure -First, I will analyze the provided data and understand that it is a series of key-value pairs associated with Amatriciana sauce, a type of food. - -Step 2: Organize the data into categories -To create a detailed description, I will organize the data into categories such as region, country, ingredients, course, and main ingredients. This will allow me to present the information in a more structured and concise manner. - -Step 3: Describe the region and country -I will describe where Amatriciana sauce originates from, highlighting its tie to the Lazio region in Italy. This will provide geographical context for the dish. - -Step 4: Discuss ingredients and main ingredients -Next, I will give a general overview of some of the ingredients found in Amatriciana sauce, focusing on key components like tomatoes, guanciale (cured pork cheek), cheese, and olive oil. These main ingredients will help paint a more vivid picture of the sauce's flavor profile and texture. - -Step 5: Explain the course within the Italian meal structure -Lastly, I will integrate the information regarding the sauce's role within the Italian meal structure. Given that it doesn't specify a particular course, I will explain its versatility and potential use in multiple courses. - -Final description: -Amatriciana sauce is a flavorful and delectable Italian dish that originates from the Lazio region in Italy. This region's unique culinary style significantly influences the overall taste of Amatriciana sauce. As the data suggests, its key ingredients include tomatoes, guanciale (cured pork cheek), cheese, and olive oil, which all together, create a rich and savory sauce. It is a versatile dish within the Italian meal structure and can be featured in various courses, adding depth and complexity to any traditional Italian meal." -"Read this and answer the question - -According to Archibald Sayce, the primitive pictograms of the early Sumerian (i.e. Uruk) era suggest that ""Stone was scarce, but was already cut into blocks and seals. Brick was the ordinary building material, and with it cities, forts, temples and houses were constructed. The city was provided with towers and stood on an artificial platform; the house also had a tower-like appearance. It was provided with a door which turned on a hinge, and could be opened with a sort of key; the city gate was on a larger scale, and seems to have been double. The foundation stones — or rather bricks — of a house were consecrated by certain objects that were deposited under them."" - -What were the foundation stones of Sumerian houses consecrated by?",The foundation stones of Sumerian houses were consecrated by certain objects that were placed or deposited beneath them. It's like hiding a special toy under a big lego tower you've built. -Imagine a question and stream-of-consciousness explanation for which this is the answer: Sentence B,"Question: In the given two sentences, which one implements a passive voice structure? - -Stream-of-consciousness explanation: Well, let's think about these two sentences for a moment. Sentence A has the subject of the sentence actively performing the action of the verb, making it an example of active voice. Now, let's consider Sentence B. Here, the subject is being acted upon by the verb, which is the characteristic of passive voice. Therefore, when we compare Sentence A and Sentence B, it becomes clear that the passive voice is used in... - -Answer: Sentence B" -"Review: This is a plain old spooky ghost story. I showed it to some friends of mine in my movie club, and they were kept spellbound until the ending! No blood or gore- just good old fashioned suspense. It starts out right from the beginning, and builds and builds. The ending is a real twist that caught me unawares. - -Well directed and well acted. It is also a ""period piece""- set in the 1920s- which added to the atmosphere. - -I was so impressed I got the book by Susan Hill from Amazon. The movie follows the book rather closely. - -It's a shame it's not readily available on DVD. My copy is VHS. This along with ""Haunted"" are probably two of the best Ghost Stories I've ever scene. Which just goes to show that a little creativity outdoes ""in your face"" gore any day! -Now, what is this review like? -pick from the following. - A). negative; - B). positive; -","This review can be characterized as B). positive. The reviewer provides several compliments and praises the movie for various aspects, such as the suspense, the direction, the acting, and the period setting. They even mention how impressed they were with the story that they ordered the book by Susan Hill. The highlighted strengths of the film, such as creativity and the lack of blood and gore, contribute to the overall positive sentiment of the review. The only downside mentioned by the reviewer is the unavailability of the movie on DVD, but this does not detract from their overall positive experience." -"Question. Context: Heliocentrism is the astronomical model in which the Earth and planets revolve around the Sun at the center of the Solar System. Historically, Heliocentrism was opposed to geocentrism, which placed the Earth at the center. The notion that the Earth revolves around the Sun had been proposed as early as the 3rd century BCE by Aristarchus of Samos, but at least in the medieval world, Aristarchus's Heliocentrism attracted little attention -- possibly because of the loss of scientific works of the Hellenistic Era. - -Question: who said sun is the center of the solar system? -Answer. Aristarchus of Samos -What step-by-step reasoning justifies that answer?","Step 1: Identify the context and timeframe of the question. -The context of the question revolves around the concept of heliocentrism, which is the proposal that the Sun is the center of the solar system. The timeframe mentioned is as early as the 3rd century BCE, which is when the concept was initially proposed. - -Step 2: Understand the opposing views in the context. -Heliocentrism is opposed to geocentrism, which placed Earth at the center of the solar system. This historical context is important to understand the significance of heliocentrism and the person who proposed it. - -Step 3: Identify key figures related to the heliocentric model. -The question asks for the individual who initially proposed the Sun as the center of the solar system. Aristarchus of Samos is mentioned as the person who proposed this model as early as the 3rd century BCE. - -Step 4: Verify the credibility of the claim. -The text mentions that Aristarchus's heliocentrism attracted little attention at the time possibly due to the loss of scientific works of the Hellenistic Era, implying that his proposal was indeed an early instance of heliocentrism. - -Step 5: Combine the findings to form the answer. -Based on the historical context, the opposing views, and the identification of Aristarchus of Samos as the individual who proposed the Sun as the center of the solar system, the answer to the question ""who said the Sun is the center of the solar system?"" is Aristarchus of Samos." -"Question: What is the answer for the question: What school district is Briarcliff High School part of? from the following article ? The village is home to the Briarcliff Manor Union Free School District, which covers 6.58 square miles (17.0 km2) of land and most of the village of Briarcliff Manor and an unincorporated portion of the town of Mount Pleasant. Parts of Briarcliff Manor not covered by the school district include Scarborough and Chilmark; these areas are part of the Ossining Union Free School District. The district serves over 1,000 students and includes Todd Elementary School, Briarcliff Middle School, and Briarcliff High School. From Briarcliff Manor's settlement until 1918, students in grades 1–8 were taught within one school facility; from 1919 until the 1940s, students in grades 1–12 were as well. The district is noted for its annual high-school musicals. The elementary school (opened in 1953) is named after George A. Todd, Jr., who was the village's first teacher, first superintendent of schools, and taught for over 40 years. The middle school became a Blue Ribbon School in 2005.Briarcliff Manor has been home to a number of schools. Long Hill School was a public school in Scarborough until 1912, with about 70 students, two classrooms, and two teachers. Dr. Holbrook's Military School was on Holbrook Road from 1866 to 1915. Miss Tewksbury's School and later Mrs. Marshall's Day & Boarding School for Little Girls was at Dysart House. Miss Knox's School ran from 1905 in Pocantico Lodge, a hotel on Pleasantville Road under Briarcliff Lodge management. When it burned down in 1912, the school moved to Tarrytown and then to Cooperstown. Since 1954, the Knox School has been located at St. James, New York. The Scarborough School was first Montessori school in the United States; it was located at the Beechwood estate from 1913 until it closed in 1978. Since then, The Clear View School has run a day treatment program for 83 students from nursery school age to 21 there. The Macfadden School ran from 1939 to 1950 at the William Kingsland mansion in the village. -Answer:",Briarcliff High School is part of the Briarcliff Manor Union Free School District. -"Given the question: Read the following paragraph and extract the answer for the question: What is the last name of the person whose biography was Michael Kennedy? Boult was born in Chester, Cheshire, in North West England, the second child and only son of Cedric Randal Boult (1853–1950), and his wife Katharine Florence née Barman (d. 1927). Cedric Boult was a Justice of the Peace and a successful businessman connected with Liverpool shipping and the oil trade; Cedric and his family had ""a Liberal Unitarian outlook on public affairs"" with a history of philanthropy. When Boult was two years old the family moved to Blundellsands, where he was given a musical upbringing. From an early age he attended concerts in Liverpool, conducted mostly by Hans Richter. He was educated at Westminster School in London, where in his free time he attended concerts conducted by, among others, Sir Henry Wood, Claude Debussy, Arthur Nikisch, Fritz Steinbach, and Richard Strauss. His biographer, Michael Kennedy, writes, ""Few schoolboys can have attended as many performances by great artists as Boult heard between 1901 and October 1908, when he went up to Christ Church, Oxford."" While still a schoolboy, Boult met the composer Edward Elgar through Frank Schuster, a family friend.At Christ Church college at Oxford, where he was an undergraduate from 1908 to 1912, Boult studied history but later switched to music, in which his mentor was the musical academic and conductor Hugh Allen. Among the musical friends he made at Oxford was Ralph Vaughan Williams, who became a lifelong friend. In 1909 Boult presented a paper to an Oxford musical group, the Oriana Society, entitled Some Notes on Performance, in which he laid down three precepts for an ideal performance: observance of the composer's wishes, clarity through emphasis on balance and structure, and the effect of music made without apparent effort. These guiding principles lasted throughout his career. He was president of the University Musical Club for the year 1910, but his interests were not wholly confined to music: he was a keen rower, stroking his college boat at Henley, and all his life he remained a member of the Leander Club. -The answer is:",Kennedy -"Summarize this article in one sentence. - -The incident happened on Fife Street between 04:30 BST and 05:00 BST on Saturday. -The police have appealed for witnesses to the crash. -York Road is closed between its junctions with Skegoneill Avenue and Alexandra Park Avenue. Diversions are in place. - -Summary:","A crash occurred on Fife Street early Saturday morning, prompting police to appeal for witnesses and close York Road, causing diversions." -"If ""An older couple with joke glasses and cigars."" does that mean that ""A couple looking silly.""? -Options: -- yes -- it is not possible to tell -- no Let's be accurate as possible and think first.","Yes, ""An older couple with joke glasses and cigars"" would generally imply ""A couple looking silly,"" as joke glasses and cigars are items typically used to create a humorous or lighthearted appearance." -Can you generate a question with a factual answer?,"Step 1: Choose a topic. I'll select geography as the topic for this question, as it is a subject rich with factual information. - -Step 2: Decide on a specific geographical aspect to focus on. I'll concentrate on capital cities, which are concrete data points within the field of geography. - -Step 3: Pick a country for the question. I'll choose Australia for its unique geography and its status as both a continent and a country. - -Step 4: Formulate the question, ensuring that it seeks a factual answer. My question will ask about the capital city of Australia. - -Step 5: Verify that a factual answer to the question exists. In this case, I'll confirm that Australia does have a capital city. - -The question I generated is: ""What is the capital city of Australia?"" - -The factual answer to this question is: ""Canberra.""" -"Please answer the following question: Article: Hello! My name is Becky Sharp. I'm 11 years old. I have one brother. His name is Jason and he's 14. I don't have any sisters. We live with our mum, dad and grandma in a small house in Chesterfield, in the north of England. There are lots of things to do here. My friends and I sometimes go to the cinema on Saturdays. Do you like sports? I like football. My favourite team is Manchester United. I sometimes play football with my brother. I am good at it but my brother isn't. I have lots of pets---one tortoise and six goldfish . I want a dog or a cat, but my mother doesn't like them. Question: Does Becky play football well? _ Yes or no, is the answer ""Yes, she does.""? -Answer:","Step 1: Read the article to gather information about Becky's football skills. - -Step 2: Identify relevant information about Becky playing football; in the article, it says, ""I sometimes play football with my brother. I am good at it but my brother isn't."" - -Step 3: Determine if the provided information indicates whether Becky plays football well or not. Based on the quote, ""I am good at it,"" we can conclude that she does play football well. - -Step 4: Answer the question and provide justification. Yes, she does play football well." -"Luckily I was not the target or victim of this road rage, but I was a first hand witness. Back in the mid 1990s when I worked in Southern California, I was returning from lunch one day with a coworker when we noticed two pickup trucks driving erratically. This was on Valley View Blvd in Cerritos which is a large roadway divided (by a large, planted median strip) with 3 lanes on either side. One truck seemed to be chasing the other when suddenly the lead truck made a quick U-turn and was followed by the second truck. But the second truck came to stop just after making the turn. This was when the driver of that truck got out, walked to the front of his vehicle, raised his arm holding a semi-automatic handgun, paused, and then fired a single shot. At this point, I was parallel with the shooter’s truck and only about 50–60 feet from where he was standing. I remember my coworker exclaiming, “Oh sh*t! Did he just shoot at the something?!” I floored my accelerator and sped off to my workplace which was about a 1/2 mile down Valley View Blvd. I parked and my coworker and I got into the building as quickly as we could. While he started telling our other coworkers about what we had just witnessed, I ran to my desk, called 911, and reported the shooting. The dispatcher kept me on the line after my initial report and then transferred me to a detective in order to take down my information. As it turns out, my information and the fact that I called 911 immediately resulted in the arrest of the shooter. I was later asked to testify in court which resulted in the shooters conviction. I lived in Southern California for 10 years and now I drive a commercial truck several days a week so I have PLENTY of other “road rage stories”, but this is still the craziest one. According to the above context, choose the correct option to answer the following question. Question: How long did it take the driver to get to his workplace? Options: - one minute - not enough information - one year - one day -",- not enough information -"Given the task definition and input, reply with output. In this task, you're given the middle and ending of a three-part story. Your job is to complete the short story by writing a probable beginning of the story. Generated sentences must be short, have fewer than 10 words, and be simple as if narrating to a child. Avoid using any irrelevant extra information when creating the beginning, and use names (e.g. Jack, Barbara,...) instead of pronouns (e.g. he / she) wherever possible. - -Middle: Brad loved Halloween so it was right up his alley. Ending: Brad was so happy he almost danced with glee! -",Beginning: Brad found an invitation to a Halloween party. -"Please answer the following question by reasoning step-by-step. Premise: ""Man red jacket wears an apron and stands against the backdrop of a colorfully painted wall."" -Based on this premise, can we conclude that the hypothesis ""A man sits at a booth in a busy resturant."" is true? -Options: -- yes -- it is not possible to tell -- no. Step-by-step reasoning:","- no. Step-by-step reasoning: - -1. The premise describes a man wearing a red jacket and an apron, standing against a colorfully painted wall. -2. There is no indication in the premise that the man is in a restaurant or sitting at a booth. -3. The premise does not provide information about a busy environment or the presence of a booth. -4. Since the premise does not contain any information supporting the hypothesis, we cannot conclude that ""A man sits at a booth in a busy restaurant."" is true. -5. Therefore, the answer is ""no.""" -"Here is some data: Ariane 5, finalFlight, 2009-12-18; Ariane 5, launchSite, Guiana Space Centre; Ariane 5, manufacturer, ""ESA and Arianespace"". - -Write a sentence that describes this data. -Sentence:","The Ariane 5, a rocket manufactured jointly by the European Space Agency (ESA) and Arianespace, embarked on its final flight on December 18th, 2009, launching from its established site at the Guiana Space Centre in French Guiana." -"Detailed Instructions: In this task you will be given an arithmetic operation and you have to find its answer. The symbols of operators '+' and '-' has been swapped i.e you need to perform subtraction when you see a '+' symbol and addition in case of '-' symbol. -Q: 7716 + 6322 + 6665 - 1281 + 1377 + 3345 + 8318 -A:","To solve this expression with the swapped operators, we will perform subtraction when we see a '+' symbol and addition in case of a '-' symbol. - -Q: 7716 + 6322 + 6665 - 1281 + 1377 + 3345 + 8318 - -Applying the swapped operators: - -7716 - 6322 - 6665 + 1281 - 1377 - 3345 - 8318 - -Now performing the arithmetic operations: - -(7716 - 6322) = 1394 -(1394 - 6665) = -5271 -(-5271 + 1281) = -3990 -(-3990 - 1377) = -5367 -(-5367 - 3345) = -8712 -(-8712 - 8318) = -17030 - -A: -17030" -"News article: - -Amy Winehouse has finally released a new single: A cover of Lesley Gore's 1963 hit ""It's My Party"" for the Quincy Jones tribute album Q: Soul Bossa Nostra. Our expectations for Amy's upcoming album of ""jukebox stuff"" have been raised. ||||| When it was announced that the first bit of music the world would hear from Amy Winehouse after all that tabloid trouble would be a cover of Lesley Gore's ""It's My Party” for a Quincy Jones tribute album, Vulture found it just a touch uninspiring. But now the cover is actually here, and it's tough not to get carried away. Winehouse lets it fly on the Mark Ronson–produced do-over — turning in a dialed-in, muscular vocal performance that moves effortlessly from louche to anguished — and sounds not even a tiny bit horribly addicted to drugs while doing so. No word on an official Back to Black follow-up or anything, of course, but there is one other potentially positive sign: Winehouse has gone from tweeting stuff like “ronson you're dead to me; one album i write an you take half the credit — make a career out of it? don't think so BRUV” to things like “can't find me bleedin notebooks — theyve done a runsies xxxxxxxx LOVE YOU RONSON XXXXXXxxxxxxxxx.” ||||| Image Credit: Samir Hussein/Getty ImagesIf there’s something we know our beloved little wayward beehive enjoys, it’s a good party. And apparently, this one ends in tears. - - The 27-year-old Grammy winner returned to the studio recently for the star-strewn Quincy Jones release Q: Soul Bossa Nostra, due November 9, with her Back to Black producer (and recent subject of a Wino tweet-spanking) Mark Ronson. - - You can hear their recording of Lesley Gore’s 1963 teenage cri de coeur “It’s My Party” - - over at NYmag.com (via Soundcloud). The RonHouse pairing proves as Spector-esquely fruitful as ever—though frankly, whether the reasons are stylistic or substance-related, Amy’s penchant for slurring her vocals yields something closer to “Ish My Parrry.” - - What do you think? Tell us in the comments section below. - - (Follow The Music Mix on Twitter: @EWMusicMix.) - - More on Amy Winehouse: - - Amy Winehouse to Mark Ronson: ‘You’re dead to me’ - - Amy Winehouse to sing ‘It’s My Party’ for Quincy Jones ||||| - - In April we reported that Amy Winehouse and Mark Ronson were working together again, on three tracks for a Quincy Jones tribute album. Well, this is apparently a leaked version of one of their tracks, a cover of It's My Party (Jones's first big hit when he produced the Lesley Gore original in 1963). - - It's not – how can we say this? – the most coherent vocal ever laid to tape, although if there's ever a song where you can let it all go a bit runny-mascara-and-10-Bacardi-Breezers then this is it. Having said that, if you really wanted to hear the original sung in this style you could just stagger into any random hen night at 3am, right? ||||| -What is a shorter version of the above article?","Amy Winehouse, a famous singer, has released a new song called ""It's My Party."" This song is her version of an older song from 1963 by Lesley Gore. She worked with another music person, Mark Ronson, to make this. People are excited to hear more new music from Amy Winehouse after she had some trouble in her life." -"Write an article based on this summary: - -– After a thief walked out of a New York gallery with a Salvador Dali drawing only to later return it by mail, observers were scratching their heads—but now they have an explanation, via prosecutors. Authorities arrested Greek fashion publicist Phivos Lampros Istavrioglou, 29, in the case; he has pleaded not guilty, the Wall Street Journal reports. The back story: At the gallery, Istavrioglou realized the $150,000 drawing was unprotected and removed it, taking it with him back to Athens, prosecutors say. Once he arrived, prosecutors say he had second thoughts. ""When he realized the hunt was on, the defendant blinked"" and sent it back, rolling it up ""in a manner befitting a college dorm-room poster."" Among the evidence detectives are said to have uncovered in the case: Istavriglou's fingerprint on the mailing tube, relevant Web searches made from his Google account before the story broke, and a photo of the drawing in the gallery that he posted to his Facebook page. Istavrioglou was caught after an undercover cop posed as a New York art gallery manager and offered him a job, returning him to the Big Apple. He's due back in court today, the New York Times notes.","Title: An Unlikely Heist: The Tale of Salvador Dali Art Theft and its Intriguing Resolution - -After a thief casually strolled into a New York gallery, walked out with a Salvador Dali drawing, and then promptly returned the stolen art via mail, numerous observers were left puzzled. However, an explanation has emerged through the justice system. Authorities recently arrested Greek fashion publicist Phivos Lampros Istavrioglou, 29, in connection with the theft. Istavrioglou pleaded not guilty. - -The backstory of this unusual crime starts at the New York gallery, where Istavrioglou noticed that a $150,000 Salvador Dali drawing was not properly protected. He seized the opportunity and took the drawing. He transported the artwork from New York City, to Athens, Greece, where he resides. However, upon arriving in Athens, Istavrioglou experienced a change of heart. In fear of being caught, prosecutors say Istavrioglou decided to return the precious art piece. - -""When he realized the hunt was on, the defendant blinked,"" the prosecutor stated. In a hasty move to avoid any ramifications, Istavrioglou rolled up the Salvador Dali drawing and sent it back to the gallery. His method of rolling can be best described as ""a manner befitting a college dorm-room poster,"" reflecting a naive approach rather than a heist expert's precision. - -Detectives have managed to uncover several pieces of evidence that point to Istavrioglou's involvement in the peculiar crime. Among these pieces of evidence is his fingerprint found on the mailing tube used to return the drawing. Additional information implicating Istavrioglou includes relevant web searches made on his Google account in the period leading up to the story breaking. Furthermore, a picture of the drawing, as it hung in the gallery, was featured on Istavrioglou's Facebook profile. - -The Greek fashion publicist was apprehended in New York City, following communication with an undercover cop who posed as an art gallery manager. The undercover officer lured Istavrioglou back to the Big Apple by offering him a lucrative job opportunity. Once in New York, officers closed in and arrested him without incident. Istavrioglou appeared in court soon after and pleaded not guilty. - -Now that the Salvador Dali drawing has been safely returned, the consequences faced by Istavrioglou remain uncertain. As a high-profile suspect in an art theft turned intriguing global case, the enigmatic nature of the criminal act and its intriguing resolution will leave many captivated and puzzled in the world of art galleries and beyond. This unusual case serves as a testament to the unpredictability of human nature, coupled with the ability for even the unlikeliest of individuals to become involved in an art heist." -Remove the spaces from the following sentence: It prevents users to suspect that there are some hidden products installed on theirs device.,Itpreventsuserstosuspectthattherearesomehiddenproductsinstalledontheirsdevice. -"I want to test the ability of students to read a passage and answer questions about it. Could you please come up with a good question for the passage ""On the night of December 25, 1991, at 7:32 p.m. Moscow time, after Gorbachev left the Kremlin, the Soviet flag was lowered for the last time, and the Russian tricolor was raised in its place, symbolically marking the end of the Soviet Union. The next day, December 26, 1991, the Council of Republics, the upper chamber of the Union's Supreme Soviet, issued a formal Declaration recognizing that the Soviet Union had ceased to exist as a state and subject of international law, and voted both itself and the Soviet Union out of existence (the other chamber of the Supreme Soviet, the Council of the Union, had been unable to work since December 12, 1991, when the recall of the Russian deputies left it without a quorum). The following day Yeltsin moved into Gorbachev's former office, though the Russian authorities had taken over the suite two days earlier. By December 31, 1991, the few remaining Soviet institutions that had not been taken over by Russia ceased operation, and individual republics assumed the central government's role.""? -The answer to this question is:","One potential question for this passage could be: - -Question: Detail the key events and timeline that led to the dissolution of the Soviet Union and the establishment of the Russian Federation in December 1991. - -Answer: The dissolution of the Soviet Union and the establishment of the Russian Federation occurred through a series of significant events in December 1991. On the night of December 25, Mikhail Gorbachev left the Kremlin, and the Soviet flag was lowered for the last time at 7:32 p.m. Moscow time, with the Russian tricolor raised in its place. This symbolically marked the end of the Soviet Union. The following day, December 26, the Council of Republics, the upper chamber of the Union's Supreme Soviet, issued a Declaration recognizing that the Soviet Union had ceased to exist as a state and subject of international law. This vote effectively disbanded both itself and the Soviet Union. The Council of the Union, another chamber of the Supreme Soviet, had already been unable to work since December 12, due to the recall of the Russian deputies, which left it without a quorum. On December 27, Boris Yeltsin moved into Gorbachev's former office, although the Russian authorities had taken control of the suite two days prior. By December 31, the remaining Soviet institutions that had not been absorbed by Russia ceased operations, and the individual republics assumed the roles of the previous central government." -"Choose the next sentence.Ann Romney slammed the door Monday on another attempt at the White House for her husband Mitt, the 2012 Republican presidential nominee. Attempting to put a pin in rumors that her husband is secretly plotting another campaign for higher office once and and for all, Romney told a reporter for the Los Angeles Times that she and Mitt were 'done' running for president 'completely.' 'Not only Mitt and I are done, but the kids are done,' she said, referring to the couple's five sons. 'Done. Done. Done,' she added, making her feelings on the matter crystal clear. Ann Romney, wife of 2012 Republican presidential nominee Mitt Romney, attempted on Monday to put a pin in rumors that her husband is secretly plotting another campaign for higher office once and and for all - - - -OPTIONS: -- Ann Romney supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Ann Romney Center for Neurological Diseases supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Brigham supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Brigham and Women’s Hospital supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Los Angeles Times supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Mitt supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Mitt Romney supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Republican supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Romenys supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- Romney supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. -- White House supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections. - -","Step 1: Identify the main subject of the paragraph. In this case, it is Ann Romney and her statement about her husband, Mitt Romney, not running for president again. - -Step 2: Look for an option that best continues the narrative and is relevant to the subject. In this case, options that mention Ann Romney, Mitt Romney, or their supporters seem most relevant. - -Step 3: Eliminate options that introduce unrelated or incorrect information. In this case, options that mention unrelated organizations or places, such as the Ann Romney Center for Neurological Diseases, Brigham, Brigham and Women’s Hospital, and Los Angeles Times, should be eliminated. - -Step 4: Among the remaining options, choose the one that seems most coherent and appropriate for the context. - -Considering the above steps, the next sentence should be: - -- Mitt Romney supporters have continued to hold out hope that the retired Republican politician will change his mind, however, and are aggressively encouraging him to run when he makes appearances on the campaign trail for the GOP candidates competing in November's elections." -"Bosna Hersek (BH) Başbakanı Adnan Terziç, Avrupa haritasında kara bir delik kalması halinde, AB ile bütünleşme sürecinin küresel anlamda tarihi bir örnek teşkil edemeyeceğini söyledi. - -Translate to English - -English:","Bosnia and Herzegovina (BH) Prime Minister Adnan Terzic said that if there is a black hole in the European map, the integration process with the European Union (EU) cannot be a historic example in a global sense." -"Please answer the following question: - They are buried under layers of soil - Pressure builds over time - The remains liquefy - The carbon atoms rearrange to become a new substance. What might be the first step of the process? -A:","A: The first step of the process is ""They are buried under layers of soil."" This occurs when the remains of plants, animals, or other organic material become covered by soil and other sediments. Over time, as more and more layers accumulate, the pressure and heat increase, eventually leading to the transformation of the remains into substances like coal, oil, or natural gas." -"I know that the answer to the question ""Who serves those who can perform good actions, producing merit?"" is in ""Theravadin Buddhists believe that personal effort is required to realize rebirth. Monks follow the vinaya: meditating, teaching and serving their lay communities. Laypersons can perform good actions, producing merit."". Can you tell me what it is? -","The answer to the question ""Who serves those who can perform good actions, producing merit?"" is 'Monks.' They follow the vinaya, meditating, teaching, and serving their lay communities in Theravadin Buddhism." -"Teacher:This task involves annotating the answer type to a given question that involve some kind of complex reasoning (including numerical reasoning). Note that the questions require looking at more than one part of the passage to answer. There are 3 possible answer types (i) spans, (ii) numbers and (iii) dates. If the answer can be found in the passage, label it as ""span"". If the answer is a number, label as ""number"". Similarly, label ""date"" if you think the answer to the given question is a date. -Teacher: Now, understand the problem? Solve this instance: Passage: Hoping to snap a four-game losing streak, the Bills flew to Arrowhead Stadium for a Week 12 duel with the Kansas City Chiefs. In the first quarter, Buffalo trailed early as Chiefs QB Tyler Thigpen completed a 36-yard TD pass to RB Jamaal Charles. The Bills responded with RB Marshawn Lynch getting a 1-yard TD run. In the second quarter, Buffalo took the lead as kicker Rian Lindell made a 21-yard field goal. Kansas City answered with Thigpen completing a 2-yard TD pass to TE Tony Gonzalez. Buffalo regained the lead as Lindell got a 39-yard field goal, while rookie CB Leodis McKelvin returned an interception 64 yards for a touchdown. The Chiefs struck back with kicker Connor Barth getting a 45-yard field goal, yet the Bills continued their offensive explosion as Lindell got a 34-yard field goal, along with QB Trent Edwards getting a 15-yard TD run. In the third quarter, Buffalo continued its poundings with Edwards getting a 5-yard TD run, while Lindell got himself a 38-yard field goal. Kansas City tried to rally as Thigpen completed a 45-yard TD pass to WR Mark Bradley, yet the Bills replied with Edwards completing an 8-yard TD pass to WR Josh Reed. In the fourth quarter, Buffalo pulled away as Edwards completed a 17-yard TD pass to TE Derek Schouman. The Chiefs tried to come back as QB Quinn Gray completed a 3-yard TD pass to WR Dwayne Bowe, yet the Bills' lead was too much for Kansas City to overcome. This marked the first time the Bills scored 50+ points on an opponent since Sept. 1991 against the Pittsburgh Steelers (52-34). -Question: How many yards long was the shortest touchdown in the first 2 quarters? -Student:","To answer this question, I will check the passage for the touchdowns scored in the first 2 quarters and find the shortest one by comparing the yards mentioned. - -1. First quarter: - - 36-yard TD pass to RB Jamaal Charles - - 1-yard TD run by RB Marshawn Lynch - -2. Second quarter: - - 2-yard TD pass to TE Tony Gonzalez - - 64-yard interception return for a touchdown by CB Leodis McKelvin - -The shortest touchdown in the first 2 quarters was the 1-yard TD run by RB Marshawn Lynch. - -Answer type: number" -"@Jenni_starr i wish i could do the same! - -Describe the sentiment embodied by this tweet. -Options: -- negative -- positive -I think the answer is","positive. - -This tweet represents a positive sentiment because the user, whose username is Jenni_starr, appears to have shared a personal accomplishment, thought, or experience that the person replying to the tweet wishes they could replicate or achieve as well. The exclamation mark at the end of the sentence also gives the statement an enthusiastic and lighthearted tone. The use of the word ""wish"" suggests a sense of admiration or desire to match whatever accomplishment, thought, or experience Jenni_starr has shared. - -By expressing the sentiment ""I wish I could do the same!"" the responder is acknowledging the admiration they have for Jenni_starr and implies that whatever was shared is a positive aspect in their standpoint. This admiration and acknowledgement help to create an empowering and supportive environment between the individuals involved in the tweet exchange. - -Moreover, this type of engagement on social media platforms such as Twitter is reflective of the positive relationships that can be built and nurtured online. People often share their achievements, ideas, and experiences to motivate and inspire others or to provide encouragement and support to their social circles. - -In conclusion, based on the statement ""I wish I could do the same!"", the sentiment embodied by this tweet can be described as positive. The responder expresses admiration for Jenni_starr's accomplishment, thought, or experience and conveys their desire to achieve something similar. This interaction demonstrates how social media platforms can foster supportive relationships and create a positive impact on individuals' emotions and personal experiences." -"How does the sentence end? - -By Hannah Roberts Updated: 21:51 GMT, 1 March 2012 Conservative publisher and author Andrew Breitbart, the former editor of Drudge report has died, aged 43. Breitbart who published the infamous tweets that brought down former Representative Anthony Weiner, died 'unexpectedly from natural causes' this morning in Los Angeles. His death was confirmed by Breitbart.com editor-in-chief Joel Pollak, who says he was at the hospital, and by the Los Angeles County coroner's office. Sudden: Conservative publisher and author Andrew Breitbart, the former editor of Drudge report has died, aged 43 Breitbart was walking near his house in the Brentwood neighborhood shortly after midnight Thursday when he collapsed, his father-in-law Orson Bean said. - -Loving father: - -OPTIONS: -- Andrew Breitbart had suffered heart problems a year earlier -- Anthony Weiner had suffered heart problems a year earlier -- Breitbart had suffered heart problems a year earlier -- Breitbart.com had suffered heart problems a year earlier -- Brentwood had suffered heart problems a year earlier -- Hannah Roberts had suffered heart problems a year earlier -- Joel Pollak had suffered heart problems a year earlier -- Los Angeles had suffered heart problems a year earlier -- Los Angeles County had suffered heart problems a year earlier -- Orson Bean had suffered heart problems a year earlier -- UCLA had suffered heart problems a year earlier -- Wienergate had suffered heart problems a year earlier - -","Loving father: - -- Breitbart had suffered heart problems a year earlier" -"What is the best order to watch the Star Wars series? -What were orders 1 through 65 in Star Wars? -Do those questions have the same meaning?","The best order to watch the Star Wars series depends on the preferences of the viewer, but there are a few popular viewing orders that work well in different situations. I will list three of them below: - -1. Release Order: -This is the order in which the films were released in theaters, starting with the Original Trilogy followed by the Prequel Trilogy and then the Sequel Trilogy. This order captures the experience of watching the films as they were introduced to the world. - -- Episode IV: A New Hope (1977) -- Episode V: The Empire Strikes Back (1980) -- Episode VI: Return of the Jedi (1983) -- Episode I: The Phantom Menace (1999) -- Episode II: Attack of the Clones (2002) -- Episode III: Revenge of the Sith (2005) -- Episode VII: The Force Awakens (2015) -- Episode VIII: The Last Jedi (2017) -- Episode IX: The Rise of Skywalker (2019) - -Additionally, you may insert the standalone movies ""Rogue One: A Star Wars Story"" (2016) after Episode III and ""Solo: A Star Wars Story"" (2018) after Episode VIII. - -2. Chronological Order: -Although not the order in which the films were released, this option follows the timeline of the Star Wars universe. - -- Episode I: The Phantom Menace (1999) -- Episode II: Attack of the Clones (2002) -- Episode III: Revenge of the Sith (2005) -- Episode IV: A New Hope (1977) -- Episode V: The Empire Strikes Back (1980) -- Episode VI: Return of the Jedi (1983) -- Episode VII: The Force Awakens (2015) -- Episode VIII: The Last Jedi (2017) -- Episode IX: The Rise of Skywalker (2019) - -""Rogue One: A Star Wars Story"" takes place between Episodes III and IV, while ""Solo: A Star Wars Story"" occurs between Episodes III and IV but before Rogue One. - -3. Machete Order: -This order is designed to maintain the surprise twist in Episode V while incorporating the background from the Prequel Trilogy. - -- Episode IV: A New Hope (1977) -- Episode V: The Empire Strikes Back (1980) -- Episode II: Attack of the Clones (2002) -- Episode III: Revenge of the Sith (2005) -- Episode VI: Return of the Jedi (1983) -- Episode VII: The Force Awakens (2015) -- Episode VIII: The Last Jedi (2017) -- Episode IX: The Rise of Skywalker (2019) - -In this order, Episode I is considered optional, and standalone films can be inserted as suggested in the release order. - -As for the second question, Orders 1 through 65 refer to a series of contingency orders issued by the Galactic Republic to the clone troopers. These orders were a set of emergency plans designed to address various potential crises, including treason, assassination, and kidnapping. Order 66, specifically, instructed all clone troopers to execute their Jedi commanders in the event the Jedi were ever deemed a threat to the Republic. - -These questions do not have the same meaning. The first question inquires about the best viewing order for the Star Wars films, while the second question concerns in-universe contingency plans used by the Galactic Republic within the Star Wars universe." -"Answer the following question: So, I worked with a friend of mine who was a playwright to put together a play to take to the Edinburgh Fringe Festival. It was a three person show, and one of the roles was written specifically for me. Many of the lines were written after we improvised the scenes in my living room as she wrote the piece. Took it to Scotland, where it was quite well received. A year or so later, it was being produced in New York in a much more prestigious setting. I auditioned, was called back a couple times, and got to the play the role again. Fantastic! THEN, it was produced by an even larger theatre. Different producer, different casting director, etc. I went to the open call for it, and the casting director treated me really poorly. It was odd. She looked at my resume and said, “It says you have already played this role.” I said, “Yes, I was fortunate enough to workshop it and originate the role.” She looked at me like I was lying. I mean, shuttled me out the door like I was a crazy woman. Needless to say, I was not called back. And that was okay—(I mean, of course I wanted to do the show with this group of people, but hey, we can’t always get what we want). Fast forward to opening night: my playwright friend invites me to see the show. The actress playing “my” role was fantastic, but they had to change lines in the script that indicated what she looked like, because she was of Hawaiian descent. Again, no big deal…and she was great! What was strange was meeting the director that evening. My friend introduced me as the originator of the role, and the director asked me why I hadn’t auditioned…Overall, it wasn’t a harsh rejection or a terrible story, it was just weird to have been treated like a liar when I was not lying… Why did the actress feel bad about begin rejected? A. Because she thought the other actress did a bad job B. Because she was treated like a liar C. not enough information D. Because the role had to be changed for the new actress -Answer:",B. Because she was treated like a liar -"Please answer the following question: Moeenuddin Ahmad Qureshi - Moeenuddin Ahmad Qureshi usually referred to as Moeen Qureshi (born 1930) is a Pakistani economist and political figure. A former Vice President of the World Bank he was the Interim Prime Minister of Pakistan from July 18 1993 until 19 October 1993. Given a choice of categories company, educational institution, artist, athlete, office holder, mean of transportation, building, natural place, village, animal, plant, album, film or written work, the text refers to which one? -Answer:","The text refers to the category of ""office holder"" as Moeenuddin Ahmad Qureshi served as the Interim Prime Minister of Pakistan from July 18, 1993, until October 19, 1993." -"Multi-choice question: Same meaning? -Descendant of many other people , his father fought in the war and once it ended , decided to stay in Paraguay , like Brazilian soldiers at the time . -His descendant of many other people , his father fought at war and decided to stay in Paraguay when it ended , like the Brazilian soldiers at the time . - -Choose your answer from: (i) no. (ii) yes.","(ii) yes. - -Both sentences convey the same meaning, although they are structured slightly differently and use some synonyms. Here's a detailed comparison between the two sentences: - -1. Beginning phrase - Same meaning: - - ""Descendant of many other people"" (Sentence 1) - - ""His descendant of many other people"" (Sentence 2) - Note: The addition of ""his"" in Sentence 2 does not change the meaning of the phrase. - -2. Father's action during the war - Same meaning: - - ""his father fought in the war"" (Sentence 1) - - ""his father fought at war"" (Sentence 2) - Note: Both phrases express the same idea of the individual's father participating in a war. - -3. The action taken after the war - Same meaning: - - ""and once it ended, decided to stay in Paraguay"" (Sentence 1) - - ""and decided to stay in Paraguay when it ended"" (Sentence 2) - Note: The change from ""once it ended"" to ""when it ended"" does not alter the essence of the statement. Both phrases imply that after the war was over, the father decided to remain in Paraguay. - -4. Comparing the father's action with Brazilian soldiers - Same meaning: - - ""like Brazilian soldiers at the time"" (Sentence 1) - - ""like the Brazilian soldiers at the time"" (Sentence 2) - Note: The addition of ""the"" in Sentence 2 does not change the meaning. Both sentences compare the father's decision to stay in Paraguay after the war to the actions of Brazilian soldiers during that period. - -In conclusion, while the two sentences use slightly different sentence structures and some synonyms, they ultimately convey the same meaning about an individual derived from a line of ancestors, whose father fought in a war and, after its end, chose to remain in Paraguay like Brazilian soldiers of that era." -"Please answer the following question: Information: - The National Hockey League (NHL) is a professional ice hockey league currently composed of 31 member clubs. Of the 30 clubs currently playing, 23 are in the United States and 7 in Canada. Headquartered in New York City, the NHL is considered to be the premier professional ice hockey league in the world, and one of the major professional sports leagues in the United States and Canada. The Stanley Cup, the oldest professional sports trophy in North America, is awarded annually to the league playoff champion at the end of each season. - William Walton `` Bill '' Sharman ( May 25 , 1926 -- October 25 , 2013 ) was an American professional basketball player and coach . He is mostly known for his time with the Boston Celtics in the 1950s , partnering with Bob Cousy in what some consider the greatest backcourt duo of all time . As a coach , Sharman won titles in the ABL , ABA , and NBA , and is credited with introducing the morning shootaround . He was a 10 - time NBA Champion ( having won four titles as a player with the Celtics , one as head coach of the Los Angeles Lakers , and five as a Lakers executive ) , and a 12 - time World Champion in basketball overall counting his ABL and ABA titles . Sharman is also a two - time Naismith Memorial Basketball Hall of Fame inductee , having been being inducted in 1976 as a player , and in 2004 as a coach . Only John Wooden , Lenny Wilkens and Tommy Heinsohn share this double honor . - The TD Garden (previously the Shawmut Center, the FleetCenter, and the TD Banknorth Garden; nicknamed the Boston Garden and The Garden) is a multi-purpose arena in Boston. It is named after its sponsor, TD Bank, a subsidiary of Canada's Toronto-Dominion Bank. - Robert Joseph ""Bob"" Cousy (born August 9, 1928) is an American retired professional basketball player and member of the Naismith Memorial Basketball Hall of Fame. Cousy played point guard with the Boston Celtics from 1950 to 1963 and briefly with the Cincinnati Royals in the 196970 season. Making his high school varsity squad as a junior, he went on to earn a scholarship to the College of the Holy Cross, where he led the Crusaders to berths in the 1948 NCAA Tournament and 1950 NCAA Tournament and was named an NCAA All-American for 3 seasons. - The Boston Celtics are an American professional basketball team based in Boston, Massachusetts. The Celtics compete in the National Basketball Association (NBA) as a member club of the league's Eastern Conference Atlantic Division. Founded in 1946 and one of eight NBA teams (out of 23 total teams) to survive the league's first decade, the team is owned by Boston Basketball Partners LLC. The Celtics play their home games at the TD Garden, which they share with the National Hockey League (NHL)'s Boston Bruins. The franchise's 17 championships are the most of any NBA franchise, and account for 24.3 percent of all NBA championships since the league's founding in 1946. As a percentage of championships won, the Celtics are the most successful franchise to date in the major four traditional North American professional sports leagues. - The point guard (PG), also called the one or point, is one of the five positions in a regulation basketball game. A point guard has perhaps the most specialized role of any position. They are expected to run the team's offense by controlling the ball and making sure that it gets to the right players at the right time. Above all, the point guard must totally understand and accept their coach's game plan; in this way, the position can be compared to a quarterback in American football or a playmaker in association football (soccer). - Basketball is a sport that is played by two teams of five players on a rectangular court. The objective is to shoot a ball through a hoop in diameter and mounted at a height of to backboards at each end of the court. The game was invented in 1891 by Dr. James Naismith, who would be the first basketball coach of the Kansas Jayhawks, one of the most successful programs in the game's history. What entity does 'bill sharman' has the relation 'position played on team / speciality' with? -A:",Bill Sharman has the relation 'position played on team/speciality' with the Boston Celtics as a basketball player. -"Please answer the following question by reasoning step-by-step. If ""A woman in a green shirt is welding."" does that mean that ""A woman is cutting metal.""? -Options: -- yes -- it is not possible to tell -- no. Step-by-step reasoning:","- no. - -Step-by-step reasoning: -1. The statement given is ""A woman in a green shirt is welding."" -2. Welding is a process where two or more metal pieces are joined together by heating their surfaces to the point of melting, usually with an electric arc or a gas flame. -3. Cutting metal, on the other hand, is a process of separating metal into two or more pieces using various methods, such as sawing, shearing, or plasma cutting. -4. Since welding and cutting metal are different processes, the statement ""A woman is cutting metal"" cannot be inferred from the given statement. Therefore, the answer is no." -"Detailed Instructions: In this task, you are given a premise, a hypothesis, and an update. The premise sentence describes a real-world situation and is always assumed to be true. The hypothesis sentence describes an assumption or inference that you might make about that situation having read the premise. The update provides additional information about the situation that might weaken or strengthen the hypothesis. A weakener is a statement that weakens the hypothesis, that is, it makes you much less likely to believe the hypothesis is true. A strengthener is a statement that strengthens the hypothesis, that is, it makes you much more likely to believe the hypothesis is true. Your task is to answer with 'strengthener' or 'weakener' if the update strengthens or weakens the hypothesis, respectively. -Problem:Premise: A woman in white with her arms folded smiling as a man is laughing holding cotton candy. -Hypothesis: A woman watches her husband buying cotton candy at a carnival. -Update: The woman does not know the man. -Solution:","The task is asking you to determine if an update strengthens or weakens a given hypothesis based on a provided premise. To do this, follow these simple steps: - -1. Understand the premise: Read the given premise sentence that describes a real-world situation. Remember, the premise is always true. - -In this case, the premise is, ""A woman in white with her arms folded smiling as a man is laughing holding cotton candy."" - -2. Understand the hypothesis: Read the provided hypothesis sentence that describes an assumption or inference about the situation based on the premise. - -In this case, the hypothesis is, ""A woman watches her husband buying cotton candy at a carnival."" - -3. Analyze the update: Read the update sentence that provides additional information about the situation. This update can either weaken or strengthen the hypothesis. - -In this case, the update is, ""The woman does not know the man."" - -4. Determine if the update is a strengthener or weakener: Assess if the update makes the hypothesis more likely to be true (strengthener) or less likely to be true (weakener) based on the relationship between the premise, hypothesis, and update. - -In this case, the update weakens the hypothesis because the woman does not know the man, making it less likely that the man is her husband. - -5. Provide the answer: Based on your analysis, answer whether the update is a strengthener or weakener for the hypothesis. In this case, the answer is 'weakener.'" -"You will be given a definition of a task first, then some input of the task. -You are given a sentence in Spanish. Your job is to translate the Spanish sentence into Arabic. - -Incorporan su propio dinero. Son fáciles de fabricar. -Output:","To perform this translation, I will follow these steps: - -1. Analyze the structure and grammar of the sentence in Spanish. -2. Identify the individual components (words and phrases) and their definitions. -3. Apply Arabic grammar rules to ensure proper construction of the sentence. -4. Verify the correctness of the translation. - -Step 1: Analyze the structure and grammar of the sentence in Spanish. -""Incorporan su propio dinero. Son fáciles de fabricar."" -This sentence consists of two separate statements. The first statement, ""Incorporan su propio dinero,"" talks about incorporating their own money. The second statement, ""Son fáciles de fabricar,"" mentions that they are easy to manufacture. - -Step 2: Identify the individual components and their definitions. -Incorporan: incorporate -su: their -propio: own -dinero: money -Son: they are -fáciles: easy -de: of -fabricar: manufacture - -Step 3: Apply Arabic grammar rules to ensure proper construction of the sentence. -After identifying the definitions, I will arrange the words according to Arabic grammar: - -First statement: -Incorporan su propio dinero -> يدمجون أموالهم الخاصة -يدمجون: Incorporate -أموالهم: their money -الخاصة: own - -Second statement: -Son fáciles de fabricar -> هم سهلون للتصنيع -هم: they are -سهلون: easy -للتصنيع: for manufacturing - -Step 4: Verify the correctness of the translation. -The translation seems accurate, maintaining the meaning of the original Spanish sentence. So, the final Arabic translation is: - -يدمجون أموالهم الخاصة. هم سهلون للتصنيع." -"Given the task definition and input, reply with output. In this task, you are given reviews written about the books in Bengali. You are expected to classify the sentiment of the reviews into two classes: positive or negative. - -পড়তে পড়তে বিরক্ত লাগছিলো।বিশেষ কিছুই নেই -","This task requires you to analyze a given review written in Bengali and determine whether the sentiment expressed is positive or negative. Here's a simple step-by-step guide to help you: - -1. Understand the task requirements: In this task, you have to analyze the book reviews written in Bengali and classify them as either positive or negative based on their sentiment. - -2. Read the given input: Carefully read the provided review to understand the content. In this case, the input is: ""পড়তে পড়তে বিরক্ত লাগছিলো। বিশেষ কিছুই নেই"" - -3. Identify the sentiment: Try to understand the emotions expressed in the review. Here, the sentences indicate some level of annoyance or disappointment (বিরক্ত লাগছিলো) and lack of anything special (বিশেষ কিছুই নেই). - -4. Classify the sentiment: Based on your understanding of the review, determine whether the overall sentiment is positive or negative. In this example, the review expresses dissatisfaction, thus the sentiment is negative. - -5. Provide the output: Once you have classified the sentiment, reply with the output. In this case, the output will be ""negative."" - -So, for the given input, the output is ""negative.""" -"Can you get your penis bigger? - -How do I make my penis longer? - -Choose your answer. Are these two questions paraphrases of each other? -Options: I. no; II. yes;","Option II. yes - -These two questions are paraphrases of each other because both questions are essentially asking about increasing the size of the penis, particularly in terms of length." -"Q:Two people got stuck in a local blizzard. Tom had a bottle of alcohol with him and drank it after he found some kind of shelter in the snow. Dan didn't have alcohol with him. Which of the two people had more blood vessels dilate? -A:","Tom, the person who consumed alcohol, would have experienced more blood vessel dilation. Alcohol is a vasodilator, which means it causes blood vessels to expand or dilate. When someone drinks alcohol, it enters their bloodstream and triggers the blood vessels to widen. This dilation can lead to increased blood flow and a temporary feeling of warmth, which might seem beneficial in a cold situation like a blizzard. - -However, this effect is counterproductive in such conditions, as the increased blood flow to the skin's surface actually promotes heat loss from the body. As a result, Tom would be at a higher risk of hypothermia compared to Dan, who did not consume alcohol. So, even though Tom experienced more blood vessel dilation, it was not a positive effect in this scenario." -"Please briefly summarize this news article: - -AOL.com Video - Father Lets 8-Year-Old Drive On Icy Road - -Description:Would you let your 8-year-old drive your car? How about on an icy road? Well one father in Russia did just that, and recorded the entire thing. To her credit, the child seemed to be doing a great job. (0:44) - -Tags: 8-year-old driver , caught on camera , child driver , pix11 - -Summary:","A father in Russia allowed his 8-year-old child to drive his car on an icy road and recorded the event. The child appeared to be handling the situation well, showcasing their driving skills despite the challenging conditions." -"In this task, you are given a sentence in the English language from the various articles. Your task is to translate the given English sentence into the Yoruba language. Please bear in mind the following guidelines while doing the translation: 1) Generated output should have natural language and formal form. The output sentence should not be a colloquial form of the input sentence. The generated output should be in natural language which is how you would type your queries in a text-based virtual assistant. 2) The words between quotation marks *SHOULD NOT* be translated. The output should keep those values intact and include the quotation marks around them as well. 3) Numbers and fully capitalized words like SEPTEMBER, or 10 HOURS *SHOULD NOT* be translated. Keep them as they are in the translations. 4) Do not localize measurement units like miles to kilometers during your translation. 5) Note the input is in sentence case except for special placeholders. Do the same in your translations. - -The over 149,000 publishers in Venezuela are not only enduring despite suffering severe trials during the “last days,” they are also increasing their efforts to share the Bible’s comforting message with their neighbors.","Ni itan yi, o ni rọ̀tìn n jẹ́ ọtún in Yoruba lati ara ohun to gba lati awọn akọọlẹ̀. Rọ̀tìn yinyin ni lati yí padà gbọlọhùn ti a pèsè ni ede Gẹ́ẹsì ni Yoruba. Jọwọ gbin ní ọ̀tùnnumọ́ ti a pèsè wọnyí nigba ti o ba ń ṣe itumọ irọ̀tìn: -1) Iṣiro ti o ba ń yin lọwọ́ yẹ ki o bi ara ẹ̀dá ati idanilekọ ti o jiyan ati n yẹ ki o ba jẹ́ alábàrà ọ̀rọ̀ ninu ifọ̀wọ̀rọ̀. Iṣiro ti o ba ń yin yẹ ki o ba jẹ́ alábàrà ti a ko pada ninu awọn ohun ti a pèsè naa, yẹ ki o ba jẹ́ nifèẹ́ awọn ọrọ̀ ti a ko ninu awọn gbọlọhùn virtual assistant. -2) Lọ́nà nǹkan tí wọ́n kọ́ sí bẹ́ẹ̀ tí awọn aáfikùn kì fọ kọ̀ọ̀kọ̀án *MẹRINDINLOGUN* yẹ ki o mu menú wọ̀nyí wa ní iṣiro ti o ba ń yin. Yẹ ki o mu awọn ọ̀dun tí a kọ̀ síbẹ̀ẹ̀, fọ kọ̀ọ̀kọ̀án l'arin awọn iṣiro ti a yin lati ara ẹda ọrọ̀. -3) Sụfọ̀ọ̀rọ̀ tí o wà lókè wọn kì bẹ̀rù nígi yìí, dà bíi ẹ̀ṣẹ̀rọ̀ SEPTEMBER, tabi 10 HOURS *KI O KI O YAN* ni iṣiro ti a yin. Mu wọn wá bi wọn ṣe ní iṣiro ti o ba ń yan. -4) Kò yípadà ináìpọn iṣe èdi e lé gbọn lókè bi míli tabi kílómìtà nigbati o ba ń mu irọ̀tìn yinyin sínù. -5) àkíyèsí tónán inú gbọ̀sì wón s'ọdọdọ òdìgbayénú òdìgbèóròmi tùnmò s'ọdọdọnló i. Tún bi ẹda wọn ní iṣiro ti olórí wọn ní ti èyitónán gbójà_odoọ̀bìnrin your translations - -Lẹyìn gbajúmọ̀, ọmọ ogun ki o ń sọ diẹ́ sínú gbọlọhùn gẹ́ẹsì wọn: The over 149,000 publishers in Venezuela are not only enduring despite suffering severe trials during the “last days,” they are also increasing their efforts to share the Bible’s comforting message with their neighbors. -_E_ iṣiro ti a yin lọwọ́ eto yii ni: Nínú Venezuela, awọn aṣayasẹ ipo to tọ́ ọ̀la, 149,000 ni wọn kò nikan yà gbiri gbọdọjụ méjì sórí àwọn ìdásọnu gidi ní “ọjọ́òóòóòó kan dọn,” wọn sì ń kọ̀_atébíìnyéì u_ṣi kọ ki wọn pín ikanni ìrọra tí iwe mímọ erubẹ disponun ibyllesai wọnyí fun àwọn mètèèbùù. Inú wahala to gọ́ diẹ̀," -"I am verifying the answers generated by an automatic system to the following question: what is genetic differences Suggested answer: Alleles under selection are likely to occur only in those geographic regions where they confer an advantage. Should I validate this answer? -OPTIONS: - (a). No; - (b). Yes;","To verify the answer, I will: -1. Understand the question and the given answer -2. Check if the given answer fits the context of the question -3. Make a decision based on the correctness and relevancy - -Step 1: Understanding the question and the given answer -The question asks about ""what is genetic differences."" Essentially, it seeks to define or explain the concept of genetic differences. The suggested answer explains the occurrence of specific alleles in certain geographic regions due to selection and their advantages. However, it doesn't directly answer the question. - -Step 2: Checking if the given answer fits the context of the question -The given answer provides an example of a process associated with genetic differences (specifically, selection based on an advantage). Still, it does not provide a comprehensive definition or explanation of genetic differences themselves, which is the primary focus of the question. - -Step 3: Decision -Based on the correctness and relevancy of the given answer, the decision is: -(a). No" -"Milwaukee, Wisconsin (CNN) -- President Barack Obama, in a bid to create jobs and boost economic growth, called on Congress on Monday to pass a $50 billion plan to renew the country's transportation infrastructure. His address was the first of two speeches the president is scheduled to make this week to frame his administration's ongoing response to the recession, less than two months ahead of midterm elections in which Democratic majorities in the House and Senate are in jeopardy. ""Today, I am announcing a new plan for rebuilding and modernizing America's roads, and rails and runways for the long term,"" said Obama, who spoke on Labor Day in Milwaukee, Wisconsin -- a state with competitive gubernatorial and U.S. Senate races. ""We used to have the best infrastructure in the world. We can have it again,"" he said to loud cheers from a crowd of union workers. The proposal envisions -- over a six year period -- rebuilding 150,000 miles of roads, 4,000 miles of rail and 150 miles of airport runways. It also would include modernizing the nation's air traffic control system in an effort to reduce delays and travel time. ""This will not only create jobs immediately. It's also going to make our economy hum over the long haul,"" said the president. Obama hopes to work with Congress to enact an up-front investment of $50 billion -- an amount a White House statement said would represent a significant chunk of new spending on infrastructure. The investment would then be paired with what the administration called a framework to improve transportation spending. The long-term plan would include the establishment of an Infrastructure Bank, which would leverage federal dollars and focus on projects that could deliver the the biggest bang for the buck, Obama said. The president stressed the need for Democrats and Republicans to work together on the transportation initiative, which would need to be approved by Congress. - -Based on the paragraph, does the response ""More jobs, better commute times"" correctly answer the question ""What did the president say would be two significant benefits of spending to rebuild many miles of roads, railways, and runways?""?","Yes, the response ""More jobs, better commute times"" correctly answers the question. The president mentioned that this plan would create jobs immediately and also improve the economy, which includes better transportation and shorter travel times." -"Please answer the following question: I am trying to decide whether it's worth it to invest in this film proposal. Can you help me answer a few questions? If you can't, please say ""No I can't"". Question: What does Spider-Man suspect Connor is? Movie title: The Amazing Spider-Man Movie plot: Scientist Richard Parker (Campbell Scott) is playing hide-and-seek with his young son Peter (Max Charles) when he discovers that his study has been broken into. After quickly gathering some hidden documents, Richard and his wife Mary (Embeth Davidtz) leave Peter with his Aunt May (Sally Field) and Uncle Ben (Martin Sheen), then mysteriously depart without telling Peter where they are going.Years later, the teenage Peter Parker (Andrew Garfield) has become an alienated social outcast. He attends Midtown Science High School, where he pines over his crush Gwen Stacy (Emma Stone), while frequently getting bullied by the obnoxious Flash Thompson (Chris Zylka).At home, Peter finds a briefcase containing some of his father's old documents and learns that his father worked with fellow scientist Dr. Curtis Connors (Rhys Ifans) at a pharmaceutical company named Oscorp. Faking his way into the Oscorp building by pretending to be an intern, Peter sneaks into a laboratory where extremely strong ""biocable"" is being created from genetically-modified spiders. One of the spiders escapes from its container and bites Peter. On the subway ride home, Peter scuffles with a gang of thugs and discovers that he suddenly has increased agility and strength. Upon returning home, he finds the spider hiding in his jacket and stores it away.The next day, Peter goes to Dr. Connors's house and gives him Richard Parker's documents. Dr. Connors explains that he and Richard were researching cross-species genetics in order to find a way to re-grow lost limbs, Dr. Connors being motivated by the loss of his own right arm. Dr. Connors is frustrated because his superior, Dr. Rajit Ratha (Irrfan Khan), is pressuring him to devise a cure for Oscorp's CEO Norman Osborn, who is terminally ill.Back at school, Peter gets in trouble after accidentally breaking a basketball hoop during a game with Flash. Uncle Ben is forced to switch a work shift to meet with the principal about the situation. Afterward, Uncle Ben asks Peter to pick up Aunt May, but Peter... -A:",Spider-Man suspects that Dr. Connor is the Lizard. -"Even after Bin Laden's departure from the area, CIA officers hoped he might return, seeing the camp as a magnet that could draw him for as long as it was still set up. The military maintained readiness for another strike opportunity. On March 7, 1999, Clarke called a UAE official to express his concerns about possible associations between Emirati officials and Bin Laden. Clarke later wrote in a memorandum of this conversation that the call had been approved at an interagency meeting and cleared with the CIA. When the former Bin Laden unit chief found out about Clarke's call, he questioned CIA officials, who denied having given such a clearance. Imagery confirmed that less than a week after Clarke's phone call the camp was hurriedly dismantled, and the site was deserted. CIA officers, including Deputy Director for Operations Pavitt, were irate."" Mike"" thought the dismantling of the camp erased a possible site for targeting Bin Laden. The United Arab Emirates was becoming both a valued counterterrorism ally of the United States and a persistent counterterrorism problem. From 1999 through early 2001, the United States, and President Clinton personally, pressed the UAE, one of the Taliban's only travel and financial outlets to the outside world, to break off its ties and enforce sanctions, especially those relating to flights to and from Afghanistan. These efforts achieved little before 9/11. In July 1999, UAE Minister of State for Foreign Affairs Hamdan bin Zayid threatened to break relations with the Taliban over Bin Laden. The Taliban did not take him seriously, however. Bin Zayid later told an American diplomat that the UAE valued its relations with the Taliban because the Afghan radicals offered a counterbalance to ""Iranian dangers"" in the region, but he also noted that the UAE did not want to upset the United States. - -Question: ""Why did Hamdan bin Zayid's threat to break relations with the Taliban achieve little results before 9/11?"" - -Response: ""UAE"" -Available choices: -(a). no -(b). yes -Does the response correctly answer the question? - -","The provided response ""UAE"" does not correctly answer the question. The appropriate response should explain why Hamdan bin Zayid's threat did not achieve significant results before 9/11." -"Answer this question: - -what is the animal on liverpool's crest??","The animal on Liverpool's crest is a bird called the Liver bird. It is a mythical creature that looks like a combination of a seagull and a cormorant. This bird is a symbol of the city of Liverpool, and the soccer team uses it on their crest to represent their connection to the city." -"Which of the following sentences is nonsensical? -Options: -- Sentence A: ""the earth is smaller than the sun"" -- Sentence B: ""the earth is smaller than the moon"" - Let me think hard. Detailed solution:","Upon analyzing the two sentences, it can be determined that: - -- Sentence A: ""the earth is smaller than the sun"" -- Sentence B: ""the earth is smaller than the moon"" - -Sentence A is a true statement. The Earth is indeed smaller than the Sun. The Earth has a diameter of approximately 12,742 kilometers (7,918 miles), while the Sun has a diameter of about 1,391,000 kilometers (864,000 miles). In terms of size, the Sun is much larger than the Earth. - -Sentence B, on the other hand, is not a true statement. The Earth is larger than the Moon. The Moon has a diameter of approximately 3,474 kilometers (2,159 miles), making it substantially smaller than the Earth. - -Given the options, Sentence B: ""the earth is smaller than the moon"" is the nonsensical statement, as it contradicts the known relative sizes of the Earth and the Moon." -"SEOUL, SOUTH KOREA — U.S. Secretary of State Mike Pompeo Thursday pushed back against a North Korean state media report that U.S. President Donald Trump agreed during this week’s Singapore summit with Kim Jong Un to gradually lift sanctions against Pyongyang, saying Trump had been very clear about the sequence of steps in the process. The official Korean Central News Agency (KCNA) said Trump offered to lift sanctions against it as relations improve, indicating a phased-in approach where concessions would be provided at various stages of the denuclearization process. Speaking at a news conference in Seoul alongside South Korean Foreign Minister Kang Kyung-hwa and Japanese Foreign Minister Taro Kono, the U.S. secretary of state said the Trump administration would not repeat the mistakes made by past presidents that rewarded Pyongyang for denuclearization promises. “When we refer to the mistakes of the past. They were providing economic and financial aid relief before the complete denuclearization had taken place. That is not going to happen. President Trump made that clear,” Pompeo said. President Trump described his meeting with Kim as a resounding success and in a tweet said, “There is no longer a nuclear threat from North Korea.” But the U.S.-North Korea joint declaration was vague on details, providing no clear definition on what constitutes denuclearization, set no timeline for the dismantlement process, and said nothing about outside verification requirements. Pompeo, however, pointed out that in the Singapore statement both countries reaffirmed the inter-Korean Panmunjom declaration from April, in which both South and North Korea agreed to uphold all past agreements that did specify detailed nuclear prohibitions and verification requirements. The secretary of state and his counterparts in Seoul and Tokyo said they are united in support of the U.S.-North Korea agreement, and in agreement on the goal of complete, irreversible, verifiable dismantlement of North Korea’s nuclear program. After the summit,... Who did Trump meet with representing North Korea? - not enough information - Mike Pompeo - Taro Kono - Kim Jong Un -The answer to this question is:",Kim Jong Un -"How does the next paragraph end? - -We see men on a stage walking on a slack line as two other men film the event. they","continue to balance carefully, inching their way across the line, while the audience below watches in awe and anticipation. As the two men approach the final stretch, they steady themselves, their concentration unwavering. In one precise movement, they simultaneously reach the end of the slack line, raising their arms triumphantly. The audience erupts into applause and cheers, celebrating the end of a daring and captivating performance, as the cameras continue to roll, capturing the unforgettable moment in time. - -Step-by-step justification: -1. Given the starting information, we identify that the paragraph's main focus is on the men walking on a slack line, and being filmed. -2. In order to complete the paragraph and create an engaging narrative, we can presume that their effort will end one way or the other. -3. To add tension and suspense, the men continue to balance and inch across the line, engaging the audience. -4. As they approach the end, we can introduce heightened concentration and resolve to create dramatic tension. -5. The successful completion and triumphant gesture add excitement and resolution to the narrative. -6. Finally, we include the audience's reaction and the ongoing filming to wrap up the event and conclude the paragraph." -"This is some data: Aaron Boogaard, birthYear, 1986; Aaron Boogaard, height, 1.905; Aaron Boogaard, club, Wichita Thunder; Aaron Boogaard, birthPlace, Canada. - -Generate a detailed description of this data","Alright kiddo, let me tell you about Aaron Boogaard. He is a person who was born in the year 1986, which means he is older than you. Aaron is quite tall, standing at 1.905 meters - that means he's much taller than your dad! He plays for a team called the Wichita Thunder, kind of like how you play with your friends at school. And guess what? Aaron was born in a far away country called Canada, which is a really big place with lots of snow and friendly people. So this information is all about a tall Canadian man named Aaron Boogaard who plays for the Wichita Thunder and was born in 1986." -"Question: Process: - Greenhouse gases are released into the air by human activities - The earth changes energy from the sun into heat - Heat rises from the ground - Greenhouse gas molecules in the atmosphere prevent the heat from going into space - The temperature of the earth increases - The temperature continues to rise and melts the polar ice caps - The temperature rises even faster. Question: suppose animal comes into contact with more sick animals happens, how will it affect More greenhouse gases are produced. How does the supposed perturbation influence the second effect mentioned. Answer by more, less or no effect -Answer:","To answer this question, let us go through the steps: - -Step 1: Greenhouse gases are released into the air by human activities. - -Step 2: The earth changes energy from the sun into heat. - -Step 3: Heat rises from the ground. - -Step 4: Greenhouse gases in the atmosphere prevent the heat from going into space. - -Step 5: The temperature of the earth increases. - -Step 6: The temperature continues to rise and melts the polar ice caps. - -Step 7: The temperature rises even faster. - -Suppose an animal comes into contact with more sick animals. This fact is on the surface unrelated to greenhouse gases production. However, if we consider that the spread of diseases among animals could potentially affect agricultural activities (such as livestock farming), which contribute to the production of greenhouse gases, we might find an indirect connection. - -For instance, if more animals become sick and die or need to be culled to prevent the spread of disease, the demand for alternative sources of food might increase. Depending on these alternative sources (e.g., increased land use for crops or an increase in demand for fossil fuels for transportation), the production of greenhouse gases could either increase (more effect) or decrease (less effect) as a consequence of this perturbation. - -However, without more information on the specific alternative sources of food and their greenhouse gas emissions, it is difficult to determine the extent of the influence on the second effect mentioned (temperature continues to rise and melts the polar ice caps). - -Therefore, based on the given information, I would conclude that the supposed perturbation of an animal coming into contact with more sick animals has an uncertain effect on temperature rise and the melting of polar ice caps." -"Victims of domestic violence will have access to quality legal representation through a campaign undertaken by Idaho Supreme Court Chief Justice Linda Copple Trout and corporate leaders. ""Thousands of times a year, Idahoans are victims of domestic violence. The victims are often women and their children and they frequently have few resources with which to pursue their legal rights,"" Trout said Tuesday. ""This campaign helps fill that gap in legal services for women who need the help at a time when they are in crisis."" The Idaho Partners for Justice Project has already secured pledges of more than $35,000 from law firms, attorneys, corporations and individuals. The goal is $100,000. The drive to pay for free legal services will continue for the next two months. The money goes to Idaho Legal Aid Services and the Idaho Volunteer Lawyers Program. Last year, more than 5,000 petitions were filed in Idaho for protection orders in domestic violence cases. More than 12,000 victims contacted shelters or crisis hotlines. Joining Trout in the announcement was Idaho Bar Association President Fred Hoopes of Idaho Falls and Ida-West Energy Co. Chief Executive Officer Randy Hill, members of the project's executive committee. Also on hand were some women who were victims of such violence, but benefited from free legal services. Last year's campaign generated enough money and resources to help more than 450 victims. The help ranged from representation in protection order hearings to legal assistance in divorce, visitation and child support cases. The donations are tax deductible. - -Based on the paragraph, does the response ""Police Chief Bob Ackerman and Victim's Advocate Katherine Gonzalez"" correctly answer the question ""Who joined the Idaho Supreme Court Justice in making the announcement?""?","Based on the paragraph, the response ""Police Chief Bob Ackerman and Victim's Advocate Katherine Gonzalez"" does not correctly answer the question ""Who joined the Idaho Supreme Court Justice in making the announcement?"". The correct answer would be ""Idaho Bar Association President Fred Hoopes of Idaho Falls and Ida-West Energy Co. Chief Executive Officer Randy Hill, members of the project's executive committee.""" -"Please answer the following question: Riley decided he wanted a night out and treated the girls to dinner. Given that the answer to a question is ""hug Riley"", what is the question? -A:","Based on the provided context, a plausible question to the answer ""hug Riley"" could be: - -Q: ""What should the girls do to thank Riley for the dinner he treated them to?"" - -Justification: -The context given reveals that Riley took the girls out for dinner. A common way to show appreciation for such gestures might involve a physical show of gratitude like a hug. Therefore, the question suggested involves the girls showing gratitude to Riley, which would result in the answer ""hug Riley"". However, without explicit context, we can only make an educated guess about the nature of the question." -"Build a movie plot around this: What are the girls that Sarah becomes friendly with rumored to be? Witches -Answer:","Title: The Enchanted Circle - -Step 1: Introduce the main character -Sarah, a shy and introverted high-school girl, moves to a new town with her family due to her parents' job relocation. Sarah has a hard time making friends and feels out of place in her new environment. - -Step 2: Establish the setting -The story takes place in a small, close-knit town called Mooncrest, surrounded by a dense and mysterious forest, where rumors and myths about supernatural beings lurk in the shadows. The town has a deep-rooted history of witchcraft and occult practices. - -Step 3: Introduce the secondary characters -Sarah meets a group of three girls—Luna, Willow, and Aurora—who are seen as outcasts by their peers. The girls are rumored to be witches because of their strange behaviors, mysterious background, and fascination with the town's history. - -Step 4: Develop the main character's relationship with the secondary characters -Despite the rumors, Sarah becomes friendly with Luna, Willow, and Aurora. They take her into their circle of friendship, and Sarah starts to learn about the town's dark past and the girls' complex connection to it. Meanwhile, Sarah begins to feel more confident and at ease with her newfound friends. - -Step 5: Introduce a conflict -The town experiences a series of strange and inexplicable events, such as mysterious fires and sudden illnesses that affect people who have been hostile to the girls, leading the townsfolk to believe that the girls are the cause. People begin to whisper that the girls are using witchcraft to take revenge on those who wronged them. - -Step 6: Present the main character's reaction to the conflict -As the town's fear and suspicion grow, Sarah's loyalty to her new friends is tested. She starts to question whether the girls are truly involved in witchcraft or are just innocent victims of the town's paranoia. Sarah becomes determined to find the truth and protect the girls from the mounting hysteria. - -Step 7: Build towards the climax -As Sarah delves deeper into the mysterious happenings, she discovers that there is indeed supernatural activity in the town - but not from her friends. A secret group, believing they can harness the power of the town's history, are behind the dark occurrences. They plan to use the girls as scapegoats and take control of the town. - -Step 8: Climax -Sarah confronts the secret group and exposes their true intentions to the townsfolk, turning public opinion against them. A battle between the forces of good and evil ensues, with Sarah teaming up with the girls to defeat the secret group. - -Step 9: Resolution -After the secret group's plan is thwarted, Mooncrest returns to a semblance of normalcy, but the town will never be the same. With their names cleared, Luna, Willow, and Aurora's acceptance grows, and they continue to share their knowledge of the town's real history with others while supporting each other as friends. Sarah is now embraced by her community and becomes a symbol of courage and understanding. - -Step 10: Closing scene -In the end, we see Sarah and her friends sitting together, laughing and enjoying a beautiful sunset over Mooncrest. They have not only found friendship and acceptance but have also learned that uncovering the truth can be the most powerful magic of all." -"Please answer the following question: Read the following paragraph and extract the answer for the question: Whose decision to leave causes Alise to be left in the care of Queen Uberta, Lord Rodgers and animal friends? Inhabited on a mysterious island are strange creatures called Boggs who love meat. Unbeknownst to them, it is also inhabited by a shipwrecked boy. He scavenges for some food by distracting the Boggs with animal noises. Far away from the island, Odette and Derek are on their way to help the people by building a bridge leaving Alise in the care of Queen Uberta, Lord Rodgers, and their animals friends: Speed, Jean-Bob, Puffin and the Scullions. Queen Uberta begins to prepare Alise to learn how to be and act like a princess. But Alise doesn't want to be a princess in this way but to be a modern princess. Lord Rogers says that Alise needs adventure but Queen Uberta disagrees. While fighting once again, Alise uses her chance to swim in the lake with her friends but she was quickly sent back to the palace to learn to be proper. Queen Uberta is very strict with Alise, trying to teach her everything, but instead she falls asleep and sent to bed. That same night, Lord Rogers, Jean-Bob, and Speed sneak Alise out of her room to go on an adventure. The next morning, before Queen Uberta enters Alise's room with yoga lessons, she notices that Alise has gone with Lord Rogers. Queen Uberta chases after the group all the way to the port but they escape on a ship. Queen Uberta is furious but nervous about Alise so she sent Puffin and the Scullions after them. On the ship, Alise changes into a pirate costume, making Lord Rogers realize that Uberta was right; he turned Alise into a pirate just when Alise wanted to have fun. On the first night they see the Polar Star and Lord Rogers says that sailors always used this star to guide the way back home. -A:","Odette and Derek's decision to leave and help the people by building a bridge causes Alise to be left in the care of Queen Uberta, Lord Rodgers, and their animal friends: Speed, Jean-Bob, Puffin, and the Scullions." -"Question: I read this background article the other day: Huge amounts of chemicals, such as fertilizers and pesticides, are applied to farm fields (see Figure below ). Some of the chemicals are picked up by rainwater. Runoff then carries the chemicals to nearby rivers or lakes. Dissolved fertilizer causes too much growth of water plants and algae. This can lead to dead zones where nothing can live in lakes and at the mouths of rivers. Some of the chemicals can infiltrate into groundwater. The contaminated water comes up in water wells. If people drink the polluted water, they may get sick. I am facing a new situation today: There are two lakes in southern Indiana that are popular places for families of nearby cities to visit for picnics and parties. Lake Mahoe is right next to a large farm that grows all kinds of crops for the town. The owner of the farm also rents out his barn regularly so people can use it for celebrations. Lake Tresco is located near a school and children will often come play at it during recess. Using the knowledge I acquired from the background article, how should I answer correctly the following question regarding my new situation: Does lake Mahoe have more or less chemicals in it than lake Tresco? -Answer:","Lake Mahoe likely has more chemicals in it than Lake Tresco. - -Step 1: Identify sources of chemical contamination. -According to the background article, one of the main sources of chemical contamination in bodies of water is the use of fertilizers and pesticides in farm fields. No information is provided about potential sources of contamination near Lake Tresco. - -Step 2: Locate the sources near the lakes. -Lake Mahoe is situated right next to a large farm that grows all kinds of crops. This implies that fertilizers and pesticides are likely applied. - -Step 3: Consider chemical runoff. -Rainwater can pick up chemicals from the farm fields and carry them into the lake, causing contamination. There is no mention of any similar process occurring near Lake Tresco. - -Step 4: Consider the effects of these chemicals. -The absorbed fertilizer can enhance the growth of water plants and algae, sometimes to detrimental levels, leading to dead zones where nothing can live. Some of the chemicals can also seep into groundwater and contaminate wells from where people draw drinking water. - -Step 5: Conclude based on evidence. -Given the background knowledge and the specific situation, it is much more probable that Lake Mahoe is exposed to higher levels of chemical contaminants from the nearby farm when compared to Lake Tresco, which doesn't have an identified source of similar contamination close by." -"Between April 1877 and February 1878, she threatened five times to abdicate while pressuring Disraeli to act against Russia during the Russo-Turkish War, but her threats had no impact on the events or their conclusion with the Congress of Berlin. Disraeli's expansionist foreign policy, which Victoria endorsed, led to conflicts such as the Anglo-Zulu War and the Second Anglo-Afghan War. ""If we are to maintain our position as a first-rate Power"", she wrote, ""we must ... be Prepared for attacks and wars, somewhere or other, CONTINUALLY."" Victoria saw the expansion of the British Empire as civilising and benign, protecting native peoples from more aggressive powers or cruel rulers: ""It is not in our custom to annexe countries"", she said, ""unless we are obliged & forced to do so."" To Victoria's dismay, Disraeli lost the 1880 general election, and Gladstone returned as prime minister. When Disraeli died the following year, she was blinded by ""fast falling tears"", and erected a memorial tablet ""placed by his grateful Sovereign and Friend, Victoria R.I."" -What position did Victoria take on how to be a successful and top notch power?","Queen Victoria took a firm stance on the importance of maintaining and expanding the British Empire in order to secure its position as a top-notch, first-rate power during her reign. She believed that this could be achieved through a combination of aggressive foreign policy, military preparedness, and a sense of humanitarian responsibility towards the native populations under British rule. - -Victoria had a strong alliance with her Prime Minister, Benjamin Disraeli, who shared her expansionist views. Together, they pushed for British involvement in global conflicts, such as the Russo-Turkish War, the Anglo-Zulu War, and the Second Anglo-Afghan War. It is crucial to note that during the Russo-Turkish War, Queen Victoria pressured Disraeli to act against Russia and even threatened to abdicate five times, showcasing her unwavering determination to assert British interests. - -In her opinion, to maintain Britain's position as a leading power, the country had to be ready for conflicts and wars continually. This militaristic outlook aligned well with the era's prevailing attitude of the ""civilizing mission,"" wherein imperialist nations believed it was their duty to bring progress and enlightenment to the territories they colonized. - -Furthermore, Queen Victoria emphasized the protective nature of the British Empire's expansion. She argued that it served as a benign and civilizing force, shielding native populations from aggressive powers or cruel rulers. In this sense, she did not see the annexation of countries as an inherently negative practice but rather as a necessary measure if circumstances demanded it. She claimed that Britain would only annex countries if they were ""obliged and forced to do so."" - -However, her close relationship with Disraeli meant she was not always in step with the broader political context. Victoria was deeply dismayed when he lost the 1880 general election to William Gladstone and later died. In memory of their shared vision for imperial Britain, Queen Victoria erected a memorial tablet in Disraeli's honor. - -In summary, Queen Victoria's position for ensuring Britain's success as a top-notch power involved a combination of aggressive and expansionist foreign policy, military preparedness, protection for native populations, and a sense of moral obligation to bring about progress and enlightenment. This approach was firmly tied to the colonial and imperialist attitudes of the 19th century, but it reinforces the importance she placed on asserting Britain's power and influence on the global stage." -"Please answer the following question by reasoning step-by-step. Given the sentence ""Two boys and a girl kick a ball in a sandy field."" can we conclude that ""Children are playing outside.""? -Options: -- yes -- it is not possible to tell -- no. Step-by-step reasoning:","1. The sentence given is ""Two boys and a girl kick a ball in a sandy field."" -2. We can infer from the sentence that ""Two boys and a girl"" references three children. -3. The action mentioned in the sentence is ""kick a ball,"" which is a form of play. -4. The location mentioned in the sentence is ""a sandy field,"" which indicates an outdoor setting. - -Based on this step-by-step reasoning, we can conclude that the answer is: -- yes. ""Children are playing outside.""" -"Question: The answer to the question: What is the full name of the man who works for a chemical business? is inside the article: Gloria Wandrous wakes up in the apartment of wealthy executive Weston Liggett and finds that he has left her $250. An insulted Gloria, whose dress is torn, takes Liggett's wife Emily's (Dina Merrill) mink coat to cover herself and scrawls ""No Sale"" in lipstick on the mirror, but she orders her telephone answering service, BUtterfield 8, to put Liggett through if he calls. Gloria visits a childhood friend, pianist Steve Carpenter, who chastises her for wasting her life on one-night stands but agrees to ask his girlfriend Norma to lend her a dress. Gloria leaves, and Norma tells Steve to choose between her and Gloria. Liggett takes a train to the countryside where his wife Emily is caring for her mother. A friend, Bingham Smith, advises him to end his adulterous relationships and return to Bing's law firm instead of working for the chemical business of Emily's father. Meanwhile, Gloria lies to her mother Annie, claiming to have spent the night at Norma's. Liggett returns home. Finding the lipstick and money, he phones Gloria to explain the money was meant for her to buy a new dress, to replace the one that he had torn. While drinking later that night, Liggett advises her to ask a high price for her lovemaking talents. She insists she does not take payment from her dates and claims she has been hired as a model to advertise the dress she is wearing at three bistros that night. Liggett follows Gloria, watching her flirt with dozens of men at several clubs. He then drives her to a run-down motel. After sleeping together, Liggett and Gloria decide to explore their relationship further. Together for five days, they grow closer, falling genuinely in love with one another and parting only upon the return of Liggett's wife., can you guess it ? -Answer:",The full name of the man who works for a chemical business in the provided article is Weston Liggett. -"Here is a goal: To hold down a keyboard note without using your hands, - -How would you accomplish this goal?","To accomplish the goal of holding down a keyboard note without using your hands, I would perform the following steps: - -Step 1: Assess the situation -First, I need to understand the setup. Identify the type of keyboard (musical or computer keyboard) and the specific key that needs to be held down. - -Step 2: Choose a suitable object -Find an object that can provide enough weight to press down the key, ensuring that it's not too heavy that it might damage the keyboard. Some examples of objects that may work are a small book, an eraser, or a small, flat object with some heft. - -Step 3: Clean the object -Before placing the object on the keyboard, clean it so it doesn't leave any dirt or debris on the keys. - -Step 4: Position the object carefully -Carefully place the object exactly over the key that needs to be held down. Make sure that it only prunners the desired key and doesn't accidentally press any of the adjacent keys. - -Step 5: Test the result -Once the object is placed correctly over the key, check to see if the key is being held down successfully. If it's not pressed down enough or it's pressing other keys, reposition the object accordingly. - -Step 6: Monitoring the situation -Periodically check on the setup to ensure the keyboard is functioning correctly and that the object hasn't moved or fallen off. - -In these steps, I have successfully managed to hold down a keyboard note without using my hands by utilizing a suitable object as a substitute to apply weight on the key." -"Are these paraphrases? -The 1945 Victorian state election was held in the Australian state of Victoria on Saturday 10 November 1945 to elect 65 members of the state 's Legislative Assembly . -The Victorian state election of 1945 was held on Saturday , November 10 , 1945 , in the Australian state of Victoria , to elect 65 members of the state ’ s legislative assembly . - -Available options: A. no. B. yes.","B. yes. - -Both sentences are saying the same thing but in a little bit different ways - like when you and your friend both tell the same story, but you use different words and maybe switch up the order of the details. This is what we call a paraphrase. So yes, these two examples are indeed paraphrases." -"Please answer the following question: Process: - Human beings burn fossil fuels (oil, gas, etc.) - Carbon dioxide from the burning fossil fuels enter the atmosphere - The make-up of the atmosphere changes - Some energy from the sun cannot escape back through the changed atmosphere - The earth begins to heat because of the extra trapped energy - Human beings cut down trees - Human beings do not re-plant the trees - Trees cannot help take the extra carbon dioxide from the atmosphere - The extra trapped energy starts to change the earth's short term weather - Eventually the long-term climate patterns start to change - Perturbation hypothesis: suppose more conservation occurs happens, how will it affect more deforestation occurs. Does the supposed perturbation have an effect (direct or indirect) on the process? -A:","Yes, the perturbation hypothesis does have an indirect effect on the process. If more conservation occurs, it means that there will be increased efforts to protect and preserve natural resources, ecosystems, and biodiversity. This can lead to greater awareness and implementation of sustainable practices such as reforestation, limiting deforestation, reducing the use of fossil fuels, and promoting alternative energy sources. - -As a result, the process would be affected in the following ways: -- Reduced deforestation means more trees to help absorb carbon dioxide from the atmosphere, helping to mitigate climate change. -- Promotion of alternative energy sources can help reduce dependency on fossil fuels, leading to less burning and release of carbon dioxide. -- Reforestation efforts can help increase the overall number of trees on the planet, which will absorb more carbon dioxide and release oxygen, contributing to a more stabilized atmosphere. - -In conclusion, increased conservation efforts can have an indirect effect on the process by mitigating some of the negative consequences of human activities on the environment, such as deforestation and the burning of fossil fuels. These actions can help contribute to slowing down and potentially reversing climate change and its impact on the earth's short-term weather patterns and long-term climate patterns." -Generate a context and a hypothesis.,"Alright, sweetie, let's invent a little story and make a guess about it! - -Context (Story): Imagine that there's a big beautiful garden with lots of flowers and trees. In this garden, there is a magical goose named Gigi who lays golden eggs. Every day, Gigi takes a walk through the garden and eats the tasteful leaves that grow there. - -Hypothesis (Guess): Now, let's make a guess about our story. Our guess could be that Gigi, the magical goose, lays more golden eggs when she eats the tasty leaves from the garden. - -That's it, darling! We have a little story about a magical goose and a guess about what might happen when she eats the garden leaves. If you want more, just let me know!" -"Teacher:Given a sentence in the Japanese, provide an equivalent translation in Bahasa Indonesia that retains the same meaning through the translation. In translation, keep numbers as it is. -Teacher: Now, understand the problem? Solve this instance: それにもかかわらず、シエラレオネの国家保健制度は、簡単な診察が伴ったすべての処置に対し、収入の25日分の支払いを要求する。 -Student:","Part #1: Translate a sentence from Japanese to Bahasa Indonesia. -Usage: ""それにもかかわらず"" translates to ""Namun demikian"" in Bahasa Indonesia. This part is about providing an equivalent meaning for a given Japanese phrase/word in Bahasa Indonesia. - -Part #2: Retain the same meaning through the translation. -Usage: ""シエラレオネの国家保健制度"" translates to ""sistem kesehatan nasional Sierra Leone"" in Bahasa Indonesia, retaining the meaning of ""national healthcare system of Sierra Leone."" This part ensures that the meaning does not get lost in translation. - -Part #3: Keep numbers as it is. -Usage: In the original sentence, the number ""25"" should be kept as ""25"" in the Bahasa Indonesia translation. This part is a constraint to make sure numerical values remain unchanged during the translation. - -Student: Namun demikian, sistem kesehatan nasional Sierra Leone mengharuskan pembayaran sebesar 25 hari pendapatan untuk setiap prosedur yang melibatkan pemeriksaan sederhana. - -I think the translation meets the instruction because it translates the sentence from Japanese to Bahasa Indonesia, retains the same meaning, and keeps the number ""25"" unchanged." -"Article: This also helps you perform well and appear accomplished, which makes you seem more professional. Plan ahead, and build your knowledge base about the topics you’re studying for work or school. Additionally, get all of your assignments finished before they’re due. Keep a planner or use the calendar in your phone to help yourself stay on top of things. Maintain good posture by standing up straight and pressing your shoulders back. Smile, keep your arms at your sides, and look at your surroundings. When you talk to people, focus on your talents and achievements, not your flaws. If you want to increase your confidence, do something small every day that makes you feel accomplished. You can also do more things you enjoy and take calculated risks. For example, you might try out for a sports team, enter an art show, or volunteer to take the lead on a project. Punctuality is essential if you want to appear serious and professional. Always be on time or early for things. Set an alarm or calendar entry on your phone to help you remember when you need to be places. Everyone encounters obstacles at one time or another. If you’re going to be late due to an emergency or unforeseen event, call ahead and let people know. Say exactly what you mean, and ask for what you need. Always be kind and respectful when you provide feedback, but don’t be vague because you think it will spare someone’s feelings. Additionally, don’t say more than you need to say. Don’t expect people to guess what you’re thinking. If it’s important, just tell them. Let's say you're working on a group project and think one person is holding up your progress. You might say, ""Our group project is coming along, but I'm worried you aren't going to be finished with your part on time. Can you get it finished by tomorrow?"" Avoid meaningless chatter, as talking too much can make people see you as unprofessional. Additionally, speaking less often will make your words carry more impact. Keep it professional by only sharing your best thoughts and ideas. For example, don’t add to workplace gossip or chat about topics like TV shows and sports. However, do speak up when you know the answer to a question or when you have a great idea to share. Appearing to be unsure can make you look unprofessional or flaky. At the same time, you’re not going to have all of the answers. To protect your image, respond positively but buy yourself some time to think about what you’ll do or say next. You might say, “That’s a really great point. I’m going to think that over today and get back to you tomorrow with my response,” or “I appreciate your feedback. It’s given me a lot to think about.” Talking about your personal life too often or at the wrong times can make you look less professional. At the same time, talking about your life may help you bond with others. Choose the right times to share personal details about yourself, such as during lunch, breaks, and post-work or after-school events. During work hours or class, stick to topics related to work or school, as well as current events. Similarly, don’t gossip about others’ personal lives. People may perceive you as immature and unprofessional. If your friends or coworkers are gossiping, change the subject. You might say, “All I’m thinking about right now is our project that’s due next week. Have any of you started?” Do what you say you’ll do, when you say you’ll do it. Write all of your tasks and appointments in a planner or the calendar in your phone to keep track of everything. That way, nothing will be forgotten. If you don’t follow through, people won’t respect you because they’ll perceive you as being immature and unprofessional. - -What is a summary?","A summary of the article entails the importance of appearing professional, maintaining productivity, and building confidence to succeed in work or school environments. Some key points include planning ahead, staying organized, punctuality, clear communication, avoiding gossip and trivial conversations, managing personal disclosures, and being reliable. By practicing these habits and maintaining a positive attitude, one can establish a professional image, gain respect, and ultimately improve their performance in work or school settings." -"Q:The U.S. Congress is one step closer to averting a government shutdown Thursday after the U.S. House easily passed a $1.3 trillion spending plan that would end months of the government operating under short-term spending bills. The measure, approved by a 256-167 vote, now goes to the Senate, which has until midnight Friday to approve it and avert the year’s third government closure. The massive bipartisan bill would keep the government funded until the end of September. Lawmakers had just hours to read the nearly 2,200-page bill released Wednesday night. Under Senate rules, a single senator can delay the vote but not stop it entirely. Senator Rand Paul has objected to the short time given to members to read the lengthy legislation. As of Thursday afternoon, the Senate was waiting to see how the vote would proceed, raising the prospect of another brief government shutdown. With midterm elections looming in November, the bill likely marks the final time Capitol Hill will consider major legislation this year. The measure would fulfill President Donald Trump’s vow to boost military funding but provides funding for limited parts of his immigration agenda. The bill, which the White House said Trump supports, would give Trump a huge budget increase for the military, including a 2.4 percent pay raise for military personnel. “Today marks the beginning of a new era for the United States military,” House Speaker Paul Ryan said in a statement Thursday. “This legislation fulfills our pledge to rebuild the United States military.” After extensive negotiations between Republicans and Democrats, the bill also provides $1.6 billion for physical barriers and 150 kilometers (93 miles) of a wall at the U.S.-Mexico border, short of the $25 billion Trump requested for the project he repeatedly touted on the campaign trail while pledging Mexico would pick up the cost. Who's immigration agenda has funding for limited parts of it? Pick the correct answer from the following options: - Trump - Mexicans - Lawmakers - not enough information -A:",The immigration agenda with funding for limited parts of it belongs to President Donald Trump. -What is an example of a tweet?,"A tweet is a message posted on the social media platform Twitter, limited to 280 characters, which allows users to share their thoughts, opinions, news, or updates with their followers. Tweets can include hashtags (#), mentions (@), images, GIFs, and videos. Here's a detailed example of a tweet that one might see on Twitter: - -Username: @JaneDoeTraveler -Display Name: Jane Doe | Globe Trotter - -Tweet: - -""Finally made it to #Paris after years of dreaming about this trip! 🇫🇷 Here's a picture of the iconic Eiffel Tower at sunset. Breathtaking and truly a sight to behold! 🌇🗼 Next stop: trying some authentic #croissant and #escargot at a local patisserie! 😋 Bon appétit! 🥐🐌 #travel #bucketlist"" - -In this example, the user, whose handle is @JaneDoeTraveler, has traveled to Paris and wants to share her experience with her followers. She includes a personal anecdote along with relevant hashtags in her tweet to engage fellow travelers and make her post more discoverable. The hashtags are used to categorize the topic of her tweet. In this case, her hashtags are #Paris, #croissant, #escargot, #travel, and #bucketlist. These hashtags can exponentially expand her tweet's reach and connect her to other people who might be interested in the same topics. - -Moreover, Jane has included emoticons and reactions typical of a casual social media post to better convey her emotions and connect with her followers on a personal level. She has also mentioned trying French cuisine and expressed excitement about her upcoming culinary adventure. - -The tweet incorporates various elements that reflect a typical tweet example: personal experiences, hashtags, relevant emoticons, and a blend of text and media components to effectively convey the message and emotions behind the user's experience." -Generate a movie review with positive sentiment.,"Title: The Visionary Voyage - -Movie Review: - -The Visionary Voyage is a film that elevates the art of cinema to new heights, leaving a lasting impression on its viewers. The movie, both a visual and emotional masterpiece, stands as a testament to the genius of the passionate cast and crew that furnished this exceptional tale. - -Directed by the brilliant Samantha Wilson, The Visionary Voyage invites its audience on a heartwarming journey. Wilson's unmistakable ability to craft vivid and enchanting worlds with an inspiring message is unequivocally evident in this cinematic triumph. The picturesque beauty of the film's panoramic landscapes and the stunning attention to detail attest to Wilson's love of her craft, making every scene delightfully immersive. - -The film tells the story of Adam, an aspiring young artist who embarks on a voyage to a mysterious land that lives between the lines of dreams and reality. As he navigates the uncharted terrain, he learns to delve deep within himself and confront his fears to unlock his potential. The movie's mesmerizing narrative is further enhanced by a cast of vividly drawn, complex characters who provide depth to the narrative. - -The remarkable performances by the talented ensemble are a testament to their dedication and passion towards their craft. Tom Hanks delivers a truly commendable portrayal of Adam, captivating the audience with his powerful and insightful rendition of the character. Hanks' skillful emotional range and undeniable on-screen charisma consistently transport viewers into the heart of Adam's journey. - -Moreover, the supporting cast of Meryl Streep, Andrew Garfield, and Emma Stone provide stellar performances that add dimension to the narrative, expertly balancing poignant exchanges with touches of affectionate humor. The on-screen chemistry between these talented actors is both heartening and authentic, adding layers of emotional depth to the viewing experience. - -Not to be overlooked, the film's soundtrack is a melodious triumph composed by the gifted Hans Zimmer. The combination of sweeping orchestral arrangements and entrancing melodies forms a breathtakingly sonic landscape that brings The Visionary Voyage to life, accentuating the emotions conveyed on-screen. - -Furthermore, the subtle incorporation of spellbinding visual effects and breathtaking cinematography contribute significantly to the viewer's immersion in the fantastical world depicted in the film. Every frame of the movie is a tribute to the seamless symbiosis between Wilson's creative vision and the mastery of the film's technical team. - -The Visionary Voyage also carries an underlying message of embracing one's vulnerability and conquering fear. The film's universal appeal is a testament to its capacity to resonate with audiences across demographics. - -In conclusion, The Visionary Voyage is a rare gem of cinema that succeeds in blending visual enchantment and inspiring storytelling. The visionary director, Samantha Wilson, alongside the phenomenal cast and crew, create a mesmerizing experience that will undoubtedly leave its viewers contemplating the significance of embracing their fears and realizing their potential for a long time to come." -"Please answer the following question: On a scale of 1-5 (with 1 being least favorable and 5 being most favorable), how would you rate this review? ""ya ya ya"" -Answer:","Based on the limited information provided in the review, I would rate this review a 1 on the scale of 1-5, with 1 being the least favorable and 5 being the most favorable. - -There are a few reasons for this rating: - -1. Lack of specificity: A helpful review provides specific and clear feedback on the product or service being reviewed. The comment ""ya ya ya"" lacks any context or details about the user's experience, making it difficult for other users to understand the basis of the reviewer's opinion. - -2. No elaboration: A substantial review should include information about what the reviewer liked or disliked, and why. This helps other users to make an informed decision based on the reviewer's experiences. The phrase ""ya ya ya"" is vague and does not provide any insight into the reviewer's thoughts. - -3. Ambiguity: The review should convey the reviewer's stance - whether positive, negative, or neutral - to provide a clear interpretation of their experience. The reviewer's intended tone with ""ya ya ya"" is unclear. Are they expressing enthusiasm and satisfaction (a positive rating) or sarcasm and dissatisfaction (a negative rating)? This lack of clarity leaves potential customers unsure of the review's intended meaning. - -In conclusion, this review is not helpful or informative for those seeking an understanding of other users' experiences with the product or service in question. To be more favorable and beneficial, the reviewer would need to provide specific details about their experience, offer constructive feedback, and clearly convey their overall opinion." -"Please answer the following question by reasoning step-by-step. Given the sentence ""A tractor loaded with parts is moving across a barren area outside."" can we conclude that ""An empty tractor parked inside a garage.""? -Options: -- yes -- it is not possible to tell -- no. Step-by-step reasoning:","- no. - -Step-by-step reasoning: - -1. The given sentence describes a tractor that is ""loaded with parts,"" while the conclusion statement refers to an ""empty tractor."" These two descriptions are contradictory; thus, we cannot conclude an empty tractor when it is stated to be loaded with parts. - -2. The given sentence states that the tractor is ""moving across a barren area outside."" Contrary to this, the conclusion statement claims that the tractor is ""parked inside a garage."" The statements describe two different locations and situations for the tractor. One is outside and moving, and the other is inside and parked. - -Based on these discrepancies, we cannot conclude that ""An empty tractor parked inside a garage"" from the given sentence." -"How does the sentence end? - -Megan had much thicker skin than Rebecca so -Possible answers: A). Megan was saddened by people's vile insults.; B). Rebecca was saddened by people's vile insults.;","B). Rebecca was saddened by people's vile insults. - -Here's why: ""Thicker skin"" is a way to say that someone is better at not letting mean words or actions upset them. So if Megan has ""thicker skin"" than Rebecca, that means Megan is better at not getting upset by mean words. So, Rebecca, who doesn't have as ""thick skin"" as Megan, would be the one who is more likely to be saddened by people's mean or nasty comments." -Write a sentence not in English.,"Voici une phrase en français: ""Le chat mange la souris."" - -Explication pour un enfant de cinq ans: Cette phrase n'est pas en anglais, mais en français. Elle dit que le chat (l'animal avec des moustaches et qui dit ""miaou"") mange la souris (un petit animal avec une longue queue)." -"Please answer the following question: Read the following paragraph and extract the answer for the question: What gender of the Perijá tapaculo have brown on the back of their legs and whitish on the front? The Perijá tapaculo is a small bird, 10 to 12 cm (3.9 to 4.7 in) in length with an average mass of 17 to 18 grams (around 0.6 oz). The bill averages 6.8 millimetres (0.27 inches) long, 2.9 mm (0.11 in) wide, and 3.5 mm (0.14 in) high. The legs are about 21 mm (0.83 in) long. The Perijá tapaculo's tarsus averages 21.1 millimetres (0.83 in) long. The wings measure 57.4 mm (2.26 in) on average and the tail is about 40 mm (1.6 in) long with between 8 and 12 rectrices.The forehead, lores, crown, mantle, and scapular area are a neutral grey colour. There is a brown spot on the nape. The top of the tail is brown, and the bottom is faintly striped brown. The bird's back and rump are striped brown-sepia, and the throat, breast, and belly are grey-white. Its lower belly and flanks are tawny. The iris is dark brown. Male specimens are distinguished by having less sharp brown spots on their napes, and the bottom of their breasts are mixed with a pale buff colour. The legs are brown on the back and whitish on the front. Young birds have a yellowish appearance with striped brown flanks.The bird's plumage colouration is most similar to the pale-bellied tapaculo. The S. g. morenoi subspecies of the pale-bellied tapaculo can be differentiated from the Perijá tapaculo by its entirely brown back and nape, and its different calls. Juveniles of this subspecies have a dull ventral plumage, while the Perijá tapaculo has a more yellow plumage. It also resembles the Caracas tapaculo but has a duller ventral colour. -A:",Male specimens of the Perijá tapaculo have brown on the back of their legs and whitish on the front. -"Juzo Murasaki arrives at a work construction area to take on his new job as a construction worker . To his quiet dismay , his supervising boss turns out to be Toru Akai , who with his gang had made Juzo's middle school life a living hell . Akai , however , does n't recognize Juzo . Juzo's more disconcerted when he discovers that Akai lives with his wife , Nozomi Akai and their toddler son above Juzo's new apartment . As Juzo emotionally struggles to handle these unexpected developments , a mysterious and seemingly malicious hooded figure appears . It calls itself Number 13 . As Juzo attempts to control increasing number of flashbacks and a spiral fall into psychological darkness , Akai constantly picks on Juzo and other work colleagues including Seki Hajime , a former middle school student who becomes Juzo's casual friend in spite of Juzo's anti-social tendencies , at work . Meanwhile Akai's wife , Nozomi , attempts to make friends with Juzo and entrusting the care of her toddler son to Juzo . She proudly shows Juzo her husband's school photos . In one class photo , Juzo's space is marked with an X to show he was absent . Juzo suffers a severe flashback to explain his absence that day : in their school's science room , Akai and his friends have thrown acid at Juzo's face . Seki becomes suspicious about Juzo's increasingly odd behavior and goes to inform Arai at the work site , but Arai dismisses him without giving him a chance to speak . During this incident , Seki does n't realize he's being watched by Number 13 , but as soon as he does , Number 13 kills him . - -Question: ""What is Seki's relationship with Juzo?"" - -Answer: ""Lozu's child"" - -Is this answer correct?","No, the answer is not correct. - -The correct answer would be: Seki Hajime is a former middle school student who becomes Juzo's casual friend at the construction site despite Juzo's anti-social tendencies." -"Do these two sentences mean the same thing? -The artists say the plan will harm French culture and punish those who need help most--performers who have a hard time lining up work . -Artists are worried the plan would harm those who need help most - performers who have a difficult time lining up shows . - -Select from the following. - -no - -yes...I think the answer is","Yes, both sentences convey the same meaning, although they are worded differently. The main idea communicated in both sentences is that artists are concerned about a plan that they believe would negatively impact French culture and hurt the individuals who require the most assistance - the performers who struggle to secure consistent work or shows. The essence of the message remains the same, expressing the artists' apprehensions concerning the potential harm the plan could cause to the culture and the performer's livelihood." -"- The pressure causes plates to move - Magma explodes to the surface - The lava from the eruption cools to form new crust - After several eruptions, the rock builds up and a volcano forms - What might be the first step of the process? -The answer to this question is:",The first step of the process is the pressure causes plates to move. -" - -Jordan called their grandparents after the car broke down on the highway. Given the context: How would you describe Jordan? -Answer:",Jordan can be described as someone who is resourceful and knows to reach out for help when in a difficult situation. It's likely they have a good relationship with their grandparents and trust them enough to call them in an emergency situation. -"Generate a sentence about this data: Blue Spice eatType restaurant; Blue Spice priceRange £20-25; Blue Spice customer rating high; Blue Spice area riverside; Blue Spice familyFriendly yes -Sentence:",Blue Spice is a restaurant by the river where families can enjoy yummy food for £20-25 and people are really happy with it. -"The 28-year-old has not competed since winning World Championship gold in Germany in March 2015. -""I've come back feeling refreshed, recharged and ready to give it my all again,"" said Yarnold. -Former GB sprinter Mark Lewis-Francis is set to make his World Cup debut in the four-man bobsleigh in Whistler. -Lamin Deen leads the four-man crew, which also includes Andrew Matthews and Tremayne Gilling. -Former England Rugby Sevens star Sam Blanchet is joined in the two-man bobsleigh by Welsh pilot Bruce Tasker. -Tasker is joined by fellow Welsh competitors Laura Deas, in the skeleton, and Mica Moore. -Commonwealth Games sprint relay finalist Moore, from Newport, will make her World Cup debut alongside pilot Mica McNeil in the women's bobsleigh sled. -Great Britain Bobsleigh performance director Gary Anderson said: ""The message I've got from other nations is that they are looking to see what Great Britain have done and they want to pitch themselves against us. That's very positive news for me."" -Yarnold, who won Olympic goal at Sochi 2014, also claimed European and overall World Cup titles before announcing in September 2015 that she was taking a year out from the sport. -The three-day World Cup in Canada, which starts on Friday, is the first of eight in the 2016-17 season. -What is a summary of this text?","Olympic champion Lizzy Yarnold is set to return to international competition in the skeleton at the upcoming World Cup event in Whistler, Canada. The 28-year-old has not competed since winning the World Championship gold in Germany in 2015, but she feels refreshed and ready to give her all in the competition. The event will also feature other notable British athletes, including former GB sprinter Mark Lewis-Francis making his World Cup debut in the four-man bobsleigh, and Commonwealth Games sprint relay finalist Mica Moore making her debut in the women's bobsleigh sled. The three-day World Cup in Canada marks the first of eight events in the 2016-17 season." -"I am trying to decide whether it's worth it to invest in this film proposal. Can you help me answer a few questions? If you can't, please say ""No I can't"". Question: Where does the policeman shoot Erin? Movie title: You're Next Movie plot: The film opens with a couple being murdered in their house by assailants wearing various animal masks. Erin accompanies her boyfriend Crispian Davison to his family reunion at their rural Missouri vacation home, adjacent to the property of the murdered couple. Present are Crispian's parents Aubrey and Paul, his older brother Drake and Drake's wife Kelly, his younger siblings Felix and Aimee, Felix's girlfriend Zee, and Aimee's boyfriend Tariq. During an argument at the dinner table between Drake and Crispian, Tariq and Drake are shot by crossbow bolts from outside the house, Tariq fatally and Drake moderately wounded. With their cell phone signals jammed by the attackers, Aimee runs out the front door to get help, but runs into a garrote wire which slashes her throat. Crispian leaves the house to find help. Aubrey is brought upstairs to her bedroom by Paul; when Paul leaves the room, Fox Mask appears from under the bed and kills Aubrey. The rest of the family rushes upstairs to find Aubrey dead with the words ""You're next"" scrawled on the wall in blood. Erin begins securing the house and texts 911. She encounters Tiger Mask and evades his attack, wounding him in the process. Kelly returns to the bedroom and discovers Fox Mask still hiding under the bed. She panics and runs to the neighboring home. After pounding on the window for help, she gets inside but discovers the murdered couple and is soon killed by a maul-wielding Lamb Mask. Back at the house, Tiger Mask once again fails to murder Erin and is in turn killed by her with a meat tenderizer; it is later revealed that Tiger Mask is actually Lamb Mask's brother. Lamb Mask finds Drake, but Erin stabs him with a screwdriver and he retreats. While exploring the house, Paul finds evidence that the killers had been staying in the house for a while. He tries to tell Zee and Felix, but Fox Mask appears from behind and slashes his throat. It is revealed that Felix and Zee hired the assassins to murder the family and collect their inheritance. Felix lures Drake to... -Answer:",No I can't -"In June 1916, the British sent out a number of officials to assist the revolt in the Hejaz, most notably Colonel Cyril Wilson, Colonel Pierce C. Joyce, and Lt-Colonel Stewart Francis Newcombe. Herbert Garland was also involved. In addition, a French military mission commanded by Colonel Edouard Brémond was sent out. The French enjoyed an advantage over the British in that they included a number of Muslim officers such as Captain Muhammand Ould Ali Raho, Claude Prost, and Laurent Depui . Captain Rosario Pisani of the French Army, though not a Muslim, also played a notable role in the revolt as an engineering and artillery officer with the Arab Northern Army. The British government in Egypt sent a young officer, Captain T. E. Lawrence, to work with the Hashemite forces in the Hejaz in October 1916. The British historian David Murphy wrote that though Lawrence was just one out of many British and French officers serving in Arabia, historians often write as though it was Lawrence alone who represented the Allied cause in Arabia. David Hogarth credited Gertrude Bell for much of the success of the Arab Revolt. She had travelled extensively in the Middle East since 1888, after graduating from Oxford with a First in Modern History. Bell had met Sheikh Harb of the Howeitat in January 1914 and thus was able to provide a ""mass of information"" which was crucial to the success of Lawrence's occupation of Aqaba covering the ""tribal elements ranging between the Hejaz Railway and the Nefud, particularly about the Howeitat group."" It was this information, Hogarth emphasized, which ""Lawrence, relying on her reports, made signal use of in the Arab campaigns of 1917 and 1918."" - -Answer this question based on the article: Which army had more Mulim officer, the English or the French?","Based on the article, the French army had more Muslim officers than the English army during the Arab Revolt in the Hejaz. Notable Muslim officers in the French military mission included Captain Muhammand Ould Ali Raho, Claude Prost, and Laurent Depui." -"Single/multi-select question: If ""Two people are wearing a Chinese dragon costume in front of an ornate Chinese gazebo with red pillars and the gazebo has two large red lanterns hanging from the roof."", can we conclude ""The people are celebrating Chinese New Year.""? - - a). yes. b). it is not possible to tell. c). no.","b). It is not possible to tell. - -The given scenario mentions that two people are wearing a Chinese dragon costume in front of an ornate Chinese gazebo with red pillars, and there are two large red lanterns hanging from the roof. While these elements are commonly associated with Chinese New Year celebrations, we cannot conclusively determine that the people are celebrating Chinese New Year for several reasons: - -1. Chinese dragon costumes and red lanterns are symbolic representations used during various cultural and traditional events in China, not just Chinese New Year. For example, they may appear in Mid-Autumn Festival celebrations, weddings, or even business openings. - -2. The Chinese dragon costume could be part of a performance or dance that is not explicitly related to Chinese New Year. The dragon dance, for instance, is performed in several other occasions to bring good fortune and chase away evil spirits. Similarly, red lanterns are considered a symbol of happiness and prosperity and can be used as decorations throughout the year. - -3. The context of the event or location isn't provided. For example, the scenario could take place at a multicultural festival or a theme park, where costumes and decorations from various cultures are showcased regardless of the time of year. - -4. Even if the event seems to include elements that are traditionally associated with Chinese New Year, the people might still be part of a cultural performance or using the decorations for other purposes, such as an art exhibition, photoshoot, or a stage play. - -In summary, while the scenario described provides certain hints towards Chinese New Year celebration, we cannot decisively conclude that the people are celebrating it without additional information or context. Thus, the best answer is ""it is not possible to tell.""" -"Randy was not doing housework. His wife was raising two children, and this only increased her workload. It put her under a lot of stress. What might this lead to? -Options: -- asthma -- more -- boredom -- headache -- arguments Let's think step by step:","Randy's lack of contribution to housework puts additional responsibilities on his wife, who is already raising two children. This increase in her workload could lead to stress, both physical and emotional. Let's analyze the options: - -1. Asthma: Asthma is generally not caused by stress. It is a chronic lung disease and results from a combination of genetic and environmental factors. While stress can potentially trigger asthma symptoms in some cases, it is not a direct consequence of the given situation. - -2. More: It seems this option is incomplete or unclear. Without any context, we cannot determine what ""more"" may refer to. - -3. Boredom: Boredom would be unlikely in this situation, as the wife is dealing with a heavier workload and increased responsibilities. This would leave her with little time to feel bored, as most of her time would be occupied with housework and childcare. - -4. Headache: Stress can indeed lead to headaches, which can be caused by tension, muscle strain, or hormonal changes. In the given situation, the wife's increased stress and workload may contribute to the development of headaches. - -5. Arguments: The imbalance in shared responsibilities between Randy and his wife could likely lead to arguments and tension in their relationship. The wife may feel overwhelmed and resentful due to the unfair distribution of housework, leading to disagreements and strife in the family. - -Based on this analysis, the most plausible outcomes of Randy not doing housework while his wife raises two children are headaches and arguments. These issues could arise from the increased stress, tension, and the unfair division of labor within their household." -"Title: Next to useless if you actually want to learn to use VTK Product review: If you're looking for a book to learn to use VTK, this is practically useless. The language is explained only incidentally, and in very little detail. the book mostly concentrates on computer graphics theory (which is done much better in other books) and visualisation, which it treats fairly well. Would you say this review depicts the product in a flattering or unflattering light? -Answer:","This review depicts the product in an unflattering light. - -Step 1: Identifying the overall tone of the review -The reviewer uses phrases such as ""practically useless,"" ""very little detail,"" and ""done much better in other books."" These phrases indicate a negative tone. - -Step 2: Analyzing the content of the review -The reviewer mentions that the book does not effectively teach how to use VTK and lacks detail in explaining the language. They also say that while computer graphics theory and visualization are covered, they are done better in other books. - -Step 3: Conclusion -Based on the negative tone and critical content of the review, it is clear that the review depicts the product in an unflattering light." -"Translate the following sentence to Russian: -Would you completely bet that it couldn't usurp Google, given time?","To translate the given sentence into Russian, I'll analyze the sentence structure and words, identify the Russian counterparts, and then construct the Russian sentence while following the correct grammar and syntax rules. - -English sentence: Would you completely bet that it couldn't usurp Google, given time? - -Translation process: -- ""Would you"" is a question construction that, in Russian, translates as ""Вы бы"" or ""Ты бы"" (the formal and informal ways to address ""you,"" respectively; I'll go with the formal version) -- ""completely bet"" can be translated as ""полностью поспорили"" -- ""that"" as a conjunction introducing a clause can be translated as ""что"" -- ""it"" can be translated as ""он"" or ""она"" (masculine and feminine; in this case, I'll use the neuter form for an object or idea: ""оно"") -- ""couldn't"" is a contraction of ""could not,"" which translates as ""не смогло бы"" -- ""usurp"" can be translated as ""свергнуть"" or ""заменить""; I'll go with "" заменить,"" which means ""replace"" and captures the idea of gaining power or supremacy -- ""Google"" remains the same since it's a proper noun -- ""given time"" can be translated as ""со временем"" - -Now, I'll construct the Russian sentence while following correct grammar and syntax rules. - -Russian sentence: Вы бы полностью поспорили, что оно не смогло бы заменить Google со временем? - -The sentence has now been translated into Russian." -"Lizzy: Tree Elementary School is raising money for a new playground. Mrs. Johnson’s class raised $2300, which is twice the amount that Mrs. Sutton’s class raised. Mrs. Sutton’s class raised 8 times less than Miss Rollin’s class. Miss Rollin’s class raised a third of the total amount raised by the school. How much money did the school raise for the playground if 2% will be deducted for administration fees?. -Me: Hmmm, let me think. I think this is the detailed solution:","Step 1: Find out how much Mrs. Sutton's class raised. Since Mrs. Johnson's class raised $2300, and that is twice the amount that Mrs. Sutton's class raised, we can divide $2300 by 2 to find the amount Mrs. Sutton's class raised: -2300 ÷ 2 = $1150 - -Step 2: Find out how much Miss Rollin's class raised. Since Mrs. Sutton's class raised 8 times less than Miss Rollin's class, we can multiply the amount Mrs. Sutton's class raised by 8 to find the amount Miss Rollin's class raised: -1150 × 8 = $9200 - -Step 3: Find the total amount raised by the school before deducting the administration fees. Since Miss Rollin's class raised a third of the total amount, we can multiply the amount Miss Rollin's class raised by 3 to find the total amount raised by the school before deducting the fees: -9200 × 3 = $27,600 - -Step 4: Calculate the amount of administration fees that need to be deducted. Since 2% of the total amount raised will be deducted for administration fees, we multiply the total amount by 0.02 (2% as a decimal): -27,600 × 0.02 = $552 - -Step 5: Subtract the administration fees from the total amount raised to find the final amount raised for the playground: -27,600 - 552 = $27,048 - -So, Tree Elementary School raised a total of $27,048 for the new playground after deducting the 2% administration fees." -"I love old Burt Reynolds movies. They're funnier and better than every other movie combined. They might as well have stopped making movies after ""Cannonball Run 2"", but I guess how could they have known that there weren't going to be any more good ones? Man this movie's good. Burt Reynolds has to dress up like a chicken and drive around in a racecar a lot, and the luxuriant Loni Anderson is on hand, looking extremely hot in an eightiesly way. Burt and Loni, those were the days! I used to have this magazine that had Loni Anderson in it advertising for a vaccuum cleaner. I sure loved that advertisement! Plus there's this one part in the movie where the audience at the racetrack is upset at something Stroker Ace (Burty R.) is doing, and it shows one guy in the audience bending over and sticking his finger up his butt to display his disappointment! I laughed so hard I almost passed away into the night! If you can find this movie, rent it! And then never watch another movie again, because I tell you right now: there's no point. - -Did this review think positively or negatively of the movie (see options below)? -pick from the following. +negative. +positive....I think the answer is",+positive. -"What is a one-sentence summary of the following article? -You could go directly into the confessional (provided there's no one else in there or waiting outside), but sometimes it's nice to take a minute in the pew by yourself beforehand. You have this beautiful church probably almost all to yourself. Can you feel its energy resonating through you? Can you feel the majesty of the Lord's kingdom and how you're a part of it? Take a moment to kneel and pray with your head down and hands clasped together. Reflect on your faith and how you feel currently. Think about how you've been responding to God's call and how you've been living in the light of his love. When the priest is ready for you, of course. You'll probably see him there by his lonesome or someone else walk out just before you. Sit down either across from him or behind the screen -- it's totally up to you whether or not you prefer to remain anonymous. He won't treat you any differently either way. Make the sign of the cross upon his prompt, saying, ""Bless me, Father, for I have sinned. It has been (blank) since my last confession."" This is your standard, traditional phrasing. However, if you just sit down and say hello, that's fine, too. The priest knows what he's doing. The Byzantine Rite is a bit different. The priest may sit to your side and put his epitrachelion on your head. He may then also do the Prayer of Absolution. But the idea remains the exact same -- just go wherever he takes you. Once you sit down and you've made the sign of the cross, just sit back and follow the priest's lead. He'll ask you how long it's been since your last confession (if you don't voluntarily offer that information), how you are feeling, maybe how your faith is going, and then ask you what sins you would like to talk about with him and God. It's just a casual conversation! Do not fret. There is absolutely zero pressure on your part. Again, as long as you come there with the intention of leaving with a clean heart, you're more than welcome in the church. There is no wrong way to go about confession! This part is intimidating, but think about it this way: the priest you're talking to has probably heard just about everything before. Whatever you have to say will not blow his mind. So when he asks, start rattling them off, from the most serious to the least. If he asks any questions, answer them, but do not feel the need to go into detail. A simple, ""I did so and so,"" will suffice. Your priest is going to be very understanding. If you don't remember the exact timeframe, that's fine. If you don't remember your motivation, that's fine. All your priest cares about is that you're being as honest as possible and that your heart is in the right place. He'll talk you through everything, possibly asking about your intentions, but mainly just letting you know that God loves you, sin and all. If he has any ideas to bring you closer to God, he may suggest them at this juncture. He's there to help, after all. He will then ask you to make an Act of Contrition. That goes like this: My God, I am sorry for my sins with all my heart.In choosing to do wrong and failing to do good,I have sinned against You whom I should loveabove all things. I firmly intend, with your help,to do penance, to sin no more, andto avoid whatever leads me to sin.Our Savior Jesus Christ suffered and died for us.In his name, my God, have mercy (If you are a Roman Catholic, your act of contrition will go like this: Oh my God, I am very sorry for having offended thee. I detest all of my sins because of thy just punishment. But most of all, because they offend you, my God, who is all good and deserving of all my love. I firmly resolve with the help of thy grace, to sin no more, and to avoid the near occasion of sin. Amen. Don't worry! It won't be anything huge. You may even walk away just having to say a few meaningful prayers. Take the absolution to heart -- you now have a brand new, clean slate to work with. It'll feel so uplifting! Just to clarify, ""absolution"" means your sins are washed away. ""Penance"" is your expression of regret and repentance, showing God that you're truly sorry for what you've done and that you wish for nothing more than to be forgiven. - -Summary:","The article provides guidance on the process of confession in a church, emphasizing the importance of reflection, honest conversation with the priest, and the act of contrition for a meaningful and pressure-free experience, ultimately leading to absolution and spiritual growth." -"Determine the sentiment: - -We viewed the vcr and found it to be fascinating. Not knowing anything about this true story, I thought: ""Oh, no, P.Brosnan as an American Indian ('red' Indian in the film), what a bad choice"" until I discovered the truth about Grey Owl. The film does a good job of demonstrating the dignity of these native peoples and undermining the racist myths about them. And Annie Galipeau, WOW, what a beauty, and very convincing as an Indian woman (I believe she is French-Canadian; she sure reverts to the all-too familiar speech of such). In spite, of Brosnan's detached, grunting style, in the end he comes through convincingly as a passionate, dedicated man. The plot is a little weak in demostrating his conversion from trapper to animal coservationist. Good film, highly recommended.","This is a positive sentiment. The person might have had some doubts at the beginning, especially about P. Brosnan playing an American Indian, but in the end, they found the film fascinating and very good. They enjoyed the performances of the actors, especially Annie Galipeau, and appreciated the movie's portrayal of native peoples. Even though they thought the plot could have done a better job showing the character's change from a trapper to an animal conservationist, they still highly recommend the film. It's like when you try a new flavor of ice cream, even if you weren't sure about it at first, you end up really liking it and want your friends to try it too!" -"Mark is running for an election and wins 70% of the votes in an area with 100,000 voters. He got twice as many total votes in the remaining area. How many votes did he get in total? Let's think first. Chain of thought:","Step 1: Identify the number of votes Mark received in the first area. -We know that Mark won 70% of the votes in the first area with 100,000 voters. To determine the number of votes, we can multiply the percentage by the total number of voters. - -Step 2: Calculate the number of votes Mark received in the first area. -To find the number of votes Mark received in the first area, we can perform the following calculation: -(70 / 100) * 100,000 = 70,000 votes - -Step 3: Determine the number of votes Mark received in the remaining area. -According to the given information, Mark received twice as many total votes in the remaining area as he did in the first area. To calculate this number, we multiply the votes Mark received in the first area by 2. - -Step 4: Calculate the number of votes Mark received in the remaining area. -To find the number of votes Mark received in the remaining area, we can perform the following calculation: -70,000 votes * 2 = 140,000 votes - -Step 5: Calculate the total number of votes Mark received. -To find the total number of votes Mark received, we add the number of votes he received in both areas: -70,000 votes + 140,000 votes = 210,000 votes - -Therefore, Mark received a total of 210,000 votes in both areas." -"Continue the following story. - -It was far more damaging when the baseballs hit the house than the golf balls, because the ","baseballs were larger, heavier, and carried more force. The neighborhood kids had been playing in the field next to the old Johnson house when one of their hard hits had gone astray. This wasn't the first time something like this had happened but, today seemed much worse. - -Step 1: Assess the Damage -Before anything could be done, I needed to examine the extent of the damage caused by the baseballs. I went over to the Johnson house and saw shattered windows and dents in the wooden panels. Some parts of the house's exterior were bruised, and it was clear that immediate action was necessary. - -Step 2: Inform the Homeowner and Neighbors -It was essential to let Mr. Johnson know what had transpired, so I knocked on his door to inform him of the situation. After explaining the incident, I also spoke with the kids and their parents, making sure they understood the consequences of their actions and why they needed to be more careful while playing. - -Step 3: Organize a Cleanup and Repair -To mend the relationship between the neighborhood kids and Mr. Johnson and teach the kids a lesson about being responsible for their actions, I proposed a collaboration where they would aid in the cleanup and repair of the damaged house. The kids' parents agreed and expressed that it would instill a sense of accountability. - -Step 4: Gather Supplies -With the help of the parents, we gathered the necessary supplies for the repair work. This included windowpanes, wood filler, sandpaper, paint, and miscellaneous tools. The parents helped the kids in handling any heavy or potentially dangerous materials. - -Step 5: Perform the Cleanup and Repair -Under the supervision of the parents and myself, the kids began working on the repairs. They filled the dents in the wooden panels using wood filler, smoothed the surfaces with sandpaper, and, after drying, covered the spots with matching paint. They also assisted in replacing the shattered windows. Mr. Johnson also decided to join and guide them through the repair process, making the most of the situation. - -Step 6: Completion and Lessons Learnt -Once the task was completed, the house was in good shape, with all visible damage addressed. The kids learned the importance of being accountable for their actions and the impact they could have on other people's property. Mr. Johnson saw a silver lining – he had used this opportunity to build connections with the neighbors and teach the kids a valuable life lesson. - -By completing the task of continuing the story, I kept the spirit and focus on the implications of the baseballs causing damage and how the characters responded to the situation. I considered logical steps that would result in a balanced resolution, emphasizing the importance of accountability and communication." -"Given the question: I'm taking a test and have to guess the right answer to the question after the article. Article: Winter is dangerous because it's so difficult to know what is going to happen and accidents take place so easily. Fog can be waiting to meet you over the top of a hill. Ice might be hiding under the melting snow, waiting ahead to send you off the road. The car coming to you may suddenly slip across the road. Rule Number One for driving on icy roads is to drive smoothly . Sudden movements can make a car very difficult to control. So every time you either start or stop your car, increase or reduce your speed, you must be as gentle and slow as possible. Suppose you are driving with a full cup of hot coffee on the seat next to you. Drive so that you wouldn't spill it. Rule Number Two is to pay attention to what might happen. The more ice there is, the further down the road you have to look. Test how long it takes to gently stop your car. Remember that you may be driving more quickly than you think. Generally, allow twice of your usual stopping distance when the road is wet, three times this distance on snow, and even more on ice. Try to stay in control of your car at all times and you will not get into trouble. Question: The writer tries to _ in this passage. Options: A: show his dislikes about bad winter weather B: give information about winter weather C: ask people not to drive in winter D: advise people about safe driving in winter -The answer is:",D: advise people about safe driving in winter -"Q:Pomfret Plantation is a historic home located at Marion Somerset County Maryland United States. It is a two-story four room plan gable roofed frame house constructed between 1810 and 1830. A two-story hyphen joins an early-19th century kitchen wing to the main block. The property also includes a post-Civil War frame tenant house and a 19th-century Coulbourne family cemetery. Given a list of categories: company, educational institution, artist, athlete, office holder, mean of transportation, building, natural place, village, animal, plant, album, film or written work, what category does the paragraph belong to? -A:","The paragraph belongs to the ""building"" category, as it describes a historic home (Pomfret Plantation) and its location, construction, and additional structures on the property." -"Information: - Max Beckmann (February 12, 1884 December 27, 1950) was a German painter, draftsman, printmaker, sculptor, and writer. Although he is classified as an Expressionist artist, he rejected both the term and the movement. In the 1920s, he was associated with the New Objectivity (""Neue Sachlichkeit""), an outgrowth of Expressionism that opposed its introverted emotionalism. - Alexander Kanoldt ( 29 September 1881 -- 24 January 1939 ) was a German magic realist painter and one of the artists of the New Objectivity . Kanoldt was born in Karlsruhe . His father was the painter Edmond Kanoldt , a late practitioner of the Nazarene style . After studies at the Academy of Fine Arts Karlsruhe in Karlsruhe he went to Munich in 1908 , where he met a number of modernists such as Alexei Jawlensky , Wassily Kandinsky and Gabriele Münter . He became a member of the Munich New Secession in 1913 , with Jawlensky and Paul Klee . After military service in World War I from 1914 to 1918 , the still lifes Kanoldt painted show the influence of Derain and an adaptation of cubist ideas . By the early 1920s Kanoldt developed the manner for which he is best known , a magic realist rendering of potted plants , angular tins , fruit and mugs on tabletops . He also painted portraits in the same severe style , as well as geometrical landscapes . In 1925 he was made a professor at Breslau Academy , a post he held until 1931 . During this time he came into conflict with the Bauhaus faction at the Academy , and he was increasingly at odds with the avant garde . From 1933 until his resignation in 1936 he was the director of the State School of Art in Berlin . With the rise of the Nazi regime in 1933 Kanoldt attempted accommodation , painting in a romantic style , but nonetheless many of his works were seized by the authorities as degenerate art in 1937 . He died in Berlin in 1939 . - George Grosz (July 26, 1893 July 6, 1959) was a German artist known especially for his caricatural drawings and paintings of Berlin life in the 1920s. He was a prominent member of the Berlin Dada and New Objectivity group during the Weimar Republic. He emigrated to the United States in 1933, and became a naturalized citizen in 1938. Abandoning the style and subject matter of his earlier work, he exhibited regularly and taught for many years at the Art Students League of New York. In 1956 he returned to Berlin where he died. - The New Objectivity (in ) was a movement in German art that arose during the 1920s as a reaction against expressionism. The term was coined by Gustav Friedrich Hartlaub, the director of the in Mannheim, who used it as the title of an art exhibition staged in 1925 to showcase artists who were working in a post-expressionist spirit. As these artistswho included Max Beckmann, Otto Dix, and George Groszrejected the self-involvement and romantic longings of the expressionists, Weimar intellectuals in general made a call to arms for public collaboration, engagement, and rejection of romantic idealism. 'alexander kanoldt' is related to which object entity through the relation of 'movement'? Choices: - expressionism - new objectivity -","Alexander Kanoldt is related to the object entity 'New Objectivity' through the relation of 'movement'. New Objectivity was a movement in German art during the 1920s that was a reaction against Expressionism, and it focused on depicting objective reality rather than the emotional and introspective approach of Expressionism. Kanoldt was a German magic realist painter and one of the artists associated with the New Objectivity movement. His work included still lifes, portraits, and landscapes, which he rendered in a precise and geometric style, characteristic of the movement." -"Use the following highlights to write an article: - -Premier League managers earn an average of £3million a year. But Jose Mourinho leads the way in the top flight on £8.37m. League Two managers take home £50,000-a-year on average. League One bosses earn an average of £75,000-a-year. Only 4.4 per cent of managers appointed since 1992-93 are black.","Title: The Financial Landscape of Football Management: An Overview of Managerial Salaries and Diversity in English Football - -Introduction: - -The world of football management is a fascinating one, filled with unique challenges, high stakes, and the ever-present potential for glory or heartbreak. Over the years, the landscape of football management has undergone massive changes, not only in terms of tactics and style but also in the financial aspects of the profession. The money involved in football has skyrocketed, and the wages of the individuals in charge of guiding their teams to success have seen a similar rise. However, diversity in these managerial positions remains a challenge that must be addressed. This article seeks to provide a comprehensive overview of the financial landscape of football management in England, while also discussing the importance of increasing diversity in the sport. - -Income Disparity Among Managers Across Different Tiers: - -When discussing the financial aspect of football management, it's crucial to recognize the significant income disparities that exist across the different tiers of English football. At the top of the pyramid, the Premier League is undoubtedly the most lucrative, with managers raking in an average of £3 million per year. Among these Premier League managers, Jose Mourinho leads the pack with an annual salary of £8.37 million. - -In stark contrast, managers in the lower leagues of English football earn significantly less. In League One, the average manager earns £75,000 per year – a mere fraction of the wages made by their Premier League counterparts. For those in League Two, the financial situation is even more modest, with average yearly earnings of £50,000. - -These vast differences in salary can be attributed to a variety of factors, such as club revenue, size of fan base, and the financial prowess of the club's ownership. Nevertheless, this disparity in earnings highlights the vast gulf that exists between the footballing elite and the lower tiers - a divide that persists not only in wages but also in the resources available to clubs, playing staff, and facilities. - -Diversity Challenges: Underrepresentation of Black Managers - -While a discussion of the financial landscape of football management is of great interest, it's essential not to overlook the matter of diversity within the profession. As it stands, only 4.4% of managers appointed since the 1992-93 season are black, a figure that is troublingly low. - -The underrepresentation of black managers may be attributed to numerous factors, such as unconscious bias or the crippling effects of systemic racism. However, regardless of the reasons, this lack of representation poses a significant problem for both the sport and society as a whole. The lack of diversity within football management sends a disheartening message to black and minority coaches, potentially discouraging them from pursuing careers in this field. Moreover, it perpetuates the disturbing trend of racial inequality that has long plagued football and other areas of society. - -The Need for Change: - -Addressing these issues - both the financial disparity amongst managers and the underrepresentation of black individuals in managerial roles - is of paramount importance for the continued development and progress of English football. By fostering a more equitable and diverse environment within football management, clubs can not only uncover previously untapped talent pools but also work towards creating a more inclusive atmosphere within the sport. - -In conclusion, the landscape of football management is a complex and ever-changing one. While the financial aspects of the profession grab headlines and dominate discourse, it's essential to maintain a focus on the importance of promoting inclusivity, diversity, and equality within the sport. Only by acknowledging and addressing these shortcomings can the world of football grow and develop into a truly representative and inclusive realm for all who participate in it." -"Do these mean the same? -Tomasz Merta ( 7 November 1965 , Legnica -- 10 April 2010 , Smolensk ) was a Polish historian and Polish Undersecretary of State from 2005-2010 . -Tomasz Merta ( November 7 , 1965 , Legnica -- April 10 , 2010 , Smolensk ) was a Polish historian and Polish Secretary of State from 2005-2010 . - -Pick your answer from: (I). no; (II). yes;",(I). no -"Given the task definition and input, reply with output. In this task, you are given two phrases: Head and Tail, separated with . The Head and the Tail events are short phrases possibly involving participants. The names of specific people have been replaced by generic words (e.g., PersonX, PersonY, PersonZ). PersonX is always the subject of the event. You have to determine whether the Head is located or can be found at/in/on the Tail or not. Classify your answers into ""Yes"" and ""No"". The phrase may also contain ""___"", a placeholder that can be an object, a person, and/or an action. - -Head: PersonX abolishes ___ altogetherTail: to have a plan -","Step 1: Identify the Head and Tail phrases. -Head: PersonX abolishes ___ altogether -Tail: to have a plan - -Step 2: Determine if the Head is in the Tail or not. -In this case, the Head is about PersonX abolishing something, while the Tail is about having a plan. These are two separate concepts, and the Head is not located in or found within the Tail. - -Output: No" -"Summarize this article: - -They have said they want to honour ""the most charismatic actor of his generation"" whose ""dazzling talent"" means he belongs ""in the pantheon of legendary actors"". -Clooney will be bestowed with the Honorary Cesar Award from the Academie des Arts et Techniques du Cinema later this month at the French equivalent of the Oscars. -The Academie said it had chosen the Ocean's Eleven and Gravity star because of his ""dazzling talent as an actor, director, scriptwriter and producer - and above all, his artistic and spiritual generosity"". -He ""embodies Hollywood glamour"", their effusive statement went on, adding: ""His charm, humour, personality and engagement stand at the heart of our perpetual and eternal admiration."" -And they predicted that Clooney's name ""will forever be inscribed in the pantheon of legendary actors"". -That should be enough to make sure he turns up to the Cesar Awards ceremony in Paris on 24 February. -Others to have won the honorary Cesar in the past include Scarlett Johansson, Quentin Tarantino, Kate Winslet and Michael Douglas. -Follow us on Facebook, on Twitter @BBCNewsEnts, or on Instagram at bbcnewsents. If you have a story suggestion email entertainment.news@bbc.co.uk. - -Summary:","This article is about a famous actor named George Clooney. He is going to receive a special award called the Honorary Cesar Award in France later this month. This award is for his amazing work as an actor, director, scriptwriter, and producer. The people who chose him for this award say that he is very talented and generous, and they think his name will be remembered with other legendary actors. Other famous people have also won this award like Scarlett Johansson, Quentin Tarantino, Kate Winslet, and Michael Douglas." -"Given this review: ""I've no idea why but now it works perfectly. Good job done."" Would you recommend this app to a friend? Not at all, No, Maybe, Yes, or Definitely? -","Based on the review: ""I've no idea why but now it works perfectly. Good job done."" I would categorize the user's sentiment as positive; they express satisfaction with the app working perfectly and compliment the work done. - -Therefore, I would recommend this app to a friend with a response of ""Yes."" The user's positive experience and the fact that the app is functioning well now indicate that it could be a useful app for others." -"Which is an appropriate title for this article? - -As part of its ongoing efforts to woo public sector customers, Microsoft Corp. has begun giving governments tools for collaborating and sharing technology information with other organizations so that they can learn from each other's experiences and cut development costs.","Step 1: Identify the main topic of the article. -The main topic of the article is Microsoft's efforts to attract public sector customers with collaboration and information sharing tools. - -Step 2: Consider relevant keywords or phrases. -- Microsoft -- Public sector customers -- Collaboration -- Information sharing -- Technology -- Cutting development costs - -Step 3: Create a few potential titles. -a) Microsoft Offers Collaboration Tools to Public Sector Customers -b) Cutting Development Costs with Microsoft's Information Sharing Tools -c) Boosting Public Sector Innovation: Microsoft's Collaboration Solution - -Step 4: Evaluate the titles. - -a) This title focuses on Microsoft and how it is providing tools to public sector customers. It directly addresses the main topic of the article and is straightforward but lacks some excitement. -b) This option highlights the cost saving aspect of the provided tools, which could be one of the reasons governments might be interested in using them. However, it doesn't cover the collaboration aspects of the article, which are equally important. -c) This title emphasizes both collaboration and public sector innovation, which might be more appealing to readers. It also implies that Microsoft's tools will lead to better innovation in the public sector. - -Step 5: Select the most appropriate title. - -Based on the evaluation, the most appropriate title for the article is: - -Boosting Public Sector Innovation: Microsoft's Collaboration Solution - -This title effectively captures the main topic of the article and highlights the benefits that public sector customers can gain from using Microsoft's collaboration tools." -"Yes it was a little low budget, but this movie shows love! The only bad things about it was that you can tell the budget on this film would not compare to ""Waterworld"" and though the plot was good, the film never really tapped into it's full potential! Strong performances from everyone and the suspense makes it worthwhile to watch on a rainy night. - -Is the sentiment of this review positive or negative?","To determine the sentiment of this review, I will consider the positive and negative statements made throughout the text. - -Step 1: Identify positive statements -- The movie shows love. -- Strong performances from everyone. -- The suspense makes it worthwhile to watch on a rainy night. - -Step 2: Identify negative statements -- The budget is low, especially in comparison to ""Waterworld"". -- The film never really tapped into its full potential. - -Step 3: Weigh the positive and negative statements -- There are more positive statements than negative ones. -- The negative statements mainly focus on the production aspects, while the positive statements emphasize the performances and overall enjoyment of the movie. - -Conclusion: The sentiment of this review is overall positive. The reviewer acknowledges some shortcomings regarding the budget and untapped potential, but ultimately, they find the movie enjoyable due to its strong performances and suspense." -"Given the question: Generate a question about the following movie plot: A young girl of about 10 years lives in a farm house in the Jura mountains in eastern France. One day in autumn, when she rides her bicycle to school through the forest, she observes a hunting fox. Of course, the fox escapes, but the girl yearns to meet the animal again. She spends most of her free time in the forests trying to find the fox during the following months, but she doesn't meet the fox again until winter comes. During the winter, she follows the fox's tracks far across the fields. Suddenly she compares her hand to the size of the tracks near to those she is following and discovers they are relatively fresh wolf tracks; she is alarmed as a wolf pack begins howling near her. She runs away panicked, falls and hurts her ankle. The ankle heals very slowly, so that she has to stay at home during the winter reading a book about foxes and other animals of the forest. When spring arrives, the girl is looking for fox holes and waits for the fox. The fox has young babies and moves holes because of her observations; therefore the girl decides to observe the fox from a greater distance. She finds the fox again and tries to get the animal accustomed to her. She feeds it with meat. Later she can even touch the fox and is led to the new den. Finally, the fox arrives at her house and she lets it inside, wanting to show it her bedroom. But the fox becomes distressed at not being able to find a way out and escapes by smashing through her brittle plate glass window, causing the glass to shatter. The fox is hurt badly, but survives and the girl learns that she cannot keep wild animals as pets at home as they are unpredictable and may break more things such as fragile glass windows. Years later she tells the whole story to her son, as seen at the end of the film. Some versions (DVD English) leave out this scene and put the gist of its text over the scene before it. -The answer is:","What challenges and emotions does the young girl experience throughout her journey to form a bond with the fox, and how does this ultimately shape her understanding of the relationship between humans and wild animals?" -"Question: Who is Raymond Starkey? If there is no answer, please output ""Insufficient information to provide an answer."". Movie title: Suspect Zero Context: FBI Agent Thomas Mackelway (Aaron Eckhart) has been put on leave for 6 months, demoted, and reassigned to Albuquerque, because he violated the civil rights of a serial killer, Raymond Starkey. Starkey was living in Mexico at the time, when Mackelway brought him back to America in the trunk of his car. Starkey was eventually set free upon the world. Mackelway arrives in Albuquerque, and his first case is the murder of a traveling salesman, Harold Speck, who has a zero mark on his body. The FBI was called to the scene, because the body was in a car located just across the state line. Soon afterwards, he investigates two other murders. Raymond Starkey was the third victim. All the victims had the same zero mark on their body.At first, the murders looked random, and then Mackelway begins to connect the dots. The victims are all serial killers, and someone is going around killing them. He gets a lead that Benjamin O'Ryan (Ben Kingsley) may have some connection to the murders, and he begins to track down O'Ryan. He finds out that O'Ryan was once an FBI agent with special skills, trained to use 'remote viewing' to see what the serial killer sees. Douglas Young (the-movie-guy) -A:","Raymond Starkey is a fictional character in the movie ""Suspect Zero."" He is a serial killer whose civil rights were violated by FBI Agent Thomas Mackelway. Starkey was living in Mexico when Mackelway brought him back to America in the trunk of his car. Starkey was eventually set free and becomes the third victim in a series of murders where all the victims are serial killers with a zero mark on their bodies." -"1. The house was bought in 1858 by Sir George Dewhurst of Dunira , who in 1864 sold it to David Dundas of Lymm , Cheshire . -2. The house was purchased in 1858 by Sir David Dundas of Dunira , who sold it to George Dewhurst from Lymm , Cheshire in 1864 . - -Select your answer from the options. Are these two sentences paraphrases of each other? -Choose your answer from: (a). no (b). yes...I think the answer is","(b). yes - -These two sentences are paraphrases of each other because they both talk about the same events, even though the words are a bit different. In both sentences, the house was bought in 1858 and then sold in 1864. The people involved are Sir George Dewhurst of Dunira and David Dundas of Lymm, Cheshire. So, even if the sentences don't match exactly, the main ideas are the same. - -(a) would be wrong because saying ""no"" means the sentences are completely different, but they're really just different ways of saying the same thing." -"Article: Abscesses under the skin are very common in guinea pigs. They are the body’s attempt to ‘wall off’ an infection and keep it from spreading. Abscesses can form either after a bite from another guinea pig, or if something rough and sharp (e.g., straw) goes through the skin. They can form anywhere on a guinea pig’s body, but the most common locations are the head and neck. An abscess in the neck could be a swelling of the lymph node in that area. Lymph nodes are small glands that help the body fight infection. An abscess can feel firm or soft. Abscesses can also form in the mouth or jaw of a guinea pig. Abscesses in these areas can become large very quickly. Your guinea pig may look fine on one day, then have a large abscess the next day. When you handle your guinea pig, gently open its mouth to see the abscess. If the abscess is in the jaw, you will see a large bump along your guinea pig’s jawline. Guinea pigs can get several types of cysts, with the most common being a sebaceous cyst. Sebaceous cysts contain oil from the skin glands that produce oil (sebaceous glands). Sebaceous cysts are typically located on a guinea pig’s back and near the rump, but can form in other places as well. Although they can become very large, cysts are usually about the size of a pea. Cysts become a problem if they become large. Tumors can also form lumps. For example, a lump on your guinea pig’s tail could indicate a skin tumor called trichofolliculoma. A lump on the chest could indicate another type of cancer called lymphosarcoma. A female guinea pig can develop a mammary tumor, which you would see as a lump on the belly. Lipomas are tumors made up of fat cells. There are no specific places where you would look for a lipoma on your guinea pig. Your guinea pig may have several lipomas at one time. Sometimes, a lump can make a guinea pig feel so bad that it doesn’t want to eat. For example, if your guinea pig is not eating its meals and doesn’t want any tasty treats, check its mouth for an abscess. Even if your guinea pig wants to eat, the size of the abscess in its mouth or jaw could make it difficult to chew food. Sometimes, a guinea pig will stop eating right before an abscess ruptures (an abscess can sometimes rupture on its own). When you hold your guinea pig, take a quick sniff of its breath. If your guinea pig has a mouth abscess, its breath will probably smell quite unpleasant. The unpleasant smell would be due to infection. Along with bad breath, you may also notice drooling. An abscess can be very uncomfortable for a guinea pig. If your guinea pig squeals with pain when you pick it up, seems really tired, or doesn’t want to play with you, it could have an abscess. You may also notice your guinea pig heavily grooming the area of the abscess. - -What is a summary?","A summary is a short explanation of something longer, like a story or an article. So, for this article, a summary would be: Guinea pigs can get lumps called abscesses from infections or bites, and these can be anywhere on their body. They can also have cysts and tumors. Sometimes, these lumps can make the guinea pig not want to eat or play. It's important to check your guinea pig's mouth and body for any lumps, and if you find any, it's time to go to the vet to help your guinea pig feel better." -"Read this: From 1981 to 2010, the average annual precipitation measured at Seattle–Tacoma International Airport was 37.49 inches (952 mm). Annual precipitation has ranged from 23.78 in (604 mm) in 1952 to 55.14 in (1,401 mm) in 1950; for water year (October 1 – September 30) precipitation, the range is 23.16 in (588 mm) in 1976–77 to 51.82 in (1,316 mm) in 1996–97. Due to local variations in microclimate, Seattle also receives significantly lower precipitation than some other locations west of the Cascades. Around 80 mi (129 km) to the west, the Hoh Rain Forest in Olympic National Park on the western flank of the Olympic Mountains receives an annual average precipitation of 142 in (3.61 m). Sixty miles to the south of Seattle, the state capital Olympia, which is out of the Olympic Mountains' rain shadow, receives an annual average precipitation of 50 in (1,270 mm). The city of Bremerton, about 15 mi (24 km) west of downtown Seattle, receives 56.4 in (1,430 mm) of precipitation annually. - -What is the average rainfall in Seattle? -What is the answer? (If it cannot be answered, return ""unanswerable"")","The average annual precipitation measured at Seattle-Tacoma International Airport from 1981 to 2010 was 37.49 inches (952 mm). - -The answer is 37.49 inches (952 mm)." -"Rubicon Drinks Ltd (formerly Rubicon Products Ltd) is a soft drink manufacturer based in Milton Keynes, UK. The company specialises in exotic soft drinks, and produces a variety of different flavours of drink, many of which contain sugar or artificial sweeteners, and which come in both still and sparkling varieties. In the United Kingdom, their drinks are bottled and distributed by A.G. Barr plc. - -Choose your answer: based on the paragraph above can we conclude that ""Rubicon Drinks has filed bankruptcy but recently made a come back.""? - -Select from the following. [I] Yes [II] It's impossible to say [III] No -I think the answer is","[III] No - -The reason for my choice is that the given paragraph does not provide any information about Rubicon Drinks having filed bankruptcy or making a comeback. The paragraph only discusses the company's specialization in exotic soft drinks and their bottling and distribution partnership in the United Kingdom." -What is the answer to this question? who has made the most money on the challenge?,"To find the answer to this question, I need to gather information about the context of the term 'the challenge.' Since it is not specified, I'll assume you're referring to MTV's reality show, 'The Challenge.' - -Step 1: Research the topic -I will start by researching the reality show 'The Challenge' to understand its format and find relevant data about contestants' earnings. Sources I can use include official website, news articles, and fan-made databases. - -Step 2: Determine the right metric to compare -Once I have collected the data, I will determine the best metric to compare the contestants' earnings. This could be the total prize money earned by each contestant, or the average earnings per season they appeared in. - -Step 3: Compare the contestants -After identifying the appropriate metric, I will rank the contestants based on their earnings. This will allow me to see who has made the most money from participating in the reality show. - -Step 4: Verify the information -To ensure accuracy, I will cross-check my findings with multiple sources and/or official statements from the show's producers. - -Step 5: Present the answer -Once I am confident in my findings, I will provide the answer to who has made the most money on 'The Challenge.' - -After completing these steps and conducting research, it seems that the person who has made the most money on 'The Challenge' would be Johnny Bananas a.k.a Johnny Devenanzio with a total earning of $1,184,720. He has a nickname as 'King of The Challenge' due to his impressive performance and winnings over the seasons he participated in." -"I am a movie director and I just received the following movie plot. Could you help me answer this question? If not, let me know by writing ""Not answerable"". Plot title: The Dead Zone Movie plot: In the Maine small town of Castle Rock, school teacher Johnny Smith (Christopher Walken) takes his fiancée sweetheart Sarah (Brooke Adams) to an amusement park. On the roller coaster, he suffers a bad headache and tells her that he must go home to sleep it off. Sarah begs him to stay, but he declines saying: ""some things are worth waiting for"". As he drives home, a tanker jackknifes in front of him and he plows into it and black out.Johnny wakes up at the Weizak Clinic. His parents Herb and Vera (Sean Sullivan and Jackie Burroughs) are shown in by Dr. Sam Weizak (Herbert Lom). They tell him that he has been in a coma for five years and Sarah has married another man. The distraught Johnny is inconsolable.One day, as a nurse mops his brow he seizers her hand. He has a super-real vision of being trapped in a screaming girl's bedroom. He tells the nurse: ""Amy needs your help."" The nurse knows that Amy is her daughter's name, but puzzled why Johnny knows her. Johnny tells her that the house is burning, and her daughter is in the house - but it is not too late. The nurse rushes home to find her house in flames, but her daughter is rescued by firefighters just as she arrives home.After a few weeks of physical therapy, Johnny is able to walk again with some difficulty. When Johnny gratefully takes Dr Weizak's hand, he is jolted by another vision. It is wartime with burning buildings, advancing tanks. A protesting young boy is lifted into a horse-drawn cart, leaving his mother behind. Johnny tells Weizak that his mother survived. Weizak says that it is impossible, but Johnny knows her name and address. Weizak checks it out and it's true, but he cannot bring himself to speak to his elderly mother. Weizak comes back and tells Johnny: ""you're either in possession of a very new human ability... or a very old one.""Sarah comes to visit Johnny. Catching his stare, she asks him not to look at her that way. He says that he can't help it while Sarah says that it's been five years, but Johnny remembers it as yesterday. She says... My question: who has a car accident? -The answer to this question is:",Johnny Smith (Christopher Walken) has a car accident. -"Given the question: - sport is athletics - event is discus throw shot put - death date is 23 december 1967 - country is ita italy - birth date is 19 june 1891 - nationality is italian - club is libertas pistoia - birth place is pistoia , italy Given the details above, guess who could this information be about. -The answer is:","The individual described by the information provided is Adolfo Consolini, an Italian discus thrower who achieved prominent success during his career. - -Adolfo Consolini was born on June 19, 1891, in the city of Pistoia, located in the Tuscany region of Italy. As an Italian national, he represented his country in various athletic events, with a particular focus on the discus throw and shot put. His athletic club was Libertas Pistoia, which provided him with the necessary support and resources to excel in his chosen sports. - -One of the most notable features of Consolini's career was his unparalleled success in the discus throw. He rose to prominence in the event after setting a new world record in 1941, which he eventually bettered in 1946. Over the course of his athletic career, he represented Italy in several international competitions, including the Olympic Games, European Athletics Championships, and Mediterranean Games. Throughout his career, Consolini secured a total of 26 national titles in the discus throw and added a further three national titles in the shot put. - -Some of the most significant achievements of his career include gold medals in discus throw at the 1948 London Olympics and the 1950 European Athletics Championships in Brussels, as well as silver medals at the 1952 Helsinki Olympics and the 1954 European Athletics Championships in Bern. - -Despite his tremendous success on the field, Adolfo Consolini's life unfortunately came to an end on December 23, 1967. Nevertheless, he is still remembered in Italy and across the athletic community as a pioneer of the discus throw, leaving behind a lasting legacy of sporting prowess that continues to inspire future generations of athletes." -"Instructions: In this task, you are given inputs i,j, and A, where i and j are integers and A is a list. You need to return the sum of all the numerical elements in the list A between the positions i and j (including positions i and j). Return 0 if no numerical element is present in the list between the given ranges. i and j will be non-negative, and will always have a value less than the length of A. i will always be less than j. -Input: 1, 3, ['1729', 'a', 'I'] -Output:","To complete this task, follow these simple steps: - -1. Understand the problem: You are given inputs i, j, and A, where i and j are integers and A is a list. Your goal is to return the sum of all the numerical elements in the list A between the positions i and j (including positions i and j). If no numerical element is present in the list, return 0. - -2. Guidelines provided: - - i and j will be non-negative. - - i and j will always have a value less than the length of A. - - i will always be less than j. - -3. Using the guidelines to find the answer: - - Start by initializing a variable to store the sum, for example: total_sum = 0. - - Iterate through the list A between the positions i and j using a loop. You can use the range() function with parameters i and j+1, as the ending index is exclusive. - - For each element in the list, check if it is a numerical element. You can use isinstance(element, (int, float)) for that. - - If the element is numerical, add it to the total_sum. - - After iterating through all the elements between positions i and j, return the total_sum. - -Here's an example using the input 1, 3, ['1729', 'a', 'I']: - -1. Initialize total_sum = 0. -2. Iterate through the list A between the positions 1 and 3: - - At position 1, the element is 'a', which is not a numerical element. - - At position 2, the element is 'I', which is not a numerical element. -3. No numerical elements were found, so total_sum remains 0. -4. Return total_sum (in this case, 0). - -Since no numerical elements were found between positions 1 and 3, the output is 0." -"Barlovento (Spanish for windward) is a municipality in the northern part of the island of La Palma, one of the Canary Islands, and a part of the province of Santa Cruz de Tenerife. Barlovento is on the main highway which encircles the island. The land rises steeply from a small coastal plain, to the rim of the Caldera de Taburiente at Pico de la Cruz (2,350m) - -Based on the paragraph above can we conclude that ""Barlovento has very clean air due to little pollution""?","Well, the paragraph doesn't directly talk about the air quality or pollution in Barlovento. But since it is a place on an island with mountains, it may have cleaner air because there might be fewer cars and factories there than in big cities. So, it's possible that Barlovento has clean air, but we can't be sure just from this paragraph." -"How does the sentence end? - -ISLAMABAD, Pakistan (CNN) -- Barack Obama's election as president of the United States won't see a change in American relations with the Taliban, a senior Taliban leader in Pakistan says. A Taliban leader says Barack Obama's election will bring little change. ""For us, the change of America's president -- we don't have any good faith in him,"" said Muslim Khan, a grizzled Taliban spokesman who is one of the most wanted men in Pakistan, in a rare interview with CNN. ""If he does anything good, it will be for himself."" With an assault rifle on his lap, Khan answered 10 written questions, sharing his view on a range of topics from slavery to Obama's middle name -- Hussein. - -"" - -OPTIONS: -- America should take its army out of the country,"" Khan said. -- American should take its army out of the country,"" Khan said. -- Barack Obama should take its army out of the country,"" Khan said. -- CNN should take its army out of the country,"" Khan said. -- Hussein should take its army out of the country,"" Khan said. -- ISLAMABAD should take its army out of the country,"" Khan said. -- Khan should take its army out of the country,"" Khan said. -- Muslim Khan should take its army out of the country,"" Khan said. -- Obama should take its army out of the country,"" Khan said. -- Pakistan should take its army out of the country,"" Khan said. -- Taliban should take its army out of the country,"" Khan said. -- U.S. should take its army out of the country,"" Khan said. -- United States should take its army out of the country,"" Khan said. -- al Qaeda should take its army out of the country,"" Khan said. - -","- America should take its army out of the country,"" Khan said. - -Explanation: In the passage, Khan is a Taliban leader discussing his views about American relations and Barack Obama's election as president. He is likely addressing America's military presence in the region. The correct sentence is about America taking its army out of the country, as it fits the context. - -Wrong answers: -- American should... (Incorrect spelling) -- Barack Obama... (It's not referring to Obama specifically) -- CNN... (Refers to a news network, not relevant) -- Hussein... (Refers to Obama's middle name, not relevant) -- ISLAMABAD... (Refers to a city, not relevant) -- Khan... (Khan is the speaker, not the subject) -- Muslim Khan... (Same as above) -- Obama... (It's not referring to Obama specifically) -- Pakistan... (Not the subject of the passage) -- Taliban... (Not the subject of the passage) -- U.S... (Phrasing ""America"" is more common in the context) -- United States... (Same as above) -- al Qaeda... (Not related to the passage)" -Please answer this question: In which Country is Graham Greene's Novel The Comedians set?,"To answer the question, I will follow these steps: - -1. Recall or look up information about Graham Greene's novel ""The Comedians."" -2. Identify the country in which the novel is set based on the information. - -Step 1: Graham Greene's novel ""The Comedians"" is about a group of people living in a politically turbulent environment, exploring themes of political corruption and human resilience. - -Step 2: Upon careful analysis, I can now say that Graham Greene's novel ""The Comedians"" is set in Haiti, specifically during the rule of François ""Papa Doc"" Duvalier in the 1960s. This setting is integral to the plot and themes of the novel as it provides a backdrop of political turmoil and oppression for the characters' experiences." -"What would be the ★-rating of this review (★ being the lowest and ★★★★★ being the highest)? ""Is very professional"" -Answer:","Based on the provided review, ""Is very professional,"" it's not possible to assign an exact ★-rating as it does not contain enough information or specific details to determine the reviewer's overall experience. However, the description ""very professional"" can be considered as positive feedback, so we could infer that the rating would likely be between ★★★★ to ★★★★★. For a more accurate rating, additional information regarding the reviewer's experience and satisfaction level would be needed." -"Math Problem -Solve 17*u = 11*u - 12 for u.","Alright, let's solve this math problem together! We have the equation: - -17 * u = 11 * u - 12 - -First, we want to find out how many u's are left if we subtract 11 u's from 17 u's. So we do: - -17 * u - 11 * u = 11 * u - 11 * u - 12 - -Now, 17 u's minus 11 u's leaves us with 6 u's. So our equation now looks like: - -6 * u = -12 - -To find the value of u, we need to find out what number we can multiply by 6 to get -12. So we do: - -u = -12 / 6 - -When we divide -12 by 6, we get -2. So: - -u = -2 - -And there you have it! The value of u is -2." -"Write a text based on this summary: fossil strikes deal with armani jewelry - -Text:","In a notable development of the luxury goods industry, Fossil, a prestigious American watch and lifestyle company, has secured an agreement with the high-end Italian fashion house, Armani. The deal significantly revolves around the designing, manufacturing, and distribution of Armani's jewelry line. - -Step 1: Provide an introduction that highlights the key event: In this case, the main event is the deal between Fossil and Armani, two prominent entities in the global luxury goods sector. - -Step 2: Introduce the parties involved: In this context, the parties are Fossil, an esteemed lifestyle brand renowned for its watches, and Armani, a premier Italian fashion house acknowledged globally for its clothing, accessories, cosmetics, and high-end jewelry. - -Step 3: Detail the specifics of the deal: The significant part of the agreement pertains to the design, production, and distribution of Armani's jewelry range. It is necessary to mention that, as it clearly outlines the core focus of the partnership and helps to understand the depth of the business dynamics linked to it. - -Step 4: Convey the importance of the deal: Hinting at the magnitude of the deal would be the final step. In this case, the deal is significant as it brings together two high-end companies and because of the potential implications it may have on the luxury goods industry. - -By incorporating all these steps, the text maintains an effective balance between brevity and the necessary details, providing an accurate portrayal of the summary given." -"Given the task definition and input, reply with output. In this task, you are given a sentence in English, and your task is to translate it into Persian. - -but it was felt as a very grievous injury, and her good manners were severely taxed to conceal her vexation and anger till she reached home. -",اما این موضوع به عنوان یک آسیب بسیار سنگین احساس شد و ادب خوب او به شدت به چالش کشیده شد تا توانست ناراحتی و خشم خود را تا زمانی که به خانه برسد، پنهان کند. -Write a sentence not in English.,"""Le soleil brille et les oiseaux chantent dans le ciel clair de cette belle journée d'été."" - -This French sentence translates to ""The sun is shining, and the birds are singing in the clear sky on this beautiful summer day."" It captures a picturesque scene of a perfect summer's day, where the weather is pleasant, and nature is actively contributing to the ambiance. The sentence illustrates the beauty of the French language, often known for its melodious flow and captivating expressions." -"After World War II, the Guam Organic Act of 1950 established Guam as an unincorporated organized territory of the United States, provided for the structure of the island's civilian government, and granted the people U.S. citizenship. The Governor of Guam was federally appointed until 1968, when the Guam Elective Governor Act provided for the office's popular election.:242 Since Guam is not a U.S. state, U.S. citizens residing on Guam are not allowed to vote for president and their congressional representative is a non-voting member. -Try to answer this question if possible (otherwise reply ""unanswerable""): In what year did World War II end?",World War II ended in the year 1945. -"Given the question: Kendall asked Tracy if she wanted to go see Lady Gaga; she decided she wasn't going to take no for an answer. Given the context: What did Kendall do? Possible answers: sold her Lady Gaga tickets, decided she would only accept an answer of yes, went to see Lady Gaga alone -The answer is:",Kendall decided she would only accept an answer of yes. -"the cookies used to collect these data are both first- and third-party cookies, and include data on traffic and visitors. -Capitalize this past sentence correctly.","The cookies used to collect these data are both First- and Third-party cookies, and include data on Traffic and Visitors." -"Briefly summarize this sentence: a leading arabic daily of the united arab emirates -lrb- uae -rrb- wednesday described the report published by the u.s. state department on the human rights conditions all over the world as `` biased and full of mine fields . - -Summary:",A big newspaper in a place called United Arab Emirates said on Wednesday that a report from the United States about how people are treated around the world is not fair and has some problems. -"Instructions: Given a category and a set of five words, find the word from the set that does not belong (i.e. is the least relevant) with the other words in the category. Words are separated by commas. -Input: Category: emotional status -Words: emotional upsets, fret, anxious, crying, string -Output:",string -"I stayed home and finished up the cleaning I left undone on Saturday . Then I picked up some stuff from the grocery store that we had run out of . I also managed to pick up two small pumpkins ! That made me happy ! - -Based on the preceding passage, answer the following question What might be the reason I am happy about my day ?","You might be happy about your day because you finished cleaning, got some things from the grocery store, and found two small pumpkins! The pumpkins likely made you extra happy because they can be fun and remind us of fall or Halloween." -"Consider the question. Given the sentence ""A dog plays with a soccer ball."" is it true that ""The dog is sleeping.""? - What is the step-by-step reasoning process to arrive at the answer: no?","To arrive at the answer ""no,"" follow this step-by-step reasoning process: - -1. Read and comprehend the given sentence: ""A dog plays with a soccer ball."" This sentence provides information about the action being performed by the dog, which is to play with a soccer ball. - -2. Identify the keywords: In the given sentence, the keywords are ""dog,"" ""plays,"" and ""soccer ball."" These keywords provide essential information about the subject (dog), the action or verb (plays), and the object or the item being interacted with (soccer ball). - -3. Analyze the second sentence: Now, consider the second sentence - ""The dog is sleeping."" Here, the keywords are ""dog"" and ""sleeping."" These keywords tell us about the subject (dog) and the action being performed in this sentence (sleeping). - -4. Compare the actions: Compare the actions from the two sentences — ""plays"" and ""sleeping."" The action ""plays"" in the first sentence indicates that the dog is actively engaged and is not at rest, while ""sleeping"" in the second sentence implies that the dog is at rest and not engaged in any activity. - -5. Determine the logical connection: Determine if there is any logical connection between the two actions. Playing and sleeping are contradictory actions and, as such, cannot both be true simultaneously. In other words, the dog cannot be playing with the soccer ball and sleeping at the same time. - -6. Evaluate the truthfulness of the second sentence: Based on the given information and logical connection, evaluate whether the second sentence is true, given the first sentence. Since the first sentence explicitly states that the dog is playing with a soccer ball, the dog cannot be sleeping at the same time. - -7. Conclude the answer: After evaluating the truthfulness of the sentences, the conclusion is that the second sentence is not true, given the information provided in the first sentence. Therefore, the answer is ""no."" The dog is not sleeping, as it is actively playing with a soccer ball." -"Rozumím. - -Translate to English - -English:","I understand. - -Translation to English: - -English: I understand." -"Use some thinking to answer the following question. Which one of the following is the least number of four digits divisible by 71? -Options: -(A) 1006 -(B) 1065 -(C) 1094 -(D) 1056 -(E) 1057","To find the least number of four digits divisible by 71, first, let's check the given options one by one. - -(A) 1006 -1006 ÷ 71 = 14.1690 (remainder) - -(B) 1065 -1065 ÷ 71 =15 (remainder) - -(C) 1094 -1094 ÷ 71 = 15.4084 (remainder) - -(D) 1056 -1056 ÷ 71 = 14.8732 (remainder) - -(E) 1057 -1057 ÷ 71 = 14.8873 (remainder) - -Our goal is to find the least four-digit number divisible by 71, which means there should be no remainder. As we can see, option (B) 1065 is divisible by 71 with no remainder left (1065 ÷ 71 = 15). Therefore, the least number of four digits divisible by 71 is 1065." -Write a sentence based on this summary: iraqi embassy in jakarta removes saddam hussein 's photo,"The building in Jakarta where people from Iraq work, took down a picture of a man named Saddam Hussein." -"Select your answer: Which is this about? - -AP - Arkansas may still be Clinton country, but it's no longer Democratic terrain. - -OPTIONS: -1). World. -2). Sports. -3). Business. -4). Science/Tech.","The correct answer is 3). Business. - -This is because the statement mentions ""Clinton country"" and ""Democratic terrain,"" which are related to politics and government, which fall under the business category. The other options like World, Sports, and Science/Tech do not fit because the statement does not talk about global events, sports events, or scientific or technological advancements." -Write a sentence not in English.,"Step 1: Choose a language other than English. I'll choose Spanish since it's a widely spoken language. -Step 2: Formulate a simple sentence using basic vocabulary that's easily understandable. In this case, I'll talk about the weather, a common topic. -Step 3: Translate the English sentence ""It's a sunny day"" into Spanish. - -Result: ""Es un día soleado."" - -Justification: I chose Spanish because it's a popular language, and I opted for a simple sentence about the weather because it's a universally relatable topic." -"Generate a question about the following movie plot: Brooklyn, New York 1969. A group of four boys walk up to Bleek Gilliam (Zakee L. Howze)'s brownstone rowhouse and ask him to come out and play baseball with them. Bleek's mother insists that he continue his trumpet lesson, to his chagrin. His father becomes concerned that Bleek will grow up to be a sissy, and a family argument ensues. In the end, Bleek continues playing his trumpet, and his friends go away.20 years later. The adult Bleek Gilliam (Denzel Washington) is performing on the trumpet at a busy nightclub with his jazz band, The Bleek Quintet. They make up of trumpeter Bleek, saxphone player Shadow Henderson (Wesley Snipes), pianist Left Hand Lacey (Giancarlo Esposito), drummer Bottom Hammer (Bill Nunn), and bass player Rhythm Jones (Jeff ""Tain"" Watts). Giant (Spike Lee), whom is the Quintet's manager and one of Bleek's former childhood friends, is waiting in the wings, and advises him to stop allowing his saxophone player Shadow Henderson to grandstand with long solos.The next morning Bleek wakes up with his girlfriend, Indigo Downes (Joie Lee). She leaves to go to college classes, while he meets his father by the Brooklyn Bridge for a game of catch, telling him that while he does like Indigo, he likes other women too and is not ready to make a commitment. Later in the day while he is practicing his trumpet, another woman named Clarke Bentancourt (Cynda Williams) visits him. She suggests he fire Giant as his manager; he suggests that they make love (which he refers to as 'mo better'). She bites his lip and he becomes upset about it, saying, ""I make my living with my lips,"" as he examines the bleeding bottom lip.Giant is with his bookie, betting on baseball. Then he goes to the nightclub and argues with the doormen about what time to let the patrons into the club. He meets Bleek inside with the rest of the band, except for the pianist, Left Hand Lacey, who arrives late with his French girlfriend and is scolded by Giant. Later Giant goes to the club owners office, points out how busy the club has been... -Answer:","In the movie plot provided, which internal and external factors contribute to Bleek Gilliam's struggle to balance his passion for music, relationships, and loyalty to his friends, and how do these factors influence his decisions throughout the story?" -"Q: Question: how tennessee became a state? Would ""The 1927 Victor recording sessions in Bristol generally mark the beginning of the country music genre and the rise of the Grand Ole Opry in the 1930s helped make Nashville the center of the country music recording industry."" be a reasonable answer? - -Available options: -(a). No. -(b). Yes. -The answer is:",(a). No. -"Translate ""There are special transport boxes for dogs."" to German?","To translate ""There are special transport boxes for dogs."" to German, I will perform the following steps: - -1. Identify the key words and phrases: ""special,"" ""transport boxes,"" and ""for dogs."" -2. Translate each key word/phrase into German: - - ""special"" -> ""spezielle"" - - ""transport boxes"" -> ""Transportboxen"" - - ""for dogs"" -> ""für Hunde"" -3. Consider the word order, declension, and grammar in German. -4. Construct the translated sentence: ""Es gibt spezielle Transportboxen für Hunde."" - -So, the translation of ""There are special transport boxes for dogs."" to German is: ""Es gibt spezielle Transportboxen für Hunde.""" -"Answer the following question: I want to test the ability of students to read a passage and answer questions about it. Could you please come up with a good question for the passage ""Besides emptiness, Mahayana schools often place emphasis on the notions of perfected spiritual insight (prajñāpāramitā) and Buddha-nature (tathāgatagarbha). There are conflicting interpretations of the tathāgatagarbha in Mahāyāna thought. The idea may be traced to Abhidharma, and ultimately to statements of the Buddha in the Nikāyas. In Tibetan Buddhism, according to the Sakya school, tathāgatagarbha is the inseparability of the clarity and emptiness of one's mind. In Nyingma, tathāgatagarbha also generally refers to inseparability of the clarity and emptiness of one's mind. According to the Gelug school, it is the potential for sentient beings to awaken since they are empty (i.e. dependently originated). According to the Jonang school, it refers to the innate qualities of the mind that expresses themselves as omniscience etc. when adventitious obscurations are removed. The ""Tathāgatagarbha Sutras"" are a collection of Mahayana sutras that present a unique model of Buddha-nature. Even though this collection was generally ignored in India, East Asian Buddhism provides some significance to these texts.""? -Answer:","Based on the passage provided, you may use the following question to test the students' reading comprehension skills: - -Question: In the passage, various interpretations of the tathāgatagarbha in Mahāyāna thought are discussed. Briefly describe the understanding of tathāgatagarbha according to the following schools of Tibetan Buddhism: - -1. Sakya school -2. Nyingma school -3. Gelug school -4. Jonang school - -Additionally, mention the significance of the ""Tathāgatagarbha Sutras"" in East Asian Buddhism." -"Here is some data: Allama Iqbal International Airport, operatingOrganisation, Pakistan Civil Aviation Authority; Pakistan Civil Aviation Authority, headquarter, Jinnah International Airport; Allama Iqbal International Airport, location, Punjab, Pakistan. - -Write a sentence that describes this data","Step 1: Identify the key pieces of information in the given data: Allama Iqbal International Airport, Pakistan Civil Aviation Authority, Jinnah International Airport, Punjab, Pakistan. - -Step 2: Understand the relationships between the pieces of information: -- Allama Iqbal International Airport's operating organization is Pakistan Civil Aviation Authority. -- Pakistan Civil Aviation Authority's headquarter is located in Jinnah International Airport. -- Allama Iqbal International Airport is located in Punjab, Pakistan. - -Step 3: Formulate the sentence that encapsulates the relationships between the pieces of information, and arrange them in a manner that ensures smooth readability. - -The Allama Iqbal International Airport, situated in Punjab, Pakistan, is operated by the Pakistan Civil Aviation Authority, which has its headquarters at Jinnah International Airport." -"James got a stuffed animal from a UFO catcher machine. Where might he have done this? Choose the most suitable option to answer the above question. Options: - toy store - farm - children's room - amusement park - hall -The answer to this question is:",amusement park -"""Rusya bir realitedir. - -Which language is this?","To identify the language, I will analyze the given text and compare it to various languages in my database: - -Text: ""Rusya bir realitedir."" - -Step 1: Analyze the words and their structure. -- ""Rusya"" seems to be a proper noun, possibly a country or place. -- ""bir"" could be an article or a counting word. -- ""realitedir"" resembles the word ""reality"" in English. - -Step 2: Compare the text to the languages in my database. -- ""Rusya"" is the Turkish word for ""Russia."" -- ""bir"" means ""one"" or ""a/an"" in Turkish. -- ""realitedir"" is a Turkish word, which means ""is a reality."" - -By analyzing the text and comparing it to my language database, I can conclude that the given text is in Turkish. - -Language: Turkish" -"Qld uranium mine given contaminant warning -A Queensland uranium mine has been ordered to strengthen safeguards against the release of contaminants after elevated readings of arsenic, lead and uranium. - -The owners of the non-operational Ben Lomond Mine, near Townsville, were issued with an Environmental Protection Order on Friday. - -The order was issued in response to elevated levels of contaminants being measured both on and off the mining lease, Environment Minister Steven Miles said on Sunday. -What is a short summary of the above article?","A Queensland uranium mine, Ben Lomond Mine near Townsville, has been ordered to implement stronger safeguards against the release of contaminants, following the detection of elevated levels of arsenic, lead, and uranium both on and off the mining lease. The non-operational mine's owners were issued an Environmental Protection Order by Environment Minister Steven Miles to address the issue and protect the environment from further contamination." -"Generate a sentence about this data: Ace Wilder, genre, Hip hop music; Hip hop music, musicSubgenre, Gangsta rap; Hip hop music, stylisticOrigin, Funk; Hip hop music, stylisticOrigin, Disco. -Sentence:","Ace Wilder is a singer who sings Hip hop music, a type of song where people talk and rhyme with a beat. Within Hip hop music there is a smaller group called Gangsta rap, which is more about tough life stories. Hip hop music comes from two older types of music, Funk and Disco, that make people want to dance and have fun." -"Premise: -""The men attack, murdering some women and scattering others to the winds."" Based on this premise, is the hypothesis ""The men tried to kill as many as possible."" true?","Imagine there is a group of men who started behaving very mean and hurting people. They went after some women and hurt them really badly, and made others run away. - -The idea that ""The men tried to kill as many as possible"" is like guessing that these men wanted to hurt as many people as they could. Since they already hurt some women and made others go away, this guess could be true. But we would need more information to be sure about their intentions." -"The following article contains an answer for the question: Who is placed in the car of the person that is in a relationship with a protester? , can you please find it? Five men, criminals Ray, Dave, Stevie, Julian (""Julie"" as a nickname), and Jason, plan a heist to steal a minimum of £2 million. Using a truck modified as a battering ram, the group break into a security depot in London and steal a large amount of money before the police arrive. However, they discover they barely got the amount of money they wanted, and only £68,000 to each man. Julian demands an extra amount of money as ""expenses"" for his work, but is beaten and placed in the boot of Ray's car until he just accepts his share. The group, without Julian, later spend time at a bar with fellow criminal Sonny, and Ray's girlfriend Connie, a protester. Ray and Stevie also visit an elderly couple, Linda and Bill, where they leave their stolen money for safekeeping. The next day, Ray and Stevie, who live together with Connie, are alerted by a bruised Dave that his money was stolen, apparently by Julian. Ray, Dave and Stevie investigate Linda and Bill's home to find them murdered and the money stolen, leaving Ray emotionally distraught. He visits Julian but his money is missing too. They conclude that Sonny stole the money and break into his house, only to find Jason dead with a headwound. The four are alerted to a pair of undercover police officers and flee, Dave and Julian engaging in a shootout with the police. Believing that he may be arrested for murder, Ray decides to flee after the money is found, and goes to his mother and Connie for help. His mother gives him some money and her car to use, disappointed in her son's career but still caring for him. Ray then speaks with Connie and asks her to come with him, and to meet her at a roadside service station on the M1 if she decides to come. -Answer:","In the given article, the person who is placed in the car is Julian, also known as ""Julie."" Julian is placed in the boot of Ray's car after he demands extra money for his work and is beaten up by the other group members. Ray's girlfriend, Connie, who is mentioned as a protester, is in a relationship with Ray, but she is not the one placed in the car. Instead, it is Julian who is forced into the car until he accepts his share of the stolen money." -"Choose the next sentence.Heart-warming pictures of the real life Mowgli, a girl who spent the first ten years of her life growing up in the African bush, have been released for the first time. The magical images chronicle the life of Tippi Benjamine Okanti Degre, who was brought up with wild animals, just like Rudyard Kipling's hero did in The Jungle Book. The images in 'Tippi: My Book of Africa' - now being published worldwide for the first time - show the young girl making friends with an elephant, who she calls her brother, and a leopard, her best friend. Scroll down for video - -The women and children are responsible for gathering fruits and berries from the wild in - -OPTIONS: -- Africa -- African -- France -- Mowgli -- Namibia -- Rudyard Kipling -- The Jungle Book -- Tippi -- Tippi Benjamine Okanti Degre - -","In Africa, women and children often shoulder the responsibility of gathering fruits and berries from the wild, a crucial task for providing sustenance to their families and communities. This practice allows them to develop a deep connection with nature and the environment around them, much like Tippi Benjamine Okanti Degre's unique upbringing amongst wild animals in the African bush. - -The African continent, characterized by diverse landscapes and abundant wildlife, offers a plethora of opportunities for its inhabitants to interact with their natural surroundings. Indigenous communities, in particular, rely on the land's resources for their livelihood, making them extremely knowledgeable about their environments. This reliance on nature has deep-rooted cultural and historical connections to the people and plays a vital role in shaping their identities. - -In African societies, the roles and responsibilities assigned to men, women, and children vary depending on the community. In many cases, women and children are tasked with ensuring that the family's nutritional needs are met, while men engage in activities such as hunting or farming. This gendered division of labor has a long-standing tradition in Africa and is still observed in many communities today. - -Fruit and berry gathering is a valuable skill that women and children must master from an early age, as their ability to identify edible, nutritious, and safe fruits and berries carries enormous importance for their family's well-being. Additionally, this activity brings them closer to nature, fostering a respect and appreciation for the environment and the countless benefits it provides. - -Tippi Benjamine Okanti Degre's incredible story serves as a testament to the deep bond that can form between children and nature when they are raised in close proximity to the wild. Like Mowgli from Rudyard Kipling's ""The Jungle Book,"" Tippi's encounters with the wild animals in Namibia enabled her to develop unique connections, not only with the elephant and leopard she befriended but also with a wide array of other creatures that inhabited her world. - -Her life story, beautifully captured in the book ""Tippi: My Book of Africa,"" provides a fascinating glimpse into the adventures of a true-life Mowgli raised in the African wilderness. As the book captures the hearts of readers worldwide, it highlights the importance of preserving these magnificent environments and their wildlife, ensuring future generations have the chance to experience the beauty and wonder of the African continent." -"Tato situace má celou řadu příčin, které jsou velice jasně artikulovány ve znění usnesení, o němž tu dnes hovoříme, přičemž tou nejdůležitější je vysoká cena obilovin. - -Translate this to English?","Step 1: Determine the source language - The text appears to be in Czech. - -Step 2: Identify the structure of the sentence and the key elements: -- Tato situace má celou řadu příčin (This situation has a whole series of reasons) -- které jsou velice jasně artikulovány ve znění usnesení (which are very clearly articulated in the wording of the resolution) -- o němž tu dnes hovoříme (about which we are talking today) -- přičemž tou nejdůležitější je vysoká cena obilovin (with the most important being the high price of cereals) - -Step 3: Translate the text into English while maintaining its original meaning and structure. - -This situation has a whole series of causes, which are very clearly articulated in the wording of the resolution we are talking about today, with the most important being the high price of cereals." -"Allen was born Allan Stewart Konigsberg in the Brooklyn borough of New York City, New York. He and his sister, Letty (b. 1943), were raised in Midwood, Brooklyn. He is the son of Nettie (nee Cherry; November 8, 1906 - January 27, 2002), a bookkeeper at her family's delicatessen, and Martin Konigsberg (December 25, 1900 - January 8, 2001), a jewelry engraver and waiter. His family was Jewish, and his grandparents immigrated to the US from Russia and Austria and spoke Yiddish, Hebrew, and German. - -In 1966, Allen wrote the play Don't Drink the Water. The play starred Lou Jacobi, Kay Medford, Anita Gillette and Allen's future movie co-star Tony Roberts. A film adaptation of the play, directed by Howard Morris, was released in 1969, starring Jackie Gleason. Because he was not particularly happy with the 1969 film version of his play, in 1994, Allen directed and starred in a second version for television, with Michael J. Fox and Mayim Bialik. The next play Allen wrote for Broadway was Play It Again, Sam, in which he also starred. The play opened on February 12, 1969, and ran for 453 performances. It featured Diane Keaton and Roberts. The play was significant to Keaton's budding career, and she has stated she was in ""awe"" of Allen even before auditioning for her role, which was the first time she met him. During an interview in 2013, Keaton stated that she ""fell in love with him right away,"" adding, ""I wanted to be his girlfriend so I did something about it."" After co-starring alongside Allen in the subsequent film version of Play It Again, Sam, she would later co-star in Sleeper, Love and Death, Interiors, Manhattan and Annie Hall. ""He showed me the ropes and I followed his lead. He is the most disciplined person I know. He works very hard,"" Keaton has stated. ""I find the same thing sexy in a man now as I always have: humor. I love it when they are funny. It's to die for."" For its March 21, 1969, issue, Life featured Allen on its cover. In 1981, his play The Floating Light Bulb premiered on Broadway and ran for 65 performances. While receiving mixed reviews, it gave an autobiographical insight into Allen's childhood, specifically his fascination with magic tricks. He has written several one-act plays, including Riverside Drive and Old Saybrook exploring well-known Allen themes. On October 20, 2011, Allen's one-act play Honeymoon Motel opened as part of a larger piece entitled Relatively Speaking on Broadway, with two other one-act plays, one by Ethan Coen and one by Elaine May. - -Answer the following question by taking a quote from the article: Did he write anything else?","Yes, Allen wrote several plays and one-act pieces throughout his career. As mentioned in the article, ""He has written several one-act plays, including Riverside Drive and Old Saybrook exploring well-known Allen themes."" Additionally, Allen wrote the plays Don't Drink the Water, Play It Again, Sam, and The Floating Light Bulb, which all premiered on Broadway." -"Write a dialog based on this summary: -Wilkes wants to go to Jordan as his girlfriend found cheap flights. Peyton will give him Pete's number as he wants to talk to him about it. .","Wilkes: Hey Peyton, guess what? My girlfriend found some really cheap flights to a place called Jordan. I want to go there! - -Peyton: Oh wow, that sounds fun, Wilkes! Jordan is a country with lots of interesting things to see, like old buildings and pretty landscapes. - -Wilkes: That's awesome! But I want to talk to our friend Pete about it. Do you have Pete's number? - -Peyton: Sure, Wilkes! I can give you Pete's number. A number is like an address for the phone, so we can call or send messages to our friends. - -Wilkes: Great, thanks a lot, Peyton! I'm excited to talk to Pete about going to Jordan!" -"Concepts: building, shop, town - -Write a sentence that includes all these words.","In the rapidly developing town, the construction team worked diligently to build a state-of-the-art shopping center, featuring a diverse array of shops and amenities accessible to the ever-growing community." -"Elias Bjuhr (born October 17 1988) is a Swedish ice hockey player. He was previously playing with the Modo Hockey in the Elitserien. Given a list of categories: company, educational institution, artist, athlete, office holder, mean of transportation, building, natural place, village, animal, plant, album, film or written work, what category does the paragraph belong to? -The answer to this question is:",athlete -"Please answer the following question by reasoning step-by-step. Can we conclude from ""Dog jumps to catch a snowball."" that ""A dog and a child are playing in the snow after a heavy snowfall.""? -Options: -- yes -- no -- it is not possible to tell. Step-by-step reasoning:","- no - -Step-by-step reasoning: - -1. The original statement is ""Dog jumps to catch a snowball."" -2. From this statement, we know that there is a dog involved and the dog is trying to catch a snowball. -3. However, nothing in this statement mentions a child or any other character. -4. The statement also does not mention a heavy snowfall, only that there is at least one snowball. -5. Since the original statement does not provide information about a child, heavy snowfall, or any other aspect of the conclusion, we cannot confirm that ""A dog and a child are playing in the snow after a heavy snowfall."" based on the given statement." -"Note the options at the end. Select the topic that this about: - -The Boxers were supposed to be vulnerable, coming off their first loss of the season at the hands of Xaverian. - -Options: (I). World. (II). Sports. (III). Business. (IV). Science/Tech.","The given text describes a scenario typically found in the context of sports competitions. The term ""Boxers"" is frequently used as a team name in various sports. The text talks about the team's situation after experiencing their first loss of a season specifically to Xaverian, which could be another sports team. Hence, the topic that the text is about mainly concerns sports or sporting events. - -The situation described doesn't fit into the 'World' category, as there is no mention of any global event or international element. 'Business' is not suggested either, because the text does not refer to any transactions, financial matters, corporate entities, or economic dynamics. Likewise, 'Science/Tech' doesn't apply, as there is no reference to scientific concepts, technological innovations, research findings, or technical procedures. - -So, to sum up, the topic that relates to the text given concerning the Boxers experiencing their first loss of the season to Xaverian would be: (II). Sports. This context usually relates to discussions on teams' performance, dynamics, and events within a sports season." -Come up with a question and reasoning that would justify this answer: no,"Question: Is it possible to travel faster than the speed of light in a vacuum? - -Reasoning: According to our current understanding of the laws of physics, particularly Einstein's Theory of Relativity, no object with mass can accelerate to or exceed the speed of light in a vacuum, which is approximately 299,792 kilometers per second (186,282 miles per second). As an object with mass approaches the speed of light, its energy and momentum increase exponentially, requiring an infinite amount of energy to reach or surpass this speed limit. This effectively ensures that the speed of light remains the ultimate limit for moving through space, thus justifying the answer ""no"" to the question of whether it is possible to travel faster than the speed of light in a vacuum." -"Answer the following question: Question: When did Joe break and rebuild Pino? If there is no answer, please output ""Insufficient information to provide an answer."". Movie title: Silent Night, Deadly Night 5: The Toy Maker Context: Late one night in December, a young boy named Derek Quinn (William Thorne) hears the doorbell ring and goes downstairs and finds a Christmas present addressed to him on the porch. His father Tom (Van Quattro) reprimands him for being up so late and opening the door, sending him off to bed. Instead Derek watches from the stairs as his curious father opens the gift. Finding a musical orb shaped like Santa Claus in the box he activates it, causing it to strangle him with retractable cords; as Tom struggles he slips and falls onto a fireplace poker, his impaled body being found by his wife Sarah (Jane Higginson) a few moments later.Two weeks later, Sarah takes Derek, who hasn't spoken since his father's death, to a toy store owned by the elderly Joe Petto (Mickey Rooney) and his odd son Pino (Brian Bremer) not realizing they have been followed by Noah Adams (Tracy Fraim). After Derek rejects all the toys Joe shows him (and one called Larry the Larvae that Pino tries to give him) he and his mother leave, prompting Joe to begin angrily yelling at Pino, belittling him and blaming him for all the store's recent failures. While running from his father Pino bumps into Noah and drops the larvae toy, which Noah picks up and buys along with some other toys. At his home Noah begins taking apart the toys he bought from Joe when he is confronted by his angry landlord Harold (Gerry Black). Late paying rent Noah, to smooth things over, gives Harold the Larry the Larvae toy in exchange for a one day extension. While driving home Harold is killed when Larry the Larvae crawls into his mouth and bursts out his eye, causing his car to crash and explode.The next day, Sarah takes Derek to see Santa (portrayed by Noah, who takes his friend's shift) at the mall, finding another gift on the porch on the way out. While Sarah and Derek are gone Pino sneaks into their house, using a key he had hidden years earlier when he and his father lived there. When Sarah and Derek get home early (due to Noah's odd behavior towards Derek) Pino flees... -Answer:",Insufficient information to provide an answer. -"Given the rationale, provide a reasonable question and answer. Step-by-step reasoning process: Not all dog playing with a colorful chew toy is playful. - The question and answer:","Question: Can we assume that every dog playing with a colorful chew toy is playful? - -Answer: No, we cannot assume that every dog playing with a colorful chew toy is playful. - -Step-by-step reasoning process: - -1. We observe that some dogs play with colorful chew toys. -2. We also know that playing with toys is often an indicator of a playful nature. -3. However, not all dogs playing with colorful chew toys may exhibit the same playful behavior, as their motivations for engaging with the toy can be different. -4. There could be various reasons why a dog might play with a toy, such as to relieve stress, exercise or just out of habit. -5. Therefore, we cannot make a blanket assumption that all dogs playing with colorful chew toys are playful due to the various motivations behind their actions." -"Question: when did germans enter paris in ww2 I found the following answer on Google: The capital region of France had been governed by Nazi Germany since the signing of the Second Compiègne Armistice in June 1940, when the German Army occupied northern and westernmost France, and when the puppet regime of Vichy France was established in the town of Vichy in central France. Is that a correct answer? Yes or no. -Answer:","Yes, the information you found is correct. Nazi Germany entered Paris on June 14, 1940 after the signing of the Second Compiègne Armistice. This led to the German occupation of northern and western France and the establishment of the Vichy France puppet regime in central France." -"Please answer the following question: Here's a complex question that requires someone to reason about the input, can you answer it? What material is the trophy the Current holders who play their home games at Bridgestone Area, made of? -Answer:","The Bridgestone Arena is the home ground for the Nashville Predators, an ice hockey team in the NHL. The most prestigious trophy the team competes for is the Stanley Cup, which is made primarily of silver, with some additional nickel alloy components. Therefore, the material of the trophy the current holders who play their home games at Bridgestone Arena compete for is predominantly silver." -Generate a tweet that has the following sentiment: positive,"Step 1: Identify keywords that evoke positivity -- Keywords: happiness, joy, inspiration, success, love, gratitude, laughter, friendship - -Step 2: Select a theme/topic for the tweet -- Chosen theme: celebrating life's simple pleasures - -Step 3: Construct a tweet using positive keywords and theme -- Constructed tweet: ""Feeling grateful for the simple pleasures in life! 😊 A warm cup of coffee, laughter among friends, and the sweet smell of flowers fill our days with so much joy and happiness. Let's spread the love and make the world a better place. 🌸💕 #positivity #gratitude"" - -Step 4: Review the tweet for positivity -- The tweet focuses on life's simple pleasures and encourages spreading love. It uses emojis and hashtags related to positivity and gratitude. - -Final tweet: ""Feeling grateful for the simple pleasures in life! 😊 A warm cup of coffee, laughter among friends, and the sweet smell of flowers fill our days with so much joy and happiness. Let's spread the love and make the world a better place. 🌸💕 #positivity #gratitude""" -Carlos Menem was the president of which country from 8 July 1989 to 10 December 1999?,"Carlos Menem was the president of Argentina from 8 July 1989 to 10 December 1999. Born on July 2, 1930, in Anillaco, a small town in Argentina's La Rioja Province, Menem grew up in a family of Syrian immigrants. He studied law at the National University of Córdoba and later entered into politics, joining the Justicialist Party founded by Juan Domingo Perón. - -In 1973, Menem was elected governor of La Rioja Province, but his term was cut short by the 1976 military coup that overthrew President Isabel Perón. He was subsequently imprisoned for five years by the military regime. After he was released, he continued his political career and was re-elected as the governor of La Rioja Province in 1983. - -In 1989, Menem became the Peronist party's presidential candidate and won the election with a majority vote. He took office on 8 July 1989, marking the beginning of his ten-year tenure. During his presidency, Argentina underwent significant economic, social, and political transformations. - -Menem's administration was characterized by its commitment to policies of economic liberalization, deregulation, and privatization. These reforms aimed to reduce inflation, attract foreign investments, and modernize the economy. He sold off numerous state-owned enterprises, such as the telephone company, airlines, and oil refineries, to private investors. Menem also implemented a fixed exchange rate system that pegged the Argentine peso to the US dollar, which helped stabilize the Argentine economy and reduce hyperinflation. - -However, the results of these policies were mixed. While Argentina experienced an initial period of economic growth, these reforms ultimately contributed to rising unemployment, income inequality, and an unsustainable fiscal deficit. In the long run, Argentina faced a major economic crisis in 2001, just years after Menem left office, that led to social unrest and political instability. - -Carlos Menem's presidency was also marked by efforts to improve relations with the United States, Europe, and neighboring countries in Latin America. He played a significant role in the establishment of the Southern Common Market (MERCOSUR), a regional trade bloc that aimed to promote economic integration among its member countries Argentina, Brazil, Paraguay, and Uruguay. - -Moreover, Menem's administration was associated with various corruption scandals involving government officials and privatization deals. Several officials in his administration were prosecuted for their involvement in these scandals, which greatly damaged Menem's reputation and cast a shadow on his presidency. - -After leaving office in 1999, Carlos Menem continued his political career as a senator. He also made unsuccessful bids for the presidency in 2003 and 2015. Menem passed away on February 14, 2021, leaving behind a controversial legacy marked by both economic achievements and brushes with corruption." -"Everyone has a family name. My name is Jane Armstrong. Armstrong is my family name. What does Armstrong mean ? Does it mean my arms are strong? But I am a slim girl. I don't like strong arms. My best friend is Lucy Long. Is she a long or a tall girl? No, she isn't. She is short. But she has long hair. Some family names come from jobs. My cousin's name is James Cook. Does it mean he can cook? No, he can't. And he doesn't like cooking at all. He only likes eating nice food. And he likes the TV show A Bite Of China (<<>> ), because it is all about nice food. Some people get family names from places. Ann Hill is my classmate. Is there a hill near her home? Yes, there is one behind her home. But her uncle, Tom Hill, lives 20 kilometers from a hill. Jane Armstrong _ . A) is a girl with strong arms B) wants to have strong arms C) has very strong arms D) doesn't like strong arms -Answer:",D) doesn't like strong arms -"Given the question: I'm taking a test and have to guess the right answer to the question after the article. Article: What do you think about mistakes? Maybe you say no one likes making mistakes. But mistakes lead to growth. Converge Magazine recently published articles about mistakes students should make. It suggests students need to live a balanced life, even in the college environment. According to the topic of the article, there are four mistakes students should make. The mistakes include: Think they pick the wrong major A student should explore any possibility that interests him, and future careers might just be around the corner. Remember, if you don't know what to do, it's OK! Think their teachers know everything Students may think of their teachers as gods who know everything, but that really is not the case. Students should know teachers are the ones who can help us understand better. Students can research answers on their own and get their own opinions instead of having their teachers tell them the answers. Think they get too involved Getting good grades is very important, but it's only a part of the life. Joining clubs and learning about social situations are all good for teenagers' growth. It will not only make the students more knowledgeable but also create interest in their education. Think taking a day off is a waste of time Now, students are under too much pressure. It's necessary for them to relax now and then. But they always keep in mind how that might influence their schoolwork. Take a day off to relax, and you may get an energetic student the next day. Just don't do it too often. Question: The writer thinks that _ . Options: A: students should pick the right major B: getting grades is all for students C: relaxing at times is necessary for students D: teachers shouldn't make mistakes -The answer is:",C: relaxing at times is necessary for students -"Generate a short movie review that has ""ii."" sentiment (Select from: i. negative ii. positive).","Title: Serendipity of Dreams - -Review: - -""Serendipity of Dreams"" is a delightful short film that leaves a lasting impact on its viewers, capturing their hearts with its enchanting narrative and finely-crafted visuals. This artistic masterpiece exudes nothing but positive sentiment, and serves as a testament to the skills of the director, as well as the entire production team that has transformed the script into a vivid, memorable experience. - -The story revolves around two strangers, Emma and Jack, who share a chance encounter in the dreamy, picturesque town of Serendip. Their fleeting, magical meeting sets off a spark that begins to ignite as they realize the serendipitous connection they possess, ultimately leading them to contemplate the idea of fate, choice, and the strength of true love. The brilliant script delves into the nuances of human connection, and puts forth an incredibly authentic portrayal of how the power of serendipity intertwines with that of destiny and personal paths. - -The compelling performances by the lead actors truly bring their realistic, multidimensional characters to life, creating an incomparable on-screen chemistry that makes the viewer instantly invested in their romantic journey. Their expressions and dialogues masterfully convey the whirlwind of emotions experienced in such serendipitous moments. - -Furthermore, the film's cinematography is breathtaking, showcasing the charm and allure of Serendip with the utmost finesse. The rich, vibrant color palette, combined with stunning aerial shots and carefully-angled close-ups, create a visually engaging experience that leave one longing to explore the town themselves. The movie's musical score is yet another strong element that evokes the perfect ambiance, enhancing the emotional impact of pivotal scenes and at the same time complementing the visuals immaculately. - -The director's meticulous attention to detail is evident throughout the entire film, making ""Serendipity of Dreams"" an exemplar of filmmaking, as well as character and story development. The film expertly balances lighthearted moments with thought-provoking themes, making it a cinematic experience that appeals to the viewers on both intellectual and emotional levels. Furthermore, the well-paced narrative ensures that their investment in the characters' journey does not falter, resulting in an immensely satisfying climax that leaves them pondering their own encounters with serendipity long after the credits roll. - -In conclusion, ""Serendipity of Dreams"" is an enchanting short film that truly embodies the positive sentiment it seeks to convey, as it prowls the depths of human connection, the beauty of serendipity, and the transformative power of love. With its compelling performances, breathtaking visuals, and thought-provoking storyline, it is a must-watch for film connoisseurs and hopeless romantics alike, and secures its place as a true jewel in the realm of short films." -Please add spaces between words: HarddriverecoveryMacsoftwareallowsusertorecoverfilesfromformattedharddriveonMacincoupleofmouseclicks.,"Hard drive recovery Mac software allows users to recover files from a formatted hard drive on Mac in a couple of mouse clicks. - -Hard drive recovery on a Mac is a crucial task that may sometimes be essential for users who have either accidentally formatted their hard drive or faced a system crash, leading to the loss of important data. In such cases, hard drive recovery Mac software comes to the rescue, enabling the user to recover their valuable files from a formatted hard drive on their Mac computer. This type of software generally provides an easy-to-use interface that offers effective solutions within just a few mouse clicks. - -There are numerous Mac hard drive recovery software options available on the market, each with their own set of features and capabilities. These software tools usually work by scanning the entire hard drive for lost or deleted files and then providing the user with the option to recover them at their desired location. It is important to choose a reliable and reputable Mac hard drive recovery software that ensures the safety of the data and offers a high recovery rate. - -Some popular Mac hard drive recovery software tools include: - -1. Disk Drill: This powerful recovery software allows users to recover data from virtually any storage device, including internal and external hard drives, USB flash drives, and memory cards. It offers a user-friendly interface and can recover various file formats, such as documents, photos, videos, and audio files. - -2. Stellar Data Recovery: This robust software is designed to recover lost or deleted files on a Mac and supports recovery from multiple file systems, including HFS+, APFS, FAT, and NTFS. Stellar Data Recovery also offers a preview feature that allows users to view the recoverable files before saving them. - -3. EaseUS Data Recovery: EaseUS Data Recovery for Mac is an efficient software that can recover files from various data loss scenarios such as accidental deletion, formatting, virus attack, and operating system crash. It supports the recovery of over 200 different file types, including photos, videos, documents, and emails. - -4. Wondershare Recoverit: This recovery software offers an easy-to-use interface and a high recovery rate for lost or deleted files on a Mac. It supports various file systems and is compatible with both macOS and Windows. - -When using hard drive recovery software for Mac, users should ensure that they do not install the software on the affected hard drive, as this could potentially overwrite the lost data. Instead, the software should be installed on a separate drive or system to maximize the chances of a successful recovery. - -In conclusion, hard drive recovery Mac software is an essential tool for individuals who have experienced data loss due to formatting or other issues on their Mac systems. By selecting a reliable and effective software, users can recover their lost files within a few mouse clicks and regain access to their valuable data." -"Question: Over how many years did Gurian edit the Review of Politics at Notre Dame? - -Is ""For 44 years, the Review was edited by Gurian, Matthew Fitzsimons, Frederick Crosson, and Thomas Stritch."" the correct answer? - [I] yes [II] no","[II] no - -The statement tells us that Gurian, Matthew Fitzsimons, Frederick Crosson, and Thomas Stritch together edited the Review of Politics for 44 years, but it does not tell us the exact number of years Gurian edited it by himself." -"Choices: - + Acids. - + nektar. - + sugar. - + tRNA. - + H 2 O. - + three. - + CO 2. - + HIV. -Given those answer options, answer the question: Fact 1: Molecules of tRNA bring amino acids to the ribosome in the correct sequence. Fact 2: Ribosomes are sites of protein synthesis. Given the two facts above, molecules of _ initiate protein synthesis? -A:","tRNA. - -tRNA, or transfer RNA, is crucial for protein synthesis. In this process, tRNA molecules carry amino acids to the ribosome, following the correct sequence as dictated by the code in the messenger RNA (mRNA). Each tRNA has a specific three-base sequence, called an anticodon, that can pair with its complementary codon on the mRNA. This ensures that the amino acids are added to the growing protein chain in the correct order. This process initiates protein synthesis, making tRNA the best fit for your question. - -In brief, tRNA's role is to translate the genetic code in mRNA to amino acid sequences required for the protein synthesis, thereby initiating the process. So, tRNA is the molecule that initiates protein synthesis." -"and what it was was that identity , your place , who you are , is bestowed . you do nt have to do one thing to earn it . he decides who you are . - -pick from the following. - They are without a job .. - They are losing a family member .. - They are not in control .. - None of the above choices .. -Q: Why may the subject be feeling blue ?","They are not in control. - -The subject may be feeling blue because the statement implies that their identity, place, and sense of self is bestowed upon them, rather than something they actively control. They may feel a lack of agency or autonomy over their lives, which can lead to feelings of sadness or frustration. - -The other options are not supported by the provided information: - -- They are without a job: There is no mention of a job or employment situation in the statement. -- They are losing a family member: The statement doesn't mention a family member or the loss of a loved one. -- None of the above choices: This option is incorrect because ""They are not in control"" is a valid and relevant choice based on the given information." -"the regulatory manager offers you a quick, simple, and complete graphical overview of how your registrations are progressing. - -Write the above sentence using proper case.","The Regulatory Manager offers you a quick, simple, and complete picture of how your sign-ups are going forward." -"Detailed Instructions: In this task you are given a sentence. You must judge whether the main verb of the sentence is in present or past tense. Label the instances as ""Present"" or ""Past"" based on your judgment. If there is no verb in the given text, answer ""Present"". -Q: He clasped his hands in front of him and nodded. -A:","Step 1: Identify the main verb in the sentence. In this sentence, the main verb is ""clasped."" - -Step 2: Determine the tense of the main verb. ""Clasped"" is the past tense of the verb ""clasp."" - -Answer: Past" -"Explain simply why 52 is the correct answer to: The ratio of boys to girls in a family is 5:7. The total number of children in the family is 180. If the boys are given $3900 to share, how much money does each boy receive?. Explanation:","To understand why 52 is the correct answer, let's break it down step by step: - -1. The ratio of boys to girls in the family is 5:7, which means that for every 5 boys in the family, there are 7 girls. - -2. The total number of children in the family is 180. To find out the number of boys and girls, we can use the ratio (5:7) as a fraction of the total: - -Total parts in the ratio = 5 (for boys) + 7 (for girls) = 12 parts - -3. To find the number of boys, we need to find the fraction of the total children represented by boys: - -Number of boys = (5 parts (for boys) / 12 total parts) x 180 total children = (5/12) x 180 = 75 - -So, there are 75 boys in the family. - -4. Now, the boys are given $3900 in total to share. To find out how much each boy receives, we divide the total amount by the number of boys: - -Money received by each boy = $3900 (total amount) / 75 (number of boys) = $52 - -Hence, each boy in the family receives $52." -"Given the task definition and input, reply with output. In this task, you are given a sentence from the research paper and your task is to classify the given sentence into the following categories: Background (Why is this problem important? What relevant works have been created before? What is still missing in the previous works? What are the high-level research questions? How might this help other research or researchers?), Purpose (What specific things do the researchers want to do? What specific knowledge do the researchers want to gain? What specific hypothesis do the researchers want to test?), Method (How did the researchers do the work or find what they sought? What are the procedures and steps of the research?), or Finding (What did the researchers find out? Did the proposed methods work? Did the thing behave as the researchers expected?). - -with protection rates varying between 0 and 80 % according to the geographical area. -",Finding -"Lindsay Dee Lohan (born July 2, 1986) is an American actress, businesswoman, fashion designer and singer. Born and raised in New York, Lohan was signed to Ford Models as a child. Having appeared as a regular on Another World at age 10, her breakthrough came in Disney Pictures' The Parent Trap (1998). - -In July 2007, Lohan's home was burgled by the Bling Ring, a group of fashion-motivated burglars whose ringleader considered Lohan to be their ultimate conquest. Video surveillance of the burglary recorded at Lohan's home played a large role in breaking the case. During the 2008 US presidential campaign, Lohan offered her services to Barack Obama's Democratic election effort, but was declined. In a blog post, Lohan criticized the media and then Republican Vice Presidential candidate Sarah Palin for not focusing on policy, and attacked Palin's positions on homosexuality, birth control and abortion. Lohan had previously expressed an interest in going to Iraq, during the Iraq War in 2006, on a USO tour with Hillary Clinton. In the 2012 presidential election, Lohan supported Republican candidate Mitt Romney, something that prompted ABC News to call her a ""political turncoat"". Only weeks later, she tweeted words supportive of Obama. Speaking about her sexual orientation, Lohan said that she was not a lesbian. When asked if she was bisexual in 2008, she responded ""Maybe. Yeah,"" adding, ""I don't want to classify myself."" However, in a 2013 interview, she said, ""I know I'm straight. I have made out with girls before, and I had a relationship with a girl. ... I think I was looking for something different."" In April 2016, Lohan was studying Islam and considered converting. In October 2017, Lohan received scrutiny for defending Harvey Weinstein, whom she worked with on several films, on Instagram and saying that his wife Georgina Chapman should stay with him. Weinstein had been accused of sexual harassment and sexual assault. - -Using a quote from the above article, answer the following question: What are some controversys Lohan has been involved with?","Some controversies Lohan has been involved with include her political affiliations, such as supporting both Barack Obama and Mitt Romney in different instances, her comments on sexual orientation, defending Harvey Weinstein against sexual harassment and sexual assault allegations, and her interest in converting to Islam. One quote that highlights these controversies is: ""In the 2012 presidential election, Lohan supported Republican candidate Mitt Romney, something that prompted ABC News to call her a 'political turncoat'. Only weeks later, she tweeted words supportive of Obama.""" -"Please answer the following question: Given the following passage ""Nutritionism is the view that excessive reliance on food science and the study of nutrition can lead to poor nutrition and to ill health. It was originally credited to Gyorgy Scrinis, and was popularized by Michael Pollan. Since nutrients are invisible, policy makers rely on nutrition experts to advise on food choices. Because science has an incomplete understanding of how food affects the human body, Pollan argues, nutritionism can be blamed for many of the health problems relating to diet in the Western World today."", answer the following question. Note that the answer is present within the text. Question: Who was the progenitor of the science? -Answer:",Gyorgy Scrinis was the progenitor of the science. -"Answer the following question: - number is 54 - debutteam is pittsburgh steelers - draftpick is 166 - birth date is 24 may 1982 - weight is 243 - nfl is wal475737 - debutyear is 2005 - finalteam is new york sentinels - statlabel is tackles sacks interceptions - heightin is 3 - statvalue is 9 0.0 1 - heightft is 6 - college is temple - birth place is pottstown , pennsylvania - draftyear is 2005 - position is linebacker - draftround is 5 - finalyear is 2009 Given the details above, guess who could this information be about. -Answer:","The information provided seems to refer to Rian Wallace, a former NFL player." -"Produce a long descriptive sentence that uses all these words: Albuquerque, New Mexico, areaOfLand, 486.2 (square kilometres); Albuquerque, New Mexico, populationDensity, 1142.3 (inhabitants per square kilometre); Albuquerque, New Mexico, isPartOf, Bernalillo County, New Mexico; Albuquerque, New Mexico, areaTotal, 490.9 (square kilometres)","Stretching across a vast areaOfLand, totaling 486.2 square kilometres, Albuquerque, New Mexico, boasts a thriving populationDensity of approximately 1142.3 inhabitants per square kilometre, all residing within the expansive city limits which are part of the beautiful Bernalillo County in New Mexico, enveloping an impressive areaTotal of 490.9 square kilometres, encompassing both natural and urban landscapes." -"Write a title for this article: - -Arbitration clauses. They sound innocuous enough. But, in a three part-series about clauses buried in tens of millions of contracts, Jessica Silver-Greenberg and Michael Corkery (along with another reporter, Robert Gebeloff) reported on the way these clauses have deprived Americans of one of their most fundamental constitutional rights: their day in court. - -Read by millions, the series shows how arbitration clauses contained in most contracts — like employment, telephone service, credit cards — have crept into nearly every corner of Americans’ lives. - -Engineered by a Wall Street-led coalition of credit card companies and retailers, arbitration blocks class-action lawsuits and so insulates businesses from challenges to practices like predatory lending, wage theft and discrimination. Not surprisingly the rules of arbitration create an alternate system of privatized justice that largely favors the business interests. This is not good news for consumers. - -In this podcast, Ms. Silver-Greenberg and Mr. Corkery talk about spending months sifting through court documents and interviewing hundreds of lawyers, corporate executives, judges, arbitrators and plaintiffs in 35 states. - -Susan Lehman is the host. - -Title:","""The Sneaky Clauses Taking Away Your Day in Court: How Arbitration Affects You""" -"Definition: In this task, you are given a hateful post in Bengali that expresses hate or encourages violence in a geopolitical context based on the protected characteristics such as race, religion, sex, and sexual orientation. You are expected to classify the post into two classes: geopolitical or non-geopolitical depending on the topic. -Input: এই রকম একটা মাল রেন্ডিয়ায় আছে নাকি রে? পাকিস্তান কে ঘৃনা করলেও তাদের এসব পারমানবিকের কাছে তুরাই তাল হারাবি -Output:","geopolitical - -Step 1: Understand the text -I analyze the text to understand its meaning. In this text, the author is using hateful language to refer to India (রেন্ডিয়া) and Pakistan (পাকিস্তান) in the context of geopolitical issues such as nuclear weapons (পারমানবিক). - -Step 2: Identify protected characteristics -The post is disparaging a country based on its nationality, which is a protected characteristic. - -Step 3: Determine the classification -Since the post is targeting countries through the use of derogatory language and discussing issues related to nuclear weapons, it is clear that this post is expressing hate and encouraging violence in a geopolitical context. Therefore, the appropriate classification is ""geopolitical.""" -"Student: Premise: ""Young pretty blond women holding a tennis racket dressed as if to begin a tennis match."" -Hypothesis: ""The woman is ready to play football."" -Is the hypothesis entailed by the premise? -Options: -- yes -- it is not possible to tell -- no. -Teacher: Let's think: -","The premise talks about a young pretty blonde woman holding a tennis racket and dressed for a tennis match. The hypothesis mentions the woman being ready to play football. Given the information in the premise, we can conclude that the hypothesis is not entailed by the premise. So, the answer is: - -- no." -"Write the next sentence in the following story. - -How to ask a coworker on a date -Determine if your coworker is single. -Before you ever approach your coworker about going on a date, you should ensure that he or she is actually single. This can save you both a lot of time and embarrassment, and it can help keep your working relationship unaffected.","Next, try to become friends with your coworker by talking and playing together, like you do with your other friends at school, so both of you feel comfy and happy around each other." -Write a tweet that is negative.,"A negative tweet could be one that talks about something sad or not nice. For example, ""I am so upset that it rained all day and I couldn't go to the park to play with my friends. ☹️🌧️"" This tweet is negative because it talks about being unhappy and not being able to have fun." -"Please answer the following question: What is the final step of the following process: - You place aluminum cans and other products into recycling bins - Your town or a private company collect and transport the aluminum to a recycling facility - The aluminum is sorted and cleaned at the central recycling facility - The aluminum is melted down to remove coatings and inks - The melted aluminum is formed into large formations called ingots - The ingots are transported to another facility and rolled out to make them easier to manipulate -Answer:","The final step is: The rolled-out aluminum is then used to manufacture new products, such as aluminum cans, foil, and other items, completing the recycling process." -"Read the following paragraph and determine if the hypothesis is true: - -How to store banana bread
Make sure the banana bread is fully cooled before you try to store it. Use your hands to feel the banana bread; if it's still warm, let it cool longer. Storing warm banana bread in a sealed container can cause condensation to form, which will make the bread soggy. - -Hypothesis: Containers with warm Banana bread, as long as they are sealed, have no drawbacks.","Well, little buddy, the hypothesis is not true. The paragraph says that if we put warm banana bread into a sealed container, moisture (like tiny water drops) will form inside. This will make the banana bread soggy and not as yummy. So, it's better to let the banana bread cool down before storing it in a container." -"Kollegamme Happartin mietintö on viimeinen mietintö, joka koskee nykyisen YMP: n maataloushintoja. - -Which language is this?","This language is Finnish. It's a language spoken mainly in Finland and is a part of the Finno-Ugric language family. The sentence you provided talks about a colleague, a report, and agricultural prices related to the current YMP (probably the Common Agricultural Policy in Europe)." -"What key details about la fouine can be extracted from the following bio? Bio: laouni mouhid -lrb- born december 25 , 1981 in trappes , yvelines -rrb- , commonly known by his stage name la fouine -lrb- ; -rrb- or fouiny baby , is a french rapper , singer , songwriter and actor of moroccan origin . he owns his own record label , banlieue sale music , and his own clothing line called `` street swagg '' . he is an established figure in french rap . -Answer:","1. Laouni Mouhid is La Fouine's real name. -2. Date of birth: December 25, 1981. -3. Place of birth: Trappes, Yvelines, France. -4. La Fouine is of Moroccan origin. -5. He is a French rapper, singer, songwriter, and actor. -6. La Fouine has an alternative stage name, Fouiny Baby. -7. Owns record label Banlieue Sale Music. -8. Owns clothing line named Street Swagg. -9. Established figure in French rap scene." -"I am a movie director and I just received the following movie plot. Could you help me answer this question? If not, let me know by writing ""Not answerable"". Plot title: Practical Magic Movie plot: When Maria, the witch ancestor of our protagonists, realizes that her lover is never going to come for her, she casts a spell on herself to never fall in love again. Unfortunately, the spell goes awry and becomes a family curse: any man that falls for an Owens woman will die. And that's exactly what happens to Sally (Sandra Bullock) and Gillian (Nicole Kidman) Owens' father, causing their mother to die of a broken heart. The young girls then live with their two aunts (Stockard Channing, Diane Wiest), who teach them the ways of being a witch and how to deal with the ridicule that comes with the family profession. But one night when they witness their aunts casting a love spell for a neighbor, Sally decides she will never fall in love and dreams up a man that will never exist...Until one day she goes to town with her aunts and she meets the man she falls for. The next thing you know, Sally is happily married to Michael (Mark Feuerstein) with two daughters of her very own. Her sister, in the mean time, has been living in Florida where life is constant parties.But when the 'death watch beetle' sounds, Sally know it is only a matter of time before she loses Michael like her mother lost her father...and like all the Owens women have lost the men they love. It is only when the curse plays out that she learns her aunts cast the spell on her to fall for him in the first place. She allows her daughters to live with the aunts who raised her, telling them that her daughters are to never do magic.With Michael's tragic death, the sisters reunite and it's Gillian who prunners Sally to forgive herself and move on. But tragedy strikes twice when the sisters again reunite, this time when Gilly calls because her boyfriend, Jimmy (Goran Visnjic), begins beating her. It is his accidental death that makes them toy with nature; hoping to bring him back so they won't be arrested. They succeed, but are forced to actually kill him this time when he tries to strangle Gilly.Jimmy, however, is haunting them. And the aunts leave when the... My question: What did Gary fall in love with? -Answer:",Not answerable. -"Question: Extract the answer to the following question from the movie plot. If the question isn't answerable, please output ""Can't answer"". Question: What type of animal did he find buried alive? Title: Antichrist Movie plot: Prologue[edit] A couple makes passionate love, as their toddler, Nic, climbs up to the bedroom window and falls to his death. Chapter One: Grief[edit] The mother collapses at the funeral, and spends the next month in the hospital crippled with atypical grief. The father, a therapist, is skeptical of the psychiatric care she is receiving and takes it upon himself to treat her personally with psychotherapy. But it is not successful, and so when she reveals that her second greatest fear is nature, he decides to try exposure therapy. They hike to their isolated cabin in a woods called Eden, where she spent time with Nic the previous summer while writing a thesis on gynocide. He encounters a doe which shows no fear of him, and has a stillborn fawn hanging halfway out of her. Chapter Two: Pain (Chaos Reigns)[edit] During sessions of psychotherapy, she becomes increasingly grief stricken and manic, often demanding forceful sex to escape the pain. The area becomes increasingly sinister to the man, including acorns rapidly pelting the metal roof, awakening with a hand covered in swollen ticks, and finding a self-disemboweling fox that tells him, ""chaos reigns."" Chapter Three: Despair (Gynocide)[edit] In the dark attic the man finds the woman’s thesis studies: terrifying pictures of witch-hunts, and a scrapbook in which her writing becomes increasingly frantic and illegible. She reveals that while writing her thesis, she came to believe that all women are inherently evil. The man is repulsed by this and reproaches her for buying into the gynocidal beliefs she had originally set out to criticize. In a frenzied moment, they have violent intercourse at the base of an ominous dead tree, where bodies are intertwined within the exposed roots. He suspects that Satan is her greatest, and hidden fear. Through the autopsy and old photos, he becomes aware that she had been systematically putting Nic’s shoes on the wrong feet, resulting in pain and deformity. She attacks him, accuses him of planning to leave her, mounts him,... -Answer:",Can't answer -"Please answer the following question: Read the article and select the best answer. Article: As we all know, the ocean moves. But waves breaking on the beach make the ocean fun. When you stand on the shore and look at the waves, it seems like the water is moving towards you. But the water is not really moving forward. The moving you see is wave energy. And wave energy comes from the wind. Let's think about how this works. As wave energy passes through the water, the energy makes particles of water move up and down. Just give you an example of a wave passing under a basketball. We put a basketball on the sea. When the wind blows, a wave comes from behind the basketball. The basketball moves up to the top with the wave. Then the wave continues and leaves the basketball behind. The basketball looks lower, but it doesn't move forward. That's because the wave energy just moves the water which is under the basketball. So why can you see a wave knock you down on the shore?When a wave moves toward the shore, the bottom of the wave slows down because _ meets the ocean floor. But the top, which is called crest , keeps moving. The different action causes the wave to fall over or break onto the shore. If a wave is very large, it carries a lot of energy when it hits the land. As time goes by, waves can break up and carry away the rocks and other things on the shore. Shorelines are changing all the time because of wave action. Question: Which of the following is NOT true according to the passage? Options: A: Wave energy comes from the water. B: Large waves carry plenty of energy. C: Wave action makes shorelines change all the time. D: The bottom of the wave is easy to slow down. -Answer:",A: Wave energy comes from the water. -"You are considering whether to buy a product. You look at the reviews. Would the following review decrease or increase the chances of you buying the product? Review title: Incredible Picture on HD DVD and a great Movie! Product review: First, I'm prevewing this HD DVD combo version of this film.This is a very unusual story. It's interesting and romantic. I can't reveil the content of the story without spoiling the enjoyment of watching it. It is a creative movie with new ideas, perhaps never attempted before.The HD DVD picture quality on this combo version is absolutely awsome on my 101"" projected screen via HDMI on my Toshiba HD-A1. It does display film like quality and the transfer was clean.The standrad DVD version (on the back!) is also sharp. Well worth the money! -The answer to this question is:","The given review would likely increase the chances of you buying the product. Here's a detailed breakdown of the factors contributing to this increased likelihood: - -1. Positive review title: The title ""Incredible Picture on HD DVD and a great Movie!"" clearly indicates a positive stance toward the product, implying that the reviewer had a satisfactory experience. - -2. Unusual and interesting story: The reviewer mentions that the movie has an unusual and interesting story, which is romantic in nature. This suggests that the plot is engaging and might appeal to audiences looking for something different and captivating. - -3. Praise for creativity and new ideas: The reviewer praises the movie for its creativity and states that it has ""new ideas, perhaps never attempted before."" This can be a strong selling point for people looking for novelty and uniqueness in their movie choices. - -4. High-quality visual experience: The reviewer provides specific details about their positive experience with the HD DVD picture quality. They mention that the movie looks ""awesome"" on their large projected screen using HDMI with their Toshiba HD-A1 system. This testimony from someone who has experienced this firsthand can be persuasive for potential buyers. - -5. Clean transfer: The review also mentions that the transfer between different formats was clean, suggesting that the product's technical quality is good and reliable. - -6. Value for money: The last statement in the review confirms that the product is ""well worth the money."" This indicates that the reviewer felt the product was a good investment, which can further increase the chances of other potential buyers considering a purchase. - -Taking all these factors into account, it's apparent that the given review would generally increase the chances of you buying the product. The positivity, detailed comments on the movie's story and quality, and the overall satisfaction expressed by the reviewer are persuasive elements that can influence a purchase decision." -"Answer the question - -Frank needs to move a box by sliding it across the floor. Which two factors will most strongly affect how hard Frank needs to push the box?","Alright, little buddy! Imagine Frank is trying to slide a big toy box across the floor. There are two main things that make it harder or easier for him to push the box: - -1. Weight of the box: If the box is very heavy, like when it's full of toys, it's harder for Frank to push. But if the box is lighter, with just a few toys, it's easier for him to push. - -2. Slipperiness of the floor: If the floor is very smooth and slippery, like an ice rink, the box will slide easily, and Frank won't need to push too hard. But if the floor is rough or sticky, like a rug, it's harder for Frank to push the box. - -So, the weight of the box and the slipperiness of the floor are the two factors that most affect how hard Frank needs to push the box." -"Ash bragged to all their friends that they had managed to make tons of money. Given the context: What does Ash need to do before this? Possible answers: congratulate Ash, find ways to make tons of money, praise Ash -The answer to this question is:",find ways to make tons of money -"Michael has $42. Michael gives away half the money to his brother. His brother then buys 3 dollars worth of candy. If his brother has $35 left, how much money, in dollars, did his brother have at first? Let's answer step by step:","Step 1: Determine how much money Michael gave to his brother. -Michael had $42 and gave away half of it, so we need to find half of $42. -$42 ÷ 2 = $21 - -So, Michael gave his brother $21. - -Step 2: Determine how much money his brother had after receiving the money from Michael. -His brother bought $3 worth of candy after receiving the $21 from Michael. To find out how much money he had after buying the candy, we'll subtract $3 from $21. -$21 - $3 = $18 - -So, after buying the candy, his brother had $18. - -Step 3: Determine how much money his brother had at first. -Since his brother now has $35 left, and he had $18 after buying the candy, we need to find out how much his brother had initially before receiving money from Michael and buying the candy. We will add this initial amount to the $18 to get $35. -Initial amount + $18 = $35 - -To find the initial amount, we'll subtract $18 from $35. -$35 - $18 = $17 - -Therefore, his brother initially had $17." diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index eb61838b..05569ce3 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -16,8 +16,8 @@ TOVAPress, ) from kvpress.presses.think_press import ThinKPress -from kvpress.prunners.default_press import DefaultPress -from kvpress.scorers.base_scorer import BaseScorer +from kvpress.presses.scorer_press import ScorerPress +from kvpress.presses.scorers.base_scorer import BaseScorer from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 @@ -73,7 +73,7 @@ def test_presses_keep_highest_score(unit_test_model): # noqa: F811 Test that kept keys are those with the highest score """ for compresion_ratio in [0.0, 0.2, 0.4, 0.6, 0.8]: - press = DefaultPress(compression_ratio=compresion_ratio, scorer=StoreKnormScorer()) + press = ScorerPress(compression_ratio=compresion_ratio, scorer=StoreKnormScorer()) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values From fa78b826a62ca916d1ac27622c616e11fa1b46f0 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 10:59:52 +0100 Subject: [PATCH 34/51] make field non mutable --- kvpress/presses/expected_attention_press.py | 12 +++++------- kvpress/presses/knorm_press.py | 6 +----- kvpress/presses/observed_attention_press.py | 2 +- kvpress/presses/random_press.py | 6 +----- kvpress/presses/snapkv_press.py | 8 +++----- kvpress/presses/streaming_llm_press.py | 4 ++-- kvpress/presses/tova_press.py | 2 +- tests/presses/test_presses.py | 2 +- 8 files changed, 15 insertions(+), 27 deletions(-) diff --git a/kvpress/presses/expected_attention_press.py b/kvpress/presses/expected_attention_press.py index 4cfc687b..abb31c4a 100644 --- a/kvpress/presses/expected_attention_press.py +++ b/kvpress/presses/expected_attention_press.py @@ -6,7 +6,7 @@ @dataclass class ExpectedAttentionPress(ScorerPress): - scorer: ExpectedAttentionScorer = field(default_factory=ExpectedAttentionScorer) + scorer: ExpectedAttentionScorer = field(default_factory=ExpectedAttentionScorer, init=False) compression_ratio: float = 0.0 n_future_positions: int = 512 n_sink: int = 4 @@ -14,10 +14,8 @@ class ExpectedAttentionPress(ScorerPress): use_vnorm: bool = True def __post_init__(self): - self.scorer = ExpectedAttentionScorer( - n_future_positions=self.n_future_positions, - n_sink=self.n_sink, - use_covariance=self.use_covariance, - use_vnorm=self.use_vnorm, - ) + self.scorer.n_future_positions = self.n_future_positions + self.scorer.n_sink = self.n_sink + self.scorer.use_covariance = self.use_covariance + self.scorer.use_vnorm = self.use_vnorm super().__post_init__() diff --git a/kvpress/presses/knorm_press.py b/kvpress/presses/knorm_press.py index 92a91eff..7d2f7475 100644 --- a/kvpress/presses/knorm_press.py +++ b/kvpress/presses/knorm_press.py @@ -6,9 +6,5 @@ @dataclass class KnormPress(ScorerPress): - scorer: KnormScorer = field(default_factory=KnormScorer) + scorer: KnormScorer = field(default_factory=KnormScorer, init=False) compression_ratio: float = 0.0 - - def __post_init__(self): - self.scorer = KnormScorer() - super().__post_init__() diff --git a/kvpress/presses/observed_attention_press.py b/kvpress/presses/observed_attention_press.py index 0c88e850..35825e10 100644 --- a/kvpress/presses/observed_attention_press.py +++ b/kvpress/presses/observed_attention_press.py @@ -21,7 +21,7 @@ class ObservedAttentionPress(ScorerPress): It will not return attentions in its output to save memory. """ - scorer: ObservedAttentionScorer = field(default_factory=ObservedAttentionScorer) + scorer: ObservedAttentionScorer = field(default_factory=ObservedAttentionScorer, init=False) compression_ratio: float = 0.0 output_attentions: bool = False diff --git a/kvpress/presses/random_press.py b/kvpress/presses/random_press.py index 52756575..291b087a 100644 --- a/kvpress/presses/random_press.py +++ b/kvpress/presses/random_press.py @@ -6,9 +6,5 @@ @dataclass class RandomPress(ScorerPress): - scorer: RandomScorer = field(default_factory=RandomScorer) + scorer: RandomScorer = field(default_factory=RandomScorer, init=False) compression_ratio: float = 0.0 - - def __post_init__(self): - self.scorer = RandomScorer() - super().__post_init__() diff --git a/kvpress/presses/snapkv_press.py b/kvpress/presses/snapkv_press.py index 567605c7..927e7e6a 100644 --- a/kvpress/presses/snapkv_press.py +++ b/kvpress/presses/snapkv_press.py @@ -6,14 +6,12 @@ @dataclass class SnapKVPress(ScorerPress): - scorer: SnapKVScorer = field(default_factory=SnapKVScorer) + scorer: SnapKVScorer = field(default_factory=SnapKVScorer, init=False) compression_ratio: float = 0.0 window_size: int = 64 kernel_size: int = 5 def __post_init__(self): - self.scorer = SnapKVScorer( - window_size=self.window_size, - kernel_size=self.kernel_size, - ) + self.scorer.window_size = self.window_size + self.scorer.kernel_size = self.kernel_size super().__post_init__() diff --git a/kvpress/presses/streaming_llm_press.py b/kvpress/presses/streaming_llm_press.py index 930f9ae1..13ecdc0a 100644 --- a/kvpress/presses/streaming_llm_press.py +++ b/kvpress/presses/streaming_llm_press.py @@ -6,10 +6,10 @@ @dataclass class StreamingLLMPress(ScorerPress): - scorer: StreamingLLMScorer = field(default_factory=StreamingLLMScorer) + scorer: StreamingLLMScorer = field(default_factory=StreamingLLMScorer, init=False) compression_ratio: float = 0.0 n_sink: int = 4 def __post_init__(self): - self.scorer = StreamingLLMScorer(n_sink=self.n_sink) + self.scorer.n_sink = self.n_sink super().__post_init__() diff --git a/kvpress/presses/tova_press.py b/kvpress/presses/tova_press.py index 166d4a4a..94b001d1 100644 --- a/kvpress/presses/tova_press.py +++ b/kvpress/presses/tova_press.py @@ -6,7 +6,7 @@ @dataclasses.dataclass class TOVAPress(ScorerPress): - scorer: TOVAScorer = dataclasses.field(default_factory=TOVAScorer) + scorer: TOVAScorer = dataclasses.field(default_factory=TOVAScorer, init=False) compression_ratio: float = 0.0 window_size: int = 1 diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 05569ce3..52c7f7be 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -15,9 +15,9 @@ StreamingLLMPress, TOVAPress, ) -from kvpress.presses.think_press import ThinKPress from kvpress.presses.scorer_press import ScorerPress from kvpress.presses.scorers.base_scorer import BaseScorer +from kvpress.presses.think_press import ThinKPress from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 From fc644f4a42d8af564c35ef097fc9eb38ea5a2cbd Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 11:07:34 +0100 Subject: [PATCH 35/51] fix field init --- kvpress/presses/expected_attention_press.py | 10 ++++++---- kvpress/presses/knorm_press.py | 3 +++ kvpress/presses/observed_attention_press.py | 3 ++- kvpress/presses/random_press.py | 3 +++ kvpress/presses/scorers/tova_scorer.py | 1 - kvpress/presses/snapkv_press.py | 3 +-- kvpress/presses/streaming_llm_press.py | 2 +- 7 files changed, 16 insertions(+), 9 deletions(-) diff --git a/kvpress/presses/expected_attention_press.py b/kvpress/presses/expected_attention_press.py index abb31c4a..c023e78c 100644 --- a/kvpress/presses/expected_attention_press.py +++ b/kvpress/presses/expected_attention_press.py @@ -14,8 +14,10 @@ class ExpectedAttentionPress(ScorerPress): use_vnorm: bool = True def __post_init__(self): - self.scorer.n_future_positions = self.n_future_positions - self.scorer.n_sink = self.n_sink - self.scorer.use_covariance = self.use_covariance - self.scorer.use_vnorm = self.use_vnorm + self.scorer = ExpectedAttentionScorer( + n_future_positions=self.n_future_positions, + n_sink=self.n_sink, + use_covariance=self.use_covariance, + use_vnorm=self.use_vnorm, + ) super().__post_init__() diff --git a/kvpress/presses/knorm_press.py b/kvpress/presses/knorm_press.py index 7d2f7475..a6682790 100644 --- a/kvpress/presses/knorm_press.py +++ b/kvpress/presses/knorm_press.py @@ -8,3 +8,6 @@ class KnormPress(ScorerPress): scorer: KnormScorer = field(default_factory=KnormScorer, init=False) compression_ratio: float = 0.0 + + def __post_init__(self): + self.scorer = KnormScorer() diff --git a/kvpress/presses/observed_attention_press.py b/kvpress/presses/observed_attention_press.py index 35825e10..1936edc1 100644 --- a/kvpress/presses/observed_attention_press.py +++ b/kvpress/presses/observed_attention_press.py @@ -26,12 +26,13 @@ class ObservedAttentionPress(ScorerPress): output_attentions: bool = False def __post_init__(self): - super().__post_init__() + self.scorer = ObservedAttentionScorer() if not self.output_attentions: logger.warning( "Model will not return attentions in its output to save memory. Please use DefaultPruner if" " attentions are needed in the output." ) + super().__post_init__() def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): output = super().forward_hook(module, input, kwargs, output) diff --git a/kvpress/presses/random_press.py b/kvpress/presses/random_press.py index 291b087a..7ec90e33 100644 --- a/kvpress/presses/random_press.py +++ b/kvpress/presses/random_press.py @@ -8,3 +8,6 @@ class RandomPress(ScorerPress): scorer: RandomScorer = field(default_factory=RandomScorer, init=False) compression_ratio: float = 0.0 + + def __post_init__(self): + self.scorer = RandomScorer() diff --git a/kvpress/presses/scorers/tova_scorer.py b/kvpress/presses/scorers/tova_scorer.py index 57a8024d..09b1c6f0 100644 --- a/kvpress/presses/scorers/tova_scorer.py +++ b/kvpress/presses/scorers/tova_scorer.py @@ -20,7 +20,6 @@ class TOVAScorer(SnapKVScorer): Official implementation can be found here: https://github.com/schwartz-lab-NLP/TOVA/blob/main/src/tova_cache.py """ - compression_ratio: float = 0.0 window_size: int = 1 # re-use the attention weight computation from SnapKVPress for last token def score( diff --git a/kvpress/presses/snapkv_press.py b/kvpress/presses/snapkv_press.py index 927e7e6a..daa2b991 100644 --- a/kvpress/presses/snapkv_press.py +++ b/kvpress/presses/snapkv_press.py @@ -12,6 +12,5 @@ class SnapKVPress(ScorerPress): kernel_size: int = 5 def __post_init__(self): - self.scorer.window_size = self.window_size - self.scorer.kernel_size = self.kernel_size + self.scorer = SnapKVScorer(window_size=self.window_size, kernel_size=self.kernel_size) super().__post_init__() diff --git a/kvpress/presses/streaming_llm_press.py b/kvpress/presses/streaming_llm_press.py index 13ecdc0a..9276b404 100644 --- a/kvpress/presses/streaming_llm_press.py +++ b/kvpress/presses/streaming_llm_press.py @@ -11,5 +11,5 @@ class StreamingLLMPress(ScorerPress): n_sink: int = 4 def __post_init__(self): - self.scorer.n_sink = self.n_sink + self.scorer = StreamingLLMScorer(n_sink=self.n_sink) super().__post_init__() From 4476336be873d310efffd3380817ceaafbc121fa Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 11:41:13 +0100 Subject: [PATCH 36/51] fix failing tests --- tests/presses/test_presses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 52c7f7be..bf020c19 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -33,7 +33,7 @@ def test_presses_run(unit_test_model): # noqa: F811 for compression_ratio in [0.2, 0.4, 0.6, 0.8]: press = cls(compression_ratio=compression_ratio) if cls in [SnapKVPress]: - press.press.window_size = 2 + press.scorer.window_size = 2 with press(unit_test_model): input_ids = unit_test_model.dummy_inputs["input_ids"] unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values From 75ecce8ca03195b357f7ed58886f8fad237abf6a Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 11:52:15 +0100 Subject: [PATCH 37/51] address pr feedback --- evaluation/evaluate.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/evaluation/evaluate.py b/evaluation/evaluate.py index 21d1d528..953c6aff 100644 --- a/evaluation/evaluate.py +++ b/evaluation/evaluate.py @@ -9,22 +9,21 @@ import torch from datasets import load_dataset from fire import Fire -from infinite_bench.calculate_metrics import calculate_metrics as infinite_bench_scorer -from loogle.calculate_metrics import calculate_metrics as loogle_scorer -from ruler.calculate_metrics import calculate_metrics as ruler_scorer from tqdm import tqdm from transformers import pipeline -from zero_scrolls.calculate_metrics import calculate_metrics as zero_scrolls_scorer +from infinite_bench.calculate_metrics import calculate_metrics as infinite_bench_scorer from kvpress import ( ExpectedAttentionPress, KnormPress, ObservedAttentionPress, - ObservedAttentionScorer, RandomPress, SnapKVPress, StreamingLLMPress, ) +from loogle.calculate_metrics import calculate_metrics as loogle_scorer +from ruler.calculate_metrics import calculate_metrics as ruler_scorer +from zero_scrolls.calculate_metrics import calculate_metrics as zero_scrolls_scorer logger = logging.getLogger(__name__) @@ -123,7 +122,7 @@ def evaluate( press.compression_ratio = compression_ratio # Initialize pipeline with the correct attention implementation - if isinstance(press.scorer, ObservedAttentionScorer): + if isinstance(press, ObservedAttentionPress): model_kwargs = {"attn_implementation": "eager"} else: try: From c81d2cee347285bb0c911259d39d6cd19cee24b6 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 12:03:56 +0100 Subject: [PATCH 38/51] address pr feedback --- kvpress/presses/knorm_press.py | 1 + kvpress/presses/random_press.py | 1 + 2 files changed, 2 insertions(+) diff --git a/kvpress/presses/knorm_press.py b/kvpress/presses/knorm_press.py index a6682790..eb2ae7fb 100644 --- a/kvpress/presses/knorm_press.py +++ b/kvpress/presses/knorm_press.py @@ -11,3 +11,4 @@ class KnormPress(ScorerPress): def __post_init__(self): self.scorer = KnormScorer() + super().__post_init__() diff --git a/kvpress/presses/random_press.py b/kvpress/presses/random_press.py index 7ec90e33..294d3fdb 100644 --- a/kvpress/presses/random_press.py +++ b/kvpress/presses/random_press.py @@ -11,3 +11,4 @@ class RandomPress(ScorerPress): def __post_init__(self): self.scorer = RandomScorer() + super().__post_init__() From 91a542f25570c38f1a0e9aed28d6ab6963e7c9cb Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:10:08 +0100 Subject: [PATCH 39/51] remove scorer --- evaluation/evaluate.py | 8 +- kvpress/__init__.py | 8 - kvpress/pipeline.py | 4 +- kvpress/presses/expected_attention_press.py | 132 +++++++++++++++-- kvpress/presses/knorm_press.py | 22 ++- kvpress/presses/observed_attention_press.py | 27 +++- .../presses/per_layer_compression_press.py | 3 +- kvpress/presses/random_press.py | 22 ++- kvpress/presses/scorer_press.py | 38 ++++- kvpress/presses/scorers/__init__.py | 2 - kvpress/presses/scorers/base_scorer.py | 46 ------ .../scorers/expected_attention_scorer.py | 137 ------------------ kvpress/presses/scorers/knorm_scorer.py | 23 --- .../scorers/observed_attention_scorer.py | 38 ----- kvpress/presses/scorers/random_scorer.py | 23 --- kvpress/presses/scorers/snapkv_scorer.py | 90 ------------ .../presses/scorers/streaming_llm_scorer.py | 40 ----- kvpress/presses/scorers/tova_scorer.py | 49 ------- kvpress/presses/snapkv_press.py | 83 ++++++++++- kvpress/presses/streaming_llm_press.py | 33 ++++- kvpress/presses/tova_press.py | 46 +++++- tests/presses/test_presses.py | 3 +- tests/test_press_call.py | 3 +- 23 files changed, 359 insertions(+), 521 deletions(-) delete mode 100644 kvpress/presses/scorers/__init__.py delete mode 100644 kvpress/presses/scorers/base_scorer.py delete mode 100644 kvpress/presses/scorers/expected_attention_scorer.py delete mode 100644 kvpress/presses/scorers/knorm_scorer.py delete mode 100644 kvpress/presses/scorers/observed_attention_scorer.py delete mode 100644 kvpress/presses/scorers/random_scorer.py delete mode 100644 kvpress/presses/scorers/snapkv_scorer.py delete mode 100644 kvpress/presses/scorers/streaming_llm_scorer.py delete mode 100644 kvpress/presses/scorers/tova_scorer.py diff --git a/evaluation/evaluate.py b/evaluation/evaluate.py index 953c6aff..b82018b2 100644 --- a/evaluation/evaluate.py +++ b/evaluation/evaluate.py @@ -9,10 +9,13 @@ import torch from datasets import load_dataset from fire import Fire +from infinite_bench.calculate_metrics import calculate_metrics as infinite_bench_scorer +from loogle.calculate_metrics import calculate_metrics as loogle_scorer +from ruler.calculate_metrics import calculate_metrics as ruler_scorer from tqdm import tqdm from transformers import pipeline +from zero_scrolls.calculate_metrics import calculate_metrics as zero_scrolls_scorer -from infinite_bench.calculate_metrics import calculate_metrics as infinite_bench_scorer from kvpress import ( ExpectedAttentionPress, KnormPress, @@ -21,9 +24,6 @@ SnapKVPress, StreamingLLMPress, ) -from loogle.calculate_metrics import calculate_metrics as loogle_scorer -from ruler.calculate_metrics import calculate_metrics as ruler_scorer -from zero_scrolls.calculate_metrics import calculate_metrics as zero_scrolls_scorer logger = logging.getLogger(__name__) diff --git a/kvpress/__init__.py b/kvpress/__init__.py index e9130f4d..d3e3ab05 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -9,14 +9,6 @@ from kvpress.presses.per_layer_compression_press import PerLayerCompressionPress from kvpress.presses.random_press import RandomPress from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.expected_attention_scorer import ExpectedAttentionScorer -from kvpress.presses.scorers.knorm_scorer import KnormScorer -from kvpress.presses.scorers.observed_attention_scorer import ObservedAttentionScorer -from kvpress.presses.scorers.random_scorer import RandomScorer -from kvpress.presses.scorers.snapkv_scorer import SnapKVScorer -from kvpress.presses.scorers.streaming_llm_scorer import StreamingLLMScorer -from kvpress.presses.scorers.tova_scorer import TOVAScorer from kvpress.presses.snapkv_press import SnapKVPress from kvpress.presses.streaming_llm_press import StreamingLLMPress from kvpress.presses.think_press import ThinKPress -from kvpress.presses.tova_press import TOVAPress diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index 8f2da8b2..3066e1f3 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -11,8 +11,8 @@ from transformers.pipelines import PIPELINE_REGISTRY from transformers.pipelines.base import GenericTensor +from kvpress import ObservedAttentionPress from kvpress.presses.base_press import BasePress -from kvpress.presses.scorers.observed_attention_scorer import ObservedAttentionScorer logger = logging.getLogger(__name__) @@ -167,7 +167,7 @@ def _forward( self.model( input_ids=context_ids, past_key_values=cache, - output_attentions=isinstance(getattr(press, "scorer", None), ObservedAttentionScorer), + output_attentions=isinstance(press, ObservedAttentionPress), num_logits_to_keep=1, ) diff --git a/kvpress/presses/expected_attention_press.py b/kvpress/presses/expected_attention_press.py index c023e78c..cfb28d5f 100644 --- a/kvpress/presses/expected_attention_press.py +++ b/kvpress/presses/expected_attention_press.py @@ -1,23 +1,133 @@ -from dataclasses import dataclass, field +import inspect +import math +from dataclasses import dataclass + +import torch +from torch import nn +from torch.nn import functional as F +from transformers.models.llama.modeling_llama import repeat_kv from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.expected_attention_scorer import ExpectedAttentionScorer @dataclass class ExpectedAttentionPress(ScorerPress): - scorer: ExpectedAttentionScorer = field(default_factory=ExpectedAttentionScorer, init=False) + """ + Compute scores based on the expected attention on next positions. To do so + 1. Compute the mean and covariance matrix of the queries before RoPE. + 2. Compute the RoPE rotation matrix R on next n_future_positions and average it + 3. Apply R to the mean and covariance matrice of the queries. + 4. As attention A = exp(Q @ K / sqrt(d)), we compute the expected attention + E(A) = exp(K @ mean.T / sqrt(d) + 1/2 K @ cov @ K.T / d) + 5. Rescale the scores by the norm of the values + The first n_sink tokens are removed from calculations (sink attention phenomenon). + """ + compression_ratio: float = 0.0 n_future_positions: int = 512 n_sink: int = 4 use_covariance: bool = True use_vnorm: bool = True - def __post_init__(self): - self.scorer = ExpectedAttentionScorer( - n_future_positions=self.n_future_positions, - n_sink=self.n_sink, - use_covariance=self.use_covariance, - use_vnorm=self.use_vnorm, - ) - super().__post_init__() + def get_query_statistics(self, module: nn.Module, hidden_states: torch.Tensor): + """ + Compute the mean and covariance matrix of the queries + """ + + bsz, q_len, _ = hidden_states.shape + n, d = module.num_heads, module.head_dim + + # Remove first hidden_states that likely contain outliers + h = hidden_states[:, self.n_sink :] + + if hasattr(module, "q_proj"): + Wq = module.q_proj.weight + elif hasattr(module, "qkv_proj"): + Wq = module.qkv_proj.weight[: n * d] + else: + raise NotImplementedError(f"ExpectedAttentionPress not yet implemented for {module.__class__}.") + + # Query mean + mean_h = torch.mean(h, dim=1, keepdim=True) + mu = torch.matmul(mean_h, Wq.T).squeeze(1) + mu = mu.view(bsz, n, d) + + # Query covariance + cov = None + if self.use_covariance: + h = h - mean_h + cov = torch.matmul(h.transpose(1, 2), h) / h.shape[1] + cov = torch.matmul(Wq, torch.matmul(cov, Wq.T)) # TODO: not optimal + cov = cov.view(bsz, n, d, n, d).diagonal(dim1=1, dim2=3) + cov = cov.permute(0, 3, 1, 2) + + # RoPE rotation matrix on next n_future_positions + if "position_ids" in inspect.signature(module.rotary_emb.forward).parameters: + position_ids = torch.arange(q_len, q_len + self.n_future_positions).unsqueeze(0).to(mu.device) + cos, sin = module.rotary_emb(mu, position_ids) + cos, sin = cos[0], sin[0] + else: + cos, sin = module.rotary_emb(mu, q_len + self.n_future_positions) + cos, sin = cos[q_len:], sin[q_len:] + + Id = torch.eye(d, device=cos.device, dtype=cos.dtype) + P = torch.zeros((d, d), device=cos.device, dtype=cos.dtype) + P[d // 2 :, : d // 2], P[: d // 2, d // 2 :] = torch.eye(d // 2), -torch.eye(d // 2) + R = cos.unsqueeze(1) * Id + sin.unsqueeze(1) * P + + # Apply average rotation to the mean and covariance + R = R.mean(dim=0) + mu = torch.matmul(mu, R.T) + if self.use_covariance: + cov = torch.matmul(R, torch.matmul(cov, R.T)) + + # Instead of using the average rotation matrix, we could use a mixture of gaussian statistics to + # estimate mean and covariance. Estimation is better, but end-to-end performance was lower. + # mu = torch.einsum("bhj, fij -> bhfi", mu, R) + # mean_mu = mu.mean(dim=2, keepdim=True) + # if self.use_covariance: + # cov = torch.einsum("fki, bhkl, fjl -> bhfij", R, cov, R) + # cov = cov.mean(dim=2) + # cov += torch.einsum("bhfi, bhfj -> bhji", mu - mean_mu, mu - mean_mu) / self.n_future_positions + # mu = mean_mu.squeeze(2) + + return mu, cov + + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + + # Remove sink tokens + assert keys.size(2) > self.n_sink, f"Input should contain more tokens than n_sink={self.n_sink}" + keys = keys[:, :, self.n_sink :] + values = values[:, :, self.n_sink :] + + # Compute query statistics + mean_query, cov_query = self.get_query_statistics(module, hidden_states) + + # Compute scores + bsz, num_key_value_heads, q_len, d = keys.shape + keys = repeat_kv(keys, module.num_key_value_groups).transpose(2, 3) + scores = torch.matmul(mean_query.unsqueeze(2), keys).squeeze(2) / math.sqrt(d) + if self.use_covariance: + scores += torch.einsum("bhin, bhij, bhjn->bhn", keys, cov_query, keys) / d / 2 + scores = F.softmax(scores, dim=-1) + + # Average scores across groups + scores = scores.view(bsz, num_key_value_heads, module.num_key_value_groups, q_len) + scores = scores.mean(dim=2) + + # Rescale scores by the norm of the values + if self.use_vnorm: + scores = scores * values.norm(dim=-1) + + # Add back the sink tokens. Use max score to make sure they are not pruned. + scores = F.pad(scores, (self.n_sink, 0), value=scores.max().item()) + + return scores diff --git a/kvpress/presses/knorm_press.py b/kvpress/presses/knorm_press.py index eb2ae7fb..98a98223 100644 --- a/kvpress/presses/knorm_press.py +++ b/kvpress/presses/knorm_press.py @@ -1,14 +1,22 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass + +import torch +from torch import nn from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.knorm_scorer import KnormScorer @dataclass class KnormPress(ScorerPress): - scorer: KnormScorer = field(default_factory=KnormScorer, init=False) - compression_ratio: float = 0.0 + """Prune KV pairs with highest L2 norm of keys (https://arxiv.org/pdf/2406.11430)""" - def __post_init__(self): - self.scorer = KnormScorer() - super().__post_init__() + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + return -keys.norm(dim=-1) diff --git a/kvpress/presses/observed_attention_press.py b/kvpress/presses/observed_attention_press.py index 1936edc1..34cfdee1 100644 --- a/kvpress/presses/observed_attention_press.py +++ b/kvpress/presses/observed_attention_press.py @@ -3,13 +3,12 @@ import logging -from dataclasses import dataclass, field +from dataclasses import dataclass import torch from torch import nn from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.observed_attention_scorer import ObservedAttentionScorer logger = logging.getLogger(__name__) @@ -17,16 +16,15 @@ @dataclass class ObservedAttentionPress(ScorerPress): """ - This pruner can be used when eager attention is used in the model (i.e. the attention is materialized). - It will not return attentions in its output to save memory. + The observed attention score is defined as the average attention weight over all prompt tokens + Requires output_attentions=True and attn_implementation="eager" to have access to attentions + This approach is related to H2O (https://arxiv.org/abs/2306.14048). """ - scorer: ObservedAttentionScorer = field(default_factory=ObservedAttentionScorer, init=False) compression_ratio: float = 0.0 output_attentions: bool = False def __post_init__(self): - self.scorer = ObservedAttentionScorer() if not self.output_attentions: logger.warning( "Model will not return attentions in its output to save memory. Please use DefaultPruner if" @@ -34,6 +32,23 @@ def __post_init__(self): ) super().__post_init__() + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + assert attentions is not None, 'Set output_attentions=True and attn_implementation="eager" to use this hook' + scores = attentions.sum(2) + bsz, num_key_value_heads, n_tokens, _ = keys.shape + n_tokens_in_sum = torch.arange(n_tokens, 0, -1).to(attentions.device, attentions.dtype) + scores = scores / n_tokens_in_sum + scores = scores.view(bsz, num_key_value_heads, -1, n_tokens).mean(2) + return scores + def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): output = super().forward_hook(module, input, kwargs, output) # attentions are needed as input for the hook, but unless the user wants to return them in the output, diff --git a/kvpress/presses/per_layer_compression_press.py b/kvpress/presses/per_layer_compression_press.py index 7950ed63..bf15fda4 100644 --- a/kvpress/presses/per_layer_compression_press.py +++ b/kvpress/presses/per_layer_compression_press.py @@ -9,13 +9,14 @@ from torch import nn from kvpress.presses.base_press import BasePress +from kvpress.presses.scorer_press import ScorerPress logger = logging.getLogger(__name__) @dataclass class PerLayerCompressionPress(BasePress): - press: BasePress + press: ScorerPress compression_ratios: List[float] def __post_init__(self): diff --git a/kvpress/presses/random_press.py b/kvpress/presses/random_press.py index 294d3fdb..185ab0f5 100644 --- a/kvpress/presses/random_press.py +++ b/kvpress/presses/random_press.py @@ -1,14 +1,22 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass + +import torch +from torch import nn from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.random_scorer import RandomScorer @dataclass class RandomPress(ScorerPress): - scorer: RandomScorer = field(default_factory=RandomScorer, init=False) - compression_ratio: float = 0.0 + """Randomly prune KV pairs""" - def __post_init__(self): - self.scorer = RandomScorer() - super().__post_init__() + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + return torch.rand(*keys.shape[:-1]).to(keys.device, keys.dtype) diff --git a/kvpress/presses/scorer_press.py b/kvpress/presses/scorer_press.py index 363e04a8..a696cc7e 100644 --- a/kvpress/presses/scorer_press.py +++ b/kvpress/presses/scorer_press.py @@ -10,7 +10,6 @@ from transformers import QuantizedCache from kvpress.presses.base_press import BasePress -from kvpress.presses.scorers.base_scorer import BaseScorer logger = logging.getLogger(__name__) @@ -18,17 +17,48 @@ @dataclass class ScorerPress(BasePress): """ - Default press method for using a scorer. + Default press method for using a score method. The `forward_hook` method is called after the forward pass of an attention layer. and updates the cache with the pruned KV pairs. """ - scorer: BaseScorer compression_ratio: float = 0.0 def __post_init__(self): assert 0 <= self.compression_ratio < 1, "Compression ratio must be between 0 and 1" + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + """Compute the scores for each KV pair in the layer. + + Parameters + ---------- + module : + Transformer layer, see `hook` method for more details. + hidden_states : + Hidden states of the layer. + keys : + Keys of the cache. Note keys are after RoPE. + values : + Values of the cache. + attentions : + Attention weights of the layer. + kwargs : + Keyword arguments, as given to the forward pass of the layer. + + Returns + ------- + Scores for each KV pair in the layer, shape keys.shape[:-1]. + """ + raise NotImplementedError + def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list): """ Default cache compression hook called after the forward pass of an attention layer. @@ -72,7 +102,7 @@ def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dic values = cache.value_cache[module.layer_idx] with torch.no_grad(): - scores = self.scorer.score(module, hidden_states, keys, values, attentions, kwargs) + scores = self.score(module, hidden_states, keys, values, attentions, kwargs) # Prune KV pairs with the lowest scores n_kept = int(q_len * (1 - self.compression_ratio)) diff --git a/kvpress/presses/scorers/__init__.py b/kvpress/presses/scorers/__init__.py deleted file mode 100644 index 299764fc..00000000 --- a/kvpress/presses/scorers/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 diff --git a/kvpress/presses/scorers/base_scorer.py b/kvpress/presses/scorers/base_scorer.py deleted file mode 100644 index af095693..00000000 --- a/kvpress/presses/scorers/base_scorer.py +++ /dev/null @@ -1,46 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -import torch -from torch import nn - - -class BaseScorer: - """ - Base class for scorers. - The `score` method is called after the forward pass of an attention layer. - It is used to compute the scores for each KV pair in the layer. - """ - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - """Compute the scores for each KV pair in the layer. - - Parameters - ---------- - module : - Transformer layer, see `hook` method for more details. - hidden_states : - Hidden states of the layer. - keys : - Keys of the cache. Note keys are after RoPE. - values : - Values of the cache. - attentions : - Attention weights of the layer. - kwargs : - Keyword arguments, as given to the forward pass of the layer. - - Returns - ------- - Scores for each KV pair in the layer, shape keys.shape[:-1]. - """ - raise NotImplementedError diff --git a/kvpress/presses/scorers/expected_attention_scorer.py b/kvpress/presses/scorers/expected_attention_scorer.py deleted file mode 100644 index 3a07b722..00000000 --- a/kvpress/presses/scorers/expected_attention_scorer.py +++ /dev/null @@ -1,137 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -import inspect -import math -from dataclasses import dataclass - -import torch -import torch.nn.functional as F -from torch import nn -from transformers.models.llama.modeling_llama import repeat_kv - -from kvpress.presses.scorers.base_scorer import BaseScorer - - -@dataclass -class ExpectedAttentionScorer(BaseScorer): - """ - Compute scores based on the expected attention on next positions. To do so - 1. Compute the mean and covariance matrix of the queries before RoPE. - 2. Compute the RoPE rotation matrix R on next n_future_positions and average it - 3. Apply R to the mean and covariance matrice of the queries. - 4. As attention A = exp(Q @ K / sqrt(d)), we compute the expected attention - E(A) = exp(K @ mean.T / sqrt(d) + 1/2 K @ cov @ K.T / d) - 5. Rescale the scores by the norm of the values - The first n_sink tokens are removed from calculations (sink attention phenomenon). - """ - - compression_ratio: float = 0.0 - n_future_positions: int = 512 - n_sink: int = 4 - use_covariance: bool = True - use_vnorm: bool = True - - def get_query_statistics(self, module: nn.Module, hidden_states: torch.Tensor): - """ - Compute the mean and covariance matrix of the queries - """ - - bsz, q_len, _ = hidden_states.shape - n, d = module.num_heads, module.head_dim - - # Remove first hidden_states that likely contain outliers - h = hidden_states[:, self.n_sink :] - - if hasattr(module, "q_proj"): - Wq = module.q_proj.weight - elif hasattr(module, "qkv_proj"): - Wq = module.qkv_proj.weight[: n * d] - else: - raise NotImplementedError(f"ExpectedAttentionPress not yet implemented for {module.__class__}.") - - # Query mean - mean_h = torch.mean(h, dim=1, keepdim=True) - mu = torch.matmul(mean_h, Wq.T).squeeze(1) - mu = mu.view(bsz, n, d) - - # Query covariance - cov = None - if self.use_covariance: - h = h - mean_h - cov = torch.matmul(h.transpose(1, 2), h) / h.shape[1] - cov = torch.matmul(Wq, torch.matmul(cov, Wq.T)) # TODO: not optimal - cov = cov.view(bsz, n, d, n, d).diagonal(dim1=1, dim2=3) - cov = cov.permute(0, 3, 1, 2) - - # RoPE rotation matrix on next n_future_positions - if "position_ids" in inspect.signature(module.rotary_emb.forward).parameters: - position_ids = torch.arange(q_len, q_len + self.n_future_positions).unsqueeze(0).to(mu.device) - cos, sin = module.rotary_emb(mu, position_ids) - cos, sin = cos[0], sin[0] - else: - cos, sin = module.rotary_emb(mu, q_len + self.n_future_positions) - cos, sin = cos[q_len:], sin[q_len:] - - Id = torch.eye(d, device=cos.device, dtype=cos.dtype) - P = torch.zeros((d, d), device=cos.device, dtype=cos.dtype) - P[d // 2 :, : d // 2], P[: d // 2, d // 2 :] = torch.eye(d // 2), -torch.eye(d // 2) - R = cos.unsqueeze(1) * Id + sin.unsqueeze(1) * P - - # Apply average rotation to the mean and covariance - R = R.mean(dim=0) - mu = torch.matmul(mu, R.T) - if self.use_covariance: - cov = torch.matmul(R, torch.matmul(cov, R.T)) - - # Instead of using the average rotation matrix, we could use a mixture of gaussian statistics to - # estimate mean and covariance. Estimation is better, but end-to-end performance was lower. - # mu = torch.einsum("bhj, fij -> bhfi", mu, R) - # mean_mu = mu.mean(dim=2, keepdim=True) - # if self.use_covariance: - # cov = torch.einsum("fki, bhkl, fjl -> bhfij", R, cov, R) - # cov = cov.mean(dim=2) - # cov += torch.einsum("bhfi, bhfj -> bhji", mu - mean_mu, mu - mean_mu) / self.n_future_positions - # mu = mean_mu.squeeze(2) - - return mu, cov - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - - # Remove sink tokens - assert keys.size(2) > self.n_sink, f"Input should contain more tokens than n_sink={self.n_sink}" - keys = keys[:, :, self.n_sink :] - values = values[:, :, self.n_sink :] - - # Compute query statistics - mean_query, cov_query = self.get_query_statistics(module, hidden_states) - - # Compute scores - bsz, num_key_value_heads, q_len, d = keys.shape - keys = repeat_kv(keys, module.num_key_value_groups).transpose(2, 3) - scores = torch.matmul(mean_query.unsqueeze(2), keys).squeeze(2) / math.sqrt(d) - if self.use_covariance: - scores += torch.einsum("bhin, bhij, bhjn->bhn", keys, cov_query, keys) / d / 2 - scores = F.softmax(scores, dim=-1) - - # Average scores across groups - scores = scores.view(bsz, num_key_value_heads, module.num_key_value_groups, q_len) - scores = scores.mean(dim=2) - - # Rescale scores by the norm of the values - if self.use_vnorm: - scores = scores * values.norm(dim=-1) - - # Add back the sink tokens. Use max score to make sure they are not pruned. - scores = F.pad(scores, (self.n_sink, 0), value=scores.max().item()) - - return scores diff --git a/kvpress/presses/scorers/knorm_scorer.py b/kvpress/presses/scorers/knorm_scorer.py deleted file mode 100644 index b5b2f0f3..00000000 --- a/kvpress/presses/scorers/knorm_scorer.py +++ /dev/null @@ -1,23 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -import torch -from torch import nn - -from kvpress.presses.scorers.base_scorer import BaseScorer - - -class KnormScorer(BaseScorer): - """Prune KV pairs with highest L2 norm of keys (https://arxiv.org/pdf/2406.11430)""" - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - return -keys.norm(dim=-1) diff --git a/kvpress/presses/scorers/observed_attention_scorer.py b/kvpress/presses/scorers/observed_attention_scorer.py deleted file mode 100644 index ef3f9a3a..00000000 --- a/kvpress/presses/scorers/observed_attention_scorer.py +++ /dev/null @@ -1,38 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -from dataclasses import dataclass - -import torch -from torch import nn -from transformers.utils import logging - -from kvpress.presses.scorers.base_scorer import BaseScorer - -logger = logging.get_logger(__name__) - - -@dataclass -class ObservedAttentionScorer(BaseScorer): - """The observed attention score is defined as the average attention weight over all prompt tokens - Requires output_attentions=True and attn_implementation="eager" to have access to attentions - This approach is related to H2O (https://arxiv.org/abs/2306.14048). - """ - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - assert attentions is not None, 'Set output_attentions=True and attn_implementation="eager" to use this hook' - scores = attentions.sum(2) - bsz, num_key_value_heads, n_tokens, _ = keys.shape - n_tokens_in_sum = torch.arange(n_tokens, 0, -1).to(attentions.device, attentions.dtype) - scores = scores / n_tokens_in_sum - scores = scores.view(bsz, num_key_value_heads, -1, n_tokens).mean(2) - return scores diff --git a/kvpress/presses/scorers/random_scorer.py b/kvpress/presses/scorers/random_scorer.py deleted file mode 100644 index 8f0ad818..00000000 --- a/kvpress/presses/scorers/random_scorer.py +++ /dev/null @@ -1,23 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -import torch -from torch import nn - -from kvpress.presses.scorers.base_scorer import BaseScorer - - -class RandomScorer(BaseScorer): - """Randomly prune KV pairs""" - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - return torch.rand(*keys.shape[:-1]).to(keys.device, keys.dtype) diff --git a/kvpress/presses/scorers/snapkv_scorer.py b/kvpress/presses/scorers/snapkv_scorer.py deleted file mode 100644 index 4bec14c6..00000000 --- a/kvpress/presses/scorers/snapkv_scorer.py +++ /dev/null @@ -1,90 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -import math -from dataclasses import dataclass - -import torch -import torch.nn.functional as F -from torch import nn -from transformers.models.llama.modeling_llama import repeat_kv, rotate_half - -from kvpress.presses.scorers.base_scorer import BaseScorer - - -@dataclass -class SnapKVScorer(BaseScorer): - """ - SnapKV (https://arxiv.org/abs/2404.14469) use the attention of the latest window_size tokens to estimate the - importance of the previous KV pairs. We use the default settings from: - https://github.com/FasterDecoding/SnapKV/blob/main/snapkv/monkeypatch/snapkv_utils.py#L24 - """ - - window_size: int = 64 - kernel_size: int = 5 - - def compute_window_attention(self, module, hidden_states, keys): - """ - Compute the last window_size queries and associated attention weights for the first q_len - window_size keys. - """ - - bsz, q_len, _ = hidden_states.shape - - # Get last window_size queries - if hasattr(module, "q_proj"): - query_states = module.q_proj(hidden_states[:, -self.window_size :]) - elif hasattr(module, "qkv_proj"): - qkv = module.qkv_proj(hidden_states[:, -self.window_size :]) - query_states = qkv[..., : module.num_heads * module.head_dim] - else: - raise NotImplementedError(f"SnapKV not yet implemented for {module.__class__}.") - - query_states = query_states.view(bsz, self.window_size, module.num_heads, module.head_dim).transpose(1, 2) - - # Apply RoPE - position_ids = torch.arange(q_len - self.window_size, q_len).unsqueeze(0).to(query_states.device) - cos, sin = module.rotary_emb(query_states, position_ids) - query_states = (query_states * cos.unsqueeze(1)) + (rotate_half(query_states) * sin.unsqueeze(1)) - - # Compute attention for first q_len - window_size tokens - key_states = repeat_kv(keys, module.num_key_value_groups) - attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(module.head_dim) - attention_mask = torch.ones_like(attn_weights) * float("-inf") - attention_mask = torch.triu(attention_mask, diagonal=q_len - self.window_size + 1) - attn_weights += attention_mask - attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) - attn_weights = attn_weights[..., : -self.window_size] - - return attn_weights - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - - bsz, num_key_value_heads, q_len, _ = keys.shape - - assert q_len > self.window_size, "Query length should be greater than the window size" - - if attentions is not None: - attn_weights = attentions[..., -self.window_size :, : -self.window_size] - else: - attn_weights = self.compute_window_attention(module, hidden_states, keys) - - scores = attn_weights.mean(dim=-2) - scores = F.avg_pool1d(scores, kernel_size=self.kernel_size, padding=self.kernel_size // 2, stride=1) - - # Average per grioup (https://github.com/FasterDecoding/SnapKV/issues/22) - scores = scores.view(bsz, num_key_value_heads, module.num_key_value_groups, q_len - self.window_size) - scores = scores.mean(2) - - # Add back the observation window. Use max score to make sure the window is not pruned. - scores = F.pad(scores, (0, self.window_size), value=scores.max().item()) - - return scores diff --git a/kvpress/presses/scorers/streaming_llm_scorer.py b/kvpress/presses/scorers/streaming_llm_scorer.py deleted file mode 100644 index b70836d2..00000000 --- a/kvpress/presses/scorers/streaming_llm_scorer.py +++ /dev/null @@ -1,40 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -from dataclasses import dataclass - -import torch -from torch import nn - -from kvpress.presses.scorers.base_scorer import BaseScorer - - -@dataclass -class StreamingLLMScorer(BaseScorer): - """ - Prune a fixed number of KV pairs at the beginning and end of the sequence (https://arxiv.org/abs/2309.17453) - We keep the first n_sink tokens and the last n_local tokens. - n_local is computed using the compression ratio. - """ - - compression_ratio: float = 0.0 - n_sink: int = 4 - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - - q_len = hidden_states.shape[1] - assert q_len > self.n_sink, f"Input should contain more tokens than n_sink={self.n_sink}" - n_pruned = q_len - int(q_len * (1 - self.compression_ratio)) - scores = torch.ones_like(keys[..., 0]) - scores[:, :, self.n_sink : self.n_sink + n_pruned] = 0 - - return scores diff --git a/kvpress/presses/scorers/tova_scorer.py b/kvpress/presses/scorers/tova_scorer.py deleted file mode 100644 index 09b1c6f0..00000000 --- a/kvpress/presses/scorers/tova_scorer.py +++ /dev/null @@ -1,49 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from dataclasses import dataclass - -import torch -import torch.nn.functional as F -from torch import nn - -from kvpress.presses.scorers.snapkv_scorer import SnapKVScorer - - -@dataclass -class TOVAScorer(SnapKVScorer): - """ - TOVA (https://arxiv.org/abs/2401.06104) use the attention of the last token averaged across heads - to estimate the importance of the previous KV pairs. This press was reviewed by Michael Hassid, - one of the authors of the TOVA paper. - - Official implementation can be found here: https://github.com/schwartz-lab-NLP/TOVA/blob/main/src/tova_cache.py - """ - - window_size: int = 1 # re-use the attention weight computation from SnapKVPress for last token - - def score( - self, - module: nn.Module, - hidden_states: torch.Tensor, - keys: torch.Tensor, - values: torch.Tensor, - attentions: torch.Tensor, - kwargs, - ) -> torch.Tensor: - - if attentions is not None: - attn_weights = attentions[..., -1:, :-1] - else: - attn_weights = self.compute_window_attention(module, hidden_states, keys) - - # Average across heads and repeat num_key_value_head times - scores = attn_weights.mean(1) - scores = scores.repeat(1, keys.shape[1], 1) - - # Add back the last token. Use max score to make sure the window is not pruned. - # This is a very slight difference from TOVA that don't enforce it, but the - # last attention weight is usually very high so it should not change the results. - scores = F.pad(scores, (0, 1), value=scores.max().item()) - - return scores diff --git a/kvpress/presses/snapkv_press.py b/kvpress/presses/snapkv_press.py index daa2b991..bc5b13e0 100644 --- a/kvpress/presses/snapkv_press.py +++ b/kvpress/presses/snapkv_press.py @@ -1,16 +1,87 @@ -from dataclasses import dataclass, field +import math +from dataclasses import dataclass + +import torch +from torch import nn +from torch.nn import functional as F +from transformers.models.llama.modeling_llama import repeat_kv, rotate_half from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.snapkv_scorer import SnapKVScorer @dataclass class SnapKVPress(ScorerPress): - scorer: SnapKVScorer = field(default_factory=SnapKVScorer, init=False) + """ + SnapKV (https://arxiv.org/abs/2404.14469) use the attention of the latest window_size tokens to estimate the + importance of the previous KV pairs. We use the default settings from: + https://github.com/FasterDecoding/SnapKV/blob/main/snapkv/monkeypatch/snapkv_utils.py#L24 + """ + compression_ratio: float = 0.0 window_size: int = 64 kernel_size: int = 5 - def __post_init__(self): - self.scorer = SnapKVScorer(window_size=self.window_size, kernel_size=self.kernel_size) - super().__post_init__() + def compute_window_attention(self, module, hidden_states, keys): + """ + Compute the last window_size queries and associated attention weights for the first q_len - window_size keys. + """ + + bsz, q_len, _ = hidden_states.shape + + # Get last window_size queries + if hasattr(module, "q_proj"): + query_states = module.q_proj(hidden_states[:, -self.window_size :]) + elif hasattr(module, "qkv_proj"): + qkv = module.qkv_proj(hidden_states[:, -self.window_size :]) + query_states = qkv[..., : module.num_heads * module.head_dim] + else: + raise NotImplementedError(f"SnapKV not yet implemented for {module.__class__}.") + + query_states = query_states.view(bsz, self.window_size, module.num_heads, module.head_dim).transpose(1, 2) + + # Apply RoPE + position_ids = torch.arange(q_len - self.window_size, q_len).unsqueeze(0).to(query_states.device) + cos, sin = module.rotary_emb(query_states, position_ids) + query_states = (query_states * cos.unsqueeze(1)) + (rotate_half(query_states) * sin.unsqueeze(1)) + + # Compute attention for first q_len - window_size tokens + key_states = repeat_kv(keys, module.num_key_value_groups) + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(module.head_dim) + attention_mask = torch.ones_like(attn_weights) * float("-inf") + attention_mask = torch.triu(attention_mask, diagonal=q_len - self.window_size + 1) + attn_weights += attention_mask + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_weights = attn_weights[..., : -self.window_size] + + return attn_weights + + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + + bsz, num_key_value_heads, q_len, _ = keys.shape + + assert q_len > self.window_size, "Query length should be greater than the window size" + + if attentions is not None: + attn_weights = attentions[..., -self.window_size :, : -self.window_size] + else: + attn_weights = self.compute_window_attention(module, hidden_states, keys) + + scores = attn_weights.mean(dim=-2) + scores = F.avg_pool1d(scores, kernel_size=self.kernel_size, padding=self.kernel_size // 2, stride=1) + + # Average per grioup (https://github.com/FasterDecoding/SnapKV/issues/22) + scores = scores.view(bsz, num_key_value_heads, module.num_key_value_groups, q_len - self.window_size) + scores = scores.mean(2) + + # Add back the observation window. Use max score to make sure the window is not pruned. + scores = F.pad(scores, (0, self.window_size), value=scores.max().item()) + + return scores diff --git a/kvpress/presses/streaming_llm_press.py b/kvpress/presses/streaming_llm_press.py index 9276b404..a1ca937e 100644 --- a/kvpress/presses/streaming_llm_press.py +++ b/kvpress/presses/streaming_llm_press.py @@ -1,15 +1,36 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass + +import torch +from torch import nn from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.streaming_llm_scorer import StreamingLLMScorer @dataclass class StreamingLLMPress(ScorerPress): - scorer: StreamingLLMScorer = field(default_factory=StreamingLLMScorer, init=False) + """ + Prune a fixed number of KV pairs at the beginning and end of the sequence (https://arxiv.org/abs/2309.17453) + We keep the first n_sink tokens and the last n_local tokens. + n_local is computed using the compression ratio. + """ + compression_ratio: float = 0.0 n_sink: int = 4 - def __post_init__(self): - self.scorer = StreamingLLMScorer(n_sink=self.n_sink) - super().__post_init__() + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + + q_len = hidden_states.shape[1] + assert q_len > self.n_sink, f"Input should contain more tokens than n_sink={self.n_sink}" + n_pruned = q_len - int(q_len * (1 - self.compression_ratio)) + scores = torch.ones_like(keys[..., 0]) + scores[:, :, self.n_sink : self.n_sink + n_pruned] = 0 + + return scores diff --git a/kvpress/presses/tova_press.py b/kvpress/presses/tova_press.py index 94b001d1..dbf243e5 100644 --- a/kvpress/presses/tova_press.py +++ b/kvpress/presses/tova_press.py @@ -1,15 +1,47 @@ import dataclasses -from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.tova_scorer import TOVAScorer +import torch +from torch import nn +from torch.nn import functional as F + +from kvpress import SnapKVPress @dataclasses.dataclass -class TOVAPress(ScorerPress): - scorer: TOVAScorer = dataclasses.field(default_factory=TOVAScorer, init=False) +class TOVAPress(SnapKVPress): + """ + TOVA (https://arxiv.org/abs/2401.06104) use the attention of the last token averaged across heads + to estimate the importance of the previous KV pairs. This press was reviewed by Michael Hassid, + one of the authors of the TOVA paper. + + Official implementation can be found here: https://github.com/schwartz-lab-NLP/TOVA/blob/main/src/tova_cache.py + """ + compression_ratio: float = 0.0 window_size: int = 1 - def __post_init__(self): - self.scorer = TOVAScorer(window_size=self.window_size) - super().__post_init__() + def score( + self, + module: nn.Module, + hidden_states: torch.Tensor, + keys: torch.Tensor, + values: torch.Tensor, + attentions: torch.Tensor, + kwargs, + ) -> torch.Tensor: + + if attentions is not None: + attn_weights = attentions[..., -1:, :-1] + else: + attn_weights = self.compute_window_attention(module, hidden_states, keys) + + # Average across heads and repeat num_key_value_head times + scores = attn_weights.mean(1) + scores = scores.repeat(1, keys.shape[1], 1) + + # Add back the last token. Use max score to make sure the window is not pruned. + # This is a very slight difference from TOVA that don't enforce it, but the + # last attention weight is usually very high so it should not change the results. + scores = F.pad(scores, (0, 1), value=scores.max().item()) + + return scores diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index bf020c19..12c2ff96 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -16,7 +16,6 @@ TOVAPress, ) from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.base_scorer import BaseScorer from kvpress.presses.think_press import ThinKPress from tests.fixtures import unit_test_model, unit_test_model_output_attention # noqa: F401 @@ -48,7 +47,7 @@ def test_presses_run_observed_attention(unit_test_model_output_attention): # no unit_test_model_output_attention(input_ids, past_key_values=DynamicCache()).past_key_values -class StoreKnormScorer(BaseScorer): +class StoreKnormScorer(ScorerPress): def __init__(self) -> None: self.scores = [] diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 5315acd4..6291e704 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -4,9 +4,8 @@ from transformers import DynamicCache -from kvpress import KnormPress +from kvpress import KnormPress, KnormScorer from kvpress.presses.scorer_press import ScorerPress -from kvpress.presses.scorers.knorm_scorer import KnormScorer from tests.fixtures import unit_test_model # noqa: F401 From d831bd86cc87c47aced009fae643a8c3673961a5 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:13:29 +0100 Subject: [PATCH 40/51] add license --- kvpress/__init__.py | 18 ++++++++++++++++++ kvpress/presses/__init__.py | 2 ++ kvpress/presses/expected_attention_press.py | 4 ++++ kvpress/presses/knorm_press.py | 4 ++++ kvpress/presses/per_layer_compression_press.py | 2 ++ kvpress/presses/random_press.py | 4 ++++ kvpress/presses/snapkv_press.py | 4 ++++ kvpress/presses/streaming_llm_press.py | 4 ++++ kvpress/presses/tova_press.py | 4 ++++ 9 files changed, 46 insertions(+) diff --git a/kvpress/__init__.py b/kvpress/__init__.py index d3e3ab05..3f80450a 100644 --- a/kvpress/__init__.py +++ b/kvpress/__init__.py @@ -3,6 +3,7 @@ from kvpress.pipeline import KVPressTextGenerationPipeline +from kvpress.presses.base_press import BasePress from kvpress.presses.expected_attention_press import ExpectedAttentionPress from kvpress.presses.knorm_press import KnormPress from kvpress.presses.observed_attention_press import ObservedAttentionPress @@ -12,3 +13,20 @@ from kvpress.presses.snapkv_press import SnapKVPress from kvpress.presses.streaming_llm_press import StreamingLLMPress from kvpress.presses.think_press import ThinKPress + +__all__ = [ + "BasePress", + "ScorerPress", + "ExpectedAttentionPress", + "KnormPress", + "ObservedAttentionPress", + "RandomPress", + "SnapKVPress", + "StreamingLLMPress", + "ThinKPress", + "TOVAPress", + "KVPressTextGenerationPipeline", + "PerLayerCompressionPress", +] + +from kvpress.presses.tova_press import TOVAPress diff --git a/kvpress/presses/__init__.py b/kvpress/presses/__init__.py index e69de29b..299764fc 100644 --- a/kvpress/presses/__init__.py +++ b/kvpress/presses/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 diff --git a/kvpress/presses/expected_attention_press.py b/kvpress/presses/expected_attention_press.py index cfb28d5f..747a9597 100644 --- a/kvpress/presses/expected_attention_press.py +++ b/kvpress/presses/expected_attention_press.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + import inspect import math from dataclasses import dataclass diff --git a/kvpress/presses/knorm_press.py b/kvpress/presses/knorm_press.py index 98a98223..34b695bc 100644 --- a/kvpress/presses/knorm_press.py +++ b/kvpress/presses/knorm_press.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + from dataclasses import dataclass import torch diff --git a/kvpress/presses/per_layer_compression_press.py b/kvpress/presses/per_layer_compression_press.py index bf15fda4..e24969ed 100644 --- a/kvpress/presses/per_layer_compression_press.py +++ b/kvpress/presses/per_layer_compression_press.py @@ -1,5 +1,7 @@ # SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 + + import inspect import logging from dataclasses import dataclass diff --git a/kvpress/presses/random_press.py b/kvpress/presses/random_press.py index 185ab0f5..7c013a18 100644 --- a/kvpress/presses/random_press.py +++ b/kvpress/presses/random_press.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + from dataclasses import dataclass import torch diff --git a/kvpress/presses/snapkv_press.py b/kvpress/presses/snapkv_press.py index bc5b13e0..f192c711 100644 --- a/kvpress/presses/snapkv_press.py +++ b/kvpress/presses/snapkv_press.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + import math from dataclasses import dataclass diff --git a/kvpress/presses/streaming_llm_press.py b/kvpress/presses/streaming_llm_press.py index a1ca937e..b0560541 100644 --- a/kvpress/presses/streaming_llm_press.py +++ b/kvpress/presses/streaming_llm_press.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + from dataclasses import dataclass import torch diff --git a/kvpress/presses/tova_press.py b/kvpress/presses/tova_press.py index dbf243e5..0c60381b 100644 --- a/kvpress/presses/tova_press.py +++ b/kvpress/presses/tova_press.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + + import dataclasses import torch From a2737c4342187fc3858f8a8864f89b3f43d75f90 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:15:33 +0100 Subject: [PATCH 41/51] improve pr --- kvpress/presses/tova_press.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kvpress/presses/tova_press.py b/kvpress/presses/tova_press.py index 0c60381b..7f0cab05 100644 --- a/kvpress/presses/tova_press.py +++ b/kvpress/presses/tova_press.py @@ -2,16 +2,16 @@ # SPDX-License-Identifier: Apache-2.0 -import dataclasses +from dataclasses import dataclass import torch +import torch.nn.functional as F from torch import nn -from torch.nn import functional as F from kvpress import SnapKVPress -@dataclasses.dataclass +@dataclass class TOVAPress(SnapKVPress): """ TOVA (https://arxiv.org/abs/2401.06104) use the attention of the last token averaged across heads From cd5b6438171adf0c72ff1983a5ed32abab62bd6b Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:16:36 +0100 Subject: [PATCH 42/51] fix readme --- README.md | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index a4d44bde..2f2ba20d 100644 --- a/README.md +++ b/README.md @@ -64,32 +64,6 @@ All current presses are training free. We provide the following presses associat For a detailed list of existing KV cache compression methods, check [Awesome-KV-Cache-Compression](https://github.com/October2001/Awesome-KV-Cache-Compression) or [Awesome-LLM-Compression](https://github.com/HuangOwen/Awesome-LLM-Compression?tab=readme-ov-file#kv-cache-compression) -## Customization - -Most presses are composed of two main components, the scorer class that identifies important tokens and a pruner class that implements the pruning strategy. -As an example, it is possible to initialize `ExpectedAttentionPress` as follows: - -```python -from kvpress import ScorerPress, ExpectedAttentionScorer - -press = ScorerPress(compression_ratio=0.1, scorer=ExpectedAttentionScorer()) -``` - -This allows for easy customization of the press behavior. -Currently, the following pruning strategies are available: -- `DefaultPruner`: Prunes the least important key-value pairs based on the score computed by the scorer. -- `PerLayerCompressionPruner`: Same as DefaultPruner, but it is possible to specify a different compression ratio for each layer. This feature is experimental. -- `EagerAttentionPruner`: This class is used in conjunction with `ObservedAttentionPress` for better memory management (attention matrix will be deleted after computing the score). - - -It is also possible to create a custom press that does not consume a scorer, such an example would be `ThinKPress` that prunes across the channel dimension of the keys: -```python -from kvpress import ThinKPress, ExpectedAttentionPress -press = ThinKPress(key_channel_compression_ratio=0.1, inner_press=ExpectedAttentionPress(compression_ratio=0.1)) -``` - - - ## Evaluation See the [speed_and_memory.ipynb](notebooks/speed_and_memory.ipynb) notebook on how to measure peak memory usage and total time gain. @@ -199,3 +173,18 @@ All presses are stored in the `presses` directory. The easiest way to create a n Before opening a pull request with a new press, make sure to register it in the `__init__.py` file of repository and to add it in [test_presses.py](tests/presses/test_presses.py). + +
+ +### Can I change the compression ratio from one layer to another ? + + +We provide an experimental feature, which only works with flash attention: +```python +from kvpress import PerLayerCompressionPress +# compression_ratios should have the same length as the number of layers +press = PerLayerCompressionPress(press, compression_ratios=[...]) +``` + +Check the [demo notebook](notebooks/per_layer_compression_demo.ipynb) for more details. +
From 34968afeb11f2ca401f8e785589f278ed8b3f4b1 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:17:20 +0100 Subject: [PATCH 43/51] fix notebooks --- notebooks/expected_attention.ipynb | 95 ++++++++++------------ notebooks/new_press.ipynb | 78 +++++++++--------- notebooks/per_layer_compression_demo.ipynb | 50 ++++++------ notebooks/speed_and_memory.ipynb | 4 +- 4 files changed, 109 insertions(+), 118 deletions(-) diff --git a/notebooks/expected_attention.ipynb b/notebooks/expected_attention.ipynb index 64cbf949..199d8c20 100644 --- a/notebooks/expected_attention.ipynb +++ b/notebooks/expected_attention.ipynb @@ -11,38 +11,7 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001B[33mWARNING: The directory '/mount/home/setup/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.\u001B[0m\u001B[33m\n", - "\u001B[0m\u001B[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001B[0m\u001B[33m\n", - "\u001B[0m\n", - "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m24.0\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m24.3.1\u001B[0m\n", - "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpython3.10 -m pip install --upgrade pip\u001B[0m\n" - ] - } - ], - "source": [ - "# matplotlib is not a core dependency of kvpress\n", - "!pip install matplotlib --quiet" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/mount/home/setup/.cache/pypoetry/virtualenvs/kvpress-PV_RntMw-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], + "outputs": [], "source": [ "import requests\n", "import numpy as np\n", @@ -75,15 +44,35 @@ "name": "stderr", "output_type": "stream", "text": [ - "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n", - "Loading checkpoint shards: 100%|██████████| 4/4 [00:00<00:00, 4.28it/s]\n" + "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n" ] }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "488d2f8788f44f56be4296f0958d9aa4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/4 [00:00" ] @@ -181,7 +170,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Expected attention is computed using the first 5000 tokens and evaluated on the last 3914 tokens\n" + "Expected attention is computed using the first 5000 tokens and evaluated on the last 3743 tokens\n" ] }, { @@ -222,7 +211,7 @@ " attn_weights = eager_self_attn(hidden_states, position_ids=position_ids, attention_mask=attention_mask, output_attentions=True)[1][0] \n", "\n", " # Compute scores on the first n_train tokens\n", - " scores = press.press.score(\n", + " scores = press.score(\n", " self_attn, hidden_states[:, :n_train], keys[:, :, :n_train], values[:, :, :n_train], None, None\n", " )[0]" ] @@ -234,7 +223,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAHLCAYAAAADXnZlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADCiklEQVR4nOyde3gU5dn/v7ObzWaJmANHEzEcFDSEEIwchBZROaiRQ32rLYqH2r5vf0jFimihijECiorVoim22lYtLWpt5dBUDhURRRFFziAgYrAJ55AgYbPZw/z+2NxPnpmd2Z1dspsD9+e6uCCzM888M7M639zPfX9vRVVVFQzDMAzDMEzU2Jp7AgzDMAzDMK0VFlIMwzAMwzAxwkKKYRiGYRgmRlhIMQzDMAzDxAgLKYZhGIZhmBhhIcUwDMMwDBMjLKQYhmEYhmFihIUUwzAMwzBMjLCQYhiGYRiGiREWUgzDME1I9+7dceONNzb3NDQoioLHHnusuafBMG0SFlIMcw7y6quvQlEUfP755809lbhw//3348orrxQ/9+/f31BIjBgxAoqihPy57rrrEjjblomqqsjMzMTvf/97AMDmzZuhKAq++eabkH3nzp2LcePGoUuXLpZE25tvvokrr7wSqampSE9Px9ChQ7FmzZo4XAXDxJ+k5p4AwzBMU/Ppp59iyJAhAIDvvvsOO3bswFNPPWW474UXXognn3xSsy0rKyvuc2zp7Nu3DydPnhT38ZNPPkGXLl3QvXv3kH0feeQRdO3aFQMGDMDKlSvDjvvYY4/h8ccfxw9/+EPcdddd8Hq92LFjByoqKuJxGQwTd1hIMQzT4gkEAqivr0dKSkrEfX0+HzZv3oz77rsPALBx40YEAgEMGjTIcP+0tDRMmjSpSefbFti4cSPOO+885OXlAQgKqcGDBxvue+DAAXTv3h3Hjx9Hp06dTMfcsGEDHn/8cTz77LO4//774zJvhkk0vLTHMIwh9fX1ePTRR1FYWIi0tDSkpqbi+9//Pt5//32xj6qq6N69O8aPHx9yfF1dHdLS0vDzn/9cbPN4PCguLsbFF18Mp9OJbt264aGHHoLH49EcqygKfvGLX+Cvf/0r+vbtC6fTiRUrVpjO1ev14vjx4zh+/DjWr1+Puro6XHLJJTh+/Djef/99dO/eHYFAAMePH4fX6w053ufz4fTp07HcJlM++ugjDBo0CCkpKejZsydef/31kH2qq6vxy1/+Et26dYPT6cTFF1+Mp556CoFAQLPf/PnzMXToUHTo0AEulwuFhYV4++23Q8bzeDy4//770alTJ7Rv3x7jxo3Df//7X8tzPn36tLiPH330Efr164eTJ0/i+PHj+OSTT5Cbm4vjx4/j5MmTmuOMolRGPP/88+jatSvuu+8+qKra5PecYZoFlWGYc44///nPKgD1s88+M93n2LFj6gUXXKBOmzZNXbhwofr000+rffr0UR0Oh7p582ax38MPP6w6HA71xIkTmuPfeustFYC6bt06VVVV1e/3q6NHj1bbtWun/vKXv1R///vfq7/4xS/UpKQkdfz48ZpjAaiXXXaZ2qlTJ7WkpEQtLS3VnFPP+++/rwKw9Of9998Xx1111VWqw+FQk5OTVQBqly5d1EceeUStr6+3fC/15OTkqH369FG7dOmi/vrXv1ZffPFF9fLLL1cVRVF37Ngh9qutrVXz8/PVDh06qL/+9a/Vl156Sb3jjjtURVHU++67TzPmhRdeqN5zzz3qiy++qP7mN79RBw0apAJQ//Wvf2n2mzRpkgpAvfXWW9UXX3xRvemmm9T8/HwVgFpcXBxx7nfeeaele5iTk2N4/LFjx8Keq2PHjuq4cePU5557Tu3QoYMKQO3atav6wgsvRJwbw7RUWEgxzDmIFSHl8/lUj8ej2Xby5Em1S5cu6t133y227dmzRwWgLly4ULPvuHHj1O7du6uBQEBVVVX9y1/+otpsNvXDDz/U7PfSSy+pANT169eLbQBUm82m7ty509L1VFVVqatXr1ZXr16tDh48WB09erS6evVqdcWKFWpycrL68MMPi8+rqqrEcXfffbf62GOPqf/4xz/U119/XR03bpwKQL3lllssndeInJwcjYBUVVU9evSo6nQ61QceeEBsmz17tpqamqru3btXc/yMGTNUu92uHjx4UGw7c+aMZp/6+no1Ly9Pveaaa8S2LVu2qADUe+65R7PvrbfeallI7dy5U129erX69ttvqwDUZ599Vl29erU6Y8YM1el0qqtWrVJXr16tfvTRR4bHhxNSVVVVKgC1Q4cO6nnnnac+88wz6ptvvqled911KgD1pZdeijg/hmmJsJBimHMQK0JKxu/3qydOnFCPHTumFhUVqQUFBZrPBw8erH7ve98TP584cUJ1OBzqww8/LLaNGzdO7du3r3rs2DHNn71796oA1Dlz5oh9AahXX3111NcVCATUDh06qL///e9VVVXVzz77TAWgfvPNN5bH+N///V8VgPrJJ59EfX5VDQqp3NzckO35+fnqD37wA83P1113Xcj9+M9//qMCUBctWmQ4flVVlXrs2DF18uTJanp6utj+xBNPqADUL7/8UrP/xo0bLQspYunSparD4VBPnz6tqqqqTpkyRR0xYkTE48IJqYMHD4qI1htvvCG2+/1+NTc3V73wwgstz49hWhKcI8UwjCmvvfYa8vPzkZKSgg4dOqBTp04oKytDTU2NZr877rgD69evR3l5OQDg73//O7xeL26//Xaxz759+7Bz50506tRJ86d3794AgKNHj2rG7NGjh6U5Uu4T5fWcOHEC/fv3x/Hjx/Huu+/iwgsvRGpqKo4fPx6Si2XEAw88AAD4z3/+Y+n8Rlx00UUh2zIyMjS5Rfv27cOKFStC7sfIkSMBaO/Hv/71LwwZMgQpKSnIzMxEp06dsHDhQs1zKC8vh81mQ69evTTn7dOnj6U5nzlzRtzHFStWoKCgAG63G8ePH8eaNWtwxRVXiM9jweVyAQAcDgd++MMfiu02mw0/+tGP8N///hcHDx6MaWyGaU64ao9hGEMWLVqEu+66CxMmTMCDDz6Izp07w26348knn8T+/fs1+/74xz/G/fffj7/+9a/49a9/jUWLFuGKK67QvMQDgQD69euH3/zmN4bn69atm+ZnevFG4uDBgyGii0r2Caok+/Of/4y77ror7Hg0j6qqKkvnN8JutxtuV1VV/DsQCGDUqFF46KGHDPclgfnhhx9i3LhxGD58OH73u9/hggsugMPhwJ///Gf87W9/i3mOep5++mmUlJRotskVeLt378b8+fNDrsMqmZmZSElJQXp6esj96dy5MwDg5MmThiKUYVoyLKQYhjHk7bffRs+ePfHPf/4TiqKI7cXFxSH7ZmZmoqioCH/9619x2223Yf369Xj++ec1+/Tq1Qtbt27FtddeqxnvbOnatStWr14NACgpKUFKSgp+9atfQVVVjBs3Dvfffz+uueYaAEDfvn0jjvf1118DQNgy/qagV69eOH36tIhAmfGPf/wDKSkpWLlyJZxOp9j+5z//WbNfTk4OAoEA9u/frxGwe/bssTSfO+64A9/73vdw5swZjB8/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vuWzLD09XS0tLZozZ05QzgmMFzeEOwAAY9uSJUtUXl7usywmJiZM0cBfUVFRSklJCXcYwJjHiBSAEYmJiVFKSorPa8qUKZKkiooKRUdH6+9//7t3+2effVZf/OIX1draKunqaNGjjz6qRx99VImJiUpKStJPfvIT9f0+9e7ubpWWluqmm25SfHy85s2bp4qKCp84Dh8+rMLCQsXFxWnKlClavHixzp07p+LiYr399tv69a9/7R0xO336tCTpxIkTuu++++R2u5WcnKyHH35YbW1t3mN2dXVpxYoVcrvdSk1N1XPPPTfk59HQ0KClS5cqOTlZbrdbeXl52rdvn3d9YWGhmpqa9OSTT3rjqaio0MqVK3XhwgXvss2bN/t17b0jWW+99ZaysrLkdru1ZMkStbS0SJI2b96sl19+WXv37vU530BTe2+//bby8/MVExOj1NRUPfXUU7py5YpP7I8//rh++MMfaurUqUpJSfHGCYxbBgAOFRUV2dKlSwfdZv369ZaRkWHnz5+3Y8eOWXR0tO3du9e7vqCgwNxut61du9Zqa2vt1Vdftbi4OHvxxRe923z/+9+3u+66yw4dOmT19fX2q1/9ymJiYqyurs7MzN577z2LiYmx1atXW3V1tZ04ccJ27Nhh//nPf+z8+fM2f/58W7VqlbW0tFhLS4tduXLFzp07Z1/4whds48aNdvLkSTt27Jjde++9tnDhQu95V69ebTNmzLB9+/ZZTU2NffOb37RJkybZ2rVrr3u91dXV9tvf/tbef/99q6ursx//+Md24403WlNTk5mZffrpp5aWlmY//elPvfF0d3fb9u3bLSEhwbuso6PDr2svLy+3iRMn2qJFi6yystKqqqosKyvLHnzwQTMz6+josAceeMCWLFnic77GxkaTZO+9956ZmX300UcWFxdna9assZMnT9qePXssKSnJNm3a5JOrhIQE27x5s9XV1dnLL79sLpfL/vrXvw7+PwoQwSikADhWVFRkUVFRFh8f7/P6+c9/7t2mu7vbcnNz7YEHHrDs7GxbtWqVzzEKCgosKyvLenp6vMs2bNhgWVlZZmbW1NRkUVFRdubMGZ/9vv71r9vGjRvNzGz58uW2YMGC68ZZUFDQr/j52c9+Zt/4xjd8ljU3N5skO3XqlHV0dFh0dLT96U9/8q7/9NNPLTY2dtBCaiC33nqr7dixw/s+IyPDXnjhBZ9tysvLLTEx0WeZP9deXl5ukqy+vt67vqyszJKTk73vByp4ry2knn76aZs9e7ZPHsrKysztdpvH4zGzq5/j3Xff7XOcvLw827Bhw9AfAhCh6JECMCILFy7Uzp07fZZNnTrV+9/R0dF67bXXlJOTo4yMDL3wwgv9jnHnnXfK5XJ538+fP1/PPfecPB6P3n//fXk8Hs2aNctnn+7ubk2bNk2SVF1dre985zvDivv48eM6ePCg3G53v3UNDQ26dOmSLl++rHnz5vlc1+zZswc9bmdnpzZv3qw333xTLS0tunLlii5duqQPP/xwWPFJ8uvaJSkuLk4zZ870vk9NTdXZs2eHda6TJ09q/vz5PnlYsGCBOjs79dFHH2nGjBmSpJycHJ/9nJwLiCQUUgBGJD4+XjfffPOg2/zzn/+UJLW3t6u9vV3x8fF+H7+zs1NRUVGqqqpSVFSUz7reIig2NnaYUV897v33369f/vKX/dalpqaqvr5+2MeUpNLSUv3tb3/Ttm3bdPPNNys2Nlbf/va3dfnyZUcxDnXtkjRx4kSfdS6Xy6fHLJAGOldPT09QzgWMBRRSAIKqoaFBTz75pF566SXt2rVLRUVF2rdvnyZM+P97XY4ePeqzz5EjR3TLLbcoKipKt912mzwej86ePat77rlnwHPk5ORo//792rJly4Dro6Oj5fF4fJZ99atf1e7du5WZmakbbuj/q3DmzJmaOHGijh496h2NOXfunOrq6lRQUHDd6z18+LCKi4u1bNkySVeLod7m9sHiGWiZP9fuj4GOfa2srCzt3r1bZuYdlTp8+LAmTZqktLQ0x+cGIh137QEYke7ubn3yySc+r9473zwejx566CEtXrxYK1euVHl5uWpqavrd/fbhhx9q3bp1OnXqlP74xz9qx44dWrt2rSRp1qxZ+u53v6sVK1bojTfeUGNjo959911t3bpVb775piRp48aNqqys1Jo1a1RTU6Pa2lrt3LnTG0dmZqaOHj2q06dPq62tTT09PSopKVF7e7uWL1+uyspKNTQ06K233tLKlSvl8Xjkdrv1ve99T+vXr9eBAwd04sQJFRcX+xSAA7nlllv0xhtvqLq6WsePH9eDDz7Yb8QmMzNThw4d0pkzZ3xi7Ozs1P79+9XW1qbPPvvMr2v3R2ZmpmpqanTq1Cm1tbXp888/77fNmjVr1NzcrMcee0y1tbXau3evNm3apHXr1g15zcC4Fu4mLQBjV1FRkUnq95o9e7aZmW3ZssVSU1Otra3Nu8/u3bstOjraqqurzexqA/OaNWvskUcesYSEBJsyZYo9/fTTPk3Ply9ftmeeecYyMzNt4sSJlpqaasuWLbOamhrvNhUVFXbXXXdZTEyMTZ482RYvXmznzp0zM7NTp07ZnXfeabGxsSbJGhsbzcysrq7Oli1bZpMnT7bY2Fj78pe/bE888YT33B0dHfbQQw9ZXFycJScn27PPPjtg43pfjY2NtnDhQouNjbX09HT7zW9+02+fd955x3JyciwmJsb6/hp+5JFHbNq0aSbJe7fcUNc+UJP6nj17fI579uxZu/fee83tdpskO3jwYL9m897PMC8vz6Kjoy0lJcU2bNhgn3/+uXf9QNe+dOlSKyoquu7nAUQ6l1mQJtIBwA+FhYXKzc3t96RvABgLGK8FAABwiEIKAADAIab2AAAAHGJECgAAwCEKKQAAAIcopAAAAByikAIAAHCIQgoAAMAhCikAAACHKKQAAAAcopACAABw6P8ADDU9SF4FW4cAAAAASUVORK5CYII=", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAHLCAYAAAADXnZlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADIUklEQVR4nOydeXxU5fX/P3cmk8kQMQuriRA2QUJIghEEsYCKIKYEat1QFLX665dSQWhqsagYEUWlSlFEa2u1puKClcUoiyCiKKIsCZuggEETwhYSIEwms9zfHzfPk+feuXe2zEwWzvv1ygsyc5fn3hm9h3M+53MkWZZlEARBEARBEEFjauoFEARBEARBtFQokCIIgiAIgggRCqQIgiAIgiBChAIpgiAIgiCIEKFAiiAIgiAIIkQokCIIgiAIgggRCqQIgiAIgiBChAIpgiAIgiCIEKFAiiAIgiAIIkQokCIIgggj3bp1w69//eumXoYKSZLw+OOPN/UyCKJVQoEUQZyHvPHGG5AkCd99911TLyUiTJ8+HUOGDOG/Z2Vl6QYSI0aMgCRJXj/XX399FFfbPJFlGcnJyXj11VcBANu3b4ckSfjpp5+8tp07dy7y8vLQqVOngIK2d999F0OGDEF8fDwSExNx5ZVXYv369RG4CoKIPDFNvQCCIIhw880332Dw4MEAgDNnzmDXrl145plndLe9+OKL8fTTT6teS0lJifgamzs//PADTp06xe/j119/jU6dOqFbt25e2z7yyCPo3LkzBgwYgNWrV/s87uOPP44nnngCN910E+6++244nU7s2rULZWVlkbgMgog4FEgRBNHs8Xg8qKurQ1xcnN9tXS4Xtm/fjmnTpgEAtmzZAo/Hg0GDBulun5CQgIkTJ4Z1va2BLVu24IILLkBGRgYAJZC64oordLc9dOgQunXrhhMnTqBDhw6Gx9y8eTOeeOIJ/O1vf8P06dMjsm6CiDZU2iMIQpe6ujo89thjyMnJQUJCAuLj4/GrX/0Kn332Gd9GlmV069YN48aN89q/trYWCQkJ+P3vf89fczgcmD17Nnr16gWr1YouXbrgoYcegsPhUO0rSRL++Mc/4r///S/69esHq9WKVatWGa7V6XTixIkTOHHiBDZt2oTa2lpccsklOHHiBD777DN069YNHo8HJ06cgNPp9Nrf5XLh7NmzodwmQ7788ksMGjQIcXFx6NGjB/7zn/94bVNVVYUHH3wQXbp0gdVqRa9evfDMM8/A4/Gotps/fz6uvPJKtGvXDjabDTk5OVi6dKnX8RwOB6ZPn44OHTqgbdu2yMvLwy+//BLwms+ePcvv45dffon+/fvj1KlTOHHiBL7++mukp6fjxIkTOHXqlGo/vSyVHgsWLEDnzp0xbdo0yLIc9ntOEE2CTBDEece///1vGYD87bffGm5z/Phx+aKLLpJnzJghL168WH722WflPn36yBaLRd6+fTvfbtasWbLFYpFPnjyp2v+9996TAcgbN26UZVmW3W63PGrUKLlNmzbygw8+KL/66qvyH//4RzkmJkYeN26cal8Act++feUOHTrIBQUF8qJFi1Tn1PLZZ5/JAAL6+eyzz/h+w4cPly0WixwbGysDkDt16iQ/8sgjcl1dXcD3UktaWprcp08fuVOnTvJf//pX+aWXXpIvu+wyWZIkedeuXXy7mpoaOTMzU27Xrp3817/+VX7llVfku+66S5YkSZ42bZrqmBdffLH8hz/8QX7ppZfk559/Xh40aJAMQP7oo49U202cOFEGIN9+++3ySy+9JN94441yZmamDECePXu237VPmjQpoHuYlpamu//x48d9nqt9+/ZyXl6e/MILL8jt2rWTAcidO3eWX3zxRb9rI4jmCgVSBHEeEkgg5XK5ZIfDoXrt1KlTcqdOneR7772Xv7Zv3z4ZgLx48WLVtnl5eXK3bt1kj8cjy7Isv/XWW7LJZJK/+OIL1XavvPKKDEDetGkTfw2AbDKZ5N27dwd0PZWVlfLatWvltWvXyldccYU8atQoee3atfKqVavk2NhYedasWfz9yspKvt+9994rP/744/IHH3wg/+c//5Hz8vJkAPItt9wS0Hn1SEtLUwWQsizLx44dk61Wq/ynP/2JvzZnzhw5Pj5e3r9/v2r/mTNnymazWT58+DB/7dy5c6pt6urq5IyMDPmaa67hr+3YsUMGIP/hD39QbXv77bcHHEjt3r1bXrt2rbx06VIZgPy3v/1NXrt2rTxz5kzZarXKa9askdeuXSt/+eWXuvv7CqQqKytlAHK7du3kCy64QH7uuefkd999V77++utlAPIrr7zid30E0RyhQIogzkMCCaRE3G63fPLkSfn48eNybm6unJ2drXr/iiuukK+66ir++8mTJ2WLxSLPmjWLv5aXlyf369dPPn78uOpn//79MgD5ySef5NsCkK+++uqgr8vj8cjt2rWTX331VVmWZfnbb7+VAcg//fRTwMe4//77ZQDy119/HfT5ZVkJpNLT071ez8zMlH/zm9+ofr/++uu97senn34qA5ALCwt1j19ZWSkfP35cnjx5spyYmMhff+qpp2QA8vfff6/afsuWLQEHUozly5fLFotFPnv2rCzLsjxlyhR5xIgRfvfzFUgdPnyYZ7Teeecd/rrb7ZbT09Pliy++OOD1EURzgjRSBEEY8uabbyIzMxNxcXFo164dOnTogKKiIlRXV6u2u+uuu7Bp0yaUlpYCAN5//304nU7ceeedfJsffvgBu3fvRocOHVQ/vXv3BgAcO3ZMdczu3bsHtEamfWK6npMnTyIrKwsnTpzAJ598gosvvhjx8fE4ceKElxZLjz/96U8AgE8//TSg8+vRtWtXr9eSkpJU2qIffvgBq1at8rofI0eOBKC+Hx999BEGDx6MuLg4JCcno0OHDli8eLHqcygtLYXJZELPnj1V5+3Tp09Aaz537hy/j6tWrUJ2djbsdjtOnDiB9evX4/LLL+fvh4LNZgMAWCwW3HTTTfx1k8mEW2+9Fb/88gsOHz4c0rEJoimhrj2CIHQpLCzE3XffjfHjx+PPf/4zOnbsCLPZjKeffhoHDhxQbXvbbbdh+vTp+O9//4u//vWvKCwsxOWXX656iHs8HvTv3x/PP/+87vm6dOmi+p09eP1x+PBhr6CLtewzWCfZv//9b9x9990+j8fWUVlZGdD59TCbzbqvy7LM/+7xeHDdddfhoYce0t2WBZhffPEF8vLyMGzYMLz88su46KKLYLFY8O9//xtvv/12yGvU8uyzz6KgoED1mtiBt3fvXsyfP9/rOgIlOTkZcXFxSExM9Lo/HTt2BACcOnVKNwgliOYMBVIEQeiydOlS9OjRA//73/8gSRJ/ffbs2V7bJicnIzc3F//9739xxx13YNOmTViwYIFqm549e6K4uBjXXnut6niNpXPnzli7di0AoKCgAHFxcfjLX/4CWZaRl5eH6dOn45prrgEA9OvXz+/xDh48CAA+2/jDQc+ePXH27FmegTLigw8+QFxcHFavXg2r1cpf//e//63aLi0tDR6PBwcOHFAFsPv27QtoPXfddReuuuoqnDt3DuPGjcNzzz2H7OxsbNy4Ec888wxWrlwJkyn0IobJZEJ2dja+/fZb1NXVITY2lr9XXl4OIPL3nCAiAZX2CILQhWUNxOzDN998g6+//lp3+zvvvBN79uzBn//8Z5jNZtx2222q92+55RaUlZXhtdde89rXbrejpqYmpHXGxcVh5MiRGDlyJA4fPozc3FyMHDkSXbp0QW1tLe666y7+/kUXXcT3O336tFepT5ZlPPnkkwCA0aNHh7SeQLnlllvw9ddf6xpYVlVVweVyAVA+B0mS4Ha7+fs//fQTli1bptpnzJgxAICFCxeqXtcGtEb06NEDI0eORNu2bSFJEn73u99h5MiRqKurw4ABAzBq1Ch+H0Pl1ltvhdvtxptvvslfq62txX//+1+kp6eTESrRIqGMFEGcx7z++uu6/kzTpk3Dr3/9a/zvf//Db37zG+Tm5uLQoUN45ZVXkJ6eruv/k5ubi3bt2uH999/HmDFjeLmGceedd+K9997D//3f/+Gzzz7D0KFD4Xa78f333+O9997D6tWrcfnll4d8LUxjc+WVVwIAvvrqK7Rr185QI7Rt2zZMmDABEyZMQK9evWC32/Hhhx9i06ZN+H//7//hsssuU20vSRKGDx+ODRs2hLxGkT//+c9YsWIFfv3rX+Puu+9GTk4OampqsHPnTixduhQ//fQT2rdvj9zcXDz//PO4/vrrcfvtt+PYsWNYtGgRevXqhZKSEn687OxsTJgwAS+//DKqq6tx5ZVXYt26dfjxxx+DWtemTZtw6aWXIikpCYByH9k9NeKtt95CaWkpzp07BwDYuHEjD0jvvPNOpKWlAQB+//vf45///CemTJmC/fv3o2vXrnzflStXBrVOgmg2NKnUnSCIJoF17Rn9/Pzzz7LH45GfeuopOS0tTbZarfKAAQPkjz76SJ40aZKhj9Af/vAHGYD89ttv675fV1cnP/PMM3K/fv1kq9UqJyUlyTk5OXJBQYFcXV3NtwMgT5kyJahreuedd+S4uDjuAXXffffJubm5htsfPHhQvvnmm+Vu3brJcXFxcps2beScnBz5lVde4ZYNjDNnzsgA5Ntuu83vOtLS0nTPO3z4cHn48OFex3344YflXr16ybGxsXL79u3lK6+8Up4/f77Ky+pf//qXfMkll8hWq1W+9NJL5X//+9/y7NmzZe3/wu12uzx16lS5Xbt2cnx8vDx27Fj5559/Dqpr7/rrr5d/97vfybKsfF42m01+//33fe4zfPjwgHy7ZFmWjx49Kk+aNElOTk6WrVarfMUVV8irVq0KaG0E0RyRZDkE1SBBEIQO06dPx7/+9S9UVFSgTZs2Tb2csPHxxx/j17/+NYqLi9G/f/+mXg5BEM0I0kgRBBEWamtrUVhYiN/+9retKogCgM8++wy33XYbBVEEQXhBGSmCIBrFsWPH8Omnn2Lp0qVYtmwZtm3bhuzs7KZeFkEQRFQgsTlBEI1iz549uOOOO9CxY0csXLiQgiiCIM4rKCNFEARBEAQRIqSRIgiCIAiCCBEKpAiCIAiCIEKENFIRxuPxoLy8nLsFEwRBEATR/JFlGWfOnEFKSorP8UgUSEWY8vJyr2GsBEEQBEG0DH7++WdcfPHFhu9TIBVh2rZtC0D5IC688MImXg1BEARBEIFw+vRpdOnShT/HjaBAKsKwct6FF15IgRRBEARBtDD8yXJIbE4QBEEQBBEiFEgRBEEQBEGECAVSBEEQBEEQIUKBFEEQBEEQRIhQIEUQBEEQBBEiFEgRBEEQBEGECAVSBEEQBEEQIUKBFEEQBEEQRIhQIEUQBEEQBBEiFEgFyLlz55CWlob8/PymXgpBEARBEM0ECqQCZO7cuRg8eHBTL4MgCIIgiGYEBVIB8MMPP+D777/HmDFjmnopBEEQBEE0I1p8ILVx40aMHTsWKSkpkCQJy5Yt89pm0aJF6NatG+Li4nDFFVdgy5YtQZ0jPz8fTz/9dJhWTBAEQRAtn8LNpRg6bz0KN5c29VKalBYfSNXU1CArKwuLFi3Sff/dd9/FjBkzMHv2bGzbtg1ZWVkYPXo0jh07xrfJzs5GRkaG1095eTmWL1+O3r17o3fv3tG6JIIgCIJo9izecABlVXYs3nCgqZfSpEiyLMtNvYhwIUkSPvzwQ4wfP56/dsUVV2DgwIF46aWXAAAejwddunTBAw88gJkzZ/o95sMPP4zCwkKYzWacPXsWTqcTf/rTn/DYY4/pbu9wOOBwOPjvp0+fRpcuXVBdXY0LL7ywcRdIEARBEM2Ews2lWLzhACaP6ImJg9Oaejlh5/Tp00hISPD7/G7VgVRdXR3atGmDpUuXqoKrSZMmoaqqCsuXLw/q+G+88QZ27dqF+fPnG27z+OOPo6CgwOt1CqQIgiAIouUQaCDV4kt7vjhx4gTcbjc6deqker1Tp06oqKiIyDkffvhhVFdX85+ff/45IuchCIIgCKLpiWnqBbQk7r77br/bWK1WWK3WyC+GIAiCIIgmp1VnpNq3bw+z2YyjR4+qXj969Cg6d+7cRKsiCIIgCKK10KoDqdjYWOTk5GDdunX8NY/Hg3Xr1mHIkCERPfeiRYuQnp6OgQMHRvQ8BEEQBEE0HS2+tHf27Fn8+OOP/PdDhw5hx44dSE5ORteuXTFjxgxMmjQJl19+OQYNGoQFCxagpqYG99xzT0TXNWXKFEyZMoWL1QiCIAiCaH20+EDqu+++w9VXX81/nzFjBgClM++NN97ArbfeiuPHj+Oxxx5DRUUFsrOzsWrVKi8BOkEQBEEQRLC0KvuD5kig7ZMEQRAEQTQfyP6giSGNFEEQBEG0figjFWEoI0UQBEEQLQ/KSBEEQRAEQUQYCqQIgiAIgiBChAIpgiAIgiCIEKFAKkKQ2JwgCIIgWj8kNo8wJDYnCIIgIknh5lIs3nAAk0f0xMTBaU29nFYDic0JgiAI4jxg/up9KKuyY/7qfU29lPMSCqQIgiAIgiBChAIpgiAIolVSuLkUQ+etR+Hm0qZeSkTJH90HqYk25I/uY7jN+XIvmgIKpAiCIIhWyeINB1BWZcfiDQeaeikRZeLgNGyaeY1PfdT5ci+aAgqkIgR17REEQTQtk0f0RGqiDZNH9GzqpTQ5dC8iB3XtRRjq2iMIgiCIlgd17REEQRBEgExdsh09Hy7C1CXbm3opRAuDAimCIAjivKeopBxuWfmTIIKBAimCIAjivCc3MwVmSfmTIIKBNFIRhjRSBEEQBNHyII0UQRAEQRARg7ypFCiQihBkf0AQBEG0ZsibSoECqQgxZcoU7NmzB99++21TL4UgCIIgwg55UymQRirCkEaKIAiCIFoepJEiCIIgCIKIMBRIEQRBEARBhAgFUgRBEESLgzrGCKB5fA8okCIIgiBaHKxjbPbyXX4foqE8bJvDA5rwT3PoHKRAiiAIgmhxTB7RE2YJcMvw+xAN5WHbHB7QhH+aQ+cgBVIRgnykCIJoTTS3DM3EwWkoGJcR0EM0lIdtc3hA+6K5fR5NxcTBadg08xpMHJzWZGsg+4MIQ/YHBEG0BobOW4+yKjtSE23YNPOapl5OxCncXIrFGw5g8oieQT2kQ90v2H3Pt8+jKSD7A4IgCCJsNPcMTbgJtbTXmJJgMPuyzyMnLclvZoqyV5GFAimCIAjCL82hhBJNgglU9PYLJeAMZl/2eWwtPeU3+CK9V2ShQIogCIJoFjQ2cxLq/nr7BROoiDQm4Axl30CCr8kjeiLRZkGNw0VZqQhAgRRBEATRLGhs5iQS5bjmXtIMJPiaODgN8dYYVNmd/Bqp3Bc+KJAiCIIgmgWNDVpC3d/Xfo3JMDWnYEV7jVTuCx/UtRdhqGuPIAhfNKbLqyWhvc7Wdt161xPpzrpodQier1DXHkEQRAtg/up9KKuyY/7qfU29lIiizYC0toyI3vVEuizYmHt4vjUPRBIKpAiCIFo5zaHEpA0qoqk9isb1612Pv2ClsesyEpHrHbc5fAdaK1TaizBU2iMIwhfRKLGc7+aN/q6/qcpc4fhc9I4R6GuEb6i018TQiBiCIAIhGiWW5t55Fmn8XX8ky4y+MkHh+Fz0jhHoa0R4oIxUhKGMFEGcv5CgN/xE4p5G8nPKLliDKrsTiTYLdsweFdZjE5GFMlIEQRBNTGsTVDcHInFPQ80KNpXuiPROzQsKpAiCICIElVPCT7D3NJJBh6+gjp13WO8OSE20IX90n6icl4g+VNqLMFTaIwiCaDoiKbL2VRKM5nmphBwZmm1pb9u2bdi5cyf/ffny5Rg/fjz++te/oq6uLtrLIQiCIARaW9kokllBXyXBUM/r6/6z9wCozksZqqYl6oHU73//e+zfvx8AcPDgQdx2221o06YN3n//fTz00EPRXg5BEAQh0NoeymKwE80gMdTzigat2v2MPhtfQVvh5lJkF6xBdsGaVhMcNzeiHkjt378f2dnZAID3338fw4YNw9tvv4033ngDH3zwQbSXQxAEQQiEM4PT3LJbeoFINNbIzjt/9b6gzqVdr9Fn4ysztnjDAVTZnTSwOIJEPZCSZRkejwcA8Omnn+KGG24AAHTp0gUnTpyI9nIIgiAIgXD6WkU6uxVoQMC2y0lL8gpEopGBYwEQAL/nyh/dh4vTtYFTKJ8Ncz9PtFloYHGEiLrY/JprrkGXLl0wcuRI/O53v8OePXvQq1cvfP7555g0aRJ++umnaC4n4pDYnCCI1oo/kXOkRdBGgm7teX0Jv8OxxkCPEen70VzW0VpotmLzBQsWYNu2bfjjH/+IWbNmoVevXgCApUuX4sorr4z2cgiCIIgQ8ZfZaGx2S5tx0v5uVOoKpCQ2dcl29Hy4CFsOVTZ6Hl6gGZ5Iu9g3l3Wcb0Q9kMrMzMTOnTtRXV2N2bNn89efe+45vPnmm9FeDkEQBBEi4dBT+QpUtIGB9nejgECvJDZ5RE8s3nCAn6eopBxuWfnTF4HoqnLSkmCWgHbxsSFrj8KhWyLfsqahyQw56+rq8Msvv+Dw4cM4fPgwjh07hiNHjjTVcgiCIM5rQnmQhyOz4SuLog0MAg0U9NalPU9uZgrMkvKnL/TOqT3W1tJTcMvA7vLqkLVH4dAtUaapaWiSrr1f/epXsNlsSEtLQ/fu3dG9e3d069YN3bt3j/ZyCIIgznsKN5di9vJdYRUg+wvM2Pvt4mNhlpSsjvZ9rY5HL7Pk61zi69qAaOGEASgYl4Gtpad8Bo/a4KRwcylqHC6VeJsdOzczJeSMEGWTWi5RF5sPHToUMTExmDlzJi666CJIkqR6PysrK5rLiTgkNicIornDxNgsQ7O19FRIQmQx+GEZFiNnb/Gcbhle2xkJxPVeD2ZbvTUE4z4ebsdyEn43X5qt2HzHjh149dVXMWbMGGRnZyMrK0v101pYtGgR0tPTMXDgwKZeCkEQhE9YNoRlaMJRnvKXYfGXxTHaX+/1QLbVy1qFkgUyOmaoGid2z2Yv30W+Ti2UqGekBg4ciBdeeAFXXXVVNE/bZFBGiiCIlkRjMiTRtBIIFm0mKRzWDeIxAcUjKtFmQbw1JuD1s7KqXlYuklAmzD+BPr+jHkitX78ejzzyCJ566in0798fFotF9X5rCzYokCIIglDw9fBm79U4XKiyO8MeVLDj56QlYWvpKVTWOGB3epBos2DH7FFe2/sr4RVuLsXcoj2odXowNisFg7onq9YfTECld1+ayoOLaKDZlvZGjhyJzZs349prr0XHjh2RlJSEpKQkJCYmIikpyf8BCIIgCF2a++gPX51p7D0APstxIv58pkSYaJyVLu1OZcKGw+XRPba/st/81ftgd3ogo8FCYdPMa5A/ug8SbRZU250Bl0gD6TIMNyRuDx8x0T7hZ599Fu1TEgRBnBeID9/mWK5hInS9h7f4Hlt7dsEaVNmdmFu0Rzc7o71eX9cvZqQA8IyUNUY/nzBxcFrA99Atg5+TraPK7oRZQsiBiq97pSWU7FUw10f4JuqB1PDhw6N9SoIgiPOCYB6+TYGvhzd7XTTbrKlzAQDsTg8f+isGDNrr9XX9YsZLq5EKhfzRfVSlQq34ff7qfSEdlxFMoNPcA+jWTtQ1UgDwxRdf4NVXX8XBgwfx/vvvIzU1FW+99Ra6d+/e6kTopJEiiOhDQtqWCdPtMH0RC3wApdwXjP5I+x0IRlwOQHdbo2PovR6Ixipc31H6vkeGZquR+uCDDzB69GjYbDZs27YNDocDAFBdXY2nnnoq2sshCKIVQtPtGwiXbirU4wSzH9PtAEoHnM1iglkC8rJSuP4oNdEGh8vNM1RGaG0F9Iw1swvWILtgDQ9E2PbzV+/jxxfXbvS90nt98oieSLRZUONwBTT+JpB7Z3QvydG8aYl6IPXkk0/ilVdewWuvvabq2Bs6dCi2bdsW7eUQBNEKISFtA+EKKsXjBBMcBXN+FhCwgGlWbjoOPJ2LhRMG8Pcnj+iJWqe+QFxk8oie3OxTb83zV+9Dld2JKruTZ3PY9gBUAZ2v4cdGr08cnIZ4aww/vt76/H1H/c0aJJoHUQ+k9u3bh2HDhnm9npCQgKqqqmgvhyCIVgj9C72BcAWV4nHYA12bsQmX6SX7/AB4HW/+6n2QAUhQdEoi4vknDk5DwbgMrzVrgxCpfo3i9vmj+6gCOnH4sd73KtDhycHib9Zgc+/SPF+IukaqR48e+Mc//oGRI0eibdu2KC4uRo8ePfCf//wH8+bNw549e6K5nIhDGimCIFobRp5PRrqgUPVJemNm+j66CnanGxazhI5t4wLWJQWrmYo04fBxIi+oyNJsNVL3338/pk2bhm+++QaSJKG8vBz//e9/kZ+fj8mTJ0d7OQRBEK2ecGcutCU4o4wJwyiDpfe+ODxZT2fE7ApcbllXl2SUAdJmjYwGIPtDbyzM1CXbA7q/voYohwKVsJsHUc9IybKMp556Ck8//TTOnTsHALBarcjPz8ecOXOiuZSoQBkpgiCammhlLqYu2Y6iknLkZqZwXRPg37Wcvc+8nSQAc8ZnYOLgNNXama2Aw+UGIMEaY0L+6D4Bj2IJtrNOD3HYcts4C/eLCmTEi7YrkbrsmjfNNiPlcrkwa9YsVFZWYteuXdi8eTOOHz+OOXPm4MSJE9FeDkEQRMSJhpbF1zmilbkoKimHWwZWFJersjRGGSwGe98aYwYAJNgsPMAQ184E4rVOD+xON+KtMSF5LTFCHVqsFaXrDV72pRcDQIOKWxFRz0j99re/xdKlSyFJkur1o0eP4tprr8WuXbuiuZyIQxkpgiCikREK5zlC1Q9NXbIdK4qVcSks2PCVffGnW9L+zpzObRYTkuOt3AxTNMUMxFcK0PeJ8nft2nl9gQ401n4e4n0K53cimPUR/mm2GanDhw/jvvvuU7125MgRjBgxApdeemm0l0MQBBEwwWSWwq2H8XfucGadQm2zXzhhAJ4cn6HK0gDQPVbh5lKVHgrw1jGJfk4AVLYI4ty8lcXlfn2lxE5A7Xn1rl0vW8Te21p6ym9XqK/PY2vpKQBo1AgZPdj6ikrKySYhikQ9kPr444/x1VdfYcaMGQCA8vJyjBgxAv3798d7770X7eUQBEEEjK+HrNG2bGxHY+0Y/AU34bR8YEFATlqS38BRG+CxdSycMIAHCYk2i64A3S37DiYULVTDn4wthyoxdN565KQlITXRhjiL2XBtfR9dhe4zizB1yXYevLllxfZAzyxT6z+ld18CCX58fR7sOAXjMsKaMWLH1Ss1EpGjSUbE/Pzzz7jqqqvw29/+Fh999BEuu+wy/Pe//4XZrP8fQ0uGSnsE0bSEexQHexD7K8mEu70+Gu36hZtLVdkf0X5AO8dOa1GgV8LTCsWDtR9gpbxEmwX5o/vwe68Vd+sdSyyfAco+nRNsXkJxX1YJVCI7vwn0+d0kgRQA7N+/H7/61a9w3XXX4a233vLSTLUWKJAiiKYl3PqkpvYfMiIc62L3CoBX8CMGVQC8AiS9jjxxTVpPKG2Hn9769fY3S0BuZorfAKfnw0VcEC4BGJuVgkHdk1XBoBg0At66KTGQ2zF7VEj3lGi5NCuNVFJSEpKTk1U/gwcPRnV1NVauXIl27drx1wmCIMJJuDvWxJJNc3KW1uqJQoH5NumV4kRPp3bxsTBLQE5akmFHnlbcXVlTBwnKPkBDh19RSbnh+kWvJ1bGKxiXgYUTBvgtY+ZmpvA5fYfm5arsGNixxREuwejCAv3cozGfkGh6YqJxkgULFkTjNARBEF5MHJwWscyRVgcVDpoy4yXeK7GMOX/1PsRblcdFld2JM+XVcMsNomntvoD63tQ4XLA7FZ0T26dzQhzKqmrROSHO55rYcQAElVFcOGGAV/Ck/byMypUMVt40Mhj197mH+v2IxPeKiBxRCaQmTZoUjdNEjG7duuHCCy+EyWRCUlISPvvss6ZeEkEQzQDtgzgchPIQZZkLpiUKFW0pjYmy2XBfm8WERJsFDpcb1hgzJo/oaRj45aQloaLajpy0JGzcf5y/zgTeFdW1AMD/NApaxOM05nrYucVsmzb4E7OM7HqMxOLzV+/j12L0OYXy/SjcXOq1zmCvlYKv6BKVQEqL2+3GsmXLsHfvXgBAv379kJeX16zF5l999RUuuOCCpl4GQRDNiEhku0J5+C7ecIDrk7T6omA8lpjOie1XUW2HSZLg9ChiI2uMmZfDkuOtKufx2csVD0B2jq2lp3jWaljvDlz4zY6fm5nCNVJsP731icfRrtef/5R4PezcTOMlBkvaexlIIHum1sk7+3zd82B1eXqfZaD7URaraYi62PzHH3/EDTfcgLKyMvTpo/zLad++fejSpQuKiorQs2fza9fs1q0bdu3aFVIgRWJzgiAijZ7ZJAsiJAAy4FMwrTe6hD2Y2f5sbAs7PgtCxO64RJsFAPgIF0DmbuVVdic/35Pjvdv+jTIqvka7sPWyazX6PZBhyKGYbZolqCwMxNcD6ezUI9TMEmWkwk+gz++oZ6SmTp2Knj17YvPmzVxcfvLkSUycOBFTp05FUVFRUMfbuHEjnnvuOWzduhVHjhzBhx9+iPHjx6u2WbRoEZ577jlUVFQgKysLL774IgYNGhTwOSRJwvDhw2EymfDggw/ijjvuCGqNBEFEl/PtoSJmc9jDXAJ4Gc7u9OjuJwYPALzuF3tPLM1pM0eiuSSgDpjMEmB3eniABQA2i0n3M9GKvcXPT1tyY9kyh8uDKrsSUKUm2lBZ4+AlSCZ815buGNrSnKjFYsGWdh+G1spB+7oYjAVLqFnOSGoBCd9EPSMVHx+PzZs3o3///qrXi4uLMXToUJw9ezao433yySfYtGkTcnJycOONN3oFUu+++y7uuusuvPLKK7jiiiuwYMECvP/++9i3bx86duwIAMjOzobL5fI69po1a5CSkoKysjKkpqbiyJEjGDlyJJYsWYLMzEzd9TgcDjgcDv776dOn0aVLF8pIEUQUidaQ3sYQqcyD1uuK6XkAeA341d4no6yM0f1kvlM1DhdcHhn9UxNwuPIc11AN691BFVAYrUO8rpy0JN7RxzJK4mui/YLWu4rZFTC7A1+ZJaNr18tYnW+BOaHQrOwPRKxWK86cOeP1+tmzZxEbGxv08caMGYMnn3wSv/nNb3Tff/7553H//ffjnnvuQXp6Ol555RW0adMGr7/+Ot9mx44d2LVrl9dPSopSu09NTQUAXHTRRbjhhhuwbds2w/U8/fTTSEhI4D9dunQJ+poIgmgc0RrS2xhCtSsIxOG8YFwGdyafW7SXi8UXbzigaq1vF6/8P5f9qR0xwhzcje4n0/M4PTJkADvLqrFj9ijsnTMGO2aP4jYFbFsAKs0S0NDqD4CPfWH+Tw6XB2VVdqwoLudGnDlpSVyMnT+6j8oGIX90H5glpRTpb0yKeE3aQEl7vcGOzIm0PQLRvIh6Ruquu+7Ctm3b8K9//YuX17755hvcf//9yMnJwRtvvBHysSVJUmWk6urq0KZNGyxdulSVpZo0aRKqqqqwfPlyv8esqamBx+NB27ZtcfbsWQwfPhyvvPIKBg4cqLs9ZaQIggiEUM0eQ9HyMMRSX6LNwgXTEoCU+sCLDQEWM0B6Wb3CzaWYW7THq2yYJ2SCALVei2WQ2sXHYnd5NTfWZGvMqzfNZBk1cY1Mj2Tkth6KyN7fZxGqw3mgGdGWkDk9n2m2GamFCxeiZ8+eGDJkCOLi4hAXF4ehQ4eiV69eYfebOnHiBNxuNzp16qR6vVOnTqioqAjoGEePHsVVV12FrKwsDB48GHfddZdhEAUoGbcLL7xQ9UMQBKGFGVgGa1fADDBZAKKX3WEZjskjesJmMUMCYLOYUWV3olYIfPqlJAAAYsySahjvoO7JaBunb8zJWLzhgK72Ssxmsawb0CBEnzyiJ3bX+1AVlZSrjr+iuByPLNuFzglx/N6w7BoTdYvZIl9ZvUHdk/2adrL75XDpa8hY0BbIkGKRQGcVtoTMKeGfqIvNExMTsXz5cvz444/c/qBv377o1atXtJcSED169EBxcXFTL4MgiBaGXku+ViMUqt7GyGtI2wKvNdjUiscPV54DAMTHxnCtkXawrxikaMtf81fv43qoeKuZG2xWVNfy8pyYOWJrE60PJg5Ow5ZDlTwDBgBlVbX4aV6u6ppF8Te7prlFewCohxpr70Hei1+ipKwamakJWPHAVap7IWbKkuNjdd3cxW7IQLVSbI0s42RkSUAC8dZB1AOpJ554Avn5+ejVq5cqeLLb7Xjuuefw2GOPhe1c7du3h9lsxtGjR1WvHz16FJ07dw7befRYtGgRFi1aBLfb7X9jgiDCSnMQB7MH+vzV+1QPbfZeY9Zl5DXky4NKr7PPZjHBLAHDenfgLuBD563nAY0MtaZJGxTEW2N4UNjzYaXjuqK6lpfg9LoA2Wtsvh7rxBvUPRkFK3fD6ZaRmZqgWvvcor2wO914ZJnaq8oaY4bd6YE1xqwKFGscLt6RV1JWDQD8T7YOJlbXaqG2HKpUlfGM3Nr9eXJNHtEzIoatRPMj6qW9goIC3c68c+fOoaCgIKznio2NRU5ODtatW8df83g8WLduHYYMGRLWc2mZMmUK9uzZg2+//Tai5yEIwptgxcGh4ksszMo2AFTlrWAdq/XQKwmJgQQTlYtrzHvxS/R8uAhTl2xXrc0tA2v3VPDrYO/lZaXAZjHx+Xg5aUkwS4owPbtgDR5dtovf48LNpYiNUbZlWSam+WHHFUeysLWxz2n28l2YW7QHTreMRJuFZ44YtU51xokhlkfZsdbuqeDi+keX7UJqojKCRgzO2DUO691BdVxRaK/33QmkFKcNtoIpCRItk6gHUrIsQ5Ikr9eLi4tDGlp89uxZ7NixAzt27AAAHDp0CDt27MDhw4cBADNmzMBrr72GN998E3v37sXkyZNRU1ODe+65p1HXQRBE8yVa2hNfAZt2mG/+6D7YMXsUdswe1egHq94Dmq1lRbE6EGCvl5Q16JLY/swss9bpUbmTb5p5DRZOGIDkeCtkKF5RrJtud3k1quxOyFAE4Cw4sjs9SEm0qebb6XlDib8z/yq3DK7dqrY7vQLTsVkpXOfFyo9ip5+onRI1YEpiTcJP83JVwZmezoztn5uZYvjdCSQwIt3T+UfUSntJSUmQJAmSJKF3796qYMrtduPs2bP4v//7v6CP+9133+Hqq6/mv8+YMQOA0pn3xhtv4NZbb8Xx48fx2GOPoaKiAtnZ2Vi1apWXAJ0giNZDtLQngZRuwrUWX+VKppliLuQswAGUYKW8yg5JAmQZfCQLoJT0VhaXI8YkweWRvUaeMOPLdvGx+OHYGUhQBOpMWyX6QbFsWHbBGv6edk6e9n6JZp5MN6VdA6AMIB7UPdkrIBPH0rCfqUu282sSXc310Hb9heNzIt3T+UfU7A/efPNNyLKMe++9FwsWLEBCQkOaNTY2Ft26dYt4uS2aiBqp/fv3k/0BQRC6BKrnCsRAUmtQCQB9H10Fe31pzGYxITne6mW0CcBrX1F0zkaeAIDFJMEjy8jNTOHBjdYQE1CE6oAS2OkZeYrCd4fLA2uMiRt46tkNiBYF+aP7qExH9Y4dyKgZgvBFoPYHUfeR+vzzzzF06FDExDTJvOSoQ7P2CILwhZ6X0NQl23lXGyuVaT2NmHhd7IoTO/JYtqj7zCKw/8mzjJUYjPlzPWfZIjZPj2GWgM4JNtXMufmr96lGxLDtmHWBXrcc84mCsC69e9L30U+43cKTOjP/9O6nmHFiawvWt4s4f2m2PlLDhw8/b4IogjgfaM7uzNFaW2POo6epYSWuFcXl/JhMB8TE0ECDtYCo+RFdzAGgvyCyTkmM44JxpjFiui1AyV51n6kWpPdLSUBRSTlM9Skmlmnql5KAySN68mzV3KI9qK6fc5eXlcKF9bmZKZi/eh/6PvoJF6g7XG6YJcW2gNks2Cwm1DhcmLpkOyprHFzkzmB6LqCh9Mf0SuL9F+9npJoOCjeXIrtgDbIL1pB7ORH9QIogiNZFtDrkQiEcawvkQdiY84gdbuzhzIwy2bHFv7NSm9hxxpg8oqeqM7Bwcyl2Cm3/zN+ppKwaZVV2zC3aw69NEYy7+XiVLYcqUS6I1D2CJQIAnKypU42jqXV6IEMZUvzTiRpujcCCO3v9+2ZJCYrcsvJnaqINc8ZnwBqjGIauLC7n224tPcXvf9fkNjzg0hpdisacYoAlBlWhGqDqwewntONuGOJ3pjn/90GEBwqkCIJoFM25SymQtU1dsp3bAugRyIPQ33nYg3Xqku2GQRkrPVXZnThZU4cnx2d4HVPsLNO26bOHdv7oPsgf3QfzV+/Do8t2qcp6uZkpMAtN06xbj5W/bBYl6xMbY8bK4nIY6T4kNIjZWeAiZr5YoMbKjRIUbVWizYKCcRmqoIYFPcxUM6Z+u0SbBTlpSTyLVVJWDRlK8MW67eav3lfvTN5gjyAGMWKQqjVHDTVLxIT9NovZ0MpC/M405/8+iPBANbYIQYacxPlCc+5SCmRtrIxWVFKuat1nhKMzjz1YK6rtul1pIixIEbvhxHMwkTjLTGkH6z5ab1opBlAJ9QLtiYPTMKh7MtdFMXG3eL7Zy3fB7nTDZjGh1ulBnEX597Y4DibBZvFaP+vkY4jWCDKAjhfGec2TE6/NxVJeErgv1Mb9x72CuZo6F3+/sqYOVXY7bBazbjlPvIfia4EYaxohmqEazceLRDcg0XyhjFSEIENO4nyguek/AlmPdhuWpRFtAUTCYaoYiEcRy9LMGZ+hGwCI62fjYZiIm53DLCkBlBhEjc1K4YHH1CXbedZqx+xRWDhhgOraWOmQMWd8BvbOGYNZueleaxUp3FyKakFkztYGQHeUjXhts5fvQuHmUjjrT+x0y/w9diw2p098f/KInrDGKI8wa4yJXwczDhX1VdqsUGOyRIHsS0ac5xchde398MMP+Oyzz3Ds2DF4POphj75GvPzzn//EF198gREjRuCee+7Bu+++i8cffxwOhwN33nln2J3NmwPUtUe0ZiI5vV6vXd1fa7vYyWa0nkDXHKl2eX/HFd8HvEtSrFzHus+027MxKgxma8C669wyVIEJy1SxDr7qerNNBgvGtFYH4nrFEqJSHpS5OFzv89CeKzXRhsqauvpMmBmzcvt6nYt1MsbGmGF3ug2vQXt/QkVvVmKg3weyWmgdRKxr77XXXkPfvn3x2GOPYenSpfjwww/5z7Jlywz3W7BgAR588EGcPXsWs2bNwty5czFlyhRMnDgRd999NxYsWIB//OMfwS6HIIgmJJL6D71sjJFeScxg+FtPIGtmHkrhEAlrM2D+NFe+RoywMhnQ4ADOtp+/eh/mFu31Ol5NnYtnhVhGDICXWJqVrADw0TCAkt1aWVyuO+IFULRdYuBld7phd3pQZXfC4XLr3mt2roT6bFNlTR1cbg8kAJd0vEBXzzSoezIOPJ2LWbl9kWizoLp+/fHWGN3701i0n5MoaA92X6J1E3Qg9eSTT2Lu3LmoqKjAjh07sH37dv6zbds2w/1effVV/OMf/8AHH3yAoqIiPP7443jmmWcwa9YsPPbYY3j++ecpkCKIFkYkSxh6AY9REMReF8XLjVmz2B3X2CBR+1BVRN0mlFfZdQXuTJxdWVOnClgKN5fi2Ola/rsMxXKgvH74MABuvCnicss8QGJml4ASLNksJlTW1CG7YA0vickAkuOtmFPv1QQoAnC9+XpaobdyTLPq/NqZe+I9qLY74XB5YHe64fTIkAHsrBeqs4BFe//Y5yajQU/G7AgqaxxcBM7Kj6GWnyNd/iNaD0GX9i688ELs2LEDPXr0COpEbdq0wffff4+uXbsCAOLi4rB161b069cPAPDjjz9i4MCBOHXqVFDHbe5QaY8gWh6hlmYCLUf2fLiIB2oF4zJUpTnm2A00vK99XQvbTizrZaYm4GRNHdrFx2J3eTVMkgSnR1aZcgLwyuSJa5m/eh8cLje3NhDPJZpv2iwmWGPMquHByutmJMfHepVcCzeX8rUyMbzD5YY1xgyHS8loSQAP5rT3T3Q53zF7lMqhXVtGDKb87G8MD5Xrzi8iVtq7+eabsWbNmqAX1KZNG9TU1PDfO3TogAsuuEC1jcvlCvq4zZVFixYhPT0dAwcObOqlEESLJZRsgr99fL3P3ttyqDKk9YplNuYJBcCrJMZ8ovqlJKgyLlqxN+vw077OsNR7GZjqZ5cyy4Qnx2fgloFdAAA/HDsDtww467vi4iwmHjSJ1gQ1DuX/v5tmXoMthyrxyLJdKv8nACqBu8PVoI9NjrfyYcyil5U1xqRbchVLXkwMnxxvRf7oPpiVm84zY3rlTQBenlBa/ywRlh3Sek/pfQ/Ez0L7PgnICSOCzkg9/fTTeP7555Gbm4v+/fvDYrGo3p86darufldddRUeeOAB3Hrrrbrvf/TRR3j44Yexc+fOYJbT7KGMFEGETihidnG0idjV5uuYWrE6E2UHOsdN+35ljYPbBYiZH70RKNrxLkyAzUTiOWlJWLvnKGqdbvSvzzJptwW8Z+CxDBbLQDFsFjOfa8esH9j1snuml/2SAByal8t/F0e25GWl6FpHaGfqAYrlgvbvoujc3+iaUGH3nN1XvcYEvfmFkWikIFoGEZu11717d+ODSRIOHjyo+96mTZsQHx+P7Oxs3fdffvlleDwe/PGPfwxmOc0eCqQIInRCKaeIw3b1HpJ6A3G1D1m9bcTtfD1cxc4xo/KU9rqmLtnOZ9nZLCbUuTx8zp5YthIDPKChLCciAUhJbJiBl5uZws01xaBK/HtmagJ21hteJtos6JrcBiX1jugWkwSXR0acxcRtEBZvOIBjZ2q5ZYFRMKK9v+I1iGJ29roY+Go/k8aW1PTm/Pk6LusS7JeiBK9U0jv/aLZDi883KJAiiOgjDv1lbfu+rBECDdgC2Y7pd5htgF5Apj2mqG1KtFlUD3olI1WBWqfHKyMFNGR1mF7JJAFP1GuY2Pvi/ixAYgENO6eY3RKDLJbBEtdUVmVXbcMyUuK12Cwm7J0zhmeXmAZKzISxc4mGoeJ90VokhCMzFOhnLWY2Q8lOBrsd0fyISiDFdpUkyc+WxhQUFGDKlClo3759yMdozlAgRRDRR8wcAQhrZkMPsRTFxNIss6T3EGb7iAEeoAQkzHlcDCDYNjaLCcnxVq+singMoMEnSixTAkrQEmOSuF6KYdF5Te9YrBuOBUastKcn+mbZOKPsYCClOxaUsnOEq8znD3F9eu7vQOBl50h6rRGRJWJicwD4z3/+g/79+8Nms8FmsyEzMxNvvfWW3wVpf6qrqzF37lwcPHiQv0YQBBEoRsJxsf2cCZHZ64GYKQbrji4OsQWUoIEN5jWyUGC+RDUOF8ySUl7buP845hbtQVV9ECVBsUNgruFsNh47B6AEiVV2J0zCv2fFtYjxkQzwUSwWYQeXR1YZXAJKUMcE3aK4e+LgNMRbY3hnnYjoJj42K8XQRmLi4DTsmD2KC9T9IdVfE5ut52tmYThgn2e8NcbL/Z0RqMUBWSG0foIOpJ5//nlMnjwZN9xwA9577z289957uP766/F///d/eOGFFwz3S0pK8vpJTk6Gy+XCkCFDkJiYiKSkJMP9CYIgtBgZH2qH1TpcHv4gDvWYvrYRAwhrjBmbZl7Dg49+KQmYvXyXyjOqcHMpD3ScHhluGdhdXs275ETYvDmzpAQnqYk2DOvdAQD4n4ASbDw5PsMrIBLzTBazhDiLCYk2C2KE6cVxGu+nRJsFCycMwOQRPTF/9T7MX71PFYSy4GCsEGyxtQJKWY95VrHROFojTxHmA9X30U+QXbAGhZtLUbi5FA6XGxKA/qkJqsBRO7DZiEh6SAXaxUfdfq2foIcWv/jii1i8eDHuuusu/lpeXh769euHxx9/HNOnT9fd76KLLkJ2djb+9Kc/wWRS4jdZljFy5Ej885//9Clib4nQ0GKCiDz+BgqzgCcY8UFOWhIqqu08OBL1VqwzTXveraWK/x07T+HmUj6stvvMIsgAVhSXc/HyznqdEqAENx3bxqFdfCx2llVDkhqySDLUJTWtELvG4eLDhdmswHhrjKrMJ+LxyLC7ZSTHWwE0DCJW3MjdXFjOAjTRK4pZEQSi+WGZs7IqZaAw03AZDQkWXdXtTg/mFu1VmYuerKnj3XzahgEtep13wawdaN6DuInmR9AZqSNHjuDKK6/0ev3KK6/EkSNHDPcrKSmBxWLBnDlz0KtXLwwfPhwjRoyAJEkYNGgQhg8fjuHDhwe7nGYLDS0miPCil13w9699o8yJL7aWnoJbbgiOmDC6qKTca9sthyoxdN56nnlJqBeKs0xJ4eZSVUbILQMl9d1xjPhYRbe1u7yal/P0EDM67LpqHC7u88RE9WWC07mW3MwUJNosqHG40DW5jdf7HllxF2fXzmAlxqHz1qtGpWjLbCwLNzarYQA0C4j0MjzsM81JS0KizcLd1sUgSvSGYj5VG/cf575XeveJBU/azBKNbiEiQdAZqV69euG9997DX//6V9Xr7777Li655BLD/ZKTk/Hhhx9i8eLFGDRoEObPn48JEyYEv2KCIM5LtNkFf4TaLaXNSOVmpvCMlHYtFdV2uGWgssaBOpcH/VISEF/fKs+284XNovg5iZ5PJknxg2KicBZYlVXZMXu50hEnZrsYc4v2wBqjHo8iDhOWoMzMi7OYYHd6cKa8ISvGYNtW1jh4YMQyQMxCwWKWYJZQXy61o7zKzsfVsEHFyrUpw4WZaaje5yC6oLMBw6JgPTM1ASseuMprH22WTETMFmozS/4ymAQRCkF37X3wwQe49dZbMXLkSAwdOhSA4hG1bt06vPfee/jNb37j9xh79uzB7bffjvT0dLz//vsoLi5Genp6aFfQzKGuPYJQaGwbeLDt5npjSfztL3pAsU40vWOz0hL7kwUTeiNfmC4r3mpGWVUtUhPjUFFdC7esnONMrdNw9AvQ0MknBkXMbiDvxS+5nQFD7A4TrRjEU5gl8BKj0anF42i78WQ0+F3JUAvatccAwLNkoj8WoF82FT21jLodw23WGQpka9D6iVjX3m9/+1t88803aN++PZYtW4Zly5ahffv22LJlS0BBFACkp6djy5Yt6Ny5MzIyMmCz2YJdBkEQLQRWvmEloVDLKoGKdsUsRzBlHWbkaRRYsPfLquzYWnoKm2Zewzu6xmalQAIQG2NSlb4WbziA/NF9sGP2KJRXKQOHy6pq0S8lgWd1fAVRgFJmmzg4DQmCiJyVGU/W1HltLwrfxVKb2KXnloHDlecwZ3wGzAa1RJaVAtQjWMZmKeXBWqeydu0/xSXhz8oaBypr6lTbiyXSjfuPwy0rfzLB+cr6IErs9NOWdeOtMU0aRAFUJiQaCLq0BwA5OTkoLCxs1IljY2Px/PPPN+oYBEE0f9gDJ9FmiUobuLa0o/e60TpFvyWxI077/pFqOxeUF24uxdbSU1wfZY0xw2YxcQsCVn6Kqy91AeBZJGuMCcnxsboO5YBSHmPrHda7A8/UsFl9rKtOHCzMAhWWMQMU/ZRo2snYcqjSMJCzOz1epURACWqKShqc0iWpIZiy1bufa/2xkuNjuRFnv5QEDJ23XvU5VNmdqowbc2RnHYNsGxa0BFPiDZZAM01UJiQYAZX2Tp8+zdNa/ryejNJfH3zwAcaMGYM2bbwFjq0ZKu0R5zuRLoGE6/h6JUHtHDwxEBHLeFrDTzEoEGfbsUCIwcp2c4v2cBNPl1uG0yPDZjHhko5tUVJWrSoHAuqyozhKpVrwnxL/xy6aerL9tesRzTq1Bp2i7orpudhgYbGs9+T4DB5cim7meh2H7P6Kc/1El3OxY1C8twAi+n0iA02CEVZnc7PZjCNHjqBjx44wmUy6TuayLEOSJMN2f5PJhLZt2+LWW2/F7373O1xxxRVBXE7LhQIpgogs4X7w6bXPM0ySOnBITbQhJy2JByQWs4T42BjU1Ln4HDqGWQJiY8xeHWls5IqIXqAjwlzD2Zw+pjNau+co7E63VyDFvJhOCkJ4MYCxmCRum8ACRDGQYetvG2dRbSOOtgEaAimjwdFax/CN+4/D4fLUr1aCNcbEgy5R38WuNRqQ9olghDWQ+vzzzzF06FDExMTg888/97mtkYWByWRCQUEBPvzwQ+zYsQPp6em47777cOedd6Jdu3b+ltDiEH2k9u/fT4EUcd4TqQdUJB984gBkJRAy8cxRcryVl9a0JTMjEbnSlad05jnr3cTzR/dRBTWBoh3Los06aZEAHJqXC0AtHgeUABAyeBbKZjFjVm7f+qySB7VONxfgs8zQlkOVXoGeKOzXGw3DgiNx7Iz2fukNjgaCy0IF2lhAARPhi4jN2jt8+DC6dOnilZWSZRk///wzunbtqrufyWRCRUUFOnbsiK1bt+Jf//oXlixZArvdjry8PNx///247rrrgllKi4AyUkRTE+wDI1IPmGAyR6GsIdiuPvFBzbbXG3YsDghm8+VYALR4wwFU1tSpskxMJwTAMEDSDuot3FzKy3uBwgIp7Zrnr96HGodLd3aeXonOiCfHqzNJ4r0VO+vYNQNQlfHEfQDU3ysHv39AQyBlq7dkUP6uZO30ugYDzToGsj2V8Ah/RKxrr3v37jh+/LjX65WVlQG7k+fk5ODll1/GkSNH8Nprr+H48eO4/vrrW527OUE0B4LtLgq1G8nfOA5fYzf0ZteJpo+BzL0LtCuQHVscM8KOsbK4wXyTbbdx/3GcqVWE47X1QUDX5DZ4ZJnSwWeNUf9vNDneive+/RmPLNuFtnH6/TwygNO1Tn7uiYPTMCs3HTbNqBYR8Z+uZgmqsSys843NwdMGUWxfUbAdK3g+mbzVGqr7qO2YXKkJouxOD+rqx/Cw/cR9GkqkigfVsN4dkD+6j9Ax2LAAa4yJl0zZZ+9vZIv2+xPIiBeagUeEi6ADKaaF0nL27FnExcUZ7qe3T1xcHO6880589tln2LdvH26//fZgl0MQhB+CfWCE+oDxF4D5si/Q7svWAMBvcGRkd2AEa+WPjTFx12x2jDiLiXeM5aQl8WG5LHPDwhPRuyl/dB/kCU7ex07X8ver7Pru24CitRKDxfmr96kyWyISwG0HbBYzt1nQCzDFIc2MhHrrApvFhBqHS3Uum8Wk0n0xw03W8ScGKezv7H/nFpOEWbnpfJ6eeP/F/djnaY0xcdf4iYPTUDAug78ONASIm2Zeg62lp1QmpOy7oxewa78/gVhl0Aw8IlwEXNqbMWMGAODvf/877r//flX3ndvtxjfffAOz2YxNmzbp7i+W9s4nqLRHnC80RpcS7OsiWlPHQI4lzuBLqBd2a8t8Wh0R4N0Nx0TaWmG4tutND6azYrombblLRK9Ljx2DlcRYMFdUUs41WGxfVm5j+4r7adEabgKK7xTrPhTXxwI87b0T1ymWzvQ+G6MOPyOdVaDHJYjGEnaN1NVXXw1AEZ4PGTIEsbGx/L3Y2Fh069YN+fn5hmNiSktL0bVrV93MVGuGAimCaCASHXbah622vV4bPOm13YuaJ5ZR0Q7OFbvWAO+gSkTrPK4XWLFutPmr9+F0rRMeWRmJcsvALlzkDciwxph5oMf0Wg6Xsi4xGEpNtPGRNdpzAErWhg1G9vU/fZvFBGuMmVspiMdiXlkiZglewQ77bAIJbsQOP+1xjAIvCpqIaBAxsfk999yDv//97xQUBAgFUgTRQDgfgtqOOtZmP3XJ9vqZcg0ZFLHUJWY8xHEwzIZA23EnduhtOVSJlcXlkOptECxmCS63LHhGKZkeFgxoR7SIwZfNYtY148zLSlFllVhmSAyQWLDDghpWjly7p8Ir0yRem6/gTwK4aWhqog3t4mNRUlaNRFsMztS6+KxBNq/vuvTOqjE52u468e+hiv+DhYIsIpwE+vwO2tn83//+d8iL2rt3LzZv3owhQ4bg0ksvxffff4+///3vcDgcmDhxIq65hjonCKI1oX2wbTlUiYpqO7Ycqgzo4errgcicxsUgSnTdtjvdXLgsmmyy47E/tXPxtJkYQOIZkvmr90FGg5O3xyNjbFYKL+sxa4TJI3qicHMpqusDHXY8FkzFmBXPJKZDOlJt54EZGw7srj8JcywXqXV6VAOCmdhcr1xXbXdyl/Zjp2u9MmNiUMac1nPSkrhDerzVgh2zRwNQskcyFEE9m43HEAPbYBzItYOFG0Owg60JIhwELTavqanBo48+iiuvvBK9evVCjx49VD9GrFq1CtnZ2cjPz8eAAQOwatUqDBs2DD/++CNKS0sxatQorF+/vlEXQxBE80IrAi4qaeiKC2Y/PZiAWTR8ZMGVBPAOuMkjeiJ/dB/YLGaUV9kxdcl2fgxRcLzlUCWqhCCKiRBcbg8XOJ+uVZe1OifEqTrYAKDO5cHEwWk86BJhGSGnW0aV3YmN+49j08xr8ES96Hr22H6Iq7cSsJgkPidPKx4fm5VSf00N/wt3uDyq301Sw/nYbMAYncF6yfFWPpNPFHqzIFUU77eLj+V/Tl2yHd1nFqHvo5/wwFfcx6hpwV93Z2NoTZ14kbxPRHgJOpC677778K9//Qu/+tWv8Mc//hHTpk1T/RjxxBNP4M9//jNOnjyJf//737j99ttx//33Y+3atVi3bh3+/Oc/Y968eY26GIIgGk84/weufbDlZqbwMpSv89c4XLyjzmgbo3l6qYk2zBmfgeT4WNWsuzqXWzWLTnud2uCOBUFOj8ytDrT68bKqWq9gKTbGhKlLtvNslN4xGQ6XB0PnrceWQ5X8tevSO/Os1eQRPVWZHwmKvxN7TcxK2Z3KvD2GR1Y0TeL9d9VfgFlSMlESlO48bQeb2Nk4t2gvsgvWoHBzKXbWdyPuLKsWMn8e/lmwwBYwLusZWVs09nvX1GW9cAc+NBS55RC0RioxMRFFRUUYOnRoUCdKSEjA1q1b0atXL3g8HlitVmzZsgUDBij/Q9i1axdGjhyJioqKoI7b3CGNFNHSCFUQHq4HWbBmitohxVrNDfuzXXwsdpdX8+4+7RiT9779mc+1AySuERLx1e0GKHokNkJFK/pOSbTh2Jla1egY7fH0ZuLlj+6jO7sP0O/wA5RslCyrx8JMHJyG7jOLeHkxJdHGrz8307vzTtu1mCqs32KWMCbjIq6XmpWbji2HKvlQ4t3l1boCdEB/pqG2SYC5owfzfWpqg81IjiqiMmXTEDFDzqSkJCQnJ4e0KNaxZzKZEBcXh4SEBP5e27ZtUV1dbbRri2PRokVIT0/HwIEDm3opBBEUkfKRCvb8zJBx6pLtXj5GOWlJqiBKPC/7nZWzmB9RSVlDEAU0+CS5ZUX7tLtc+f9PZU0dKqqVAEJbCNMGUaKBJjO1lOqPaZJQH5QBkqTooLTz91zC7xKge88XbzigymTZnW5U2RWDUIuOk2aizcJLeiVl1SirsmNu0V4ASknQLCl/itcvmpOKnwPzrWLZwfhYRVYbHxuDhRMG4NC8XOydMwYTB6fxsm1JWTUPIitr6rwyNCz7Nax3B5VflfZ7F+z3qanLeuE+P/lctRyCzkgVFhZi+fLlePPNN1VeUv7IysrCM888g+uvvx6AkoG69NJLEROj/If5xRdfYNKkSTh48GAwy2n2UEaKaC34+xdyuP8FrdcWD8ArE6XNNIkZKWYVwAIgswQceDpXJYwWO9lYWKJt+/fV6ebrf6CJOnYBRvvbLGbsnXO90HXonek5XHnOa5Cw0ZgX7dp+mperGhoMgHcUsg5H1tFohNazC2j43NnnIGak2BpFHRvDXwaHrA+IpiZiXXt/+9vfcODAAXTq1AndunWDxaIWQW7btk13v8mTJ8PtbvBkycjIUL3/ySefUNceQQRAOB4moRxDL/Mj7h/O7isAPFDSa6/PSUvigRDzTtpaeoqvA1DPkrOYJHhkGf1SEjB03nrUOFxcGC16Q8VZzABkVeZJkhq69LSILyfaYryczH0FUQCQkhiHsqpaAODlurV7KiBDyVaxEphbBnaXV3P9EfO4csv65p9KcKQuG7IgSmuoqWznRnJ8rN/Pj4nQ2b0G1M7yB57OVZ2rut4VXq+LTizJ6qH3fQpnVx4FZUS4CDojVVBQ4PP92bNnN2pBrQ3KSBHhJhxajFCOoZfNiLYeRauvYfoeNlRY6+DNYM7g7HXmrcQe4o8t3wVPfTnOI/vPNAGKeaY/c0sRkwRcGKefoWIBjegNxbCYJV4SZN5TbPivuBZvPZdZZSgqHkdEvBfaYcNqX64G7yhfWSK9YcXB+Er5IpzBT1NrqojmT8QMOYngoECKCDdNlZECwA0mmfcQAL/loMagXSd7+LGgIDM1ASseuMpLfM4Cvq7JbXi56WRNHS/3adfdbWYRP6dSQpR5pkgPZsQZE8AoGAYz9tQacALaEp9iwMkMOQMJ6th1i6J032tRgizmfG402mXyiJ54ZNku1Xn8BR1GonGtuLypoYwU4Y+IBlJVVVVYunQpDhw4gD//+c9ITk7Gtm3b0KlTJ6SmpjZq4a0NCqSIlkIgDxYWSIlu2aF097FAx18QZvRQLq+yQ4Za88TWzspX4hqNdFZs3X0f/QR2p0cRb0vwytzYLGa43B6fQZO/+XpsLh0z3LSYJLg8spcei3XasawT84aqdXoQo5NVkgAe0LGMmi/YqBdAuf8AVCVUsZQqlu1s9RkpFojqzScE4KVRYwan2sxXsFDgQ0SbiHXtlZSUoHfv3njmmWcwf/58VFVVAQD+97//4eGHHw55wQRBeBOqN00o+wXSJSUaNzamu491nWm9hLTkpCWpOrsY/VMTYJbANU8AdDucWOeZSZK4Z5LeulmZzOmRdctfdS43Zuf18+riE3HpRDDi9jKAFcXliDEpaxnT/yKk1Ad2ZkkJNMROO7Ymu9OD5HgrN/IUSU20IcFm4QFcIMkxGUpZNt4ag4mD0/jnzjr3ikrKebDC7tWT4zOwd84YbNx/nH92bHvxMxSDHbYtW9Kw3h0a1YVGvkpEcyXoQGrGjBm4++678cMPPyAuLo6/fsMNN2Djxo1hXRxBnO+E+vAIZb9AAiOxJVv8ezCBGwtumFu3r3WK4uapS7ZzY8zDlefQOcGGvUdO17f37wGgBJAOl1Ky6prcBos3HIDD5YazPvOzdk/gPnUmCdxegAmmRWdwCVDZDzB/JhG9uIathWVzEm0WtI2z8DEuDJaJkgyOlJoYhxqHCw6Xm1svmOoDMtHhXHs8dkz2OYvBpnit/jJApvqA8Eytk1ss+PreiQJ1IPhgPxz2AoGek1zFiWAIurSXkJCAbdu2oWfPnmjbti2Ki4vRo0cPlJaWok+fPqitNdYVAMDGjRtx5ZVXctsDhsvlwldffYVhw4YFfxXNGCrtEY0h1HJGNMog4jnYAzRYM0V/wmTR2oD5FAH6YnCtuaWRNQCzJBC3D0SHlJeVwrMs/s4RCHlZioWAONiYdfGlCt18euvPH91HVXZj6xDF9w6XGy63DFf9PMBB3ZNVQ5p3zB4FQLE0WKEZcyPO3xNLoFq9kwjTW2lnFzpcHl1rhaYQewd6ThKiE0AES3tWqxWnT5/2en3//v3o0KGDzh5qrr76alRWVnq9Xl1djauvvjrY5RBEqyZUU75omPmJ2YdQzRTFdYr7sL8zc8eVxYqPEhttwvRRiTblH2QSvM0y+6UkcE2UiMPVUDJj6MVC2uzS1tJT6Jqs9s4zCqJSE+N0zTJFikrKVRkPGUBFtRI8lWuCqMz6UmZmagLirTHYcqgSNQ4XbBYTEm0W5GamcCPQlcXlqLI7UedSNFUylIHGbPafhAZtFFuHFnZvtBkg9nnlj+7Ds4qZqQm86xCAKmMZb42B3enmZUQRvQxTpDNBgWa1mtrck2hZBB1I5eXl4YknnoDTqfxrRJIkHD58GH/5y1/w29/+1u/+sixzh3ORkydPIj4+PtjlEAQRZgJ9mIkPG71Zbey9UI43eURPiPN1ZYCX865L78znwDHfJr145mRNHTbNvAaZqQmq15lfky9MkvcxJ4/oyWfNAUpAwgI575hJwuy8fkhNtPEgSHRBB5Sg55Flu+BwuVUlRJvFhBjhgBaThFsGdlGVMlfUB0sut4x4awwGdU/mAvK4+hl6brkhIKqpa/C3SrBZVNYFsfXdlzaLCXn1A5JZ1ssoGJ84OA07Zo9C/ug+OFlThwSbBXanB7OX71J9zr4CEr1gXwymIxFUBfoPDHIVJ4Ih6NJedXU1brrpJnz33Xc4c+YMUlJSUFFRgSFDhuDjjz82DIZuvPFGAMDy5ctx/fXXw2q18vfcbjdKSkrQp08frFq1qhGX0/yg0h7R0gimrOHLQ0g7s01vLp6/Y7PSECCj1umBDHXnnR6iJ9Ow3h1UJUFFV+TG6VpnQMJshq3eZbxgxW5VZx4rqSXaLLw7DVAyR4crzwFoyP7MLdqjdAbqdN6JJUKtu7rYfWgE05s5XG5YY8wqN3dGXlaKl7FpZU0d7E63qtQXDKIv15lap+F8vUDxVS4miGgTMWfzhIQErF27Fps2bUJxcTHOnj2Lyy67DCNHjvS7H6BkpNq2bQubrSHlHhsbi8GDB+P+++8PdjkE0WKItG6pMccXW9ZrHC4+W80f2hIecxMXnadz0pJQUW1HTlpSwM7UbD1ag02zBI3+xg2XptNubH3AwDrQRO2QGFT5wlxvI9A/VRl3Ynd6dD2a2sYxN3P1O6I55tyiPbDGmBs6A3UW0C8lAXsrTsMpeFOJ5TLWtagNpljQJeqV7E4PEm0WJMdbIfphsdmDgPdAYiC0748YGLNRNtoOS+0QaV/H17qZ+3I+J4jmQtAZqf/85z+49dZbVRklAKirq8M777yDu+66y+f+BQUFyM/PP2/KeJSRIhiRFrA25vjauXZG89G06GUQxH3FmXZsELF2Vpv2OGLgpBWv6z2MtUGBmPky8kTyBxOfN0ZMLqIVwmvRjqphnlNM3M5G3MhQWxwYieSfrDfZFD/X3Ex1RkocoZMnBJ+h+j0Zff/0ZiYGm+kkiKYgYmLze+65B9XV1V6vnzlzBvfcc4/f/R966CGVRqq0tBQLFizAmjVrgl0KQbQoGitg9acZYW3sNQ5X0LoStrbczBT+wAvEOkHUkrBjiAHY4g0HeGDGgijtrDa2XVmVnWtstPeKnWftngqV3QGg9pgySUB5lR1bDlXy8+WkJfH1+ZZ/N8A62/qlqPVVTEekh4QGUbjeu1pLAouwoVtWynLi+VcUl6PGoWibnB4ZblmZ+ce0VjaLGWN11iIBPIhl2cWCcRk8UGLZwIJxGXytzIjTLCnrCMVyw+j7x16PjTGFnOkkiOZM0IGUkVj8l19+4eU7X4wbNw7/+c9/ACgO6YMGDcLf/vY3jBs3DosXLw52Oc2WRYsWIT09HQMHDmzqpRDNhMYKWP09XFiXVJXdabiNUTDG1rZwwgAUjMsIKeDTuz7RJ2nj/uM8A6It/7SLjwWgBBRzi/aoykU9Hy7C1CXbUbi5lGd1aoXsjhiUeWQlCCkqKedB28ricgydtx5bDlV6ZW9YF6Ae8dYYnKypU71W5zLOKiXYLLhlYBe0jVPE2k+Oz+DaJbvT7WXN4HTLqqBLL2OldUofm5WCvXOux0/zcjErty+2lp7i67eYJZgl8OCKGZ+eqVWyXFpzUxZMiZlC5fNR/KEqa+qCCsiNvn8N3Xse3e49PahrjmhJBBxIDRgwAJdddhkkScK1116Lyy67jP9kZWXhV7/6lV+dFABs27YNv/rVrwAAS5cuRefOnVFaWor//Oc/WLhwYehX0syYMmUK9uzZg2+//bapl0K0EgJ5uPjbJpB/6YezY4kdo8ruhMPl4YGDtvVf7IazOz18jezhXlRSrlpzSmKDGbAYlFnqTSJjY8zol5LAS1+s002LWzYOjlj3IDO4ZJ1wenYB7BofWbZL5RquNdkUz8tsCwLFYpIwqHsy/519lrVOD2wWM2JMEtrGWfg2rPORZRdZIMtGvAANnzUzPjVLSlejDCX4CzYjZOREz14HZB4Y+4K65oiWRMBi8/HjxwMAduzYgdGjR+OCCy7g78XGxqJbt24B2R+cO3cObdu2BQCsWbMGN954I0wmEwYPHozSUnKRJQgjtELcULYRxcGNJVgdizXGhOvSO2FFcbmXID2ufoguoGRWPB65/mHcoKka1D2ZD9BlAurCzaU8sDFLwOy8fnzW3g/HzsAUgMaJBRCxMQ1ryMtKwXvf/oySsmqkJsYh3hoDJtxuEJjrY5aUDFvPh4u4tYAe8dYYLJwwAB+VlHPdkwToDkI2SUp2am7RHlXZDgAPegAlCGX3VSyvTh7Rk5dDxRIiQ/u9YLMQg/2eiE70eq+zz62opFylkSOIlkzQYvM333wTt912m5fYPFAyMzNx33334Te/+Q0yMjKwatUqDBkyBFu3bkVubi4qKgIf4dASILE50dIItMsqUHF74eZSzC3ag1qnB3H1omut+HnLoUqsLC5HnMUMa4zJy1Gb0W1mEf+7KJAGlAAsPjYGDpcHdqfbp1s5sydglgVsPWv3VKDW6UH/1ARV550ReoOHnxyfoerwY07qIkxMLq6fXZM4FFivyzA10cYHGuvB7ot2CDHbhzmQA/AKhI2c5o2sLbQYbcNeF53qKZAimjuBPr+DDqR69OiBb7/9Fu3atVO9XlVVhcsuuwwHDx70uf/SpUtx++23w+1249prr+Ui86effhobN27EJ598Esxymj0USBHNHaOOOX9dVsznCYDX+A8tPR8ugltG/RiUhq46rQcR0xSxYwLqFniWkQIaRpJobQlY1xkLIPQ69cRzisdrTINeos2CrsltsLu8mnfX2SxmJMfH8jWY6m0VRG8om8WMOpebB5Zi55xau9TQ/We0VvG4Ygcmu7ei1xMAr0BYDI6174fqB0YQLZWIde399NNPcLu9U8MOhwNlZWV+97/ppptw+PBhfPfddyrzzWuvvRYvvPBCsMshiPOScLo+a3VTYgefqLfSnlPUPz2ybBeyC9agcHOp7tpY91uMSeIPX3YeoKH85nB5VBoj7dgYEZMEPvZEhDly/3Sipj4o0VcwaDM9wQRREuA1AqbK7uQjbTz1Acx16Z1U3YJmSRGEd01ug8oaByQo2xSMy8DG/cdRWVMHm8WEarsyCHjtnqP1AZkJT47PwHXpnWGW1Boxpt+yWUwY1rsD79Rjnx/7M390H1UjAbv/OWlJ/PPSusuLn7/4O3XVEUQDAWekVqxYAUDRSr355puqDj23241169Zh7dq12LdvX2RW2kKhjBQRCcLpSRWo1knMVDGLg76PfqIqMaUm2lQDbbWDedk24prFobk2iwl1Lg/XRIkZLwBc/2QEsybQlsTyslKEc5gByD59nVgm6djpWl29UqCu6CzD5mvNWnx5Q4leXSzbxDoVpfq1BeoDNnXJdhSVlCM2RslyBfNdCsTRniBaOmEv7ZlMSvJKkiRod7FYLOjWrRv+9re/4de//rXfY3333Xd47733cPjwYdTVqduL//e//wWynBYDBVJEJGiKB5cY8LASkqjVsdWPZRHHk7AHOiu/sXKcqMlhxpCi4FuCYifAzCidHhkWk8Tb6wF4jVqxWUxIjreivMquCkRYOTFQM05Rv6UNpGyCKN4IcV0WQTje2NKhkdEo05dpj+0vMNIrt4b6XYq02SxBNAVhL+15PB54PB507doVx44d4797PB44HA7s27cvoCDqnXfewZVXXom9e/fiww8/hNPpxO7du7F+/fqAfKgIgvDfHh6Jga+sE0sCeOnJGmNGaqINT47PQHK81SvzkpuZgsUbDvCH/NisFL7mqUu245Flu/jDPDczhQcpcv05Em0WHog4PTLvVAOgGuwLKN5SZVV2r9dlADWOwDNColaJndtiknj7vojNYlIZa0KzCdvfZjHxocIMtp/F7G3WqQfz2gKAQd2T+ee/cMIApCTaVNuKo3SMvgvMfHVsVkrAVgNGxwrU9ykS30uCaGqC1kgdOnQI7du3D/mETz31FF544QWsXLkSsbGx+Pvf/47vv/8et9xyC7p27RrycQmiJRKpB0skNCzMUwloGJ/C9EgTB6dxryBXffCQaLNg4YQBKk8hsS1e9GNKsFm8WuZlKCUxMUxxCdmdWiHrlWiz8DUpVgVq53BfdgVa1u45ihqHi59Xqj+vW24wzUxNjENqog2zctMRH6vWYDk9MncfZyTHW5E/ug/3pEq0WTB7bD/8NC8Xs8f2gzXG7B2QadhdXu3lAM9gnw3z0crNTFHZH2i/C4WbS7G19BQKxmX47J7Tfj+NvleB+j6RtopojQQdSAFATU0NPv74Y7zyyitYuHCh6scfBw4cQG5uLgDFf6qmpgaSJGH69On4xz/+EcpyCKLFEOiDKdD9xdemLtmuKxoO13qZQzULWLQaHOYVxMpaNQ4XsgvWYGVxg8+TuJ7czBQuks4f3UdlfikmlWQoQZEEZYhwaqINCfWBEwCYJAkOl1vxn5KBeKtZ0RD5ETIZhS12pxtV9bYIiTYL4iwmr7JZWVUtyqrseGTZLjhcbq+Mklj+k9Bw3fHWGLg8MqrsThSs3I2h89Zz3Re7b2zUTKLNoroPuZkpXLjulhu8ngAlkNkxexQ6XhgHGQ0BqzgmRrz3Rt87f99P8XsVyj8C9ATuBNHSCdr+YPv27bjhhhtw7tw51NTUIDk5GSdOnECbNm3QsWNHv/YHF198MT755BP0798fmZmZePjhhzFhwgR8/fXXuP7663Xn+LVkSCNFiBgN4w1Un8JE24k2C3bMHqU6ZrADh4Nd7+QRPb3sDphgmYnDF284oCvQBsADoZM1dboiZUB5cPvySAIaBOV6TuWBwvRcNQ4XzyBdl96JDwlmWDTmmNrfGb5E5Zn111xZU6err7KYJMSYJSHbpdYZaW0mWOCVaLMgf3QflWaqXXwsdpZVI67+epjoXmtZAEDXuiKY7yfbVms3Ech3mTRVREsgYvYH06dPx9ixY3Hq1CnYbDZs3rwZpaWlyMnJwfz58/3uP2zYMKxduxYAcPPNN2PatGm4//77MWHCBFx77bXBLocgWhRGw3hF8bVRxsnXsGJ/A4dDyR5osxlsdps4L00c4cKuJUYoUdksJl7mkgGUlFXzDEfh5lI8umwXH0I8e7nydzGI0loMAEoApS0DAsYZJr3trDFmVNmd8NT/OzI5PhaDuifzuXRKpszsFTS5NL+zTJnYqahld3l1/XXpi9SdHhlWwQFdO/SX3fcquxOzl+/CsN4deOA2f/U+lFXZUVRSjrIqO0rKqrnTOftsWCZQm106U9twTHY+f99PEdG+QlxDINlVmqVHtCaCzkglJibim2++QZ8+fZCYmIivv/4affv2xTfffINJkybh+++/97l/ZWUlamtrkZKSAo/Hg2effRZfffUVLrnkEjzyyCNISkryuX9LgzJSRDDo/Us9UCNEXwaZoWQAAslO5L34JUrKqpGZmoAVD1yFws2lKtNMZiDJYI7iAFTdfQyzpJTqlCyRCZd0bKvrMG6zmFHrdPOSGwuifP3PjHX1saxNjFmqF6ZLsMaY+HpY5syfs7lJAi5K8N8NKFovsN/FjkDRHZ119olZRfa5VgvlRtHAVM+4U3RO18tAaW0kAv1e6H0HAnXCJ4iWRqDP74Bn7TEsFgu3QujYsSMOHz6Mvn37IiEhAT///LPf/ZOTG4ZumkwmzJw5M9glEESrRW8WnjZ40hu9IWaMEm0WnhVg2+od158XUE5aEiqq7VwsrjfH72RNHf+TWRmIiIGSnqeUiOKDJJbOJOwur1a9z95h2R3m6ZSSGIfKGqdPawKXW+n6Y/YITrfMdUnifnEWc0DjYS6Ma8jUGZUj2TX/dKKGz+0Tg5vFGw6oslmSBMhyQ1aR3XO9gIqJ/dlnovXd0gbSVXYnHxotztvT6qd8IWa12PEDmQFJEK2ZoDNSo0aNwt13343bb78d999/P0pKSjB16lS89dZbOHXqFL755huvfU6fPh3w8Vtb1oYyUkQk0ctWsQezvyyDNuPk73ctLBsFqOfe+RpfwubgadEzuWQjV8SgRpvh0hKIVxPTOSXavIcPmyWgbZz3bDwtNosJLo8Ml1vG2CxFH1awYjecHpmvwWKS0PHCOFWgyjyzxHsqvq4+hxmzcvvqZha1OjhRq6btwtMGYFrTVJbVCiSTFKp/GRl2Ei2RiGmknnrqKVx00UUAgLlz5yIpKQmTJ0/G8ePHDbvuEhMTkZSU5POHbUMQROCIWhOmZ8kf3cev/kSvm0tvJEiizeKl2WGIAc7G/cf5/nPGZ6hm5jGU0llDEJWZ2uAbp/fPuWG9O6gyUgqSSgslWhRI8PaW0hvlwnY6U9sQRNksJq4zc7iMAzWGNcYMp1spxxWVlGPLoUqeSWOX4vTIKs3Q4g0HuGdWZY2Dj9SZODgNBeMydDv/tHojdo+1zQSsrLeiuNzrs2KZygSbhX++zIqBfU6RtiQg2wOiNRN0RioUPv/884C3HT58eARXEn0oI0WESiT/FR+oZsrXdmJGSuwiZGufv3ofHC4P1zJpM1KsDb6opBz9UtSaJDFbJDqN+xJ1A+ADgNnYFPaaNgumBC1K7sgaY+YjaER9l4gEpeTHjiN279ksJtQ6PYaZMFbeY5+neA1MtyWKwdn5Euq78nx99uyY7eJj+f3T6/rz9T3S65w02jbUbjvKSBEtkYhppEKhtQVHBBEN9PQo4UKrfwLUouGN+48DULJCAHSzW0xcLj6ExRITC6z0tFjzV+/jLuWdE2xcgA4oQYpYcuuXkoCVxeWIqxefnymv9iqDAUrwoVc2rHW6YbOY4XJ7ePDDyoNaGwkRpeRlRllVLfrXi+TZ+Bqxe8/u9PgMplYUl2NQ92T+Gc4t2qPat6zKjvmr93EROOCtcdKiF5SxWXzM48mXAFz7mWjtD4y+c3pau0AgHRXRmolKIEUQRPCE+tDSQ9vRx8wzRRsBFriJXWhbS0/pZh7EgEl8n818W1lczrMwjy3fBY8MPFYvRJ84OA1zi/bA7vToekFpfZtYpsXu9GB3fRClp5USgxixE47ZAfi7P8zNnB2n2u7kZb6TNXUY1rsDv2ZRPA5IPGBhf2q9tFhgsnjDAb5uJculXIfDpZTxgg2gEoVynQj7LCuq7SrhuvZ97evMK4yVc7VroYCIILwJydmcIIjIImYUmOdSYxC9iFhwpn0ATx7Rk3d1SdDv5mJ+VCuLG/yjRI8qie0vNZyXxRMeGZhbtBdD5633KRgX0QZV/VISYJaA69I740kDLRYAjOl/EVISbcjLSuFeR0bkvfglHlm2i7uZM1gAxnRin+w8ArcMrN1TwbsVj512oKzKjk92HUFZlZ0HnrPz+nFXcpOkZACzC9agsqZhSHuCzYJZuek8KBRHvxj5fonlv9REm2pEjxgcid5ieoGWkY8Tc69n3xOCIPwTFY1US+fQoUO49957cfToUZjNZmzevBnx8fEB7UsaKSIUWImFZUhYCSpUrcnUJdt5eWxWbrqhK7lY1tPLjrB12Swm1Lk86JwQh7KqWqB+jdWaYETMDAFQdbQ5PbJutx4jNTEO5VW1fF/R/JF1molu4ax85/LIkOqPa7OYsHfOGFzy149VHXXK9r47AI2QAMwZn6HrxSR+LmKHndgJyPRW1hgThvXu4JWVE68zGL1TuHRIwRyHtE9EayZiXXvnI3fffTeeeOIJ7NmzB59//jmsVmtTL4lo5bCMQZxm+G2o3U9bS09BhjI8V8+VnB2Xlfqq7E5eCizcXIq+j36CbjOLcOx0LRLrMykHns5FRXWt6jz9hU48QMkoJdgsyMtSXNf718+QYxqjixJseHJ8hpcr+ZPjMwBIkAHezVZWZUe7+FjYLCZU2Z1ebuF2pxvO+qCNBWd2pweFm0v5IGMxZmPmm3qw4b/a18ySYnTJMjeMzNQEL4d6Vipkeq5Em4UHcrX18/xWaoIoc332qsbhgs1i8uqY9OU0PnFwGi/NsY7AUAhkADHLmDFndb3vY6QGchNEcyOgjFQgw4gZU6dO9buNy+XChg0bcODAAdx+++1o27YtysvLceGFF+KCCy4I+FzRYPfu3Zg2bRo+/fTTkPanjBTRGIyE2oB/QbKv4wANOqd+KQ1u49pZbnoZE9F3aMuhSlWmS5ulEbdnmSQxa8WczrWZLOYhtbu8WmXSqZh2QiU2N0tAbIxxdonZIujNyDOanceyS0zLZdPJ5HVOUDJmMWYJ8bExGNa7Axd2s8BU69HEPgemoWKBFdNaiftqs5GBwLJg7BpER/pwOo9r5+z5msVH8/SIlkqgz++AAqnu3burfj9+/DjOnTuHxMREAEBVVVXAQ4tLS0tx/fXX4/Dhw3A4HNi/fz969OiBadOmweFw4JVXXgng8hrYuHEjnnvuOWzduhVHjhzBhx9+iPHjx6u2WbRoEZ577jlUVFQgKysLL774IgYNGhTQ8ZctW4Y33ngDbrcbZWVluOmmm/DXv/414PVRIEWEm0AeYqEcT28UjNYoktkGsO61OePVfkZa13JmKgl4u3gD4LMBgyFTGN/CAhwW0AVyKEv9aBg2b4+RmmhDu/hY7C6v5sGlaFrJgpnuM4t0zyMGPmyYsJFrvPY+mSXgwNO5ABqCXla21LvPRugF2tqh1uEIbAIp6VHZj2jphLW0d+jQIf4zd+5cZGdnY+/evaisrERlZSX27t2Lyy67DHPmzPF7rGnTpuHyyy/nQ48Zv/nNb7Bu3bpAlqOipqYGWVlZWLRoke777777LmbMmIHZs2dj27ZtyMrKwujRo3Hs2DG+TXZ2NjIyMrx+ysvL4XK58MUXX+Dll1/G119/jbVr1/Khy3o4HA6cPn1a9UMQjUUsk2iHxfor8wU69FgcVMsyI/1SGkp1qYk27J0zBtYY5X8bMpT5beKx80f3UZXErDEmbDlUidnLdyEnLYnbKQBK4CEeP1BO1tRxUXydy4OJg9N46VLEZjHBYvYu3sWYFO+m/NF9eNnQZjFh08xrcLjyHNyyYjYqBjrVdiemLtnuZZEAKIFZos2COMFQk5XHthyqRM+HizC3aI/qs2KmqZmpCdwnS7vvrNy+MEvKfQ6klMsCl/zRfbBj9igevOSkJcEsKfc6mEHBvr43gZT/AtmGIFoDQYvNe/bsiaVLl2LAAPUYgq1bt+Kmm27CoUOHfO7frl07fPXVV+jTpw/atm2L4uJi9OjRAz/99BPS09Nx7tw5n/v7QpIkr4zUFVdcgYEDB+Kll14CAHg8HnTp0gUPPPBAQHP+vv76azz++ONYvXo1AOC5554DAPz5z3/W3f7xxx9HQUGB1+uUkTp/Cce/zPXKJIEaLQYyMkbrByVmojJTE3Cypo6fRxSui1kdvVl64oBdbVkuLysFa/cc5TqnvKwUrttivkwxJgkxZhOsMSZ0TW6DnWXViLOYkRxvQVlVrWpYsrhmsZyopaGcphiCsmu5Lr2zz6yWUfbM11BnbfbKYpIwpv9FAZfYAvGDYhkoALwkK2YqQy2xUWmOON+JmNj8yJEjcLlcXq+73W4cPXrU7/4ejwdut7enyy+//IK2bdsGuxyf1NXVYevWrRg5ciR/zWQyYeTIkfj6668DOsbAgQNx7NgxnDp1Ch6PBxs3bkTfvn0Nt3/44YdRXV3NfwIZ5Ey0bsIxHkOvXd3fv/i1rfJGVgbsYc3WyEaZMHaXV6vOs3H/8XrBtEeVYVpRXI6+j36Crslt+GvDenfgWScZ6kCkqKRcJRbfWnqKt+tbY8zKYGGPzDNgO8uquSUB6xTce+Q0us8sQsGK3YiNMcNmMfHSmmg2ypCgiMWZpQG7FuZpZVSyS020oW2cIi63WUwwS0qAyYIxlqnSfh5xmrEvTo+MFcXl3IRTm/URfxeNSzfuP873EbdnmjQWuOplKo2sDvwR6n4Ecb4RdCB17bXX4ve//z22bdvGX9u6dSsmT56sCliMGDVqFBYsWMB/lyQJZ8+exezZs3HDDTcEuxyfnDhxAm63G506dVK93qlTJ1RUVAR0jJiYGDz11FMYNmwYMjMzcckll+DXv/614fZWqxUXXnih6oc4vwnHA8lf0KRXhmHnzR/dh5fqRI8iseNKnKuXk5ZkWHYq3FyK6vqHtgwlqBJn2dmdHq8ZfNp5eWxrt9wwB89iklBWZceK4nKUV9nRNbkNnwXncLm9PJ4YrEvP6ZFhd7pR5/JwbZBoNspIsFmwcMIA7pUUCHEWE3LSkrjbut3pQecEG24Z2AWbZl7DhzVrA+XCzaWwxpjrTTPjdI+tDbK1Aa2/IIkhAdxTKpBZi0aI3yMqzRFEYAQdSL3++uvo3LkzLr/8clitVlitVgwaNAidOnXCP//5T7/7/+1vf8OmTZuQnp6O2tpa3H777ejWrRvKysrwzDPPhHQRkWbMmDHYuXMndu3aheeff76pl0O0MCL1QDLKKOmdV/uA1maqRCPGFcXlyElLwooHrkLBuAxsLT3F9UHzV+9T+TA5XB7drrdEmwU2iwnVdqdXOYz9apbALQRizCbV+yVl1cgf3af+fX2TAglKVogNJmZWAyxgZBYC4t7iyBsWZOqZeqYmxvH99BzYy6rseGTZLmQXrEFOWhISbRbVIGKgwQRVvAZxMPGw3h10B0Wz31lwyzJsm2Zeg2G9O3CLBKBBayWK0bXft2AyojRcmCCCJ+gRMR06dMDHH3+M/fv34/vvvwcAXHrppejdu3dA+1988cUoLi7GO++8g5KSEpw9exa/+93vcMcdd6jE5+Ggffv2MJvNXiXHo0ePonPnzmE9l5ZFixZh0aJFumVMgggHWidrvXEyosamxuFCZY0DgMQf6KLmZvKInnxob1GJMuKFnaO8yl7v6WTmWqHkeCtqHC7eWZaSqJhzWkwS71pjAVtmagJ+OHYGtU4P+guaqy2HKlFUUg6Hy/u/E1a2kurP66gfRsxIsFlwy8Au/FjsnrB7wXRhOWlJPBAqKlHPvVu84QC3LWDXCICXDv1RZXfyzJfd6YHd6eFjV7SfCdOrMZuGraWnsHDCAFWArR3Bog2+taN9AhnZol2HnqUG+z2cY4kI4nwhZEPObt26oU+fPrjhhhsCDqIYMTExmDhxIp599lm8/PLLuO+++8IeRAFAbGwscnJyVN2AHo8H69atw5AhQ8J+PpEpU6Zgz549+PbbbyN6HuL8RcxeaLvEpi7ZDqAh2Npaegrx1pj6h71SAmOmm2IphxlnsnJegzGo8r8Ka4wJBeMyeBlwWO8OPCNS41CCIadH5g9jltU5XHkOe+eMwZzxGSrhOgsM9NzNaxwu3rWWHB+Lg0/nIlMw/KyyO/HIsl26GRS27py0JBSVNGST3LIyNLjbzCK+LxvrMjYrBb6QAK6NYhk37RgdCeCaqS2HKvnr7PNhGTC98TuB4K9MrFfi9Zeh0s7do3IeQQRH0F17586dwwMPPIA333wTALgP1AMPPIDU1NSAOuF++OEHfPbZZzh27Bg8HrWJ3mOPPRbMcnD27Fn8+OOPAIABAwbg+eefx9VXX43k5GR07doV7777LiZNmoRXX30VgwYNwoIFC/Dee+/h+++/99JORQLykSKiSc+Hi+CWG3yJtN14rMOLZWH0Ovp8mXfmZiqdeXodXX0f/YRnW56sLzWxDj6bRbEcYEaU5voRLmyUi1FHHCu75Y/uAwA8Y6YlMzWBDzQW1yR6KPVLadhG5EmhLKb1d2KIY17YsGFrjJnrsfS651h3YDA+UI0lkE47XxkpCqAIooGwGnKKTJs2DZs2bcKCBQtw/fXXo6SkBD169MDy5cvx+OOPY/v27T73f+211zB58mS0b98enTt3hiQ1KBgkSVKJ2ANhw4YNuPrqq71enzRpEt544w0AwEsvvcQNObOzs7Fw4UJcccUVQZ0nVCiQIhpLMA8+bcDj6zjsNdHAEQAeXbaLl/GS42NVbttmCSgYlwEAXsaPLAhhgYO4DYCAxd3MbZz9yYIC0bXbCPHc2tmBDpdH1SXIyMvynjXInNYlKCVEdm+0BqXM/b2opJy7qzfMAXTwwJJl+YJ1Fjf6zPQ+/1Bd7wmC0CdigVRaWhreffddDB48WOUD9eOPP+Kyyy7za0CZlpaGP/zhD/jLX/4SzGlbLBRIEY1Fm2UI1FNK+5rRfixw0novsYwKCwKYxxPbTpvNMjqW6NfE/mfD/vmk/Z+PmPlhg5FZUCjqvdbuqTAcCZOXlcLPxY7BfKz0/mcnntPfcGgWrIgDiNl1KDoxG/d80gZljEB8mRrczR08OGPO6uLnKGqaWLAbjNcYQRDGRMxH6vjx4+jYsaPX6zU1NarskhGnTp3CzTffHOxpWxyLFi1Ceno6Bg4c2NRLIVo4vjq7GKLOxWigLHO4Fv2VFm84wB/y1XYn70CzWUyIq+94c8uKjUHbOAsvtbFgi2mlmMYqQeiAaxcfW/83GUUlao+mBJsFc8Zn1J+rwf+pYFwG70SzxpjhloGVxeXILlgDQPFpWjhhAJLjlcHhev/HEQM2u7MhiNIOVGaWBHru6kZaoYmD07jOiQVmcfW+UmOzUrBp5jXc82nj/uPIH90HCfXbAkrQxj63qUu2q/RsIuzzrK0PFh0uD9c+iZ8j+4znFu1FjcPlpb2iLjyCiDxBB1KXX345ioqK+O8sePrnP/8ZkID75ptvxpo1a4I9bYuDxOatk2hNtPfl56P3kBeDKyMjTibs3rj/uGrcjBgUbNx/nFsS2J0exFlMSE20wVEvTq+2O7nAnJW7mGgdaGjHzx/dh/tHlVXV8nKYxSSpZtFV2Z2wO92wOz04U+vk18fWzNbFhOV9H/1EFUz0r7c/EFE5idePiEmwWXCypk61XUW10pm3u7waXZPbwCw12CP4+pxZRordm1m56TjwdC7PmlULJUx2jQk2C1ITbSgYl8HLsyuKlQyfKIbXfp5js5hBqYkHRNrOPQCodbq51YLR94IgiMgQdGnvyy+/xJgxYzBx4kS88cYb+P3vf489e/bgq6++wueff46cnByvfRYuXMj/XlNTg+effx65ubno378/LBa1h8vUqVNDvJTmCZX2WhfRGpsRimhY+zorMYmDeE/W1PkUmGuHCtssJuydM0Ylwma6oWG9O/Dsj6gVajiPk5tYMpjGigUTWs2RtnzJMmDa4cIAVO9rtxHXX1sfEF6X3lnlB2WzmFHrdPPypa+ypQi7F2K5Tfu5sXLo2j1HUet0Y2yWWrMm3k82eNlX6U3bNKD9u9EImVCgciBBKERMIwUABw4cwLx581BcXIyzZ8/isssuw1/+8hf0799fd/vu3bsHdFxJknDw4MFgl9OsoUCqdRGth4woHGYddtpzig90luERt9ETZ7P5dnoPd3Ze7cw6phmav3qfSu8jdtqJXXN6iO+z4MfhcsPlllWGnmxen1Y0n/filygpq4bFJGF2Xj8AqNcQ1cHudCPRZlEFUhazBJdbRpzFxLVUEhq6BBkscNLqmbTz6rT3yOg7IL4nZga1QZcozJcRnG4q0t89mrFHEAoRDaSIwKFAihAJ5mEo2gkAxg9jrbBbm2VqFx/Lx7aIwY922C4LJpg5pjXGjK7JbVTZLLELrmtyG9U4mNR6Q06GxSTBI8sqsbg2GNPCOgW1GSHtw11PjM3Ww4Ysl1XZvQTm7Hdmx6A1y6yyO1VZs2A/MxFRfC9aIBRuLsXcoj2odXqQkhiHiupa3S5LLb4yYeGEMlIEoRAxsfnIkSPxxhtv+O3OM+KJJ57AuXPnvF632+144oknQjpmc4TE5uc3RhqbQMW/hZtLDbvSGKIeSU8Ls+VQJcqr7Pjh2Bk+N69fSgJsFjM3jhTXtKK4vF6z5EFyvBU7Zo/iWaSSsmqUVdlRVFKO/NF9sGP2KC/NUbnGDbzjhVZ0TrBhUPdkAOBjaHz9y00ZSKxkcWwWE8qr7Mh78UsvITVbszXGzO/B4Url/yuHK89h8oie3MyTieeZ4JzpmljWiAm2AXAdEwCv8TvagcHsczIaOjxxcBrmjM/g6xANMO1OD2QoOi2t3smfDq/a7oyoRo9MOQkiOIIOpPr164eHH34YnTt3xs0334zly5fD6QzMHwYACgoKcPbsWa/Xz507h4KCgmCX02whsfn5jVHAFKj4V9xPFGgHA9Mv2Z0eHhDtLq+GNcbEheVD563nwm1AyZyIAQvraDNLUM2yA5RATBR6awOksqpaPpOu76OfYOqS7ThS7dsHCmjQW7Fgo6Ssmpft5q/ep5pvBzR0wbFtHC4PJg5O4w7s7MrYsWocim5LK8pnQnPxPZaZUQT3bh5Q6W3HyqLi587WwSwgsgvWoLKmjncp5mam+OzAFMkf3ccrKCMIoukJqbTn8Xjw6aef4u2338aHH34Is9mMm266CXfccQeGDx/uc1+TyYSjR4+iQ4cOqtfXr1+PW2+9FcePHw92Oc0aKu2dnzS2PKIVjIslNa05pCi+Zg9l0esI8NYoiYJqUbCtNXLUiqJFXydWemQlPK0+ihlqBoroBA54B2YmQd8kXrMWNkfQV0Yv0WaBw+VGrdPDtWJG/kxa13OxtGZUPhVLgwxRsxZKE4G/9wiCCC9R00jV1tZi5cqVmDt3Lnbu3Gk4pDcpKQmSJPEFiZ5TbrcbZ8+exf/93/9h0aJFjVlOs4MCqdZNuAImo/3FLjAWqIgGkqLTOAu8mHGmlkxhWLDokG7UoVa4uVQ1ksVmaXDu3jF7FLrPLFLpf8RtWVbJyDgzMzUBKx64yusY2i4+o2CMHV/swmPdhIB3Bx/r3pP572bucq7VXRl9Fr5MT8WBx3lZKaqg18hFngIhgmjeRCWQqqiowDvvvIPCwkJs27YNgwYNwubNm3W3ffPNNyHLMu69914sWLAACQkNJnixsbHo1q1bxAcJNwUUSLVO/AUhgeJPQGzk5m3UVaadFWcTutYA9Vw57Tm0x/I1koWJu3eXVyM3UxmxwgTUMfXBj1bQPX/1PjhcHlhjTDyQYN14JgkwSw2jYVwemeubmDidZb5iY5QgKDXRplof6/hjYm670wOLWUKMSYI1xqyya7DVz8oDGhfUsHtks5hR53LzMTCBZJ4IgmjeBPr8jgnlwB988AHefvttbNiwAT169MAdd9yBd999Fz17Gus+Jk2aBECxQhg6dChiYoI+dYti0aJFWLRokWGGjmjZMB2LVlMENK7LS7vfxMFpPHvEjBvNkvfDXwzsGCxYuKRjW152WrzhALYcqlRZC7DjiLoeALxEqNdlV2V3Ir6mjg9GZpkkswTEmE1wepSyGdP6bJp5Deav3ldvvunG7OW7sOVQJTft9MiAp/7fdB5ZxpzxGTx70z81ATvLqhFjljArt8H6YPKInthyqJJnpZhgm90zBgt2Nu4/rnI8Z95NTNwdikeTXglQzDxptXD+vL+oZEcQLY+gM1I2mw1JSUm49dZbcccdd+Dyyy+P1NpaBZSRap2IwYM26xCMD4+e75A/o8y8rBQAipg8zmLGrNy+qsBO6/Ok1fyIQU/BuAxVsKS3ZjEwqKlzwVlfe8tMTVDZHzBYJkobgGizZWK5ElA0ULIML82SkWUDW1PX5DbYWVbN74U2oFHsHCRuvslgxxKzggC8LCXE+9jY7JLRd4O8mwii+RER+wNZlrFw4UL8+OOPeOGFFyiIIlosjR31InZjabMOwYzlEFvNJ4/oyVv+2fw1sbOMddZtLT3FZ9fZnW5VZ9nYrBQk2iy8I4wdb8uhSn6e3EwlEHPLimC9qj6IYnPgtPeGzZeLt8aoFOB6QRQA1Do9mDyiJxZOGMDPmffil6iyO2ExScirX6PJJEFCgzic6aSYnxK7ptzMhmsSM0VVdieq7E7sLq9W3QsGE9zbnR7Uudxci8U65vx9PuL5tZ9nqN8fvXmH4rn01hStsUQEQYRGUBkpj8eDuLg47N69G5dcckkk19VqoIxU86S5ZgB6PlzEs0WsbCaWsVhJDlBnpIzKQeLxCsZleGWlRJh+Su/esNe0BpdGaDvXus1smM/507xclf5KFJSL4nk9YbbYJceyUNeld/LqaBRdzyUoWS4xO2bkHM/29TdyJVRzzFC+d831u0oQrZ2IaKRMJhMuueQSnDx5kgIpokUjlroiSSCdWmKwlJuZogqWRL3P4g0HuHnjppnXGDphiwJ1kyTBLcvonBDHg6fFGw7w83ROaHDWZgEGM7/MSUvi2iGml6pxuHS76LQWCCzbxa6BlQEzUxNQuLkUlTUOAA3ddAy3DFX3H7tu8R6UVdlRUa10ySXHx6pc01kpTxTl6913ltECGu4nQyxDss8uXPqlUL530fquEgQRGkFrpFauXIlnn30WixcvRkZGRqTW1WqgjNT5TSDeQYFmHPwFZVo9ldYyQcxMGQUE4rDgM7VOr2wWuxZmNcCCFj07AqNr1t4TZtnQOUE9YoadZ2yW0hWo9dUSZwaKnXJG5xfn9w3qnux1L8WAlnX9Mb0XuyesUxIwDq582SSQmJwgWg4Rsz9ISkrCuXPn4HK5EBsbC5vNpnq/srLS5/41NTWYN28e1q1bh2PHjsHjUXvM0NBioiXiqxsrmIyUvwevr6BLDILirTEqk8hEWwyq7S7EWUy4Lr0zD0a05SvRjkA73BcAty8A1KJs8Vzq83mXHhV7gr2wO92wCaU5bXcgK/npGY6K3k2iaJ6ti5EnDGbWlk21iPdWNCvNH93HryDf6DhsrY21ySAIIvpELJB68803fb7PbA6MmDBhAj7//HPceeeduOiii1TGnAAwbdq0YJbTbBHtD/bv30+BVDMlHJkCow6+UB2qfXUEBnJMFiCJnX6+YNml/NF9vA0xzRI8HhmxMYoflZ55JeBdjhO1VKLHEsssGa2NZaCU4ckNnlMAVKNZ1F5ZDcGa6CEFGGek9MqiLMCrdbrRX2NeKnYQigaoWnNTbbaKZfGMfL/CCWW9CCK8RM3ZPFgSExNRVFSEoUOHRvO0TQZlpJo34RDyah+y7MFqFAz5Oq/Wk8lXGU6LtrQnjkHpb2BVIKJs71EFEuKx4q0xulksPeNOm8UMa4wJDpeHO4gD4CaaiQYO5NrX9QTvokknC9jYdtqsnK+gQht4iE7u2qyVdlvt5+fr84xWcEOidIIILxGxP2AcOHAAjzzyCCZMmIBjx44BAD755BPs3r3b775JSUlITk4O5bQEEVZEYXVjhLyTR/REos2CtnENM+uYMJxZCrDzsTZ2bbs7e2/+6n2qIAqAbut74eZSZBesQXbBGv6edghv/ug+2DtnDOaMz8DhynOq/Vke2KKxILA73UiwWXg2Jn90H36sTTOv4Vqk+av3qa6FHc9mMSE10YZZuX2RP7oP6lxqQ1p2v/NH98GO2aNUc/5sFpNqMLMEtaElu2f5o/vwUTBxFrPqPrLPgv3dV/CiHQ4sWifExphV91y0qWDHtllMKKuyo++jq5CTlqRrX6Ddr7ForRB8faf0ticIIvwEnZH6/PPPMWbMGAwdOhQbN27E3r170aNHD8ybNw/fffcdli5d6nP/wsJCLF++HG+++SbatGnTqMW3BCgjFRnC8S/9cPwLnq2jssahmkOnLbP5K/MYZVLE1wFvjRIjTxBkBzLqxWhwMctIiVkereUAoDb91Ct1GZ0X8C5/ajN3evfOX2lULNuxYM/X2vSOEezYH6a50l5TsATzXQ40E2a0PUEQgROx0t6QIUNw8803Y8aMGWjbti2Ki4vRo0cPbNmyBTfeeCN++eUXn/sPGDAABw4cgCzL6NatGywWi+r9bdu2BbOcZg8FUpGhMQ+IQB7Uwa6DlZi0vkKBCo+NNDbMO4pplBjaEpiegFq8zo37j/NtRV+lnLQkfLLrCHcrF7VNTKjd99FPdAcPM4w+A/GamDmmeO528bHYXV6Nfim+hykHUqYTg5q8rBQ+uFnsPtRzRffV/ejvezF1yfaAvLz8EaoTPqDvtRXKtRAE4U3EZu3t3LkTb7/9ttfrHTt2xIkTJ/zuP378+GBPSRBehOKtozdupbH/SmfrEIMyo3WKc/OYJ9PUJdt5QMPQlpzcMviAXbvTA4tJKaTlj+6DLYcqsbJYCbTEY2m74HbMHqWbtQHAgygAkOrHtACK4eeg7skqnydAHWxJACprHOj76CovYbjD5ebrZiTYLPzc7Py7y6tVQaCYuUu0WbiD+fzV+wyDgdzMFG69sHH/cVWZVVtiFT2k9I5pNHtQy8IJAwy9vIIhmO+y6Cs2dN56HpAbrVE7d5AgiPATdEbq4osvxnvvvYcrr7xSlZH68MMPkZ+fjwMHDvg/yHkEZaSaD8EIkbWE+1/22jlyRnPxAO8OMO3sN6MSGqAWrIuZj5y0JB54JNpiUGVXhh0zrRP7n4Lo88QyRyxQY2jn57WNs6hek6BomQAZLrfsZegpWhQA+vMHlXU2ZPv0MnjabkWje5mTloSVxeU8g5g/uo9hWbI5l8Qo20QQkSViGanbbrsNf/nLX/D+++9DkiR4PB5s2rQJ+fn5uOuuuwI+ztatW7F3714AQL9+/TBgQOP/ZUcQvtBmh4JBzBKFw2RRm8kS/9QLoiYOTsOWQ5WoqLarSmHsWHojXwC1YL1dfCwqqu38XIwquwupiYrDeeeEOJRX1cJilhAf29ClJ3YPskwI6/ITcctAtd0JW33gVOv08Dl4euNlLCYJRSVKQMeCKTEjlJOWhMoaB2qdHnRNbsOd1rVZOxZsaa0ZtBmcsio7ahyuejNRZe2s7Ch+tjlpSfxeBUJTBDWUbSKI5kHQGam6ujpMmTIFb7zxBtxuN2JiYuB2u3H77bfjjTfegNls9rn/sWPHcNttt2HDhg1ITEwEAFRVVeHqq6/GO++8gw4dOoR8Mc0Ryki1DvQelOHKWuhlYLQmlP6ExaIHUkpiw9iXhRMG6Ga/cjNTsHZPhZfuipUDmeZKb6acVmDPyExNwO7yalVmjQUpgNKVxzJSqYlxACSVqaZY3hOvld0HhlkC+qUo52LeVHOL9nCbB1FvJd4frQ8Vux82iwl1Lo/KXyrY7KWeFs6fuJ0giOZNxOwPYmNj8dprr+HgwYP46KOPUFhYiO+//x5vvfWW3yAKAB544AGcOXMGu3fvRmVlJSorK7Fr1y6cPn0aU6dODXY5zZZFixYhPT0dAwcObOqlEGFAr41dr92cIbad+2tBn796H7cUEI+pPb6v800cnIbk+FgwyXjBuAxs3H8cfR9dhcoaBywmSTUHb+P+40iOtyIzNYEfo8ruRJzFxAOtws2lPAgSM0/sXjD9kwRl4PGKB65CwbgMryCqwRIhHR0vjAMAVFTXoh1frxIYifdIex/Mgm+vWwZ2llXzuYMTB6ehzqVkvkrKqlWZKvEes2vJH90HiTYLYmNMSLRZYI0x82NpP1tACeJmL9/l00JAXK82W8Ywep0giJZNow053W43du7cibS0NCQl+U+DJyQk4NNPP/UKMLZs2YJRo0ahqqqqMctpdlBGqnURaFZBzOTEW2N8Zje0WR9/I2MA/W4tI22RiAQgRTMCBYDKRZwJ2MX/MbCZc5NH9MR73/6MkrJqnlVi3Xeic7kyr24vN+PMq3crr6lzqcTtDCYqN8ruMaG8SVLGxrAhySyLxN436gDU2lPoZZD0uji19gyBlId9jQuijBRBtBwilpF68MEH8a9//QuAEkQNHz4cl112Gbp06YINGzb43d/j8XhZHgCAxWLxmrtHEP6ItuFgKFmFnLQkmCXA4XLr7iuaXmrPIRp1sqzVo8t28U42diztQ5oZRgLMJFPJBPVPTcCmmdfwrEx1/XGS42OxY/YoTBychqKSci8tk8st8zUxh/SyqlrUOFwoqc8OrSgux+zlu3gGx+Vu+O95RXE5quxO3SCKYZRtA5RskVsG4q0xSE20Id4ao8oiDeqejLZxFhyuPKcKoth6rDFm1T0WM0gsw8a6CcXPZ+LgNFWWTe+z0X73jEw42efC9g0FMtgkiOZH0IHU0qVLkZWVBQBYuXIlDh48iO+//x7Tp0/HrFmz/O5/zTXXYNq0aSgvb5gSX1ZWhunTp+Paa68NdjnEeU60yyXsAZyTloSh89Zj6pLtXg+2ws2lcLg8kAAM692BBwHsYe6vzV2vTORwuWGWFGdwMRRpFx8LwPs+KKU+KwDU/6nUxnaXV2Pqku1YvOEAHC43P1ZljYNfQ25miteanB4ZZgle4mvtiBexfOjyNHhTiZgk5bW8rBTkZaXALCn3SS/4YIFDu/hYSFCCUea4nmiz4NjpWnSfWYS5RXu9gkvRXZ45s7Pjs2AHaHCONyqdioFRICU8XwSzj17QROVBgmh+BB1InThxAp07dwYAfPzxx7jlllvQu3dv3Hvvvdi5c6ff/V966SWcPn0a3bp1Q8+ePdGzZ090794dp0+fxosvvhj8FRDnNb50Q5FAm70oKin3erAt3nAA9np3cFYqEsesaIMFvSCIPeTZSBWm43FprANKyqqRXbAGOWlJSLRZUONwGeqMJIBnjsqq7CqhuN3p4ecf1D2Za5Is9X9hGqutpad48MP8rLRYTBJSE20Ym5WCRJsFCTaLSot1UYINh+blYuGEATzIFPVJevdmd3l1ffefR9Vd5/TIvCvQZjEj0WbhQW67+Fiu9zIqpYmZvkDGuRgFVYESzD56QVO0v+8EQfgn6ECqU6dO2LNnD9xuN1atWoXrrrsOAHDu3LmAxOZdunTBtm3bUFRUhAcffBAPPvggPv74Y2zbtg0XX3xx8FdAnNcEO8ssXKUR9kDLzUzxerApZTUzJCgZHH9r1Ga5mEB99nKlhBdvjeHlv7H1QYxIld2JraWnEG+N4RmZYPU4NotJZbnAMjnxsWqHlHbxsVg4YQAOPJ2L2Xn9+FoSbRZV5qmiWtFnsTWdrKnDk+MzVPdKb9ah9vMR7zMz6DQKIlh5kgW5rIPQKEgLFu3aQpmjF8w+ekFTuGf3EQTReIIWmz/++ONYsGABLrroIpw7dw779++H1WrF66+/jtdeew1ff/11pNbaIiGxefMg2DlqjUW0HBA9mHwFOHot/xIUN3AmKhfb+If17sCNMUV9lWg4CajHybDjsZJjoONqjGwK/G1bMC4joOsVy2z+bAS059aKxIMZAeQv4DSypmiuJp0EQYSPiM3aAxSd1M8//4ybb76ZZ5HefPNNJCYmYty4caGvuhVCgZQx0exiCtXV3NcaWVDDRqFoO+i0w3i16wDU3XKA8Yy9QL2ktCNwGNrr1s7hA4zntQFA3otfoqSsGpmpCVjxwFU+75nYQXe48pzhsfUCHgDcDyvO0nDtzE5B7177+5yC2UZLMIEdQRCti4h17QHATTfdhOnTp6tKcZMmTaIgigiKaApn/emUjPC1Rjazze70qETOgLrbSyzZsQ4+FuzYnW5U2Z2YvXwXgIbZf2zorlagbqSRETvUACVwsllMXDc0rHcH3W3FkuAjy3Zh6pLtuuXPkzV1qj/FY4nbFm4u5U7oJ2vqdLsL2fZ63XKKJ5SiL6sVgijtvRbNNf19TtptjDyh9K5br7uPgiiCIERCykitW7cOL7zwAh/x0rdvXzz44IMYOXJk2BfY0qGMlDEtwVcn1IyUiFHJjv2Hx/7OskYsyGJC6Y37j/NzdE1uwz2bFk4Y4OWTJAGYMz7DsIyWaLPgTK2Ta6DYCJlHlimBnFkCOifYeFmSDTjWZo305v+xMp6YwdH6XflySmf3WM8TClCbaor7+/ucxG30soR6nxOV7giCiFhp7+WXX8a0adNw0003YciQIQCAzZs3Y+nSpXjhhRcwZcqUxq28lbBo0SIsWrQIbrcb+/fvp0AqjDS3ACwYnQ2gBCF6JpaiSSYrwxkZazKtEnv4i8GYGGCIa5i/eh8fAQMoI11YoMJKiWw9LODQDkgGGgxEbRYzrDEmfkxxwLE4bkVEL5AyQhvYKGNwlFEwY7P0j+8Pf4Fxc/peEQTRtEQskLr44osxc+ZM/PGPf1S9vmjRIjz11FMoKyvTXUygtLZggzJS4ScSmYNQ3KhDFbAbuWXr6ZWmLtmOlcXliDFJiLfGoGtyG26ImZfVEIQZCa71ZgMyxNl7LDOl1WhpdU4A8OiyXZDRkEkTZ9WxMp0/8XogwQrLTGlnBgKAzWLG3jnXB/Q5BfI+QRCElogFUhdccAF27NiBXr16qV7/4YcfMGDAAJw9e9ZrH5PJBEnS95zR4na7g1lOs4cCqfATrodiIB1ZvoI2IwG7dn3a37UdfezcbEwKoAQne+eMUWVw8kf38dlBJ15TZU0d7E63VwlNKUUqAvdhvTtwLZZ2SDL7O1uL3emBWQLaxjWskY2IEQNJUZANIKhA0+g+sfubk5aEFcWKka8E4NA8/SHHeuegsh1BEMESMbF5Xl4ePvzwQ6/Xly9fjl//+te6+3z22WdYv3491q9fj9dffx0dO3bEQw89hA8//BAffvghHnroIXTq1Amvv/56sMshzkPCJfoVBcp6Im49nyMRto8o5NYeV+93JjhnRpENI2QaDDJrnd7jkthx2GBhcdAvE0rPLdpbb7ap/IOk2u5U+R7FW2P4exv3H+eDe5lpp2jgKa6FZa/EbsCK6lpsmnkNhvXuwF3Pxc+GrZfto3VFFxEF8Ow+aQcHMzNQQMmETV2y3euz0POj8vc5EgRBNIaAMlILFy7kfz99+jTmz5+PoUOHqjRSmzZtwp/+9Cc88sgjPo917bXX4r777sOECRNUr7/99tv4xz/+EdC8vpYEZaQiQziyUv6O4csyQS+bJZbIRJE1AN1Mi9bSINFmgcPlQa3TjbH1ZTtREyQOBNYKt9lgZAYrt7GRLRLAjyGKtgFv4TW7tnbxsdhZVo04iwnXpXfm2SDxHLNy070E5mJGionY2XmMLASMfLf0PqeeDxfxkqQ2I8e2F0unACgbRRBE0IS1tNe9e/eATipJEg4ePOhzmzZt2qC4uBiXXHKJ6vX9+/cjOzsb586dC+hcLQUKpCJDKKWaYIMvXxoorb+QthvMl/+Q1sNJ9JLSCy4AeHXQbdx/XNXBlj+6j0q7NDZL6fYTxeVagTpDFJ0D0A1CWAaM6bNEEbp4fdoSad9HP+GjaPKyjDVU2u4+X2i1U9pjOFxuVQcjELguiyAIghHo8zvG8B2BQ4cOhW1hXbp0wWuvvYZnn31W9fo///lPdOnSJWznIVo32sxHIIgltkCcxrccqkRFtR39UhIQLwQa2vOz/cT16AUX7LzsZ+i89TwYSo6P9To/sw+otit2BUzPxDRSjGq7E1sOVSKhXmOVYLPwQMtmUar3tU4PH0YsHlcGeHDESmos28MCNjajb3e5Ysi5u7xaZU3Arke8z+w+zMpN54EZE8OL72uzR4EEOgsnDPDq2GM+U0DDkOQEm0U1pJggCCIShGTICSjDi0+cOBH0fi+88AJefPFF9O/fH/fddx/uu+8+ZGZm4sUXX8QLL7wQ6nKI84xQdFJ6OihfRo4scNldXs0DgEDnrGkHD9ssJtVAYbYeNj9ONO0EGgK8Yb07IKF+GzbXL64+OJLQ0DlXVFLO5/GxciLqt7LGmBFjkrCyuBxTl2zHxMFp2DF7FOaMz+Cz8swSuDYq0WZB2zgL1u6pQJXdyTVZbhnYWVbN/8xJS1LdE737IhqT6plainP99ExGtffEaE6iON+wf2qCzn0gCIKIDEEFUlVVVZgyZQrat2+PTp06oVOnTmjfvj3++Mc/oqqqKqBj3HDDDdi/fz/Gjh2LyspKVFZWYuzYsdi/fz9uuOGGUK6BIAJi4uA0r4DIyCkcUEppEoDYGBPmr97n0znbKCBjmZI6l9r9fOqS7Zi9fBeG9e6gGrSrFagXlZTzwcULJwzAppnXYFZuOhJtFsRZTIgxS5DQIFwXy5yJNgusMSZU2Z1wemQecLGABAAPcpguiQU4zEUcUNzV2XYsiGPHCsSZ3lfQye6/Vheld0/F3/UGCCfHx0KG4r5ODuQEQUSLgO0PKisrMWTIEJSVleGOO+5A3759AQB79uzB22+/jS5duuCrr75CUpJxZ875CGmkgiNQHVOo2wWrrQp0Rp8/HyqtM7joJF4wLsNLnM5E5v1T1SU0PWNN0RpBq1PSlvESbTE4U+sydPcGGkwzLSYJLo+MuHpRud7QZH9DgX3dG3/4spHQs6vwZztBEAQRDGH3kXrwwQexbt06fPrpp+jUqZPqvYqKCowaNQrXXnttQOW5L774Aq+++ioOHjyI999/H6mpqXjrrbfQvXt3XHWV74GoLQ0KpIIj0EDH33ZGQvFgjTeNhM2BPqD1hNRaY0mWNWKDjLUCcTFboxWKA1B17dksZj7w97r0ztzgUzym9rhGAYg4/LgxHW+BfqbBGHcGEjSRdxRBEI0h7D5Sy5Ytw/z5872CKADo3Lkznn32WV1/KS0ffPABRo8eDZvNhm3btsHhcAAAqqur8dRTTwW6HKKV4qvUFsx24mgVcTux/CWWhoxKc1tLT3GhNCsnsTLf/NX7DDU74jrY4N65RXtUa7dZzLA73XC4PLxDrqo+4GH6J7cM1ZpEXVVeVgrXArFj2p0NA3+Z4FzUOWXW64eYTUN2wRo8smwXvx7xHuWP7sPPpfVnmrpku9e1G2mY2Jq1GjHtPuJn4Eu7Jq5R1Fpptw/0u0QQBNEYAs5IWa1WHDhwABdffLHu+7/88gt69eqF2tpan8cZMGAApk+fjrvuugtt27ZFcXExevToge3bt2PMmDGoqKgI/iqaMZSRii56pTR/g4QDzVSJDuTicGFf/khTl2xXuXHPGZ/Bt2N+Tqw0N7doD+xOD2wWM2blKqXzQG0B2DqPnamFs948ymKS4PQof2fnEI/BSniMYObfMfG53lxAPS8oPZ8oo1E52oyU+HdfA4mpjEcQRDgJe2kvNTUV7777rmHp7YsvvsCtt96K8vJy3fcZbdq0wZ49e9CtWzdVIHXw4EGkp6f7DcRaGhRIRZdQykiBPniD0ezolce0PkpswG/nhDiUVTV871nQI2qbAi11JtosOFOr2CWwjj6GuDatKadN0EFprxWAly6KBaqVNQ7u2TQ2K0U1ckZr8mnktaUXeOldWzRmKxIEQTDCXtobPXo0Zs2ahbq6Oq/3HA4HHn30UVx//fU6e6rp3LkzfvzxR6/Xv/zyS/To0SPQ5RCELkblHL0uL3+dXf72EX/XnpcFVtX1Gacnx2dg4YQBqu1Y2VAMohisJMhm6umVp8T1sTEzw3p34B12Y7NSvOwNxGOL1LnUI2nEUhkLuqrsTmwtPYVNM6/h18JG2chQRs60jbPojmLR2iCIn5WvIErcLpwlOn+lQ4IgiEAJOCP1yy+/4PLLL4fVasWUKVNw6aWXQpZl7N27Fy+//DIcDge+++47v6aaTz/9NAoLC/H666/juuuuw8cff4zS0lJMnz4djz76KB544IGwXFhzgTJS4SeUbEIoWY1QMyGFm0sxt2gvn2mnt78oQu+a3MbL5BLQL+uJpUujgcN64160423EDJNeFsmXU7hWzC1BMb802k7v/vhak95YnXBDGSmCIPwR9tIeoDic/+EPf8CaNWvAdpMkCddddx1eeukl9OrVy+8xZFnGU089haeffpqPg7FarcjPz8ecOXMCXUqzZ9GiRVi0aBHcbjf2799PgVQYCcd4mEDGkjR2pAxg3B2n177v77hi8MQ0SuJ8v1ADA6Pr9DdrUFvuq6yp48GjL72V3ucndiPqBYYU+BAEEW0iEkgxTp06hR9++AEA0KtXLyQnJwe0n9vtxqZNm5CZmYk2bdrgxx9/xNmzZ5Geno4LLrgg2GW0CCgjFX7C8VDVPrjDob0xGj7MbBO08/eMdEfa62KicKZ5kgDE1dsm6AWBgQru9fbxF2jq2UoA4NfNAkiLScIPT93A9/GXbfK3DVkZEAQRbSIaSDWGuLg47N27N+BByC0dCqSaJ8EOytXu6898UyyXsQyUNrDRdsCJg4DFYIEFUjaLGcnxsX67BbXH9ee1pWfiqRWGM/SyVEBD0CMOTj40L1e1DxB60EoZKYIgok3YxebhIiMjAwcPHoz2aYlWjq85bHqweXM7Zo8K+sGsFSqLI1c2zbyGi8gBoF18LN+eCbUBJbjISUtCaqINuZkpSLRZEBtj1hVqsxl6s3L7cn8nMYjSelox4XnnhDg+fFjvHonXIQq6fc2/Y55Q7O9srAwT3Y/NSqnPmJlUY3iMZgoGir/mgGA/f4IgiHAR9UDqySefRH5+Pj766CMcOXIEp0+fVv0QRChEswvLqEOPnVsMPtjAY73tWWA1qHsyztQ6YXe6EW+N8fKhmr18F3LSknx2CwLgARXLhlVU13IzUaN16g0T9tVNJ87im796H6Yu2Y6eDxdh6pLtKNxciq2lp5Bgs8Du9PDziEGrdqageJ3sOKFAXXgEQTQVUQ+kbrjhBhQXFyMvLw8XX3wxkpKSkJSUhMTERJrTR4SMrxb5cGcrtNkR7bknDk5DXr31gDhMmGmPahwuVeaJZYCAhuwRgwVFK4rLddcvupCzgIplk3IzU1TrYpkqdg4jl/dArCG06ysqKeeO7w6X2/Cz0N4r9tmsLG44TiiQizlBEE1F1DVSn3/+uc/3hw8fHqWVRAfSSEWfxg4qjiR6axHdz0WjztzMFABQvRdoh5+elkgrdg+lg1B7ji2HKvla2UiaQBzStWuyWUyoc3lUMw0JgiCakkCf3zFRXBOA1hcoEdHHn/BYLPOwUpXo0h3o8QPpegtWBJ2TloSKarsq88RKbyxbxAKnopJyFIzL4IOHG5tt0QuexN8DPT7TRbG/6w1zDmVNJCInCKIlEvWM1MaNG32+P2zYsCitJDpQRir86GV1tA9xo4dzIIFPoF1vRmsxwmi2nBiwicOW87IasjyA/ry8UNcTyH0IZP5gpIMf6tYjCKKpaLZdeyNGjPD6ufrqq/kPQTCMtE16ehgWgMxevgsADDU+gYiS2fG1GiO99ehpfrIL1iC7YI3Xuuev3sdn4IlBk9jNx/RTbKSMCBN4i2vQrilQrVAgOijxnorXYvR6JCAROUEQzZ2oB1KnTp1S/Rw7dgyrVq3CwIEDsWbNmmgvh4gywQi/jR6iYrlODCBYBimQIMlXcMSCjIUTBqiCDb31aAMSNseuyu7k69MeP8Fm4deQaLOgxuHimZcqu1PVuZc/ug8SbRbYLCZuOyCugQm85xbtRXbBGsxfvQ85aUn83OL5jf7u617p3dNA77VIqIL/UEXkZIdAEES0iHppz4jPP/8cM2bMwNatW5t6KWGFSntqgi2FBSKc1ivvhTqDz1eJMBDtlCgcz8tK4e3+/swzWZAENBiEGs2kE1/Tup4DamNPALxM2TbO4uVG7utz8GVaGuy9jrbgvzk1GBAE0TJptqU9Izp16oR9+/Y19TKICBNMhsFX+UnvOMG07RsdR8w6aTNQ7PgsONKW2YAG4Tj7u5FXk/b8ALyyUXolNO0xmO1B/9QESABsFhM3+KxxuLjlAbNXYGvx9zkwPZd2Tey9YAPWQD73cGaRyA6BIIhoEfWMVElJiep3WZZx5MgRzJs3Dy6XC19++WU0lxNxKCPVsghEtK43b07MiunNjGNZLDGbJR5f71xacbqvzIp2dAtbG/OTYp1/gWaWRMG91phTfC83MyXgeX7+oCwSQRDNiWY7a89kMkGSJGhPO3jwYLz++uu49NJLo7mciEOBVPMh3B1g/o4nBkJ68/QA/fLa1CXbuTfToO7JuuVFo+CussYBu9PDfZmMzqXdXvR+YsGgw+WGNcasG3yx62KEI/ihDj2CIJoTzTaQKi1Vp+1NJhM6dOiAuLi4aC4jalAgFX38ZVkaMziXZZuG9e7gNxMj6pfG1uul2sXHYnd5NTfb1AuYxODrwNO5qmMaXUNDYFQHu9PNrRLEjJcYHAFQaavY9vNX70O13QkZ3kOUtdk6cZ1642QCuZ8UOBEE0VxpthqptLQ01U+XLl1QW1sb7WUQrRijbr/G6mbEjryikvKA2/LjLCYedJ2sqePz79hw462lp1Rrzs1sGC+jxega2P7WGBNSE208i8T0VBMHpyHeGgO704Mqu5OPcRmbpVg8DOvdgWuiWBAl2j+wLJRodFowLsNwJl+g95OsDQiCaOlEPSP1zDPPoFu3brj11lsBALfccguWLl2Kiy66CB9//DGysrKiuZyIQxmp6BNopiOY7eav3ocahwtOjwybxYTr0jsb6o60xxe1VOL4FzELBRibiIbrmgs3l+LRZbt4Bkoc48KyZwB4Bk10LG9s9inUNRMEQTQVzba01717d/z3v//FlVdeibVr1+KWW27Bu+++i/feew+HDx9udV5SFEiFn2AfwI0t9bHtGGx7f/uLdgks6ALgJVCPJNprN7oXWhsFMWDyJTwnCIJorTTbWXsVFRXo0qULAOCjjz7CLbfcglGjRqFbt2644ooror0cogWidTFnrwU6e4+hnTGnF/jkj+6DySN68kwOcyUv3FzKXci1ZTZtJgoA4q0xvKsuHG35oiDd15Bf7bWLc/LEtTLNF8uYMbNN7axCCqIIgiDURF0jlZSUhJ9//hkAsGrVKowcORKAYoPgdrujvRy/7Nu3D9nZ2fzHZrNh2bJlTb2s85rJI3pCgiKEnr96n1+tjZGuSM+VvKzKjhXF5VwLxYK1OeMVPdCc8UpGRs+FnPkgMbdxALycV+NwwWYx8fU0NiBhwU5RSbnq3FoPJuYjJQ5JFtGOqVk4YQDXPrH7FYo/VyCQ+zhBEK2BqAdSN954I26//XZcd911OHnyJMaMGQMA2L59O3r16hXt5filT58+2LFjB3bs2IEvv/wS8fHxuO6665p6WecV2gfuxMFpSBCcwI0CJbYfYDx7T4SNPgGUzBML1lhmRjyG3qgZJsZ2uNwwS0pnHzPwrLI7Uefy8NExjUUrSDcKJkVBu9E1h8PYNBRIbE4QRGsg6qW9F154Ad26dcPPP/+MZ599FhdccAEA4MiRI/jDH/4Q7eUExYoVK3DttdciPj6+qZdyXqFXmhNb+7XlKqP9/JltipkpPcNMEe05xYHE1hgz7E4PD15YaYyVDCtrHOj76CdA/bZGYnVfLJwwQFXS05Yp/b0uXge7TvF3IHwjYoy29bc2giCIlkCzmbUXKhs3bsRzzz2HrVu34siRI/jwww8xfvx41TaLFi3Cc889h4qKCmRlZeHFF1/EoEGDgj7X+PHjcdddd+HGG28MeB8SmzeeULu7tPuJ4nDA/6y5QI7PvJnsTg8AePk3adcrdscx9NYQyFy/cGEkmhdF9lr39kAd130dnyAIojnTbMXmjD179uDw4cOoq6tTvZ6XlxfUcWpqapCVlYV7771XN8B59913MWPGDLzyyiu44oorsGDBAowePRr79u1Dx44dAQDZ2dlwuVxe+65ZswYpKUrp5PTp0/jqq6/wzjvvBLU+wptgAyOjjFMw++mJw8VsSKDibTFLA8ArKBrWu0NQ62XidS0sm8YCGa1QPhSMOviYfkovm8WuNSctCUPnredZJGaFEEg2iTJPBEG0ZqKekTp48CB+85vfYOfOnapRMZKkiFMaIziXJMkrI3XFFVdg4MCBeOmllwAAHo8HXbp0wQMPPICZM2cGfOy33noLq1evRmFhoc/tHA4HHA4H//306dPo0qULZaQEopGh8JWN0sv+PLJMEZXruYnrrR1Qsk8A4HC5Uev0QIb/DI0202SUcYqEd5P2HgRjayDuS118BEGcDzRbZ/Np06ahe/fuOHbsGNq0aYPdu3dj48aNuPzyy7Fhw4awnquurg5bt27lnYGAMpJm5MiR+Prrr4M61nvvvcdNRH3x9NNPIyEhgf8wqweigcY6jAeCVsg8eURPJNosqHG4vLrERLEzE28bdZSx47AS3o7Zo7B3zhje1efvmpiQe+GEAVyIrie4DodzuBbtfWfieiaoD3TfaInRCYIgWgJRz0i1b98e69evR2ZmJhISErBlyxb06dMH69evx5/+9Cds37495GNrM1Ll5eVITU3FV199hSFDhvDtHnroIXz++ef45ptvAjpudXU1evfujZ9//hmxsbE+t6WMVPNAr3zoa06dVlSt3TZSLtxN7e7d1OcnCIJorjTbjJTb7Ubbtm0BKEFVebnig5OWloZ9+/b52rXJSEhIwNGjR/0GUQBgtVpx4YUXqn6I8BKI/5Be1sSXn1S8NUZlTcC2Zdog5g0VbKu+v7VGMrsT6n0KdF+CIAiiCQKpjIwMFBcXA1D0S88++yw2bdqEJ554Aj169Ajrudq3bw+z2YyjR4+qXj969Cg6d+4c1nMR0SNU/yFfQYNWiM623bj/OMqq7KiyO3VdzINZq6/gRHwvXEGMv/vk6zzk8UQQBBEYUQ+kHnnkEXg8Sqv4E088gUOHDuFXv/oVPv74YyxcuDCs54qNjUVOTg7WrVvHX/N4PFi3bp2q1BcJFi1ahPT0dAwcODCi52mt+HrIh1tjpedSroe/9/XWLK6VBSfzV+/z2k4MXMIVxPi7T77OEw0dG0EQRGsg6vYHo0eP5n/v1asXvv/+e1RWViIpKYl37gXD2bNn8eOPP/LfDx06hB07diA5ORldu3bFjBkzMGnSJFx++eUYNGgQFixYgJqaGtxzzz1huR4jpkyZgilTpvAaKxEcRvPxgNDtEIzISUtCRbWd2wBobQFsFhOsMWbdoELUGPlas3geh8vNy4iiU/r81ftQ43BhWO8O/LXG4O8++bIlCPc9JgiCaK00mY/Ujz/+iAMHDmDYsGFITk5GqJr37777DldffTX/fcaMGQCASZMm4Y033sCtt96K48eP47HHHkNFRQWys7OxatUqdOrUKSzXQYQHreA7mt5D2jEqLCCqqLZz+4FZuekAwL2UtPP5xGBKXLP4fo3DBXf915xle8RAjA02ZnPv9O4NGy6s9YIKRSxOwRJBEETjiXrX3smTJ3HLLbfgs88+gyRJ+OGHH9CjRw/ce++9SEpKwt/+9rdoLifikLN5YBi5aDN8BQyN7TzTjo5hQUvX5DYoKavmawK83dB9jVHRHnv+6n1ca7Vj9ijVdScKswO1xxHvDbMr0HpBJdosiLfGUPcdQRBEmGi2XXvTp0+HxWLB4cOH0aZNG/76rbfeilWrVkV7ORGDNFLBIfoz+XL6nr18l64PlFbrE4xgWxShi3qpkzWK6z5z8BZ1Q+JAZNbxp7c28dj5o/sgNdGG/NF9VNfNgjR2XgCqtU8e0RM2iwkSgH4pCV5eUGKQp6d3og48giCIyBH1jFTnzp2xevVqZGVloW3btiguLkaPHj1w8OBBZGZm4uzZs9FcTsShjJQ+wWaRfM13C8YzKph1Ad6DjRlap29xbeJolUAHEutprcS1+7seX/eTZt0RBEEET7OdtVdTU6PKRDEqKythtVqjvRyiifAnzNYiapL0fKC041W0dgaBoj2W0dr0xqSIgRCbwWd0fdrAR3te8ToDuR5feieadUcQBBE5op6RuuGGG5CTk4M5c+agbdu2KCkpQVpaGm677TZ4PB4sXbo0msuJOJSR0ieSjtqhZGDCuZ68F79ESVk1LCYJs/P66R4vmDU2l4xSOLVopOMiCKK502w1Us8++yz+8Y9/YMyYMairq8NDDz2EjIwMbNy4Ec8880y0l0M0EcE6egej8wnFAykY7ya2lqlLtuuuaXe5IlD3yLJhNiqYjFlz8XRqrL8VmXwSBNEaaRJn8/379+Oqq67CuHHjUFNTgxtvvBHbt2///+3de1BU9/k/8PeywgqsiIpyiVymRimoiNEFTWKABkX7izFmTDpJjWBbOypeEgajpq1KU+O3aqqtMmaa6ZC0yXSsY4wzdaZaiYTUK8Ug2goEi4QYhBAQARVkeX5/OGxcWGD3sGdvvF8zzGTP9Tn7BHnmczuYMMFzuh442Ny+1P4jPCNyFDQAGtvaByzWumM5Vvq1xVXL/19cGLSa716AbOl8axYABVyrFWewBZ2rFIRERPbk8K69ocbTu/Ys/aG3dsD2YO/TFyVdYT2XGMhZNKXP+zy8YGf3mk7dSxtoALz5XN/nOuJZiIho8Kz9++2UQurevXsoLS1FfX296XUx3Z599llHh6MqTy+kLP2hf3gb0HvtpYepsT6UkvM+OFeN7ceu4u59IwDLa1n1d6/Gtnbcvd9l07nWxuUqLVJEREOJy87a+8c//oFly5ahoaGh1z6NRgOj0ejokGgQLM0I67mtvxlj/c3es3VmXzelK3Z3dD74f6973aiH9Sxouj+3tXeaFtnUDdMCGPyrXR7G1ceJiFybw1ukJk6ciHnz5mHLli1D4jUtnt4iNVhqrlhui+5WtL669Xru7y7y+luR3JUN1CXrLs9BRKQWl521V1dXh6ysrCFRRNHA+pu9Z+vMvsHoHmzuM8zyr8Sq5Amm17N0Fxvdq5R3r2zujNloSlcttzR4n7PqiIhs5/BCasmSJSgoKHD0bR3OWbP2PPl1IP0922Cfu7i6CQLg7v0u7D5e3utaS2dFImfRFNOss4eLPGfORlNa/FiKmbPqiIhs5/CuvTt37uCFF17A2LFjMXXqVHh7e5vtX7dunSPDUZ2ju/Y8eZZXf8822Od++OXDwIP33tnjO1S7u6yvsVvsniMiGhyXnbX3pz/9CStXrsTw4cMxZswYaDSa74LRaPC///3PkeGoztGFlLP+kDrivo4aT2XPazlqlfWeg989sZAmInIkly2kQkJCsG7dOmzatAleXg7vWXS4oTLY3JNbwgZDSVHU/V0G+nrDXzfMpvWmbDmHiIj65rKDzTs6OvCjH/1oSBRRQ8lQGF+jZByWkgHz3d8lAIsrp/d3TnZatMMG6BMRkRMKqfT0dBw8eNDRtyWV2VIwOGNAvD3u6ehZbU9NGmsqTge6tyNnOBIR0XccviCn0WjEzp07cfz4ccTFxfUabP673/3O0SGRgyldaLMnW7rNrL1nf9e0tPioGrpjBWDWTeqIexMRkW0cXkhdvnwZ06dPBwBcuXLFbN/DA8/dXW5uLnJzc7lSuwX2Kkh6ttL0V1TNiByFm813MSNylNXX7HkdS6uMqzHI3tL3wxXOiYhcE19arLKhMtjcGR4uYroLoIcHuw+0f6BrDvTSYluuS0RE7sVl37VHZC89W2l6tuI83LpkbSuYNS0/Sq5LRESeiS1SKmOLVN8cvVilvY5RK24upklE5DpcdvkDci5XeoWM2rPgrJnJZk0MPY9RMkPOmu+d77ojInI/LKSGGFf6Y+0Ka09ZE4O1cfZXLHV/75be42frfYiIyHWwa09ljuzas1dXliPicEZcautvdXe+woWIyL2wa28Isqa1yRELNypp9ervHFfqjrSkO74ZkaP6bFHq/t6z06LZ6kRE5EFYSKkkNzcXsbGxMBgMDrunq3QNKYmjv3NcqTvSku74iqubBixSl86KNM30s6YwdPUikohoqGPXnso4a2/wnNHtZ8s9bY3Plhc882XQRETOwa498hj27I60toXHllYwW+OzpcXOVVoZiYjIMhZSNKRYWyCpWcBYW3h5wgB8IiJPx0KKhpS+CqSeLVWOGJQ/EFcfG0ZERCykaIjpq0ByxaKF3XpERK6P79ojAlzynXnWvPePiIiciy1SNGT0N9B8MF15XKKAiGjoYiFFQ4Za3Xeu2C1IRESOwUKKhozBjjnqq+WJY5mIiIYuLsipMi7I6Tm4OCYR0dDBBTmdzBmviBmKPjhXjficE4jPOaH6GCW2PBERUU9skVIZW6Qss9dik92tRADYUkRERHbDFilyafYaoL0qeQICfb0R6OvNliIiInI4riNFTmGvdZu41hIRETkTu/ZUxq49IiIi98OuPXIKLk5JRERDCQspsisuTmkdFpxERJ6BhRTZlTsvEdBfcWPvwocFJxGRZ2AhRXY1mHfWAc5tqemvuLF34ePOBScREX2HhRS5FGe21PRX3Ni78BlswUlERK6Bs/ZUxll7trHXQp1ERESDYe3fbxZSKmMhRURE5H64/AERERGRylhIERERESnEQsqNcS0iIiIi52IhpZLc3FzExsbCYDCodg+uRURERORcLKRUkpmZif/+978oKipS7R5ci4iIiMi5OGtPZZy1R0RE5H44a4+IiIhIZSykiIiIiBRiIUVERESkEAspIiIiIoVYSBEREREpxEKKiIiISCEWUkREREQKsZAiIiIiUoiFFBEREZFCLKSIiIiIFGIhRURERKQQCynyaB+cq8YT//cJPjhX7exQiIjIA7GQIo92oOAabty6iwMF15wdChEReSAWUuTRViVPwCOBvliVPMHZoRARkQfSiIg4OwhPdvv2bYwcORLNzc0ICAhwdjhERERkBWv/frNFioiIiEghFlJERERECrGQIiIiIlKIhZQV9uzZg8mTJyM2Nhbr1q0Dh5URERERwEJqQN988w3279+P4uJiXL58GcXFxTh37pyzwyIiIiIXMMzZAbiD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", "text/plain": [ "
" ] @@ -245,16 +234,16 @@ { "data": { "text/plain": [ - "Text(0, 0.5, 'Average attention loss on the last 3914 tokens')" + "Text(0, 0.5, 'Average attention loss on the last 3743 tokens')" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -268,8 +257,8 @@ "\n", "# Exclude sink tokens from calculation\n", "kv_head_idx = head_idx // self_attn.num_key_value_groups\n", - "observed_attention = attn_weights[head_idx, n_train:, press.press.n_sink: n_train].mean(0).float().cpu()\n", - "expected_attention = scores[kv_head_idx, press.press.n_sink:].float().cpu()\n", + "observed_attention = attn_weights[head_idx, n_train:, press.n_sink : n_train].mean(0).float().cpu()\n", + "expected_attention = scores[kv_head_idx, press.n_sink :].float().cpu()\n", "\n", "# Display correlation between expected and observed attention\n", "plt.scatter(expected_attention, observed_attention, s=1)\n", @@ -283,8 +272,8 @@ "# We can also measure if we pruned the right tokens by measuring the average attention loss on the test tokens\n", "# The optimal pruning curve shows that pruning alone is not enough to achieve high KV cache compression ratio\n", "scale = observed_attention.sum()\n", - "knorm = -keys[0, kv_head_idx, press.press.n_sink:n_train:].norm(dim=-1).float().cpu()\n", - "random = torch.randperm(n_train - press.press.n_sink)\n", + "knorm = -keys[0, kv_head_idx, press.n_sink:n_train:].norm(dim=-1).float().cpu()\n", + "random = torch.randperm(n_train - press.n_sink)\n", "for x, label in zip([random, knorm, expected_attention, observed_attention], [\"Random score\", \"Keys norm\", \"Expected Attention Pruning\", \"Optimal pruning\"]):\n", " indices = torch.sort(x).indices\n", " plt.plot(torch.cumsum(observed_attention[indices], dim=0) / scale, label=label)\n", @@ -314,13 +303,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "tensor(8704., device='cuda:0', dtype=torch.bfloat16)\n", - "tensor(48.9765)\n" + "tensor(9344., device='cuda:0', dtype=torch.bfloat16)\n", + "tensor(48.6761)\n" ] } ], "source": [ - "vnorm = values[..., press.press.n_sink:n_train].norm(dim=-1).float().cpu()\n", + "vnorm = values[..., press.n_sink:n_train].norm(dim=-1).float().cpu()\n", "print(scores.max() / scores.min())\n", "print(vnorm.max() / vnorm.min())" ] @@ -328,9 +317,9 @@ ], "metadata": { "kernelspec": { - "display_name": "kvpress2", + "display_name": ".venv", "language": "python", - "name": "kvpress2" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -342,9 +331,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.15" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 2 } diff --git a/notebooks/new_press.ipynb b/notebooks/new_press.ipynb index b30d0e6e..a7771efd 100644 --- a/notebooks/new_press.ipynb +++ b/notebooks/new_press.ipynb @@ -13,24 +13,13 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/mount/home/setup/.cache/pypoetry/virtualenvs/kvpress-PV_RntMw-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], + "outputs": [], "source": [ "import torch\n", "from torch import nn\n", "from transformers import pipeline\n", "\n", - "from kvpress.prunners.base_press import BasePress\n", - "from kvpress.scorers.base_scorer import BaseScorer\n", - "from kvpress import KnormPress, ScorerPress" + "from kvpress import BasePress, KnormPress" ] }, { @@ -94,6 +83,7 @@ "name": "stderr", "output_type": "stream", "text": [ + "Starting from v4.46, the `logits` model output will have the same type as the model (except at train time, where it will always be FP32)\n", "The `seen_tokens` attribute is deprecated and will be removed in v4.41. Use the `cache_position` model input instead.\n" ] }, @@ -144,15 +134,15 @@ "metadata": {}, "source": [ "\n", - "The easiest way to create a new press is to create a new scorer class class that inherits from `BaseScorer` and implement a `score` method that computes the score for each key-value pair. \n", + "The easiest way to create a new press is to create a class that inherits from `BasePress` and implement a `score` method that computes the score for each key-value pair. \n", "\n", - "The arguments of the `score` method are as follows:\n", + "The arguments of the `score` method are obtained from the forward hook:\n", "- `module`: the attention layer\n", "- `hidden_states`: the input of the attention layer\n", "- `keys` and `values`: the key-value pairs from the attention layer\n", "- `attentions`: the attention weights, only available with `attn_implementation=\"eager\"`\n", "\n", - "In this first example, we will reproduce the `KnormScorer` where the score of a key-value pair is simply the opposite of the norm of the key vector." + "In this first example, we will reproduce the `KnormPress` where the score of a key-value pair is simply the opposite of the norm of the key vector." ] }, { @@ -178,13 +168,19 @@ "keys shape: torch.Size([1, 2, 44, 128])\n", "values shape: torch.Size([1, 2, 44, 128])\n", "score shape: torch.Size([1, 2, 44])\n", - "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "The purpose of this step-by-step guide is to provide instructions on how to create a new press in kvpress. The guide is designed to help users understand the process of setting up a new press in the kvpress platform.\n" ] } ], "source": [ - "class MyKnormScorer(BaseScorer):\n", + "class MyKnormPress(BasePress):\n", " def score(\n", " self,\n", " module: nn.Module,\n", @@ -212,8 +208,7 @@ " return scores\n", "\n", "\n", - "press = ScorerPress(compression_ratio=compression_ratio,\n", - " scorer=MyKnormScorer())\n", + "press = MyKnormPress(compression_ratio)\n", "print(pipe(context, question=question, press=press)[\"answer\"])" ] }, @@ -221,22 +216,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2.2 Creating a custom press by updating the `forward_hook` method " + "### 2.2 Updating the `forward_hook` method " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The `forward_hook` method defined in the `BasePruner` class roughly works as follows:\n", + "The `forward_hook` method defined in the `BasePress` class roughly works as follows:\n", "\n", "1. Get the scores\n", "2. Update the key-value pairs based on the scores and the `compression_ratio`\n", "\n", - "While it is sufficient in most cases to create a custom scorer class, the following example will show how it works. We will re-implement the `StreamingLLMPress` explcitly without using the `compression_ratio` parameter. In `StreamingLLM`, only the first `n_first` and last `n_last` key-value pairs are kept.\n", - "\n", - "MyStreamingLLMPress is a standalone press and doesn't need a scorer nor a compression ratio, as it always keeps first and last tokens.\n", - "We thus do not inherit from BasePruner." + "While we generally do not recommend to modify this method, the following example will show how it works. We will re-implement the `StreamingLLMPress` without using the `compression_ratio` parameter. In `StreamingLLM`, only the first `n_first` and last `n_last` key-value pairs are kept." ] }, { @@ -250,7 +242,13 @@ "text": [ "\n", "n_last: 2\n", - "Last tokens seen by the model: press !\n", + "Last tokens seen by the model: press !\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Answer: The purpose of this guide is to provide instructions and information on how to use the software or application called \"Pulse\" or \"Pulse 2\". Pulse is a popular music production software that allows users to create, edit, and mix music tracks\n", "\n", "n_last: 4\n", @@ -264,24 +262,24 @@ } ], "source": [ - "from dataclasses import dataclass\n", - "\n", - "@dataclass\n", "class MyStreamingLLMPress(BasePress):\n", - " n_first: int = 1\n", - " n_last: int = 8\n", + "\n", + " def __init__(self, n_first=1, n_last=8):\n", + " self.n_first = n_first\n", + " self.n_last = n_last\n", "\n", " def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list):\n", + "\n", " # Get the cache (transformers.cache_utils.DynamicCache object)\n", " cache = output[-1]\n", - " layer_idx = module.layer_idx\n", - " keys, values = cache.key_cache[layer_idx], cache.value_cache[layer_idx]\n", + " i = module.layer_idx\n", + " keys, values = cache.key_cache[i], cache.value_cache[i]\n", "\n", " # Update the cache to only keep the first and last tokens\n", " mask = torch.ones(keys.shape[-2], dtype=torch.bool, device=keys.device)\n", " mask[self.n_first : -self.n_last] = False\n", - " cache.key_cache[layer_idx] = keys[:, :, mask, :]\n", - " cache.value_cache[layer_idx] = values[:, :, mask, :]\n", + " cache.key_cache[i] = keys[:, :, mask, :]\n", + " cache.value_cache[i] = values[:, :, mask, :]\n", "\n", " # Return the updated output (output[-1] has been modified in-place)\n", " return output\n", @@ -311,9 +309,9 @@ ], "metadata": { "kernelspec": { - "display_name": "kvpress2", + "display_name": ".venv", "language": "python", - "name": "kvpress2" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -325,9 +323,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.15" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 2 } diff --git a/notebooks/per_layer_compression_demo.ipynb b/notebooks/per_layer_compression_demo.ipynb index eabbc771..9aa9bd88 100644 --- a/notebooks/per_layer_compression_demo.ipynb +++ b/notebooks/per_layer_compression_demo.ipynb @@ -4,23 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# In this notebook, we showcase how to use the improve retrieval performance using per-layer compression." + "In this notebook, we showcase how to use the improve retrieval performance using per-layer compression." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/mount/home/setup/.cache/pypoetry/virtualenvs/kvpress-PV_RntMw-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], + "outputs": [], "source": [ "import numpy as np\n", "import torch\n", @@ -33,8 +24,7 @@ " RandomPress,\n", " SnapKVPress,\n", " StreamingLLMPress,\n", - " ExpectedAttentionScorer,\n", - " PerLayerCompressionPress\n", + " apply_per_layer_compression,\n", ")" ] }, @@ -54,9 +44,22 @@ "name": "stderr", "output_type": "stream", "text": [ - "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n", - "Loading checkpoint shards: 100%|██████████| 2/2 [00:00<00:00, 4.81it/s]\n" + "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n" ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "14ee6cc96fce42cfb6e75b2964fbda04", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/2 [00:00 Date: Tue, 10 Dec 2024 14:17:45 +0100 Subject: [PATCH 44/51] fix notebooks --- notebooks/per_layer_compression_demo.ipynb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/notebooks/per_layer_compression_demo.ipynb b/notebooks/per_layer_compression_demo.ipynb index 9aa9bd88..3bfa1721 100644 --- a/notebooks/per_layer_compression_demo.ipynb +++ b/notebooks/per_layer_compression_demo.ipynb @@ -24,7 +24,7 @@ " RandomPress,\n", " SnapKVPress,\n", " StreamingLLMPress,\n", - " apply_per_layer_compression,\n", + " PerLayerCompressionPress,\n", ")" ] }, @@ -183,10 +183,7 @@ ] } ], - "source": [ - "press_per_layer = apply_per_layer_compression(ExpectedAttentionPress(compression_ratio), \n", - " PHI_35_COMPRESSION_RATIOS)" - ] + "source": "press_per_layer = PerLayerCompressionPress(ExpectedAttentionPress(compression_ratio), PHI_35_COMPRESSION_RATIOS)" }, { "cell_type": "code", From b0b65385bd383e19e79cd26b9a2b1ce54851b7b5 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:20:29 +0100 Subject: [PATCH 45/51] add back ThinKPress --- tests/presses/test_presses.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 12c2ff96..4fa2be10 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -28,9 +28,12 @@ def test_think_inner_press(unit_test_model): # noqa: F811 def test_presses_run(unit_test_model): # noqa: F811 - for cls in [KnormPress, ExpectedAttentionPress, RandomPress, StreamingLLMPress, SnapKVPress, TOVAPress]: + for cls in [KnormPress, ExpectedAttentionPress, RandomPress, StreamingLLMPress, SnapKVPress, TOVAPress, ThinKPress]: for compression_ratio in [0.2, 0.4, 0.6, 0.8]: - press = cls(compression_ratio=compression_ratio) + if cls == ThinKPress: + press = cls(key_channel_compression_ratio=compression_ratio, window_size=2) + else: + press = cls(compression_ratio=compression_ratio) if cls in [SnapKVPress]: press.scorer.window_size = 2 with press(unit_test_model): From f61330745f4978e881a115495f9ce17236b0ad53 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:22:50 +0100 Subject: [PATCH 46/51] fix tests --- tests/presses/test_presses.py | 11 ++++++----- tests/test_press_call.py | 5 ++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 4fa2be10..5fd33a3e 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 - +from dataclasses import dataclass import torch from torch import nn @@ -50,9 +50,10 @@ def test_presses_run_observed_attention(unit_test_model_output_attention): # no unit_test_model_output_attention(input_ids, past_key_values=DynamicCache()).past_key_values -class StoreKnormScorer(ScorerPress): +@dataclass +class StoreKnormPress(ScorerPress): - def __init__(self) -> None: + def __post_init__(self): self.scores = [] def score( @@ -75,12 +76,12 @@ def test_presses_keep_highest_score(unit_test_model): # noqa: F811 Test that kept keys are those with the highest score """ for compresion_ratio in [0.0, 0.2, 0.4, 0.6, 0.8]: - press = ScorerPress(compression_ratio=compresion_ratio, scorer=StoreKnormScorer()) + press = StoreKnormPress(compression_ratio=compresion_ratio) with press(unit_test_model): input_ids = torch.randint(0, 3_000, (5, 256)) past_key_values = unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values - for scores, key in zip(press.scorer.scores, past_key_values.key_cache): + for scores, key in zip(press.scores, past_key_values.key_cache): max_scores = -key.norm(dim=-1) for batch_idx in range(scores.shape[0]): for head_idx in range(scores.shape[1]): diff --git a/tests/test_press_call.py b/tests/test_press_call.py index 6291e704..67a03328 100644 --- a/tests/test_press_call.py +++ b/tests/test_press_call.py @@ -4,13 +4,12 @@ from transformers import DynamicCache -from kvpress import KnormPress, KnormScorer -from kvpress.presses.scorer_press import ScorerPress +from kvpress import KnormPress from tests.fixtures import unit_test_model # noqa: F401 def test_context_manager_adds_and_removes_hook(unit_test_model): # noqa: F811 - press = ScorerPress(scorer=KnormScorer(), compression_ratio=0.2) + press = KnormPress(compression_ratio=0.2) with press(unit_test_model): for layer in unit_test_model.model.layers: From b2b6b89720ced7f0ab3141450124eae40ba87232 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:25:13 +0100 Subject: [PATCH 47/51] update notebook --- README.md | 2 +- notebooks/new_press.ipynb | 103 ++++++++------------------------------ 2 files changed, 22 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index 2f2ba20d..7e4acd4d 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,7 @@ However, the `generate` method does not allow to exclude the question from the c ### How to create a new press ? -All presses are stored in the `presses` directory. The easiest way to create a new press is to create a class that inherits from `BasePress` and implement a `score` method that computes the score for each key-value pair (see `knorm_press.py` for a simple example). Check the notebook [new_press.ipynb](notebooks/new_press.ipynb) for a step-by-step guide. +All presses are stored in the `presses` directory. The easiest way to create a new press is to create a class that inherits from `ScorerPress` and implement a `score` method that computes the score for each key-value pair (see `knorm_press.py` for a simple example). Check the notebook [new_press.ipynb](notebooks/new_press.ipynb) for a step-by-step guide. Before opening a pull request with a new press, make sure to register it in the `__init__.py` file of repository and to add it in [test_presses.py](tests/presses/test_presses.py). diff --git a/notebooks/new_press.ipynb b/notebooks/new_press.ipynb index a7771efd..9d2b0fe8 100644 --- a/notebooks/new_press.ipynb +++ b/notebooks/new_press.ipynb @@ -10,31 +10,25 @@ ] }, { - "cell_type": "code", - "execution_count": 1, "metadata": {}, + "cell_type": "code", "outputs": [], + "execution_count": null, "source": [ + "from dataclasses import dataclass\n", + "\n", "import torch\n", "from torch import nn\n", "from transformers import pipeline\n", "\n", - "from kvpress import BasePress, KnormPress" + "from kvpress import BasePress, KnormPress, ScorerPress" ] }, { - "cell_type": "code", - "execution_count": 2, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "You are attempting to use Flash Attention 2.0 with a model not initialized on GPU. Make sure to move the model to GPU after initializing it on CPU with `model.to('cuda')`.\n" - ] - } - ], + "cell_type": "code", + "outputs": [], + "execution_count": null, "source": [ "# Load pipeline\n", "\n", @@ -45,10 +39,10 @@ ] }, { - "cell_type": "code", - "execution_count": 3, "metadata": {}, + "cell_type": "code", "outputs": [], + "execution_count": null, "source": [ "# Load data\n", "\n", @@ -134,7 +128,7 @@ "metadata": {}, "source": [ "\n", - "The easiest way to create a new press is to create a class that inherits from `BasePress` and implement a `score` method that computes the score for each key-value pair. \n", + "The easiest way to create a new press is to create a class that inherits from `ScorerPress` and implement a `score` method that computes the score for each key-value pair.\n", "\n", "The arguments of the `score` method are obtained from the forward hook:\n", "- `module`: the attention layer\n", @@ -146,41 +140,12 @@ ] }, { - "cell_type": "code", - "execution_count": 5, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "module: Qwen2FlashAttention2(\n", - " (q_proj): Linear(in_features=1536, out_features=1536, bias=True)\n", - " (k_proj): Linear(in_features=1536, out_features=256, bias=True)\n", - " (v_proj): Linear(in_features=1536, out_features=256, bias=True)\n", - " (o_proj): Linear(in_features=1536, out_features=1536, bias=False)\n", - " (rotary_emb): Qwen2RotaryEmbedding()\n", - ")\n", - "Number of key value heads: 2\n", - "Sequence length: 44\n", - "\n", - "hidden_states shape: torch.Size([1, 44, 1536])\n", - "keys shape: torch.Size([1, 2, 44, 128])\n", - "values shape: torch.Size([1, 2, 44, 128])\n", - "score shape: torch.Size([1, 2, 44])\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The purpose of this step-by-step guide is to provide instructions on how to create a new press in kvpress. The guide is designed to help users understand the process of setting up a new press in the kvpress platform.\n" - ] - } - ], + "cell_type": "code", + "outputs": [], + "execution_count": null, "source": [ - "class MyKnormPress(BasePress):\n", + "class MyKnormPress(ScorerPress):\n", " def score(\n", " self,\n", " module: nn.Module,\n", @@ -232,41 +197,15 @@ ] }, { - "cell_type": "code", - "execution_count": 6, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "n_last: 2\n", - "Last tokens seen by the model: press !\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Answer: The purpose of this guide is to provide instructions and information on how to use the software or application called \"Pulse\" or \"Pulse 2\". Pulse is a popular music production software that allows users to create, edit, and mix music tracks\n", - "\n", - "n_last: 4\n", - "Last tokens seen by the model: in kvpress !\n", - "Answer: The purpose of this guide is to provide instructions on how to create a new content management system (CMS) called KVPress. KVPress is a content management system that allows users to easily create, edit, and publish content on their website. The guide\n", - "\n", - "n_last: 8\n", - "Last tokens seen by the model: create a new press in kvpress !\n", - "Answer: The purpose of this guide is to provide instructions on how to create a new press in kvpress, a software tool for managing and publishing content. The guide likely covers topics such as setting up the press, configuring settings, adding content, and publishing articles\n" - ] - } - ], + "cell_type": "code", + "outputs": [], + "execution_count": null, "source": [ + "@dataclass\n", "class MyStreamingLLMPress(BasePress):\n", - "\n", - " def __init__(self, n_first=1, n_last=8):\n", - " self.n_first = n_first\n", - " self.n_last = n_last\n", + " n_first: int = 1\n", + " n_last: int = 8\n", "\n", " def forward_hook(self, module: nn.Module, input: list[torch.Tensor], kwargs: dict, output: list):\n", "\n", From 1c617ddeccb594d840bdf30b2ee5bfae6fca5f3f Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:26:31 +0100 Subject: [PATCH 48/51] add back comment --- kvpress/presses/tova_press.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kvpress/presses/tova_press.py b/kvpress/presses/tova_press.py index 7f0cab05..c7bfdbb7 100644 --- a/kvpress/presses/tova_press.py +++ b/kvpress/presses/tova_press.py @@ -22,7 +22,7 @@ class TOVAPress(SnapKVPress): """ compression_ratio: float = 0.0 - window_size: int = 1 + window_size: int = 1 # re-use the attention weight computation from SnapKVPress for last token def score( self, From 4fe50bd04d3e23ea26532ff3c34c172730b25331 Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:31:47 +0100 Subject: [PATCH 49/51] fix import --- kvpress/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kvpress/pipeline.py b/kvpress/pipeline.py index 3066e1f3..ca68e678 100644 --- a/kvpress/pipeline.py +++ b/kvpress/pipeline.py @@ -11,8 +11,8 @@ from transformers.pipelines import PIPELINE_REGISTRY from transformers.pipelines.base import GenericTensor -from kvpress import ObservedAttentionPress from kvpress.presses.base_press import BasePress +from kvpress.presses.observed_attention_press import ObservedAttentionPress logger = logging.getLogger(__name__) From c9d20c193dff6b5c665d4a4b9046188bd1b9ab3a Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:33:06 +0100 Subject: [PATCH 50/51] address pr feedback --- kvpress/presses/per_layer_compression_press.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/kvpress/presses/per_layer_compression_press.py b/kvpress/presses/per_layer_compression_press.py index e24969ed..0e497375 100644 --- a/kvpress/presses/per_layer_compression_press.py +++ b/kvpress/presses/per_layer_compression_press.py @@ -46,8 +46,4 @@ def compression_ratio(self): @compression_ratio.setter def compression_ratio(self, value): - # While we could set a uniform compression ratio, raise an error to indicate that this may rather be a mistake - raise NotImplementedError( - "Setting compression ratio is not supported for PerLayerCompressionPruner. " - "Please use DefaultPruner for a uniform compression ratio." - ) + raise AttributeError(f"compression ratio cannot be set for {type(self).__name__}") From a20f0fa7307b02e549b357ec5b24e65e6123e61e Mon Sep 17 00:00:00 2001 From: maxjeblick Date: Tue, 10 Dec 2024 14:38:20 +0100 Subject: [PATCH 51/51] fix tests --- tests/presses/test_presses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/presses/test_presses.py b/tests/presses/test_presses.py index 5fd33a3e..b1ebae7c 100644 --- a/tests/presses/test_presses.py +++ b/tests/presses/test_presses.py @@ -35,7 +35,7 @@ def test_presses_run(unit_test_model): # noqa: F811 else: press = cls(compression_ratio=compression_ratio) if cls in [SnapKVPress]: - press.scorer.window_size = 2 + press.window_size = 2 with press(unit_test_model): input_ids = unit_test_model.dummy_inputs["input_ids"] unit_test_model(input_ids, past_key_values=DynamicCache()).past_key_values